@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,1143 @@
|
|
|
1
|
+
// #834 — the durable first-class Task entity (keystone of #830).
|
|
2
|
+
//
|
|
3
|
+
// This module owns the `kind='deliverable'` facet of the `tasks` table: the durable
|
|
4
|
+
// coordination Task that threads issues / branch / commits / dependencies / quality gates.
|
|
5
|
+
// The historical claim-lane lives in tasks.ts and is fenced off by `claimTaskWhere`
|
|
6
|
+
// (see task-core.ts) — the two facets share a table but never each other's machinery.
|
|
7
|
+
//
|
|
8
|
+
// Source-of-truth boundary (#830/#833): GitHub owns intent/spec/acceptance/discussion;
|
|
9
|
+
// the Task owns execution telemetry (status, deliverable stage, gate results, branch,
|
|
10
|
+
// commits, deps, attribution). Issue links are a PROJECTION of issue_associations
|
|
11
|
+
// (entity_type='task') — never a duplicated column — so they cannot drift.
|
|
12
|
+
import {
|
|
13
|
+
TASK_DELIVERABLE_STAGES,
|
|
14
|
+
TASK_BLOCKER_TYPES,
|
|
15
|
+
TASK_DISPATCH_COMPLEXITIES,
|
|
16
|
+
TASK_DISPATCH_CRITICALITIES,
|
|
17
|
+
TASK_DISPATCH_FOOTPRINTS,
|
|
18
|
+
TASK_DISPATCH_TYPES,
|
|
19
|
+
TASK_GATE_STATUSES,
|
|
20
|
+
TASK_PRIORITIES,
|
|
21
|
+
BACKLOG_STATES,
|
|
22
|
+
type BacklogState,
|
|
23
|
+
type Task,
|
|
24
|
+
type TaskBlocker,
|
|
25
|
+
type TaskComplexity,
|
|
26
|
+
type TaskCommitRef,
|
|
27
|
+
type TaskDeliverableStage,
|
|
28
|
+
type TaskDependency,
|
|
29
|
+
type TaskTerminalStage,
|
|
30
|
+
type TaskDetail,
|
|
31
|
+
type TaskDispatch,
|
|
32
|
+
type TaskGateState,
|
|
33
|
+
type TaskGateStatus,
|
|
34
|
+
type TaskIssueLink,
|
|
35
|
+
type IssueRefRelation,
|
|
36
|
+
type TaskPriority,
|
|
37
|
+
type TaskStatus,
|
|
38
|
+
} from "../types";
|
|
39
|
+
import { parseJson } from "../utils";
|
|
40
|
+
import { cleanEnum, cleanStringArray, optionalEnum } from "../validation";
|
|
41
|
+
import { getDb, writeTransaction, ValidationError } from "./connection.ts";
|
|
42
|
+
import { ownerForNewTask } from "./task-owner.ts";
|
|
43
|
+
import { rowToTask } from "./mappers.ts";
|
|
44
|
+
import { latestTaskDispatchDecision, taskBoundWorkerModel, taskDispatchWorkShape } from "./task-detail-projection.ts";
|
|
45
|
+
import { taskPendingReviewDelivery } from "./task-review-hold.ts";
|
|
46
|
+
import { getAgent } from "./agents.ts";
|
|
47
|
+
import { statusWriteDropsCarryPending, CARRY_PENDING_GATED_STAGES } from "./carry-pending.ts";
|
|
48
|
+
import { carryPendingHeadBlockingAdvance } from "./carry-pending-marker.ts";
|
|
49
|
+
import { TASK_SELECT, insertTaskEvent, DELIVERABLE_TASK_KIND, deliverableTaskIdsByBranch } from "./task-core.ts";
|
|
50
|
+
export { deliverableTaskIdsByBranch } from "./task-core.ts";
|
|
51
|
+
import { associateIssue, listIssuesForEntity, removeAssociation } from "./issue-associations.ts";
|
|
52
|
+
import { resolveIssueRefFromString } from "./issue-refs.ts";
|
|
53
|
+
import { cleanIssueRefRelation, defaultTaskIssueRelation } from "./task-issue-relation";
|
|
54
|
+
import { cleanTaskTerminalStage, reconciledTaskCompletionStatus, taskTerminalStage, validationCompletionStatus } from "../task-completion.ts";
|
|
55
|
+
import { getProject } from "./projects.ts";
|
|
56
|
+
import { taskExecutionField } from "./task-execution.ts";
|
|
57
|
+
|
|
58
|
+
// Execution-status axis (#834): the existing claim FSM vocabulary, reused so there is no
|
|
59
|
+
// enum break. not-started=open, working=in_progress, plus claimed/blocked/done/failed/canceled.
|
|
60
|
+
// `orphaned` (#3051): the owner agent is gone and nothing was delivered — the Task needs a new owner.
|
|
61
|
+
const DELIVERABLE_STATUSES: readonly TaskStatus[] = ["open", "claimed", "in_progress", "validating", "blocked", "orphaned", "done", "failed", "canceled"];
|
|
62
|
+
const NOT_STARTED_STATUSES: readonly TaskStatus[] = ["open", "claimed", "orphaned"];
|
|
63
|
+
|
|
64
|
+
// #3051 — a bound owner or a reached stage means the work started: a not-started Task becomes in_progress.
|
|
65
|
+
function startTaskWorkBody(task: Pick<Task, "id" | "status">, actor: string | undefined, note: string, now: number): void {
|
|
66
|
+
if (NOT_STARTED_STATUSES.includes(task.status)) setTaskStatusBody(task.id, { status: "in_progress", actor, note }, now);
|
|
67
|
+
}
|
|
68
|
+
const GATE_EVENT_PREFIX = "gate:";
|
|
69
|
+
export const DEFAULT_TASK_COMPLEXITY: TaskComplexity = "moderate";
|
|
70
|
+
|
|
71
|
+
function taskEntityId(id: string): string {
|
|
72
|
+
return String(id);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function requireText(value: unknown, field: string, max: number): string {
|
|
76
|
+
if (typeof value !== "string" || !value.trim()) throw new ValidationError(`${field} required`);
|
|
77
|
+
const cleaned = value.trim();
|
|
78
|
+
if (cleaned.length > max) throw new ValidationError(`${field} must be ${max} characters or fewer`);
|
|
79
|
+
return cleaned;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function optionalText(value: unknown, field: string, max: number): string | undefined {
|
|
83
|
+
if (value === undefined || value === null) return undefined;
|
|
84
|
+
if (typeof value !== "string") throw new ValidationError(`${field} must be a string`);
|
|
85
|
+
const cleaned = value.trim();
|
|
86
|
+
if (!cleaned) return undefined;
|
|
87
|
+
if (cleaned.length > max) throw new ValidationError(`${field} must be ${max} characters or fewer`);
|
|
88
|
+
return cleaned;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function cleanTaskComplexity(value: unknown, field = "complexity"): TaskComplexity | undefined {
|
|
92
|
+
return optionalEnum(value, field, TASK_DISPATCH_COMPLEXITIES) as TaskComplexity | undefined;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// #1535 WS2 — priority is OPTIONAL (unlike complexity, it has no default), so a create-time
|
|
96
|
+
// absent value stays undefined (optionalEnum) while an explicit clear on update is a distinct
|
|
97
|
+
// `null` the caller must pass through (see updateDeliverableTask) — a present-but-invalid value
|
|
98
|
+
// always throws (cleanEnum), never silently drops.
|
|
99
|
+
function cleanTaskPriority(value: unknown, field = "priority"): TaskPriority | undefined {
|
|
100
|
+
return optionalEnum(value, field, TASK_PRIORITIES) as TaskPriority | undefined;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function requireTaskPriority(value: unknown, field = "priority"): TaskPriority {
|
|
104
|
+
return cleanEnum(value, field, TASK_PRIORITIES) as TaskPriority;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function cleanTags(value: unknown, field = "tags"): string[] | undefined {
|
|
108
|
+
return cleanStringArray(value, field, { itemMax: 60, maxItems: 30 });
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// #1535 WS3 — backlog lifecycle state. Optional (like priority): absent stays undefined so a
|
|
112
|
+
// non-backlog task's column is NULL; a present-but-invalid value throws rather than silently
|
|
113
|
+
// dropping. The backlog→promoted flip is a distinct writer (setTaskBacklogState in db/backlog.ts).
|
|
114
|
+
function cleanBacklogState(value: unknown, field = "backlogState"): BacklogState | undefined {
|
|
115
|
+
return optionalEnum(value, field, BACKLOG_STATES) as BacklogState | undefined;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function cleanBlockedBy(value: unknown): TaskBlocker[] | undefined {
|
|
119
|
+
if (value === undefined || value === null) return undefined;
|
|
120
|
+
if (!Array.isArray(value)) throw new ValidationError("blockedBy must be an array");
|
|
121
|
+
return value.map((entry, i) => {
|
|
122
|
+
if (typeof entry !== "object" || entry === null) throw new ValidationError(`blockedBy[${i}] must be an object`);
|
|
123
|
+
const type = (entry as any).type;
|
|
124
|
+
if (!TASK_BLOCKER_TYPES.includes(type)) throw new ValidationError(`blockedBy[${i}].type must be one of: ${TASK_BLOCKER_TYPES.join(", ")}`);
|
|
125
|
+
return {
|
|
126
|
+
type,
|
|
127
|
+
...(optionalText((entry as any).ref, "blockedBy.ref", 240) ? { ref: optionalText((entry as any).ref, "blockedBy.ref", 240)! } : {}),
|
|
128
|
+
...(optionalText((entry as any).note, "blockedBy.note", 2000) ? { note: optionalText((entry as any).note, "blockedBy.note", 2000)! } : {}),
|
|
129
|
+
};
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export function cleanTaskDispatch(value: unknown): TaskDispatch | undefined {
|
|
134
|
+
if (value === undefined || value === null) return undefined;
|
|
135
|
+
if (typeof value !== "object") throw new ValidationError("dispatch must be an object");
|
|
136
|
+
const d = value as Record<string, unknown>;
|
|
137
|
+
const out: TaskDispatch = {};
|
|
138
|
+
const complexity = cleanTaskComplexity(d.complexity, "dispatch.complexity");
|
|
139
|
+
const type = optionalEnum(d.type, "dispatch.type", TASK_DISPATCH_TYPES);
|
|
140
|
+
const contextFootprint = optionalEnum(d.contextFootprint, "dispatch.contextFootprint", TASK_DISPATCH_FOOTPRINTS);
|
|
141
|
+
const criticality = optionalEnum(d.criticality, "dispatch.criticality", TASK_DISPATCH_CRITICALITIES);
|
|
142
|
+
if (complexity !== undefined) out.complexity = complexity;
|
|
143
|
+
if (type !== undefined) out.type = type as TaskDispatch["type"];
|
|
144
|
+
if (contextFootprint !== undefined) out.contextFootprint = contextFootprint as TaskDispatch["contextFootprint"];
|
|
145
|
+
if (criticality !== undefined) out.criticality = criticality as TaskDispatch["criticality"];
|
|
146
|
+
return out;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function projectForRepo(repo: string | undefined): string | undefined {
|
|
150
|
+
const cleaned = repo?.trim();
|
|
151
|
+
if (!cleaned) return undefined;
|
|
152
|
+
const row = getDb()
|
|
153
|
+
.query("SELECT id FROM projects WHERE scope = 'project' AND issue_repo = ? ORDER BY created_at ASC, id ASC LIMIT 1")
|
|
154
|
+
.get(cleaned) as { id: string } | undefined;
|
|
155
|
+
return row?.id;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function cleanTaskProject(input: { projectId?: unknown; repo?: unknown }): { projectId?: string; repo?: string } {
|
|
159
|
+
const projectId = optionalText(input.projectId, "projectId", 120);
|
|
160
|
+
const project = projectId ? getProject(projectId) : null;
|
|
161
|
+
const repo = optionalText(input.repo, "repo", 500) ?? project?.issueRepo;
|
|
162
|
+
return {
|
|
163
|
+
...(projectId ? { projectId } : repo ? { projectId: projectForRepo(repo) } : {}),
|
|
164
|
+
...(repo ? { repo } : {}),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function fillTaskProjectFromRepo(id: number, repo: string, now = Date.now()): void {
|
|
169
|
+
const cleaned = optionalText(repo, "repo", 500);
|
|
170
|
+
if (!cleaned) return;
|
|
171
|
+
const projectId = projectForRepo(cleaned);
|
|
172
|
+
getDb().query(`
|
|
173
|
+
UPDATE tasks
|
|
174
|
+
SET repo = COALESCE(NULLIF(trim(repo), ''), ?),
|
|
175
|
+
project_id = COALESCE(NULLIF(trim(project_id), ''), ?),
|
|
176
|
+
updated_at = ?
|
|
177
|
+
WHERE id = ?
|
|
178
|
+
`).run(cleaned, projectId ?? null, now, id);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function getRawTask(id: number): Task | null {
|
|
182
|
+
const row = getDb().query(`${TASK_SELECT} WHERE id = ?`).get(id) as any;
|
|
183
|
+
return row ? rowToTask(row) : null;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function requireDeliverable(id: number): Task {
|
|
187
|
+
const task = getRawTask(id);
|
|
188
|
+
if (!task) throw new ValidationError(`task ${id} not found`);
|
|
189
|
+
if (task.kind !== DELIVERABLE_TASK_KIND) throw new ValidationError(`task ${id} is not a deliverable task`);
|
|
190
|
+
return task;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export interface CreateDeliverableTaskInput {
|
|
194
|
+
title: string;
|
|
195
|
+
intent: string;
|
|
196
|
+
complexity?: TaskComplexity;
|
|
197
|
+
context?: string;
|
|
198
|
+
terminalStage?: Task["terminalStage"];
|
|
199
|
+
doneWhen?: string; branch?: string;
|
|
200
|
+
teamId?: string;
|
|
201
|
+
projectId?: string;
|
|
202
|
+
repo?: string;
|
|
203
|
+
createdBy: string;
|
|
204
|
+
source?: string;
|
|
205
|
+
target?: string;
|
|
206
|
+
latestSteer?: string;
|
|
207
|
+
dispatch?: TaskDispatch;
|
|
208
|
+
tags?: string[];
|
|
209
|
+
priority?: TaskPriority;
|
|
210
|
+
/** #1535 WS3 — seed the task directly into the backlog (`backlog`) so it shows up in the
|
|
211
|
+
* prioritized backlog query until promoted. Absent ⇒ not backlog-managed. */
|
|
212
|
+
backlogState?: BacklogState;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// The BODY of createDeliverableTask, folded into ONE transaction (ADR §3.4, S3 L-D2 #1904): the
|
|
216
|
+
// project-lookup READ (cleanTaskProject → projectForRepo) and the INSERT + event are one atomic unit —
|
|
217
|
+
// the seam boundary is the whole logical op, not the statement (§3.1). Assumes a transaction is already
|
|
218
|
+
// open (the `taskEntity.create` op executor's BEGIN IMMEDIATE); the sync wrapper below adds the tx for
|
|
219
|
+
// ordinary callers. `now` is submission-time wall-clock (H6). NON-idempotent: a blind retry would insert
|
|
220
|
+
// a SECOND task row, so the async facade supplies a per-submission idempotencyKey.
|
|
221
|
+
export function createDeliverableTaskBody(input: CreateDeliverableTaskInput, now: number): TaskDetail {
|
|
222
|
+
if (input.terminalStage !== undefined) cleanTaskTerminalStage(input.terminalStage);
|
|
223
|
+
const title = requireText(input.title, "title", 500);
|
|
224
|
+
const createdBy = requireText(input.createdBy, "createdBy", 200);
|
|
225
|
+
const intent = requireText(input.intent, "intent", 1_000_000);
|
|
226
|
+
const dispatch = cleanTaskDispatch(input.dispatch);
|
|
227
|
+
const complexity = cleanTaskComplexity(input.complexity ?? dispatch?.complexity, "complexity") ?? DEFAULT_TASK_COMPLEXITY;
|
|
228
|
+
const context = optionalText(input.context, "context", 1_000_000);
|
|
229
|
+
const branch = optionalText(input.branch, "branch", 500);
|
|
230
|
+
const taskProject = cleanTaskProject(input);
|
|
231
|
+
const tags = cleanTags(input.tags) ?? [];
|
|
232
|
+
const priority = cleanTaskPriority(input.priority);
|
|
233
|
+
const backlogState = cleanBacklogState(input.backlogState);
|
|
234
|
+
const teamId = optionalText(input.teamId, "teamId", 200) ?? null;
|
|
235
|
+
// Legacy NOT-NULL columns have no DB defaults (#834 finding 6) — set them explicitly.
|
|
236
|
+
const result = getDb().query(`
|
|
237
|
+
INSERT INTO tasks (
|
|
238
|
+
source, title, body, severity, status, target, occurrence_count, metadata,
|
|
239
|
+
created_at, updated_at, last_seen_at,
|
|
240
|
+
kind, intent, complexity, context, latest_steer, deliverable_stage, done_when, branch, team_id, project_id, repo, created_by, dispatch, tags, priority, backlog_state, owner
|
|
241
|
+
) VALUES (?, ?, ?, 'info', 'open', ?, 1, '{}', ?, ?, ?, '${DELIVERABLE_TASK_KIND}', ?, ?, ?, ?, 'none', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
242
|
+
`).run(
|
|
243
|
+
optionalText(input.source, "source", 200) ?? "coordinator",
|
|
244
|
+
title,
|
|
245
|
+
intent,
|
|
246
|
+
optionalText(input.target, "target", 200) ?? createdBy,
|
|
247
|
+
now, now, now, intent, complexity, context ?? null,
|
|
248
|
+
optionalText(input.latestSteer, "latestSteer", 1_000_000) ?? null,
|
|
249
|
+
optionalText(input.doneWhen, "doneWhen", 1_000_000) ?? null,
|
|
250
|
+
branch ?? null,
|
|
251
|
+
teamId,
|
|
252
|
+
taskProject.projectId ?? null,
|
|
253
|
+
taskProject.repo ?? null,
|
|
254
|
+
createdBy,
|
|
255
|
+
dispatch ? JSON.stringify(dispatch) : null,
|
|
256
|
+
tags.length ? JSON.stringify(tags) : null,
|
|
257
|
+
priority ?? null,
|
|
258
|
+
backlogState ?? null,
|
|
259
|
+
ownerForNewTask(createdBy, teamId),
|
|
260
|
+
);
|
|
261
|
+
const id = Number(result.lastInsertRowid);
|
|
262
|
+
if (input.terminalStage) getDb().query("UPDATE tasks SET terminal_stage = ? WHERE id = ?").run(input.terminalStage, id);
|
|
263
|
+
insertTaskEvent(id, {
|
|
264
|
+
source: createdBy,
|
|
265
|
+
type: "task.created",
|
|
266
|
+
severity: "info",
|
|
267
|
+
title: `Task created: ${title}`,
|
|
268
|
+
body: intent,
|
|
269
|
+
metadata: { createdBy, complexity, ...(context ? { context } : {}), ...(branch ? { branch } : {}), ...(taskProject.projectId ? { projectId: taskProject.projectId } : {}), ...(taskProject.repo ? { repo: taskProject.repo } : {}), ...(dispatch ? { dispatch } : {}), ...(tags.length ? { tags } : {}), ...(priority ? { priority } : {}), ...(backlogState ? { backlogState } : {}) },
|
|
270
|
+
}, now);
|
|
271
|
+
return getTaskDetail(id)!;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export function createDeliverableTask(input: CreateDeliverableTaskInput): TaskDetail {
|
|
275
|
+
return writeTransaction(() => createDeliverableTaskBody(input, Date.now()));
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export interface UpdateDeliverableTaskInput {
|
|
279
|
+
terminalStage?: Task["terminalStage"] | null;
|
|
280
|
+
title?: string;
|
|
281
|
+
intent?: string;
|
|
282
|
+
complexity?: TaskComplexity;
|
|
283
|
+
context?: string;
|
|
284
|
+
latestSteer?: string;
|
|
285
|
+
doneWhen?: string;
|
|
286
|
+
dispatch?: TaskDispatch;
|
|
287
|
+
teamId?: string;
|
|
288
|
+
projectId?: string;
|
|
289
|
+
repo?: string;
|
|
290
|
+
actor?: string;
|
|
291
|
+
/** Absent ⇒ untouched. `[]` (or `null`) ⇒ clear all tags. */
|
|
292
|
+
tags?: string[] | null;
|
|
293
|
+
/** Absent ⇒ untouched. `null` ⇒ clear (priority has no default, unlike complexity). */
|
|
294
|
+
priority?: TaskPriority | null;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// The BODY of updateDeliverableTask, folded into ONE transaction (ADR §3.4, S3 L-D2 #1904): the
|
|
298
|
+
// `requireDeliverable` existence/kind-guard READ and the UPDATE + event are one atomic unit — a
|
|
299
|
+
// concurrent delete/kind-change between the guard and the write can never slip through a thread hop.
|
|
300
|
+
// Assumes a transaction is already open; the sync wrapper below adds the tx for ordinary callers.
|
|
301
|
+
// NON-idempotent (always appends a `task.updated` event) → the async facade supplies a per-submission key.
|
|
302
|
+
export function updateDeliverableTaskBody(id: number, input: UpdateDeliverableTaskInput, now: number): TaskDetail {
|
|
303
|
+
requireDeliverable(id);
|
|
304
|
+
const sets: string[] = [];
|
|
305
|
+
const params: unknown[] = [];
|
|
306
|
+
const push = (col: string, val: unknown) => { sets.push(`${col} = ?`); params.push(val); };
|
|
307
|
+
if (input.title !== undefined) push("title", requireText(input.title, "title", 500));
|
|
308
|
+
if (input.intent !== undefined) push("intent", optionalText(input.intent, "intent", 1_000_000) ?? null);
|
|
309
|
+
if (input.complexity !== undefined) push("complexity", cleanTaskComplexity(input.complexity) ?? null);
|
|
310
|
+
if (input.context !== undefined) push("context", optionalText(input.context, "context", 1_000_000) ?? null);
|
|
311
|
+
if (input.latestSteer !== undefined) push("latest_steer", optionalText(input.latestSteer, "latestSteer", 1_000_000) ?? null);
|
|
312
|
+
if (input.doneWhen !== undefined) push("done_when", optionalText(input.doneWhen, "doneWhen", 1_000_000) ?? null);
|
|
313
|
+
if (input.teamId !== undefined) push("team_id", optionalText(input.teamId, "teamId", 200) ?? null);
|
|
314
|
+
if (input.projectId !== undefined || input.repo !== undefined) {
|
|
315
|
+
const taskProject = cleanTaskProject(input);
|
|
316
|
+
if (input.projectId !== undefined) push("project_id", taskProject.projectId ?? null);
|
|
317
|
+
if (input.repo !== undefined) push("repo", taskProject.repo ?? null);
|
|
318
|
+
}
|
|
319
|
+
if (input.dispatch !== undefined) { const d = cleanTaskDispatch(input.dispatch); push("dispatch", d ? JSON.stringify(d) : null); }
|
|
320
|
+
if (input.tags !== undefined) {
|
|
321
|
+
const tags = input.tags === null ? [] : (cleanTags(input.tags) ?? []);
|
|
322
|
+
push("tags", tags.length ? JSON.stringify(tags) : null);
|
|
323
|
+
}
|
|
324
|
+
if (input.terminalStage !== undefined) push("terminal_stage", input.terminalStage === null ? null : cleanTaskTerminalStage(input.terminalStage));
|
|
325
|
+
if (input.priority !== undefined) push("priority", input.priority === null ? null : requireTaskPriority(input.priority));
|
|
326
|
+
if (sets.length > 0) {
|
|
327
|
+
params.push(now, id);
|
|
328
|
+
getDb().query(`UPDATE tasks SET ${sets.join(", ")}, updated_at = ? WHERE id = ?`).run(...params as any[]);
|
|
329
|
+
}
|
|
330
|
+
insertTaskEvent(id, {
|
|
331
|
+
source: input.actor ?? "agent-relay",
|
|
332
|
+
type: "task.updated",
|
|
333
|
+
severity: "info",
|
|
334
|
+
title: "Task updated",
|
|
335
|
+
body: input.latestSteer ? `steer: ${input.latestSteer}` : "",
|
|
336
|
+
metadata: { fields: sets.map((s) => s.split(" = ")[0]) },
|
|
337
|
+
}, now);
|
|
338
|
+
return getTaskDetail(id)!;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
export function updateDeliverableTask(id: number, input: UpdateDeliverableTaskInput): TaskDetail {
|
|
342
|
+
return writeTransaction(() => updateDeliverableTaskBody(id, input, Date.now()));
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
export interface SetTaskStatusInput {
|
|
346
|
+
status: TaskStatus;
|
|
347
|
+
/** Coordinator-authorized override of open/failed validation items when closing. */
|
|
348
|
+
force?: boolean;
|
|
349
|
+
/** Explicit API/MCP transitions reject unmet validation; lifecycle writes reconcile it. */
|
|
350
|
+
strictValidation?: boolean;
|
|
351
|
+
blockedBy?: TaskBlocker[];
|
|
352
|
+
note?: string;
|
|
353
|
+
actor?: string;
|
|
354
|
+
/** #1456 — INTERNAL, never exposed by a transport. Authorizes removing a `carry-pending` blocker
|
|
355
|
+
* (set only by `confirmTaskCarry`). Without it, a carry-pending blocker is a hard latch that no
|
|
356
|
+
* ordinary status/blocked_by write may drop (round-4 BLOCKER 1). */
|
|
357
|
+
allowCarryPendingClear?: boolean;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// The BODY of setTaskStatus, folded into ONE transaction (ADR §3.4, S3 L-D2 #1904): the
|
|
361
|
+
// `requireDeliverable` guard READ + the #1456 carry-pending latch check (both reads of `current`) and
|
|
362
|
+
// the UPDATE + event are one atomic unit — the latch can never be bypassed by a write that slips in
|
|
363
|
+
// between the read and the write across a thread hop. Execution-status transition (#834). NEVER touches
|
|
364
|
+
// claimed_by — that column is exclusive to the claim lane, so the claim-lease maintenance machinery can
|
|
365
|
+
// never act on a deliverable Task. Assumes a transaction is already open; the sync wrapper below adds
|
|
366
|
+
// the tx. NON-idempotent (always appends a status event) → the async facade supplies a per-submission key.
|
|
367
|
+
export function setTaskStatusBody(id: number, input: SetTaskStatusInput, now: number): TaskDetail {
|
|
368
|
+
const current = requireDeliverable(id);
|
|
369
|
+
if (input.force !== undefined && typeof input.force !== "boolean") throw new ValidationError("force must be a boolean");
|
|
370
|
+
if (input.force && input.status !== "done") throw new ValidationError("force is only supported for status done");
|
|
371
|
+
if (input.status === "done" && !input.force) {
|
|
372
|
+
const status = validationCompletionStatus(current.validationItems);
|
|
373
|
+
if (input.strictValidation && status !== "done") throw new ValidationError("task has open or failed validation items; use validating while collecting proof, or coordinator force:true to override-close");
|
|
374
|
+
input = { ...input, status };
|
|
375
|
+
}
|
|
376
|
+
if (!DELIVERABLE_STATUSES.includes(input.status)) {
|
|
377
|
+
throw new ValidationError(`status must be one of: ${DELIVERABLE_STATUSES.join(", ")}`);
|
|
378
|
+
}
|
|
379
|
+
const blockedBy = cleanBlockedBy(input.blockedBy);
|
|
380
|
+
if (input.status === "blocked" && (!blockedBy || blockedBy.length === 0)) {
|
|
381
|
+
throw new ValidationError("blockedBy is required (non-empty) when status is 'blocked'");
|
|
382
|
+
}
|
|
383
|
+
// #1456 (BLOCKER 1) — HARD LATCH at the lowest status writer (see statusWriteDropsCarryPending): no
|
|
384
|
+
// ordinary status/blocked_by write may drop a carry-pending blocker; only an authorized confirm does.
|
|
385
|
+
if (!input.allowCarryPendingClear && statusWriteDropsCarryPending(current, input.status, blockedBy)) {
|
|
386
|
+
throw new ValidationError(`cannot change task ${id} status/blockers while a #1456 carry-pending blocker is open — it can only be cleared by confirming the carry (relay_task_confirm_carry)`);
|
|
387
|
+
}
|
|
388
|
+
// Clearing the blocker set when leaving 'blocked' keeps the row self-consistent.
|
|
389
|
+
const blockedJson = input.status === "blocked" ? JSON.stringify(blockedBy) : null;
|
|
390
|
+
getDb().query("UPDATE tasks SET status = ?, blocked_by = ?, completed_at = ?, updated_at = ?, last_seen_at = ? WHERE id = ?")
|
|
391
|
+
.run(input.status, blockedJson, input.status === "done" ? current.completedAt ?? now : null, now, now, id);
|
|
392
|
+
insertTaskEvent(id, {
|
|
393
|
+
source: input.actor ?? "agent-relay",
|
|
394
|
+
type: `status:${input.status}`,
|
|
395
|
+
severity: "info",
|
|
396
|
+
title: `Task ${input.status}`,
|
|
397
|
+
body: input.note ?? "",
|
|
398
|
+
metadata: { status: input.status, ...(input.force ? { force: true } : {}), ...(blockedBy ? { blockedBy } : {}) },
|
|
399
|
+
}, now);
|
|
400
|
+
return getTaskDetail(id)!;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
export function setTaskStatus(id: number, input: SetTaskStatusInput): TaskDetail {
|
|
404
|
+
return writeTransaction(() => setTaskStatusBody(id, input, Date.now()));
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
export interface SetTaskStageInput {
|
|
408
|
+
deliverableStage: TaskDeliverableStage;
|
|
409
|
+
branch?: string;
|
|
410
|
+
commit?: TaskCommitRef;
|
|
411
|
+
actor?: string;
|
|
412
|
+
/** Correlates a stage transition to a durable deploy or similar lifecycle run. */
|
|
413
|
+
metadata?: Record<string, unknown>;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// The BODY of setTaskStage, folded into ONE transaction (ADR §3.4, S3 L-D2 #1904): the
|
|
417
|
+
// `requireDeliverable` guard + the #1456 carry-pending landing-gate READ (`carryPendingHeadBlockingAdvance`,
|
|
418
|
+
// both against `current`) and the UPDATE + event are one atomic unit — the un-bypassable landing gate can
|
|
419
|
+
// never be raced by a write straddling a thread hop. Deliverable-position transition (#834). Designed to
|
|
420
|
+
// be driven OBSERVABLY by the land/deploy pipeline (#831 wires it); exposed here for manual/test use.
|
|
421
|
+
// Composes with status, never claims. Assumes a transaction is already open; the sync wrapper below adds
|
|
422
|
+
// the tx. NON-idempotent (always appends a stage event) → the async facade supplies a per-submission key.
|
|
423
|
+
export function setTaskStageBody(id: number, input: SetTaskStageInput, now: number): TaskDetail {
|
|
424
|
+
const current = requireDeliverable(id);
|
|
425
|
+
if (!TASK_DELIVERABLE_STAGES.includes(input.deliverableStage)) {
|
|
426
|
+
throw new ValidationError(`deliverableStage must be one of: ${TASK_DELIVERABLE_STAGES.join(", ")}`);
|
|
427
|
+
}
|
|
428
|
+
// #1456 (BLOCKERs 2 & 3) — the un-bypassable landing gate lives HERE, in the lowest stage writer, so
|
|
429
|
+
// EVERY advance funnels through it (land pipeline, manual `relay_task_set_stage`, and the deploy path
|
|
430
|
+
// `stampDeployedTasks` which calls this primitive directly). See carryPendingHeadBlockingAdvance.
|
|
431
|
+
// TODO(#1456): this gate is a read-then-write and could race a concurrent clear/confirm across hosts;
|
|
432
|
+
// folding it into the UPDATE's WHERE is blocked by the workspace-marker leg (not a single-row
|
|
433
|
+
// predicate) — deferred; SQLite writer-serialization bounds the window to a single host.
|
|
434
|
+
if (CARRY_PENDING_GATED_STAGES.has(input.deliverableStage)) {
|
|
435
|
+
const head = carryPendingHeadBlockingAdvance(current);
|
|
436
|
+
if (head) {
|
|
437
|
+
throw new ValidationError(`cannot advance task ${id} to ${input.deliverableStage}: a #1456 carry-pending obligation is open (discarded head ${head}) — confirm the delivered change was carried onto the current base (relay_task_confirm_carry) before it can land`);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
const sets = ["deliverable_stage = ?"];
|
|
441
|
+
const params: unknown[] = [input.deliverableStage];
|
|
442
|
+
const branch = optionalText(input.branch, "branch", 500);
|
|
443
|
+
if (branch) { sets.push("branch = ?"); params.push(branch); }
|
|
444
|
+
if (input.commit) appendCommitRow(id, input.commit, now);
|
|
445
|
+
params.push(now, now, id);
|
|
446
|
+
getDb().query(`UPDATE tasks SET ${sets.join(", ")}, updated_at = ?, last_seen_at = ? WHERE id = ?`).run(...params as any[]);
|
|
447
|
+
insertTaskEvent(id, {
|
|
448
|
+
source: input.actor ?? "agent-relay",
|
|
449
|
+
type: `stage:${input.deliverableStage}`,
|
|
450
|
+
severity: "info",
|
|
451
|
+
title: `Deliverable stage: ${input.deliverableStage}`,
|
|
452
|
+
body: branch ? `branch ${branch}` : "",
|
|
453
|
+
metadata: { deliverableStage: input.deliverableStage, ...(branch ? { branch } : {}), ...(input.commit ? { commit: input.commit } : {}), ...(input.metadata ?? {}) },
|
|
454
|
+
}, now);
|
|
455
|
+
if (input.deliverableStage !== "none") startTaskWorkBody(current, input.actor, `Deliverable stage reached: ${input.deliverableStage}`, now);
|
|
456
|
+
const detail = getTaskDetail(id)!;
|
|
457
|
+
const status = reconciledTaskCompletionStatus(detail);
|
|
458
|
+
if (detail.status !== "done" && status && detail.status !== status) {
|
|
459
|
+
return setTaskStatusBody(id, { status, actor: input.actor, note: `Terminal stage reached: ${input.deliverableStage}` }, now);
|
|
460
|
+
}
|
|
461
|
+
return detail;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
export function setTaskStage(id: number, input: SetTaskStageInput): TaskDetail {
|
|
465
|
+
return writeTransaction(() => setTaskStageBody(id, input, Date.now()));
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
export interface RecordGateInput { gate: string; status: TaskGateStatus; detail?: string; count?: number; commitSha?: string; runId?: string; actor?: string; }
|
|
469
|
+
|
|
470
|
+
// The BODY of recordGate, folded into ONE transaction (ADR §3.4, S3 L-D2 #1904): the `requireDeliverable`
|
|
471
|
+
// guard + the runId dedup READ and the event insert are one atomic unit, so a concurrent duplicate report
|
|
472
|
+
// can never race past the dedup check across a thread hop. Quality-gate ledger write (#834). The
|
|
473
|
+
// append-only `task_events` IS the ledger (no second system of record). Idempotent by runId: the SAME run
|
|
474
|
+
// reported twice does not double-append, so a retried report cannot read as a duplicate pass. A genuine
|
|
475
|
+
// re-run (new runId) appends a higher-id event, which `latestGates` deterministically surfaces as the
|
|
476
|
+
// current state. A KEYLESS call (no runId) always inserts fresh — same "frequently keyless, dedups by
|
|
477
|
+
// construction when a key IS given" classification as L1 `messages.send` (ADR §3.7.1) — so this op is
|
|
478
|
+
// `idempotent: true` and needs no gateway ledger key. Assumes a transaction is already open; the sync
|
|
479
|
+
// wrapper below adds the tx.
|
|
480
|
+
export function recordGateBody(id: number, input: RecordGateInput, now: number): TaskGateState {
|
|
481
|
+
requireDeliverable(id);
|
|
482
|
+
const gate = requireText(input.gate, "gate", 120);
|
|
483
|
+
if (!TASK_GATE_STATUSES.includes(input.status)) {
|
|
484
|
+
throw new ValidationError(`gate status must be one of: ${TASK_GATE_STATUSES.join(", ")}`);
|
|
485
|
+
}
|
|
486
|
+
if (input.count !== undefined && (!Number.isSafeInteger(input.count) || input.count < 0)) throw new ValidationError("count must be a non-negative integer");
|
|
487
|
+
const type = `${GATE_EVENT_PREFIX}${gate}`;
|
|
488
|
+
const runId = optionalText(input.runId, "runId", 240);
|
|
489
|
+
if (runId) {
|
|
490
|
+
const existing = getDb()
|
|
491
|
+
.query(`SELECT * FROM task_events WHERE task_id = ? AND type = ? AND json_extract(metadata, '$.runId') = ? LIMIT 1`)
|
|
492
|
+
.get(id, type, runId) as any;
|
|
493
|
+
if (existing) return gateStateFromEvent(existing);
|
|
494
|
+
}
|
|
495
|
+
const event = insertTaskEvent(id, {
|
|
496
|
+
source: input.actor ?? "agent-relay",
|
|
497
|
+
type,
|
|
498
|
+
severity: input.status === "fail" ? "warning" : "info",
|
|
499
|
+
title: `Gate ${gate}: ${input.status}`,
|
|
500
|
+
body: input.detail ?? "",
|
|
501
|
+
metadata: {
|
|
502
|
+
gate,
|
|
503
|
+
status: input.status,
|
|
504
|
+
...(input.detail ? { detail: input.detail } : {}),
|
|
505
|
+
...(typeof input.count === "number" ? { count: input.count } : {}),
|
|
506
|
+
...(input.commitSha ? { commitSha: input.commitSha } : {}),
|
|
507
|
+
...(runId ? { runId } : {}),
|
|
508
|
+
},
|
|
509
|
+
}, now);
|
|
510
|
+
return gateStateFromEvent({ type, created_at: event.createdAt, metadata: JSON.stringify(event.metadata) });
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
export function recordGate(id: number, input: RecordGateInput): TaskGateState {
|
|
514
|
+
return writeTransaction(() => recordGateBody(id, input, Date.now()));
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
function gateStateFromEvent(row: { type: string; created_at: number; metadata: string }): TaskGateState {
|
|
518
|
+
const meta = parseJson<Record<string, unknown>>(row.metadata, {});
|
|
519
|
+
return {
|
|
520
|
+
gate: typeof meta.gate === "string" ? meta.gate : row.type.slice(GATE_EVENT_PREFIX.length),
|
|
521
|
+
status: (meta.status as TaskGateStatus) ?? "fail",
|
|
522
|
+
...(typeof meta.detail === "string" ? { detail: meta.detail } : {}),
|
|
523
|
+
...(typeof meta.count === "number" ? { count: meta.count } : {}),
|
|
524
|
+
...(typeof meta.commitSha === "string" ? { commitSha: meta.commitSha } : {}),
|
|
525
|
+
...(typeof meta.runId === "string" ? { runId: meta.runId } : {}),
|
|
526
|
+
ranAt: row.created_at,
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
// Deterministic current-state projection over the append-only ledger: the highest-id event
|
|
531
|
+
// per gate type. Re-runs always win; ties are impossible (autoincrement id).
|
|
532
|
+
export function latestGates(id: number): TaskGateState[] {
|
|
533
|
+
const rows = getDb().query(`
|
|
534
|
+
SELECT te.type AS type, te.created_at AS created_at, te.metadata AS metadata
|
|
535
|
+
FROM task_events te
|
|
536
|
+
JOIN (
|
|
537
|
+
SELECT type, MAX(id) AS mid FROM task_events
|
|
538
|
+
WHERE task_id = ? AND type LIKE '${GATE_EVENT_PREFIX}%'
|
|
539
|
+
GROUP BY type
|
|
540
|
+
) m ON te.id = m.mid
|
|
541
|
+
ORDER BY te.type ASC
|
|
542
|
+
`).all(id) as Array<{ type: string; created_at: number; metadata: string }>;
|
|
543
|
+
return rows.map(gateStateFromEvent);
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
// --- Dependency DAG (#834): task→task edges, cycle-rejected transactionally (#834 finding 7).
|
|
547
|
+
// Edge semantics: `taskId` depends on `dependsOnTaskId` (the latter must complete first).
|
|
548
|
+
//
|
|
549
|
+
// The BODY of addTaskDependency, folded into ONE transaction (ADR §3.4, S3 L-D2 #1904, already the
|
|
550
|
+
// pattern here pre-migration — #1432): the existence reads (getRawTask×2), the DAG-walk cycle-check
|
|
551
|
+
// SELECTs, and the INSERT + event are one atomic unit. BEGIN IMMEDIATE (#1432): the benefit is
|
|
552
|
+
// BUSY-avoidance + clean serialization, NOT cycle-prevention — under WAL the DEFERRED default does NOT
|
|
553
|
+
// silently both-commit a cycle; the second of two concurrent adds hits instant SQLITE_BUSY on the
|
|
554
|
+
// reader→writer upgrade (the #1428 class), so it errors rather than inserting. BEGIN IMMEDIATE takes the
|
|
555
|
+
// write lock at BEGIN, so the loser instead WAITS on busy_timeout, then re-reads the winner's committed
|
|
556
|
+
// edge under the lock and cleanly rejects the closing edge as a cycle — turning a spurious BUSY into
|
|
557
|
+
// deterministic serialization. Assumes a transaction is already open; the sync wrapper below adds the tx.
|
|
558
|
+
// The edge insert is `ON CONFLICT DO NOTHING` (dedups by construction) but the event append is
|
|
559
|
+
// unconditional on every call, so this is classified `idempotent: false` — a blind retry after a
|
|
560
|
+
// phantom failure would double-append the `dependency.added` event even though the edge itself dedups.
|
|
561
|
+
export function addTaskDependencyBody(taskId: number, dependsOnTaskId: number, actor: string | undefined, now: number, requiredStage?: TaskTerminalStage): TaskDependency {
|
|
562
|
+
if (taskId === dependsOnTaskId) throw new ValidationError("a task cannot depend on itself");
|
|
563
|
+
const dependent = getRawTask(taskId);
|
|
564
|
+
if (!dependent) throw new ValidationError(`task ${taskId} not found`);
|
|
565
|
+
const prerequisite = getRawTask(dependsOnTaskId);
|
|
566
|
+
if (!prerequisite) throw new ValidationError(`task ${dependsOnTaskId} not found`);
|
|
567
|
+
// #3692 — never quietly downgrade: a deployed edge to a Task whose delivery ends at landed-on-main could not be met.
|
|
568
|
+
if (requiredStage === "deployed" && taskTerminalStage(prerequisite) !== "deployed") {
|
|
569
|
+
throw new ValidationError(`STAGE_UNREACHABLE: T${dependsOnTaskId}'s repo has no CD; require landed-on-main`);
|
|
570
|
+
}
|
|
571
|
+
// Cycle check inside the write transaction: if `dependsOnTaskId` can already reach
|
|
572
|
+
// `taskId` along dependency edges, adding this edge would close a cycle. Loading the
|
|
573
|
+
// reachable set here (not from a stale in-memory snapshot) makes concurrent inserts safe.
|
|
574
|
+
const visited = new Set<number>();
|
|
575
|
+
const stack = [dependsOnTaskId];
|
|
576
|
+
while (stack.length > 0) {
|
|
577
|
+
const cur = stack.pop()!;
|
|
578
|
+
if (cur === taskId) throw new ValidationError("dependency would create a cycle");
|
|
579
|
+
if (visited.has(cur)) continue;
|
|
580
|
+
visited.add(cur);
|
|
581
|
+
const next = getDb().query("SELECT depends_on_task_id FROM task_dependencies WHERE task_id = ?").all(cur) as Array<{ depends_on_task_id: number }>;
|
|
582
|
+
for (const n of next) stack.push(n.depends_on_task_id);
|
|
583
|
+
}
|
|
584
|
+
// The upsert reports one change for a stage update too, so "new edge" is read before it.
|
|
585
|
+
const added = !getDb().query("SELECT 1 FROM task_dependencies WHERE task_id = ? AND depends_on_task_id = ?").get(taskId, dependsOnTaskId);
|
|
586
|
+
// Re-adding an edge keeps its stage unless the caller names one (plan edge saves re-add bare edges).
|
|
587
|
+
getDb().query("INSERT INTO task_dependencies (task_id, depends_on_task_id, created_at, required_stage) VALUES (?, ?, ?, ?) ON CONFLICT DO UPDATE SET required_stage = COALESCE(excluded.required_stage, required_stage)")
|
|
588
|
+
.run(taskId, dependsOnTaskId, now, requiredStage ?? null);
|
|
589
|
+
// #3692: the prerequisite's owner sees who waits on it, once per new edge. A history line, never a wake.
|
|
590
|
+
if (added && (dependent.projectId !== prerequisite.projectId || dependent.teamId !== prerequisite.teamId)) {
|
|
591
|
+
insertTaskEvent(dependsOnTaskId, { source: "agent-relay", type: "dependency.dependent-added", severity: "info", title: `Task ${taskId} waits on this`, body: "", metadata: { dependentTaskId: taskId, ...(dependent.projectId ? { projectId: dependent.projectId } : {}), ...(dependent.teamId ? { teamId: dependent.teamId } : {}) } }, now);
|
|
592
|
+
}
|
|
593
|
+
insertTaskEvent(taskId, {
|
|
594
|
+
source: actor ?? "agent-relay",
|
|
595
|
+
type: "dependency.added",
|
|
596
|
+
severity: "info",
|
|
597
|
+
title: `Depends on task ${dependsOnTaskId}${requiredStage ? ` (requires ${requiredStage})` : ""}`,
|
|
598
|
+
body: "",
|
|
599
|
+
metadata: { dependsOnTaskId, ...(requiredStage ? { requiredStage } : {}) },
|
|
600
|
+
}, now);
|
|
601
|
+
return { taskId, dependsOnTaskId, ...(requiredStage ? { requiredStage } : {}), createdAt: now };
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
export function addTaskDependency(taskId: number, dependsOnTaskId: number, actor?: string, requiredStage?: TaskTerminalStage): TaskDependency {
|
|
605
|
+
return writeTransaction(() => addTaskDependencyBody(taskId, dependsOnTaskId, actor, Date.now(), requiredStage));
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
// The BODY of removeTaskDependency, folded into ONE transaction (ADR §3.4, S3 L-D2 #1904): the DELETE
|
|
609
|
+
// and the conditional event insert (guarded on `result.changes`, not a separate read) are one atomic
|
|
610
|
+
// unit. Idempotent by construction: a retry after the edge is already gone finds `changes === 0` and
|
|
611
|
+
// appends no second event — a genuine no-op re-application (ADR §3.7.1). Assumes a transaction is
|
|
612
|
+
// already open; the sync wrapper below adds the tx.
|
|
613
|
+
export function removeTaskDependencyBody(taskId: number, dependsOnTaskId: number, actor: string | undefined, now: number): boolean {
|
|
614
|
+
const result = getDb().query("DELETE FROM task_dependencies WHERE task_id = ? AND depends_on_task_id = ?").run(taskId, dependsOnTaskId);
|
|
615
|
+
if (result.changes > 0) {
|
|
616
|
+
insertTaskEvent(taskId, {
|
|
617
|
+
source: actor ?? "agent-relay",
|
|
618
|
+
type: "dependency.removed",
|
|
619
|
+
severity: "info",
|
|
620
|
+
title: `Removed dependency on task ${dependsOnTaskId}`,
|
|
621
|
+
body: "",
|
|
622
|
+
metadata: { dependsOnTaskId },
|
|
623
|
+
}, now);
|
|
624
|
+
}
|
|
625
|
+
return result.changes > 0;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
export function removeTaskDependency(taskId: number, dependsOnTaskId: number, actor?: string): boolean {
|
|
629
|
+
return writeTransaction(() => removeTaskDependencyBody(taskId, dependsOnTaskId, actor, Date.now()));
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
function listTaskDependencyEdges(taskId: number) {
|
|
633
|
+
return getDb().query("SELECT depends_on_task_id, required_stage FROM task_dependencies WHERE task_id = ? ORDER BY depends_on_task_id ASC").all(taskId) as Array<{ depends_on_task_id: number; required_stage: TaskTerminalStage | null }>;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
export function listTaskDependencies(taskId: number): number[] {
|
|
637
|
+
return listTaskDependencyEdges(taskId).map((r) => r.depends_on_task_id);
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
export function listTaskDependents(taskId: number): number[] {
|
|
641
|
+
return (getDb().query("SELECT task_id FROM task_dependencies WHERE depends_on_task_id = ? ORDER BY task_id ASC").all(taskId) as Array<{ task_id: number }>)
|
|
642
|
+
.map((r) => r.task_id);
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
// --- Hierarchy (#1535 WS1): parent_task_id is a tree edge — a task has at most one
|
|
646
|
+
// parent. Cycle-guarded the same way as the depends-on DAG above (#834 finding 7): walk
|
|
647
|
+
// the CURRENT parent chain starting at the proposed parent; if it reaches taskId, adding
|
|
648
|
+
// the edge would close a cycle.
|
|
649
|
+
//
|
|
650
|
+
// The BODY of setTaskParent, folded into ONE transaction (ADR §3.4, S3 L-D2 #1904, already the pattern
|
|
651
|
+
// here pre-migration): the existence/kind guard, the parent-chain cycle-walk SELECTs, and the UPDATE +
|
|
652
|
+
// event are one atomic unit — same BEGIN IMMEDIATE concurrency rationale as addTaskDependencyBody.
|
|
653
|
+
// Assumes a transaction is already open; the sync wrapper below adds the tx. The UPDATE itself guards
|
|
654
|
+
// against an already-identical parent and the event follows `changes`, so a replay cannot append a
|
|
655
|
+
// duplicate `parent.set` receipt even if it arrives with a different transport key.
|
|
656
|
+
export function setTaskParentBody(taskId: number, parentTaskId: number, actor: string | undefined, now: number): TaskDetail {
|
|
657
|
+
if (taskId === parentTaskId) throw new ValidationError("a task cannot be its own parent");
|
|
658
|
+
requireDeliverable(taskId);
|
|
659
|
+
if (!getRawTask(parentTaskId)) throw new ValidationError(`task ${parentTaskId} not found`);
|
|
660
|
+
let cur: number | null = parentTaskId;
|
|
661
|
+
const visited = new Set<number>();
|
|
662
|
+
while (cur !== null) {
|
|
663
|
+
if (cur === taskId) throw new ValidationError("parent would create a cycle");
|
|
664
|
+
if (visited.has(cur)) break; // defensive; pre-existing data should never already cycle
|
|
665
|
+
visited.add(cur);
|
|
666
|
+
const row = getDb().query("SELECT parent_task_id FROM tasks WHERE id = ?").get(cur) as { parent_task_id: number | null } | undefined;
|
|
667
|
+
cur = row?.parent_task_id ?? null;
|
|
668
|
+
}
|
|
669
|
+
const result = getDb().query("UPDATE tasks SET parent_task_id = ?, updated_at = ? WHERE id = ? AND (parent_task_id IS NULL OR parent_task_id != ?)")
|
|
670
|
+
.run(parentTaskId, now, taskId, parentTaskId);
|
|
671
|
+
if (result.changes > 0) {
|
|
672
|
+
insertTaskEvent(taskId, {
|
|
673
|
+
source: actor ?? "agent-relay",
|
|
674
|
+
type: "parent.set",
|
|
675
|
+
severity: "info",
|
|
676
|
+
title: `Parent set to task ${parentTaskId}`,
|
|
677
|
+
body: "",
|
|
678
|
+
metadata: { parentTaskId },
|
|
679
|
+
}, now);
|
|
680
|
+
}
|
|
681
|
+
return getTaskDetail(taskId)!;
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
export function setTaskParent(taskId: number, parentTaskId: number, actor?: string): TaskDetail {
|
|
685
|
+
return writeTransaction(() => setTaskParentBody(taskId, parentTaskId, actor, Date.now()));
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
// The BODY of clearTaskParent, folded into ONE transaction (ADR §3.4, S3 L-D2 #1904): the guard read +
|
|
689
|
+
// the UPDATE (conditioned on `parent_task_id IS NOT NULL` in the WHERE, not a separate read) + the
|
|
690
|
+
// conditional event (guarded on `result.changes`) are one atomic unit. Idempotent by construction: a
|
|
691
|
+
// retry once the parent is already cleared finds `changes === 0` and appends no second event. Assumes a
|
|
692
|
+
// transaction is already open; the sync wrapper below adds the tx.
|
|
693
|
+
export function clearTaskParentBody(taskId: number, actor: string | undefined, now: number): TaskDetail {
|
|
694
|
+
requireDeliverable(taskId);
|
|
695
|
+
const result = getDb().query("UPDATE tasks SET parent_task_id = NULL, updated_at = ? WHERE id = ? AND parent_task_id IS NOT NULL").run(now, taskId);
|
|
696
|
+
if (result.changes > 0) {
|
|
697
|
+
insertTaskEvent(taskId, {
|
|
698
|
+
source: actor ?? "agent-relay",
|
|
699
|
+
type: "parent.cleared",
|
|
700
|
+
severity: "info",
|
|
701
|
+
title: "Parent cleared",
|
|
702
|
+
body: "",
|
|
703
|
+
metadata: {},
|
|
704
|
+
}, now);
|
|
705
|
+
}
|
|
706
|
+
return getTaskDetail(taskId)!;
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
export function clearTaskParent(taskId: number, actor?: string): TaskDetail {
|
|
710
|
+
return writeTransaction(() => clearTaskParentBody(taskId, actor, Date.now()));
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
export function listTaskChildren(taskId: number): number[] {
|
|
714
|
+
return (getDb().query(`SELECT id FROM tasks WHERE parent_task_id = ? AND kind = '${DELIVERABLE_TASK_KIND}' ORDER BY id ASC`).all(taskId) as Array<{ id: number }>)
|
|
715
|
+
.map((r) => r.id);
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
// --- Soft related-link (#1535 WS1): symmetric, non-blocking association — distinct from
|
|
719
|
+
// the depends-on DAG (no ordering/gating semantics, no cycle concept). A single canonical
|
|
720
|
+
// row (task_a_id < task_b_id) represents the undirected edge, so adding/removing from
|
|
721
|
+
// either side of the pair is the same write and both directions read it back identically.
|
|
722
|
+
function normalizedRelationPair(taskId: number, relatedTaskId: number): [number, number] {
|
|
723
|
+
if (taskId === relatedTaskId) throw new ValidationError("a task cannot be related to itself");
|
|
724
|
+
return taskId < relatedTaskId ? [taskId, relatedTaskId] : [relatedTaskId, taskId];
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
// The BODY of addTaskRelation, folded into ONE transaction (ADR §3.4, S3 L-D2 #1904): the two existence
|
|
728
|
+
// guard reads + the INSERT + event are one atomic unit. Same classification as addTaskDependencyBody:
|
|
729
|
+
// the edge insert dedups via `ON CONFLICT DO NOTHING` but the event append is unconditional, so this is
|
|
730
|
+
// `idempotent: false`. Assumes a transaction is already open; the sync wrapper below adds the tx.
|
|
731
|
+
export function addTaskRelationBody(taskId: number, relatedTaskId: number, actor: string | undefined, now: number): TaskDetail {
|
|
732
|
+
requireDeliverable(taskId);
|
|
733
|
+
if (!getRawTask(relatedTaskId)) throw new ValidationError(`task ${relatedTaskId} not found`);
|
|
734
|
+
const [a, b] = normalizedRelationPair(taskId, relatedTaskId);
|
|
735
|
+
getDb().query("INSERT INTO task_relations (task_a_id, task_b_id, created_at) VALUES (?, ?, ?) ON CONFLICT DO NOTHING")
|
|
736
|
+
.run(a, b, now);
|
|
737
|
+
insertTaskEvent(taskId, {
|
|
738
|
+
source: actor ?? "agent-relay",
|
|
739
|
+
type: "related.added",
|
|
740
|
+
severity: "info",
|
|
741
|
+
title: `Related to task ${relatedTaskId}`,
|
|
742
|
+
body: "",
|
|
743
|
+
metadata: { relatedTaskId },
|
|
744
|
+
}, now);
|
|
745
|
+
return getTaskDetail(taskId)!;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
export function addTaskRelation(taskId: number, relatedTaskId: number, actor?: string): TaskDetail {
|
|
749
|
+
return writeTransaction(() => addTaskRelationBody(taskId, relatedTaskId, actor, Date.now()));
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
// The BODY of removeTaskRelation, folded into ONE transaction (ADR §3.4, S3 L-D2 #1904): the DELETE +
|
|
753
|
+
// conditional event (guarded on `result.changes`) are one atomic unit — idempotent by construction
|
|
754
|
+
// (same as removeTaskDependencyBody). Assumes a transaction is already open; the sync wrapper below
|
|
755
|
+
// adds the tx.
|
|
756
|
+
export function removeTaskRelationBody(taskId: number, relatedTaskId: number, actor: string | undefined, now: number): TaskDetail | null {
|
|
757
|
+
const [a, b] = normalizedRelationPair(taskId, relatedTaskId);
|
|
758
|
+
const result = getDb().query("DELETE FROM task_relations WHERE task_a_id = ? AND task_b_id = ?").run(a, b);
|
|
759
|
+
if (result.changes > 0) {
|
|
760
|
+
insertTaskEvent(taskId, {
|
|
761
|
+
source: actor ?? "agent-relay",
|
|
762
|
+
type: "related.removed",
|
|
763
|
+
severity: "info",
|
|
764
|
+
title: `Removed relation to task ${relatedTaskId}`,
|
|
765
|
+
body: "",
|
|
766
|
+
metadata: { relatedTaskId },
|
|
767
|
+
}, now);
|
|
768
|
+
}
|
|
769
|
+
return getTaskDetail(taskId);
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
export function removeTaskRelation(taskId: number, relatedTaskId: number, actor?: string): TaskDetail | null {
|
|
773
|
+
return writeTransaction(() => removeTaskRelationBody(taskId, relatedTaskId, actor, Date.now()));
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
export function listTaskRelated(taskId: number): number[] {
|
|
777
|
+
return (getDb().query(`
|
|
778
|
+
SELECT task_b_id AS id FROM task_relations WHERE task_a_id = ?
|
|
779
|
+
UNION
|
|
780
|
+
SELECT task_a_id AS id FROM task_relations WHERE task_b_id = ?
|
|
781
|
+
ORDER BY id ASC
|
|
782
|
+
`).all(taskId, taskId) as Array<{ id: number }>).map((r) => r.id);
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
// --- Refs: issue links (via issue_associations, the source of truth) + branch + commits.
|
|
786
|
+
export interface AddTaskRefInput {
|
|
787
|
+
relation?: IssueRefRelation;
|
|
788
|
+
issue?: string;
|
|
789
|
+
defaultRepo?: string;
|
|
790
|
+
branch?: string;
|
|
791
|
+
commit?: TaskCommitRef;
|
|
792
|
+
actor?: string;
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
// The BODY of addTaskRef, folded into ONE transaction (ADR §3.4, S3 L-D2 #1904): the guard read, the
|
|
796
|
+
// issue resolve/associate + project-fill, the branch UPDATE, and the commit append (itself a read-guarded
|
|
797
|
+
// write — see appendCommitRow) are one atomic unit, each with its own event append. `idempotent: false`:
|
|
798
|
+
// every present field unconditionally appends its own event on each call. Assumes a transaction is
|
|
799
|
+
// already open; the sync wrapper below adds the tx.
|
|
800
|
+
export function addTaskRefBody(id: number, input: AddTaskRefInput, now: number): TaskDetail {
|
|
801
|
+
requireDeliverable(id);
|
|
802
|
+
const relation = cleanIssueRefRelation(input.relation);
|
|
803
|
+
if (input.issue) {
|
|
804
|
+
const ref = resolveIssueRefFromString({ ref: input.issue, defaultRepo: optionalText(input.defaultRepo, "defaultRepo", 500) });
|
|
805
|
+
associateIssue(ref.id, "task", taskEntityId(String(id)), relation);
|
|
806
|
+
fillTaskProjectFromRepo(id, ref.repo, now);
|
|
807
|
+
insertTaskEvent(id, {
|
|
808
|
+
source: input.actor ?? "agent-relay",
|
|
809
|
+
type: "ref.issue.added",
|
|
810
|
+
severity: "info",
|
|
811
|
+
title: `Linked issue ${ref.repo}#${ref.externalKey}`,
|
|
812
|
+
body: ref.url,
|
|
813
|
+
metadata: { issueRefId: ref.id, relation, provider: ref.provider, repo: ref.repo, externalKey: ref.externalKey },
|
|
814
|
+
}, now);
|
|
815
|
+
}
|
|
816
|
+
const branch = optionalText(input.branch, "branch", 500);
|
|
817
|
+
if (branch) {
|
|
818
|
+
getDb().query("UPDATE tasks SET branch = ?, updated_at = ? WHERE id = ?").run(branch, now, id);
|
|
819
|
+
insertTaskEvent(id, { source: input.actor ?? "agent-relay", type: "ref.branch.set", severity: "info", title: `Branch ${branch}`, body: "", metadata: { branch } }, now);
|
|
820
|
+
}
|
|
821
|
+
if (input.commit) {
|
|
822
|
+
appendCommitRow(id, input.commit, now);
|
|
823
|
+
insertTaskEvent(id, { source: input.actor ?? "agent-relay", type: "ref.commit.added", severity: "info", title: `Commit ${input.commit.sha}`, body: input.commit.subject ?? "", metadata: { commit: input.commit } }, now);
|
|
824
|
+
}
|
|
825
|
+
return getTaskDetail(id)!;
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
export function addTaskRef(id: number, input: AddTaskRefInput): TaskDetail {
|
|
829
|
+
return writeTransaction(() => addTaskRefBody(id, input, Date.now()));
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
export interface RemoveTaskRefInput {
|
|
833
|
+
issueRefId?: string;
|
|
834
|
+
branch?: boolean;
|
|
835
|
+
commitSha?: string;
|
|
836
|
+
actor?: string;
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
// The BODY of removeTaskRef, folded into ONE transaction (ADR §3.4, S3 L-D2 #1904): the guard read + the
|
|
840
|
+
// commit-filter read (getRawTask) that guards its own UPDATE are one atomic unit — no thread-hop between
|
|
841
|
+
// the commit-list read and the write. Assumes a transaction is already open; the sync wrapper below adds
|
|
842
|
+
// the tx.
|
|
843
|
+
export function removeTaskRefBody(id: number, input: RemoveTaskRefInput, now: number): TaskDetail {
|
|
844
|
+
requireDeliverable(id);
|
|
845
|
+
if (input.issueRefId) {
|
|
846
|
+
removeAssociation(requireText(input.issueRefId, "issueRefId", 120), "task", taskEntityId(String(id)));
|
|
847
|
+
}
|
|
848
|
+
if (input.branch) {
|
|
849
|
+
getDb().query("UPDATE tasks SET branch = NULL, updated_at = ? WHERE id = ?").run(now, id);
|
|
850
|
+
}
|
|
851
|
+
if (input.commitSha) {
|
|
852
|
+
const task = getRawTask(id)!;
|
|
853
|
+
const commits = (task.commits ?? []).filter((c) => c.sha !== input.commitSha);
|
|
854
|
+
getDb().query("UPDATE tasks SET commits = ?, updated_at = ? WHERE id = ?").run(JSON.stringify(commits), now, id);
|
|
855
|
+
}
|
|
856
|
+
return getTaskDetail(id)!;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
export function removeTaskRef(id: number, input: RemoveTaskRefInput): TaskDetail {
|
|
860
|
+
return writeTransaction(() => removeTaskRefBody(id, input, Date.now()));
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
// Read-guarded write (already a same-tx read+write before this migration): reads the current commits
|
|
864
|
+
// array and appends only if the sha is not already present, so a duplicate append is a no-op. `now` is
|
|
865
|
+
// threaded from the caller (H6) rather than re-read here.
|
|
866
|
+
function appendCommitRow(id: number, commit: TaskCommitRef, now: number): void {
|
|
867
|
+
const sha = requireText(commit.sha, "commit.sha", 80);
|
|
868
|
+
const subject = optionalText(commit.subject, "commit.subject", 1000);
|
|
869
|
+
const task = getRawTask(id)!;
|
|
870
|
+
const commits = task.commits ?? [];
|
|
871
|
+
if (commits.some((c) => c.sha === sha)) return;
|
|
872
|
+
commits.push({ sha, ...(subject ? { subject } : {}) });
|
|
873
|
+
getDb().query("UPDATE tasks SET commits = ?, updated_at = ? WHERE id = ?").run(JSON.stringify(commits), now, id);
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
// --- Attribution: who did what. Writes owner_agent_id + owner_agent_label (NOT claimed_by) + an attribution event.
|
|
877
|
+
// label is stored at bind time so it survives agent reap and can be shown without a live roster lookup (#890).
|
|
878
|
+
//
|
|
879
|
+
// The BODY of assignTaskAgent, folded into ONE transaction (ADR §3.4, S3 L-D2 #1904): the guard read +
|
|
880
|
+
// the agent-record lookup (both guard the UPDATE) and the UPDATE + event are one atomic unit.
|
|
881
|
+
// `idempotent: false`: unconditional UPDATE + event on every call. Assumes a transaction is already
|
|
882
|
+
// open; the sync wrapper below adds the tx.
|
|
883
|
+
export function assignTaskAgentBody(id: number, agentId: string, role: string | undefined, actor: string | undefined, now: number): TaskDetail {
|
|
884
|
+
const current = requireDeliverable(id);
|
|
885
|
+
const cleanAgent = requireText(agentId, "agentId", 200);
|
|
886
|
+
const agentRecord = getAgent(cleanAgent);
|
|
887
|
+
const agentLabel = agentRecord?.label || agentRecord?.name || null;
|
|
888
|
+
const cleanRole = optionalText(role, "role", 120);
|
|
889
|
+
getDb().query("UPDATE tasks SET owner_agent_id = ?, owner_agent_label = ?, updated_at = ? WHERE id = ?").run(cleanAgent, agentLabel, now, id);
|
|
890
|
+
insertTaskEvent(id, {
|
|
891
|
+
source: actor ?? cleanAgent,
|
|
892
|
+
type: "agent.assigned",
|
|
893
|
+
severity: "info",
|
|
894
|
+
title: `Assigned ${cleanAgent}${cleanRole ? ` (${cleanRole})` : ""}`,
|
|
895
|
+
body: "",
|
|
896
|
+
metadata: { agentId: cleanAgent, ...(cleanRole ? { role: cleanRole } : {}) },
|
|
897
|
+
}, now);
|
|
898
|
+
startTaskWorkBody(current, actor ?? cleanAgent, `owner ${cleanAgent} assigned`, now);
|
|
899
|
+
return getTaskDetail(id)!;
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
export function assignTaskAgent(id: number, agentId: string, role?: string, actor?: string): TaskDetail {
|
|
903
|
+
return writeTransaction(() => assignTaskAgentBody(id, agentId, role, actor, Date.now()));
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
// --- Attribution: spawn-with-task (#838). Records that a worker was spawned FOR this Task,
|
|
907
|
+
// keyed on its spawnRequestId, BEFORE the child registers (fire-and-forget spawns resolve the
|
|
908
|
+
// agent id later). The append-only event is the durable hook #831 reads to drive one-shot
|
|
909
|
+
// reap (find the spawn by spawnRequestId → on land update status → reap). `agent.`-prefixed so
|
|
910
|
+
// it stays Task-only telemetry and never write-throughs to the issue tracker (#833 boundary).
|
|
911
|
+
export interface RecordTaskSpawnInput {
|
|
912
|
+
spawnRequestId: string;
|
|
913
|
+
provider: string;
|
|
914
|
+
requestedBy: string;
|
|
915
|
+
steer?: string;
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
export interface RecordTaskDispatchDecisionInput {
|
|
919
|
+
decision: {
|
|
920
|
+
target?: unknown;
|
|
921
|
+
rationale?: string;
|
|
922
|
+
pinned?: boolean;
|
|
923
|
+
factors?: unknown;
|
|
924
|
+
warnings?: readonly unknown[];
|
|
925
|
+
};
|
|
926
|
+
source: string;
|
|
927
|
+
actor: string;
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
// Idempotent by spawnRequestId: a retried spawn (orchestrator re-dispatch, client retry) reusing
|
|
931
|
+
// the SAME spawnRequestId must NOT append a second attribution event. The append-only `task_events`
|
|
932
|
+
// is the ledger, so we check-before-insert on the spawnRequestId stamped in metadata (mirrors the
|
|
933
|
+
// runId idempotency in recordGate). NOTE (#838): this dedups the Task ATTRIBUTION only. The
|
|
934
|
+
// command-bus layer is NOT idempotent — `createCommand` always inserts a fresh random-id row and
|
|
935
|
+
// `commands.correlation_id` is indexed but not UNIQUE — so a retried spawnRequestId can still
|
|
936
|
+
// dispatch a duplicate agent.spawn command. Making correlation_id unique ramifies into the broader
|
|
937
|
+
// command/orchestrator-retry path beyond #838's lane; tracked as a separate follow-up.
|
|
938
|
+
// The BODY of recordTaskSpawnRequested, folded into ONE transaction (ADR §3.4, S3 L-D2 #1904): the
|
|
939
|
+
// spawnRequestId dedup READ and the event insert are one atomic unit — dedups by construction on
|
|
940
|
+
// spawnRequestId (a REQUIRED field, unlike recordGate's optional runId), so `idempotent: true` and no
|
|
941
|
+
// gateway ledger key is needed. Assumes a transaction is already open; the sync wrapper below adds the tx.
|
|
942
|
+
export function recordTaskSpawnRequestedBody(id: number, input: RecordTaskSpawnInput, now: number): TaskDetail {
|
|
943
|
+
requireDeliverable(id);
|
|
944
|
+
const spawnRequestId = requireText(input.spawnRequestId, "spawnRequestId", 200);
|
|
945
|
+
const provider = requireText(input.provider, "provider", 120);
|
|
946
|
+
const requestedBy = requireText(input.requestedBy, "requestedBy", 200);
|
|
947
|
+
const steer = optionalText(input.steer, "steer", 1_000_000);
|
|
948
|
+
const existing = getDb()
|
|
949
|
+
.query(`SELECT id FROM task_events WHERE task_id = ? AND type = 'agent.spawn_requested' AND json_extract(metadata, '$.spawnRequestId') = ? LIMIT 1`)
|
|
950
|
+
.get(id, spawnRequestId);
|
|
951
|
+
if (existing) return getTaskDetail(id)!;
|
|
952
|
+
insertTaskEvent(id, {
|
|
953
|
+
source: requestedBy,
|
|
954
|
+
type: "agent.spawn_requested",
|
|
955
|
+
severity: "info",
|
|
956
|
+
title: `Worker spawn requested (${provider})`,
|
|
957
|
+
body: steer ?? "",
|
|
958
|
+
metadata: { spawnRequestId, provider, requestedBy, ...(steer ? { steer } : {}) },
|
|
959
|
+
}, now);
|
|
960
|
+
return getTaskDetail(id)!;
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
export function recordTaskSpawnRequested(id: number, input: RecordTaskSpawnInput): TaskDetail {
|
|
964
|
+
return writeTransaction(() => recordTaskSpawnRequestedBody(id, input, Date.now()));
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
// The BODY of recordTaskDispatchDecision, folded into ONE transaction (ADR §3.4, S3 L-D2 #1904): the
|
|
968
|
+
// guard read and the event insert are one atomic unit. `idempotent: false`: unconditional event append
|
|
969
|
+
// on every call, no dedup key. Assumes a transaction is already open; the sync wrapper below adds the tx.
|
|
970
|
+
export function recordTaskDispatchDecisionBody(id: number, input: RecordTaskDispatchDecisionInput, now: number): TaskDetail {
|
|
971
|
+
requireDeliverable(id);
|
|
972
|
+
const source = requireText(input.source, "source", 120);
|
|
973
|
+
const actor = requireText(input.actor, "actor", 200);
|
|
974
|
+
const target = isObject(input.decision.target) ? input.decision.target : {};
|
|
975
|
+
const rationale = optionalText(input.decision.rationale, "rationale", 4000) ?? "No dispatch rationale recorded";
|
|
976
|
+
const warnings = Array.isArray(input.decision.warnings)
|
|
977
|
+
? input.decision.warnings.filter((item): item is string => typeof item === "string")
|
|
978
|
+
: [];
|
|
979
|
+
insertTaskEvent(id, {
|
|
980
|
+
source: actor,
|
|
981
|
+
type: "dispatch.resolved",
|
|
982
|
+
severity: warnings.length ? "warning" : "info",
|
|
983
|
+
title: `Dispatch resolved: ${typeof target.provider === "string" ? target.provider : "provider"}`,
|
|
984
|
+
body: rationale,
|
|
985
|
+
metadata: {
|
|
986
|
+
source,
|
|
987
|
+
decision: {
|
|
988
|
+
target,
|
|
989
|
+
rationale,
|
|
990
|
+
pinned: input.decision.pinned === true,
|
|
991
|
+
...(isObject(input.decision.factors) ? { factors: input.decision.factors } : {}),
|
|
992
|
+
warnings,
|
|
993
|
+
},
|
|
994
|
+
},
|
|
995
|
+
}, now);
|
|
996
|
+
return getTaskDetail(id)!;
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
export function recordTaskDispatchDecision(id: number, input: RecordTaskDispatchDecisionInput): TaskDetail {
|
|
1000
|
+
return writeTransaction(() => recordTaskDispatchDecisionBody(id, input, Date.now()));
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
// --- Reads / projections.
|
|
1004
|
+
function issueLinks(id: number, task?: Pick<Task, "dispatch" | "ownerAgentId">): TaskIssueLink[] {
|
|
1005
|
+
const defaultRelation = defaultTaskIssueRelation(task?.dispatch, task?.ownerAgentId);
|
|
1006
|
+
return listIssuesForEntity("task", taskEntityId(String(id))).map((item) => ({
|
|
1007
|
+
issueRefId: item.issueRef.id,
|
|
1008
|
+
relation: item.association.relation ?? defaultRelation,
|
|
1009
|
+
provider: item.issueRef.provider,
|
|
1010
|
+
repo: item.issueRef.repo,
|
|
1011
|
+
externalKey: item.issueRef.externalKey,
|
|
1012
|
+
url: item.issueRef.url,
|
|
1013
|
+
...(item.issueRef.title ? { title: item.issueRef.title } : {}),
|
|
1014
|
+
status: item.issueRef.status,
|
|
1015
|
+
...(item.issueRef.closeReason ? { closeReason: item.issueRef.closeReason } : {}),
|
|
1016
|
+
}));
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1019
|
+
function isObject(value: unknown): value is Record<string, unknown> {
|
|
1020
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
export function getTaskDetail(id: number): TaskDetail | null {
|
|
1024
|
+
const task = getRawTask(id);
|
|
1025
|
+
if (!task || task.kind !== DELIVERABLE_TASK_KIND) return null;
|
|
1026
|
+
const decision = latestTaskDispatchDecision(id);
|
|
1027
|
+
const workerModel = taskBoundWorkerModel(task.ownerAgentId);
|
|
1028
|
+
// #2518 — derived from the event ledger (db/task-review-hold.ts), never stored.
|
|
1029
|
+
const pendingReviewDelivery = taskPendingReviewDelivery(id);
|
|
1030
|
+
const edges = listTaskDependencyEdges(id);
|
|
1031
|
+
const dependsOnStages = Object.fromEntries(edges.flatMap((edge) => edge.required_stage ? [[String(edge.depends_on_task_id), edge.required_stage] as const] : []));
|
|
1032
|
+
return {
|
|
1033
|
+
...task,
|
|
1034
|
+
issues: issueLinks(id, task),
|
|
1035
|
+
dependsOn: edges.map((edge) => edge.depends_on_task_id),
|
|
1036
|
+
...(Object.keys(dependsOnStages).length ? { dependsOnStages } : {}),
|
|
1037
|
+
dependents: listTaskDependents(id),
|
|
1038
|
+
gates: latestGates(id),
|
|
1039
|
+
dispatchWorkShape: taskDispatchWorkShape(task.dispatch),
|
|
1040
|
+
...(decision ? { dispatchDecision: decision } : {}),
|
|
1041
|
+
...(workerModel ? { boundWorkerModel: workerModel } : {}),
|
|
1042
|
+
children: listTaskChildren(id),
|
|
1043
|
+
related: listTaskRelated(id),
|
|
1044
|
+
...(pendingReviewDelivery ? { pendingReviewDelivery } : {}),
|
|
1045
|
+
...taskExecutionField(id),
|
|
1046
|
+
};
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
export { listDeliverableTasks, countDeliverableTasks, listDeliverableTaskSummaries, type ListDeliverableTasksFilter } from "./task-list.ts";
|
|
1050
|
+
|
|
1051
|
+
// Land→Task linkage by attribution (#831/#838). The robust key is the spawned WORKER, not the
|
|
1052
|
+
// branch column (a worker cuts its own branch; the Task's `branch` may never have been recorded).
|
|
1053
|
+
// `assignTaskAgent` (#838) stamps `owner_agent_id` once the child's id resolves, so the landing
|
|
1054
|
+
// workspace's ownerAgentId resolves straight to its bound Task(s).
|
|
1055
|
+
export function deliverableTaskIdsByOwnerAgent(agentId: string): number[] {
|
|
1056
|
+
const cleaned = agentId?.trim();
|
|
1057
|
+
if (!cleaned) return [];
|
|
1058
|
+
return (getDb().query(`SELECT id FROM tasks WHERE kind = '${DELIVERABLE_TASK_KIND}' AND owner_agent_id = ? ORDER BY id ASC`).all(cleaned) as Array<{ id: number }>)
|
|
1059
|
+
.map((r) => r.id);
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
// Fallback linkage for a fire-and-forget spawn whose `owner_agent_id` was never backfilled (the
|
|
1063
|
+
// child registered after the bounded poll window, #838): the `agent.spawn_requested` attribution
|
|
1064
|
+
// event (recorded BEFORE the child registers) carries the spawnRequestId. The landing worker's
|
|
1065
|
+
// `meta.spawnRequestId` resolves back through it to the Task. Returns every matching task id so a
|
|
1066
|
+
// reused spawnRequestId can't silently drop a link.
|
|
1067
|
+
export function deliverableTaskIdsBySpawnRequestId(spawnRequestId: string): number[] {
|
|
1068
|
+
const cleaned = spawnRequestId?.trim();
|
|
1069
|
+
if (!cleaned) return [];
|
|
1070
|
+
return (getDb()
|
|
1071
|
+
.query(`SELECT DISTINCT te.task_id AS id FROM task_events te
|
|
1072
|
+
JOIN tasks t ON t.id = te.task_id AND t.kind = '${DELIVERABLE_TASK_KIND}'
|
|
1073
|
+
WHERE te.type = 'agent.spawn_requested' AND json_extract(te.metadata, '$.spawnRequestId') = ?
|
|
1074
|
+
ORDER BY te.task_id ASC`)
|
|
1075
|
+
.all(cleaned) as Array<{ id: number }>)
|
|
1076
|
+
.map((r) => r.id);
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
// #910 — true once this deliverable task has recorded a `deliverable` event (any disposition). The
|
|
1080
|
+
// task-deliver path routes a structured `task.deliverable` notification to the spawner for that same
|
|
1081
|
+
// event, so the lineage report-up flush treats this as "the spawner was already told" and suppresses
|
|
1082
|
+
// its redundant narrative turn-final / reap-time re-flush (db/messages.ts flushWorkFinalReports).
|
|
1083
|
+
export function taskHasDeliverableEvent(taskId: number): boolean {
|
|
1084
|
+
if (!Number.isSafeInteger(taskId) || taskId <= 0) return false;
|
|
1085
|
+
return Boolean(getDb()
|
|
1086
|
+
.query("SELECT 1 FROM task_events WHERE task_id = ? AND type = 'deliverable' LIMIT 1")
|
|
1087
|
+
.get(taskId));
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
// #2125 — the `created_at` of this deliverable task's `deliverable` event (earliest, if somehow more
|
|
1091
|
+
// than one), or undefined if none. The #910 suppression above reads this to narrow its window: a held
|
|
1092
|
+
// lineage capture from BEFORE this timestamp was part of the delivery itself (already covered by the
|
|
1093
|
+
// structured `task.deliverable` notification); one from AFTER it is post-delivery work the spawner has
|
|
1094
|
+
// not otherwise heard about and must still report up.
|
|
1095
|
+
export function taskDeliverableEventCreatedAt(taskId: number): number | undefined {
|
|
1096
|
+
if (!Number.isSafeInteger(taskId) || taskId <= 0) return undefined;
|
|
1097
|
+
const row = getDb()
|
|
1098
|
+
.query("SELECT created_at AS createdAt FROM task_events WHERE task_id = ? AND type = 'deliverable' ORDER BY created_at ASC LIMIT 1")
|
|
1099
|
+
.get(taskId) as { createdAt: number } | undefined;
|
|
1100
|
+
return row?.createdAt;
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
// Mark that the Task's one-shot worker was reaped on land (#831 reap-signal axis). Records the
|
|
1104
|
+
// timestamp on the durable row and appends an `agent.`-prefixed telemetry event (Task-only; never
|
|
1105
|
+
// writes through to the issue tracker — see the weave boundary).
|
|
1106
|
+
//
|
|
1107
|
+
// The BODY of markTaskAgentReaped, folded into ONE transaction (ADR §3.4, S3 L-D2 #1904): the guard read
|
|
1108
|
+
// and the UPDATE + event are one atomic unit. NOTE despite the doc-comment's "idempotent" framing above
|
|
1109
|
+
// (a same-land re-fire is expected to be a no-op in PRACTICE), the op has no STRUCTURAL dedup: it
|
|
1110
|
+
// unconditionally re-stamps `reaped_at` and re-appends an `agent.reaped` event on every call, so per the
|
|
1111
|
+
// ADR §3.7.1 STRUCTURAL gate this is `idempotent: false` and the async facade supplies a per-submission
|
|
1112
|
+
// key. Assumes a transaction is already open; the sync wrapper below adds the tx.
|
|
1113
|
+
export function markTaskAgentReapedBody(id: number, input: { agentId: string; reason?: string }, now: number): TaskDetail {
|
|
1114
|
+
requireDeliverable(id);
|
|
1115
|
+
const agentId = requireText(input.agentId, "agentId", 200);
|
|
1116
|
+
getDb().query("UPDATE tasks SET reaped_at = ?, updated_at = ? WHERE id = ?").run(now, now, id);
|
|
1117
|
+
insertTaskEvent(id, {
|
|
1118
|
+
source: "agent-relay",
|
|
1119
|
+
type: "agent.reaped",
|
|
1120
|
+
severity: "info",
|
|
1121
|
+
title: `Worker ${agentId} reaped`,
|
|
1122
|
+
body: input.reason ?? "deliverable landed + gates passed",
|
|
1123
|
+
metadata: { agentId, ...(input.reason ? { reason: input.reason } : {}) },
|
|
1124
|
+
}, now);
|
|
1125
|
+
return getTaskDetail(id)!;
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
export function markTaskAgentReaped(id: number, input: { agentId: string; reason?: string; at?: number }): TaskDetail {
|
|
1129
|
+
return writeTransaction(() => markTaskAgentReapedBody(id, input, input.at ?? Date.now()));
|
|
1130
|
+
}
|
|
1131
|
+
|
|
1132
|
+
export function listIssueRefsForLandedBranch(branch: string): TaskIssueLink[] {
|
|
1133
|
+
const out: TaskIssueLink[] = [];
|
|
1134
|
+
const seen = new Set<string>();
|
|
1135
|
+
for (const id of deliverableTaskIdsByBranch(branch)) {
|
|
1136
|
+
for (const link of issueLinks(id, getRawTask(id) ?? undefined)) {
|
|
1137
|
+
if (seen.has(link.issueRefId)) continue;
|
|
1138
|
+
seen.add(link.issueRefId);
|
|
1139
|
+
out.push(link);
|
|
1140
|
+
}
|
|
1141
|
+
}
|
|
1142
|
+
return out;
|
|
1143
|
+
}
|