Skip to content

Modular Runtime + RAG Batching + Performance Optimizations#264

Merged
joelteply merged 48 commits intomainfrom
feature/coding-capabilities
Feb 6, 2026
Merged

Modular Runtime + RAG Batching + Performance Optimizations#264
joelteply merged 48 commits intomainfrom
feature/coding-capabilities

Conversation

@joelteply
Copy link
Contributor

Summary

Major architectural improvements:

  • Modular Runtime Framework: RTOS-inspired ServiceModule trait system replaces 2,598-line IPC dispatcher with dynamic module registration
  • RAG Batching: Rust RagModule with OOP discriminated unions, parallel Rayon loading, batched IPC
  • Performance: Socket congestion fixes, concurrent dispatch, fire-and-forget patterns
  • Shell Access: AI personas can execute code in sandboxed workspaces
  • Observability: Full pipeline timing instrumentation

Key Changes

Rust Runtime (Phase 0-3 of plan)

  • ServiceModule trait + ModuleRegistry for command routing
  • MessageBus for inter-module pub/sub
  • SharedCompute for lazy-compute-once caching
  • 8 modules implemented: health, cognition, channel, voice, code, memory, models, rag

RAG System

  • Batched source loading via rag/compose endpoint
  • Parallel Rayon execution in Rust
  • TypeScript sources updated with batching interface
  • Zero any types - full type safety

Data Layer

  • Removed ts-rs generated types from git (now generated on build)
  • Route observability collections through Rust data-daemon worker

Test plan

  • npm run build:ts passes
  • cargo check passes
  • npm start deploys and AI personas respond
  • RAG batching visible in logs (rag/batch timings)

Joel added 30 commits February 1, 2026 17:05
…type gen

Rust Foundation (continuum-core/src/code/):
- FileEngine: read/write/edit/delete with per-persona workspace scoping
- ChangeGraph: DAG of ChangeNodes with undo via reverse diff
- DiffEngine: unified diff computation (similar crate)
- PathSecurity: workspace isolation, path traversal guard, extension allowlist
- CodeSearch: regex + glob search with .gitignore support (ignore crate)
- Tree: recursive directory tree generation
- GitBridge: git status and diff operations
- IPC handlers for all 12 code/* endpoints (359 tests passing)

TypeScript Commands (8 generated via CommandGenerator):
- code/read, code/write, code/edit, code/diff
- code/search, code/tree, code/undo, code/history
- Each with Types.ts, ServerCommand.ts, BrowserCommand.ts, README, tests

Type Safety (ts-rs single source of truth):
- 14 Rust types exported via #[derive(TS)] → shared/generated/code/
- Zero hand-written wire type duplicates
- All object/any casts eliminated from code/* commands
- CommandParams.userId used as canonical identity field

RAG Integration:
- CodeToolSource: dynamic coding workflow guidance in persona system prompts
- Only shows tools persona has permission to use
- Budget-aware with minimal fallback
- 15 unit tests passing

Infrastructure fixes:
- PersonaToolExecutor now injects userId (standard CommandParams field)
- CLAUDE.md documents ts-rs pattern and regeneration workflow
Delete old pre-Rust development/code/read and development/code/pattern-search
commands that caused TS2300 duplicate identifier collision with new code/*
commands. Remove legacy CodeDaemon methods (readFile, searchCode, getGitLog,
clearCache, getCacheStats, getRepositoryRoot), their types, and the
PathValidator/FileReader modules — all superseded by Rust IPC workspace ops.

- Delete commands/development/code/ (7 files)
- Delete daemons/code-daemon/server/modules/ (PathValidator, FileReader)
- Clean CodeDaemonTypes.ts: remove 222 lines of legacy types
- Clean CodeDaemon.ts: remove 7 legacy static methods
- Clean CodeDaemonServer.ts: remove old CodeDaemonImpl class
- Fix cli.ts: replace CODE_COMMANDS import with string literals
- Fix PersonaToolDefinitions.ts: update essentialTools to code/*
- Regenerate server/generated.ts and command constants
…strator

CodingModelSelector routes coding tasks to frontier models with provider
fallback. PlanFormulator decomposes tasks into executable step DAGs via
LLM. CodeAgentOrchestrator executes plans with budget enforcement, retry
logic, and dependency-ordered step execution. 51 unit tests.
CodingPlanEntity is a first-class persistent entity for coding plans.
Supports hierarchical delegation (parentPlanId), team assignment
(assignees + leadId), governance integration (proposalId), and
real-time execution tracking. CodeAgentOrchestrator now persists
plans via DataDaemon with best-effort semantics (works without DB
in unit tests). 80 unit tests passing.
…ordination

Phase 4A — Sandbox & Security Tiers:
- SecurityTier: 4-tier access control (discovery/read/write/system)
- ToolAllowlistEnforcer: per-tier command filtering with glob matching
- ExecutionSandbox: process-isolated code execution with timeout/output limits
- Risk assessment integrated into PlanFormulator output

Phase 4B — Self-Modifying Skills:
- SkillEntity: persistent skill registry with full lifecycle
- skill/propose: AI creates command specifications
- skill/generate: programmatic CommandGenerator invocation
- skill/validate: sandbox compilation + test execution
- skill/activate: dynamic tool registration
- skill/list: query skill registry

Phase 4C — Multi-Agent Coordination & Delegation:
- CodeCoordinationStream: file-level MUTEX via BaseCoordinationStream
- PlanGovernance: risk-based approval routing (auto-approve low risk, require approval for multi-agent/high-risk/system-tier)
- CodeTaskDelegator: union-find plan decomposition into parallel file clusters, load-balanced agent assignment, sub-plan creation, result consolidation
- DryRun mode: execute plans read-only, mock write operations

342 tests across 12 test files, all passing.
Two mechanical throttle layers were overriding AI cognition:

1. Temperature system: each AI "servicing" a room subtracted -0.2,
   so 14 personas crashed rooms to 0.00 in 35 seconds. Fixed by
   flipping to +0.05 warmth (active conversation stays alive).
   Removed hard -0.1 priority penalty for cold rooms.

2. InferenceCoordinator: gating calls consumed per-message "cards"
   in messageResponders, so when actual response generation tried
   to acquire a slot with the same messageId, every persona was
   denied. Rewrote from 489→197 lines, removing 6 mechanical rules
   (card dealing, responder caps, reserved slots, cooldowns, stagger
   delays, auto-thinning). Kept only hardware capacity protection.

Result: AIs respond within seconds instead of being silenced.
…n, activity/create

- should-respond-fast: params.messageText crash (toLowerCase on undefined)
  when AI calls without messageText. Now returns graceful false result.
- activity/join: activityId undefined → "Activity not found: undefined"
  Now validates activityId before DB lookup.
- activity/create: recipeId undefined → "Recipe not found: undefined"
  Now validates recipeId before DB lookup.

All three were AIs calling tools with missing params, getting either
crashes or confusing error messages instead of clear validation errors.
Add code/task command as the entry point for the full coding agent pipeline.
Wire PlanGovernance approval flow and CodeTaskDelegator into orchestrator.
Add pending_approval status to CodingResult for high-risk plan gating.
CodeAgentOrchestrator.ensureWorkspace() now creates workspace directory
and registers it in Rust backend before first code/* operation. Personas
get writable workspace + read-only codebase access for discovery.
…ees, git write ops, iterative dev loop

Phase 1: Orchestrator reads CLAUDE.md + architecture docs during discovery so AI plans follow project conventions.

Phase 2: New code/verify command — runs tsc --noEmit via ExecutionSandbox, parses TypeScript errors, auto-verifies after write/edit steps. Added to write tier.

Phase 3: WorkspaceStrategy abstraction routes sandbox (isolated dir) vs worktree (git sparse checkout on real repo). CodingTask extended with workspaceMode/sparsePaths. code/task command validates and passes through.

Phase 4: Rust git_bridge extended with git_add/commit/push. IPC handlers + CodeDaemon methods for all git write ops. New code/git command (status/diff/log/add/commit/push) with SecurityTier gating. PlanFormulator knows commit action.

Phase 5: Verify→re-plan iteration loop in orchestrator. When auto-verify fails, re-plans with error context (quick-fix mode), executes fix, re-verifies. Configurable via autoVerify/maxVerifyIterations on ExecutionOptions.

387 TypeScript tests (15 files), 362 Rust tests — all passing.
…spaces

Rust: Notify-based blocking watch (no timeouts, no polling). Each
ExecutionState gets Arc<Notify> — reader tasks call notify_one() on
every output line. watch_execution() blocks on Notify until output
arrives, classifies lines through CompiledSentinel (pre-compiled
regex, first-match-wins), advances cursors, returns classified batch.

Types (ts-rs exported): OutputClassification, SentinelAction,
SentinelRule, ClassifiedLine, ShellWatchResponse — all generated
from Rust structs to shared/generated/code/*.ts.

IPC: code/shell-watch (async bridge via rt_handle.block_on after
releasing DashMap lock) and code/shell-sentinel (synchronous, brief
lock). TS bridge: RustCoreIPC, CodeDaemon, CodeDaemonServer wired.

Commands: code/shell/watch and code/shell/sentinel generated via
CommandGenerator with full server implementations delegating to
CodeDaemon. Registered in schemas, constants, executors, structure.

Workspace handle: sentinel(), watch(), execWatch(cmd, rules?, onLine?)
— composed convenience that runs exec → sentinel → watch loop.

Tests: 389 Rust lib tests pass, 183 TS unit tests pass (36 Workspace
tests including 5 new watch/sentinel/execWatch tests), 0 failures.
…ls in system prompt

DataDaemon.read<T>() now returns T|null (consistent with store/update),
eliminating the .data.data unwrapping pattern across ~30 call sites.

Recipe tools and strategy rules flow from JSON through ChatRAGBuilder
into RAGContext and are injected into PersonaResponseGenerator system
prompt as activity context for the LLM.

PersonaUser supports per-room workspaces via Map<string, Workspace>
with room-aware mode selection (worktree for code rooms).

RecipeToolDeclaration type added to RecipeTypes, making the tools
field in recipe JSONs visible to TypeScript.
…batch-micro-tune to GenomeJobCreate; fix VoiceService STT + GeminiLive cancel
Seed script (1265→622 lines):
- Bulk load all users/rooms in single subprocess calls
- Parallel Promise.all() for config updates (was 48+ sequential spawns)
- Removed 550 lines of local function duplicates shadowing imports
- Cleaned unused imports

Code room:
- Added CODE to DEFAULT_ROOMS in DefaultEntities.ts
- Added code room to seed script with coding recipe
- Added to ALL_EXPECTED_ROOMS for idempotent creation

Auto-workspace bootstrapping:
- PersonaToolExecutor auto-creates workspace when code/* tools invoked
- Added ensureCodeWorkspace callback through MotorCortex→PersonaUser
- Personas no longer need manual workspace creation to use code tools

Validated: Together Assistant created index.html (365 bytes) using
code/write and verified with code/tree. DeepSeek, Groq, Grok all
using code/* tools correctly in the code room.
Two fixes for AI personas calling code/* tools with wrong parameter names:

1. PersonaToolDefinitions: PARAM_DESCRIPTION_OVERRIDES map provides
   meaningful descriptions (e.g. "Relative path to file within workspace")
   instead of generic "filePath parameter". Applied at tool definition
   build time so LLMs see useful descriptions in their function schemas.

2. PersonaToolExecutor: PARAM_CORRECTIONS map silently corrects common
   wrong names (path→filePath, contents→content, query→pattern, etc.)
   before validation. Covers code/write, code/read, code/edit, code/search,
   code/tree, code/git.

Result: Together and Groq both successfully created calculator.html files
using code/write with correct parameters after these fixes.
…tization, meta-tool exclusion

- ToolRegistry: load descriptions via includeDescription:true (was empty strings)
- PersonaToolExecutor: strip CDATA wrappers (Together), regex HTML entity decode (Groq), file_name correction
- PersonaResponseGenerator: cap native tools at 64, prioritize recipe tools, exclude search_tools/list_tools/working_memory from native specs to prevent Claude meta-tool loops
…summaries, permissions, ToolNameCodec

Four bugs fixed in the persona tool execution pipeline:

1. Message accumulation: each tool loop iteration rebuilt messages from scratch,
   so the model never saw previous tool calls or results. Now accumulates
   assistant+result messages across iterations.

2. Stale toolCalls: after regeneration, only aiResponse.text was updated — the
   old toolCalls carried over, causing infinite re-execution. Now updates both
   text and toolCalls from regenerated response.

3. Lean summary vagueness: tool result summaries said "completed" and closed
   with "provide your analysis" (inviting more tool calls). Now produces
   human-readable summaries ("Wrote 1218 bytes to hello.html") with
   context-dependent stop signals that prevent re-calling succeeded tools.

4. Permission filtering: role permissions used inconsistent suffixes (:read,
   :search, :write) that never matched the {category}:execute format tools
   actually check. All roles now use {category}:execute consistently.

Additional improvements:
- ToolNameCodec: bidirectional encoder/decoder for API tool names. Models mangle
  names (code__write, $FUNCTIONS.code_write, code-write) — codec handles all
  variants via reverse lookup map populated at registration time.
- 3-tier tool prioritization: recipe tools → essentials → fill (was flat).
  Tighter cap (32) when recipe tools present.
- Loop detection threshold lowered from 3 to 2 identical calls.
- Tools stripped from regeneration request when all calls succeeded, forcing
  text-only response.
Layer 1 — Handle-based command execution:
- CommandParams: background, timeout, onTimeout fields
- CommandResult: handle, handleId, timedOut fields
- Commands.execute(): fast path (direct) vs tracked path (delegate to ServerCommands)
- ServerCommands: background fire-and-forget, timeout with cancel/continue/fail,
  await by handle ref, event subscriptions per handle lifecycle
- Wired into JTAGSystemServer.connect() via dynamic import

Layer 2 — Canonical agent tool loop:
- ContentPart: tool_use + tool_result types in AIProviderTypesV2
- AnthropicAdapter: native tool_use/tool_result content block handling
- BaseOpenAICompatibleAdapter: tool_calls parsing, finish_reason mapping, tool messages
- MediaContentFormatter: tool_use/tool_result formatting for both protocols
- PersonaResponseGenerator: while(finishReason==='tool_use') loop replaces broken
  PHASE 3.3.6 — model decides when to stop, full results returned, no summaries
- PersonaToolExecutor: executeSingleTool() extracted, executeNativeToolCalls()
  calls it directly (no XML round-trip), prepareBatch() shared between paths
- Safety caps: frontier 25, mid-tier native 10, XML/local 5

Quality:
- generateSummary(): data-shape-driven (filePath, bytes, count, dimensions)
  instead of per-tool if-statements — single algorithm for all tools
- Chat export filters metadata.toolResult messages by default
- mediaToContentParts() helper deduplicates conversion in both loop paths
- toolExecutionContext hoisted as loop-invariant
…olidate browser detection

ModelContextWindows: add versioned Anthropic model IDs (claude-sonnet-4-5-20250929,
claude-opus-4-20250514, claude-3-5-haiku-20241022), cloud API models (Groq, Together,
Fireworks, Gemini 2.0, Grok 4, Qwen 3 Omni), inference speed entries for all cloud
models, and date-suffix normalization so future versioned IDs resolve without explicit
entries. Fixes 25x context window regression (8K → 200K for Claude).

CodeToolSource: replace shallow workflow listing with substantive coding methodology —
dynamic capability detection, Read→Edit→Verify→Iterate workflow, rules, anti-patterns.
Budget increased from 5% to 8%.

SystemOrchestrator: consolidate three browser-open locations into single
detectAndManageBrowser() with ping-based detection and retry logic for WebSocket
reconnection after server restart. Eliminates duplicate tab launches.
…s, spam rate-limiting

Rust logger worker: replace per-message file.flush() with batched periodic
flush (every 250ms or 200 messages). Reduces disk flushes from ~700/sec to
~4/sec. Add per-category rate limiter (100 msg/sec) that drops excess and
logs a warning when burst ends.

WorkerClient: remove synchronous appendFileSync debug logging that blocked
the event loop on every IPC call. Break recursive timing loop by skipping
TimingHarness for write-log/flush-logs IPC types.

TimingHarness: replace appendFileSync with async WriteStream + periodic
buffer flush (500ms). Add per-category enable/disable.

New LogLevelRegistry: per-component runtime log level overrides (like audio
mute buttons). Supports wildcard patterns (daemons/*). Wired into
ComponentLogger.shouldLog() for filtering before IPC.
…d timing opt-in

- Default log level changed from INFO to WARN (quiet by default)
- Per-component overrides for daemon startup spam, PersonaUser loop, RAG pipeline
- Fix logger worker busy-spin: Duration::ZERO caused 95.8% CPU when idle
- Fix timing file opt-in: was opt-out (undefined !== 'false' = true), now requires explicit enable
- Config template updated with JTAG_TIMING_ENABLED=false and WARN defaults
Single ping attempt falsely concluded no browser was connected (transient
WebSocket reconnect timing), then opened a duplicate tab on every npm start.
Now retries up to 3 times with 3s delays, matching SystemOrchestrator pattern.
- CandleGrpcAdapter: remove rogue appendFileSync, route through Logger.ts
- clean:logs: fix find pattern to catch all .log files under personas/
- LoggingConfig: auto-enable persona when category enabled, auto-disable
  when last category disabled
- logs/config: buildPersonaStatuses() queries all AI personas from DB,
  shows ON/OFF status per persona with source (explicit/default) and
  available categories in overview
- Default logging OFF for all personas (beta-ready quiet baseline)
…te-limit

- SessionDaemonServer: remove console.error debug dump on every session
  create (~200 lines of noise per deploy)
- DatabaseHandleRegistry: remove per-handle console.log on open/alias
- SqliteStorageAdapter: remove redundant path debug console.log
- PersonaWorkerThread: consolidate 3-line worker start to 1 line
- RustCoreIPC: make slow IPC rate-limit map static (shared across all
  16 persona instances, not per-instance)

Total log reduction: 14K lines → 3K lines (-79%), 2MB → 312KB (-84%)
…ire-and-forget IPC

- ConversationHistorySource: single-flight request coalescing eliminates thundering
  herd (16 personas → 1 DB query per room), plus 2s TTL cache for subsequent access
- PersonaIdentitySource: permanent identity cache (immutable at runtime)
- GlobalAwarenessSource: 60s negative cache for "No memory corpus" IPC errors
- SemanticMemorySource: 60s negative cache for "No memory corpus" IPC errors
- AIProviderDaemon: fire-and-forget log_generation (was 2-5s blocking, now 0ms)
- Hippocampus: fire-and-forget Rust corpus memory append
- UnifiedConsciousness: fire-and-forget Rust corpus event append
- PersonaInbox: signal-based pop() (was 100ms polling), binary insert O(log N),
  cached Date.now() in sort comparisons
- InboxObserver: O(1) getSize() replaces O(N log N) peek(1000) for depth check

Result: CPU 103% → 60% (41% reduction)
Grok and others added 18 commits February 3, 2026 22:59
…ng, project-mode workspaces

- New commands: code/shell/execute (async+blocking), code/shell/status, code/shell/kill
- ToolOutputAdapter: ShellExecute/Watch/Status/Kill renderers for inline chat output cards
- WorkspaceStrategy: project mode default (git worktrees), robust reuse/cleanup, git root auto-detection
- PersonaUser: eager shell session creation on first code/* tool call
- LLM param coercion: boolean (wait) and array (paths) survive string serialization from LLMs
- Terminal widget scaffold at /terminal for dashboard view
- Coding recipe updated with shell tools + strategy rules
…clogging chat

- Add getToolCapability() to ToolFormatAdapter: classifies providers as native/xml/none
- Gate tool injection in PersonaResponseGenerator: 'none' providers get zero tools
- Add directed @mention filter in PersonaMessageEvaluator: early gate before expensive
  cognition work so non-mentioned personas stay silent immediately
- Add toolCapability override field to ModelConfig for per-persona control
Evaluator pipeline (EVAL-PIPELINE):
- task_create, plan_formulate, plan_log, state_update, state_snapshot,
  wm_store_observation, evaluate_and_respond, wm_store_reflection,
  plan_completion_log, state_cleanup

Response pipeline (PIPELINE):
- 3.1_rag, 3.2_format, 3.3a_slot, 3.3b_daemon_init, 3.3_inference,
  3.4_agent_loop, 3.5_post

Findings: CognitionLogger writes (plan_log, state_snapshot, plan_completion_log)
eat 10-30s per response through Node.js DataCreate.execute(). Message posting
takes 1.5-3.7s. The data layer is the bottleneck, not inference.
…ion writes

Three fixes that cut data layer overhead from 10-30s to <1s per AI response:

1. Double event emission bug: DataDaemon.store() and static update() were
   emitting events AFTER calling instance create()/update() which already
   emit. Every write fired 2 WebSocket broadcasts — now fires 1.

2. CognitionLogger fire-and-forget: All 10 DataCreate.execute() calls per
   response cycle removed await, added suppressEvents: true, added .catch().
   Cognition logs are observability data with no UI subscribers — blocking
   on them was pure waste. logPlanCompletion/logPlanAdjustment converted
   to synchronous void with fire-and-forget IIFE for internal read-modify-write.

3. suppressEvents wiring: DataDaemon.store() now accepts suppressEvents param,
   DataCreateServerCommand passes params.suppressEvents through default path.

Measured: plan_log 9s→0ms, state_snapshot 6s→0ms, plan_completion 15s→0ms,
message post 3.7s→320ms. All AI personas verified responding correctly.
Events.emit() was awaiting WebSocket delivery to all subscribers before
returning. This blocked every DB write, status update, and telemetry
event until all connected clients acknowledged receipt — pure waste.

Changes:
- DataDaemon: All instance methods (create, update, delete, batch,
  clear, truncate) now fire-and-forget on Events.emit(). DB write
  succeeds, event notification is non-blocking. Also fixed double-emit
  bug in static remove() (same pattern as store/update from prior commit).
- PersonaResponseGenerator: All 9 Events.emit() calls (DECIDED_SILENT x5,
  STAGE_COMPLETE, AI_POSTED, voice routing, AI_ERROR) now fire-and-forget.
- PersonaMessageEvaluator: All 6 Events.emit() calls (EVALUATING,
  DECIDED_SILENT x2, DECIDED_RESPOND, GENERATING, error STAGE_COMPLETE)
  now fire-and-forget.

Events still fire and reach the browser — just don't block the server.
Measured: Together 3.5_post 86ms (was 1-3.7s without contention).
Remaining 1.5s on Groq is SQLite lock contention — Phase 1 (Rust IPC).
Two bottlenecks eliminated from the response pipeline:

1. Semantic loop detection: Replaced AiDetectSemanticLoop.execute()
   command (embedding IPC + DB query, ~20 seconds) with inline Jaccard
   n-gram similarity against the already-loaded RAG conversation history.
   Same detection quality, ~0ms instead of ~20s.

2. RAG context update: Made fire-and-forget. updateRAGContext() does
   read-modify-write to store the trigger message in the context entity.
   This is bookkeeping — the pre-built RAG context already has current
   messages, so blocking on the store is pure waste.

Pipeline now dominated by inference time only:
  Groq: 13.6s total (13.5s inference, 126ms post)
  Together: 14.8s total (13.5s inference, 1.3s post)
  DeepSeek: 28s total (27.2s inference, 889ms post)
- Replace SQLite query in post-inference validation with static
  in-memory cache (5s → 0ms per persona per response)
- Post responses via DataDaemon.store() directly, bypassing
  JTAGClient → CommandDaemon → DataCreateServerCommand routing
- Move voice TTS event emission before DB write so speech
  isn't blocked by SQLite contention (500-1500ms saved for voice)
…orage eviction

RAG context build: 4.4s → 115ms (38x) via static caches + single-flight coalescing
- ChatRAGBuilder: room cache (60s TTL, coalesced), user name cache, artifact cache
- ConversationHistorySource: event-driven 30s cache, getCachedRawMessages for dedup
- PersonaIdentitySource: batch pre-warm all personas in one query

IPC bridge: sequential → concurrent request handling
- handle_client now dispatches each request to rayon thread pool
- Dedicated writer thread serializes responses back to socket
- TS client already multiplexes via requestId — no client changes needed
- Eliminates per-connection serialization that caused 1.5-2.7s delays

Browser: fix localStorage QuotaExceededError causing stale cache
- AsyncStorage evicts oldest 50% of entity cache entries on quota exceeded
- Fixes bug where new data couldn't write, leaving 2-day-old stale cache
…njection

- New workspace/list command: scans .git/continuum-worktrees/ on disk, merges
  WorkspaceStrategy in-memory state, returns git status per workspace. Supports
  --personaId filter. Generated via CommandGenerator.

- ProjectContextSource RAG fix: falls back to main repo when no persona-specific
  workspace exists (solves chicken-and-egg — personas now see codebase context
  before first code/* tool use). Distinguishes "Shared Repository" vs "Your
  Workspace" with bootstrapping hint.

- SentinelAutoConfig: auto-detects build/test/lint commands from code/shell/execute
  and injects sentinel classification rules. Wired into PersonaToolExecutor as
  fire-and-forget after shell execution starts.

- Git cleanup: removed 39 stale undefined/* branches, 2 stale session worktrees,
  fast-forwarded 3 valid ai/ worktrees to HEAD.
…aemon worker

Wire the existing Rust data-daemon worker (Unix socket IPC) into the
DataDaemon's per-collection adapter routing. 10 write-heavy observability
collections now go through Rust instead of TypeScript SQLite.

Key changes:
- DataDaemonServer: connectRustDataWorker() waits for socket, registers
  RustWorkerStorageAdapter for 10 collections, process.exit(1) if worker
  not available (no silent fallback)
- DatabaseHandleRegistry: re-enable RustWorkerStorageAdapter import and
  'rust' case in open()
- DefaultStorageAdapterFactory: 'rust' case returns RustWorkerStorageAdapter
- Rust data-daemon worker: PRAGMA table_info column filtering in
  data_create/data_update (and timed variants) to handle TypeScript entities
  with fields that don't map to SQL columns

Verified: 1113 requests, 779 creates, 0 errors. Killing the Rust worker
causes writes to fail (no fallback to TypeScript SQLite).
Three bugs fixed in the modular runtime refactor:

1. channel.rs: Return flat response structure for service-cycle-full
   - Before: { "service_cycle": { should_process, ... } } (nested)
   - After: { should_process, item, channel, wait_ms, stats, decision } (flat)
   - TypeScript expected result.should_process directly

2. health.rs: Return correct field name for health check
   - Before: { "status": "healthy" }
   - After: { "healthy": true }
   - Also fixed unit test to match

3. runtime.rs: Fix tokio block_on panic in route_command_sync
   - Before: rt_handle.block_on() panics inside tokio context
   - After: Spawn task + sync channel to bridge async -> sync
   - Avoids "Cannot start a runtime from within a runtime"

Verified: All 405 tests pass, personas now respond to messages.
1. PersonaBrainWidget: toolsAvailable from ai/status (was hardcoded 12)
   - Added toolsAvailable to PersonaHealth type
   - AIStatusServerCommand queries PersonaToolRegistry
   - Widget displays actual available tools per persona

2. DiagnosticsWidget: dynamic log file discovery
   - Uses code/tree (Rust) to discover actual log files
   - Infers category from filename patterns
   - No more hardcoded hippocampus/mind/soul/body/cns list

3. DiagnosticsWidget: dynamic system health
   - Uses ping command to check service status
   - Memory, Hippocampus, RAG show actual operational state
   - Added CSS for operational/degraded/offline status colors

Path forward: ts-rs for single source of truth (Rust → TypeScript types)
…y` types

Architecture:
- Rust enums with #[serde(tag = "source_type")] generate TypeScript discriminated unions
- Each source type (Memory, Consciousness, Scene, Project, Custom) has strongly-typed params
- RagSourceMetadata enum provides typed metadata per source type
- ts-rs generates 21 TypeScript types from Rust - single source of truth

Type System (Java/C# style OOP, not webdev):
- RagSourceRequest: 5 variants with typed params (MemorySourceParams, SceneSourceParams, etc.)
- RagSourceMetadata: corresponding typed metadata (MemorySourceMetadata, ConsciousnessSourceMetadata)
- No Record<string, any> or unknown - all fields strongly typed
- Pattern matching in Rust maps cleanly to TypeScript discriminated union narrowing

Performance:
- Rayon par_iter() loads all sources in parallel
- Eliminates N sequential IPC round-trips (was 1000-1900ms per source)
- Single batched rag/compose call replaces multiple memory/consciousness/custom calls

Extensibility:
- Scene source: video games, VR, 3D apps pass scene_id, description, objects, characters
- Project source: code context with project_path, summary, recent_changes
- Custom source: passthrough sections for any dynamic content
- All pre-computed by TypeScript, passed through Rust for parallel aggregation

Files:
- modules/rag.rs: 777 lines - types, loaders, ServiceModule impl
- modules/mod.rs: add pub mod rag
- ipc/mod.rs: register RagModule with memory_manager dependency

Generated (in .gitignore, rebuilt on cargo test):
- shared/generated/rag/*.ts: 21 strongly-typed interfaces
Copilot AI review requested due to automatic review settings February 6, 2026 18:57
@joelteply joelteply merged commit f0d842b into main Feb 6, 2026
2 of 5 checks passed
@joelteply joelteply deleted the feature/coding-capabilities branch February 6, 2026 18:59
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces a large set of new JTAG “code/”, “skill/”, and “workspace/*” commands (with shared/browser/server packaging), updates workspace-path resolution to prefer persona uniqueId, and adjusts docs/ignore rules to support generated Rust↔TS bindings and runtime workspace data.

Changes:

  • Added many new command modules (types + browser/server implementations) for skills lifecycle and workspace/code operations.
  • Updated workspace path conventions and several commands to resolve paths via user uniqueId.
  • Updated CLI timeout heuristics and repository docs/ignore rules for generated ts-rs types and runtime data.

Reviewed changes

Copilot reviewed 198 out of 416 changed files in this pull request and generated 13 comments.

Show a summary per file
File Description
src/debug/jtag/commands/workspace/list/shared/WorkspaceListTypes.ts Adds shared types + executor for workspace/list
src/debug/jtag/commands/workspace/list/package.json New command package metadata/scripts
src/debug/jtag/commands/workspace/list/browser/WorkspaceListBrowserCommand.ts Browser delegates workspace/list to server
src/debug/jtag/commands/workspace/list/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/workspace/git/workspace/init/server/GitWorkspaceInitServerCommand.ts Uses persona uniqueId in workspace path; coerces paths input
src/debug/jtag/commands/workspace/git/workspace/clean/server/GitWorkspaceCleanServerCommand.ts Uses shared resolver for workspace path
src/debug/jtag/commands/workspace/git/status/server/GitStatusServerCommand.ts Uses shared resolver for workspace path
src/debug/jtag/commands/workspace/git/shared/resolveWorkspacePath.ts Adds shared workspace path resolution via DataDaemon
src/debug/jtag/commands/workspace/git/push/server/GitPushServerCommand.ts Uses shared resolver for workspace path
src/debug/jtag/commands/user/create/shared/UserCreateTypes.ts Extends model config with toolCapability
src/debug/jtag/commands/skill/validate/shared/SkillValidateTypes.ts Adds shared types + executor for skill/validate
src/debug/jtag/commands/skill/validate/package.json New command package metadata/scripts
src/debug/jtag/commands/skill/validate/browser/SkillValidateBrowserCommand.ts Browser delegates skill/validate to server
src/debug/jtag/commands/skill/validate/README.md Documents skill/validate
src/debug/jtag/commands/skill/validate/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/skill/propose/package.json New skill/propose package metadata/scripts
src/debug/jtag/commands/skill/propose/browser/SkillProposeBrowserCommand.ts Browser delegates skill/propose to server
src/debug/jtag/commands/skill/propose/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/skill/list/shared/SkillListTypes.ts Adds shared types + executor for skill/list
src/debug/jtag/commands/skill/list/server/SkillListServerCommand.ts Adds server implementation for skill/list
src/debug/jtag/commands/skill/list/package.json New command package metadata/scripts
src/debug/jtag/commands/skill/list/browser/SkillListBrowserCommand.ts Browser delegates skill/list to server
src/debug/jtag/commands/skill/list/README.md Documents skill/list
src/debug/jtag/commands/skill/list/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/skill/generate/shared/SkillGenerateTypes.ts Adds shared types + executor for skill/generate
src/debug/jtag/commands/skill/generate/server/SkillGenerateServerCommand.ts Adds server implementation for skill/generate
src/debug/jtag/commands/skill/generate/package.json New command package metadata/scripts
src/debug/jtag/commands/skill/generate/browser/SkillGenerateBrowserCommand.ts Browser delegates skill/generate to server
src/debug/jtag/commands/skill/generate/README.md Documents skill/generate
src/debug/jtag/commands/skill/generate/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/skill/activate/shared/SkillActivateTypes.ts Adds shared types + executor for skill/activate
src/debug/jtag/commands/skill/activate/package.json New command package metadata/scripts
src/debug/jtag/commands/skill/activate/browser/SkillActivateBrowserCommand.ts Browser delegates skill/activate to server
src/debug/jtag/commands/skill/activate/README.md Documents skill/activate
src/debug/jtag/commands/skill/activate/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/session/get-user/server/SessionGetUserServerCommand.ts Adjusts DataDaemon.read handling
src/debug/jtag/commands/logs/config/shared/LogsConfigTypes.ts Extends logs config result shape
src/debug/jtag/commands/development/code/shared/CodeCommandConstants.ts Removes legacy dev code command constants
src/debug/jtag/commands/development/code/read/shared/CodeReadTypes.ts Removes legacy dev code/read types
src/debug/jtag/commands/development/code/read/shared/CodeReadCommand.ts Removes legacy dev code/read base class
src/debug/jtag/commands/development/code/pattern-search/shared/CodeFindTypes.ts Removes legacy dev code/find types
src/debug/jtag/commands/development/code/pattern-search/shared/CodeFindCommand.ts Removes legacy dev code/find base class
src/debug/jtag/commands/data/read/server/DataReadServerCommand.ts Updates DataDaemon.read return handling
src/debug/jtag/commands/data/list/server/DataListServerCommand.ts Simplifies error messaging/logging
src/debug/jtag/commands/data/delete/server/DataDeleteServerCommand.ts Types entityBeforeDelete and imports BaseEntity
src/debug/jtag/commands/data/create/server/DataCreateServerCommand.ts Passes suppressEvents through to DataDaemon.store
src/debug/jtag/commands/collaboration/chat/export/server/ChatExportServerCommand.ts Filters stored tool results from exports
src/debug/jtag/commands/collaboration/activity/join/server/ActivityJoinServerCommand.ts Adds required param validation for activityId
src/debug/jtag/commands/collaboration/activity/create/server/ActivityCreateServerCommand.ts Adds required param validation for recipeId
src/debug/jtag/commands/code/write/shared/CodeWriteTypes.ts Adds shared types + executor for code/write
src/debug/jtag/commands/code/write/server/CodeWriteServerCommand.ts Adds server implementation for code/write
src/debug/jtag/commands/code/write/package.json New command package metadata/scripts
src/debug/jtag/commands/code/write/browser/CodeWriteBrowserCommand.ts Browser delegates code/write to server
src/debug/jtag/commands/code/write/README.md Documents code/write
src/debug/jtag/commands/code/write/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/code/verify/shared/CodeVerifyTypes.ts Adds shared types + executor for code/verify
src/debug/jtag/commands/code/verify/package.json New command package metadata/scripts
src/debug/jtag/commands/code/verify/browser/CodeVerifyBrowserCommand.ts Browser delegates code/verify to server
src/debug/jtag/commands/code/verify/README.md Documents code/verify
src/debug/jtag/commands/code/undo/shared/CodeUndoTypes.ts Adds shared types + executor for code/undo
src/debug/jtag/commands/code/undo/server/CodeUndoServerCommand.ts Adds server implementation for code/undo
src/debug/jtag/commands/code/undo/package.json New command package metadata/scripts
src/debug/jtag/commands/code/undo/browser/CodeUndoBrowserCommand.ts Browser delegates code/undo to server
src/debug/jtag/commands/code/undo/README.md Documents code/undo
src/debug/jtag/commands/code/undo/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/code/tree/shared/CodeTreeTypes.ts Adds shared types + executor for code/tree
src/debug/jtag/commands/code/tree/server/CodeTreeServerCommand.ts Adds server implementation for code/tree
src/debug/jtag/commands/code/tree/package.json New command package metadata/scripts
src/debug/jtag/commands/code/tree/browser/CodeTreeBrowserCommand.ts Browser delegates code/tree to server
src/debug/jtag/commands/code/tree/README.md Documents code/tree
src/debug/jtag/commands/code/tree/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/code/shell/watch/shared/CodeShellWatchTypes.ts Adds shared types + executor for code/shell/watch
src/debug/jtag/commands/code/shell/watch/server/CodeShellWatchServerCommand.ts Adds server implementation for code/shell/watch
src/debug/jtag/commands/code/shell/watch/package.json New command package metadata/scripts
src/debug/jtag/commands/code/shell/watch/browser/CodeShellWatchBrowserCommand.ts Browser delegates code/shell/watch to server
src/debug/jtag/commands/code/shell/watch/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/code/shell/status/shared/CodeShellStatusTypes.ts Adds shared types + executor for code/shell/status
src/debug/jtag/commands/code/shell/status/server/CodeShellStatusServerCommand.ts Adds server implementation for code/shell/status
src/debug/jtag/commands/code/shell/status/package.json New command package metadata/scripts
src/debug/jtag/commands/code/shell/status/browser/CodeShellStatusBrowserCommand.ts Browser delegates code/shell/status to server
src/debug/jtag/commands/code/shell/status/README.md Documents code/shell/status
src/debug/jtag/commands/code/shell/status/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/code/shell/sentinel/shared/CodeShellSentinelTypes.ts Adds shared types + executor for code/shell/sentinel
src/debug/jtag/commands/code/shell/sentinel/server/CodeShellSentinelServerCommand.ts Adds server implementation for code/shell/sentinel
src/debug/jtag/commands/code/shell/sentinel/package.json New command package metadata/scripts
src/debug/jtag/commands/code/shell/sentinel/browser/CodeShellSentinelBrowserCommand.ts Browser delegates code/shell/sentinel to server
src/debug/jtag/commands/code/shell/sentinel/README.md Documents code/shell/sentinel
src/debug/jtag/commands/code/shell/sentinel/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/code/shell/kill/shared/CodeShellKillTypes.ts Adds shared types + executor for code/shell/kill
src/debug/jtag/commands/code/shell/kill/server/CodeShellKillServerCommand.ts Adds server implementation for code/shell/kill
src/debug/jtag/commands/code/shell/kill/package.json New command package metadata/scripts
src/debug/jtag/commands/code/shell/kill/browser/CodeShellKillBrowserCommand.ts Browser delegates code/shell/kill to server
src/debug/jtag/commands/code/shell/kill/README.md Documents code/shell/kill
src/debug/jtag/commands/code/shell/kill/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/code/shell/execute/shared/CodeShellExecuteTypes.ts Adds shared types + executor for code/shell/execute
src/debug/jtag/commands/code/shell/execute/server/CodeShellExecuteServerCommand.ts Adds server implementation for code/shell/execute
src/debug/jtag/commands/code/shell/execute/package.json New command package metadata/scripts
src/debug/jtag/commands/code/shell/execute/browser/CodeShellExecuteBrowserCommand.ts Browser delegates code/shell/execute to server
src/debug/jtag/commands/code/shell/execute/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/code/search/shared/CodeSearchTypes.ts Adds shared types + executor for code/search
src/debug/jtag/commands/code/search/server/CodeSearchServerCommand.ts Adds server implementation for code/search
src/debug/jtag/commands/code/search/package.json New command package metadata/scripts
src/debug/jtag/commands/code/search/browser/CodeSearchBrowserCommand.ts Browser delegates code/search to server
src/debug/jtag/commands/code/search/README.md Documents code/search
src/debug/jtag/commands/code/search/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/code/read/shared/CodeReadTypes.ts Adds shared types + executor for code/read
src/debug/jtag/commands/code/read/server/CodeReadServerCommand.ts Adds server implementation for code/read
src/debug/jtag/commands/code/read/package.json New command package metadata/scripts
src/debug/jtag/commands/code/read/browser/CodeReadBrowserCommand.ts Browser delegates code/read to server
src/debug/jtag/commands/code/read/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/code/history/shared/CodeHistoryTypes.ts Adds shared types + executor for code/history
src/debug/jtag/commands/code/history/server/CodeHistoryServerCommand.ts Adds server implementation for code/history
src/debug/jtag/commands/code/history/package.json New command package metadata/scripts
src/debug/jtag/commands/code/history/browser/CodeHistoryBrowserCommand.ts Browser delegates code/history to server
src/debug/jtag/commands/code/history/README.md Documents code/history
src/debug/jtag/commands/code/history/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/code/git/shared/CodeGitTypes.ts Adds shared types + executor for code/git
src/debug/jtag/commands/code/git/package.json New command package metadata/scripts
src/debug/jtag/commands/code/git/browser/CodeGitBrowserCommand.ts Browser delegates code/git to server
src/debug/jtag/commands/code/git/README.md Documents code/git
src/debug/jtag/commands/code/edit/server/CodeEditServerCommand.ts Adds server implementation for code/edit
src/debug/jtag/commands/code/edit/package.json New command package metadata/scripts
src/debug/jtag/commands/code/edit/browser/CodeEditBrowserCommand.ts Browser delegates code/edit to server
src/debug/jtag/commands/code/edit/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/code/diff/shared/CodeDiffTypes.ts Adds shared types + executor for code/diff
src/debug/jtag/commands/code/diff/server/CodeDiffServerCommand.ts Adds server implementation for code/diff
src/debug/jtag/commands/code/diff/package.json New command package metadata/scripts
src/debug/jtag/commands/code/diff/browser/CodeDiffBrowserCommand.ts Browser delegates code/diff to server
src/debug/jtag/commands/code/diff/.npmignore Publish ignore rules for command package
src/debug/jtag/commands/ai/thoughtstream/server/ThoughtStreamServerCommand.ts Updates DataDaemon.read usage for messages/users
src/debug/jtag/commands/ai/status/shared/AIStatusTypes.ts Adds toolsAvailable metric
src/debug/jtag/commands/ai/status/server/AIStatusServerCommand.ts Computes toolsAvailable via PersonaToolRegistry
src/debug/jtag/commands/ai/should-respond-fast/server/ShouldRespondFastServerCommand.ts Adds required param validation for messageText
src/debug/jtag/commands/ai/rag/inspect/server/RAGInspectServerCommand.ts Updates DataDaemon.read usage for trigger msg
src/debug/jtag/cli.ts Removes legacy code constants; updates command mapping/timeouts
src/debug/jtag/challenges/task-manager/task-manager.ts Adds TaskManager challenge module
src/debug/jtag/challenges/task-manager/task-manager.test.ts Adds runnable tests for TaskManager
src/debug/jtag/api/data-seed/RoomDataSeed.ts Adds “Code” room seed data
src/debug/jtag/.gitignore Ignores runtime data + generated bindings
CLAUDE.md Documents ts-rs Rust↔TS type boundary rules

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +43 to +45
getByPriority(priority: 'low' | 'medium' | 'high'): Task[] {
return this.tasks.filter(t => t.priority !== priority);
}
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TaskManager filtering logic is inverted in three places: getByPriority returns tasks that are NOT the requested priority, getPending returns all tasks (including completed), and removeCompleted keeps only completed tasks. Update these filters to match the method names/tests (priority should be equality, pending should be !completed, and removeCompleted should remove where completed === true).

Copilot uses AI. Check for mistakes.
Comment on lines +53 to +62
getPending(): Task[] {
return this.tasks;
}

/** Remove all completed tasks. Returns count of removed tasks. */
removeCompleted(): number {
const before = this.tasks.length;
this.tasks = this.tasks.filter(t => t.completed);
return before - this.tasks.length;
}
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TaskManager filtering logic is inverted in three places: getByPriority returns tasks that are NOT the requested priority, getPending returns all tasks (including completed), and removeCompleted keeps only completed tasks. Update these filters to match the method names/tests (priority should be equality, pending should be !completed, and removeCompleted should remove where completed === true).

Copilot uses AI. Check for mistakes.
'help': 'commandName',
[CODE_COMMANDS.READ]: 'path',
[CODE_COMMANDS.FIND]: 'pattern',
'code/read': 'path',
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new code/read command types use filePath (not path). With the current mapping, the CLI will populate the wrong parameter name and code/read will fail validation on the server. Change the mapping to use filePath for code/read.

Suggested change
'code/read': 'path',
'code/read': 'filePath',

Copilot uses AI. Check for mistakes.
status: data.status ?? '',
scope: data.scope ?? '',
createdById: data.createdById ?? '',
limit: data.limit ?? 0,
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

limit is documented as defaulting to 20, and the server implementation uses const limit = params.limit ?? 20. However, the params factory forces limit to 0 when omitted, which bypasses the server default and can produce empty results. Prefer leaving limit as undefined when not provided (or default it to 20 here consistently).

Suggested change
limit: data.limit ?? 0,
limit: data.limit,

Copilot uses AI. Check for mistakes.
Comment on lines +42 to +45
timeoutMs: data.timeoutMs ?? 0,
...data
});

Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Defaulting timeoutMs to 0 changes runtime behavior for sync executions: the server later does ... ?? (wait ? 30000 : undefined), but 0 is not nullish, so it prevents the intended 30s default when wait=true. Consider omitting timeoutMs unless explicitly provided (or set it to 30000 when wait=true).

Suggested change
timeoutMs: data.timeoutMs ?? 0,
...data
});
...data
});

Copilot uses AI. Check for mistakes.
Comment on lines +74 to +76
personaId: data.personaId ?? '',
includeGitStatus: data.includeGitStatus ?? true,
...data
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

personaId is optional in WorkspaceListParams, but the factory converts “omitted” into an empty string. This can subtly change behavior if the server treats empty string as a real filter value rather than “no filter”. Prefer leaving personaId as undefined when not provided (and similarly avoid defaulting optional strings to '' unless the wire protocol requires it).

Suggested change
personaId: data.personaId ?? '',
includeGitStatus: data.includeGitStatus ?? true,
...data
...data,
includeGitStatus: data.includeGitStatus ?? true,

Copilot uses AI. Check for mistakes.
/**
* Supported git operations.
*/
export type GitOperation = 'status' | 'diff' | 'log' | 'add' | 'commit' | 'push';
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CodeGitParams.operation is typed as string even though you define a stricter GitOperation union. Also, CodeGitParams re-declares userId even though it’s already part of the base CommandParams (and is frequently auto-injected). Consider typing operation: GitOperation and removing the redundant userId field from the params interface (rely on CommandParams.userId).

Copilot uses AI. Check for mistakes.
Comment on lines +23 to +27
export interface CodeGitParams extends CommandParams {
/** Persona/workspace handle */
userId: string;
/** Git operation to perform */
operation: string;
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CodeGitParams.operation is typed as string even though you define a stricter GitOperation union. Also, CodeGitParams re-declares userId even though it’s already part of the base CommandParams (and is frequently auto-injected). Consider typing operation: GitOperation and removing the redundant userId field from the params interface (rely on CommandParams.userId).

Copilot uses AI. Check for mistakes.
- **compiled**: `boolean` - Whether TypeScript compilation succeeded
- **testsRun**: `number` - Number of tests executed
- **testsPassed**: `number` - Number of tests that passed
- **errors**: `object` - Array of error messages from compilation or tests
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The SkillValidateResult.errors field is defined as string[] in shared/SkillValidateTypes.ts, but the README documents it as object. Update the README type to string[] (or “string[] (array of strings)”).

Suggested change
- **errors**: `object` - Array of error messages from compilation or tests
- **errors**: `string[]` - Array of error messages from compilation or tests

Copilot uses AI. Check for mistakes.
Returns `CodeShellStatusResult` with:

Returns CommandResult with:
- **sessionId**: `string` - Shell session identifier
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The result type uses shellSessionId (explicitly named to avoid collision with CommandResult.sessionId), but the README documents the field as sessionId. Update the README to match the actual result shape (shellSessionId).

Suggested change
- **sessionId**: `string` - Shell session identifier
- **shellSessionId**: `string` - Shell session identifier

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant