create-walle 0.10.2 → 0.10.3

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 (488) hide show
  1. package/README.md +3 -1
  2. package/lib/release-schema.json +2 -2
  3. package/lib/runtime-closure-policy.json +8 -7
  4. package/package.json +1 -1
  5. package/template/coding-task-manager/api-prompts.js +45 -7
  6. package/template/coding-task-manager/bin/claude-hook.js +55 -1
  7. package/template/coding-task-manager/bin/ctm-relay-client.js +35 -12
  8. package/template/coding-task-manager/bin/land.js +2069 -0
  9. package/template/coding-task-manager/bin/memory-census.js +4 -2
  10. package/template/coding-task-manager/bin/memory-sync-verify.js +151 -0
  11. package/template/coding-task-manager/bin/probe-refusal-scope.js +530 -0
  12. package/template/coding-task-manager/db.js +156 -32
  13. package/template/coding-task-manager/lib/acp/acp-client.js +383 -0
  14. package/template/coding-task-manager/lib/acp/dsh-context-truth.js +176 -0
  15. package/template/coding-task-manager/lib/acp/dsh-launch-model.js +302 -0
  16. package/template/coding-task-manager/lib/acp/dsh-mcp-servers.js +194 -0
  17. package/template/coding-task-manager/lib/acp/dsh-prompt-lane.js +616 -0
  18. package/template/coding-task-manager/lib/acp/dsh-route-patch.js +308 -0
  19. package/template/coding-task-manager/lib/acp/dsh-session-runtime.js +522 -0
  20. package/template/coding-task-manager/lib/acp/dsh-transcript.js +395 -0
  21. package/template/coding-task-manager/lib/acp/dsh-usage-log.js +162 -0
  22. package/template/coding-task-manager/lib/acp/ndjson-stdio-transport.js +225 -0
  23. package/template/coding-task-manager/lib/adopted-host-redial.js +47 -11
  24. package/template/coding-task-manager/lib/adopted-launch-environment.js +123 -0
  25. package/template/coding-task-manager/lib/agent-auto-update-runtime.js +0 -3
  26. package/template/coding-task-manager/lib/agent-auto-update.js +26 -10
  27. package/template/coding-task-manager/lib/agent-bundle/build.js +657 -0
  28. package/template/coding-task-manager/lib/agent-bundle/codex-install.js +558 -0
  29. package/template/coding-task-manager/lib/agent-bundle/drift.js +120 -0
  30. package/template/coding-task-manager/lib/agent-bundle/gc.js +522 -0
  31. package/template/coding-task-manager/lib/agent-bundle/inventory.js +346 -0
  32. package/template/coding-task-manager/lib/agent-bundle/push.js +717 -0
  33. package/template/coding-task-manager/lib/agent-bundle/skill-transfer.js +724 -0
  34. package/template/coding-task-manager/lib/agent-bundle/spawn.js +119 -0
  35. package/template/coding-task-manager/lib/agent-bundle/store.js +568 -0
  36. package/template/coding-task-manager/lib/agent-capabilities.js +142 -12
  37. package/template/coding-task-manager/lib/agent-cli-cache.js +30 -5
  38. package/template/coding-task-manager/lib/agent-definitions.js +19 -0
  39. package/template/coding-task-manager/lib/agent-hooks-codex-toml.js +28 -16
  40. package/template/coding-task-manager/lib/agent-hooks-codex-workspace.js +9 -1
  41. package/template/coding-task-manager/lib/agent-hooks-installer.js +23 -8
  42. package/template/coding-task-manager/lib/agent-hooks-prune.js +37 -11
  43. package/template/coding-task-manager/lib/agent-hooks-shim.js +105 -0
  44. package/template/coding-task-manager/lib/agent-presets.js +84 -1
  45. package/template/coding-task-manager/lib/agent-upgrade-jobs.js +12 -1
  46. package/template/coding-task-manager/lib/agent-version-service.js +74 -11
  47. package/template/coding-task-manager/lib/all-sessions-query.js +6 -2
  48. package/template/coding-task-manager/lib/api/agent-bundles.js +436 -0
  49. package/template/coding-task-manager/lib/api/backup-retention.js +83 -0
  50. package/template/coding-task-manager/lib/api/conversation-sync-routes.js +124 -0
  51. package/template/coding-task-manager/lib/api/diagnostics.js +549 -69
  52. package/template/coding-task-manager/lib/api/fleet.js +118 -0
  53. package/template/coding-task-manager/lib/api/hub-bridge.js +243 -0
  54. package/template/coding-task-manager/lib/api/ingress.js +9 -1
  55. package/template/coding-task-manager/lib/api/landing.js +403 -0
  56. package/template/coding-task-manager/lib/api/machines.js +691 -2
  57. package/template/coding-task-manager/lib/api/memory-sync-routes.js +335 -0
  58. package/template/coding-task-manager/lib/api/misc-ops.js +8 -3
  59. package/template/coding-task-manager/lib/api/remote-sessions.js +1326 -0
  60. package/template/coding-task-manager/lib/api/session-attach.js +623 -0
  61. package/template/coding-task-manager/lib/api/session-messages.js +1384 -0
  62. package/template/coding-task-manager/lib/api/sessions.js +77 -51
  63. package/template/coding-task-manager/lib/api/setup-network.js +544 -16
  64. package/template/coding-task-manager/lib/api/setup-wizard-handlers.js +884 -0
  65. package/template/coding-task-manager/lib/api/setup.js +829 -10
  66. package/template/coding-task-manager/lib/api/walle-bridge.js +9 -1
  67. package/template/coding-task-manager/lib/attachment-reconciler-wiring.js +5 -2
  68. package/template/coding-task-manager/lib/auth-rate-limit.js +23 -0
  69. package/template/coding-task-manager/lib/auth-rules.js +292 -21
  70. package/template/coding-task-manager/lib/background-stop.js +369 -0
  71. package/template/coding-task-manager/lib/best-of-attempts.js +4 -1
  72. package/template/coding-task-manager/lib/best-of-launch-plan.js +52 -0
  73. package/template/coding-task-manager/lib/box-keep-awake.js +89 -0
  74. package/template/coding-task-manager/lib/broadcast-reason-stats.js +152 -0
  75. package/template/coding-task-manager/lib/broadcast-serialize.js +5 -0
  76. package/template/coding-task-manager/lib/build-info.js +4 -2
  77. package/template/coding-task-manager/lib/claude-model-truth.js +13 -2
  78. package/template/coding-task-manager/lib/claude-transcript-terminal-renderer.js +17 -13
  79. package/template/coding-task-manager/lib/client-diag-handler.js +64 -2
  80. package/template/coding-task-manager/lib/codex-app-server-client.js +14 -16
  81. package/template/coding-task-manager/lib/codex-configuration-history.js +55 -0
  82. package/template/coding-task-manager/lib/codex-harness-qualification.js +43 -20
  83. package/template/coding-task-manager/lib/codex-rollout-history.js +743 -0
  84. package/template/coding-task-manager/lib/coding-agent-models.js +27 -12
  85. package/template/coding-task-manager/lib/coding-cli-skill-installer.js +44 -14
  86. package/template/coding-task-manager/lib/coding-session-model-adapters.js +43 -2
  87. package/template/coding-task-manager/lib/coding-session-model-owner.js +1 -1
  88. package/template/coding-task-manager/lib/coding-session-model-public.js +7 -1
  89. package/template/coding-task-manager/lib/coding-session-model-runtime.js +23 -4
  90. package/template/coding-task-manager/lib/coding-session-model-scan.js +31 -0
  91. package/template/coding-task-manager/lib/coding-session-model-state.js +7 -0
  92. package/template/coding-task-manager/lib/conversation-freshness-diagnostics.js +280 -0
  93. package/template/coding-task-manager/lib/conversation-item-clock.js +261 -0
  94. package/template/coding-task-manager/lib/conversation-source-registry.js +5 -0
  95. package/template/coding-task-manager/lib/conversation-store-v2.js +44 -0
  96. package/template/coding-task-manager/lib/conversation-sync.js +355 -0
  97. package/template/coding-task-manager/lib/create/resolve-launch-params.js +96 -12
  98. package/template/coding-task-manager/lib/create/worker-role-profile.js +4 -4
  99. package/template/coding-task-manager/lib/create-intent-lease.js +51 -0
  100. package/template/coding-task-manager/lib/ctm-session-context-api.js +97 -6
  101. package/template/coding-task-manager/lib/db-domain-tables.js +1 -0
  102. package/template/coding-task-manager/lib/db-domains.js +1 -0
  103. package/template/coding-task-manager/lib/db-owner-dispatch-probe.js +32 -0
  104. package/template/coding-task-manager/lib/db-owner-request-counts.js +178 -0
  105. package/template/coding-task-manager/lib/db-owner-worker-client.js +68 -14
  106. package/template/coding-task-manager/lib/db-schema-source-files.js +5 -0
  107. package/template/coding-task-manager/lib/deferred-restore-attempt.js +6 -2
  108. package/template/coding-task-manager/lib/feature-manifest.js +4 -0
  109. package/template/coding-task-manager/lib/fleet-conversation-route.js +97 -0
  110. package/template/coding-task-manager/lib/fleet-fanout.js +78 -0
  111. package/template/coding-task-manager/lib/fleet-hub.js +762 -0
  112. package/template/coding-task-manager/lib/fleet-origin-follower.js +252 -0
  113. package/template/coding-task-manager/lib/fleet-resolver-effects.js +147 -0
  114. package/template/coding-task-manager/lib/fleet-resolver-tick.js +148 -0
  115. package/template/coding-task-manager/lib/fleet-resolver.js +454 -0
  116. package/template/coding-task-manager/lib/fleet-session-list-routes.js +114 -0
  117. package/template/coding-task-manager/lib/fleet-session-lists.js +672 -0
  118. package/template/coding-task-manager/lib/fleet-update.js +798 -0
  119. package/template/coding-task-manager/lib/fs-watcher-root-watch.js +141 -0
  120. package/template/coding-task-manager/lib/fs-watcher.js +58 -42
  121. package/template/coding-task-manager/lib/harness-history-transition.js +50 -9
  122. package/template/coding-task-manager/lib/headless-term-service.js +84 -8
  123. package/template/coding-task-manager/lib/hermetic-agent-launch-guard.js +10 -0
  124. package/template/coding-task-manager/lib/history-transition-read-op.js +175 -8
  125. package/template/coding-task-manager/lib/host-cpu-categories.js +310 -0
  126. package/template/coding-task-manager/lib/host-fseventsd-sampler.js +399 -0
  127. package/template/coding-task-manager/lib/host-handoff.js +16 -19
  128. package/template/coding-task-manager/lib/host-stats.js +150 -3
  129. package/template/coding-task-manager/lib/hosted-sync-worker.js +43 -320
  130. package/template/coding-task-manager/lib/hub-bridge-access.js +798 -0
  131. package/template/coding-task-manager/lib/hub-bridge-box.js +409 -0
  132. package/template/coding-task-manager/lib/hub-bridge-mcp.js +380 -0
  133. package/template/coding-task-manager/lib/hub-bridge-mesh.js +313 -0
  134. package/template/coding-task-manager/lib/hub-bridge-ops.js +721 -0
  135. package/template/coding-task-manager/lib/hub-bridge.js +398 -0
  136. package/template/coding-task-manager/lib/idle-notify.js +491 -0
  137. package/template/coding-task-manager/lib/instance-id-ownership-manifest.js +8 -0
  138. package/template/coding-task-manager/lib/instance-manifest.js +5 -1
  139. package/template/coding-task-manager/lib/instance-sync-status.js +18 -8
  140. package/template/coding-task-manager/lib/landing/agent-rule.txt +1 -0
  141. package/template/coding-task-manager/lib/landing/batch-runner.js +366 -0
  142. package/template/coding-task-manager/lib/landing/config.js +536 -0
  143. package/template/coding-task-manager/lib/landing/ctm-view.js +256 -0
  144. package/template/coding-task-manager/lib/landing/gate.js +360 -0
  145. package/template/coding-task-manager/lib/landing/git.js +344 -0
  146. package/template/coding-task-manager/lib/landing/lease.js +247 -0
  147. package/template/coding-task-manager/lib/landing/merge-delta.js +380 -0
  148. package/template/coding-task-manager/lib/landing/proof.js +223 -0
  149. package/template/coding-task-manager/lib/landing/queue.js +998 -0
  150. package/template/coding-task-manager/lib/landing/radar.js +489 -0
  151. package/template/coding-task-manager/lib/landing/resolve-cli.js +424 -0
  152. package/template/coding-task-manager/lib/landing/state.js +263 -0
  153. package/template/coding-task-manager/lib/landing/stop.js +49 -0
  154. package/template/coding-task-manager/lib/landing/sync-cli.js +475 -0
  155. package/template/coding-task-manager/lib/landing/sync.js +456 -0
  156. package/template/coding-task-manager/lib/landing/train.js +885 -0
  157. package/template/coding-task-manager/lib/landing/window.js +57 -0
  158. package/template/coding-task-manager/lib/launch-environment.js +121 -0
  159. package/template/coding-task-manager/lib/launch-model-override.js +36 -10
  160. package/template/coding-task-manager/lib/launch-plan-pool.js +2 -1
  161. package/template/coding-task-manager/lib/launch-plan-warm-cache.js +6 -0
  162. package/template/coding-task-manager/lib/lead-model-observer.js +57 -1
  163. package/template/coding-task-manager/lib/lead-model-options.js +160 -3
  164. package/template/coding-task-manager/lib/lead-model-restore-reconciliation.js +106 -24
  165. package/template/coding-task-manager/lib/lead-model-switch-runtime.js +352 -68
  166. package/template/coding-task-manager/lib/lead-model-switch.js +114 -10
  167. package/template/coding-task-manager/lib/lead-model-transition-runtime.js +14 -2
  168. package/template/coding-task-manager/lib/lead-model-transition-store.js +24 -6
  169. package/template/coding-task-manager/lib/lead-route-preflight.js +179 -0
  170. package/template/coding-task-manager/lib/lead-switch-history-mode.js +110 -0
  171. package/template/coding-task-manager/lib/lead-wire-agent.js +7 -0
  172. package/template/coding-task-manager/lib/lifecycle-wake-experiment.js +9 -2
  173. package/template/coding-task-manager/lib/live-defer-announce.js +45 -0
  174. package/template/coding-task-manager/lib/machine-registry.js +750 -5
  175. package/template/coding-task-manager/lib/macos-capabilities.js +32 -15
  176. package/template/coding-task-manager/lib/main-thread-lint-exemptions.json +433 -53
  177. package/template/coding-task-manager/lib/mainloop-observability.js +14 -9
  178. package/template/coding-task-manager/lib/media-draft-owner.js +16 -3
  179. package/template/coding-task-manager/lib/memory-join.js +337 -0
  180. package/template/coding-task-manager/lib/memory-sync-verify.js +393 -0
  181. package/template/coding-task-manager/lib/memory-sync.js +565 -0
  182. package/template/coding-task-manager/lib/migrations/v57-delegate-pref-mirror-opencode.js +68 -0
  183. package/template/coding-task-manager/lib/migrations/v58-subagent-launch-native-subagents.js +42 -0
  184. package/template/coding-task-manager/lib/migrations/v59-coding-session-model-state-dsh.js +73 -0
  185. package/template/coding-task-manager/lib/migrations/v60-delegate-pref-mirror-dsh.js +78 -0
  186. package/template/coding-task-manager/lib/migrations/v61-conversation-item-clock.js +71 -0
  187. package/template/coding-task-manager/lib/model-availability.js +727 -0
  188. package/template/coding-task-manager/lib/model-execution-recipe-metadata.js +4 -6
  189. package/template/coding-task-manager/lib/model-host-receipt.js +6 -3
  190. package/template/coding-task-manager/lib/model-id-rule.js +19 -0
  191. package/template/coding-task-manager/lib/model-proxy/anthropic-face.js +4 -0
  192. package/template/coding-task-manager/lib/model-proxy/auto-mode-review.js +110 -23
  193. package/template/coding-task-manager/lib/model-proxy/chat-response-translators.js +3 -0
  194. package/template/coding-task-manager/lib/model-proxy/generation-probe.js +60 -17
  195. package/template/coding-task-manager/lib/model-proxy/historical-tool-declarations.js +37 -0
  196. package/template/coding-task-manager/lib/model-proxy/lead-request-validation.js +1 -0
  197. package/template/coding-task-manager/lib/model-proxy/lead-token-admin.js +130 -0
  198. package/template/coding-task-manager/lib/model-proxy/refusal-scope.js +151 -0
  199. package/template/coding-task-manager/lib/model-proxy/request-budget-store.js +11 -2
  200. package/template/coding-task-manager/lib/model-proxy/tokens.js +69 -5
  201. package/template/coding-task-manager/lib/model-proxy/upstream-outcome.js +9 -0
  202. package/template/coding-task-manager/lib/native-agent-model-args.js +25 -22
  203. package/template/coding-task-manager/lib/native-history-control.js +6 -4
  204. package/template/coding-task-manager/lib/native-lead-settings-client.js +44 -4
  205. package/template/coding-task-manager/lib/oauth-proxy-supervisor.js +173 -36
  206. package/template/coding-task-manager/lib/online-backup-worker-client.js +2 -0
  207. package/template/coding-task-manager/lib/opencode-cli.js +480 -0
  208. package/template/coding-task-manager/lib/opencode-launch-model.js +471 -0
  209. package/template/coding-task-manager/lib/opencode-v1-plugin/model-carrier.mjs +35 -0
  210. package/template/coding-task-manager/lib/opencode-v2-plugin/server.js +118 -0
  211. package/template/coding-task-manager/lib/owner-action-manifest-data.json +1 -1
  212. package/template/coding-task-manager/lib/park-composer-draft.js +54 -0
  213. package/template/coding-task-manager/lib/park-fresh-relaunch.js +41 -10
  214. package/template/coding-task-manager/lib/perf-phase-trace.js +72 -0
  215. package/template/coding-task-manager/lib/perf-summary.js +7 -0
  216. package/template/coding-task-manager/lib/perf-tracker.js +63 -2
  217. package/template/coding-task-manager/lib/project-config.js +7 -0
  218. package/template/coding-task-manager/lib/prompt-purge-v2.js +52 -1
  219. package/template/coding-task-manager/lib/provider-login-broker.js +72 -15
  220. package/template/coding-task-manager/lib/provider-login-tab.js +10 -2
  221. package/template/coding-task-manager/lib/read-pool-client.js +89 -2
  222. package/template/coding-task-manager/lib/read-pool-worker-handle.js +29 -4
  223. package/template/coding-task-manager/lib/recent-catalog-query.js +15 -0
  224. package/template/coding-task-manager/lib/recent-session-catalog-response.js +67 -10
  225. package/template/coding-task-manager/lib/recovery-evidence.js +26 -11
  226. package/template/coding-task-manager/lib/relay-client.js +57 -3
  227. package/template/coding-task-manager/lib/relink-audit.js +34 -5
  228. package/template/coding-task-manager/lib/remote-machine-catalog.js +321 -26
  229. package/template/coding-task-manager/lib/remote-machine-create.js +576 -36
  230. package/template/coding-task-manager/lib/remote-machine-link.js +546 -59
  231. package/template/coding-task-manager/lib/remote-machine-proxy.js +143 -9
  232. package/template/coding-task-manager/lib/remote-session-forward.js +65 -7
  233. package/template/coding-task-manager/lib/remote-terminal-target.js +9 -2
  234. package/template/coding-task-manager/lib/restart-guard.js +18 -6
  235. package/template/coding-task-manager/lib/restore-seed-modes.js +87 -0
  236. package/template/coding-task-manager/lib/restored-scrollback-hydration-runtime.js +22 -2
  237. package/template/coding-task-manager/lib/resume-admission.js +17 -3
  238. package/template/coding-task-manager/lib/review-repo-registry.js +58 -19
  239. package/template/coding-task-manager/lib/root-delivery-runtime.js +2 -2
  240. package/template/coding-task-manager/lib/root-prompt-flow.js +1 -1
  241. package/template/coding-task-manager/lib/runtime-contract.js +3 -1
  242. package/template/coding-task-manager/lib/schema-indexes.js +1 -0
  243. package/template/coding-task-manager/lib/session-context-locator.js +742 -0
  244. package/template/coding-task-manager/lib/session-create/attachment.js +2 -2
  245. package/template/coding-task-manager/lib/session-create/create-phases.js +118 -0
  246. package/template/coding-task-manager/lib/session-create/delegate-worker.js +86 -16
  247. package/template/coding-task-manager/lib/session-create/dsh-session.js +930 -0
  248. package/template/coding-task-manager/lib/session-create/lead-route-launch.js +186 -13
  249. package/template/coding-task-manager/lib/session-create/native-lead-lifetime.js +55 -3
  250. package/template/coding-task-manager/lib/session-create/opencode-lead-provider.js +50 -0
  251. package/template/coding-task-manager/lib/session-create/prepared.js +162 -38
  252. package/template/coding-task-manager/lib/session-create/provider-process.js +160 -28
  253. package/template/coding-task-manager/lib/session-create/response.js +7 -7
  254. package/template/coding-task-manager/lib/session-create/structured-session.js +27 -0
  255. package/template/coding-task-manager/lib/session-create/subagent-pick-table.js +3 -1
  256. package/template/coding-task-manager/lib/session-create/subagent-pick.js +458 -9
  257. package/template/coding-task-manager/lib/session-create/transcript.js +1 -1
  258. package/template/coding-task-manager/lib/session-create/worker-budget-setup.js +21 -2
  259. package/template/coding-task-manager/lib/session-create/worker-continuation.js +7 -1
  260. package/template/coding-task-manager/lib/session-create/worker-launch-sandbox.js +39 -10
  261. package/template/coding-task-manager/lib/session-create/worker-observability.js +2 -2
  262. package/template/coding-task-manager/lib/session-empty.js +13 -10
  263. package/template/coding-task-manager/lib/session-host-manager.js +60 -0
  264. package/template/coding-task-manager/lib/session-jobs.js +3 -1
  265. package/template/coding-task-manager/lib/session-lifecycle.js +10 -4
  266. package/template/coding-task-manager/lib/session-model-action-preconditions.js +6 -2
  267. package/template/coding-task-manager/lib/session-model-intent-contract.js +11 -8
  268. package/template/coding-task-manager/lib/session-park.js +738 -0
  269. package/template/coding-task-manager/lib/session-path-grant.js +13 -4
  270. package/template/coding-task-manager/lib/session-status-ledger.js +106 -4
  271. package/template/coding-task-manager/lib/session-transport.js +17 -0
  272. package/template/coding-task-manager/lib/session-workspace-projection.js +54 -5
  273. package/template/coding-task-manager/lib/session-workspace-tracking-runtime.js +213 -1
  274. package/template/coding-task-manager/lib/skill-autocomplete-query.js +120 -3
  275. package/template/coding-task-manager/lib/skill-autocomplete.js +15 -1
  276. package/template/coding-task-manager/lib/sqlite-file-set.js +39 -0
  277. package/template/coding-task-manager/lib/standup-search-adapter.js +16 -2
  278. package/template/coding-task-manager/lib/state-sync/client-ledger.js +12 -0
  279. package/template/coding-task-manager/lib/state-sync/frame-emitter.js +319 -100
  280. package/template/coding-task-manager/lib/storage/coding-session-model-store.js +4 -1
  281. package/template/coding-task-manager/lib/storage/delegate-pref-mirror-store.js +32 -9
  282. package/template/coding-task-manager/lib/structured-session-boot-sweep.js +235 -0
  283. package/template/coding-task-manager/lib/submission-ack.js +90 -2
  284. package/template/coding-task-manager/lib/systemd-scope.js +115 -0
  285. package/template/coding-task-manager/lib/telemetry-receiver.js +39 -0
  286. package/template/coding-task-manager/lib/terminal-attach-geometry.js +985 -0
  287. package/template/coding-task-manager/lib/terminal-bootstrap.js +30 -0
  288. package/template/coding-task-manager/lib/terminal-draft-operation.js +357 -0
  289. package/template/coding-task-manager/lib/terminal-input-admission.js +17 -1
  290. package/template/coding-task-manager/lib/terminal-input-prepared.js +563 -0
  291. package/template/coding-task-manager/lib/transcript-cache-temps.js +171 -0
  292. package/template/coding-task-manager/lib/transcript-frame-cache.js +8 -3
  293. package/template/coding-task-manager/lib/transcript-source.js +36 -4
  294. package/template/coding-task-manager/lib/transcript-store.js +9 -0
  295. package/template/coding-task-manager/lib/typing-interaction-trace.js +106 -3
  296. package/template/coding-task-manager/lib/usage-ledger/backfill.js +40 -5
  297. package/template/coding-task-manager/lib/usage-ledger/client.js +4 -1
  298. package/template/coding-task-manager/lib/usage-ledger/dsh-parse.js +152 -0
  299. package/template/coding-task-manager/lib/usage-ledger/dsh-read.js +73 -0
  300. package/template/coding-task-manager/lib/usage-ledger/ingest.js +34 -6
  301. package/template/coding-task-manager/lib/usage-ledger/live.js +35 -8
  302. package/template/coding-task-manager/lib/usage-ledger/read.js +29 -20
  303. package/template/coding-task-manager/lib/usage-ledger/schema.js +61 -1
  304. package/template/coding-task-manager/lib/usage-ledger/task-coordinator.js +4 -2
  305. package/template/coding-task-manager/lib/wake-skip-reasons.js +1 -0
  306. package/template/coding-task-manager/lib/walle/turn.js +1 -1
  307. package/template/coding-task-manager/lib/walle-history-serve.js +838 -0
  308. package/template/coding-task-manager/lib/walle-kill-authority.js +2 -2
  309. package/template/coding-task-manager/lib/walle-log-rotation.js +164 -1
  310. package/template/coding-task-manager/lib/walle-mcp-auto-config.js +56 -2
  311. package/template/coding-task-manager/lib/walle-row-history.js +495 -0
  312. package/template/coding-task-manager/lib/walle-supervisor.js +33 -14
  313. package/template/coding-task-manager/lib/watch-worker-client.js +203 -0
  314. package/template/coding-task-manager/lib/worker-terminal-output.js +5 -2
  315. package/template/coding-task-manager/lib/ws/hub-bridge.js +35 -0
  316. package/template/coding-task-manager/lib/ws/lifecycle.js +6 -11
  317. package/template/coding-task-manager/lib/ws/misc.js +1 -1
  318. package/template/coding-task-manager/lib/ws/state-sync.js +106 -4
  319. package/template/coding-task-manager/lib/ws/terminal-attach.js +91 -0
  320. package/template/coding-task-manager/oauth-proxy.js +112 -115
  321. package/template/coding-task-manager/package-lock.json +10 -94
  322. package/template/coding-task-manager/package.json +4 -3
  323. package/template/coding-task-manager/protocol/message-table.json +10 -0
  324. package/template/coding-task-manager/protocol/messages.js +10 -0
  325. package/template/coding-task-manager/protocol/ws-schema.json +20 -0
  326. package/template/coding-task-manager/protocol/ws-schema.md +2 -0
  327. package/template/coding-task-manager/public/css/app.css +170 -0
  328. package/template/coding-task-manager/public/css/walle-session.css +4 -0
  329. package/template/coding-task-manager/public/index.html +473 -243
  330. package/template/coding-task-manager/public/js/agent-command.js +86 -0
  331. package/template/coding-task-manager/public/js/app/backups-panel.js +111 -5
  332. package/template/coding-task-manager/public/js/app/coding-agent-upgrade.js +103 -4
  333. package/template/coding-task-manager/public/js/app/machines-page.js +1328 -8
  334. package/template/coding-task-manager/public/js/app/models-tab.js +113 -38
  335. package/template/coding-task-manager/public/js/app/restart-banner.js +53 -0
  336. package/template/coding-task-manager/public/js/app/worktrees-panel.js +184 -2
  337. package/template/coding-task-manager/public/js/background-work.js +196 -27
  338. package/template/coding-task-manager/public/js/coding-session-model-presentation.js +138 -10
  339. package/template/coding-task-manager/public/js/core/active-session-groups.js +179 -0
  340. package/template/coding-task-manager/public/js/core/pending-create.js +238 -0
  341. package/template/coding-task-manager/public/js/core/recent-machine-source.js +228 -0
  342. package/template/coding-task-manager/public/js/core/session-commands.js +180 -14
  343. package/template/coding-task-manager/public/js/dashboard-client-function-order.json +8 -0
  344. package/template/coding-task-manager/public/js/document-review-links.js +9 -1
  345. package/template/coding-task-manager/public/js/file-resolution-client.js +52 -1
  346. package/template/coding-task-manager/public/js/history-app-seam.js +22 -2
  347. package/template/coding-task-manager/public/js/machine-pool-shared.js +558 -3
  348. package/template/coding-task-manager/public/js/message-renderer.js +4 -3
  349. package/template/coding-task-manager/public/js/model-picker.js +3 -1
  350. package/template/coding-task-manager/public/js/native-subagent-review.js +15 -2
  351. package/template/coding-task-manager/public/js/new-session-agent-grid.js +346 -0
  352. package/template/coding-task-manager/public/js/pasted-content.js +236 -0
  353. package/template/coding-task-manager/public/js/pe-private-content-lifetime.js +39 -7
  354. package/template/coding-task-manager/public/js/private-model-lifetime.js +6 -2
  355. package/template/coding-task-manager/public/js/prompts.js +11 -10
  356. package/template/coding-task-manager/public/js/protocol.js +10 -0
  357. package/template/coding-task-manager/public/js/restart-banner-policy.js +29 -1
  358. package/template/coding-task-manager/public/js/session-model-picker.js +447 -57
  359. package/template/coding-task-manager/public/js/session-search-utils.js +18 -2
  360. package/template/coding-task-manager/public/js/session-usage-view.js +2 -1
  361. package/template/coding-task-manager/public/js/session-workspace-tracking.js +51 -1
  362. package/template/coding-task-manager/public/js/state-sync-client.js +10 -1
  363. package/template/coding-task-manager/public/js/stream-view.js +6 -5
  364. package/template/coding-task-manager/public/js/terminal/conv-only-session.js +287 -0
  365. package/template/coding-task-manager/public/js/terminal/runtime-09.js +2 -0
  366. package/template/coding-task-manager/public/js/terminal/runtime-10.js +5 -5
  367. package/template/coding-task-manager/public/js/terminal/runtime-12.js +8 -1
  368. package/template/coding-task-manager/public/js/terminal/runtime-16.js +4 -0
  369. package/template/coding-task-manager/public/js/terminal/runtime-20.js +1 -1
  370. package/template/coding-task-manager/public/js/terminal-attachment-draft.js +67 -13
  371. package/template/coding-task-manager/public/js/terminal-image-orchestration.js +52 -6
  372. package/template/coding-task-manager/public/js/terminal-wheel.js +23 -3
  373. package/template/coding-task-manager/public/js/walle/chat-conversation.js +4 -4
  374. package/template/coding-task-manager/public/js/walle.js +6 -0
  375. package/template/coding-task-manager/public/js/ws/live-dispatch.js +10 -0
  376. package/template/coding-task-manager/public/m/app.css +140 -0
  377. package/template/coding-task-manager/public/m/app.js +507 -68
  378. package/template/coding-task-manager/public/m/index.html +17 -0
  379. package/template/coding-task-manager/public/m/machines.js +838 -4
  380. package/template/coding-task-manager/public/m/private-api.js +31 -1
  381. package/template/coding-task-manager/public/usage.html +1 -0
  382. package/template/coding-task-manager/scripts/dev-route-fixture/synthetic-route-upstream.js +104 -0
  383. package/template/coding-task-manager/scripts/dev-route-fixture.js +339 -0
  384. package/template/coding-task-manager/scripts/opencode-lead-route-probe.js +195 -0
  385. package/template/coding-task-manager/scripts/opencode-v2-contract-probe/fake-anthropic.js +168 -0
  386. package/template/coding-task-manager/scripts/opencode-v2-contract-probe/probe-plugin/server.js +95 -0
  387. package/template/coding-task-manager/scripts/opencode-v2-contract-probe.js +673 -0
  388. package/template/coding-task-manager/server.js +1950 -11679
  389. package/template/coding-task-manager/session-integrity.js +64 -4
  390. package/template/coding-task-manager/workers/db-owner-worker.js +19 -2
  391. package/template/coding-task-manager/workers/online-backup-worker.js +1 -0
  392. package/template/coding-task-manager/workers/read-pool-model-collector.js +51 -3
  393. package/template/coding-task-manager/workers/read-pool-worker.js +76 -6
  394. package/template/coding-task-manager/workers/session-host-pool-process.js +6 -6
  395. package/template/coding-task-manager/workers/session-host-process.js +5 -5
  396. package/template/coding-task-manager/workers/watch-worker.js +105 -0
  397. package/template/coding-task-manager/workers/worktree-worker.js +168 -33
  398. package/template/ctm-relay/lib/protocol.js +14 -1
  399. package/template/package-lock.json +2 -2
  400. package/template/package.json +1 -1
  401. package/template/shared/backup-retention.js +82 -0
  402. package/template/shared/conversation-admission.js +2 -0
  403. package/template/shared/conversation-provenance.js +3 -7
  404. package/template/shared/conversation-storage-v2-contract.js +5 -0
  405. package/template/shared/linked-worktree.js +51 -0
  406. package/template/shared/macos-fda-target.js +57 -0
  407. package/template/shared/orphan-parents.js +55 -0
  408. package/template/shared/release-schema.json +2 -2
  409. package/template/shared/storage/contract.js +3 -0
  410. package/template/wall-e/adapters/imessage.js +12 -0
  411. package/template/wall-e/agent.js +71 -4
  412. package/template/wall-e/api-walle.js +21 -1
  413. package/template/wall-e/bin/train-gemma-e4b-tooluse.js +2 -2
  414. package/template/wall-e/bin/walle-mcp-stdio.js +5 -5
  415. package/template/wall-e/brain/brain-join.js +859 -0
  416. package/template/wall-e/brain/brain-sync-membership.js +20 -0
  417. package/template/wall-e/brain/brain-sync-store.js +131 -77
  418. package/template/wall-e/brain/brain-sync-v2-schema.js +203 -0
  419. package/template/wall-e/brain/brain-sync-v2.js +578 -0
  420. package/template/wall-e/brain/delegate-model-prefs-store.js +13 -4
  421. package/template/wall-e/brain/deterministic-id.js +51 -0
  422. package/template/wall-e/brain/memories.js +2 -2
  423. package/template/wall-e/brain/migrations.js +40 -6
  424. package/template/wall-e/brain/model-identity-migration.js +1 -1
  425. package/template/wall-e/brain/owner-call-whitelist.js +23 -7
  426. package/template/wall-e/brain/schema.js +45 -85
  427. package/template/wall-e/brain.js +171 -35
  428. package/template/wall-e/chat.js +3 -3
  429. package/template/wall-e/coding/agent-shell-env.js +7 -2
  430. package/template/wall-e/coding/prompt-bundle.js +66 -21
  431. package/template/wall-e/config/main-loop-exemptions.json +2 -2
  432. package/template/wall-e/http/admin-api.js +37 -0
  433. package/template/wall-e/http/gws-api.js +4 -0
  434. package/template/wall-e/http/helper-rules-api.js +7 -1
  435. package/template/wall-e/http/model-admin.js +8 -1
  436. package/template/wall-e/http/model-delegate-pref-admin.js +3 -3
  437. package/template/wall-e/http/model-proxy-providers.js +174 -1
  438. package/template/wall-e/http/model-route-health.js +157 -0
  439. package/template/wall-e/http/sync-api.js +278 -464
  440. package/template/wall-e/jobs/job-runner.js +28 -1
  441. package/template/wall-e/lib/brain-owner-op-priority.js +9 -1
  442. package/template/wall-e/lib/ctm-data-dir.js +26 -0
  443. package/template/wall-e/lib/derivation-home.js +147 -0
  444. package/template/wall-e/lib/helper-rules/evaluate.js +50 -9
  445. package/template/wall-e/lib/helper-rules/grade.js +51 -8
  446. package/template/wall-e/lib/helper-rules/lead-call-hook.js +38 -5
  447. package/template/wall-e/lib/helper-rules/store.js +4 -2
  448. package/template/wall-e/lib/landing-mcp-tools.js +170 -0
  449. package/template/wall-e/lib/mcp-client-config.js +133 -14
  450. package/template/wall-e/lib/mcp-gateway-migrate.js +28 -64
  451. package/template/wall-e/lib/mcp-integration.js +58 -13
  452. package/template/wall-e/lib/parent-death.js +7 -1
  453. package/template/wall-e/lib/scheduler-worker-jobs.js +6 -4
  454. package/template/wall-e/llm/delegate-lead-prefs.js +16 -1
  455. package/template/wall-e/llm/delegate-vendor-default.js +12 -5
  456. package/template/wall-e/llm/model-roles.js +1 -1
  457. package/template/wall-e/llm/native-delegate-selection.js +56 -8
  458. package/template/wall-e/llm/worker-delegate-args.js +72 -7
  459. package/template/wall-e/llm/worker-mcp-routing.js +66 -17
  460. package/template/wall-e/loops/brain-custom-writes.js +19 -0
  461. package/template/wall-e/loops/ingest.js +17 -1
  462. package/template/wall-e/loops/think.js +19 -4
  463. package/template/wall-e/mcp-contract.js +222 -6
  464. package/template/wall-e/mcp-protocol-contract.js +40 -5
  465. package/template/wall-e/mcp-server.js +128 -29
  466. package/template/wall-e/mcp-worker-schemas.js +5 -5
  467. package/template/wall-e/memory/ctm-context-client.js +85 -0
  468. package/template/wall-e/memory/ctm-session-context.js +9 -3
  469. package/template/wall-e/memory/hub-bridge-client.js +388 -0
  470. package/template/wall-e/memory/replica-origin.js +56 -0
  471. package/template/wall-e/memory/session-pool.js +135 -0
  472. package/template/wall-e/runtime/live-capabilities.js +8 -3
  473. package/template/wall-e/server.js +4 -2
  474. package/template/wall-e/shared/release-schema.json +2 -2
  475. package/template/wall-e/shared/sqlite-file-set.js +39 -0
  476. package/template/wall-e/shared/storage/contract.js +3 -0
  477. package/template/wall-e/skills/_templates/delegate-worker/VERSION +1 -1
  478. package/template/wall-e/skills/_templates/delegate-worker/released-sha256.json +7 -1
  479. package/template/wall-e/skills/_templates/delegate-worker/templates/claude/SKILL.md +4 -4
  480. package/template/wall-e/skills/_templates/delegate-worker/templates/codex/SKILL.md +6 -6
  481. package/template/wall-e/skills/_templates/fleet-sync/VERSION +1 -0
  482. package/template/wall-e/skills/_templates/fleet-sync/released-sha256.json +16 -0
  483. package/template/wall-e/skills/_templates/fleet-sync/templates/claude/SKILL.md +64 -0
  484. package/template/wall-e/skills/_templates/fleet-sync/templates/codex/SKILL.md +64 -0
  485. package/template/wall-e/tools/chrome-automation.js +6 -0
  486. package/template/wall-e/training/setup-cuda-train-env.sh +2 -2
  487. package/template/wall-e/workers/brain-owner-worker.js +18 -4
  488. package/template/wall-e/workers/mcp-gateway-process.js +5 -5
@@ -0,0 +1,346 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * WP-7 (docs/remote-agent-skills-bundles-2026-10-25.html §5 D-11, the D-11 decision + cadence rows,
5
+ * §6.2 `GET /api/agent-skills/inventory`, §6.5, the WP-7 row AC-7a..AC-7d): THE RETURN PATH — the box
6
+ * reports the skills it already holds, and the hub classifies each one against its own copy and the
7
+ * base (the tree that box last received).
8
+ *
9
+ * Two halves in one module, because they are two views of one question ("what does the box have that
10
+ * we do not?"):
11
+ *
12
+ * BOX `readBoxInventory({ homeDir, env, dataDir, peerInstanceId })` — enumerate the box's own
13
+ * Claude/Codex skill roots (the SAME enumeration build.js ships: its listers, its walk, its
14
+ * item hash), say which copies CTM owns, and hand back the base for the AUTHENTICATED caller.
15
+ * HUB `classifyBoxSkills({ hubItems, baseItems, boxSkills })` — pure, five rules, first match wins.
16
+ *
17
+ * BASE, not the hub's push record (the lead's superseding adjustment): the hub's push bookkeeping is
18
+ * in-process (`lib/machine-registry.js`'s `_agentBundlePush`) and dies with a restart, so the box —
19
+ * which still holds the tree it was given — carries the base back with its inventory. Classification
20
+ * therefore survives a hub restart.
21
+ *
22
+ * D-11 is "inventory + classification, NEVER auto-copy": nothing here writes to either side, and
23
+ * nothing is ever copied. A box-local skill SHADOWS the hub's added-dir copy of the same name on
24
+ * Claude 2.1.310 (observed: exactly one `zz-collide-*` loaded, the box-local one) — hence
25
+ * `shadows_hub` is a first-class state rather than an assumption that both copies load.
26
+ *
27
+ * AC-7d: a copy CTM itself put there is never classified — `delegate` (the managed-skill installer's
28
+ * own skill) and a pristine WP-6 Codex install both read `managed` and drop out of the matrix. An
29
+ * EDITED agent-bundle copy is the box's own work now, so it reads `managed: null` and IS classified.
30
+ */
31
+
32
+ const os = require('os');
33
+ const path = require('path');
34
+ const fsp = require('fs/promises');
35
+
36
+ const { computeTreeHash, itemHashOfDir, listClaudeSkillItems, listCodexSkillItems } = require('./build');
37
+ const store = require('./store');
38
+ // WP-6's directory hash: the hash a WP-6 marker`sha256` is written from. Deliberately NOT
39
+ // `itemHashOfDir` — a bundle copy is "pristine" when ITS OWN hash still matches what the installer
40
+ // recorded, and those two hashes are different functions of the same bytes (D-14).
41
+ const { dirHash } = require('./codex-install');
42
+ const installer = require('../coding-cli-skill-installer');
43
+
44
+ const { MANAGED_SKILLS } = installer;
45
+ const { readMarker } = installer._internals;
46
+
47
+ /**
48
+ * `source` strings on disk. Both live in modules this one does not own, and both are ON-DISK
49
+ * contract values (a marker is read back by a different process and a different release), so they
50
+ * are restated here as data rather than reached for across module boundaries.
51
+ */
52
+ const INSTALLER_SOURCE = 'ctm-coding-cli-skill-installer'; // lib/coding-cli-skill-installer.js SOURCE
53
+ const AGENT_BUNDLE_SOURCE = 'agent-bundle'; // lib/agent-bundle/codex-install.js SOURCE
54
+
55
+ /**
56
+ * The three manifest entry roots (store.js PATH_PREFIXES, build.js entryPrefix) read BACKWARDS:
57
+ * an entry path is `<prefix><item folder>/<rel file path>`, and the folder segment is what names
58
+ * the item. Order is irrelevant — the three are disjoint.
59
+ */
60
+ const ITEM_PREFIXES = Object.freeze([
61
+ Object.freeze({ prefix: 'claude/.claude/skills/', agent: 'claude', kind: 'skill' }),
62
+ Object.freeze({ prefix: 'plugins/', agent: 'claude', kind: 'plugin' }),
63
+ Object.freeze({ prefix: 'codex/', agent: 'codex', kind: 'skill' }),
64
+ ]);
65
+
66
+ /** The five classification states (§6.5), in rule order. Exported so a test can pin "nothing else". */
67
+ const BOX_SKILL_STATES = Object.freeze([
68
+ 'new_on_box', 'same', 'shadows_hub', 'changed_on_box', 'conflict',
69
+ ]);
70
+
71
+ function _compareStrings(a, b) {
72
+ if (a < b) return -1;
73
+ if (a > b) return 1;
74
+ return 0;
75
+ }
76
+
77
+ async function _statOrNull(target) {
78
+ try {
79
+ return await fsp.stat(target);
80
+ } catch (err) {
81
+ if (err && (err.code === 'ENOENT' || err.code === 'ENOTDIR')) return null;
82
+ throw err; // RETHROW: a real stat fault is the caller's to REPORT
83
+ }
84
+ }
85
+
86
+ async function _realOrPlain(target) {
87
+ try {
88
+ return await fsp.realpath(target);
89
+ } catch (err) {
90
+ if (err && (err.code === 'ENOENT' || err.code === 'ENOTDIR')) return target;
91
+ throw err; // RETHROW: a real resolution fault is the caller's to REPORT
92
+ }
93
+ }
94
+
95
+ async function _readJsonOrNull(target) {
96
+ let text;
97
+ try {
98
+ text = await fsp.readFile(target, 'utf8');
99
+ } catch (err) {
100
+ if (err && (err.code === 'ENOENT' || err.code === 'ENOTDIR')) return null;
101
+ throw err; // RETHROW: a real read fault must not read as "no manifest"
102
+ }
103
+ try {
104
+ const parsed = JSON.parse(text);
105
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : null;
106
+ } catch {
107
+ // expected: a torn/garbled manifest copy is missing information about the base, never a reason to
108
+ // fail the inventory — the base is a hint for classification, not a fact the box must prove.
109
+ return null;
110
+ }
111
+ }
112
+
113
+ /** The box's Claude config dir, by the same rule build.js uses for the hub's own. */
114
+ function claudeConfigDir(homeDir, env) {
115
+ const configured = env && typeof env.CLAUDE_CONFIG_DIR === 'string' ? env.CLAUDE_CONFIG_DIR.trim() : '';
116
+ return configured || path.join(homeDir, '.claude');
117
+ }
118
+
119
+ /** The box's Codex home, by the same rule build.js uses (`$CODEX_HOME`, else `<home>/.codex`). */
120
+ function codexHomeDir(homeDir, env) {
121
+ const configured = env && typeof env.CODEX_HOME === 'string' ? env.CODEX_HOME.trim() : '';
122
+ return configured || path.join(homeDir, '.codex');
123
+ }
124
+
125
+ /**
126
+ * The skill roots this inventory enumerates, in build.js's order, realpath'd when they exist (a
127
+ * Dropbox-symlinked `.claude` is the observed real shape). The Codex `.agents` root and a
128
+ * `$CODEX_HOME` that resolves to the same directory are one root, never two rows.
129
+ */
130
+ async function _rootsFor(homeDir, env) {
131
+ const claudeRoot = await _realOrPlain(path.join(claudeConfigDir(homeDir, env), 'skills'));
132
+ const agentsRoot = path.join(homeDir, '.agents', 'skills');
133
+ const codexRoots = [agentsRoot];
134
+ const configuredRoot = path.join(codexHomeDir(homeDir, env), 'skills');
135
+ if (configuredRoot !== agentsRoot) codexRoots.push(configuredRoot);
136
+ const roots = [{ agent: 'claude', root: claudeRoot }];
137
+ for (const root of codexRoots) roots.push({ agent: 'codex', root: await _realOrPlain(root) });
138
+ return roots;
139
+ }
140
+
141
+ /**
142
+ * AC-7d + §6.2: who owns this copy on the box.
143
+ *
144
+ * 'ctm-managed' a `MANAGED_SKILLS` name (the managed-skill installer's `delegate`), or a marker
145
+ * the installer itself wrote — CTM's own release, never the hub's bundle.
146
+ * 'agent-bundle' a WP-6 Codex install of THIS hub's tree whose bytes still hash to the marker's
147
+ * `sha256` — it IS the hub's bundle, not the box's own work.
148
+ * null anything else: a user-authored skill, another installer's copy, or an
149
+ * agent-bundle copy the box has EDITED since (that is box work now, and D-11
150
+ * exists precisely to surface it).
151
+ */
152
+ async function _managedFor(item) {
153
+ if (Object.hasOwn(MANAGED_SKILLS, item.name)) return 'ctm-managed';
154
+ const marker = await readMarker(item.rootDir, item.name);
155
+ if (!marker) return null;
156
+ if (marker.source === INSTALLER_SOURCE) return 'ctm-managed';
157
+ if (marker.source !== AGENT_BUNDLE_SOURCE) return null;
158
+ const current = await dirHash(item.rootDir);
159
+ return typeof marker.sha256 === 'string' && marker.sha256 === current ? 'agent-bundle' : null;
160
+ }
161
+
162
+ /**
163
+ * §6.2 base: the item list of the tree the box currently holds for the CALLING hub, derived from the
164
+ * manifest copy the store keeps beside the materialized tree (`trees/<hex>.manifest.json`).
165
+ *
166
+ * The derivation is the inverse of build.js's `entryPrefix`: strip the item prefix, take the first
167
+ * segment as the item folder, keep the rest as the item-relative path — then hash exactly the entry
168
+ * shape build.js hashes, so `baseItems[i].itemHash` IS `buildAgentBundle(...).items[i].itemHash` for
169
+ * the same tree (`tests/agent-bundle-inventory.test.js` proves it against a fixture bundle).
170
+ *
171
+ * @returns {Array<{agent: string, kind: string, name: string, itemHash: string}>}
172
+ */
173
+ function baseItemsFromManifest(manifest) {
174
+ const entries = manifest && Array.isArray(manifest.entries) ? manifest.entries : [];
175
+ const groups = new Map();
176
+ for (const entry of entries) {
177
+ if (!entry || typeof entry.path !== 'string') continue;
178
+ const matched = ITEM_PREFIXES.find((candidate) => entry.path.startsWith(candidate.prefix));
179
+ if (!matched) continue;
180
+ const rest = entry.path.slice(matched.prefix.length);
181
+ const slash = rest.indexOf('/');
182
+ if (slash <= 0) continue; // no folder segment: not an item
183
+ const name = rest.slice(0, slash);
184
+ const rel = rest.slice(slash + 1);
185
+ if (!rel) continue;
186
+ const key = `${matched.agent}\0${matched.kind}\0${name}`;
187
+ if (!groups.has(key)) {
188
+ groups.set(key, { agent: matched.agent, kind: matched.kind, name, files: [] });
189
+ }
190
+ groups.get(key).files.push({ path: rel, mode: entry.mode, sha256: entry.sha256, size: entry.size });
191
+ }
192
+ return [...groups.values()]
193
+ .map((group) => ({
194
+ agent: group.agent,
195
+ kind: group.kind,
196
+ name: group.name,
197
+ itemHash: computeTreeHash(group.files),
198
+ }))
199
+ .sort((a, b) => _compareStrings(a.agent, b.agent)
200
+ || _compareStrings(a.kind, b.kind)
201
+ || _compareStrings(a.name, b.name));
202
+ }
203
+
204
+ /** The base block for one authenticated hub: `{treeHash, items}`, or the empty base when it has none. */
205
+ async function _baseFor(dataDir, peerInstanceId) {
206
+ const empty = { treeHash: null, items: [] };
207
+ if (!dataDir || !peerInstanceId) return empty;
208
+ const treeHash = await store.currentHubTree(dataDir, peerInstanceId);
209
+ if (!treeHash) return empty;
210
+ const manifest = await _readJsonOrNull(
211
+ path.join(store.storeRoot(dataDir), 'trees', `${treeHash.replace(/^sha256:/, '')}.manifest.json`),
212
+ );
213
+ if (!manifest) return { treeHash, items: [] };
214
+ return { treeHash, items: baseItemsFromManifest(manifest) };
215
+ }
216
+
217
+ /**
218
+ * §6.2 `GET /api/agent-skills/inventory`: the box's own skill truth, plus the base for the
219
+ * AUTHENTICATED caller (never a body/query field — lib/api/agent-bundles.js reads
220
+ * `req.ctmAuth.peerInstanceId`).
221
+ *
222
+ * Read-only, and never a write to the box user's `~/.claude` (D-1): the box's roots are ENUMERATED
223
+ * here exactly as build.js enumerates the hub's (`synced/` and `.system` excluded by the shared
224
+ * listers), and each item is hashed with build.js's own `itemHashOfDir`.
225
+ *
226
+ * @param {object} opts
227
+ * @param {string} [opts.homeDir=os.homedir()] the box user's home
228
+ * @param {NodeJS.ProcessEnv} [opts.env=process.env]
229
+ * @param {string|null} [opts.dataDir] the box's CTM data dir (null ⇒ no base to report)
230
+ * @param {string} [opts.peerInstanceId] the AUTHENTICATED hub
231
+ * @param {() => number} [opts.now=Date.now] injected clock, so no test needs a sleep
232
+ * @returns {Promise<{platform: string, checkedAt: number, roots: object[], skills: object[],
233
+ * base: {treeHash: string|null, items: object[]}}>}
234
+ */
235
+ async function readBoxInventory({
236
+ homeDir = os.homedir(),
237
+ env = process.env,
238
+ dataDir = null,
239
+ peerInstanceId = '',
240
+ now = Date.now,
241
+ } = {}) {
242
+ const resolvedHome = String(homeDir == null ? '' : homeDir).replace(/\/+$/, '') || '/';
243
+ const configDir = claudeConfigDir(resolvedHome, env);
244
+ const [roots, claudeItems, codexItems, base] = await Promise.all([
245
+ _rootsFor(resolvedHome, env),
246
+ listClaudeSkillItems(configDir),
247
+ listCodexSkillItems(resolvedHome, env),
248
+ _baseFor(dataDir, String(peerInstanceId == null ? '' : peerInstanceId).trim()),
249
+ ]);
250
+
251
+ const skills = [];
252
+ for (const item of [...claudeItems, ...codexItems]) {
253
+ const stat = await _statOrNull(item.rootDir);
254
+ if (!stat || !stat.isDirectory()) continue; // vanished between enumeration and hashing
255
+ const itemHash = await itemHashOfDir(item.rootDir);
256
+ if (itemHash === null) continue; // vanished mid-walk: not an item this time
257
+ skills.push({
258
+ agent: item.agent,
259
+ name: item.name,
260
+ itemHash,
261
+ managed: await _managedFor(item),
262
+ mtimeMs: stat.mtimeMs,
263
+ });
264
+ }
265
+ skills.sort((a, b) => _compareStrings(a.agent, b.agent) || _compareStrings(a.name, b.name));
266
+
267
+ return {
268
+ platform: process.platform,
269
+ checkedAt: Number(typeof now === 'function' ? now() : Date.now()) || 0,
270
+ roots,
271
+ skills,
272
+ base,
273
+ };
274
+ }
275
+
276
+ function _skillKey(agent, name) {
277
+ return `${agent}\0${name}`;
278
+ }
279
+
280
+ function _skillItems(items) {
281
+ const map = new Map();
282
+ for (const item of Array.isArray(items) ? items : []) {
283
+ // §6.5: Claude PLUGINS are never box inventory — the box reports skills only, so a plugin item
284
+ // can never be the hub-side counterpart of a box row. Filtered here rather than at each call.
285
+ if (!item || item.kind !== 'skill' || typeof item.name !== 'string') continue;
286
+ map.set(_skillKey(item.agent, item.name), item.itemHash);
287
+ }
288
+ return map;
289
+ }
290
+
291
+ /**
292
+ * §6.5/AC-7a: classify every UNMANAGED box skill against the hub's copy and the base. Pure — no I/O,
293
+ * no clock, no state — so the five rules are provable from a fixture matrix alone.
294
+ *
295
+ * Rules, IN ORDER (first match wins; `(agent, name)` is the matching key):
296
+ * 1. no hub item -> `new_on_box` the hub has nothing here; Import would add it
297
+ * 2. box == hub -> `same` the box copy is redundant; Retire is offered
298
+ * 3. box == base && hub != base -> `shadows_hub` the box copy HIDES the hub's newer one
299
+ * 4. hub == base && box != base -> `changed_on_box` the box edited its copy; Import fast-forwards
300
+ * 5. otherwise -> `conflict` both moved: the user picks
301
+ *
302
+ * AC-7d: a managed copy (`managed: 'ctm-managed' | 'agent-bundle'`) is never classified — CTM put it
303
+ * there, so it is not a proposal the user is being asked to review.
304
+ *
305
+ * @returns {Array<{agent: string, name: string, state: string, boxHash: string, hubHash: string|null,
306
+ * baseHash: string|null}>} sorted by (agent, name)
307
+ */
308
+ function classifyBoxSkills({ hubItems = [], baseItems = [], boxSkills = [] } = {}) {
309
+ const hub = _skillItems(hubItems);
310
+ const base = _skillItems(baseItems);
311
+ const rows = [];
312
+ for (const box of Array.isArray(boxSkills) ? boxSkills : []) {
313
+ if (!box || typeof box.name !== 'string') continue;
314
+ if (box.managed !== null && box.managed !== undefined) continue; // AC-7d
315
+ const key = _skillKey(box.agent, box.name);
316
+ const boxHash = box.itemHash;
317
+ const hubHash = hub.has(key) ? hub.get(key) : null;
318
+ const baseHash = base.has(key) ? base.get(key) : null;
319
+ let state;
320
+ if (hubHash === null) state = 'new_on_box';
321
+ else if (boxHash === hubHash) state = 'same';
322
+ else if (boxHash === baseHash && hubHash !== baseHash) state = 'shadows_hub';
323
+ else if (hubHash === baseHash && boxHash !== baseHash) state = 'changed_on_box';
324
+ else state = 'conflict';
325
+ rows.push({ agent: box.agent, name: box.name, state, boxHash, hubHash, baseHash });
326
+ }
327
+ rows.sort((a, b) => _compareStrings(a.agent, b.agent) || _compareStrings(a.name, b.name));
328
+ return rows;
329
+ }
330
+
331
+ module.exports = {
332
+ BOX_SKILL_STATES,
333
+ ITEM_PREFIXES,
334
+ // The box half. `itemHashOfDir` is build.js's own (re-exported, never re-implemented) so a box
335
+ // item hash and a hub item hash of identical bytes are the same number by construction.
336
+ itemHashOfDir,
337
+ // WP-8: the export/retire legs resolve the SAME roots and apply the SAME ownership rules as this
338
+ // inventory, so "the same skill" and "is it exportable" cannot drift between the rows the hub
339
+ // renders and the folder the box moves aside.
340
+ claudeConfigDir,
341
+ managedStateOf: _managedFor,
342
+ baseItemsFromManifest,
343
+ readBoxInventory,
344
+ // The hub half.
345
+ classifyBoxSkills,
346
+ };