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,88 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Lightweight boot/phase profiler. Records labeled wall-clock durations so we can
5
+ * SEE where Wall-E startup time actually goes (brain open, migrations, WAL pragma,
6
+ * backfills, bootstrap, channel/scheduler setup, port bind) instead of guessing.
7
+ *
8
+ * Usage:
9
+ * const boot = require('./lib/boot-profile');
10
+ * boot.reset();
11
+ * boot.measure('brain.initDb', () => brain.initDb());
12
+ * await boot.measureAsync('backfill', () => brain.backfillTemporalValidity());
13
+ * boot.mark('startServer', msSpent);
14
+ * boot.done(); console.log(boot.summary());
15
+ *
16
+ * The captured profile is process-global (last boot) and exposed read-only via
17
+ * getProfile() — surfaced at GET /api/wall-e/boot-profile.
18
+ */
19
+
20
+ const { performance } = require('perf_hooks');
21
+
22
+ let _profile = null;
23
+
24
+ function reset() {
25
+ _profile = { startedAt: performance.now(), startedIso: new Date().toISOString(), marks: [], totalMs: null };
26
+ return _profile;
27
+ }
28
+
29
+ function _ensure() {
30
+ if (!_profile) reset();
31
+ return _profile;
32
+ }
33
+
34
+ // Record a phase that took `ms` milliseconds. `meta` is optional structured detail.
35
+ function mark(label, ms, meta) {
36
+ const p = _ensure();
37
+ const entry = { label, ms: Math.round(ms), atMs: Math.round(performance.now() - p.startedAt) };
38
+ if (meta && typeof meta === 'object') entry.meta = meta;
39
+ p.marks.push(entry);
40
+ return entry;
41
+ }
42
+
43
+ // Time a synchronous function, record under `label`, return its result.
44
+ function measure(label, fn, meta) {
45
+ const t0 = performance.now();
46
+ try {
47
+ return fn();
48
+ } finally {
49
+ mark(label, performance.now() - t0, meta);
50
+ }
51
+ }
52
+
53
+ // Time an async function, record under `label`, return its (awaited) result.
54
+ async function measureAsync(label, fn, meta) {
55
+ const t0 = performance.now();
56
+ try {
57
+ return await fn();
58
+ } finally {
59
+ mark(label, performance.now() - t0, meta);
60
+ }
61
+ }
62
+
63
+ // Stamp total elapsed since reset(). Call when boot reaches "ready".
64
+ function done() {
65
+ const p = _ensure();
66
+ p.totalMs = Math.round(performance.now() - p.startedAt);
67
+ return getProfile();
68
+ }
69
+
70
+ function getProfile() {
71
+ if (!_profile) return null;
72
+ return {
73
+ startedIso: _profile.startedIso,
74
+ totalMs: _profile.totalMs,
75
+ marks: _profile.marks.map((m) => ({ ...m })),
76
+ };
77
+ }
78
+
79
+ // Human-readable summary, slowest phases first, for the boot log.
80
+ function summary() {
81
+ if (!_profile || _profile.marks.length === 0) return '[boot-profile] (no marks)';
82
+ const sorted = [..._profile.marks].sort((a, b) => b.ms - a.ms);
83
+ const lines = sorted.map((m) => ` ${String(m.ms).padStart(7)}ms ${m.label}`);
84
+ const total = _profile.totalMs != null ? `${_profile.totalMs}ms` : '(open)';
85
+ return `[boot-profile] total=${total}, phases (slowest first):\n${lines.join('\n')}`;
86
+ }
87
+
88
+ module.exports = { reset, mark, measure, measureAsync, done, getProfile, summary };
@@ -0,0 +1,93 @@
1
+ 'use strict';
2
+
3
+ // Event-loop delay monitor.
4
+ //
5
+ // Wall-E is single-threaded and uses synchronous better-sqlite3, so a heavy query can
6
+ // block the whole event loop (HTTP included) for seconds. When that happens the daemon
7
+ // looks "running" to a supervisor while every request times out — exactly the failure
8
+ // that hid a multi-minute backfill stall. There was no signal for it.
9
+ //
10
+ // This wraps perf_hooks.monitorEventLoopDelay (a libuv-level histogram of how late timers
11
+ // fire vs. schedule — i.e. how long the loop was blocked) and:
12
+ // - logs a warning whenever a single blocking spell in the window exceeds a threshold,
13
+ // - tracks the worst spell seen since boot,
14
+ // - exposes a cheap stats snapshot for a health endpoint.
15
+ //
16
+ // All timers are unref'd so the monitor never keeps the process alive.
17
+
18
+ const { monitorEventLoopDelay } = require('perf_hooks');
19
+
20
+ let _histogram = null;
21
+ let _timer = null;
22
+ let _peakMs = 0;
23
+ let _lastWarn = null;
24
+ let _onWarn = null;
25
+
26
+ const NS_PER_MS = 1e6;
27
+ const _ms = (ns) => Math.round((Number(ns) || 0) / NS_PER_MS);
28
+
29
+ function isRunning() {
30
+ return _histogram != null;
31
+ }
32
+
33
+ /**
34
+ * Start monitoring. Idempotent.
35
+ * @param {object} opts
36
+ * @param {number} [opts.resolutionMs=20] sampling resolution
37
+ * @param {number} [opts.sampleMs=10000] how often to evaluate + reset the window
38
+ * @param {number} [opts.warnThresholdMs=1000] warn if the worst spell in a window exceeds this
39
+ * @param {function} [opts.onWarn] called as ({ maxMs, meanMs, p99Ms }) on a warning
40
+ * @param {function} [opts.log=console.warn] where warnings are written
41
+ */
42
+ function start(opts = {}) {
43
+ if (_histogram) return; // already running
44
+ const resolution = Math.max(1, Number(opts.resolutionMs) || 20);
45
+ const sampleMs = Math.max(1000, Number(opts.sampleMs) || 10000);
46
+ const warnThresholdMs = Math.max(50, Number(opts.warnThresholdMs) || 1000);
47
+ const log = typeof opts.log === 'function' ? opts.log : console.warn;
48
+ _onWarn = typeof opts.onWarn === 'function' ? opts.onWarn : null;
49
+
50
+ _histogram = monitorEventLoopDelay({ resolution });
51
+ _histogram.enable();
52
+
53
+ _timer = setInterval(() => {
54
+ const maxMs = _ms(_histogram.max);
55
+ const meanMs = _ms(_histogram.mean);
56
+ let p99Ms = 0;
57
+ try { p99Ms = _ms(_histogram.percentile(99)); } catch { /* histogram may be empty */ }
58
+ if (maxMs > _peakMs) _peakMs = maxMs;
59
+
60
+ if (maxMs >= warnThresholdMs) {
61
+ _lastWarn = { at: new Date().toISOString(), maxMs, meanMs, p99Ms };
62
+ log(`[wall-e] event loop blocked up to ${maxMs}ms in the last ${Math.round(sampleMs / 1000)}s (mean ${meanMs}ms, p99 ${p99Ms}ms) — a synchronous DB query or sync I/O is starving the loop`);
63
+ if (_onWarn) { try { _onWarn({ maxMs, meanMs, p99Ms }); } catch { /* never let a hook break the monitor */ } }
64
+ }
65
+ _histogram.reset();
66
+ }, sampleMs);
67
+ _timer.unref?.();
68
+ }
69
+
70
+ /** Cheap snapshot for a health endpoint. Safe to call when not running. */
71
+ function stats() {
72
+ if (!_histogram) return { enabled: false };
73
+ let p99Ms = 0;
74
+ try { p99Ms = _ms(_histogram.percentile(99)); } catch { /* empty */ }
75
+ return {
76
+ enabled: true,
77
+ // Current window (reset every sampleMs):
78
+ mean_ms: _ms(_histogram.mean),
79
+ max_ms: _ms(_histogram.max),
80
+ p99_ms: p99Ms,
81
+ // Worst spell since boot, and the last threshold breach:
82
+ peak_ms: _peakMs,
83
+ last_warning: _lastWarn,
84
+ };
85
+ }
86
+
87
+ function stop() {
88
+ if (_timer) { clearInterval(_timer); _timer = null; }
89
+ if (_histogram) { try { _histogram.disable(); } catch {} _histogram = null; }
90
+ _onWarn = null;
91
+ }
92
+
93
+ module.exports = { start, stop, stats, isRunning };
@@ -0,0 +1,194 @@
1
+ 'use strict';
2
+
3
+ const TRANSIENT_PROVIDER_ISSUE_MAX_AGE_MS = 6 * 60 * 60 * 1000;
4
+
5
+ function asTime(value) {
6
+ const t = value ? Date.parse(value) : NaN;
7
+ return Number.isFinite(t) ? t : 0;
8
+ }
9
+
10
+ function normalizedProviderIssue(alert) {
11
+ if (!alert || typeof alert !== 'object') return null;
12
+ const issue = alert.providerError || alert.provider_error || {};
13
+ const type = String(issue.type || alert.type || '').toLowerCase();
14
+ const service = String(alert.service || '').toLowerCase();
15
+ const looksProvider = service === 'ai_provider' || type.startsWith('ai_provider') || !!alert.provider || !!issue.provider;
16
+ if (!looksProvider) return null;
17
+ return {
18
+ id: alert.id || '',
19
+ type: issue.type || alert.type || 'provider_error',
20
+ severity: issue.severity || alert.severity || 'error',
21
+ title: issue.title || alert.title || 'AI provider issue',
22
+ message: issue.userMessage || issue.message || alert.message || 'Wall-E could not get a provider response.',
23
+ provider: issue.provider || alert.provider || '',
24
+ model: issue.model || alert.model || '',
25
+ status: issue.status || alert.status || '',
26
+ rawMessage: issue.rawMessage || issue.raw_message || alert.rawMessage || '',
27
+ actionUrl: issue.actionUrl || issue.action_url || alert.action_url || '/setup.html',
28
+ actionLabel: issue.actionLabel || issue.action_label || alert.action_label || 'Open Setup',
29
+ created_at: alert.created_at || issue.createdAt || issue.created_at || '',
30
+ };
31
+ }
32
+
33
+ function providerMatches(issue, activeProvider, activeModel) {
34
+ if (!issue) return false;
35
+ const provider = String(issue.provider || '').toLowerCase();
36
+ const model = String(issue.model || '').toLowerCase();
37
+ const ap = String(activeProvider || '').toLowerCase();
38
+ const am = String(activeModel || '').toLowerCase();
39
+ if (ap && provider && provider === ap) return true;
40
+ if (am && model && model === am) return true;
41
+ return !ap && !am;
42
+ }
43
+
44
+ function isStickyProviderIssue(issue) {
45
+ const text = `${issue.type || ''} ${issue.title || ''} ${issue.message || ''}`.toLowerCase();
46
+ return /auth|quota|billing|credit|insufficient|invalid|forbidden|unauthorized|permission/.test(text);
47
+ }
48
+
49
+ function isCurrentProviderIssue(issue, opts, nowMs) {
50
+ if (!providerMatches(issue, opts.activeProvider, opts.activeModel)) return false;
51
+ if (isStickyProviderIssue(issue)) return true;
52
+ const created = asTime(issue.created_at);
53
+ if (!created) return true;
54
+ return nowMs - created <= (opts.transientProviderMaxAgeMs || TRANSIENT_PROVIDER_ISSUE_MAX_AGE_MS);
55
+ }
56
+
57
+ function skillNameFromAlert(alert) {
58
+ if (!alert) return '';
59
+ if (alert.skill) return String(alert.skill);
60
+ const service = String(alert.service || '');
61
+ if (service && service !== 'ai_provider' && service !== 'system') return service;
62
+ const msg = String(alert.message || '');
63
+ const quoted = msg.match(/Skill\s+"([^"]+)"/i);
64
+ if (quoted) return quoted[1];
65
+ const named = msg.match(/Skill\s+([A-Za-z0-9_.-]+)/i);
66
+ return named ? named[1] : '';
67
+ }
68
+
69
+ function isDisabledSkillAlert(alert) {
70
+ return !!alert && String(alert.type || '').toLowerCase() === 'skill_disabled';
71
+ }
72
+
73
+ function isIntegrationAlert(alert) {
74
+ if (!alert || isDisabledSkillAlert(alert)) return false;
75
+ const type = String(alert.type || '').toLowerCase();
76
+ const action = String(alert.action || '').toLowerCase();
77
+ const text = [alert.service, alert.message, alert.integration].filter(Boolean).join(' ').toLowerCase();
78
+ if (action === 'gws_reauth' || action === 'repair_slack_owner') return true;
79
+ if (type === 'auth_expired' || type === 'owner_identity_missing') return true;
80
+ return /(slack|gws|google|gmail|calendar|drive|oauth)/.test(text)
81
+ && /(auth|reauth|reconnect|expired|token|owner)/.test(text);
82
+ }
83
+
84
+ function publicAlert(alert) {
85
+ return {
86
+ id: alert.id || '',
87
+ service: alert.service || '',
88
+ type: alert.type || '',
89
+ title: alert.title || '',
90
+ message: alert.message || '',
91
+ severity: alert.severity || '',
92
+ action: alert.action || '',
93
+ action_label: alert.action_label || '',
94
+ action_url: alert.action_url || '',
95
+ created_at: alert.created_at || '',
96
+ };
97
+ }
98
+
99
+ function summarizeProviderIssue(issue, nowMs) {
100
+ const created = asTime(issue.created_at);
101
+ return {
102
+ id: issue.id,
103
+ type: issue.type,
104
+ severity: issue.severity,
105
+ title: issue.title,
106
+ message: issue.message,
107
+ provider: issue.provider,
108
+ model: issue.model,
109
+ status: issue.status,
110
+ action_url: issue.actionUrl,
111
+ action_label: issue.actionLabel,
112
+ created_at: issue.created_at,
113
+ age_ms: created ? Math.max(0, nowMs - created) : null,
114
+ };
115
+ }
116
+
117
+ function buildServiceHealth(alerts, options = {}) {
118
+ const list = Array.isArray(alerts) ? alerts.filter(Boolean) : [];
119
+ const nowMs = options.nowMs || Date.now();
120
+ const providerIssues = list
121
+ .map(normalizedProviderIssue)
122
+ .filter(Boolean)
123
+ .sort((a, b) => asTime(b.created_at) - asTime(a.created_at));
124
+
125
+ const currentIssue = providerIssues.find((issue) => isCurrentProviderIssue(issue, options, nowMs)) || null;
126
+ const currentIssueId = currentIssue && currentIssue.id;
127
+ const providerHistory = providerIssues
128
+ .filter((issue) => issue.id !== currentIssueId)
129
+ .map((issue) => summarizeProviderIssue(issue, nowMs));
130
+
131
+ const disabledSkills = list.filter(isDisabledSkillAlert).map((alert) => ({
132
+ ...publicAlert(alert),
133
+ skill: skillNameFromAlert(alert),
134
+ }));
135
+ const integrationAlerts = list
136
+ .filter((alert) => !normalizedProviderIssue(alert) && !isDisabledSkillAlert(alert) && isIntegrationAlert(alert))
137
+ .map(publicAlert);
138
+ const systemAlerts = list
139
+ .filter((alert) => !normalizedProviderIssue(alert) && !isDisabledSkillAlert(alert) && !isIntegrationAlert(alert))
140
+ .map(publicAlert);
141
+
142
+ let level = 'ok';
143
+ if (currentIssue) level = currentIssue.severity === 'warning' ? 'warning' : 'error';
144
+ else if (integrationAlerts.length || disabledSkills.length || systemAlerts.some((a) => a.severity === 'error')) level = 'warning';
145
+ else if (providerHistory.length || systemAlerts.length) level = 'info';
146
+
147
+ const activeLabel = [options.activeProvider, options.activeModel].filter(Boolean).join(' / ');
148
+ let title = 'Wall-E services healthy';
149
+ let message = activeLabel ? `${activeLabel} has no current service blocker.` : 'No current service blocker.';
150
+ if (currentIssue) {
151
+ title = currentIssue.title || 'Current provider issue';
152
+ message = currentIssue.message;
153
+ } else if (integrationAlerts.length || disabledSkills.length) {
154
+ title = 'Background services need review';
155
+ const parts = [];
156
+ if (disabledSkills.length) parts.push(`${disabledSkills.length} disabled skill${disabledSkills.length === 1 ? '' : 's'}`);
157
+ if (integrationAlerts.length) parts.push(`${integrationAlerts.length} integration alert${integrationAlerts.length === 1 ? '' : 's'}`);
158
+ message = parts.join(' and ') + '.';
159
+ } else if (providerHistory.length || systemAlerts.length) {
160
+ title = 'Older service history';
161
+ message = 'No current blocker, but older provider or system alerts are available for review.';
162
+ }
163
+
164
+ return {
165
+ level,
166
+ title,
167
+ message,
168
+ active_provider: {
169
+ provider: options.activeProvider || '',
170
+ model: options.activeModel || '',
171
+ },
172
+ current_issue: currentIssue ? summarizeProviderIssue(currentIssue, nowMs) : null,
173
+ disabled_skills: disabledSkills,
174
+ integration_alerts: integrationAlerts,
175
+ provider_history: providerHistory,
176
+ system_alerts: systemAlerts,
177
+ counts: {
178
+ total: list.length,
179
+ current: currentIssue ? 1 : 0,
180
+ disabled_skills: disabledSkills.length,
181
+ integration: integrationAlerts.length,
182
+ provider_history: providerHistory.length,
183
+ system: systemAlerts.length,
184
+ },
185
+ updated_at: new Date(nowMs).toISOString(),
186
+ };
187
+ }
188
+
189
+ module.exports = {
190
+ buildServiceHealth,
191
+ normalizedProviderIssue,
192
+ skillNameFromAlert,
193
+ TRANSIENT_PROVIDER_ISSUE_MAX_AGE_MS,
194
+ };
@@ -3,6 +3,11 @@
3
3
  const Anthropic = require('@anthropic-ai/sdk');
4
4
  const { fetchWithRetry } = require('./retry');
5
5
  const { filterToSupportedModels, supportedModelsForProvider } = require('./supported-models');
6
+ const { isPortkeyProviderConfig } = require('./portkey');
7
+ const {
8
+ isAnthropicSamplingParamError,
9
+ stripAnthropicUnsupportedParams,
10
+ } = require('./request-compat');
6
11
 
7
12
  // ============================================================
8
13
  // Environment configuration
@@ -74,6 +79,90 @@ function buildClientOptsFromEnv() {
74
79
 
75
80
  const MODELS = supportedModelsForProvider('anthropic');
76
81
 
82
+ function portkeyMessagesUrl(baseUrl) {
83
+ const root = String(baseUrl || '').trim().replace(/\/+$/, '');
84
+ if (!root) return '/v1/messages';
85
+ return /\/v1$/i.test(root) ? `${root}/messages` : `${root}/v1/messages`;
86
+ }
87
+
88
+ // ============================================================
89
+ // Prompt caching
90
+ // ============================================================
91
+
92
+ const EPHEMERAL = Object.freeze({ type: 'ephemeral' });
93
+
94
+ function _stripCacheControl(block) {
95
+ if (block && typeof block === 'object' && block.cache_control) {
96
+ const { cache_control, ...rest } = block;
97
+ return rest;
98
+ }
99
+ return block;
100
+ }
101
+
102
+ // Thinking blocks can't carry cache_control; empty text blocks are rejected.
103
+ function _blockSupportsCacheControl(block) {
104
+ if (!block || typeof block !== 'object') return false;
105
+ if (block.type === 'thinking' || block.type === 'redacted_thinking') return false;
106
+ if (block.type === 'text' && !String(block.text || '').length) return false;
107
+ return true;
108
+ }
109
+
110
+ /**
111
+ * Place prompt-cache breakpoints on a /v1/messages request:
112
+ * last tool definition, last system block, and a sliding breakpoint on the
113
+ * last content block of the last message (re-placed every turn so turn N+1
114
+ * reads turn N's prefix from cache). Uses 3 of the 4 allowed breakpoints.
115
+ *
116
+ * Pure: returns a new request object; never mutates the caller's messages
117
+ * (the agent loop reuses message objects across turns — mutating them would
118
+ * accumulate stale breakpoints and blow the 4-breakpoint API limit).
119
+ */
120
+ function applyAnthropicPromptCaching(reqParams) {
121
+ const out = { ...reqParams };
122
+
123
+ if (typeof out.system === 'string' && out.system.length > 0) {
124
+ out.system = [{ type: 'text', text: out.system, cache_control: EPHEMERAL }];
125
+ } else if (Array.isArray(out.system) && out.system.length > 0) {
126
+ const blocks = out.system.map(_stripCacheControl);
127
+ const last = blocks.length - 1;
128
+ if (_blockSupportsCacheControl(blocks[last])) {
129
+ blocks[last] = { ...blocks[last], cache_control: EPHEMERAL };
130
+ }
131
+ out.system = blocks;
132
+ }
133
+
134
+ if (Array.isArray(out.tools) && out.tools.length > 0) {
135
+ const tools = out.tools.map(_stripCacheControl);
136
+ tools[tools.length - 1] = { ...tools[tools.length - 1], cache_control: EPHEMERAL };
137
+ out.tools = tools;
138
+ }
139
+
140
+ if (Array.isArray(out.messages) && out.messages.length > 0) {
141
+ const messages = out.messages.map((msg) => (
142
+ msg && Array.isArray(msg.content)
143
+ ? { ...msg, content: msg.content.map(_stripCacheControl) }
144
+ : msg
145
+ ));
146
+ const lastIdx = messages.length - 1;
147
+ const last = messages[lastIdx];
148
+ if (last && typeof last === 'object') {
149
+ if (typeof last.content === 'string' && last.content.length > 0) {
150
+ messages[lastIdx] = { ...last, content: [{ type: 'text', text: last.content, cache_control: EPHEMERAL }] };
151
+ } else if (Array.isArray(last.content) && last.content.length > 0) {
152
+ const blocks = [...last.content];
153
+ const lastBlock = blocks.length - 1;
154
+ if (_blockSupportsCacheControl(blocks[lastBlock])) {
155
+ blocks[lastBlock] = { ...blocks[lastBlock], cache_control: EPHEMERAL };
156
+ messages[lastIdx] = { ...last, content: blocks };
157
+ }
158
+ }
159
+ }
160
+ out.messages = messages;
161
+ }
162
+
163
+ return out;
164
+ }
165
+
77
166
  // Build a human-readable display name from a model id, e.g.
78
167
  // "claude-opus-4-7" -> "Claude Opus 4.7"
79
168
  function _prettyAnthropicName(id, providedDisplayName) {
@@ -139,7 +228,7 @@ function createAnthropicProvider(config = {}) {
139
228
  headers['anthropic-beta'] = betaHeader ? betaHeader + ',oauth-2025-04-20' : 'oauth-2025-04-20';
140
229
  }
141
230
  }
142
- const messagesUrl = baseUrl.replace(/\/+$/, '') + '/messages';
231
+ const messagesUrl = portkeyMessagesUrl(baseUrl);
143
232
 
144
233
  client = {
145
234
  messages: {
@@ -200,13 +289,15 @@ function createAnthropicProvider(config = {}) {
200
289
  * @param {string} [params.system] - System prompt
201
290
  * @param {number} [params.maxTokens] - Max output tokens (default 4096)
202
291
  * @param {number} [params.temperature]
292
+ * @param {number} [params.top_p]
293
+ * @param {number} [params.top_k]
203
294
  * @param {AbortSignal} [params.signal]
204
295
  * @returns {Promise<object>} Normalized response
205
296
  */
206
- async chat({ model, messages, tools, system, maxTokens = 4096, temperature, signal } = {}) {
297
+ async chat({ model, messages, tools, system, maxTokens = 4096, temperature, top_p, topP, top_k, topK, signal, promptCache } = {}) {
207
298
  const start = Date.now();
208
299
 
209
- const reqParams = {
300
+ let reqParams = {
210
301
  model,
211
302
  messages,
212
303
  max_tokens: maxTokens,
@@ -214,9 +305,25 @@ function createAnthropicProvider(config = {}) {
214
305
  if (system) reqParams.system = system;
215
306
  if (tools && tools.length > 0) reqParams.tools = tools;
216
307
  if (temperature !== undefined) reqParams.temperature = temperature;
308
+ if (top_p !== undefined) reqParams.top_p = top_p;
309
+ if (topP !== undefined && reqParams.top_p === undefined) reqParams.top_p = topP;
310
+ if (top_k !== undefined) reqParams.top_k = top_k;
311
+ if (topK !== undefined && reqParams.top_k === undefined) reqParams.top_k = topK;
312
+ if (promptCache) reqParams = applyAnthropicPromptCaching(reqParams);
313
+
314
+ const compat = stripAnthropicUnsupportedParams(reqParams, { model });
315
+ const providerReqParams = compat.request;
217
316
 
218
317
  const fetchOpts = signal ? { signal } : undefined;
219
- const raw = await client.messages.create(reqParams, fetchOpts);
318
+ let raw;
319
+ try {
320
+ raw = await client.messages.create(providerReqParams, fetchOpts);
321
+ } catch (err) {
322
+ const fallback = stripAnthropicUnsupportedParams(reqParams, { model, force: true });
323
+ const didStrip = fallback.warnings.some((warning) => warning.keys?.length > 0);
324
+ if (!didStrip || !isAnthropicSamplingParamError(err)) throw err;
325
+ raw = await client.messages.create(fallback.request, fetchOpts);
326
+ }
220
327
  const latencyMs = Date.now() - start;
221
328
 
222
329
  // Normalize response
@@ -231,8 +338,18 @@ function createAnthropicProvider(config = {}) {
231
338
  input: tu.input,
232
339
  })),
233
340
  stopReason: raw.stop_reason === 'end_turn' ? 'end_turn' : raw.stop_reason === 'tool_use' ? 'tool_use' : raw.stop_reason,
341
+ // `input` is the TOTAL effective input (uncached + cache hits + cache
342
+ // writes) so context-size consumers (compaction triggers) see the real
343
+ // prompt size; cacheRead/cacheWrite let cost accounting discount them.
234
344
  usage: raw.usage
235
- ? { input: raw.usage.input_tokens, output: raw.usage.output_tokens }
345
+ ? {
346
+ input: (raw.usage.input_tokens || 0)
347
+ + (raw.usage.cache_read_input_tokens || 0)
348
+ + (raw.usage.cache_creation_input_tokens || 0),
349
+ output: raw.usage.output_tokens,
350
+ cacheRead: raw.usage.cache_read_input_tokens || 0,
351
+ cacheWrite: raw.usage.cache_creation_input_tokens || 0,
352
+ }
236
353
  : undefined,
237
354
  latencyMs,
238
355
  model: raw.model || model,
@@ -249,6 +366,11 @@ function createAnthropicProvider(config = {}) {
249
366
  */
250
367
  async listModels(options = {}) {
251
368
  const exact = Boolean(options.exact || options.liveOnly);
369
+ const includeUnknown = Boolean(
370
+ options.includeUnknown
371
+ || options.allowUnknown
372
+ || isPortkeyProviderConfig({ baseUrl, customHeaders })
373
+ );
252
374
  const configuredHeaders = customHeaders || {};
253
375
  const hasHeaderCredential = Boolean(
254
376
  configuredHeaders['x-api-key']
@@ -289,6 +411,7 @@ function createAnthropicProvider(config = {}) {
289
411
  if (/opus/i.test(id) || /-4-7/.test(id)) capabilities.reasoning = true;
290
412
  out.push({ id, name: _prettyAnthropicName(id, m.display_name), capabilities });
291
413
  }
414
+ if (includeUnknown) return out;
292
415
  const supported = filterToSupportedModels('anthropic', out);
293
416
  return supported.length > 0 ? supported : supportedModelsForProvider('anthropic');
294
417
  } catch (err) {
@@ -320,4 +443,6 @@ module.exports = {
320
443
  buildClientOptsFromEnv,
321
444
  createAnthropicProvider,
322
445
  createAnthropicFromEnv,
446
+ portkeyMessagesUrl,
447
+ applyAnthropicPromptCaching,
323
448
  };