@humwick/server 0.0.0-stage → 0.130.1
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.
- package/CLA.md +66 -0
- package/CONTRIBUTING.md +144 -0
- package/LICENSE +167 -0
- package/README.md +511 -2
- package/SECURITY.md +67 -0
- package/THIRD_PARTY_NOTICES.md +144 -0
- package/bundled/prompts/README.md +10 -0
- package/bundled/prompts/context.advisory.compact.md +1 -0
- package/bundled/prompts/context.advisory.warn.md +1 -0
- package/bundled/prompts/continuation.envelope.md +18 -0
- package/bundled/prompts/manifest.json +838 -0
- package/bundled/prompts/memory.capture.boundary.post.md +1 -0
- package/bundled/prompts/memory.capture.boundary.pre.md +1 -0
- package/bundled/prompts/memory.charter.md +3 -0
- package/bundled/prompts/memory.native-off.md +0 -0
- package/bundled/prompts/notify.agent.exited.md +1 -0
- package/bundled/prompts/notify.agent.never-ready.md +1 -0
- package/bundled/prompts/notify.agent.ready.md +1 -0
- package/bundled/prompts/notify.automation.budget-warning.md +1 -0
- package/bundled/prompts/notify.land.failure.md +1 -0
- package/bundled/prompts/notify.land.steward-taken.coordinator.md +1 -0
- package/bundled/prompts/notify.land.steward-taken.md +1 -0
- package/bundled/prompts/notify.land.success.md +1 -0
- package/bundled/prompts/notify.routing.policy-changed.md +2 -0
- package/bundled/prompts/notify.spawn.failed.md +1 -0
- package/bundled/prompts/notify.spawn.queued.md +1 -0
- package/bundled/prompts/notify.spawn.recovered.md +1 -0
- package/bundled/prompts/notify.spawn.unconfirmed.md +1 -0
- package/bundled/prompts/profile.coordinator.charter.md +17 -0
- package/bundled/prompts/profile.debugger.system.md +12 -0
- package/bundled/prompts/profile.device-qa.system.md +10 -0
- package/bundled/prompts/profile.image-gen.append.0.md +2 -0
- package/bundled/prompts/profile.image-gen.system.md +4 -0
- package/bundled/prompts/profile.ops-assistant.brief.md +4 -0
- package/bundled/prompts/profile.probe.system.md +5 -0
- package/bundled/prompts/profile.qa.system.md +10 -0
- package/bundled/prompts/profile.sec-ops.system.md +14 -0
- package/bundled/prompts/profile.social-media.system.md +7 -0
- package/bundled/prompts/profile.software-design.system.md +26 -0
- package/bundled/prompts/profile.sub-coordinator.charter.md +2 -0
- package/bundled/prompts/profile.worker-gui.system.md +7 -0
- package/bundled/prompts/profile.worker.system.md +2 -0
- package/bundled/prompts/relay.agent-core.delivery.md +13 -0
- package/bundled/prompts/relay.agent-core.engineering.md +13 -0
- package/bundled/prompts/relay.agent-core.md +22 -0
- package/bundled/prompts/relay.context.claude.md +1 -0
- package/bundled/prompts/relay.context.claude.readonly.md +3 -0
- package/bundled/prompts/relay.context.codex.md +1 -0
- package/bundled/prompts/relay.context.opencode.md +1 -0
- package/bundled/prompts/relay.manual.claude.md +8 -0
- package/bundled/prompts/relay.search.fff.md +1 -0
- package/bundled/prompts/relay.temp-dir.md +1 -0
- package/bundled/prompts/relay.web.brave.md +1 -0
- package/bundled/prompts/relay.web.fetch.md +1 -0
- package/bundled/prompts/skill.device-lane.md +20 -0
- package/bundled/prompts/skill.security-code-review.md +10 -0
- package/bundled/prompts/skill.security-hardening.md +10 -0
- package/bundled/prompts/skill.security-host-audit.md +11 -0
- package/bundled/prompts/spawn.primer.md +6 -0
- package/bundled/prompts/spawn.reportup.child.md +3 -0
- package/bundled/prompts/spawn.reportup.coordinator.md +2 -0
- package/bundled/prompts/spawn.reportup.workflow-step.md +4 -0
- package/bundled/prompts/spawn.validation.delivery.md +1 -0
- package/bundled/prompts/spawn.validation.iterate.generic.md +1 -0
- package/bundled/prompts/spawn.validation.iterate.imperative.md +1 -0
- package/bundled/prompts/spawn.validation.landgates.header.md +1 -0
- package/bundled/prompts/steward.merge-stall.md +1 -0
- package/bundled/prompts/steward.prompt.md +20 -0
- package/bundled/prompts/steward.wake.md +1 -0
- package/bundled/prompts/task.claim.instruction.md +1 -0
- package/bundled/prompts/task.hydration.md +23 -0
- package/bundled/prompts/user.response.brief.md +1 -0
- package/bundled/prompts/user.response.normal.md +1 -0
- package/bundled/prompts/user.style.neutral.md +1 -0
- package/bundled/prompts/user.style.warm.md +1 -0
- package/bundled/prompts/workspace.deps.command.md +1 -0
- package/bundled/prompts/workspace.deps.none.md +1 -0
- package/bundled/prompts/workspace.deps.symlink.md +1 -0
- package/bundled/prompts/workspace.lifecycle.md +4 -0
- package/bundled/prompts/workspace.mcp.instructions.md +7 -0
- package/bundled/prompts/workspace.phase.abandoned.headline.md +1 -0
- package/bundled/prompts/workspace.phase.abandoned.hint.md +1 -0
- package/bundled/prompts/workspace.phase.active.headline.md +1 -0
- package/bundled/prompts/workspace.phase.active.hint.md +1 -0
- package/bundled/prompts/workspace.phase.conflict.headline.md +1 -0
- package/bundled/prompts/workspace.phase.conflict.hint.md +1 -0
- package/bundled/prompts/workspace.phase.merge-planned.headline.md +1 -0
- package/bundled/prompts/workspace.phase.merge-planned.hint.md +1 -0
- package/bundled/prompts/workspace.phase.merged.headline.md +1 -0
- package/bundled/prompts/workspace.phase.merged.hint.md +1 -0
- package/bundled/prompts/workspace.phase.ready.headline.md +1 -0
- package/bundled/prompts/workspace.phase.ready.hint.md +1 -0
- package/bundled/prompts/workspace.ready.contract.md +6 -0
- package/bundled/prompts/workspace.symlinks.md +1 -0
- package/bundled/roles/builder.md +18 -0
- package/bundled/roles/design-reviewer.md +13 -0
- package/bundled/roles/designer.md +11 -0
- package/bundled/roles/plan-auditor.md +29 -0
- package/bundled/roles/reviewer.md +36 -0
- package/bundled/roles/slice-qa.md +13 -0
- package/bundled/roles/verifier.md +13 -0
- package/bundled/skills/agent-browser/SKILL.md +72 -0
- package/bundled/skills/test-audit/SKILL.md +75 -0
- package/bundled/workflows/build-review.yaml +8 -0
- package/bundled/workflows/design-review.yaml +60 -0
- package/bundled/workflows/plan-conformance.yaml +5 -0
- package/bundled/workflows/slice-proof.yaml +85 -0
- package/bundled/workflows/verify-deployed.yaml +140 -0
- package/docs/guides/sub-coordinators.md +114 -0
- package/docs/guides/tools-administration.md +84 -0
- package/docs/guides/tools-agents.md +137 -0
- package/docs/guides/tools-coordination.md +228 -0
- package/docs/guides/tools-execution.md +48 -0
- package/docs/guides/tools-issues.md +69 -0
- package/docs/guides/tools-memory.md +150 -0
- package/docs/guides/tools-messages.md +192 -0
- package/docs/guides/tools-operations.md +133 -0
- package/docs/guides/tools-tasks.md +235 -0
- package/docs/guides/workflows.md +324 -0
- package/docs/license-faq.md +37 -0
- package/docs/openapi.json +18531 -0
- package/examples/integrations/github-issue.ts +48 -0
- package/examples/integrations/ops-alert.sh +27 -0
- package/examples/integrations/prometheus-alertmanager.ts +55 -0
- package/examples/integrations/support-ticket.sh +28 -0
- package/node_modules/@humwick/kernel/LICENSE +167 -0
- package/node_modules/@humwick/kernel/async-entity-persistence.ts +344 -0
- package/node_modules/@humwick/kernel/async-event-log.ts +107 -0
- package/node_modules/@humwick/kernel/automations.pilot.ts +147 -0
- package/node_modules/@humwick/kernel/config.ts +111 -0
- package/node_modules/@humwick/kernel/contract.ts +572 -0
- package/node_modules/@humwick/kernel/control-authz.ts +281 -0
- package/node_modules/@humwick/kernel/control.ts +645 -0
- package/node_modules/@humwick/kernel/effects.ts +493 -0
- package/node_modules/@humwick/kernel/event-log.ts +319 -0
- package/node_modules/@humwick/kernel/http-transport.ts +384 -0
- package/node_modules/@humwick/kernel/identity-grammar.ts +20 -0
- package/node_modules/@humwick/kernel/identity.ts +248 -0
- package/node_modules/@humwick/kernel/index.ts +28 -0
- package/node_modules/@humwick/kernel/kernel-persistence.ts +181 -0
- package/node_modules/@humwick/kernel/landing-incident.ts +306 -0
- package/node_modules/@humwick/kernel/landing.ts +953 -0
- package/node_modules/@humwick/kernel/manifest-validation.ts +460 -0
- package/node_modules/@humwick/kernel/mcp-transport.ts +109 -0
- package/node_modules/@humwick/kernel/message-authority-chaos-worker.ts +200 -0
- package/node_modules/@humwick/kernel/message-authority.ts +281 -0
- package/node_modules/@humwick/kernel/module-host.ts +722 -0
- package/node_modules/@humwick/kernel/openapi-init.ts +14 -0
- package/node_modules/@humwick/kernel/package.json +39 -0
- package/node_modules/@humwick/kernel/persistence-schema.ts +248 -0
- package/node_modules/@humwick/kernel/persistence.ts +510 -0
- package/node_modules/@humwick/kernel/registry.ts +60 -0
- package/node_modules/@humwick/kernel/sqlite-kernel-persistence.ts +499 -0
- package/node_modules/@humwick/kernel/sqlite-module-host.ts +87 -0
- package/node_modules/@humwick/kernel/timers-chaos-worker.ts +186 -0
- package/node_modules/@humwick/kernel/timers.pilot.ts +1411 -0
- package/node_modules/@humwick/kernel/workflow-activation.ts +25 -0
- package/node_modules/@humwick/kernel/workflow-backstop.ts +40 -0
- package/node_modules/@humwick/kernel/workflow-cancel-tree.ts +20 -0
- package/node_modules/@humwick/kernel/workflow-chaos-worker.ts +213 -0
- package/node_modules/@humwick/kernel/workflow-composition.ts +231 -0
- package/node_modules/@humwick/kernel/workflow-container.ts +72 -0
- package/node_modules/@humwick/kernel/workflow-control.test-fixture.ts +42 -0
- package/node_modules/@humwick/kernel/workflow-control.ts +178 -0
- package/node_modules/@humwick/kernel/workflow-definition.ts +507 -0
- package/node_modules/@humwick/kernel/workflow-dispatch.ts +60 -0
- package/node_modules/@humwick/kernel/workflow-foreach.ts +167 -0
- package/node_modules/@humwick/kernel/workflow-journal-codec.ts +339 -0
- package/node_modules/@humwick/kernel/workflow-journal.ts +922 -0
- package/node_modules/@humwick/kernel/workflow-lane.ts +48 -0
- package/node_modules/@humwick/kernel/workflow-lease-owner.ts +60 -0
- package/node_modules/@humwick/kernel/workflow-recovery.test-fixture.ts +19 -0
- package/node_modules/@humwick/kernel/workflow-runtime.ts +938 -0
- package/node_modules/@humwick/kernel/workflow-script.ts +11 -0
- package/node_modules/@humwick/kernel/workflow-state.ts +299 -0
- package/node_modules/@humwick/kernel/workflow-step-commit.ts +195 -0
- package/node_modules/@humwick/kernel/workflow-transitions.ts +317 -0
- package/node_modules/@humwick/kernel/workflow-values.ts +153 -0
- package/node_modules/@humwick/kernel/workflow.pilot.ts +376 -0
- package/node_modules/@humwick/offload/LICENSE +167 -0
- package/node_modules/@humwick/offload/README.md +57 -0
- package/node_modules/@humwick/offload/dist/async-runner.d.ts +18 -0
- package/node_modules/@humwick/offload/dist/async-runner.d.ts.map +1 -0
- package/node_modules/@humwick/offload/dist/async-runner.js +158 -0
- package/node_modules/@humwick/offload/dist/async-runner.js.map +1 -0
- package/node_modules/@humwick/offload/dist/envelope.d.ts +25 -0
- package/node_modules/@humwick/offload/dist/envelope.d.ts.map +1 -0
- package/node_modules/@humwick/offload/dist/envelope.js +80 -0
- package/node_modules/@humwick/offload/dist/envelope.js.map +1 -0
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts +10 -0
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts.map +1 -0
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.js +59 -0
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.js.map +1 -0
- package/node_modules/@humwick/offload/dist/index.d.ts +5 -0
- package/node_modules/@humwick/offload/dist/index.d.ts.map +1 -0
- package/node_modules/@humwick/offload/dist/index.js +5 -0
- package/node_modules/@humwick/offload/dist/index.js.map +1 -0
- package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts +62 -0
- package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts.map +1 -0
- package/node_modules/@humwick/offload/dist/subprocess-runner.js +295 -0
- package/node_modules/@humwick/offload/dist/subprocess-runner.js.map +1 -0
- package/node_modules/@humwick/offload/dist/types.d.ts +111 -0
- package/node_modules/@humwick/offload/dist/types.d.ts.map +1 -0
- package/node_modules/@humwick/offload/dist/types.js +176 -0
- package/node_modules/@humwick/offload/dist/types.js.map +1 -0
- package/node_modules/@humwick/offload/dist/worker-pool.d.ts +23 -0
- package/node_modules/@humwick/offload/dist/worker-pool.d.ts.map +1 -0
- package/node_modules/@humwick/offload/dist/worker-pool.js +435 -0
- package/node_modules/@humwick/offload/dist/worker-pool.js.map +1 -0
- package/node_modules/@humwick/offload/dist/worker-runtime.d.ts +2 -0
- package/node_modules/@humwick/offload/dist/worker-runtime.d.ts.map +1 -0
- package/node_modules/@humwick/offload/dist/worker-runtime.js +27 -0
- package/node_modules/@humwick/offload/dist/worker-runtime.js.map +1 -0
- package/node_modules/@humwick/offload/dist/worker.d.ts +5 -0
- package/node_modules/@humwick/offload/dist/worker.d.ts.map +1 -0
- package/node_modules/@humwick/offload/dist/worker.js +1 -0
- package/node_modules/@humwick/offload/dist/worker.js.map +1 -0
- package/node_modules/@humwick/offload/package.json +42 -0
- package/node_modules/@humwick/offload/src/async-runner.ts +170 -0
- package/node_modules/@humwick/offload/src/envelope.ts +92 -0
- package/node_modules/@humwick/offload/src/fixtures/worker-task.ts +49 -0
- package/node_modules/@humwick/offload/src/index.ts +4 -0
- package/node_modules/@humwick/offload/src/subprocess-runner.ts +334 -0
- package/node_modules/@humwick/offload/src/types.ts +235 -0
- package/node_modules/@humwick/offload/src/worker-pool.ts +463 -0
- package/node_modules/@humwick/offload/src/worker-runtime.ts +32 -0
- package/node_modules/@humwick/offload/src/worker.ts +5 -0
- package/package.json +229 -4
- package/public/assets/MessageBubble-BWpoBjl4.js +4 -0
- package/public/assets/PlanGraphPanel-C0auck3n.js +2 -0
- package/public/assets/TraceView-DBnOx7AQ.js +5 -0
- package/public/assets/VaultDecisionCard-0kp2oNBC.js +2 -0
- package/public/assets/activity-TMzFOdh2.js +2 -0
- package/public/assets/activity-yLztXEBt.js +2 -0
- package/public/assets/agent-lineage-BbJDR1dW.js +2 -0
- package/public/assets/agent-liveness-DyqxfB-t.js +2 -0
- package/public/assets/agent-name-CTZBrSD9.js +2 -0
- package/public/assets/agent-profiles-BpI_jTxq.js +2 -0
- package/public/assets/agent-project-badge-9TqzUUYE.js +2 -0
- package/public/assets/agent-tools-D4n40pn8.js +2 -0
- package/public/assets/agent-type-icon-D6FUarOf.js +2 -0
- package/public/assets/agents-BYDslkJc.js +2 -0
- package/public/assets/analytics-B-XSbEMC.js +910 -0
- package/public/assets/andromeeda-vGVdxbeo.js +2 -0
- package/public/assets/angular-html-BVBpGdXr.js +2 -0
- package/public/assets/angular-ts-BfdufMKP.js +2 -0
- package/public/assets/api-CIIVBtAV.js +10 -0
- package/public/assets/archive-CIuPSvmx.js +2 -0
- package/public/assets/arrow-right-vFsRqG8V.js +2 -0
- package/public/assets/arrow-up-a-z-CKC2RCjD.js +2 -0
- package/public/assets/artifact-viewer-DdWIfV6M.js +2 -0
- package/public/assets/artifacts-DPN1q4pA.js +2 -0
- package/public/assets/artifacts-oBOqks-2.js +2 -0
- package/public/assets/astro-JKRPP03v.js +2 -0
- package/public/assets/aurora-x-CDeNXAV0.js +2 -0
- package/public/assets/automation-4KcRFXEu.js +2 -0
- package/public/assets/ayu-dark-DluEY0Gj.js +2 -0
- package/public/assets/ayu-light-C3h-C4tm.js +2 -0
- package/public/assets/ayu-mirage-Bqwy1Gya.js +2 -0
- package/public/assets/backlog-Cw9xPTCF.js +2 -0
- package/public/assets/badge-DqJRtj_p.js +2 -0
- package/public/assets/bell-_Yzbxxrt.js +2 -0
- package/public/assets/blade-DA8yMPsw.js +2 -0
- package/public/assets/bot-B0NpDNhr.js +2 -0
- package/public/assets/boxes-Cv7Wq3h4.js +2 -0
- package/public/assets/braces-BOks9SsY.js +2 -0
- package/public/assets/brain-CagXMEKE.js +2 -0
- package/public/assets/brain-circuit-CpQeSmp3.js +2 -0
- package/public/assets/bundle-web-ifbJd0t-.js +14 -0
- package/public/assets/busy-health-CTu32MZt.js +2 -0
- package/public/assets/button-Do6Z3vvn.js +2 -0
- package/public/assets/c-Wt1voDr2.js +2 -0
- package/public/assets/calendar-QJjoZ1JU.js +2 -0
- package/public/assets/calendar-clock-CDG_KBhx.js +2 -0
- package/public/assets/card-C4QJ4hCW.js +2 -0
- package/public/assets/catppuccin-frappe-3VR1Za6u.js +2 -0
- package/public/assets/catppuccin-latte-DwIHMF0Q.js +2 -0
- package/public/assets/catppuccin-macchiato-DYnBP6_5.js +2 -0
- package/public/assets/catppuccin-mocha-DYhrFGRu.js +2 -0
- package/public/assets/channels-BiXzg1G9.js +2 -0
- package/public/assets/chart-column-S02ZGfTR.js +2 -0
- package/public/assets/chat-Ctk2qwvA.js +6 -0
- package/public/assets/check-B3M9Ug1P.js +2 -0
- package/public/assets/chevron-down-BoG3JCZn.js +2 -0
- package/public/assets/chevron-right-iljytE0x.js +2 -0
- package/public/assets/chevron-up-Bv3yC5ma.js +2 -0
- package/public/assets/circle-UESLMi2-.js +2 -0
- package/public/assets/circle-alert-CryagaZd.js +2 -0
- package/public/assets/circle-arrow-up-B432r0Kk.js +2 -0
- package/public/assets/circle-check-CkUkN96J.js +2 -0
- package/public/assets/circle-x-CZ0erS7Q.js +2 -0
- package/public/assets/clipboard-list-W2YeUsxT.js +2 -0
- package/public/assets/clock-3-BH47318N.js +2 -0
- package/public/assets/clock-BWPPBh1_.js +2 -0
- package/public/assets/code-preview-Bm1wWqAp.js +3 -0
- package/public/assets/coffee-CThvmt4R.js +2 -0
- package/public/assets/connectors-C36ax4Vw.js +2 -0
- package/public/assets/copy-DFxhHRtV.js +2 -0
- package/public/assets/copy-button-CjOj4HEf.js +2 -0
- package/public/assets/cosmos-Dn8XrlnS.css +1 -0
- package/public/assets/cosmos-Jj9LK2Wf.js +3993 -0
- package/public/assets/cpp-C5WNSHb9.js +2 -0
- package/public/assets/cpu-Dndy84IU.js +2 -0
- package/public/assets/crate-agent-H6S7-B9T.js +2 -0
- package/public/assets/css-DJp_X0uY.js +2 -0
- package/public/assets/csv-Dx-8-gkx.js +2 -0
- package/public/assets/dark-plus-Cs2F2srj.js +2 -0
- package/public/assets/dependency-graph-Cd1E23wa.js +2 -0
- package/public/assets/deploys-Bwfq146q.js +2 -0
- package/public/assets/dialog-uuJ9_geR.js +6 -0
- package/public/assets/display-CfO7rTuF.js +3 -0
- package/public/assets/dist-B2h2GeWt.js +2 -0
- package/public/assets/dist-BeVYU67E.js +2 -0
- package/public/assets/dist-Bmm-RKub.js +2 -0
- package/public/assets/dist-C1xmD7qJ.js +2 -0
- package/public/assets/dist-C2J943E6.js +2 -0
- package/public/assets/dist-C6lpJDoA.js +2 -0
- package/public/assets/dist-CoWL6B0c.js +2 -0
- package/public/assets/dist-D93SmTNC.js +2 -0
- package/public/assets/dist-Da7HrHNA.js +2 -0
- package/public/assets/dist-DeW2Y1R5.js +2 -0
- package/public/assets/dist-DwBdqQ6H.js +2 -0
- package/public/assets/dist-Dz182zaW.js +2 -0
- package/public/assets/dist-H3DLHJ0C.js +2 -0
- package/public/assets/dist-RrY9C4SI.js +2 -0
- package/public/assets/download-KgtpDbt5.js +2 -0
- package/public/assets/dracula-BHWKrbxM.js +2 -0
- package/public/assets/dracula-soft-5eyTD99u.js +2 -0
- package/public/assets/dropdown-menu-BXiNephE.js +2 -0
- package/public/assets/es2015-DMmZ8vbD.js +42 -0
- package/public/assets/esm-ZSuD7QuY.js +2 -0
- package/public/assets/everforest-dark-sB-x3p7T.js +2 -0
- package/public/assets/everforest-light-Df2xbC6M.js +2 -0
- package/public/assets/external-link-BRfu-fHG.js +2 -0
- package/public/assets/eye-BAP6fHrX.js +2 -0
- package/public/assets/file-code-corner-CXhIR1vB.js +2 -0
- package/public/assets/file-pen-Crunre5f.js +2 -0
- package/public/assets/file-text-CKuoMR2U.js +2 -0
- package/public/assets/files-DhhZI2Ih.js +3 -0
- package/public/assets/flag-CnEG9PH-.js +2 -0
- package/public/assets/flame-CxBuz46L.js +2 -0
- package/public/assets/fleet-B_rFEbnL.js +2 -0
- package/public/assets/fleet-metrics-BkHP-P3R.js +2 -0
- package/public/assets/folder-git-2-CJOmTT06.js +2 -0
- package/public/assets/folder-open-CBUCMSlu.js +2 -0
- package/public/assets/folder-tree-BG3Y9nqH.js +2 -0
- package/public/assets/formatted-body-Cm1RrzmN.js +3 -0
- package/public/assets/formatted-body-impl-DQiOuOD1.js +3 -0
- package/public/assets/gauge-BIODY-BQ.js +2 -0
- package/public/assets/geist-cyrillic-wght-normal-CHSlOQsW.woff2 +0 -0
- package/public/assets/geist-latin-ext-wght-normal-DMtmJ5ZE.woff2 +0 -0
- package/public/assets/geist-latin-wght-normal-Dm3htQBi.woff2 +0 -0
- package/public/assets/git-branch-yxhV0m8E.js +2 -0
- package/public/assets/git-commit-horizontal-DS1pJ_SS.js +2 -0
- package/public/assets/git-merge-C7eIG425.js +2 -0
- package/public/assets/github-dark-C-LZuMrd.js +2 -0
- package/public/assets/github-dark-default-DXG-b-1a.js +2 -0
- package/public/assets/github-dark-dimmed-Bx1FflLF.js +2 -0
- package/public/assets/github-dark-high-contrast-B_tTalzw.js +2 -0
- package/public/assets/github-light-EUqPIrTm.js +2 -0
- package/public/assets/github-light-default-BXViO-2h.js +2 -0
- package/public/assets/github-light-high-contrast-B68TUdTA.js +2 -0
- package/public/assets/globe-Cl5fXtqs.js +2 -0
- package/public/assets/glsl-Dv5r7kPw.js +2 -0
- package/public/assets/graphql-CcFwQwm0.js +2 -0
- package/public/assets/gruvbox-dark-hard-C820rvS2.js +2 -0
- package/public/assets/gruvbox-dark-medium-BPjhmG05.js +2 -0
- package/public/assets/gruvbox-dark-soft-MrdJrrXF.js +2 -0
- package/public/assets/gruvbox-light-hard-BC_s9l72.js +2 -0
- package/public/assets/gruvbox-light-medium-BAWPOn9u.js +2 -0
- package/public/assets/gruvbox-light-soft-BSMLrYjP.js +2 -0
- package/public/assets/haml-Bg4I2hiD.js +2 -0
- package/public/assets/handlebars-DnwbnL5R.js +2 -0
- package/public/assets/hash-CbtKih3g.js +2 -0
- package/public/assets/horizon-CE9ld1lL.js +2 -0
- package/public/assets/horizon-bright-DSNQnXHK.js +2 -0
- package/public/assets/host-mTgRw7xh.js +2 -0
- package/public/assets/host-providers-dialog-CHqwXTov.js +2 -0
- package/public/assets/hourglass-txu4ax6n.js +2 -0
- package/public/assets/houston-CsvMBhTu.js +2 -0
- package/public/assets/html-C8UlPnhE.js +2 -0
- package/public/assets/html-derivative-CY6NRz-J.js +2 -0
- package/public/assets/http-CoW620Fi.js +2 -0
- package/public/assets/humwick-lockup-on-dark-Ds44Y7BK.svg +19 -0
- package/public/assets/humwick-lockup-on-light-ClALZAHt.svg +19 -0
- package/public/assets/hurl-CSSETujw.js +2 -0
- package/public/assets/imba-DsUTQ-LC.js +2 -0
- package/public/assets/inbox-Dfwk3Gt8.js +2 -0
- package/public/assets/index-B7ZerHLY.css +2 -0
- package/public/assets/index-BU3uWo2t.js +15 -0
- package/public/assets/input-CsTB6jIx.js +2 -0
- package/public/assets/insights-fH1EL-qZ.js +2 -0
- package/public/assets/integrations-C5Oix6ng.js +2 -0
- package/public/assets/issue-ref-chip-ODyondIa.js +3 -0
- package/public/assets/java-CGc3VwQr.js +2 -0
- package/public/assets/javascript-CUt1pgmJ.js +2 -0
- package/public/assets/jinja-CD-Z-FLd.js +2 -0
- package/public/assets/jison-imPNup1l.js +2 -0
- package/public/assets/json-qhed-kSA.js +2 -0
- package/public/assets/json5-BR5RXkoi.js +2 -0
- package/public/assets/jsonc-CYpm1nAK.js +2 -0
- package/public/assets/jsonl-CmCQp5Yx.js +2 -0
- package/public/assets/jsx-CY6oMTks.js +2 -0
- package/public/assets/julia-CjffhBEM.js +2 -0
- package/public/assets/kanagawa-dragon-CXtmUGW6.js +2 -0
- package/public/assets/kanagawa-lotus-BN08jTvb.js +2 -0
- package/public/assets/kanagawa-wave-CTweb8Dz.js +2 -0
- package/public/assets/kernel-Bqr0CZGv.js +2 -0
- package/public/assets/key-round-CcSxl5qr.js +2 -0
- package/public/assets/keyboard-DcmEulph.js +2 -0
- package/public/assets/label-BPBzm9FJ.js +2 -0
- package/public/assets/laserwave-C_8bwKvT.js +2 -0
- package/public/assets/layers-DEfClY-v.js +2 -0
- package/public/assets/legacy-storage-carry-C-tBSxRA.js +2 -0
- package/public/assets/less-DVTAwKKz.js +2 -0
- package/public/assets/lib-D7DTGM1F.js +2 -0
- package/public/assets/lib-G-25QXXf.js +30 -0
- package/public/assets/light-plus-DVQuIRkW.js +2 -0
- package/public/assets/lightbulb-RDhZ4p-D.js +2 -0
- package/public/assets/link-2-off-DfRF9Hwb.js +2 -0
- package/public/assets/link-6RR7Hy3-.js +2 -0
- package/public/assets/list-checks-CwnS3hly.js +2 -0
- package/public/assets/list-ordered-D8nCM7rT.js +2 -0
- package/public/assets/list-todo-9qT0fgxZ.js +2 -0
- package/public/assets/loader-circle-BfPd4kOD.js +2 -0
- package/public/assets/lock-BW8MPKw_.js +2 -0
- package/public/assets/log-viewer-Cvfy6PW7.js +4 -0
- package/public/assets/mail-DyaDmwfY.js +2 -0
- package/public/assets/maintenance-D8CDH5wZ.js +2 -0
- package/public/assets/managed-agents-egllbpij.js +4 -0
- package/public/assets/markdown-BYOwaDjH.js +2 -0
- package/public/assets/markdown-preview-CYSFgVgK.js +3 -0
- package/public/assets/markdown-preview-impl-BteVIjX4.js +2 -0
- package/public/assets/marko-DvhNOisQ.js +2 -0
- package/public/assets/material-theme-Bm3Qr25_.js +2 -0
- package/public/assets/material-theme-darker-2IIEA8gg.js +2 -0
- package/public/assets/material-theme-lighter-uhdI0v04.js +2 -0
- package/public/assets/material-theme-ocean-CHQ94UKr.js +2 -0
- package/public/assets/material-theme-palenight-B5W6OYN7.js +2 -0
- package/public/assets/mdc-CazklSAj.js +2 -0
- package/public/assets/mdx-DQZ5AkYe.js +2 -0
- package/public/assets/memory-C8WmXsyr.js +2 -0
- package/public/assets/message-circle-wjztgHBe.js +2 -0
- package/public/assets/message-square-C-1G8dMM.js +2 -0
- package/public/assets/message-square-reply-B9Z4cbQx.js +2 -0
- package/public/assets/messages-BzQdqlO6.js +2 -0
- package/public/assets/messages-square-DVM1ZtcI.js +2 -0
- package/public/assets/min-dark-BSWPekZh.js +2 -0
- package/public/assets/min-light-DDpmG2fV.js +2 -0
- package/public/assets/minimize-2-BkK6XoMP.js +2 -0
- package/public/assets/monokai-CdkpiU2Y.js +2 -0
- package/public/assets/night-owl-DhmEMT88.js +2 -0
- package/public/assets/night-owl-light-eJ-hLW7d.js +2 -0
- package/public/assets/nord-Cb4Vim4T.js +2 -0
- package/public/assets/octagon-x-B5lnUY-8.js +2 -0
- package/public/assets/one-dark-pro-CLwyXe_n.js +2 -0
- package/public/assets/one-light-D7Lr4KcI.js +2 -0
- package/public/assets/orchestrators-B1HxzkNw.js +2 -0
- package/public/assets/overview-DCUnI4Z7.js +2 -0
- package/public/assets/package-open-ckPgcjpv.js +2 -0
- package/public/assets/package-plus-C1AKMjsl.js +2 -0
- package/public/assets/pairs-ftCd2XcD.js +2 -0
- package/public/assets/paperclip-CNpKZKum.js +2 -0
- package/public/assets/pause-DttnHD4c.js +2 -0
- package/public/assets/pencil-B1Hf2V_J.js +2 -0
- package/public/assets/php-CBqsN0ai.js +2 -0
- package/public/assets/pin-DcsKeXxr.js +2 -0
- package/public/assets/plastic-DQwYfKfQ.js +2 -0
- package/public/assets/play-BbT8m7A0.js +2 -0
- package/public/assets/plug-vIyO9_P8.js +2 -0
- package/public/assets/plug-zap-V0wMDJ-G.js +2 -0
- package/public/assets/plus-D5Ek4e2S.js +2 -0
- package/public/assets/poimandres-DRFjx7u4.js +2 -0
- package/public/assets/popover-8w1TWKMG.js +2 -0
- package/public/assets/postcss-BXeXVLqQ.js +2 -0
- package/public/assets/power-6tZOhYPg.js +2 -0
- package/public/assets/preload-helper-HclGiUj8.js +1 -0
- package/public/assets/profile-icon-B2zH8DMH.js +2 -0
- package/public/assets/projects-B_lmcqfO.js +2 -0
- package/public/assets/prompt-settings-Bftq9czX.js +2 -0
- package/public/assets/provider-brand-icon-_67JR7Zh.js +2 -0
- package/public/assets/provider-display-DbLWpP3j.js +2 -0
- package/public/assets/pug-C5hz5LQ7.js +2 -0
- package/public/assets/python-gzcpVVnB.js +2 -0
- package/public/assets/r-Dzep-lPg.js +2 -0
- package/public/assets/radio-Bn0_qc0G.js +2 -0
- package/public/assets/react-dom-DSFxiC7T.js +2 -0
- package/public/assets/red-CJ3rzSJv.js +2 -0
- package/public/assets/refresh-cw-CfpvQcUn.js +2 -0
- package/public/assets/regexp-Omp9DhTb.js +2 -0
- package/public/assets/registry-DWCU5c8q.js +4 -0
- package/public/assets/repeat-hl4p_Klo.js +2 -0
- package/public/assets/rocket-BmO1qSu-.js +2 -0
- package/public/assets/rolldown-runtime-QTnfLwEv.js +1 -0
- package/public/assets/rose-pine-BthvhNj6.js +2 -0
- package/public/assets/rose-pine-dawn-Dg85fqjY.js +2 -0
- package/public/assets/rose-pine-moon-hon4tzzS.js +2 -0
- package/public/assets/rotate-ccw-CtD77qkX.js +2 -0
- package/public/assets/rotate-cw-FPtkDewA.js +2 -0
- package/public/assets/run-card-CO_bguQf.js +2 -0
- package/public/assets/sass-DXrisJhu.js +2 -0
- package/public/assets/save-B_PGqSm4.js +2 -0
- package/public/assets/scroll-area-CIN4KQse.js +2 -0
- package/public/assets/scss-DdSxiZKl.js +2 -0
- package/public/assets/search-DjzbnTbf.js +2 -0
- package/public/assets/secrets-C7GIUATz.js +2 -0
- package/public/assets/security-BUFau5-N.js +3 -0
- package/public/assets/select-DTQMP4Dk.js +2 -0
- package/public/assets/separator-t1cLZErD.js +2 -0
- package/public/assets/server-CZIRjFyY.js +2 -0
- package/public/assets/service-access-settings-C3aujqTG.js +2 -0
- package/public/assets/settings-C6sZ9eBa.js +6 -0
- package/public/assets/shellscript-CLZ0U2zV.js +2 -0
- package/public/assets/shield-CtXNUA0i.js +2 -0
- package/public/assets/shield-alert-B9jCWcKW.js +2 -0
- package/public/assets/shipping-Bu8p1gEw.js +2 -0
- package/public/assets/shipping-stats-BiMTsA4A.js +2 -0
- package/public/assets/slack-dark-DnToyrRv.js +2 -0
- package/public/assets/slack-ochin-B2OO5cIa.js +2 -0
- package/public/assets/smile-plus-q6EQBXHZ.js +2 -0
- package/public/assets/snazzy-light-4G7pJPwS.js +2 -0
- package/public/assets/solarized-dark-DV17i1UV.js +2 -0
- package/public/assets/solarized-light-DSh2HLQt.js +2 -0
- package/public/assets/sparkles-CzwR10ZU.js +2 -0
- package/public/assets/sql-DNssxck8.js +2 -0
- package/public/assets/square-Bqly37YM.js +2 -0
- package/public/assets/stats-V9Z-GxUd.js +2 -0
- package/public/assets/status-dot-CVv0iGHL.js +2 -0
- package/public/assets/stethoscope-SCBrnQQ8.js +2 -0
- package/public/assets/store-BvtFdlGX.js +9 -0
- package/public/assets/stylus-B6D30XZt.js +2 -0
- package/public/assets/svelte-DOdLCIlh.js +2 -0
- package/public/assets/switch-DuCA7mrB.js +2 -0
- package/public/assets/synthwave-84-nFMaYfgc.js +2 -0
- package/public/assets/tabs-jZgNvNHr.js +2 -0
- package/public/assets/task-chip-CYj0mpoL.js +2 -0
- package/public/assets/tasks-BIyeAaPC.js +2 -0
- package/public/assets/tasks-CXU75HRF.js +11 -0
- package/public/assets/teams-BPf976zb.js +2 -0
- package/public/assets/terminal-Bl2u7KxT.js +2 -0
- package/public/assets/terminal-viewer-DE9BOe-8.js +3 -0
- package/public/assets/terminal-viewer-impl-BrP-ENHg.css +1 -0
- package/public/assets/terminal-viewer-impl-D04pjmGh.js +143 -0
- package/public/assets/textarea-hs6Mpyfl.js +2 -0
- package/public/assets/themes-G5j9m1Ji.js +2 -0
- package/public/assets/tokyo-night-oM2G3aXe.js +2 -0
- package/public/assets/trash-2-FbcSq927.js +2 -0
- package/public/assets/triangle-alert-BBNhfgMi.js +2 -0
- package/public/assets/ts-tags-Ca73dJJY.js +2 -0
- package/public/assets/tsx-5Eka4NBX.js +2 -0
- package/public/assets/typescript-DOu2WMV5.js +2 -0
- package/public/assets/use-agent-terminal-B1yR456R.js +2 -0
- package/public/assets/use-decisions-D-S4tpDf.js +2 -0
- package/public/assets/use-project-list-B-T2Bnnn.js +2 -0
- package/public/assets/use-selectors-CnrAk2YP.js +6 -0
- package/public/assets/user-avatar-nBFIcR4M.js +2 -0
- package/public/assets/user-cog-CKcouW1J.js +2 -0
- package/public/assets/user-plus-D9749q73.js +2 -0
- package/public/assets/users-C7B3u9jv.js +2 -0
- package/public/assets/versioned-prompt-editor-Diu8BIaM.js +8 -0
- package/public/assets/vesper-DdrHHSXu.js +2 -0
- package/public/assets/vitesse-black-fwtXNY1n.js +2 -0
- package/public/assets/vitesse-dark-BZCL-v6S.js +2 -0
- package/public/assets/vitesse-light-VbXTXTou.js +2 -0
- package/public/assets/volume-2-XrcRKD9Z.js +2 -0
- package/public/assets/vue-Bfx0ffIq.js +2 -0
- package/public/assets/vue-html-BeluIYX0.js +2 -0
- package/public/assets/vue-vine-DGUAbOCX.js +2 -0
- package/public/assets/warehouse-BanzOanY.js +2 -0
- package/public/assets/wasm-BnjxR4X6.js +2 -0
- package/public/assets/wasm-ByWQv1Qj.js +2 -0
- package/public/assets/waypoints-CIzINtLT.js +2 -0
- package/public/assets/wgsl-BsKzXJz4.js +2 -0
- package/public/assets/wit-DdvCle-K.js +2 -0
- package/public/assets/work-queue-TCjJxeT-.js +2 -0
- package/public/assets/workflow-marker-Cf3Hf2fN.js +2 -0
- package/public/assets/workflows-CXQX20Qj.js +6 -0
- package/public/assets/workspaces-qSYzKYMA.js +3 -0
- package/public/assets/wrench-C7-4CgnY.js +2 -0
- package/public/assets/x-Bge17hWJ.js +2 -0
- package/public/assets/xml-DIqSwXR3.js +2 -0
- package/public/assets/yaml-rwi0_p6S.js +2 -0
- package/public/assets/zap-DGuDTw4w.js +2 -0
- package/public/assets/zoom-in-Bs8Qv8VL.js +2 -0
- package/public/assets/zoomable-image-B3Og53nj.js +2 -0
- package/public/cosmos/audio/README.md +50 -0
- package/public/cosmos/audio/alert.mp3 +0 -0
- package/public/cosmos/audio/ambient-bed.mp3 +0 -0
- package/public/cosmos/audio/comet.mp3 +0 -0
- package/public/cosmos/audio/cross-galaxy.mp3 +0 -0
- package/public/cosmos/audio/deploy.mp3 +0 -0
- package/public/cosmos/audio/galaxy-dissipate.mp3 +0 -0
- package/public/cosmos/audio/galaxy-form.mp3 +0 -0
- package/public/cosmos/audio/land.mp3 +0 -0
- package/public/cosmos/audio/reap.mp3 +0 -0
- package/public/cosmos/audio/spawn.mp3 +0 -0
- package/public/cosmos.html +34 -0
- package/public/favicon.ico +0 -0
- package/public/favicon.svg +10 -0
- package/public/icons/apple-touch-icon.png +0 -0
- package/public/icons/humwick-192.png +0 -0
- package/public/icons/humwick-512.png +0 -0
- package/public/icons/humwick.svg +19 -0
- package/public/index.html +188 -0
- package/public/manifest.webmanifest +45 -0
- package/public/sw.js +160 -0
- package/recipes/code-review.yaml +26 -0
- package/recipes/debug.yaml +20 -0
- package/recipes/feature.yaml +26 -0
- package/recipes/refactor.yaml +20 -0
- package/recipes/test.yaml +20 -0
- package/runner/LICENSE +167 -0
- package/runner/agent-bin/agent-relay-browser +10 -0
- package/runner/agent-bin/humwick +10 -0
- package/runner/hooks/fff-search-redirect/fff-search-redirect.cjs +161 -0
- package/runner/hooks/fff-search-redirect/hooks.json +13 -0
- package/runner/hooks/rg-r-guard/hooks.json +18 -0
- package/runner/hooks/rg-r-guard/rg-r-guard.cjs +144 -0
- package/runner/hooks/web-tools-redirect/hooks.json +13 -0
- package/runner/hooks/web-tools-redirect/web-tools-redirect.cjs +84 -0
- package/runner/plugins/browser/skills/playwright-cli/SKILL.md +53 -0
- package/runner/plugins/claude/.claude-plugin/plugin.json +8 -0
- package/runner/plugins/claude/claude-statusline-probe.cjs +144 -0
- package/runner/plugins/claude/hooks/gate-run-guard.provisioned.mjs +914 -0
- package/runner/plugins/claude/hooks/gate-run-guard.sh +9 -0
- package/runner/plugins/claude/hooks/gate-run-guard.ts +237 -0
- package/runner/plugins/claude/hooks/hooks.json +158 -0
- package/runner/plugins/claude/hooks/kill-guard.provisioned.mjs +7027 -0
- package/runner/plugins/claude/hooks/kill-guard.sh +341 -0
- package/runner/plugins/claude/hooks/kill-guard.ts +337 -0
- package/runner/plugins/claude/hooks/permission-request.sh +22 -0
- package/runner/plugins/claude/hooks/post-compact.sh +10 -0
- package/runner/plugins/claude/hooks/post-tool-use.sh +8 -0
- package/runner/plugins/claude/hooks/pre-compact.sh +12 -0
- package/runner/plugins/claude/hooks/read-only-bash-guard.sh +587 -0
- package/runner/plugins/claude/hooks/relay-status.sh +373 -0
- package/runner/plugins/claude/hooks/session-end.sh +26 -0
- package/runner/plugins/claude/hooks/session-start.sh +31 -0
- package/runner/plugins/claude/hooks/shell-trust.ts +28 -0
- package/runner/plugins/claude/hooks/stop-failure.sh +47 -0
- package/runner/plugins/claude/hooks/stop.sh +48 -0
- package/runner/plugins/claude/hooks/subagent-guard.cjs +26 -0
- package/runner/plugins/claude/hooks/subagent-skill-policy.cjs +160 -0
- package/runner/plugins/claude/hooks/subagent-start.sh +13 -0
- package/runner/plugins/claude/hooks/subagent-stop.sh +19 -0
- package/runner/plugins/claude/hooks/user-prompt-submit.sh +18 -0
- package/runner/plugins/claude/hooks/wait-loop-guard.ts +120 -0
- package/runner/plugins/claude/monitors/monitors.json +7 -0
- package/runner/plugins/claude/monitors/relay-monitor.provisioned.mjs +786 -0
- package/runner/plugins/claude/monitors/relay-monitor.ts +58 -0
- package/runner/plugins/claude/skills/disconnect/SKILL.md +16 -0
- package/runner/plugins/claude/skills/label/SKILL.md +23 -0
- package/runner/plugins/claude/skills/message/SKILL.md +40 -0
- package/runner/plugins/claude/skills/pair/SKILL.md +30 -0
- package/runner/plugins/claude/skills/react/SKILL.md +18 -0
- package/runner/plugins/claude/skills/read-message/SKILL.md +24 -0
- package/runner/plugins/claude/skills/reply/SKILL.md +44 -0
- package/runner/plugins/claude/skills/send-claimable/SKILL.md +39 -0
- package/runner/plugins/claude/skills/slice-first/SKILL.md +32 -0
- package/runner/plugins/claude/skills/slice-first/references/plan-recipe.md +46 -0
- package/runner/plugins/claude/skills/status/SKILL.md +16 -0
- package/runner/plugins/claude/skills/tags/SKILL.md +25 -0
- package/runner/plugins/claude/skills/task/SKILL.md +28 -0
- package/runner/plugins/claude-output-style/.claude-plugin/plugin.json +5 -0
- package/runner/plugins/claude-output-style/output-styles/agent-relay.md +5 -0
- package/runner/plugins/codex/skills/disconnect/SKILL.md +15 -0
- package/runner/plugins/codex/skills/guide/SKILL.md +15 -0
- package/runner/plugins/codex/skills/label/SKILL.md +22 -0
- package/runner/plugins/codex/skills/message/SKILL.md +40 -0
- package/runner/plugins/codex/skills/pair/SKILL.md +29 -0
- package/runner/plugins/codex/skills/react/SKILL.md +17 -0
- package/runner/plugins/codex/skills/read-message/SKILL.md +23 -0
- package/runner/plugins/codex/skills/reply/SKILL.md +44 -0
- package/runner/plugins/codex/skills/send-claimable/SKILL.md +39 -0
- package/runner/plugins/codex/skills/slice-first/SKILL.md +32 -0
- package/runner/plugins/codex/skills/slice-first/references/plan-recipe.md +46 -0
- package/runner/plugins/codex/skills/status/SKILL.md +15 -0
- package/runner/plugins/codex/skills/tags/SKILL.md +24 -0
- package/runner/plugins/codex/skills/task/SKILL.md +28 -0
- package/runner/src/adapter.ts +1061 -0
- package/runner/src/adapters/__fixtures__/codex-app-server.ts +47 -0
- package/runner/src/adapters/claude-api.ts +243 -0
- package/runner/src/adapters/claude-context-command.ts +16 -0
- package/runner/src/adapters/claude-credentials.ts +22 -0
- package/runner/src/adapters/claude-delivery-lanes.ts +28 -0
- package/runner/src/adapters/claude-delivery.ts +166 -0
- package/runner/src/adapters/claude-effort.ts +94 -0
- package/runner/src/adapters/claude-exit.ts +290 -0
- package/runner/src/adapters/claude-headless-mirror.ts +88 -0
- package/runner/src/adapters/claude-headless-refusal.ts +51 -0
- package/runner/src/adapters/claude-headless.ts +617 -0
- package/runner/src/adapters/claude-monitor-delivery-plan.ts +317 -0
- package/runner/src/adapters/claude-permission.ts +243 -0
- package/runner/src/adapters/claude-prompt-gates.ts +269 -0
- package/runner/src/adapters/claude-prompt-hook.ts +145 -0
- package/runner/src/adapters/claude-session-capture.ts +293 -0
- package/runner/src/adapters/claude-session-probe.ts +414 -0
- package/runner/src/adapters/claude-shutdown.ts +190 -0
- package/runner/src/adapters/claude-status-detectors.ts +426 -0
- package/runner/src/adapters/claude-subagents.ts +93 -0
- package/runner/src/adapters/claude-submit-confirmation.ts +287 -0
- package/runner/src/adapters/claude-tmux.ts +548 -0
- package/runner/src/adapters/claude-token-usage-capture.ts +253 -0
- package/runner/src/adapters/claude-tool-policy.ts +165 -0
- package/runner/src/adapters/claude-transcript-tail.ts +193 -0
- package/runner/src/adapters/claude-transcript.ts +812 -0
- package/runner/src/adapters/claude.ts +1097 -0
- package/runner/src/adapters/codex-agent-message-capture.ts +189 -0
- package/runner/src/adapters/codex-app-server.ts +70 -0
- package/runner/src/adapters/codex-client.ts +362 -0
- package/runner/src/adapters/codex-effective-config.ts +87 -0
- package/runner/src/adapters/codex-launch-config.ts +153 -0
- package/runner/src/adapters/codex-rollout-context.ts +272 -0
- package/runner/src/adapters/codex-skill-discovery.ts +18 -0
- package/runner/src/adapters/codex-token-usage-capture.ts +163 -0
- package/runner/src/adapters/codex-tool-output.ts +53 -0
- package/runner/src/adapters/codex-turn-outcome.ts +27 -0
- package/runner/src/adapters/codex-version.ts +64 -0
- package/runner/src/adapters/codex.ts +1442 -0
- package/runner/src/adapters/incremental-file.ts +110 -0
- package/runner/src/adapters/opencode-api.ts +71 -0
- package/runner/src/adapters/opencode-context.ts +277 -0
- package/runner/src/adapters/opencode-model-registry.ts +126 -0
- package/runner/src/adapters/opencode-provider.ts +169 -0
- package/runner/src/adapters/opencode-server-retry.ts +50 -0
- package/runner/src/adapters/opencode-soft-steer.ts +302 -0
- package/runner/src/adapters/opencode-spawn.ts +145 -0
- package/runner/src/adapters/opencode-subscribe.ts +62 -0
- package/runner/src/adapters/opencode-token-usage-capture.ts +187 -0
- package/runner/src/adapters/opencode-tool-events.ts +302 -0
- package/runner/src/adapters/opencode-tools-config.ts +17 -0
- package/runner/src/adapters/opencode.ts +2264 -0
- package/runner/src/adapters/project-shell.ts +80 -0
- package/runner/src/adapters/provider-launch-config.ts +21 -0
- package/runner/src/adapters/provider-quota-harvest.ts +127 -0
- package/runner/src/adapters/service-access.ts +153 -0
- package/runner/src/adapters/tmux-offload.ts +207 -0
- package/runner/src/adapters/tool-summary.ts +214 -0
- package/runner/src/agent-redact.ts +75 -0
- package/runner/src/agent-runner/commands/dispatch.ts +185 -0
- package/runner/src/agent-runner/commands/lifecycle.ts +84 -0
- package/runner/src/agent-runner/commands/prompt.ts +284 -0
- package/runner/src/agent-runner/credentials.ts +208 -0
- package/runner/src/agent-runner/http-liveness.ts +85 -0
- package/runner/src/agent-runner/lifecycle-milestones.ts +207 -0
- package/runner/src/agent-runner/lifecycle-phase.ts +80 -0
- package/runner/src/agent-runner/registration.ts +163 -0
- package/runner/src/agent-runner/runner-context.ts +158 -0
- package/runner/src/agent-runner/session-mirror.ts +278 -0
- package/runner/src/agent-runner/task-claims.ts +116 -0
- package/runner/src/agent-runner/token-usage-coverage.ts +54 -0
- package/runner/src/agent-runner/turn-report.ts +269 -0
- package/runner/src/api-budget-accounting.ts +91 -0
- package/runner/src/area-memory.ts +255 -0
- package/runner/src/artifact-path-materialize.ts +52 -0
- package/runner/src/async-guard.ts +35 -0
- package/runner/src/attachment-cache-sweep.ts +31 -0
- package/runner/src/attachment-cache.ts +195 -0
- package/runner/src/background-script-reconcile.ts +106 -0
- package/runner/src/bounded-log.ts +59 -0
- package/runner/src/bounded-spawn-sync.ts +18 -0
- package/runner/src/busy-reconciler.ts +282 -0
- package/runner/src/claim-tracker.ts +140 -0
- package/runner/src/claude-settings.ts +167 -0
- package/runner/src/claude-workspace-trust.ts +289 -0
- package/runner/src/config.ts +547 -0
- package/runner/src/context-boundary.ts +101 -0
- package/runner/src/context-command.ts +151 -0
- package/runner/src/context-probe-state.ts +6 -0
- package/runner/src/continuation-archive.ts +179 -0
- package/runner/src/control-server.ts +730 -0
- package/runner/src/delivery-policy.ts +9 -0
- package/runner/src/delivery-result.ts +24 -0
- package/runner/src/effort-command.ts +125 -0
- package/runner/src/empty-turn.ts +816 -0
- package/runner/src/free-port.ts +25 -0
- package/runner/src/fs-offload.ts +26 -0
- package/runner/src/gate-run-config.ts +35 -0
- package/runner/src/gate-run-lease-probe.ts +38 -0
- package/runner/src/host-asset-plan.ts +450 -0
- package/runner/src/host-claude-config-worker.ts +34 -0
- package/runner/src/host-sources.ts +40 -0
- package/runner/src/inbox-carrier.ts +7 -0
- package/runner/src/index.ts +386 -0
- package/runner/src/launch-assembly.ts +955 -0
- package/runner/src/liveness.ts +105 -0
- package/runner/src/logger.ts +108 -0
- package/runner/src/mcp-outbox.ts +204 -0
- package/runner/src/mcp-preflight.ts +86 -0
- package/runner/src/mcp-source-selection.ts +54 -0
- package/runner/src/mcp-tool-deferral.ts +35 -0
- package/runner/src/mcp-vault-env.ts +25 -0
- package/runner/src/message-body-config/config.ts +16 -0
- package/runner/src/message-body-config.ts +1 -0
- package/runner/src/mid-turn-delivery.ts +43 -0
- package/runner/src/native-memory-lever.ts +329 -0
- package/runner/src/native-self-resume.ts +244 -0
- package/runner/src/outbox.ts +453 -0
- package/runner/src/park-post.ts +17 -0
- package/runner/src/pending-permission-store.ts +148 -0
- package/runner/src/process-meta.ts +9 -0
- package/runner/src/profile-home.ts +419 -0
- package/runner/src/profile-projection.ts +411 -0
- package/runner/src/project-hooks.ts +65 -0
- package/runner/src/project-instructions.ts +119 -0
- package/runner/src/provider-double.ts +59 -0
- package/runner/src/provider-hold.ts +228 -0
- package/runner/src/provider-home-marker.ts +3 -0
- package/runner/src/provider-home-tombstone.ts +4 -0
- package/runner/src/provider-input-queue.ts +134 -0
- package/runner/src/provider-integration.ts +93 -0
- package/runner/src/provider-processes.ts +17 -0
- package/runner/src/provider-submit-failure.ts +15 -0
- package/runner/src/providers.ts +35 -0
- package/runner/src/provisioning.ts +703 -0
- package/runner/src/question-decision.ts +18 -0
- package/runner/src/quota.ts +22 -0
- package/runner/src/rate-limit.ts +351 -0
- package/runner/src/refused-prompt-store.ts +36 -0
- package/runner/src/relay-injection-events.ts +161 -0
- package/runner/src/relay-instructions.ts +107 -0
- package/runner/src/relay-mcp-proxy.long-turn-e2e.ts +183 -0
- package/runner/src/relay-mcp-proxy.ts +704 -0
- package/runner/src/relay-mcp.ts +583 -0
- package/runner/src/reply-obligation-cache.ts +211 -0
- package/runner/src/response-capture-report.ts +111 -0
- package/runner/src/response-routing.ts +6 -0
- package/runner/src/runner-core.ts +2955 -0
- package/runner/src/runner-exit.ts +12 -0
- package/runner/src/runner-helpers.ts +582 -0
- package/runner/src/runner-insights.ts +105 -0
- package/runner/src/runner-mcp-proxy.ts +46 -0
- package/runner/src/runner-spawn-config.ts +68 -0
- package/runner/src/runner-stale-scratch-sweep.ts +21 -0
- package/runner/src/runner.ts +9 -0
- package/runner/src/runtime-token-file.ts +45 -0
- package/runner/src/runtime-token-remint.ts +56 -0
- package/runner/src/service-access.ts +88 -0
- package/runner/src/session-destroy.ts +27 -0
- package/runner/src/session-insights.ts +118 -0
- package/runner/src/session-scratch.ts +296 -0
- package/runner/src/spawn-input.ts +147 -0
- package/runner/src/startup-config-fetch.ts +48 -0
- package/runner/src/subreaper.ts +113 -0
- package/runner/src/template-resolver.ts +29 -0
- package/runner/src/test-run-dedup.ts +435 -0
- package/runner/src/transcript-context.ts +99 -0
- package/runner/src/transport-errors.ts +48 -0
- package/runner/src/turn-opener.ts +55 -0
- package/runner/src/turn-reconcile-event.ts +88 -0
- package/runner/src/vault-proxy-hop.ts +99 -0
- package/runner/src/version.ts +44 -0
- package/runner/src/web-tool-call-proxy.ts +128 -0
- package/runner/src/web-tools.ts +59 -0
- package/runner/test-support/codex-web-config-proof.ts +149 -0
- package/runner/test-support/effective-launch.ts +189 -0
- package/runner/test-support/native-context-sources.ts +77 -0
- package/runner/test-support/provisioning-context.ts +55 -0
- package/runner/test-support/recorder-double.ts +130 -0
- package/runner/test-support/recording-provider.ts +242 -0
- package/runner/test-support/runner-harness.ts +249 -0
- package/runner/test-support/service-access-fixture.ts +12 -0
- package/scripts/agent-vault/bootstrap.py +87 -0
- package/scripts/agent-vault/install.py +200 -0
- package/scripts/agent-vault/install_refresh.py +98 -0
- package/scripts/agent-vault/refresh.py +116 -0
- package/scripts/agent-vault/refresh_provision.py +109 -0
- package/scripts/agent-vault/refresh_store.py +54 -0
- package/scripts/agent-vault/runtime.py +253 -0
- package/scripts/agent-vault/sec-ops-activation.json +23 -0
- package/scripts/artifact-checkout-gc.ts +51 -0
- package/scripts/cd-config.ts +237 -0
- package/scripts/cd-deploy-debounce.ts +94 -0
- package/scripts/cd-deploy-worktree-gc.ts +235 -0
- package/scripts/cd-fleet-membership.ts +48 -0
- package/scripts/cd-host-epochs.ts +101 -0
- package/scripts/cd-hub-wake.ts +40 -0
- package/scripts/cd-land-boundary.ts +49 -0
- package/scripts/cd-watcher.ts +985 -0
- package/scripts/dashboard-build-marker.ts +71 -0
- package/scripts/fleet-sha-coverage.ts +66 -0
- package/scripts/gate-run-lease.ts +329 -0
- package/scripts/gate-slot +9 -0
- package/scripts/gate-slot-fleet-health.ts +60 -0
- package/scripts/gate.sh +6 -0
- package/scripts/install-bin-shim.cjs +149 -0
- package/scripts/orchestrator-spawn-smoke.ts +398 -0
- package/scripts/provisioning-matrix.ts +72 -0
- package/scripts/release-cd-stamp.ts +146 -0
- package/scripts/release-health.ts +133 -0
- package/scripts/release-report.ts +102 -0
- package/scripts/release-upgrade.ts +1296 -0
- package/scripts/steward-policy-cleanup.ts +73 -0
- package/scripts/wait-for-deploy.ts +43 -0
- package/src/agent-authz.ts +219 -0
- package/src/agent-branch-state.ts +45 -0
- package/src/agent-busy-health.ts +158 -0
- package/src/agent-card-projection.ts +86 -0
- package/src/agent-channel-binding.ts +49 -0
- package/src/agent-command-activity.ts +39 -0
- package/src/agent-core.ts +29 -0
- package/src/agent-death-diagnosis.ts +314 -0
- package/src/agent-drive-arbiter.ts +112 -0
- package/src/agent-exit-alarm.ts +10 -0
- package/src/agent-exit-cleanup-async.ts +69 -0
- package/src/agent-exit-cleanup.ts +99 -0
- package/src/agent-exit-report.ts +28 -0
- package/src/agent-issue-repo.ts +53 -0
- package/src/agent-launch-shape-redaction.ts +72 -0
- package/src/agent-lifecycle-events.ts +428 -0
- package/src/agent-principal.ts +14 -0
- package/src/agent-profile-catalog.ts +188 -0
- package/src/agent-ref.ts +340 -0
- package/src/agent-spawn.ts +45 -0
- package/src/agent-status-events.ts +41 -0
- package/src/agent-system-tags.ts +38 -0
- package/src/artifact-media.ts +34 -0
- package/src/artifact-storage.ts +245 -0
- package/src/artifact-text.ts +31 -0
- package/src/async-deadline.ts +59 -0
- package/src/auth/admin-routes.ts +36 -0
- package/src/auth/index.ts +23 -0
- package/src/auth/login-rate-limiter.ts +153 -0
- package/src/auth/password.ts +142 -0
- package/src/auth/provider.ts +60 -0
- package/src/auth/role-scopes.ts +15 -0
- package/src/auth/session-cookie.ts +35 -0
- package/src/auth/session-refresh.ts +61 -0
- package/src/auth/session.test-fixture.ts +10 -0
- package/src/auth/session.ts +107 -0
- package/src/authority-audit.ts +56 -0
- package/src/authz-meta-keys.ts +64 -0
- package/src/auto-spawn-dispatch.ts +154 -0
- package/src/automations/constants.ts +14 -0
- package/src/automations/cron.ts +129 -0
- package/src/automations/crud.ts +129 -0
- package/src/automations/dispatch.ts +299 -0
- package/src/automations/index.ts +5 -0
- package/src/automations/precheck.ts +124 -0
- package/src/automations/reconcile.ts +314 -0
- package/src/automations/storage.ts +200 -0
- package/src/automations/types.ts +16 -0
- package/src/automations/validation.ts +216 -0
- package/src/automations.ts +1 -0
- package/src/branch-landed.ts +761 -0
- package/src/browser-authz.ts +18 -0
- package/src/browser-config.ts +31 -0
- package/src/bundled-workflows.ts +48 -0
- package/src/bus-outbox-async.ts +16 -0
- package/src/bus-outbox.ts +265 -0
- package/src/bus-resume-commands.ts +18 -0
- package/src/bus.ts +792 -0
- package/src/canonical-repo-root.ts +131 -0
- package/src/cd-deploy-notify.ts +59 -0
- package/src/cd-host-deferrals.ts +23 -0
- package/src/cd-host-lag-notify.ts +36 -0
- package/src/cd-repository.ts +49 -0
- package/src/channel-output-control.ts +43 -0
- package/src/channel-output-validation.ts +11 -0
- package/src/channel-policy-health.ts +20 -0
- package/src/channel-target.ts +40 -0
- package/src/channels-host-service.ts +219 -0
- package/src/ci/bun-test-log.ts +41 -0
- package/src/ci/failed-test-files.ts +52 -0
- package/src/ci/gate-history.ts +66 -0
- package/src/ci/github-actions.ts +145 -0
- package/src/ci/incidents.ts +175 -0
- package/src/ci/index.ts +6 -0
- package/src/ci/job-verdict.ts +27 -0
- package/src/ci/land-boundary-ci.ts +104 -0
- package/src/ci/monitor.ts +528 -0
- package/src/ci/not-triggered.ts +116 -0
- package/src/ci/notifications.ts +234 -0
- package/src/ci/provider.ts +87 -0
- package/src/ci/root-missing.ts +35 -0
- package/src/ci/transition-notify.ts +279 -0
- package/src/ci-monitor.ts +7 -0
- package/src/claude-api-budget-async.ts +11 -0
- package/src/claude-api-budget-config.ts +23 -0
- package/src/claude-api-expiry.ts +70 -0
- package/src/claude-api-overflow.ts +146 -0
- package/src/claude-app/config.ts +13 -0
- package/src/claude-app/oauth-http.ts +127 -0
- package/src/claude-app/oauth-provider.ts +136 -0
- package/src/claude-app/passphrase.ts +14 -0
- package/src/claude-app-auth.ts +65 -0
- package/src/claude-app-gateway.ts +68 -0
- package/src/cli/_shared.ts +136 -0
- package/src/cli/agent-detect.ts +175 -0
- package/src/cli/agent-guide.ts +152 -0
- package/src/cli/agent-keep.ts +37 -0
- package/src/cli/agent-meta.ts +111 -0
- package/src/cli/artifact.ts +154 -0
- package/src/cli/browser.ts +56 -0
- package/src/cli/channel-output.ts +17 -0
- package/src/cli/channels-host.ts +13 -0
- package/src/cli/channels.ts +16 -0
- package/src/cli/claude-api-budget.ts +41 -0
- package/src/cli/context-probe.ts +90 -0
- package/src/cli/credentials.ts +1 -0
- package/src/cli/daemon.ts +125 -0
- package/src/cli/dev.ts +185 -0
- package/src/cli/ephemeral.ts +159 -0
- package/src/cli/hosts.ts +41 -0
- package/src/cli/index.ts +442 -0
- package/src/cli/introspect.ts +74 -0
- package/src/cli/maintenance.ts +24 -0
- package/src/cli/merges.ts +78 -0
- package/src/cli/message.ts +229 -0
- package/src/cli/orchestrator.ts +384 -0
- package/src/cli/pair.ts +135 -0
- package/src/cli/profile.ts +35 -0
- package/src/cli/project.ts +52 -0
- package/src/cli/prompts.ts +23 -0
- package/src/cli/provider-enablement.ts +42 -0
- package/src/cli/provider.ts +230 -0
- package/src/cli/recipe.ts +110 -0
- package/src/cli/reply.ts +130 -0
- package/src/cli/roles.ts +60 -0
- package/src/cli/routing-policy.ts +20 -0
- package/src/cli/run.ts +96 -0
- package/src/cli/secrets-backup.ts +85 -0
- package/src/cli/secrets.ts +55 -0
- package/src/cli/service-access.ts +23 -0
- package/src/cli/setup.ts +57 -0
- package/src/cli/shutdown.ts +16 -0
- package/src/cli/spawn.ts +31 -0
- package/src/cli/state.ts +73 -0
- package/src/cli/steward.ts +58 -0
- package/src/cli/task.ts +151 -0
- package/src/cli/team.ts +18 -0
- package/src/cli/timers.ts +53 -0
- package/src/cli/token.ts +72 -0
- package/src/cli/upgrade.ts +200 -0
- package/src/cli/web-tool-calls.ts +17 -0
- package/src/cli/workflow.ts +46 -0
- package/src/cli/workspace.ts +544 -0
- package/src/cli.ts +4 -0
- package/src/codex-reset-consume.ts +274 -0
- package/src/codex-wham-quota.ts +177 -0
- package/src/command-events.ts +69 -0
- package/src/command-secrets.ts +198 -0
- package/src/command-ttl.ts +63 -0
- package/src/commands-db.ts +1200 -0
- package/src/commands-landing-async.ts +166 -0
- package/src/commands-write.ts +168 -0
- package/src/comment-blocks.ts +84 -0
- package/src/compaction-watch.ts +259 -0
- package/src/config-model-selection.ts +14 -0
- package/src/config-store-write.ts +39 -0
- package/src/config-store.ts +1253 -0
- package/src/config.ts +939 -0
- package/src/connector-boot-health.ts +27 -0
- package/src/connector-paths.ts +47 -0
- package/src/connectors.ts +547 -0
- package/src/content-security.ts +12 -0
- package/src/context-advisory.ts +279 -0
- package/src/context-block-rendered-at.ts +33 -0
- package/src/context-injection-channel.ts +49 -0
- package/src/context-router.ts +121 -0
- package/src/context-threshold-config.ts +52 -0
- package/src/continuation-replay-edge.ts +30 -0
- package/src/continuity-working-state.ts +107 -0
- package/src/contracts.ts +109 -0
- package/src/coordinator-authority.ts +100 -0
- package/src/coordinator-digest-config.ts +20 -0
- package/src/cosmos-events.ts +164 -0
- package/src/daemon.ts +570 -0
- package/src/dashboard-notifications.ts +169 -0
- package/src/dashboard-presence.ts +86 -0
- package/src/db/activity-async.ts +58 -0
- package/src/db/activity-read-ops.ts +42 -0
- package/src/db/activity-write-ops.ts +44 -0
- package/src/db/activity.ts +454 -0
- package/src/db/agent-card-read.ts +98 -0
- package/src/db/agent-effort-state.ts +146 -0
- package/src/db/agent-exit-cleanup.ts +94 -0
- package/src/db/agent-exit-report.ts +33 -0
- package/src/db/agent-gate-runs-write-ops.ts +7 -0
- package/src/db/agent-gate-runs.ts +96 -0
- package/src/db/agent-identity-archive.test-fixture.ts +12 -0
- package/src/db/agent-identity-archive.ts +75 -0
- package/src/db/agent-keep.ts +21 -0
- package/src/db/agent-lifecycle-write-ops.ts +93 -0
- package/src/db/agent-meta.ts +74 -0
- package/src/db/agent-outstanding-work.ts +154 -0
- package/src/db/agent-ownership-async.ts +45 -0
- package/src/db/agent-ownership-read-ops.ts +12 -0
- package/src/db/agent-ownership-write-ops.ts +54 -0
- package/src/db/agent-ownership.ts +200 -0
- package/src/db/agent-predicates.ts +64 -0
- package/src/db/agent-read.ts +39 -0
- package/src/db/agent-search-async.ts +21 -0
- package/src/db/agent-search-read-ops.ts +8 -0
- package/src/db/agent-search.ts +162 -0
- package/src/db/agent-shutdown-in-flight.ts +21 -0
- package/src/db/agents-async.ts +337 -0
- package/src/db/agents-prune-write-op.ts +37 -0
- package/src/db/agents-read-ops.ts +33 -0
- package/src/db/agents-write-ops.ts +188 -0
- package/src/db/agents.ts +1284 -0
- package/src/db/api-budget-schema.ts +144 -0
- package/src/db/api-budget-usage-migration.ts +31 -0
- package/src/db/api-budget-usage.ts +40 -0
- package/src/db/artifact-browse.ts +145 -0
- package/src/db/artifact-retention.ts +115 -0
- package/src/db/artifacts-async.ts +81 -0
- package/src/db/artifacts-read-ops.ts +24 -0
- package/src/db/artifacts-write-ops.ts +51 -0
- package/src/db/artifacts.ts +307 -0
- package/src/db/auth-identities.ts +128 -0
- package/src/db/backlog.ts +172 -0
- package/src/db/blackboard.ts +171 -0
- package/src/db/broadcast-scope.ts +63 -0
- package/src/db/broker-memory-migration.ts +71 -0
- package/src/db/browser-sessions.ts +89 -0
- package/src/db/budget-lineage.ts +26 -0
- package/src/db/bus-outbox-read-ops.ts +29 -0
- package/src/db/bus-outbox-write-ops.ts +58 -0
- package/src/db/bus-prune-async.ts +16 -0
- package/src/db/busy-regression.worker.ts +48 -0
- package/src/db/caller-lifecycle.ts +24 -0
- package/src/db/carry-pending-marker.ts +129 -0
- package/src/db/carry-pending.ts +145 -0
- package/src/db/channel-binding-delete.ts +15 -0
- package/src/db/channel-egress-allowlist.ts +200 -0
- package/src/db/channel-identity.ts +38 -0
- package/src/db/channel-runtime.ts +19 -0
- package/src/db/channels-async.ts +55 -0
- package/src/db/channels-read-ops.ts +13 -0
- package/src/db/channels-session-fence.ts +18 -0
- package/src/db/channels-write-ops.ts +46 -0
- package/src/db/channels.ts +654 -0
- package/src/db/checkout-refresh.ts +36 -0
- package/src/db/ci-gate-runs.ts +92 -0
- package/src/db/ci-incidents-async.ts +76 -0
- package/src/db/ci-incidents-read-ops.ts +15 -0
- package/src/db/ci-incidents-write-ops.ts +57 -0
- package/src/db/ci-incidents.ts +667 -0
- package/src/db/ci-sha-observations-schema.ts +33 -0
- package/src/db/claim-sql.ts +44 -0
- package/src/db/claude-api-budget-ops.ts +15 -0
- package/src/db/claude-api-budget-reconcile.ts +39 -0
- package/src/db/claude-api-budget.ts +198 -0
- package/src/db/claude-app-oauth.ts +74 -0
- package/src/db/claude-catalog-reconcile.ts +27 -0
- package/src/db/codex-reset-consumes-async.ts +9 -0
- package/src/db/codex-reset-consumes-read-ops.ts +5 -0
- package/src/db/codex-reset-consumes-write-ops.ts +22 -0
- package/src/db/codex-reset-consumes.ts +122 -0
- package/src/db/command-agent-profiles.ts +58 -0
- package/src/db/command-row.ts +88 -0
- package/src/db/command-terminal-status.ts +33 -0
- package/src/db/command-vault-pruning.ts +30 -0
- package/src/db/commands-cancel-write.ts +45 -0
- package/src/db/commands-claim-admission.ts +144 -0
- package/src/db/commands-effort-read.ts +58 -0
- package/src/db/commands-host-land-admission.ts +106 -0
- package/src/db/commands-kernel-landing.ts +268 -0
- package/src/db/commands-land-occupancy.ts +40 -0
- package/src/db/commands-land-wait.ts +38 -0
- package/src/db/commands-landing-completeness.ts +66 -0
- package/src/db/commands-landing-tuples.ts +22 -0
- package/src/db/commands-landing.ts +1046 -0
- package/src/db/commands-leaseless-sweep.ts +72 -0
- package/src/db/commands-list-query.ts +47 -0
- package/src/db/commands-planner-stats.test-fixture.ts +97 -0
- package/src/db/commands-read-ops.ts +49 -0
- package/src/db/commands-scheduler-recovery.ts +71 -0
- package/src/db/commands-spawn-read.ts +33 -0
- package/src/db/commands-write-ops.ts +307 -0
- package/src/db/config-store-write-ops.ts +60 -0
- package/src/db/connection-instrumentation.ts +76 -0
- package/src/db/connection.ts +532 -0
- package/src/db/context-reset-carry.ts +144 -0
- package/src/db/continuation-archive-purge.ts +48 -0
- package/src/db/continuation-archive-search.ts +249 -0
- package/src/db/continuation-archives-async.ts +59 -0
- package/src/db/continuation-archives-read-ops.ts +10 -0
- package/src/db/continuation-archives-write-ops.ts +17 -0
- package/src/db/continuation-archives.ts +158 -0
- package/src/db/continuations.ts +201 -0
- package/src/db/coordinator-delivery.ts +10 -0
- package/src/db/coordinator-digest-async.ts +13 -0
- package/src/db/coordinator-digest-flush.ts +6 -0
- package/src/db/coordinator-digest.ts +145 -0
- package/src/db/coordinator-seat.ts +130 -0
- package/src/db/crash-reports.ts +115 -0
- package/src/db/db-error-registry.ts +290 -0
- package/src/db/db-reader-worker.ts +91 -0
- package/src/db/db-writer-worker.ts +66 -0
- package/src/db/deferred-lineage-report-queries.ts +28 -0
- package/src/db/deferred-lineage-reports.ts +44 -0
- package/src/db/delivery-async.ts +102 -0
- package/src/db/delivery-expiration-health.ts +97 -0
- package/src/db/delivery-expiration.ts +52 -0
- package/src/db/delivery-quality-async.ts +23 -0
- package/src/db/delivery-quality.ts +116 -0
- package/src/db/delivery-read-ops.ts +26 -0
- package/src/db/delivery-report-echo.ts +53 -0
- package/src/db/delivery-write-ops.ts +77 -0
- package/src/db/delivery.ts +545 -0
- package/src/db/deploy-events-async.ts +66 -0
- package/src/db/deploy-events-read-ops.ts +25 -0
- package/src/db/deploy-events-write-ops.ts +81 -0
- package/src/db/deploy-events.ts +554 -0
- package/src/db/deploy-task-completion.ts +48 -0
- package/src/db/drive-leases.ts +165 -0
- package/src/db/durable-payloads.ts +92 -0
- package/src/db/fixtures/writer-shutdown.ts +28 -0
- package/src/db/fts-query.ts +8 -0
- package/src/db/gate-policy.ts +27 -0
- package/src/db/gate-runs.ts +181 -0
- package/src/db/gateway.ts +513 -0
- package/src/db/generation-launch.ts +82 -0
- package/src/db/guides-search.ts +18 -0
- package/src/db/history-delivery-settle.ts +57 -0
- package/src/db/hosts-async.ts +150 -0
- package/src/db/hosts-backfill.ts +91 -0
- package/src/db/hosts-read-ops.ts +21 -0
- package/src/db/hosts-registration.ts +452 -0
- package/src/db/hosts-views.ts +259 -0
- package/src/db/hosts-write-ops.ts +108 -0
- package/src/db/hosts.ts +251 -0
- package/src/db/human-address.ts +6 -0
- package/src/db/idle-digest.ts +54 -0
- package/src/db/idle-self-care.ts +100 -0
- package/src/db/inbox-async.ts +29 -0
- package/src/db/inbox-read-ops.ts +8 -0
- package/src/db/inbox-write-ops.ts +29 -0
- package/src/db/inbox.ts +197 -0
- package/src/db/index.ts +147 -0
- package/src/db/injection-attempts.ts +41 -0
- package/src/db/insights-read-ops.ts +12 -0
- package/src/db/insights-write-ops.ts +16 -0
- package/src/db/integrations.ts +297 -0
- package/src/db/issue-associations.ts +136 -0
- package/src/db/issue-lifecycle.ts +199 -0
- package/src/db/issue-refs.ts +312 -0
- package/src/db/kernel-event-log-schema.ts +14 -0
- package/src/db/kernel-landing-admission.ts +15 -0
- package/src/db/kernel-landing-command-authority.ts +222 -0
- package/src/db/kernel-persistence-async.ts +48 -0
- package/src/db/kernel-persistence-read-ops.ts +24 -0
- package/src/db/kernel-persistence-write-ops.ts +43 -0
- package/src/db/land-boundaries.ts +138 -0
- package/src/db/land-executing.ts +147 -0
- package/src/db/land-gate-attestations.ts +161 -0
- package/src/db/land-incident-eligibility.ts +44 -0
- package/src/db/land-queue-trace.ts +28 -0
- package/src/db/land-stack.ts +80 -0
- package/src/db/land-telemetry-schema.ts +50 -0
- package/src/db/land-telemetry-write-ops.ts +16 -0
- package/src/db/land-telemetry.ts +114 -0
- package/src/db/land-withdrawal-state.ts +26 -0
- package/src/db/landed-merge-evidence.ts +72 -0
- package/src/db/landed-task-attribution.ts +23 -0
- package/src/db/landing-audit.ts +18 -0
- package/src/db/landing-controllers.ts +67 -0
- package/src/db/landing-ingress-async.ts +102 -0
- package/src/db/landing-ingress-read-ops.ts +8 -0
- package/src/db/landing-ingress-write-ops.ts +42 -0
- package/src/db/landing-ingress.ts +380 -0
- package/src/db/landing-read-ops.ts +18 -0
- package/src/db/landing-receipts.ts +206 -0
- package/src/db/landing-schema.ts +479 -0
- package/src/db/launch-facts.ts +60 -0
- package/src/db/legacy-landing-publication.ts +103 -0
- package/src/db/legacy-message-backfill.ts +90 -0
- package/src/db/lifecycle-seq.ts +127 -0
- package/src/db/lifecycle-write-window.ts +216 -0
- package/src/db/lineage-pair-dedupe-sql.ts +80 -0
- package/src/db/lineage-startup-captures.ts +43 -0
- package/src/db/long-running-work-async.ts +12 -0
- package/src/db/long-running-work-write-ops.ts +8 -0
- package/src/db/long-running-work.ts +78 -0
- package/src/db/macos-privacy.ts +72 -0
- package/src/db/main-connection-writes.ts +44 -0
- package/src/db/main-thread-state.ts +38 -0
- package/src/db/maintenance-health.ts +560 -0
- package/src/db/maintenance-indexes.ts +37 -0
- package/src/db/maintenance-job-runs-async.ts +15 -0
- package/src/db/maintenance-job-runs.ts +62 -0
- package/src/db/maintenance-job-write-ops.ts +10 -0
- package/src/db/maintenance-pauses.ts +224 -0
- package/src/db/maintenance-worker.ts +111 -0
- package/src/db/mappers.ts +422 -0
- package/src/db/memory-preamble-read.ts +13 -0
- package/src/db/memory-resolve.ts +209 -0
- package/src/db/memory-retirement-plan.ts +31 -0
- package/src/db/memory-retirement.ts +15 -0
- package/src/db/merge-drain-async.ts +8 -0
- package/src/db/merge-lease.ts +225 -0
- package/src/db/message-claims.ts +16 -0
- package/src/db/message-queries.ts +16 -0
- package/src/db/message-read-mark.ts +32 -0
- package/src/db/message-reads-async.ts +46 -0
- package/src/db/message-reads-read-ops.ts +35 -0
- package/src/db/message-reads-write-ops.ts +27 -0
- package/src/db/message-reads.ts +553 -0
- package/src/db/message-send-suppression.ts +58 -0
- package/src/db/message-send.ts +76 -0
- package/src/db/message-thread.ts +15 -0
- package/src/db/message-write-ops.ts +100 -0
- package/src/db/messages-async.ts +31 -0
- package/src/db/messages-read-ops.ts +14 -0
- package/src/db/messages.ts +1201 -0
- package/src/db/migration-marker.ts +13 -0
- package/src/db/migrations.ts +1761 -0
- package/src/db/notification-subscriptions.ts +282 -0
- package/src/db/on-loop-write-transaction.ts +34 -0
- package/src/db/operator-actions-schema.ts +10 -0
- package/src/db/operator-decisions.ts +180 -0
- package/src/db/orchestrators-async.ts +61 -0
- package/src/db/orchestrators-read-ops.ts +7 -0
- package/src/db/orchestrators-write-ops.ts +58 -0
- package/src/db/orchestrators.ts +497 -0
- package/src/db/outbox-codec.ts +16 -0
- package/src/db/pair-maintenance.ts +9 -0
- package/src/db/pairs-async.ts +10 -0
- package/src/db/pairs-write-ops.ts +8 -0
- package/src/db/pairs.ts +264 -0
- package/src/db/pending-relay-runs.ts +73 -0
- package/src/db/plan-blurb-migration.ts +158 -0
- package/src/db/plan-ci-blocks.ts +28 -0
- package/src/db/plan-completion.ts +55 -0
- package/src/db/plan-conformance.ts +104 -0
- package/src/db/plan-dispatch-schema.ts +17 -0
- package/src/db/plan-dispatch-store.ts +112 -0
- package/src/db/plan-external.ts +79 -0
- package/src/db/plan-graph-async.ts +23 -0
- package/src/db/plan-graph-read-ops.ts +16 -0
- package/src/db/plan-graph-write-ops.ts +37 -0
- package/src/db/plan-graph.ts +403 -0
- package/src/db/plan-import-schema.ts +19 -0
- package/src/db/plan-import.ts +211 -0
- package/src/db/plan-task-create.ts +44 -0
- package/src/db/planner-stats.ts +123 -0
- package/src/db/plans-async.ts +22 -0
- package/src/db/plans-read-ops.ts +11 -0
- package/src/db/plans-write-ops.ts +9 -0
- package/src/db/plans.ts +385 -0
- package/src/db/policy-runtime.ts +14 -0
- package/src/db/presence-buffer.ts +111 -0
- package/src/db/presence-loop.ts +58 -0
- package/src/db/presence-write-ops.ts +28 -0
- package/src/db/presence-write.ts +38 -0
- package/src/db/profile-artifact-backfill-migration.ts +32 -0
- package/src/db/profile-host-sources-migration.ts +150 -0
- package/src/db/profile-legacy-project-instructions-migration.ts +41 -0
- package/src/db/profile-name-case-migration.ts +46 -0
- package/src/db/profile-override-migration.ts +200 -0
- package/src/db/profile-project-ack-migration.ts +55 -0
- package/src/db/profile-slim-migration.ts +125 -0
- package/src/db/profile-slim-plan.ts +190 -0
- package/src/db/project-entries-async.ts +18 -0
- package/src/db/project-entries-read-ops.ts +28 -0
- package/src/db/project-entries.ts +514 -0
- package/src/db/project-entry-search.ts +63 -0
- package/src/db/project-identity.ts +16 -0
- package/src/db/project-journal.ts +256 -0
- package/src/db/project-lifecycle.ts +80 -0
- package/src/db/project-memory-group-migration.ts +76 -0
- package/src/db/project-phantom-merge.ts +228 -0
- package/src/db/project-root-schema.ts +30 -0
- package/src/db/project-trust-approvals.ts +98 -0
- package/src/db/projects-async.ts +50 -0
- package/src/db/projects-read-ops.ts +59 -0
- package/src/db/projects-write-ops.ts +74 -0
- package/src/db/projects.ts +629 -0
- package/src/db/prompt-templates-schema.ts +23 -0
- package/src/db/prompt-templates.ts +138 -0
- package/src/db/prompt-version-migration.ts +115 -0
- package/src/db/prompt-versions-ops.ts +17 -0
- package/src/db/prompt-versions.ts +167 -0
- package/src/db/provider-catalog-async.ts +31 -0
- package/src/db/provider-catalog-read-ops.ts +8 -0
- package/src/db/provider-catalog-write-ops.ts +16 -0
- package/src/db/provider-config-history.ts +49 -0
- package/src/db/provider-config-secrets.ts +117 -0
- package/src/db/provider-flap-messages-async.ts +6 -0
- package/src/db/provider-flap-messages-write-ops.ts +13 -0
- package/src/db/provider-flap-messages.ts +19 -0
- package/src/db/provider-quota-advisory-types.ts +39 -0
- package/src/db/provider-quota-burn.ts +322 -0
- package/src/db/provider-quota-effect-occurrences.ts +13 -0
- package/src/db/provider-quota-lease-write-ops.ts +24 -0
- package/src/db/provider-quota-leases-async.ts +35 -0
- package/src/db/provider-quota-leases.ts +174 -0
- package/src/db/provider-quota-matrix-cache.ts +85 -0
- package/src/db/provider-quota-matrix-fetch.ts +85 -0
- package/src/db/provider-quota-merge.ts +90 -0
- package/src/db/provider-quota-notification-write.ts +98 -0
- package/src/db/provider-quota-prune.ts +35 -0
- package/src/db/provider-quota-read-async.ts +77 -0
- package/src/db/provider-quota-read-ops.ts +56 -0
- package/src/db/provider-quota-recipients.ts +38 -0
- package/src/db/provider-quota-state.ts +139 -0
- package/src/db/provider-quota-visibility.ts +22 -0
- package/src/db/provider-quota-write-ops.ts +71 -0
- package/src/db/provider-quotas.ts +726 -0
- package/src/db/provider-secret-scrub.ts +64 -0
- package/src/db/provisioning-assets-migration.ts +85 -0
- package/src/db/provisioning-async.ts +116 -0
- package/src/db/provisioning-callmux.ts +184 -0
- package/src/db/provisioning-github-api.ts +16 -0
- package/src/db/provisioning-github-import-target.ts +29 -0
- package/src/db/provisioning-mcp-validation.ts +103 -0
- package/src/db/provisioning-read-ops.ts +23 -0
- package/src/db/provisioning-registry.ts +1122 -0
- package/src/db/provisioning-resolve.ts +321 -0
- package/src/db/provisioning-write-ops.ts +44 -0
- package/src/db/qa-skill-seed.ts +27 -0
- package/src/db/quota-lease-busy.worker.ts +62 -0
- package/src/db/read-op-marshaling-fixtures.ts +724 -0
- package/src/db/read-ops.ts +266 -0
- package/src/db/reader-pool.ts +252 -0
- package/src/db/recipe-read-ops.ts +15 -0
- package/src/db/recipe-write-ops.ts +68 -0
- package/src/db/reply-obligations.ts +265 -0
- package/src/db/report-suppression.ts +126 -0
- package/src/db/restart-epoch-admin-async.ts +14 -0
- package/src/db/restart-epoch-admin.ts +67 -0
- package/src/db/restart-epoch-admission.ts +114 -0
- package/src/db/restart-epoch-async.ts +80 -0
- package/src/db/restart-epoch-begin.ts +177 -0
- package/src/db/restart-epoch-read-ops.ts +40 -0
- package/src/db/restart-epoch-release.ts +248 -0
- package/src/db/restart-epoch-write-ops.ts +117 -0
- package/src/db/restart-epoch.test-fixture.ts +37 -0
- package/src/db/restart-epoch.ts +623 -0
- package/src/db/restart-sensitive.ts +81 -0
- package/src/db/retention.ts +423 -0
- package/src/db/review-ref-cleanups.ts +306 -0
- package/src/db/routing-policy.ts +64 -0
- package/src/db/scheduled-timer-projection.ts +123 -0
- package/src/db/scheduled-timer-quota-chaos-worker.ts +84 -0
- package/src/db/scheduled-timers.ts +521 -0
- package/src/db/schema.ts +1472 -0
- package/src/db/scoped-message-reads.ts +31 -0
- package/src/db/secrets-broker-async.ts +31 -0
- package/src/db/secrets-broker-read-ops.ts +8 -0
- package/src/db/secrets-broker-write-ops.ts +23 -0
- package/src/db/secrets-broker.ts +221 -0
- package/src/db/secrets-vault-import.ts +37 -0
- package/src/db/secrets-vault-key-lifecycle.ts +64 -0
- package/src/db/secrets-vault-metadata.ts +37 -0
- package/src/db/secrets-vault-migration.ts +53 -0
- package/src/db/secrets-vault-write.ts +97 -0
- package/src/db/secrets-vault.ts +69 -0
- package/src/db/self-effort-permissions.ts +50 -0
- package/src/db/service-access-read-ops.ts +10 -0
- package/src/db/services-async.ts +29 -0
- package/src/db/services-read-ops.ts +134 -0
- package/src/db/services-write-ops.ts +74 -0
- package/src/db/shared.ts +7 -0
- package/src/db/shipping-board-async.ts +6 -0
- package/src/db/shipping-board.ts +319 -0
- package/src/db/shipping-stats-async.ts +24 -0
- package/src/db/shipping-stats-histogram.ts +45 -0
- package/src/db/shipping-stats-schema.ts +8 -0
- package/src/db/shipping-stats.ts +265 -0
- package/src/db/snapshot-ledger-prune.ts +53 -0
- package/src/db/spawn-budget.ts +145 -0
- package/src/db/spawn-command-busy.worker.ts +71 -0
- package/src/db/spawn-delegation-state.ts +124 -0
- package/src/db/spawn-delegation.ts +114 -0
- package/src/db/spawn-host-cap.ts +29 -0
- package/src/db/spawn-in-flight-count.ts +37 -0
- package/src/db/spawn-in-flight.ts +15 -0
- package/src/db/spawn-process-evidence.ts +68 -0
- package/src/db/spawn-project-target.ts +57 -0
- package/src/db/spawn-registration-confirmed-backfill.ts +71 -0
- package/src/db/spawn-request-id-migration.ts +36 -0
- package/src/db/spawn-request-id.ts +35 -0
- package/src/db/spawn-request-reuse.ts +28 -0
- package/src/db/spawn-tree-cleanup.ts +92 -0
- package/src/db/spawn-tree.ts +29 -0
- package/src/db/sql-audit-indexes.ts +77 -0
- package/src/db/stalled-message-delivery.ts +52 -0
- package/src/db/startup-write-lock.ts +36 -0
- package/src/db/stats-async.ts +235 -0
- package/src/db/stats-health-read-model.ts +225 -0
- package/src/db/stats-read-ops.ts +25 -0
- package/src/db/stats.ts +633 -0
- package/src/db/target-host.ts +25 -0
- package/src/db/task-async.ts +165 -0
- package/src/db/task-comment-through-async.ts +14 -0
- package/src/db/task-comment-through-read-ops.ts +4 -0
- package/src/db/task-comment-through-write-ops.ts +7 -0
- package/src/db/task-comment-through.ts +123 -0
- package/src/db/task-core.ts +44 -0
- package/src/db/task-deliverables-async.ts +60 -0
- package/src/db/task-deliverables-read-ops.ts +4 -0
- package/src/db/task-deliverables-write-ops.ts +37 -0
- package/src/db/task-deliverables.ts +387 -0
- package/src/db/task-dependency-cycle.worker.ts +43 -0
- package/src/db/task-detail-projection.ts +91 -0
- package/src/db/task-entity-async.ts +252 -0
- package/src/db/task-entity-read-ops.ts +51 -0
- package/src/db/task-entity-write-ops.ts +197 -0
- package/src/db/task-entity.ts +1143 -0
- package/src/db/task-execution.ts +20 -0
- package/src/db/task-issue-relation.ts +23 -0
- package/src/db/task-issue-source.ts +46 -0
- package/src/db/task-land-withdraw-async.ts +10 -0
- package/src/db/task-land-withdraw-read-ops.ts +13 -0
- package/src/db/task-land-withdraw-read.ts +47 -0
- package/src/db/task-land-withdraw-write-ops.ts +31 -0
- package/src/db/task-land-withdraw.ts +423 -0
- package/src/db/task-list.ts +113 -0
- package/src/db/task-maintenance.ts +25 -0
- package/src/db/task-memory-async.ts +19 -0
- package/src/db/task-memory-read-ops.ts +9 -0
- package/src/db/task-memory-write-ops.ts +23 -0
- package/src/db/task-memory.ts +170 -0
- package/src/db/task-owner.ts +126 -0
- package/src/db/task-read-ops.ts +44 -0
- package/src/db/task-review-hold-async.ts +20 -0
- package/src/db/task-review-hold-delivery.ts +58 -0
- package/src/db/task-review-hold-write-ops.ts +26 -0
- package/src/db/task-review-hold.ts +615 -0
- package/src/db/task-state-reconcile-async.ts +12 -0
- package/src/db/task-state-reconcile.ts +163 -0
- package/src/db/task-validation.ts +71 -0
- package/src/db/task-write-ops.ts +145 -0
- package/src/db/tasks.ts +528 -0
- package/src/db/team-epics.ts +37 -0
- package/src/db/team-idle.ts +35 -0
- package/src/db/team-project.ts +69 -0
- package/src/db/team-spawn-delegation-read.ts +36 -0
- package/src/db/team-spawn-delegation.ts +49 -0
- package/src/db/teams-async.ts +58 -0
- package/src/db/teams-read-ops.ts +27 -0
- package/src/db/teams-write-ops.ts +17 -0
- package/src/db/teams.ts +504 -0
- package/src/db/terminal-events.ts +113 -0
- package/src/db/timer-async.ts +523 -0
- package/src/db/timer-cutover-core.ts +545 -0
- package/src/db/timer-cutover-report-read-ops.ts +211 -0
- package/src/db/timer-cutover-write-ops.ts +282 -0
- package/src/db/timer-ingress-payload.ts +160 -0
- package/src/db/timer-ingress-read-ops.ts +39 -0
- package/src/db/timer-ingress-request-keys.ts +282 -0
- package/src/db/timer-ingress-write-ops.ts +154 -0
- package/src/db/timer-ingress.ts +515 -0
- package/src/db/timer-message-cutover.ts +322 -0
- package/src/db/timer-message-fire-deadletter.ts +136 -0
- package/src/db/timer-message-fire.ts +209 -0
- package/src/db/timer-message-flip-chaos-worker.ts +89 -0
- package/src/db/timer-message-flip-consistency.ts +147 -0
- package/src/db/timer-message-flip.ts +676 -0
- package/src/db/timer-message-participant.ts +138 -0
- package/src/db/timer-migrate-input.ts +92 -0
- package/src/db/timer-operator-async.ts +177 -0
- package/src/db/timer-operator-read-ops.ts +21 -0
- package/src/db/timer-operator-stage10.ts +119 -0
- package/src/db/timer-operator-write-ops.ts +116 -0
- package/src/db/timer-operator.ts +393 -0
- package/src/db/timer-read-ops.ts +147 -0
- package/src/db/timer-transfer-errors.ts +10 -0
- package/src/db/timer-transfer-write-ops.ts +43 -0
- package/src/db/timer-verifier-schema.ts +29 -0
- package/src/db/timer-verifier.ts +379 -0
- package/src/db/timer-write-ops.ts +291 -0
- package/src/db/token-db-write-ops.ts +96 -0
- package/src/db/token-standing.ts +84 -0
- package/src/db/token-usage-read-ops.ts +8 -0
- package/src/db/token-usage-write-ops.ts +35 -0
- package/src/db/token-usage.ts +338 -0
- package/src/db/tool-groups-empty-migration.ts +59 -0
- package/src/db/urgent-intake.ts +30 -0
- package/src/db/user-invites.ts +107 -0
- package/src/db/user-settings-read-ops.ts +19 -0
- package/src/db/user-settings-write-ops.ts +43 -0
- package/src/db/users.ts +173 -0
- package/src/db/vault-backup.ts +59 -0
- package/src/db/vault-expiry.ts +71 -0
- package/src/db/vault-health.ts +99 -0
- package/src/db/vault-token-launch.ts +77 -0
- package/src/db/vault-token-ops.ts +14 -0
- package/src/db/vault-tokens.ts +101 -0
- package/src/db/viewer-scope.ts +117 -0
- package/src/db/wal-checkpointer-worker.ts +48 -0
- package/src/db/wal-checkpointer.ts +107 -0
- package/src/db/wal-index.ts +53 -0
- package/src/db/wal-live-log.ts +68 -0
- package/src/db/wal-reclaim-async.ts +45 -0
- package/src/db/wal-reclaim.ts +140 -0
- package/src/db/web-tool-call-ops.ts +15 -0
- package/src/db/web-tool-calls.ts +87 -0
- package/src/db/withdraw-land-error.ts +18 -0
- package/src/db/work-evidence.ts +43 -0
- package/src/db/workflow-budget.ts +44 -0
- package/src/db/workflow-contact.ts +173 -0
- package/src/db/workflow-execution.ts +10 -0
- package/src/db/workflow-journal-async.ts +64 -0
- package/src/db/workflow-journal-prune.ts +71 -0
- package/src/db/workflow-journal-read-ops.ts +21 -0
- package/src/db/workflow-journal-schema.ts +9 -0
- package/src/db/workflow-journal-write-ops.ts +33 -0
- package/src/db/workflow-journal.ts +324 -0
- package/src/db/workflow-spawn-quota.ts +57 -0
- package/src/db/workflow-stats-read-ops.ts +177 -0
- package/src/db/workflow-step-tasks.ts +74 -0
- package/src/db/workflow-task-read-ops.ts +187 -0
- package/src/db/workspace-land-state.ts +65 -0
- package/src/db/workspace-merge-hold.ts +28 -0
- package/src/db/workspace-persistence.ts +77 -0
- package/src/db/workspace-rekey-write-ops.ts +11 -0
- package/src/db/workspace-rekey.ts +148 -0
- package/src/db/workspace-steward-cancel.ts +85 -0
- package/src/db/workspace-steward-fence.ts +30 -0
- package/src/db/workspace-write-ops.ts +26 -0
- package/src/db/workspace-writes-async.ts +46 -0
- package/src/db/workspace-writes.ts +196 -0
- package/src/db/workspaces.ts +617 -0
- package/src/db/write-ops.ts +602 -0
- package/src/db/writer-drain.ts +27 -0
- package/src/db/writer-fault-seam.ts +104 -0
- package/src/db/writer-gateway.ts +843 -0
- package/src/db/writer-ledger.ts +56 -0
- package/src/db.ts +4 -0
- package/src/deploy-executor.ts +139 -0
- package/src/dev.ts +541 -0
- package/src/dispatch-availability.ts +55 -0
- package/src/dispatch-match.ts +21 -0
- package/src/ephemeral/host-landing-slots-proof-worker.ts +45 -0
- package/src/ephemeral/index.ts +58 -0
- package/src/ephemeral/instance.ts +832 -0
- package/src/ephemeral/landing-ingress-proof-worker.ts +30 -0
- package/src/ephemeral/ports.ts +40 -0
- package/src/ephemeral/profile.ts +323 -0
- package/src/ephemeral/rehearsal-stamps.ts +149 -0
- package/src/ephemeral/rehearsal.ts +213 -0
- package/src/ephemeral/snapshot-kernel.ts +41 -0
- package/src/ephemeral/snapshot.ts +753 -0
- package/src/ephemeral/sweep.ts +40 -0
- package/src/event-loop-lag.ts +584 -0
- package/src/event-loop-yield.ts +27 -0
- package/src/events.ts +140 -0
- package/src/execution-mode.ts +63 -0
- package/src/fleet-convergence.ts +123 -0
- package/src/gate-resolver.ts +151 -0
- package/src/gate-run-capture.ts +71 -0
- package/src/git-sha.ts +58 -0
- package/src/guides.ts +73 -0
- package/src/host/capacity.ts +79 -0
- package/src/host/gate-capacity-alert.ts +90 -0
- package/src/host/identity.ts +128 -0
- package/src/host/presentation.ts +234 -0
- package/src/host/pressure-details.ts +89 -0
- package/src/host/pressure.ts +216 -0
- package/src/host/state.ts +132 -0
- package/src/host/utilization-buffer.ts +71 -0
- package/src/host-awareness.ts +57 -0
- package/src/host-identity.ts +39 -0
- package/src/host-provider-enablement.ts +75 -0
- package/src/host-provider-store.ts +102 -0
- package/src/host-tools.ts +39 -0
- package/src/http-body.ts +49 -0
- package/src/http-compression.ts +16 -0
- package/src/hub-metrics-report.ts +67 -0
- package/src/hub-metrics.ts +166 -0
- package/src/idle-digest-config.ts +40 -0
- package/src/idle-self-care.ts +58 -0
- package/src/index.ts +35 -0
- package/src/injection-sweep-pacing.ts +24 -0
- package/src/insights-async.ts +16 -0
- package/src/insights-db.ts +188 -0
- package/src/internal-spawn-model.ts +18 -0
- package/src/invite-link.ts +11 -0
- package/src/issue-tracker/adapter.ts +58 -0
- package/src/issue-tracker/github.ts +342 -0
- package/src/issue-tracker/index.ts +12 -0
- package/src/issue-tracker/registry.ts +26 -0
- package/src/journal-preamble.ts +350 -0
- package/src/kernel-correlation.ts +28 -0
- package/src/land-authorization.ts +73 -0
- package/src/land-block.ts +59 -0
- package/src/land-failure-event-key.ts +8 -0
- package/src/land-gate-failure-routing.ts +69 -0
- package/src/land-gate-notifications.ts +173 -0
- package/src/land-gate-queue-progress.ts +54 -0
- package/src/land-gates-source.ts +126 -0
- package/src/land-gates.ts +29 -0
- package/src/land-lifecycle-drives.ts +15 -0
- package/src/land-settle-dispatch.ts +134 -0
- package/src/land-stack-depth.ts +11 -0
- package/src/land-telemetry.ts +40 -0
- package/src/landing-base-ref.ts +3 -0
- package/src/landing-host-safety.ts +38 -0
- package/src/landing-lane-key.ts +74 -0
- package/src/launch-mode-support.ts +11 -0
- package/src/launch-mode.ts +58 -0
- package/src/legacy-landing.test-fixture.ts +56 -0
- package/src/lifecycle-context-pressure.ts +134 -0
- package/src/lifecycle-manager.ts +831 -0
- package/src/lifecycle-signal-registry.ts +87 -0
- package/src/live-runs-section.ts +38 -0
- package/src/loop-block-attribution.ts +442 -0
- package/src/loop-block-regression-alarm.ts +156 -0
- package/src/loop-task-stamps.ts +62 -0
- package/src/main-thread-clock.ts +95 -0
- package/src/maintenance/agent-identity-archive-job.ts +15 -0
- package/src/maintenance/artifact-checkout-gc-job.ts +14 -0
- package/src/maintenance/artifact-checkout-gc.ts +33 -0
- package/src/maintenance/artifact-sweep.ts +23 -0
- package/src/maintenance/breaker.ts +200 -0
- package/src/maintenance/cd-watcher.ts +176 -0
- package/src/maintenance/checkout-refresh.ts +83 -0
- package/src/maintenance/ci-monitor.ts +14 -0
- package/src/maintenance/claude-api-budget-job.ts +16 -0
- package/src/maintenance/constants.ts +134 -0
- package/src/maintenance/continuation-archive-search-job.ts +27 -0
- package/src/maintenance/critical-job-watchdog.ts +252 -0
- package/src/maintenance/db-planner-stats-job.ts +19 -0
- package/src/maintenance/db-wal-reclaim-job.ts +82 -0
- package/src/maintenance/events.ts +28 -0
- package/src/maintenance/gate-capacity-sample-job.ts +16 -0
- package/src/maintenance/index.ts +10 -0
- package/src/maintenance/jobs.ts +857 -0
- package/src/maintenance/long-running-work.ts +41 -0
- package/src/maintenance/orphaned-sessions.ts +126 -0
- package/src/maintenance/pauses.ts +174 -0
- package/src/maintenance/provider-secret-scrub-job.ts +16 -0
- package/src/maintenance/queued-message-expiration.ts +23 -0
- package/src/maintenance/red-main-controller-job.ts +22 -0
- package/src/maintenance/reply-obligation-parity-job.ts +27 -0
- package/src/maintenance/restart-epoch-hold-health.ts +62 -0
- package/src/maintenance/run-registry.ts +194 -0
- package/src/maintenance/scheduler.ts +778 -0
- package/src/maintenance/service-access-job.ts +31 -0
- package/src/maintenance/shipping-stats-rollup-job.ts +23 -0
- package/src/maintenance/snapshot-ledger-prune-job.ts +17 -0
- package/src/maintenance/stalled-delivery-pager.ts +125 -0
- package/src/maintenance/steward-handback.ts +11 -0
- package/src/maintenance/task-state-reconcile-job.ts +22 -0
- package/src/maintenance/teams.ts +426 -0
- package/src/maintenance/types.ts +124 -0
- package/src/maintenance/vault-backup-job.ts +34 -0
- package/src/maintenance/vault-expiry-job.ts +29 -0
- package/src/maintenance/web-tool-call-prune-job.ts +13 -0
- package/src/maintenance/workflow-backstop-job.ts +12 -0
- package/src/maintenance/workflow-journal-prune-job.ts +29 -0
- package/src/maintenance/workspaces.ts +784 -0
- package/src/maintenance.ts +1 -0
- package/src/managed-policy-escalation.ts +123 -0
- package/src/managed-policy.ts +236 -0
- package/src/managed-provider-gate.ts +27 -0
- package/src/managed-spawn-reservation.ts +23 -0
- package/src/markdown-frontmatter.ts +14 -0
- package/src/mcp/activity-output.ts +57 -0
- package/src/mcp/artifact-upload.ts +53 -0
- package/src/mcp/context-output.ts +73 -0
- package/src/mcp/dispatch-shape-schema.ts +13 -0
- package/src/mcp/guides.ts +33 -0
- package/src/mcp/http.ts +27 -0
- package/src/mcp/identity-projection.ts +121 -0
- package/src/mcp/identity.ts +235 -0
- package/src/mcp/index.ts +355 -0
- package/src/mcp/issue-selector-schema.ts +12 -0
- package/src/mcp/message-read.ts +87 -0
- package/src/mcp/output-descriptions.ts +72 -0
- package/src/mcp/output-levels.ts +71 -0
- package/src/mcp/output-projection.ts +88 -0
- package/src/mcp/plan-presentation.ts +166 -0
- package/src/mcp/presentation-values.ts +11 -0
- package/src/mcp/presentation.ts +653 -0
- package/src/mcp/project-entry-search-schema.ts +7 -0
- package/src/mcp/prompts.ts +36 -0
- package/src/mcp/runtime-output.ts +84 -0
- package/src/mcp/schema-budget.ts +28 -0
- package/src/mcp/self-care-visibility.ts +23 -0
- package/src/mcp/service-access.ts +18 -0
- package/src/mcp/spawn-targets-matrix.ts +68 -0
- package/src/mcp/spawn-targets.test-fixture.ts +21 -0
- package/src/mcp/task-validation-presentation.ts +19 -0
- package/src/mcp/tool-generation.ts +8 -0
- package/src/mcp/tool-groups.ts +136 -0
- package/src/mcp/tools-artifacts.ts +82 -0
- package/src/mcp/tools-messaging.ts +541 -0
- package/src/mcp/tools-permission.ts +88 -0
- package/src/mcp/tools-run.ts +73 -0
- package/src/mcp/tools-scheduler.ts +156 -0
- package/src/mcp/tools-spawn.ts +418 -0
- package/src/mcp/tools-web-tool-calls.ts +28 -0
- package/src/mcp/tools-workspace.ts +260 -0
- package/src/mcp/types.ts +68 -0
- package/src/mcp/validation.ts +66 -0
- package/src/mcp-agent-action.ts +96 -0
- package/src/mcp-agent-keep.ts +37 -0
- package/src/mcp-backlog-tools.ts +137 -0
- package/src/mcp-blackboard-tools.ts +131 -0
- package/src/mcp-channel-binding-tools.ts +27 -0
- package/src/mcp-claude-api-budget.ts +35 -0
- package/src/mcp-codex-reset.ts +43 -0
- package/src/mcp-decision-tools.ts +96 -0
- package/src/mcp-dispatch-tools.ts +142 -0
- package/src/mcp-egress-tools.ts +168 -0
- package/src/mcp-errors.ts +7 -0
- package/src/mcp-host-tools.ts +61 -0
- package/src/mcp-interrupt-agent.ts +47 -0
- package/src/mcp-issue-activity-tools.ts +114 -0
- package/src/mcp-issue-association-tools.ts +103 -0
- package/src/mcp-issue-lifecycle-tools.ts +49 -0
- package/src/mcp-issue-ref-tools.ts +214 -0
- package/src/mcp-maintenance-tools.ts +113 -0
- package/src/mcp-merge-tools.ts +66 -0
- package/src/mcp-notification-subscription-tools.ts +297 -0
- package/src/mcp-output-levels.test-fixture.ts +95 -0
- package/src/mcp-plan-tools.ts +347 -0
- package/src/mcp-profile-trust-tools.ts +47 -0
- package/src/mcp-project-journal-tools.ts +160 -0
- package/src/mcp-project-tools.ts +420 -0
- package/src/mcp-provider-catalog.ts +9 -0
- package/src/mcp-release-tools.ts +33 -0
- package/src/mcp-routing-policy-tools.ts +35 -0
- package/src/mcp-secrets-tools.ts +87 -0
- package/src/mcp-task-deliver-tools.ts +166 -0
- package/src/mcp-task-land-withdraw-tools.ts +49 -0
- package/src/mcp-task-memory-tools.ts +119 -0
- package/src/mcp-task-review-hold-tools.ts +57 -0
- package/src/mcp-task-tools.ts +342 -0
- package/src/mcp-task-validation-tools.ts +30 -0
- package/src/mcp-task-weave-tools.ts +63 -0
- package/src/mcp-team-template-tools.ts +141 -0
- package/src/mcp-team-tools.ts +197 -0
- package/src/mcp-tool-allowlist.ts +88 -0
- package/src/mcp-workflow-tools.ts +158 -0
- package/src/mcp.ts +1 -0
- package/src/memory-admission-rank.ts +55 -0
- package/src/memory-area-injection.ts +216 -0
- package/src/memory-boundary-capture.ts +206 -0
- package/src/memory-entry-safety.ts +28 -0
- package/src/memory-inject-filter.ts +190 -0
- package/src/memory-injection.ts +954 -0
- package/src/memory-preamble-admission.ts +158 -0
- package/src/memory-preamble-async.ts +13 -0
- package/src/memory-preamble.ts +1142 -0
- package/src/memory-retirement.ts +11 -0
- package/src/memory-seam.ts +273 -0
- package/src/memory-tokens.ts +91 -0
- package/src/merge-drain.ts +101 -0
- package/src/merge-pause-maintenance.ts +19 -0
- package/src/message-visibility.ts +50 -0
- package/src/messaging-policy.ts +94 -0
- package/src/native-memory.ts +59 -0
- package/src/notification-prefs.ts +25 -0
- package/src/notification-role-policy.ts +14 -0
- package/src/notification-router.ts +329 -0
- package/src/notification-rules.ts +390 -0
- package/src/notification-settings-store.ts +47 -0
- package/src/notification-settings.ts +166 -0
- package/src/notification-subscription-rules.ts +11 -0
- package/src/notification-types.ts +312 -0
- package/src/notify.ts +55 -0
- package/src/observed-reset-boundary.ts +23 -0
- package/src/observed-reset-refresh.ts +21 -0
- package/src/operator-alarm.ts +41 -0
- package/src/operator-decisions-section.ts +29 -0
- package/src/orchestrator-lookup.ts +29 -0
- package/src/orchestrator-self-report-authz.ts +34 -0
- package/src/package-pack.ts +249 -0
- package/src/post-bind-startup.ts +58 -0
- package/src/process-guard.ts +31 -0
- package/src/profile-cells.ts +305 -0
- package/src/profile-effective-survey.ts +121 -0
- package/src/profile-host-sources.ts +73 -0
- package/src/profile-instruction-blocks.ts +11 -0
- package/src/profile-project-validation.ts +23 -0
- package/src/profile-provider-options.ts +59 -0
- package/src/profile-role-templates.ts +26 -0
- package/src/profile-workflow-policy.ts +14 -0
- package/src/project-claudemd-sweep.ts +176 -0
- package/src/project-file-source.ts +54 -0
- package/src/project-ingest.ts +195 -0
- package/src/project-instructions.ts +700 -0
- package/src/project-mcp.ts +18 -0
- package/src/project-role-assets.ts +109 -0
- package/src/project-roles-validate.ts +53 -0
- package/src/project-roles.ts +364 -0
- package/src/project-settings.ts +5 -0
- package/src/project-skills.ts +5 -0
- package/src/project-toolchain.ts +58 -0
- package/src/project-trust-fingerprint.ts +174 -0
- package/src/project-trust.ts +262 -0
- package/src/project-workflows.ts +185 -0
- package/src/prompt-resolver.ts +697 -0
- package/src/prompt-template-fallback.ts +15 -0
- package/src/prompt-version-errors.ts +13 -0
- package/src/provider-catalog-store.ts +393 -0
- package/src/provider-config-store.ts +308 -0
- package/src/provider-enablement.ts +36 -0
- package/src/provider-home-gc.ts +58 -0
- package/src/provider-model-seed.ts +18 -0
- package/src/provider-quota-async.ts +152 -0
- package/src/provider-quota-config-store.ts +60 -0
- package/src/provider-secrets.test-fixture.ts +34 -0
- package/src/provider-state.ts +93 -0
- package/src/provider-timeline-event.ts +76 -0
- package/src/quota-advisory.ts +359 -0
- package/src/quota-band-delivery.ts +13 -0
- package/src/quota-band-projection.ts +149 -0
- package/src/quota-band-transition.ts +316 -0
- package/src/quota-pacing.ts +46 -0
- package/src/quota-threshold-config.ts +46 -0
- package/src/quota.ts +61 -0
- package/src/ratchet-files.ts +202 -0
- package/src/recipe-async.ts +50 -0
- package/src/recipe-db.ts +260 -0
- package/src/recipe-loader.ts +132 -0
- package/src/recipe-runner.ts +259 -0
- package/src/recipe-validator.ts +107 -0
- package/src/relay-event-drain.ts +39 -0
- package/src/relay-host-locality.ts +20 -0
- package/src/relay-run-lease.ts +17 -0
- package/src/repo-config-source.ts +209 -0
- package/src/report-verbosity.ts +5 -0
- package/src/restart-epoch-deploy-hold.ts +221 -0
- package/src/retention-config-store.ts +32 -0
- package/src/retention-config.ts +70 -0
- package/src/reviewer-pipeline.ts +238 -0
- package/src/routes/_route.ts +70 -0
- package/src/routes/_shared.ts +513 -0
- package/src/routes/activity.ts +70 -0
- package/src/routes/agent-effort.ts +69 -0
- package/src/routes/agent-keep.ts +27 -0
- package/src/routes/agent-profiles.ts +169 -0
- package/src/routes/agent-reporting.ts +19 -0
- package/src/routes/agent-self-effort.ts +51 -0
- package/src/routes/agent-sessions.ts +650 -0
- package/src/routes/agent-sharing.ts +23 -0
- package/src/routes/agents-spawn.ts +258 -0
- package/src/routes/agents.ts +452 -0
- package/src/routes/artifacts.ts +340 -0
- package/src/routes/auth.ts +123 -0
- package/src/routes/authority-audit.ts +14 -0
- package/src/routes/automations.ts +83 -0
- package/src/routes/backlog.ts +112 -0
- package/src/routes/blackboard.ts +54 -0
- package/src/routes/browser.ts +73 -0
- package/src/routes/channel-binding-delete.ts +21 -0
- package/src/routes/channel-output.ts +17 -0
- package/src/routes/claude-api-budget.ts +65 -0
- package/src/routes/commands-listing.ts +50 -0
- package/src/routes/commands.ts +586 -0
- package/src/routes/config.ts +75 -0
- package/src/routes/connectors.ts +108 -0
- package/src/routes/context-resets.ts +35 -0
- package/src/routes/continuation-archives.ts +37 -0
- package/src/routes/coordinator-teams.ts +14 -0
- package/src/routes/decisions.ts +82 -0
- package/src/routes/deploys.ts +15 -0
- package/src/routes/fleet-convergence.ts +5 -0
- package/src/routes/guides.ts +13 -0
- package/src/routes/host-providers.ts +73 -0
- package/src/routes/host-resource-control.ts +48 -0
- package/src/routes/host-secret-files.ts +38 -0
- package/src/routes/hosts.ts +240 -0
- package/src/routes/inbox.ts +151 -0
- package/src/routes/index.ts +614 -0
- package/src/routes/insights.ts +86 -0
- package/src/routes/integrations.ts +636 -0
- package/src/routes/issue-activity.ts +78 -0
- package/src/routes/issue-associations.ts +76 -0
- package/src/routes/issue-lifecycle.ts +34 -0
- package/src/routes/issue-refs.ts +163 -0
- package/src/routes/kernel-timers-operator.ts +57 -0
- package/src/routes/memory.ts +25 -0
- package/src/routes/merges.ts +109 -0
- package/src/routes/message-viewer.ts +4 -0
- package/src/routes/messages.ts +621 -0
- package/src/routes/notifications.ts +36 -0
- package/src/routes/orchestrator-bootstrap.ts +101 -0
- package/src/routes/orchestrator-host-registration.ts +125 -0
- package/src/routes/orchestrator-host-utilization.ts +255 -0
- package/src/routes/orchestrator-proxy.ts +174 -0
- package/src/routes/orchestrator.ts +699 -0
- package/src/routes/pairs.ts +214 -0
- package/src/routes/plans.ts +98 -0
- package/src/routes/project-onboarding.ts +56 -0
- package/src/routes/project-trust.ts +73 -0
- package/src/routes/projects.ts +296 -0
- package/src/routes/prompt-templates.ts +106 -0
- package/src/routes/provider-config.ts +233 -0
- package/src/routes/provider-quota-config.ts +48 -0
- package/src/routes/provider-quotas.ts +312 -0
- package/src/routes/provisioning-registry.ts +192 -0
- package/src/routes/recipes.ts +129 -0
- package/src/routes/restart-epochs.ts +98 -0
- package/src/routes/routing-policy.ts +30 -0
- package/src/routes/run-command.ts +25 -0
- package/src/routes/secrets-backup.ts +53 -0
- package/src/routes/secrets-import.ts +32 -0
- package/src/routes/secrets-page.ts +98 -0
- package/src/routes/secrets-vault.ts +121 -0
- package/src/routes/secrets.ts +165 -0
- package/src/routes/service-access.ts +57 -0
- package/src/routes/settings.ts +191 -0
- package/src/routes/shipping.ts +56 -0
- package/src/routes/spawn-policy.ts +299 -0
- package/src/routes/spec.ts +58 -0
- package/src/routes/sse.ts +18 -0
- package/src/routes/stats.ts +159 -0
- package/src/routes/steward.ts +49 -0
- package/src/routes/task-graph.ts +30 -0
- package/src/routes/task-http.ts +27 -0
- package/src/routes/task-issues.ts +81 -0
- package/src/routes/task-reads.ts +139 -0
- package/src/routes/task-validation.ts +22 -0
- package/src/routes/tasks.ts +553 -0
- package/src/routes/team-templates.ts +65 -0
- package/src/routes/teams-config.ts +15 -0
- package/src/routes/teams.ts +141 -0
- package/src/routes/token-usage.ts +167 -0
- package/src/routes/tokens.ts +393 -0
- package/src/routes/users.ts +248 -0
- package/src/routes/viewer-read.ts +27 -0
- package/src/routes/web-tool-calls.ts +38 -0
- package/src/routes/workflows.ts +142 -0
- package/src/routes/workspaces.ts +642 -0
- package/src/routes.ts +3 -0
- package/src/routing-eligibility.ts +42 -0
- package/src/routing-model-aliases.ts +21 -0
- package/src/routing-policy-normalize.ts +412 -0
- package/src/routing-policy-push.ts +154 -0
- package/src/routing-policy-service.ts +19 -0
- package/src/routing-policy-store.ts +16 -0
- package/src/routing-preferences.ts +82 -0
- package/src/routing-step-defaults.ts +31 -0
- package/src/runtime-grant.ts +164 -0
- package/src/runtime-prefix.ts +8 -0
- package/src/runtime-tokens.ts +404 -0
- package/src/search-query.ts +10 -0
- package/src/secret-keys.ts +24 -0
- package/src/secrets-broker/config.ts +53 -0
- package/src/secrets-broker/error.ts +8 -0
- package/src/secrets-broker/infisical.ts +259 -0
- package/src/secrets-broker/reader-infisical.ts +41 -0
- package/src/secrets-broker/reader.ts +101 -0
- package/src/secrets-broker/service.ts +242 -0
- package/src/secrets-broker/tool-credentials.ts +9 -0
- package/src/secrets-vault/backend-conformance.ts +26 -0
- package/src/secrets-vault/backend.ts +102 -0
- package/src/secrets-vault/backup.ts +103 -0
- package/src/secrets-vault/config.ts +7 -0
- package/src/secrets-vault/expiry.ts +10 -0
- package/src/secrets-vault/identity.ts +27 -0
- package/src/secrets-vault/import.ts +90 -0
- package/src/secrets-vault/key-files.ts +91 -0
- package/src/secrets-vault/keys.ts +79 -0
- package/src/secrets-vault/metadata.ts +51 -0
- package/src/secrets-vault/provider-env.ts +25 -0
- package/src/secrets-vault/resolve.ts +101 -0
- package/src/secrets-vault/restore.ts +57 -0
- package/src/secrets-vault/scope.ts +25 -0
- package/src/secrets-vault/service.ts +192 -0
- package/src/secrets-vault/shared.ts +10 -0
- package/src/security.ts +772 -0
- package/src/self-effort-rule.ts +36 -0
- package/src/self-resume-carry.ts +131 -0
- package/src/self-resume-command.ts +24 -0
- package/src/self-resume-config.ts +54 -0
- package/src/self-resume-identity.ts +40 -0
- package/src/self-resume-supersede.ts +19 -0
- package/src/self-resume.ts +884 -0
- package/src/server-background.ts +24 -0
- package/src/server.ts +726 -0
- package/src/service-access/config.ts +3 -0
- package/src/service-access/health.ts +151 -0
- package/src/service-access/host-health.ts +62 -0
- package/src/service-access/host.ts +63 -0
- package/src/service-access/operations.ts +21 -0
- package/src/service-access/policy.ts +30 -0
- package/src/service-access/probe.ts +62 -0
- package/src/service-access/request-logs.ts +93 -0
- package/src/service-access/scope.ts +7 -0
- package/src/service-access/service.ts +185 -0
- package/src/service-access/tokens.ts +174 -0
- package/src/service-access/validation.ts +75 -0
- package/src/service-access/vault.ts +59 -0
- package/src/services/agent-action.ts +238 -0
- package/src/services/agent-control-host.ts +74 -0
- package/src/services/agent-effort.ts +60 -0
- package/src/services/agent-hang-watchdog-job.ts +513 -0
- package/src/services/agent-hang-watchdog-wiring.ts +487 -0
- package/src/services/agent-hang-watchdog.ts +395 -0
- package/src/services/agent-keep.ts +72 -0
- package/src/services/agent-message-fanout.ts +91 -0
- package/src/services/agent-outstanding-work.ts +66 -0
- package/src/services/agent-reporting.ts +27 -0
- package/src/services/artifact-access.ts +39 -0
- package/src/services/artifact-multipart.ts +70 -0
- package/src/services/artifact-path-host.ts +55 -0
- package/src/services/artifact-read.ts +88 -0
- package/src/services/artifact-write.ts +25 -0
- package/src/services/auth-context.ts +117 -0
- package/src/services/automatic-disposal.ts +33 -0
- package/src/services/backlog.ts +149 -0
- package/src/services/browser-inventory.ts +52 -0
- package/src/services/browser-session-state.ts +41 -0
- package/src/services/browser-session.ts +167 -0
- package/src/services/bus-command-update.ts +84 -0
- package/src/services/bus-expiration-death.ts +57 -0
- package/src/services/canonical-root.ts +284 -0
- package/src/services/captured-delivery-gate.ts +12 -0
- package/src/services/carry-pending.ts +5 -0
- package/src/services/channel-binding-delete.ts +20 -0
- package/src/services/channel-suppression-receipt.ts +28 -0
- package/src/services/checkout-refresh-state.ts +18 -0
- package/src/services/checkout-refresh.test-fixture.ts +12 -0
- package/src/services/child-work-evidence.ts +77 -0
- package/src/services/claude-app.ts +91 -0
- package/src/services/command-claim-rejection.ts +23 -0
- package/src/services/command-host.ts +42 -0
- package/src/services/coordinator-digest.ts +30 -0
- package/src/services/decision-audience.ts +26 -0
- package/src/services/delivery-gate-policy.ts +98 -0
- package/src/services/delivery-tip.test-fixture.ts +25 -0
- package/src/services/diff-gate.ts +110 -0
- package/src/services/dispatch-command.ts +388 -0
- package/src/services/effective-launch-driver.ts +240 -0
- package/src/services/effective-launch-harness.ts +257 -0
- package/src/services/errors.ts +31 -0
- package/src/services/git-process.ts +176 -0
- package/src/services/git-remote.ts +100 -0
- package/src/services/harness-subagents.ts +12 -0
- package/src/services/host-changed-paths.test-fixture.ts +134 -0
- package/src/services/host-landing-placement.ts +65 -0
- package/src/services/host-project-readiness.ts +49 -0
- package/src/services/host-providers.ts +114 -0
- package/src/services/host-utilization.ts +70 -0
- package/src/services/idle-agent-digest.ts +318 -0
- package/src/services/idle-epics.ts +105 -0
- package/src/services/idle-self-care.ts +47 -0
- package/src/services/interrupt-agent.ts +146 -0
- package/src/services/isolated-workspace-placement.ts +258 -0
- package/src/services/issue-activity.ts +23 -0
- package/src/services/issue-associations.ts +72 -0
- package/src/services/issue-completion-drain.ts +24 -0
- package/src/services/issue-completion.ts +24 -0
- package/src/services/issue-lifecycle-comments.ts +12 -0
- package/src/services/issue-lifecycle.ts +620 -0
- package/src/services/issue-refs.ts +65 -0
- package/src/services/kernel-command-bridge.ts +219 -0
- package/src/services/kernel-control-host.ts +78 -0
- package/src/services/kernel-control-http.ts +119 -0
- package/src/services/kernel-control-mcp.ts +193 -0
- package/src/services/kernel-landing-command.ts +28 -0
- package/src/services/kernel-landing-ingress.ts +65 -0
- package/src/services/kernel-timers-authoritative-ingress.ts +48 -0
- package/src/services/kernel-timers-authz.ts +229 -0
- package/src/services/kernel-timers-command.ts +182 -0
- package/src/services/kernel-timers-cutover-chaos-worker.ts +211 -0
- package/src/services/kernel-timers-cutover.ts +39 -0
- package/src/services/kernel-timers-ingress-apply.ts +39 -0
- package/src/services/kernel-timers-ingress-chaos-worker.ts +312 -0
- package/src/services/kernel-timers-ingress.ts +702 -0
- package/src/services/kernel-timers-message-authority-chaos-worker.ts +97 -0
- package/src/services/kernel-timers-migrate.ts +158 -0
- package/src/services/kernel-timers-operator-chaos-worker.ts +259 -0
- package/src/services/kernel-timers-operator-preflight.ts +18 -0
- package/src/services/kernel-timers-operator.ts +424 -0
- package/src/services/kernel-timers-outbox.ts +138 -0
- package/src/services/kernel-timers-request-key-migration-chaos-worker.ts +80 -0
- package/src/services/kernel-timers-stage10-operator.ts +210 -0
- package/src/services/kernel-timers-stage10.ts +85 -0
- package/src/services/kernel-timers-stage9.ts +57 -0
- package/src/services/kernel-timers-transfer-chaos-worker.ts +118 -0
- package/src/services/kernel-timers-transfer.ts +525 -0
- package/src/services/kernel-timers-verifier.ts +39 -0
- package/src/services/kernel-timers.ts +247 -0
- package/src/services/land-boundary-settle.ts +32 -0
- package/src/services/land-gate-placement.ts +60 -0
- package/src/services/land-issue-relations.ts +46 -0
- package/src/services/land-restart-retry.ts +77 -0
- package/src/services/landed-ancestry.ts +417 -0
- package/src/services/landed-task-attribution.ts +14 -0
- package/src/services/landing-terminal-report.ts +119 -0
- package/src/services/legacy-landing-backfill.ts +159 -0
- package/src/services/legacy-landing-host.ts +291 -0
- package/src/services/legacy-landing-publication.ts +35 -0
- package/src/services/legacy-landing-recovery.ts +111 -0
- package/src/services/macos-privacy.ts +34 -0
- package/src/services/managed-running.ts +189 -0
- package/src/services/memory-areas.ts +172 -0
- package/src/services/memory-identity.ts +162 -0
- package/src/services/merge-pause.ts +37 -0
- package/src/services/message-delivery-actions.ts +11 -0
- package/src/services/operator-decisions.ts +260 -0
- package/src/services/orchestrator-landing-recovery.ts +55 -0
- package/src/services/orchestrator-registration-recovery.ts +12 -0
- package/src/services/orchestrator-upgrade.ts +83 -0
- package/src/services/parity-harness.ts +141 -0
- package/src/services/permission-decision.ts +129 -0
- package/src/services/plan-ci-recovery.ts +76 -0
- package/src/services/plan-conformance.ts +105 -0
- package/src/services/plan-dispatch-policy.ts +79 -0
- package/src/services/plan-dispatch.ts +372 -0
- package/src/services/plan-external-view.ts +7 -0
- package/src/services/plan-frontier.ts +34 -0
- package/src/services/plan-graph.ts +703 -0
- package/src/services/plan-import.ts +66 -0
- package/src/services/plan-live-bindings.ts +139 -0
- package/src/services/plan-task-create.ts +80 -0
- package/src/services/plan-terminal-refs.ts +83 -0
- package/src/services/plan-wake-digest.ts +88 -0
- package/src/services/plan-wake-policy.ts +12 -0
- package/src/services/profile-trust.ts +54 -0
- package/src/services/project-checkout-binding.ts +65 -0
- package/src/services/project-checkout-enrollment.ts +27 -0
- package/src/services/project-cwd.ts +41 -0
- package/src/services/project-onboarding.ts +165 -0
- package/src/services/project-repo-create.ts +27 -0
- package/src/services/project-role.test-fixture.ts +74 -0
- package/src/services/project.ts +191 -0
- package/src/services/prompt-templates.ts +46 -0
- package/src/services/prompt-version-writer.ts +42 -0
- package/src/services/provider-catalog.ts +7 -0
- package/src/services/provider-hold-flap.ts +130 -0
- package/src/services/provider-hold-nudge.ts +191 -0
- package/src/services/provider-hold-record.ts +137 -0
- package/src/services/provider-state-audit.ts +214 -0
- package/src/services/provisioning-harness/analyze.ts +285 -0
- package/src/services/provisioning-harness/budget-baseline.json +391 -0
- package/src/services/provisioning-harness/capture.ts +197 -0
- package/src/services/provisioning-harness/config.ts +55 -0
- package/src/services/provisioning-harness/context-sources.ts +85 -0
- package/src/services/provisioning-harness/driver.ts +156 -0
- package/src/services/provisioning-harness/expect.ts +81 -0
- package/src/services/provisioning-harness/fixture-matrix.ts +38 -0
- package/src/services/provisioning-harness/fixtures/project/.agent-relay/land-gates.json +1 -0
- package/src/services/provisioning-harness/fixtures/project/.claude/skills/harness-skill/SKILL.md +6 -0
- package/src/services/provisioning-harness/fixtures/project/.mcp.json +1 -0
- package/src/services/provisioning-harness/fixtures/project/AGENTS.md +1 -0
- package/src/services/provisioning-harness/fixtures/project/CLAUDE.md +1 -0
- package/src/services/provisioning-harness/fixtures/project/mcp-server.ts +33 -0
- package/src/services/provisioning-harness/fixtures/provider-home/AGENTS.md +1 -0
- package/src/services/provisioning-harness/fixtures/provider-home/CLAUDE.md +1 -0
- package/src/services/provisioning-harness/host-fixtures.ts +25 -0
- package/src/services/provisioning-harness/index.ts +4 -0
- package/src/services/provisioning-harness/inventory-types.ts +8 -0
- package/src/services/provisioning-harness/inventory.ts +33 -0
- package/src/services/provisioning-harness/lifecycle.ts +193 -0
- package/src/services/provisioning-harness/live.ts +61 -0
- package/src/services/provisioning-harness/manifests.ts +118 -0
- package/src/services/provisioning-harness/prepare.ts +113 -0
- package/src/services/provisioning-harness/redundancy-report.ts +32 -0
- package/src/services/provisioning-harness/redundancy.ts +137 -0
- package/src/services/provisioning-harness/report.ts +129 -0
- package/src/services/provisioning-harness/types.ts +174 -0
- package/src/services/provisioning-registry.ts +15 -0
- package/src/services/rate-limit-resume.ts +220 -0
- package/src/services/reap-verdict.ts +52 -0
- package/src/services/red-main-auto-revert.ts +103 -0
- package/src/services/red-main-controller-deps.ts +80 -0
- package/src/services/red-main-controller.ts +262 -0
- package/src/services/red-main-incident.ts +44 -0
- package/src/services/red-main-quarantine.ts +92 -0
- package/src/services/register-agent.ts +447 -0
- package/src/services/release-readiness.ts +219 -0
- package/src/services/reported-exit-death.ts +29 -0
- package/src/services/response-report-admission.ts +17 -0
- package/src/services/restart-epoch-driver.ts +290 -0
- package/src/services/restart-epoch-reconciler.ts +326 -0
- package/src/services/restart-epoch-stale-command-recovery.ts +133 -0
- package/src/services/restart-instructions.ts +86 -0
- package/src/services/restart-project-role.ts +74 -0
- package/src/services/restart-secret-refs.ts +14 -0
- package/src/services/restart-spawn.ts +510 -0
- package/src/services/review-publish.ts +76 -0
- package/src/services/review-ref-reconcile.ts +337 -0
- package/src/services/run-command-input.ts +22 -0
- package/src/services/run-command.ts +510 -0
- package/src/services/run-completion-message.ts +70 -0
- package/src/services/run-log.ts +212 -0
- package/src/services/run-queue.ts +63 -0
- package/src/services/scheduler-command-cancel.ts +49 -0
- package/src/services/scheduler-command.ts +590 -0
- package/src/services/scheduler-create.ts +25 -0
- package/src/services/scheduler-plan.ts +202 -0
- package/src/services/scheduler-recovery.ts +31 -0
- package/src/services/scheduler.ts +406 -0
- package/src/services/self-care-state.ts +10 -0
- package/src/services/self-effort-grant.ts +93 -0
- package/src/services/self-effort.ts +152 -0
- package/src/services/send-message.ts +548 -0
- package/src/services/server-credentials.ts +53 -0
- package/src/services/shipping-board.ts +111 -0
- package/src/services/shipping-project-config.ts +86 -0
- package/src/services/shipping-stats.ts +86 -0
- package/src/services/shutdown-agent.ts +463 -0
- package/src/services/shutdown-watchdog.ts +119 -0
- package/src/services/spawn-agent.ts +967 -0
- package/src/services/spawn-approval.ts +26 -0
- package/src/services/spawn-brief.ts +39 -0
- package/src/services/spawn-chain-inspector.ts +286 -0
- package/src/services/spawn-cwd-placement.ts +250 -0
- package/src/services/spawn-identity.ts +127 -0
- package/src/services/spawn-instruction-inputs.ts +114 -0
- package/src/services/spawn-issue-activity.ts +102 -0
- package/src/services/spawn-launch-decision.ts +32 -0
- package/src/services/spawn-launch.ts +116 -0
- package/src/services/spawn-loss-escalation.ts +253 -0
- package/src/services/spawn-placement.test-fixture.ts +30 -0
- package/src/services/spawn-project-role.ts +133 -0
- package/src/services/spawn-registration-watchdog.ts +352 -0
- package/src/services/spawn-replay.ts +61 -0
- package/src/services/spawn-repo-probe.ts +118 -0
- package/src/services/spawn-tree-cleanup.ts +37 -0
- package/src/services/spawn-warnings.ts +13 -0
- package/src/services/steward-reaper.ts +244 -0
- package/src/services/task-context-hydration.ts +413 -0
- package/src/services/task-delivery-close.ts +26 -0
- package/src/services/task-delivery-event.ts +11 -0
- package/src/services/task-delivery-land-policy.ts +35 -0
- package/src/services/task-delivery-summary.ts +38 -0
- package/src/services/task-delivery.ts +762 -0
- package/src/services/task-dependency-graph.ts +116 -0
- package/src/services/task-dispatch.ts +178 -0
- package/src/services/task-done-when.ts +45 -0
- package/src/services/task-entity.ts +758 -0
- package/src/services/task-from-issue.ts +80 -0
- package/src/services/task-issue-digest.ts +45 -0
- package/src/services/task-issue-link.ts +158 -0
- package/src/services/task-issue-weave.ts +570 -0
- package/src/services/task-land-withdraw.ts +462 -0
- package/src/services/task-lifecycle.ts +668 -0
- package/src/services/task-nothing-to-land.ts +37 -0
- package/src/services/task-plan-view.ts +172 -0
- package/src/services/task-review-hold.ts +244 -0
- package/src/services/task-semantic-events.ts +396 -0
- package/src/services/task-stage-wake.ts +15 -0
- package/src/services/task-state-reconcile.ts +169 -0
- package/src/services/task-validation.ts +42 -0
- package/src/services/team-claim-race.worker.ts +72 -0
- package/src/services/team-spawn-delegation.ts +30 -0
- package/src/services/team-templates.ts +172 -0
- package/src/services/team.ts +320 -0
- package/src/services/terminal-provider-exit.ts +57 -0
- package/src/services/timer-message-fire-chaos-worker.ts +29 -0
- package/src/services/timer-message-fire-outbox.ts +184 -0
- package/src/services/transient-agent-reaper.ts +412 -0
- package/src/services/turn-reconcile-audit.ts +236 -0
- package/src/services/user-onboarding.ts +98 -0
- package/src/services/user-profile.ts +57 -0
- package/src/services/web-search.ts +83 -0
- package/src/services/web-tool-calls.ts +65 -0
- package/src/services/withdraw-steward.ts +57 -0
- package/src/services/work-finality.ts +34 -0
- package/src/services/workflow-agent-obligation.ts +35 -0
- package/src/services/workflow-auto-start.ts +126 -0
- package/src/services/workflow-backstop.ts +38 -0
- package/src/services/workflow-budget.test-fixture.ts +10 -0
- package/src/services/workflow-caller.ts +32 -0
- package/src/services/workflow-catalog.ts +43 -0
- package/src/services/workflow-child-proof-worker.ts +76 -0
- package/src/services/workflow-child.test-fixture.ts +51 -0
- package/src/services/workflow-ci-main.ts +93 -0
- package/src/services/workflow-control-proof-worker.ts +149 -0
- package/src/services/workflow-coordinator-decision-proof-worker.ts +123 -0
- package/src/services/workflow-coordinator.ts +8 -0
- package/src/services/workflow-decision-answer.ts +18 -0
- package/src/services/workflow-decision-proof-worker.ts +92 -0
- package/src/services/workflow-decision.test-fixture.ts +58 -0
- package/src/services/workflow-decisions.ts +107 -0
- package/src/services/workflow-deferred-cleanup.ts +40 -0
- package/src/services/workflow-dispatch-result.ts +20 -0
- package/src/services/workflow-effect-driver.ts +165 -0
- package/src/services/workflow-effects.ts +544 -0
- package/src/services/workflow-foreach-proof-worker.ts +209 -0
- package/src/services/workflow-land-notice.ts +18 -0
- package/src/services/workflow-land.ts +105 -0
- package/src/services/workflow-notice.ts +32 -0
- package/src/services/workflow-overdue-notice.ts +19 -0
- package/src/services/workflow-pins.ts +162 -0
- package/src/services/workflow-reconcile.ts +210 -0
- package/src/services/workflow-resume-pins.ts +30 -0
- package/src/services/workflow-run-chaos-worker.ts +67 -0
- package/src/services/workflow-run-view.ts +71 -0
- package/src/services/workflow-run.test-fixture.ts +165 -0
- package/src/services/workflow-runs.ts +370 -0
- package/src/services/workflow-scripts.ts +100 -0
- package/src/services/workflow-slice-proof.ts +14 -0
- package/src/services/workflow-stats.ts +208 -0
- package/src/services/workflow-supervisor-state.ts +117 -0
- package/src/services/workflow-supervisor.ts +122 -0
- package/src/services/workflow-verification.ts +68 -0
- package/src/services/workspace-recovery.ts +168 -0
- package/src/services/workspace-task-binding.ts +22 -0
- package/src/settings/modules.ts +149 -0
- package/src/settings/registry.ts +629 -0
- package/src/settings/user-settings.ts +81 -0
- package/src/setup.ts +199 -0
- package/src/shared-mcp.ts +87 -0
- package/src/shutdown.ts +33 -0
- package/src/spawn-admission.ts +48 -0
- package/src/spawn-budget.ts +18 -0
- package/src/spawn-command.ts +373 -0
- package/src/spawn-env.ts +27 -0
- package/src/spawn-intent.ts +17 -0
- package/src/spawn-lease.ts +41 -0
- package/src/spawn-models.ts +22 -0
- package/src/spawn-placement.ts +348 -0
- package/src/spawn-profile-errors.ts +9 -0
- package/src/spawn-quota.ts +15 -0
- package/src/spawn-targets.ts +679 -0
- package/src/sse-agent-status.ts +35 -0
- package/src/sse-outbox-cursor.ts +28 -0
- package/src/sse-visibility.ts +36 -0
- package/src/sse.ts +684 -0
- package/src/startup-context-injection.ts +518 -0
- package/src/startup-timing.ts +30 -0
- package/src/state-adoption/artifacts.ts +27 -0
- package/src/state-adoption/cd-cutover.ts +125 -0
- package/src/state-adoption/files.ts +31 -0
- package/src/state-adoption/index.ts +166 -0
- package/src/state-adoption/linux-plan.ts +67 -0
- package/src/state-adoption/linux.ts +104 -0
- package/src/state-adoption/macos-plan.ts +58 -0
- package/src/state-adoption/macos.ts +112 -0
- package/src/steward-claim-release.ts +38 -0
- package/src/steward-handoff.ts +28 -0
- package/src/steward-identity.ts +54 -0
- package/src/steward-policy-cleanup.ts +222 -0
- package/src/steward-policy-model-reconcile.ts +33 -0
- package/src/steward-policy-name.ts +13 -0
- package/src/steward-provenance.ts +59 -0
- package/src/steward-queue.ts +85 -0
- package/src/steward-slot-recovery.ts +34 -0
- package/src/steward-spawn-guard.ts +344 -0
- package/src/steward.test-fixture.ts +11 -0
- package/src/steward.ts +199 -0
- package/src/stream-proxy.ts +84 -0
- package/src/task-authz.ts +40 -0
- package/src/task-completion.ts +39 -0
- package/src/task-dispatch-live.ts +70 -0
- package/src/task-dispatcher-ranking.ts +136 -0
- package/src/task-dispatcher.ts +841 -0
- package/src/task-owner-notices.ts +35 -0
- package/src/task-owner.ts +63 -0
- package/src/task-plan-status.ts +21 -0
- package/src/task-verification.ts +35 -0
- package/src/team-idle-tracker.ts +39 -0
- package/src/team-template-config.ts +100 -0
- package/src/teams-config-store.ts +22 -0
- package/src/terminal-authz.ts +49 -0
- package/src/token-db-write.ts +44 -0
- package/src/token-db.ts +487 -0
- package/src/token-usage-async.ts +40 -0
- package/src/transport-subscriptions.ts +57 -0
- package/src/types.ts +1 -0
- package/src/upgrade-install-verify.ts +179 -0
- package/src/upgrade-local-id.ts +3 -0
- package/src/upgrade-services.ts +125 -0
- package/src/upgrade.ts +1006 -0
- package/src/user-awaiting-reply.ts +42 -0
- package/src/user-path.ts +246 -0
- package/src/user-settings-async.ts +33 -0
- package/src/user-settings-store.ts +106 -0
- package/src/user-style.ts +83 -0
- package/src/utils.ts +42 -0
- package/src/validation.ts +324 -0
- package/src/vault-backup-config.ts +28 -0
- package/src/vault-expiry-config.ts +12 -0
- package/src/versioned-prompts.ts +57 -0
- package/src/workflow-capabilities.ts +10 -0
- package/src/workflow-prompt-templates.ts +20 -0
- package/src/workspace-action-audit.ts +42 -0
- package/src/workspace-actions.ts +689 -0
- package/src/workspace-auto-merge.ts +1055 -0
- package/src/workspace-changed-paths-client.ts +97 -0
- package/src/workspace-claim.ts +45 -0
- package/src/workspace-cleanup-settle.ts +51 -0
- package/src/workspace-cleanup-stale.ts +231 -0
- package/src/workspace-command-settle.ts +589 -0
- package/src/workspace-config.ts +7 -0
- package/src/workspace-conflict-resolver.ts +182 -0
- package/src/workspace-dead-owner-recovery.ts +19 -0
- package/src/workspace-delivery-tip.ts +51 -0
- package/src/workspace-escalation.ts +107 -0
- package/src/workspace-git-state-client.ts +42 -0
- package/src/workspace-host-client.ts +86 -0
- package/src/workspace-host-target.ts +5 -0
- package/src/workspace-host.ts +61 -0
- package/src/workspace-human-escalation.ts +70 -0
- package/src/workspace-land-gate-watchdog.ts +76 -0
- package/src/workspace-land-gate.ts +99 -0
- package/src/workspace-land-result.ts +12 -0
- package/src/workspace-land-retry.ts +82 -0
- package/src/workspace-land-stopped.ts +57 -0
- package/src/workspace-merge-dispatch.ts +27 -0
- package/src/workspace-merge-progress.ts +369 -0
- package/src/workspace-merge-retry-policy.ts +59 -0
- package/src/workspace-merge.ts +614 -0
- package/src/workspace-nothing-to-land-notice.ts +27 -0
- package/src/workspace-orphans.ts +927 -0
- package/src/workspace-phase.ts +507 -0
- package/src/workspace-pr-completion.ts +285 -0
- package/src/workspace-probe.ts +212 -0
- package/src/workspace-recorded-land.ts +47 -0
- package/src/workspace-recovery-authz.ts +88 -0
- package/src/workspace-rekey.ts +106 -0
- package/src/workspace-steward-authority.ts +16 -0
- package/src/workspace-steward-failure.ts +42 -0
- package/src/workspace-steward-wake.ts +150 -0
- package/src/workspace-steward-watchdog.ts +240 -0
|
@@ -0,0 +1,1296 @@
|
|
|
1
|
+
import { relayEnv } from "@humwick/sdk/env";
|
|
2
|
+
/**
|
|
3
|
+
* Pure decision helpers for the local-host upgrade step of `bun run release`.
|
|
4
|
+
*
|
|
5
|
+
* Extracted from release.ts so the flag-selection / failure-classification logic
|
|
6
|
+
* is unit-testable (#309). The release script runs from the *new* source but
|
|
7
|
+
* invokes the *installed* `humwick` CLI — i.e. the version being replaced.
|
|
8
|
+
* That CLI may predate `--restart-deferred` (added in v0.30.0), so we must decide
|
|
9
|
+
* up front whether to even try it, and — when an upgrade attempt fails — classify
|
|
10
|
+
* *why* without guessing. The old code pattern-matched `/Unknown upgrade option/`
|
|
11
|
+
* against arbitrary failure output, which misread ETARGET/transient failures as
|
|
12
|
+
* "predates the flag" and silently degraded to `--no-restart` (the source of the
|
|
13
|
+
* recurring false "restart manually" warnings).
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
17
|
+
import { homedir, hostname as osHostname } from "node:os";
|
|
18
|
+
import { join } from "node:path";
|
|
19
|
+
import { errMessage, RELAY_TOKEN_HEADER, deriveOrchestratorId } from "@humwick/sdk";
|
|
20
|
+
import { shellQuote } from "@humwick/sdk/shell-utils";
|
|
21
|
+
import { isBenignBootoutFailure } from "../src/daemon.ts";
|
|
22
|
+
import { isCdFleetHostAllowlisted, resolveCdFleetAllowlistAmbiguities } from "./cd-fleet-membership.ts";
|
|
23
|
+
import { assessDeploymentHealth, type DeploymentHealthAssessment, type HealthProbeSnapshot } from "./release-health.ts";
|
|
24
|
+
import type { DurableReleaseCompletionInput, DurableReleaseCompletionResult } from "./release-report.ts";
|
|
25
|
+
|
|
26
|
+
export { assessDeploymentHealth, formatHealthGateFailure, formatHealthProbeSnapshot } from "./release-health.ts";
|
|
27
|
+
export type { DeploymentHealthAssessment, DeploymentHealthRole, HealthProbeSnapshot } from "./release-health.ts";
|
|
28
|
+
|
|
29
|
+
/** First published version whose `humwick upgrade` understands `--restart-deferred`. */
|
|
30
|
+
export const RESTART_DEFERRED_MIN_VERSION = "0.30.0";
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Supervisors the remote self-upgrade command bus can actually drive — anything
|
|
34
|
+
* else makes `orchestrator.upgrade` throw immediately (see `planSelfUpgrade` in
|
|
35
|
+
* orchestrator/src/self-upgrade.ts, which requires one of these two).
|
|
36
|
+
*/
|
|
37
|
+
export const SUPPORTED_SELF_UPGRADE_SUPERVISORS = new Set(["systemd", "launchd"]);
|
|
38
|
+
|
|
39
|
+
export type DiscoverableOrchestrator = {
|
|
40
|
+
id: string;
|
|
41
|
+
hostname?: string;
|
|
42
|
+
label?: string;
|
|
43
|
+
version?: string;
|
|
44
|
+
status?: string;
|
|
45
|
+
supervisor?: string;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export type RemoteUpgradeDiscovery = {
|
|
49
|
+
/** Online orchestrators with a supported supervisor, excluding the local host — the upgrade AND verify set. */
|
|
50
|
+
targets: string[];
|
|
51
|
+
/** Registered orchestrators intentionally excluded from remote upgrade, with why. */
|
|
52
|
+
skipped: Array<{ id: string; reason: string }>;
|
|
53
|
+
/** Registry identities retained so later fleet gating can match operator-visible names. */
|
|
54
|
+
identities: ReadonlyMap<string, DiscoverableOrchestrator>;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Orchestrators `bun run release` remote-upgrades after publish (the local host
|
|
59
|
+
* upgrades via the humwick CLI directly; these go through the relay command
|
|
60
|
+
* bus — see `triggerRemoteUpgrade` in release.ts).
|
|
61
|
+
*
|
|
62
|
+
* Replaces the #1250 hardcoded `REMOTE_ORCHESTRATORS` fleet list (#1252): a
|
|
63
|
+
* shipped, deployment-specific hostname list is wrong for any other humwick
|
|
64
|
+
* deployment's fleet, either stranding their hosts or failing their releases.
|
|
65
|
+
* The target set is now DERIVED from the relay's live orchestrator registry
|
|
66
|
+
* (`GET /api/orchestrators`, the same source #1250 used to confirm each host's
|
|
67
|
+
* supervisor) instead of hardcoded — so it auto-adapts as hosts join/leave.
|
|
68
|
+
*
|
|
69
|
+
* The returned `targets` set is exactly what the deploy verification must check
|
|
70
|
+
* (the #1250 invariant, now derived not hardcoded): a host that's verified but
|
|
71
|
+
* never made an upgrade target would be permanently stranded and fail every
|
|
72
|
+
* release (verification treats an online, un-upgraded host as a genuine
|
|
73
|
+
* mismatch, not a skip — see `planOrchestratorVersionVerification`).
|
|
74
|
+
*
|
|
75
|
+
* A host qualifies as a target when it's `online` AND its registered
|
|
76
|
+
* `supervisor` is one the remote self-upgrade command bus can drive (systemd or
|
|
77
|
+
* launchd). Everything else — offline, or an unsupported/unknown supervisor —
|
|
78
|
+
* is skipped with a reason, never a hard failure: it can't be auto-upgraded by
|
|
79
|
+
* design, not a release blocker. The local host is always excluded; it upgrades
|
|
80
|
+
* directly via the installed CLI, not through the relay command bus.
|
|
81
|
+
*/
|
|
82
|
+
export function discoverRemoteUpgradeTargets(
|
|
83
|
+
orchestrators: DiscoverableOrchestrator[],
|
|
84
|
+
localOrchestratorId: string,
|
|
85
|
+
): RemoteUpgradeDiscovery {
|
|
86
|
+
const targets: string[] = [];
|
|
87
|
+
const skipped: Array<{ id: string; reason: string }> = [];
|
|
88
|
+
for (const orch of orchestrators) {
|
|
89
|
+
if (orch.id === localOrchestratorId) continue;
|
|
90
|
+
if (orch.status !== "online") {
|
|
91
|
+
skipped.push({ id: orch.id, reason: `offline (status: ${orch.status ?? "unknown"})` });
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (!orch.supervisor || !SUPPORTED_SELF_UPGRADE_SUPERVISORS.has(orch.supervisor)) {
|
|
95
|
+
skipped.push({ id: orch.id, reason: `unsupported supervisor: ${orch.supervisor ?? "unknown"}` });
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
targets.push(orch.id);
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
targets,
|
|
102
|
+
skipped,
|
|
103
|
+
identities: new Map(orchestrators.map((orchestrator) => [orchestrator.id, orchestrator])),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Fail-closed CD fleet gate for the autonomous watcher path (#1303). Applied
|
|
109
|
+
* BETWEEN discovery and reporting, never inside `discoverRemoteUpgradeTargets`
|
|
110
|
+
* itself — a human running `bun run release` still targets every online,
|
|
111
|
+
* supported-supervisor host (they see the host list before anything happens);
|
|
112
|
+
* only the watcher's unattended trigger needs this narrower, explicit set.
|
|
113
|
+
*
|
|
114
|
+
* `allowlist` is `undefined` (unconfigured) or empty → every discovered target
|
|
115
|
+
* is demoted to skipped with a reason; the watcher deploys to nothing rather
|
|
116
|
+
* than silently falling back to "everything supervised" (the wbox bug this
|
|
117
|
+
* closes: a Win11/WSL2 dev box registers as `supervisor=systemd` and would
|
|
118
|
+
* otherwise qualify). Otherwise, only discovered targets whose id, current
|
|
119
|
+
* hostname, or label is present in the allowlist survive — everything else
|
|
120
|
+
* joins the skip list with its own reason, distinguishable from an ordinary
|
|
121
|
+
* discovery skip (offline / unsupported supervisor) for operators reading the
|
|
122
|
+
* release log.
|
|
123
|
+
*
|
|
124
|
+
* Discovery retains the registry identity behind each id so allowlist entries
|
|
125
|
+
* can match the current hostname (or label) after a repin.
|
|
126
|
+
*/
|
|
127
|
+
export function gateFleetTargets(
|
|
128
|
+
discovery: RemoteUpgradeDiscovery,
|
|
129
|
+
allowlist: Set<string> | undefined,
|
|
130
|
+
targetIds?: Set<string>,
|
|
131
|
+
): RemoteUpgradeDiscovery {
|
|
132
|
+
if (!allowlist || allowlist.size === 0) {
|
|
133
|
+
return {
|
|
134
|
+
identities: discovery.identities,
|
|
135
|
+
targets: [],
|
|
136
|
+
skipped: [
|
|
137
|
+
...discovery.targets.map((id) => ({
|
|
138
|
+
id,
|
|
139
|
+
reason: "CD fleet allowlist not configured (AGENT_RELAY_CD_FLEET) — autonomous deploy refuses to target any host",
|
|
140
|
+
})),
|
|
141
|
+
...discovery.skipped,
|
|
142
|
+
],
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
const isAllowlisted = (id: string): boolean =>
|
|
146
|
+
isCdFleetHostAllowlisted(discovery.identities.get(id) ?? { id }, allowlist);
|
|
147
|
+
const allowlistedTargets = discovery.targets.filter(isAllowlisted);
|
|
148
|
+
const targets = targetIds ? allowlistedTargets.filter((id) => targetIds.has(id)) : allowlistedTargets;
|
|
149
|
+
const skipped = [
|
|
150
|
+
...discovery.skipped,
|
|
151
|
+
...discovery.targets
|
|
152
|
+
.filter((id) => !isAllowlisted(id))
|
|
153
|
+
.map((id) => ({ id, reason: "not in CD fleet allowlist (AGENT_RELAY_CD_FLEET)" })),
|
|
154
|
+
...(targetIds ? allowlistedTargets
|
|
155
|
+
.filter((id) => !targetIds.has(id))
|
|
156
|
+
.map((id) => ({ id, reason: "already attests the CD target artifact" })) : []),
|
|
157
|
+
];
|
|
158
|
+
return { targets, skipped, identities: discovery.identities };
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Discovery + deploy-log reporting in one step (#1252): resolves the remote
|
|
163
|
+
* upgrade target set via `discoverRemoteUpgradeTargets` and narrates the
|
|
164
|
+
* outcome (skips with reasons, then the discovered set) through the release
|
|
165
|
+
* script's logger. Returns the targets with their pre-upgrade versions so the
|
|
166
|
+
* deploy status table can seed `beforeVersion` without re-scanning the registry.
|
|
167
|
+
*
|
|
168
|
+
* `fleetGate`, when passed, additionally intersects discovery against an
|
|
169
|
+
* explicit allowlist via `gateFleetTargets` (#1303) — the caller opts in only
|
|
170
|
+
* for the autonomous watcher-triggered deploy path; a manual `bun run release`
|
|
171
|
+
* omits it and keeps the pre-#1303 "every online supported host" behavior.
|
|
172
|
+
*/
|
|
173
|
+
export function reportRemoteUpgradeTargets(
|
|
174
|
+
orchestrators: DiscoverableOrchestrator[],
|
|
175
|
+
localOrchestratorId: string,
|
|
176
|
+
log: (line: string) => void,
|
|
177
|
+
opts: { fleetGate?: { allowlist: Set<string> | undefined; targetIds?: Set<string> } } = {},
|
|
178
|
+
): Array<{ id: string; beforeVersion?: string }> {
|
|
179
|
+
const discovery = discoverRemoteUpgradeTargets(orchestrators, localOrchestratorId);
|
|
180
|
+
const { targets, skipped } = opts.fleetGate
|
|
181
|
+
? gateFleetTargets(discovery, opts.fleetGate.allowlist, opts.fleetGate.targetIds)
|
|
182
|
+
: discovery;
|
|
183
|
+
for (const ambiguity of resolveCdFleetAllowlistAmbiguities(orchestrators, opts.fleetGate?.allowlist)) {
|
|
184
|
+
log(` ⚠ WARNING: AGENT_RELAY_CD_FLEET entry "${ambiguity.entry}" matches multiple online orchestrators: ${ambiguity.hostIds.join(", ")}. Prefer immutable orchestrator ids to disambiguate.`);
|
|
185
|
+
}
|
|
186
|
+
for (const skip of skipped) {
|
|
187
|
+
log(` ⚠ skipping ${skip.id} for remote upgrade: ${skip.reason}`);
|
|
188
|
+
}
|
|
189
|
+
log(`→ discovered remote upgrade targets: ${targets.length ? targets.join(", ") : "(none)"}`);
|
|
190
|
+
return targets.map((id) => ({ id, beforeVersion: orchestrators.find((orch) => orch.id === id)?.version }));
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Max wall-clock ms a `triggerRemoteUpgrade` call is allowed to block before the
|
|
195
|
+
* release script kills the child and dies with a clear message (#801).
|
|
196
|
+
*
|
|
197
|
+
* Without this, `humwick upgrade --host <id>` can block forever when the remote
|
|
198
|
+
* host's npm install retries endlessly on E404 for an unpublished workspace dep.
|
|
199
|
+
* Five minutes is generous for a normal upgrade; anything beyond that is a stuck install.
|
|
200
|
+
*/
|
|
201
|
+
export const REMOTE_UPGRADE_TIMEOUT_MS = 5 * 60 * 1000;
|
|
202
|
+
export const LOCAL_UPGRADE_TIMEOUT_MS = 5 * 60 * 1000;
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* The plain-relay systemd unit — created by `humwick daemon install`
|
|
206
|
+
* (src/daemon.ts `DEFAULT_DAEMON_NAME = "agent-relay"` → `${name}.service`). This is
|
|
207
|
+
* only ONE of the two units that can supervise the local relay; the deploy must pick
|
|
208
|
+
* the ACTUAL installed one via {@link resolveLocalRelayUnit}, never assume this name
|
|
209
|
+
* (#1442 — the old hardcoded `LOCAL_RELAY_SERVICE = "agent-relay.service"` restart
|
|
210
|
+
* exited 5 on orchestrator-install hosts, whose relay runs inside the unit below).
|
|
211
|
+
*/
|
|
212
|
+
export const PLAIN_RELAY_SERVICE = "agent-relay.service";
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* The orchestrator systemd unit — created by `humwick orchestrator install`
|
|
216
|
+
* (src/cli/orchestrator.ts default `serviceName = "agent-relay-orchestrator"`). On an
|
|
217
|
+
* orchestrator-install host the relay server runs INSIDE this unit; there is no
|
|
218
|
+
* separate agent-relay.service.
|
|
219
|
+
*/
|
|
220
|
+
export const LOCAL_ORCHESTRATOR_SERVICE = "agent-relay-orchestrator.service";
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* The plain-relay launchd label — the macOS analogue of {@link PLAIN_RELAY_SERVICE}
|
|
224
|
+
* (#1446). Matches src/daemon.ts's label scheme (`kind === "launchd" ? \`dev.agent-relay.${name}\`
|
|
225
|
+
* : name`) with `DEFAULT_DAEMON_NAME = "agent-relay"`.
|
|
226
|
+
*/
|
|
227
|
+
export const PLAIN_RELAY_LAUNCHD_LABEL = "dev.agent-relay.agent-relay";
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* The orchestrator launchd label — the macOS analogue of {@link LOCAL_ORCHESTRATOR_SERVICE}
|
|
231
|
+
* (#1446), created by `humwick orchestrator install` on darwin. Matches
|
|
232
|
+
* src/cli/orchestrator.ts's default `serviceName = "agent-relay-orchestrator"` through
|
|
233
|
+
* src/daemon.ts's `dev.agent-relay.${name}` label scheme.
|
|
234
|
+
*/
|
|
235
|
+
export const LOCAL_ORCHESTRATOR_LAUNCHD_LABEL = "dev.agent-relay.agent-relay-orchestrator";
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Per-unit systemd LoadState classification, derived from
|
|
239
|
+
* `systemctl [--user] show <unit> --property=LoadState`:
|
|
240
|
+
* - `loaded` → the unit exists and is known to systemd (`LoadState=loaded`).
|
|
241
|
+
* - `absent` → systemd DEFINITIVELY does not know the unit (`LoadState=not-found`).
|
|
242
|
+
* - `error` → the probe could not determine the state (timeout, D-Bus error, masked,
|
|
243
|
+
* non-zero exit, unexpected output). This is NOT "absent" — it must fail
|
|
244
|
+
* loud, never silently downgrade to a topology guess (#1442 P1).
|
|
245
|
+
*/
|
|
246
|
+
export type UnitLoadProbe =
|
|
247
|
+
| { kind: "loaded" }
|
|
248
|
+
| { kind: "absent" }
|
|
249
|
+
| { kind: "error"; detail: string };
|
|
250
|
+
|
|
251
|
+
/** The subset of a shell result the LoadState probe needs (matches release.ts `sh`). */
|
|
252
|
+
export type SystemctlShowResult = { code: number | null; out: string; err?: string; signal?: string | null };
|
|
253
|
+
|
|
254
|
+
/** Extract the `LoadState=` value from `systemctl show` key=value output (or undefined). */
|
|
255
|
+
export function parseSystemdLoadState(showOutput: string): string | undefined {
|
|
256
|
+
for (const line of showOutput.split(/\r?\n/)) {
|
|
257
|
+
const trimmed = line.trim();
|
|
258
|
+
if (trimmed.startsWith("LoadState=")) return trimmed.slice("LoadState=".length);
|
|
259
|
+
}
|
|
260
|
+
return undefined;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Classify a `systemctl show <unit> --property=LoadState` invocation into a
|
|
265
|
+
* {@link UnitLoadProbe}. A loaded unit prints `LoadState=loaded` and a genuinely-unknown
|
|
266
|
+
* one prints `LoadState=not-found` (both exit 0), so the LoadState line — not the exit
|
|
267
|
+
* code — distinguishes existence. But a probe that TIMED OUT, exited non-zero, or
|
|
268
|
+
* returned an unexpected/masked state is NOT evidence of absence: it is an `error` the
|
|
269
|
+
* caller must surface, so a transient systemctl failure can never masquerade as
|
|
270
|
+
* "orchestrator topology" and skip the relay restart (#1442 P1 fail-loud).
|
|
271
|
+
*/
|
|
272
|
+
export function classifyUnitLoadProbe(result: SystemctlShowResult): UnitLoadProbe {
|
|
273
|
+
if (isShellTimeoutSignal(result.signal)) {
|
|
274
|
+
return { kind: "error", detail: "systemctl show timed out" };
|
|
275
|
+
}
|
|
276
|
+
if (result.code !== 0) {
|
|
277
|
+
const stderr = result.err?.trim();
|
|
278
|
+
return { kind: "error", detail: `systemctl show exited ${result.code ?? "null"}${stderr ? `: ${stderr}` : ""}` };
|
|
279
|
+
}
|
|
280
|
+
const loadState = parseSystemdLoadState(result.out);
|
|
281
|
+
if (loadState === "loaded") return { kind: "loaded" };
|
|
282
|
+
if (loadState === "not-found") return { kind: "absent" };
|
|
283
|
+
return { kind: "error", detail: `unexpected LoadState=${loadState ?? "(missing)"}` };
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/** The subset of a shell result the launchd probe needs (matches release.ts `sh`). */
|
|
287
|
+
export type LaunchctlPrintResult = { code: number | null; out: string; err?: string; signal?: string | null };
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Classify a `launchctl print gui/<uid>/<label>` invocation into a {@link UnitLoadProbe}
|
|
291
|
+
* — the launchd (macOS) analogue of {@link classifyUnitLoadProbe} (#1446). Unlike
|
|
292
|
+
* `systemctl show`, `launchctl print` does not distinguish loaded/not-found by an exit-0
|
|
293
|
+
* property line: it exits 0 with job details when loaded, and NON-ZERO with a
|
|
294
|
+
* "Could not find service …" (or equivalent, macOS-version-dependent) message when the
|
|
295
|
+
* label is not loaded. Reuses {@link isBenignBootoutFailure}'s message matching (already
|
|
296
|
+
* hardened across macOS versions for the identical not-loaded signal on `launchctl
|
|
297
|
+
* bootout`) so this probe and that uninstall path never diverge on what "not loaded"
|
|
298
|
+
* looks like. A timeout or any OTHER non-zero exit (permission, I/O, unexpected message)
|
|
299
|
+
* is NOT evidence of absence: it is an `error` the caller must surface, so a transient
|
|
300
|
+
* launchctl failure can never masquerade as "unit not installed" and silently skip the
|
|
301
|
+
* restart (mirrors #1442 P1 fail-loud for the systemd probe).
|
|
302
|
+
*/
|
|
303
|
+
export function classifyLaunchdPrintProbe(result: LaunchctlPrintResult): UnitLoadProbe {
|
|
304
|
+
if (isShellTimeoutSignal(result.signal)) {
|
|
305
|
+
return { kind: "error", detail: "launchctl print timed out" };
|
|
306
|
+
}
|
|
307
|
+
if (result.code === 0) return { kind: "loaded" };
|
|
308
|
+
const detail = (result.err?.trim() || result.out?.trim() || "");
|
|
309
|
+
if (isBenignBootoutFailure(detail)) return { kind: "absent" };
|
|
310
|
+
return { kind: "error", detail: `launchctl print exited ${result.code ?? "null"}${detail ? `: ${detail}` : ""}` };
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Tri-state resolution of which systemd unit supervises the LOCAL relay (#1442):
|
|
315
|
+
* - `restart` → a real, loaded agent-relay.service (plain-relay host): restart
|
|
316
|
+
* it mid-deploy as before.
|
|
317
|
+
* - `skip-orchestrator` → agent-relay.service is DEFINITIVELY not-found AND the
|
|
318
|
+
* orchestrator unit is loaded (orchestrator-install host, relay
|
|
319
|
+
* runs inside it): SKIP the mid-deploy restart; the orchestrator
|
|
320
|
+
* is restarted exactly once later (deferred end / CD repair) and
|
|
321
|
+
* the deploy driver has been re-exec'd out of its cgroup
|
|
322
|
+
* (release-decouple) so it survives.
|
|
323
|
+
* - `indeterminate` → any probe error, or neither unit loaded: FAIL LOUD. Never
|
|
324
|
+
* silently skip — a probe timeout on a plain host would otherwise
|
|
325
|
+
* leave the live relay stale while the deploy reports success.
|
|
326
|
+
*/
|
|
327
|
+
export type LocalRelayUnitResolution =
|
|
328
|
+
| { kind: "restart"; unit: string }
|
|
329
|
+
| { kind: "skip-orchestrator"; unit: string }
|
|
330
|
+
| { kind: "indeterminate"; reason: string };
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Resolve the local relay unit by probing the live system, so install and upgrade-deploy
|
|
334
|
+
* naming cannot diverge (#1442). Probes BOTH units; fail-closed on a genuine probe error or
|
|
335
|
+
* a total absence, but a LOADED plain relay unit is always the daemon to restart. Truth table
|
|
336
|
+
* (#1484 — a loaded agent-relay.service is unambiguously the relay daemon, EVEN when the
|
|
337
|
+
* orchestrator unit is also loaded on the same host):
|
|
338
|
+
* - relay loaded (orchestrator absent OR loaded) → `restart` agent-relay.service. Co-location
|
|
339
|
+
* is the relay-HOST topology (a standalone relay daemon unit AND an orchestrator unit on one
|
|
340
|
+
* box, e.g. macmini2), NOT ambiguity: agent-relay.service unambiguously supervises the daemon,
|
|
341
|
+
* and the orchestrator has its OWN restart lifecycle (restartLocalOrchestratorForCdRepair on
|
|
342
|
+
* the CD path / the deferred end-of-run finalize on the human path), so it is not this
|
|
343
|
+
* resolver's concern. The deploy driver is decoupled into a sibling systemd scope
|
|
344
|
+
* (release-decouple), so bouncing the plain unit never self-terminates the running deploy.
|
|
345
|
+
* - relay absent + orchestrator loaded → `skip-orchestrator` (relay runs inside the orchestrator)
|
|
346
|
+
* - any probe error (timeout/D-Bus/masked/unexpected) on either → `indeterminate` (fail loud)
|
|
347
|
+
* - neither loaded → `indeterminate`
|
|
348
|
+
* `probe(unit)` classifies a single unit's LoadState (see {@link classifyUnitLoadProbe}).
|
|
349
|
+
*
|
|
350
|
+
* HISTORY (#1484): #1442 round 3 (commit 4ef15f11) made BOTH-loaded an `indeterminate` abort on
|
|
351
|
+
* the theory that two loaded units were ambiguous. That took the CD pipeline fully red on the
|
|
352
|
+
* relay host (macmini2), which legitimately runs the daemon and orchestrator as separate units:
|
|
353
|
+
* every self-deploy aborted here after the runtime symlink was already swapped, stranding the
|
|
354
|
+
* daemon ahead of the orchestrator. Co-location is a supported topology, not ambiguity.
|
|
355
|
+
*
|
|
356
|
+
* `orchestratorUnit` defaults to {@link LOCAL_ORCHESTRATOR_SERVICE} but MUST be overridden
|
|
357
|
+
* with the actual installed unit name when the orchestrator was installed with a custom
|
|
358
|
+
* `--service-name` (#1444): probing the hardcoded default against a custom-named unit finds
|
|
359
|
+
* it definitively absent, so the resolver falls through to `indeterminate` and fails the
|
|
360
|
+
* deploy loud — safe, but wrong, since the custom unit is in fact loaded and restartable.
|
|
361
|
+
*
|
|
362
|
+
* `plainUnit` defaults to {@link PLAIN_RELAY_SERVICE} but MUST be overridden with the
|
|
363
|
+
* launchd label ({@link PLAIN_RELAY_LAUNCHD_LABEL}) on macOS (#1446) — `probe`/`unit` are
|
|
364
|
+
* opaque identifiers to this function, so a launchd caller passes launchd labels for BOTH
|
|
365
|
+
* `plainUnit` and `orchestratorUnit` and a `probe` that shells to `launchctl print`
|
|
366
|
+
* instead of `systemctl show`; the truth table below is unchanged either way.
|
|
367
|
+
*/
|
|
368
|
+
export function resolveLocalRelayUnit(
|
|
369
|
+
probe: (unit: string) => UnitLoadProbe,
|
|
370
|
+
orchestratorUnit: string = LOCAL_ORCHESTRATOR_SERVICE,
|
|
371
|
+
plainUnit: string = PLAIN_RELAY_SERVICE,
|
|
372
|
+
): LocalRelayUnitResolution {
|
|
373
|
+
// Probe BOTH units before deciding: a loaded plain relay unit means `restart` regardless of
|
|
374
|
+
// the orchestrator (#1484 — co-located daemon+orchestrator is the relay-HOST topology, not
|
|
375
|
+
// ambiguity), but we still probe the orchestrator so a probe ERROR on it fails closed.
|
|
376
|
+
const relay = probe(plainUnit);
|
|
377
|
+
const orchestrator = probe(orchestratorUnit);
|
|
378
|
+
if (relay.kind === "error") {
|
|
379
|
+
return { kind: "indeterminate", reason: `could not determine ${plainUnit} state: ${relay.detail}` };
|
|
380
|
+
}
|
|
381
|
+
if (orchestrator.kind === "error") {
|
|
382
|
+
return { kind: "indeterminate", reason: `could not determine ${orchestratorUnit} state: ${orchestrator.detail}` };
|
|
383
|
+
}
|
|
384
|
+
const relayLoaded = relay.kind === "loaded";
|
|
385
|
+
const orchestratorLoaded = orchestrator.kind === "loaded";
|
|
386
|
+
// #1484: a loaded agent-relay.service is the relay daemon to restart even when the orchestrator
|
|
387
|
+
// unit is ALSO loaded (the relay host runs both as separate units). The orchestrator's own
|
|
388
|
+
// restart is handled elsewhere (restartLocalOrchestratorForCdRepair / end-of-run finalize).
|
|
389
|
+
if (relayLoaded) return { kind: "restart", unit: plainUnit };
|
|
390
|
+
if (orchestratorLoaded) return { kind: "skip-orchestrator", unit: orchestratorUnit };
|
|
391
|
+
return { kind: "indeterminate", reason: `neither ${plainUnit} nor ${orchestratorUnit} is loaded — cannot identify the local relay unit to restart` };
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* What {@link performLocalRelayRestart} actually did, so the caller can report an HONEST
|
|
396
|
+
* local host status (#1448):
|
|
397
|
+
* - `restarted` → the real agent-relay.service (plain-relay host) was restarted in place;
|
|
398
|
+
* the running relay process IS the new version, so "upgraded" is truthful.
|
|
399
|
+
* - `deferred` → the relay runs inside the orchestrator unit (orchestrator-install host);
|
|
400
|
+
* the mid-deploy restart was SKIPPED. The new runtime is only STAGED — the
|
|
401
|
+
* running process is still the old one until the caller performs the verified
|
|
402
|
+
* orchestrator restart. The caller MUST NOT report "upgraded" off staged files
|
|
403
|
+
* (the #1448 false-success bug): it upgrades only once the restart attests.
|
|
404
|
+
*/
|
|
405
|
+
export type LocalRelayRestartOutcome =
|
|
406
|
+
| { kind: "restarted"; unit: string }
|
|
407
|
+
| { kind: "deferred"; unit: string };
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Perform the mid-deploy local relay restart against the ACTUAL installed unit (#1442).
|
|
411
|
+
* Extracted from release.ts so the tri-state skip/restart/fail-loud decision is
|
|
412
|
+
* unit-testable without shelling out to systemd.
|
|
413
|
+
*
|
|
414
|
+
* Behaviour (driven by {@link resolveLocalRelayUnit}):
|
|
415
|
+
* - `indeterminate` → FAIL the deploy loud. A probe error or both-units-absent must
|
|
416
|
+
* never be silently downgraded to a skip: on a plain host that
|
|
417
|
+
* would leave the live relay stale while the deploy reports
|
|
418
|
+
* success (#1442 P1).
|
|
419
|
+
* - `skip-orchestrator` → SKIP the restart and log why, returning `deferred`. That unit
|
|
420
|
+
* supervises this deploy driver; it is restarted exactly once by
|
|
421
|
+
* the caller (before the remote fan-out, #1448) once the driver has
|
|
422
|
+
* been decoupled from its cgroup so it survives (#1310 / #1442 P0).
|
|
423
|
+
* - `restart` → restart the real unit, rolling back only after its job has settled.
|
|
424
|
+
*
|
|
425
|
+
* `failDeploy` must not return (it aborts the release); it also owns marking the local
|
|
426
|
+
* host status failed.
|
|
427
|
+
*/
|
|
428
|
+
export function performLocalRelayRestart(opts: {
|
|
429
|
+
probe: (unit: string) => UnitLoadProbe;
|
|
430
|
+
restart: (unit: string) => import("./release-restart.ts").LocalRestartResult;
|
|
431
|
+
rollbackAndRetry?: (unit: string) => void;
|
|
432
|
+
log: (msg: string) => void;
|
|
433
|
+
failDeploy: (reason: string) => never;
|
|
434
|
+
/** Actual installed orchestrator unit name (#1444) — defaults to {@link LOCAL_ORCHESTRATOR_SERVICE}. */
|
|
435
|
+
orchestratorUnit?: string;
|
|
436
|
+
/** Plain-relay unit/label (#1446) — defaults to {@link PLAIN_RELAY_SERVICE}; pass the launchd label on macOS. */
|
|
437
|
+
plainUnit?: string;
|
|
438
|
+
}): LocalRelayRestartOutcome {
|
|
439
|
+
const resolution = resolveLocalRelayUnit(opts.probe, opts.orchestratorUnit, opts.plainUnit);
|
|
440
|
+
if (resolution.kind === "indeterminate") {
|
|
441
|
+
opts.failDeploy(`cannot resolve the local relay unit to restart — refusing to finalize the deploy (would risk leaving the running relay stale): ${resolution.reason}`);
|
|
442
|
+
}
|
|
443
|
+
if (resolution.kind === "skip-orchestrator") {
|
|
444
|
+
opts.log(` ↻ local relay runs inside ${resolution.unit} (orchestrator-install host) — deferring its restart to the verified orchestrator restart before the remote fan-out, so it survives the deploy driver and is not hostage to remote outcomes (#1448)`);
|
|
445
|
+
return { kind: "deferred", unit: resolution.unit };
|
|
446
|
+
}
|
|
447
|
+
const restart = opts.restart(resolution.unit);
|
|
448
|
+
if (restart.code === 0) return { kind: "restarted", unit: resolution.unit };
|
|
449
|
+
// Restore the previously-running runtime before failing, so a bad swap does not leave
|
|
450
|
+
// the relay down (best-effort — the deploy fails regardless, reported below).
|
|
451
|
+
if (restart.rollbackSafe ?? !isShellTimeoutSignal(restart.signal)) opts.rollbackAndRetry?.(resolution.unit);
|
|
452
|
+
opts.failDeploy(
|
|
453
|
+
restart.reason ?? (isShellTimeoutSignal(restart.signal)
|
|
454
|
+
? `${resolution.unit} restart timed out${restart.timeoutMs ? ` after ${restart.timeoutMs / 1000}s` : ""}`
|
|
455
|
+
: `${resolution.unit} restart exited ${restart.code}`)
|
|
456
|
+
);
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
export type ReleaseDeployPhase =
|
|
460
|
+
| "local-runtime-install"
|
|
461
|
+
| "local-relay-restart"
|
|
462
|
+
| "local-relay-health"
|
|
463
|
+
| "remote-upgrade"
|
|
464
|
+
| "remote-version-verify"
|
|
465
|
+
| "remote-health"
|
|
466
|
+
| "dashboard-deploy"
|
|
467
|
+
| "local-orchestrator-reconnect"
|
|
468
|
+
| "live-spawn-smoke"
|
|
469
|
+
| "success-report"
|
|
470
|
+
| "local-orchestrator-restart";
|
|
471
|
+
|
|
472
|
+
export function planReleaseCompletionPhases(opts: { smoke: boolean }): ReleaseDeployPhase[] {
|
|
473
|
+
return [
|
|
474
|
+
"local-runtime-install",
|
|
475
|
+
"local-relay-restart",
|
|
476
|
+
"local-relay-health",
|
|
477
|
+
"remote-upgrade",
|
|
478
|
+
"remote-version-verify",
|
|
479
|
+
"remote-health",
|
|
480
|
+
"dashboard-deploy",
|
|
481
|
+
...(opts.smoke ? ["local-orchestrator-reconnect" as const, "live-spawn-smoke" as const] : []),
|
|
482
|
+
"success-report",
|
|
483
|
+
"local-orchestrator-restart",
|
|
484
|
+
];
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
export type DetachedRestartInvocation = {
|
|
488
|
+
cmd: string;
|
|
489
|
+
args: string[];
|
|
490
|
+
detached: true;
|
|
491
|
+
stdio: "ignore";
|
|
492
|
+
};
|
|
493
|
+
|
|
494
|
+
export function detachedSystemdRestartInvocation(
|
|
495
|
+
services: string[],
|
|
496
|
+
opts: { unitName: string; description?: string },
|
|
497
|
+
): DetachedRestartInvocation {
|
|
498
|
+
return {
|
|
499
|
+
cmd: "systemd-run",
|
|
500
|
+
args: [
|
|
501
|
+
"--user",
|
|
502
|
+
"--collect",
|
|
503
|
+
`--unit=${opts.unitName}`,
|
|
504
|
+
...(opts.description ? [`--description=${opts.description}`] : []),
|
|
505
|
+
"systemctl",
|
|
506
|
+
"--user",
|
|
507
|
+
"restart",
|
|
508
|
+
...services,
|
|
509
|
+
],
|
|
510
|
+
detached: true,
|
|
511
|
+
stdio: "ignore",
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
* The launchd (macOS) analogue of {@link detachedSystemdRestartInvocation} (#1446).
|
|
517
|
+
* `systemd-run --collect` schedules the restart as an independent transient unit so it
|
|
518
|
+
* survives the caller's own teardown; launchd has no equivalent transient-unit primitive,
|
|
519
|
+
* so — mirroring orchestrator/src/self-upgrade.ts's already-proven launchd restart path —
|
|
520
|
+
* this backgrounds a plain shell command (`… &`) instead: `launchctl kickstart -kp` both
|
|
521
|
+
* kills the running job and restarts it, and the trailing `&` detaches it from this
|
|
522
|
+
* process's shell so it keeps running after the caller (and its own supervised job) exits.
|
|
523
|
+
*/
|
|
524
|
+
export function detachedLaunchdRestartInvocation(label: string, opts: { uid: number }): DetachedRestartInvocation {
|
|
525
|
+
return {
|
|
526
|
+
cmd: "/bin/sh",
|
|
527
|
+
args: ["-c", `launchctl kickstart -kp ${shellQuote(`gui/${opts.uid}/${label}`)} &`],
|
|
528
|
+
detached: true,
|
|
529
|
+
stdio: "ignore",
|
|
530
|
+
};
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
export type PublishCompleteSigtermReport = {
|
|
534
|
+
arm(): void;
|
|
535
|
+
disarm(): void;
|
|
536
|
+
};
|
|
537
|
+
|
|
538
|
+
export function installPublishCompleteSigtermReport(opts: {
|
|
539
|
+
writeStderr?: (text: string) => void;
|
|
540
|
+
exit?: (code: number) => never;
|
|
541
|
+
} = {}): PublishCompleteSigtermReport {
|
|
542
|
+
let armed = false;
|
|
543
|
+
process.once("SIGTERM", () => {
|
|
544
|
+
if (armed) {
|
|
545
|
+
(opts.writeStderr ?? ((text) => console.error(text)))(
|
|
546
|
+
"\n⚠ publish complete, deploy interrupted by local restart — run `bun run release --resume` to finish remote deploy + smoke.",
|
|
547
|
+
);
|
|
548
|
+
}
|
|
549
|
+
(opts.exit ?? ((code) => process.exit(code)))(143);
|
|
550
|
+
});
|
|
551
|
+
return {
|
|
552
|
+
arm() { armed = true; },
|
|
553
|
+
disarm() { armed = false; },
|
|
554
|
+
};
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
type DetachedSpawner = (
|
|
558
|
+
cmd: string,
|
|
559
|
+
args: string[],
|
|
560
|
+
opts: { detached: true; stdio: "ignore" },
|
|
561
|
+
) => { unref(): void };
|
|
562
|
+
|
|
563
|
+
export function runLiveSpawnSmoke(opts: {
|
|
564
|
+
noSmoke: boolean;
|
|
565
|
+
verbose: boolean;
|
|
566
|
+
log: (msg: string) => void;
|
|
567
|
+
sh: (cmd: string, args: string[], opts?: { inherit?: boolean }) => { code: number; out?: string; err?: string };
|
|
568
|
+
}): number {
|
|
569
|
+
if (opts.noSmoke) {
|
|
570
|
+
opts.log("\n(--no-smoke — skipping live-spawn smoke.)");
|
|
571
|
+
return 0;
|
|
572
|
+
}
|
|
573
|
+
const failMessage = (code: number) =>
|
|
574
|
+
`shipped successfully — live-spawn smoke FAILED, investigate/fix-forward (exit ${code}). Release publish/deploy already completed.`;
|
|
575
|
+
if (opts.verbose) {
|
|
576
|
+
opts.log("\n→ live-spawn smoke …");
|
|
577
|
+
const r = opts.sh("bun", ["run", "smoke:spawn"], { inherit: true });
|
|
578
|
+
if (r.code !== 0) {
|
|
579
|
+
console.error(`\n⚠ ${failMessage(r.code)}`);
|
|
580
|
+
return r.code || 1;
|
|
581
|
+
}
|
|
582
|
+
opts.log("✓ live-spawn smoke passed");
|
|
583
|
+
return 0;
|
|
584
|
+
}
|
|
585
|
+
process.stdout.write("\n→ live-spawn smoke … ");
|
|
586
|
+
const started = Date.now();
|
|
587
|
+
const r = opts.sh("bun", ["run", "smoke:spawn"]);
|
|
588
|
+
const secs = ((Date.now() - started) / 1000).toFixed(1);
|
|
589
|
+
if (r.code === 0) {
|
|
590
|
+
process.stdout.write(`✓ (${secs}s)\n`);
|
|
591
|
+
return 0;
|
|
592
|
+
}
|
|
593
|
+
process.stdout.write(`⚠ (${secs}s) ${failMessage(r.code)}\n`);
|
|
594
|
+
if (r.out) process.stdout.write(`${r.out}\n`);
|
|
595
|
+
if (r.err) process.stderr.write(`${r.err}\n`);
|
|
596
|
+
return r.code || 1;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
export async function finishReleaseWithLocalOrchestratorRestart(opts: {
|
|
600
|
+
versionLabel: string;
|
|
601
|
+
successMessage: string;
|
|
602
|
+
noSmoke: boolean;
|
|
603
|
+
runSmoke: () => number;
|
|
604
|
+
durableCompletionReport?: (input: DurableReleaseCompletionInput) => Promise<DurableReleaseCompletionResult>;
|
|
605
|
+
log: (msg: string) => void;
|
|
606
|
+
die: (msg: string) => never;
|
|
607
|
+
spawn: DetachedSpawner;
|
|
608
|
+
sigtermReport?: PublishCompleteSigtermReport;
|
|
609
|
+
restartLocalOrchestrator?: boolean;
|
|
610
|
+
exit?: (code: number) => never;
|
|
611
|
+
/** Actual installed orchestrator unit name (#1444) — defaults to {@link LOCAL_ORCHESTRATOR_SERVICE}. */
|
|
612
|
+
orchestratorUnit?: string;
|
|
613
|
+
/** Local supervisor (#1446) — defaults to "systemd"; pass "launchd" on macOS. */
|
|
614
|
+
supervisor?: "systemd" | "launchd";
|
|
615
|
+
/** launchd only: the gui domain uid (`process.getuid()`); ignored under systemd. */
|
|
616
|
+
uid?: number;
|
|
617
|
+
}): Promise<void> {
|
|
618
|
+
const phases = planReleaseCompletionPhases({ smoke: !opts.noSmoke });
|
|
619
|
+
const reportIndex = phases.indexOf("success-report");
|
|
620
|
+
const restartIndex = phases.indexOf("local-orchestrator-restart");
|
|
621
|
+
if (reportIndex === -1 || restartIndex === -1 || reportIndex >= restartIndex) {
|
|
622
|
+
opts.die("invalid release phase plan: local orchestrator restart must be final");
|
|
623
|
+
}
|
|
624
|
+
const smokeCode = opts.runSmoke();
|
|
625
|
+
const reportMessage = smokeCode === 0
|
|
626
|
+
? opts.successMessage
|
|
627
|
+
: `\n⚠ ${opts.versionLabel} published/deployed, but live-spawn smoke failed (exit ${smokeCode}).`;
|
|
628
|
+
opts.log(reportMessage);
|
|
629
|
+
const durableReport = await opts.durableCompletionReport?.({
|
|
630
|
+
versionLabel: opts.versionLabel,
|
|
631
|
+
successMessage: opts.successMessage,
|
|
632
|
+
smokeCode,
|
|
633
|
+
});
|
|
634
|
+
if (durableReport?.status === "failed") {
|
|
635
|
+
opts.die(`release completed, but durable completion report failed before final orchestrator restart: ${durableReport.reason}`);
|
|
636
|
+
}
|
|
637
|
+
if (durableReport?.status === "sent") {
|
|
638
|
+
opts.log(`✓ durable release completion report queued to ${durableReport.to}${durableReport.messageId ? ` (#${durableReport.messageId})` : ""}`);
|
|
639
|
+
}
|
|
640
|
+
opts.sigtermReport?.disarm();
|
|
641
|
+
if (opts.restartLocalOrchestrator === false) {
|
|
642
|
+
// Either the local host isn't a deploy target, or it was already restarted + attested
|
|
643
|
+
// earlier in the run (the #1448 verified finalize before the remote fan-out).
|
|
644
|
+
opts.log("→ local orchestrator restart not needed here (already restarted, or not a deploy target)");
|
|
645
|
+
if (smokeCode !== 0) (opts.exit ?? ((code) => process.exit(code)))(smokeCode);
|
|
646
|
+
return;
|
|
647
|
+
}
|
|
648
|
+
const orchestratorUnit = opts.orchestratorUnit ?? LOCAL_ORCHESTRATOR_SERVICE;
|
|
649
|
+
const supervisor = opts.supervisor ?? "systemd";
|
|
650
|
+
const unitName = `agent-relay-release-orchestrator-restart-${process.pid}`;
|
|
651
|
+
const invocation = supervisor === "launchd"
|
|
652
|
+
? detachedLaunchdRestartInvocation(orchestratorUnit, { uid: opts.uid ?? 0 })
|
|
653
|
+
: detachedSystemdRestartInvocation([orchestratorUnit], {
|
|
654
|
+
unitName,
|
|
655
|
+
description: `Agent Relay ${opts.versionLabel} final local orchestrator restart`,
|
|
656
|
+
});
|
|
657
|
+
try {
|
|
658
|
+
opts.spawn(invocation.cmd, invocation.args, { detached: invocation.detached, stdio: invocation.stdio }).unref();
|
|
659
|
+
opts.log(`→ scheduled detached local orchestrator restart (${unitName})`);
|
|
660
|
+
} catch (error) {
|
|
661
|
+
console.error(`\n⚠ could not schedule detached local orchestrator restart: ${errMessage(error)}`);
|
|
662
|
+
console.error(` Run manually: ${supervisor === "launchd" ? `launchctl kickstart -kp gui/${opts.uid ?? 0}/${orchestratorUnit}` : `systemctl --user restart ${orchestratorUnit}`}`);
|
|
663
|
+
}
|
|
664
|
+
if (smokeCode !== 0) (opts.exit ?? ((code) => process.exit(code)))(smokeCode);
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
export type DeployHostStatusKind = "pending" | "upgraded" | "skipped" | "failed" | "timed-out";
|
|
668
|
+
|
|
669
|
+
export type DeployHostStatus = {
|
|
670
|
+
id: string;
|
|
671
|
+
status: DeployHostStatusKind;
|
|
672
|
+
beforeVersion?: string;
|
|
673
|
+
afterVersion?: string;
|
|
674
|
+
reason?: string;
|
|
675
|
+
};
|
|
676
|
+
|
|
677
|
+
export function formatDeployHostStatus(host: DeployHostStatus, targetVersion: string): string {
|
|
678
|
+
const before = host.beforeVersion ?? "unknown";
|
|
679
|
+
const after = host.afterVersion ?? targetVersion;
|
|
680
|
+
const reason = host.reason ? ` (${host.reason})` : "";
|
|
681
|
+
if (host.status === "upgraded") return `${host.id}: upgraded ${before}→${after}${reason}`;
|
|
682
|
+
if (host.status === "skipped") return `${host.id}: skipped${reason}`;
|
|
683
|
+
if (host.status === "failed") return `${host.id}: failed(${host.reason ?? "unknown"})`;
|
|
684
|
+
if (host.status === "timed-out") return `${host.id}: timed-out${reason}`;
|
|
685
|
+
return `${host.id}: pending${reason}`;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
/**
|
|
689
|
+
* Did a `spawnSync` call with a `timeout` set actually time out?
|
|
690
|
+
* Node.js kills the child with the `killSignal` (default SIGTERM) when the timeout
|
|
691
|
+
* fires, then returns with `status: null` and `signal: "SIGTERM"`.
|
|
692
|
+
*/
|
|
693
|
+
export function isShellTimeoutSignal(signal: string | null | undefined): boolean {
|
|
694
|
+
return signal === "SIGTERM";
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
/**
|
|
698
|
+
* Coerce a `GET /api/orchestrators` response into an orchestrator array WITHOUT ever throwing
|
|
699
|
+
* (#1448 review-B). A non-ok response, an unreachable relay (`null`), a malformed/truncated
|
|
700
|
+
* 200 body (`res.json()` rejects), or a non-array payload all degrade to `[]` — the same as
|
|
701
|
+
* "no fleet discovered". Before this, a bad 200 body threw out of the deploy and bypassed the
|
|
702
|
+
* local-orchestrator finalize, re-stranding the local host staged-but-old. The bounded verify
|
|
703
|
+
* loop re-polls, and the local finalize still runs.
|
|
704
|
+
*/
|
|
705
|
+
export async function parseOrchestratorListResponse<T>(
|
|
706
|
+
res: { ok: boolean; json: () => Promise<unknown> } | null,
|
|
707
|
+
): Promise<T[]> {
|
|
708
|
+
if (!res?.ok) return [];
|
|
709
|
+
try {
|
|
710
|
+
const body = await res.json();
|
|
711
|
+
return Array.isArray(body) ? (body as T[]) : [];
|
|
712
|
+
} catch {
|
|
713
|
+
return [];
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
/**
|
|
718
|
+
* Is `value` a URL `new URL(value)` can parse (#1448 review-B)? An orchestrator-reported
|
|
719
|
+
* `apiUrl` is attacker/bug-influenced; feeding a malformed one to the health probe's
|
|
720
|
+
* `new URL("/api/health", apiUrl)` THROWS past the deploy's finalize handler. Validate first.
|
|
721
|
+
*/
|
|
722
|
+
export function isParseableUrl(value: string): boolean {
|
|
723
|
+
try { new URL(value); return true; } catch { return false; }
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
/**
|
|
727
|
+
* Deterministic version probe (#322). The restart-flag decision must reflect the
|
|
728
|
+
* binary that will *actually* run the upgrade — NOT whatever `humwick` PATH
|
|
729
|
+
* happens to surface. `bun run release` PREPENDS `~/.bun/bin` to PATH, so a stale
|
|
730
|
+
* `~/.bun/bin/agent-relay` symlink (a Jun-1 leftover sat at 0.10.25) would win over
|
|
731
|
+
* the canonical CLI and make the probe report an ancient version → degrade to
|
|
732
|
+
* `--no-restart` for no reason, every release.
|
|
733
|
+
*
|
|
734
|
+
* The canonical managed `humwick` shim (`~/.local/bin/agent-relay`) execs
|
|
735
|
+
* `bun ~/.agent-relay/runtime/node_modules/agent-relay-server/src/index.ts`, so the
|
|
736
|
+
* runtime install IS the version that runs the upgrade. Read its package.json
|
|
737
|
+
* directly (no subprocess, no PATH) for the probe, and pin deploy-critical
|
|
738
|
+
* invocations to the runtime-owned CLI/entry path.
|
|
739
|
+
*/
|
|
740
|
+
function runtimeServerDir(home: string): string {
|
|
741
|
+
const modules = join(home, ".agent-relay", "runtime", "node_modules");
|
|
742
|
+
// #3470 — a registry-installed npm runtime keeps the legacy package path until scoped publication.
|
|
743
|
+
const canonical = join(modules, "@humwick", "server");
|
|
744
|
+
return existsSync(canonical) ? canonical : join(modules, "agent-relay-server");
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
/** Installed runtime's server package.json — the deterministic probe source. */
|
|
748
|
+
export function runtimeServerPackageJson(home: string): string {
|
|
749
|
+
return join(runtimeServerDir(home), "package.json");
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
/** Entry script the managed `humwick` shim execs (`bun <this> upgrade …`). */
|
|
753
|
+
export function runtimeServerEntry(home: string): string {
|
|
754
|
+
return join(runtimeServerDir(home), "src", "index.ts");
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
/** Runtime-owned CLI shim; deploy-critical release invocations must prefer this over PATH. */
|
|
758
|
+
export function runtimeHumwickBin(home: string): string {
|
|
759
|
+
return join(home, ".agent-relay", "runtime", "node_modules", ".bin", "agent-relay");
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
export function runtimeHumwickInvocation(
|
|
763
|
+
home: string,
|
|
764
|
+
args: string[],
|
|
765
|
+
runtime: { binExists: boolean; entryExists: boolean },
|
|
766
|
+
): { cmd: string; args: string[] } {
|
|
767
|
+
if (runtime.binExists) return { cmd: runtimeHumwickBin(home), args };
|
|
768
|
+
if (runtime.entryExists) return { cmd: "bun", args: [runtimeServerEntry(home), ...args] };
|
|
769
|
+
return { cmd: "agent-relay", args };
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
type OrchestratorVersion = {
|
|
773
|
+
id: string;
|
|
774
|
+
hostname?: string;
|
|
775
|
+
label?: string;
|
|
776
|
+
version?: string;
|
|
777
|
+
status?: string;
|
|
778
|
+
gitSha?: string;
|
|
779
|
+
/** Reported local supervisor (#1413 fix #3) — a `launchd` host re-attests slowly (macmini). */
|
|
780
|
+
supervisor?: string;
|
|
781
|
+
};
|
|
782
|
+
type OrchestratorHealth = { status?: string; restartRequired?: boolean };
|
|
783
|
+
type ReleaseOrchestrator = OrchestratorVersion & { health?: OrchestratorHealth };
|
|
784
|
+
|
|
785
|
+
export type LocalOrchestratorReconnectSnapshot = {
|
|
786
|
+
url: string;
|
|
787
|
+
httpStatus?: number;
|
|
788
|
+
error?: string;
|
|
789
|
+
seenIds?: string[];
|
|
790
|
+
local?: ReleaseOrchestrator;
|
|
791
|
+
body?: unknown;
|
|
792
|
+
};
|
|
793
|
+
|
|
794
|
+
export type LocalOrchestratorReconnectResult = {
|
|
795
|
+
ok: boolean;
|
|
796
|
+
localOrchestratorId: string;
|
|
797
|
+
checks: number;
|
|
798
|
+
last: LocalOrchestratorReconnectSnapshot;
|
|
799
|
+
};
|
|
800
|
+
|
|
801
|
+
export type LocalOrchestratorReconnectOptions = {
|
|
802
|
+
timeoutMs?: number;
|
|
803
|
+
intervalMs?: number;
|
|
804
|
+
requestTimeoutMs?: number;
|
|
805
|
+
headers?: HeadersInit;
|
|
806
|
+
fetch?: FetchLike;
|
|
807
|
+
sleep?: (ms: number) => Promise<void>;
|
|
808
|
+
now?: () => number;
|
|
809
|
+
/** Require the restarted process's live git-sha attestation before success. */
|
|
810
|
+
expectedGitSha?: string;
|
|
811
|
+
/**
|
|
812
|
+
* Require the reconnected orchestrator to REPORT this version before success (#1448).
|
|
813
|
+
* The npm-reuse deploy path has no gitSha to attest, so "the restart actually loaded the
|
|
814
|
+
* new runtime" is proven by the registry version instead — otherwise a bounce that came
|
|
815
|
+
* back on the OLD version would falsely pass as an "upgraded" local host.
|
|
816
|
+
*/
|
|
817
|
+
expectedVersion?: string;
|
|
818
|
+
};
|
|
819
|
+
|
|
820
|
+
export const DEFAULT_LOCAL_ORCHESTRATOR_RECONNECT_TIMEOUT_MS = 45_000;
|
|
821
|
+
const DEFAULT_LOCAL_ORCHESTRATOR_RECONNECT_INTERVAL_MS = 2_000;
|
|
822
|
+
|
|
823
|
+
/**
|
|
824
|
+
* #1413 fix #3 / #919 — re-attestation-driven host-version verification poll.
|
|
825
|
+
*
|
|
826
|
+
* A slow launchd re-attest (e.g. macmini) can take longer than the base poll budget. Cutting off
|
|
827
|
+
* at a fixed count spuriously fails the deploy and forces a churn retry that pointlessly re-bounces
|
|
828
|
+
* hosts. So keep polling PAST the base budget ONLY while a slow-supervisor (launchd) target is
|
|
829
|
+
* still un-attested AND the mismatch set is still SHRINKING (hosts are attesting, just slowly), up
|
|
830
|
+
* to a hard cap; give up once it stalls (`stallPolls` consecutive polls with no improvement).
|
|
831
|
+
*
|
|
832
|
+
* An all-systemd fleet — and any lag with NO launchd host pending — keeps the exact original
|
|
833
|
+
* behaviour (stop at `basePolls`), so the launchd widening is scoped strictly to the named slow case.
|
|
834
|
+
*
|
|
835
|
+
* #919 — the base budget (BASE_POLLS×5s = 150s) is also too short for a still-applying git-checkout
|
|
836
|
+
* SYSTEMD target. A git-checkout self-upgrade clones the artifact, installs deps, restarts the
|
|
837
|
+
* orchestrator and re-registers, which legitimately runs up to the relay's own in-flight window
|
|
838
|
+
* (`ORCH_UPGRADE_DEADLINE_MS` = 300s, src/routes/orchestrator.ts) — especially on the co-located
|
|
839
|
+
* control host, where the mid-deploy relay restart briefly drops the target's command long-poll so
|
|
840
|
+
* it picks the upgrade up late. That apply shows NO mismatch-shrink progress for minutes (and, when
|
|
841
|
+
* two commits share a release version, the relay's version-keyed upgrade-state settles uselessly),
|
|
842
|
+
* so the launchd shrink-stall heuristic can't observe it either. So a still-mismatched required
|
|
843
|
+
* remote target on a git-checkout deploy (`artifactPending`) earns the FULL extended budget up to
|
|
844
|
+
* `maxPolls` (MAX_POLLS×5s = 450s, sized to exceed the relay's 300s window plus restart/re-register
|
|
845
|
+
* slack) instead of a premature "reports gitSha <old>, expected <new>" false-failure while it is
|
|
846
|
+
* still legitimately applying. The `maxPolls` hard cap still bounds a genuinely-stuck host.
|
|
847
|
+
*/
|
|
848
|
+
export function shouldContinueAttestationPoll(state: {
|
|
849
|
+
/** Polls completed so far. */
|
|
850
|
+
polls: number;
|
|
851
|
+
/** Minimum polls before a stall can end the loop (the original fixed budget). */
|
|
852
|
+
basePolls: number;
|
|
853
|
+
/** Hard cap — never poll beyond this many, however much progress is being made. */
|
|
854
|
+
maxPolls: number;
|
|
855
|
+
/** A `launchd` (slow-re-attest) target is still mismatched this poll. */
|
|
856
|
+
launchdPending: boolean;
|
|
857
|
+
/**
|
|
858
|
+
* #919: a still-mismatched required remote target on a git-checkout (artifact) deploy — a
|
|
859
|
+
* self-upgrade that clones, installs, restarts and re-registers, legitimately taking up to the
|
|
860
|
+
* relay's ORCH_UPGRADE_DEADLINE_MS window. Earns the full extended budget up to `maxPolls`.
|
|
861
|
+
*/
|
|
862
|
+
artifactPending: boolean;
|
|
863
|
+
/** Consecutive polls since the mismatch count last improved. */
|
|
864
|
+
pollsSinceImprovement: number;
|
|
865
|
+
/** Stop extending after this many no-improvement polls past `basePolls`. */
|
|
866
|
+
stallPolls: number;
|
|
867
|
+
}): boolean {
|
|
868
|
+
if (state.polls >= state.maxPolls) return false;
|
|
869
|
+
if (state.polls < state.basePolls) return true;
|
|
870
|
+
// #919: a git-checkout target still applying earns the full extended budget up to maxPolls —
|
|
871
|
+
// its apply shows no shrink-progress for minutes, so the launchd stall heuristic can't gate it;
|
|
872
|
+
// the maxPolls cap (sized past the relay's own upgrade deadline) is the backstop.
|
|
873
|
+
if (state.artifactPending) return true;
|
|
874
|
+
// Past the base budget: only a still-pending, still-progressing launchd host earns more time.
|
|
875
|
+
if (!state.launchdPending) return false;
|
|
876
|
+
return state.pollsSinceImprovement < state.stallPolls;
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
export type OrchestratorVersionVerification = {
|
|
880
|
+
/** Online (or required) hosts still off the target version — a loud release failure. */
|
|
881
|
+
mismatches: OrchestratorVersion[];
|
|
882
|
+
/** Hosts deliberately not participating in this verification pass — skipped, not a failure. */
|
|
883
|
+
skipped: OrchestratorVersion[];
|
|
884
|
+
};
|
|
885
|
+
|
|
886
|
+
export type OrchestratorVersionVerificationOptions = {
|
|
887
|
+
/**
|
|
888
|
+
* Hosts whose restart is intentionally deferred until after smoke/report.
|
|
889
|
+
* Their pre-restart version is expected to lag during this pass.
|
|
890
|
+
*/
|
|
891
|
+
deferredRestartIds?: string[];
|
|
892
|
+
/**
|
|
893
|
+
* The CD fleet allowlist (#1308): when set, only hosts whose id, current
|
|
894
|
+
* hostname, or label is in this set — plus the explicit `requiredIds` deploy
|
|
895
|
+
* targets and the deferred-local host — are asserted to reach
|
|
896
|
+
* `targetVersion`. An online host that is NOT in the allowlist is skipped, not
|
|
897
|
+
* counted as a mismatch: it was intentionally never a deploy target
|
|
898
|
+
* (fail-closed allowlist, #1303), so leaving it on an old version must not fail
|
|
899
|
+
* the deploy. Omitted on manual deploys, which keep verifying every online
|
|
900
|
+
* host as before.
|
|
901
|
+
*/
|
|
902
|
+
fleetAllowlist?: string[];
|
|
903
|
+
};
|
|
904
|
+
|
|
905
|
+
/**
|
|
906
|
+
* Split the relay's orchestrator list into hosts that must reach `targetVersion`
|
|
907
|
+
* and hosts to skip, given the explicit deploy targets `requiredIds` (#933).
|
|
908
|
+
*
|
|
909
|
+
* Signal: the orchestrator registry has no enabled/disabled flag — the only
|
|
910
|
+
* reachability signal is `status` ("online"/"offline"), set online on heartbeat
|
|
911
|
+
* and flipped to offline by the relay's staleness sweep. A disabled host stops
|
|
912
|
+
* heartbeating, so it reads as offline. So:
|
|
913
|
+
* - `status === "offline"` AND not an explicit deploy target → SKIP. A host that
|
|
914
|
+
* deliberately isn't participating (e.g. maclinux) must not fail the release.
|
|
915
|
+
* - everything else (online hosts, and required deploy targets regardless of
|
|
916
|
+
* reported status) → still verified. An online host stuck on the old version,
|
|
917
|
+
* or a required target that's missing/lagging, is a genuine failure and stays
|
|
918
|
+
* loud — no regression in real-failure detection.
|
|
919
|
+
*
|
|
920
|
+
* #1308: when `opts.fleetAllowlist` is set (the autonomous CD path), a host
|
|
921
|
+
* outside that allowlist is also skipped even while online + off-version — it
|
|
922
|
+
* was intentionally never a deploy target (fail-closed allowlist, #1303), so it
|
|
923
|
+
* must not poison the deploy verdict. Required deploy targets stay verified.
|
|
924
|
+
*/
|
|
925
|
+
export function planOrchestratorVersionVerification(
|
|
926
|
+
orchestrators: OrchestratorVersion[],
|
|
927
|
+
targetVersion: string,
|
|
928
|
+
requiredIds: string[] = [],
|
|
929
|
+
opts: OrchestratorVersionVerificationOptions = {},
|
|
930
|
+
): OrchestratorVersionVerification {
|
|
931
|
+
const required = new Set(requiredIds);
|
|
932
|
+
const deferredRestartIds = new Set(opts.deferredRestartIds ?? []);
|
|
933
|
+
const fleetAllowlist = opts.fleetAllowlist ? new Set(opts.fleetAllowlist) : undefined;
|
|
934
|
+
const byId = new Map(orchestrators.map((orch) => [orch.id, orch]));
|
|
935
|
+
const mismatches: OrchestratorVersion[] = [];
|
|
936
|
+
const skipped: OrchestratorVersion[] = [];
|
|
937
|
+
for (const orch of orchestrators) {
|
|
938
|
+
if (deferredRestartIds.has(orch.id) && !required.has(orch.id)) {
|
|
939
|
+
skipped.push(orch);
|
|
940
|
+
continue;
|
|
941
|
+
}
|
|
942
|
+
// #1308: a host outside the fleet allowlist was never a deploy target — skip
|
|
943
|
+
// it, even when online + off-version, so it can't poison the deploy verdict.
|
|
944
|
+
if (fleetAllowlist && !isCdFleetHostAllowlisted(orch, fleetAllowlist) && !required.has(orch.id)) {
|
|
945
|
+
skipped.push(orch);
|
|
946
|
+
continue;
|
|
947
|
+
}
|
|
948
|
+
if (orch.status === "offline" && !required.has(orch.id)) {
|
|
949
|
+
skipped.push(orch);
|
|
950
|
+
continue;
|
|
951
|
+
}
|
|
952
|
+
if (orch.version !== targetVersion) mismatches.push(orch);
|
|
953
|
+
}
|
|
954
|
+
// A required deploy target absent from the relay list entirely is still a
|
|
955
|
+
// mismatch — after a remote upgrade it should have re-registered.
|
|
956
|
+
for (const id of requiredIds) {
|
|
957
|
+
if (!byId.has(id) && !mismatches.some((orch) => orch.id === id)) {
|
|
958
|
+
mismatches.push({ id });
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
return { mismatches, skipped };
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
/** Back-compat thin wrapper: just the mismatch set (skips are dropped). */
|
|
965
|
+
export function orchestratorVersionMismatches(
|
|
966
|
+
orchestrators: OrchestratorVersion[],
|
|
967
|
+
targetVersion: string,
|
|
968
|
+
requiredIds: string[] = [],
|
|
969
|
+
): OrchestratorVersion[] {
|
|
970
|
+
return planOrchestratorVersionVerification(orchestrators, targetVersion, requiredIds).mismatches;
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
export function resolveReleaseLocalOrchestratorId(
|
|
974
|
+
homeDir: string = process.env.HOME ?? process.env.USERPROFILE ?? homedir(),
|
|
975
|
+
env: Record<string, string | undefined> = process.env,
|
|
976
|
+
): string {
|
|
977
|
+
const configPath = join(homeDir, ".agent-relay", "orchestrator.json");
|
|
978
|
+
let configId: string | undefined;
|
|
979
|
+
if (existsSync(configPath)) {
|
|
980
|
+
try {
|
|
981
|
+
const parsed = JSON.parse(readFileSync(configPath, "utf8")) as { id?: string };
|
|
982
|
+
if (typeof parsed.id === "string") configId = parsed.id;
|
|
983
|
+
} catch {
|
|
984
|
+
// Unparsable config: fall through to env/hostname, matching the runtime.
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
// #1554 — the ONE canonical derivation (config id > env > hostname), same as the orchestrator
|
|
988
|
+
// runtime and resolveLocalOrchestratorId. This must not hand-roll its own variant: the CD
|
|
989
|
+
// reconnect-verification path here compares this id against the id the host actually registered
|
|
990
|
+
// under, and a trailing-whitespace env value (`AGENT_RELAY_ORCHESTRATOR_ID="wbox-1 "`) previously
|
|
991
|
+
// produced "wbox-1 " here but "wbox-1" at registration — a false post-deploy verification failure.
|
|
992
|
+
return deriveOrchestratorId({ configId, envId: relayEnv(env, "AGENT_RELAY_ORCHESTRATOR_ID"), hostname: osHostname() });
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
function orchestratorsUrl(baseUrl: string): string {
|
|
996
|
+
return new URL("/api/orchestrators", baseUrl).toString();
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
async function readJsonBody(res: Response): Promise<unknown> {
|
|
1000
|
+
const text = await res.text().catch(() => "");
|
|
1001
|
+
if (!text) return undefined;
|
|
1002
|
+
try {
|
|
1003
|
+
return JSON.parse(text) as unknown;
|
|
1004
|
+
} catch {
|
|
1005
|
+
return text;
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
function localOrchestratorReconnectOk(
|
|
1010
|
+
orch: ReleaseOrchestrator | undefined,
|
|
1011
|
+
attest: { expectedGitSha?: string; expectedVersion?: string } = {},
|
|
1012
|
+
): boolean {
|
|
1013
|
+
return (
|
|
1014
|
+
!!orch &&
|
|
1015
|
+
orch.status !== "offline" &&
|
|
1016
|
+
orch.health?.restartRequired === false &&
|
|
1017
|
+
(!attest.expectedGitSha || orch.gitSha === attest.expectedGitSha) &&
|
|
1018
|
+
(!attest.expectedVersion || orch.version === attest.expectedVersion)
|
|
1019
|
+
);
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
export async function waitForLocalOrchestratorReconnect(
|
|
1023
|
+
baseUrl: string,
|
|
1024
|
+
localOrchestratorId: string,
|
|
1025
|
+
opts: LocalOrchestratorReconnectOptions = {},
|
|
1026
|
+
): Promise<LocalOrchestratorReconnectResult> {
|
|
1027
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_LOCAL_ORCHESTRATOR_RECONNECT_TIMEOUT_MS;
|
|
1028
|
+
const intervalMs = opts.intervalMs ?? DEFAULT_LOCAL_ORCHESTRATOR_RECONNECT_INTERVAL_MS;
|
|
1029
|
+
const requestTimeoutMs = opts.requestTimeoutMs ?? DEFAULT_HEALTH_REQUEST_TIMEOUT_MS;
|
|
1030
|
+
const fetchImpl = opts.fetch ?? fetch;
|
|
1031
|
+
const sleep = opts.sleep ?? ((ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)));
|
|
1032
|
+
const now = opts.now ?? (() => Date.now());
|
|
1033
|
+
const url = orchestratorsUrl(baseUrl);
|
|
1034
|
+
const started = now();
|
|
1035
|
+
let checks = 0;
|
|
1036
|
+
let last: LocalOrchestratorReconnectSnapshot = { url, error: "orchestrator reconnect check was not attempted" };
|
|
1037
|
+
|
|
1038
|
+
while (now() - started <= timeoutMs) {
|
|
1039
|
+
try {
|
|
1040
|
+
const res = await fetchImpl(url, { headers: opts.headers, signal: AbortSignal.timeout(requestTimeoutMs) });
|
|
1041
|
+
const body = await readJsonBody(res);
|
|
1042
|
+
const orchestrators = Array.isArray(body) ? body as ReleaseOrchestrator[] : [];
|
|
1043
|
+
const local = orchestrators.find((orch) => orch.id === localOrchestratorId);
|
|
1044
|
+
last = {
|
|
1045
|
+
url,
|
|
1046
|
+
httpStatus: res.status,
|
|
1047
|
+
body,
|
|
1048
|
+
seenIds: orchestrators.map((orch) => orch.id),
|
|
1049
|
+
...(local ? { local } : {}),
|
|
1050
|
+
};
|
|
1051
|
+
checks++;
|
|
1052
|
+
if (res.ok && localOrchestratorReconnectOk(local, { expectedGitSha: opts.expectedGitSha, expectedVersion: opts.expectedVersion })) {
|
|
1053
|
+
return { ok: true, localOrchestratorId, checks, last };
|
|
1054
|
+
}
|
|
1055
|
+
} catch (error) {
|
|
1056
|
+
last = { url, error: errMessage(error) };
|
|
1057
|
+
checks++;
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
const elapsed = now() - started;
|
|
1061
|
+
if (elapsed >= timeoutMs) break;
|
|
1062
|
+
await sleep(Math.min(intervalMs, timeoutMs - elapsed));
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
return { ok: false, localOrchestratorId, checks, last };
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
export function formatLocalOrchestratorReconnectSnapshot(snapshot: LocalOrchestratorReconnectSnapshot): string {
|
|
1069
|
+
if (snapshot.error) return `${snapshot.url}: ${snapshot.error}`;
|
|
1070
|
+
const local = snapshot.local;
|
|
1071
|
+
if (!local) {
|
|
1072
|
+
const seen = snapshot.seenIds?.length ? snapshot.seenIds.join(", ") : "none";
|
|
1073
|
+
return `${snapshot.url}: HTTP ${snapshot.httpStatus ?? "unknown"} local orchestrator missing (seen: ${seen})`;
|
|
1074
|
+
}
|
|
1075
|
+
const health = local.health
|
|
1076
|
+
? `${local.health.status ?? "unknown"} restartRequired=${String(local.health.restartRequired)}`
|
|
1077
|
+
: "missing";
|
|
1078
|
+
return `${snapshot.url}: HTTP ${snapshot.httpStatus ?? "unknown"} ${local.id} status=${local.status ?? "unknown"} health=${health}`;
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
export async function waitForLocalOrchestratorReconnectBeforeSmoke(opts: {
|
|
1082
|
+
noSmoke: boolean;
|
|
1083
|
+
relayUrl: string;
|
|
1084
|
+
token: string;
|
|
1085
|
+
localOrchestratorId: string;
|
|
1086
|
+
log: (msg: string) => void;
|
|
1087
|
+
}): Promise<void> {
|
|
1088
|
+
if (opts.noSmoke) return;
|
|
1089
|
+
opts.log(`\n→ waiting for local orchestrator ${opts.localOrchestratorId} to reconnect before smoke …`);
|
|
1090
|
+
const reconnect = await waitForLocalOrchestratorReconnect(opts.relayUrl, opts.localOrchestratorId, {
|
|
1091
|
+
headers: { [RELAY_TOKEN_HEADER]: opts.token },
|
|
1092
|
+
});
|
|
1093
|
+
if (reconnect.ok) {
|
|
1094
|
+
opts.log(`✓ local orchestrator ${opts.localOrchestratorId} reconnected for smoke (${reconnect.checks} checks)`);
|
|
1095
|
+
return;
|
|
1096
|
+
}
|
|
1097
|
+
opts.log(
|
|
1098
|
+
` ⚠ local orchestrator ${opts.localOrchestratorId} did not reconnect after ${reconnect.checks} checks; ` +
|
|
1099
|
+
`running smoke anyway: ${formatLocalOrchestratorReconnectSnapshot(reconnect.last)}`,
|
|
1100
|
+
);
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
/**
|
|
1104
|
+
* Format the host-verification mismatch list. For a git-checkout deploy (#1311),
|
|
1105
|
+
* pass `artifactSha` so the failure reads as the gitSha comparison that actually
|
|
1106
|
+
* failed — `<id>@<gitSha> (expected <artifactSha>)` — instead of a nonsensical
|
|
1107
|
+
* VERSION comparison ("reports 0.129.7 (expected 0.129.7)") where the version
|
|
1108
|
+
* already matches and only the pinned SHA differs.
|
|
1109
|
+
*/
|
|
1110
|
+
export function formatOrchestratorVersionMismatches(
|
|
1111
|
+
mismatches: OrchestratorVersion[],
|
|
1112
|
+
targetVersion: string,
|
|
1113
|
+
opts: { artifactSha?: string } = {},
|
|
1114
|
+
): string {
|
|
1115
|
+
return mismatches.map((orch) => opts.artifactSha
|
|
1116
|
+
? `${orch.id}@${orch.gitSha ?? "missing"} (expected ${opts.artifactSha})`
|
|
1117
|
+
: `${orch.id}@${orch.version ?? "missing"} (expected ${targetVersion})`).join(", ");
|
|
1118
|
+
}
|
|
1119
|
+
|
|
1120
|
+
/** Compare dotted semver-ish strings. Returns true when `a >= b`. */
|
|
1121
|
+
export function semverGte(a: string, b: string): boolean {
|
|
1122
|
+
const pa = a.split(".").map(Number);
|
|
1123
|
+
const pb = b.split(".").map(Number);
|
|
1124
|
+
for (let i = 0; i < 3; i++) {
|
|
1125
|
+
const x = pa[i] ?? 0;
|
|
1126
|
+
const y = pb[i] ?? 0;
|
|
1127
|
+
if (x !== y) return x > y;
|
|
1128
|
+
}
|
|
1129
|
+
return true;
|
|
1130
|
+
}
|
|
1131
|
+
|
|
1132
|
+
/** Extract the first `x.y.z` from `humwick --version` output, or undefined. */
|
|
1133
|
+
export function parseInstalledVersion(out: string): string | undefined {
|
|
1134
|
+
return out.match(/\d+\.\d+\.\d+/)?.[0];
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
/**
|
|
1138
|
+
* Does the *installed* CLI (at `installedVersion`) understand `--restart-deferred`?
|
|
1139
|
+
* Capability probe by version, NOT by error-string guessing. When the version is
|
|
1140
|
+
* unknown we conservatively assume "no" and use `--no-restart` (which every past
|
|
1141
|
+
* release understands) — the services are restarted by release.ts regardless, so
|
|
1142
|
+
* the only cost of being wrong is a cosmetic nag, never a missed restart.
|
|
1143
|
+
*/
|
|
1144
|
+
export function supportsRestartDeferred(installedVersion: string | undefined): boolean {
|
|
1145
|
+
return installedVersion ? semverGte(installedVersion, RESTART_DEFERRED_MIN_VERSION) : false;
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
type UpgradeFailureKind = "unknown-option" | "etarget" | "other";
|
|
1149
|
+
|
|
1150
|
+
/**
|
|
1151
|
+
* Classify why `humwick upgrade <flag>` failed, given its combined out+err.
|
|
1152
|
+
*
|
|
1153
|
+
* - `unknown-option`: the CLI *specifically* rejected the flag we passed
|
|
1154
|
+
* (genuine "predates the flag" — only then is degrading to `--no-restart` valid).
|
|
1155
|
+
* Matched against the exact `Unknown upgrade option "<flag>"` the CLI throws, so
|
|
1156
|
+
* an unrelated failure that merely contains those words elsewhere won't trip it.
|
|
1157
|
+
* - `etarget`: npm replica lag / no-matching-version — transient, retry same flag.
|
|
1158
|
+
* - `other`: anything else — surface it; do NOT degrade the restart flag.
|
|
1159
|
+
*/
|
|
1160
|
+
export function classifyUpgradeFailure(flag: string, combinedOutput: string): UpgradeFailureKind {
|
|
1161
|
+
// Exact-flag match: the CLI throws `Unknown upgrade option "<arg>"` during arg
|
|
1162
|
+
// parsing, before doing any work. Escape regex metachars in the flag.
|
|
1163
|
+
const escaped = flag.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1164
|
+
if (new RegExp(`Unknown upgrade option "${escaped}"`).test(combinedOutput)) return "unknown-option";
|
|
1165
|
+
if (/ETARGET|notarget|No matching version/i.test(combinedOutput)) return "etarget";
|
|
1166
|
+
return "other";
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
export type HealthGateResult = {
|
|
1170
|
+
host: string;
|
|
1171
|
+
ok: boolean;
|
|
1172
|
+
checks: number;
|
|
1173
|
+
consecutiveOk: number;
|
|
1174
|
+
/** #2406 — how many consecutive acceptable probes this gate was asking for, so a failure can say
|
|
1175
|
+
* "ran out of time at 1 of 2" instead of leaving the reader to infer a rejection that never happened. */
|
|
1176
|
+
consecutiveTarget: number;
|
|
1177
|
+
/**
|
|
1178
|
+
* #2406 round 2 — how many probes in the WINDOW were assessed and REJECTED (had blockers). The
|
|
1179
|
+
* whole point is that `lastAssessment` describes one probe, so it cannot answer "did this gate
|
|
1180
|
+
* reject anything?": a window of genuine liveness failures followed by one recovered probe leaves
|
|
1181
|
+
* `lastAssessment.acceptable === true`, and a message inferred from that alone would tell the next
|
|
1182
|
+
* operator nothing was rejected while the database was failing. Counted over the window, so the
|
|
1183
|
+
* claim is made from a window-level fact. Probes that never got an assessment (non-2xx, transport
|
|
1184
|
+
* error) are NOT counted here — unreachable is not rejected, and they are described separately.
|
|
1185
|
+
*/
|
|
1186
|
+
rejectedProbes: number;
|
|
1187
|
+
/** Blockers from the FIRST rejected probe — the earliest real fault the window saw, which is the
|
|
1188
|
+
* one an operator needs; later probes are usually the same fault or its recovery. */
|
|
1189
|
+
firstRejectionBlockers?: string[];
|
|
1190
|
+
last: HealthProbeSnapshot;
|
|
1191
|
+
lastAssessment?: DeploymentHealthAssessment;
|
|
1192
|
+
};
|
|
1193
|
+
|
|
1194
|
+
type FetchLike = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
|
|
1195
|
+
|
|
1196
|
+
export type HealthGateOptions = {
|
|
1197
|
+
timeoutMs?: number;
|
|
1198
|
+
intervalMs?: number;
|
|
1199
|
+
consecutiveOk?: number;
|
|
1200
|
+
requestTimeoutMs?: number;
|
|
1201
|
+
fetch?: FetchLike;
|
|
1202
|
+
sleep?: (ms: number) => Promise<void>;
|
|
1203
|
+
now?: () => number;
|
|
1204
|
+
/** #2672 — accept a probe only from a process that attests this build in the same response. */
|
|
1205
|
+
gitSha?: string;
|
|
1206
|
+
};
|
|
1207
|
+
|
|
1208
|
+
const DEFAULT_HEALTH_GATE_TIMEOUT_MS = 60_000;
|
|
1209
|
+
/**
|
|
1210
|
+
* #2406 — the budget for the ONE health gate that races a restart it just caused: the local relay,
|
|
1211
|
+
* probed immediately after `performLocalRelayRestart`. Every OTHER host reaches its health gate only
|
|
1212
|
+
* after `pollHostVersionMismatches` has already watched it re-attest the new version (150s base, up
|
|
1213
|
+
* to 450s while a slow host is still making progress), so those gates start against a process that is
|
|
1214
|
+
* demonstrably back. The local gate has no such warm-up — its clock starts while the relay is still
|
|
1215
|
+
* booting — and the default 60s was not enough for a hub with a multi-GB database, which cost the
|
|
1216
|
+
* 2026-08-25 f2624db5 deploy its entire first attempt (deploy 19e52959: the last probe in the window
|
|
1217
|
+
* was ACCEPTABLE, just one short of the two-in-a-row target). Same tolerance as everywhere else, a
|
|
1218
|
+
* budget that matches the phase's actual precondition.
|
|
1219
|
+
*/
|
|
1220
|
+
export const LOCAL_RELAY_RESTART_HEALTH_GATE_TIMEOUT_MS = 180_000;
|
|
1221
|
+
const DEFAULT_HEALTH_GATE_INTERVAL_MS = 2_000;
|
|
1222
|
+
const DEFAULT_HEALTH_GATE_CONSECUTIVE_OK = 2;
|
|
1223
|
+
const DEFAULT_HEALTH_REQUEST_TIMEOUT_MS = 5_000;
|
|
1224
|
+
|
|
1225
|
+
function healthUrl(baseUrl: string): string {
|
|
1226
|
+
return new URL("/api/health", baseUrl).toString();
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1229
|
+
async function readHealthBody(res: Response): Promise<unknown> {
|
|
1230
|
+
const text = await res.text().catch(() => "");
|
|
1231
|
+
if (!text) return undefined;
|
|
1232
|
+
try {
|
|
1233
|
+
return JSON.parse(text) as unknown;
|
|
1234
|
+
} catch {
|
|
1235
|
+
return text;
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
|
|
1239
|
+
export function bodyHealthAcceptable(body: unknown): boolean {
|
|
1240
|
+
return assessDeploymentHealth(body).acceptable;
|
|
1241
|
+
}
|
|
1242
|
+
|
|
1243
|
+
async function probeHealth(url: string, fetchImpl: FetchLike, requestTimeoutMs: number): Promise<HealthProbeSnapshot> {
|
|
1244
|
+
try {
|
|
1245
|
+
const res = await fetchImpl(url, { signal: AbortSignal.timeout(requestTimeoutMs) });
|
|
1246
|
+
const body = await readHealthBody(res);
|
|
1247
|
+
return { url, httpStatus: res.status, body };
|
|
1248
|
+
} catch (e) {
|
|
1249
|
+
return { url, error: errMessage(e) };
|
|
1250
|
+
}
|
|
1251
|
+
}
|
|
1252
|
+
|
|
1253
|
+
export async function waitForConsecutiveAcceptableHealth(
|
|
1254
|
+
host: string,
|
|
1255
|
+
baseUrl: string,
|
|
1256
|
+
opts: HealthGateOptions = {},
|
|
1257
|
+
): Promise<HealthGateResult> {
|
|
1258
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_HEALTH_GATE_TIMEOUT_MS;
|
|
1259
|
+
const intervalMs = opts.intervalMs ?? DEFAULT_HEALTH_GATE_INTERVAL_MS;
|
|
1260
|
+
const consecutiveTarget = opts.consecutiveOk ?? DEFAULT_HEALTH_GATE_CONSECUTIVE_OK;
|
|
1261
|
+
const requestTimeoutMs = opts.requestTimeoutMs ?? DEFAULT_HEALTH_REQUEST_TIMEOUT_MS;
|
|
1262
|
+
const fetchImpl = opts.fetch ?? fetch;
|
|
1263
|
+
const sleep = opts.sleep ?? ((ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)));
|
|
1264
|
+
const now = opts.now ?? (() => Date.now());
|
|
1265
|
+
const url = healthUrl(baseUrl);
|
|
1266
|
+
const started = now();
|
|
1267
|
+
let checks = 0;
|
|
1268
|
+
let consecutiveOk = 0;
|
|
1269
|
+
let last: HealthProbeSnapshot = { url, error: "health check was not attempted" };
|
|
1270
|
+
let lastAssessment: DeploymentHealthAssessment | undefined;
|
|
1271
|
+
let rejectedProbes = 0, firstRejectionBlockers: string[] | undefined;
|
|
1272
|
+
|
|
1273
|
+
while (now() - started <= timeoutMs) {
|
|
1274
|
+
last = await probeHealth(url, fetchImpl, requestTimeoutMs);
|
|
1275
|
+
checks++;
|
|
1276
|
+
lastAssessment = last.httpStatus && last.httpStatus >= 200 && last.httpStatus < 300
|
|
1277
|
+
? assessDeploymentHealth(last.body, { gitSha: opts.gitSha })
|
|
1278
|
+
: undefined;
|
|
1279
|
+
if (lastAssessment?.blockers.length) { rejectedProbes++; firstRejectionBlockers ??= lastAssessment.blockers; }
|
|
1280
|
+
if (last.httpStatus && last.httpStatus >= 200 && last.httpStatus < 300 && lastAssessment?.acceptable) {
|
|
1281
|
+
consecutiveOk++;
|
|
1282
|
+
const rejected = firstRejectionBlockers ? { firstRejectionBlockers } : {};
|
|
1283
|
+
if (consecutiveOk >= consecutiveTarget) return { host, ok: true, checks, consecutiveOk, consecutiveTarget, rejectedProbes, ...rejected, last, lastAssessment };
|
|
1284
|
+
} else {
|
|
1285
|
+
consecutiveOk = 0;
|
|
1286
|
+
}
|
|
1287
|
+
|
|
1288
|
+
const elapsed = now() - started;
|
|
1289
|
+
if (elapsed >= timeoutMs) break;
|
|
1290
|
+
await sleep(Math.min(intervalMs, timeoutMs - elapsed));
|
|
1291
|
+
}
|
|
1292
|
+
|
|
1293
|
+
return { host, ok: false, checks, consecutiveOk, consecutiveTarget, rejectedProbes, ...(firstRejectionBlockers ? { firstRejectionBlockers } : {}), last, lastAssessment };
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1296
|
+
export const waitForConsecutiveOkHealth = waitForConsecutiveAcceptableHealth;
|