@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
@@ -35,14 +35,6 @@ export function openCodeBackendApiKeyEnvVar(backendID: string): string | undefin
35
35
  return OPENCODE_STATIC_BACKENDS[backendID]?.envVar;
36
36
  }
37
37
 
38
- /** Catalog alias → provider model (older runner protocols carry the alias without a record). */
39
- function openCodeAliasResolved(model: string | undefined, manifest: ProviderManifest, provider: string): string {
40
- const alias = model?.trim() || manifest.catalog.defaultModel;
41
- const raw = manifest.catalog.models.find((entry) => entry.alias === alias)?.providerModel || alias;
42
- if (!raw) throw new Error(`OpenCode provider ${provider} has no default model.`);
43
- return raw;
44
- }
45
-
46
38
  /**
47
39
  * #2659 — the launch model: THE one normalization of a spawn's model through the shared seam
48
40
  * (`resolveOpenCodeModelId`). A server-threaded record's qualified name wins over the alias.
@@ -51,8 +43,9 @@ function openCodeAliasResolved(model: string | undefined, manifest: ProviderMani
51
43
  * default-backend model id.
52
44
  */
53
45
  export function openCodeLaunchModel(model: string | undefined, provider = "opencode", record?: ResolvedModelRecord, registry?: OpenCodeModelRegistry): OpenCodeModelId {
54
- const { manifest, backend } = openCodeBackend(provider);
55
- const input = record?.qualifiedModel || openCodeAliasResolved(model, manifest, provider);
46
+ const { backend } = openCodeBackend(provider);
47
+ const input = record?.qualifiedModel || model?.trim();
48
+ if (!input) throw new Error(`OpenCode provider ${provider} requires a hub-resolved model.`);
56
49
  return resolveOpenCodeModelId(input, backend.opencodeProviderID, registry);
57
50
  }
58
51
 
@@ -111,18 +104,10 @@ export function openCodeCustomBackendIDs(): string[] {
111
104
  return getAllManifests().flatMap((entry) => entry.opencode && OPENCODE_STATIC_BACKENDS[entry.opencode.opencodeProviderID]?.custom ? [entry.opencode.opencodeProviderID] : []);
112
105
  }
113
106
 
114
- /** Read the current backend's declared context window from the manifest catalog. */
115
- export function openCodeContextWindowTokens(model: string | undefined, provider = "opencode", record?: ResolvedModelRecord): number | undefined {
116
- // #2599 — precedence payload > manifest > undefined: the record's window wins; a malformed
117
- // record window never reaches here (the shared parser drops it), so no second gate is needed.
118
- if (typeof record?.contextWindowTokens === "number" && Number.isFinite(record.contextWindowTokens) && record.contextWindowTokens > 0) {
119
- openCodeBackend(provider); // keep the unknown-provider hard error on the record path too.
120
- return record.contextWindowTokens;
121
- }
122
- const { manifest } = openCodeBackend(provider);
123
- const { modelID } = openCodeLaunchModel(model, provider);
124
- const value = manifest.catalog.models.find((entry) => entry.alias === modelID || entry.providerModel === modelID)?.limits?.contextWindowTokens?.value;
125
- return typeof value === "number" && Number.isFinite(value) ? value : undefined;
107
+ /** Context limits come from the hub-resolved launch record. */
108
+ export function openCodeContextWindowTokens(_model: string | undefined, provider = "opencode", record?: ResolvedModelRecord): number | undefined {
109
+ openCodeBackend(provider);
110
+ return record?.contextWindowTokens;
126
111
  }
127
112
 
128
113
  /**
@@ -1505,7 +1505,7 @@ export class OpenCodeAdapter implements ProviderAdapter {
1505
1505
  const tokens = countTokens(info?.tokens);
1506
1506
  const sessionUnattributable = Boolean(activeSessionId && sessionID !== activeSessionId);
1507
1507
  if (process && role === "assistant" && tokens !== undefined && !sessionUnattributable) {
1508
- const model = stringValue(process.meta?.model) ?? openCodeQualifiedModel(undefined, this.provider);
1508
+ const model = stringValue(process.meta?.model);
1509
1509
  this.reportContextUsage(process, model, tokens);
1510
1510
  }
1511
1511
  // #2484 — same door, reused for the spine report: model/createdAt prefer the message's
@@ -1516,7 +1516,7 @@ export class OpenCodeAdapter implements ProviderAdapter {
1516
1516
  scheduleOpenCodeTokenUsage(this.tokenUsagePoster, {
1517
1517
  provider: this.provider,
1518
1518
  sessionId: activeSessionId ?? sessionID,
1519
- model: openCodeMessageModel(info) ?? stringValue(process.meta?.model) ?? openCodeQualifiedModel(undefined, this.provider),
1519
+ model: openCodeMessageModel(info) ?? stringValue(process.meta?.model),
1520
1520
  messageId: id,
1521
1521
  tokens: info?.tokens,
1522
1522
  createdAt: openCodeMessageObservedAt(info),
@@ -1832,8 +1832,8 @@ export class OpenCodeAdapter implements ProviderAdapter {
1832
1832
  for (const relayContextInput = prepareOpenCodeRelayContext(process, text);;) {
1833
1833
  const client = process.meta?.client as OpenCodeClient | undefined;
1834
1834
  const sessionId = stringValue(process.meta?.sessionId);
1835
- const model = stringValue(process.meta?.model) ?? openCodeQualifiedModel(undefined, this.provider);
1836
- if (!client || !sessionId) throw new Error("OpenCode session is not ready");
1835
+ const model = stringValue(process.meta?.model);
1836
+ if (!client || !sessionId || !model) throw new Error("OpenCode session is not ready with a hub-resolved model");
1837
1837
  // #2397 round 5 review (LOW-2) — raised only once we're actually about to run an attempt
1838
1838
  // (past the guard above), so a "session not ready" throw never emits a close for a turn
1839
1839
  // that never started (never emitted its own busy edge below).
@@ -1,61 +1,47 @@
1
1
  import { writeChildEnv } from "@humwick/sdk/env";
2
- import type { QuotaState, HumwickHttpClient } from "@humwick/sdk";
2
+ import type { QuotaState, HeartbeatReport, HeartbeatResult } from "@humwick/sdk";
3
3
  import { getManifest } from "@humwick/providers";
4
4
  import { quotaStateFromProbeMetrics } from "@humwick/sdk/context-probe";
5
5
  import { claudeQuotaGeneration, claudeQuotaUnavailableWindows } from "@humwick/sdk/provider-quota-order";
6
6
  import { readRunnerContextProbeState } from "../context-probe-state";
7
7
  import { providerHostConfigHome } from "../profile-home";
8
- import { DEFAULT_PROVIDER_QUOTA_CONFIG, normalizeProviderQuotaConfig, resolveClaudeStatuslineQuotaIdentity, type ProviderQuotaIdentity } from "../quota";
8
+ import { resolveClaudeStatuslineQuotaIdentity, type ProviderQuotaIdentity } from "../quota";
9
9
 
10
- const PASSIVE_QUOTA_CONFIG_REFRESH_MS = 60_000;
11
10
  const PASSIVE_QUOTA_SAMPLE_STALE_MS = 10 * 60_000;
12
- const PASSIVE_QUOTA_LEASE_MAX_TTL_MS = 10 * 60_000;
13
- const PASSIVE_QUOTA_LEASE_PADDING_MS = 60_000;
14
11
 
15
12
  interface ProviderQuotaHarvestOptions {
16
13
  agentId: string;
17
14
  provider: string;
18
15
  /** The runner's per-provider config env (central provider-config values), read lazily each publish. */
19
16
  providerConfigEnv: () => Record<string, string>;
20
- http: () => Pick<HumwickHttpClient, "acquireProviderQuotaPublisherLease" | "getProviderQuotaConfig" | "upsertProviderQuota">;
21
17
  }
22
18
 
23
19
  export class ProviderQuotaHarvest {
24
- private config = { ...DEFAULT_PROVIDER_QUOTA_CONFIG };
25
- private configRefreshAt = 0;
26
- private lastReportAt?: number;
27
20
  private lastReportedObservedAt?: number;
28
- private lease?: { accountKey: string; leaseToken: string; expiresAt: number };
29
- private nextLeaseAttemptAt?: number;
21
+ private nextAttemptAt = 0;
22
+ private lease?: { accountKey: string; leaseToken: string };
30
23
 
31
24
  constructor(private readonly options: ProviderQuotaHarvestOptions) {}
32
25
 
33
- async publish(): Promise<void> {
34
- // #2514 — the statusline harvest serves the whole claude FAMILY (claude + claude-b): the
35
- // manifest's shim kind is the family declaration, so a second-subscription provider reuses
36
- // this path under its own id without a provider list here.
37
- if (getManifest(this.options.provider)?.shim?.kind !== "claude-relay") return;
38
- const probeMetrics = readRunnerContextProbeState(this.options.agentId);
39
- const now = Date.now();
40
- const quota = probeMetrics ? freshQuotaFromProbeMetrics(probeMetrics, now) : undefined;
41
- // An idle session re-sends nothing new; skipping lets its lease lapse to an active session (#3082).
26
+ async sample(): Promise<Pick<HeartbeatReport, "providerQuota" | "quotaLeaseToken"> | undefined> {
27
+ if (getManifest(this.options.provider)?.shim?.kind !== "claude-relay" || Date.now() < this.nextAttemptAt) return;
28
+ const metrics = readRunnerContextProbeState(this.options.agentId);
29
+ const quota = metrics ? freshQuotaFromProbeMetrics(metrics, Date.now()) : undefined;
42
30
  if (!quota || (this.lastReportedObservedAt !== undefined && quota.updatedAt <= this.lastReportedObservedAt)) return;
43
- const config = await this.refreshConfig();
44
- if (!config.enabled) return;
45
- if (this.lastReportAt !== undefined && now - this.lastReportAt < config.pollIntervalMs) return;
46
31
  const identity = await this.resolveIdentity();
47
32
  if (!identity) return;
48
- if (!await this.ensurePublisherLease(identity.accountKey, config.pollIntervalMs, now)) return;
49
- await this.options.http().upsertProviderQuota({
50
- provider: this.options.provider,
51
- accountKey: identity.accountKey,
52
- quota,
53
- unavailableWindows: claudeQuotaUnavailableWindows(quota),
54
- lastAttemptAt: now,
55
- sourceAgentId: this.options.agentId,
56
- });
57
- this.lastReportAt = now;
58
- this.lastReportedObservedAt = quota.updatedAt;
33
+ return {
34
+ providerQuota: { provider: this.options.provider, accountKey: identity.accountKey, quota,
35
+ unavailableWindows: claudeQuotaUnavailableWindows(quota), lastAttemptAt: Date.now(), sourceAgentId: this.options.agentId },
36
+ ...(this.lease?.accountKey === identity.accountKey ? { quotaLeaseToken: this.lease.leaseToken } : {}),
37
+ };
38
+ }
39
+
40
+ accept(report: HeartbeatReport, result: HeartbeatResult["providerQuota"]): void {
41
+ if (!result || !report.providerQuota) return;
42
+ this.nextAttemptAt = Date.now() + result.retryAfterMs;
43
+ if (result.reported) this.lastReportedObservedAt = report.providerQuota.quota?.updatedAt;
44
+ if (result.leaseToken) this.lease = { accountKey: report.providerQuota.accountKey, leaseToken: result.leaseToken };
59
45
  }
60
46
 
61
47
  // #2514 — quota identity resolves exactly as the LAUNCH authenticates. The primary claude
@@ -77,43 +63,6 @@ export class ProviderQuotaHarvest {
77
63
  });
78
64
  }
79
65
 
80
- private async refreshConfig() {
81
- const now = Date.now();
82
- if (now < this.configRefreshAt) return this.config;
83
- this.configRefreshAt = now + PASSIVE_QUOTA_CONFIG_REFRESH_MS;
84
- try {
85
- const map = await this.options.http().getProviderQuotaConfig();
86
- const providerCfg = map[this.options.provider];
87
- this.config = providerCfg
88
- ? normalizeProviderQuotaConfig(providerCfg)
89
- : { ...DEFAULT_PROVIDER_QUOTA_CONFIG };
90
- } catch {
91
- // Keep the previous config; defaults preserve collection if the relay is older
92
- // or temporarily unreachable during a liveness tick.
93
- }
94
- return this.config;
95
- }
96
-
97
- private async ensurePublisherLease(accountKey: string, pollIntervalMs: number, now: number): Promise<boolean> {
98
- if (this.lease?.accountKey === accountKey && this.lease.expiresAt > now) return true;
99
- if (this.nextLeaseAttemptAt !== undefined && now < this.nextLeaseAttemptAt) return false;
100
- const leaseToken = this.lease?.accountKey === accountKey ? this.lease.leaseToken : undefined;
101
- const result = await this.options.http().acquireProviderQuotaPublisherLease({
102
- provider: this.options.provider,
103
- accountKey,
104
- sourceAgentId: this.options.agentId,
105
- ...(leaseToken ? { leaseToken } : {}),
106
- ttlMs: Math.min(PASSIVE_QUOTA_LEASE_MAX_TTL_MS, pollIntervalMs + PASSIVE_QUOTA_LEASE_PADDING_MS),
107
- });
108
- if (!result.acquired || !result.lease) {
109
- this.lease = undefined;
110
- this.nextLeaseAttemptAt = now + Math.min(result.retryAfterMs ?? pollIntervalMs, pollIntervalMs);
111
- return false;
112
- }
113
- this.lease = { accountKey, leaseToken: result.lease.leaseToken, expiresAt: result.lease.expiresAt };
114
- this.nextLeaseAttemptAt = undefined;
115
- return true;
116
- }
117
66
  }
118
67
 
119
68
  function freshQuotaFromProbeMetrics(metrics: NonNullable<ReturnType<typeof readRunnerContextProbeState>>, now: number): QuotaState | undefined {
@@ -14,13 +14,26 @@ interface CredentialsDeps {
14
14
  publishRenewalFailure(): void;
15
15
  logRunnerDiagnostic(message: string): void;
16
16
  reportBackgroundRejection(scope: string, status: string, title: string, error: unknown): void;
17
+ /** Recovery gave up: the runner must exit so Relay sees a terminal failure, not a mint loop (#3775). */
18
+ onTerminalAuthFailure(reason: string): void;
17
19
  }
18
20
 
19
21
  const TOKEN_RENEW_LOG_INTERVAL_MS = 5 * 60 * 1000;
20
22
  const TOKEN_RENEW_RETRY_MS = 60_000;
21
- // Debounce reactive token recovery so a burst of 401-ing calls in the same window
22
- // triggers a single re-mint attempt, not one per failing request.
23
- const REACTIVE_TOKEN_RECOVERY_DEBOUNCE_MS = 10_000;
23
+ // #3775 — a successful mint does not prove the hub accepts the runner: an orphaned runner kept
24
+ // getting 401 on its fresh token and re-minted ~2/s. Auth recoveries back off (1 s doubling to
25
+ // 5 min, jittered) and stop after a bounded count; only a quiet spell resets the count.
26
+ export const AUTH_RECOVERY_MAX_ATTEMPTS = 10;
27
+ const AUTH_RECOVERY_BASE_MS = 1_000;
28
+ const AUTH_RECOVERY_MAX_DELAY_MS = 5 * 60_000;
29
+ const AUTH_RECOVERY_QUIET_RESET_MS = 30 * 60_000;
30
+
31
+ /** Delay before auth recovery `attempt` (0-based): the first heals at once, later ones back off with equal jitter. */
32
+ export function authRecoveryDelayMs(attempt: number, random: () => number = Math.random): number {
33
+ if (attempt <= 0) return 0;
34
+ const ceiling = Math.min(AUTH_RECOVERY_MAX_DELAY_MS, AUTH_RECOVERY_BASE_MS * 2 ** (attempt - 1));
35
+ return Math.round(ceiling / 2 + random() * (ceiling / 2));
36
+ }
24
37
 
25
38
  export class Credentials {
26
39
  private currentToken?: string;
@@ -30,7 +43,10 @@ export class Credentials {
30
43
  private tokenRenewTimer?: Timer;
31
44
  private readonly tokenRotation = new TokenRotation();
32
45
  private tokenRenewLastLog?: { key: string; at: number };
33
- private reactiveTokenRecoveryAt?: number;
46
+ private authRecoveryAttempts = 0;
47
+ private authRecoveryLastAt?: number;
48
+ private authRecoveryTimer?: Timer;
49
+ private authRecoveryExhausted = false;
34
50
 
35
51
  constructor(options: { token?: string; tokenJti?: string; tokenProfileId?: string; tokenExpiresAt?: number }, private readonly deps: CredentialsDeps) {
36
52
  this.currentToken = options.token;
@@ -47,6 +63,8 @@ export class Credentials {
47
63
  stop(): void {
48
64
  if (this.tokenRenewTimer) clearTimeout(this.tokenRenewTimer);
49
65
  this.tokenRenewTimer = undefined;
66
+ if (this.authRecoveryTimer) clearTimeout(this.authRecoveryTimer);
67
+ this.authRecoveryTimer = undefined;
50
68
  }
51
69
 
52
70
  // Timer/edge callers cannot await renewal; report an escaping rejection so it cannot
@@ -55,22 +73,35 @@ export class Credentials {
55
73
  void this.renewRuntimeToken().catch((error) => this.deps.reportBackgroundRejection("runtime token renewal", "runtime-token-renewal-failed", "Runtime token renewal aborted", error));
56
74
  }
57
75
 
58
- // The TTL timer cannot detect revocation: recover on auth failure, coalescing a burst.
76
+ // The TTL timer cannot detect revocation: recover on auth failure, coalescing a burst into the
77
+ // one recovery in flight or scheduled.
59
78
  // Orchestrator re-mint heals stale/expired tokens but preserves hard revocation (#484).
60
79
  recoverRuntimeTokenAfterAuthFailure(source: string): void {
61
- if (this.deps.isStopped() || this.tokenRotation.inFlight) return;
80
+ if (this.deps.isStopped() || this.authRecoveryExhausted || this.tokenRotation.inFlight || this.authRecoveryTimer) return;
62
81
  if (!this.isRuntimeTokenRenewable() && !this.canRemintViaOrchestrator()) return;
63
82
  const now = Date.now();
64
- if (this.reactiveTokenRecoveryAt && now - this.reactiveTokenRecoveryAt < REACTIVE_TOKEN_RECOVERY_DEBOUNCE_MS) return;
65
- this.reactiveTokenRecoveryAt = now;
66
- this.deps.logRunnerDiagnostic(`[runner] relay auth failure on ${source}; recovering runtime token`);
67
- this.renewRuntimeTokenInBackground();
83
+ if (this.authRecoveryLastAt !== undefined && now - this.authRecoveryLastAt >= AUTH_RECOVERY_QUIET_RESET_MS) this.authRecoveryAttempts = 0;
84
+ if (this.authRecoveryAttempts >= AUTH_RECOVERY_MAX_ATTEMPTS) {
85
+ this.authRecoveryExhausted = true;
86
+ this.stop();
87
+ this.deps.onTerminalAuthFailure(`runtime-token-auth-failed: relay still rejects the runner (last on ${source}) after ${AUTH_RECOVERY_MAX_ATTEMPTS} token recoveries`);
88
+ return;
89
+ }
90
+ const delayMs = authRecoveryDelayMs(this.authRecoveryAttempts);
91
+ this.authRecoveryAttempts += 1;
92
+ this.authRecoveryLastAt = now;
93
+ this.deps.logRunnerDiagnostic(`[runner] relay auth failure on ${source}; recovering runtime token (attempt ${this.authRecoveryAttempts}/${AUTH_RECOVERY_MAX_ATTEMPTS}${delayMs ? ` in ${Math.ceil(delayMs / 1000)}s` : ""})`);
94
+ if (!delayMs) return this.renewRuntimeTokenInBackground();
95
+ this.authRecoveryTimer = setTimeout(() => {
96
+ this.authRecoveryTimer = undefined;
97
+ this.renewRuntimeTokenInBackground();
98
+ }, delayMs);
68
99
  }
69
100
 
70
101
  scheduleRuntimeTokenRenewal(delayMs?: number): void {
71
102
  if (this.tokenRenewTimer) clearTimeout(this.tokenRenewTimer);
72
103
  this.tokenRenewTimer = undefined;
73
- if (this.deps.isStopped()) return;
104
+ if (this.deps.isStopped() || this.authRecoveryExhausted) return;
74
105
  const canSelfRenew = this.isRuntimeTokenRenewable();
75
106
  const canRemint = this.canRemintViaOrchestrator();
76
107
  // Keep the renewal clock ticking as long as the session can recover its token
@@ -152,7 +183,6 @@ export class Credentials {
152
183
  this.currentTokenProfileId = record.profileId ?? this.currentTokenProfileId;
153
184
  this.currentTokenExpiresAt = record.expiresAt;
154
185
  this.deps.onTokenChanged(token, record);
155
- this.reactiveTokenRecoveryAt = undefined;
156
186
  this.deps.resumeLivenessAndPublishRotation(status, record.jti);
157
187
  this.scheduleRuntimeTokenRenewal();
158
188
  }
@@ -0,0 +1,27 @@
1
+ import type { Message } from "@humwick/sdk";
2
+ import type { HumwickHttpClient } from "@humwick/sdk/http-client";
3
+ import { isNotificationOnlyInput } from "../inbox-carrier";
4
+ import { logger } from "../logger";
5
+
6
+ export async function bootstrapUnreadMessages(http: Pick<HumwickHttpClient, "pollMessages">, agentId: string, enqueue: (message: Message) => void): Promise<void> {
7
+ try {
8
+ const messages = await http.pollMessages({ for: agentId, unread: true, limit: 100, turnDelivery: true });
9
+ for (const message of messages) enqueue(message);
10
+ } catch (error) { logger.error("runner", `inbox bootstrap failed: ${error}`); }
11
+ }
12
+
13
+ /** Keep startup failure visible to each sender, including mail queued before the check (#3751). */
14
+ export async function reportUnavailableMessages(
15
+ http: Pick<HumwickHttpClient, "sendMessage" | "markRead">, agentId: string,
16
+ pending: Map<number, Message>, settled: Set<number>, reason: string,
17
+ ): Promise<void> {
18
+ for (const [id, message] of pending) {
19
+ try {
20
+ if (!isNotificationOnlyInput(message)) await http.sendMessage({ from: agentId, to: message.from, replyTo: id,
21
+ body: reason, idempotencyKey: `provider-startup-${agentId}-${id}`, payload: { kind: "notification" } });
22
+ await http.markRead(id, agentId);
23
+ pending.delete(id);
24
+ settled.add(id);
25
+ } catch (error) { logger.error("runner", `startup failure reply failed: ${error}`); }
26
+ }
27
+ }
@@ -15,7 +15,6 @@ interface LifecycleMilestoneDeps {
15
15
  process(): ManagedProcess | undefined;
16
16
  stopAttachmentCacheSweep(): void;
17
17
  stopTestRunDedupSweep(): void;
18
- stopGateRunLeaseProbe(): void;
19
18
  disposeEmptyTurns(): void;
20
19
  resetEmptyTurns(): void;
21
20
  resetLateClearRecovery(): void;
@@ -25,7 +24,7 @@ interface LifecycleMilestoneDeps {
25
24
  stopDrainTimer(): void;
26
25
  stopSubmitRecoveryPoll(): void;
27
26
  stopTaskClaims(): void;
28
- stopHttpLiveness(): void;
27
+ stopLiveness(): void;
29
28
  stopCredentials(): void;
30
29
  disarmBusyLivenessReconcile(): void;
31
30
  disarmBusyReconciler(): void;
@@ -92,7 +91,6 @@ export class LifecycleMilestones {
92
91
  private backgroundStopped(): void {
93
92
  this.deps.stopAttachmentCacheSweep();
94
93
  this.deps.stopTestRunDedupSweep();
95
- this.deps.stopGateRunLeaseProbe();
96
94
  // #2389 — before the shutdown await, not after: an escalation or settle timer firing during a
97
95
  // graceful provider shutdown would publish a "produced nothing" verdict about a turn the
98
96
  // shutdown itself ended.
@@ -142,7 +140,7 @@ export class LifecycleMilestones {
142
140
  this.deps.stopDrainTimer();
143
141
  this.deps.stopSubmitRecoveryPoll();
144
142
  this.deps.stopTaskClaims();
145
- this.deps.stopHttpLiveness();
143
+ this.deps.stopLiveness();
146
144
  this.deps.stopCredentials();
147
145
  this.deps.disarmBusyLivenessReconcile();
148
146
  this.deps.disarmBusyReconciler();
@@ -0,0 +1,104 @@
1
+ import { errMessage, type HumwickBusClient, type HumwickHttpClient, type HeartbeatReport, type HeartbeatResult, type Message } from "@humwick/sdk";
2
+ import { httpErrorKey, isHttpAuthError, runnerAgentStatus } from "../runner-helpers";
3
+ import type { ClaimTracker } from "../claim-tracker";
4
+
5
+ const LIVENESS_INTERVAL_MS = 20_000;
6
+ // Shorter than the interval, so a wedged bus exchange falls back to HTTP before the next tick.
7
+ const BUS_LIVENESS_TIMEOUT_MS = 15_000;
8
+
9
+ interface LivenessExchangeDeps {
10
+ http: Pick<HumwickHttpClient, "heartbeat">;
11
+ bus(): Pick<HumwickBusClient, "livenessAvailable" | "reportLiveness">;
12
+ agentId: string;
13
+ instanceId: string;
14
+ logIntervalMs: number;
15
+ isStopped(): boolean;
16
+ isTerminalStatusLatched(): boolean;
17
+ currentStatus: ClaimTracker["currentStatus"];
18
+ sampleQuota(): Promise<Pick<HeartbeatReport, "providerQuota" | "quotaLeaseToken"> | undefined>;
19
+ acceptQuota(report: HeartbeatReport, result: HeartbeatResult["providerQuota"]): void;
20
+ enqueueMessage(message: Message): void;
21
+ triggerEffort(): void;
22
+ recoverRuntimeTokenAfterAuthFailure(source: string): void;
23
+ logRunnerDiagnostic(message: string): void;
24
+ }
25
+
26
+ /** The runner's periodic liveness exchange (#3608). It rides the registered bus socket and falls
27
+ * back to HTTP while the socket is down or the exchange fails on it (#3618). */
28
+ export class LivenessExchange {
29
+ private timer?: Timer;
30
+ private inFlight = false;
31
+ private authFailed = false;
32
+ private lastLog?: { key: string; at: number };
33
+
34
+ constructor(private readonly deps: LivenessExchangeDeps) {}
35
+
36
+ stop(): void {
37
+ if (this.timer) clearInterval(this.timer);
38
+ this.timer = undefined;
39
+ }
40
+
41
+ resetAuthFailure(): void { this.authFailed = false; }
42
+
43
+ start(): void {
44
+ if (this.timer) clearInterval(this.timer);
45
+ void this.publish();
46
+ this.timer = setInterval(() => {
47
+ void this.publish();
48
+ }, LIVENESS_INTERVAL_MS);
49
+ }
50
+
51
+ private async publish(): Promise<void> {
52
+ if (this.deps.isStopped() || this.deps.isTerminalStatusLatched() || this.inFlight || this.authFailed) return;
53
+ this.inFlight = true;
54
+ const status = this.deps.currentStatus();
55
+ const agentStatus = runnerAgentStatus(status);
56
+ try {
57
+ const quota = await this.deps.sampleQuota().catch((error) => {
58
+ this.deps.logRunnerDiagnostic(`passive provider quota sample failed: ${errMessage(error)}`);
59
+ });
60
+ // #3608 — inbox recovery and fresh quota samples ride the single liveness exchange.
61
+ const report: HeartbeatReport = { status: agentStatus, ready: agentStatus !== "offline", unread: true, ...quota };
62
+ const result = await this.exchange(report);
63
+ this.deps.acceptQuota(report, result?.providerQuota);
64
+ for (const message of result?.messages ?? []) this.deps.enqueueMessage(message);
65
+ this.deps.triggerEffort();
66
+ } catch (error) {
67
+ if (!this.deps.isStopped()) this.handleHttpFailure(error);
68
+ } finally {
69
+ this.inFlight = false;
70
+ }
71
+ }
72
+
73
+ private async exchange(report: HeartbeatReport): Promise<HeartbeatResult> {
74
+ const bus = this.deps.bus();
75
+ if (bus.livenessAvailable) {
76
+ try {
77
+ return await bus.reportLiveness(report, BUS_LIVENESS_TIMEOUT_MS);
78
+ } catch (error) {
79
+ // The report is idempotent (status, readiness, unread by id), so a retry over HTTP is safe.
80
+ this.logFailure(`bus:${errMessage(error)}`, `[runner] bus liveness exchange failed, using HTTP: ${errMessage(error)}`);
81
+ }
82
+ }
83
+ return await this.deps.http.heartbeat(this.deps.agentId, this.deps.instanceId, report);
84
+ }
85
+
86
+ private handleHttpFailure(error: unknown): void {
87
+ const authFailed = isHttpAuthError(error);
88
+ const suffix = authFailed ? "auth failed; stopping HTTP liveness retries until restart" : String(error);
89
+ this.logFailure(httpErrorKey(error), `[runner] HTTP liveness update failed: ${suffix}`);
90
+ if (!authFailed) return;
91
+ this.authFailed = true;
92
+ this.stop();
93
+ // A 401/403 here is the only timely signal that the token died — stopping the
94
+ // liveness timer means there is no second chance, so recover from THIS failure.
95
+ this.deps.recoverRuntimeTokenAfterAuthFailure("http-liveness");
96
+ }
97
+
98
+ private logFailure(key: string, message: string): void {
99
+ const now = Date.now();
100
+ if (this.lastLog?.key === key && now - this.lastLog.at < this.deps.logIntervalMs) return;
101
+ this.lastLog = { key, at: now };
102
+ this.deps.logRunnerDiagnostic(message);
103
+ }
104
+ }
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env -S bun --no-env-file
2
+ import { runCli } from "../index";
3
+
4
+ runCli("claude");
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env -S bun --no-env-file
2
+ import { runCli } from "../index";
3
+
4
+ runCli("codex");
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env -S bun --no-env-file
2
+ import { runCli } from "../index";
3
+
4
+ runCli("opencode");
@@ -0,0 +1,49 @@
1
+ import { dirname, join, resolve } from "node:path";
2
+ import { HARNESS_SUBAGENTS_DISABLED, harnessSubagentsEnabled } from "@humwick/sdk";
3
+ import type { RunnerSpawnConfig } from "./adapter";
4
+ import { bundledIntegrationHome } from "./provider-integration";
5
+ import { composeSystemPromptAppend } from "./project-instructions";
6
+ import { CLAUDE_NO_ATTRIBUTION_RULE } from "./claude-settings";
7
+ import { claudeWebToolsSteer } from "./web-tools";
8
+ import { chmodSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
9
+
10
+ const APPEND_FLAGS = ["--append-system-prompt", "--append-system-prompt-file"];
11
+
12
+ // #3830 — caller/default appends share the same file channel as Relay context.
13
+ export function claudeCallerAppends(args: string[]): { args: string[]; appends: Array<{ value: string; file: boolean }> } {
14
+ const remaining: string[] = [];
15
+ const appends: Array<{ value: string; file: boolean }> = [];
16
+ for (let i = 0; i < args.length; i++) {
17
+ const arg = args[i]!;
18
+ if (arg === "--") { remaining.push(...args.slice(i)); break; }
19
+ const flag = APPEND_FLAGS.find(flag => arg === flag || arg.startsWith(`${flag}=`));
20
+ if (!flag) { remaining.push(arg); continue; }
21
+ const value = arg === flag ? args[++i] : arg.slice(flag.length + 1);
22
+ if (value === undefined) throw new Error(`${flag} requires a value`);
23
+ appends.push({ value, file: flag.endsWith("-file") });
24
+ }
25
+ return { args: remaining, appends };
26
+ }
27
+
28
+ export function resolveClaudeSystemPrompt(config: RunnerSpawnConfig, defaultArgs: string[], assetHome?: string) {
29
+ const composed = composeSystemPromptAppend(config);
30
+ const parts: Array<{ text: string } | { file: string }> = [{ text: composed.text }];
31
+ for (const append of claudeCallerAppends([...defaultArgs, ...config.providerArgs]).appends) {
32
+ parts.push(append.file ? { file: resolve(config.cwd, append.value) } : { text: append.value });
33
+ }
34
+ parts.push(...[...(harnessSubagentsEnabled(config) ? [] : [HARNESS_SUBAGENTS_DISABLED]), claudeWebToolsSteer(config), CLAUDE_NO_ATTRIBUTION_RULE].map(text => ({ text })));
35
+ return {
36
+ path: join(assetHome ?? bundledIntegrationHome(config), "system-prompt-append.md"),
37
+ reinjected: composed.reinjected,
38
+ parts,
39
+ };
40
+ }
41
+
42
+ export function materializeClaudeSystemPrompt(file?: ReturnType<typeof resolveClaudeSystemPrompt>): void {
43
+ if (!file) return;
44
+ // Report-only assembly never opens caller files; launch materialization owns that failure.
45
+ const text = file.parts.map(part => "text" in part ? part.text : readFileSync(part.file, "utf8")).filter(Boolean).join("\n\n");
46
+ mkdirSync(dirname(file.path), { recursive: true, mode: 0o700 });
47
+ writeFileSync(file.path, text, { mode: 0o600 });
48
+ chmodSync(file.path, 0o600);
49
+ }
@@ -375,8 +375,9 @@ export function detectApprovalModeFromArgs(provider: string, defaultArgs: string
375
375
  return detector ? detector([...defaultArgs, ...providerArgs]) : undefined;
376
376
  }
377
377
 
378
- if (import.meta.main) {
379
- main().catch((error) => {
378
+ export function runCli(provider?: string): void {
379
+ const argv = provider ? [...process.argv.slice(0, 2), provider, ...process.argv.slice(2)] : process.argv;
380
+ main(argv).catch((error) => {
380
381
  // A fatal startup failure (e.g. the runner could not register with the relay within the
381
382
  // deadline) must exit non-zero, not hang or swallow — the orchestrator's exit detection
382
383
  // then reports it and the spawn-parent is notified instead of waiting on a silent zombie.
@@ -384,3 +385,5 @@ if (import.meta.main) {
384
385
  exitRunner(1, `runner fatal: ${errMessage(error)}`);
385
386
  });
386
387
  }
388
+
389
+ if (import.meta.main) runCli();
@@ -1,10 +1,10 @@
1
1
  import { bundledIntegrationAssets, bundledIntegrationHome, suppressOwnedClaudePlugins, selectClaudePluginDirs } from "./provider-integration";
2
2
  import { relayEnv, writeChildEnv } from "@humwick/sdk/env";
3
3
  import { codexRetiredMcpConfigArgs } from "./adapters/codex-effective-config";
4
- import { activeSharedMcpServers, HARNESS_SUBAGENTS_DISABLED, harnessSubagentsEnabled } from "@humwick/sdk";
4
+ import { activeSharedMcpServers } from "@humwick/sdk";
5
5
  import { claudeSubagentHooks, claudeSubagentSettings } from "./adapters/claude-subagents";
6
6
  import { serviceAccessLaunchEnv, serviceAccessMcpServers } from "./adapters/service-access";
7
- import { claudeSettingsArgs, CLAUDE_NO_ATTRIBUTION_RULE, extractCallerSettings, stripSettingsArgs, mergeHookSets, hasSettingsArg, sessionStatusLineSettingsArgs } from "./claude-settings";
7
+ import { claudeSettingsArgs, extractCallerSettings, stripSettingsArgs, mergeHookSets, hasSettingsArg, sessionStatusLineSettingsArgs } from "./claude-settings";
8
8
  export { stripSettingsArgs, sessionStatusLineSettingsArgs } from "./claude-settings";
9
9
  import { rmSync, writeFileSync } from "node:fs";
10
10
  import { basename, relative, resolve, join } from "node:path";
@@ -45,8 +45,8 @@ import type { ResolvedProjectClaudeSettings } from "./provisioning";
45
45
  import { resolveMcpSources, type McpSourceSelection } from "./mcp-source-selection";
46
46
  import { resolveProjectHooks } from "./project-hooks";
47
47
  import { agentRedactEnv, agentRedactOn, isAgentRedactInstall, resolveAgentRedact, type AgentRedactState } from "./agent-redact";
48
- import { composeSystemPromptAppend } from "./project-instructions";
49
- import { claudeWebToolsSteer, disabledSharedWebTools, webToolsEnv, withDisabledWebTools } from "./web-tools";
48
+ import { resolveClaudeSystemPrompt, materializeClaudeSystemPrompt } from "./claude-system-prompt";
49
+ import { disabledSharedWebTools, webToolsEnv, withDisabledWebTools } from "./web-tools";
50
50
  import {
51
51
  claudeMcpConfigPayload,
52
52
  claudeMcpLaunchArgs,
@@ -160,6 +160,7 @@ export interface AssembledMcp {
160
160
 
161
161
  export interface AssembledLaunch {
162
162
  provider: SpawnProvider;
163
+ systemPromptFile?: ReturnType<typeof resolveClaudeSystemPrompt>;
163
164
  /** The resolved profile this launch was assembled from; undefined for a profile-less
164
165
  * (legacy default) spawn, which behaves as host base with relay features default-on. */
165
166
  profile?: AgentProfile;
@@ -546,8 +547,8 @@ function assembleClaude(config: RunnerSpawnConfig, providerConfig: ProviderConfi
546
547
  // #2086 — when P.hooks forces the project scope off but P.instructions is on, re-inject the repo
547
548
  // CLAUDE.md/AGENTS.md through the controlled append-system-prompt channel so the docs are honored
548
549
  // rather than silently dropped (see composeSystemPromptAppend / resolveProjectInstructions).
549
- const { text: composedAppend, reinjected: repoInstructionsReinjected } = composeSystemPromptAppend(config);
550
- const systemPromptAppend = [composedAppend, ...(harnessSubagentsEnabled(config) ? [] : [HARNESS_SUBAGENTS_DISABLED]), claudeWebToolsSteer(config), CLAUDE_NO_ATTRIBUTION_RULE].filter(Boolean).join("\n\n");
550
+ const promptFile = resolveClaudeSystemPrompt(config, hostDefaultArgs, assetHome);
551
+ const repoInstructionsReinjected = promptFile.reinjected;
551
552
  const instructions = assembleInstructions(config, {
552
553
  projectScopeDropped,
553
554
  isolatedHome: Boolean(configHome),
@@ -570,11 +571,12 @@ function assembleClaude(config: RunnerSpawnConfig, providerConfig: ProviderConfi
570
571
  ...(mcpConfigFilePath ? { configFilePath: mcpConfigFilePath } : {}),
571
572
  }),
572
573
  ...settings.args,
573
- ...(systemPromptAppend ? ["--append-system-prompt", systemPromptAppend] : []),
574
+ "--append-system-prompt-file", promptFile.path,
574
575
  ];
575
576
 
576
577
  return {
577
578
  provider,
579
+ systemPromptFile: promptFile,
578
580
  ...(config.agentProfile ? { profile: config.agentProfile } : {}),
579
581
  base: config.agentProfile?.base ?? "host",
580
582
  vanilla,
@@ -938,10 +940,12 @@ export function assembleLaunch(provider: SpawnProvider, config: RunnerSpawnConfi
938
940
  /**
939
941
  * Write the provisioned assets the assembly describes (skills/plugins/hooks and Codex
940
942
  * hooks.json). Driven by the SAME resolvers `assembleLaunch` uses, so disk == launch ==
941
- * report. Idempotent; the isolated home must already exist (prepare*ProfileHome). No-op
942
- * for a host-base profile.
943
+ * report. Idempotent; the isolated home must already exist (prepare*ProfileHome). Claude
944
+ * system context also uses a private file for host-base and profile-less launches.
943
945
  */
944
- export function materializeLaunchAssembly(provider: SpawnProvider, config: RunnerSpawnConfig): void {
946
+ export function materializeLaunchAssembly(provider: SpawnProvider, config: RunnerSpawnConfig, assembled?: AssembledLaunch): void {
947
+ // #3830 — every Claude path, including host-base/profile-less, uses a private file.
948
+ if (getManifest(provider)?.shim?.kind === "claude-relay") materializeClaudeSystemPrompt((assembled ?? assembleLaunch(provider, config, config.providerConfig)).systemPromptFile);
945
949
  if (!config.agentProfile && runnerMcpGeneration(config.env) === "humwick") {
946
950
  const feature = getManifest(provider)?.provisioning?.bundledSkills ? "skills" : "plugins";
947
951
  if (profileAllowsRelayFeature(config, feature)) {
@@ -78,7 +78,7 @@ export function providerHomePathFor(provider: SpawnProvider, config: RunnerSpawn
78
78
  // the repo's CLAUDE.md / AGENTS.md as behavioral instructions, NOT "don't
79
79
  // operate here" — an isolated agent must still read/edit/execute in its own cwd.
80
80
  //
81
- // #2254 — claude-rig / host-base launches skip the onboarding/theme bootstrap (an
81
+ // #2254 — host-base launches skip the onboarding/theme bootstrap (an
82
82
  // onboarded host config already answers those), but they do NOT dodge folder trust:
83
83
  // --dangerously-skip-permissions does not bypass the trust gate, and a cwd the host
84
84
  // config has never seen still renders the dialog and wedges the spawn. Trust is