@humwick/server 0.0.0-stage → 0.130.0
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 +83 -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 +47 -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 +46 -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-BL4UXS_k.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-BK0WV6hF.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 +224 -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 +1196 -0
- package/src/commands-landing-async.ts +166 -0
- package/src/commands-write.ts +160 -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 +43 -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 +92 -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 +50 -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 +333 -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 +174 -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 +46 -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 +57 -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 +42 -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 +19 -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 +286 -0
- package/src/db/config-store-write-ops.ts +58 -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 +15 -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 +72 -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 +94 -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 +25 -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 +15 -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 +24 -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 +96 -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 +57 -0
- package/src/db/orchestrators-read-ops.ts +7 -0
- package/src/db/orchestrators-write-ops.ts +52 -0
- package/src/db/orchestrators.ts +485 -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 +16 -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 +12 -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 +23 -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 +69 -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 +43 -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 +71 -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 +89 -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 +275 -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 +145 -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 +102 -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 +39 -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 +277 -0
- package/src/db/token-db-write-ops.ts +92 -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 +42 -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 +594 -0
- package/src/db/writer-drain.ts +27 -0
- package/src/db/writer-fault-seam.ts +101 -0
- package/src/db/writer-gateway.ts +840 -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 +246 -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 +45 -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 +232 -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 +395 -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 +209 -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 +77 -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,1055 @@
|
|
|
1
|
+
// Event-driven workspace merge-back engine (#237).
|
|
2
|
+
//
|
|
3
|
+
// The branch merge-back used to be driven entirely by a 2-min maintenance poll, so an
|
|
4
|
+
// agent that marked ready waited an invisible up-to-2-min interval with no signal —
|
|
5
|
+
// the "feels like a hung process" UX that was #235's root cause. This module makes the
|
|
6
|
+
// land path EVENT-DRIVEN and demotes the poll to a self-healing backstop (the standard
|
|
7
|
+
// controller pattern: react to events, periodically resync):
|
|
8
|
+
//
|
|
9
|
+
// - on `ready`/`request-review` → `scheduleRepoMerge(repoRoot)` (workspace-actions.ts)
|
|
10
|
+
// - on a merge command settling → `scheduleRepoMerge(repoRoot)` (routes/commands.ts)
|
|
11
|
+
// - periodic backstop + runOnStart → `autoMergeCleanFastForwards` (maintenance.ts def)
|
|
12
|
+
//
|
|
13
|
+
// `landCandidates` is THE single per-candidate land engine; all three entry points
|
|
14
|
+
// funnel through it so the land rule has one home. Dispatch is serialized by the
|
|
15
|
+
// per-repo merge lease inside `requestWorkspaceMerge`, so a single pass dispatches at
|
|
16
|
+
// most one merge per repo — the rest report `heldByLease` and are drained by the
|
|
17
|
+
// on-settle re-trigger. That chain (schedule → dispatch → on-settle re-schedule → next)
|
|
18
|
+
// IS the "sequential drain under the lease" the design calls for; no new concurrency
|
|
19
|
+
// model. Different repos run on independent leases, so they land in parallel.
|
|
20
|
+
|
|
21
|
+
import { fireAndForget } from "@humwick/sdk";
|
|
22
|
+
import {
|
|
23
|
+
createActivityEventAsync,
|
|
24
|
+
emitWorkspaceChange,
|
|
25
|
+
getActiveMergePause,
|
|
26
|
+
getHostAsync,
|
|
27
|
+
getWorkspace,
|
|
28
|
+
listOrchestrators,
|
|
29
|
+
listWorkspaces,
|
|
30
|
+
patchWorkspaceMetadataAsync,
|
|
31
|
+
updateWorkspaceStatus,
|
|
32
|
+
workspaceLandBarrier, updateWorkspaceStatusAsync} from "./db";
|
|
33
|
+
import { findLatestCommandByCorrelation } from "./commands-db";
|
|
34
|
+
import { refreshPendingLandQueueLease } from "./db/commands-claim-admission";
|
|
35
|
+
import { notifyBranchLandFailed } from "./branch-landed";
|
|
36
|
+
import { resolveStewardIdentity } from "./steward-identity";
|
|
37
|
+
import { emitCommandEvent } from "./command-events";
|
|
38
|
+
import { superviseLandConflict } from "./workspace-conflict-resolver";
|
|
39
|
+
import { routeNotification } from "./notification-router";
|
|
40
|
+
import { renderTemplate } from "./prompt-resolver";
|
|
41
|
+
import { isAwaitingReviewerApproval } from "./reviewer-pipeline";
|
|
42
|
+
import { emitWorkspaceTaskSemanticNotifications, markWorkspaceTasksCarryPending } from "./services/task-lifecycle";
|
|
43
|
+
import { requestWorkspaceMerge, workspaceMergeOrchestrators } from "./workspace-merge";
|
|
44
|
+
import { settleWorkspaceCommand } from "./workspace-command-settle";
|
|
45
|
+
import { CLEAR_MERGE_NO_PROGRESS, MAX_NO_PROGRESS_MERGE_ATTEMPTS, mergeBackoffInputFingerprint, mergeBackoffRecoveredFromDirtyWorktree, mergeNoProgressCount, noteMergeNoProgress, sameMergeBackoffInputFingerprint, type MergeBackoffInputFingerprint } from "./workspace-merge-progress";
|
|
46
|
+
import { applyMergeRetryCandidatePolicy } from "./workspace-merge-retry-policy";
|
|
47
|
+
import { recoverTerminalMergeRetry } from "./workspace-land-retry";
|
|
48
|
+
import { recordLandStopped } from "./workspace-land-stopped";
|
|
49
|
+
|
|
50
|
+
import { workspaceActiveClaim } from "./workspace-claim";
|
|
51
|
+
import { notifyWorkspaceHumanEscalation } from "./workspace-human-escalation";
|
|
52
|
+
import { AUTO_LAND_CANDIDATE_STATUSES, DIRTY_WORKTREE_LAND_SKIP_REASON, LAND_IN_FLIGHT_STATUSES } from "./workspace-phase";
|
|
53
|
+
import { runLandGateFailureWatchdog } from "./workspace-land-gate-watchdog";
|
|
54
|
+
import { workspaceAwaitingLandAuthorization } from "./land-authorization";
|
|
55
|
+
import { fetchHostMergePreview } from "./workspace-probe";
|
|
56
|
+
import { reconcileLegacyLandingExecution } from "./services/legacy-landing-recovery";
|
|
57
|
+
import type { Command, WorkspaceAutoMergePolicy, WorkspaceLandingPolicy, WorkspaceMergePreview, WorkspaceMergeStrategy, WorkspaceRecord } from "./types";
|
|
58
|
+
import { stewardFallbackTarget, workspaceAutoMergeEnabled } from "./config";
|
|
59
|
+
import { DeadlineExceededError, withAbortDeadline } from "./async-deadline";
|
|
60
|
+
|
|
61
|
+
const WORKSPACE_AUTO_MERGE_POLICIES = ["on-green", "on-approval", "manual"] as const;
|
|
62
|
+
export { CLEAR_MERGE_NO_PROGRESS, MAX_NO_PROGRESS_MERGE_ATTEMPTS, mergeNoProgressCount, noteMergeNoProgress } from "./workspace-merge-progress";
|
|
63
|
+
|
|
64
|
+
type AutoMergeRequestOptions = {
|
|
65
|
+
requestedBy: "auto-merge";
|
|
66
|
+
strategy?: WorkspaceMergeStrategy;
|
|
67
|
+
profileStrategy?: WorkspaceLandingPolicy;
|
|
68
|
+
autoMerge?: WorkspaceAutoMergePolicy;
|
|
69
|
+
reviewer?: string;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
function workspaceLandStrategy(metadata: Record<string, unknown>): WorkspaceLandingPolicy | undefined {
|
|
73
|
+
const value = metadata.landStrategy;
|
|
74
|
+
return value === "direct" || value === "pr" ? value : undefined;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function workspaceAutoMergePolicy(metadata: Record<string, unknown>): WorkspaceAutoMergePolicy | undefined {
|
|
78
|
+
const value = metadata.autoMerge;
|
|
79
|
+
return typeof value === "string" && (WORKSPACE_AUTO_MERGE_POLICIES as readonly string[]).includes(value)
|
|
80
|
+
? value as WorkspaceAutoMergePolicy
|
|
81
|
+
: undefined;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function workspaceReviewer(metadata: Record<string, unknown>): string | undefined {
|
|
85
|
+
const value = metadata.reviewer;
|
|
86
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function autoMergeRequestOptions(ws: WorkspaceRecord): AutoMergeRequestOptions {
|
|
90
|
+
const landStrategy = workspaceLandStrategy(ws.metadata);
|
|
91
|
+
const autoMerge = workspaceAutoMergePolicy(ws.metadata);
|
|
92
|
+
const reviewer = workspaceReviewer(ws.metadata);
|
|
93
|
+
return {
|
|
94
|
+
requestedBy: "auto-merge",
|
|
95
|
+
...(landStrategy ? { profileStrategy: landStrategy } : {}),
|
|
96
|
+
...(autoMerge ? { autoMerge } : {}),
|
|
97
|
+
...(reviewer ? { reviewer } : {}),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Don't re-escalate a backed-off lane more than once per this window.
|
|
102
|
+
const NO_PROGRESS_ESCALATION_COOLDOWN_MS = 30 * 60 * 1000;
|
|
103
|
+
export const AUTO_MERGE_ERROR_BACKOFF_MS = 3_000;
|
|
104
|
+
export const AUTO_MERGE_WATCHDOG_STALE_MS = 5 * 60 * 1000;
|
|
105
|
+
export const IN_FLIGHT_WORKSPACE_WATCHDOG_AGE_MS = 20 * 60 * 1000;
|
|
106
|
+
// #2232 — hard per-cycle deadline for one `autoMergeForRepo` dispatch cycle. Deliberately BELOW
|
|
107
|
+
// AUTO_MERGE_WATCHDOG_STALE_MS so a wedged cycle self-terminates and releases its repo lane before the
|
|
108
|
+
// watchdog even has to consider it; the watchdog force-restart below is the second layer, not the first.
|
|
109
|
+
// Sized well above a healthy sweep (per-candidate host preview 8s, reservation 40s, all already bounded)
|
|
110
|
+
// — and an over-tight deadline costs only re-probing, never lost work: the rows stay landable and the
|
|
111
|
+
// next cycle (event trigger, watchdog, or the ~10-min backstop) re-sweeps them.
|
|
112
|
+
export const AUTO_MERGE_CYCLE_DEADLINE_MS = 4 * 60 * 1000;
|
|
113
|
+
// #2232 — how many multiples of the staleness threshold a repo lane must sit wedged (with a run state
|
|
114
|
+
// still in the map) before the watchdog stops politely flagging a rerun and FORCE-replaces the run.
|
|
115
|
+
export const AUTO_MERGE_WATCHDOG_FORCE_RESTART_FACTOR = 2;
|
|
116
|
+
|
|
117
|
+
const TERMINAL_COMMAND_STATUSES = new Set(["succeeded", "failed", "timed_out", "rejected", "canceled"]);
|
|
118
|
+
|
|
119
|
+
// Surface a lane auto-merge can't advance (#638): wake the repo steward (if enabled) and
|
|
120
|
+
// route a stranded-escalation notice to the configured fallback / workspace owner, so a
|
|
121
|
+
// no-progress lane raises attention instead of churning silently. Cooldown-guarded so a
|
|
122
|
+
// persistently-stuck row isn't re-escalated every sweep.
|
|
123
|
+
// #1953 RC1 — `_tip` is retained for call-site compatibility but no longer consumed: the branch tip
|
|
124
|
+
// only mattered for the steward-handoff watchdog re-arm, and a no-progress backoff no longer hands
|
|
125
|
+
// off to a steward (it escalates to the coordinator instead).
|
|
126
|
+
async function escalateNoProgressMerge(ws: WorkspaceRecord, _tip?: string): Promise<void> {
|
|
127
|
+
const meta = ws.metadata as Record<string, unknown>;
|
|
128
|
+
await recordLandStopped(ws.id, typeof meta.mergeRetryHeadMismatchAt === "number" ? "head-moved" : typeof meta.mergeRetryExhaustedAt === "number" ? "retry-exhausted" : "no-progress", typeof meta.mergeError === "string" ? meta.mergeError : undefined);
|
|
129
|
+
if (typeof meta.mergeRetryHeadMismatchAt === "number" && typeof meta.autoMergeBackedOffAt === "number") return;
|
|
130
|
+
const lastEscalated = typeof meta.autoMergeBackedOffAt === "number" ? meta.autoMergeBackedOffAt : 0;
|
|
131
|
+
if (lastEscalated && Date.now() - lastEscalated < NO_PROGRESS_ESCALATION_COOLDOWN_MS) return;
|
|
132
|
+
const mergeError = typeof meta.mergeError === "string" && meta.mergeError ? meta.mergeError : "merge made no progress";
|
|
133
|
+
const { coordinatorAgentId } = resolveStewardIdentity(ws);
|
|
134
|
+
const fallback = stewardFallbackTarget();
|
|
135
|
+
const recipients = [...new Set([coordinatorAgentId, fallback, ws.ownerAgentId].filter((r): r is string => Boolean(r)))];
|
|
136
|
+
const subject = "Workspace can't auto-land — needs attention";
|
|
137
|
+
const body = renderTemplate("steward.merge-stall", {
|
|
138
|
+
wsId: ws.id, branch: `\`${ws.branch ?? ws.id}\``,
|
|
139
|
+
repoRoot: ws.repoRoot,
|
|
140
|
+
attempts: String(MAX_NO_PROGRESS_MERGE_ATTEMPTS),
|
|
141
|
+
mergeError,
|
|
142
|
+
baseRef: ws.baseRef ?? "base",
|
|
143
|
+
});
|
|
144
|
+
const payload = { kind: "workspace.auto-merge-stuck", workspaceId: ws.id, repoRoot: ws.repoRoot, branch: ws.branch, baseRef: ws.baseRef, attempts: MAX_NO_PROGRESS_MERGE_ATTEMPTS, reason: mergeError };
|
|
145
|
+
let escalated = false;
|
|
146
|
+
if (recipients.length) {
|
|
147
|
+
notifyBranchLandFailed({ workspace: ws,
|
|
148
|
+
commandId: typeof meta.mergeCommandId === "string" ? meta.mergeCommandId : undefined,
|
|
149
|
+
recipients,
|
|
150
|
+
reason: `auto-merge backed off after ${MAX_NO_PROGRESS_MERGE_ATTEMPTS} no-progress attempts (${mergeError})`,
|
|
151
|
+
});
|
|
152
|
+
escalated = true;
|
|
153
|
+
} else {
|
|
154
|
+
const human = notifyWorkspaceHumanEscalation({ subject, body, payload, source: "workspace-auto-merge" });
|
|
155
|
+
escalated = human.accepted;
|
|
156
|
+
if (!human.accepted) {
|
|
157
|
+
console.warn(`[workspace-auto-merge] no-progress escalation for ${ws.id} had zero agent recipients and no human channel: ${human.reason ?? "unknown reason"}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// A metadata patch is silent, so push the owner's amber land ring explicitly (#2983).
|
|
161
|
+
if (escalated) emitWorkspaceChange(await patchWorkspaceMetadataAsync(ws.id, { autoMergeBackedOffAt: Date.now() }));
|
|
162
|
+
await createActivityEventAsync({
|
|
163
|
+
clientId: `workspace-auto-merge-backoff-${ws.id}-${Date.now()}`,
|
|
164
|
+
kind: "state",
|
|
165
|
+
title: "Auto-merge backed off (no progress)",
|
|
166
|
+
body: `${ws.branch ?? ws.id} → ${ws.baseRef ?? "base"} failed to land ${MAX_NO_PROGRESS_MERGE_ATTEMPTS}× without progress — stopping the merge loop (${mergeError})`,
|
|
167
|
+
meta: ws.branch ?? ws.id,
|
|
168
|
+
icon: "ti-alert-octagon",
|
|
169
|
+
view: "orchestrators",
|
|
170
|
+
metadata: { source: "server", maintenanceJobId: "workspace-auto-merge", workspaceId: ws.id, attempts: MAX_NO_PROGRESS_MERGE_ATTEMPTS },
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
async function notifyProtectedTipRestore(ws: WorkspaceRecord, preview: WorkspaceMergePreview): Promise<{ ok: boolean; stale?: boolean }> {
|
|
175
|
+
const discardedRef = preview.protectedTipDiscardedRef;
|
|
176
|
+
const discardedHead = preview.protectedTipDiscardedHead;
|
|
177
|
+
if (!discardedRef || !discardedHead) return { ok: true };
|
|
178
|
+
// #1456 — durably mark the workspace + every bound Task `carry-pending` the moment the revert is
|
|
179
|
+
// reported. Authoritative state written here-and-now (multi-host-safe, no later git read), so a task
|
|
180
|
+
// whose delivered tip was discarded CANNOT reach landed-on-main by any land path until the carry is
|
|
181
|
+
// explicitly confirmed. Returns ok=false if it could NOT durably record the obligation — the caller
|
|
182
|
+
// fails closed on that (withholds the steward hand-off) rather than risk a silent divergent land.
|
|
183
|
+
const carry = markWorkspaceTasksCarryPending(ws, discardedHead);
|
|
184
|
+
const body = `Workspace \`${ws.branch ?? ws.id}\` restored protected tip \`${preview.protectedTip?.slice(0, 12) ?? "unknown"}\`; discarded HEAD \`${discardedHead.slice(0, 12)}\` was preserved at \`${discardedRef}\`.`;
|
|
185
|
+
await createActivityEventAsync({
|
|
186
|
+
clientId: `workspace-protected-tip-restore-${ws.id}-${Date.now()}`,
|
|
187
|
+
kind: "state",
|
|
188
|
+
title: "Protected workspace tip restored",
|
|
189
|
+
body,
|
|
190
|
+
meta: ws.branch ?? ws.id,
|
|
191
|
+
icon: "ti-shield",
|
|
192
|
+
view: "orchestrators",
|
|
193
|
+
metadata: { source: "server", maintenanceJobId: "workspace-auto-merge", workspaceId: ws.id, protectedTip: preview.protectedTip, discardedHead, discardedRef },
|
|
194
|
+
});
|
|
195
|
+
// #1912 C3 — the activity write yielded. Do not send a land-path notification using a row a
|
|
196
|
+
// concurrent reconcile/stop has retired, repointed, or reassigned while the write was pending.
|
|
197
|
+
const current = getWorkspace(ws.id); if (!current || current.status !== ws.status || current.ownerAgentId !== ws.ownerAgentId) return { ok: carry.ok, stale: true };
|
|
198
|
+
const { coordinatorAgentId } = resolveStewardIdentity(current);
|
|
199
|
+
const recipients = [...new Set([coordinatorAgentId, current.ownerAgentId].filter((r): r is string => Boolean(r)))];
|
|
200
|
+
if (recipients.length) {
|
|
201
|
+
routeNotification({
|
|
202
|
+
type: "workspace.land_gate_warning",
|
|
203
|
+
scope: { workspaceId: current.id, repoRoot: current.repoRoot, author: current.ownerAgentId, parent: coordinatorAgentId ?? undefined },
|
|
204
|
+
recipients,
|
|
205
|
+
message: {
|
|
206
|
+
subject: "Workspace protected tip restored",
|
|
207
|
+
body,
|
|
208
|
+
payload: { kind: "workspace.protected-tip-restore", workspaceId: current.id, repoRoot: current.repoRoot, branch: current.branch, protectedTip: preview.protectedTip, discardedHead, discardedRef },
|
|
209
|
+
},
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
return { ok: carry.ok };
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
interface LandSweepResult {
|
|
216
|
+
scanned: number;
|
|
217
|
+
merged: string[];
|
|
218
|
+
heldByLease: string[];
|
|
219
|
+
heldByClaim: string[];
|
|
220
|
+
heldByPause: string[];
|
|
221
|
+
heldAwaitingApproval: string[];
|
|
222
|
+
previewUnavailable: string[];
|
|
223
|
+
dirtyWorktree: string[];
|
|
224
|
+
backedOff: string[];
|
|
225
|
+
leftForSteward: string[];
|
|
226
|
+
wokeStewards: string[];
|
|
227
|
+
// #1473 round-3 F3 — candidates whose land-authorization is stale: the live branch head has moved
|
|
228
|
+
// past the delivered tip it was authorized for (walked-back + re-pushed unreviewed work), so the
|
|
229
|
+
// dispatch is withheld rather than re-landing the branch on that stale authorization.
|
|
230
|
+
staleAuthorization: string[];
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function emptyLandSweep(): LandSweepResult {
|
|
234
|
+
return { scanned: 0, merged: [], heldByLease: [], heldByClaim: [], heldByPause: [], heldAwaitingApproval: [], previewUnavailable: [], dirtyWorktree: [], backedOff: [], leftForSteward: [], wokeStewards: [], staleAuthorization: [] };
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function mergeInputFingerprint(ws: WorkspaceRecord, preview: WorkspaceMergePreview): MergeBackoffInputFingerprint {
|
|
238
|
+
const meta = ws.metadata as Record<string, unknown>;
|
|
239
|
+
const conflictScanBaseSha = typeof meta.conflictScanBaseSha === "string" ? meta.conflictScanBaseSha : undefined;
|
|
240
|
+
const previewUsesRemoteBase = typeof preview.baseRef === "string"
|
|
241
|
+
&& (preview.baseRef.startsWith("origin/") || preview.baseRef.startsWith("refs/remotes/origin/"));
|
|
242
|
+
return {
|
|
243
|
+
headSha: preview.headSha ?? null,
|
|
244
|
+
protectedTipSha: preview.protectedTip ?? null,
|
|
245
|
+
// #2608 gap 1: this must be a live observation, never the workspace row's creation-time baseSha.
|
|
246
|
+
baseSha: preview.baseSha ?? conflictScanBaseSha ?? null,
|
|
247
|
+
// The conflict scanner records a freshly-fetched remote base. A stale-base recovery preview
|
|
248
|
+
// also names origin/<base> directly, so it can supply the same signal without another fetch.
|
|
249
|
+
originBaseSha: conflictScanBaseSha ?? (previewUsesRemoteBase ? preview.baseSha ?? null : null),
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
async function fetchFirstUsableMergePreview(
|
|
254
|
+
ws: WorkspaceRecord,
|
|
255
|
+
orchestrators: ReturnType<typeof listOrchestrators>,
|
|
256
|
+
): Promise<WorkspaceMergePreview | { available: false } | null> {
|
|
257
|
+
for (const orch of workspaceMergeOrchestrators(ws, orchestrators)) {
|
|
258
|
+
if (!orch.apiUrl) continue;
|
|
259
|
+
const preview = await fetchHostMergePreview(orch.apiUrl, ws, { protectTip: true });
|
|
260
|
+
if (!preview || (preview as { available?: false }).available === false) continue;
|
|
261
|
+
const p = preview as WorkspaceMergePreview;
|
|
262
|
+
if (p.error || p.missing) continue;
|
|
263
|
+
return p;
|
|
264
|
+
}
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Deterministic auto-land (Layer 0, #167/#207/#242): land fast-forwardable ready work
|
|
269
|
+
// under the shared per-repo lease; moved-base/non-ff direct lands fail visibly and
|
|
270
|
+
// re-enter the steward/coordinator loop. THE single per-candidate land engine — see module header.
|
|
271
|
+
async function landCandidates(
|
|
272
|
+
candidates: WorkspaceRecord[],
|
|
273
|
+
orchestrators: ReturnType<typeof listOrchestrators>,
|
|
274
|
+
signal?: AbortSignal,
|
|
275
|
+
/** #1819 — out-param counting the leading candidates this sweep actually PROCESSED, so an aborted
|
|
276
|
+
* caller can tell which repos it genuinely drained from which it merely started. */
|
|
277
|
+
progress?: { processed: number },
|
|
278
|
+
): Promise<LandSweepResult> {
|
|
279
|
+
const merged: string[] = [], previewUnavailable: string[] = [];
|
|
280
|
+
const heldByLease: string[] = [], heldByClaim: string[] = [], heldByPause: string[] = [], heldAwaitingApproval: string[] = [], dirtyWorktree: string[] = [], backedOff: string[] = [], leftForSteward: string[] = [], wokeStewards: string[] = [], staleAuthorization: string[] = [];
|
|
281
|
+
|
|
282
|
+
for (const candidate of candidates) {
|
|
283
|
+
let ws = candidate;
|
|
284
|
+
// #1819 — genuinely cancellable: each candidate awaits a host merge preview, so an abort lands
|
|
285
|
+
// in that await and the sweep stops at the next workspace. The checkpoint is deliberately at the
|
|
286
|
+
// TOP of a candidate and nowhere else — below it a lane's no-progress counter, mergeError and
|
|
287
|
+
// dispatch are one bookkeeping unit, and bailing between them would strand a lane mid-decision.
|
|
288
|
+
if (signal?.aborted) break;
|
|
289
|
+
if (progress) progress.processed++;
|
|
290
|
+
if (isAwaitingReviewerApproval(ws)) { heldAwaitingApproval.push(ws.id); continue; }
|
|
291
|
+
// A claimed workspace is being validated by a steward — don't race it (#208).
|
|
292
|
+
if (workspaceActiveClaim(ws)) { heldByClaim.push(ws.id); continue; }
|
|
293
|
+
if (getActiveMergePause(ws.repoRoot, ws.baseRef ?? "main")) { heldByPause.push(ws.id); continue; }
|
|
294
|
+
// A capped lane gets one cheap SHA-only input comparison per sweep. The host preview is also
|
|
295
|
+
// the probe we reuse below when an input changed, so re-arming never causes a second fetch.
|
|
296
|
+
// Static inputs remain capped; HEAD, protected-tip pin, preview/conflict-scan base, or fresh
|
|
297
|
+
// origin/base movement clears the strike budget exactly once and lets this preview decide.
|
|
298
|
+
let wasBackedOff = mergeNoProgressCount(ws.metadata) >= MAX_NO_PROGRESS_MERGE_ATTEMPTS;
|
|
299
|
+
const preview = await fetchFirstUsableMergePreview(ws, orchestrators);
|
|
300
|
+
if (!preview) {
|
|
301
|
+
if (wasBackedOff) {
|
|
302
|
+
backedOff.push(ws.id);
|
|
303
|
+
await escalateNoProgressMerge(ws);
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
previewUnavailable.push(ws.id);
|
|
307
|
+
// #1025 A5 — a lane whose preview is persistently unusable (owner host offline, the
|
|
308
|
+
// worktree path is gone, or every probe returns error/missing) used to exit here with
|
|
309
|
+
// ZERO side effects: no no-progress, no wake, no notify — a ready branch would strand
|
|
310
|
+
// silently forever. Give it the SAME no-progress/strand path as the unknown-merge-state
|
|
311
|
+
// lane so no status is escalation-blind: advance the loop-breaker, and once it crosses
|
|
312
|
+
// the cap, escalateNoProgressMerge fires the owner `landed-failure` wake + steward/
|
|
313
|
+
// coordinator escalation. A transient blip self-clears when a usable preview returns.
|
|
314
|
+
const held = await patchWorkspaceMetadataAsync(ws.id, {
|
|
315
|
+
...noteMergeNoProgress(ws.metadata),
|
|
316
|
+
mergeError: "no online host returned a usable merge preview (owner offline, worktree missing, or probe error)",
|
|
317
|
+
lastPreviewUnavailableAt: Date.now(),
|
|
318
|
+
}) ?? ws;
|
|
319
|
+
if (mergeNoProgressCount(held.metadata) >= MAX_NO_PROGRESS_MERGE_ATTEMPTS) {
|
|
320
|
+
backedOff.push(ws.id);
|
|
321
|
+
await escalateNoProgressMerge(held);
|
|
322
|
+
}
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
// A host preview is an awaited read of mutable workspace state. Re-load the row before any
|
|
326
|
+
// retry-policy decision or metadata write: an owner can hand the same HEAD off again while the
|
|
327
|
+
// preview is in flight, which clears the old retry incident and advances landRequestAttemptAt.
|
|
328
|
+
// The retry-policy writer CASes this exact snapshot, closing the smaller read→write window too.
|
|
329
|
+
const current = getWorkspace(ws.id);
|
|
330
|
+
if (!current
|
|
331
|
+
|| current.repoRoot !== ws.repoRoot
|
|
332
|
+
|| current.worktreePath !== ws.worktreePath
|
|
333
|
+
|| (current.baseRef ?? "main") !== (ws.baseRef ?? "main")
|
|
334
|
+
|| current.mode !== "isolated"
|
|
335
|
+
|| !current.worktreePath
|
|
336
|
+
|| !AUTO_LAND_CANDIDATE_STATUSES.has(current.status)
|
|
337
|
+
|| workspaceLandBarrier(current).blocked
|
|
338
|
+
|| workspaceAwaitingLandAuthorization(current)) continue;
|
|
339
|
+
ws = current;
|
|
340
|
+
if (isAwaitingReviewerApproval(ws)) { heldAwaitingApproval.push(ws.id); continue; }
|
|
341
|
+
if (workspaceActiveClaim(ws)) { heldByClaim.push(ws.id); continue; }
|
|
342
|
+
if (getActiveMergePause(ws.repoRoot, ws.baseRef ?? "main")) { heldByPause.push(ws.id); continue; }
|
|
343
|
+
wasBackedOff = mergeNoProgressCount(ws.metadata) >= MAX_NO_PROGRESS_MERGE_ATTEMPTS;
|
|
344
|
+
const p = preview as WorkspaceMergePreview;
|
|
345
|
+
const inputFingerprint = mergeInputFingerprint(ws, p);
|
|
346
|
+
// Queue/no-verdict refusals are a retry incident scoped to cause + handed-off HEAD + land
|
|
347
|
+
// attempt. Keep every such row visible to this preview seam: it is the only place that can
|
|
348
|
+
// observe a new HEAD and re-arm immediately. A boolean candidate filter would permanently hide
|
|
349
|
+
// exhausted rows and could neither surface their exhaustion nor recover them after new work.
|
|
350
|
+
const retryPolicy = await applyMergeRetryCandidatePolicy(ws, p.headSha, inputFingerprint, escalateNoProgressMerge);
|
|
351
|
+
ws = retryPolicy.workspace;
|
|
352
|
+
if (retryPolicy.rearmed) wasBackedOff = false;
|
|
353
|
+
if (retryPolicy.exhausted) backedOff.push(ws.id);
|
|
354
|
+
if (retryPolicy.retryAt !== undefined) scheduleRepoMergeAt(ws.repoRoot, retryPolicy.retryAt);
|
|
355
|
+
if (retryPolicy.stop) continue;
|
|
356
|
+
const dirtyCount = p.dirtyCount ?? 0;
|
|
357
|
+
// #1695 — worktree cleanliness is not a SHA input: cleaning uncommitted files can leave
|
|
358
|
+
// HEAD and every base observation unchanged. Preserve that narrow self-heal alongside the
|
|
359
|
+
// fingerprint comparison; a still-dirty preview remains capped and cannot dispatch.
|
|
360
|
+
if (wasBackedOff) {
|
|
361
|
+
const stamped = mergeBackoffInputFingerprint(ws.metadata);
|
|
362
|
+
if (!mergeBackoffRecoveredFromDirtyWorktree(ws.metadata, p) && sameMergeBackoffInputFingerprint(stamped, inputFingerprint)) {
|
|
363
|
+
backedOff.push(ws.id);
|
|
364
|
+
await escalateNoProgressMerge(ws, p.headSha);
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
ws = await patchWorkspaceMetadataAsync(ws.id, {
|
|
368
|
+
...CLEAR_MERGE_NO_PROGRESS,
|
|
369
|
+
autoMergeObservedInputFingerprint: inputFingerprint,
|
|
370
|
+
}) ?? ws;
|
|
371
|
+
} else {
|
|
372
|
+
ws = await patchWorkspaceMetadataAsync(ws.id, { autoMergeObservedInputFingerprint: inputFingerprint }) ?? ws;
|
|
373
|
+
}
|
|
374
|
+
// #1473 round-3 F3 — head-pin the authorization now that the live head is known. The candidacy
|
|
375
|
+
// filter (landableWorkspaces) only proved a land-authorizing delivery EXISTS for this workspace;
|
|
376
|
+
// here we additionally require the live branch head to still match the delivered tip it was
|
|
377
|
+
// authorized for. A branch that walked its land back (merge_planned → review_requested) and then
|
|
378
|
+
// re-pushed UNREVIEWED commits has a moved head, so withhold the dispatch AND the steward hand-off
|
|
379
|
+
// rather than re-landing the new head on the stale authorization.
|
|
380
|
+
if (workspaceAwaitingLandAuthorization(ws, { currentHead: p.headSha })) {
|
|
381
|
+
staleAuthorization.push(ws.id);
|
|
382
|
+
await recordLandStopped(ws.id, "stale-authorization", `branch head ${p.headSha ?? "?"} is not the delivered head; re-deliver it`);
|
|
383
|
+
continue;
|
|
384
|
+
}
|
|
385
|
+
// #1456 (BLOCKER 4) FAIL CLOSED — if the carry-pending obligation could NOT be durably recorded, do
|
|
386
|
+
// NOT hand this workspace to a steward (it could land a divergent lineage with no gate). Note
|
|
387
|
+
// no-progress + (on repeat) escalate; the next sweep re-attempts the mark, then the hand-off proceeds.
|
|
388
|
+
const protectedTipRestore = p.protectedTipRestored ? await notifyProtectedTipRestore(ws, p) : undefined; if (protectedTipRestore?.stale) continue;
|
|
389
|
+
if (protectedTipRestore && !protectedTipRestore.ok) {
|
|
390
|
+
const heldCarry = await patchWorkspaceMetadataAsync(ws.id, { ...noteMergeNoProgress(ws.metadata, inputFingerprint), mergeError: "#1456 fail-closed: could not durably record the carry-pending obligation for a moved-base protected-tip revert; withholding steward hand-off", lastCarryPendingMarkFailedAt: Date.now() }) ?? ws;
|
|
391
|
+
if (mergeNoProgressCount(heldCarry.metadata) >= MAX_NO_PROGRESS_MERGE_ATTEMPTS) { backedOff.push(ws.id); await escalateNoProgressMerge(heldCarry, p.headSha); }
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
if (p.reason === DIRTY_WORKTREE_LAND_SKIP_REASON || dirtyCount > 0) {
|
|
395
|
+
const mergeError = p.reason ?? DIRTY_WORKTREE_LAND_SKIP_REASON;
|
|
396
|
+
const heldDirty = await patchWorkspaceMetadataAsync(ws.id, {
|
|
397
|
+
...noteMergeNoProgress(ws.metadata, inputFingerprint),
|
|
398
|
+
mergeError,
|
|
399
|
+
lastLandSkipReason: DIRTY_WORKTREE_LAND_SKIP_REASON,
|
|
400
|
+
lastLandSkipAt: Date.now(),
|
|
401
|
+
}) ?? ws;
|
|
402
|
+
dirtyWorktree.push(ws.id);
|
|
403
|
+
if (mergeNoProgressCount(heldDirty.metadata) >= MAX_NO_PROGRESS_MERGE_ATTEMPTS) {
|
|
404
|
+
backedOff.push(ws.id);
|
|
405
|
+
await escalateNoProgressMerge(heldDirty, p.headSha);
|
|
406
|
+
}
|
|
407
|
+
continue;
|
|
408
|
+
} else if (wasBackedOff) {
|
|
409
|
+
// The changed fingerprint already cleared the strike budget before this single re-probe.
|
|
410
|
+
// Clear the stale verdict too; the current preview supplies the replacement verdict below.
|
|
411
|
+
await patchWorkspaceMetadataAsync(ws.id, {
|
|
412
|
+
mergeError: undefined,
|
|
413
|
+
lastLandSkipReason: undefined,
|
|
414
|
+
lastLandSkipAt: undefined,
|
|
415
|
+
lastMergeStateUnknownAt: undefined,
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
const ahead = p.unmergedAhead ?? p.ahead ?? 0;
|
|
420
|
+
const behind = p.behind ?? 0;
|
|
421
|
+
// Dispatch anything that won't conflict. If the effective strategy is direct and the
|
|
422
|
+
// branch is behind the current base, the host fails fast with a caller-facing
|
|
423
|
+
// direct-land error (#1184); PR strategy can still use the same preview.
|
|
424
|
+
// Only a predicted conflict (true) or unknown state (undefined) goes to the steward.
|
|
425
|
+
// A no-op (#230) — nothing to land (ahead=0, clean) — is also landable: the host
|
|
426
|
+
// resolves it to a terminal `merged` status, draining the queue instead of waking
|
|
427
|
+
// the steward every sweep for a workspace with no work.
|
|
428
|
+
// #1249/#1242 — a protected-tip restore means the base moved under this branch and the
|
|
429
|
+
// worker tip was reverted to avoid clobbering it. The re-preview (protectTip:false) then
|
|
430
|
+
// reports the RESTORED tip as cleanly landable (`conflict:false, ahead>0`), so `canLand`
|
|
431
|
+
// would be true and we'd RE-DISPATCH the exact land that just reverted — a silent loop that
|
|
432
|
+
// never escalates. Force a restore to be non-landable so it routes to the steward hand-off
|
|
433
|
+
// below (stop the loop + wake the steward) instead of re-dispatching.
|
|
434
|
+
const protectedTipRestored = p.protectedTipRestored === true;
|
|
435
|
+
const canLand = !protectedTipRestored && (p.noop === true || (p.conflict === false && ahead > 0));
|
|
436
|
+
if (!canLand) {
|
|
437
|
+
let handoffWorkspace = ws;
|
|
438
|
+
if (p.conflict !== true) {
|
|
439
|
+
// #2607 (d) — fail loud: when the host flags a stale local base, name the base and
|
|
440
|
+
// its staleness instead of the generic "merge state unknown". The stale-base detail
|
|
441
|
+
// carries the used base ref + SHAs, so the wedge is diagnosable from metadata alone.
|
|
442
|
+
const staleDetail = typeof p.baseStaleDetail === "string" && p.baseStaleDetail ? p.baseStaleDetail : undefined;
|
|
443
|
+
const staleRecoveredNote = p.baseStaleRecovered === true && p.baseRef
|
|
444
|
+
? ` (re-evaluated against fresh remote base '${p.baseRef}'${p.baseSha ? ` @ ${String(p.baseSha).slice(0, 12)}` : ""})`
|
|
445
|
+
: "";
|
|
446
|
+
const mergeError = protectedTipRestored
|
|
447
|
+
? "base moved under the branch; protected worker tip was restored (moved-base revert #1242) — re-dispatch would loop, handing off to a steward"
|
|
448
|
+
: p.protectedTipReachable === false
|
|
449
|
+
? p.protectedTipError ?? "protected worker tip is no longer reachable"
|
|
450
|
+
: staleDetail
|
|
451
|
+
? `stale local base: ${staleDetail}${staleRecoveredNote} (#2607)`
|
|
452
|
+
: p.reason ?? p.error ?? "merge state unknown";
|
|
453
|
+
handoffWorkspace = await patchWorkspaceMetadataAsync(ws.id, {
|
|
454
|
+
...noteMergeNoProgress(ws.metadata, inputFingerprint),
|
|
455
|
+
mergeError,
|
|
456
|
+
lastMergeStateUnknownAt: Date.now(),
|
|
457
|
+
...(p.headSha ? { lastUnknownHeadSha: p.headSha } : {}),
|
|
458
|
+
...(p.baseSha ? { lastUnknownBaseSha: p.baseSha } : {}),
|
|
459
|
+
}) ?? ws;
|
|
460
|
+
if (mergeNoProgressCount(handoffWorkspace.metadata) >= MAX_NO_PROGRESS_MERGE_ATTEMPTS) {
|
|
461
|
+
backedOff.push(ws.id);
|
|
462
|
+
await escalateNoProgressMerge(handoffWorkspace, p.headSha);
|
|
463
|
+
continue;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
leftForSteward.push(ws.id);
|
|
467
|
+
// #1953 RC1 — wake a steward ONLY for a genuine git conflict. A protected-tip revert or a
|
|
468
|
+
// "merge state unknown"/unreachable-tip lane is not something a steward can rebase away; those
|
|
469
|
+
// now route through the no-progress escalation above (→ coordinator/owner/fallback), never a
|
|
470
|
+
// steward that would spawn, find nothing to resolve, and re-strand the row. #2704 — with no
|
|
471
|
+
// steward enabled, the conflict goes straight back to its owner.
|
|
472
|
+
if (p.conflict === true) {
|
|
473
|
+
const wake = await superviseLandConflict(handoffWorkspace, "conflict", { tip: p.headSha });
|
|
474
|
+
if (wake.ok) {
|
|
475
|
+
wokeStewards.push(wake.policy);
|
|
476
|
+
} else if ("cooldown" in wake && !wake.cooldown) {
|
|
477
|
+
// #1021 A1+A2 — a GENUINE wake failure (nothing spawned: host offline / provider
|
|
478
|
+
// error) now correctly yields !ok, so the conflict lane's loop-breaker advances and
|
|
479
|
+
// escalateNoProgressMerge becomes reachable. A cooldown means a steward WAS woken
|
|
480
|
+
// recently and is presumably working — that is not a failure, so don't count it (and
|
|
481
|
+
// don't mislabel the cooldown as a spawn failure in mergeError). Carry the real error.
|
|
482
|
+
const failedHandoff = await patchWorkspaceMetadataAsync(ws.id, {
|
|
483
|
+
...noteMergeNoProgress(ws.metadata, inputFingerprint),
|
|
484
|
+
mergeError: wake.error ?? "cannot spawn steward on the workspace owning host",
|
|
485
|
+
lastStewardWakeFailedAt: Date.now(),
|
|
486
|
+
}) ?? ws;
|
|
487
|
+
if (mergeNoProgressCount(failedHandoff.metadata) >= MAX_NO_PROGRESS_MERGE_ATTEMPTS) {
|
|
488
|
+
backedOff.push(ws.id);
|
|
489
|
+
await escalateNoProgressMerge(failedHandoff, p.headSha);
|
|
490
|
+
continue;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
if (p.conflict === true || protectedTipRestored) {
|
|
495
|
+
emitWorkspaceTaskSemanticNotifications({
|
|
496
|
+
workspace: ws,
|
|
497
|
+
transition: "land-conflict",
|
|
498
|
+
actor: "workspace-auto-merge",
|
|
499
|
+
occurrenceKey: protectedTipRestored
|
|
500
|
+
? `workspace-protected-tip-revert:${ws.id}:${p.baseRef ?? ws.baseRef ?? "base"}:${p.protectedTip ?? "?"}`
|
|
501
|
+
: `workspace-conflict:${ws.id}:${p.baseRef ?? ws.baseRef ?? "base"}:${p.ahead ?? "?"}:${p.behind ?? "?"}`,
|
|
502
|
+
outcome: { reason: protectedTipRestored ? "protected-tip revert" : "conflict", ahead: p.ahead, behind: p.behind, baseRef: p.baseRef },
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
continue;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
// Honor per-spawn land metadata first (#421), then the operator's instance
|
|
509
|
+
// landing.strategy (#419-followup), through the shared resolver in requestWorkspaceMerge
|
|
510
|
+
// so auto-land and manual land cannot drift (#1184).
|
|
511
|
+
// #2608 gap 2 is deliberately not folded into this recovery: the row's baseRef is the durable
|
|
512
|
+
// target branch and baseSha is its fork anchor, while `origin/main` is a host-local evaluation
|
|
513
|
+
// ref. Persisting the latter over either field would change their meaning; the land executor
|
|
514
|
+
// resolves the current target tip again under the landing lease.
|
|
515
|
+
const result = await requestWorkspaceMerge(ws, { ...autoMergeRequestOptions(ws), ...(p.headSha ? { expectedHeadSha: p.headSha } : {}) });
|
|
516
|
+
if (!result.ok) {
|
|
517
|
+
// 409 = another merge holds this repo's lease this tick; the on-settle re-trigger
|
|
518
|
+
// (routes/commands.ts → scheduleRepoMerge) drains it once the lease frees.
|
|
519
|
+
heldByLease.push(ws.id);
|
|
520
|
+
continue;
|
|
521
|
+
}
|
|
522
|
+
emitCommandEvent(result.command, "command.requested");
|
|
523
|
+
merged.push(ws.id);
|
|
524
|
+
await createActivityEventAsync({
|
|
525
|
+
clientId: `workspace-auto-merge-${ws.id}-${Date.now()}`,
|
|
526
|
+
kind: "state",
|
|
527
|
+
title: p.noop ? "Workspace auto-resolving (no work to merge)" : behind > 0 ? "Workspace auto-merging (rebase)" : "Workspace auto-merging (clean fast-forward)",
|
|
528
|
+
body: p.noop
|
|
529
|
+
? `${ws.branch ?? ws.id} → ${p.baseRef ?? "base"} (nothing to land — resolving to merged)`
|
|
530
|
+
: `${ws.branch ?? ws.id} → ${p.baseRef ?? "base"} (${ahead} ahead${behind > 0 ? `, ${behind} behind — rebasing` : ", clean"})`,
|
|
531
|
+
meta: ws.branch ?? ws.id,
|
|
532
|
+
icon: "ti-git-merge",
|
|
533
|
+
view: "orchestrators",
|
|
534
|
+
metadata: { source: "server", maintenanceJobId: "workspace-auto-merge", workspaceId: ws.id, commandId: result.command.id, ahead },
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
return { scanned: candidates.length, merged, heldByLease, heldByClaim, heldByPause, heldAwaitingApproval, previewUnavailable, dirtyWorktree, backedOff, leftForSteward, wokeStewards, staleAuthorization };
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// Coalesced, fire-and-forget per-repo land trigger (see module header). A run already
|
|
542
|
+
// in flight for the repo just flags a rerun, so concurrent readies don't fan out
|
|
543
|
+
// redundant host probes. Errors are swallowed: the runOnStart backstop is the
|
|
544
|
+
// self-healer for anything a dropped run strands.
|
|
545
|
+
// #1473 — the scope a queued rerun must cover. `undefined` was previously overloaded to mean
|
|
546
|
+
// BOTH "nothing pending" and "unfiltered full-repo sweep", so clearing the pending baseRef before
|
|
547
|
+
// the active sweep made a coalesced same-base settle (and every error retry) silently widen to
|
|
548
|
+
// unfiltered. The three states are now explicit: `none` = no rerun queued; `scoped` = rerun only
|
|
549
|
+
// workspaces landing into this base; `unfiltered` = re-sweep every ready-to-land row in the repo.
|
|
550
|
+
type PendingRerun =
|
|
551
|
+
| { kind: "none" }
|
|
552
|
+
| { kind: "scoped"; baseRef: string }
|
|
553
|
+
| { kind: "unfiltered" };
|
|
554
|
+
|
|
555
|
+
const NO_PENDING_RERUN: PendingRerun = { kind: "none" };
|
|
556
|
+
|
|
557
|
+
function pendingRerunFor(baseRef?: string): PendingRerun {
|
|
558
|
+
return baseRef ? { kind: "scoped", baseRef } : { kind: "unfiltered" };
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
// Widen two pending scopes into the narrowest scope that still covers BOTH — a coalescing race may
|
|
562
|
+
// only over-sweep, never under-sweep (dropping a row that needs landing is the dangerous side).
|
|
563
|
+
// Same-base coalescing stays scoped; a disagreement, or any unfiltered party, widens to unfiltered.
|
|
564
|
+
function widenPendingRerun(a: PendingRerun, b: PendingRerun): PendingRerun {
|
|
565
|
+
if (a.kind === "none") return b;
|
|
566
|
+
if (b.kind === "none") return a;
|
|
567
|
+
if (a.kind === "unfiltered" || b.kind === "unfiltered") return { kind: "unfiltered" };
|
|
568
|
+
return a.baseRef === b.baseRef ? { kind: "scoped", baseRef: a.baseRef } : { kind: "unfiltered" };
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
type RepoMergeRunState = {
|
|
572
|
+
lastProgressAt: number;
|
|
573
|
+
pending: PendingRerun;
|
|
574
|
+
// #2232 — this run must never resume: its cycle blew the deadline, or the watchdog force-replaced it
|
|
575
|
+
// with a fresh loop. Checked at the loop's continue condition AND in its catch, so a wedged cycle that
|
|
576
|
+
// finally unblocks unwinds instead of running a second, concurrent sweep behind its replacement.
|
|
577
|
+
abandoned?: boolean;
|
|
578
|
+
// #2232 — the in-flight cycle's controller, so the deadline and the watchdog can both cancel it
|
|
579
|
+
// (a cooperative sweep stops at its next per-candidate checkpoint; a wedged await is abandoned).
|
|
580
|
+
abort?: AbortController;
|
|
581
|
+
};
|
|
582
|
+
|
|
583
|
+
const repoMergeRunning = new Map<string, RepoMergeRunState>();
|
|
584
|
+
const repoMergeLastCompletedAt = new Map<string, number>();
|
|
585
|
+
let autoMergeWatchdogStartedAt = Date.now();
|
|
586
|
+
let autoMergeCycleDeadlineMs = AUTO_MERGE_CYCLE_DEADLINE_MS;
|
|
587
|
+
|
|
588
|
+
/** Test-only (#2232): shrink the per-cycle deadline so a hung-cycle test needn't wait minutes. */
|
|
589
|
+
export function __setAutoMergeCycleDeadlineForTests(ms?: number): void {
|
|
590
|
+
autoMergeCycleDeadlineMs = ms ?? AUTO_MERGE_CYCLE_DEADLINE_MS;
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
function errMessage(error: unknown): string {
|
|
594
|
+
if (error instanceof Error) return `${error.name}: ${error.message}`;
|
|
595
|
+
return String(error);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
// #1473 — when `baseRef` is given, only workspaces landing INTO that same base are "affected"
|
|
599
|
+
// by the just-settled merge (main moved under them); a workspace targeting a different base is
|
|
600
|
+
// untouched and must not be re-probed/re-woken on every unrelated settle in the repo. Omitting
|
|
601
|
+
// `baseRef` preserves the original unfiltered sweep (used by the ready/request-review trigger,
|
|
602
|
+
// the watchdog restart, and the periodic `autoMergeCleanFastForwards` backstop).
|
|
603
|
+
function landableWorkspaces(repoRoot?: string, baseRef?: string): WorkspaceRecord[] {
|
|
604
|
+
return listWorkspaces(repoRoot ? { repoRoot } : undefined).filter(
|
|
605
|
+
// #1482 — an explicitly landBlocked workspace is NEVER an auto-merge candidate, so it is
|
|
606
|
+
// never dispatched and never wakes a steward. Covers all three sweep triggers (event, backstop,
|
|
607
|
+
// watchdog) at this single selection filter.
|
|
608
|
+
// #1473 — nor is a workspace bound to a deliverable Task that has NOT authorized a land: a pushed
|
|
609
|
+
// `agent/*` branch in a ready-to-land status is not, by itself, a land authorization (a "HOLD" is
|
|
610
|
+
// coordinator convention only). Excluding it here keeps it out of BOTH the auto-land dispatch and
|
|
611
|
+
// the conflict→steward hand-off that landCandidates performs, at the SAME single selection filter.
|
|
612
|
+
(ws) => ws.mode === "isolated" && Boolean(ws.worktreePath) && AUTO_LAND_CANDIDATE_STATUSES.has(ws.status)
|
|
613
|
+
// #1482 + #2518 (MED 5 single resolver) — the ONE combined land barrier: a landBlocked
|
|
614
|
+
// (review/research) workspace or one bound to a review-held Task is NEVER an auto-merge
|
|
615
|
+
// candidate, so it is never dispatched and never wakes a steward (the held park leaves it
|
|
616
|
+
// `review_requested` with NO authorization; after the coordinator's clear the flag is off
|
|
617
|
+
// and the promoted delivery lands normally). Covers all three sweep triggers (event,
|
|
618
|
+
// backstop, watchdog) and the conflict→steward hand-off at this single selection filter.
|
|
619
|
+
&& !workspaceLandBarrier(ws).blocked
|
|
620
|
+
// #1473 — nor is a workspace bound to a deliverable Task that has NOT authorized a land: a pushed
|
|
621
|
+
// `agent/*` branch in a ready-to-land status is not, by itself, a land authorization (a "HOLD" is
|
|
622
|
+
// coordinator convention only). Excluding it here keeps it out of BOTH the auto-land dispatch and
|
|
623
|
+
// the conflict→steward hand-off that landCandidates performs, at the SAME single selection filter.
|
|
624
|
+
&& !workspaceAwaitingLandAuthorization(ws)
|
|
625
|
+
&& (!baseRef || (ws.baseRef ?? "main") === baseRef),
|
|
626
|
+
);
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
// #2232 (review F2) — `owningState` is the run whose cycle produced this completion, and the stamp is
|
|
630
|
+
// withheld unless that run still OWNS the repo lane. Without the identity guard a ZOMBIE cycle (deadline-
|
|
631
|
+
// abandoned or watchdog force-replaced) that finishes its last candidate still satisfies the caller's
|
|
632
|
+
// stamp gate, and writes its progress onto whatever `repoMergeRunning` holds — by then the REPLACEMENT's
|
|
633
|
+
// state — resetting the live run's watchdog clock and delaying the next force-restart by up to the wedge
|
|
634
|
+
// duration. Same identity check the lane release in `scheduleRepoMerge`'s `finally` already uses. Callers
|
|
635
|
+
// with no owning run (the periodic backstop) pass nothing and stamp unconditionally, as before.
|
|
636
|
+
function noteAutoMergeCycleCompleted(repoRoot: string, owningState?: RepoMergeRunState): void {
|
|
637
|
+
if (owningState && repoMergeRunning.get(repoRoot) !== owningState) return;
|
|
638
|
+
const completedAt = Date.now();
|
|
639
|
+
repoMergeLastCompletedAt.set(repoRoot, completedAt);
|
|
640
|
+
const state = repoMergeRunning.get(repoRoot);
|
|
641
|
+
if (state) state.lastProgressAt = completedAt;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
async function sleep(ms: number): Promise<void> {
|
|
645
|
+
await new Promise<void>((resolve) => {
|
|
646
|
+
const timer = setTimeout(resolve, ms);
|
|
647
|
+
timer.unref?.();
|
|
648
|
+
});
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
const repoMergeWakes = new Map<string, { at: number; timer: ReturnType<typeof setTimeout> }>();
|
|
652
|
+
|
|
653
|
+
function wakeRepoMerge(repoRoot: string): void {
|
|
654
|
+
repoMergeWakes.delete(repoRoot);
|
|
655
|
+
scheduleRepoMerge(repoRoot);
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
/** Wake the repo lane when a deferred retry's backoff ends, not on the next backstop sweep (#2965). */
|
|
659
|
+
function scheduleRepoMergeAt(repoRoot: string, at: number): void {
|
|
660
|
+
const existing = repoMergeWakes.get(repoRoot);
|
|
661
|
+
if (existing && existing.at <= at) return;
|
|
662
|
+
if (existing) clearTimeout(existing.timer);
|
|
663
|
+
const timer = setTimeout(() => wakeRepoMerge(repoRoot), Math.max(0, at - Date.now()));
|
|
664
|
+
timer.unref?.();
|
|
665
|
+
repoMergeWakes.set(repoRoot, { at, timer });
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
/** Test-only (#2965): fire every armed backoff wake now, without waiting on the wall clock. */
|
|
669
|
+
export function __fireRepoMergeWakesForTests(): Array<{ repoRoot: string; at: number }> {
|
|
670
|
+
const fired = [...repoMergeWakes].map(([repoRoot, wake]) => ({ repoRoot, at: wake.at }));
|
|
671
|
+
for (const { repoRoot } of fired) {
|
|
672
|
+
clearTimeout(repoMergeWakes.get(repoRoot)!.timer);
|
|
673
|
+
wakeRepoMerge(repoRoot);
|
|
674
|
+
}
|
|
675
|
+
return fired;
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
// #1473 — `baseRef`, when given, targets this trigger at only the workspaces landing into that
|
|
679
|
+
// base (the one that actually moved), instead of re-sweeping every ready-to-land workspace in
|
|
680
|
+
// the repo. Omit it for an unfiltered sweep (the ready/request-review trigger and watchdog
|
|
681
|
+
// restart both do — those aren't reacting to a specific base moving).
|
|
682
|
+
export function scheduleRepoMerge(repoRoot: string | undefined, baseRef?: string): void {
|
|
683
|
+
if (!repoRoot) return;
|
|
684
|
+
if (!workspaceAutoMergeEnabled()) return;
|
|
685
|
+
const incoming = pendingRerunFor(baseRef);
|
|
686
|
+
const existing = repoMergeRunning.get(repoRoot);
|
|
687
|
+
if (existing) {
|
|
688
|
+
existing.pending = widenPendingRerun(existing.pending, incoming);
|
|
689
|
+
return;
|
|
690
|
+
}
|
|
691
|
+
const state: RepoMergeRunState = { lastProgressAt: Date.now(), pending: incoming };
|
|
692
|
+
repoMergeRunning.set(repoRoot, state);
|
|
693
|
+
void fireAndForget(`[auto-merge] repo lane ${repoRoot}`, async () => {
|
|
694
|
+
let retriedAfterError = false;
|
|
695
|
+
try {
|
|
696
|
+
do {
|
|
697
|
+
// Capture the scope for THIS iteration and reset pending to `none` (not `undefined`), so a
|
|
698
|
+
// concurrent same-base settle arriving during the await queues a fresh scoped rerun instead
|
|
699
|
+
// of being read as an unfiltered one.
|
|
700
|
+
const active = state.pending;
|
|
701
|
+
state.pending = NO_PENDING_RERUN;
|
|
702
|
+
state.lastProgressAt = Date.now();
|
|
703
|
+
const runBaseRef = active.kind === "scoped" ? active.baseRef : undefined;
|
|
704
|
+
// #2232 — BOUND THE CYCLE. `autoMergeForRepo` can hang on an await that never settles or throws
|
|
705
|
+
// (see the module note below), and a hung cycle used to hold this repo's `repoMergeRunning` entry
|
|
706
|
+
// forever: every later trigger coalesced onto a loop that would never reach its next iteration, so
|
|
707
|
+
// the repo silently stopped dispatching ALL merges until a daemon restart. The race rejects within
|
|
708
|
+
// a tick of the deadline even though the awaited work never settles, which is what makes the
|
|
709
|
+
// `finally` below (the lane release) actually reachable.
|
|
710
|
+
const controller = new AbortController();
|
|
711
|
+
state.abort = controller;
|
|
712
|
+
try {
|
|
713
|
+
await withAbortDeadline(autoMergeForRepo(repoRoot, runBaseRef, controller.signal, state), autoMergeCycleDeadlineMs, controller,
|
|
714
|
+
{ label: `auto-merge cycle for ${repoRoot}` });
|
|
715
|
+
} catch (err) {
|
|
716
|
+
// Force-replaced by the watchdog while we were wedged — the fresh loop owns this repo now.
|
|
717
|
+
if (state.abandoned) break;
|
|
718
|
+
if (err instanceof DeadlineExceededError) {
|
|
719
|
+
// #2232 — THE missing hang log. Pre-#2232 a hung cycle produced NO log line at all (it never
|
|
720
|
+
// threw, so the "cycle failed" warn below never fired) — the wedge was invisible in the daemon
|
|
721
|
+
// log and only showed up as merges silently not happening.
|
|
722
|
+
console.error(`[workspace-auto-merge] Repo auto-merge cycle for ${repoRoot} (${runBaseRef ?? "all bases"}) hung past its ${autoMergeCycleDeadlineMs}ms deadline — abandoning the cycle and releasing the repo lane so the next cycle can run`);
|
|
723
|
+
state.abandoned = true;
|
|
724
|
+
break;
|
|
725
|
+
}
|
|
726
|
+
console.warn(`[workspace-auto-merge] Repo auto-merge cycle failed for ${repoRoot}: ${errMessage(err)}`);
|
|
727
|
+
if (!retriedAfterError) {
|
|
728
|
+
retriedAfterError = true;
|
|
729
|
+
await sleep(AUTO_MERGE_ERROR_BACKOFF_MS);
|
|
730
|
+
// Retry the SAME scope that just failed, widened by anything that coalesced in during
|
|
731
|
+
// the failed attempt — never silently promote a scoped retry to a full-repo sweep.
|
|
732
|
+
state.pending = widenPendingRerun(state.pending, active);
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
} while (!state.abandoned && state.pending.kind !== "none");
|
|
736
|
+
} catch {
|
|
737
|
+
// Swallow — the periodic backstop (runOnStart + interval) is the self-healer.
|
|
738
|
+
} finally {
|
|
739
|
+
if (repoMergeRunning.get(repoRoot) === state) repoMergeRunning.delete(repoRoot);
|
|
740
|
+
// #2232 — an abandoned run must not swallow work that coalesced in while it was wedged: now that
|
|
741
|
+
// the lane is released, re-arm a FRESH loop for exactly that queued scope. Only those external
|
|
742
|
+
// arrivals are requeued — the abandoned cycle's OWN scope is re-covered by the watchdog and the
|
|
743
|
+
// periodic backstop, so a persistently wedged repo re-arms on their cadence instead of hot-looping.
|
|
744
|
+
if (state.abandoned && state.pending.kind !== "none") {
|
|
745
|
+
scheduleRepoMerge(repoRoot, state.pending.kind === "scoped" ? state.pending.baseRef : undefined);
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
});
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
export function resetRepoMergeSchedulerForTests(): void {
|
|
752
|
+
for (const wake of repoMergeWakes.values()) clearTimeout(wake.timer);
|
|
753
|
+
repoMergeWakes.clear();
|
|
754
|
+
repoMergeRunning.clear();
|
|
755
|
+
repoMergeLastCompletedAt.clear();
|
|
756
|
+
autoMergeWatchdogStartedAt = Date.now();
|
|
757
|
+
autoMergeCycleDeadlineMs = AUTO_MERGE_CYCLE_DEADLINE_MS;
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
function commandIsTerminal(command: Command | null): boolean {
|
|
761
|
+
return Boolean(command && TERMINAL_COMMAND_STATUSES.has(command.status));
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
function latestWorkspaceCommand(ws: WorkspaceRecord): Command | null {
|
|
765
|
+
const type = LAND_IN_FLIGHT_STATUSES.has(ws.status) ? "workspace.merge" : "workspace.cleanup";
|
|
766
|
+
return findLatestCommandByCorrelation(type, ws.id);
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
async function recoverAgedInFlightWorkspaces(now: number, signal?: AbortSignal): Promise<Record<string, unknown>> {
|
|
770
|
+
const oldEnough = (ws: WorkspaceRecord) => now - ws.updatedAt >= IN_FLIGHT_WORKSPACE_WATCHDOG_AGE_MS;
|
|
771
|
+
const orchestrators = listOrchestrators();
|
|
772
|
+
const recoveredMergePlanned: string[] = [], recoveredCleanupRequested: string[] = [], settledTerminal: string[] = [], stillActive: string[] = [];
|
|
773
|
+
// #2094 Fix A — merge_planned rows reclaimed FAST because their claiming executor is confirmed gone
|
|
774
|
+
// (a restart-orphaned merge), distinct from `recoveredMergePlanned` (aged terminal/missing recovery)
|
|
775
|
+
// and `stillActive` (a genuinely-running gate). Surfaced for operator visibility into the land-wedge.
|
|
776
|
+
const reclaimedOrphaned: string[] = [];
|
|
777
|
+
// #1993 — command ids the sweep force-terminalized because they were stuck non-terminal PAST their
|
|
778
|
+
// own execution lease (a `pending` workspace.merge to a still-online host that `expireCommands`
|
|
779
|
+
// never sweeps). Surfaced for operator visibility into the land-wedge recovery.
|
|
780
|
+
const expiredStaleCommands: string[] = [];
|
|
781
|
+
// #1830 re-review — a dedicated flag set ONLY at the break site, so the returned `aborted` field
|
|
782
|
+
// reports "the checkpoint actually fired" rather than "the signal happened to be aborted by the
|
|
783
|
+
// time the function returned" (true either way once a caller aborts, telling a caller nothing
|
|
784
|
+
// about whether any row was actually skipped).
|
|
785
|
+
let stoppedEarly = false;
|
|
786
|
+
|
|
787
|
+
for (const ws of listWorkspaces().filter((row) =>
|
|
788
|
+
row.mode === "isolated"
|
|
789
|
+
&& Boolean(row.worktreePath)
|
|
790
|
+
&& (LAND_IN_FLIGHT_STATUSES.has(row.status) || row.status === "cleanup_requested"),
|
|
791
|
+
)) {
|
|
792
|
+
// #1830 review F2 — PER-ROW CHECKPOINT (maintenance/jobs.ts:194-197's precedented shape): each
|
|
793
|
+
// iteration below is one atomic settle/status-write unit, so this is the only safe place to stop.
|
|
794
|
+
// Pre-#1830 this loop had no real await in it, so the job's `withTimeout` race (scheduler.ts) always
|
|
795
|
+
// saw an already-resolved promise and its deadline could never actually fire. Now `settleWorkspaceCommand`
|
|
796
|
+
// awaits the bounded async ancestry check (up to the 5s fetch + 2s rev-parse + 2x2s merge-base +
|
|
797
|
+
// escalation bound in git-process.ts, PER aged workspace), so a handful of stuck rows can genuinely
|
|
798
|
+
// overrun the job's deadline. Without this checkpoint the scheduler would time the run out and clear
|
|
799
|
+
// its DB lease while this loop kept running unseen underneath it, able to start a second overlapping
|
|
800
|
+
// pass over the same rows on the next tick (double-settling, double-incrementing no-progress counters).
|
|
801
|
+
if (signal?.aborted) { stoppedEarly = true; break; }
|
|
802
|
+
// #2094 Fix A — resolve the command up front: the executor-orphan fast-path (case C) needs it for a
|
|
803
|
+
// young merge_planned row the 20-min age gate would otherwise skip. Only a merge_planned row can be
|
|
804
|
+
// executor-orphaned, so a young cleanup_requested/non-merge row still pays NO command lookup (the
|
|
805
|
+
// pre-#2094 cost) — fetch only when the row is old enough for the existing recovery OR could be an orphan.
|
|
806
|
+
let command = (LAND_IN_FLIGHT_STATUSES.has(ws.status) || oldEnough(ws)) ? latestWorkspaceCommand(ws) : null;
|
|
807
|
+
if (command?.status === "pending" && command.type === "workspace.merge") {
|
|
808
|
+
if (refreshPendingLandQueueLease(command.id, now)) {
|
|
809
|
+
stillActive.push(ws.id);
|
|
810
|
+
continue;
|
|
811
|
+
}
|
|
812
|
+
const hostId = orchestrators.find((o) => o.agentId === command?.target)?.hostId;
|
|
813
|
+
if (hostId && (await getHostAsync(hostId))?.policy.gatesEnabled === false) {
|
|
814
|
+
stillActive.push(ws.id);
|
|
815
|
+
continue;
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
// #2141 — re-enter terminal legacy misses through review_requested so the normal lane re-previews origin.
|
|
819
|
+
if (await recoverTerminalMergeRetry(ws, command, now, { update: updateWorkspaceStatus, schedule: scheduleRepoMerge, escalate: escalateNoProgressMerge })) continue;
|
|
820
|
+
// #2094 Fix A — case C: a claimed merge whose executor PROCESS a restart replaced, or whose execution
|
|
821
|
+
// journaled a verdict Relay never received (#2935), is reconciled in seconds, not after its lease.
|
|
822
|
+
// Its terminal then takes the ordinary settle below; a no-verdict restart kill retries (#2965).
|
|
823
|
+
if (LAND_IN_FLIGHT_STATUSES.has(ws.status) && (command?.status === "accepted" || command?.status === "running")) {
|
|
824
|
+
const reconciled = await reconcileLegacyLandingExecution(command, orchestrators, now);
|
|
825
|
+
if (reconciled && commandIsTerminal(reconciled)) {
|
|
826
|
+
command = reconciled;
|
|
827
|
+
reclaimedOrphaned.push(ws.id);
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
// Shield young dispatch/withdraw windows; aged rows still need crash recovery (#2859).
|
|
831
|
+
if (!oldEnough(ws) && command?.type === "workspace.merge"
|
|
832
|
+
&& ((typeof ws.metadata.lastWorkspaceActionAt === "number" && command.createdAt < ws.metadata.lastWorkspaceActionAt)
|
|
833
|
+
|| (command.status === "canceled" && command.error?.startsWith("land withdrawn:")))) { stillActive.push(ws.id); continue; }
|
|
834
|
+
// Failed merges settle immediately: conflict scans can keep updatedAt fresh forever (#2859).
|
|
835
|
+
if (!oldEnough(ws) && !(command?.type === "workspace.merge" && command.status !== "succeeded" && commandIsTerminal(command))) continue;
|
|
836
|
+
if (command && !commandIsTerminal(command)) {
|
|
837
|
+
// #1993 (managed-land wedge) — a non-terminal command STILL within its execution lease is
|
|
838
|
+
// genuinely in flight; leave it alone (a real ci-land-full runs well inside the merge command
|
|
839
|
+
// TTL). But one PAST its `expiresAt` is a STUCK merge command that `expireCommands` cannot
|
|
840
|
+
// reach: a `pending` workspace.merge to a still-ONLINE host is never target-gone-swept
|
|
841
|
+
// (#930/#953 keep pending commands for a busy host to poll), and its accepted/running sibling
|
|
842
|
+
// would already have been swept — so a pending-forever command left this row pinned at
|
|
843
|
+
// merge_planned with NO bounded recovery. auto-merge's landable filter excludes merge_planned,
|
|
844
|
+
// and this watchdog used to re-file such a row under `stillActive` on EVERY sweep, so it stayed
|
|
845
|
+
// wedged (status merge_planned, stale mergeCommandId/mergeError, autoMergeNoProgressCount stuck
|
|
846
|
+
// at 0) until it was couriered through a fresh workspace. Terminalize the stuck command exactly
|
|
847
|
+
// as the command-expiration sweep would (executor-authorized pending→timed_out), then fall
|
|
848
|
+
// through to settle + recovery below so the lane returns to review_requested, takes a
|
|
849
|
+
// no-progress strike, and re-dispatches a FRESH gate.
|
|
850
|
+
const pastLease = typeof command.expiresAt === "number" && command.expiresAt <= now;
|
|
851
|
+
if (!pastLease) {
|
|
852
|
+
stillActive.push(ws.id);
|
|
853
|
+
continue;
|
|
854
|
+
}
|
|
855
|
+
const reconciled = await reconcileLegacyLandingExecution(command, orchestrators, now);
|
|
856
|
+
if (!reconciled) {
|
|
857
|
+
stillActive.push(ws.id);
|
|
858
|
+
continue;
|
|
859
|
+
}
|
|
860
|
+
command = reconciled;
|
|
861
|
+
expiredStaleCommands.push(command.id);
|
|
862
|
+
}
|
|
863
|
+
let settlementFailure: unknown;
|
|
864
|
+
if (command) {
|
|
865
|
+
// A malformed/forward-incompatible terminal payload must be isolated to this row. Falling
|
|
866
|
+
// through lets the aged in-flight fallback below recover it and keeps sibling rows moving.
|
|
867
|
+
try {
|
|
868
|
+
const settlement = await settleWorkspaceCommand(command, { onMergeSettled: scheduleRepoMerge });
|
|
869
|
+
if (!settlement.settled) { stillActive.push(ws.id); continue; }
|
|
870
|
+
settledTerminal.push(ws.id);
|
|
871
|
+
} catch (error) { settlementFailure = error; }
|
|
872
|
+
}
|
|
873
|
+
const fresh = getWorkspace(ws.id);
|
|
874
|
+
if (!fresh || !oldEnough(ws)) continue; // Only aged rows take the missing/malformed-result fallback.
|
|
875
|
+
if (LAND_IN_FLIGHT_STATUSES.has(fresh.status)) {
|
|
876
|
+
const reason = command
|
|
877
|
+
? `workspace.merge ${command.status}${settlementFailure ? ` settlement failed: ${errMessage(settlementFailure)}` : " without settling workspace state"}`
|
|
878
|
+
: "workspace.merge command missing";
|
|
879
|
+
await updateWorkspaceStatusAsync(fresh.id, "review_requested", {
|
|
880
|
+
mergeCommandId: command?.id,
|
|
881
|
+
landGateQueue: undefined,
|
|
882
|
+
mergeError: reason,
|
|
883
|
+
inFlightWatchdogRecoveredAt: now,
|
|
884
|
+
...noteMergeNoProgress(fresh.metadata),
|
|
885
|
+
});
|
|
886
|
+
recoveredMergePlanned.push(fresh.id);
|
|
887
|
+
scheduleRepoMerge(fresh.repoRoot);
|
|
888
|
+
await createActivityEventAsync({
|
|
889
|
+
clientId: `workspace-inflight-watchdog-merge-${fresh.id}-${now}`,
|
|
890
|
+
kind: "state",
|
|
891
|
+
title: "Recovered stuck workspace merge",
|
|
892
|
+
body: `${fresh.branch ?? fresh.id} was stuck in merge_planned; returned to review_requested (${reason})`,
|
|
893
|
+
meta: fresh.branch ?? fresh.id,
|
|
894
|
+
icon: "ti-refresh-alert",
|
|
895
|
+
view: "orchestrators",
|
|
896
|
+
metadata: { source: "server", maintenanceJobId: "workspace-auto-merge-watchdog", workspaceId: fresh.id, commandId: command?.id, commandStatus: command?.status },
|
|
897
|
+
});
|
|
898
|
+
} else if (fresh.status === "cleanup_requested") {
|
|
899
|
+
const reason = command
|
|
900
|
+
? `workspace.cleanup ${command.status}${settlementFailure ? ` settlement failed: ${errMessage(settlementFailure)}` : " without cleaning workspace"}`
|
|
901
|
+
: "workspace.cleanup command missing";
|
|
902
|
+
await updateWorkspaceStatusAsync(fresh.id, "active", {
|
|
903
|
+
cleanupCommandId: command?.id,
|
|
904
|
+
cleanupError: reason,
|
|
905
|
+
inFlightWatchdogRecoveredAt: now,
|
|
906
|
+
});
|
|
907
|
+
recoveredCleanupRequested.push(fresh.id);
|
|
908
|
+
await createActivityEventAsync({
|
|
909
|
+
clientId: `workspace-inflight-watchdog-cleanup-${fresh.id}-${now}`,
|
|
910
|
+
kind: "state",
|
|
911
|
+
title: "Recovered stuck workspace cleanup",
|
|
912
|
+
body: `${fresh.branch ?? fresh.id} was stuck in cleanup_requested; returned to active (${reason})`,
|
|
913
|
+
meta: fresh.branch ?? fresh.id,
|
|
914
|
+
icon: "ti-refresh-alert",
|
|
915
|
+
view: "orchestrators",
|
|
916
|
+
metadata: { source: "server", maintenanceJobId: "workspace-auto-merge-watchdog", workspaceId: fresh.id, commandId: command?.id, commandStatus: command?.status },
|
|
917
|
+
});
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
return { recoveredMergePlanned, recoveredCleanupRequested, settledTerminal, stillActive, reclaimedOrphaned, expiredStaleCommands, ...(stoppedEarly ? { aborted: true } : {}) };
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
export async function runAutoMergeWatchdog(
|
|
925
|
+
opts: { now?: number; staleMs?: number; log?: (message: string) => void; signal?: AbortSignal } = {},
|
|
926
|
+
): Promise<Record<string, unknown>> {
|
|
927
|
+
// #1819 — the watchdog restart decision itself (re-arming repo merge loops; each `scheduleRepoMerge`
|
|
928
|
+
// only ENQUEUES, the landing itself runs in `autoMergeCleanFastForwards`/`autoMergeForRepo`, which
|
|
929
|
+
// are cancellable) reads in-memory loop state and is effectively single-unit, small work that a 10s
|
|
930
|
+
// deadline cannot be overrun by in practice. #1830 — that no longer covers the WHOLE function: the
|
|
931
|
+
// in-flight recovery below now AWAITS the bounded (5s fetch / 2s rev-parse/merge-base) async
|
|
932
|
+
// ancestry check per aged workspace, so it gets its own PER-ROW checkpoint
|
|
933
|
+
// (`recoverAgedInFlightWorkspaces`'s own comment) instead of relying on this pre-flight refusal alone.
|
|
934
|
+
if (opts.signal?.aborted) return { readyCount: 0, aborted: true, restartedRepoRoots: [], forceRestartedRepoRoots: [] };
|
|
935
|
+
const now = opts.now ?? Date.now();
|
|
936
|
+
await runLandGateFailureWatchdog({ now, signal: opts.signal });
|
|
937
|
+
const staleMs = opts.staleMs ?? AUTO_MERGE_WATCHDOG_STALE_MS;
|
|
938
|
+
const inFlightRecovery = await recoverAgedInFlightWorkspaces(now, opts.signal);
|
|
939
|
+
const ready = landableWorkspaces();
|
|
940
|
+
const repoRoots = [...new Set(ready.map((ws) => ws.repoRoot).filter(Boolean))];
|
|
941
|
+
const repoStaleForMs = Object.fromEntries(repoRoots.map((repoRoot) => {
|
|
942
|
+
const state = repoMergeRunning.get(repoRoot);
|
|
943
|
+
const lastProgressAt = state?.lastProgressAt ?? repoMergeLastCompletedAt.get(repoRoot) ?? autoMergeWatchdogStartedAt;
|
|
944
|
+
return [repoRoot, now - lastProgressAt];
|
|
945
|
+
}));
|
|
946
|
+
const staleForMs = Object.values(repoStaleForMs).reduce((max, value) => Math.max(max, value), 0);
|
|
947
|
+
if (!ready.length) return { readyCount: 0, staleForMs, repoStaleForMs, restartedRepoRoots: [], forceRestartedRepoRoots: [], inFlightRecovery };
|
|
948
|
+
|
|
949
|
+
const restartedRepoRoots = repoRoots.filter((repoRoot) => repoStaleForMs[repoRoot]! >= staleMs);
|
|
950
|
+
if (!restartedRepoRoots.length) return { readyCount: ready.length, staleForMs, repoStaleForMs, restartedRepoRoots: [], forceRestartedRepoRoots: [], inFlightRecovery };
|
|
951
|
+
|
|
952
|
+
const log = opts.log ?? console.warn;
|
|
953
|
+
log(`[workspace-auto-merge] Watchdog: no auto-merge cycle completed for ${staleForMs}ms while ${ready.length} ready workspace(s) exist; restarting ${restartedRepoRoots.length} repo merge loop(s)`);
|
|
954
|
+
const forceStaleMs = staleMs * AUTO_MERGE_WATCHDOG_FORCE_RESTART_FACTOR;
|
|
955
|
+
const forceRestartedRepoRoots: string[] = [];
|
|
956
|
+
for (const repoRoot of restartedRepoRoots) {
|
|
957
|
+
const existing = repoMergeRunning.get(repoRoot);
|
|
958
|
+
// #2232 — REAL recovery for a WEDGED loop. Flagging `pending` (below) is consumed at the TOP of the
|
|
959
|
+
// next iteration of the SAME loop — a complete no-op when that loop is the thing that is stuck, which
|
|
960
|
+
// is precisely when this watchdog fires. Observed: one repo stopped dispatching every merge for 20+
|
|
961
|
+
// min until a daemon restart, with this watchdog "restarting" it on every tick. So past N× the
|
|
962
|
+
// threshold, force-REPLACE the run instead of flagging it: mark it abandoned (it can never resume
|
|
963
|
+
// behind its replacement), abort its cycle (a cooperative sweep stops at its next candidate; a wedged
|
|
964
|
+
// await is abandoned), drop the entry, and start a genuinely fresh cycle.
|
|
965
|
+
if (existing && repoStaleForMs[repoRoot]! >= forceStaleMs) {
|
|
966
|
+
existing.abandoned = true;
|
|
967
|
+
existing.abort?.abort(new Error(`watchdog force-restarted a wedged auto-merge cycle for ${repoRoot}`));
|
|
968
|
+
repoMergeRunning.delete(repoRoot);
|
|
969
|
+
forceRestartedRepoRoots.push(repoRoot);
|
|
970
|
+
log(`[workspace-auto-merge] Watchdog: repo ${repoRoot} merge loop wedged for ${repoStaleForMs[repoRoot]}ms (>= ${forceStaleMs}ms) — force-replacing the stale in-flight cycle with a fresh one`);
|
|
971
|
+
scheduleRepoMerge(repoRoot);
|
|
972
|
+
continue;
|
|
973
|
+
}
|
|
974
|
+
// A watchdog restart isn't reacting to a specific base moving — force an unfiltered rerun.
|
|
975
|
+
if (existing) existing.pending = widenPendingRerun(existing.pending, { kind: "unfiltered" });
|
|
976
|
+
else scheduleRepoMerge(repoRoot);
|
|
977
|
+
}
|
|
978
|
+
return { readyCount: ready.length, staleForMs, repoStaleForMs, restartedRepoRoots, forceRestartedRepoRoots, inFlightRecovery };
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
// Drain the landable rows for ONE repo (the event-driven fast path). Scoped to the
|
|
982
|
+
// repo whose ready/settle event fired so it doesn't re-probe every other repo's worktrees, and
|
|
983
|
+
// (#1473) further scoped to `baseRef` when the trigger was a specific base settling — this is
|
|
984
|
+
// what stops a single land from flooding the steward with re-probes of every ready branch in
|
|
985
|
+
// the repo regardless of which base they target.
|
|
986
|
+
// #2232 — `signal` is the cycle deadline's (and the watchdog force-restart's) cancellation channel; it
|
|
987
|
+
// reaches landCandidates' existing per-candidate checkpoint, so a bounded-out cycle stops cleanly at a
|
|
988
|
+
// candidate boundary instead of racing on underneath its replacement.
|
|
989
|
+
//
|
|
990
|
+
// WHICH AWAIT CAN HANG (#2232 item 3, best-effort): every host RPC on this path is already deadline-
|
|
991
|
+
// bounded (merge preview 8s, landing-identity discovery 5s, execution-tree reservation 40s). The one
|
|
992
|
+
// genuinely UNBOUNDED await found is the DB write gateway: a CRITICAL write (`requestWorkspaceMerge` →
|
|
993
|
+
// `ensureLegacyOpenLandingOwnershipAsync`, `landingControllers.ensureLegacyOpen`) is admitted and HELD in
|
|
994
|
+
// the writer FIFO while the writer is wedged (writer-gateway.ts: `drainLoop` pauses on `wedged`, and the
|
|
995
|
+
// per-op `writerTimeoutMs` only arms at DISPATCH). Non-critical writes shed fast and surface as a thrown
|
|
996
|
+
// error; a critical one waits for however long the wedged op takes — unbounded by construction. Bounding
|
|
997
|
+
// it AT that await is deliberately NOT done here: abandoning an in-flight critical write makes its
|
|
998
|
+
// outcome indeterminate, and a re-dispatched land is exactly what the at-most-once landing contract
|
|
999
|
+
// forbids. The per-cycle deadline above is therefore the safety net for this (and any future) hang: the
|
|
1000
|
+
// write keeps its own semantics while the repo's dispatch lane is released regardless.
|
|
1001
|
+
/** Test-only (#2607): drive one repo's land sweep directly — the same `landCandidates`
|
|
1002
|
+
* engine the event trigger and the maintenance backstop both drain through. */
|
|
1003
|
+
export { autoMergeForRepo as __autoMergeForRepoForTests };
|
|
1004
|
+
async function autoMergeForRepo(repoRoot: string, baseRef?: string, signal?: AbortSignal, owningState?: RepoMergeRunState): Promise<LandSweepResult> {
|
|
1005
|
+
if (!workspaceAutoMergeEnabled()) return emptyLandSweep();
|
|
1006
|
+
const orchestrators = listOrchestrators().filter((orch) => orch.status === "online" && orch.apiUrl);
|
|
1007
|
+
if (!orchestrators.length) return emptyLandSweep();
|
|
1008
|
+
const candidates = landableWorkspaces(repoRoot, baseRef);
|
|
1009
|
+
const progress = { processed: 0 };
|
|
1010
|
+
try {
|
|
1011
|
+
return await landCandidates(candidates, orchestrators, signal, progress);
|
|
1012
|
+
} finally {
|
|
1013
|
+
// #2232 — the same rule autoMergeCleanFastForwards documents for #1819: an ABORTED sweep that left
|
|
1014
|
+
// candidates unprocessed did NOT drain this lane, and stamping it anyway would tell the watchdog the
|
|
1015
|
+
// merge loop is alive — blinding the one backstop that restarts it, under exactly the deadline
|
|
1016
|
+
// pressure that produced the abort. Every non-abort path stamps exactly as before.
|
|
1017
|
+
if (!signal?.aborted || progress.processed >= candidates.length) noteAutoMergeCycleCompleted(repoRoot, owningState);
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
// Self-healing backstop (#237): the periodic resync (workspace-auto-merge maintenance
|
|
1022
|
+
// job, runOnStart + ~10-min interval) that lands anything events missed — a relay
|
|
1023
|
+
// restart that lost the in-flight chain, a dropped stop-hook, a direct human commit
|
|
1024
|
+
// with no agent turn. Scans EVERY repo's landable rows; the per-repo lease still caps
|
|
1025
|
+
// it at one dispatch per repo per sweep, and the on-settle re-trigger drains the rest fast.
|
|
1026
|
+
export async function autoMergeCleanFastForwards(context: { signal?: AbortSignal } = {}): Promise<Record<string, unknown>> {
|
|
1027
|
+
if (!workspaceAutoMergeEnabled()) return { skipped: "disabled" };
|
|
1028
|
+
if (context.signal?.aborted) return { scanned: 0, aborted: true };
|
|
1029
|
+
const orchestrators = listOrchestrators().filter((orch) => orch.status === "online" && orch.apiUrl);
|
|
1030
|
+
if (!orchestrators.length) return { scanned: 0, skipped: "no online orchestrators" };
|
|
1031
|
+
|
|
1032
|
+
const candidates = landableWorkspaces();
|
|
1033
|
+
const repoRoots = [...new Set(candidates.map((ws) => ws.repoRoot).filter(Boolean))];
|
|
1034
|
+
const progress = { processed: 0 };
|
|
1035
|
+
// Spread to a plain Record for the maintenance-job result contract (the named
|
|
1036
|
+
// LandSweepResult interface has no index signature).
|
|
1037
|
+
try {
|
|
1038
|
+
return { ...(await landCandidates(candidates, orchestrators, context.signal, progress)), ...(context.signal?.aborted ? { aborted: true } : {}) };
|
|
1039
|
+
} finally {
|
|
1040
|
+
// #1819 — a completed-cycle stamp is what `runAutoMergeWatchdog` reads to decide a repo's merge
|
|
1041
|
+
// loop is alive (repoMergeLastCompletedAt / lastProgressAt). On the ABORT path this sweep did NOT
|
|
1042
|
+
// complete a cycle for the repos whose candidates it never reached, and stamping them anyway
|
|
1043
|
+
// would tell the watchdog every lane just drained — blinding the one backstop that restarts a
|
|
1044
|
+
// stalled loop, under exactly the deadline pressure that produced the abort. So on abort, stamp
|
|
1045
|
+
// only repos with no candidate left unprocessed. The normal path and the pre-existing THROW path
|
|
1046
|
+
// are deliberately unchanged: `stalled` is empty unless the signal aborted, so both still stamp
|
|
1047
|
+
// every repo exactly as before.
|
|
1048
|
+
const stalled = context.signal?.aborted
|
|
1049
|
+
? new Set(candidates.slice(progress.processed).map((ws) => ws.repoRoot))
|
|
1050
|
+
: new Set<string>();
|
|
1051
|
+
for (const repoRoot of repoRoots) if (!stalled.has(repoRoot)) noteAutoMergeCycleCompleted(repoRoot);
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
export { wakeRepoSteward } from "./workspace-steward-wake";
|