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.
Files changed (500) hide show
  1. package/README.md +27 -5
  2. package/package.json +2 -2
  3. package/template/CLAUDE.md +2 -2
  4. package/template/LICENSE +1 -1
  5. package/template/bin/ctm-dev-cleanup.js +24 -3
  6. package/template/bin/ctm-launch.sh +13 -0
  7. package/template/bin/dev.sh +156 -18
  8. package/template/bin/node-bin.sh +84 -0
  9. package/template/bin/pin-node.sh +51 -0
  10. package/template/claude-task-manager/api-prompts.js +1203 -182
  11. package/template/claude-task-manager/api-reviews.js +109 -15
  12. package/template/claude-task-manager/approval-agent.js +1360 -280
  13. package/template/claude-task-manager/bin/restart-ctm.sh +64 -23
  14. package/template/claude-task-manager/bin/storage-migration-supervisor.js +338 -0
  15. package/template/claude-task-manager/db.js +4417 -295
  16. package/template/claude-task-manager/docs/app-update-refresh-protocol.md +69 -0
  17. package/template/claude-task-manager/docs/approval-ai-refinement.md +138 -0
  18. package/template/claude-task-manager/docs/approval-rescue-loop.md +74 -0
  19. package/template/claude-task-manager/docs/codex-operational-warning-health.md +107 -0
  20. package/template/claude-task-manager/docs/codex-resume-state-guard-design.md +17 -12
  21. package/template/claude-task-manager/docs/codex-terminal-render-controller-handoff.md +311 -0
  22. package/template/claude-task-manager/docs/coding-agent-hooks-architecture.md +418 -0
  23. package/template/claude-task-manager/docs/conversation-import-freshness.md +20 -0
  24. package/template/claude-task-manager/docs/google-workspace-auth-health.md +77 -0
  25. package/template/claude-task-manager/docs/image-paste-ux.md +13 -0
  26. package/template/claude-task-manager/docs/ipad-web-preview.md +88 -0
  27. package/template/claude-task-manager/docs/main-loop-offload-architecture.md +66 -0
  28. package/template/claude-task-manager/docs/microsoft-dev-tunnel-phone-access-design.md +274 -519
  29. package/template/claude-task-manager/docs/mobile-live-streaming.md +27 -5
  30. package/template/claude-task-manager/docs/mobile-remote-submission-lifecycle.md +69 -0
  31. package/template/claude-task-manager/docs/phone-access-design.md +53 -15
  32. package/template/claude-task-manager/docs/phone-passkey-identity.md +122 -0
  33. package/template/claude-task-manager/docs/phone-setup.md +3 -0
  34. package/template/claude-task-manager/docs/prompt-editing-tree-design.md +25 -1
  35. package/template/claude-task-manager/docs/remote-desktop-access-design.md +268 -0
  36. package/template/claude-task-manager/docs/restart-lifecycle-architecture.md +95 -0
  37. package/template/claude-task-manager/docs/runtime-work-control-plane.md +53 -0
  38. package/template/claude-task-manager/docs/session-interactive-wait-surfaces.md +38 -0
  39. package/template/claude-task-manager/docs/session-needs-you-dismissal.md +84 -0
  40. package/template/claude-task-manager/docs/session-render-state-management-design.md +91 -3
  41. package/template/claude-task-manager/docs/session-standup-command-center-design.md +25 -1
  42. package/template/claude-task-manager/docs/session-title-authority.md +32 -0
  43. package/template/claude-task-manager/docs/session-workspace-binding.md +33 -0
  44. package/template/claude-task-manager/docs/skill-intent-resolution-design.md +72 -0
  45. package/template/claude-task-manager/docs/walle-mcp-supervisor-health.md +86 -0
  46. package/template/claude-task-manager/docs/walle-relay-phone-access-design.md +24 -15
  47. package/template/claude-task-manager/docs/walle-session-history-hydration.md +114 -0
  48. package/template/claude-task-manager/docs/walle-session-input-queue.md +104 -0
  49. package/template/claude-task-manager/docs/walle-session-model-catalog.md +90 -0
  50. package/template/claude-task-manager/docs/walle-session-model-preferences.md +15 -6
  51. package/template/claude-task-manager/git-utils.js +897 -27
  52. package/template/claude-task-manager/lib/agent-capabilities.js +33 -0
  53. package/template/claude-task-manager/lib/agent-cli-cache.js +37 -7
  54. package/template/claude-task-manager/lib/agent-hooks-installer.js +26 -2
  55. package/template/claude-task-manager/lib/agent-presets.js +17 -1
  56. package/template/claude-task-manager/lib/all-sessions-query.js +108 -0
  57. package/template/claude-task-manager/lib/approval-ai-refinement.js +488 -0
  58. package/template/claude-task-manager/lib/approval-self-adapt.js +168 -0
  59. package/template/claude-task-manager/lib/async-semaphore.js +44 -0
  60. package/template/claude-task-manager/lib/auth-context.js +5 -0
  61. package/template/claude-task-manager/lib/auth-rate-limit.js +47 -4
  62. package/template/claude-task-manager/lib/auth-rules.js +29 -2
  63. package/template/claude-task-manager/lib/auto-approval-verifier.js +129 -16
  64. package/template/claude-task-manager/lib/background-llm.js +144 -17
  65. package/template/claude-task-manager/lib/branch-inventory.js +212 -0
  66. package/template/claude-task-manager/lib/claude-desktop-sessions.js +15 -3
  67. package/template/claude-task-manager/lib/coalesce-sync-frames.js +151 -0
  68. package/template/claude-task-manager/lib/codex-launch-health.js +762 -0
  69. package/template/claude-task-manager/lib/codex-transcript-pager.js +51 -0
  70. package/template/claude-task-manager/lib/codex-zst.js +124 -0
  71. package/template/claude-task-manager/lib/coding-agent-models.js +233 -30
  72. package/template/claude-task-manager/lib/connection-health.js +232 -0
  73. package/template/claude-task-manager/lib/conversation-blob-parser.js +42 -0
  74. package/template/claude-task-manager/lib/conversation-tail-merge.js +89 -26
  75. package/template/claude-task-manager/lib/ctm-session-context-api.js +39 -10
  76. package/template/claude-task-manager/lib/cursor-conversation-store.js +354 -0
  77. package/template/claude-task-manager/lib/db-owner-worker-client.js +315 -0
  78. package/template/claude-task-manager/lib/document-review.js +141 -6
  79. package/template/claude-task-manager/lib/escalation-review.js +152 -0
  80. package/template/claude-task-manager/lib/graceful-shutdown.js +159 -0
  81. package/template/claude-task-manager/lib/headless-term-service.js +678 -0
  82. package/template/claude-task-manager/lib/heavy-worker-fallback.js +38 -0
  83. package/template/claude-task-manager/lib/jsonl-conversation-parser.js +542 -0
  84. package/template/claude-task-manager/lib/jsonl-range-reader.js +112 -0
  85. package/template/claude-task-manager/lib/main-db-census.js +216 -0
  86. package/template/claude-task-manager/lib/message-pagination.js +106 -4
  87. package/template/claude-task-manager/lib/microsoft-dev-tunnel-setup.js +750 -26
  88. package/template/claude-task-manager/lib/mobile-auth-api.js +274 -7
  89. package/template/claude-task-manager/lib/mobile-auth-store.js +592 -10
  90. package/template/claude-task-manager/lib/mobile-notification-dispatcher.js +15 -0
  91. package/template/claude-task-manager/lib/model-overview-brain-fallback.js +311 -0
  92. package/template/claude-task-manager/lib/model-overview-cache.js +141 -0
  93. package/template/claude-task-manager/lib/models-health-routing-notice.js +126 -0
  94. package/template/claude-task-manager/lib/node-pin-guard.js +93 -0
  95. package/template/claude-task-manager/lib/perf-tracker.js +242 -6
  96. package/template/claude-task-manager/lib/permission-match.js +76 -0
  97. package/template/claude-task-manager/lib/permission-sync.js +133 -20
  98. package/template/claude-task-manager/lib/process-title.js +35 -0
  99. package/template/claude-task-manager/lib/prompt-executions-query.js +25 -0
  100. package/template/claude-task-manager/lib/prompt-index-disk-cache.js +44 -0
  101. package/template/claude-task-manager/lib/prompt-intent.js +132 -0
  102. package/template/claude-task-manager/lib/provider-user-context.js +34 -0
  103. package/template/claude-task-manager/lib/read-pool-client.js +313 -0
  104. package/template/claude-task-manager/lib/readpool-breaker.js +31 -0
  105. package/template/claude-task-manager/lib/recent-sessions-breaker.js +12 -0
  106. package/template/claude-task-manager/lib/remote-feedback-client.js +72 -0
  107. package/template/claude-task-manager/lib/remote-relay-protocol.js +37 -4
  108. package/template/claude-task-manager/lib/remote-relay-store.js +159 -0
  109. package/template/claude-task-manager/lib/remote-submission-observer.js +278 -0
  110. package/template/claude-task-manager/lib/restart-guard.js +109 -0
  111. package/template/claude-task-manager/lib/restore-interruption-detector.js +439 -0
  112. package/template/claude-task-manager/lib/restore-policy.js +13 -0
  113. package/template/claude-task-manager/lib/restore-resume-batch.js +74 -0
  114. package/template/claude-task-manager/lib/restore-runtime.js +68 -0
  115. package/template/claude-task-manager/lib/restore-storm.js +34 -0
  116. package/template/claude-task-manager/lib/resume-cwd.js +36 -0
  117. package/template/claude-task-manager/lib/resume-preflight.js +313 -0
  118. package/template/claude-task-manager/lib/runtime-work-registry.js +444 -0
  119. package/template/claude-task-manager/lib/sanitize-openai-auth.js +31 -0
  120. package/template/claude-task-manager/lib/scheduler.js +21 -1
  121. package/template/claude-task-manager/lib/scrollback-snapshot-store.js +159 -0
  122. package/template/claude-task-manager/lib/serial-task-queue.js +64 -0
  123. package/template/claude-task-manager/lib/server-listeners.js +239 -0
  124. package/template/claude-task-manager/lib/session-capture.js +42 -7
  125. package/template/claude-task-manager/lib/session-content-backfill.js +131 -0
  126. package/template/claude-task-manager/lib/session-history.js +388 -43
  127. package/template/claude-task-manager/lib/session-host-manager.js +287 -0
  128. package/template/claude-task-manager/lib/session-image-refs.js +209 -0
  129. package/template/claude-task-manager/lib/session-jobs.js +399 -59
  130. package/template/claude-task-manager/lib/session-prompt-index.js +137 -0
  131. package/template/claude-task-manager/lib/session-restore.js +53 -0
  132. package/template/claude-task-manager/lib/session-standup.js +123 -23
  133. package/template/claude-task-manager/lib/session-state-bus.js +14 -0
  134. package/template/claude-task-manager/lib/session-stream.js +64 -16
  135. package/template/claude-task-manager/lib/session-timeline-summary.js +260 -0
  136. package/template/claude-task-manager/lib/session-token-usage.js +494 -0
  137. package/template/claude-task-manager/lib/session-workspace-binding.js +356 -0
  138. package/template/claude-task-manager/lib/setup-network-config.js +9 -0
  139. package/template/claude-task-manager/lib/size-cap.js +45 -0
  140. package/template/claude-task-manager/lib/size-cap.test.js +62 -0
  141. package/template/claude-task-manager/lib/skill-autocomplete.js +180 -1
  142. package/template/claude-task-manager/lib/skill-intent-resolver.js +304 -0
  143. package/template/claude-task-manager/lib/sqlite-driver.js +19 -3
  144. package/template/claude-task-manager/lib/standup-attention.js +7 -3
  145. package/template/claude-task-manager/lib/status-authority.js +39 -0
  146. package/template/claude-task-manager/lib/status-hooks.js +4 -0
  147. package/template/claude-task-manager/lib/storage-migration.js +235 -0
  148. package/template/claude-task-manager/lib/structured-capture.js +298 -0
  149. package/template/claude-task-manager/lib/sync-io-census.js +163 -0
  150. package/template/claude-task-manager/lib/tailscale-setup.js +6 -0
  151. package/template/claude-task-manager/lib/terminal-activity-evidence.js +33 -0
  152. package/template/claude-task-manager/lib/terminal-choice.js +364 -0
  153. package/template/claude-task-manager/lib/terminal-control-sanitize.js +17 -0
  154. package/template/claude-task-manager/lib/terminal-fingerprint.js +48 -0
  155. package/template/claude-task-manager/lib/terminal-output-flush.js +84 -0
  156. package/template/claude-task-manager/lib/timeline-order.js +122 -0
  157. package/template/claude-task-manager/lib/transcript-store.js +348 -43
  158. package/template/claude-task-manager/lib/transport-security.js +84 -1
  159. package/template/claude-task-manager/lib/wait-state.js +184 -0
  160. package/template/claude-task-manager/lib/walle-client.js +47 -5
  161. package/template/claude-task-manager/lib/walle-ctm-history.js +564 -4
  162. package/template/claude-task-manager/lib/walle-external-actions.js +135 -16
  163. package/template/claude-task-manager/lib/walle-history-hydration.js +46 -0
  164. package/template/claude-task-manager/lib/walle-native-health.js +403 -0
  165. package/template/claude-task-manager/lib/walle-repair.js +701 -0
  166. package/template/claude-task-manager/lib/walle-session-cache.js +109 -0
  167. package/template/claude-task-manager/lib/walle-session-context.js +57 -21
  168. package/template/claude-task-manager/lib/walle-session-model-catalog.js +34 -0
  169. package/template/claude-task-manager/lib/walle-supervisor.js +539 -63
  170. package/template/claude-task-manager/lib/walle-transcript.js +52 -0
  171. package/template/claude-task-manager/lib/worktree-active-sync.js +11 -7
  172. package/template/claude-task-manager/lib/worktree-cwd.js +32 -1
  173. package/template/claude-task-manager/package.json +1 -1
  174. package/template/claude-task-manager/prompt-harvest.js +89 -66
  175. package/template/claude-task-manager/providers/claude-code.js +51 -3
  176. package/template/claude-task-manager/providers/cursor.js +140 -45
  177. package/template/claude-task-manager/public/css/reviews.css +551 -61
  178. package/template/claude-task-manager/public/css/setup.css +191 -0
  179. package/template/claude-task-manager/public/css/walle-session.css +865 -10
  180. package/template/claude-task-manager/public/css/walle.css +154 -0
  181. package/template/claude-task-manager/public/designs/ai-providers-consolidation-v2.html +830 -0
  182. package/template/claude-task-manager/public/index.html +18516 -2058
  183. package/template/claude-task-manager/public/ipad.html +363 -0
  184. package/template/claude-task-manager/public/js/document-review-links.js +301 -0
  185. package/template/claude-task-manager/public/js/image-normalize.js +69 -36
  186. package/template/claude-task-manager/public/js/message-renderer.js +1265 -77
  187. package/template/claude-task-manager/public/js/prompts.js +66 -29
  188. package/template/claude-task-manager/public/js/reviews.js +901 -133
  189. package/template/claude-task-manager/public/js/session-activity-utils.js +11 -1
  190. package/template/claude-task-manager/public/js/session-search-utils.js +94 -10
  191. package/template/claude-task-manager/public/js/session-status-precedence.js +23 -5
  192. package/template/claude-task-manager/public/js/setup.js +1273 -176
  193. package/template/claude-task-manager/public/js/stream-view.js +691 -73
  194. package/template/claude-task-manager/public/js/terminal-reconciler.js +210 -0
  195. package/template/claude-task-manager/public/js/walle-session.js +2455 -158
  196. package/template/claude-task-manager/public/js/walle.js +455 -28
  197. package/template/claude-task-manager/public/m/app.css +2909 -262
  198. package/template/claude-task-manager/public/m/app.js +6601 -398
  199. package/template/claude-task-manager/public/m/claim.html +224 -17
  200. package/template/claude-task-manager/public/m/index.html +117 -21
  201. package/template/claude-task-manager/public/m/sw.js +3 -1
  202. package/template/claude-task-manager/public/manifest.json +2 -2
  203. package/template/claude-task-manager/public/prompts.html +30 -14
  204. package/template/claude-task-manager/queue-engine.js +507 -28
  205. package/template/claude-task-manager/scripts/repair-claude-session-images.js +27 -8
  206. package/template/claude-task-manager/server.js +14341 -2197
  207. package/template/claude-task-manager/session-integrity.js +160 -18
  208. package/template/claude-task-manager/session-search-ranking.js +1 -0
  209. package/template/claude-task-manager/session-utils.js +25 -5
  210. package/template/claude-task-manager/workers/approval-blocklist.js +96 -6
  211. package/template/claude-task-manager/workers/approval-widget-validator.js +14 -8
  212. package/template/claude-task-manager/workers/conversation-import-worker.js +11 -50
  213. package/template/claude-task-manager/workers/db-owner-worker.js +386 -0
  214. package/template/claude-task-manager/workers/harvest-worker.js +9 -55
  215. package/template/claude-task-manager/workers/headless-term-worker.js +9 -530
  216. package/template/claude-task-manager/workers/read-pool-worker.js +387 -0
  217. package/template/claude-task-manager/workers/scrollback-worker.js +11 -72
  218. package/template/claude-task-manager/workers/session-host-process.js +146 -0
  219. package/template/claude-task-manager/workers/session-integrity-worker.js +10 -54
  220. package/template/claude-task-manager/workers/state-detectors/base.js +18 -1
  221. package/template/claude-task-manager/workers/state-detectors/claude-code.js +182 -9
  222. package/template/claude-task-manager/workers/state-detectors/codex.js +150 -2
  223. package/template/claude-task-manager/workers/state-detectors/cursor.js +127 -0
  224. package/template/claude-task-manager/workers/state-detectors/gemini.js +21 -0
  225. package/template/claude-task-manager/workers/state-detectors/index.js +29 -0
  226. package/template/claude-task-manager/workers/state-detectors/opencode.js +103 -0
  227. package/template/docs/design/markdown-review-pane.md +206 -0
  228. package/template/docs/designs/2026-05-17-portkey-gateway-provider-ux.md +129 -38
  229. package/template/docs/designs/2026-05-20-mobile-worktree-finish-command.md +27 -0
  230. package/template/docs/designs/2026-05-22-ai-configuration-consolidation.md +248 -0
  231. package/template/docs/designs/ai-configuration-consolidation-mock.html +812 -0
  232. package/template/docs/private-memory-and-pii-policy.md +69 -0
  233. package/template/package.json +2 -1
  234. package/template/scripts/check-private-data.js +201 -0
  235. package/template/shared/sqlite-owner-guard.js +30 -0
  236. package/template/shared/sqlite-owner-write-queue.js +225 -0
  237. package/template/shared/sqlite-storage-policy.js +111 -0
  238. package/template/shared/sqlite-write-lock.js +428 -0
  239. package/template/wall-e/agent-runners/claude-code.js +5 -0
  240. package/template/wall-e/agent.js +166 -22
  241. package/template/wall-e/api-walle.js +524 -70
  242. package/template/wall-e/auth/provider-flows.js +11 -1
  243. package/template/wall-e/bin/walle-mcp-stdio.js +341 -17
  244. package/template/wall-e/brain.js +1614 -141
  245. package/template/wall-e/chat/attachment-blocks.js +96 -0
  246. package/template/wall-e/chat/attachments.js +2 -1
  247. package/template/wall-e/chat/capability-resolver.js +7 -7
  248. package/template/wall-e/chat/context-messages.js +28 -0
  249. package/template/wall-e/chat/conversation-frame.js +630 -0
  250. package/template/wall-e/chat/provider-messages.js +125 -0
  251. package/template/wall-e/chat.js +1002 -233
  252. package/template/wall-e/coding/acceptance-contract.js +170 -0
  253. package/template/wall-e/coding/acp-adapter.js +1 -1
  254. package/template/wall-e/coding/agent-catalog.js +3 -0
  255. package/template/wall-e/coding/artifact-store.js +93 -0
  256. package/template/wall-e/coding/capability-router.js +120 -0
  257. package/template/wall-e/coding/coding-run-controller.js +423 -0
  258. package/template/wall-e/coding/compaction-service.js +157 -12
  259. package/template/wall-e/coding/frontend-verification.js +258 -0
  260. package/template/wall-e/coding/lifecycle-hooks.js +75 -0
  261. package/template/wall-e/coding/local-preview-contract.js +157 -0
  262. package/template/wall-e/coding/permission-service.js +57 -13
  263. package/template/wall-e/coding/prompt-bundle.js +19 -1
  264. package/template/wall-e/coding/prompt-section-registry.js +227 -0
  265. package/template/wall-e/coding/provider-compat.js +15 -0
  266. package/template/wall-e/coding/runtime-events.js +224 -0
  267. package/template/wall-e/coding/runtime-mode.js +3 -0
  268. package/template/wall-e/coding/side-git-snapshot.js +160 -4
  269. package/template/wall-e/coding/snapshot-service.js +143 -1
  270. package/template/wall-e/coding/stream-processor.js +388 -34
  271. package/template/wall-e/coding/task-tool.js +141 -4
  272. package/template/wall-e/coding/tool-execution-controller.js +365 -0
  273. package/template/wall-e/coding/tool-registry.js +43 -5
  274. package/template/wall-e/coding/user-hooks.js +217 -0
  275. package/template/wall-e/coding-orchestrator.js +1330 -221
  276. package/template/wall-e/coding-prompts.js +20 -4
  277. package/template/wall-e/context/context-builder.js +15 -2
  278. package/template/wall-e/decision/confidence.js +1 -1
  279. package/template/wall-e/docs/coding-acceptance-contract.md +41 -0
  280. package/template/wall-e/docs/external-action-controller.md +26 -6
  281. package/template/wall-e/docs/telemetry-lifecycle.md +8 -2
  282. package/template/wall-e/embeddings.js +591 -53
  283. package/template/wall-e/external-action-controller.js +12 -0
  284. package/template/wall-e/http/auth.js +1 -0
  285. package/template/wall-e/http/chat-api.js +46 -11
  286. package/template/wall-e/http/model-admin.js +836 -34
  287. package/template/wall-e/lib/boot-profile.js +88 -0
  288. package/template/wall-e/lib/event-loop-monitor.js +93 -0
  289. package/template/wall-e/lib/service-health.js +194 -0
  290. package/template/wall-e/llm/anthropic.js +130 -5
  291. package/template/wall-e/llm/client.js +266 -63
  292. package/template/wall-e/llm/default-fallback.js +382 -0
  293. package/template/wall-e/llm/health.js +19 -0
  294. package/template/wall-e/llm/message-guard.js +78 -0
  295. package/template/wall-e/llm/model-catalog.js +252 -1
  296. package/template/wall-e/llm/openai.js +26 -4
  297. package/template/wall-e/llm/portkey-sync.js +654 -0
  298. package/template/wall-e/llm/provider-error.js +30 -2
  299. package/template/wall-e/llm/registry.js +5 -1
  300. package/template/wall-e/llm/request-compat.js +67 -0
  301. package/template/wall-e/loops/backfill.js +79 -23
  302. package/template/wall-e/loops/brain-optimize.js +67 -0
  303. package/template/wall-e/loops/ingest.js +25 -10
  304. package/template/wall-e/loops/question-digest.js +160 -0
  305. package/template/wall-e/loops/reflect.js +6 -4
  306. package/template/wall-e/loops/think.js +39 -12
  307. package/template/wall-e/mcp-server.js +318 -36
  308. package/template/wall-e/memory/ctm-context-client.js +52 -14
  309. package/template/wall-e/memory/ctm-operational-context.js +237 -0
  310. package/template/wall-e/memory/ctm-prompt-executions-client.js +128 -0
  311. package/template/wall-e/memory/ctm-session-context.js +111 -63
  312. package/template/wall-e/prompts/coding/deepseek.txt +3 -0
  313. package/template/wall-e/prompts/coding/gemini.txt +6 -0
  314. package/template/wall-e/prompts/coding/gpt.txt +6 -0
  315. package/template/wall-e/prompts/coding/local.txt +7 -0
  316. package/template/wall-e/runtime/decision-hooks.js +115 -0
  317. package/template/wall-e/runtime/devbox-gateway.js +82 -8
  318. package/template/wall-e/runtime/prompt-manifest.js +86 -0
  319. package/template/wall-e/runtime/tool-executor.js +269 -0
  320. package/template/wall-e/runtime/tool-result-envelope.js +138 -0
  321. package/template/wall-e/runtime/transcript-projection.js +60 -0
  322. package/template/wall-e/runtime/walle-runtime.js +224 -0
  323. package/template/wall-e/scripts/db-optimize/migrate.js +162 -0
  324. package/template/wall-e/scripts/db-optimize/recall-eval.js +117 -0
  325. package/template/wall-e/server.js +15 -0
  326. package/template/wall-e/session-files.js +9 -0
  327. package/template/wall-e/skills/_bundled/google-calendar/run.js +1 -1
  328. package/template/wall-e/skills/_bundled/gws-workspace/run.js +1 -1
  329. package/template/wall-e/skills/_bundled/slack-mentions/run.js +76 -6
  330. package/template/wall-e/skills/claude-code-reader.js +7 -3
  331. package/template/wall-e/skills/script-skill-runner.js +10 -0
  332. package/template/wall-e/skills/skill-planner.js +38 -0
  333. package/template/wall-e/tools/builtin-middleware.js +19 -9
  334. package/template/wall-e/tools/local-tools.js +1428 -16
  335. package/template/wall-e/tools/permission-checker.js +73 -5
  336. package/template/wall-e/tools/question-manager.js +117 -7
  337. package/template/wall-e/training/harvester.js +12 -28
  338. package/template/wall-e/training/replay.js +25 -80
  339. package/template/website/index.html +10 -10
  340. package/template/wall-e/eval/ab-test.js +0 -203
  341. package/template/wall-e/eval/agent-runner.js +0 -772
  342. package/template/wall-e/eval/agent-scorer.js +0 -461
  343. package/template/wall-e/eval/aggregator.js +0 -414
  344. package/template/wall-e/eval/allowed-test-commands.js +0 -34
  345. package/template/wall-e/eval/benchmark-generator.js +0 -113
  346. package/template/wall-e/eval/benchmarks/chat-eval.json +0 -1662
  347. package/template/wall-e/eval/benchmarks/chat.json +0 -82
  348. package/template/wall-e/eval/benchmarks/coding-agent-real.json +0 -1
  349. package/template/wall-e/eval/benchmarks/coding-agent.json +0 -1581
  350. package/template/wall-e/eval/benchmarks/coding.json +0 -122
  351. package/template/wall-e/eval/benchmarks/memory-retrieval.json +0 -234
  352. package/template/wall-e/eval/benchmarks/reasoning.json +0 -82
  353. package/template/wall-e/eval/benchmarks/swebench-lite-30.json +0 -212
  354. package/template/wall-e/eval/benchmarks.js +0 -669
  355. package/template/wall-e/eval/cc-replay.js +0 -719
  356. package/template/wall-e/eval/chat-eval.js +0 -525
  357. package/template/wall-e/eval/check-keys.js +0 -15
  358. package/template/wall-e/eval/check-providers.js +0 -42
  359. package/template/wall-e/eval/codex-cli-baseline.js +0 -669
  360. package/template/wall-e/eval/coding-agent-real.js +0 -570
  361. package/template/wall-e/eval/context-compactor.js +0 -251
  362. package/template/wall-e/eval/debug-agent003.js +0 -68
  363. package/template/wall-e/eval/diagnostics.js +0 -216
  364. package/template/wall-e/eval/eval-orchestrator.js +0 -642
  365. package/template/wall-e/eval/evaluate.js +0 -202
  366. package/template/wall-e/eval/evaluator.js +0 -373
  367. package/template/wall-e/eval/exporter.js +0 -212
  368. package/template/wall-e/eval/fixtures/express-basic/package.json +0 -9
  369. package/template/wall-e/eval/fixtures/express-basic/server.js +0 -115
  370. package/template/wall-e/eval/fixtures/express-basic/test.js +0 -83
  371. package/template/wall-e/eval/fixtures/express-buggy/package.json +0 -9
  372. package/template/wall-e/eval/fixtures/express-buggy/server.js +0 -113
  373. package/template/wall-e/eval/fixtures/express-buggy/test.js +0 -83
  374. package/template/wall-e/eval/fixtures/express-buggy-items/package.json +0 -9
  375. package/template/wall-e/eval/fixtures/express-buggy-items/server.js +0 -112
  376. package/template/wall-e/eval/fixtures/express-buggy-items/test.js +0 -83
  377. package/template/wall-e/eval/fixtures/express-buggy-search/package.json +0 -9
  378. package/template/wall-e/eval/fixtures/express-buggy-search/server.js +0 -121
  379. package/template/wall-e/eval/fixtures/express-buggy-search/test.js +0 -83
  380. package/template/wall-e/eval/fixtures/express-rename-data/data.js +0 -34
  381. package/template/wall-e/eval/fixtures/express-rename-data/package.json +0 -9
  382. package/template/wall-e/eval/fixtures/express-rename-data/server.js +0 -97
  383. package/template/wall-e/eval/fixtures/express-rename-data/test.js +0 -88
  384. package/template/wall-e/eval/fixtures/express-xss/package.json +0 -12
  385. package/template/wall-e/eval/fixtures/express-xss/server.js +0 -90
  386. package/template/wall-e/eval/fixtures/express-xss/test.js +0 -67
  387. package/template/wall-e/eval/fixtures/express-xss/views/profile.ejs +0 -9
  388. package/template/wall-e/eval/fixtures/fullstack-app/config/default.js +0 -9
  389. package/template/wall-e/eval/fixtures/fullstack-app/config/test.js +0 -13
  390. package/template/wall-e/eval/fixtures/fullstack-app/package.json +0 -11
  391. package/template/wall-e/eval/fixtures/fullstack-app/public/css/style.css +0 -137
  392. package/template/wall-e/eval/fixtures/fullstack-app/public/index.html +0 -46
  393. package/template/wall-e/eval/fixtures/fullstack-app/public/js/app.js +0 -121
  394. package/template/wall-e/eval/fixtures/fullstack-app/public/js/auth.js +0 -71
  395. package/template/wall-e/eval/fixtures/fullstack-app/public/js/items.js +0 -80
  396. package/template/wall-e/eval/fixtures/fullstack-app/public/js/users.js +0 -46
  397. package/template/wall-e/eval/fixtures/fullstack-app/public/login.html +0 -45
  398. package/template/wall-e/eval/fixtures/fullstack-app/public/register.html +0 -38
  399. package/template/wall-e/eval/fixtures/fullstack-app/scripts/migrate.js +0 -23
  400. package/template/wall-e/eval/fixtures/fullstack-app/scripts/seed.js +0 -46
  401. package/template/wall-e/eval/fixtures/fullstack-app/server/db.js +0 -99
  402. package/template/wall-e/eval/fixtures/fullstack-app/server/index.js +0 -94
  403. package/template/wall-e/eval/fixtures/fullstack-app/server/middleware/auth.js +0 -19
  404. package/template/wall-e/eval/fixtures/fullstack-app/server/middleware/logger.js +0 -19
  405. package/template/wall-e/eval/fixtures/fullstack-app/server/router.js +0 -50
  406. package/template/wall-e/eval/fixtures/fullstack-app/server/routes/auth.js +0 -69
  407. package/template/wall-e/eval/fixtures/fullstack-app/server/routes/health.js +0 -23
  408. package/template/wall-e/eval/fixtures/fullstack-app/server/routes/items.js +0 -88
  409. package/template/wall-e/eval/fixtures/fullstack-app/server/routes/users.js +0 -75
  410. package/template/wall-e/eval/fixtures/fullstack-app/server/test.js +0 -198
  411. package/template/wall-e/eval/fixtures/fullstack-app/server/utils/response.js +0 -34
  412. package/template/wall-e/eval/fixtures/fullstack-app/server/utils/validate.js +0 -26
  413. package/template/wall-e/eval/fixtures/fullstack-app/server.js +0 -8
  414. package/template/wall-e/eval/fixtures/fullstack-app/test.js +0 -12
  415. package/template/wall-e/eval/fixtures/monorepo-basic/package.json +0 -8
  416. package/template/wall-e/eval/fixtures/monorepo-basic/packages/api/data.js +0 -58
  417. package/template/wall-e/eval/fixtures/monorepo-basic/packages/api/middleware.js +0 -46
  418. package/template/wall-e/eval/fixtures/monorepo-basic/packages/api/package.json +0 -8
  419. package/template/wall-e/eval/fixtures/monorepo-basic/packages/api/routes.js +0 -64
  420. package/template/wall-e/eval/fixtures/monorepo-basic/packages/api/server.js +0 -56
  421. package/template/wall-e/eval/fixtures/monorepo-basic/packages/api/test.js +0 -116
  422. package/template/wall-e/eval/fixtures/monorepo-basic/packages/cli/commands.js +0 -61
  423. package/template/wall-e/eval/fixtures/monorepo-basic/packages/cli/index.js +0 -62
  424. package/template/wall-e/eval/fixtures/monorepo-basic/packages/cli/output.js +0 -43
  425. package/template/wall-e/eval/fixtures/monorepo-basic/packages/cli/package.json +0 -11
  426. package/template/wall-e/eval/fixtures/monorepo-basic/packages/cli/test.js +0 -44
  427. package/template/wall-e/eval/fixtures/monorepo-basic/packages/shared/formatters.js +0 -43
  428. package/template/wall-e/eval/fixtures/monorepo-basic/packages/shared/index.js +0 -12
  429. package/template/wall-e/eval/fixtures/monorepo-basic/packages/shared/package.json +0 -5
  430. package/template/wall-e/eval/fixtures/monorepo-basic/packages/shared/test.js +0 -55
  431. package/template/wall-e/eval/fixtures/monorepo-basic/packages/shared/validators.js +0 -29
  432. package/template/wall-e/eval/fixtures/monorepo-basic/test.js +0 -46
  433. package/template/wall-e/eval/fixtures/node-cli/index.js +0 -78
  434. package/template/wall-e/eval/fixtures/node-cli/package.json +0 -10
  435. package/template/wall-e/eval/fixtures/node-cli/test.js +0 -57
  436. package/template/wall-e/eval/fixtures/node-typed/package.json +0 -8
  437. package/template/wall-e/eval/fixtures/node-typed/src/handlers.js +0 -31
  438. package/template/wall-e/eval/fixtures/node-typed/src/utils.js +0 -33
  439. package/template/wall-e/eval/fixtures/node-typed/test.js +0 -36
  440. package/template/wall-e/eval/fixtures/python-flask/app.py +0 -14
  441. package/template/wall-e/eval/fixtures/python-flask/requirements.txt +0 -2
  442. package/template/wall-e/eval/fixtures/python-flask/test_app.py +0 -25
  443. package/template/wall-e/eval/fixtures/wall-e-subset/brain.js +0 -105
  444. package/template/wall-e/eval/fixtures/wall-e-subset/eval/aggregator.js +0 -101
  445. package/template/wall-e/eval/fixtures/wall-e-subset/eval/benchmarks/chat.json +0 -20
  446. package/template/wall-e/eval/fixtures/wall-e-subset/eval/benchmarks/coding.json +0 -32
  447. package/template/wall-e/eval/fixtures/wall-e-subset/eval/benchmarks.js +0 -64
  448. package/template/wall-e/eval/fixtures/wall-e-subset/eval/fixtures/simple-project/package.json +0 -6
  449. package/template/wall-e/eval/fixtures/wall-e-subset/eval/fixtures/simple-project/server.js +0 -31
  450. package/template/wall-e/eval/fixtures/wall-e-subset/eval/fixtures/simple-project/test.js +0 -18
  451. package/template/wall-e/eval/fixtures/wall-e-subset/eval/fixtures/simple-project/utils.js +0 -34
  452. package/template/wall-e/eval/fixtures/wall-e-subset/eval/runner.js +0 -104
  453. package/template/wall-e/eval/fixtures/wall-e-subset/eval/scorer.js +0 -73
  454. package/template/wall-e/eval/fixtures/wall-e-subset/eval/test.js +0 -134
  455. package/template/wall-e/eval/fixtures/wall-e-subset/llm/client.js +0 -99
  456. package/template/wall-e/eval/fixtures/wall-e-subset/llm/providers.js +0 -63
  457. package/template/wall-e/eval/fixtures/wall-e-subset/llm/test.js +0 -70
  458. package/template/wall-e/eval/fixtures/wall-e-subset/package.json +0 -10
  459. package/template/wall-e/eval/fixtures/wall-e-subset/test.js +0 -86
  460. package/template/wall-e/eval/harvester.js +0 -685
  461. package/template/wall-e/eval/head-to-head.js +0 -388
  462. package/template/wall-e/eval/humaneval-adapter.js +0 -321
  463. package/template/wall-e/eval/list-models.js +0 -31
  464. package/template/wall-e/eval/livecodebench-adapter.js +0 -291
  465. package/template/wall-e/eval/mail-integration.js +0 -443
  466. package/template/wall-e/eval/manifest.js +0 -186
  467. package/template/wall-e/eval/meta-harness/adapters/coding-agent.js +0 -57
  468. package/template/wall-e/eval/meta-harness/bootstrap-snapshot.js +0 -149
  469. package/template/wall-e/eval/meta-harness/candidate-store.js +0 -117
  470. package/template/wall-e/eval/meta-harness/cli.js +0 -86
  471. package/template/wall-e/eval/meta-harness/domain-spec.js +0 -154
  472. package/template/wall-e/eval/meta-harness/domains/coding-agent.domain.json +0 -84
  473. package/template/wall-e/eval/meta-harness/examples/env-bootstrap-candidate.js +0 -29
  474. package/template/wall-e/eval/meta-harness/experience-store.js +0 -174
  475. package/template/wall-e/eval/meta-harness/frontier.js +0 -96
  476. package/template/wall-e/eval/meta-harness/harness-interface.js +0 -90
  477. package/template/wall-e/eval/meta-harness/leakage-guard.js +0 -80
  478. package/template/wall-e/eval/meta-harness/optimizer.js +0 -207
  479. package/template/wall-e/eval/meta-harness/proposer-runner.js +0 -110
  480. package/template/wall-e/eval/meta-harness/reporting.js +0 -58
  481. package/template/wall-e/eval/meta-harness/telemetry.js +0 -27
  482. package/template/wall-e/eval/meta-harness/validation.js +0 -81
  483. package/template/wall-e/eval/promoter.js +0 -228
  484. package/template/wall-e/eval/provider-normalizer.js +0 -33
  485. package/template/wall-e/eval/replay.js +0 -395
  486. package/template/wall-e/eval/run-agent-benchmarks.js +0 -386
  487. package/template/wall-e/eval/run-codex-cli-baseline.js +0 -177
  488. package/template/wall-e/eval/run-coding-agent-real.js +0 -187
  489. package/template/wall-e/eval/run-eval.js +0 -435
  490. package/template/wall-e/eval/run-model-comparison.js +0 -142
  491. package/template/wall-e/eval/session-evaluator.js +0 -187
  492. package/template/wall-e/eval/session-miner.js +0 -207
  493. package/template/wall-e/eval/session-retrieval-benchmark.js +0 -150
  494. package/template/wall-e/eval/session-transcripts.js +0 -509
  495. package/template/wall-e/eval/shadow.js +0 -161
  496. package/template/wall-e/eval/swebench-adapter.js +0 -345
  497. package/template/wall-e/eval/swebench-docker.js +0 -192
  498. package/template/wall-e/eval/train.py +0 -320
  499. package/template/wall-e/eval/trainer.js +0 -232
  500. 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, Tailscale, and Cloudflare paths as
55
- fallback transports.
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 quick fallback
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, Tailscale, and Cloudflare remain collapsible fallback
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 Tailscale/Cloudflare, but Walle
223
- Remote should be first and marked recommended.
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 should implement the read and low-risk write set first. High-risk writes
473
- can be represented in the UI before they are enabled, but must fail closed until
474
- step-up and local authorization are implemented.
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
- - Read-only approval review.
1009
+ - Step-up-gated approval response.
1001
1010
  - Audit log.
1002
1011
 
1003
- Remote approval responses should wait until step-up and idempotency are in
1004
- place. That is the line between a useful remote companion and a risky remote
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.