create-walle 0.9.21 → 0.9.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -5
- package/package.json +2 -2
- package/template/CLAUDE.md +2 -2
- package/template/LICENSE +1 -1
- package/template/bin/ctm-dev-cleanup.js +24 -3
- package/template/bin/ctm-launch.sh +13 -0
- package/template/bin/dev.sh +156 -18
- package/template/bin/node-bin.sh +84 -0
- package/template/bin/pin-node.sh +51 -0
- package/template/claude-task-manager/api-prompts.js +1203 -182
- package/template/claude-task-manager/api-reviews.js +109 -15
- package/template/claude-task-manager/approval-agent.js +1360 -280
- package/template/claude-task-manager/bin/restart-ctm.sh +64 -23
- package/template/claude-task-manager/bin/storage-migration-supervisor.js +338 -0
- package/template/claude-task-manager/db.js +4417 -295
- package/template/claude-task-manager/docs/app-update-refresh-protocol.md +69 -0
- package/template/claude-task-manager/docs/approval-ai-refinement.md +138 -0
- package/template/claude-task-manager/docs/approval-rescue-loop.md +74 -0
- package/template/claude-task-manager/docs/codex-operational-warning-health.md +107 -0
- package/template/claude-task-manager/docs/codex-resume-state-guard-design.md +17 -12
- package/template/claude-task-manager/docs/codex-terminal-render-controller-handoff.md +311 -0
- package/template/claude-task-manager/docs/coding-agent-hooks-architecture.md +418 -0
- package/template/claude-task-manager/docs/conversation-import-freshness.md +20 -0
- package/template/claude-task-manager/docs/google-workspace-auth-health.md +77 -0
- package/template/claude-task-manager/docs/image-paste-ux.md +13 -0
- package/template/claude-task-manager/docs/ipad-web-preview.md +88 -0
- package/template/claude-task-manager/docs/main-loop-offload-architecture.md +66 -0
- package/template/claude-task-manager/docs/microsoft-dev-tunnel-phone-access-design.md +274 -519
- package/template/claude-task-manager/docs/mobile-live-streaming.md +27 -5
- package/template/claude-task-manager/docs/mobile-remote-submission-lifecycle.md +69 -0
- package/template/claude-task-manager/docs/phone-access-design.md +53 -15
- package/template/claude-task-manager/docs/phone-passkey-identity.md +122 -0
- package/template/claude-task-manager/docs/phone-setup.md +3 -0
- package/template/claude-task-manager/docs/prompt-editing-tree-design.md +25 -1
- package/template/claude-task-manager/docs/remote-desktop-access-design.md +268 -0
- package/template/claude-task-manager/docs/restart-lifecycle-architecture.md +95 -0
- package/template/claude-task-manager/docs/runtime-work-control-plane.md +53 -0
- package/template/claude-task-manager/docs/session-interactive-wait-surfaces.md +38 -0
- package/template/claude-task-manager/docs/session-needs-you-dismissal.md +84 -0
- package/template/claude-task-manager/docs/session-render-state-management-design.md +91 -3
- package/template/claude-task-manager/docs/session-standup-command-center-design.md +25 -1
- package/template/claude-task-manager/docs/session-title-authority.md +32 -0
- package/template/claude-task-manager/docs/session-workspace-binding.md +33 -0
- package/template/claude-task-manager/docs/skill-intent-resolution-design.md +72 -0
- package/template/claude-task-manager/docs/walle-mcp-supervisor-health.md +86 -0
- package/template/claude-task-manager/docs/walle-relay-phone-access-design.md +24 -15
- package/template/claude-task-manager/docs/walle-session-history-hydration.md +114 -0
- package/template/claude-task-manager/docs/walle-session-input-queue.md +104 -0
- package/template/claude-task-manager/docs/walle-session-model-catalog.md +90 -0
- package/template/claude-task-manager/docs/walle-session-model-preferences.md +15 -6
- package/template/claude-task-manager/git-utils.js +897 -27
- package/template/claude-task-manager/lib/agent-capabilities.js +33 -0
- package/template/claude-task-manager/lib/agent-cli-cache.js +37 -7
- package/template/claude-task-manager/lib/agent-hooks-installer.js +26 -2
- package/template/claude-task-manager/lib/agent-presets.js +17 -1
- package/template/claude-task-manager/lib/all-sessions-query.js +108 -0
- package/template/claude-task-manager/lib/approval-ai-refinement.js +488 -0
- package/template/claude-task-manager/lib/approval-self-adapt.js +168 -0
- package/template/claude-task-manager/lib/async-semaphore.js +44 -0
- package/template/claude-task-manager/lib/auth-context.js +5 -0
- package/template/claude-task-manager/lib/auth-rate-limit.js +47 -4
- package/template/claude-task-manager/lib/auth-rules.js +29 -2
- package/template/claude-task-manager/lib/auto-approval-verifier.js +129 -16
- package/template/claude-task-manager/lib/background-llm.js +144 -17
- package/template/claude-task-manager/lib/branch-inventory.js +212 -0
- package/template/claude-task-manager/lib/claude-desktop-sessions.js +15 -3
- package/template/claude-task-manager/lib/coalesce-sync-frames.js +151 -0
- package/template/claude-task-manager/lib/codex-launch-health.js +762 -0
- package/template/claude-task-manager/lib/codex-transcript-pager.js +51 -0
- package/template/claude-task-manager/lib/codex-zst.js +124 -0
- package/template/claude-task-manager/lib/coding-agent-models.js +233 -30
- package/template/claude-task-manager/lib/connection-health.js +232 -0
- package/template/claude-task-manager/lib/conversation-blob-parser.js +42 -0
- package/template/claude-task-manager/lib/conversation-tail-merge.js +89 -26
- package/template/claude-task-manager/lib/ctm-session-context-api.js +39 -10
- package/template/claude-task-manager/lib/cursor-conversation-store.js +354 -0
- package/template/claude-task-manager/lib/db-owner-worker-client.js +315 -0
- package/template/claude-task-manager/lib/document-review.js +141 -6
- package/template/claude-task-manager/lib/escalation-review.js +152 -0
- package/template/claude-task-manager/lib/graceful-shutdown.js +159 -0
- package/template/claude-task-manager/lib/headless-term-service.js +678 -0
- package/template/claude-task-manager/lib/heavy-worker-fallback.js +38 -0
- package/template/claude-task-manager/lib/jsonl-conversation-parser.js +542 -0
- package/template/claude-task-manager/lib/jsonl-range-reader.js +112 -0
- package/template/claude-task-manager/lib/main-db-census.js +216 -0
- package/template/claude-task-manager/lib/message-pagination.js +106 -4
- package/template/claude-task-manager/lib/microsoft-dev-tunnel-setup.js +750 -26
- package/template/claude-task-manager/lib/mobile-auth-api.js +274 -7
- package/template/claude-task-manager/lib/mobile-auth-store.js +592 -10
- package/template/claude-task-manager/lib/mobile-notification-dispatcher.js +15 -0
- package/template/claude-task-manager/lib/model-overview-brain-fallback.js +311 -0
- package/template/claude-task-manager/lib/model-overview-cache.js +141 -0
- package/template/claude-task-manager/lib/models-health-routing-notice.js +126 -0
- package/template/claude-task-manager/lib/node-pin-guard.js +93 -0
- package/template/claude-task-manager/lib/perf-tracker.js +242 -6
- package/template/claude-task-manager/lib/permission-match.js +76 -0
- package/template/claude-task-manager/lib/permission-sync.js +133 -20
- package/template/claude-task-manager/lib/process-title.js +35 -0
- package/template/claude-task-manager/lib/prompt-executions-query.js +25 -0
- package/template/claude-task-manager/lib/prompt-index-disk-cache.js +44 -0
- package/template/claude-task-manager/lib/prompt-intent.js +132 -0
- package/template/claude-task-manager/lib/provider-user-context.js +34 -0
- package/template/claude-task-manager/lib/read-pool-client.js +313 -0
- package/template/claude-task-manager/lib/readpool-breaker.js +31 -0
- package/template/claude-task-manager/lib/recent-sessions-breaker.js +12 -0
- package/template/claude-task-manager/lib/remote-feedback-client.js +72 -0
- package/template/claude-task-manager/lib/remote-relay-protocol.js +37 -4
- package/template/claude-task-manager/lib/remote-relay-store.js +159 -0
- package/template/claude-task-manager/lib/remote-submission-observer.js +278 -0
- package/template/claude-task-manager/lib/restart-guard.js +109 -0
- package/template/claude-task-manager/lib/restore-interruption-detector.js +439 -0
- package/template/claude-task-manager/lib/restore-policy.js +13 -0
- package/template/claude-task-manager/lib/restore-resume-batch.js +74 -0
- package/template/claude-task-manager/lib/restore-runtime.js +68 -0
- package/template/claude-task-manager/lib/restore-storm.js +34 -0
- package/template/claude-task-manager/lib/resume-cwd.js +36 -0
- package/template/claude-task-manager/lib/resume-preflight.js +313 -0
- package/template/claude-task-manager/lib/runtime-work-registry.js +444 -0
- package/template/claude-task-manager/lib/sanitize-openai-auth.js +31 -0
- package/template/claude-task-manager/lib/scheduler.js +21 -1
- package/template/claude-task-manager/lib/scrollback-snapshot-store.js +159 -0
- package/template/claude-task-manager/lib/serial-task-queue.js +64 -0
- package/template/claude-task-manager/lib/server-listeners.js +239 -0
- package/template/claude-task-manager/lib/session-capture.js +42 -7
- package/template/claude-task-manager/lib/session-content-backfill.js +131 -0
- package/template/claude-task-manager/lib/session-history.js +388 -43
- package/template/claude-task-manager/lib/session-host-manager.js +287 -0
- package/template/claude-task-manager/lib/session-image-refs.js +209 -0
- package/template/claude-task-manager/lib/session-jobs.js +399 -59
- package/template/claude-task-manager/lib/session-prompt-index.js +137 -0
- package/template/claude-task-manager/lib/session-restore.js +53 -0
- package/template/claude-task-manager/lib/session-standup.js +123 -23
- package/template/claude-task-manager/lib/session-state-bus.js +14 -0
- package/template/claude-task-manager/lib/session-stream.js +64 -16
- package/template/claude-task-manager/lib/session-timeline-summary.js +260 -0
- package/template/claude-task-manager/lib/session-token-usage.js +494 -0
- package/template/claude-task-manager/lib/session-workspace-binding.js +356 -0
- package/template/claude-task-manager/lib/setup-network-config.js +9 -0
- package/template/claude-task-manager/lib/size-cap.js +45 -0
- package/template/claude-task-manager/lib/size-cap.test.js +62 -0
- package/template/claude-task-manager/lib/skill-autocomplete.js +180 -1
- package/template/claude-task-manager/lib/skill-intent-resolver.js +304 -0
- package/template/claude-task-manager/lib/sqlite-driver.js +19 -3
- package/template/claude-task-manager/lib/standup-attention.js +7 -3
- package/template/claude-task-manager/lib/status-authority.js +39 -0
- package/template/claude-task-manager/lib/status-hooks.js +4 -0
- package/template/claude-task-manager/lib/storage-migration.js +235 -0
- package/template/claude-task-manager/lib/structured-capture.js +298 -0
- package/template/claude-task-manager/lib/sync-io-census.js +163 -0
- package/template/claude-task-manager/lib/tailscale-setup.js +6 -0
- package/template/claude-task-manager/lib/terminal-activity-evidence.js +33 -0
- package/template/claude-task-manager/lib/terminal-choice.js +364 -0
- package/template/claude-task-manager/lib/terminal-control-sanitize.js +17 -0
- package/template/claude-task-manager/lib/terminal-fingerprint.js +48 -0
- package/template/claude-task-manager/lib/terminal-output-flush.js +84 -0
- package/template/claude-task-manager/lib/timeline-order.js +122 -0
- package/template/claude-task-manager/lib/transcript-store.js +348 -43
- package/template/claude-task-manager/lib/transport-security.js +84 -1
- package/template/claude-task-manager/lib/wait-state.js +184 -0
- package/template/claude-task-manager/lib/walle-client.js +47 -5
- package/template/claude-task-manager/lib/walle-ctm-history.js +564 -4
- package/template/claude-task-manager/lib/walle-external-actions.js +135 -16
- package/template/claude-task-manager/lib/walle-history-hydration.js +46 -0
- package/template/claude-task-manager/lib/walle-native-health.js +403 -0
- package/template/claude-task-manager/lib/walle-repair.js +701 -0
- package/template/claude-task-manager/lib/walle-session-cache.js +109 -0
- package/template/claude-task-manager/lib/walle-session-context.js +57 -21
- package/template/claude-task-manager/lib/walle-session-model-catalog.js +34 -0
- package/template/claude-task-manager/lib/walle-supervisor.js +539 -63
- package/template/claude-task-manager/lib/walle-transcript.js +52 -0
- package/template/claude-task-manager/lib/worktree-active-sync.js +11 -7
- package/template/claude-task-manager/lib/worktree-cwd.js +32 -1
- package/template/claude-task-manager/package.json +1 -1
- package/template/claude-task-manager/prompt-harvest.js +89 -66
- package/template/claude-task-manager/providers/claude-code.js +51 -3
- package/template/claude-task-manager/providers/cursor.js +140 -45
- package/template/claude-task-manager/public/css/reviews.css +551 -61
- package/template/claude-task-manager/public/css/setup.css +191 -0
- package/template/claude-task-manager/public/css/walle-session.css +865 -10
- package/template/claude-task-manager/public/css/walle.css +154 -0
- package/template/claude-task-manager/public/designs/ai-providers-consolidation-v2.html +830 -0
- package/template/claude-task-manager/public/index.html +18516 -2058
- package/template/claude-task-manager/public/ipad.html +363 -0
- package/template/claude-task-manager/public/js/document-review-links.js +301 -0
- package/template/claude-task-manager/public/js/image-normalize.js +69 -36
- package/template/claude-task-manager/public/js/message-renderer.js +1265 -77
- package/template/claude-task-manager/public/js/prompts.js +66 -29
- package/template/claude-task-manager/public/js/reviews.js +901 -133
- package/template/claude-task-manager/public/js/session-activity-utils.js +11 -1
- package/template/claude-task-manager/public/js/session-search-utils.js +94 -10
- package/template/claude-task-manager/public/js/session-status-precedence.js +23 -5
- package/template/claude-task-manager/public/js/setup.js +1273 -176
- package/template/claude-task-manager/public/js/stream-view.js +691 -73
- package/template/claude-task-manager/public/js/terminal-reconciler.js +210 -0
- package/template/claude-task-manager/public/js/walle-session.js +2455 -158
- package/template/claude-task-manager/public/js/walle.js +455 -28
- package/template/claude-task-manager/public/m/app.css +2909 -262
- package/template/claude-task-manager/public/m/app.js +6601 -398
- package/template/claude-task-manager/public/m/claim.html +224 -17
- package/template/claude-task-manager/public/m/index.html +117 -21
- package/template/claude-task-manager/public/m/sw.js +3 -1
- package/template/claude-task-manager/public/manifest.json +2 -2
- package/template/claude-task-manager/public/prompts.html +30 -14
- package/template/claude-task-manager/queue-engine.js +507 -28
- package/template/claude-task-manager/scripts/repair-claude-session-images.js +27 -8
- package/template/claude-task-manager/server.js +14341 -2197
- package/template/claude-task-manager/session-integrity.js +160 -18
- package/template/claude-task-manager/session-search-ranking.js +1 -0
- package/template/claude-task-manager/session-utils.js +25 -5
- package/template/claude-task-manager/workers/approval-blocklist.js +96 -6
- package/template/claude-task-manager/workers/approval-widget-validator.js +14 -8
- package/template/claude-task-manager/workers/conversation-import-worker.js +11 -50
- package/template/claude-task-manager/workers/db-owner-worker.js +386 -0
- package/template/claude-task-manager/workers/harvest-worker.js +9 -55
- package/template/claude-task-manager/workers/headless-term-worker.js +9 -530
- package/template/claude-task-manager/workers/read-pool-worker.js +387 -0
- package/template/claude-task-manager/workers/scrollback-worker.js +11 -72
- package/template/claude-task-manager/workers/session-host-process.js +146 -0
- package/template/claude-task-manager/workers/session-integrity-worker.js +10 -54
- package/template/claude-task-manager/workers/state-detectors/base.js +18 -1
- package/template/claude-task-manager/workers/state-detectors/claude-code.js +182 -9
- package/template/claude-task-manager/workers/state-detectors/codex.js +150 -2
- package/template/claude-task-manager/workers/state-detectors/cursor.js +127 -0
- package/template/claude-task-manager/workers/state-detectors/gemini.js +21 -0
- package/template/claude-task-manager/workers/state-detectors/index.js +29 -0
- package/template/claude-task-manager/workers/state-detectors/opencode.js +103 -0
- package/template/docs/design/markdown-review-pane.md +206 -0
- package/template/docs/designs/2026-05-17-portkey-gateway-provider-ux.md +129 -38
- package/template/docs/designs/2026-05-20-mobile-worktree-finish-command.md +27 -0
- package/template/docs/designs/2026-05-22-ai-configuration-consolidation.md +248 -0
- package/template/docs/designs/ai-configuration-consolidation-mock.html +812 -0
- package/template/docs/private-memory-and-pii-policy.md +69 -0
- package/template/package.json +2 -1
- package/template/scripts/check-private-data.js +201 -0
- package/template/shared/sqlite-owner-guard.js +30 -0
- package/template/shared/sqlite-owner-write-queue.js +225 -0
- package/template/shared/sqlite-storage-policy.js +111 -0
- package/template/shared/sqlite-write-lock.js +428 -0
- package/template/wall-e/agent-runners/claude-code.js +5 -0
- package/template/wall-e/agent.js +166 -22
- package/template/wall-e/api-walle.js +524 -70
- package/template/wall-e/auth/provider-flows.js +11 -1
- package/template/wall-e/bin/walle-mcp-stdio.js +341 -17
- package/template/wall-e/brain.js +1614 -141
- package/template/wall-e/chat/attachment-blocks.js +96 -0
- package/template/wall-e/chat/attachments.js +2 -1
- package/template/wall-e/chat/capability-resolver.js +7 -7
- package/template/wall-e/chat/context-messages.js +28 -0
- package/template/wall-e/chat/conversation-frame.js +630 -0
- package/template/wall-e/chat/provider-messages.js +125 -0
- package/template/wall-e/chat.js +1002 -233
- package/template/wall-e/coding/acceptance-contract.js +170 -0
- package/template/wall-e/coding/acp-adapter.js +1 -1
- package/template/wall-e/coding/agent-catalog.js +3 -0
- package/template/wall-e/coding/artifact-store.js +93 -0
- package/template/wall-e/coding/capability-router.js +120 -0
- package/template/wall-e/coding/coding-run-controller.js +423 -0
- package/template/wall-e/coding/compaction-service.js +157 -12
- package/template/wall-e/coding/frontend-verification.js +258 -0
- package/template/wall-e/coding/lifecycle-hooks.js +75 -0
- package/template/wall-e/coding/local-preview-contract.js +157 -0
- package/template/wall-e/coding/permission-service.js +57 -13
- package/template/wall-e/coding/prompt-bundle.js +19 -1
- package/template/wall-e/coding/prompt-section-registry.js +227 -0
- package/template/wall-e/coding/provider-compat.js +15 -0
- package/template/wall-e/coding/runtime-events.js +224 -0
- package/template/wall-e/coding/runtime-mode.js +3 -0
- package/template/wall-e/coding/side-git-snapshot.js +160 -4
- package/template/wall-e/coding/snapshot-service.js +143 -1
- package/template/wall-e/coding/stream-processor.js +388 -34
- package/template/wall-e/coding/task-tool.js +141 -4
- package/template/wall-e/coding/tool-execution-controller.js +365 -0
- package/template/wall-e/coding/tool-registry.js +43 -5
- package/template/wall-e/coding/user-hooks.js +217 -0
- package/template/wall-e/coding-orchestrator.js +1330 -221
- package/template/wall-e/coding-prompts.js +20 -4
- package/template/wall-e/context/context-builder.js +15 -2
- package/template/wall-e/decision/confidence.js +1 -1
- package/template/wall-e/docs/coding-acceptance-contract.md +41 -0
- package/template/wall-e/docs/external-action-controller.md +26 -6
- package/template/wall-e/docs/telemetry-lifecycle.md +8 -2
- package/template/wall-e/embeddings.js +591 -53
- package/template/wall-e/external-action-controller.js +12 -0
- package/template/wall-e/http/auth.js +1 -0
- package/template/wall-e/http/chat-api.js +46 -11
- package/template/wall-e/http/model-admin.js +836 -34
- package/template/wall-e/lib/boot-profile.js +88 -0
- package/template/wall-e/lib/event-loop-monitor.js +93 -0
- package/template/wall-e/lib/service-health.js +194 -0
- package/template/wall-e/llm/anthropic.js +130 -5
- package/template/wall-e/llm/client.js +266 -63
- package/template/wall-e/llm/default-fallback.js +382 -0
- package/template/wall-e/llm/health.js +19 -0
- package/template/wall-e/llm/message-guard.js +78 -0
- package/template/wall-e/llm/model-catalog.js +252 -1
- package/template/wall-e/llm/openai.js +26 -4
- package/template/wall-e/llm/portkey-sync.js +654 -0
- package/template/wall-e/llm/provider-error.js +30 -2
- package/template/wall-e/llm/registry.js +5 -1
- package/template/wall-e/llm/request-compat.js +67 -0
- package/template/wall-e/loops/backfill.js +79 -23
- package/template/wall-e/loops/brain-optimize.js +67 -0
- package/template/wall-e/loops/ingest.js +25 -10
- package/template/wall-e/loops/question-digest.js +160 -0
- package/template/wall-e/loops/reflect.js +6 -4
- package/template/wall-e/loops/think.js +39 -12
- package/template/wall-e/mcp-server.js +318 -36
- package/template/wall-e/memory/ctm-context-client.js +52 -14
- package/template/wall-e/memory/ctm-operational-context.js +237 -0
- package/template/wall-e/memory/ctm-prompt-executions-client.js +128 -0
- package/template/wall-e/memory/ctm-session-context.js +111 -63
- package/template/wall-e/prompts/coding/deepseek.txt +3 -0
- package/template/wall-e/prompts/coding/gemini.txt +6 -0
- package/template/wall-e/prompts/coding/gpt.txt +6 -0
- package/template/wall-e/prompts/coding/local.txt +7 -0
- package/template/wall-e/runtime/decision-hooks.js +115 -0
- package/template/wall-e/runtime/devbox-gateway.js +82 -8
- package/template/wall-e/runtime/prompt-manifest.js +86 -0
- package/template/wall-e/runtime/tool-executor.js +269 -0
- package/template/wall-e/runtime/tool-result-envelope.js +138 -0
- package/template/wall-e/runtime/transcript-projection.js +60 -0
- package/template/wall-e/runtime/walle-runtime.js +224 -0
- package/template/wall-e/scripts/db-optimize/migrate.js +162 -0
- package/template/wall-e/scripts/db-optimize/recall-eval.js +117 -0
- package/template/wall-e/server.js +15 -0
- package/template/wall-e/session-files.js +9 -0
- package/template/wall-e/skills/_bundled/google-calendar/run.js +1 -1
- package/template/wall-e/skills/_bundled/gws-workspace/run.js +1 -1
- package/template/wall-e/skills/_bundled/slack-mentions/run.js +76 -6
- package/template/wall-e/skills/claude-code-reader.js +7 -3
- package/template/wall-e/skills/script-skill-runner.js +10 -0
- package/template/wall-e/skills/skill-planner.js +38 -0
- package/template/wall-e/tools/builtin-middleware.js +19 -9
- package/template/wall-e/tools/local-tools.js +1428 -16
- package/template/wall-e/tools/permission-checker.js +73 -5
- package/template/wall-e/tools/question-manager.js +117 -7
- package/template/wall-e/training/harvester.js +12 -28
- package/template/wall-e/training/replay.js +25 -80
- package/template/website/index.html +10 -10
- package/template/wall-e/eval/ab-test.js +0 -203
- package/template/wall-e/eval/agent-runner.js +0 -772
- package/template/wall-e/eval/agent-scorer.js +0 -461
- package/template/wall-e/eval/aggregator.js +0 -414
- package/template/wall-e/eval/allowed-test-commands.js +0 -34
- package/template/wall-e/eval/benchmark-generator.js +0 -113
- package/template/wall-e/eval/benchmarks/chat-eval.json +0 -1662
- package/template/wall-e/eval/benchmarks/chat.json +0 -82
- package/template/wall-e/eval/benchmarks/coding-agent-real.json +0 -1
- package/template/wall-e/eval/benchmarks/coding-agent.json +0 -1581
- package/template/wall-e/eval/benchmarks/coding.json +0 -122
- package/template/wall-e/eval/benchmarks/memory-retrieval.json +0 -234
- package/template/wall-e/eval/benchmarks/reasoning.json +0 -82
- package/template/wall-e/eval/benchmarks/swebench-lite-30.json +0 -212
- package/template/wall-e/eval/benchmarks.js +0 -669
- package/template/wall-e/eval/cc-replay.js +0 -719
- package/template/wall-e/eval/chat-eval.js +0 -525
- package/template/wall-e/eval/check-keys.js +0 -15
- package/template/wall-e/eval/check-providers.js +0 -42
- package/template/wall-e/eval/codex-cli-baseline.js +0 -669
- package/template/wall-e/eval/coding-agent-real.js +0 -570
- package/template/wall-e/eval/context-compactor.js +0 -251
- package/template/wall-e/eval/debug-agent003.js +0 -68
- package/template/wall-e/eval/diagnostics.js +0 -216
- package/template/wall-e/eval/eval-orchestrator.js +0 -642
- package/template/wall-e/eval/evaluate.js +0 -202
- package/template/wall-e/eval/evaluator.js +0 -373
- package/template/wall-e/eval/exporter.js +0 -212
- package/template/wall-e/eval/fixtures/express-basic/package.json +0 -9
- package/template/wall-e/eval/fixtures/express-basic/server.js +0 -115
- package/template/wall-e/eval/fixtures/express-basic/test.js +0 -83
- package/template/wall-e/eval/fixtures/express-buggy/package.json +0 -9
- package/template/wall-e/eval/fixtures/express-buggy/server.js +0 -113
- package/template/wall-e/eval/fixtures/express-buggy/test.js +0 -83
- package/template/wall-e/eval/fixtures/express-buggy-items/package.json +0 -9
- package/template/wall-e/eval/fixtures/express-buggy-items/server.js +0 -112
- package/template/wall-e/eval/fixtures/express-buggy-items/test.js +0 -83
- package/template/wall-e/eval/fixtures/express-buggy-search/package.json +0 -9
- package/template/wall-e/eval/fixtures/express-buggy-search/server.js +0 -121
- package/template/wall-e/eval/fixtures/express-buggy-search/test.js +0 -83
- package/template/wall-e/eval/fixtures/express-rename-data/data.js +0 -34
- package/template/wall-e/eval/fixtures/express-rename-data/package.json +0 -9
- package/template/wall-e/eval/fixtures/express-rename-data/server.js +0 -97
- package/template/wall-e/eval/fixtures/express-rename-data/test.js +0 -88
- package/template/wall-e/eval/fixtures/express-xss/package.json +0 -12
- package/template/wall-e/eval/fixtures/express-xss/server.js +0 -90
- package/template/wall-e/eval/fixtures/express-xss/test.js +0 -67
- package/template/wall-e/eval/fixtures/express-xss/views/profile.ejs +0 -9
- package/template/wall-e/eval/fixtures/fullstack-app/config/default.js +0 -9
- package/template/wall-e/eval/fixtures/fullstack-app/config/test.js +0 -13
- package/template/wall-e/eval/fixtures/fullstack-app/package.json +0 -11
- package/template/wall-e/eval/fixtures/fullstack-app/public/css/style.css +0 -137
- package/template/wall-e/eval/fixtures/fullstack-app/public/index.html +0 -46
- package/template/wall-e/eval/fixtures/fullstack-app/public/js/app.js +0 -121
- package/template/wall-e/eval/fixtures/fullstack-app/public/js/auth.js +0 -71
- package/template/wall-e/eval/fixtures/fullstack-app/public/js/items.js +0 -80
- package/template/wall-e/eval/fixtures/fullstack-app/public/js/users.js +0 -46
- package/template/wall-e/eval/fixtures/fullstack-app/public/login.html +0 -45
- package/template/wall-e/eval/fixtures/fullstack-app/public/register.html +0 -38
- package/template/wall-e/eval/fixtures/fullstack-app/scripts/migrate.js +0 -23
- package/template/wall-e/eval/fixtures/fullstack-app/scripts/seed.js +0 -46
- package/template/wall-e/eval/fixtures/fullstack-app/server/db.js +0 -99
- package/template/wall-e/eval/fixtures/fullstack-app/server/index.js +0 -94
- package/template/wall-e/eval/fixtures/fullstack-app/server/middleware/auth.js +0 -19
- package/template/wall-e/eval/fixtures/fullstack-app/server/middleware/logger.js +0 -19
- package/template/wall-e/eval/fixtures/fullstack-app/server/router.js +0 -50
- package/template/wall-e/eval/fixtures/fullstack-app/server/routes/auth.js +0 -69
- package/template/wall-e/eval/fixtures/fullstack-app/server/routes/health.js +0 -23
- package/template/wall-e/eval/fixtures/fullstack-app/server/routes/items.js +0 -88
- package/template/wall-e/eval/fixtures/fullstack-app/server/routes/users.js +0 -75
- package/template/wall-e/eval/fixtures/fullstack-app/server/test.js +0 -198
- package/template/wall-e/eval/fixtures/fullstack-app/server/utils/response.js +0 -34
- package/template/wall-e/eval/fixtures/fullstack-app/server/utils/validate.js +0 -26
- package/template/wall-e/eval/fixtures/fullstack-app/server.js +0 -8
- package/template/wall-e/eval/fixtures/fullstack-app/test.js +0 -12
- package/template/wall-e/eval/fixtures/monorepo-basic/package.json +0 -8
- package/template/wall-e/eval/fixtures/monorepo-basic/packages/api/data.js +0 -58
- package/template/wall-e/eval/fixtures/monorepo-basic/packages/api/middleware.js +0 -46
- package/template/wall-e/eval/fixtures/monorepo-basic/packages/api/package.json +0 -8
- package/template/wall-e/eval/fixtures/monorepo-basic/packages/api/routes.js +0 -64
- package/template/wall-e/eval/fixtures/monorepo-basic/packages/api/server.js +0 -56
- package/template/wall-e/eval/fixtures/monorepo-basic/packages/api/test.js +0 -116
- package/template/wall-e/eval/fixtures/monorepo-basic/packages/cli/commands.js +0 -61
- package/template/wall-e/eval/fixtures/monorepo-basic/packages/cli/index.js +0 -62
- package/template/wall-e/eval/fixtures/monorepo-basic/packages/cli/output.js +0 -43
- package/template/wall-e/eval/fixtures/monorepo-basic/packages/cli/package.json +0 -11
- package/template/wall-e/eval/fixtures/monorepo-basic/packages/cli/test.js +0 -44
- package/template/wall-e/eval/fixtures/monorepo-basic/packages/shared/formatters.js +0 -43
- package/template/wall-e/eval/fixtures/monorepo-basic/packages/shared/index.js +0 -12
- package/template/wall-e/eval/fixtures/monorepo-basic/packages/shared/package.json +0 -5
- package/template/wall-e/eval/fixtures/monorepo-basic/packages/shared/test.js +0 -55
- package/template/wall-e/eval/fixtures/monorepo-basic/packages/shared/validators.js +0 -29
- package/template/wall-e/eval/fixtures/monorepo-basic/test.js +0 -46
- package/template/wall-e/eval/fixtures/node-cli/index.js +0 -78
- package/template/wall-e/eval/fixtures/node-cli/package.json +0 -10
- package/template/wall-e/eval/fixtures/node-cli/test.js +0 -57
- package/template/wall-e/eval/fixtures/node-typed/package.json +0 -8
- package/template/wall-e/eval/fixtures/node-typed/src/handlers.js +0 -31
- package/template/wall-e/eval/fixtures/node-typed/src/utils.js +0 -33
- package/template/wall-e/eval/fixtures/node-typed/test.js +0 -36
- package/template/wall-e/eval/fixtures/python-flask/app.py +0 -14
- package/template/wall-e/eval/fixtures/python-flask/requirements.txt +0 -2
- package/template/wall-e/eval/fixtures/python-flask/test_app.py +0 -25
- package/template/wall-e/eval/fixtures/wall-e-subset/brain.js +0 -105
- package/template/wall-e/eval/fixtures/wall-e-subset/eval/aggregator.js +0 -101
- package/template/wall-e/eval/fixtures/wall-e-subset/eval/benchmarks/chat.json +0 -20
- package/template/wall-e/eval/fixtures/wall-e-subset/eval/benchmarks/coding.json +0 -32
- package/template/wall-e/eval/fixtures/wall-e-subset/eval/benchmarks.js +0 -64
- package/template/wall-e/eval/fixtures/wall-e-subset/eval/fixtures/simple-project/package.json +0 -6
- package/template/wall-e/eval/fixtures/wall-e-subset/eval/fixtures/simple-project/server.js +0 -31
- package/template/wall-e/eval/fixtures/wall-e-subset/eval/fixtures/simple-project/test.js +0 -18
- package/template/wall-e/eval/fixtures/wall-e-subset/eval/fixtures/simple-project/utils.js +0 -34
- package/template/wall-e/eval/fixtures/wall-e-subset/eval/runner.js +0 -104
- package/template/wall-e/eval/fixtures/wall-e-subset/eval/scorer.js +0 -73
- package/template/wall-e/eval/fixtures/wall-e-subset/eval/test.js +0 -134
- package/template/wall-e/eval/fixtures/wall-e-subset/llm/client.js +0 -99
- package/template/wall-e/eval/fixtures/wall-e-subset/llm/providers.js +0 -63
- package/template/wall-e/eval/fixtures/wall-e-subset/llm/test.js +0 -70
- package/template/wall-e/eval/fixtures/wall-e-subset/package.json +0 -10
- package/template/wall-e/eval/fixtures/wall-e-subset/test.js +0 -86
- package/template/wall-e/eval/harvester.js +0 -685
- package/template/wall-e/eval/head-to-head.js +0 -388
- package/template/wall-e/eval/humaneval-adapter.js +0 -321
- package/template/wall-e/eval/list-models.js +0 -31
- package/template/wall-e/eval/livecodebench-adapter.js +0 -291
- package/template/wall-e/eval/mail-integration.js +0 -443
- package/template/wall-e/eval/manifest.js +0 -186
- package/template/wall-e/eval/meta-harness/adapters/coding-agent.js +0 -57
- package/template/wall-e/eval/meta-harness/bootstrap-snapshot.js +0 -149
- package/template/wall-e/eval/meta-harness/candidate-store.js +0 -117
- package/template/wall-e/eval/meta-harness/cli.js +0 -86
- package/template/wall-e/eval/meta-harness/domain-spec.js +0 -154
- package/template/wall-e/eval/meta-harness/domains/coding-agent.domain.json +0 -84
- package/template/wall-e/eval/meta-harness/examples/env-bootstrap-candidate.js +0 -29
- package/template/wall-e/eval/meta-harness/experience-store.js +0 -174
- package/template/wall-e/eval/meta-harness/frontier.js +0 -96
- package/template/wall-e/eval/meta-harness/harness-interface.js +0 -90
- package/template/wall-e/eval/meta-harness/leakage-guard.js +0 -80
- package/template/wall-e/eval/meta-harness/optimizer.js +0 -207
- package/template/wall-e/eval/meta-harness/proposer-runner.js +0 -110
- package/template/wall-e/eval/meta-harness/reporting.js +0 -58
- package/template/wall-e/eval/meta-harness/telemetry.js +0 -27
- package/template/wall-e/eval/meta-harness/validation.js +0 -81
- package/template/wall-e/eval/promoter.js +0 -228
- package/template/wall-e/eval/provider-normalizer.js +0 -33
- package/template/wall-e/eval/replay.js +0 -395
- package/template/wall-e/eval/run-agent-benchmarks.js +0 -386
- package/template/wall-e/eval/run-codex-cli-baseline.js +0 -177
- package/template/wall-e/eval/run-coding-agent-real.js +0 -187
- package/template/wall-e/eval/run-eval.js +0 -435
- package/template/wall-e/eval/run-model-comparison.js +0 -142
- package/template/wall-e/eval/session-evaluator.js +0 -187
- package/template/wall-e/eval/session-miner.js +0 -207
- package/template/wall-e/eval/session-retrieval-benchmark.js +0 -150
- package/template/wall-e/eval/session-transcripts.js +0 -509
- package/template/wall-e/eval/shadow.js +0 -161
- package/template/wall-e/eval/swebench-adapter.js +0 -345
- package/template/wall-e/eval/swebench-docker.js +0 -192
- package/template/wall-e/eval/train.py +0 -320
- package/template/wall-e/eval/trainer.js +0 -232
- package/template/wall-e/eval/weekly-eval-loop.js +0 -241
|
@@ -194,6 +194,31 @@ The endpoint should be pure projection logic over active sessions first. Recent
|
|
|
194
194
|
sessions can be added as a later extension once the active-session dashboard is
|
|
195
195
|
stable.
|
|
196
196
|
|
|
197
|
+
### Cache And Refresh Contract
|
|
198
|
+
|
|
199
|
+
The overview must not block first paint on expensive transcript/timeline work.
|
|
200
|
+
`GET /api/sessions/standup` serves a materialized in-process snapshot when one
|
|
201
|
+
exists and refreshes it in the background when it is dirty or older than the
|
|
202
|
+
short refresh interval. If the process has no materialized snapshot yet, the
|
|
203
|
+
endpoint returns a fast bootstrap snapshot that skips timeline projection and
|
|
204
|
+
AI attention classification, then schedules a full refresh.
|
|
205
|
+
|
|
206
|
+
Response metadata:
|
|
207
|
+
|
|
208
|
+
- `revision`: content revision for incremental clients.
|
|
209
|
+
- `incremental`: `true` when the response is a delta against `?since=...`.
|
|
210
|
+
- `unchanged`: `true` when the client revision is current.
|
|
211
|
+
- `stale`: `true` when the response is known to be dirty or old enough to call
|
|
212
|
+
out as stale.
|
|
213
|
+
- `refreshing`: `true` when a background materialized refresh is scheduled or
|
|
214
|
+
running.
|
|
215
|
+
- `snapshotSource`: `bootstrap-fast` or `materialized`.
|
|
216
|
+
|
|
217
|
+
Desktop and mobile clients should render their last complete cached snapshot
|
|
218
|
+
immediately, then request `/api/sessions/standup?since=<revision>` in the
|
|
219
|
+
background. The user should see existing cards with a `refreshing` indicator,
|
|
220
|
+
not an empty `Loading sessions...` board, unless no cached snapshot exists.
|
|
221
|
+
|
|
197
222
|
## Implementation Phases
|
|
198
223
|
|
|
199
224
|
Phase 1: Design document
|
|
@@ -239,4 +264,3 @@ Future phase: Manager annotations
|
|
|
239
264
|
version stay one-session-at-a-time?
|
|
240
265
|
- Should manager annotations be cached per session turn, per stream summary, or
|
|
241
266
|
per dashboard refresh?
|
|
242
|
-
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Session Title Authority
|
|
2
|
+
|
|
3
|
+
CTM has one product-facing session name: `title`.
|
|
4
|
+
|
|
5
|
+
`label` is a legacy transport/storage alias that remains in `startup_tasks.label` and a few websocket payloads for compatibility. New application logic should read and write `title`; when a legacy `label` must be sent, it should mirror `title`.
|
|
6
|
+
|
|
7
|
+
## Precedence
|
|
8
|
+
|
|
9
|
+
1. Explicit user title wins.
|
|
10
|
+
2. A user-looking active `startup_tasks.label` is promoted into `ctm_sessions.title` with `user_renamed=1`.
|
|
11
|
+
3. AI-generated titles may fill `ctm_sessions.title` only when no user title exists.
|
|
12
|
+
4. Runtime generated titles such as `Codex: ~/repo`, `Claude Code: ~/repo`, `Shell: /path`, branch/worktree leaf names, and `Wall-E session` are not user titles.
|
|
13
|
+
|
|
14
|
+
## Why
|
|
15
|
+
|
|
16
|
+
Active sessions have two historical data paths:
|
|
17
|
+
|
|
18
|
+
- `startup_tasks.label`: crash-safe restore state for running tabs.
|
|
19
|
+
- `ctm_sessions.title`: durable catalog title used by recent sessions, review, and search.
|
|
20
|
+
|
|
21
|
+
If a user names a running Wall-E session `202612-trip`, that title may first live in `startup_tasks.label`. The auto-title job can later write an AI summary such as `Travel planning from cruise plan and conversation` into `ctm_sessions.title`. Without promotion, the browser sees two names for the same tab and different surfaces disagree.
|
|
22
|
+
|
|
23
|
+
The fix is architectural: promote the user runtime title into the durable title row and mark it user-owned. After that, existing `user_renamed` guards naturally prevent AI title generation from overwriting it.
|
|
24
|
+
|
|
25
|
+
## Implementation Rules
|
|
26
|
+
|
|
27
|
+
- Session create/rename should send `title`; `label` may be included only as a compatibility mirror.
|
|
28
|
+
- Rename writes must update both `ctm_sessions.title` and `startup_tasks.label`.
|
|
29
|
+
- Non-user title writers must call through `setSessionTitleNew`; it protects active user startup titles before accepting an AI title.
|
|
30
|
+
- Browser active-session chrome should prefer `meta.title`/user-looking runtime title before recent-session AI fields.
|
|
31
|
+
- Branch-only runtime labels are not user titles unless `userRenamed=1` is explicit. A worktree branch named `evaluation` should render as `Codex session` with an `evaluation` branch badge, not as a user title.
|
|
32
|
+
- New uses of `startup_tasks.label` should be commented as legacy schema compatibility.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Session Workspace Binding
|
|
2
|
+
|
|
3
|
+
CTM sessions have three related concepts that must not be conflated:
|
|
4
|
+
|
|
5
|
+
- Launch/restore `cwd`: where CTM started or resumed the PTY/provider process. This can be stale after an agent changes directory or moves work.
|
|
6
|
+
- Current runtime context: a provider/CTM-observed working directory signal, such as `update-session-cwd` or a future provider-native cwd hook/status event.
|
|
7
|
+
- Workspace binding: the verified project/worktree CTM should use for branch badges, worktree attention, and finish gates.
|
|
8
|
+
|
|
9
|
+
The binding resolver intentionally treats launch/restore metadata and current runtime context differently. A durable identity should win over a plain restored repo-root cwd, but an explicitly observed current runtime cwd should win over old identity because it describes where the live session is now.
|
|
10
|
+
|
|
11
|
+
The workspace binding is resolved from the strongest verified source available:
|
|
12
|
+
|
|
13
|
+
1. Confirmed current runtime context (`session._runtimeWorkContext`) when its cwd/worktree path maps to a known git worktree, or to a canonical agent worktree path.
|
|
14
|
+
2. Runtime `worktree_path` or `cwd` captured at launch/restore when it maps to a known git worktree.
|
|
15
|
+
3. `ctm_sessions.project_path` / `ctm_sessions.cwd` when they point at an agent worktree.
|
|
16
|
+
4. Linked `agent_sessions.project_path` rows, ordered by recency.
|
|
17
|
+
5. Runtime branch only when it can be verified against the runtime path.
|
|
18
|
+
|
|
19
|
+
If sources conflict, CTM marks the binding ambiguous and hides the raw runtime branch badge instead of showing a misleading branch. This prevents a stale runtime branch such as `phone-*` from appearing on unrelated active sessions.
|
|
20
|
+
|
|
21
|
+
Branch refresh is now a verifier. It probes the confirmed current runtime context first; only sessions without that signal fall back to their resolved workspace binding. It may persist `startup_tasks.branch/worktree_path` after git verifies the branch, but it should not let an arbitrary restored cwd silently become session identity. Restore prefers a verified durable binding when one exists, so split-brain sessions recover into their intended worktree rather than falling back to the repo root.
|
|
22
|
+
|
|
23
|
+
`startup_tasks.cwd`, `startup_tasks.branch`, and `startup_tasks.worktree_path` remain lifecycle/restore state, not a second durable identity table. Current runtime provenance is kept in memory on the session object and is recalculated from provider/CTM signals after restart. If CTM needs this to survive restart later, add explicit provenance fields instead of overloading `agent_sessions.project_path`.
|
|
24
|
+
|
|
25
|
+
Do not infer current worktree by scraping terminal text. Prefer explicit host/provider signals:
|
|
26
|
+
|
|
27
|
+
- Claude Code exposes workspace cwd/worktree in status-line and hook data, including cwd-change hooks.
|
|
28
|
+
- Codex/Cursor-style integrations should use their app-server/session metadata or CTM-side cwd update messages when available.
|
|
29
|
+
- Shell text remains presentation, not authority.
|
|
30
|
+
|
|
31
|
+
## UI Contract
|
|
32
|
+
|
|
33
|
+
The active sidebar and tab strip use `workspaceBinding.displayBranch` first, then fall back to the raw `branch` only when the binding does not say the runtime branch is unverified. Worktree attention badges continue to come from `worktreeStatus`, but that status is computed against the resolved workspace binding.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Skill Intent Resolution
|
|
2
|
+
|
|
3
|
+
CTM must not treat skill autocomplete as an automation contract. Autocomplete answers
|
|
4
|
+
"what might the user be typing?" while mobile worktree actions ask "which skill can
|
|
5
|
+
perform this operation for this agent?" Those are different problems.
|
|
6
|
+
|
|
7
|
+
## Goals
|
|
8
|
+
|
|
9
|
+
- Route phone worktree actions to the selected owning coding session instead of
|
|
10
|
+
mutating git directly from CTM.
|
|
11
|
+
- Choose the best available skill for each user and machine. Do not assume the
|
|
12
|
+
user has `tl-commit`.
|
|
13
|
+
- Respect agent dialects: Codex-style skills use `$skill`; Claude Code skills use
|
|
14
|
+
`/skill`.
|
|
15
|
+
- Avoid message-only skills such as `writing-commit-messages` for operations that
|
|
16
|
+
need to review, commit, merge, or create pull requests.
|
|
17
|
+
- Cache capability knowledge in the CTM process. A CTM restart rebuilds the cache
|
|
18
|
+
from the local skill registry, so newly installed or edited skills are picked up
|
|
19
|
+
without persistent migration state.
|
|
20
|
+
|
|
21
|
+
## Contract
|
|
22
|
+
|
|
23
|
+
The backend exposes:
|
|
24
|
+
|
|
25
|
+
`GET /api/skills/resolve-intent?intent=<intent>&agent=<agent>&cwd=<cwd>`
|
|
26
|
+
|
|
27
|
+
Supported intents:
|
|
28
|
+
|
|
29
|
+
- `commit_main`: review and commit local changes in the main checkout.
|
|
30
|
+
- `finish_and_merge`: review, commit intended changes, validate, and integrate a
|
|
31
|
+
worktree branch into local main.
|
|
32
|
+
- `create_pr`: review/commit as needed, push if needed, and create a pull request.
|
|
33
|
+
|
|
34
|
+
The response contains the selected skill, invocation prefix, inferred capabilities,
|
|
35
|
+
and a small ranked candidate list for diagnostics.
|
|
36
|
+
|
|
37
|
+
## Capability Model
|
|
38
|
+
|
|
39
|
+
Skills can declare explicit metadata:
|
|
40
|
+
|
|
41
|
+
```yaml
|
|
42
|
+
capabilities:
|
|
43
|
+
- git.review
|
|
44
|
+
- git.commit
|
|
45
|
+
- git.merge.main
|
|
46
|
+
invocation: $
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Legacy skills still work. The resolver infers capabilities from name,
|
|
50
|
+
description, source, and existing agent compatibility metadata. Explicit
|
|
51
|
+
capabilities win over inferred text, but inference is intentionally conservative:
|
|
52
|
+
`commit message` means message composition, not git commit authority.
|
|
53
|
+
|
|
54
|
+
## Caching
|
|
55
|
+
|
|
56
|
+
`lib/skill-autocomplete.js` caches parsed skill files by workspace. The intent
|
|
57
|
+
resolver adds a second in-memory cache keyed by `cwd + agent + intent` for the
|
|
58
|
+
ranked capability result. The cache is process-local by design:
|
|
59
|
+
|
|
60
|
+
- CTM restart = fresh parse and fresh intent cache.
|
|
61
|
+
- No persistent cache table means no stale cross-version schema or migration.
|
|
62
|
+
- Tests can clear the cache with `clearSkillIntentCache()`.
|
|
63
|
+
|
|
64
|
+
## Mobile UX
|
|
65
|
+
|
|
66
|
+
The phone worktree sheet asks the backend for the action intent instead of
|
|
67
|
+
querying autocomplete for broad words like `commit`, `review`, and `merge`.
|
|
68
|
+
|
|
69
|
+
If no eligible skill is found, CTM sends a plain-language prompt to the selected
|
|
70
|
+
session. That fallback is deliberate and safer than invoking a weak match. The
|
|
71
|
+
selected agent remains responsible for git state, validation, and reporting
|
|
72
|
+
blockers.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Wall-E MCP Supervisor Health
|
|
2
|
+
|
|
3
|
+
CTM serves Wall-E to coding agents through the provider-native `wall-e` MCP stdio bridge. The bridge proxies JSON-RPC to the local Wall-E daemon at `127.0.0.1:3457/mcp`; when the daemon is down it asks the CTM supervisor at `127.0.0.1:3456/api/start/walle` to start it.
|
|
4
|
+
|
|
5
|
+
## Startup Contract
|
|
6
|
+
|
|
7
|
+
Wall-E MCP startup has two separate readiness contracts:
|
|
8
|
+
|
|
9
|
+
- **CTM supervisor readiness**: `/api/start/walle` and `/api/restart/walle` only return success after the daemon answers MCP `initialize`, answers `tools/list`, exposes `walle_memory_status`, and successfully runs `tools/call` for `walle_memory_status`. Spawning a process is not enough.
|
|
10
|
+
- **Provider stdio readiness**: the provider-native stdio bridge must not fail MCP `initialize` or `tools/list` just because the daemon is still starting. If CTM cannot make the daemon ready, stdio enters a degraded MCP mode that exposes only `walle_memory_status`.
|
|
11
|
+
|
|
12
|
+
This prevents the recurring failure where Codex/Claude remove the `wall-e` MCP server during handshake because `127.0.0.1:3457` briefly refused connections after CTM restart.
|
|
13
|
+
|
|
14
|
+
In degraded stdio mode:
|
|
15
|
+
|
|
16
|
+
- `initialize` returns a valid Wall-E MCP serverInfo object with `degraded: true`;
|
|
17
|
+
- `tools/list` returns only `walle_memory_status`;
|
|
18
|
+
- `resources/list`, `resources/templates/list`, and `prompts/list` return empty lists;
|
|
19
|
+
- `tools/call` for `walle_memory_status` returns structured health with `mode: "stdio-degraded"` and the daemon/CTM ports;
|
|
20
|
+
- other tool calls return an MCP tool error result instead of a JSON-RPC handshake error.
|
|
21
|
+
|
|
22
|
+
The embedded brain DB fallback remains opt-in through `WALLE_MCP_EMBEDDED_DB=1`. Normal provider traffic should go through the daemon so there is one owner for SQLite, live connectors, CTM session context, and telemetry.
|
|
23
|
+
|
|
24
|
+
## Native Dependency Preflight
|
|
25
|
+
|
|
26
|
+
Wall-E uses native SQLite modules (`better-sqlite3` and `sqlite-vec`). After a Node upgrade, those modules can fail before Wall-E can bind the HTTP/MCP port. A stale `walle.pid` then turns into a generic `ECONNREFUSED` unless CTM diagnoses the start failure.
|
|
27
|
+
|
|
28
|
+
Before every supervised Wall-E start or restart, CTM now runs a preflight in the same Node binary that will launch Wall-E:
|
|
29
|
+
|
|
30
|
+
- load `better-sqlite3`;
|
|
31
|
+
- open an in-memory database and run `PRAGMA quick_check`;
|
|
32
|
+
- load `sqlite-vec` into that database;
|
|
33
|
+
- classify failures as `native_dependency_abi_mismatch`, `native_dependency_missing`, `native_dependency_load_failed`, or `native_dependency_check_timeout`.
|
|
34
|
+
|
|
35
|
+
For rebuildable failures CTM runs:
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
npm rebuild better-sqlite3 sqlite-vec
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Then it repeats the preflight. CTM only spawns Wall-E after the second check passes.
|
|
42
|
+
|
|
43
|
+
### Shared `node_modules` Guard
|
|
44
|
+
|
|
45
|
+
The rebuild path is only safe when the Wall-E checkout owns its own
|
|
46
|
+
`wall-e/node_modules` directory. A worktree may symlink
|
|
47
|
+
`wall-e/node_modules` to the primary checkout to save install time; that is
|
|
48
|
+
fine while every process uses the same Node runtime, but it is unsafe for
|
|
49
|
+
native auto-repair. If a Node 26 worktree rebuilds the primary checkout's
|
|
50
|
+
`better_sqlite3.node`, the primary Node 25 daemon can no longer load it; if the
|
|
51
|
+
primary daemon then rebuilds, the worktree breaks. The symptom is an apparent
|
|
52
|
+
compile/load loop where the binary alternates between two `NODE_MODULE_VERSION`
|
|
53
|
+
values.
|
|
54
|
+
|
|
55
|
+
CTM now inspects `wall-e/node_modules` before automatic install/rebuild. If the
|
|
56
|
+
directory resolves outside the current Wall-E checkout, native dependency
|
|
57
|
+
failures are reported as diagnostics but CTM refuses to mutate the shared
|
|
58
|
+
install. The correct fixes are:
|
|
59
|
+
|
|
60
|
+
- run the worktree with the same Node binary as the owner checkout; or
|
|
61
|
+
- install isolated Wall-E dependencies in that worktree so its native addon
|
|
62
|
+
build belongs to that worktree.
|
|
63
|
+
|
|
64
|
+
## Operator Behavior
|
|
65
|
+
|
|
66
|
+
This flow does not require restarting the CTM primary process. A provider MCP bridge or the CTM UI can call `/api/start/walle`; the supervisor will repair native modules when possible and start only the Wall-E daemon.
|
|
67
|
+
|
|
68
|
+
If repair fails, CTM exposes structured status:
|
|
69
|
+
|
|
70
|
+
- `/api/services/status` includes `walle.code`, `walle.error`, `walle.native_dependency`, `walle.last_start_error`, and `walle.mcp_ready`;
|
|
71
|
+
- proxied Wall-E routes return a 502 JSON body with the same diagnostic fields instead of only `connect ECONNREFUSED`;
|
|
72
|
+
- the stdio MCP bridge reports the CTM start failure through degraded `walle_memory_status` whenever the MCP method can be degraded safely.
|
|
73
|
+
|
|
74
|
+
If CTM spawns Wall-E but MCP never becomes ready, `/api/start/walle` returns HTTP 503 with `code: "walle_mcp_ready_timeout"` and the failed readiness probe details. That is intentionally different from a successful process start: the client needs tools, not just a PID.
|
|
75
|
+
|
|
76
|
+
## MCP Smoke Test
|
|
77
|
+
|
|
78
|
+
After recovery, verify the daemon rather than only the process:
|
|
79
|
+
|
|
80
|
+
1. `POST /mcp` with `initialize`.
|
|
81
|
+
2. `POST /mcp` with `tools/list`.
|
|
82
|
+
3. `POST /mcp` with `tools/call` for `walle_memory_status`.
|
|
83
|
+
|
|
84
|
+
All three must succeed before declaring Wall-E MCP reachable.
|
|
85
|
+
|
|
86
|
+
For provider startup resilience, also test the daemon-down path with self-heal disabled. The stdio bridge should still answer `initialize`, `tools/list`, and `tools/call walle_memory_status` without opening `wall-e-brain.db`.
|
|
@@ -6,6 +6,7 @@ Owner: CTM / Wall-E
|
|
|
6
6
|
Related docs:
|
|
7
7
|
- `claude-task-manager/docs/phone-access-design.md`
|
|
8
8
|
- `claude-task-manager/docs/phone-setup.md`
|
|
9
|
+
- `claude-task-manager/docs/remote-desktop-access-design.md`
|
|
9
10
|
- `claude-task-manager/docs/microsoft-dev-tunnel-phone-access-design.md`
|
|
10
11
|
- `claude-task-manager/docs/session-management-architecture.md`
|
|
11
12
|
|
|
@@ -20,6 +21,13 @@ your own network" setup with a Claude Code-style control plane: CTM keeps
|
|
|
20
21
|
running locally, makes an outbound TLS connection to a hosted Walle relay, and
|
|
21
22
|
the phone uses a Walle-authenticated web/mobile surface to steer local sessions.
|
|
22
23
|
|
|
24
|
+
2026-05-27 update: this doc now describes the typed Walle Remote mobile-relay
|
|
25
|
+
path only. It is not the primary direct browser-access plan. Full desktop-style
|
|
26
|
+
browser access for phone and another computer is covered by the unified
|
|
27
|
+
client-device architecture in `remote-desktop-access-design.md`, with private
|
|
28
|
+
Microsoft Dev Tunnel as the default transport and Tailscale as the private
|
|
29
|
+
network alternative. Cloudflare Tunnel is out of scope.
|
|
30
|
+
|
|
23
31
|
This is not a generic localhost tunnel. The relay carries a narrow typed
|
|
24
32
|
protocol for session review, messaging, and approvals. It must not proxy the
|
|
25
33
|
entire CTM web app or arbitrary local HTTP requests in the MVP.
|
|
@@ -51,8 +59,8 @@ execution to cloud infrastructure.
|
|
|
51
59
|
and requiring step-up confirmation for high-risk commands.
|
|
52
60
|
5. Give the phone a purpose-built triage UI: what needs attention, what changed,
|
|
53
61
|
what can I safely approve, and what should I send next.
|
|
54
|
-
6. Preserve existing Microsoft Dev Tunnel
|
|
55
|
-
|
|
62
|
+
6. Preserve existing Microsoft Dev Tunnel and Tailscale paths as direct
|
|
63
|
+
browser transports outside the typed relay.
|
|
56
64
|
|
|
57
65
|
## Success Metrics
|
|
58
66
|
|
|
@@ -102,9 +110,8 @@ execution to cloud infrastructure.
|
|
|
102
110
|
1. User opens CTM on the Mac and goes to `Setup -> Access`.
|
|
103
111
|
2. CTM shows three access methods:
|
|
104
112
|
- Walle Remote, recommended
|
|
105
|
-
- Microsoft Dev Tunnel
|
|
113
|
+
- Microsoft Dev Tunnel private browser access
|
|
106
114
|
- Tailscale private URL
|
|
107
|
-
- Cloudflare Access browser URL
|
|
108
115
|
3. User clicks `Set up Walle Remote`.
|
|
109
116
|
4. CTM checks relay prerequisites:
|
|
110
117
|
- Walle account signed in or sign-in available
|
|
@@ -180,14 +187,13 @@ execution to cloud infrastructure.
|
|
|
180
187
|
- Walle Remote `Recommended`
|
|
181
188
|
- Microsoft Dev Tunnel
|
|
182
189
|
- Tailscale
|
|
183
|
-
- Cloudflare Access
|
|
184
190
|
- Walle Remote panel
|
|
185
191
|
- Status card
|
|
186
192
|
- Pair phone
|
|
187
193
|
- Paired devices
|
|
188
194
|
- Relay connection diagnostics
|
|
189
195
|
- Security/audit link
|
|
190
|
-
- Microsoft Dev Tunnel
|
|
196
|
+
- Microsoft Dev Tunnel and Tailscale remain collapsible direct-browser access
|
|
191
197
|
groups.
|
|
192
198
|
|
|
193
199
|
### Phone IA
|
|
@@ -219,8 +225,9 @@ execution to cloud infrastructure.
|
|
|
219
225
|
|
|
220
226
|
### Desktop: Walle Remote Setup Panel
|
|
221
227
|
|
|
222
|
-
Layout: use the same access-method pattern as
|
|
223
|
-
Remote
|
|
228
|
+
Layout: use the same access-method pattern as Microsoft Dev Tunnel and
|
|
229
|
+
Tailscale. Walle Remote is the typed mobile-relay option, not the default full
|
|
230
|
+
browser-access option.
|
|
224
231
|
|
|
225
232
|
Primary states:
|
|
226
233
|
|
|
@@ -469,9 +476,11 @@ High-risk write:
|
|
|
469
476
|
- `network.setup_change`
|
|
470
477
|
- `ctm.restart`
|
|
471
478
|
|
|
472
|
-
MVP
|
|
473
|
-
|
|
474
|
-
step-up
|
|
479
|
+
MVP implements the read and low-risk write set first. `approval.respond` is the
|
|
480
|
+
first high-risk write allowed through the relay, and only after local CTM
|
|
481
|
+
authorization, idempotency, audit logging, and step-up have accepted the typed
|
|
482
|
+
message. Other high-risk writes can be represented in the UI before they are
|
|
483
|
+
enabled, but must fail closed until the same controls are in place.
|
|
475
484
|
|
|
476
485
|
`sessions.subscribe` is intentionally not a request/response wrapper around
|
|
477
486
|
`sessions.get`. The local phone app uses the host WebSocket as the foreground
|
|
@@ -997,12 +1006,12 @@ The first shippable MVP should include:
|
|
|
997
1006
|
- Phone home with session list.
|
|
998
1007
|
- Session detail with stream summary.
|
|
999
1008
|
- Send message to session.
|
|
1000
|
-
-
|
|
1009
|
+
- Step-up-gated approval response.
|
|
1001
1010
|
- Audit log.
|
|
1002
1011
|
|
|
1003
|
-
Remote approval responses
|
|
1004
|
-
place. That is the line between a useful remote companion and a risky
|
|
1005
|
-
admin surface.
|
|
1012
|
+
Remote approval responses are allowed only with step-up, idempotency, and local
|
|
1013
|
+
audit in place. That is the line between a useful remote companion and a risky
|
|
1014
|
+
remote admin surface.
|
|
1006
1015
|
|
|
1007
1016
|
## Open Questions
|
|
1008
1017
|
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Wall-E Session History Hydration
|
|
2
|
+
|
|
3
|
+
## Problem
|
|
4
|
+
|
|
5
|
+
Wall-E session history is chat transcript data, not terminal scrollback. CTM used to hydrate visible Wall-E tabs through the same `attach` and `snapshot` restore path used by xterm-backed Codex/Claude sessions. That made a Wall-E tab vulnerable to terminal lifecycle races:
|
|
6
|
+
|
|
7
|
+
- restart creates deferred startup placeholders;
|
|
8
|
+
- hidden terminal snapshot prewarm can ask the server to auto-start a deferred session;
|
|
9
|
+
- if that happens for a Wall-E placeholder with no visible browser client, the runtime can be marked restored while no `walle-history` payload is delivered;
|
|
10
|
+
- the browser can then sit in `requested && !loaded` state and keep showing "Rehydrating Wall-E session history".
|
|
11
|
+
|
|
12
|
+
The history read itself is normally cheap. The product boundary was wrong.
|
|
13
|
+
|
|
14
|
+
## Architecture
|
|
15
|
+
|
|
16
|
+
Wall-E history now has its own request/response lane:
|
|
17
|
+
|
|
18
|
+
1. Browser activation calls `WalleSession.requestHistory(...)`.
|
|
19
|
+
2. The client sends `walle-history-request` over the existing CTM WebSocket.
|
|
20
|
+
3. The server resolves the Wall-E transcript source from live session metadata, CTM DB identity, or startup task metadata.
|
|
21
|
+
4. The server replies with `walle-history` from the durable conversation cache or local Wall-E transcript history.
|
|
22
|
+
5. Terminal `snapshot`, `reflow`, and hidden prewarm paths are not allowed to auto-start Wall-E deferred sessions.
|
|
23
|
+
|
|
24
|
+
This keeps chat history hydration independent from PTY restore. Existing `attach` remains compatible for older clients, but it is no longer the normal browser path for loading a Wall-E conversation.
|
|
25
|
+
|
|
26
|
+
## Browser Surface Reconciliation
|
|
27
|
+
|
|
28
|
+
The browser must treat server session type as authoritative after reconnect.
|
|
29
|
+
A tab can exist locally before the latest `list` payload arrives, and that local
|
|
30
|
+
tab may still have a stale terminal container from a previous runtime shape.
|
|
31
|
+
Native Wall-E sessions are not xterm sessions, so reusing that terminal surface
|
|
32
|
+
can leave a `snapshot-loading-overlay` on screen even though the server has
|
|
33
|
+
already reported the session as idle.
|
|
34
|
+
|
|
35
|
+
On every `sessions-list` refresh:
|
|
36
|
+
|
|
37
|
+
- if the server reports `type: "walle"` or a native Wall-E marker, the client
|
|
38
|
+
converts the local session to a Wall-E surface;
|
|
39
|
+
- conversion disposes terminal renderers, timers, xterm instances, stale
|
|
40
|
+
containers, and loading overlays before rendering the Wall-E transcript view;
|
|
41
|
+
- if an existing Wall-E-shaped local tab is later reported as terminal-backed,
|
|
42
|
+
the client recreates a terminal stub instead of mutating the Wall-E DOM in
|
|
43
|
+
place;
|
|
44
|
+
- `server-ready` and restart overlays do not wait for terminal scrollback when
|
|
45
|
+
the active tab is a native Wall-E session. They request Wall-E history and
|
|
46
|
+
dismiss the global restore overlay.
|
|
47
|
+
|
|
48
|
+
This mirrors the boundary used by OpenCode/Claude-style transcript views:
|
|
49
|
+
conversation history is hydrated by a transcript/message lane, while terminal
|
|
50
|
+
snapshot restore is reserved for live terminal sessions.
|
|
51
|
+
|
|
52
|
+
## Hidden Snapshot Prewarm Policy
|
|
53
|
+
|
|
54
|
+
Hidden snapshot prewarm is only for hidden sessions that have live terminal
|
|
55
|
+
control. It must not auto-start a deferred provider session just to serialize a
|
|
56
|
+
background snapshot.
|
|
57
|
+
|
|
58
|
+
Rules:
|
|
59
|
+
|
|
60
|
+
- skip native Wall-E sessions;
|
|
61
|
+
- skip exited sessions;
|
|
62
|
+
- skip restore-deferred sessions that do not expose terminal input/control;
|
|
63
|
+
- if a legacy/in-flight hidden prewarm receives `session-restore-deferred` with
|
|
64
|
+
`starting: false`, settle the prewarm immediately instead of waiting for the
|
|
65
|
+
timeout.
|
|
66
|
+
|
|
67
|
+
This prevents restart from turning into a serialized background resume storm,
|
|
68
|
+
which was the main reason some tabs appeared to restore slowly or never clear
|
|
69
|
+
their loading state.
|
|
70
|
+
|
|
71
|
+
## State Contract
|
|
72
|
+
|
|
73
|
+
The browser treats history loading as an idempotent state machine:
|
|
74
|
+
|
|
75
|
+
- `idle`: no history request has been made;
|
|
76
|
+
- `loading(requestId)`: a request is in flight;
|
|
77
|
+
- `loaded(requestId)`: history arrived, even if the transcript is empty;
|
|
78
|
+
- `error(requestId)`: the server rejected the request.
|
|
79
|
+
|
|
80
|
+
If a visible tab is stuck in `requested && !loaded`, activation retries after the retry window instead of assuming the old request will complete. Server responses echo `historyRequestId`, so stale replies cannot overwrite a newer load.
|
|
81
|
+
|
|
82
|
+
## Server Rules
|
|
83
|
+
|
|
84
|
+
- `walle-history-request` may read cache/transcript history without starting a deferred runtime.
|
|
85
|
+
- `snapshot` for a Wall-E session is redirected to history hydration and returns a non-terminal snapshot no-op.
|
|
86
|
+
- `_maybeAutoStartDeferredRestore` blocks Wall-E auto-start from snapshot/reflow/prewarm sources.
|
|
87
|
+
- `/api/session/messages` uses the local Wall-E cache/history fast path before falling back to generic JSONL parsing.
|
|
88
|
+
|
|
89
|
+
## Testing
|
|
90
|
+
|
|
91
|
+
Regression coverage lives in `tests/walle-history-hydration.test.js`:
|
|
92
|
+
|
|
93
|
+
- Wall-E deferred sessions do not auto-start from terminal snapshot prewarm.
|
|
94
|
+
- Terminal sessions keep their existing auto-start behavior.
|
|
95
|
+
- requested-but-not-loaded Wall-E history retries after the retry window.
|
|
96
|
+
|
|
97
|
+
Browser regression coverage:
|
|
98
|
+
|
|
99
|
+
- `tests/rendering/scenarios/walle-session-default-model.spec.js` verifies that
|
|
100
|
+
a native Wall-E `sessions-list` update replaces a stale terminal restore
|
|
101
|
+
surface and requests Wall-E history.
|
|
102
|
+
- `tests/rendering/scenarios/reconnect.spec.js` verifies that hidden deferred
|
|
103
|
+
tabs are skipped by background snapshot prewarm and that deferred prewarm
|
|
104
|
+
responses settle immediately.
|
|
105
|
+
|
|
106
|
+
Run:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
npm --prefix claude-task-manager test -- --test-name-pattern=walle-history-hydration
|
|
110
|
+
node --check claude-task-manager/server.js
|
|
111
|
+
node --check claude-task-manager/public/js/walle-session.js
|
|
112
|
+
npm --prefix claude-task-manager run test:render -- scenarios/walle-session-default-model.spec.js -g "type transition" --retries=0
|
|
113
|
+
npm --prefix claude-task-manager run test:render -- scenarios/reconnect.spec.js -g "hidden deferred tabs" --retries=0
|
|
114
|
+
```
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Wall-E Session Input Queue
|
|
2
|
+
|
|
3
|
+
## Problem
|
|
4
|
+
|
|
5
|
+
Wall-E session input currently has two incompatible behaviors:
|
|
6
|
+
|
|
7
|
+
- The composer stays editable while Wall-E is generating, so users can draft the
|
|
8
|
+
next prompt.
|
|
9
|
+
- The transport rejects a second `walle-message` while a turn is active, so
|
|
10
|
+
pressing Enter during generation either does nothing useful or leaves the user
|
|
11
|
+
with a draft that is not part of the session lifecycle.
|
|
12
|
+
|
|
13
|
+
The product contract should be explicit: a prompt submitted while Wall-E is busy
|
|
14
|
+
is queued for the same session and dispatched only when the session is ready for
|
|
15
|
+
another normal user turn.
|
|
16
|
+
|
|
17
|
+
## Architecture
|
|
18
|
+
|
|
19
|
+
CTM reuses the existing persisted `queueEngine` and `prompt_queues` table. The
|
|
20
|
+
queue remains server-owned; desktop and phone clients only render a projection of
|
|
21
|
+
that state.
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
Wall-E composer / Queue Builder
|
|
25
|
+
|
|
|
26
|
+
v
|
|
27
|
+
POST /api/queues { append: true, autoStart: true }
|
|
28
|
+
|
|
|
29
|
+
v
|
|
30
|
+
queueEngine
|
|
31
|
+
- persists queue items in prompt_queues
|
|
32
|
+
- holds pending items while a target is not ready
|
|
33
|
+
- claims one item at a time as sending
|
|
34
|
+
|
|
|
35
|
+
v
|
|
36
|
+
Wall-E readiness gate
|
|
37
|
+
- blocks while session.abortController exists
|
|
38
|
+
- blocks when the latest assistant turn has pending external actions and the
|
|
39
|
+
queued item is not an approval
|
|
40
|
+
|
|
|
41
|
+
v
|
|
42
|
+
handleWalleMessage()
|
|
43
|
+
- appends the user turn to the Wall-E transcript
|
|
44
|
+
- calls /api/wall-e/chat?stream=1
|
|
45
|
+
- wakes the queue when the turn finishes
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## State Contract
|
|
49
|
+
|
|
50
|
+
Queue item statuses:
|
|
51
|
+
|
|
52
|
+
- `pending`: durable item waiting to be dispatched.
|
|
53
|
+
- `sending`: exactly one item claimed by the dispatcher.
|
|
54
|
+
- `sent`: the Wall-E turn completed and the queue may advance.
|
|
55
|
+
- `skipped`: user skipped the item.
|
|
56
|
+
|
|
57
|
+
Queue status:
|
|
58
|
+
|
|
59
|
+
- `running`: queue is active. It may be dispatching or waiting on readiness.
|
|
60
|
+
- `paused`: queue will not dispatch until resumed.
|
|
61
|
+
- `done`: no remaining pending work.
|
|
62
|
+
|
|
63
|
+
Readiness metadata is intentionally separate from persisted queue contents:
|
|
64
|
+
|
|
65
|
+
- `waitingCode`
|
|
66
|
+
- `waitingReason`
|
|
67
|
+
- `waitingMessage`
|
|
68
|
+
|
|
69
|
+
These fields explain why a running queue has not dispatched yet. They are
|
|
70
|
+
derived from live session state and rebroadcast over WebSocket; they do not need
|
|
71
|
+
to be durable.
|
|
72
|
+
|
|
73
|
+
## UX Contract
|
|
74
|
+
|
|
75
|
+
When the user presses Enter in a Wall-E composer:
|
|
76
|
+
|
|
77
|
+
- If Wall-E is idle, send the prompt immediately.
|
|
78
|
+
- If Wall-E is generating, append one durable queue item and clear the composer
|
|
79
|
+
only after the server accepts the queue.
|
|
80
|
+
- If a queue exists, append instead of replacing.
|
|
81
|
+
- Show a compact "Queued next" card above the composer with the next pending
|
|
82
|
+
prompt and cancel/open-queue actions.
|
|
83
|
+
- Keep the Stop button scoped to the current Wall-E turn. Stopping does not
|
|
84
|
+
delete queued prompts.
|
|
85
|
+
|
|
86
|
+
## Safety
|
|
87
|
+
|
|
88
|
+
The queue must never send a queued normal prompt into an approval boundary. If
|
|
89
|
+
the latest assistant turn contains pending external actions, a queued prompt is
|
|
90
|
+
held until the user sends an approval/denial or cancels the queue. This prevents
|
|
91
|
+
a follow-up question from being interpreted as consent.
|
|
92
|
+
|
|
93
|
+
## Tests
|
|
94
|
+
|
|
95
|
+
Required coverage:
|
|
96
|
+
|
|
97
|
+
- Queue engine waits when a readiness gate returns false, then dispatches on
|
|
98
|
+
wake.
|
|
99
|
+
- Appending to a running async queue preserves item order.
|
|
100
|
+
- Wall-E composer Enter while generating creates a queue item instead of a
|
|
101
|
+
second `walle-message`.
|
|
102
|
+
- The queued prompt card renders and clears when queue state is done/deleted.
|
|
103
|
+
- Dev instance browser validation uses real keyboard events against a non-primary
|
|
104
|
+
CTM port.
|