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
@@ -0,0 +1,269 @@
1
+ 'use strict';
2
+
3
+ const { RuntimeDecisionHookBus } = require('./decision-hooks');
4
+ const { buildRuntimeToolResultEnvelope } = require('./tool-result-envelope');
5
+
6
+ class RuntimeToolExecutor {
7
+ constructor({
8
+ registry = null,
9
+ runtimeProfile = null,
10
+ toolSpecs = null,
11
+ executeToolCall = null,
12
+ decisionHooks = null,
13
+ now = () => new Date().toISOString(),
14
+ clock = () => Date.now(),
15
+ } = {}) {
16
+ this.registry = registry;
17
+ this.runtimeProfile = runtimeProfile || {};
18
+ this.toolSpecs = Array.isArray(toolSpecs) ? toolSpecs : null;
19
+ this.executeToolCall = typeof executeToolCall === 'function' ? executeToolCall : null;
20
+ this.decisionHooks = decisionHooks || new RuntimeDecisionHookBus();
21
+ this.now = now;
22
+ this.clock = clock;
23
+ }
24
+
25
+ async run(toolCalls = [], ctx = {}) {
26
+ const calls = normalizeToolCalls(toolCalls);
27
+ const specMap = await this._loadSpecMap(ctx);
28
+ const results = new Array(calls.length);
29
+ let batch = [];
30
+
31
+ const flush = async () => {
32
+ if (!batch.length) return;
33
+ const current = batch;
34
+ batch = [];
35
+ await Promise.all(current.map(async (item) => {
36
+ results[item.index] = await this._executeOne(item.call, item.index, specMap.get(item.call.name), ctx);
37
+ }));
38
+ };
39
+
40
+ for (let index = 0; index < calls.length; index += 1) {
41
+ const call = calls[index];
42
+ const spec = specMap.get(call.name) || normalizeRuntimeToolSpec({ name: call.name });
43
+ if (isRuntimeToolParallelSafe(spec)) {
44
+ batch.push({ call, index });
45
+ continue;
46
+ }
47
+ await flush();
48
+ results[index] = await this._executeOne(call, index, spec, ctx);
49
+ }
50
+ await flush();
51
+ return results;
52
+ }
53
+
54
+ async _executeOne(call, index, rawSpec, ctx = {}) {
55
+ const spec = normalizeRuntimeToolSpec(rawSpec || { name: call.name });
56
+ const startedAt = this.clock();
57
+ let finalCall = { ...call, input: call.input || {} };
58
+ const hookCtx = this._ctx(ctx);
59
+ const before = await this.decisionHooks.run('tool.before', {
60
+ call: finalCall,
61
+ index,
62
+ input: finalCall.input,
63
+ spec,
64
+ }, hookCtx);
65
+ if (before.input !== undefined) {
66
+ finalCall = { ...finalCall, input: before.input };
67
+ }
68
+ if (before.denied || before.stop) {
69
+ const result = {
70
+ ok: false,
71
+ denied: before.denied,
72
+ stopped: before.stop,
73
+ error: before.reason || 'Tool execution stopped by runtime hook',
74
+ };
75
+ return this._row({ call: finalCall, spec, result, error: result.error, startedAt });
76
+ }
77
+
78
+ try {
79
+ let rawResult = this.executeToolCall
80
+ ? await this.executeToolCall(finalCall, { ...hookCtx, spec, index })
81
+ : await this._executeViaRegistry(finalCall, hookCtx);
82
+ const resultForHook = unwrapToolResult(rawResult);
83
+ const after = await this.decisionHooks.run('tool.after', {
84
+ call: finalCall,
85
+ index,
86
+ input: finalCall.input,
87
+ spec,
88
+ rawResult,
89
+ result: resultForHook,
90
+ }, hookCtx);
91
+ if (after.result !== undefined) {
92
+ rawResult = replaceUnwrappedToolResult(rawResult, after.result);
93
+ }
94
+ const result = unwrapToolResult(rawResult);
95
+ return this._row({ call: finalCall, spec, rawResult, result, startedAt });
96
+ } catch (error) {
97
+ const failed = await this.decisionHooks.run('tool.failed', {
98
+ call: finalCall,
99
+ index,
100
+ input: finalCall.input,
101
+ spec,
102
+ error,
103
+ }, hookCtx);
104
+ const result = failed.result !== undefined
105
+ ? failed.result
106
+ : { ok: false, error: error?.message || String(error) };
107
+ return this._row({ call: finalCall, spec, result, error, startedAt });
108
+ }
109
+ }
110
+
111
+ async _executeViaRegistry(call, ctx) {
112
+ if (!this.registry?.execute) {
113
+ return { ok: false, invalid: true, error: `Tool registry unavailable for ${call.name}` };
114
+ }
115
+ return this.registry.execute(call.name, call.input || {}, ctx);
116
+ }
117
+
118
+ _row({ call, spec, rawResult, result, error = null, startedAt }) {
119
+ const envelope = buildRuntimeToolResultEnvelope({
120
+ call,
121
+ spec,
122
+ result,
123
+ error,
124
+ startedAt,
125
+ endedAt: this.clock(),
126
+ now: this.now,
127
+ });
128
+ return {
129
+ call,
130
+ spec,
131
+ rawResult: rawResult === undefined ? result : rawResult,
132
+ result,
133
+ envelope,
134
+ ok: envelope.ok,
135
+ };
136
+ }
137
+
138
+ async _loadSpecMap(ctx = {}) {
139
+ const specs = [];
140
+ if (this.toolSpecs) specs.push(...this.toolSpecs);
141
+ if (this.registry?.getToolSpecs) {
142
+ try {
143
+ specs.push(...await this.registry.getToolSpecs(this._ctx(ctx)));
144
+ } catch {}
145
+ }
146
+ const map = new Map();
147
+ for (const spec of specs) {
148
+ const normalized = normalizeRuntimeToolSpec(spec);
149
+ if (normalized.name) map.set(normalized.name, normalized);
150
+ }
151
+ return map;
152
+ }
153
+
154
+ _ctx(extra = {}) {
155
+ return {
156
+ ...extra,
157
+ runtimeProfile: this.runtimeProfile.profileId || extra.runtimeProfile,
158
+ permissionProfile: this.runtimeProfile.permissionProfile || extra.permissionProfile,
159
+ persistenceProfile: this.runtimeProfile.persistenceProfile || extra.persistenceProfile,
160
+ outputContract: this.runtimeProfile.outputContract || extra.outputContract,
161
+ toolsets: extra.toolsets || this.runtimeProfile.toolsets || [],
162
+ channel: this.runtimeProfile.channel || extra.channel,
163
+ source: this.runtimeProfile.source || extra.source,
164
+ agentMode: this.runtimeProfile.agentMode || extra.agentMode,
165
+ agentKind: this.runtimeProfile.agentKind || extra.agentKind,
166
+ taskType: this.runtimeProfile.taskType || extra.taskType,
167
+ sessionId: extra.sessionId || this.runtimeProfile.sessionId,
168
+ ctmSessionId: extra.ctmSessionId || this.runtimeProfile.ctmSessionId,
169
+ agentSessionId: extra.agentSessionId || this.runtimeProfile.agentSessionId,
170
+ chatSessionId: extra.chatSessionId || this.runtimeProfile.chatSessionId,
171
+ cwd: extra.cwd || this.runtimeProfile.cwd,
172
+ };
173
+ }
174
+ }
175
+
176
+ function normalizeToolCalls(toolCalls = []) {
177
+ return (toolCalls || []).filter(Boolean).map((call, index) => ({
178
+ id: String(call.id || call.toolCallId || call.tool_call_id || `tool-${index + 1}`),
179
+ name: String(call.name || call.tool || ''),
180
+ input: call.input || call.args || call.arguments || {},
181
+ original: call,
182
+ })).filter((call) => call.name);
183
+ }
184
+
185
+ function normalizeRuntimeToolSpec(spec = {}) {
186
+ const name = String(spec.name || spec.tool || '');
187
+ const sideEffect = normalizeSideEffect(spec.sideEffect || spec.side_effect || inferSideEffect(name));
188
+ const readOnly = Boolean(spec.readOnly ?? spec.read_only ?? sideEffect === 'read');
189
+ const approval = normalizeApproval(spec.approval || spec.approvalPolicy || spec.approval_policy || (readOnly ? 'never' : 'required'));
190
+ const supportsParallel = Boolean(spec.supportsParallel ?? spec.supports_parallel ?? (readOnly && approval === 'never'));
191
+ return {
192
+ ...spec,
193
+ name,
194
+ sideEffect,
195
+ readOnly,
196
+ approval,
197
+ supportsParallel,
198
+ interruptBehavior: normalizeInterruptBehavior(spec.interruptBehavior || spec.interrupt_behavior || (readOnly ? 'cancel' : 'block')),
199
+ resultBudgetBytes: Number.isFinite(Number(spec.resultBudgetBytes || spec.result_budget_bytes))
200
+ ? Number(spec.resultBudgetBytes || spec.result_budget_bytes)
201
+ : undefined,
202
+ telemetryPolicy: spec.telemetryPolicy || spec.telemetry_policy || 'safe-summary',
203
+ renderHint: spec.renderHint || spec.render_hint || (readOnly ? 'collapsed-read' : 'expanded-action'),
204
+ sandboxProfile: spec.sandboxProfile || spec.sandbox_profile || (sideEffect === 'read' ? 'readonly' : 'workspace'),
205
+ };
206
+ }
207
+
208
+ function isRuntimeToolParallelSafe(spec = {}) {
209
+ const normalized = normalizeRuntimeToolSpec(spec);
210
+ return normalized.supportsParallel === true
211
+ && normalized.readOnly === true
212
+ && normalized.approval === 'never'
213
+ && normalized.sideEffect === 'read';
214
+ }
215
+
216
+ function normalizeSideEffect(value) {
217
+ const normalized = String(value || '').toLowerCase();
218
+ if (['read', 'write', 'external', 'network', 'process', 'none', 'unknown'].includes(normalized)) return normalized;
219
+ return 'unknown';
220
+ }
221
+
222
+ function normalizeApproval(value) {
223
+ const normalized = String(value || '').toLowerCase();
224
+ if (['never', 'required', 'profile'].includes(normalized)) return normalized;
225
+ if (normalized === 'always') return 'required';
226
+ return 'required';
227
+ }
228
+
229
+ function normalizeInterruptBehavior(value) {
230
+ const normalized = String(value || '').toLowerCase();
231
+ return normalized === 'cancel' ? 'cancel' : 'block';
232
+ }
233
+
234
+ function inferSideEffect(name = '') {
235
+ const text = String(name || '').toLowerCase();
236
+ if (!text) return 'unknown';
237
+ if (/^(read|list|search|grep|glob|find|lookup|get|fetch|check|ctm_context|ctm_remote_access_status|ctm_session_search|think|load|calendar_list|calendar_events|mail_read|mail_search|mail_messages|slack_search|slack_read_channel|clipboard_read|system_info|session_search|session_load|web_fetch)/.test(text)) return 'read';
238
+ if (/(write|edit|patch|delete|remove|send|reply|create|update|apply|run_shell|shell|screenshot|browser|start_|stop_)/.test(text)) return 'write';
239
+ if (/(mcp|skill|slack|gmail|calendar|mail|http|web)/.test(text)) return 'external';
240
+ return 'unknown';
241
+ }
242
+
243
+ function unwrapToolResult(rawResult) {
244
+ if (rawResult && typeof rawResult === 'object' && rawResult.call && Object.prototype.hasOwnProperty.call(rawResult.call, 'result')) {
245
+ return rawResult.call.result;
246
+ }
247
+ if (rawResult && typeof rawResult === 'object' && Object.prototype.hasOwnProperty.call(rawResult, 'result') && Object.keys(rawResult).length <= 4) {
248
+ return rawResult.result;
249
+ }
250
+ return rawResult;
251
+ }
252
+
253
+ function replaceUnwrappedToolResult(rawResult, result) {
254
+ if (rawResult && typeof rawResult === 'object' && rawResult.call && Object.prototype.hasOwnProperty.call(rawResult.call, 'result')) {
255
+ return {
256
+ ...rawResult,
257
+ call: { ...rawResult.call, result },
258
+ };
259
+ }
260
+ return result;
261
+ }
262
+
263
+ module.exports = {
264
+ RuntimeToolExecutor,
265
+ inferSideEffect,
266
+ isRuntimeToolParallelSafe,
267
+ normalizeRuntimeToolSpec,
268
+ normalizeToolCalls,
269
+ };
@@ -0,0 +1,138 @@
1
+ 'use strict';
2
+
3
+ const crypto = require('node:crypto');
4
+
5
+ const DEFAULT_RESULT_BUDGET_BYTES = 16 * 1024;
6
+ const DEFAULT_PREVIEW_BYTES = 4 * 1024;
7
+
8
+ function buildRuntimeToolResultEnvelope({
9
+ call = {},
10
+ spec = {},
11
+ result,
12
+ error = null,
13
+ startedAt = 0,
14
+ endedAt = Date.now(),
15
+ now = () => new Date().toISOString(),
16
+ resultBudgetBytes,
17
+ previewBytes = DEFAULT_PREVIEW_BYTES,
18
+ } = {}) {
19
+ const rawError = error || result?.error || null;
20
+ const ok = !rawError && result?.invalid !== true && result?.denied !== true;
21
+ const budget = Number.isFinite(Number(resultBudgetBytes))
22
+ ? Number(resultBudgetBytes)
23
+ : Number(spec.resultBudgetBytes || spec.result_budget_bytes || DEFAULT_RESULT_BUDGET_BYTES);
24
+ const serialized = serializeResult(result);
25
+ const bytes = Buffer.byteLength(serialized, 'utf8');
26
+ const outputPreview = truncateBytes(serialized, previewBytes);
27
+ const truncated = bytes > budget;
28
+ const outputForModel = rawError
29
+ ? { error: safeErrorMessage(rawError), ok: false }
30
+ : truncated
31
+ ? {
32
+ ok,
33
+ truncated: true,
34
+ bytes,
35
+ sha256: sha256(serialized),
36
+ preview: truncateBytes(serialized, Math.min(previewBytes, budget)),
37
+ }
38
+ : result;
39
+
40
+ return {
41
+ version: 1,
42
+ ok,
43
+ toolCallId: String(call.id || call.toolCallId || call.tool_call_id || ''),
44
+ name: String(call.name || call.tool || spec.name || ''),
45
+ inputPreview: previewValue(call.input || call.args || {}),
46
+ outputPreview,
47
+ outputForModel,
48
+ artifactRefs: extractArtifactRefs(result),
49
+ summary: summarizeResult(result, rawError),
50
+ error: rawError ? safeErrorMessage(rawError) : null,
51
+ telemetry: {
52
+ durationMs: Math.max(0, Number(endedAt || 0) - Number(startedAt || endedAt || 0)),
53
+ errorType: rawError ? classifyToolError(rawError, result) : '',
54
+ outputBytes: bytes,
55
+ truncated,
56
+ timestamp: now(),
57
+ },
58
+ };
59
+ }
60
+
61
+ function serializeResult(result) {
62
+ if (typeof result === 'string') return result;
63
+ try {
64
+ return JSON.stringify(result == null ? null : result);
65
+ } catch {
66
+ return String(result);
67
+ }
68
+ }
69
+
70
+ function previewValue(value, maxBytes = 1024) {
71
+ return truncateBytes(serializeResult(value), maxBytes);
72
+ }
73
+
74
+ function truncateBytes(text, maxBytes) {
75
+ const value = String(text || '');
76
+ const budget = Math.max(0, Number(maxBytes || 0));
77
+ if (!budget || Buffer.byteLength(value, 'utf8') <= budget) return value;
78
+ let out = value.slice(0, budget);
79
+ while (Buffer.byteLength(out, 'utf8') > budget) out = out.slice(0, -1);
80
+ return `${out}\n[truncated]`;
81
+ }
82
+
83
+ function summarizeResult(result, error) {
84
+ if (error) return `Tool failed: ${safeErrorMessage(error)}`;
85
+ if (result == null) return 'No result';
86
+ if (typeof result === 'string') return `${result.length} chars`;
87
+ if (typeof result !== 'object') return String(typeof result);
88
+ if (result.summary) return String(result.summary);
89
+ if (result.ok === true) return 'ok';
90
+ const keys = Object.keys(result).sort().slice(0, 8);
91
+ return keys.length ? `object: ${keys.join(', ')}` : 'object';
92
+ }
93
+
94
+ function extractArtifactRefs(result) {
95
+ const refs = [];
96
+ const push = (artifact) => {
97
+ if (!artifact || typeof artifact !== 'object') return;
98
+ refs.push({
99
+ artifactId: artifact.artifactId || artifact.id || '',
100
+ kind: artifact.kind || artifact.type || '',
101
+ path: artifact.path || artifact.file_path || '',
102
+ sha256: artifact.sha256 || '',
103
+ bytes: artifact.bytes || artifact.size || undefined,
104
+ });
105
+ };
106
+ if (result?.artifact) push(result.artifact);
107
+ if (Array.isArray(result?.artifacts)) result.artifacts.forEach(push);
108
+ return refs.filter((ref) => ref.artifactId || ref.path || ref.sha256);
109
+ }
110
+
111
+ function safeErrorMessage(error) {
112
+ if (!error) return '';
113
+ if (typeof error === 'string') return error;
114
+ return String(error.message || error.error || error.reason || error.name || error);
115
+ }
116
+
117
+ function classifyToolError(error, result) {
118
+ if (result?.denied) return 'permission_denied';
119
+ if (result?.invalid) return 'invalid_tool_call';
120
+ const text = safeErrorMessage(error).toLowerCase();
121
+ if (/permission|denied|forbidden/.test(text)) return 'permission_denied';
122
+ if (/timeout|timed out/.test(text)) return 'timeout';
123
+ if (/abort|cancel/.test(text)) return 'aborted';
124
+ if (/not found|missing|required|schema|argument/.test(text)) return 'validation';
125
+ return error?.name || 'tool_error';
126
+ }
127
+
128
+ function sha256(text) {
129
+ return crypto.createHash('sha256').update(String(text || '')).digest('hex');
130
+ }
131
+
132
+ module.exports = {
133
+ DEFAULT_RESULT_BUDGET_BYTES,
134
+ buildRuntimeToolResultEnvelope,
135
+ classifyToolError,
136
+ previewValue,
137
+ truncateBytes,
138
+ };
@@ -0,0 +1,60 @@
1
+ 'use strict';
2
+
3
+ const REPLAYABLE_PART_TYPES = new Set([
4
+ 'message',
5
+ 'user',
6
+ 'assistant',
7
+ 'text',
8
+ 'reasoning',
9
+ 'tool',
10
+ 'diagnostic',
11
+ 'compaction',
12
+ ]);
13
+
14
+ const DURABLE_NON_REPLAY_PART_TYPES = new Set([
15
+ 'artifact',
16
+ 'prompt_manifest',
17
+ 'snapshot',
18
+ 'step_start',
19
+ 'step_finish',
20
+ 'runtime_thread',
21
+ 'runtime_turn',
22
+ 'runtime_item',
23
+ 'runtime_event',
24
+ 'lane_event',
25
+ ]);
26
+
27
+ function isReplayableRuntimePart(partType) {
28
+ return REPLAYABLE_PART_TYPES.has(String(partType || ''));
29
+ }
30
+
31
+ function isDurableRuntimePart(partType) {
32
+ const type = String(partType || '');
33
+ return REPLAYABLE_PART_TYPES.has(type) || DURABLE_NON_REPLAY_PART_TYPES.has(type);
34
+ }
35
+
36
+ function runtimeProjectionFlags(partType) {
37
+ const type = String(partType || '');
38
+ return {
39
+ partType: type,
40
+ durable: isDurableRuntimePart(type),
41
+ replayable: isReplayableRuntimePart(type),
42
+ ctmProjectable: type !== 'progress',
43
+ };
44
+ }
45
+
46
+ function attachProjectionFlags(record = {}, partType = record.partType || record.type) {
47
+ return {
48
+ ...record,
49
+ runtimeProjection: runtimeProjectionFlags(partType),
50
+ };
51
+ }
52
+
53
+ module.exports = {
54
+ DURABLE_NON_REPLAY_PART_TYPES,
55
+ REPLAYABLE_PART_TYPES,
56
+ attachProjectionFlags,
57
+ isDurableRuntimePart,
58
+ isReplayableRuntimePart,
59
+ runtimeProjectionFlags,
60
+ };
@@ -0,0 +1,224 @@
1
+ 'use strict';
2
+
3
+ const { resolveAgentRunContext } = require('./agent-run-context');
4
+ const { ToolRegistry } = require('../coding/tool-registry');
5
+ const { RuntimeToolExecutor } = require('./tool-executor');
6
+
7
+ const PROFILE_DEFAULTS = Object.freeze({
8
+ chat: Object.freeze({
9
+ profileId: 'chat',
10
+ permissionProfile: 'assistant-safe',
11
+ persistenceProfile: 'chat-ledger',
12
+ outputContract: 'assistant-reply',
13
+ toolsets: Object.freeze(['chat', 'memory', 'live', 'local', 'handoff']),
14
+ capabilities: Object.freeze({
15
+ memory: true,
16
+ ctmContext: true,
17
+ liveSources: true,
18
+ mcp: true,
19
+ skills: true,
20
+ localTools: true,
21
+ shell: true,
22
+ fileRead: true,
23
+ fileWrite: true,
24
+ browser: true,
25
+ codingHandoff: true,
26
+ taskDelegation: false,
27
+ sideEffects: 'permissioned',
28
+ }),
29
+ }),
30
+ coding: Object.freeze({
31
+ profileId: 'coding',
32
+ permissionProfile: 'coding-workspace',
33
+ persistenceProfile: 'jsonl-transcript',
34
+ outputContract: 'coding-acceptance',
35
+ toolsets: Object.freeze(['coding', 'memory', 'mcp', 'skills', 'local']),
36
+ capabilities: Object.freeze({
37
+ memory: true,
38
+ ctmContext: true,
39
+ liveSources: false,
40
+ mcp: true,
41
+ skills: true,
42
+ localTools: true,
43
+ shell: true,
44
+ fileRead: true,
45
+ fileWrite: true,
46
+ browser: true,
47
+ codingHandoff: false,
48
+ taskDelegation: true,
49
+ sideEffects: 'workspace',
50
+ }),
51
+ }),
52
+ review: Object.freeze({
53
+ profileId: 'review',
54
+ permissionProfile: 'review-readonly',
55
+ persistenceProfile: 'chat-ledger',
56
+ outputContract: 'review-findings',
57
+ toolsets: Object.freeze(['review', 'memory', 'project-read']),
58
+ capabilities: Object.freeze({
59
+ memory: true,
60
+ ctmContext: true,
61
+ liveSources: false,
62
+ mcp: false,
63
+ skills: false,
64
+ localTools: false,
65
+ shell: false,
66
+ fileRead: true,
67
+ fileWrite: false,
68
+ browser: false,
69
+ codingHandoff: false,
70
+ taskDelegation: false,
71
+ sideEffects: 'read-only',
72
+ }),
73
+ }),
74
+ });
75
+
76
+ function resolveWallERuntimeProfile(input = {}) {
77
+ const context = input.context?.version === 1 && input.context?.agentMode
78
+ ? input.context
79
+ : resolveAgentRunContext(input);
80
+ const profileId = normalizeRuntimeProfileId(
81
+ input.runtimeProfile
82
+ || input.runtime_profile
83
+ || input.profileId
84
+ || input.profile_id
85
+ || context.agentMode
86
+ );
87
+ const defaults = PROFILE_DEFAULTS[profileId] || PROFILE_DEFAULTS.chat;
88
+ const capabilities = {
89
+ ...defaults.capabilities,
90
+ ...(input.capabilities && typeof input.capabilities === 'object' ? input.capabilities : {}),
91
+ };
92
+
93
+ return {
94
+ version: 1,
95
+ profileId: defaults.profileId,
96
+ context,
97
+ channel: context.channel,
98
+ source: context.source,
99
+ agentMode: context.agentMode,
100
+ agentKind: context.agentKind,
101
+ taskType: context.taskType,
102
+ sessionId: context.sessionId,
103
+ ctmSessionId: context.ctmSessionId,
104
+ agentSessionId: context.agentSessionId,
105
+ chatSessionId: context.chatSessionId,
106
+ cwd: context.cwd,
107
+ jsonlPath: context.jsonlPath,
108
+ capabilities,
109
+ permissionProfile: input.permissionProfile || input.permission_profile || defaults.permissionProfile,
110
+ persistenceProfile: input.persistenceProfile || input.persistence_profile || defaults.persistenceProfile,
111
+ outputContract: input.outputContract || input.output_contract || defaults.outputContract,
112
+ toolsets: Array.isArray(input.toolsets) && input.toolsets.length ? [...input.toolsets] : [...defaults.toolsets],
113
+ warnings: [...(context.warnings || []), ...profileWarnings(context, defaults, capabilities)],
114
+ };
115
+ }
116
+
117
+ function normalizeRuntimeProfileId(value) {
118
+ const raw = String(value || '').trim().toLowerCase().replace(/_/g, '-');
119
+ if (!raw) return 'chat';
120
+ if (raw === 'assistant' || raw === 'walle-chat' || raw === 'wall-e-chat') return 'chat';
121
+ if (raw === 'code' || raw === 'walle-coding' || raw === 'wall-e-coding') return 'coding';
122
+ if (raw === 'code-review' || raw === 'reviewer') return 'review';
123
+ return PROFILE_DEFAULTS[raw] ? raw : 'chat';
124
+ }
125
+
126
+ function profileWarnings(context, defaults, capabilities) {
127
+ const warnings = [];
128
+ if (defaults.profileId === 'review' && capabilities.fileWrite) {
129
+ warnings.push({
130
+ code: 'review-profile-write-capability',
131
+ message: 'Review runtime profile must remain read-only',
132
+ });
133
+ }
134
+ if (defaults.profileId === 'coding' && !context.agentSessionId) {
135
+ warnings.push({
136
+ code: 'coding-profile-missing-agent-session-id',
137
+ message: 'Coding runtime profile should have a durable agent session id',
138
+ });
139
+ }
140
+ return warnings;
141
+ }
142
+
143
+ function runtimeToolContext(runtimeProfile = {}, extra = {}) {
144
+ return {
145
+ ...extra,
146
+ runtimeProfile: runtimeProfile.profileId || extra.runtimeProfile,
147
+ permissionProfile: runtimeProfile.permissionProfile || extra.permissionProfile,
148
+ persistenceProfile: runtimeProfile.persistenceProfile || extra.persistenceProfile,
149
+ outputContract: runtimeProfile.outputContract || extra.outputContract,
150
+ toolsets: extra.toolsets || runtimeProfile.toolsets || [],
151
+ channel: runtimeProfile.channel || extra.channel,
152
+ source: runtimeProfile.source || extra.source,
153
+ agentMode: runtimeProfile.agentMode || extra.agentMode,
154
+ agentKind: runtimeProfile.agentKind || extra.agentKind,
155
+ taskType: runtimeProfile.taskType || extra.taskType,
156
+ sessionId: runtimeProfile.sessionId || extra.sessionId,
157
+ ctmSessionId: runtimeProfile.ctmSessionId || extra.ctmSessionId,
158
+ agentSessionId: runtimeProfile.agentSessionId || extra.agentSessionId,
159
+ chatSessionId: runtimeProfile.chatSessionId || extra.chatSessionId,
160
+ cwd: runtimeProfile.cwd || extra.cwd,
161
+ };
162
+ }
163
+
164
+ function createWallEToolRegistry({
165
+ runtimeProfile = null,
166
+ builtinTools = [],
167
+ middleware = null,
168
+ localTools = null,
169
+ localToolNames = [],
170
+ mcpClient = null,
171
+ skillRunner = null,
172
+ executeBuiltinTool = null,
173
+ prepareBuiltinArgs = null,
174
+ unknownToolHandler = null,
175
+ specialHandlers = {},
176
+ ...rest
177
+ } = {}) {
178
+ const localSet = new Set((localToolNames || []).filter(Boolean));
179
+ const tools = (builtinTools || []).map((tool) => {
180
+ if (!tool || !tool.name || typeof tool.execute === 'function') return tool;
181
+ if (!executeBuiltinTool || localSet.has(tool.name)) return tool;
182
+ return {
183
+ ...tool,
184
+ prepareArgs: typeof prepareBuiltinArgs === 'function'
185
+ ? (args, ctx) => prepareBuiltinArgs(tool.name, args, ctx)
186
+ : tool.prepareArgs,
187
+ execute: (args, ctx) => executeBuiltinTool(tool.name, args, ctx),
188
+ };
189
+ });
190
+
191
+ return new ToolRegistry({
192
+ ...rest,
193
+ builtinTools: tools,
194
+ middleware,
195
+ localTools,
196
+ mcpClient,
197
+ skillRunner,
198
+ specialHandlers,
199
+ unknownToolHandler,
200
+ });
201
+ }
202
+
203
+ async function getRuntimeToolDefinitions(registry, runtimeProfile, extra = {}) {
204
+ if (!registry || typeof registry.getDefinitions !== 'function') return [];
205
+ return registry.getDefinitions(runtimeToolContext(runtimeProfile, extra));
206
+ }
207
+
208
+ async function executeRuntimeTool(registry, runtimeProfile, name, args = {}, extra = {}) {
209
+ if (!registry || typeof registry.execute !== 'function') {
210
+ return { invalid: true, error: `Tool registry unavailable for ${name}` };
211
+ }
212
+ return registry.execute(name, args, runtimeToolContext(runtimeProfile, extra));
213
+ }
214
+
215
+ module.exports = {
216
+ PROFILE_DEFAULTS,
217
+ RuntimeToolExecutor,
218
+ createWallEToolRegistry,
219
+ executeRuntimeTool,
220
+ getRuntimeToolDefinitions,
221
+ normalizeRuntimeProfileId,
222
+ resolveWallERuntimeProfile,
223
+ runtimeToolContext,
224
+ };