@humwick/server 0.130.1 → 0.130.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 (811) hide show
  1. package/README.md +5 -0
  2. package/bundled/prompts/manifest.json +1 -0
  3. package/bundled/prompts/task.hydration.md +1 -1
  4. package/bundled/roles/builder.md +1 -1
  5. package/docs/guides/sub-coordinators.md +12 -5
  6. package/docs/guides/tools-administration.md +4 -0
  7. package/docs/guides/tools-coordination.md +2 -0
  8. package/docs/guides/tools-tasks.md +8 -0
  9. package/docs/guides/workflows.md +74 -0
  10. package/docs/openapi.json +486 -4
  11. package/package.json +10 -18
  12. package/public/assets/{MessageBubble-BWpoBjl4.js → MessageBubble-Bq9kr21N.js} +2 -2
  13. package/public/assets/{PlanGraphPanel-C0auck3n.js → PlanGraphPanel-Dqiroy06.js} +2 -2
  14. package/public/assets/{TraceView-DBnOx7AQ.js → TraceView-DYU962-H.js} +2 -2
  15. package/public/assets/{VaultDecisionCard-0kp2oNBC.js → VaultDecisionCard-DhPfzioE.js} +2 -2
  16. package/public/assets/{activity-yLztXEBt.js → activity-DzCcQTee.js} +2 -2
  17. package/public/assets/{agent-lineage-BbJDR1dW.js → agent-lineage-SgDt9i3T.js} +2 -2
  18. package/public/assets/agent-liveness-Bq-s73jW.js +2 -0
  19. package/public/assets/{agent-name-CTZBrSD9.js → agent-name-CcY3Aijy.js} +2 -2
  20. package/public/assets/agent-profiles-cxtRBn6O.js +2 -0
  21. package/public/assets/{agent-project-badge-9TqzUUYE.js → agent-project-badge-DGYbIhaI.js} +2 -2
  22. package/public/assets/{agent-tools-D4n40pn8.js → agent-tools-DHbftV0N.js} +2 -2
  23. package/public/assets/{agent-type-icon-D6FUarOf.js → agent-type-icon-CY113sp-.js} +2 -2
  24. package/public/assets/{agents-BYDslkJc.js → agents-BPzY7IlQ.js} +2 -2
  25. package/public/assets/{analytics-B-XSbEMC.js → analytics-DENFPv_a.js} +2 -2
  26. package/public/assets/{artifact-viewer-DdWIfV6M.js → artifact-viewer-KRvSc7sl.js} +2 -2
  27. package/public/assets/{artifacts-DPN1q4pA.js → artifacts-C9gSmL3s.js} +2 -2
  28. package/public/assets/{artifacts-oBOqks-2.js → artifacts-DT-HkI5O.js} +2 -2
  29. package/public/assets/{automation-4KcRFXEu.js → automation-BsmjQhKD.js} +2 -2
  30. package/public/assets/{backlog-Cw9xPTCF.js → backlog-8NYH_62t.js} +2 -2
  31. package/public/assets/{busy-health-CTu32MZt.js → busy-health-D3hwvYb4.js} +2 -2
  32. package/public/assets/{channels-BiXzg1G9.js → channels-DCJ5WL7O.js} +2 -2
  33. package/public/assets/{chat-Ctk2qwvA.js → chat-DAIl357U.js} +3 -3
  34. package/public/assets/{code-preview-Bm1wWqAp.js → code-preview-CzrZfr9U.js} +2 -2
  35. package/public/assets/{connectors-C36ax4Vw.js → connectors-xTxtlyou.js} +2 -2
  36. package/public/assets/{cosmos-Jj9LK2Wf.js → cosmos-BpebFLK2.js} +2 -2
  37. package/public/assets/{crate-agent-H6S7-B9T.js → crate-agent-BHvI5wXC.js} +2 -2
  38. package/public/assets/{dependency-graph-Cd1E23wa.js → dependency-graph-DGT0o3wJ.js} +2 -2
  39. package/public/assets/{deploys-Bwfq146q.js → deploys-hqWOHSHE.js} +2 -2
  40. package/public/assets/{display-CfO7rTuF.js → display-CDeH4I8T.js} +2 -2
  41. package/public/assets/{files-DhhZI2Ih.js → files-BTeGVmTg.js} +2 -2
  42. package/public/assets/{fleet-B_rFEbnL.js → fleet-DgXtNgCa.js} +2 -2
  43. package/public/assets/{fleet-metrics-BkHP-P3R.js → fleet-metrics-BHEt5yc_.js} +2 -2
  44. package/public/assets/{formatted-body-Cm1RrzmN.js → formatted-body-MLtodyPp.js} +3 -3
  45. package/public/assets/{formatted-body-impl-DQiOuOD1.js → formatted-body-impl-CAe664Z8.js} +2 -2
  46. package/public/assets/{host-providers-dialog-CHqwXTov.js → host-providers-dialog-mapF4Fj9.js} +2 -2
  47. package/public/assets/index-CqqgOI5R.js +15 -0
  48. package/public/assets/index-MYAIwYTX.css +2 -0
  49. package/public/assets/{insights-fH1EL-qZ.js → insights-DNyf7IzF.js} +2 -2
  50. package/public/assets/{integrations-C5Oix6ng.js → integrations-DlYOHq7T.js} +2 -2
  51. package/public/assets/{issue-ref-chip-ODyondIa.js → issue-ref-chip-CeWBNWn7.js} +2 -2
  52. package/public/assets/{log-viewer-Cvfy6PW7.js → log-viewer-Cib8nqdE.js} +2 -2
  53. package/public/assets/{maintenance-D8CDH5wZ.js → maintenance-DSn1cPm7.js} +2 -2
  54. package/public/assets/{managed-agents-egllbpij.js → managed-agents-C3CkM81m.js} +2 -2
  55. package/public/assets/{markdown-preview-CYSFgVgK.js → markdown-preview-W4VQQPAv.js} +3 -3
  56. package/public/assets/{markdown-preview-impl-BteVIjX4.js → markdown-preview-impl-CMsTdhjq.js} +2 -2
  57. package/public/assets/{memory-C8WmXsyr.js → memory-BV17qtO4.js} +2 -2
  58. package/public/assets/{messages-BzQdqlO6.js → messages-Bm_1AqSA.js} +2 -2
  59. package/public/assets/{orchestrators-B1HxzkNw.js → orchestrators-Dg-vfP09.js} +2 -2
  60. package/public/assets/{overview-DCUnI4Z7.js → overview-DcYCrvlr.js} +2 -2
  61. package/public/assets/{pairs-ftCd2XcD.js → pairs-8o9nuG3V.js} +2 -2
  62. package/public/assets/{profile-icon-B2zH8DMH.js → profile-icon-BsRyBMea.js} +2 -2
  63. package/public/assets/project-profile-instructions-DETKFn_E.js +2 -0
  64. package/public/assets/projects-M_m6AHws.js +2 -0
  65. package/public/assets/{prompt-settings-Bftq9czX.js → prompt-settings-C_mNCgeL.js} +2 -2
  66. package/public/assets/provider-display-BEeLXC_D.js +2 -0
  67. package/public/assets/{registry-DWCU5c8q.js → registry-DDHHHE5N.js} +2 -2
  68. package/public/assets/run-card-Dt4I4jaP.js +2 -0
  69. package/public/assets/scroll-text-BKXS1ahr.js +2 -0
  70. package/public/assets/{secrets-C7GIUATz.js → secrets-BkVwxI5O.js} +2 -2
  71. package/public/assets/{service-access-settings-C3aujqTG.js → service-access-settings-Crq-6a-B.js} +2 -2
  72. package/public/assets/{settings-C6sZ9eBa.js → settings-CYcavMFu.js} +2 -2
  73. package/public/assets/shipping-H6gzEeZB.js +2 -0
  74. package/public/assets/{stats-V9Z-GxUd.js → stats-BJVeWkpV.js} +2 -2
  75. package/public/assets/{status-dot-CVv0iGHL.js → status-dot-BcHyw1Vw.js} +2 -2
  76. package/public/assets/store-DKPDIZBe.js +9 -0
  77. package/public/assets/{tasks-CXU75HRF.js → tasks-qJjlQPpx.js} +2 -2
  78. package/public/assets/{teams-BPf976zb.js → teams-Cd5Sk1uX.js} +2 -2
  79. package/public/assets/{terminal-viewer-DE9BOe-8.js → terminal-viewer-CpY5_m7W.js} +3 -3
  80. package/public/assets/{terminal-viewer-impl-D04pjmGh.js → terminal-viewer-impl-DI_2llFR.js} +2 -2
  81. package/public/assets/token-estimate-Co-Jdphh.js +2 -0
  82. package/public/assets/{use-agent-terminal-B1yR456R.js → use-agent-terminal-0yJA_buM.js} +2 -2
  83. package/public/assets/{use-decisions-D-S4tpDf.js → use-decisions-uJXHf34W.js} +2 -2
  84. package/public/assets/use-project-list-CpWl6eHQ.js +2 -0
  85. package/public/assets/{use-selectors-CnrAk2YP.js → use-selectors-BdxBW8mL.js} +2 -2
  86. package/public/assets/{user-avatar-nBFIcR4M.js → user-avatar-3IndfpOc.js} +2 -2
  87. package/public/assets/versioned-prompt-editor-CIVg7XB1.js +8 -0
  88. package/public/assets/{work-queue-TCjJxeT-.js → work-queue-B9rnLwHZ.js} +2 -2
  89. package/public/assets/{workflow-marker-Cf3Hf2fN.js → workflow-marker-X8wxyhzC.js} +2 -2
  90. package/public/assets/{workflows-CXQX20Qj.js → workflows-o5YyMFW7.js} +2 -2
  91. package/public/assets/{workspaces-qSYzKYMA.js → workspaces-CzEGoAng.js} +2 -2
  92. package/public/cosmos.html +4 -4
  93. package/public/index.html +31 -29
  94. package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
  95. package/runner/plugins/claude/hooks/gate-run-guard.provisioned.mjs +31 -1
  96. package/runner/src/adapters/claude-effort.ts +2 -4
  97. package/runner/src/adapters/claude-headless.ts +1 -1
  98. package/runner/src/adapters/claude-launch-exit.ts +26 -0
  99. package/runner/src/adapters/claude-session-probe.ts +1 -1
  100. package/runner/src/adapters/claude-tmux.ts +38 -10
  101. package/runner/src/adapters/claude.ts +28 -75
  102. package/runner/src/adapters/codex-launch-config.ts +4 -5
  103. package/runner/src/adapters/codex.ts +1 -1
  104. package/runner/src/adapters/opencode-provider.ts +7 -22
  105. package/runner/src/adapters/opencode.ts +4 -4
  106. package/runner/src/adapters/provider-quota-harvest.ts +20 -71
  107. package/runner/src/agent-runner/credentials.ts +42 -12
  108. package/runner/src/agent-runner/inbox.ts +27 -0
  109. package/runner/src/agent-runner/lifecycle-milestones.ts +2 -4
  110. package/runner/src/agent-runner/liveness-exchange.ts +104 -0
  111. package/runner/src/bin/claude.ts +4 -0
  112. package/runner/src/bin/codex.ts +4 -0
  113. package/runner/src/bin/opencode.ts +4 -0
  114. package/runner/src/claude-system-prompt.ts +49 -0
  115. package/runner/src/index.ts +5 -2
  116. package/runner/src/launch-assembly.ts +14 -10
  117. package/runner/src/profile-home.ts +1 -1
  118. package/runner/src/project-instructions.ts +2 -2
  119. package/runner/src/provider-command.ts +18 -0
  120. package/runner/src/provider-setup.ts +35 -0
  121. package/runner/src/providers.ts +2 -1
  122. package/runner/src/runner-core.ts +32 -38
  123. package/runner/src/runner-helpers.ts +0 -8
  124. package/runner/src/session-scratch.ts +6 -2
  125. package/runner/src/spawn-input.ts +2 -1
  126. package/runner/src/test-run-dedup.ts +59 -56
  127. package/runner/test-support/provisioning-context.ts +4 -2
  128. package/runner/test-support/runner-harness.ts +2 -1
  129. package/scripts/cd-config.ts +8 -0
  130. package/scripts/gate-run-lease.ts +10 -7
  131. package/scripts/gate.sh +5 -1
  132. package/scripts/steward-policy-cleanup.ts +2 -2
  133. package/src/agent-authz.ts +2 -2
  134. package/src/agent-drive-arbiter.ts +3 -8
  135. package/src/agent-exit-cleanup-async.ts +2 -2
  136. package/src/agent-exit-cleanup.ts +23 -19
  137. package/src/agent-lifecycle-events.ts +112 -85
  138. package/src/agent-ref.ts +3 -2
  139. package/src/agent-status-events.ts +43 -14
  140. package/src/auth/password.ts +4 -3
  141. package/src/auth/session-refresh.ts +1 -1
  142. package/src/auth/session.test-fixture.ts +2 -2
  143. package/src/auth/session.ts +7 -7
  144. package/src/automations/crud.ts +8 -81
  145. package/src/automations/dispatch.ts +33 -58
  146. package/src/automations/index.ts +1 -1
  147. package/src/automations/persistence.ts +65 -0
  148. package/src/automations/precheck.ts +18 -16
  149. package/src/automations/read-async.ts +11 -0
  150. package/src/automations/reconcile.ts +30 -39
  151. package/src/automations/storage.ts +33 -10
  152. package/src/automations/write-async.ts +33 -0
  153. package/src/branch-land-notice.ts +93 -0
  154. package/src/branch-landed.ts +31 -98
  155. package/src/bus.ts +40 -39
  156. package/src/cd-deploy-notify.ts +32 -4
  157. package/src/cd-host-lag-notify.ts +7 -6
  158. package/src/ci/incidents.ts +2 -2
  159. package/src/ci/monitor.ts +5 -8
  160. package/src/ci/notifications.ts +4 -4
  161. package/src/ci/root-missing.ts +4 -9
  162. package/src/ci/transition-notify.ts +12 -44
  163. package/src/claude-app/oauth-http.ts +3 -3
  164. package/src/cli/cd-pauses.ts +19 -0
  165. package/src/cli/orchestrator.ts +1 -1
  166. package/src/cli/state.ts +2 -19
  167. package/src/cli/task-edit.ts +22 -0
  168. package/src/cli/task.ts +3 -1
  169. package/src/cli/workflow.ts +19 -4
  170. package/src/commands-db.ts +7 -7
  171. package/src/commands-write.ts +8 -0
  172. package/src/compaction-watch.ts +10 -8
  173. package/src/config-store-write.ts +13 -1
  174. package/src/config-store.ts +25 -14
  175. package/src/config.ts +4 -11
  176. package/src/connectors.ts +10 -8
  177. package/src/context-advisory.ts +22 -21
  178. package/src/db/activity-async.ts +6 -1
  179. package/src/db/activity-write-ops.ts +12 -1
  180. package/src/db/activity.ts +1 -14
  181. package/src/db/agent-action-write.ts +36 -0
  182. package/src/db/agent-control-async.ts +9 -0
  183. package/src/db/agent-control-write.ts +49 -0
  184. package/src/db/agent-effort-observe.ts +22 -0
  185. package/src/db/agent-meta.ts +14 -3
  186. package/src/db/agent-search.ts +1 -15
  187. package/src/db/agents-async.ts +59 -9
  188. package/src/db/agents-write-ops.ts +12 -3
  189. package/src/db/agents.ts +95 -65
  190. package/src/db/auth-identities.ts +2 -2
  191. package/src/db/automation-read-ops.ts +11 -0
  192. package/src/db/automation-write-ops.ts +46 -0
  193. package/src/db/blackboard.ts +2 -2
  194. package/src/db/browser-session-write.ts +32 -0
  195. package/src/db/bus-outbox-write-ops.ts +3 -1
  196. package/src/db/checkout-refresh-schema.ts +47 -0
  197. package/src/db/checkout-refresh.ts +5 -5
  198. package/src/db/ci-incidents-async.ts +5 -5
  199. package/src/db/ci-incidents-write-ops.ts +2 -2
  200. package/src/db/command-agent-profile-backfill.ts +39 -0
  201. package/src/db/command-agent-profiles.ts +5 -1
  202. package/src/db/command-retention.ts +126 -0
  203. package/src/db/command-row.ts +10 -2
  204. package/src/db/commands-list-query.ts +2 -0
  205. package/src/db/commands-planner-stats.test-fixture.ts +8 -0
  206. package/src/db/commands-read-ops.ts +16 -0
  207. package/src/db/commands-spawn-read.ts +1 -1
  208. package/src/db/config-store-write-ops.ts +7 -2
  209. package/src/db/connection.ts +1 -182
  210. package/src/db/context-carry-write.ts +74 -0
  211. package/src/db/continuation-archives-async.ts +5 -0
  212. package/src/db/continuation-archives-write-ops.ts +7 -0
  213. package/src/db/continuations.ts +6 -6
  214. package/src/db/db-error-registry.ts +12 -0
  215. package/src/db/db-writer-worker.ts +8 -1
  216. package/src/db/deploy-events-async.ts +1 -0
  217. package/src/db/deploy-events-read-ops.ts +2 -1
  218. package/src/db/deploy-events.ts +35 -4
  219. package/src/db/gateway.ts +26 -133
  220. package/src/db/history-retention-ops.ts +13 -0
  221. package/src/db/hosts-registration.ts +10 -2
  222. package/src/db/hosts.ts +9 -6
  223. package/src/db/inbox-async.ts +2 -2
  224. package/src/db/inbox-read-ops.ts +1 -1
  225. package/src/db/inbox.ts +9 -17
  226. package/src/db/index.ts +2 -0
  227. package/src/db/integrations-async.ts +8 -0
  228. package/src/db/integrations-ops.ts +15 -0
  229. package/src/db/integrations.ts +15 -21
  230. package/src/db/issue-associations.ts +2 -2
  231. package/src/db/issue-lifecycle.ts +3 -4
  232. package/src/db/issue-refs-async.ts +23 -0
  233. package/src/db/issue-refs-read-ops.ts +6 -0
  234. package/src/db/issue-refs-write-ops.ts +29 -0
  235. package/src/db/issue-refs.ts +15 -16
  236. package/src/db/kernel-event-log-schema.ts +2 -0
  237. package/src/db/land-boundaries.ts +51 -5
  238. package/src/db/land-gate-attestations.ts +2 -2
  239. package/src/db/landing-receipts.ts +2 -2
  240. package/src/db/lifecycle-context-write.ts +5 -0
  241. package/src/db/lifecycle-tail-async.ts +76 -0
  242. package/src/db/lifecycle-tail-write-ops.ts +62 -0
  243. package/src/db/lifecycle-write-window.ts +2 -1
  244. package/src/db/lineage-pair-dedupe-sql.ts +3 -3
  245. package/src/db/long-running-work.ts +2 -2
  246. package/src/db/main-connection-mode.ts +11 -0
  247. package/src/db/main-connection-writes.ts +41 -2
  248. package/src/db/maintenance-job-reconcile.ts +61 -0
  249. package/src/db/maintenance-job-runs-async.ts +14 -0
  250. package/src/db/maintenance-job-write-ops.ts +9 -0
  251. package/src/db/maintenance-pauses.ts +2 -2
  252. package/src/db/mappers.ts +2 -14
  253. package/src/db/merge-lease.ts +1 -15
  254. package/src/db/message-send.ts +4 -0
  255. package/src/db/messages.ts +31 -25
  256. package/src/db/migrations.ts +25 -16
  257. package/src/db/notification-write-ops.ts +19 -0
  258. package/src/db/operator-answer-write.ts +19 -0
  259. package/src/db/orchestrators.ts +14 -76
  260. package/src/db/pairs-async.ts +22 -1
  261. package/src/db/pairs-write-ops.ts +8 -3
  262. package/src/db/pairs.ts +42 -61
  263. package/src/db/plan-dispatch-schema.ts +5 -1
  264. package/src/db/plan-ready-notices.ts +43 -0
  265. package/src/db/plan-tools-include-migration.ts +36 -0
  266. package/src/db/plans-write-ops.ts +2 -0
  267. package/src/db/presence-buffer.ts +5 -0
  268. package/src/db/presence-loop.ts +18 -23
  269. package/src/db/presence-write.ts +0 -6
  270. package/src/db/project-entries-async.ts +14 -0
  271. package/src/db/project-entries-read-ops.ts +5 -1
  272. package/src/db/project-entries-write-ops.ts +8 -0
  273. package/src/db/project-entries.ts +15 -12
  274. package/src/db/project-journal.ts +2 -2
  275. package/src/db/project-profile-instructions.ts +50 -0
  276. package/src/db/project-trust-approvals.ts +2 -2
  277. package/src/db/prompt-templates.ts +4 -4
  278. package/src/db/prompt-versions.ts +9 -2
  279. package/src/db/provider-config-history.ts +8 -3
  280. package/src/db/provider-model-seed.ts +34 -0
  281. package/src/db/read-op-marshaling-fixtures.ts +23 -0
  282. package/src/db/read-ops.ts +8 -0
  283. package/src/db/retention.ts +13 -2
  284. package/src/db/review-publish-write.ts +8 -0
  285. package/src/db/routing-policy.ts +2 -3
  286. package/src/db/runtime-admin-async.ts +19 -0
  287. package/src/db/runtime-admin-write-ops.ts +36 -0
  288. package/src/db/runtime-tail-async.ts +288 -0
  289. package/src/db/runtime-tail-write-ops.ts +97 -0
  290. package/src/db/schema.ts +13 -4
  291. package/src/db/spawn-budget.ts +5 -0
  292. package/src/db/spawn-delegation-state.ts +11 -4
  293. package/src/db/spawn-delegation.ts +1 -11
  294. package/src/db/sql-audit-indexes.ts +3 -0
  295. package/src/db/stats-async.ts +9 -6
  296. package/src/db/task-entity.ts +28 -6
  297. package/src/db/task-list.ts +3 -1
  298. package/src/db/tasks.ts +1 -17
  299. package/src/db/team-claim-policy.ts +60 -0
  300. package/src/db/teams-async.ts +4 -0
  301. package/src/db/teams-write-ops.ts +4 -0
  302. package/src/db/terminal-events.ts +15 -0
  303. package/src/db/timer-cutover-bodies.ts +292 -0
  304. package/src/db/timer-cutover-core.ts +37 -278
  305. package/src/db/timer-cutover-state.ts +40 -0
  306. package/src/db/timer-cutover-write-ops.ts +1 -40
  307. package/src/db/timer-ingress.ts +7 -1
  308. package/src/db/token-db-write-ops.ts +19 -0
  309. package/src/db/token-standing-async.ts +12 -0
  310. package/src/db/token-standing.ts +21 -20
  311. package/src/db/token-usage-retention.ts +33 -0
  312. package/src/db/token-usage-write-ops.ts +1 -1
  313. package/src/db/token-usage.ts +4 -1
  314. package/src/db/user-invites-async.ts +13 -0
  315. package/src/db/user-invites.ts +3 -3
  316. package/src/db/users.ts +14 -6
  317. package/src/db/workflow-contact.ts +1 -1
  318. package/src/db/workflow-task-read-ops.ts +30 -0
  319. package/src/db/workspaces.ts +8 -5
  320. package/src/db/write-ops.ts +37 -12
  321. package/src/db/writer-fault-seam.ts +2 -9
  322. package/src/db/writer-fault-test-ops.ts +18 -0
  323. package/src/db/writer-gateway.ts +58 -56
  324. package/src/dev.ts +8 -3
  325. package/src/dispatch-availability.ts +10 -6
  326. package/src/ephemeral/{landing-ingress-proof-worker.ts → landing-ingress-proof.test-fixture.ts} +4 -2
  327. package/src/event-loop-lag.ts +4 -2
  328. package/src/event-loop-yield.ts +2 -2
  329. package/src/events.ts +10 -8
  330. package/src/host/disk-alert.ts +121 -0
  331. package/src/host-provider-store.ts +5 -4
  332. package/src/hub-metrics-report.ts +5 -1
  333. package/src/hub-metrics.ts +38 -18
  334. package/src/injection-sweep-pacing.ts +6 -8
  335. package/src/land-gate-notifications.ts +11 -10
  336. package/src/land-gate-queue-progress.ts +3 -3
  337. package/src/land-settle-dispatch.ts +52 -92
  338. package/src/lifecycle-context-pressure.ts +11 -10
  339. package/src/lifecycle-manager.ts +107 -100
  340. package/src/maintenance/breaker.ts +18 -16
  341. package/src/maintenance/cd-watcher.ts +3 -3
  342. package/src/maintenance/checkout-refresh.ts +18 -1
  343. package/src/maintenance/critical-job-watchdog.ts +19 -20
  344. package/src/maintenance/events.ts +3 -3
  345. package/src/maintenance/history-retention-job.ts +30 -0
  346. package/src/maintenance/index.ts +1 -0
  347. package/src/maintenance/jobs.ts +32 -69
  348. package/src/maintenance/long-running-work.ts +3 -1
  349. package/src/maintenance/offline-agent-prune-job.ts +28 -0
  350. package/src/maintenance/orphaned-sessions.ts +5 -4
  351. package/src/maintenance/pauses.ts +4 -10
  352. package/src/maintenance/plan-ready-notice-job.ts +71 -0
  353. package/src/maintenance/scheduler.ts +98 -137
  354. package/src/maintenance/stalled-delivery-pager.ts +10 -9
  355. package/src/maintenance/teams.ts +19 -30
  356. package/src/maintenance/workspaces.ts +18 -28
  357. package/src/managed-policy-escalation.ts +7 -7
  358. package/src/managed-policy.ts +32 -28
  359. package/src/managed-provider-gate.ts +5 -4
  360. package/src/managed-spawn-reservation.ts +5 -4
  361. package/src/mcp/index.ts +12 -9
  362. package/src/mcp/output-descriptions.ts +8 -8
  363. package/src/mcp/presentation.ts +6 -5
  364. package/src/mcp/project-profile-instructions.ts +32 -0
  365. package/src/mcp/runtime-output.ts +6 -1
  366. package/src/mcp/self-care-visibility.ts +2 -2
  367. package/src/mcp/spawn-targets-matrix.ts +10 -1
  368. package/src/mcp/tool-groups.ts +4 -3
  369. package/src/mcp/tool-roles.ts +81 -0
  370. package/src/mcp/tools-spawn.ts +4 -3
  371. package/src/mcp/tools-workspace.ts +1 -1
  372. package/src/mcp-agent-action.ts +1 -2
  373. package/src/mcp-blackboard-tools.ts +6 -5
  374. package/src/mcp-decision-tools.ts +7 -7
  375. package/src/mcp-egress-tools.ts +10 -9
  376. package/src/mcp-issue-activity-tools.ts +2 -2
  377. package/src/mcp-issue-association-tools.ts +4 -4
  378. package/src/mcp-issue-ref-tools.ts +13 -12
  379. package/src/mcp-maintenance-tools.ts +2 -2
  380. package/src/mcp-merge-tools.ts +5 -5
  381. package/src/mcp-notification-subscription-tools.ts +14 -15
  382. package/src/mcp-output-levels.test-fixture.ts +1 -1
  383. package/src/mcp-profile-trust-tools.ts +5 -5
  384. package/src/mcp-project-journal-tools.ts +4 -12
  385. package/src/mcp-project-tools.ts +17 -18
  386. package/src/mcp-provider-catalog.ts +2 -2
  387. package/src/mcp-routing-policy-tools.ts +3 -2
  388. package/src/mcp-task-tools.ts +11 -5
  389. package/src/mcp-team-template-tools.ts +3 -3
  390. package/src/mcp-team-tools.ts +6 -6
  391. package/src/mcp-workflow-tools.ts +13 -4
  392. package/src/memory-area-injection.ts +13 -12
  393. package/src/memory-boundary-capture.ts +6 -6
  394. package/src/memory-injection.ts +45 -43
  395. package/src/merge-pause-maintenance.ts +5 -4
  396. package/src/notification-router.ts +44 -17
  397. package/src/notification-types.ts +2 -1
  398. package/src/notify.ts +5 -5
  399. package/src/observed-reset-refresh.ts +4 -4
  400. package/src/operator-alarm.ts +23 -11
  401. package/src/project-ingest.ts +6 -6
  402. package/src/project-instructions.ts +12 -1
  403. package/src/project-profile-instruction-text.ts +6 -0
  404. package/src/project-profile-instructions.ts +20 -0
  405. package/src/project-trust.ts +12 -11
  406. package/src/prompt-resolver.ts +3 -3
  407. package/src/provider-catalog-store.ts +3 -49
  408. package/src/provider-config-store.ts +12 -11
  409. package/src/provider-model-seed.ts +1 -18
  410. package/src/provider-quota-async.ts +5 -7
  411. package/src/provider-quota-config-store.ts +5 -4
  412. package/src/provider-secrets.test-fixture.ts +3 -3
  413. package/src/provider-timeline-event.ts +4 -7
  414. package/src/quota-band-delivery.ts +2 -2
  415. package/src/recipe-runner.ts +6 -5
  416. package/src/repo-config-source.ts +10 -4
  417. package/src/retention-config-store.ts +4 -3
  418. package/src/reviewer-pipeline.ts +11 -10
  419. package/src/routes/_route.ts +4 -4
  420. package/src/routes/_shared.ts +13 -12
  421. package/src/routes/agent-effort.ts +5 -5
  422. package/src/routes/agent-heartbeat-quota.ts +23 -0
  423. package/src/routes/agent-keep.ts +1 -1
  424. package/src/routes/agent-profiles.ts +6 -6
  425. package/src/routes/agent-reporting.ts +1 -1
  426. package/src/routes/agent-self-effort.ts +5 -5
  427. package/src/routes/agent-sessions.ts +24 -24
  428. package/src/routes/agents-spawn.ts +2 -2
  429. package/src/routes/agents.ts +19 -121
  430. package/src/routes/auth.ts +14 -15
  431. package/src/routes/authority-audit.ts +2 -2
  432. package/src/routes/automations.ts +6 -5
  433. package/src/routes/channel-binding-delete.ts +1 -1
  434. package/src/routes/channel-output.ts +3 -3
  435. package/src/routes/claude-api-budget.ts +5 -5
  436. package/src/routes/commands-listing.ts +5 -1
  437. package/src/routes/commands.ts +31 -29
  438. package/src/routes/context-resets.ts +2 -2
  439. package/src/routes/continuation-archives.ts +2 -2
  440. package/src/routes/coordinator-teams.ts +1 -1
  441. package/src/routes/decisions.ts +2 -2
  442. package/src/routes/host-secret-files.ts +1 -1
  443. package/src/routes/hosts.ts +11 -11
  444. package/src/routes/inbox.ts +3 -2
  445. package/src/routes/index.ts +12 -2
  446. package/src/routes/integrations.ts +32 -56
  447. package/src/routes/issue-activity.ts +2 -2
  448. package/src/routes/issue-associations.ts +4 -4
  449. package/src/routes/issue-refs.ts +9 -9
  450. package/src/routes/kernel-timers-operator.ts +1 -1
  451. package/src/routes/memory.ts +1 -1
  452. package/src/routes/merges.ts +11 -11
  453. package/src/routes/messages.ts +23 -17
  454. package/src/routes/orchestrator-bootstrap.ts +2 -2
  455. package/src/routes/orchestrator-host-registration.ts +4 -2
  456. package/src/routes/orchestrator-host-utilization.ts +5 -3
  457. package/src/routes/orchestrator-proxy.ts +4 -4
  458. package/src/routes/orchestrator.ts +28 -19
  459. package/src/routes/pairs.ts +8 -8
  460. package/src/routes/project-profile-instructions.ts +27 -0
  461. package/src/routes/project-trust.ts +3 -3
  462. package/src/routes/projects.ts +16 -16
  463. package/src/routes/prompt-templates.ts +12 -12
  464. package/src/routes/provider-config.ts +6 -6
  465. package/src/routes/provider-quota-config.ts +2 -2
  466. package/src/routes/provider-quotas.ts +10 -10
  467. package/src/routes/run-command.ts +1 -1
  468. package/src/routes/secrets-backup.ts +2 -2
  469. package/src/routes/secrets-import.ts +1 -1
  470. package/src/routes/secrets-vault.ts +7 -7
  471. package/src/routes/settings.ts +6 -6
  472. package/src/routes/shipping.ts +9 -1
  473. package/src/routes/spawn-policy.ts +8 -7
  474. package/src/routes/sse.ts +2 -2
  475. package/src/routes/stats.ts +6 -6
  476. package/src/routes/task-http.ts +15 -1
  477. package/src/routes/task-issues.ts +11 -26
  478. package/src/routes/tasks.ts +22 -53
  479. package/src/routes/team-templates.ts +12 -12
  480. package/src/routes/teams-config.ts +2 -2
  481. package/src/routes/teams.ts +10 -10
  482. package/src/routes/tokens.ts +30 -22
  483. package/src/routes/users.ts +24 -24
  484. package/src/routes/viewer-read.ts +3 -3
  485. package/src/routes/web-tool-calls.ts +4 -4
  486. package/src/routes/workflows.ts +22 -7
  487. package/src/routes/workspaces.ts +17 -16
  488. package/src/routing-policy-normalize.ts +1 -2
  489. package/src/routing-policy-push.ts +6 -6
  490. package/src/routing-step-defaults.ts +0 -2
  491. package/src/runner-token-mint-limit.ts +63 -0
  492. package/src/runtime-grant.ts +21 -13
  493. package/src/runtime-tokens.ts +59 -35
  494. package/src/secrets-broker/config.ts +1 -1
  495. package/src/secrets-broker/service.ts +2 -2
  496. package/src/security.ts +16 -21
  497. package/src/self-resume-carry.ts +21 -110
  498. package/src/self-resume-supersede.ts +4 -3
  499. package/src/self-resume.ts +54 -66
  500. package/src/server-background.ts +2 -2
  501. package/src/server.ts +26 -24
  502. package/src/services/agent-action.ts +12 -31
  503. package/src/services/agent-effort.ts +7 -32
  504. package/src/services/agent-hang-watchdog-job.ts +2 -2
  505. package/src/services/agent-heartbeat.ts +166 -0
  506. package/src/services/agent-reporting.ts +1 -1
  507. package/src/services/browser-inventory.ts +3 -3
  508. package/src/services/browser-session-state.ts +3 -2
  509. package/src/services/browser-session.ts +21 -27
  510. package/src/services/bus-command-update.ts +9 -9
  511. package/src/services/checkout-refresh-state.ts +1 -0
  512. package/src/services/checkout-refresh.test-fixture.ts +3 -2
  513. package/src/services/command-host.ts +7 -2
  514. package/src/services/coordinator-digest.ts +3 -2
  515. package/src/services/dispatch-command.ts +12 -13
  516. package/src/services/effective-launch-driver.ts +14 -9
  517. package/src/services/host-changed-paths.test-fixture.ts +5 -6
  518. package/src/services/host-project-readiness.ts +2 -2
  519. package/src/services/host-providers.ts +1 -1
  520. package/src/services/host-utilization.ts +27 -4
  521. package/src/services/idle-agent-digest.ts +17 -12
  522. package/src/services/idle-epics.ts +9 -10
  523. package/src/services/interrupt-agent.ts +12 -9
  524. package/src/services/issue-activity.ts +3 -3
  525. package/src/services/issue-associations.ts +15 -18
  526. package/src/services/issue-lifecycle-comments.ts +3 -2
  527. package/src/services/issue-lifecycle.ts +69 -72
  528. package/src/services/issue-refs.ts +10 -15
  529. package/src/services/kernel-timers-cutover-chaos-worker.ts +11 -8
  530. package/src/services/kernel-timers-ingress-chaos-worker.ts +6 -1
  531. package/src/services/kernel-timers-ingress.ts +4 -4
  532. package/src/services/kernel-timers-message-authority-chaos-worker.ts +3 -10
  533. package/src/services/kernel-timers-operator-chaos-worker.ts +3 -2
  534. package/src/services/kernel-timers-outbox.ts +1 -1
  535. package/src/services/kernel-timers-stage10-operator.ts +1 -1
  536. package/src/services/kernel-timers.ts +4 -3
  537. package/src/services/land-gate-placement.ts +11 -2
  538. package/src/services/land-issue-relations.ts +5 -4
  539. package/src/services/land-restart-retry.ts +7 -6
  540. package/src/services/landed-ancestry.ts +25 -8
  541. package/src/services/legacy-landing-host.ts +4 -1
  542. package/src/services/legacy-landing-recovery.ts +8 -6
  543. package/src/services/managed-running.ts +17 -17
  544. package/src/services/memory-areas.ts +17 -53
  545. package/src/services/merge-pause.ts +9 -15
  546. package/src/services/operator-decisions.ts +37 -41
  547. package/src/services/orchestrator-registration-recovery.ts +6 -2
  548. package/src/services/orchestrator-upgrade.ts +14 -12
  549. package/src/services/permission-decision.ts +4 -3
  550. package/src/services/plan-ci-notice.ts +57 -0
  551. package/src/services/plan-ci-recovery.ts +2 -55
  552. package/src/services/plan-conformance.ts +4 -4
  553. package/src/services/plan-dispatch-policy.ts +10 -3
  554. package/src/services/plan-dispatch.ts +35 -14
  555. package/src/services/plan-graph.ts +39 -261
  556. package/src/services/plan-import.ts +1 -1
  557. package/src/services/plan-live-bindings.ts +8 -37
  558. package/src/services/plan-task-create.ts +1 -1
  559. package/src/services/plan-terminal-refs.ts +2 -12
  560. package/src/services/plan-wake-digest.ts +9 -3
  561. package/src/services/profile-trust.ts +6 -5
  562. package/src/services/project-config-read.ts +70 -0
  563. package/src/services/project-profile-instructions.ts +54 -0
  564. package/src/services/project.ts +11 -10
  565. package/src/services/prompt-templates.ts +6 -5
  566. package/src/services/provider-hold-nudge.ts +9 -9
  567. package/src/services/provider-hold-record.ts +13 -12
  568. package/src/services/provider-state-audit.ts +19 -18
  569. package/src/services/provisioning-harness/budget-baseline.json +4 -4
  570. package/src/services/provisioning-harness/driver.ts +1 -1
  571. package/src/services/provisioning-harness/fixture-matrix.ts +3 -3
  572. package/src/services/provisioning-harness/lifecycle.ts +24 -22
  573. package/src/services/provisioning-harness/prepare.ts +16 -17
  574. package/src/services/rate-limit-resume.ts +10 -9
  575. package/src/services/red-main-auto-revert.ts +7 -5
  576. package/src/services/red-main-controller-deps.ts +20 -3
  577. package/src/services/red-main-incident.ts +3 -1
  578. package/src/services/red-main-quarantine.ts +2 -3
  579. package/src/services/register-agent.ts +22 -22
  580. package/src/services/restart-project-role.ts +1 -1
  581. package/src/services/restart-spawn.ts +74 -61
  582. package/src/services/review-publish.ts +7 -24
  583. package/src/services/review-ref-reconcile.ts +29 -38
  584. package/src/services/runtime-dependency-alert.ts +27 -0
  585. package/src/services/scheduler-command.ts +11 -9
  586. package/src/services/scheduler.ts +5 -5
  587. package/src/services/self-care-state.ts +2 -1
  588. package/src/services/self-effort-grant.ts +5 -25
  589. package/src/services/self-effort.ts +5 -5
  590. package/src/services/send-message.ts +21 -34
  591. package/src/services/shutdown-agent.ts +17 -14
  592. package/src/services/spawn-agent.ts +25 -43
  593. package/src/services/spawn-chain-inspector.ts +7 -14
  594. package/src/services/spawn-cwd-placement.ts +21 -5
  595. package/src/services/spawn-issue-activity.ts +8 -6
  596. package/src/services/spawn-launch.ts +17 -1
  597. package/src/services/spawn-loss-escalation.ts +1 -1
  598. package/src/services/spawn-policy.ts +68 -0
  599. package/src/services/spawn-registration-watchdog.ts +2 -2
  600. package/src/services/spawn-repo-probe.ts +7 -5
  601. package/src/services/spawn-tree-cleanup.ts +8 -9
  602. package/src/services/steward-reaper.ts +4 -4
  603. package/src/services/task-context-hydration.ts +25 -1
  604. package/src/services/task-delivery.ts +20 -34
  605. package/src/services/task-dispatch.ts +3 -0
  606. package/src/services/task-entity.ts +40 -203
  607. package/src/services/task-issue-link.ts +13 -20
  608. package/src/services/task-issue-weave.ts +12 -11
  609. package/src/services/task-lifecycle.ts +27 -31
  610. package/src/services/task-repo-cwd.ts +37 -0
  611. package/src/services/task-review-hold.ts +4 -17
  612. package/src/services/task-semantic-events.ts +13 -11
  613. package/src/services/task-state-reconcile.ts +8 -17
  614. package/src/services/task-validation.ts +2 -2
  615. package/src/services/team-templates.ts +12 -11
  616. package/src/services/team.ts +31 -98
  617. package/src/services/terminal-provider-exit.ts +6 -5
  618. package/src/services/timer-message-fire-chaos-worker.ts +7 -3
  619. package/src/services/timer-message-fire-outbox.ts +1 -1
  620. package/src/services/transient-agent-reaper.ts +25 -20
  621. package/src/services/turn-reconcile-audit.ts +9 -9
  622. package/src/services/user-onboarding.ts +8 -6
  623. package/src/services/user-profile.ts +6 -9
  624. package/src/services/work-finality.ts +16 -4
  625. package/src/services/workflow-auto-start.ts +26 -13
  626. package/src/services/workflow-caller.ts +61 -4
  627. package/src/services/workflow-child-proof-worker.ts +1 -1
  628. package/src/services/workflow-ci-main.ts +1 -1
  629. package/src/services/workflow-control-proof-worker.ts +1 -1
  630. package/src/services/workflow-coordinator.ts +8 -2
  631. package/src/services/workflow-decisions.ts +5 -5
  632. package/src/services/workflow-deferred-cleanup.ts +5 -3
  633. package/src/services/workflow-effect-driver.ts +42 -17
  634. package/src/services/workflow-effects.ts +58 -37
  635. package/src/services/workflow-land-notice.ts +10 -0
  636. package/src/services/workflow-pause-text.ts +43 -0
  637. package/src/services/workflow-pins.ts +7 -4
  638. package/src/services/workflow-reconcile.ts +14 -11
  639. package/src/services/workflow-resume-pins.ts +3 -3
  640. package/src/services/workflow-routing-defaults.ts +18 -0
  641. package/src/services/workflow-run-view.ts +6 -3
  642. package/src/services/workflow-run.test-fixture.ts +1 -1
  643. package/src/services/workflow-runs.ts +61 -33
  644. package/src/services/workflow-supervisor-state.ts +26 -1
  645. package/src/services/workflow-supervisor.ts +11 -6
  646. package/src/services/workspace-recovery.ts +4 -3
  647. package/src/settings/registry.ts +1 -2
  648. package/src/spawn-admission.ts +10 -2
  649. package/src/spawn-command.ts +4 -4
  650. package/src/spawn-models.ts +10 -12
  651. package/src/spawn-placement.ts +28 -10
  652. package/src/spawn-targets.ts +9 -9
  653. package/src/sse-agent-status.ts +15 -6
  654. package/src/sse.ts +49 -24
  655. package/src/startup-context-injection.ts +62 -57
  656. package/src/state-adoption/cd-cutover.ts +53 -7
  657. package/src/state-adoption/fleet-cutover.ts +35 -0
  658. package/src/state-adoption/fleet-plan.ts +36 -0
  659. package/src/state-adoption/index.ts +2 -2
  660. package/src/state-adoption/linux-plan.ts +2 -2
  661. package/src/state-adoption/linux.ts +2 -2
  662. package/src/state-adoption/macos-plan.ts +2 -2
  663. package/src/state-adoption/macos.ts +1 -1
  664. package/src/steward-handoff.ts +4 -3
  665. package/src/steward-policy-cleanup.ts +9 -8
  666. package/src/steward.ts +9 -8
  667. package/src/task-dispatch-live.ts +6 -3
  668. package/src/task-dispatcher.ts +3 -3
  669. package/src/teams-config-store.ts +4 -3
  670. package/src/token-db-write.ts +10 -0
  671. package/src/token-db.ts +2 -2
  672. package/src/token-usage-async.ts +2 -4
  673. package/src/user-awaiting-reply.ts +5 -5
  674. package/src/workspace-actions.ts +24 -29
  675. package/src/workspace-auto-merge.ts +14 -12
  676. package/src/workspace-changed-paths-client.ts +16 -5
  677. package/src/workspace-cleanup-stale.ts +30 -7
  678. package/src/workspace-command-settle.ts +26 -17
  679. package/src/workspace-config.ts +1 -1
  680. package/src/workspace-conflict-resolver.ts +9 -7
  681. package/src/workspace-dead-owner-recovery.ts +5 -4
  682. package/src/workspace-escalation.ts +12 -11
  683. package/src/workspace-human-escalation.ts +3 -3
  684. package/src/workspace-land-gate-watchdog.ts +3 -3
  685. package/src/workspace-land-refusal.ts +20 -0
  686. package/src/workspace-land-stopped.ts +1 -0
  687. package/src/workspace-merge.ts +10 -26
  688. package/src/workspace-nothing-to-land-notice.ts +2 -2
  689. package/src/workspace-orphans.ts +18 -37
  690. package/src/workspace-pr-completion.ts +10 -8
  691. package/src/workspace-rekey.ts +3 -3
  692. package/src/workspace-steward-failure.ts +2 -2
  693. package/src/workspace-steward-wake.ts +4 -4
  694. package/node_modules/@humwick/kernel/LICENSE +0 -167
  695. package/node_modules/@humwick/kernel/async-entity-persistence.ts +0 -344
  696. package/node_modules/@humwick/kernel/async-event-log.ts +0 -107
  697. package/node_modules/@humwick/kernel/automations.pilot.ts +0 -147
  698. package/node_modules/@humwick/kernel/config.ts +0 -111
  699. package/node_modules/@humwick/kernel/contract.ts +0 -572
  700. package/node_modules/@humwick/kernel/control-authz.ts +0 -281
  701. package/node_modules/@humwick/kernel/control.ts +0 -645
  702. package/node_modules/@humwick/kernel/effects.ts +0 -493
  703. package/node_modules/@humwick/kernel/event-log.ts +0 -319
  704. package/node_modules/@humwick/kernel/http-transport.ts +0 -384
  705. package/node_modules/@humwick/kernel/identity-grammar.ts +0 -20
  706. package/node_modules/@humwick/kernel/identity.ts +0 -248
  707. package/node_modules/@humwick/kernel/index.ts +0 -28
  708. package/node_modules/@humwick/kernel/kernel-persistence.ts +0 -181
  709. package/node_modules/@humwick/kernel/landing-incident.ts +0 -306
  710. package/node_modules/@humwick/kernel/landing.ts +0 -953
  711. package/node_modules/@humwick/kernel/manifest-validation.ts +0 -460
  712. package/node_modules/@humwick/kernel/mcp-transport.ts +0 -109
  713. package/node_modules/@humwick/kernel/message-authority-chaos-worker.ts +0 -200
  714. package/node_modules/@humwick/kernel/message-authority.ts +0 -281
  715. package/node_modules/@humwick/kernel/module-host.ts +0 -722
  716. package/node_modules/@humwick/kernel/openapi-init.ts +0 -14
  717. package/node_modules/@humwick/kernel/package.json +0 -39
  718. package/node_modules/@humwick/kernel/persistence-schema.ts +0 -248
  719. package/node_modules/@humwick/kernel/persistence.ts +0 -510
  720. package/node_modules/@humwick/kernel/registry.ts +0 -60
  721. package/node_modules/@humwick/kernel/sqlite-kernel-persistence.ts +0 -499
  722. package/node_modules/@humwick/kernel/sqlite-module-host.ts +0 -87
  723. package/node_modules/@humwick/kernel/timers-chaos-worker.ts +0 -186
  724. package/node_modules/@humwick/kernel/timers.pilot.ts +0 -1411
  725. package/node_modules/@humwick/kernel/workflow-activation.ts +0 -25
  726. package/node_modules/@humwick/kernel/workflow-backstop.ts +0 -40
  727. package/node_modules/@humwick/kernel/workflow-cancel-tree.ts +0 -20
  728. package/node_modules/@humwick/kernel/workflow-chaos-worker.ts +0 -213
  729. package/node_modules/@humwick/kernel/workflow-composition.ts +0 -231
  730. package/node_modules/@humwick/kernel/workflow-container.ts +0 -72
  731. package/node_modules/@humwick/kernel/workflow-control.test-fixture.ts +0 -42
  732. package/node_modules/@humwick/kernel/workflow-control.ts +0 -178
  733. package/node_modules/@humwick/kernel/workflow-definition.ts +0 -507
  734. package/node_modules/@humwick/kernel/workflow-dispatch.ts +0 -60
  735. package/node_modules/@humwick/kernel/workflow-foreach.ts +0 -167
  736. package/node_modules/@humwick/kernel/workflow-journal-codec.ts +0 -339
  737. package/node_modules/@humwick/kernel/workflow-journal.ts +0 -922
  738. package/node_modules/@humwick/kernel/workflow-lane.ts +0 -48
  739. package/node_modules/@humwick/kernel/workflow-lease-owner.ts +0 -60
  740. package/node_modules/@humwick/kernel/workflow-recovery.test-fixture.ts +0 -19
  741. package/node_modules/@humwick/kernel/workflow-runtime.ts +0 -938
  742. package/node_modules/@humwick/kernel/workflow-script.ts +0 -11
  743. package/node_modules/@humwick/kernel/workflow-state.ts +0 -299
  744. package/node_modules/@humwick/kernel/workflow-step-commit.ts +0 -195
  745. package/node_modules/@humwick/kernel/workflow-transitions.ts +0 -317
  746. package/node_modules/@humwick/kernel/workflow-values.ts +0 -153
  747. package/node_modules/@humwick/kernel/workflow.pilot.ts +0 -376
  748. package/node_modules/@humwick/offload/LICENSE +0 -167
  749. package/node_modules/@humwick/offload/README.md +0 -57
  750. package/node_modules/@humwick/offload/dist/async-runner.d.ts +0 -18
  751. package/node_modules/@humwick/offload/dist/async-runner.d.ts.map +0 -1
  752. package/node_modules/@humwick/offload/dist/async-runner.js +0 -158
  753. package/node_modules/@humwick/offload/dist/async-runner.js.map +0 -1
  754. package/node_modules/@humwick/offload/dist/envelope.d.ts +0 -25
  755. package/node_modules/@humwick/offload/dist/envelope.d.ts.map +0 -1
  756. package/node_modules/@humwick/offload/dist/envelope.js +0 -80
  757. package/node_modules/@humwick/offload/dist/envelope.js.map +0 -1
  758. package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts +0 -10
  759. package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts.map +0 -1
  760. package/node_modules/@humwick/offload/dist/fixtures/worker-task.js +0 -59
  761. package/node_modules/@humwick/offload/dist/fixtures/worker-task.js.map +0 -1
  762. package/node_modules/@humwick/offload/dist/index.d.ts +0 -5
  763. package/node_modules/@humwick/offload/dist/index.d.ts.map +0 -1
  764. package/node_modules/@humwick/offload/dist/index.js +0 -5
  765. package/node_modules/@humwick/offload/dist/index.js.map +0 -1
  766. package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts +0 -62
  767. package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts.map +0 -1
  768. package/node_modules/@humwick/offload/dist/subprocess-runner.js +0 -295
  769. package/node_modules/@humwick/offload/dist/subprocess-runner.js.map +0 -1
  770. package/node_modules/@humwick/offload/dist/types.d.ts +0 -111
  771. package/node_modules/@humwick/offload/dist/types.d.ts.map +0 -1
  772. package/node_modules/@humwick/offload/dist/types.js +0 -176
  773. package/node_modules/@humwick/offload/dist/types.js.map +0 -1
  774. package/node_modules/@humwick/offload/dist/worker-pool.d.ts +0 -23
  775. package/node_modules/@humwick/offload/dist/worker-pool.d.ts.map +0 -1
  776. package/node_modules/@humwick/offload/dist/worker-pool.js +0 -435
  777. package/node_modules/@humwick/offload/dist/worker-pool.js.map +0 -1
  778. package/node_modules/@humwick/offload/dist/worker-runtime.d.ts +0 -2
  779. package/node_modules/@humwick/offload/dist/worker-runtime.d.ts.map +0 -1
  780. package/node_modules/@humwick/offload/dist/worker-runtime.js +0 -27
  781. package/node_modules/@humwick/offload/dist/worker-runtime.js.map +0 -1
  782. package/node_modules/@humwick/offload/dist/worker.d.ts +0 -5
  783. package/node_modules/@humwick/offload/dist/worker.d.ts.map +0 -1
  784. package/node_modules/@humwick/offload/dist/worker.js +0 -1
  785. package/node_modules/@humwick/offload/dist/worker.js.map +0 -1
  786. package/node_modules/@humwick/offload/package.json +0 -42
  787. package/node_modules/@humwick/offload/src/async-runner.ts +0 -170
  788. package/node_modules/@humwick/offload/src/envelope.ts +0 -92
  789. package/node_modules/@humwick/offload/src/fixtures/worker-task.ts +0 -49
  790. package/node_modules/@humwick/offload/src/index.ts +0 -4
  791. package/node_modules/@humwick/offload/src/subprocess-runner.ts +0 -334
  792. package/node_modules/@humwick/offload/src/types.ts +0 -235
  793. package/node_modules/@humwick/offload/src/worker-pool.ts +0 -463
  794. package/node_modules/@humwick/offload/src/worker-runtime.ts +0 -32
  795. package/node_modules/@humwick/offload/src/worker.ts +0 -5
  796. package/public/assets/agent-liveness-DyqxfB-t.js +0 -2
  797. package/public/assets/agent-profiles-BpI_jTxq.js +0 -2
  798. package/public/assets/index-B7ZerHLY.css +0 -2
  799. package/public/assets/index-BU3uWo2t.js +0 -15
  800. package/public/assets/projects-B_lmcqfO.js +0 -2
  801. package/public/assets/provider-display-DbLWpP3j.js +0 -2
  802. package/public/assets/run-card-CO_bguQf.js +0 -2
  803. package/public/assets/shipping-Bu8p1gEw.js +0 -2
  804. package/public/assets/store-BvtFdlGX.js +0 -9
  805. package/public/assets/use-project-list-B-T2Bnnn.js +0 -2
  806. package/public/assets/versioned-prompt-editor-Diu8BIaM.js +0 -8
  807. package/runner/src/agent-runner/http-liveness.ts +0 -85
  808. package/runner/src/gate-run-lease-probe.ts +0 -38
  809. package/src/db/claude-catalog-reconcile.ts +0 -27
  810. package/src/db/on-loop-write-transaction.ts +0 -34
  811. package/src/routing-model-aliases.ts +0 -21
@@ -2,15 +2,23 @@ import { isRecord } from "@humwick/sdk";
2
2
 
3
3
  const FULL_CARD_KEYS = ["name", "kind", "label", "tags", "systemTags", "instanceId", "epoch", "capabilities", "providerCapabilities"];
4
4
 
5
- /** Per-connection baselines: reconnect/replay starts with full cards, never another client's delta. */
5
+ export interface AgentStatusChange {
6
+ previous?: number;
7
+ seq: number;
8
+ full: Record<string, unknown>;
9
+ delta: Record<string, unknown>;
10
+ }
11
+
12
+ /** Build once in source order; consumers need only the last sequence they received. */
6
13
  export class AgentStatusDeltas {
7
- private readonly agents = new Map<string, Map<string, string | undefined>>();
14
+ private readonly agents = new Map<string, { seq: number; fields: Map<string, string | undefined> }>();
8
15
 
9
16
  remove(id: string): void { this.agents.delete(id); }
10
17
 
11
- project(data: Record<string, unknown>): Record<string, unknown> {
18
+ project(data: Record<string, unknown>, seq: number): AgentStatusChange {
12
19
  const id = data.id as string;
13
- const previous = this.agents.get(id);
20
+ const baseline = this.agents.get(id);
21
+ const previous = baseline?.fields;
14
22
  const fields = new Map<string, string | undefined>();
15
23
  const delta: Record<string, unknown> = { id, status: data.status, statusSeq: data.statusSeq, epoch: data.epoch };
16
24
  for (const [key, value] of Object.entries(data)) {
@@ -29,7 +37,8 @@ export class AgentStatusDeltas {
29
37
  }
30
38
  }
31
39
  if (data.status === "offline") this.remove(id);
32
- else this.agents.set(id, fields);
33
- return !previous || FULL_CARD_KEYS.some((key) => previous.get(key) !== fields.get(key)) ? data : delta;
40
+ else this.agents.set(id, { seq, fields });
41
+ return { previous: baseline?.seq, seq, full: data,
42
+ delta: !previous || FULL_CARD_KEYS.some((key) => previous.get(key) !== fields.get(key)) ? data : delta };
34
43
  }
35
44
  }
package/src/sse.ts CHANGED
@@ -1,7 +1,8 @@
1
+ import { sendMessageWithResultAsync } from "./db/message-send";
1
2
  import { eventVisibleTo } from "./sse-visibility";
2
3
  import { taskVisibleTo, memoizeViewerScope } from "./db/viewer-scope";
3
4
  import { agentPrincipalSink } from "./db/agent-ownership";
4
- import { getAgent, getMessage, getOperatorDecision, getOrchestrator, matchingDeliveryAgents, onWorkspaceChange, sendMessageWithResult, setChannelSubscriberProbe } from "./db";
5
+ import { getAgent, getMessage, getOperatorDecision, getOrchestrator, matchingDeliveryAgents, onWorkspaceChange, setChannelSubscriberProbe } from "./db";
5
6
  import { hasReplayGap, type BusEvent } from "./bus-outbox";
6
7
  import { replayEventsSliceAsync } from "./bus-outbox-async";
7
8
  import { getFannedSeq } from "./sse-outbox-cursor";
@@ -14,10 +15,11 @@ import type { ActivityEvent, AgentCard, Message, RelayInjectionCategory, RelayNo
14
15
  import { isHumanAgentId } from "@humwick/sdk";
15
16
  import { messageVisibleTo, visibleMessages, type MessageViewer } from "./message-visibility";
16
17
  import { emitNotificationCreated, notificationForMessage, notificationForDelivery } from "./dashboard-notifications";
17
- import { AgentStatusDeltas } from "./sse-agent-status";
18
+ import { AgentStatusDeltas, type AgentStatusChange } from "./sse-agent-status";
19
+ import { getDbGeneration } from "./db/connection";
18
20
  import { AgentStatusSubscribers, wantsAgentStatus } from "./transport-subscriptions";
19
21
  import { withLoopFrameCapture } from "./loop-block-attribution";
20
- import { recordEmitBytes } from "./hub-metrics";
22
+ import { framed, recordEmitBytes } from "./hub-metrics";
21
23
 
22
24
  interface Connection {
23
25
  id: string;
@@ -27,7 +29,8 @@ interface Connection {
27
29
  queuedBytes: number;
28
30
  /** Bytes ever enqueued on the controller; the replay pump measures its byte budget against it. */
29
31
  writtenBytes: number;
30
- statusDeltas?: AgentStatusDeltas;
32
+ statusDeltas?: Map<string, number>;
33
+ replayDeltas?: AgentStatusDeltas;
31
34
  // Pending backpressure re-check. Set when a stream crosses the byte floor; cleared
32
35
  // once it drains or is closed after making no progress during the grace interval.
33
36
  drainCheck?: Timer;
@@ -46,6 +49,8 @@ interface Connection {
46
49
  const connections = new Map<string, Connection>();
47
50
  const statusSubscribers = new AgentStatusSubscribers<Connection>("sse");
48
51
  const encoder = new TextEncoder();
52
+ let sourceDeltas = new AgentStatusDeltas();
53
+ let statusGeneration = getDbGeneration();
49
54
 
50
55
  const SSE_KEEPALIVE_MS = 15_000;
51
56
  const SSE_RETRY_MS = 5_000;
@@ -65,7 +70,7 @@ subscribeRelayEvents((event) => {
65
70
  fanoutBytes = 0;
66
71
  withLoopFrameCapture(FANOUT_FRAME, () => fanout(event));
67
72
  recordEmitBytes(event.type, fanoutBytes);
68
- });
73
+ }, "sse.fanout");
69
74
 
70
75
  function fanoutAgent(agentId: string, cache: Map<string, AgentCard | null>): AgentCard | null {
71
76
  if (!cache.has(agentId)) cache.set(agentId, getAgent(agentId));
@@ -90,14 +95,14 @@ export function createSSEStream(agentId: string | null, lastEventId = 0, statusD
90
95
  {
91
96
  start(controller) {
92
97
  connId = crypto.randomUUID();
93
- const keepalive = setInterval(() => {
98
+ const keepalive = setInterval(framed("timer sse-keepalive", () => {
94
99
  const conn = connections.get(connId);
95
100
  if (!conn) return;
96
101
  sendEncoded(conn, encoder.encode(": keepalive\n\n"));
97
- }, SSE_KEEPALIVE_MS);
102
+ }), SSE_KEEPALIVE_MS);
98
103
 
99
104
  connections.set(connId, { id: connId, agentId, controller, keepalive, queuedBytes: 0, writtenBytes: 0,
100
- statusDeltas: statusDeltas ? new AgentStatusDeltas() : undefined, viewer });
105
+ statusDeltas: statusDeltas ? new Map() : undefined, viewer });
101
106
  statusSubscribers.add(connections.get(connId)!);
102
107
 
103
108
  const replay = replayPlan(lastEventId, agentId === null);
@@ -216,18 +221,34 @@ function sendDirect(conn: Connection, event: string, data: unknown, id?: number)
216
221
  writeFrame(conn, sseFrame(event, data, id));
217
222
  }
218
223
 
219
- // #2873/#3640 — one agent.status projection for live, buffered-live and replayed frames. Every frame goes
220
- // through it in the order the client receives it, so the per-connection delta baseline matches the client.
224
+ // #3608 — share live deltas and encoded frames; select full/delta in client order even during replay.
221
225
  function tracksStatus(conn: Connection, event: RelayEvent): boolean {
222
226
  return conn.statusDeltas !== undefined && (event.type === "agent.status" || event.type === "agent.removed");
223
227
  }
224
228
 
229
+ // An ephemeral frame carries no `id:` line: it must not move the client's Last-Event-ID resume cursor.
230
+ function frameId(event: RelayEvent): number | undefined {
231
+ return event.ephemeral ? undefined : event.seq;
232
+ }
233
+
234
+ // Ephemeral events all carry seq 0, so they take a unique negative baseline token: two live-only
235
+ // frames must never look like the same client-visible state.
236
+ let ephemeralStatusToken = 0;
237
+
225
238
  // Reads `conn.statusDeltas` when called, not when queued: a replay.gap swaps in a fresh baseline.
226
- function statusFrame(conn: Connection, event: RelayEvent, full?: Uint8Array): Uint8Array {
227
- const deltas = conn.statusDeltas!;
228
- if (event.type === "agent.status") return sseFrame(event.type, deltas.project(event.data), event.seq);
229
- deltas.remove(event.data.id as string);
230
- return full ?? sseFrame(event.type, event.data, event.seq);
239
+ function prepareStatusFrame(event: RelayEvent, deltas: AgentStatusDeltas, full = sseFrame(event.type, event.data, frameId(event))) {
240
+ const id = event.data.id as string;
241
+ const token = event.ephemeral ? --ephemeralStatusToken : event.seq;
242
+ const change: AgentStatusChange | undefined = event.type === "agent.status" ? deltas.project(event.data, token) : undefined;
243
+ if (!change) deltas.remove(id);
244
+ let delta: Uint8Array | undefined;
245
+ return (conn: Connection): Uint8Array => {
246
+ const previous = conn.statusDeltas!.get(id);
247
+ if (event.data.status === "offline" || !change) conn.statusDeltas!.delete(id);
248
+ else conn.statusDeltas!.set(id, token);
249
+ return change && previous !== undefined && previous === change.previous
250
+ ? (delta ??= change.delta === change.full ? full : sseFrame(event.type, change.delta, frameId(event))) : full;
251
+ };
231
252
  }
232
253
 
233
254
  function flushPendingLive(conn: Connection): void {
@@ -282,14 +303,17 @@ function fanout(event: RelayEvent): void {
282
303
  sendTaskChanged(event.data as unknown as Task, event.type, event.seq);
283
304
  return;
284
305
  }
285
- // An ephemeral frame carries no `id:` line: it must not move the client's Last-Event-ID resume cursor.
286
- const id = event.ephemeral ? undefined : event.seq;
287
- const chunk = sseFrame(event.type, event.data, id);
306
+ const chunk = sseFrame(event.type, event.data, frameId(event));
307
+ if (statusGeneration !== getDbGeneration()) {
308
+ sourceDeltas = new AgentStatusDeltas();
309
+ statusGeneration = getDbGeneration();
310
+ }
311
+ const status = event.type === "agent.status" || event.type === "agent.removed" ? prepareStatusFrame(event, sourceDeltas, chunk) : undefined;
288
312
  const recipients = event.type === "agent.status" ? statusSubscribers.forEvent(event.subject, event.data.id) : connections.values();
289
313
  const visible = memoizeViewerScope((viewer) => eventVisibleTo(viewer, event));
290
314
  for (const conn of recipients) {
291
315
  if (!visible(conn.viewer)) continue;
292
- sendEncoded(conn, chunk, tracksStatus(conn, event) ? () => statusFrame(conn, event, chunk) : undefined);
316
+ sendEncoded(conn, chunk, conn.statusDeltas && status ? () => status(conn) : undefined);
293
317
  }
294
318
  }
295
319
 
@@ -394,9 +418,9 @@ interface RelayInjectionTimelineInput {
394
418
  idempotencyKey?: string;
395
419
  }
396
420
 
397
- export function emitRelayInjectionEvent(input: RelayInjectionTimelineInput): Message {
421
+ export async function emitRelayInjectionEvent(input: RelayInjectionTimelineInput): Promise<Message> {
398
422
  const timestamp = input.timestamp ?? Date.now();
399
- const result = sendMessageWithResult({
423
+ const result = (await sendMessageWithResultAsync({
400
424
  from: input.source ?? input.agentId,
401
425
  to: input.source ? input.agentId : agentPrincipalSink(input.agentId),
402
426
  kind: "session",
@@ -416,7 +440,7 @@ export function emitRelayInjectionEvent(input: RelayInjectionTimelineInput): Mes
416
440
  },
417
441
  },
418
442
  },
419
- });
443
+ }));
420
444
  if (result.created || result.updated) emitNewMessage(result.message);
421
445
  return result.message;
422
446
  }
@@ -561,7 +585,7 @@ async function pumpReplay(connId: string, plan: ReplayPlan): Promise<void> {
561
585
  // The client's REST reload covers everything up to the ceiling; the buffered live tail follows.
562
586
  // That reload brings full cards, so restart the delta baseline as a fresh connection would.
563
587
  sendDirect(conn, "replay.gap", { since: plan.since }, ceiling);
564
- if (conn.statusDeltas) conn.statusDeltas = new AgentStatusDeltas();
588
+ conn.statusDeltas?.clear();
565
589
  break;
566
590
  }
567
591
  if (!slice.truncated) break;
@@ -570,6 +594,7 @@ async function pumpReplay(connId: string, plan: ReplayPlan): Promise<void> {
570
594
  drained = true;
571
595
  } finally {
572
596
  conn.replaying = false;
597
+ conn.replayDeltas = undefined;
573
598
  // Only flush into a still-open controller — a cancelled connection was already removed from
574
599
  // `connections` (and stopped receiving anything into `pendingLive` the moment it was removed,
575
600
  // since fanout only iterates live map entries), so there is nothing left to deliver.
@@ -615,7 +640,7 @@ function sendReplayEvent(conn: Connection, event: RelayEvent, agentCache: Map<st
615
640
  return;
616
641
  }
617
642
  if (tracksStatus(conn, event)) {
618
- writeFrame(conn, statusFrame(conn, event));
643
+ writeFrame(conn, prepareStatusFrame(event, conn.replayDeltas ??= new AgentStatusDeltas())(conn));
619
644
  return;
620
645
  }
621
646
  sendDirect(conn, event.type, event.data, event.seq);
@@ -1,3 +1,5 @@
1
+ import { setConfigAsync } from "./config-store-write";
2
+ import { createCommandAsync } from "./commands-write";
1
3
  import { contextInjectUnsupported, launchContextIsUserMessage, launchContextSurvivesCompact, launchSystemPromptAppend } from "./context-injection-channel";
2
4
  import { stripAgentCore } from "@humwick/sdk/prompt-template-defaults";
3
5
  import { renderAgentCore } from "./agent-core";
@@ -26,10 +28,10 @@ import { renderAgentCore } from "./agent-core";
26
28
  // inputs are gathered by the shared `resolveAgentSpawnInstructionInputs` (spawn-instruction-
27
29
  // inputs.ts), the same resolver the restart projection uses, so the two cannot drift.
28
30
  //
29
- // • DELTA-GATED AT COMPACT. A native compact PRESERVES the system prompt, so an unchanged
30
- // block is skipped (hashed; launch prompt read for the first boundary, like the memory
31
- // seam). No skip when launch text rides user messages (OpenCode family, Codex: compaction
32
- // drops them) or on `clear`. Re-injects on persistent-system-prompt providers strip the
31
+ // • DELTA-GATED AT CLEAR AND COMPACT. A persistent system prompt survives both a native compact
32
+ // and a /clear, so an unchanged block is skipped (hashed; launch prompt read, like the memory
33
+ // seam; #3782). No skip when launch text rides user messages (OpenCode family, Codex:
34
+ // compaction drops them). Re-injects on persistent-system-prompt providers strip the
33
35
  // core (their context re-delivers it); the rest re-injects.
34
36
  //
35
37
  // PROVIDER-AGNOSTIC: delivery is an `agent.injectContext` command (declared `context.inject`); a
@@ -38,15 +40,14 @@ import { renderAgentCore } from "./agent-core";
38
40
 
39
41
  import { createHash } from "node:crypto";
40
42
  import { errMessage, isRelayInjectionCategory, stringValue } from "@humwick/sdk";
41
- import { createCommand, findLaunchPromptCommandForAgent } from "./commands-db";
43
+ import { findLaunchPromptCommandForAgent } from "./commands-db";
42
44
  import { emitCommandEvent } from "./command-events";
43
45
  import { REAP_INTERVAL_MS } from "./config";
44
- import { getConfig, setConfig } from "./config-store";
46
+ import { getConfig } from "./config-store";
45
47
  import { agentPrincipalUserId, findMessageByIdempotencyKey, getAgent } from "./db";
46
48
  import { resolveCanonicalHost } from "./host-identity";
47
49
  import { memorySeamForAgent } from "./memory-seam";
48
- import { stripMemoryPreamble } from "./memory-preamble";
49
- import { composeSpawnInstructionsWithEvents, stripHumwickIdentitySection, type ComposedSpawnInstructions } from "./project-instructions";
50
+ import { composeSpawnInstructionsWithEvents, stripRelayOwnedSections, type ComposedSpawnInstructions } from "./project-instructions";
50
51
  import { resolveAgentSpawnInstructionInputs } from "./services/spawn-instruction-inputs";
51
52
  import { INJECTION_SWEEP_BACKLOG_INTERVAL_MS, pacedInjectionSweep } from "./injection-sweep-pacing";
52
53
  import { isSqliteBusyError } from "./db/connection";
@@ -106,8 +107,8 @@ export function readStartupContextInjectionState(agentId: string): StartupContex
106
107
  return getConfig<StartupContextInjectionState>(STARTUP_CONTEXT_NAMESPACE, agentId)?.value ?? null;
107
108
  }
108
109
 
109
- export function recordStartupContextInjectionState(agentId: string, state: StartupContextInjectionState): void {
110
- setConfig(STARTUP_CONTEXT_NAMESPACE, agentId, state, "startup-context-injection");
110
+ export async function recordStartupContextInjectionState(agentId: string, state: StartupContextInjectionState): Promise<void> {
111
+ (await setConfigAsync(STARTUP_CONTEXT_NAMESPACE, agentId, state, "startup-context-injection"));
111
112
  }
112
113
 
113
114
  /** #2171 — the machine this agent runs on, named the way the spawn named it (see the call site).
@@ -132,6 +133,7 @@ export function composeStartupContextForAgent(agent: AgentCard): ComposedSpawnIn
132
133
  if (!inputs) return null;
133
134
  const landGatesHost = landGatesHostForAgent(agent);
134
135
  return composeSpawnInstructionsWithEvents({
136
+ projectId: memorySeamForAgent(agent).identity.projectId,
135
137
  ...(inputs.cwd ? { cwd: inputs.cwd } : {}),
136
138
  // #2171 — the validation block belongs to the machine this agent runs on. This seam is
137
139
  // synchronous (it settles a lifecycle command), so for a remote host it serves what that host's
@@ -162,12 +164,14 @@ export function composeStartupContextForAgent(agent: AgentCard): ComposedSpawnIn
162
164
  * A prior inject rode the summarized transcript, so the recorded delivery hash proves delivery,
163
165
  * not survival — trusting it lets a summarized-away block skip forever. The launch prompt rode
164
166
  * the preserved system prompt, so only it proves the block is still there. Unresolvable ⇒ null
165
- * ⇒ re-inject, never skip. (Mirrors launchBakedMemoryHash/launchBakedJournalHash.)
167
+ * ⇒ re-inject, never skip. (Mirrors launchBakedMemoryHash/launchBakedJournalHash.) The strip must
168
+ * remove EVERY relay-owned section (identity, memory, journal): a leftover journal block made this
169
+ * hash never match a real coordinator launch, so every /clear re-injected the full charter (#3782).
166
170
  */
167
171
  function launchBakedStartupHash(agent: AgentCard): string | null {
168
172
  const prompt = launchSystemPromptAppend(findLaunchPromptCommandForAgent(agent.id, stringValue(agent.meta?.spawnRequestId)));
169
173
  if (!prompt) return null;
170
- const portion = normalizeStartupBlock(stripHumwickIdentitySection(stripMemoryPreamble(prompt)));
174
+ const portion = normalizeStartupBlock(stripRelayOwnedSections(prompt));
171
175
  return portion ? startupBlockHash(portion) : null;
172
176
  }
173
177
 
@@ -179,7 +183,7 @@ function launchBakedStartupHash(agent: AgentCard): string | null {
179
183
  * outcome (unchanged block, provider cannot inject, nothing composable, nothing to inject), always
180
184
  * reported in a `relay-injection` event rather than inferred from silence.
181
185
  */
182
- export function enqueueStartupContextInjectionAfterContextCommand(command: Command, now: number = Date.now()): Command | null {
186
+ export async function enqueueStartupContextInjectionAfterContextCommand(command: Command, now: number = Date.now()): Promise<Command | null> {
183
187
  // A lifecycle command's status is the runner's confirmation verdict, not proof that the
184
188
  // destructive boundary did not happen. In particular, a clear-inject that cannot confirm its
185
189
  // `/clear` may have committed and is deliberately settled failed so the continuation beside this
@@ -196,28 +200,29 @@ export function enqueueStartupContextInjectionAfterContextCommand(command: Comma
196
200
  const composed = composeStartupContextForAgent(agent);
197
201
 
198
202
  if (contextInjectUnsupported(agent)) {
199
- emitStartupSkip(agent, event, "inject-unsupported", command, now);
203
+ (await emitStartupSkip(agent, event, "inject-unsupported", command, now));
200
204
  return null;
201
205
  }
202
206
  if (!composed) {
203
207
  // No profile prompt to recompose (not a spawn provider). Reported once so an operator can tell
204
208
  // it apart from a broken seam.
205
- emitStartupSkip(agent, event, "not-composable", command, now);
209
+ (await emitStartupSkip(agent, event, "not-composable", command, now));
206
210
  return null;
207
211
  }
208
212
 
209
213
  const block = composed.systemPromptAppend?.trim() ? composed.systemPromptAppend : "";
210
214
  const hash = startupBlockHash(block);
211
215
  if (!block) {
212
- emitStartupSkip(agent, event, "nothing-to-inject", command, now);
216
+ (await emitStartupSkip(agent, event, "nothing-to-inject", command, now));
213
217
  return null;
214
218
  }
215
219
 
216
- // A native compact preserves a real system prompt, but not launch text parts. An unchanged block is already there. A clear
217
- // destroys the context — nothing survives it to be unchanged. User-message launch providers keep neither reliably
218
- // (Codex keeps only recent user messages), so compact always re-injects for them, like the summarizable family.
219
- if (event === "compact" && launchContextSurvivesCompact(agent) && launchBakedStartupHash(agent) === hash) {
220
- emitStartupSkip(agent, event, "unchanged", command, now);
220
+ // #3782 — a persistent system prompt (Claude's --append-system-prompt) survives BOTH a native
221
+ // compact and a /clear, so a block still equal to the launch-baked one is already above: skip.
222
+ // A changed charter (hash differs), an unresolvable launch prompt, or a provider whose launch
223
+ // text rides summarizable parts / user messages (OpenCode, Codex) re-injects at either boundary.
224
+ if (launchContextSurvivesCompact(agent) && launchBakedStartupHash(agent) === hash) {
225
+ (await emitStartupSkip(agent, event, "unchanged", command, now));
221
226
  return null;
222
227
  }
223
228
 
@@ -232,7 +237,7 @@ export function enqueueStartupContextInjectionAfterContextCommand(command: Comma
232
237
  // Delivered WITH the superseding note; hashed and gated on the canonical block (note excluded), so
233
238
  // the gate cannot loop.
234
239
  const content = `${STARTUP_CONTEXT_SUPERSEDE_NOTICE}\n\n${injectBlock}`;
235
- const inject = createCommand({
240
+ const inject = (await createCommandAsync({
236
241
  type: "agent.injectContext",
237
242
  source: "system",
238
243
  target: command.target,
@@ -251,13 +256,13 @@ export function enqueueStartupContextInjectionAfterContextCommand(command: Comma
251
256
  ...(command.type === "agent.clearContext" ? { afterClearCommandId: command.id } : { afterCompactCommandId: command.id }),
252
257
  },
253
258
  },
254
- });
259
+ }));
255
260
  emitCommandEvent(inject, "command.requested");
256
261
 
257
262
  // Anti-lie: queueing a command is not injecting a charter. The detailed per-block "injected"
258
263
  // events move to settleStartupContextInjectionCommand, where the runner has reported success.
259
264
  // This one row makes pending work visible without claiming the provider has it already.
260
- emitRelayInjectionEvent({
265
+ (await emitRelayInjectionEvent({
261
266
  agentId: agent.id,
262
267
  category: "context",
263
268
  summary: `startup context re-injection queued after ${event}`,
@@ -272,7 +277,7 @@ export function enqueueStartupContextInjectionAfterContextCommand(command: Comma
272
277
  },
273
278
  timestamp: now,
274
279
  idempotencyKey: `startup-context-injection-queued:${agent.id}:${inject.id}`,
275
- });
280
+ }));
276
281
  return inject;
277
282
  }
278
283
 
@@ -282,45 +287,45 @@ export function enqueueStartupContextInjectionAfterContextCommand(command: Comma
282
287
  * ownership and cwd→project resolution, so a throw here must NOT take the rest of the settle chain
283
288
  * down with it; it is reported on the agent's timeline instead.
284
289
  */
285
- export function settleStartupContextInjectionAfterContextCommand(command: Command, now: number = Date.now()): Command | null {
290
+ export async function settleStartupContextInjectionAfterContextCommand(command: Command, now: number = Date.now()): Promise<Command | null> {
286
291
  try {
287
- const inject = enqueueStartupContextInjectionAfterContextCommand(command, now);
288
- settleStartupContextInjectionCommand(command, now);
292
+ const inject = (await enqueueStartupContextInjectionAfterContextCommand(command, now));
293
+ (await settleStartupContextInjectionCommand(command, now));
289
294
  return inject;
290
295
  } catch (error) {
291
- emitRelayInjectionEvent({
296
+ (await emitRelayInjectionEvent({
292
297
  agentId: command.target,
293
298
  category: "context",
294
299
  summary: `startup-context re-injection failed to compose after ${command.type === "agent.compact" ? "compact" : command.type === "agent.clearContext" ? "clear" : command.type}: ${errMessage(error)}`,
295
300
  detail: { source: "startup-context", agentId: command.target, commandId: command.id, failed: true },
296
301
  timestamp: now,
297
302
  idempotencyKey: `startup-context-injection-error:${command.target}:${command.id}`,
298
- });
303
+ }));
299
304
  return null;
300
305
  }
301
306
  }
302
307
 
303
- function emitStartupSkip(
308
+ async function emitStartupSkip(
304
309
  agent: AgentCard,
305
310
  event: StartupContextInjectionEvent,
306
311
  skipped: StartupContextInjectionSkip,
307
312
  command: Command,
308
313
  now: number,
309
- ): void {
314
+ ): Promise<void> {
310
315
  const summaries: Record<StartupContextInjectionSkip, string> = {
311
316
  unchanged: `startup context unchanged after ${event} — re-injection skipped`,
312
317
  "inject-unsupported": `startup context NOT re-injected after ${event}: provider declares context.inject:false (spawn-time block only)`,
313
318
  "nothing-to-inject": `startup context resolved nothing to inject after ${event}`,
314
319
  "not-composable": `startup context not recomposable after ${event}: agent has no spawn-provider profile prompt`,
315
320
  };
316
- emitRelayInjectionEvent({
321
+ (await emitRelayInjectionEvent({
317
322
  agentId: agent.id,
318
323
  category: "context",
319
324
  summary: summaries[skipped],
320
325
  detail: { source: "startup-context", event, agentId: agent.id, skipped, commandId: command.id },
321
326
  timestamp: now,
322
327
  idempotencyKey: `startup-context-injection-skip:${agent.id}:${command.id}`,
323
- });
328
+ }));
324
329
  }
325
330
 
326
331
  /**
@@ -330,7 +335,7 @@ function emitStartupSkip(
330
335
  * Recording on success makes the gate self-healing — a failed delivery leaves the previous hash and
331
336
  * the next boundary retries.
332
337
  */
333
- export function settleStartupContextInjectionCommand(command: Command, now: number = Date.now()): void {
338
+ export async function settleStartupContextInjectionCommand(command: Command, now: number = Date.now()): Promise<void> {
334
339
  if (command.type !== "agent.injectContext" || command.status !== "succeeded") return;
335
340
  if (command.params.reason !== STARTUP_CONTEXT_INJECTION_REASON) return;
336
341
  const startup = command.params.startupContext;
@@ -338,12 +343,12 @@ export function settleStartupContextInjectionCommand(command: Command, now: numb
338
343
  const record = startup as Record<string, unknown>;
339
344
  const hash = typeof record.hash === "string" ? record.hash : undefined;
340
345
  if (hash === undefined) return;
341
- recordStartupContextInjectionState(command.target, {
346
+ (await recordStartupContextInjectionState(command.target, {
342
347
  hash,
343
348
  event: record.event === "clear" ? "clear" : "compact",
344
349
  at: now,
345
- });
346
- emitStartupContextDeliveredEvents(command, record, now);
350
+ }));
351
+ (await emitStartupContextDeliveredEvents(command, record, now));
347
352
  }
348
353
 
349
354
  /** Preserve only enough of the composition for the success-side audit event. The actual charter
@@ -378,12 +383,12 @@ function queuedStartupBlockEvents(record: Record<string, unknown>): Array<{ cate
378
383
  });
379
384
  }
380
385
 
381
- function emitStartupContextDeliveredEvents(command: Command, record: Record<string, unknown>, now: number): void {
386
+ async function emitStartupContextDeliveredEvents(command: Command, record: Record<string, unknown>, now: number): Promise<void> {
382
387
  const event: StartupContextInjectionEvent = record.event === "clear" ? "clear" : "compact";
383
388
  const boundaryCommandId = stringValue(record.afterClearCommandId) ?? stringValue(record.afterCompactCommandId) ?? command.correlationId;
384
389
  for (const [index, blockEvent] of queuedStartupBlockEvents(record).entries()) {
385
390
  const source = stringValue(blockEvent.detail.source) ?? "startup-context";
386
- emitRelayInjectionEvent({
391
+ (await emitRelayInjectionEvent({
387
392
  agentId: command.target,
388
393
  category: blockEvent.category,
389
394
  summary: `re-injected after ${event}: ${blockEvent.summary}`,
@@ -396,26 +401,26 @@ function emitStartupContextDeliveredEvents(command: Command, record: Record<stri
396
401
  },
397
402
  timestamp: now,
398
403
  idempotencyKey: `startup-context-injection-delivered:${command.target}:${command.id}:${source}:${index}`,
399
- });
404
+ }));
400
405
  }
401
406
  }
402
407
 
403
408
  /** A failed startup-context composer must not make a maintenance tick throw or block every later
404
409
  * candidate. The reactive settle has the same containment in its public wrapper. */
405
- function containedStartupContextInjection(command: Command, now: number): { inject: Command | null; composeFailed: boolean } {
410
+ async function containedStartupContextInjection(command: Command, now: number): Promise<{ inject: Command | null; composeFailed: boolean }> {
406
411
  try {
407
- return { inject: enqueueStartupContextInjectionAfterContextCommand(command, now), composeFailed: false };
412
+ return { inject: (await enqueueStartupContextInjectionAfterContextCommand(command, now)), composeFailed: false };
408
413
  } catch (error) {
409
414
  // #2712 — a held write lock is contention, not a compose failure: defer, never count it.
410
415
  if (isSqliteBusyError(error)) throw error;
411
- emitRelayInjectionEvent({
416
+ (await emitRelayInjectionEvent({
412
417
  agentId: command.target,
413
418
  category: "context",
414
419
  summary: `startup-context re-injection failed to compose after ${command.type === "agent.compact" ? "compact" : "clear"}: ${errMessage(error)}`,
415
420
  detail: { source: "startup-context", agentId: command.target, commandId: command.id, failed: true },
416
421
  timestamp: now,
417
422
  idempotencyKey: `startup-context-injection-error:${command.target}:${command.id}`,
418
- });
423
+ }));
419
424
  return { inject: null, composeFailed: true };
420
425
  }
421
426
  }
@@ -427,11 +432,11 @@ function containedStartupContextInjection(command: Command, now: number): { inje
427
432
  * prompt's context; collapsing the two would silently strand the clear's charter recovery. The
428
433
  * shared attempt ledger is keyed by boundary correlation id, so it is both the idempotency fence
429
434
  * and the retry state — there is no second per-agent collapse to keep in sync with it. */
430
- export function sweepMissedStartupContextInjections(now: number = Date.now(), signal?: AbortSignal): { enqueuedCommandIds: string[]; aborted?: true } {
435
+ export async function sweepMissedStartupContextInjections(now: number = Date.now(), signal?: AbortSignal): Promise<{ enqueuedCommandIds: string[]; aborted?: true }> {
431
436
  const enqueuedCommandIds: string[] = [];
432
437
  for (const command of sweepableBoundaryCommands(now, signal)) {
433
438
  if (signal?.aborted) break;
434
- sweepStartupBoundary(command, now, enqueuedCommandIds);
439
+ (await sweepStartupBoundary(command, now, enqueuedCommandIds));
435
440
  }
436
441
  return { enqueuedCommandIds, ...(signal?.aborted ? { aborted: true as const } : {}) };
437
442
  }
@@ -440,24 +445,24 @@ export function sweepMissedStartupContextInjections(now: number = Date.now(), si
440
445
  * macrotask each. */
441
446
  async function sweepMissedStartupContextInjectionsPaced(now: number, signal?: AbortSignal): Promise<{ enqueuedCommandIds: string[]; aborted?: true; moreWork?: true }> {
442
447
  const enqueuedCommandIds: string[] = [];
443
- const { moreWork } = await pacedInjectionSweep(() => sweepableBoundaryCommands(now, signal), (command) => sweepStartupBoundary(command, now, enqueuedCommandIds), signal);
448
+ const { moreWork } = await pacedInjectionSweep(() => sweepableBoundaryCommands(now, signal), async (command) => (await sweepStartupBoundary(command, now, enqueuedCommandIds)), signal);
444
449
  return { enqueuedCommandIds, ...(signal?.aborted ? { aborted: true as const } : {}), ...(moreWork ? { moreWork: true as const } : {}) };
445
450
  }
446
451
 
447
- function sweepStartupBoundary(command: Command, now: number, enqueuedCommandIds: string[]): void {
452
+ async function sweepStartupBoundary(command: Command, now: number, enqueuedCommandIds: string[]): Promise<void> {
448
453
  const { decision, attempts } = injectionAttemptDecision(command, STARTUP_CONTEXT_INJECTION_REASON);
449
454
  if (decision === "in-flight") return;
450
455
  if (decision === "exhausted") {
451
- notifyStartupContextInjectionExhausted(command, attempts, now);
456
+ (await notifyStartupContextInjectionExhausted(command, attempts, now));
452
457
  return;
453
458
  }
454
459
  if (attempts === 0 && (startupSweepAlreadyDecided(command) || startupBoundaryAlreadyDecided(command))) return;
455
- const { inject, composeFailed } = containedStartupContextInjection(command, now);
460
+ const { inject, composeFailed } = (await containedStartupContextInjection(command, now));
456
461
  if (inject) {
457
462
  enqueuedCommandIds.push(inject.id);
458
463
  return;
459
464
  }
460
- rememberStartupSweepDecision(command, composeFailed, now);
465
+ (await rememberStartupSweepDecision(command, composeFailed, now));
461
466
  }
462
467
 
463
468
  /**
@@ -476,32 +481,32 @@ function startupSweepAlreadyDecided(command: Command): boolean {
476
481
  return sweptStartupBoundaryDecisions.get(command.id)?.done ?? false;
477
482
  }
478
483
 
479
- function rememberStartupSweepDecision(command: Command, composeFailed: boolean, now: number): void {
484
+ async function rememberStartupSweepDecision(command: Command, composeFailed: boolean, now: number): Promise<void> {
480
485
  const held = sweptStartupBoundaryDecisions.get(command.id);
481
486
  const composeFailures = (held?.composeFailures ?? 0) + (composeFailed ? 1 : 0);
482
487
  const done = !composeFailed || composeFailures >= MAX_INJECTION_ATTEMPTS;
483
488
  if (sweptStartupBoundaryDecisions.size >= MAX_SWEPT_STARTUP_DECISIONS && !held) sweptStartupBoundaryDecisions.clear();
484
489
  sweptStartupBoundaryDecisions.set(command.id, { composeFailures, done });
485
- if (composeFailed && done) notifyStartupContextInjectionExhausted(command, composeFailures, now, "compose");
490
+ if (composeFailed && done) (await notifyStartupContextInjectionExhausted(command, composeFailures, now, "compose"));
486
491
  }
487
492
 
488
493
  function startupBoundaryAlreadyDecided(command: Command): boolean {
489
494
  return findMessageByIdempotencyKey(command.target, `startup-context-injection-skip:${command.target}:${command.id}`) !== null;
490
495
  }
491
496
 
492
- function notifyStartupContextInjectionExhausted(command: Command, attempts: number, now: number, kind: "delivery" | "compose" = "delivery"): void {
497
+ async function notifyStartupContextInjectionExhausted(command: Command, attempts: number, now: number, kind: "delivery" | "compose" = "delivery"): Promise<void> {
493
498
  const idempotencyKey = `startup-context-injection-exhausted${kind === "compose" ? "-compose" : ""}:${command.target}:${command.id}`;
494
499
  if (findMessageByIdempotencyKey(command.target, idempotencyKey)) return;
495
500
  const event = command.type === "agent.compact" ? "compact" : "clear";
496
501
  const what = kind === "compose" ? "failed to compose" : "could not be delivered";
497
- emitRelayInjectionEvent({
502
+ (await emitRelayInjectionEvent({
498
503
  agentId: command.target,
499
504
  category: "context",
500
505
  summary: `startup-context re-injection gave up after ${attempts} attempt(s) at a ${event} boundary — it ${what}, so this agent may be running without its current profile charter`,
501
506
  detail: { source: "startup-context", agentId: command.target, commandId: command.id, event, attempts, exhausted: kind },
502
507
  timestamp: now,
503
508
  idempotencyKey,
504
- });
509
+ }));
505
510
  }
506
511
 
507
512
  export const STARTUP_CONTEXT_INJECTION_SWEEP_JOB = {