@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,985 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { relayEnv, writeChildEnv } from "@humwick/sdk/env";
|
|
3
|
+
/**
|
|
4
|
+
* Host-side continuous-deploy trigger (#1275).
|
|
5
|
+
*
|
|
6
|
+
* This deliberately runs on the relay host: GitHub Actions cannot reach the
|
|
7
|
+
* Tailnet relay. It reuses release.ts's deploy-only path, so all existing
|
|
8
|
+
* interlocks, version verification and double health gates remain the deploy
|
|
9
|
+
* authority. A failed child leaves the ledger failed and never stamps Tasks.
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
12
|
+
import { homedir } from "node:os";
|
|
13
|
+
import { join, resolve } from "node:path";
|
|
14
|
+
import { errMessage } from "@humwick/sdk";
|
|
15
|
+
import { gitCheckoutArtifactPaths } from "@humwick/sdk/git-checkout-artifact";
|
|
16
|
+
import type { LandGate } from "@humwick/sdk";
|
|
17
|
+
import { cleanLandGatesConfig, landGateDefinitionsDigest } from "@humwick/sdk/land-gates";
|
|
18
|
+
import { closeDb, currentPendingDeployEvent, DEPLOY_LEASE_MS, type DeployCommit, type DeployEvent, type DeployHost, deployChangesForCommits, deployEventLeaseAt, finishDeployEvent, getDbPath, getDeployEvent, type LandGateAttestationRecord, latestCompleteDeploy, latestSuccessfulDeploy, latestFailedDeployForCommit, listDeployEventsNeedingChanges, listOrchestrators, openExistingDb, persistDeployChangesSummary, reconcilePendingDeployEvent, stampVerifiedTasks, tryBeginDeployEvent } from "../src/db.ts";
|
|
19
|
+
import { type BoundaryDeploymentLookup } from "./cd-land-boundary.ts";
|
|
20
|
+
|
|
21
|
+
// #1902 gateway deferral: this detached CLI deliberately brackets direct ledger
|
|
22
|
+
// access with openExistingDb/closeDb around long synchronous git/release work, so
|
|
23
|
+
// it never pins the live relay WAL across a subprocess. `runCdWatcher` is itself
|
|
24
|
+
// synchronous (its command seam is spawnSync-like), therefore an isolated await
|
|
25
|
+
// would not be safe without redesigning that lifecycle. The live server's routes,
|
|
26
|
+
// MCP, and maintenance transport callers use deploy-events-async.ts instead.
|
|
27
|
+
import { GithubActionsCiProvider, type CiCommandRunner, type CiObservation, type CiWatchDescriptor, commandRunner } from "../src/ci/index.ts";
|
|
28
|
+
import { deployExecutorConfirmedGone } from "../src/deploy-executor.ts";
|
|
29
|
+
import { resolveReleaseLocalOrchestratorId } from "./release-upgrade.ts";
|
|
30
|
+
import { resolveCdRestartEpochTickBudgetMs, CD_WATCHER_INITIATOR, resolveCanonicalRelayDbPath, withDeployLedgerDb, resolveCdFleetAllowlist, resolveCdRepoRoot, shouldRunCdWatcherOnThisHost } from "./cd-config.ts";
|
|
31
|
+
import { ownedRestartEpochDrains, releaseOwnedRestartEpochDrains } from "../src/restart-epoch-deploy-hold.ts";
|
|
32
|
+
import { restartEpochById } from "../src/db/restart-epoch.ts";
|
|
33
|
+
import { holdAndBindCdHostDeploy, planCdHostScopes, relayHostsTurn, upgradeHeldByLand } from "./cd-host-epochs.ts";
|
|
34
|
+
import { cdDeployStampsTasks, completeCdDeployTasks } from "./release-cd-stamp.ts";
|
|
35
|
+
import { isCdFleetHostAllowlisted } from "./cd-fleet-membership.ts";
|
|
36
|
+
import { resolveFleetShaCoverage, type FleetShaCoverage } from "./fleet-sha-coverage.ts";
|
|
37
|
+
import { readServedDashboardSha, resolveDashboardRebuild } from "./dashboard-build-marker.ts";
|
|
38
|
+
import { CD_DEPLOY_WORKTREE_ENV, createCdDeployWorktree, reclaimStaleDeployWorktreesAtTickStart, reclaimStaleDeployWorktreesBeforeDeploy, removeCdDeployWorktree } from "./cd-deploy-worktree-gc.ts";
|
|
39
|
+
import { clearCdDeployDebounceState, decideCdDeployDebounce, readCdDeployDebounceState, resolveCdDeployDebounce, writeCdDeployDebounceState, type CdDeployDebounce } from "./cd-deploy-debounce.ts";
|
|
40
|
+
|
|
41
|
+
export { shouldRunCdWatcherOnThisHost } from "./cd-config.ts";
|
|
42
|
+
export { CD_WATCHER_DEBOUNCE_MS, CD_WATCHER_MAX_DEFER_MS, CD_WATCHER_MIN_INTERVAL_MS, decideCdDeployDebounce, resolveCdDeployDebounce } from "./cd-deploy-debounce.ts";
|
|
43
|
+
|
|
44
|
+
type Command = { code: number; out: string; err: string };
|
|
45
|
+
// The repo's one command seam (spawnSync-shaped, with an optional env overlay) — #2727 needs the
|
|
46
|
+
// env to hand the deploy driver its worktree root. Shared with the CI helpers via this exact type.
|
|
47
|
+
type Run = CiCommandRunner;
|
|
48
|
+
const run: Run = commandRunner;
|
|
49
|
+
export type CdWatcherResult = {
|
|
50
|
+
/** Converged proves the live eligible fleet is healthy; skipped defers without recovery evidence. */
|
|
51
|
+
outcome: "skipped" | "converged" | "deployed" | "failed";
|
|
52
|
+
sha: string | null;
|
|
53
|
+
previousSha: string | null;
|
|
54
|
+
reason: string;
|
|
55
|
+
observation: CiObservation;
|
|
56
|
+
};
|
|
57
|
+
export const CD_WATCHER_FAILURE_BACKOFF_MS = 15 * 60 * 1000;
|
|
58
|
+
|
|
59
|
+
/** The fleet watcher remains a zero-config watch: its existing checkout, gh CLI
|
|
60
|
+
* authentication and inferred GitHub host are the observer defaults. */
|
|
61
|
+
export function cdCiWatch(root: string): CiWatchDescriptor {
|
|
62
|
+
return { provider: "github-actions", repository: root, workingDirectory: root, branch: "main", workflow: "ci.yml", jobs: ["deploy-checks"], observer: {} };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function observeMainCi(runCommand: Run, root: string, observedAt = Date.now(), _boundaryLookup?: BoundaryDeploymentLookup): CiObservation {
|
|
66
|
+
const watch = cdCiWatch(root);
|
|
67
|
+
// #1770 blocker 1 — fetch the release tags alongside main. cd-watcher's dedicated detection clone
|
|
68
|
+
// only ever fetched `main`; a branch refspec does NOT auto-follow tags (git 2.43), so
|
|
69
|
+
// `git tag --points-at` in isReleaseTagValidated always returned "" and the tag-on-green accept
|
|
70
|
+
// path was dead code. The explicit `refs/tags/*` refspec makes the vX.Y.Z release tag visible so
|
|
71
|
+
// the forward-deploy path can actually run instead of collapsing onto the no-downgrade guard.
|
|
72
|
+
//
|
|
73
|
+
// #1770 round 3, blocker F1 — the refspec MUST be forced (`+`). A rewritten/force-moved/
|
|
74
|
+
// deleted-and-recut `vX.Y.Z` tag makes an unforced `refs/tags/*:refs/tags/*` update print
|
|
75
|
+
// `! [rejected] ... (would clobber existing tag)` and the whole `git fetch` exits non-zero, even
|
|
76
|
+
// though the `main` branch update in the same fetch succeeded. That throws below, uncaught, out of
|
|
77
|
+
// runCdWatcher — wedging every future tick (no deploys, no CI red/green alerting) until someone
|
|
78
|
+
// hand-deletes the stale local tag. Forcing tag updates makes them always fast-forward locally, so
|
|
79
|
+
// a divergent origin-side tag can never block the fetch (empirically verified: unforced exits 1 on
|
|
80
|
+
// a clobbering tag, `+`-forced exits 0 and just overwrites the local tag object).
|
|
81
|
+
const fetch = runCommand("git", ["fetch", "origin", watch.branch, "+refs/tags/*:refs/tags/*"], root);
|
|
82
|
+
if (fetch.code !== 0) {
|
|
83
|
+
throw new Error(`git fetch origin ${watch.branch} failed: ${fetch.err || fetch.out || `exit ${fetch.code}`}`);
|
|
84
|
+
}
|
|
85
|
+
const sha = runCommand("git", ["rev-parse", `origin/${watch.branch}`], root).out;
|
|
86
|
+
if (!/^[0-9a-f]{40}$/i.test(sha)) throw new Error(`origin/${watch.branch} did not resolve to a SHA: ${sha || "empty"}`);
|
|
87
|
+
return new GithubActionsCiProvider(runCommand).observe({ watch, headSha: sha, observedAt });
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const RELEASE_TAG_PATTERN = /^v\d+\.\d+\.\d+$/;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* #1770 — Accept a release's tag-on-green as a deployable signal.
|
|
94
|
+
*
|
|
95
|
+
* `bun run release` pushes the `vX.Y.Z` version-bump commit straight to origin/main; `ci.yml`
|
|
96
|
+
* never runs on that push (the ci-tag job pushes main with GITHUB_TOKEN, which fires no
|
|
97
|
+
* workflows), so observeMainCi sees the bump commit as missing/pending and the CI walk-back
|
|
98
|
+
* below would otherwise fall to the prior green ancestor and REVERT the release. But the tree
|
|
99
|
+
* that becomes the bump commit was validated by release.yml's tag-on-green job (`ci-tag`), which
|
|
100
|
+
* runs the full suite once on the dispatch SOURCE and only then bumps + tags + pushes.
|
|
101
|
+
*
|
|
102
|
+
* #1770 should-fix 3 — validate the tag against a green release.yml run in its ancestry rather than
|
|
103
|
+
* inferring "dispatch source == first parent" from topology: `pushReleaseWithRebaseRetry` rebases
|
|
104
|
+
* the bump commit when main moves between dispatch and push, so the first parent is no longer the
|
|
105
|
+
* validated source (false-negative), and a busy main could make the new tip a prior release's
|
|
106
|
+
* source (false-positive). Instead, read the latest SUCCESSFUL release.yml run's head_sha — the
|
|
107
|
+
* source it validated — and confirm that source is an ancestor of (the bump commit is built on top
|
|
108
|
+
* of it, directly or via the rebased-onto main tip). A random tag whose commit does not descend from
|
|
109
|
+
* a green release run is rejected.
|
|
110
|
+
*
|
|
111
|
+
* #1770 round 3, F3 — this is deliberately NOT "the tag's own run": `gh run list` above filters to
|
|
112
|
+
* COMPLETED runs, and during a live release the run that is about to produce and push THIS tag is
|
|
113
|
+
* still `in_progress` (ci-tag pushes the bump commit only after the suite passes, but the workflow
|
|
114
|
+
* run itself doesn't finish until later). So this reads the latest run that had ALREADY completed —
|
|
115
|
+
* ordinarily the PREVIOUS release's dispatch — and merely confirms the bump commit descends from
|
|
116
|
+
* that prior green source. That is exactly what the ancestor check needs (the tree was validated
|
|
117
|
+
* somewhere in this release's lineage), just not the tag's own in-flight run.
|
|
118
|
+
*
|
|
119
|
+
* Best-effort: any git/gh failure (missing tag, gh/auth error, no green release run) returns false,
|
|
120
|
+
* leaving the existing ci.yml path — and the no-downgrade guard — unchanged.
|
|
121
|
+
*/
|
|
122
|
+
export function isReleaseTagValidated(runCommand: Run, root: string, sha: string): boolean {
|
|
123
|
+
const tags = runCommand("git", ["tag", "--points-at", sha], root);
|
|
124
|
+
if (tags.code !== 0) return false;
|
|
125
|
+
if (!tags.out.split("\n").some((tag) => RELEASE_TAG_PATTERN.test(tag.trim()))) return false;
|
|
126
|
+
// The head_sha of the latest successful workflow_dispatch release run is the source that job ran
|
|
127
|
+
// the full suite against before committing + tagging this release on top of it.
|
|
128
|
+
const runSource = runCommand("gh", [
|
|
129
|
+
"api", "repos/{owner}/{repo}/actions/workflows/release.yml/runs",
|
|
130
|
+
"--jq", '[.workflow_runs[] | select(.event == "workflow_dispatch" and .status == "completed" and .conclusion == "success")][0].head_sha // ""',
|
|
131
|
+
], root);
|
|
132
|
+
const source = runSource.out.trim();
|
|
133
|
+
if (runSource.code !== 0 || !/^[0-9a-f]{40}$/i.test(source)) return false;
|
|
134
|
+
// The validated source must be an ancestor of (or equal to) the commit this release tag points at.
|
|
135
|
+
return runCommand("git", ["merge-base", "--is-ancestor", source, sha], root).code === 0;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Resolve one attestation row for an exact tree oid. Injected so the DB lifecycle stays owned by
|
|
139
|
+
* `runCdWatcher` (#1765: no connection may be held across the multi-second `git fetch`). */
|
|
140
|
+
export type LandGateAttestationLookup = (treeSha: string) => LandGateAttestationRecord | null;
|
|
141
|
+
|
|
142
|
+
export type LandGateAttestationVerdict =
|
|
143
|
+
| { attested: true; treeSha: string; gateNames: string[] }
|
|
144
|
+
| { attested: false; reason: string };
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* #1744 / Phase −1 F1 — accept the LAND gate's green run as the deploy signal for a tree.
|
|
148
|
+
*
|
|
149
|
+
* `bun run ci` IS `bun run ci:land`: the workflow ci.yml runs on every main push is the same step
|
|
150
|
+
* list the land gate already ran (the land gate is in fact a strict superset — it forces
|
|
151
|
+
* AGENT_RELAY_CI_LAND_FULL=1, which disables ci:land's path-aware step skipping). Waiting ~17 min
|
|
152
|
+
* for that second run before deploying buys nothing when the tree is byte-identical; it was the
|
|
153
|
+
* dominant term in a ≈31-minute land→fleet.
|
|
154
|
+
*
|
|
155
|
+
* The safety argument is entirely in the KEY. `treeSha` is git's content address for the whole
|
|
156
|
+
* worktree, so a matching row means the bytes about to be deployed are the exact bytes the full
|
|
157
|
+
* gate executed against — no commit-graph, timestamp, author or message can differ into it, and a
|
|
158
|
+
* rebase/squash/amend that changes one byte simply has no row. Everything else here is fail-CLOSED:
|
|
159
|
+
* an unresolvable tree, an absent row, an unreadable or malformed gate config, a gate config that
|
|
160
|
+
* declares a required gate the attestation does not name (a branch that ADDS a gate is judged by the
|
|
161
|
+
* BASE's list, so the new one genuinely never ran on this tree) — each returns `attested: false`,
|
|
162
|
+
* which leaves the caller on the pre-existing "wait for a green ci.yml" path.
|
|
163
|
+
*/
|
|
164
|
+
export function isLandGateAttested(runCommand: Run, root: string, sha: string, lookup: LandGateAttestationLookup): LandGateAttestationVerdict {
|
|
165
|
+
const tree = runCommand("git", ["rev-parse", `${sha}^{tree}`], root);
|
|
166
|
+
const treeSha = tree.out.trim().toLowerCase();
|
|
167
|
+
if (tree.code !== 0 || !/^[0-9a-f]{40}$/.test(treeSha)) return { attested: false, reason: `could not resolve the tree of ${shortSha(sha)}` };
|
|
168
|
+
|
|
169
|
+
let record: LandGateAttestationRecord | null;
|
|
170
|
+
try {
|
|
171
|
+
record = lookup(treeSha);
|
|
172
|
+
} catch (error) {
|
|
173
|
+
return { attested: false, reason: `land-gate attestation lookup failed: ${errMessage(error)}` };
|
|
174
|
+
}
|
|
175
|
+
if (!record) return { attested: false, reason: `no land-gate attestation for tree ${treeSha.slice(0, 12)}` };
|
|
176
|
+
if (record.level !== "full" || record.gatesRan <= 0) return { attested: false, reason: `land-gate attestation for tree ${treeSha.slice(0, 12)} is not a full gate run` };
|
|
177
|
+
// #3362 — a partial (affected-only) land gate is not coverage evidence; main CI must judge the tree.
|
|
178
|
+
if ((record.suiteCoverage ?? "full") !== "full") return { attested: false, reason: `land-gate attestation for tree ${treeSha.slice(0, 12)} covers only part of the suite` };
|
|
179
|
+
|
|
180
|
+
// The requirement is read from the LANDED tree, not from the attestation: the attestation states
|
|
181
|
+
// what ran, the tree states what this repo requires, and only the tree's own requirement can
|
|
182
|
+
// decide whether "what ran" was enough. Reading it from the deployable tree makes an added gate
|
|
183
|
+
// fail closed instead of being silently inherited from an older config.
|
|
184
|
+
//
|
|
185
|
+
// And the comparison is over DEFINITIONS, not names. The gates that ran came from the BASE ref's
|
|
186
|
+
// config (a branch must not weaken the gate that judges it), so a branch can keep a required
|
|
187
|
+
// gate's NAME and swap its `command`: the base's strong command runs, the names still line up,
|
|
188
|
+
// and a name-only check would hand this tree a strong-suite attestation while the gate that
|
|
189
|
+
// judges every FUTURE land is now the weak one. `landGateDefinitionsDigest` covers name, command,
|
|
190
|
+
// cwd and timeout, so any such edit is a mismatch and cd-watcher waits for ci.yml instead.
|
|
191
|
+
const required = requiredLandGates(runCommand, root, sha);
|
|
192
|
+
if (!required) return { attested: false, reason: `could not read ${LAND_GATES_CONFIG_PATH} at ${shortSha(sha)}` };
|
|
193
|
+
if (required.length === 0) return { attested: false, reason: `${LAND_GATES_CONFIG_PATH} at ${shortSha(sha)} declares no required gates` };
|
|
194
|
+
const landedDigest = landGateDefinitionsDigest(required);
|
|
195
|
+
if (record.gatesDigest !== landedDigest) {
|
|
196
|
+
return {
|
|
197
|
+
attested: false,
|
|
198
|
+
reason: `land-gate attestation for tree ${treeSha.slice(0, 12)} covers gate set ${(record.gatesDigest || "(none)").slice(0, 12)} [${record.gateNames.join(", ")}] but ${shortSha(sha)} requires ${landedDigest.slice(0, 12)} [${required.map((g) => g.name).join(", ")}]`,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
return { attested: true, treeSha, gateNames: record.gateNames };
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const LAND_GATES_CONFIG_PATH = ".agent-relay/land-gates.json";
|
|
205
|
+
|
|
206
|
+
/** The NON-optional gate DEFINITIONS the given tree declares, via the SAME validator the land-gate
|
|
207
|
+
* runner resolves its list with (`cleanLandGatesConfig`) — a second, looser parser here could
|
|
208
|
+
* disagree about what "required" means or normalize `cwd` differently, and either disagreement
|
|
209
|
+
* breaks the digest comparison in one direction or the other. `undefined` (not `[]`) when the
|
|
210
|
+
* config cannot be read or does not validate: the caller must treat an unknown requirement as
|
|
211
|
+
* unattestable, never as no requirement. */
|
|
212
|
+
function requiredLandGates(runCommand: Run, root: string, sha: string): LandGate[] | undefined {
|
|
213
|
+
const shown = runCommand("git", ["show", `${sha}:${LAND_GATES_CONFIG_PATH}`], root);
|
|
214
|
+
if (shown.code !== 0 || !shown.out.trim()) return undefined;
|
|
215
|
+
try {
|
|
216
|
+
return cleanLandGatesConfig(JSON.parse(shown.out), root).filter((gate) => !gate.optional);
|
|
217
|
+
} catch {
|
|
218
|
+
return undefined;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* #1770 — No-downgrade guard. Returns the currently-deployed SHA that `candidate` is a strict
|
|
224
|
+
* ANCESTOR of (⇒ deploying `candidate` would roll that host BACKWARD), or undefined when the
|
|
225
|
+
* candidate moves every deployed SHA forward or sideways. Equal SHAs are a no-op, not a downgrade.
|
|
226
|
+
*
|
|
227
|
+
* This is the safety invariant behind #1770: `latestSuccessfulDeploy()` (the ledger) can lag the
|
|
228
|
+
* live fleet — `bun run release` deploys the bump commit directly without a cd-watcher ledger row —
|
|
229
|
+
* so the CI walk-back can pick a green ANCESTOR of what the fleet already runs and revert the
|
|
230
|
+
* release. Comparing the candidate against the live process-attested fleet SHAs makes that
|
|
231
|
+
* structurally impossible regardless of any CI-signal gap. A `merge-base` error (e.g. an object not
|
|
232
|
+
* yet fetched) is treated as "not an ancestor" — the guard never blocks on incomplete information.
|
|
233
|
+
*
|
|
234
|
+
* #1770 should-fix 5 — only a deployed SHA that is itself reachable from origin/main can represent
|
|
235
|
+
* a real backward move on the release line. A sideways/stale attestation (an object that is not an
|
|
236
|
+
* ancestor of origin/main) is ignored so it cannot wedge CD by making the guard refuse every
|
|
237
|
+
* forward deploy.
|
|
238
|
+
*/
|
|
239
|
+
export function findDowngradeTarget(runCommand: Run, root: string, candidate: string, deployedShas: Iterable<string>): string | undefined {
|
|
240
|
+
const checked = new Set<string>();
|
|
241
|
+
for (const deployed of deployedShas) {
|
|
242
|
+
if (!deployed || deployed === candidate || checked.has(deployed)) continue;
|
|
243
|
+
checked.add(deployed);
|
|
244
|
+
if (runCommand("git", ["merge-base", "--is-ancestor", deployed, "origin/main"], root).code !== 0) continue;
|
|
245
|
+
if (runCommand("git", ["merge-base", "--is-ancestor", candidate, deployed], root).code === 0) return deployed;
|
|
246
|
+
}
|
|
247
|
+
return undefined;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Select the newest green main SHA after the last successful deploy without
|
|
252
|
+
* letting a known-red later commit be silently skipped. Pending/cancelled
|
|
253
|
+
* successors are safe to leave for a later deploy; a completed failure is not.
|
|
254
|
+
*/
|
|
255
|
+
export function selectDeployableMainCi(runCommand: Run, root: string, previousSha: string | undefined, observedAt = Date.now(), _attestationLookup?: LandGateAttestationLookup,
|
|
256
|
+
_boundaryLookup: BoundaryDeploymentLookup = () => null): { sha?: string; observation: CiObservation; reason?: string } {
|
|
257
|
+
const observation = observeMainCi(runCommand, root, observedAt);
|
|
258
|
+
// #3362 §11: neither a land attestation nor a historical boundary verdict proves this job ran.
|
|
259
|
+
if (observation.status === "green") return { sha: observation.headSha, observation };
|
|
260
|
+
if ((observation.status === "missing" || observation.status === "pending")
|
|
261
|
+
&& isReleaseTagValidated(runCommand, root, observation.headSha)) {
|
|
262
|
+
return { sha: observation.headSha, observation };
|
|
263
|
+
}
|
|
264
|
+
// The first deployment retains the existing tip-only rule: without a durable
|
|
265
|
+
// lower bound, walking the entire repository history is neither bounded nor useful.
|
|
266
|
+
if (!previousSha) return { observation };
|
|
267
|
+
if (runCommand("git", ["merge-base", "--is-ancestor", previousSha, "origin/main"], root).code !== 0) {
|
|
268
|
+
return { observation, reason: "Last successful deploy SHA is not an ancestor of origin/main; refusing historical CI fallback." };
|
|
269
|
+
}
|
|
270
|
+
const commits = runCommand("git", ["rev-list", "--first-parent", "origin/main", `^${previousSha}`], root);
|
|
271
|
+
if (commits.code !== 0) throw new Error(`could not list main commits since the last deploy: ${commits.err || commits.out}`);
|
|
272
|
+
|
|
273
|
+
let newerFailure: string | undefined;
|
|
274
|
+
for (const sha of commits.out.split("\n").filter((value) => /^[0-9a-f]{40}$/i.test(value))) {
|
|
275
|
+
const candidate = sha === observation.headSha
|
|
276
|
+
? observation
|
|
277
|
+
: new GithubActionsCiProvider(runCommand).observe({ watch: cdCiWatch(root), headSha: sha, observedAt });
|
|
278
|
+
if (candidate.status === "green") {
|
|
279
|
+
if (newerFailure) {
|
|
280
|
+
return {
|
|
281
|
+
observation,
|
|
282
|
+
reason: `A newer origin/main SHA (${shortSha(newerFailure)}) failed CI; waiting for a newer green SHA.`,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
return { sha, observation };
|
|
286
|
+
}
|
|
287
|
+
if (!newerFailure && candidate.status === "failing") newerFailure = sha;
|
|
288
|
+
}
|
|
289
|
+
return { observation };
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
export function greenMainSha(runCommand: Run, root: string): string | undefined {
|
|
293
|
+
const observation = observeMainCi(runCommand, root);
|
|
294
|
+
return observation.status === "green" ? observation.headSha : undefined;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
export function commitsInDeployRange(runCommand: Run, root: string, previousSha: string | undefined, sha: string): string[] {
|
|
298
|
+
return changesInDeployRange(runCommand, root, previousSha, sha).map((commit) => commit.sha);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* #1947 — Is this repo path guaranteed to be OUTSIDE the deployed runtime surface?
|
|
303
|
+
*
|
|
304
|
+
* The set is intentionally a small, explicit allowlist of things the running system never imports:
|
|
305
|
+
* documentation and design artifacts (anything under `docs/`, plus any Markdown file anywhere —
|
|
306
|
+
* README/CONTRIBUTING/design docs) and test-only sources (`*.test.*` / `*.spec.*`, which covers
|
|
307
|
+
* `*.integration.test.ts`). EVERYTHING ELSE — source, scripts, configs, lockfiles, unrecognized
|
|
308
|
+
* paths — is treated as deployed, so it can only ever FORCE a deploy, never suppress one. That is the
|
|
309
|
+
* fail-safe direction #1947 requires: a path we are not certain about is a deployed path.
|
|
310
|
+
*/
|
|
311
|
+
export function isNonDeployedPath(path: string): boolean {
|
|
312
|
+
const p = path.trim();
|
|
313
|
+
if (!p) return false; // an empty/unparseable entry counts as deployed → forces a deploy
|
|
314
|
+
if (p.startsWith("docs/")) return true; // documentation + design artifacts
|
|
315
|
+
if (/\.md$/i.test(p)) return true; // Markdown anywhere (README, CONTRIBUTING, design docs)
|
|
316
|
+
if (/(^|\/)[^/]+\.(test|spec)\.(ts|tsx|js|jsx|mjs|cjs)$/i.test(p)) return true; // tests-only
|
|
317
|
+
return false;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
export type DeployRangePathScope =
|
|
321
|
+
| { deploy: true; reason: string }
|
|
322
|
+
| { deploy: false; nonDeployedPaths: string[] };
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* #1947 — Decide whether the `previousSha..sha` range can SKIP the fleet redeploy because every file
|
|
326
|
+
* it changes is outside the deployed surface (see `isNonDeployedPath`).
|
|
327
|
+
*
|
|
328
|
+
* FAIL-SAFE = DEPLOY. This returns `{ deploy: true }` on every uncertain signal: a git failure or
|
|
329
|
+
* throw (change detection unavailable), an empty file list (an ambiguous range — never a proof that
|
|
330
|
+
* nothing deployable changed), or a single path outside the known non-deployed allowlist. Only a
|
|
331
|
+
* non-empty diff in which EVERY file is provably non-deployed returns `{ deploy: false }`. Uses a
|
|
332
|
+
* net `git diff A B` (a file changed then reverted within the range nets out — the deployed bytes are
|
|
333
|
+
* identical, so skipping is correct) and `--no-renames` so a rename surfaces both its old and new
|
|
334
|
+
* paths, making the classification strictly more likely to see a deployed path.
|
|
335
|
+
*/
|
|
336
|
+
export function classifyDeployRangePaths(runCommand: Run, root: string, previousSha: string, sha: string): DeployRangePathScope {
|
|
337
|
+
let result: Command;
|
|
338
|
+
try {
|
|
339
|
+
result = runCommand("git", ["diff", "--name-only", "-z", "--no-renames", previousSha, sha], root);
|
|
340
|
+
} catch (error) {
|
|
341
|
+
return { deploy: true, reason: `change detection unavailable (git diff threw: ${errMessage(error)})` };
|
|
342
|
+
}
|
|
343
|
+
if (result.code !== 0) return { deploy: true, reason: `change detection unavailable (git diff exit ${result.code}: ${result.err || result.out})` };
|
|
344
|
+
const files = result.out.split("\0").map((file) => file.trim()).filter(Boolean);
|
|
345
|
+
if (files.length === 0) return { deploy: true, reason: `no files reported for ${previousSha}..${sha}; deploying` };
|
|
346
|
+
const deployed = files.filter((file) => !isNonDeployedPath(file));
|
|
347
|
+
if (deployed.length > 0) {
|
|
348
|
+
return { deploy: true, reason: `range touches ${deployed.length} deployed path(s) (e.g. ${deployed.slice(0, 3).join(", ")})` };
|
|
349
|
+
}
|
|
350
|
+
return { deploy: false, nonDeployedPaths: files };
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Ordered deploy range from one NUL-delimited `git log`. The first deploy keeps
|
|
355
|
+
* the historic tip-only behavior: it asks git for exactly the deploy SHA, not
|
|
356
|
+
* its entire ancestry.
|
|
357
|
+
*/
|
|
358
|
+
export function changesInDeployRange(runCommand: Run, root: string, previousSha: string | undefined, sha: string): DeployCommit[] {
|
|
359
|
+
// With no prior successful deploy, `git rev-list <sha>` means all history and
|
|
360
|
+
// corrupts lead-time metrics. The validated tip is the only safe first range.
|
|
361
|
+
const range = previousSha ? `${previousSha}..${sha}` : sha;
|
|
362
|
+
const args = previousSha
|
|
363
|
+
? ["log", "--reverse", "-z", "--format=%H%x00%s", range]
|
|
364
|
+
: ["log", "-1", "-z", "--format=%H%x00%s", sha];
|
|
365
|
+
const result = runCommand("git", args, root);
|
|
366
|
+
if (result.code !== 0) throw new Error(`could not list commits in ${range}: ${result.err || result.out}`);
|
|
367
|
+
const parts = result.out.split("\0");
|
|
368
|
+
const changes: DeployCommit[] = [];
|
|
369
|
+
for (let i = 0; i + 1 < parts.length; i += 2) {
|
|
370
|
+
const commitSha = parts[i]!;
|
|
371
|
+
if (!/^[0-9a-f]{40}$/i.test(commitSha)) continue;
|
|
372
|
+
changes.push({ sha: commitSha, subject: parts[i + 1]! });
|
|
373
|
+
}
|
|
374
|
+
return changes;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/** Git artifacts are the CD default; npm remains the explicit emergency fallback. */
|
|
378
|
+
export function cdDeployArgs(sha: string, mode = relayEnv(process.env, "AGENT_RELAY_CD_ARTIFACT_MODE") ?? "git-checkout", deployEventId?: string, targetHostIds?: string[]): string[] {
|
|
379
|
+
if (mode !== "git-checkout" && mode !== "npm-reuse") throw new Error(`invalid CD artifact mode "${mode}"`);
|
|
380
|
+
const args = mode === "git-checkout"
|
|
381
|
+
? ["run", "scripts/release.ts", "--deploy-only", "--no-smoke", "--artifact", "git-checkout", "--commit", sha]
|
|
382
|
+
: ["run", "scripts/release.ts", "--deploy-only", "--no-smoke", "--artifact", "npm-reuse"];
|
|
383
|
+
return [
|
|
384
|
+
...args,
|
|
385
|
+
...(deployEventId ? ["--deploy-event", deployEventId] : []),
|
|
386
|
+
...(targetHostIds?.length ? ["--cd-targets", targetHostIds.join(",")] : []),
|
|
387
|
+
];
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/** Best-effort `liveIn` label for the deployed SHA — the deployed worktree's own version,
|
|
391
|
+
* falling back to the SHA itself if the checkout is unreadable for any reason. */
|
|
392
|
+
export function resolveDeployedVersion(worktree: string, sha: string): string {
|
|
393
|
+
try {
|
|
394
|
+
const pkg = JSON.parse(readFileSync(join(worktree, "package.json"), "utf8")) as { version?: string };
|
|
395
|
+
return typeof pkg.version === "string" && pkg.version ? pkg.version : sha;
|
|
396
|
+
} catch {
|
|
397
|
+
return sha;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* #1770 round 3, F2 — best-effort package.json version AT `sha`, read directly from the
|
|
403
|
+
* already-fetched git objects (no worktree checkout needed — none exists yet for the candidate at
|
|
404
|
+
* this point in the tick). `resolveFleetShaCoverage`'s `targetVersion` option is the #1457 escape
|
|
405
|
+
* hatch that recognizes an npm-runtime host (which can only ever report a running `version`, never
|
|
406
|
+
* a `gitSha`) as covered once it matches the candidate's own version. Without this, that host sits
|
|
407
|
+
* in `coverage.unattested` forever and the fail-closed guard below can never clear for it — and
|
|
408
|
+
* npm-runtime hosts are the fleet MAJORITY (#1774).
|
|
409
|
+
*
|
|
410
|
+
* Best-effort like resolveDeployedVersion: any git/parse failure (unreadable object, malformed
|
|
411
|
+
* JSON, or a test double that doesn't stub `show`) returns undefined, reproducing the guard's prior
|
|
412
|
+
* (safe, if stricter) behavior — it never blocks or throws on a version lookup it couldn't make.
|
|
413
|
+
*/
|
|
414
|
+
export function resolveVersionAtSha(runCommand: Run, root: string, sha: string): string | undefined {
|
|
415
|
+
try {
|
|
416
|
+
const show = runCommand("git", ["show", `${sha}:package.json`], root);
|
|
417
|
+
if (show.code !== 0) return undefined;
|
|
418
|
+
const pkg = JSON.parse(show.out) as { version?: string };
|
|
419
|
+
return typeof pkg.version === "string" && pkg.version ? pkg.version : undefined;
|
|
420
|
+
} catch {
|
|
421
|
+
return undefined;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
function shortSha(sha: string | undefined): string | null {
|
|
426
|
+
return sha?.slice(0, 7) ?? null;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* #1532 — self-heal a stranded `pending` fleet-lease row to its TERMINAL TRUTH, BEFORE the
|
|
431
|
+
* coverage short-circuit below returns early on an already-converged fleet (which is exactly
|
|
432
|
+
* how the orphaned-pending row `3dedd68a` stayed RED for 7h+: the >2h reclaim lived only inside
|
|
433
|
+
* tryBeginDeployEvent, past that return). Runs every tick — including the maintenance
|
|
434
|
+
* scheduler's `runOnStart` boot fire, which is the "survivor reconciles the killed driver's row
|
|
435
|
+
* on boot" half of the fix (#1532 fix #3): the co-located driver on the CD control host is
|
|
436
|
+
* SIGTERM-killed by the very relay restart it triggers, so the restarted daemon's first
|
|
437
|
+
* cd-watcher tick writes the terminal state the driver could not.
|
|
438
|
+
*
|
|
439
|
+
* Truth comes from the SAME live attestation resolveFleetShaCoverage uses, against the STUCK
|
|
440
|
+
* row's own target sha (never the current green tip):
|
|
441
|
+
* - fleet genuinely attests it → `succeeded` (real attestation; no lease wait — a converged
|
|
442
|
+
* fleet means the deploy is done however the driver died).
|
|
443
|
+
* - #2105: else, if the DRIVER PROCESS that claimed the row is CONFIRMED gone → `failed` in
|
|
444
|
+
* minutes, without waiting out the lease. This is the liveness half #1532 lacked: the 2h TTL
|
|
445
|
+
* below is a timer, and a timer cannot tell a dead owner from a slow one, so an all-hosts deploy
|
|
446
|
+
* whose driver died in the gap left by the relay restart IT triggered held the fleet lease — and
|
|
447
|
+
* blocked every later green sha — for the full 2h. Strictly ordered AFTER the attestation check
|
|
448
|
+
* so a deploy that actually shipped is recorded `succeeded`, never raced to `failed`.
|
|
449
|
+
* - otherwise, only once the lease has expired (owner provably dead, not merely slow) → `failed`.
|
|
450
|
+
*
|
|
451
|
+
* Idempotent + race-safe via reconcilePendingDeployEvent's single gated UPDATE. Returns the
|
|
452
|
+
* finalized event, or null when there is nothing (yet) to reconcile.
|
|
453
|
+
*/
|
|
454
|
+
/**
|
|
455
|
+
* #2407 — project live fleet attestation onto the deploy row's own per-host bookkeeping.
|
|
456
|
+
*
|
|
457
|
+
* A deploy row is OPENED with every target host at `pending`; the deploy driver (release.ts) is what
|
|
458
|
+
* normally rewrites those entries as each host is verified. On the autonomous CD path that driver is
|
|
459
|
+
* SIGTERM-killed by the very relay restart it triggers, so the self-heal below is the only writer the
|
|
460
|
+
* row ever gets — and it used to append a single synthetic `fleet` entry while leaving every real
|
|
461
|
+
* host at `pending`. The result on the live ledger: `succeeded` deploys whose hosts all still read
|
|
462
|
+
* `pending`, which is precisely what #2407 reports as "the record is not finalized".
|
|
463
|
+
*
|
|
464
|
+
* The truth used here is the SAME coverage that decided `succeeded`, so nothing is inferred:
|
|
465
|
+
* - a host in `covered` attests the target sha itself → `upgraded`;
|
|
466
|
+
* - a host in `versionCovered` (#1457: no gitSha, but the target RELEASE version) → `upgraded` with
|
|
467
|
+
* the weaker evidence spelled out in its reason, never silently conflated with a sha attestation;
|
|
468
|
+
* - anything else is left EXACTLY as the row had it. Absence of attestation is not a status.
|
|
469
|
+
*/
|
|
470
|
+
export function attestedDeployHostStatuses(hosts: DeployHost[], coverage: FleetShaCoverage): DeployHost[] {
|
|
471
|
+
const covered = new Map(coverage.covered.map((host) => [host.id, host]));
|
|
472
|
+
const versionCovered = new Map(coverage.versionCovered.map((host) => [host.id, host]));
|
|
473
|
+
return hosts.map((host) => {
|
|
474
|
+
const shaAttested = covered.get(host.id);
|
|
475
|
+
if (shaAttested) {
|
|
476
|
+
return { ...host, status: "upgraded", ...(shaAttested.version ? { toVersion: shaAttested.version } : {}),
|
|
477
|
+
reason: "attests the target sha" };
|
|
478
|
+
}
|
|
479
|
+
const versionAttested = versionCovered.get(host.id);
|
|
480
|
+
if (versionAttested) {
|
|
481
|
+
return { ...host, status: "upgraded", ...(versionAttested.version ? { toVersion: versionAttested.version } : {}),
|
|
482
|
+
reason: "attests the target release version (no gitSha reported)" };
|
|
483
|
+
}
|
|
484
|
+
return host;
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
export function reconcileStalePendingDeploy(opts: { now?: number; leaseMs?: number; executorGraceMs?: number } = {}): DeployEvent | null {
|
|
489
|
+
const pending = currentPendingDeployEvent();
|
|
490
|
+
if (!pending) return null;
|
|
491
|
+
const leaseAt = deployEventLeaseAt(pending);
|
|
492
|
+
// #2189 P7 — a pending row bound to an epoch that is still QUIESCING is held, not stale. The epoch
|
|
493
|
+
// opens the ledger row up front (it is the fleet mutex now), and a tick that defers on a healthy
|
|
494
|
+
// gate leaves that row pending across ticks by design. Reconciling it to `failed` here would put
|
|
495
|
+
// the SHA into deploy backoff for work that is proceeding exactly as intended — and the next tick
|
|
496
|
+
// would refuse to resume its own hold.
|
|
497
|
+
if (pending.restartEpochId) {
|
|
498
|
+
const epoch = restartEpochById(pending.restartEpochId);
|
|
499
|
+
if (epoch && (epoch.state === "requested" || epoch.state === "quiesced")) return null;
|
|
500
|
+
}
|
|
501
|
+
const now = opts.now ?? Date.now();
|
|
502
|
+
const leaseMs = opts.leaseMs ?? DEPLOY_LEASE_MS;
|
|
503
|
+
const allowlist = resolveCdFleetAllowlist();
|
|
504
|
+
// #2988 — a CD row restarts only its own batch of Hosts, so converged means THOSE attest the sha.
|
|
505
|
+
const rowHosts = pending.initiatedBy === CD_WATCHER_INITIATOR ? new Set(pending.hosts.map((host) => host.id)) : undefined;
|
|
506
|
+
const coverage = resolveFleetShaCoverage(
|
|
507
|
+
listOrchestrators().filter((host) => !rowHosts || rowHosts.has(host.id)),
|
|
508
|
+
pending.commitSha,
|
|
509
|
+
allowlist,
|
|
510
|
+
{ localOrchestratorId: resolveReleaseLocalOrchestratorId(), targetVersion: pending.version },
|
|
511
|
+
);
|
|
512
|
+
const converged = coverage.expected.length > 0 && coverage.behind.length === 0 && coverage.unattested.length === 0;
|
|
513
|
+
if (converged) {
|
|
514
|
+
return reconcilePendingDeployEvent({
|
|
515
|
+
id: pending.id, status: "succeeded", requireLeaseExpired: false, now,
|
|
516
|
+
// #2407 — record what the fleet ACTUALLY attests per host. The row was opened with every host
|
|
517
|
+
// at `pending` and the driver that would have replaced those entries is the process that died,
|
|
518
|
+
// so without this the ledger keeps a `succeeded` deploy whose hosts all read `pending` forever.
|
|
519
|
+
hosts: attestedDeployHostStatuses(pending.hosts, coverage),
|
|
520
|
+
reason: "self-healed: fleet attests the target sha but the deploy driver could not finalize the ledger (#1532)",
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
// #2105 — `requireExecutor` fences the write to the very process this verdict is about: the probe
|
|
524
|
+
// happens outside reconcilePendingDeployEvent's transaction, and `release.ts --resume` may legally
|
|
525
|
+
// re-stamp the row with a NEW, live driver in between.
|
|
526
|
+
if (deployExecutorConfirmedGone({
|
|
527
|
+
executor: pending.executor, startedAt: leaseAt, localHost: resolveReleaseLocalOrchestratorId(), now,
|
|
528
|
+
...(opts.executorGraceMs !== undefined ? { graceMs: opts.executorGraceMs } : {}),
|
|
529
|
+
})) {
|
|
530
|
+
return reconcilePendingDeployEvent({
|
|
531
|
+
id: pending.id, status: "failed", requireLeaseExpired: false, requireExecutor: pending.executor, now,
|
|
532
|
+
reason: "self-healed: the deploy driver process is confirmed gone and the fleet has not converged on the target sha (#2105)",
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
if (now - leaseAt >= leaseMs) {
|
|
536
|
+
return reconcilePendingDeployEvent({
|
|
537
|
+
id: pending.id, status: "failed", requireLeaseExpired: true, now, leaseMs,
|
|
538
|
+
reason: "self-healed: deploy lease expired and the fleet has not converged on the target sha (#1532)",
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
return null;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
/**
|
|
545
|
+
* #1551 part 2 — reconcile a stale SERVED dashboard bundle when the fleet's runtimes are already
|
|
546
|
+
* converged (the catch-22: once every host attests the target SHA, the host-SHA coverage below is
|
|
547
|
+
* satisfied so no deploy runs to rebuild the dashboard that an earlier FAILED deploy left stale).
|
|
548
|
+
*
|
|
549
|
+
* Only meaningful for a $PUBLIC_DIR override host (the served dir `humwick upgrade` never
|
|
550
|
+
* touches) — with PUBLIC_DIR unset the runtime upgrade itself refreshes the bundled dashboard, so
|
|
551
|
+
* there's nothing to reconcile. When the served bundle's build-SHA marker predates the target SHA,
|
|
552
|
+
* rebuild the dashboard DIRECTLY from the deps-ready converged artifact checkout (the one the fleet
|
|
553
|
+
* already runs) into $PUBLIC_DIR — no relay/orchestrator restart, no host mutation, just a local
|
|
554
|
+
* build + mirror. Best-effort: any missing prerequisite or a build failure is logged and left for a
|
|
555
|
+
* later full deploy, never a hard failure (the fleet's runtimes are healthy).
|
|
556
|
+
*
|
|
557
|
+
* Returns `{ rebuilt: true }` only when it actually rebuilt+mirrored a fresh bundle.
|
|
558
|
+
*/
|
|
559
|
+
export function reconcileServedDashboard(opts: { root: string; sha: string; command: Run; home?: string }): { rebuilt: boolean; reason: string } {
|
|
560
|
+
const publicDir = process.env.PUBLIC_DIR?.trim();
|
|
561
|
+
if (!publicDir) return { rebuilt: false, reason: "PUBLIC_DIR unset — the runtime upgrade refreshes the bundled dashboard" };
|
|
562
|
+
const servedDir = resolve(publicDir);
|
|
563
|
+
const servedSha = readServedDashboardSha(servedDir);
|
|
564
|
+
const decision = resolveDashboardRebuild({ servedSha, targetSha: opts.sha, hostRepairPending: false });
|
|
565
|
+
if (!decision.rebuild) return { rebuilt: false, reason: decision.reason };
|
|
566
|
+
|
|
567
|
+
const repoUrl = opts.command("git", ["config", "--get", "remote.origin.url"], opts.root).out;
|
|
568
|
+
if (!repoUrl) {
|
|
569
|
+
console.error(`cd-watcher: served dashboard is stale (${decision.reason}) but no origin remote URL to locate the converged checkout — a later full deploy will rebuild it`);
|
|
570
|
+
return { rebuilt: false, reason: decision.reason };
|
|
571
|
+
}
|
|
572
|
+
let checkoutDir: string;
|
|
573
|
+
try {
|
|
574
|
+
checkoutDir = gitCheckoutArtifactPaths(opts.home ?? homedir(), opts.sha, repoUrl).checkoutDir;
|
|
575
|
+
} catch (error) {
|
|
576
|
+
console.error(`cd-watcher: could not resolve the artifact checkout for a dashboard rebuild: ${errMessage(error)}`);
|
|
577
|
+
return { rebuilt: false, reason: decision.reason };
|
|
578
|
+
}
|
|
579
|
+
if (!existsSync(join(checkoutDir, "node_modules"))) {
|
|
580
|
+
console.error(`cd-watcher: served dashboard is stale (${decision.reason}) but the converged checkout ${checkoutDir} has no installed deps — a later full deploy will rebuild it`);
|
|
581
|
+
return { rebuilt: false, reason: decision.reason };
|
|
582
|
+
}
|
|
583
|
+
console.log(`cd-watcher: ${decision.reason} — rebuilding from ${checkoutDir} → ${servedDir}`);
|
|
584
|
+
// deploy-dashboard.ts reads this to stamp the served bundle's build-SHA marker (so a consistent
|
|
585
|
+
// served dir converges to the target SHA and this stops re-triggering). PUBLIC_DIR is already in
|
|
586
|
+
// this process's env (the control host serves from it); the build inherits both.
|
|
587
|
+
const priorBuildSha = relayEnv(process.env, "AGENT_RELAY_DASHBOARD_BUILD_SHA");
|
|
588
|
+
writeChildEnv(process.env, { AGENT_RELAY_DASHBOARD_BUILD_SHA: opts.sha });
|
|
589
|
+
try {
|
|
590
|
+
const build = opts.command("bun", ["run", "build:dashboard"], checkoutDir);
|
|
591
|
+
if (build.code !== 0) {
|
|
592
|
+
console.error(`cd-watcher: dashboard rebuild failed (exit ${build.code}): ${build.err || build.out}`);
|
|
593
|
+
return { rebuilt: false, reason: `dashboard rebuild attempted but failed (${decision.reason})` };
|
|
594
|
+
}
|
|
595
|
+
return { rebuilt: true, reason: `Rebuilt the served dashboard (${decision.reason}).` };
|
|
596
|
+
} finally {
|
|
597
|
+
if (priorBuildSha === undefined) writeChildEnv(process.env, {}, ["AGENT_RELAY_DASHBOARD_BUILD_SHA"]);
|
|
598
|
+
else writeChildEnv(process.env, { AGENT_RELAY_DASHBOARD_BUILD_SHA: priorBuildSha });
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
/** #3692 — this watcher is synchronous, so the post-stamp hub wake runs as the same helper release.ts awaits. */
|
|
603
|
+
function wakeHubSync(command: Run, taskIds: number[]): void {
|
|
604
|
+
if (!taskIds.length) return;
|
|
605
|
+
try {
|
|
606
|
+
const wake = command("bun", ["run", join(import.meta.dir, "cd-hub-wake.ts"), ...taskIds.map(String)]);
|
|
607
|
+
if (wake.code !== 0) throw new Error(wake.err || wake.out);
|
|
608
|
+
} catch (error) {
|
|
609
|
+
// Best effort: the deploy already succeeded, and the next hub boot reconciles waiting plans.
|
|
610
|
+
console.error(`cd-watcher: plans waiting on the deployed Tasks were not woken: ${errMessage(error)}`);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
export { CD_RESTART_EPOCH_TICK_BUDGET_MS, resolveCdRestartEpochTickBudgetMs } from "./cd-config.ts";
|
|
615
|
+
|
|
616
|
+
export function runCdWatcher(opts: {
|
|
617
|
+
root: string;
|
|
618
|
+
dbPath: string;
|
|
619
|
+
runCommand?: Run;
|
|
620
|
+
dashboardArtifactHome?: string;
|
|
621
|
+
now?: number;
|
|
622
|
+
debounce?: CdDeployDebounce;
|
|
623
|
+
/** #2727 — the temp dir deploy worktrees are created in; defaults to the OS temp dir. */
|
|
624
|
+
deployWorktreeTempDir?: string;
|
|
625
|
+
/** #2189 — test seam for the restart-epoch hold (clock/sleep/budget). Production passes nothing
|
|
626
|
+
* and takes a real wall clock, Bun.sleepSync, and the env-resolved tick budget. */
|
|
627
|
+
restartEpochHold?: { now?: () => number; sleep?: (ms: number) => void; tickBudgetMs?: number; pollIntervalMs?: number };
|
|
628
|
+
} = { root: process.cwd(), dbPath: resolveCanonicalRelayDbPath() }): CdWatcherResult {
|
|
629
|
+
const command = opts.runCommand ?? run;
|
|
630
|
+
const now = opts.now ?? Date.now();
|
|
631
|
+
// #2727 — one seam for both reclaim sites; the module owns the policy (including the live-deploy
|
|
632
|
+
// fence the start site needs) and logs itself, so a failed recovery can never reach the deploy.
|
|
633
|
+
const reclaimSweep = () => ({
|
|
634
|
+
repoRoot: opts.root, run: command,
|
|
635
|
+
...(opts.deployWorktreeTempDir ? { tempDir: opts.deployWorktreeTempDir } : {}),
|
|
636
|
+
});
|
|
637
|
+
// #1868 — ATTACH to the DB the live Relay owns; never bootstrap it. The prior initDb() here re-ran
|
|
638
|
+
// the FULL catalog DDL + applyMigrations() + an unconditional `PRAGMA optimize` (which re-ANALYZEs
|
|
639
|
+
// churned tables like `messages`) against the live ~1.5GB DB on EVERY ~80s tick — taking the SQLite
|
|
640
|
+
// writer/checkpoint lock while the main-loop hot-path writes spun in `busy_timeout`, freezing the
|
|
641
|
+
// server's event loop (freezes up to 96s). openExistingDb runs NONE of that DDL/optimize work: the
|
|
642
|
+
// live server already bootstrapped and owns the schema; this child only reads/writes the deploy
|
|
643
|
+
// ledger. Mirrors the reopen below (#1685) and the general #1724 off-loop rule.
|
|
644
|
+
openExistingDb(opts.dbPath);
|
|
645
|
+
// Best-effort self-heal: a transient registry/db throw here must never abort the tick (which
|
|
646
|
+
// would also skip the CI-transition alert downstream). The orphan just heals on a later tick.
|
|
647
|
+
try {
|
|
648
|
+
reconcileStalePendingDeploy({ now });
|
|
649
|
+
} catch (error) {
|
|
650
|
+
console.error(`cd-watcher: stale-pending reconcile failed (continuing tick): ${errMessage(error)}`);
|
|
651
|
+
}
|
|
652
|
+
const changesBackfill = listDeployEventsNeedingChanges(3);
|
|
653
|
+
// #2988 — a partial batch is a step of a rollout, not its end: ranges start at the last complete one.
|
|
654
|
+
const previous = latestCompleteDeploy();
|
|
655
|
+
const lastBatch = latestSuccessfulDeploy();
|
|
656
|
+
const previousSha = shortSha(previous?.commitSha);
|
|
657
|
+
// #1765 — RELEASE the DB connection across the multi-second network `git fetch` in
|
|
658
|
+
// selectDeployableMainCi below. This runs in cd-watcher's detached child, which attaches to the
|
|
659
|
+
// database the live Relay owns; holding even an idle connection open across the fetch pins a WAL
|
|
660
|
+
// read-mark that blocks the server's synchronous checkpoint, freezing its event loop for the whole
|
|
661
|
+
// fetch (the recurring ~2.3s event-loop-lag spike). The fetch/CI observation needs no DB, so close
|
|
662
|
+
// now and reopen only for the coverage/lease/deploy writes after the observation is in hand. This
|
|
663
|
+
// is the general #1724 rule: an off-thread job must not hold a DB connection across a long non-DB op.
|
|
664
|
+
closeDb();
|
|
665
|
+
// #2727 — recover the deploy worktrees a killed run left behind (~168 MB each), in the same closed
|
|
666
|
+
// window as the git work below: the sweep spawns git and recursively removes those trees, so it must
|
|
667
|
+
// not pin the live relay's WAL checkpoint. Its pending-row read OPENS the ledger for that one point
|
|
668
|
+
// read — this window holds no connection by design — and the whole fence lives in the module.
|
|
669
|
+
reclaimStaleDeployWorktreesAtTickStart({
|
|
670
|
+
...reclaimSweep(),
|
|
671
|
+
readPendingLeaseAt: () => withDeployLedgerDb(opts.dbPath, () => { const p = currentPendingDeployEvent(); return p ? deployEventLeaseAt(p) : null; }),
|
|
672
|
+
leaseMs: DEPLOY_LEASE_MS,
|
|
673
|
+
});
|
|
674
|
+
// #1799 — legacy successful rows are reconciled in this detached child, never
|
|
675
|
+
// in a request handler. The SQLite handle is closed around every git log so the
|
|
676
|
+
// live relay's WAL checkpoint cannot be pinned by subprocess work.
|
|
677
|
+
for (const event of changesBackfill) {
|
|
678
|
+
try {
|
|
679
|
+
const changes = changesInDeployRange(command, opts.root, event.previousSha, event.commitSha);
|
|
680
|
+
withDeployLedgerDb(opts.dbPath, () => {
|
|
681
|
+
const matched = deployChangesForCommits(changes);
|
|
682
|
+
persistDeployChangesSummary({
|
|
683
|
+
id: event.id,
|
|
684
|
+
summary: { range: { ...(event.previousSha ? { previousSha: event.previousSha } : {}), commitSha: event.commitSha }, ...matched, computedAt: now },
|
|
685
|
+
});
|
|
686
|
+
});
|
|
687
|
+
} catch (error) {
|
|
688
|
+
console.error(`cd-watcher: deploy changes backfill failed for ${event.id} (continuing tick): ${errMessage(error)}`);
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
const selection = selectDeployableMainCi(command, opts.root, previous?.commitSha, now);
|
|
692
|
+
// Recover a killed driver's Task facts and backfill lands older than the attribution range.
|
|
693
|
+
try {
|
|
694
|
+
wakeHubSync(command, withDeployLedgerDb(opts.dbPath, () => completeCdDeployTasks({ root: opts.root, runCommand: command })).taskIds);
|
|
695
|
+
} catch (error) {
|
|
696
|
+
console.error(`cd-watcher: Task deployment recovery failed (retrying next tick): ${errMessage(error)}`);
|
|
697
|
+
}
|
|
698
|
+
// #1947 — Path-scoped CD: classify the last-deployed → candidate range with the DB STILL RELEASED,
|
|
699
|
+
// mirroring the #1765/#1790 git-subprocess discipline (the reopen below happens after this git diff).
|
|
700
|
+
// We only DECIDE here; the skip is actioned after the reopen so the "DB open on return" post-condition
|
|
701
|
+
// every other exit path relies on is preserved. Guarded on a real baseline: the first deploy has no
|
|
702
|
+
// last-deployed SHA to diff against, so it deploys (fail-safe). See classifyDeployRangePaths for the
|
|
703
|
+
// FAIL-SAFE = DEPLOY contract on every uncertain signal.
|
|
704
|
+
const pathScope = selection.sha && previous?.commitSha
|
|
705
|
+
? classifyDeployRangePaths(command, opts.root, previous.commitSha, selection.sha)
|
|
706
|
+
: undefined;
|
|
707
|
+
// Reopen for the DB work below. openExistingDb (not initDb): the live Relay owns and has already
|
|
708
|
+
// migrated the schema, so re-running the catalog DDL/migrations every tick would needlessly
|
|
709
|
+
// re-contend with the live server (#1685/#1868).
|
|
710
|
+
openExistingDb(opts.dbPath);
|
|
711
|
+
const { observation, sha } = selection;
|
|
712
|
+
const skip = (result: CdWatcherResult): CdWatcherResult => {
|
|
713
|
+
releaseOwnedRestartEpochDrains(CD_WATCHER_INITIATOR, result.reason, now);
|
|
714
|
+
return result;
|
|
715
|
+
};
|
|
716
|
+
if (!sha) return skip({ outcome: "skipped", sha: null, previousSha, reason: selection.reason ?? "No green origin/main SHA is available.", observation });
|
|
717
|
+
const targetSha = shortSha(sha);
|
|
718
|
+
// #1947 — Path-scoped CD skip, decided above (DB was still released for the git diff). BEFORE any
|
|
719
|
+
// deploy decision: if the last-deployed → candidate range changes ONLY non-deployed paths (docs,
|
|
720
|
+
// design artifacts, tests-only) we skip the full fleet redeploy. The watcher cursor is NOT corrupted
|
|
721
|
+
// — latestSuccessfulDeploy is left untouched — so nothing stalls: the next real code land computes
|
|
722
|
+
// its range from the same baseline and deploys the whole span (the intervening docs commits fold in
|
|
723
|
+
// harmlessly), while repeated docs-only ticks just re-skip cheaply and idempotently. A pending failed
|
|
724
|
+
// deploy in backoff, a downgrade guard, etc. are all deploy-suppressing too, so skipping earlier here
|
|
725
|
+
// never causes a deploy those later guards would have refused.
|
|
726
|
+
if (pathScope && !pathScope.deploy) {
|
|
727
|
+
console.error(`cd-watcher: PATH-SCOPED SKIP (#1947): ${previousSha}..${targetSha} changes only non-deployed paths (${pathScope.nonDeployedPaths.length} file(s): ${pathScope.nonDeployedPaths.slice(0, 5).join(", ")}${pathScope.nonDeployedPaths.length > 5 ? ", …" : ""}); skipping the fleet redeploy.`);
|
|
728
|
+
return skip({
|
|
729
|
+
outcome: "skipped",
|
|
730
|
+
sha: targetSha,
|
|
731
|
+
previousSha,
|
|
732
|
+
reason: `Path-scoped CD (#1947): ${previousSha}..${targetSha} changes only non-deployed paths (docs/design/tests, ${pathScope.nonDeployedPaths.length} file(s)); skipping the fleet redeploy without moving the fleet.`,
|
|
733
|
+
observation,
|
|
734
|
+
});
|
|
735
|
+
}
|
|
736
|
+
const hosts = listOrchestrators();
|
|
737
|
+
const allowlist = resolveCdFleetAllowlist();
|
|
738
|
+
// #1770 round 3, F2 — pass targetVersion (mirroring reconcileStalePendingDeploy's call above) so
|
|
739
|
+
// an npm-runtime host attested only by VERSION, not gitSha, is recognized as covered instead of
|
|
740
|
+
// sitting in coverage.unattested forever and permanently keeping the fail-closed guard below active.
|
|
741
|
+
const targetVersion = resolveVersionAtSha(command, opts.root, sha);
|
|
742
|
+
const localOrchestratorId = resolveReleaseLocalOrchestratorId();
|
|
743
|
+
const coverage = resolveFleetShaCoverage(hosts, sha, allowlist, { localOrchestratorId, targetVersion });
|
|
744
|
+
// #1770 — No-downgrade guard. Never deploy a candidate that is an ancestor of a SHA the fleet
|
|
745
|
+
// already runs (or the last-deployed ledger row): that would revert a release. The live
|
|
746
|
+
// process-attested fleet SHAs are the authority here, because `bun run release` deploys the bump
|
|
747
|
+
// commit directly without writing a cd-watcher ledger row, so the ledger alone can lag reality.
|
|
748
|
+
// blocker 2 (widen) — also fold in the currently-PENDING deploy row's commitSha. A release
|
|
749
|
+
// driver's deploy is `pending` (not yet `succeeded`) while its hosts restart, so
|
|
750
|
+
// latestSuccessfulDeploy() reads an older ancestor as `previous`; without the pending row the
|
|
751
|
+
// guard's deployed set would miss the SHA the fleet is actually converging onto (#1769 shape).
|
|
752
|
+
// Best-effort: a corrupt pending row must not abort the whole tick (the guard still has the
|
|
753
|
+
// ledger + live fleet SHAs). This mirrors the reconcileStalePendingDeploy swallow above.
|
|
754
|
+
let pendingDeployCommitSha: string | undefined;
|
|
755
|
+
try {
|
|
756
|
+
// #2988 — a draining epoch has no ledger row; a pending row is a deploy that has launched.
|
|
757
|
+
pendingDeployCommitSha = currentPendingDeployEvent()?.commitSha;
|
|
758
|
+
} catch (error) {
|
|
759
|
+
console.error(`cd-watcher: could not read the pending deploy row for the downgrade guard (continuing): ${errMessage(error)}`);
|
|
760
|
+
}
|
|
761
|
+
const deployedShas = [
|
|
762
|
+
...(previous?.commitSha ? [previous.commitSha] : []),
|
|
763
|
+
...(pendingDeployCommitSha ? [pendingDeployCommitSha] : []),
|
|
764
|
+
...coverage.expected.map((host) => host.gitSha).filter((value): value is string => !!value),
|
|
765
|
+
];
|
|
766
|
+
const downgradeOf = findDowngradeTarget(command, opts.root, sha, deployedShas);
|
|
767
|
+
if (downgradeOf) {
|
|
768
|
+
// should-fix 6 — a guard block that recurs every tick is a wedged reconciliation (fleet ahead of
|
|
769
|
+
// the newest deployable main SHA). Log loudly so the repeated skip is visible, not silent.
|
|
770
|
+
console.error(`cd-watcher: NO-DOWNGRADE GUARD BLOCKED a deploy (#1770): candidate ${targetSha} is an ancestor of already-deployed ${shortSha(downgradeOf)}; refusing to move the fleet backward. If this recurs every tick, reconcile the fleet/main mismatch.`);
|
|
771
|
+
return skip({
|
|
772
|
+
outcome: "skipped",
|
|
773
|
+
sha: targetSha,
|
|
774
|
+
previousSha,
|
|
775
|
+
reason: `No-downgrade guard (#1770): ${targetSha} is an ancestor of already-deployed ${shortSha(downgradeOf)}; refusing to move the fleet backward.`,
|
|
776
|
+
observation,
|
|
777
|
+
});
|
|
778
|
+
}
|
|
779
|
+
// #1770 blocker 2 — FAIL CLOSED on an unattested deploy target when the candidate is not
|
|
780
|
+
// origin/main HEAD. The no-downgrade guard above can only protect against SHAs the fleet
|
|
781
|
+
// ATTESTS; an `unattested` host has unknown state, so if we are about to deploy a walk-back SHA
|
|
782
|
+
// (a strict ancestor of HEAD, e.g. the CI fell back off the un-CI'd release bump) we cannot prove
|
|
783
|
+
// that host isn't actually running something NEWER — deploying would silently downgrade it
|
|
784
|
+
// (#1769's exact false-negative). When the candidate IS HEAD there is nothing newer on main to
|
|
785
|
+
// downgrade to, so a permanently-unattested legacy host is still repaired forward as before and
|
|
786
|
+
// CD is not wedged. Only the ambiguous walk-back-onto-unknown case is refused.
|
|
787
|
+
if (coverage.unattested.length > 0 && sha !== observation.headSha) {
|
|
788
|
+
const unattestedIds = coverage.unattested.map((host) => host.id).join(", ");
|
|
789
|
+
console.error(`cd-watcher: FAIL-CLOSED (#1770): candidate ${targetSha} is not origin/main HEAD (${shortSha(observation.headSha)}) and deploy target(s) [${unattestedIds}] cannot attest a gitSha; refusing to deploy a possible downgrade to a host of unknown state.`);
|
|
790
|
+
return skip({
|
|
791
|
+
outcome: "skipped",
|
|
792
|
+
sha: targetSha,
|
|
793
|
+
previousSha,
|
|
794
|
+
reason: `Fail-closed (#1770): ${targetSha} is a non-HEAD walk-back and target host(s) [${unattestedIds}] have no attested gitSha; refusing to risk a downgrade to a host of unknown state.`,
|
|
795
|
+
observation,
|
|
796
|
+
});
|
|
797
|
+
}
|
|
798
|
+
// A successful fleet-level ledger row only records a past attempt. The live
|
|
799
|
+
// process-attested SHA is the authority. Missing attestation is separately
|
|
800
|
+
// tracked because a too-old/misdetecting host may be permanently unable to
|
|
801
|
+
// report one; failed retries are therefore throttled below.
|
|
802
|
+
const repairIds = [...coverage.behind, ...coverage.unattested].map((host) => host.id);
|
|
803
|
+
if (repairIds.length === 0) {
|
|
804
|
+
if (coverage.expected.length === 0) return skip({ outcome: "skipped", sha: targetSha, previousSha,
|
|
805
|
+
reason: "No online upgradeable hosts are in the CD fleet allowlist.", observation });
|
|
806
|
+
const debounce = opts.debounce ?? resolveCdDeployDebounce();
|
|
807
|
+
// A prior deploy may have restarted this child before it could clean up. Once the fleet
|
|
808
|
+
// attests that same target, discard the old burst clock so the next independent land gets its
|
|
809
|
+
// own full quiet window rather than inheriting a stale max-defer deadline.
|
|
810
|
+
if (readCdDeployDebounceState(debounce.statePath)?.sha === sha) clearCdDeployDebounceState(debounce.statePath);
|
|
811
|
+
// #1551 part 2: every host's runtime attests the target SHA, but the SERVED dashboard bundle can
|
|
812
|
+
// still predate it (an earlier failed deploy skipped release.ts's build step). With host-SHA
|
|
813
|
+
// coverage satisfied no deploy will ever rebuild it — so reconcile the served bundle directly
|
|
814
|
+
// (best-effort, no host restart) to close the converged-fleet catch-22.
|
|
815
|
+
closeDb();
|
|
816
|
+
let dashboardReconcile: ReturnType<typeof reconcileServedDashboard>;
|
|
817
|
+
try {
|
|
818
|
+
dashboardReconcile = reconcileServedDashboard({ root: opts.root, sha, command, home: opts.dashboardArtifactHome });
|
|
819
|
+
} finally {
|
|
820
|
+
openExistingDb(opts.dbPath);
|
|
821
|
+
}
|
|
822
|
+
if (dashboardReconcile.rebuilt) {
|
|
823
|
+
releaseOwnedRestartEpochDrains(CD_WATCHER_INITIATOR, dashboardReconcile.reason, now);
|
|
824
|
+
return { outcome: "deployed", sha: targetSha, previousSha, reason: dashboardReconcile.reason, observation };
|
|
825
|
+
}
|
|
826
|
+
const allEligible = resolveFleetShaCoverage(hosts, sha, new Set(hosts.map((host) => host.id)));
|
|
827
|
+
const excludedNeedsDeploy = [...allEligible.behind, ...allEligible.unattested]
|
|
828
|
+
.some((host) => !isCdFleetHostAllowlisted(host, allowlist));
|
|
829
|
+
return skip({
|
|
830
|
+
outcome: "converged",
|
|
831
|
+
sha: targetSha,
|
|
832
|
+
previousSha,
|
|
833
|
+
reason: excludedNeedsDeploy
|
|
834
|
+
? "Hosts needing deployment are outside the CD fleet allowlist."
|
|
835
|
+
: "Target SHA is already deployed to every allowlisted host.",
|
|
836
|
+
observation,
|
|
837
|
+
});
|
|
838
|
+
}
|
|
839
|
+
const recentFailure = latestFailedDeployForCommit(sha);
|
|
840
|
+
if (recentFailure?.finishedAt !== undefined && now - recentFailure.finishedAt < CD_WATCHER_FAILURE_BACKOFF_MS) {
|
|
841
|
+
return skip({ outcome: "skipped", sha: targetSha, previousSha, reason: "A recent failed deploy is still in backoff.", observation });
|
|
842
|
+
}
|
|
843
|
+
const debounce = opts.debounce ?? resolveCdDeployDebounce();
|
|
844
|
+
let debounceState = readCdDeployDebounceState(debounce.statePath);
|
|
845
|
+
// The durable marker from a completed prior deploy can survive the control-host restart that
|
|
846
|
+
// deploy caused. A ledger-confirmed old target is not part of this new burst.
|
|
847
|
+
if (debounceState && debounceState.sha === lastBatch?.commitSha && debounceState.sha !== sha) debounceState = undefined;
|
|
848
|
+
// Partial batches restart Hosts too; complete-rollout attribution must not freeze the cooldown (#3139).
|
|
849
|
+
const cooldownApplies = lastBatch && lastBatch.commitSha !== sha && !recentFailure;
|
|
850
|
+
const debounceDecision = decideCdDeployDebounce({
|
|
851
|
+
sha, now, debounce, state: debounceState,
|
|
852
|
+
...(cooldownApplies ? { lastDeployStartedAt: lastBatch.startedAt } : {}),
|
|
853
|
+
});
|
|
854
|
+
writeCdDeployDebounceState(debounce.statePath, debounceDecision.state);
|
|
855
|
+
const resumingDrain = ownedRestartEpochDrains(CD_WATCHER_INITIATOR).length > 0;
|
|
856
|
+
// The quiet window precedes admission closure; resetting it during a drain starves renewals (#2798).
|
|
857
|
+
if (!debounceDecision.deploy && cooldownApplies && now < lastBatch.startedAt + debounce.minIntervalMs) {
|
|
858
|
+
return skip({ outcome: "skipped", sha: targetSha, previousSha, reason: debounceDecision.reason!, observation });
|
|
859
|
+
}
|
|
860
|
+
if (!debounceDecision.deploy && !resumingDrain) {
|
|
861
|
+
return { outcome: "skipped", sha: targetSha, previousSha, reason: debounceDecision.reason!, observation };
|
|
862
|
+
}
|
|
863
|
+
// #2189 P7 / #2988 — durable restart epochs, one per Host, replace the old bounded merge-drain
|
|
864
|
+
// poller. An epoch that will not seal defers only its own Host: the SAME epoch keeps holding new
|
|
865
|
+
// work there until a later tick finishes it, while the Hosts that sealed deploy now in one batch.
|
|
866
|
+
// #2672 — decided before the plan, so neither the batch nor the relay Host's turn waits on such a Host.
|
|
867
|
+
const heldByLand = upgradeHeldByLand(hosts, localOrchestratorId);
|
|
868
|
+
const held = holdAndBindCdHostDeploy({
|
|
869
|
+
sha, previousSha: previous?.commitSha, ownerId: CD_WATCHER_INITIATOR, repairIds,
|
|
870
|
+
scopes: planCdHostScopes({ repairIds, orchestrators: hosts, localOrchestratorId, landHeld: (id) => heldByLand(id) !== null,
|
|
871
|
+
relayTurn: () => relayHostsTurn(hosts.find((host) => host.id === localOrchestratorId)?.gitSha,
|
|
872
|
+
coverage.expected.map((host) => host.gitSha),
|
|
873
|
+
// A merge-base git cannot answer (e.g. an unfetched object) counts as "lacks it": the hub's turn.
|
|
874
|
+
(ancestor, descendant) => command("git", ["merge-base", "--is-ancestor", ancestor, descendant], opts.root).code === 0) }),
|
|
875
|
+
tickBudgetMs: opts.restartEpochHold?.tickBudgetMs ?? resolveCdRestartEpochTickBudgetMs(),
|
|
876
|
+
// A LIVE clock, deliberately — NOT the tick's frozen `now`, against which the budget check
|
|
877
|
+
// `now() - startedAt >= budget` would never become true and the poll loop would spin forever.
|
|
878
|
+
now: opts.restartEpochHold?.now ?? Date.now,
|
|
879
|
+
sleep: opts.restartEpochHold?.sleep ?? ((ms: number) => { Bun.sleepSync(ms); }),
|
|
880
|
+
// #1765/#1790 — drop the prod DB connection across every poll sleep, the same rule every other
|
|
881
|
+
// long span in this file follows. The seal transactions between sleeps reopen it.
|
|
882
|
+
aroundSleep: (sleep) => { closeDb(); try { sleep(); } finally { openExistingDb(opts.dbPath); } },
|
|
883
|
+
...(opts.restartEpochHold?.pollIntervalMs !== undefined ? { pollIntervalMs: opts.restartEpochHold.pollIntervalMs } : {}),
|
|
884
|
+
});
|
|
885
|
+
if (!held.bound) return { outcome: "skipped", sha: targetSha, previousSha, reason: held.reason, observation };
|
|
886
|
+
const { event, targetIds } = held;
|
|
887
|
+
// The fleet lease now owns this deploy. Clearing before long subprocess work prevents a later,
|
|
888
|
+
// unrelated green burst from inheriting this burst's max-defer deadline after a relay restart.
|
|
889
|
+
// A partial batch keeps it: the Hosts still waiting are this same burst, not a new one.
|
|
890
|
+
if (!event.rolloutPartial) clearCdDeployDebounceState(debounce.statePath);
|
|
891
|
+
// #1790 — RELEASE the prod-DB connection before the multi-second worktree-add + fleet deploy +
|
|
892
|
+
// smoke below, exactly as #1765 does across the git fetch above. The fleet-lease row is already
|
|
893
|
+
// committed by tryBeginDeployEvent; the only remaining DB work is the idempotent ledger-completion /
|
|
894
|
+
// task-stamp writes, which are reopened for in short bursts via withDeployLedgerDb and never held
|
|
895
|
+
// across a subprocess op that would pin a WAL read-mark and freeze the live Relay's checkpoint. The
|
|
896
|
+
// finally reopens the handle so callers after the run (the deploy-path unit tests read the ledger;
|
|
897
|
+
// prod just exits) see the same open connection they did before #1790.
|
|
898
|
+
closeDb();
|
|
899
|
+
// #2727 — reclaim what the PREVIOUS tick's killed deploy left behind (the start sweep above could
|
|
900
|
+
// not: that run was still live when it ran), in the same closed window as the worktree-add below.
|
|
901
|
+
reclaimStaleDeployWorktreesBeforeDeploy(reclaimSweep());
|
|
902
|
+
const worktree = createCdDeployWorktree(opts.deployWorktreeTempDir);
|
|
903
|
+
try {
|
|
904
|
+
const add = command("git", ["worktree", "add", "--detach", worktree.checkout, sha], opts.root);
|
|
905
|
+
if (add.code !== 0) throw new Error(`could not prepare deploy worktree: ${add.err || add.out || `exit ${add.code}`}`);
|
|
906
|
+
// deploy-only is intentional: it is the existing, proven command-bus fan-out.
|
|
907
|
+
// Its git-checkout mode consumes the green SHA directly; npm-reuse is opt-in.
|
|
908
|
+
// #2727 — hand the driver its worktree root so it records itself as a second owner: it re-execs
|
|
909
|
+
// into a transient scope that outlives this watcher, and only that ownership tells a later tick's
|
|
910
|
+
// sweep the tree is still in use. Env, not argv, because the re-exec inherits the environment.
|
|
911
|
+
const deploy = command("bun", cdDeployArgs(sha, undefined, event.id, targetIds), worktree.checkout,
|
|
912
|
+
{ [CD_DEPLOY_WORKTREE_ENV]: worktree.root });
|
|
913
|
+
if (deploy.code !== 0) throw new Error(`fleet deploy failed: ${deploy.err || deploy.out || `exit ${deploy.code}`}`);
|
|
914
|
+
// release.ts normally owns this attached row and persists real host statuses.
|
|
915
|
+
// Keep a compatible fallback for a legacy/interrupted deploy child.
|
|
916
|
+
// The scoped release driver survives the relay restart; a legacy child may still need
|
|
917
|
+
// attribution repair here. Task completion always uses the shared ancestry check (#3168).
|
|
918
|
+
const fallbackNeeded = withDeployLedgerDb(opts.dbPath, () => {
|
|
919
|
+
const completed = getDeployEvent(event.id);
|
|
920
|
+
if (completed?.status === "pending") finishDeployEvent({ id: event.id, status: "succeeded", hosts: completed.hosts });
|
|
921
|
+
const finalized = getDeployEvent(event.id);
|
|
922
|
+
if (finalized?.status !== "succeeded") return null;
|
|
923
|
+
// release.ts owns the normal post-finalization cache + Task stamping. Only
|
|
924
|
+
// a legacy/interrupted child needs this watcher's fallback, so a healthy
|
|
925
|
+
// deploy runs exactly one git log in its surviving release process.
|
|
926
|
+
return finalized.changes?.state !== "ready" && cdDeployStampsTasks(finalized);
|
|
927
|
+
});
|
|
928
|
+
if (fallbackNeeded === null) throw new Error("fleet deploy did not complete successfully in the deploy ledger");
|
|
929
|
+
let fallbackCommits: string[] = [];
|
|
930
|
+
if (fallbackNeeded) {
|
|
931
|
+
const changes = changesInDeployRange(command, opts.root, previous?.commitSha, sha);
|
|
932
|
+
fallbackCommits = changes.map((commit) => commit.sha);
|
|
933
|
+
withDeployLedgerDb(opts.dbPath, () => {
|
|
934
|
+
const matched = deployChangesForCommits(changes);
|
|
935
|
+
persistDeployChangesSummary({
|
|
936
|
+
id: event.id,
|
|
937
|
+
summary: { range: { ...(event.previousSha ? { previousSha: event.previousSha } : {}), commitSha: event.commitSha }, ...matched, computedAt: now },
|
|
938
|
+
});
|
|
939
|
+
});
|
|
940
|
+
}
|
|
941
|
+
wakeHubSync(command, withDeployLedgerDb(opts.dbPath, () => completeCdDeployTasks({ root: opts.root, runCommand: command, deployId: event.id })).taskIds);
|
|
942
|
+
// #2168: Smoke spawning is disabled until its configuration is fixed. Deploy fan-out already
|
|
943
|
+
// runs with --no-smoke, so do not create a broken smoke agent from the deployed worktree here.
|
|
944
|
+
const smokeCode = 0;
|
|
945
|
+
if (fallbackNeeded && smokeCode === 0) {
|
|
946
|
+
// resolveDeployedVersion reads the worktree's package.json (no DB) — resolve it with the
|
|
947
|
+
// connection still closed, then reopen only for the stamp write.
|
|
948
|
+
const liveIn = resolveDeployedVersion(worktree.checkout, sha);
|
|
949
|
+
withDeployLedgerDb(opts.dbPath, () => {
|
|
950
|
+
stampVerifiedTasks({ deployId: event.id, commitShas: fallbackCommits, liveIn });
|
|
951
|
+
});
|
|
952
|
+
}
|
|
953
|
+
const reason = !event.rolloutPartial ? "Deployed target SHA to the allowlisted fleet."
|
|
954
|
+
: `Deployed target SHA to ${targetIds.join(", ")}; the other Hosts deploy as their restart epochs seal.`;
|
|
955
|
+
return { outcome: "deployed", sha: targetSha, previousSha, reason, observation };
|
|
956
|
+
} catch (error) {
|
|
957
|
+
const reason = errMessage(error);
|
|
958
|
+
withDeployLedgerDb(opts.dbPath, () => {
|
|
959
|
+
const current = getDeployEvent(event.id);
|
|
960
|
+
if (current?.status === "pending") finishDeployEvent({ id: event.id, status: "failed", hosts: [...current.hosts, { id: "fleet", status: "failed", reason }] });
|
|
961
|
+
});
|
|
962
|
+
return { outcome: "failed", sha: targetSha, previousSha, reason: `Deploy failed: ${reason}`, observation };
|
|
963
|
+
} finally {
|
|
964
|
+
removeCdDeployWorktree(worktree, { repoRoot: opts.root, run: command });
|
|
965
|
+
// #1790 — restore the open handle the run's callers expect afterwards (symmetric with #1765's
|
|
966
|
+
// reopen). Kept closed across the worktree-remove subprocess immediately above.
|
|
967
|
+
if (getDbPath() === undefined) openExistingDb(opts.dbPath);
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
if (import.meta.main) {
|
|
972
|
+
// The scheduler must make the same check before scheduling a tick. Keeping it
|
|
973
|
+
// here too makes direct/cron execution fail closed rather than creating a
|
|
974
|
+
// second host-local watcher.
|
|
975
|
+
if (!shouldRunCdWatcherOnThisHost()) {
|
|
976
|
+
console.log("cd-watcher: skipped (this host is not the designated CD control host)");
|
|
977
|
+
process.exit(0);
|
|
978
|
+
}
|
|
979
|
+
// `join(import.meta.dir, "..")` is this script's package root (…/scripts → package root),
|
|
980
|
+
// where package.json lives in every layout — the seed resolveCdRepoRoot needs to derive the
|
|
981
|
+
// origin URL and provision (or reuse) cd-watcher's dedicated detection clone.
|
|
982
|
+
const result = runCdWatcher({ root: resolveCdRepoRoot(join(import.meta.dir, "..")), dbPath: resolveCanonicalRelayDbPath() });
|
|
983
|
+
console.log(JSON.stringify(result));
|
|
984
|
+
process.exitCode = result.outcome === "failed" ? 1 : 0;
|
|
985
|
+
}
|