@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,1253 @@
|
|
|
1
|
+
import { cleanGateLimits } from "@humwick/sdk";
|
|
2
|
+
import { recordConfigHistory } from "./db/provider-config-history";
|
|
3
|
+
import { applyProfilePromptEntry, applyProfilePromptSlots, resetProfilePromptSlots, writeProfilePromptSlots } from "./db/prompt-versions";
|
|
4
|
+
import { memoryRetirementMessage } from "./memory-retirement";
|
|
5
|
+
import { cleanProfileWorkflows } from "./profile-workflow-policy";
|
|
6
|
+
import { revokeRemovedVaultAccess } from "./db/vault-tokens";
|
|
7
|
+
import { cleanServiceAccess, validateServiceCatalog } from "./service-access/validation";
|
|
8
|
+
import { CHANNEL_OUTPUT_NAMESPACE, validateChannelOutputControl } from "./channel-output-validation";
|
|
9
|
+
// Imported from the connection module rather than the `./db` barrel: #1700 gave src/db/channels.ts
|
|
10
|
+
// a `../config-store.ts` import, and going through the barrel closes that into a cycle
|
|
11
|
+
// (db → db/index → db/agents → db/channels → config-store → db). connection.ts owns both symbols
|
|
12
|
+
// and pulls in no db domain modules, so this is also the barrel rule applied — behaviour comes from
|
|
13
|
+
// the domain module. src/validation.ts already sources ValidationError the same way.
|
|
14
|
+
import { getDb, ValidationError, writeTransaction } from "./db/connection.ts";
|
|
15
|
+
import { deletePolicySelfEffortInternal } from "./db/self-effort-permissions";
|
|
16
|
+
import { profileMatrixEnabled } from "./config";
|
|
17
|
+
import { cleanEnum, cleanString, cleanStringArray } from "./validation";
|
|
18
|
+
import { assertLaunchModeSupported } from "./launch-mode-support";
|
|
19
|
+
import {
|
|
20
|
+
NOTIFICATIONS_CONFIG_DEFAULTS,
|
|
21
|
+
NOTIFICATIONS_DEFAULT_KEY,
|
|
22
|
+
NOTIFICATIONS_NAMESPACE,
|
|
23
|
+
parseNotificationSettingsKey,
|
|
24
|
+
validateNotificationSettingsLayer,
|
|
25
|
+
validateNotificationsConfig,
|
|
26
|
+
} from "./notification-settings";
|
|
27
|
+
import { validateSelfResumeConfig } from "./self-resume-config";
|
|
28
|
+
import { WORKSPACE_CONFIG_DEFAULTS } from "./workspace-config";
|
|
29
|
+
import { RETENTION_NAMESPACE, validateRetentionConfig } from "./retention-config";
|
|
30
|
+
import { TEAM_TEMPLATE_NAMESPACE, validateTeamTemplate } from "./team-template-config";
|
|
31
|
+
import { PROVIDER_ENABLEMENT_NAMESPACE, validateProviderEnablement } from "./provider-enablement";
|
|
32
|
+
import { HOST_PROVIDER_ENABLEMENT_NAMESPACE, validateHostProviderEnablement } from "./host-provider-enablement";
|
|
33
|
+
import { normalizeConfigModelSelection } from "./config-model-selection";
|
|
34
|
+
import { RESERVED_SYNTHETIC_AUDIENCE } from "./memory-inject-filter";
|
|
35
|
+
import { agentProfileDefaults, BUILT_IN_AGENT_PROFILE_NAMES, builtInAgentProfile, builtInAgentProfiles, legacyProfileAliasPinsHost, profileProviderRefusal } from "./agent-profile-catalog";
|
|
36
|
+
import { PROJECT_MCP_POLICY_NAMES } from "./project-mcp";
|
|
37
|
+
import { PROJECT_SETTINGS_POLICY_NAMES } from "./project-settings";
|
|
38
|
+
import { parseNativeMemory } from "./native-memory";
|
|
39
|
+
import { PROJECT_SKILLS_POLICY_NAMES } from "./project-skills"; import { cleanProfileProjectAck, cleanProfileProjectTrust } from "./profile-project-validation";
|
|
40
|
+
import { SHARED_MCP_POLICY_NAMES } from "./shared-mcp";
|
|
41
|
+
|
|
42
|
+
import { resolveRelayTools } from "./mcp/tool-groups";
|
|
43
|
+
import { cleanLandStackDepth } from "./land-stack-depth";
|
|
44
|
+
import { cleanAgentProfileProviderOptions } from "./profile-provider-options";
|
|
45
|
+
import { reconcileHostCellInputs, withSyncedHostCells } from "./profile-host-sources";
|
|
46
|
+
import type { ProviderEffort } from "@humwick/sdk/provider-catalog";
|
|
47
|
+
import { AGENT_PROFILE_MESSAGING_POLICIES, canonicalAgentProfileName, isRecord, isSpawnProvider, LAUNCH_MODES, projectInstructionsOn, SPAWN_PROVIDERS, VALID_WORKSPACE_MODES, WEB_TOOL_NAMES } from "@humwick/sdk";
|
|
48
|
+
import type {
|
|
49
|
+
AgentProfile,
|
|
50
|
+
ServiceAccessCatalog,
|
|
51
|
+
AgentProfileBase,
|
|
52
|
+
ProfileSourceMatrix,
|
|
53
|
+
ProfileToggleCell,
|
|
54
|
+
ProfileAssetCell,
|
|
55
|
+
ProfileProjectPolicyCell,
|
|
56
|
+
ProfileRelayInstructionsCell,
|
|
57
|
+
ProfileRelayMcpCell,
|
|
58
|
+
ConfigEntry,
|
|
59
|
+
ConfigHistoryEntry,
|
|
60
|
+
InsightsConfig,
|
|
61
|
+
LandingConfig,
|
|
62
|
+
ManagedAgentState,
|
|
63
|
+
ManagedAgentStatus,
|
|
64
|
+
NotificationsConfig,
|
|
65
|
+
SelfResumeConfig,
|
|
66
|
+
SpawnApprovalMode,
|
|
67
|
+
SpawnPolicy,
|
|
68
|
+
SpawnProvider,
|
|
69
|
+
StewardConfig,
|
|
70
|
+
WorkspaceConfig,
|
|
71
|
+
WorkspaceLandingPolicy,
|
|
72
|
+
} from "./types";
|
|
73
|
+
const CONFIG_HISTORY_LIMIT = 50;
|
|
74
|
+
const SPAWN_POLICY_NAMESPACE = "spawn-policy";
|
|
75
|
+
const AGENT_PROFILE_NAMESPACE = "agent-profile";
|
|
76
|
+
export const AGENT_PROFILE_OVERRIDE_NAMESPACE = "agent-profile-override";
|
|
77
|
+
// #1963 N10 — the immutable pre-migration snapshot of every rewritten override row. The v2 migration
|
|
78
|
+
// copies each raw override here BEFORE rewriting the live row; while `AGENT_RELAY_PROFILE_MATRIX` is
|
|
79
|
+
// off (default one release) `builtInProfileEntry` serves these bytes instead of the migrated row, so
|
|
80
|
+
// rollback is byte-exact and needs no un-migration. An authoritative re-write of the live row
|
|
81
|
+
// (operator PUT / built-in reset) deletes the snapshot — a deliberately re-authored row supersedes it.
|
|
82
|
+
export const AGENT_PROFILE_OVERRIDE_V1_BACKUP_NAMESPACE = "agent-profile-override-v1-backup";
|
|
83
|
+
const STEWARD_NAMESPACE = "steward";
|
|
84
|
+
const STEWARD_KEY = "default";
|
|
85
|
+
const INSIGHTS_NAMESPACE = "insights";
|
|
86
|
+
const INSIGHTS_KEY = "default";
|
|
87
|
+
const SELF_RESUME_NAMESPACE = "self-resume";
|
|
88
|
+
const SELF_RESUME_KEY = "default";
|
|
89
|
+
const WORKSPACE_NAMESPACE = "workspace";
|
|
90
|
+
const WORKSPACE_KEY = "default";
|
|
91
|
+
const LANDING_NAMESPACE = "landing";
|
|
92
|
+
const LANDING_KEY = "default";
|
|
93
|
+
const VALID_LANDING_STRATEGIES = ["direct", "pr"] as const;
|
|
94
|
+
const VALID_LANDING_MECHANISMS = ["managed", "plain-git"] as const;
|
|
95
|
+
const VALID_PROFILE_PROVIDERS = ["any", ...SPAWN_PROVIDERS] as const;
|
|
96
|
+
const VALID_PROFILE_BASES = ["host", "minimal", "isolated", "vanilla"] as const;
|
|
97
|
+
const VALID_PROFILE_INSTRUCTION_POLICIES = ["allow", "ignore"] as const;
|
|
98
|
+
const VALID_PROFILE_CATEGORY_MODES = ["host", "profile", "repo", "none"] as const;
|
|
99
|
+
const VALID_PROFILE_ASSET_SOURCES = ["relay", "repo", "inline", "provider"] as const;
|
|
100
|
+
const VALID_PROFILE_FILESYSTEM_SCOPES = ["repo", "workspace", "host"] as const;
|
|
101
|
+
const VALID_PERMISSION_MODES = ["open", "guarded", "read-only"] as const;
|
|
102
|
+
const VALID_POLICY_MODES = ["always-on", "on-demand"] as const;
|
|
103
|
+
const VALID_MANAGED_STATUSES = ["stopped", "starting", "running", "stopping", "backoff", "failed"] as const;
|
|
104
|
+
export { agentProfileDefaults, builtInAgentProfiles, DEFAULT_SPAWN_PROFILE_NAME } from "./agent-profile-catalog";
|
|
105
|
+
|
|
106
|
+
interface ConfigRow {
|
|
107
|
+
namespace: string;
|
|
108
|
+
key: string;
|
|
109
|
+
value: string;
|
|
110
|
+
version: number;
|
|
111
|
+
updated_at: string;
|
|
112
|
+
updated_by: string | null;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
interface ConfigHistoryRow {
|
|
116
|
+
id: number;
|
|
117
|
+
namespace: string;
|
|
118
|
+
key: string;
|
|
119
|
+
value: string;
|
|
120
|
+
version: number;
|
|
121
|
+
changed_at: string;
|
|
122
|
+
changed_by: string | null;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
interface ManagedAgentStateRow {
|
|
126
|
+
policy_name: string;
|
|
127
|
+
status: ManagedAgentStatus;
|
|
128
|
+
agent_id: string | null;
|
|
129
|
+
last_agent_id: string | null;
|
|
130
|
+
orchestrator_id: string;
|
|
131
|
+
provider: SpawnProvider;
|
|
132
|
+
tmux_session: string | null;
|
|
133
|
+
spawn_request_id: string | null;
|
|
134
|
+
workspace_id: string | null;
|
|
135
|
+
workspace_path: string | null;
|
|
136
|
+
workspace_branch: string | null;
|
|
137
|
+
last_spawn_at: number | null;
|
|
138
|
+
last_stop_at: number | null;
|
|
139
|
+
healthy_since: number | null;
|
|
140
|
+
restart_count: number;
|
|
141
|
+
consecutive_failures: number;
|
|
142
|
+
backoff_until: number | null;
|
|
143
|
+
last_error: string | null;
|
|
144
|
+
updated_at: number;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
type ManagedAgentStateInput = Omit<ManagedAgentState, "updatedAt" | "restartCount" | "consecutiveFailures"> &
|
|
148
|
+
Partial<Pick<ManagedAgentState, "updatedAt" | "restartCount" | "consecutiveFailures">>;
|
|
149
|
+
|
|
150
|
+
type ManagedAgentStatePatch = Partial<Omit<ManagedAgentState, "policyName" | "orchestratorId" | "provider">> &
|
|
151
|
+
Partial<Pick<ManagedAgentState, "orchestratorId" | "provider">>;
|
|
152
|
+
|
|
153
|
+
function parseJsonValue(raw: string): unknown {
|
|
154
|
+
try {
|
|
155
|
+
return JSON.parse(raw);
|
|
156
|
+
} catch {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function rowToConfigEntry<T>(row: ConfigRow): ConfigEntry<T> {
|
|
162
|
+
return {
|
|
163
|
+
namespace: row.namespace,
|
|
164
|
+
key: row.key,
|
|
165
|
+
value: parseJsonValue(row.value) as T,
|
|
166
|
+
version: row.version,
|
|
167
|
+
updatedAt: row.updated_at,
|
|
168
|
+
updatedBy: row.updated_by ?? undefined,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function rowToConfigHistoryEntry<T>(row: ConfigHistoryRow): ConfigHistoryEntry<T> {
|
|
173
|
+
return {
|
|
174
|
+
id: row.id,
|
|
175
|
+
namespace: row.namespace,
|
|
176
|
+
key: row.key,
|
|
177
|
+
value: parseJsonValue(row.value) as T,
|
|
178
|
+
version: row.version,
|
|
179
|
+
changedAt: row.changed_at,
|
|
180
|
+
changedBy: row.changed_by ?? undefined,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function rowToManagedAgentState(row: ManagedAgentStateRow): ManagedAgentState {
|
|
185
|
+
return {
|
|
186
|
+
policyName: row.policy_name,
|
|
187
|
+
status: row.status,
|
|
188
|
+
agentId: row.agent_id ?? undefined,
|
|
189
|
+
orchestratorId: row.orchestrator_id,
|
|
190
|
+
provider: row.provider,
|
|
191
|
+
tmuxSession: row.tmux_session ?? undefined,
|
|
192
|
+
spawnRequestId: row.spawn_request_id ?? undefined,
|
|
193
|
+
workspaceId: row.workspace_id ?? undefined,
|
|
194
|
+
workspacePath: row.workspace_path ?? undefined,
|
|
195
|
+
workspaceBranch: row.workspace_branch ?? undefined,
|
|
196
|
+
lastSpawnAt: row.last_spawn_at ?? undefined,
|
|
197
|
+
lastStopAt: row.last_stop_at ?? undefined,
|
|
198
|
+
healthySince: row.healthy_since ?? undefined,
|
|
199
|
+
restartCount: row.restart_count,
|
|
200
|
+
consecutiveFailures: row.consecutive_failures,
|
|
201
|
+
backoffUntil: row.backoff_until ?? undefined,
|
|
202
|
+
lastError: row.last_error ?? undefined,
|
|
203
|
+
updatedAt: row.updated_at,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function cleanStringRecord(value: unknown, field: string): Record<string, string> {
|
|
208
|
+
if (value === undefined || value === null) return {};
|
|
209
|
+
if (!isRecord(value)) throw new ValidationError(`${field} must be an object`);
|
|
210
|
+
const result: Record<string, string> = {};
|
|
211
|
+
for (const [key, raw] of Object.entries(value)) {
|
|
212
|
+
const cleanKey = cleanString(key, `${field} key`, { required: true, max: 120 })!;
|
|
213
|
+
if (typeof raw !== "string") throw new ValidationError(`${field}.${cleanKey} must be a string`);
|
|
214
|
+
result[cleanKey] = raw;
|
|
215
|
+
}
|
|
216
|
+
return result;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function cleanJsonRecord(value: unknown, field: string): Record<string, unknown> {
|
|
220
|
+
if (value === undefined || value === null) return {};
|
|
221
|
+
if (!isRecord(value)) throw new ValidationError(`${field} must be an object`);
|
|
222
|
+
return value;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function cleanBoolean(value: unknown, field: string): boolean {
|
|
226
|
+
if (typeof value !== "boolean") throw new ValidationError(`${field} must be a boolean`);
|
|
227
|
+
return value;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function cleanNumber(value: unknown, field: string, opts: { min: number; max: number }): number {
|
|
231
|
+
if (typeof value !== "number" || !Number.isSafeInteger(value) || value < opts.min || value > opts.max) {
|
|
232
|
+
throw new ValidationError(`${field} must be an integer between ${opts.min} and ${opts.max}`);
|
|
233
|
+
}
|
|
234
|
+
return value;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// #667 — project `.mcp.json` projection profile default:
|
|
238
|
+
// boolean | { policy } → normalized { policy? } | undefined (OFF).
|
|
239
|
+
function cleanAgentProfileProjectMcp(value: unknown): AgentProfile["projectMcp"] {
|
|
240
|
+
if (value === undefined || value === null || value === false) return undefined;
|
|
241
|
+
if (value === true) return {};
|
|
242
|
+
if (!isRecord(value)) throw new ValidationError("projectMcp must be a boolean or { policy } object");
|
|
243
|
+
const policy = value.policy;
|
|
244
|
+
if (policy === undefined || policy === null) return {};
|
|
245
|
+
return { policy: cleanEnum(policy, "projectMcp.policy", PROJECT_MCP_POLICY_NAMES) as NonNullable<AgentProfile["projectMcp"]>["policy"] };
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function cleanAgentProfileProjectSkills(value: unknown): AgentProfile["projectSkills"] {
|
|
249
|
+
if (value === undefined || value === null || value === false) return undefined;
|
|
250
|
+
if (value === true) return {};
|
|
251
|
+
if (!isRecord(value)) throw new ValidationError("projectSkills must be a boolean or { policy } object");
|
|
252
|
+
const policy = value.policy;
|
|
253
|
+
if (policy === undefined || policy === null) return {};
|
|
254
|
+
return { policy: cleanEnum(policy, "projectSkills.policy", PROJECT_SKILLS_POLICY_NAMES) as NonNullable<AgentProfile["projectSkills"]>["policy"] };
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
function cleanAgentProfileProjectSettings(value: unknown): AgentProfile["projectSettings"] {
|
|
258
|
+
if (value === undefined || value === null || value === false) return undefined;
|
|
259
|
+
if (value === true) return {};
|
|
260
|
+
if (!isRecord(value)) throw new ValidationError("projectSettings must be a boolean or { policy } object");
|
|
261
|
+
const policy = value.policy;
|
|
262
|
+
if (policy === undefined || policy === null) return {};
|
|
263
|
+
return { policy: cleanEnum(policy, "projectSettings.policy", PROJECT_SETTINGS_POLICY_NAMES) as NonNullable<AgentProfile["projectSettings"]>["policy"] };
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// #672 — shared host-listener MCP projection profile default. Mirrors projectMcp:
|
|
267
|
+
// boolean | { policy } → normalized { policy? } | undefined (OFF).
|
|
268
|
+
function cleanAgentProfileSharedMcp(value: unknown): AgentProfile["sharedMcp"] {
|
|
269
|
+
if (value === undefined || value === null || value === false) return undefined;
|
|
270
|
+
if (value === true) return {};
|
|
271
|
+
if (!isRecord(value)) throw new ValidationError("sharedMcp must be a boolean or { policy } object");
|
|
272
|
+
const policy = value.policy;
|
|
273
|
+
if (policy === undefined || policy === null) return {};
|
|
274
|
+
return { policy: cleanEnum(policy, "sharedMcp.policy", SHARED_MCP_POLICY_NAMES) as NonNullable<AgentProfile["sharedMcp"]>["policy"] };
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
function cleanAgentProfileHostAssets(value: unknown): AgentProfile["hostAssets"] {
|
|
278
|
+
if (value === undefined || value === null || value === false) return undefined;
|
|
279
|
+
if (!isRecord(value)) throw new ValidationError("hostAssets must be an object");
|
|
280
|
+
const hostAssets = {
|
|
281
|
+
...(value.skills === undefined ? {} : { skills: cleanBoolean(value.skills, "hostAssets.skills") }),
|
|
282
|
+
...(value.plugins === undefined ? {} : { plugins: cleanBoolean(value.plugins, "hostAssets.plugins") }),
|
|
283
|
+
...(value.settings === undefined ? {} : { settings: cleanBoolean(value.settings, "hostAssets.settings") }),
|
|
284
|
+
};
|
|
285
|
+
return Object.keys(hostAssets).length ? hostAssets : undefined;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
function cleanAgentProfileNotifications(value: unknown): AgentProfile["notifications"] {
|
|
289
|
+
if (value === undefined || value === null) return undefined;
|
|
290
|
+
if (!isRecord(value)) throw new ValidationError("notifications must be an object");
|
|
291
|
+
const responseMode = value.responseMode === undefined || value.responseMode === null
|
|
292
|
+
? undefined
|
|
293
|
+
: cleanEnum(value.responseMode, "notifications.responseMode", ["normal", "results-only"] as const);
|
|
294
|
+
return responseMode ? { responseMode } : {};
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// #3024 — absent means on, so only an explicit `false` is stored: a profile that never touched
|
|
298
|
+
// its web tools stays byte-identical, and switching one back on removes the key.
|
|
299
|
+
function cleanAgentProfileWebTools(value: unknown): AgentProfile["webTools"] {
|
|
300
|
+
if (value === undefined || value === null) return undefined;
|
|
301
|
+
if (!isRecord(value)) throw new ValidationError("webTools must be an object");
|
|
302
|
+
const off = WEB_TOOL_NAMES.filter((name) => value[name] !== undefined && value[name] !== null && !cleanBoolean(value[name], `webTools.${name}`));
|
|
303
|
+
return off.length ? Object.fromEntries(off.map((name) => [name, false])) : undefined;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function cleanAgentProfileAssetArray(value: unknown, field: string): AgentProfile["skills"] {
|
|
307
|
+
if (value === undefined || value === null) return [];
|
|
308
|
+
if (!Array.isArray(value)) throw new ValidationError(`${field} must be an array`);
|
|
309
|
+
if (value.length > 100) throw new ValidationError(`${field} can contain at most 100 entries`);
|
|
310
|
+
return value.map((item, index) => {
|
|
311
|
+
if (!isRecord(item)) throw new ValidationError(`${field}[${index}] must be an object`);
|
|
312
|
+
return {
|
|
313
|
+
source: cleanEnum(item.source, `${field}[${index}].source`, VALID_PROFILE_ASSET_SOURCES),
|
|
314
|
+
ref: cleanString(item.ref, `${field}[${index}].ref`, { required: true, max: 1000 })!,
|
|
315
|
+
enabled: item.enabled === undefined ? true : cleanBoolean(item.enabled, `${field}[${index}].enabled`),
|
|
316
|
+
provider: item.provider === undefined || item.provider === null
|
|
317
|
+
? undefined
|
|
318
|
+
: cleanEnum(item.provider, `${field}[${index}].provider`, VALID_PROFILE_PROVIDERS),
|
|
319
|
+
meta: isRecord(item.meta) ? item.meta : undefined,
|
|
320
|
+
};
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// ── #1963 N4 — v2 Source × Capability matrix validation ─────────────────────────────────────
|
|
325
|
+
// `validateAgentProfile` accepts an optional additive `sources` block (a derived view of the v1
|
|
326
|
+
// fields; not read by the runner yet) and validates its structure + the two legality rules the
|
|
327
|
+
// epic locked: unknown relay tool-group names are rejected (against RELAY_TOOL_GROUPS), and
|
|
328
|
+
// `project.plugins:on` is rejected (P.plugins is not-implemented). Everything else is structural
|
|
329
|
+
// cleaning that mirrors the v1 field validators above.
|
|
330
|
+
function cleanProfileToggleCell(value: unknown, field: string): ProfileToggleCell {
|
|
331
|
+
if (!isRecord(value)) throw new ValidationError(`${field} must be an object`);
|
|
332
|
+
return { enabled: cleanBoolean(value.enabled, `${field}.enabled`) };
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function cleanProfileAssetCell(value: unknown, field: string): ProfileAssetCell {
|
|
336
|
+
if (!isRecord(value)) throw new ValidationError(`${field} must be an object`);
|
|
337
|
+
return {
|
|
338
|
+
enabled: cleanBoolean(value.enabled, `${field}.enabled`),
|
|
339
|
+
...(value.bundled === undefined || value.bundled === null ? {} : { bundled: cleanBoolean(value.bundled, `${field}.bundled`) }),
|
|
340
|
+
refs: cleanAgentProfileAssetArray(value.refs, `${field}.refs`), ...(value.ack === undefined || value.ack === null ? {} : { ack: cleanProfileProjectAck(value.ack, `${field}.ack`) }),
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
function cleanProfileProjectPolicyCell(value: unknown, field: string, policyNames: readonly string[]): ProfileProjectPolicyCell {
|
|
345
|
+
if (!isRecord(value)) throw new ValidationError(`${field} must be an object`);
|
|
346
|
+
return {
|
|
347
|
+
enabled: cleanBoolean(value.enabled, `${field}.enabled`),
|
|
348
|
+
...(value.policy === undefined || value.policy === null ? {} : { policy: cleanEnum(value.policy, `${field}.policy`, policyNames) as ProfileProjectPolicyCell["policy"] }), ...(value.ack === undefined || value.ack === null ? {} : { ack: cleanProfileProjectAck(value.ack, `${field}.ack`) }),
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
function cleanProfileRelayInstructionsCell(value: unknown, field: string): ProfileRelayInstructionsCell {
|
|
353
|
+
if (!isRecord(value)) throw new ValidationError(`${field} must be an object`);
|
|
354
|
+
return {
|
|
355
|
+
enabled: cleanBoolean(value.enabled, `${field}.enabled`),
|
|
356
|
+
...(value.system === undefined || value.system === null ? {} : { system: cleanString(value.system, `${field}.system`, { max: 16_000 })! }),
|
|
357
|
+
append: cleanStringArray(value.append, `${field}.append`, { itemMax: 16_000, maxItems: 100 }) ?? [],
|
|
358
|
+
turnContext: cleanBoolean(value.turnContext, `${field}.turnContext`),
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
function cleanProfileRelayTools(value: unknown, field: string): NonNullable<AgentProfile["relay"]["tools"]> {
|
|
363
|
+
if (!isRecord(value)) throw new ValidationError(`${field} must be an object`);
|
|
364
|
+
const tools: NonNullable<AgentProfile["relay"]["tools"]> = {};
|
|
365
|
+
for (const key of ["groups", "include", "exclude"] as const) {
|
|
366
|
+
if (value[key] !== undefined) tools[key] = cleanStringArray(value[key], `${field}.${key}`, { itemMax: 120, maxItems: key === "groups" ? 40 : 300 }) ?? [];
|
|
367
|
+
}
|
|
368
|
+
try { resolveRelayTools(tools); } catch (error) { throw new ValidationError(`${field}: ${(error as Error).message}`); }
|
|
369
|
+
return tools;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
function cleanProfileRelayMcpCell(value: unknown, field: string): ProfileRelayMcpCell {
|
|
373
|
+
if (!isRecord(value)) throw new ValidationError(`${field} must be an object`);
|
|
374
|
+
const tools = cleanProfileRelayTools(value, field);
|
|
375
|
+
return {
|
|
376
|
+
enabled: cleanBoolean(value.enabled, `${field}.enabled`),
|
|
377
|
+
...tools,
|
|
378
|
+
...(value.servers === undefined || value.servers === null ? {} : { servers: cleanJsonRecord(value.servers, `${field}.servers`) }),
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
function cleanProfileSources(value: unknown): ProfileSourceMatrix {
|
|
383
|
+
if (!isRecord(value)) throw new ValidationError("sources must be an object");
|
|
384
|
+
const host = isRecord(value.host) ? value.host : {};
|
|
385
|
+
const project = isRecord(value.project) ? value.project : {};
|
|
386
|
+
const agentRelay = isRecord(value.agentRelay) ? value.agentRelay : {};
|
|
387
|
+
// Project plugins are not implemented, but the cell is optional in persisted profiles. Treat
|
|
388
|
+
// omission as "not set" while continuing to validate/reject any explicitly supplied value.
|
|
389
|
+
const projectPlugins = project.plugins === undefined ? { enabled: false, refs: [] } : cleanProfileAssetCell(project.plugins, "sources.project.plugins");
|
|
390
|
+
// Legality rule 2 (#1963 §4): P.plugins is not-implemented — no provider lever exists.
|
|
391
|
+
if (projectPlugins.enabled) throw new ValidationError("sources.project.plugins cannot be enabled: project plugins are not implemented");
|
|
392
|
+
return {
|
|
393
|
+
host: {
|
|
394
|
+
instructions: cleanProfileToggleCell(host.instructions, "sources.host.instructions"),
|
|
395
|
+
mcp: cleanProfileToggleCell(host.mcp, "sources.host.mcp"),
|
|
396
|
+
hooks: cleanProfileAssetCell(host.hooks, "sources.host.hooks"),
|
|
397
|
+
skills: cleanProfileAssetCell(host.skills, "sources.host.skills"),
|
|
398
|
+
plugins: cleanProfileAssetCell(host.plugins, "sources.host.plugins"),
|
|
399
|
+
},
|
|
400
|
+
project: { trust: project.trust === undefined || project.trust === null ? { scope: "roots" } : cleanProfileProjectTrust(project.trust, "sources.project.trust"),
|
|
401
|
+
instructions: project.instructions === undefined ? { enabled: false } : cleanProfileToggleCell(project.instructions, "sources.project.instructions"),
|
|
402
|
+
mcp: project.mcp === undefined ? { enabled: false } : cleanProfileProjectPolicyCell(project.mcp, "sources.project.mcp", PROJECT_MCP_POLICY_NAMES),
|
|
403
|
+
hooks: project.hooks === undefined ? { enabled: false, refs: [] } : cleanProfileAssetCell(project.hooks, "sources.project.hooks"),
|
|
404
|
+
skills: project.skills === undefined ? { enabled: false } : cleanProfileProjectPolicyCell(project.skills, "sources.project.skills", PROJECT_SKILLS_POLICY_NAMES),
|
|
405
|
+
plugins: projectPlugins,
|
|
406
|
+
},
|
|
407
|
+
agentRelay: {
|
|
408
|
+
instructions: cleanProfileRelayInstructionsCell(agentRelay.instructions, "sources.agentRelay.instructions"),
|
|
409
|
+
mcp: cleanProfileRelayMcpCell(agentRelay.mcp, "sources.agentRelay.mcp"),
|
|
410
|
+
hooks: cleanProfileAssetCell(agentRelay.hooks, "sources.agentRelay.hooks"),
|
|
411
|
+
skills: cleanProfileAssetCell(agentRelay.skills, "sources.agentRelay.skills"),
|
|
412
|
+
plugins: cleanProfileAssetCell(agentRelay.plugins, "sources.agentRelay.plugins"),
|
|
413
|
+
},
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
export function validateAgentProfile(key: string, value: unknown, opts: { allowBuiltIn?: boolean } = {}): AgentProfile {
|
|
418
|
+
if (BUILT_IN_AGENT_PROFILE_NAMES.has(key) && !opts.allowBuiltIn) throw new ValidationError("built-in agent profiles are managed by Relay");
|
|
419
|
+
// #1626 F6a — the store-health probe addresses its synthetic marker to this audience precisely
|
|
420
|
+
// BECAUSE no real agent can match it. A profile that claimed the name would be the one agent a
|
|
421
|
+
// leaked probe marker could reach, which is the guarantee the reservation exists to make real.
|
|
422
|
+
if (key === RESERVED_SYNTHETIC_AUDIENCE) throw new ValidationError(`"${RESERVED_SYNTHETIC_AUDIENCE}" is reserved for relay's own synthetic memory entries and cannot name a profile`);
|
|
423
|
+
if (!isRecord(value)) throw new ValidationError("agent-profile value must be an object");
|
|
424
|
+
const name = cleanString(value.name, "name", { required: true, max: 120 })!;
|
|
425
|
+
if (name !== key) throw new ValidationError("agent-profile name must match config key");
|
|
426
|
+
// #2791 — the write chokepoint every profile create/rename funnels through (profile PUT route,
|
|
427
|
+
// generic /api/config PUT, setAgentProfile): a key that resolves to a DIFFERENT stored profile
|
|
428
|
+
// only by case is refused, naming the stored profile. Exact-key updates resolve to themselves.
|
|
429
|
+
const canonical = resolveAgentProfileKey(key);
|
|
430
|
+
if (canonical !== undefined && canonical !== key) {
|
|
431
|
+
throw new ValidationError(`agent-profile name "${key}" collides with existing profile "${canonical}" (profile names are case-insensitive)`);
|
|
432
|
+
}
|
|
433
|
+
const base = cleanEnum(value.base, "base", VALID_PROFILE_BASES) as AgentProfileBase;
|
|
434
|
+
const defaults = agentProfileDefaults({ name, base }), provider = value.provider === undefined || value.provider === null ? defaults.provider : cleanEnum(value.provider, "provider", VALID_PROFILE_PROVIDERS);
|
|
435
|
+
const instructions = isRecord(value.instructions) ? value.instructions : {};
|
|
436
|
+
const relay = isRecord(value.relay) ? value.relay : {};
|
|
437
|
+
const mcp = isRecord(value.mcp) ? value.mcp : {};
|
|
438
|
+
const hooks = isRecord(value.hooks) ? value.hooks : {};
|
|
439
|
+
const permissions = isRecord(value.permissions) ? value.permissions : {};
|
|
440
|
+
// #1963 N4 — additive v2 fields. Both are OMITTED when absent so a v1 profile's normalized shape
|
|
441
|
+
// is byte-identical to today (built-ins never carry them). `sources` is authoritative for
|
|
442
|
+
// matrix-controlled launch facts; v1 fields remain a lossless migration view (G7).
|
|
443
|
+
const sources = value.sources === undefined || value.sources === null ? undefined : cleanProfileSources(value.sources);
|
|
444
|
+
const profileSchemaVersion = value.profileSchemaVersion === undefined || value.profileSchemaVersion === null
|
|
445
|
+
? undefined
|
|
446
|
+
: cleanNumber(value.profileSchemaVersion, "profileSchemaVersion", { min: 1, max: 1000 });
|
|
447
|
+
const normalized = agentProfileDefaults({
|
|
448
|
+
...defaults,
|
|
449
|
+
hostAwareness: value.hostAwareness === undefined ? defaults.hostAwareness : cleanBoolean(value.hostAwareness, "hostAwareness"),
|
|
450
|
+
description: cleanString(value.description, "description", { max: 1000 }),
|
|
451
|
+
// #751: per-profile emoji icon. Short free string (single emoji incl. ZWJ
|
|
452
|
+
// sequences); cap length so it can't smuggle arbitrary text. Empty → undefined.
|
|
453
|
+
icon: cleanString(value.icon, "icon", { max: 8 }) || undefined,
|
|
454
|
+
provider,
|
|
455
|
+
instructions: {
|
|
456
|
+
system: cleanString(instructions.system, "instructions.system", { max: 16_000 }),
|
|
457
|
+
append: cleanStringArray(instructions.append, "instructions.append", { itemMax: 16_000, maxItems: 100 }) ?? [],
|
|
458
|
+
repoInstructions: instructions.repoInstructions === undefined
|
|
459
|
+
? defaults.instructions.repoInstructions
|
|
460
|
+
: cleanEnum(instructions.repoInstructions, "instructions.repoInstructions", VALID_PROFILE_INSTRUCTION_POLICIES),
|
|
461
|
+
globalInstructions: instructions.globalInstructions === undefined
|
|
462
|
+
? defaults.instructions.globalInstructions
|
|
463
|
+
: cleanEnum(instructions.globalInstructions, "instructions.globalInstructions", VALID_PROFILE_INSTRUCTION_POLICIES),
|
|
464
|
+
},
|
|
465
|
+
projectMcp: cleanAgentProfileProjectMcp(value.projectMcp),
|
|
466
|
+
projectSkills: cleanAgentProfileProjectSkills(value.projectSkills),
|
|
467
|
+
projectSettings: cleanAgentProfileProjectSettings(value.projectSettings),
|
|
468
|
+
// #1565 P5.7 — unlike the projectX gates, a literal `false` here means "switch native memory
|
|
469
|
+
// OFF" (the point of the field), not "did not opt in"; only undefined/null is absent.
|
|
470
|
+
serviceAccess: cleanServiceAccess(value.serviceAccess),
|
|
471
|
+
nativeMemory: parseNativeMemory(value.nativeMemory, (m) => new ValidationError(m)),
|
|
472
|
+
sharedMcp: cleanAgentProfileSharedMcp(value.sharedMcp),
|
|
473
|
+
hostAssets: cleanAgentProfileHostAssets(value.hostAssets),
|
|
474
|
+
notifications: cleanAgentProfileNotifications(value.notifications),
|
|
475
|
+
webTools: cleanAgentProfileWebTools(value.webTools),
|
|
476
|
+
...(value.workflows === undefined ? {} : { workflows: cleanProfileWorkflows(value.workflows) }),
|
|
477
|
+
relay: {
|
|
478
|
+
context: relay.context === undefined ? defaults.relay.context : cleanBoolean(relay.context, "relay.context"),
|
|
479
|
+
skills: relay.skills === undefined ? defaults.relay.skills : cleanBoolean(relay.skills, "relay.skills"),
|
|
480
|
+
plugins: relay.plugins === undefined ? defaults.relay.plugins : cleanBoolean(relay.plugins, "relay.plugins"),
|
|
481
|
+
statusLine: relay.statusLine === undefined ? defaults.relay.statusLine : cleanBoolean(relay.statusLine, "relay.statusLine"),
|
|
482
|
+
mcp: relay.mcp === undefined ? defaults.relay.mcp : cleanBoolean(relay.mcp, "relay.mcp"),
|
|
483
|
+
...(relay.tools === undefined ? {} : { tools: cleanProfileRelayTools(relay.tools, "relay.tools") }),
|
|
484
|
+
},
|
|
485
|
+
skills: cleanAgentProfileAssetArray(value.skills, "skills"),
|
|
486
|
+
plugins: cleanAgentProfileAssetArray(value.plugins, "plugins"),
|
|
487
|
+
mcp: {
|
|
488
|
+
mode: mcp.mode === undefined ? defaults.mcp.mode : cleanEnum(mcp.mode, "mcp.mode", VALID_PROFILE_CATEGORY_MODES),
|
|
489
|
+
...(mcp.servers === undefined ? {} : { servers: cleanJsonRecord(mcp.servers, "mcp.servers") }),
|
|
490
|
+
},
|
|
491
|
+
hooks: {
|
|
492
|
+
mode: hooks.mode === undefined ? defaults.hooks.mode : cleanEnum(hooks.mode, "hooks.mode", VALID_PROFILE_CATEGORY_MODES),
|
|
493
|
+
refs: cleanAgentProfileAssetArray(hooks.refs, "hooks.refs"),
|
|
494
|
+
},
|
|
495
|
+
permissions: {
|
|
496
|
+
mode: permissions.mode === undefined || permissions.mode === null
|
|
497
|
+
? undefined
|
|
498
|
+
: cleanEnum(permissions.mode, "permissions.mode", VALID_PERMISSION_MODES),
|
|
499
|
+
filesystem: permissions.filesystem === undefined
|
|
500
|
+
? defaults.permissions.filesystem
|
|
501
|
+
: cleanEnum(permissions.filesystem, "permissions.filesystem", VALID_PROFILE_FILESYSTEM_SCOPES),
|
|
502
|
+
},
|
|
503
|
+
env: cleanStringRecord(value.env, "env"),
|
|
504
|
+
providerOptions: cleanAgentProfileProviderOptions(value.providerOptions),
|
|
505
|
+
...(value.harnessSubagents === undefined ? {} : { harnessSubagents: cleanBoolean(value.harnessSubagents, "harnessSubagents") }),
|
|
506
|
+
...(value.browser === undefined || value.browser === null || cleanBoolean(value.browser, "browser") ? {} : { browser: false }),
|
|
507
|
+
maxSpawnedAgents: value.maxSpawnedAgents === undefined || value.maxSpawnedAgents === null
|
|
508
|
+
? undefined
|
|
509
|
+
: cleanNumber(value.maxSpawnedAgents, "maxSpawnedAgents", { min: 0, max: 100 }),
|
|
510
|
+
hostPinned: value.hostPinned === undefined || value.hostPinned === null
|
|
511
|
+
? undefined
|
|
512
|
+
: cleanBoolean(value.hostPinned, "hostPinned"),
|
|
513
|
+
landingStrategy: value.landingStrategy === undefined || value.landingStrategy === null
|
|
514
|
+
? undefined
|
|
515
|
+
: cleanEnum(value.landingStrategy, "landingStrategy", VALID_LANDING_STRATEGIES) as WorkspaceLandingPolicy,
|
|
516
|
+
messaging: value.messaging == null ? undefined : cleanEnum(value.messaging, "messaging", AGENT_PROFILE_MESSAGING_POLICIES),
|
|
517
|
+
});
|
|
518
|
+
// #3387 — `sources.host` is the synchronized projection of the canonical v1 Host fields.
|
|
519
|
+
return withSyncedHostCells({
|
|
520
|
+
...normalized,
|
|
521
|
+
...(profileSchemaVersion === undefined ? {} : { profileSchemaVersion }),
|
|
522
|
+
...(sources === undefined ? {} : { sources }),
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
function cloneJson<T>(value: T): T {
|
|
527
|
+
return JSON.parse(JSON.stringify(value)) as T;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
export function mergeProfileOverride(base: AgentProfile, override: unknown): AgentProfile {
|
|
531
|
+
if (!isRecord(override)) return cloneJson(base);
|
|
532
|
+
return mergeRecord(cloneJson(base) as unknown as Record<string, unknown>, override) as unknown as AgentProfile;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
function mergeRecord(base: Record<string, unknown>, override: Record<string, unknown>): Record<string, unknown> {
|
|
536
|
+
for (const [key, value] of Object.entries(override)) {
|
|
537
|
+
if (value === undefined) continue;
|
|
538
|
+
const current = base[key];
|
|
539
|
+
base[key] = isRecord(current) && isRecord(value) && !Array.isArray(current) && !Array.isArray(value)
|
|
540
|
+
? mergeRecord({ ...current }, value)
|
|
541
|
+
: value;
|
|
542
|
+
}
|
|
543
|
+
return base;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
export function agentProfileOverrideDiff(base: unknown, merged: unknown): unknown {
|
|
547
|
+
if (Array.isArray(base) || Array.isArray(merged) || !isRecord(base) || !isRecord(merged)) {
|
|
548
|
+
return JSON.stringify(base) === JSON.stringify(merged) ? undefined : merged;
|
|
549
|
+
}
|
|
550
|
+
const diff: Record<string, unknown> = {};
|
|
551
|
+
const keys = new Set([...Object.keys(base), ...Object.keys(merged)]);
|
|
552
|
+
for (const key of keys) {
|
|
553
|
+
if (key === "builtIn" || key === "overridden" || key === "provisioning") continue;
|
|
554
|
+
const value = agentProfileOverrideDiff(base[key], merged[key]);
|
|
555
|
+
if (value !== undefined) diff[key] = value;
|
|
556
|
+
else if (base[key] !== undefined && merged[key] === undefined) diff[key] = null;
|
|
557
|
+
}
|
|
558
|
+
return Object.keys(diff).length ? diff : undefined;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
// #1963 N10 G8 — a profile's matrix must not contradict its own effective v1 instruction fields
|
|
562
|
+
// (host.instructions ⟺ globalInstructions:"allow"; project.instructions ⟺ repoInstructions:"allow" —
|
|
563
|
+
// the two cells `v1ToCells` derives deterministically). Enforced in `validateAgentProfileOverride`, the
|
|
564
|
+
// SINGLE validator every override write funnels through (the profile route, the generic /api/config
|
|
565
|
+
// PUT, and setAgentProfile), against the MERGED view — so a partial body that omits `base` is checked
|
|
566
|
+
// against the seed's fields instead of bypassing the guard. It never runs on read-back
|
|
567
|
+
// (builtInProfileEntry uses validateAgentProfile), so it can never reject an already-persisted row.
|
|
568
|
+
// This is G8's "never silently pick between the v1 fields and the matrix" — reject the contradiction.
|
|
569
|
+
// Host cells are reconciled onto the v1 fields before validation (#3387, reconcileHostCellInputs).
|
|
570
|
+
function assertProfileSourcesMatchInstructions(profile: AgentProfile): void {
|
|
571
|
+
const sources = profile.sources;
|
|
572
|
+
if (!sources) return;
|
|
573
|
+
const project = sources.project;
|
|
574
|
+
if (project?.instructions && project.instructions.enabled !== (profile.instructions.repoInstructions === "allow")) {
|
|
575
|
+
throw new ValidationError(`sources.project.instructions.enabled contradicts instructions.repoInstructions="${profile.instructions.repoInstructions}"`);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
function validateAgentProfileOverride(key: string, value: unknown): Partial<AgentProfile> {
|
|
580
|
+
const builtIn = builtInAgentProfile(key);
|
|
581
|
+
if (!builtIn) throw new ValidationError("agent profile override target must be a built-in profile");
|
|
582
|
+
if (!isRecord(value)) throw new ValidationError("agent-profile override value must be an object");
|
|
583
|
+
const body = reconcileHostCellInputs(value, typeof value.base === "string" ? value.base as AgentProfileBase : builtIn.base, builtIn.hostAssets);
|
|
584
|
+
const merged = mergeProfileOverride(builtIn, { ...body, name: key, builtIn: true });
|
|
585
|
+
const validated = validateAgentProfile(key, merged, { allowBuiltIn: true });
|
|
586
|
+
assertProfileSourcesMatchInstructions(validated);
|
|
587
|
+
const diff = agentProfileOverrideDiff(builtIn, validated);
|
|
588
|
+
return { name: key, ...(isRecord(diff) ? diff : {}) };
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
function validateSpawnPolicy(key: string, value: unknown): SpawnPolicy {
|
|
592
|
+
if (!isRecord(value)) throw new ValidationError("spawn-policy value must be an object");
|
|
593
|
+
const name = cleanString(value.name, "name", { required: true, max: 120 })!;
|
|
594
|
+
if (name !== key) throw new ValidationError("spawn-policy name must match config key");
|
|
595
|
+
const mode = cleanEnum(value.mode, "mode", VALID_POLICY_MODES);
|
|
596
|
+
const policy: SpawnPolicy = {
|
|
597
|
+
name,
|
|
598
|
+
description: cleanString(value.description, "description", { max: 1000 }),
|
|
599
|
+
enabled: value.enabled === undefined ? true : cleanBoolean(value.enabled, "enabled"),
|
|
600
|
+
orchestratorId: cleanString(value.orchestratorId, "orchestratorId", { required: true, max: 200 })!,
|
|
601
|
+
cwd: cleanString(value.cwd, "cwd", { required: true, max: 1000 })!,
|
|
602
|
+
provider: cleanEnum(value.provider, "provider", SPAWN_PROVIDERS) as SpawnProvider,
|
|
603
|
+
workspaceMode: value.workspaceMode === undefined || value.workspaceMode === null ? "inherit" : cleanEnum(value.workspaceMode, "workspaceMode", VALID_WORKSPACE_MODES),
|
|
604
|
+
rig: cleanString(value.rig, "rig", { max: 120 }),
|
|
605
|
+
model: cleanString(value.model, "model", { max: 120 }),
|
|
606
|
+
effort: cleanString(value.effort, "effort", { max: 120 }) as ProviderEffort | undefined,
|
|
607
|
+
profile: cleanString(value.profile, "profile", { max: 120 }),
|
|
608
|
+
providerArgs: cleanStringArray(value.providerArgs, "providerArgs", { itemMax: 120, maxItems: 100 }) ?? [],
|
|
609
|
+
...(value.launchMode === undefined || value.launchMode === null ? {} : { launchMode: cleanEnum(value.launchMode, "launchMode", LAUNCH_MODES) }),
|
|
610
|
+
prompt: cleanString(value.prompt, "prompt", { max: 16_000 }),
|
|
611
|
+
tags: cleanStringArray(value.tags, "tags", { itemMax: 120, maxItems: 100 }) ?? [],
|
|
612
|
+
capabilities: cleanStringArray(value.capabilities, "capabilities", { itemMax: 120, maxItems: 100 }) ?? [],
|
|
613
|
+
label: cleanString(value.label, "label", { max: 120 }),
|
|
614
|
+
mode,
|
|
615
|
+
permissionMode: cleanEnum(value.permissionMode, "permissionMode", VALID_PERMISSION_MODES),
|
|
616
|
+
restartOnUpdate: cleanBoolean(value.restartOnUpdate, "restartOnUpdate"),
|
|
617
|
+
scheduledDailyRestart: cleanBoolean(value.scheduledDailyRestart, "scheduledDailyRestart"),
|
|
618
|
+
backoff: cleanBackoff(value.backoff),
|
|
619
|
+
};
|
|
620
|
+
policy.model = normalizeConfigModelSelection({ provider: policy.provider, model: policy.model, effort: policy.effort });
|
|
621
|
+
// #2791 — store the canonical stored-case profile name so policy-driven spawns carry it
|
|
622
|
+
// downstream (tags, payload, token) instead of the case the operator typed.
|
|
623
|
+
if (policy.profile) {
|
|
624
|
+
const canonicalProfile = resolveAgentProfileKey(policy.profile);
|
|
625
|
+
if (!canonicalProfile) throw new ValidationError("agent profile not found");
|
|
626
|
+
policy.profile = canonicalProfile;
|
|
627
|
+
const refusal = profileProviderRefusal(canonicalProfile, policy.provider);
|
|
628
|
+
if (refusal) throw new ValidationError(refusal);
|
|
629
|
+
}
|
|
630
|
+
if (policy.launchMode) assertLaunchModeSupported(policy.provider, policy.launchMode);
|
|
631
|
+
if (mode === "on-demand") policy.onDemand = cleanOnDemand(value.onDemand);
|
|
632
|
+
if (value.binding !== undefined && value.binding !== null) policy.binding = cleanBinding(value.binding);
|
|
633
|
+
return policy;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
function cleanBackoff(value: unknown): SpawnPolicy["backoff"] {
|
|
637
|
+
if (!isRecord(value)) throw new ValidationError("backoff must be an object");
|
|
638
|
+
if (!Array.isArray(value.schedule) || value.schedule.length === 0) {
|
|
639
|
+
throw new ValidationError("backoff.schedule must be a non-empty array");
|
|
640
|
+
}
|
|
641
|
+
if (value.schedule.length > 20) throw new ValidationError("backoff.schedule can contain at most 20 values");
|
|
642
|
+
return {
|
|
643
|
+
schedule: value.schedule.map((item, index) => cleanNumber(item, `backoff.schedule[${index}]`, { min: 1, max: 86_400 })),
|
|
644
|
+
resetAfterSeconds: cleanNumber(value.resetAfterSeconds, "backoff.resetAfterSeconds", { min: 1, max: 86_400 }),
|
|
645
|
+
};
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
function cleanOnDemand(value: unknown): NonNullable<SpawnPolicy["onDemand"]> {
|
|
649
|
+
if (!isRecord(value)) throw new ValidationError("onDemand must be an object when mode is on-demand");
|
|
650
|
+
const idleDefinition = cleanEnum(value.idleDefinition, "onDemand.idleDefinition", ["no-activity"] as const);
|
|
651
|
+
return {
|
|
652
|
+
keepaliveSeconds: cleanNumber(value.keepaliveSeconds, "onDemand.keepaliveSeconds", { min: 0, max: 2_592_000 }),
|
|
653
|
+
idleDefinition,
|
|
654
|
+
};
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
function cleanBinding(value: unknown): NonNullable<SpawnPolicy["binding"]> {
|
|
658
|
+
if (!isRecord(value)) throw new ValidationError("binding must be an object");
|
|
659
|
+
return {
|
|
660
|
+
type: cleanEnum(value.type, "binding.type", ["channel"] as const),
|
|
661
|
+
channelId: cleanString(value.channelId, "binding.channelId", { required: true, max: 200 })!,
|
|
662
|
+
};
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
const STEWARD_CONFIG_DEFAULTS: StewardConfig = {
|
|
666
|
+
enabled: false,
|
|
667
|
+
provider: "claude",
|
|
668
|
+
permissionMode: "open",
|
|
669
|
+
keepaliveSeconds: 300,
|
|
670
|
+
};
|
|
671
|
+
|
|
672
|
+
function validateStewardConfig(value: unknown): StewardConfig {
|
|
673
|
+
if (!isRecord(value)) throw new ValidationError("steward config value must be an object");
|
|
674
|
+
const config: StewardConfig = {
|
|
675
|
+
enabled: value.enabled === undefined ? false : cleanBoolean(value.enabled, "enabled"),
|
|
676
|
+
provider: cleanEnum(value.provider, "provider", SPAWN_PROVIDERS) as SpawnProvider,
|
|
677
|
+
model: cleanString(value.model, "model", { max: 120 }),
|
|
678
|
+
effort: cleanString(value.effort, "effort", { max: 120 }) as ProviderEffort | undefined,
|
|
679
|
+
permissionMode: (value.permissionMode === undefined || value.permissionMode === null
|
|
680
|
+
? "open"
|
|
681
|
+
: cleanEnum(value.permissionMode, "permissionMode", VALID_PERMISSION_MODES)) as SpawnApprovalMode,
|
|
682
|
+
keepaliveSeconds: value.keepaliveSeconds === undefined || value.keepaliveSeconds === null
|
|
683
|
+
? 300
|
|
684
|
+
: cleanNumber(value.keepaliveSeconds, "keepaliveSeconds", { min: 0, max: 2_592_000 }),
|
|
685
|
+
};
|
|
686
|
+
// Reject a provider/model/effort combo the catalog can't resolve before it ever
|
|
687
|
+
// reaches a spawn (same guard as spawn policies).
|
|
688
|
+
config.model = normalizeConfigModelSelection({ provider: config.provider, model: config.model, effort: config.effort });
|
|
689
|
+
return config;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
// Insights / self-improvement module config — feature toggles for the dogfooding
|
|
693
|
+
// flywheel (epic #183, docs/self-improvement.md). Passive read-only observation, so it
|
|
694
|
+
// defaults on; each feature toggles independently.
|
|
695
|
+
const INSIGHTS_CONFIG_DEFAULTS: InsightsConfig = {
|
|
696
|
+
enabled: true,
|
|
697
|
+
contextRatio: { enabled: true },
|
|
698
|
+
introspection: { enabled: true, minTurns: 4, minContextRemaining: 0.15 },
|
|
699
|
+
};
|
|
700
|
+
|
|
701
|
+
function cleanFraction(value: unknown, field: string, fallback: number): number {
|
|
702
|
+
if (value === undefined || value === null) return fallback;
|
|
703
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < 0 || value > 1) {
|
|
704
|
+
throw new ValidationError(`${field} must be a number between 0 and 1`);
|
|
705
|
+
}
|
|
706
|
+
return value;
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
function validateInsightsConfig(value: unknown): InsightsConfig {
|
|
710
|
+
if (!isRecord(value)) throw new ValidationError("insights config value must be an object");
|
|
711
|
+
const contextRatio = isRecord(value.contextRatio) ? value.contextRatio : {};
|
|
712
|
+
const introspection = isRecord(value.introspection) ? value.introspection : {};
|
|
713
|
+
return {
|
|
714
|
+
enabled: value.enabled === undefined ? INSIGHTS_CONFIG_DEFAULTS.enabled : cleanBoolean(value.enabled, "enabled"),
|
|
715
|
+
contextRatio: {
|
|
716
|
+
enabled: contextRatio.enabled === undefined
|
|
717
|
+
? INSIGHTS_CONFIG_DEFAULTS.contextRatio.enabled
|
|
718
|
+
: cleanBoolean(contextRatio.enabled, "contextRatio.enabled"),
|
|
719
|
+
},
|
|
720
|
+
introspection: {
|
|
721
|
+
enabled: introspection.enabled === undefined
|
|
722
|
+
? INSIGHTS_CONFIG_DEFAULTS.introspection.enabled
|
|
723
|
+
: cleanBoolean(introspection.enabled, "introspection.enabled"),
|
|
724
|
+
minTurns: introspection.minTurns === undefined || introspection.minTurns === null
|
|
725
|
+
? INSIGHTS_CONFIG_DEFAULTS.introspection.minTurns
|
|
726
|
+
: cleanNumber(introspection.minTurns, "introspection.minTurns", { min: 0, max: 1000 }),
|
|
727
|
+
minContextRemaining: cleanFraction(
|
|
728
|
+
introspection.minContextRemaining,
|
|
729
|
+
"introspection.minContextRemaining",
|
|
730
|
+
INSIGHTS_CONFIG_DEFAULTS.introspection.minContextRemaining,
|
|
731
|
+
),
|
|
732
|
+
},
|
|
733
|
+
};
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
// Global workspace provisioning config for isolated worktrees (#159 follow-up).
|
|
737
|
+
|
|
738
|
+
function validateWorkspaceConfig(value: unknown): WorkspaceConfig {
|
|
739
|
+
if (!isRecord(value)) throw new ValidationError("workspace config value must be an object");
|
|
740
|
+
const symlinkPaths = cleanStringArray(value.symlinkPaths, "symlinkPaths", { itemMax: 120, maxItems: 100 }) ?? [];
|
|
741
|
+
// Reject absolute paths and parent-traversal up front: symlink sources must stay
|
|
742
|
+
// inside the main checkout. The orchestrator re-checks containment at link time,
|
|
743
|
+
// but failing here gives the operator immediate feedback in the dashboard.
|
|
744
|
+
for (const entry of symlinkPaths) {
|
|
745
|
+
if (entry.startsWith("/") || entry.split(/[\\/]/).includes("..")) {
|
|
746
|
+
throw new ValidationError(`symlinkPaths entry must be a relative path within the repo: ${entry}`);
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
return { symlinkPaths };
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
const LANDING_CONFIG_DEFAULTS: LandingConfig = {
|
|
753
|
+
strategy: "direct",
|
|
754
|
+
mechanism: "managed",
|
|
755
|
+
};
|
|
756
|
+
|
|
757
|
+
function validateLandingConfig(value: unknown): LandingConfig {
|
|
758
|
+
if (!isRecord(value)) throw new ValidationError("landing config value must be an object");
|
|
759
|
+
return {
|
|
760
|
+
strategy: value.strategy === undefined || value.strategy === null
|
|
761
|
+
? LANDING_CONFIG_DEFAULTS.strategy
|
|
762
|
+
: cleanEnum(value.strategy, "strategy", VALID_LANDING_STRATEGIES) as WorkspaceLandingPolicy,
|
|
763
|
+
mechanism: value.mechanism === undefined || value.mechanism === null
|
|
764
|
+
? LANDING_CONFIG_DEFAULTS.mechanism
|
|
765
|
+
: cleanEnum(value.mechanism, "mechanism", VALID_LANDING_MECHANISMS) as LandingConfig["mechanism"],
|
|
766
|
+
...(value.stackDepth === undefined || value.stackDepth === null ? {} : { stackDepth: cleanLandStackDepth(value.stackDepth) }),
|
|
767
|
+
};
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
function normalizeValue(namespace: string, key: string, value: unknown, warnings: string[]): unknown {
|
|
771
|
+
const retirement = memoryRetirementMessage(namespace) ?? ([AGENT_PROFILE_NAMESPACE, AGENT_PROFILE_OVERRIDE_NAMESPACE].includes(namespace) ? memoryRetirementMessage(key) : undefined);
|
|
772
|
+
if (retirement) throw new ValidationError(retirement);
|
|
773
|
+
if (value === undefined) throw new ValidationError("value required");
|
|
774
|
+
if (namespace === "gates" && key === "default") return cleanGateLimits(value);
|
|
775
|
+
if (namespace === "service-access") return validateServiceCatalog(value);
|
|
776
|
+
if (namespace === CHANNEL_OUTPUT_NAMESPACE) return validateChannelOutputControl(value);
|
|
777
|
+
if (namespace === SPAWN_POLICY_NAMESPACE) return validateSpawnPolicy(key, value);
|
|
778
|
+
if (namespace === AGENT_PROFILE_NAMESPACE) return validateAgentProfile(key, isRecord(value) ? reconcileHostCellInputs(value, value.base as AgentProfileBase) : value);
|
|
779
|
+
if (namespace === AGENT_PROFILE_OVERRIDE_NAMESPACE) return validateAgentProfileOverride(key, value);
|
|
780
|
+
if (namespace === STEWARD_NAMESPACE) return validateStewardConfig(value);
|
|
781
|
+
if (namespace === INSIGHTS_NAMESPACE) return validateInsightsConfig(value);
|
|
782
|
+
if (namespace === NOTIFICATIONS_NAMESPACE) {
|
|
783
|
+
if (!parseNotificationSettingsKey(key)) throw new ValidationError("notifications config key must be default, team:<teamId>, or agent:<agentId>");
|
|
784
|
+
return key === NOTIFICATIONS_DEFAULT_KEY ? validateNotificationsConfig(value) : validateNotificationSettingsLayer(value);
|
|
785
|
+
}
|
|
786
|
+
if (namespace === SELF_RESUME_NAMESPACE) return validateSelfResumeConfig(value);
|
|
787
|
+
if (namespace === WORKSPACE_NAMESPACE) return validateWorkspaceConfig(value);
|
|
788
|
+
if (namespace === LANDING_NAMESPACE) return validateLandingConfig(value);
|
|
789
|
+
if (namespace === RETENTION_NAMESPACE) return validateRetentionConfig(value);
|
|
790
|
+
if (namespace === TEAM_TEMPLATE_NAMESPACE) return validateTeamTemplate(key, value);
|
|
791
|
+
if (namespace === PROVIDER_ENABLEMENT_NAMESPACE) return validateProviderEnablement(key, value);
|
|
792
|
+
if (namespace === HOST_PROVIDER_ENABLEMENT_NAMESPACE) return validateHostProviderEnablement(key, value);
|
|
793
|
+
if (JSON.stringify(value) === undefined) throw new ValidationError("value must be valid JSON");
|
|
794
|
+
return value;
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
export function getConfig<T = unknown>(namespace: string, key: string): ConfigEntry<T> | null {
|
|
798
|
+
const row = getDb().query("SELECT * FROM config WHERE namespace = ? AND key = ?").get(namespace, key) as ConfigRow | undefined;
|
|
799
|
+
return row ? rowToConfigEntry<T>(row) : null;
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
export function listConfig<T = unknown>(namespace: string): ConfigEntry<T>[] {
|
|
803
|
+
const rows = getDb()
|
|
804
|
+
.query("SELECT * FROM config WHERE namespace = ? ORDER BY key ASC")
|
|
805
|
+
.all(namespace) as ConfigRow[];
|
|
806
|
+
return rows.map(rowToConfigEntry<T>);
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
/**
|
|
810
|
+
* The op body for a config write (S3 L-F #1898). The ENTIRE read-modify-write — validation, the
|
|
811
|
+
* `version = existing.version + 1` READ, the history row, the upsert, and the prune — runs as ONE unit
|
|
812
|
+
* so the version read and the write are atomic under the caller's transaction. This is landmine #2
|
|
813
|
+
* (ADR §3.4 invariant, mirrored from `src/config-store.ts:723`): relocating only the write across the
|
|
814
|
+
* async seam would let two concurrent setters both read version N and both write N+1 — a lost update.
|
|
815
|
+
* Folding the read in closes that window. `now` is the submission-time wall-clock (H6, epoch ms),
|
|
816
|
+
* formatted to the ISO string the `config` columns store. Assumes a transaction is ALREADY open (the
|
|
817
|
+
* writer executor's `BEGIN IMMEDIATE`, or the sync wrapper below) — it must NOT open its own.
|
|
818
|
+
*/
|
|
819
|
+
export function setConfigInternal<T = unknown>(namespace: string, key: string, value: T, updatedBy: string | undefined, now: number): ConfigEntry<T> {
|
|
820
|
+
const warnings: string[] = [];
|
|
821
|
+
const normalized = normalizeValue(namespace, key, value, warnings) as T;
|
|
822
|
+
writeProfilePromptSlots(namespace, key, value as Partial<AgentProfile>, updatedBy ?? "system", now);
|
|
823
|
+
const existing = getConfig(namespace, key);
|
|
824
|
+
const nowIso = new Date(now).toISOString();
|
|
825
|
+
const nextVersion = existing ? existing.version + 1 : 1;
|
|
826
|
+
if (existing) {
|
|
827
|
+
recordConfigHistory(existing, nowIso, updatedBy, normalized);
|
|
828
|
+
}
|
|
829
|
+
getDb().query(`
|
|
830
|
+
INSERT INTO config (namespace, key, value, version, updated_at, updated_by)
|
|
831
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
832
|
+
ON CONFLICT(namespace, key) DO UPDATE SET
|
|
833
|
+
value = excluded.value,
|
|
834
|
+
version = excluded.version,
|
|
835
|
+
updated_at = excluded.updated_at,
|
|
836
|
+
updated_by = excluded.updated_by
|
|
837
|
+
`).run(namespace, key, JSON.stringify(normalized), nextVersion, nowIso, updatedBy ?? null);
|
|
838
|
+
// #1963 N10 — ANY authoritative write to an override row (this route, the generic /api/config PUT,
|
|
839
|
+
// or setAgentProfile) supersedes the migration's rollback snapshot. Dropping it HERE — the single
|
|
840
|
+
// chokepoint every sync + async write funnels through — is what keeps the flag-off read (which
|
|
841
|
+
// prefers `-v1-backup`) from silently shadowing a fresh operator edit. The migration writes the
|
|
842
|
+
// override via raw SQL, not this path, so its own snapshot is preserved.
|
|
843
|
+
if (namespace === AGENT_PROFILE_OVERRIDE_NAMESPACE) {
|
|
844
|
+
getDb().query("DELETE FROM config WHERE namespace = ? AND key = ?").run(AGENT_PROFILE_OVERRIDE_V1_BACKUP_NAMESPACE, key);
|
|
845
|
+
}
|
|
846
|
+
if (namespace === SPAWN_POLICY_NAMESPACE && isRecord(existing?.value) && isRecord(normalized) &&
|
|
847
|
+
(existing.value.provider !== normalized.provider || existing.value.model !== normalized.model)) {
|
|
848
|
+
const state = getManagedAgentState(key);
|
|
849
|
+
if (state) updateManagedAgentState(key, { ...(state.status === "failed" || state.status === "backoff" ? { status: "stopped", spawnRequestId: undefined, agentId: undefined, tmuxSession: undefined, healthySince: undefined, provider: normalized.provider as SpawnProvider } : {}), consecutiveFailures: 0, backoffUntil: undefined, lastError: undefined });
|
|
850
|
+
}
|
|
851
|
+
if ([AGENT_PROFILE_NAMESPACE, AGENT_PROFILE_OVERRIDE_NAMESPACE, "service-access"].includes(namespace)) revokeRemovedVaultAccess(namespace, key, now, getConfig<ServiceAccessCatalog>("service-access", "catalog")?.value.broker, namespace === "service-access" ? undefined : getAgentProfile(key)?.value.serviceAccess);
|
|
852
|
+
pruneConfigHistory(namespace, key);
|
|
853
|
+
return { ...getConfig<T>(namespace, key)!, ...(warnings.length ? { warnings } : {}) };
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
/** Synchronous config write for in-process callers not yet migrated to `setConfigAsync` (bootstrap,
|
|
857
|
+
* service loops). Same folded read-modify-write as the op body, wrapped in its own transaction. */
|
|
858
|
+
export function setConfig<T = unknown>(namespace: string, key: string, value: T, updatedBy?: string): ConfigEntry<T> {
|
|
859
|
+
return writeTransaction(() => setConfigInternal(namespace, key, value, updatedBy, Date.now()));
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
/** Op body for a config delete (S3 L-F #1898): the existence read, history row, delete, and prune are
|
|
863
|
+
* one atomic unit for the same §3.4 reason as `setConfigInternal`. `now` is submission-time (H6). */
|
|
864
|
+
export function deleteConfigInternal(namespace: string, key: string, updatedBy: string | undefined, now: number): boolean {
|
|
865
|
+
const existing = getConfig(namespace, key);
|
|
866
|
+
if (!existing) return false;
|
|
867
|
+
resetProfilePromptSlots(namespace, key, updatedBy ?? "system", now);
|
|
868
|
+
recordConfigHistory(existing, new Date(now).toISOString(), updatedBy);
|
|
869
|
+
getDb().query("DELETE FROM config WHERE namespace = ? AND key = ?").run(namespace, key);
|
|
870
|
+
// #1963 N10 — deleting/resetting an override row also drops its rollback snapshot (see setConfigInternal).
|
|
871
|
+
if (namespace === AGENT_PROFILE_OVERRIDE_NAMESPACE) {
|
|
872
|
+
getDb().query("DELETE FROM config WHERE namespace = ? AND key = ?").run(AGENT_PROFILE_OVERRIDE_V1_BACKUP_NAMESPACE, key);
|
|
873
|
+
}
|
|
874
|
+
if (namespace === SPAWN_POLICY_NAMESPACE) deletePolicySelfEffortInternal(key); // #2966
|
|
875
|
+
if ([AGENT_PROFILE_NAMESPACE, AGENT_PROFILE_OVERRIDE_NAMESPACE, "service-access"].includes(namespace)) revokeRemovedVaultAccess(namespace, key, now, getConfig<ServiceAccessCatalog>("service-access", "catalog")?.value.broker, namespace === "service-access" ? undefined : getAgentProfile(key)?.value.serviceAccess);
|
|
876
|
+
pruneConfigHistory(namespace, key);
|
|
877
|
+
return true;
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
export function deleteConfig(namespace: string, key: string, updatedBy?: string): boolean {
|
|
881
|
+
return writeTransaction(() => deleteConfigInternal(namespace, key, updatedBy, Date.now()));
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
export function getConfigHistory<T = unknown>(namespace: string, key: string, limit = CONFIG_HISTORY_LIMIT): ConfigHistoryEntry<T>[] {
|
|
885
|
+
const safeLimit = Math.min(Math.max(limit, 1), 500);
|
|
886
|
+
const rows = getDb()
|
|
887
|
+
.query("SELECT * FROM config_history WHERE namespace = ? AND key = ? ORDER BY version DESC, id DESC LIMIT ?")
|
|
888
|
+
.all(namespace, key, safeLimit) as ConfigHistoryRow[];
|
|
889
|
+
return rows.map(rowToConfigHistoryEntry<T>);
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
function pruneConfigHistory(namespace: string, key: string): void {
|
|
893
|
+
getDb().query(`
|
|
894
|
+
DELETE FROM config_history
|
|
895
|
+
WHERE namespace = ? AND key = ?
|
|
896
|
+
AND version != COALESCE((SELECT json_extract(value, '$.migrationSourceRevision') FROM config WHERE namespace = ? AND key = ?), -1)
|
|
897
|
+
AND id NOT IN (
|
|
898
|
+
SELECT id FROM config_history
|
|
899
|
+
WHERE namespace = ? AND key = ?
|
|
900
|
+
ORDER BY version DESC, id DESC
|
|
901
|
+
LIMIT ?
|
|
902
|
+
)
|
|
903
|
+
`).run(namespace, key, namespace, key, namespace, key, CONFIG_HISTORY_LIMIT);
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
export function getSpawnPolicy(name: string): ConfigEntry<SpawnPolicy> | null {
|
|
907
|
+
return getConfig<SpawnPolicy>(SPAWN_POLICY_NAMESPACE, name);
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
export function listSpawnPolicies(): ConfigEntry<SpawnPolicy>[] {
|
|
911
|
+
return listConfig<SpawnPolicy>(SPAWN_POLICY_NAMESPACE);
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
function setSpawnPolicy(policy: SpawnPolicy, updatedBy?: string): ConfigEntry<SpawnPolicy> {
|
|
915
|
+
return setConfig(SPAWN_POLICY_NAMESPACE, policy.name, policy, updatedBy);
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
/** Global steward config, merged over defaults (always returns a usable value). */
|
|
919
|
+
export function getStewardConfig(): StewardConfig {
|
|
920
|
+
const entry = getConfig<StewardConfig>(STEWARD_NAMESPACE, STEWARD_KEY);
|
|
921
|
+
return entry ? { ...STEWARD_CONFIG_DEFAULTS, ...entry.value } : { ...STEWARD_CONFIG_DEFAULTS };
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
export function getStewardConfigEntry(): ConfigEntry<StewardConfig> {
|
|
925
|
+
const entry = getConfig<StewardConfig>(STEWARD_NAMESPACE, STEWARD_KEY);
|
|
926
|
+
return entry ?? {
|
|
927
|
+
namespace: STEWARD_NAMESPACE,
|
|
928
|
+
key: STEWARD_KEY,
|
|
929
|
+
value: { ...STEWARD_CONFIG_DEFAULTS },
|
|
930
|
+
version: 0,
|
|
931
|
+
updatedAt: "default",
|
|
932
|
+
updatedBy: "system",
|
|
933
|
+
};
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
export function setStewardConfig(value: unknown, updatedBy?: string): ConfigEntry<StewardConfig> {
|
|
937
|
+
return setConfig(STEWARD_NAMESPACE, STEWARD_KEY, value as StewardConfig, updatedBy);
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
/** Insights module config, merged over defaults (always returns a usable value). */
|
|
941
|
+
export function getInsightsConfig(): InsightsConfig {
|
|
942
|
+
const entry = getConfig<Partial<InsightsConfig>>(INSIGHTS_NAMESPACE, INSIGHTS_KEY);
|
|
943
|
+
if (!entry) return { ...INSIGHTS_CONFIG_DEFAULTS };
|
|
944
|
+
return validateInsightsConfig({ ...INSIGHTS_CONFIG_DEFAULTS, ...entry.value });
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
export function getInsightsConfigEntry(): ConfigEntry<InsightsConfig> {
|
|
948
|
+
const entry = getConfig<InsightsConfig>(INSIGHTS_NAMESPACE, INSIGHTS_KEY);
|
|
949
|
+
return entry ?? {
|
|
950
|
+
namespace: INSIGHTS_NAMESPACE,
|
|
951
|
+
key: INSIGHTS_KEY,
|
|
952
|
+
value: { ...INSIGHTS_CONFIG_DEFAULTS },
|
|
953
|
+
version: 0,
|
|
954
|
+
updatedAt: "default",
|
|
955
|
+
updatedBy: "system",
|
|
956
|
+
};
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
/** Lifecycle-notification config (#239), merged over defaults (always usable). */
|
|
960
|
+
export function getNotificationsConfig(): NotificationsConfig {
|
|
961
|
+
const entry = getConfig<Partial<NotificationsConfig>>(NOTIFICATIONS_NAMESPACE, NOTIFICATIONS_DEFAULT_KEY);
|
|
962
|
+
if (!entry) return { ...NOTIFICATIONS_CONFIG_DEFAULTS };
|
|
963
|
+
return validateNotificationsConfig({ ...NOTIFICATIONS_CONFIG_DEFAULTS, ...entry.value });
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
export function setInsightsConfig(value: unknown, updatedBy?: string): ConfigEntry<InsightsConfig> {
|
|
967
|
+
return setConfig(INSIGHTS_NAMESPACE, INSIGHTS_KEY, value as InsightsConfig, updatedBy);
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
/** Relay-owned self-resume defaults (#316), merged over defaults (always usable). */
|
|
971
|
+
export function getSelfResumeConfig(): SelfResumeConfig {
|
|
972
|
+
const entry = getConfig<Partial<SelfResumeConfig>>(SELF_RESUME_NAMESPACE, SELF_RESUME_KEY);
|
|
973
|
+
return validateSelfResumeConfig(entry?.value ?? {});
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
/** Global workspace config, merged over defaults (always returns a usable value). */
|
|
977
|
+
export function getWorkspaceConfig(): WorkspaceConfig {
|
|
978
|
+
const entry = getConfig<Partial<WorkspaceConfig>>(WORKSPACE_NAMESPACE, WORKSPACE_KEY);
|
|
979
|
+
if (!entry) return { ...WORKSPACE_CONFIG_DEFAULTS };
|
|
980
|
+
return validateWorkspaceConfig({ ...WORKSPACE_CONFIG_DEFAULTS, ...entry.value });
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
export function getWorkspaceConfigEntry(): ConfigEntry<WorkspaceConfig> {
|
|
984
|
+
const entry = getConfig<WorkspaceConfig>(WORKSPACE_NAMESPACE, WORKSPACE_KEY);
|
|
985
|
+
return entry ?? {
|
|
986
|
+
namespace: WORKSPACE_NAMESPACE,
|
|
987
|
+
key: WORKSPACE_KEY,
|
|
988
|
+
value: { ...WORKSPACE_CONFIG_DEFAULTS },
|
|
989
|
+
version: 0,
|
|
990
|
+
updatedAt: "default",
|
|
991
|
+
updatedBy: "system",
|
|
992
|
+
};
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
export function setWorkspaceConfig(value: unknown, updatedBy?: string): ConfigEntry<WorkspaceConfig> {
|
|
996
|
+
return setConfig(WORKSPACE_NAMESPACE, WORKSPACE_KEY, value as WorkspaceConfig, updatedBy);
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
/** Instance-wide landing config, merged over defaults (always returns a usable value). */
|
|
1000
|
+
export function getLandingConfig(): LandingConfig {
|
|
1001
|
+
const entry = getConfig<Partial<LandingConfig>>(LANDING_NAMESPACE, LANDING_KEY);
|
|
1002
|
+
if (!entry) return { ...LANDING_CONFIG_DEFAULTS };
|
|
1003
|
+
return validateLandingConfig({ ...LANDING_CONFIG_DEFAULTS, ...entry.value });
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
export function setLandingConfig(value: unknown, updatedBy?: string): ConfigEntry<LandingConfig> {
|
|
1007
|
+
return setConfig(LANDING_NAMESPACE, LANDING_KEY, value as LandingConfig, updatedBy);
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
/**
|
|
1011
|
+
* Spawn-param fragment carrying the global workspace symlink list to the orchestrator.
|
|
1012
|
+
* Spread into every spawn command's params next to `agentProfile` so any isolated
|
|
1013
|
+
* worktree — direct spawn, managed policy, restart, automation — provisions the same
|
|
1014
|
+
* untracked paths. Returns `{}` when nothing is configured (keeps params lean).
|
|
1015
|
+
*/
|
|
1016
|
+
export function workspaceSpawnParams(): { workspaceSymlinks?: string[] } {
|
|
1017
|
+
const { symlinkPaths } = getWorkspaceConfig();
|
|
1018
|
+
return symlinkPaths.length ? { workspaceSymlinks: symlinkPaths } : {};
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
function builtInProfileEntry(profile: AgentProfile): ConfigEntry<AgentProfile> {
|
|
1022
|
+
// #1963 N10 — flag-off rollback: while the matrix is not authoritative, an override row the v2
|
|
1023
|
+
// migration rewrote is served from its pristine `-v1-backup` snapshot, so the read is byte-exact to
|
|
1024
|
+
// pre-migration. The backup exists ONLY for migrated-and-not-since-reauthored rows (a PUT/reset
|
|
1025
|
+
// deletes it), so an operator edit made while the flag is off is still honored.
|
|
1026
|
+
// ONE SANCTIONED EXCEPTION to that byte-exactness (#2154): the project-memory group backfill
|
|
1027
|
+
// (db/project-memory-group-migration.ts) appends `project-memory` to the backup's tool groups too —
|
|
1028
|
+
// it has to, because this namespace is the one SERVED here, so skipping it would leave the
|
|
1029
|
+
// longest-standing profile-editor users with no memory write path at all.
|
|
1030
|
+
const override = (!profileMatrixEnabled() && getConfig<Partial<AgentProfile>>(AGENT_PROFILE_OVERRIDE_V1_BACKUP_NAMESPACE, profile.name)) || getConfig<Partial<AgentProfile>>(AGENT_PROFILE_OVERRIDE_NAMESPACE, profile.name);
|
|
1031
|
+
if (override) {
|
|
1032
|
+
const merged = validateAgentProfile(profile.name, mergeProfileOverride(profile, override.value), { allowBuiltIn: true });
|
|
1033
|
+
return {
|
|
1034
|
+
namespace: AGENT_PROFILE_NAMESPACE,
|
|
1035
|
+
key: profile.name,
|
|
1036
|
+
value: applyProfilePromptSlots({ ...merged, builtIn: true, overridden: true }),
|
|
1037
|
+
version: override.version,
|
|
1038
|
+
updatedAt: override.updatedAt,
|
|
1039
|
+
updatedBy: override.updatedBy,
|
|
1040
|
+
};
|
|
1041
|
+
}
|
|
1042
|
+
return {
|
|
1043
|
+
namespace: AGENT_PROFILE_NAMESPACE,
|
|
1044
|
+
key: profile.name,
|
|
1045
|
+
value: applyProfilePromptSlots({ ...profile, overridden: false }),
|
|
1046
|
+
version: 1,
|
|
1047
|
+
updatedAt: "built-in",
|
|
1048
|
+
updatedBy: "system",
|
|
1049
|
+
};
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
// #2791 — profile names are case-insensitive for identity, case-preserving for display.
|
|
1053
|
+
// Every lookup (spawn, dispatch, routes, dashboard, CLI) funnels through getAgentProfile, so this
|
|
1054
|
+
// resolver is the ONE seam: exact match first (built-in, then stored row), then a case-insensitive
|
|
1055
|
+
// scan (built-ins first, mirroring getAgentProfile's precedence). Returns the STORED key.
|
|
1056
|
+
export function resolveAgentProfileKey(name: string): string | undefined {
|
|
1057
|
+
const retirement = memoryRetirementMessage(name);
|
|
1058
|
+
if (retirement) return undefined;
|
|
1059
|
+
if (BUILT_IN_AGENT_PROFILE_NAMES.has(name)) return name;
|
|
1060
|
+
if (getConfig<AgentProfile>(AGENT_PROFILE_NAMESPACE, name)) return name;
|
|
1061
|
+
const alias = canonicalAgentProfileName(name);
|
|
1062
|
+
if (alias !== name) return alias;
|
|
1063
|
+
const lower = name.toLowerCase();
|
|
1064
|
+
return [...BUILT_IN_AGENT_PROFILE_NAMES].find((builtIn) => builtIn.toLowerCase() === lower)
|
|
1065
|
+
?? listConfig<AgentProfile>(AGENT_PROFILE_NAMESPACE).find((entry) => entry.key.toLowerCase() === lower)?.key;
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
export function getAgentProfile(name: string): ConfigEntry<AgentProfile> | null {
|
|
1069
|
+
const canonical = resolveAgentProfileKey(name);
|
|
1070
|
+
if (canonical === undefined) return null;
|
|
1071
|
+
const builtIn = builtInAgentProfile(canonical);
|
|
1072
|
+
if (builtIn) return builtInProfileEntry(builtIn);
|
|
1073
|
+
return applyProfilePromptEntry(getConfig<AgentProfile>(AGENT_PROFILE_NAMESPACE, canonical));
|
|
1074
|
+
}
|
|
1075
|
+
|
|
1076
|
+
/** Whether the authoritative Project Instructions cell includes project memory in injection.
|
|
1077
|
+
* Profile-less identities preserve the pre-profile open default; an unknown named profile still
|
|
1078
|
+
* fails closed because its selected switch cannot be resolved. */
|
|
1079
|
+
export function projectMemoryEnabledForProfile(
|
|
1080
|
+
profileName: string | undefined,
|
|
1081
|
+
resolvedProfile?: Pick<AgentProfile, "name" | "instructions" | "sources">,
|
|
1082
|
+
): boolean {
|
|
1083
|
+
if (!profileName) return true;
|
|
1084
|
+
const profile = resolvedProfile?.name === profileName ? resolvedProfile : getAgentProfile(profileName)?.value;
|
|
1085
|
+
return profile ? projectInstructionsOn(profile) : false;
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
/** Profile policy only. Runtime token derivation clamps launch authority and lineage. */
|
|
1089
|
+
export function spawnGrantForProfile(
|
|
1090
|
+
profileName: string | undefined,
|
|
1091
|
+
): { canSpawn: boolean; maxSpawnedAgents: number } {
|
|
1092
|
+
const n = profileName ? (getAgentProfile(profileName)?.value.maxSpawnedAgents ?? 0) : 0;
|
|
1093
|
+
return { canSpawn: n > 0, maxSpawnedAgents: n };
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
/** Whether a profile keeps its runner token bound to the launch host (#1018 opt-out). */
|
|
1097
|
+
export function hostPinForProfile(profileName: string | undefined): boolean {
|
|
1098
|
+
if (legacyProfileAliasPinsHost(profileName)) return true;
|
|
1099
|
+
return profileName ? getAgentProfile(profileName)?.value.hostPinned === true : false;
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1102
|
+
/**
|
|
1103
|
+
* Relay tool groups enabled for a profile (#551). Absent profile OR an absent `groups` key → undefined
|
|
1104
|
+
* (FULL surface). An explicit `groups: []` enables no optional groups; the shared resolver
|
|
1105
|
+
* retains core/self-care and explicit includes (#3261). Because that flips the meaning of any row that
|
|
1106
|
+
* historically persisted `[]`, the one-shot `rewriteEmptyToolGroupsToAbsent` migration rewrites every
|
|
1107
|
+
* pre-existing `[]` row to absent (preserving its old "all" behaviour) BEFORE this runs, so only a
|
|
1108
|
+
* row saved AFTER N2 lands can mean NONE. See src/db/tool-groups-empty-migration.ts.
|
|
1109
|
+
*/
|
|
1110
|
+
export function toolGroupsForProfile(profileName: string | undefined): string[] | undefined {
|
|
1111
|
+
if (!profileName) return undefined;
|
|
1112
|
+
return getAgentProfile(profileName)?.value.relay.tools?.groups;
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
export function listAgentProfiles(): ConfigEntry<AgentProfile>[] {
|
|
1116
|
+
const custom = listConfig<AgentProfile>(AGENT_PROFILE_NAMESPACE).filter((entry) => !memoryRetirementMessage(entry.key));
|
|
1117
|
+
return [
|
|
1118
|
+
...builtInAgentProfiles().map(builtInProfileEntry),
|
|
1119
|
+
...custom.map(entry => ({ ...entry, value: applyProfilePromptSlots(entry.value) })),
|
|
1120
|
+
].sort((a, b) => Number(Boolean(b.value.builtIn)) - Number(Boolean(a.value.builtIn)) || a.key.localeCompare(b.key));
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
export function setAgentProfile(profile: AgentProfile, updatedBy?: string, opts: { overrideBuiltIn?: boolean } = {}): ConfigEntry<AgentProfile> {
|
|
1124
|
+
if (BUILT_IN_AGENT_PROFILE_NAMES.has(profile.name) && opts.overrideBuiltIn) {
|
|
1125
|
+
// The rollback snapshot is dropped by setConfigInternal on this override write (#1963 N10).
|
|
1126
|
+
setConfig(AGENT_PROFILE_OVERRIDE_NAMESPACE, profile.name, profile, updatedBy);
|
|
1127
|
+
return getAgentProfile(profile.name)!;
|
|
1128
|
+
}
|
|
1129
|
+
return applyProfilePromptEntry(setConfig(AGENT_PROFILE_NAMESPACE, profile.name, profile, updatedBy))!;
|
|
1130
|
+
}
|
|
1131
|
+
|
|
1132
|
+
export function deleteAgentProfile(name: string, updatedBy?: string, opts: { resetBuiltInOverride?: boolean } = {}): boolean {
|
|
1133
|
+
// #2791 — delete resolves case-insensitively to the stored key, so DELETE /qa drops "QA".
|
|
1134
|
+
const canonical = resolveAgentProfileKey(name) ?? name;
|
|
1135
|
+
if (BUILT_IN_AGENT_PROFILE_NAMES.has(canonical)) {
|
|
1136
|
+
// The rollback snapshot is dropped by deleteConfigInternal on this override delete (#1963 N10).
|
|
1137
|
+
if (opts.resetBuiltInOverride) return deleteConfig(AGENT_PROFILE_OVERRIDE_NAMESPACE, canonical, updatedBy);
|
|
1138
|
+
throw new ValidationError("built-in agent profiles are managed by Relay");
|
|
1139
|
+
}
|
|
1140
|
+
return deleteConfig(AGENT_PROFILE_NAMESPACE, canonical, updatedBy);
|
|
1141
|
+
}
|
|
1142
|
+
|
|
1143
|
+
export function getManagedAgentState(policyName: string): ManagedAgentState | null {
|
|
1144
|
+
const row = getDb().query("SELECT * FROM managed_agent_state WHERE policy_name = ?").get(policyName) as ManagedAgentStateRow | undefined;
|
|
1145
|
+
return row ? rowToManagedAgentState(row) : null;
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
/**
|
|
1149
|
+
* The steward-provenance agent binding for `policyName` — the last relay-written `agent_id`, RETAINED
|
|
1150
|
+
* across the steward's OWN stop (#1623). `agent_id` is nulled on backoff/stop/fail (it is the live-agent
|
|
1151
|
+
* pointer other consumers read as "running"), so a restart of a stopped genuine steward must not lose
|
|
1152
|
+
* its provenance; `last_agent_id` preserves it. Prefer the live `agent_id`, fall back to the retained
|
|
1153
|
+
* `last_agent_id`. Used by `isProvenStewardAgent` (steward-spawn-guard.ts).
|
|
1154
|
+
*
|
|
1155
|
+
* Unforgeability is CONDITIONAL, not inherent (#1797). Both columns are relay-written, but "written
|
|
1156
|
+
* by the relay" says nothing about where the relay got the value. Two rounds of #1797 each found a
|
|
1157
|
+
* caller-controlled input reaching this pointer, so state the guard explicitly rather than the
|
|
1158
|
+
* conclusion. `markManagedAgentRunning` is the writer that matters, and it is reachable two ways:
|
|
1159
|
+
* 1. agent REGISTRATION — took its (policyName, spawnRequestId) from caller-sent `agent.meta`.
|
|
1160
|
+
* Now gated: a scoped caller must carry that pair in its SIGNED constraints, and registration
|
|
1161
|
+
* additionally strips authz-relevant meta the caller isn't signed for.
|
|
1162
|
+
* 2. the ORCHESTRATOR-REPORT projection (`PATCH /api/orchestrators/:id/agents` →
|
|
1163
|
+
* `onOrchestratorManagedAgentsReported`) — a `system` context built from a request body, so
|
|
1164
|
+
* gate (1) does not apply to it. Round 2 (F1) found it reachable by any `command:write` holder.
|
|
1165
|
+
* Now gated on the caller holding the orchestrator-host credential for that id.
|
|
1166
|
+
* So: this pointer is as trustworthy as those two gates, and NO stronger. A new writer, or a new
|
|
1167
|
+
* route that mints a `system`/privileged context from caller input, must establish an equivalent
|
|
1168
|
+
* claim — otherwise `isProvenStewardAgent` silently stops being provenance.
|
|
1169
|
+
*/
|
|
1170
|
+
export function managedStewardBoundAgentId(policyName: string): string | undefined {
|
|
1171
|
+
const row = getDb().query("SELECT agent_id, last_agent_id FROM managed_agent_state WHERE policy_name = ?").get(policyName) as { agent_id: string | null; last_agent_id: string | null } | undefined;
|
|
1172
|
+
return row?.agent_id ?? row?.last_agent_id ?? undefined;
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
function listManagedAgentStates(): ManagedAgentState[] {
|
|
1176
|
+
const rows = getDb()
|
|
1177
|
+
.query("SELECT * FROM managed_agent_state ORDER BY policy_name ASC")
|
|
1178
|
+
.all() as ManagedAgentStateRow[];
|
|
1179
|
+
return rows.map(rowToManagedAgentState);
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
export function upsertManagedAgentState(input: ManagedAgentStateInput): ManagedAgentState {
|
|
1183
|
+
if (!VALID_MANAGED_STATUSES.includes(input.status)) throw new ValidationError("status must be a managed-agent status");
|
|
1184
|
+
if (!isSpawnProvider(input.provider)) throw new ValidationError(`provider must be one of: ${SPAWN_PROVIDERS.join(", ")}`);
|
|
1185
|
+
const now = input.updatedAt ?? Date.now();
|
|
1186
|
+
getDb().query(`
|
|
1187
|
+
INSERT INTO managed_agent_state (
|
|
1188
|
+
policy_name, status, agent_id, last_agent_id, orchestrator_id, provider, tmux_session, spawn_request_id, workspace_id, workspace_path, workspace_branch,
|
|
1189
|
+
last_spawn_at, last_stop_at, healthy_since, restart_count, consecutive_failures,
|
|
1190
|
+
backoff_until, last_error, updated_at
|
|
1191
|
+
)
|
|
1192
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
1193
|
+
ON CONFLICT(policy_name) DO UPDATE SET
|
|
1194
|
+
status = excluded.status,
|
|
1195
|
+
agent_id = excluded.agent_id,
|
|
1196
|
+
-- #1623 — RETAIN the last relay-written agent_id when the new agent_id is NULL (stop/backoff/
|
|
1197
|
+
-- fail), so the steward-provenance binding survives the steward's own stop.
|
|
1198
|
+
last_agent_id = COALESCE(excluded.agent_id, managed_agent_state.last_agent_id),
|
|
1199
|
+
orchestrator_id = excluded.orchestrator_id,
|
|
1200
|
+
provider = excluded.provider,
|
|
1201
|
+
tmux_session = excluded.tmux_session,
|
|
1202
|
+
spawn_request_id = excluded.spawn_request_id,
|
|
1203
|
+
workspace_id = excluded.workspace_id,
|
|
1204
|
+
workspace_path = excluded.workspace_path,
|
|
1205
|
+
workspace_branch = excluded.workspace_branch,
|
|
1206
|
+
last_spawn_at = excluded.last_spawn_at,
|
|
1207
|
+
last_stop_at = excluded.last_stop_at,
|
|
1208
|
+
healthy_since = excluded.healthy_since,
|
|
1209
|
+
restart_count = excluded.restart_count,
|
|
1210
|
+
consecutive_failures = excluded.consecutive_failures,
|
|
1211
|
+
backoff_until = excluded.backoff_until,
|
|
1212
|
+
last_error = excluded.last_error,
|
|
1213
|
+
updated_at = excluded.updated_at
|
|
1214
|
+
`).run(
|
|
1215
|
+
input.policyName,
|
|
1216
|
+
input.status,
|
|
1217
|
+
input.agentId ?? null,
|
|
1218
|
+
// last_agent_id seed on first INSERT; the ON CONFLICT clause COALESCEs to retain it on later stops.
|
|
1219
|
+
input.agentId ?? null,
|
|
1220
|
+
input.orchestratorId,
|
|
1221
|
+
input.provider,
|
|
1222
|
+
input.tmuxSession ?? null,
|
|
1223
|
+
input.spawnRequestId ?? null,
|
|
1224
|
+
input.workspaceId ?? null,
|
|
1225
|
+
input.workspacePath ?? null,
|
|
1226
|
+
input.workspaceBranch ?? null,
|
|
1227
|
+
input.lastSpawnAt ?? null,
|
|
1228
|
+
input.lastStopAt ?? null,
|
|
1229
|
+
input.healthySince ?? null,
|
|
1230
|
+
input.restartCount ?? 0,
|
|
1231
|
+
input.consecutiveFailures ?? 0,
|
|
1232
|
+
input.backoffUntil ?? null,
|
|
1233
|
+
input.lastError ?? null,
|
|
1234
|
+
now,
|
|
1235
|
+
);
|
|
1236
|
+
return getManagedAgentState(input.policyName)!;
|
|
1237
|
+
}
|
|
1238
|
+
|
|
1239
|
+
export function updateManagedAgentState(policyName: string, patch: ManagedAgentStatePatch): ManagedAgentState | null {
|
|
1240
|
+
const existing = getManagedAgentState(policyName);
|
|
1241
|
+
if (!existing) return null;
|
|
1242
|
+
return upsertManagedAgentState({
|
|
1243
|
+
...existing,
|
|
1244
|
+
...patch,
|
|
1245
|
+
policyName,
|
|
1246
|
+
updatedAt: patch.updatedAt ?? Date.now(),
|
|
1247
|
+
});
|
|
1248
|
+
}
|
|
1249
|
+
|
|
1250
|
+
function deleteManagedAgentState(policyName: string): boolean {
|
|
1251
|
+
const result = getDb().query("DELETE FROM managed_agent_state WHERE policy_name = ?").run(policyName);
|
|
1252
|
+
return result.changes > 0;
|
|
1253
|
+
}
|