@humwick/server 0.0.0-stage → 0.130.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLA.md +66 -0
- package/CONTRIBUTING.md +144 -0
- package/LICENSE +167 -0
- package/README.md +511 -2
- package/SECURITY.md +67 -0
- package/THIRD_PARTY_NOTICES.md +144 -0
- package/bundled/prompts/README.md +10 -0
- package/bundled/prompts/context.advisory.compact.md +1 -0
- package/bundled/prompts/context.advisory.warn.md +1 -0
- package/bundled/prompts/continuation.envelope.md +18 -0
- package/bundled/prompts/manifest.json +838 -0
- package/bundled/prompts/memory.capture.boundary.post.md +1 -0
- package/bundled/prompts/memory.capture.boundary.pre.md +1 -0
- package/bundled/prompts/memory.charter.md +3 -0
- package/bundled/prompts/memory.native-off.md +0 -0
- package/bundled/prompts/notify.agent.exited.md +1 -0
- package/bundled/prompts/notify.agent.never-ready.md +1 -0
- package/bundled/prompts/notify.agent.ready.md +1 -0
- package/bundled/prompts/notify.automation.budget-warning.md +1 -0
- package/bundled/prompts/notify.land.failure.md +1 -0
- package/bundled/prompts/notify.land.steward-taken.coordinator.md +1 -0
- package/bundled/prompts/notify.land.steward-taken.md +1 -0
- package/bundled/prompts/notify.land.success.md +1 -0
- package/bundled/prompts/notify.routing.policy-changed.md +2 -0
- package/bundled/prompts/notify.spawn.failed.md +1 -0
- package/bundled/prompts/notify.spawn.queued.md +1 -0
- package/bundled/prompts/notify.spawn.recovered.md +1 -0
- package/bundled/prompts/notify.spawn.unconfirmed.md +1 -0
- package/bundled/prompts/profile.coordinator.charter.md +17 -0
- package/bundled/prompts/profile.debugger.system.md +12 -0
- package/bundled/prompts/profile.device-qa.system.md +10 -0
- package/bundled/prompts/profile.image-gen.append.0.md +2 -0
- package/bundled/prompts/profile.image-gen.system.md +4 -0
- package/bundled/prompts/profile.ops-assistant.brief.md +4 -0
- package/bundled/prompts/profile.probe.system.md +5 -0
- package/bundled/prompts/profile.qa.system.md +10 -0
- package/bundled/prompts/profile.sec-ops.system.md +14 -0
- package/bundled/prompts/profile.social-media.system.md +7 -0
- package/bundled/prompts/profile.software-design.system.md +26 -0
- package/bundled/prompts/profile.sub-coordinator.charter.md +2 -0
- package/bundled/prompts/profile.worker-gui.system.md +7 -0
- package/bundled/prompts/profile.worker.system.md +2 -0
- package/bundled/prompts/relay.agent-core.delivery.md +13 -0
- package/bundled/prompts/relay.agent-core.engineering.md +13 -0
- package/bundled/prompts/relay.agent-core.md +22 -0
- package/bundled/prompts/relay.context.claude.md +1 -0
- package/bundled/prompts/relay.context.claude.readonly.md +3 -0
- package/bundled/prompts/relay.context.codex.md +1 -0
- package/bundled/prompts/relay.context.opencode.md +1 -0
- package/bundled/prompts/relay.manual.claude.md +8 -0
- package/bundled/prompts/relay.search.fff.md +1 -0
- package/bundled/prompts/relay.temp-dir.md +1 -0
- package/bundled/prompts/relay.web.brave.md +1 -0
- package/bundled/prompts/relay.web.fetch.md +1 -0
- package/bundled/prompts/skill.device-lane.md +20 -0
- package/bundled/prompts/skill.security-code-review.md +10 -0
- package/bundled/prompts/skill.security-hardening.md +10 -0
- package/bundled/prompts/skill.security-host-audit.md +11 -0
- package/bundled/prompts/spawn.primer.md +6 -0
- package/bundled/prompts/spawn.reportup.child.md +3 -0
- package/bundled/prompts/spawn.reportup.coordinator.md +2 -0
- package/bundled/prompts/spawn.reportup.workflow-step.md +4 -0
- package/bundled/prompts/spawn.validation.delivery.md +1 -0
- package/bundled/prompts/spawn.validation.iterate.generic.md +1 -0
- package/bundled/prompts/spawn.validation.iterate.imperative.md +1 -0
- package/bundled/prompts/spawn.validation.landgates.header.md +1 -0
- package/bundled/prompts/steward.merge-stall.md +1 -0
- package/bundled/prompts/steward.prompt.md +20 -0
- package/bundled/prompts/steward.wake.md +1 -0
- package/bundled/prompts/task.claim.instruction.md +1 -0
- package/bundled/prompts/task.hydration.md +23 -0
- package/bundled/prompts/user.response.brief.md +1 -0
- package/bundled/prompts/user.response.normal.md +1 -0
- package/bundled/prompts/user.style.neutral.md +1 -0
- package/bundled/prompts/user.style.warm.md +1 -0
- package/bundled/prompts/workspace.deps.command.md +1 -0
- package/bundled/prompts/workspace.deps.none.md +1 -0
- package/bundled/prompts/workspace.deps.symlink.md +1 -0
- package/bundled/prompts/workspace.lifecycle.md +4 -0
- package/bundled/prompts/workspace.mcp.instructions.md +7 -0
- package/bundled/prompts/workspace.phase.abandoned.headline.md +1 -0
- package/bundled/prompts/workspace.phase.abandoned.hint.md +1 -0
- package/bundled/prompts/workspace.phase.active.headline.md +1 -0
- package/bundled/prompts/workspace.phase.active.hint.md +1 -0
- package/bundled/prompts/workspace.phase.conflict.headline.md +1 -0
- package/bundled/prompts/workspace.phase.conflict.hint.md +1 -0
- package/bundled/prompts/workspace.phase.merge-planned.headline.md +1 -0
- package/bundled/prompts/workspace.phase.merge-planned.hint.md +1 -0
- package/bundled/prompts/workspace.phase.merged.headline.md +1 -0
- package/bundled/prompts/workspace.phase.merged.hint.md +1 -0
- package/bundled/prompts/workspace.phase.ready.headline.md +1 -0
- package/bundled/prompts/workspace.phase.ready.hint.md +1 -0
- package/bundled/prompts/workspace.ready.contract.md +6 -0
- package/bundled/prompts/workspace.symlinks.md +1 -0
- package/bundled/roles/builder.md +18 -0
- package/bundled/roles/design-reviewer.md +13 -0
- package/bundled/roles/designer.md +11 -0
- package/bundled/roles/plan-auditor.md +29 -0
- package/bundled/roles/reviewer.md +36 -0
- package/bundled/roles/slice-qa.md +13 -0
- package/bundled/roles/verifier.md +13 -0
- package/bundled/skills/agent-browser/SKILL.md +72 -0
- package/bundled/skills/test-audit/SKILL.md +75 -0
- package/bundled/workflows/build-review.yaml +8 -0
- package/bundled/workflows/design-review.yaml +60 -0
- package/bundled/workflows/plan-conformance.yaml +5 -0
- package/bundled/workflows/slice-proof.yaml +85 -0
- package/bundled/workflows/verify-deployed.yaml +140 -0
- package/docs/guides/sub-coordinators.md +114 -0
- package/docs/guides/tools-administration.md +84 -0
- package/docs/guides/tools-agents.md +137 -0
- package/docs/guides/tools-coordination.md +228 -0
- package/docs/guides/tools-execution.md +48 -0
- package/docs/guides/tools-issues.md +69 -0
- package/docs/guides/tools-memory.md +150 -0
- package/docs/guides/tools-messages.md +192 -0
- package/docs/guides/tools-operations.md +133 -0
- package/docs/guides/tools-tasks.md +235 -0
- package/docs/guides/workflows.md +324 -0
- package/docs/license-faq.md +37 -0
- package/docs/openapi.json +18531 -0
- package/examples/integrations/github-issue.ts +48 -0
- package/examples/integrations/ops-alert.sh +27 -0
- package/examples/integrations/prometheus-alertmanager.ts +55 -0
- package/examples/integrations/support-ticket.sh +28 -0
- package/node_modules/@humwick/kernel/LICENSE +167 -0
- package/node_modules/@humwick/kernel/async-entity-persistence.ts +344 -0
- package/node_modules/@humwick/kernel/async-event-log.ts +107 -0
- package/node_modules/@humwick/kernel/automations.pilot.ts +147 -0
- package/node_modules/@humwick/kernel/config.ts +111 -0
- package/node_modules/@humwick/kernel/contract.ts +572 -0
- package/node_modules/@humwick/kernel/control-authz.ts +281 -0
- package/node_modules/@humwick/kernel/control.ts +645 -0
- package/node_modules/@humwick/kernel/effects.ts +493 -0
- package/node_modules/@humwick/kernel/event-log.ts +319 -0
- package/node_modules/@humwick/kernel/http-transport.ts +384 -0
- package/node_modules/@humwick/kernel/identity-grammar.ts +20 -0
- package/node_modules/@humwick/kernel/identity.ts +248 -0
- package/node_modules/@humwick/kernel/index.ts +28 -0
- package/node_modules/@humwick/kernel/kernel-persistence.ts +181 -0
- package/node_modules/@humwick/kernel/landing-incident.ts +306 -0
- package/node_modules/@humwick/kernel/landing.ts +953 -0
- package/node_modules/@humwick/kernel/manifest-validation.ts +460 -0
- package/node_modules/@humwick/kernel/mcp-transport.ts +109 -0
- package/node_modules/@humwick/kernel/message-authority-chaos-worker.ts +200 -0
- package/node_modules/@humwick/kernel/message-authority.ts +281 -0
- package/node_modules/@humwick/kernel/module-host.ts +722 -0
- package/node_modules/@humwick/kernel/openapi-init.ts +14 -0
- package/node_modules/@humwick/kernel/package.json +39 -0
- package/node_modules/@humwick/kernel/persistence-schema.ts +248 -0
- package/node_modules/@humwick/kernel/persistence.ts +510 -0
- package/node_modules/@humwick/kernel/registry.ts +60 -0
- package/node_modules/@humwick/kernel/sqlite-kernel-persistence.ts +499 -0
- package/node_modules/@humwick/kernel/sqlite-module-host.ts +87 -0
- package/node_modules/@humwick/kernel/timers-chaos-worker.ts +186 -0
- package/node_modules/@humwick/kernel/timers.pilot.ts +1411 -0
- package/node_modules/@humwick/kernel/workflow-activation.ts +25 -0
- package/node_modules/@humwick/kernel/workflow-backstop.ts +40 -0
- package/node_modules/@humwick/kernel/workflow-cancel-tree.ts +20 -0
- package/node_modules/@humwick/kernel/workflow-chaos-worker.ts +213 -0
- package/node_modules/@humwick/kernel/workflow-composition.ts +231 -0
- package/node_modules/@humwick/kernel/workflow-container.ts +72 -0
- package/node_modules/@humwick/kernel/workflow-control.test-fixture.ts +42 -0
- package/node_modules/@humwick/kernel/workflow-control.ts +178 -0
- package/node_modules/@humwick/kernel/workflow-definition.ts +507 -0
- package/node_modules/@humwick/kernel/workflow-dispatch.ts +60 -0
- package/node_modules/@humwick/kernel/workflow-foreach.ts +167 -0
- package/node_modules/@humwick/kernel/workflow-journal-codec.ts +339 -0
- package/node_modules/@humwick/kernel/workflow-journal.ts +922 -0
- package/node_modules/@humwick/kernel/workflow-lane.ts +48 -0
- package/node_modules/@humwick/kernel/workflow-lease-owner.ts +60 -0
- package/node_modules/@humwick/kernel/workflow-recovery.test-fixture.ts +19 -0
- package/node_modules/@humwick/kernel/workflow-runtime.ts +938 -0
- package/node_modules/@humwick/kernel/workflow-script.ts +11 -0
- package/node_modules/@humwick/kernel/workflow-state.ts +299 -0
- package/node_modules/@humwick/kernel/workflow-step-commit.ts +195 -0
- package/node_modules/@humwick/kernel/workflow-transitions.ts +317 -0
- package/node_modules/@humwick/kernel/workflow-values.ts +153 -0
- package/node_modules/@humwick/kernel/workflow.pilot.ts +376 -0
- package/node_modules/@humwick/offload/LICENSE +167 -0
- package/node_modules/@humwick/offload/README.md +57 -0
- package/node_modules/@humwick/offload/dist/async-runner.d.ts +18 -0
- package/node_modules/@humwick/offload/dist/async-runner.d.ts.map +1 -0
- package/node_modules/@humwick/offload/dist/async-runner.js +158 -0
- package/node_modules/@humwick/offload/dist/async-runner.js.map +1 -0
- package/node_modules/@humwick/offload/dist/envelope.d.ts +25 -0
- package/node_modules/@humwick/offload/dist/envelope.d.ts.map +1 -0
- package/node_modules/@humwick/offload/dist/envelope.js +80 -0
- package/node_modules/@humwick/offload/dist/envelope.js.map +1 -0
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts +10 -0
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts.map +1 -0
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.js +59 -0
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.js.map +1 -0
- package/node_modules/@humwick/offload/dist/index.d.ts +5 -0
- package/node_modules/@humwick/offload/dist/index.d.ts.map +1 -0
- package/node_modules/@humwick/offload/dist/index.js +5 -0
- package/node_modules/@humwick/offload/dist/index.js.map +1 -0
- package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts +62 -0
- package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts.map +1 -0
- package/node_modules/@humwick/offload/dist/subprocess-runner.js +295 -0
- package/node_modules/@humwick/offload/dist/subprocess-runner.js.map +1 -0
- package/node_modules/@humwick/offload/dist/types.d.ts +111 -0
- package/node_modules/@humwick/offload/dist/types.d.ts.map +1 -0
- package/node_modules/@humwick/offload/dist/types.js +176 -0
- package/node_modules/@humwick/offload/dist/types.js.map +1 -0
- package/node_modules/@humwick/offload/dist/worker-pool.d.ts +23 -0
- package/node_modules/@humwick/offload/dist/worker-pool.d.ts.map +1 -0
- package/node_modules/@humwick/offload/dist/worker-pool.js +435 -0
- package/node_modules/@humwick/offload/dist/worker-pool.js.map +1 -0
- package/node_modules/@humwick/offload/dist/worker-runtime.d.ts +2 -0
- package/node_modules/@humwick/offload/dist/worker-runtime.d.ts.map +1 -0
- package/node_modules/@humwick/offload/dist/worker-runtime.js +27 -0
- package/node_modules/@humwick/offload/dist/worker-runtime.js.map +1 -0
- package/node_modules/@humwick/offload/dist/worker.d.ts +5 -0
- package/node_modules/@humwick/offload/dist/worker.d.ts.map +1 -0
- package/node_modules/@humwick/offload/dist/worker.js +1 -0
- package/node_modules/@humwick/offload/dist/worker.js.map +1 -0
- package/node_modules/@humwick/offload/package.json +42 -0
- package/node_modules/@humwick/offload/src/async-runner.ts +170 -0
- package/node_modules/@humwick/offload/src/envelope.ts +92 -0
- package/node_modules/@humwick/offload/src/fixtures/worker-task.ts +49 -0
- package/node_modules/@humwick/offload/src/index.ts +4 -0
- package/node_modules/@humwick/offload/src/subprocess-runner.ts +334 -0
- package/node_modules/@humwick/offload/src/types.ts +235 -0
- package/node_modules/@humwick/offload/src/worker-pool.ts +463 -0
- package/node_modules/@humwick/offload/src/worker-runtime.ts +32 -0
- package/node_modules/@humwick/offload/src/worker.ts +5 -0
- package/package.json +229 -4
- package/public/assets/MessageBubble-BWpoBjl4.js +4 -0
- package/public/assets/PlanGraphPanel-C0auck3n.js +2 -0
- package/public/assets/TraceView-DBnOx7AQ.js +5 -0
- package/public/assets/VaultDecisionCard-0kp2oNBC.js +2 -0
- package/public/assets/activity-TMzFOdh2.js +2 -0
- package/public/assets/activity-yLztXEBt.js +2 -0
- package/public/assets/agent-lineage-BbJDR1dW.js +2 -0
- package/public/assets/agent-liveness-DyqxfB-t.js +2 -0
- package/public/assets/agent-name-CTZBrSD9.js +2 -0
- package/public/assets/agent-profiles-BpI_jTxq.js +2 -0
- package/public/assets/agent-project-badge-9TqzUUYE.js +2 -0
- package/public/assets/agent-tools-D4n40pn8.js +2 -0
- package/public/assets/agent-type-icon-D6FUarOf.js +2 -0
- package/public/assets/agents-BYDslkJc.js +2 -0
- package/public/assets/analytics-B-XSbEMC.js +910 -0
- package/public/assets/andromeeda-vGVdxbeo.js +2 -0
- package/public/assets/angular-html-BVBpGdXr.js +2 -0
- package/public/assets/angular-ts-BfdufMKP.js +2 -0
- package/public/assets/api-CIIVBtAV.js +10 -0
- package/public/assets/archive-CIuPSvmx.js +2 -0
- package/public/assets/arrow-right-vFsRqG8V.js +2 -0
- package/public/assets/arrow-up-a-z-CKC2RCjD.js +2 -0
- package/public/assets/artifact-viewer-DdWIfV6M.js +2 -0
- package/public/assets/artifacts-DPN1q4pA.js +2 -0
- package/public/assets/artifacts-oBOqks-2.js +2 -0
- package/public/assets/astro-JKRPP03v.js +2 -0
- package/public/assets/aurora-x-CDeNXAV0.js +2 -0
- package/public/assets/automation-4KcRFXEu.js +2 -0
- package/public/assets/ayu-dark-DluEY0Gj.js +2 -0
- package/public/assets/ayu-light-C3h-C4tm.js +2 -0
- package/public/assets/ayu-mirage-Bqwy1Gya.js +2 -0
- package/public/assets/backlog-Cw9xPTCF.js +2 -0
- package/public/assets/badge-DqJRtj_p.js +2 -0
- package/public/assets/bell-_Yzbxxrt.js +2 -0
- package/public/assets/blade-DA8yMPsw.js +2 -0
- package/public/assets/bot-B0NpDNhr.js +2 -0
- package/public/assets/boxes-Cv7Wq3h4.js +2 -0
- package/public/assets/braces-BOks9SsY.js +2 -0
- package/public/assets/brain-CagXMEKE.js +2 -0
- package/public/assets/brain-circuit-CpQeSmp3.js +2 -0
- package/public/assets/bundle-web-ifbJd0t-.js +14 -0
- package/public/assets/busy-health-CTu32MZt.js +2 -0
- package/public/assets/button-Do6Z3vvn.js +2 -0
- package/public/assets/c-Wt1voDr2.js +2 -0
- package/public/assets/calendar-QJjoZ1JU.js +2 -0
- package/public/assets/calendar-clock-CDG_KBhx.js +2 -0
- package/public/assets/card-C4QJ4hCW.js +2 -0
- package/public/assets/catppuccin-frappe-3VR1Za6u.js +2 -0
- package/public/assets/catppuccin-latte-DwIHMF0Q.js +2 -0
- package/public/assets/catppuccin-macchiato-DYnBP6_5.js +2 -0
- package/public/assets/catppuccin-mocha-DYhrFGRu.js +2 -0
- package/public/assets/channels-BiXzg1G9.js +2 -0
- package/public/assets/chart-column-S02ZGfTR.js +2 -0
- package/public/assets/chat-Ctk2qwvA.js +6 -0
- package/public/assets/check-B3M9Ug1P.js +2 -0
- package/public/assets/chevron-down-BoG3JCZn.js +2 -0
- package/public/assets/chevron-right-iljytE0x.js +2 -0
- package/public/assets/chevron-up-Bv3yC5ma.js +2 -0
- package/public/assets/circle-UESLMi2-.js +2 -0
- package/public/assets/circle-alert-CryagaZd.js +2 -0
- package/public/assets/circle-arrow-up-B432r0Kk.js +2 -0
- package/public/assets/circle-check-CkUkN96J.js +2 -0
- package/public/assets/circle-x-CZ0erS7Q.js +2 -0
- package/public/assets/clipboard-list-W2YeUsxT.js +2 -0
- package/public/assets/clock-3-BH47318N.js +2 -0
- package/public/assets/clock-BWPPBh1_.js +2 -0
- package/public/assets/code-preview-Bm1wWqAp.js +3 -0
- package/public/assets/coffee-CThvmt4R.js +2 -0
- package/public/assets/connectors-C36ax4Vw.js +2 -0
- package/public/assets/copy-DFxhHRtV.js +2 -0
- package/public/assets/copy-button-CjOj4HEf.js +2 -0
- package/public/assets/cosmos-Dn8XrlnS.css +1 -0
- package/public/assets/cosmos-Jj9LK2Wf.js +3993 -0
- package/public/assets/cpp-C5WNSHb9.js +2 -0
- package/public/assets/cpu-Dndy84IU.js +2 -0
- package/public/assets/crate-agent-H6S7-B9T.js +2 -0
- package/public/assets/css-DJp_X0uY.js +2 -0
- package/public/assets/csv-Dx-8-gkx.js +2 -0
- package/public/assets/dark-plus-Cs2F2srj.js +2 -0
- package/public/assets/dependency-graph-Cd1E23wa.js +2 -0
- package/public/assets/deploys-Bwfq146q.js +2 -0
- package/public/assets/dialog-uuJ9_geR.js +6 -0
- package/public/assets/display-CfO7rTuF.js +3 -0
- package/public/assets/dist-B2h2GeWt.js +2 -0
- package/public/assets/dist-BeVYU67E.js +2 -0
- package/public/assets/dist-Bmm-RKub.js +2 -0
- package/public/assets/dist-C1xmD7qJ.js +2 -0
- package/public/assets/dist-C2J943E6.js +2 -0
- package/public/assets/dist-C6lpJDoA.js +2 -0
- package/public/assets/dist-CoWL6B0c.js +2 -0
- package/public/assets/dist-D93SmTNC.js +2 -0
- package/public/assets/dist-Da7HrHNA.js +2 -0
- package/public/assets/dist-DeW2Y1R5.js +2 -0
- package/public/assets/dist-DwBdqQ6H.js +2 -0
- package/public/assets/dist-Dz182zaW.js +2 -0
- package/public/assets/dist-H3DLHJ0C.js +2 -0
- package/public/assets/dist-RrY9C4SI.js +2 -0
- package/public/assets/download-KgtpDbt5.js +2 -0
- package/public/assets/dracula-BHWKrbxM.js +2 -0
- package/public/assets/dracula-soft-5eyTD99u.js +2 -0
- package/public/assets/dropdown-menu-BXiNephE.js +2 -0
- package/public/assets/es2015-DMmZ8vbD.js +42 -0
- package/public/assets/esm-ZSuD7QuY.js +2 -0
- package/public/assets/everforest-dark-sB-x3p7T.js +2 -0
- package/public/assets/everforest-light-Df2xbC6M.js +2 -0
- package/public/assets/external-link-BRfu-fHG.js +2 -0
- package/public/assets/eye-BAP6fHrX.js +2 -0
- package/public/assets/file-code-corner-CXhIR1vB.js +2 -0
- package/public/assets/file-pen-Crunre5f.js +2 -0
- package/public/assets/file-text-CKuoMR2U.js +2 -0
- package/public/assets/files-DhhZI2Ih.js +3 -0
- package/public/assets/flag-CnEG9PH-.js +2 -0
- package/public/assets/flame-CxBuz46L.js +2 -0
- package/public/assets/fleet-B_rFEbnL.js +2 -0
- package/public/assets/fleet-metrics-BkHP-P3R.js +2 -0
- package/public/assets/folder-git-2-CJOmTT06.js +2 -0
- package/public/assets/folder-open-CBUCMSlu.js +2 -0
- package/public/assets/folder-tree-BG3Y9nqH.js +2 -0
- package/public/assets/formatted-body-Cm1RrzmN.js +3 -0
- package/public/assets/formatted-body-impl-DQiOuOD1.js +3 -0
- package/public/assets/gauge-BIODY-BQ.js +2 -0
- package/public/assets/geist-cyrillic-wght-normal-CHSlOQsW.woff2 +0 -0
- package/public/assets/geist-latin-ext-wght-normal-DMtmJ5ZE.woff2 +0 -0
- package/public/assets/geist-latin-wght-normal-Dm3htQBi.woff2 +0 -0
- package/public/assets/git-branch-yxhV0m8E.js +2 -0
- package/public/assets/git-commit-horizontal-DS1pJ_SS.js +2 -0
- package/public/assets/git-merge-C7eIG425.js +2 -0
- package/public/assets/github-dark-C-LZuMrd.js +2 -0
- package/public/assets/github-dark-default-DXG-b-1a.js +2 -0
- package/public/assets/github-dark-dimmed-Bx1FflLF.js +2 -0
- package/public/assets/github-dark-high-contrast-B_tTalzw.js +2 -0
- package/public/assets/github-light-EUqPIrTm.js +2 -0
- package/public/assets/github-light-default-BXViO-2h.js +2 -0
- package/public/assets/github-light-high-contrast-B68TUdTA.js +2 -0
- package/public/assets/globe-Cl5fXtqs.js +2 -0
- package/public/assets/glsl-Dv5r7kPw.js +2 -0
- package/public/assets/graphql-CcFwQwm0.js +2 -0
- package/public/assets/gruvbox-dark-hard-C820rvS2.js +2 -0
- package/public/assets/gruvbox-dark-medium-BPjhmG05.js +2 -0
- package/public/assets/gruvbox-dark-soft-MrdJrrXF.js +2 -0
- package/public/assets/gruvbox-light-hard-BC_s9l72.js +2 -0
- package/public/assets/gruvbox-light-medium-BAWPOn9u.js +2 -0
- package/public/assets/gruvbox-light-soft-BSMLrYjP.js +2 -0
- package/public/assets/haml-Bg4I2hiD.js +2 -0
- package/public/assets/handlebars-DnwbnL5R.js +2 -0
- package/public/assets/hash-CbtKih3g.js +2 -0
- package/public/assets/horizon-CE9ld1lL.js +2 -0
- package/public/assets/horizon-bright-DSNQnXHK.js +2 -0
- package/public/assets/host-mTgRw7xh.js +2 -0
- package/public/assets/host-providers-dialog-CHqwXTov.js +2 -0
- package/public/assets/hourglass-txu4ax6n.js +2 -0
- package/public/assets/houston-CsvMBhTu.js +2 -0
- package/public/assets/html-C8UlPnhE.js +2 -0
- package/public/assets/html-derivative-CY6NRz-J.js +2 -0
- package/public/assets/http-CoW620Fi.js +2 -0
- package/public/assets/humwick-lockup-on-dark-Ds44Y7BK.svg +19 -0
- package/public/assets/humwick-lockup-on-light-ClALZAHt.svg +19 -0
- package/public/assets/hurl-CSSETujw.js +2 -0
- package/public/assets/imba-DsUTQ-LC.js +2 -0
- package/public/assets/inbox-Dfwk3Gt8.js +2 -0
- package/public/assets/index-B7ZerHLY.css +2 -0
- package/public/assets/index-BU3uWo2t.js +15 -0
- package/public/assets/input-CsTB6jIx.js +2 -0
- package/public/assets/insights-fH1EL-qZ.js +2 -0
- package/public/assets/integrations-C5Oix6ng.js +2 -0
- package/public/assets/issue-ref-chip-ODyondIa.js +3 -0
- package/public/assets/java-CGc3VwQr.js +2 -0
- package/public/assets/javascript-CUt1pgmJ.js +2 -0
- package/public/assets/jinja-CD-Z-FLd.js +2 -0
- package/public/assets/jison-imPNup1l.js +2 -0
- package/public/assets/json-qhed-kSA.js +2 -0
- package/public/assets/json5-BR5RXkoi.js +2 -0
- package/public/assets/jsonc-CYpm1nAK.js +2 -0
- package/public/assets/jsonl-CmCQp5Yx.js +2 -0
- package/public/assets/jsx-CY6oMTks.js +2 -0
- package/public/assets/julia-CjffhBEM.js +2 -0
- package/public/assets/kanagawa-dragon-CXtmUGW6.js +2 -0
- package/public/assets/kanagawa-lotus-BN08jTvb.js +2 -0
- package/public/assets/kanagawa-wave-CTweb8Dz.js +2 -0
- package/public/assets/kernel-Bqr0CZGv.js +2 -0
- package/public/assets/key-round-CcSxl5qr.js +2 -0
- package/public/assets/keyboard-DcmEulph.js +2 -0
- package/public/assets/label-BPBzm9FJ.js +2 -0
- package/public/assets/laserwave-C_8bwKvT.js +2 -0
- package/public/assets/layers-DEfClY-v.js +2 -0
- package/public/assets/legacy-storage-carry-C-tBSxRA.js +2 -0
- package/public/assets/less-DVTAwKKz.js +2 -0
- package/public/assets/lib-D7DTGM1F.js +2 -0
- package/public/assets/lib-G-25QXXf.js +30 -0
- package/public/assets/light-plus-DVQuIRkW.js +2 -0
- package/public/assets/lightbulb-RDhZ4p-D.js +2 -0
- package/public/assets/link-2-off-DfRF9Hwb.js +2 -0
- package/public/assets/link-6RR7Hy3-.js +2 -0
- package/public/assets/list-checks-CwnS3hly.js +2 -0
- package/public/assets/list-ordered-D8nCM7rT.js +2 -0
- package/public/assets/list-todo-9qT0fgxZ.js +2 -0
- package/public/assets/loader-circle-BfPd4kOD.js +2 -0
- package/public/assets/lock-BW8MPKw_.js +2 -0
- package/public/assets/log-viewer-Cvfy6PW7.js +4 -0
- package/public/assets/mail-DyaDmwfY.js +2 -0
- package/public/assets/maintenance-D8CDH5wZ.js +2 -0
- package/public/assets/managed-agents-egllbpij.js +4 -0
- package/public/assets/markdown-BYOwaDjH.js +2 -0
- package/public/assets/markdown-preview-CYSFgVgK.js +3 -0
- package/public/assets/markdown-preview-impl-BteVIjX4.js +2 -0
- package/public/assets/marko-DvhNOisQ.js +2 -0
- package/public/assets/material-theme-Bm3Qr25_.js +2 -0
- package/public/assets/material-theme-darker-2IIEA8gg.js +2 -0
- package/public/assets/material-theme-lighter-uhdI0v04.js +2 -0
- package/public/assets/material-theme-ocean-CHQ94UKr.js +2 -0
- package/public/assets/material-theme-palenight-B5W6OYN7.js +2 -0
- package/public/assets/mdc-CazklSAj.js +2 -0
- package/public/assets/mdx-DQZ5AkYe.js +2 -0
- package/public/assets/memory-C8WmXsyr.js +2 -0
- package/public/assets/message-circle-wjztgHBe.js +2 -0
- package/public/assets/message-square-C-1G8dMM.js +2 -0
- package/public/assets/message-square-reply-B9Z4cbQx.js +2 -0
- package/public/assets/messages-BzQdqlO6.js +2 -0
- package/public/assets/messages-square-DVM1ZtcI.js +2 -0
- package/public/assets/min-dark-BSWPekZh.js +2 -0
- package/public/assets/min-light-DDpmG2fV.js +2 -0
- package/public/assets/minimize-2-BkK6XoMP.js +2 -0
- package/public/assets/monokai-CdkpiU2Y.js +2 -0
- package/public/assets/night-owl-DhmEMT88.js +2 -0
- package/public/assets/night-owl-light-eJ-hLW7d.js +2 -0
- package/public/assets/nord-Cb4Vim4T.js +2 -0
- package/public/assets/octagon-x-B5lnUY-8.js +2 -0
- package/public/assets/one-dark-pro-CLwyXe_n.js +2 -0
- package/public/assets/one-light-D7Lr4KcI.js +2 -0
- package/public/assets/orchestrators-B1HxzkNw.js +2 -0
- package/public/assets/overview-DCUnI4Z7.js +2 -0
- package/public/assets/package-open-ckPgcjpv.js +2 -0
- package/public/assets/package-plus-C1AKMjsl.js +2 -0
- package/public/assets/pairs-ftCd2XcD.js +2 -0
- package/public/assets/paperclip-CNpKZKum.js +2 -0
- package/public/assets/pause-DttnHD4c.js +2 -0
- package/public/assets/pencil-B1Hf2V_J.js +2 -0
- package/public/assets/php-CBqsN0ai.js +2 -0
- package/public/assets/pin-DcsKeXxr.js +2 -0
- package/public/assets/plastic-DQwYfKfQ.js +2 -0
- package/public/assets/play-BbT8m7A0.js +2 -0
- package/public/assets/plug-vIyO9_P8.js +2 -0
- package/public/assets/plug-zap-V0wMDJ-G.js +2 -0
- package/public/assets/plus-D5Ek4e2S.js +2 -0
- package/public/assets/poimandres-DRFjx7u4.js +2 -0
- package/public/assets/popover-8w1TWKMG.js +2 -0
- package/public/assets/postcss-BXeXVLqQ.js +2 -0
- package/public/assets/power-6tZOhYPg.js +2 -0
- package/public/assets/preload-helper-HclGiUj8.js +1 -0
- package/public/assets/profile-icon-B2zH8DMH.js +2 -0
- package/public/assets/projects-B_lmcqfO.js +2 -0
- package/public/assets/prompt-settings-Bftq9czX.js +2 -0
- package/public/assets/provider-brand-icon-_67JR7Zh.js +2 -0
- package/public/assets/provider-display-DbLWpP3j.js +2 -0
- package/public/assets/pug-C5hz5LQ7.js +2 -0
- package/public/assets/python-gzcpVVnB.js +2 -0
- package/public/assets/r-Dzep-lPg.js +2 -0
- package/public/assets/radio-Bn0_qc0G.js +2 -0
- package/public/assets/react-dom-DSFxiC7T.js +2 -0
- package/public/assets/red-CJ3rzSJv.js +2 -0
- package/public/assets/refresh-cw-CfpvQcUn.js +2 -0
- package/public/assets/regexp-Omp9DhTb.js +2 -0
- package/public/assets/registry-DWCU5c8q.js +4 -0
- package/public/assets/repeat-hl4p_Klo.js +2 -0
- package/public/assets/rocket-BmO1qSu-.js +2 -0
- package/public/assets/rolldown-runtime-QTnfLwEv.js +1 -0
- package/public/assets/rose-pine-BthvhNj6.js +2 -0
- package/public/assets/rose-pine-dawn-Dg85fqjY.js +2 -0
- package/public/assets/rose-pine-moon-hon4tzzS.js +2 -0
- package/public/assets/rotate-ccw-CtD77qkX.js +2 -0
- package/public/assets/rotate-cw-FPtkDewA.js +2 -0
- package/public/assets/run-card-CO_bguQf.js +2 -0
- package/public/assets/sass-DXrisJhu.js +2 -0
- package/public/assets/save-B_PGqSm4.js +2 -0
- package/public/assets/scroll-area-CIN4KQse.js +2 -0
- package/public/assets/scss-DdSxiZKl.js +2 -0
- package/public/assets/search-DjzbnTbf.js +2 -0
- package/public/assets/secrets-C7GIUATz.js +2 -0
- package/public/assets/security-BUFau5-N.js +3 -0
- package/public/assets/select-DTQMP4Dk.js +2 -0
- package/public/assets/separator-t1cLZErD.js +2 -0
- package/public/assets/server-CZIRjFyY.js +2 -0
- package/public/assets/service-access-settings-C3aujqTG.js +2 -0
- package/public/assets/settings-C6sZ9eBa.js +6 -0
- package/public/assets/shellscript-CLZ0U2zV.js +2 -0
- package/public/assets/shield-CtXNUA0i.js +2 -0
- package/public/assets/shield-alert-B9jCWcKW.js +2 -0
- package/public/assets/shipping-Bu8p1gEw.js +2 -0
- package/public/assets/shipping-stats-BiMTsA4A.js +2 -0
- package/public/assets/slack-dark-DnToyrRv.js +2 -0
- package/public/assets/slack-ochin-B2OO5cIa.js +2 -0
- package/public/assets/smile-plus-q6EQBXHZ.js +2 -0
- package/public/assets/snazzy-light-4G7pJPwS.js +2 -0
- package/public/assets/solarized-dark-DV17i1UV.js +2 -0
- package/public/assets/solarized-light-DSh2HLQt.js +2 -0
- package/public/assets/sparkles-CzwR10ZU.js +2 -0
- package/public/assets/sql-DNssxck8.js +2 -0
- package/public/assets/square-Bqly37YM.js +2 -0
- package/public/assets/stats-V9Z-GxUd.js +2 -0
- package/public/assets/status-dot-CVv0iGHL.js +2 -0
- package/public/assets/stethoscope-SCBrnQQ8.js +2 -0
- package/public/assets/store-BvtFdlGX.js +9 -0
- package/public/assets/stylus-B6D30XZt.js +2 -0
- package/public/assets/svelte-DOdLCIlh.js +2 -0
- package/public/assets/switch-DuCA7mrB.js +2 -0
- package/public/assets/synthwave-84-nFMaYfgc.js +2 -0
- package/public/assets/tabs-jZgNvNHr.js +2 -0
- package/public/assets/task-chip-CYj0mpoL.js +2 -0
- package/public/assets/tasks-BIyeAaPC.js +2 -0
- package/public/assets/tasks-CXU75HRF.js +11 -0
- package/public/assets/teams-BPf976zb.js +2 -0
- package/public/assets/terminal-Bl2u7KxT.js +2 -0
- package/public/assets/terminal-viewer-DE9BOe-8.js +3 -0
- package/public/assets/terminal-viewer-impl-BrP-ENHg.css +1 -0
- package/public/assets/terminal-viewer-impl-D04pjmGh.js +143 -0
- package/public/assets/textarea-hs6Mpyfl.js +2 -0
- package/public/assets/themes-G5j9m1Ji.js +2 -0
- package/public/assets/tokyo-night-oM2G3aXe.js +2 -0
- package/public/assets/trash-2-FbcSq927.js +2 -0
- package/public/assets/triangle-alert-BBNhfgMi.js +2 -0
- package/public/assets/ts-tags-Ca73dJJY.js +2 -0
- package/public/assets/tsx-5Eka4NBX.js +2 -0
- package/public/assets/typescript-DOu2WMV5.js +2 -0
- package/public/assets/use-agent-terminal-B1yR456R.js +2 -0
- package/public/assets/use-decisions-D-S4tpDf.js +2 -0
- package/public/assets/use-project-list-B-T2Bnnn.js +2 -0
- package/public/assets/use-selectors-CnrAk2YP.js +6 -0
- package/public/assets/user-avatar-nBFIcR4M.js +2 -0
- package/public/assets/user-cog-CKcouW1J.js +2 -0
- package/public/assets/user-plus-D9749q73.js +2 -0
- package/public/assets/users-C7B3u9jv.js +2 -0
- package/public/assets/versioned-prompt-editor-Diu8BIaM.js +8 -0
- package/public/assets/vesper-DdrHHSXu.js +2 -0
- package/public/assets/vitesse-black-fwtXNY1n.js +2 -0
- package/public/assets/vitesse-dark-BZCL-v6S.js +2 -0
- package/public/assets/vitesse-light-VbXTXTou.js +2 -0
- package/public/assets/volume-2-XrcRKD9Z.js +2 -0
- package/public/assets/vue-Bfx0ffIq.js +2 -0
- package/public/assets/vue-html-BeluIYX0.js +2 -0
- package/public/assets/vue-vine-DGUAbOCX.js +2 -0
- package/public/assets/warehouse-BanzOanY.js +2 -0
- package/public/assets/wasm-BnjxR4X6.js +2 -0
- package/public/assets/wasm-ByWQv1Qj.js +2 -0
- package/public/assets/waypoints-CIzINtLT.js +2 -0
- package/public/assets/wgsl-BsKzXJz4.js +2 -0
- package/public/assets/wit-DdvCle-K.js +2 -0
- package/public/assets/work-queue-TCjJxeT-.js +2 -0
- package/public/assets/workflow-marker-Cf3Hf2fN.js +2 -0
- package/public/assets/workflows-CXQX20Qj.js +6 -0
- package/public/assets/workspaces-qSYzKYMA.js +3 -0
- package/public/assets/wrench-C7-4CgnY.js +2 -0
- package/public/assets/x-Bge17hWJ.js +2 -0
- package/public/assets/xml-DIqSwXR3.js +2 -0
- package/public/assets/yaml-rwi0_p6S.js +2 -0
- package/public/assets/zap-DGuDTw4w.js +2 -0
- package/public/assets/zoom-in-Bs8Qv8VL.js +2 -0
- package/public/assets/zoomable-image-B3Og53nj.js +2 -0
- package/public/cosmos/audio/README.md +50 -0
- package/public/cosmos/audio/alert.mp3 +0 -0
- package/public/cosmos/audio/ambient-bed.mp3 +0 -0
- package/public/cosmos/audio/comet.mp3 +0 -0
- package/public/cosmos/audio/cross-galaxy.mp3 +0 -0
- package/public/cosmos/audio/deploy.mp3 +0 -0
- package/public/cosmos/audio/galaxy-dissipate.mp3 +0 -0
- package/public/cosmos/audio/galaxy-form.mp3 +0 -0
- package/public/cosmos/audio/land.mp3 +0 -0
- package/public/cosmos/audio/reap.mp3 +0 -0
- package/public/cosmos/audio/spawn.mp3 +0 -0
- package/public/cosmos.html +34 -0
- package/public/favicon.ico +0 -0
- package/public/favicon.svg +10 -0
- package/public/icons/apple-touch-icon.png +0 -0
- package/public/icons/humwick-192.png +0 -0
- package/public/icons/humwick-512.png +0 -0
- package/public/icons/humwick.svg +19 -0
- package/public/index.html +188 -0
- package/public/manifest.webmanifest +45 -0
- package/public/sw.js +160 -0
- package/recipes/code-review.yaml +26 -0
- package/recipes/debug.yaml +20 -0
- package/recipes/feature.yaml +26 -0
- package/recipes/refactor.yaml +20 -0
- package/recipes/test.yaml +20 -0
- package/runner/LICENSE +167 -0
- package/runner/agent-bin/agent-relay-browser +10 -0
- package/runner/agent-bin/humwick +10 -0
- package/runner/hooks/fff-search-redirect/fff-search-redirect.cjs +161 -0
- package/runner/hooks/fff-search-redirect/hooks.json +13 -0
- package/runner/hooks/rg-r-guard/hooks.json +18 -0
- package/runner/hooks/rg-r-guard/rg-r-guard.cjs +144 -0
- package/runner/hooks/web-tools-redirect/hooks.json +13 -0
- package/runner/hooks/web-tools-redirect/web-tools-redirect.cjs +84 -0
- package/runner/plugins/browser/skills/playwright-cli/SKILL.md +53 -0
- package/runner/plugins/claude/.claude-plugin/plugin.json +8 -0
- package/runner/plugins/claude/claude-statusline-probe.cjs +144 -0
- package/runner/plugins/claude/hooks/gate-run-guard.provisioned.mjs +914 -0
- package/runner/plugins/claude/hooks/gate-run-guard.sh +9 -0
- package/runner/plugins/claude/hooks/gate-run-guard.ts +237 -0
- package/runner/plugins/claude/hooks/hooks.json +158 -0
- package/runner/plugins/claude/hooks/kill-guard.provisioned.mjs +7027 -0
- package/runner/plugins/claude/hooks/kill-guard.sh +341 -0
- package/runner/plugins/claude/hooks/kill-guard.ts +337 -0
- package/runner/plugins/claude/hooks/permission-request.sh +22 -0
- package/runner/plugins/claude/hooks/post-compact.sh +10 -0
- package/runner/plugins/claude/hooks/post-tool-use.sh +8 -0
- package/runner/plugins/claude/hooks/pre-compact.sh +12 -0
- package/runner/plugins/claude/hooks/read-only-bash-guard.sh +587 -0
- package/runner/plugins/claude/hooks/relay-status.sh +373 -0
- package/runner/plugins/claude/hooks/session-end.sh +26 -0
- package/runner/plugins/claude/hooks/session-start.sh +31 -0
- package/runner/plugins/claude/hooks/shell-trust.ts +28 -0
- package/runner/plugins/claude/hooks/stop-failure.sh +47 -0
- package/runner/plugins/claude/hooks/stop.sh +48 -0
- package/runner/plugins/claude/hooks/subagent-guard.cjs +26 -0
- package/runner/plugins/claude/hooks/subagent-skill-policy.cjs +160 -0
- package/runner/plugins/claude/hooks/subagent-start.sh +13 -0
- package/runner/plugins/claude/hooks/subagent-stop.sh +19 -0
- package/runner/plugins/claude/hooks/user-prompt-submit.sh +18 -0
- package/runner/plugins/claude/hooks/wait-loop-guard.ts +120 -0
- package/runner/plugins/claude/monitors/monitors.json +7 -0
- package/runner/plugins/claude/monitors/relay-monitor.provisioned.mjs +786 -0
- package/runner/plugins/claude/monitors/relay-monitor.ts +58 -0
- package/runner/plugins/claude/skills/disconnect/SKILL.md +16 -0
- package/runner/plugins/claude/skills/label/SKILL.md +23 -0
- package/runner/plugins/claude/skills/message/SKILL.md +40 -0
- package/runner/plugins/claude/skills/pair/SKILL.md +30 -0
- package/runner/plugins/claude/skills/react/SKILL.md +18 -0
- package/runner/plugins/claude/skills/read-message/SKILL.md +24 -0
- package/runner/plugins/claude/skills/reply/SKILL.md +44 -0
- package/runner/plugins/claude/skills/send-claimable/SKILL.md +39 -0
- package/runner/plugins/claude/skills/slice-first/SKILL.md +32 -0
- package/runner/plugins/claude/skills/slice-first/references/plan-recipe.md +46 -0
- package/runner/plugins/claude/skills/status/SKILL.md +16 -0
- package/runner/plugins/claude/skills/tags/SKILL.md +25 -0
- package/runner/plugins/claude/skills/task/SKILL.md +28 -0
- package/runner/plugins/claude-output-style/.claude-plugin/plugin.json +5 -0
- package/runner/plugins/claude-output-style/output-styles/agent-relay.md +5 -0
- package/runner/plugins/codex/skills/disconnect/SKILL.md +15 -0
- package/runner/plugins/codex/skills/guide/SKILL.md +15 -0
- package/runner/plugins/codex/skills/label/SKILL.md +22 -0
- package/runner/plugins/codex/skills/message/SKILL.md +40 -0
- package/runner/plugins/codex/skills/pair/SKILL.md +29 -0
- package/runner/plugins/codex/skills/react/SKILL.md +17 -0
- package/runner/plugins/codex/skills/read-message/SKILL.md +23 -0
- package/runner/plugins/codex/skills/reply/SKILL.md +44 -0
- package/runner/plugins/codex/skills/send-claimable/SKILL.md +39 -0
- package/runner/plugins/codex/skills/slice-first/SKILL.md +32 -0
- package/runner/plugins/codex/skills/slice-first/references/plan-recipe.md +46 -0
- package/runner/plugins/codex/skills/status/SKILL.md +15 -0
- package/runner/plugins/codex/skills/tags/SKILL.md +24 -0
- package/runner/plugins/codex/skills/task/SKILL.md +28 -0
- package/runner/src/adapter.ts +1061 -0
- package/runner/src/adapters/__fixtures__/codex-app-server.ts +47 -0
- package/runner/src/adapters/claude-api.ts +243 -0
- package/runner/src/adapters/claude-context-command.ts +16 -0
- package/runner/src/adapters/claude-credentials.ts +22 -0
- package/runner/src/adapters/claude-delivery-lanes.ts +28 -0
- package/runner/src/adapters/claude-delivery.ts +166 -0
- package/runner/src/adapters/claude-effort.ts +94 -0
- package/runner/src/adapters/claude-exit.ts +290 -0
- package/runner/src/adapters/claude-headless-mirror.ts +88 -0
- package/runner/src/adapters/claude-headless-refusal.ts +51 -0
- package/runner/src/adapters/claude-headless.ts +617 -0
- package/runner/src/adapters/claude-monitor-delivery-plan.ts +317 -0
- package/runner/src/adapters/claude-permission.ts +243 -0
- package/runner/src/adapters/claude-prompt-gates.ts +269 -0
- package/runner/src/adapters/claude-prompt-hook.ts +145 -0
- package/runner/src/adapters/claude-session-capture.ts +293 -0
- package/runner/src/adapters/claude-session-probe.ts +414 -0
- package/runner/src/adapters/claude-shutdown.ts +190 -0
- package/runner/src/adapters/claude-status-detectors.ts +426 -0
- package/runner/src/adapters/claude-subagents.ts +93 -0
- package/runner/src/adapters/claude-submit-confirmation.ts +287 -0
- package/runner/src/adapters/claude-tmux.ts +548 -0
- package/runner/src/adapters/claude-token-usage-capture.ts +253 -0
- package/runner/src/adapters/claude-tool-policy.ts +165 -0
- package/runner/src/adapters/claude-transcript-tail.ts +193 -0
- package/runner/src/adapters/claude-transcript.ts +812 -0
- package/runner/src/adapters/claude.ts +1097 -0
- package/runner/src/adapters/codex-agent-message-capture.ts +189 -0
- package/runner/src/adapters/codex-app-server.ts +70 -0
- package/runner/src/adapters/codex-client.ts +362 -0
- package/runner/src/adapters/codex-effective-config.ts +87 -0
- package/runner/src/adapters/codex-launch-config.ts +153 -0
- package/runner/src/adapters/codex-rollout-context.ts +272 -0
- package/runner/src/adapters/codex-skill-discovery.ts +18 -0
- package/runner/src/adapters/codex-token-usage-capture.ts +163 -0
- package/runner/src/adapters/codex-tool-output.ts +53 -0
- package/runner/src/adapters/codex-turn-outcome.ts +27 -0
- package/runner/src/adapters/codex-version.ts +64 -0
- package/runner/src/adapters/codex.ts +1442 -0
- package/runner/src/adapters/incremental-file.ts +110 -0
- package/runner/src/adapters/opencode-api.ts +71 -0
- package/runner/src/adapters/opencode-context.ts +277 -0
- package/runner/src/adapters/opencode-model-registry.ts +126 -0
- package/runner/src/adapters/opencode-provider.ts +169 -0
- package/runner/src/adapters/opencode-server-retry.ts +50 -0
- package/runner/src/adapters/opencode-soft-steer.ts +302 -0
- package/runner/src/adapters/opencode-spawn.ts +145 -0
- package/runner/src/adapters/opencode-subscribe.ts +62 -0
- package/runner/src/adapters/opencode-token-usage-capture.ts +187 -0
- package/runner/src/adapters/opencode-tool-events.ts +302 -0
- package/runner/src/adapters/opencode-tools-config.ts +17 -0
- package/runner/src/adapters/opencode.ts +2264 -0
- package/runner/src/adapters/project-shell.ts +80 -0
- package/runner/src/adapters/provider-launch-config.ts +21 -0
- package/runner/src/adapters/provider-quota-harvest.ts +127 -0
- package/runner/src/adapters/service-access.ts +153 -0
- package/runner/src/adapters/tmux-offload.ts +207 -0
- package/runner/src/adapters/tool-summary.ts +214 -0
- package/runner/src/agent-redact.ts +75 -0
- package/runner/src/agent-runner/commands/dispatch.ts +185 -0
- package/runner/src/agent-runner/commands/lifecycle.ts +84 -0
- package/runner/src/agent-runner/commands/prompt.ts +284 -0
- package/runner/src/agent-runner/credentials.ts +208 -0
- package/runner/src/agent-runner/http-liveness.ts +85 -0
- package/runner/src/agent-runner/lifecycle-milestones.ts +207 -0
- package/runner/src/agent-runner/lifecycle-phase.ts +80 -0
- package/runner/src/agent-runner/registration.ts +163 -0
- package/runner/src/agent-runner/runner-context.ts +158 -0
- package/runner/src/agent-runner/session-mirror.ts +278 -0
- package/runner/src/agent-runner/task-claims.ts +116 -0
- package/runner/src/agent-runner/token-usage-coverage.ts +54 -0
- package/runner/src/agent-runner/turn-report.ts +269 -0
- package/runner/src/api-budget-accounting.ts +91 -0
- package/runner/src/area-memory.ts +255 -0
- package/runner/src/artifact-path-materialize.ts +52 -0
- package/runner/src/async-guard.ts +35 -0
- package/runner/src/attachment-cache-sweep.ts +31 -0
- package/runner/src/attachment-cache.ts +195 -0
- package/runner/src/background-script-reconcile.ts +106 -0
- package/runner/src/bounded-log.ts +59 -0
- package/runner/src/bounded-spawn-sync.ts +18 -0
- package/runner/src/busy-reconciler.ts +282 -0
- package/runner/src/claim-tracker.ts +140 -0
- package/runner/src/claude-settings.ts +167 -0
- package/runner/src/claude-workspace-trust.ts +289 -0
- package/runner/src/config.ts +547 -0
- package/runner/src/context-boundary.ts +101 -0
- package/runner/src/context-command.ts +151 -0
- package/runner/src/context-probe-state.ts +6 -0
- package/runner/src/continuation-archive.ts +179 -0
- package/runner/src/control-server.ts +730 -0
- package/runner/src/delivery-policy.ts +9 -0
- package/runner/src/delivery-result.ts +24 -0
- package/runner/src/effort-command.ts +125 -0
- package/runner/src/empty-turn.ts +816 -0
- package/runner/src/free-port.ts +25 -0
- package/runner/src/fs-offload.ts +26 -0
- package/runner/src/gate-run-config.ts +35 -0
- package/runner/src/gate-run-lease-probe.ts +38 -0
- package/runner/src/host-asset-plan.ts +450 -0
- package/runner/src/host-claude-config-worker.ts +34 -0
- package/runner/src/host-sources.ts +40 -0
- package/runner/src/inbox-carrier.ts +7 -0
- package/runner/src/index.ts +386 -0
- package/runner/src/launch-assembly.ts +955 -0
- package/runner/src/liveness.ts +105 -0
- package/runner/src/logger.ts +108 -0
- package/runner/src/mcp-outbox.ts +204 -0
- package/runner/src/mcp-preflight.ts +86 -0
- package/runner/src/mcp-source-selection.ts +54 -0
- package/runner/src/mcp-tool-deferral.ts +35 -0
- package/runner/src/mcp-vault-env.ts +25 -0
- package/runner/src/message-body-config/config.ts +16 -0
- package/runner/src/message-body-config.ts +1 -0
- package/runner/src/mid-turn-delivery.ts +43 -0
- package/runner/src/native-memory-lever.ts +329 -0
- package/runner/src/native-self-resume.ts +244 -0
- package/runner/src/outbox.ts +453 -0
- package/runner/src/park-post.ts +17 -0
- package/runner/src/pending-permission-store.ts +148 -0
- package/runner/src/process-meta.ts +9 -0
- package/runner/src/profile-home.ts +419 -0
- package/runner/src/profile-projection.ts +411 -0
- package/runner/src/project-hooks.ts +65 -0
- package/runner/src/project-instructions.ts +119 -0
- package/runner/src/provider-double.ts +59 -0
- package/runner/src/provider-hold.ts +228 -0
- package/runner/src/provider-home-marker.ts +3 -0
- package/runner/src/provider-home-tombstone.ts +4 -0
- package/runner/src/provider-input-queue.ts +134 -0
- package/runner/src/provider-integration.ts +93 -0
- package/runner/src/provider-processes.ts +17 -0
- package/runner/src/provider-submit-failure.ts +15 -0
- package/runner/src/providers.ts +35 -0
- package/runner/src/provisioning.ts +703 -0
- package/runner/src/question-decision.ts +18 -0
- package/runner/src/quota.ts +22 -0
- package/runner/src/rate-limit.ts +351 -0
- package/runner/src/refused-prompt-store.ts +36 -0
- package/runner/src/relay-injection-events.ts +161 -0
- package/runner/src/relay-instructions.ts +107 -0
- package/runner/src/relay-mcp-proxy.long-turn-e2e.ts +183 -0
- package/runner/src/relay-mcp-proxy.ts +704 -0
- package/runner/src/relay-mcp.ts +583 -0
- package/runner/src/reply-obligation-cache.ts +211 -0
- package/runner/src/response-capture-report.ts +111 -0
- package/runner/src/response-routing.ts +6 -0
- package/runner/src/runner-core.ts +2955 -0
- package/runner/src/runner-exit.ts +12 -0
- package/runner/src/runner-helpers.ts +582 -0
- package/runner/src/runner-insights.ts +105 -0
- package/runner/src/runner-mcp-proxy.ts +46 -0
- package/runner/src/runner-spawn-config.ts +68 -0
- package/runner/src/runner-stale-scratch-sweep.ts +21 -0
- package/runner/src/runner.ts +9 -0
- package/runner/src/runtime-token-file.ts +45 -0
- package/runner/src/runtime-token-remint.ts +56 -0
- package/runner/src/service-access.ts +88 -0
- package/runner/src/session-destroy.ts +27 -0
- package/runner/src/session-insights.ts +118 -0
- package/runner/src/session-scratch.ts +296 -0
- package/runner/src/spawn-input.ts +147 -0
- package/runner/src/startup-config-fetch.ts +48 -0
- package/runner/src/subreaper.ts +113 -0
- package/runner/src/template-resolver.ts +29 -0
- package/runner/src/test-run-dedup.ts +435 -0
- package/runner/src/transcript-context.ts +99 -0
- package/runner/src/transport-errors.ts +48 -0
- package/runner/src/turn-opener.ts +55 -0
- package/runner/src/turn-reconcile-event.ts +88 -0
- package/runner/src/vault-proxy-hop.ts +99 -0
- package/runner/src/version.ts +44 -0
- package/runner/src/web-tool-call-proxy.ts +128 -0
- package/runner/src/web-tools.ts +59 -0
- package/runner/test-support/codex-web-config-proof.ts +149 -0
- package/runner/test-support/effective-launch.ts +189 -0
- package/runner/test-support/native-context-sources.ts +77 -0
- package/runner/test-support/provisioning-context.ts +55 -0
- package/runner/test-support/recorder-double.ts +130 -0
- package/runner/test-support/recording-provider.ts +242 -0
- package/runner/test-support/runner-harness.ts +249 -0
- package/runner/test-support/service-access-fixture.ts +12 -0
- package/scripts/agent-vault/bootstrap.py +87 -0
- package/scripts/agent-vault/install.py +200 -0
- package/scripts/agent-vault/install_refresh.py +98 -0
- package/scripts/agent-vault/refresh.py +116 -0
- package/scripts/agent-vault/refresh_provision.py +109 -0
- package/scripts/agent-vault/refresh_store.py +54 -0
- package/scripts/agent-vault/runtime.py +253 -0
- package/scripts/agent-vault/sec-ops-activation.json +23 -0
- package/scripts/artifact-checkout-gc.ts +51 -0
- package/scripts/cd-config.ts +237 -0
- package/scripts/cd-deploy-debounce.ts +94 -0
- package/scripts/cd-deploy-worktree-gc.ts +235 -0
- package/scripts/cd-fleet-membership.ts +48 -0
- package/scripts/cd-host-epochs.ts +101 -0
- package/scripts/cd-hub-wake.ts +40 -0
- package/scripts/cd-land-boundary.ts +49 -0
- package/scripts/cd-watcher.ts +985 -0
- package/scripts/dashboard-build-marker.ts +71 -0
- package/scripts/fleet-sha-coverage.ts +66 -0
- package/scripts/gate-run-lease.ts +329 -0
- package/scripts/gate-slot +9 -0
- package/scripts/gate-slot-fleet-health.ts +60 -0
- package/scripts/gate.sh +6 -0
- package/scripts/install-bin-shim.cjs +149 -0
- package/scripts/orchestrator-spawn-smoke.ts +398 -0
- package/scripts/provisioning-matrix.ts +72 -0
- package/scripts/release-cd-stamp.ts +146 -0
- package/scripts/release-health.ts +133 -0
- package/scripts/release-report.ts +102 -0
- package/scripts/release-upgrade.ts +1296 -0
- package/scripts/steward-policy-cleanup.ts +73 -0
- package/scripts/wait-for-deploy.ts +43 -0
- package/src/agent-authz.ts +219 -0
- package/src/agent-branch-state.ts +45 -0
- package/src/agent-busy-health.ts +158 -0
- package/src/agent-card-projection.ts +86 -0
- package/src/agent-channel-binding.ts +49 -0
- package/src/agent-command-activity.ts +39 -0
- package/src/agent-core.ts +29 -0
- package/src/agent-death-diagnosis.ts +314 -0
- package/src/agent-drive-arbiter.ts +112 -0
- package/src/agent-exit-alarm.ts +10 -0
- package/src/agent-exit-cleanup-async.ts +69 -0
- package/src/agent-exit-cleanup.ts +99 -0
- package/src/agent-exit-report.ts +28 -0
- package/src/agent-issue-repo.ts +53 -0
- package/src/agent-launch-shape-redaction.ts +72 -0
- package/src/agent-lifecycle-events.ts +428 -0
- package/src/agent-principal.ts +14 -0
- package/src/agent-profile-catalog.ts +188 -0
- package/src/agent-ref.ts +340 -0
- package/src/agent-spawn.ts +45 -0
- package/src/agent-status-events.ts +41 -0
- package/src/agent-system-tags.ts +38 -0
- package/src/artifact-media.ts +34 -0
- package/src/artifact-storage.ts +245 -0
- package/src/artifact-text.ts +31 -0
- package/src/async-deadline.ts +59 -0
- package/src/auth/admin-routes.ts +36 -0
- package/src/auth/index.ts +23 -0
- package/src/auth/login-rate-limiter.ts +153 -0
- package/src/auth/password.ts +142 -0
- package/src/auth/provider.ts +60 -0
- package/src/auth/role-scopes.ts +15 -0
- package/src/auth/session-cookie.ts +35 -0
- package/src/auth/session-refresh.ts +61 -0
- package/src/auth/session.test-fixture.ts +10 -0
- package/src/auth/session.ts +107 -0
- package/src/authority-audit.ts +56 -0
- package/src/authz-meta-keys.ts +64 -0
- package/src/auto-spawn-dispatch.ts +154 -0
- package/src/automations/constants.ts +14 -0
- package/src/automations/cron.ts +129 -0
- package/src/automations/crud.ts +129 -0
- package/src/automations/dispatch.ts +299 -0
- package/src/automations/index.ts +5 -0
- package/src/automations/precheck.ts +124 -0
- package/src/automations/reconcile.ts +314 -0
- package/src/automations/storage.ts +200 -0
- package/src/automations/types.ts +16 -0
- package/src/automations/validation.ts +216 -0
- package/src/automations.ts +1 -0
- package/src/branch-landed.ts +761 -0
- package/src/browser-authz.ts +18 -0
- package/src/browser-config.ts +31 -0
- package/src/bundled-workflows.ts +48 -0
- package/src/bus-outbox-async.ts +16 -0
- package/src/bus-outbox.ts +265 -0
- package/src/bus-resume-commands.ts +18 -0
- package/src/bus.ts +792 -0
- package/src/canonical-repo-root.ts +131 -0
- package/src/cd-deploy-notify.ts +59 -0
- package/src/cd-host-deferrals.ts +23 -0
- package/src/cd-host-lag-notify.ts +36 -0
- package/src/cd-repository.ts +49 -0
- package/src/channel-output-control.ts +43 -0
- package/src/channel-output-validation.ts +11 -0
- package/src/channel-policy-health.ts +20 -0
- package/src/channel-target.ts +40 -0
- package/src/channels-host-service.ts +219 -0
- package/src/ci/bun-test-log.ts +41 -0
- package/src/ci/failed-test-files.ts +52 -0
- package/src/ci/gate-history.ts +66 -0
- package/src/ci/github-actions.ts +145 -0
- package/src/ci/incidents.ts +175 -0
- package/src/ci/index.ts +6 -0
- package/src/ci/job-verdict.ts +27 -0
- package/src/ci/land-boundary-ci.ts +104 -0
- package/src/ci/monitor.ts +528 -0
- package/src/ci/not-triggered.ts +116 -0
- package/src/ci/notifications.ts +234 -0
- package/src/ci/provider.ts +87 -0
- package/src/ci/root-missing.ts +35 -0
- package/src/ci/transition-notify.ts +279 -0
- package/src/ci-monitor.ts +7 -0
- package/src/claude-api-budget-async.ts +11 -0
- package/src/claude-api-budget-config.ts +23 -0
- package/src/claude-api-expiry.ts +70 -0
- package/src/claude-api-overflow.ts +146 -0
- package/src/claude-app/config.ts +13 -0
- package/src/claude-app/oauth-http.ts +127 -0
- package/src/claude-app/oauth-provider.ts +136 -0
- package/src/claude-app/passphrase.ts +14 -0
- package/src/claude-app-auth.ts +65 -0
- package/src/claude-app-gateway.ts +68 -0
- package/src/cli/_shared.ts +136 -0
- package/src/cli/agent-detect.ts +175 -0
- package/src/cli/agent-guide.ts +152 -0
- package/src/cli/agent-keep.ts +37 -0
- package/src/cli/agent-meta.ts +111 -0
- package/src/cli/artifact.ts +154 -0
- package/src/cli/browser.ts +56 -0
- package/src/cli/channel-output.ts +17 -0
- package/src/cli/channels-host.ts +13 -0
- package/src/cli/channels.ts +16 -0
- package/src/cli/claude-api-budget.ts +41 -0
- package/src/cli/context-probe.ts +90 -0
- package/src/cli/credentials.ts +1 -0
- package/src/cli/daemon.ts +125 -0
- package/src/cli/dev.ts +185 -0
- package/src/cli/ephemeral.ts +159 -0
- package/src/cli/hosts.ts +41 -0
- package/src/cli/index.ts +442 -0
- package/src/cli/introspect.ts +74 -0
- package/src/cli/maintenance.ts +24 -0
- package/src/cli/merges.ts +78 -0
- package/src/cli/message.ts +229 -0
- package/src/cli/orchestrator.ts +384 -0
- package/src/cli/pair.ts +135 -0
- package/src/cli/profile.ts +35 -0
- package/src/cli/project.ts +52 -0
- package/src/cli/prompts.ts +23 -0
- package/src/cli/provider-enablement.ts +42 -0
- package/src/cli/provider.ts +230 -0
- package/src/cli/recipe.ts +110 -0
- package/src/cli/reply.ts +130 -0
- package/src/cli/roles.ts +60 -0
- package/src/cli/routing-policy.ts +20 -0
- package/src/cli/run.ts +96 -0
- package/src/cli/secrets-backup.ts +85 -0
- package/src/cli/secrets.ts +55 -0
- package/src/cli/service-access.ts +23 -0
- package/src/cli/setup.ts +57 -0
- package/src/cli/shutdown.ts +16 -0
- package/src/cli/spawn.ts +31 -0
- package/src/cli/state.ts +73 -0
- package/src/cli/steward.ts +58 -0
- package/src/cli/task.ts +151 -0
- package/src/cli/team.ts +18 -0
- package/src/cli/timers.ts +53 -0
- package/src/cli/token.ts +72 -0
- package/src/cli/upgrade.ts +200 -0
- package/src/cli/web-tool-calls.ts +17 -0
- package/src/cli/workflow.ts +46 -0
- package/src/cli/workspace.ts +544 -0
- package/src/cli.ts +4 -0
- package/src/codex-reset-consume.ts +274 -0
- package/src/codex-wham-quota.ts +177 -0
- package/src/command-events.ts +69 -0
- package/src/command-secrets.ts +198 -0
- package/src/command-ttl.ts +63 -0
- package/src/commands-db.ts +1200 -0
- package/src/commands-landing-async.ts +166 -0
- package/src/commands-write.ts +168 -0
- package/src/comment-blocks.ts +84 -0
- package/src/compaction-watch.ts +259 -0
- package/src/config-model-selection.ts +14 -0
- package/src/config-store-write.ts +39 -0
- package/src/config-store.ts +1253 -0
- package/src/config.ts +939 -0
- package/src/connector-boot-health.ts +27 -0
- package/src/connector-paths.ts +47 -0
- package/src/connectors.ts +547 -0
- package/src/content-security.ts +12 -0
- package/src/context-advisory.ts +279 -0
- package/src/context-block-rendered-at.ts +33 -0
- package/src/context-injection-channel.ts +49 -0
- package/src/context-router.ts +121 -0
- package/src/context-threshold-config.ts +52 -0
- package/src/continuation-replay-edge.ts +30 -0
- package/src/continuity-working-state.ts +107 -0
- package/src/contracts.ts +109 -0
- package/src/coordinator-authority.ts +100 -0
- package/src/coordinator-digest-config.ts +20 -0
- package/src/cosmos-events.ts +164 -0
- package/src/daemon.ts +570 -0
- package/src/dashboard-notifications.ts +169 -0
- package/src/dashboard-presence.ts +86 -0
- package/src/db/activity-async.ts +58 -0
- package/src/db/activity-read-ops.ts +42 -0
- package/src/db/activity-write-ops.ts +44 -0
- package/src/db/activity.ts +454 -0
- package/src/db/agent-card-read.ts +98 -0
- package/src/db/agent-effort-state.ts +146 -0
- package/src/db/agent-exit-cleanup.ts +94 -0
- package/src/db/agent-exit-report.ts +33 -0
- package/src/db/agent-gate-runs-write-ops.ts +7 -0
- package/src/db/agent-gate-runs.ts +96 -0
- package/src/db/agent-identity-archive.test-fixture.ts +12 -0
- package/src/db/agent-identity-archive.ts +75 -0
- package/src/db/agent-keep.ts +21 -0
- package/src/db/agent-lifecycle-write-ops.ts +93 -0
- package/src/db/agent-meta.ts +74 -0
- package/src/db/agent-outstanding-work.ts +154 -0
- package/src/db/agent-ownership-async.ts +45 -0
- package/src/db/agent-ownership-read-ops.ts +12 -0
- package/src/db/agent-ownership-write-ops.ts +54 -0
- package/src/db/agent-ownership.ts +200 -0
- package/src/db/agent-predicates.ts +64 -0
- package/src/db/agent-read.ts +39 -0
- package/src/db/agent-search-async.ts +21 -0
- package/src/db/agent-search-read-ops.ts +8 -0
- package/src/db/agent-search.ts +162 -0
- package/src/db/agent-shutdown-in-flight.ts +21 -0
- package/src/db/agents-async.ts +337 -0
- package/src/db/agents-prune-write-op.ts +37 -0
- package/src/db/agents-read-ops.ts +33 -0
- package/src/db/agents-write-ops.ts +188 -0
- package/src/db/agents.ts +1284 -0
- package/src/db/api-budget-schema.ts +144 -0
- package/src/db/api-budget-usage-migration.ts +31 -0
- package/src/db/api-budget-usage.ts +40 -0
- package/src/db/artifact-browse.ts +145 -0
- package/src/db/artifact-retention.ts +115 -0
- package/src/db/artifacts-async.ts +81 -0
- package/src/db/artifacts-read-ops.ts +24 -0
- package/src/db/artifacts-write-ops.ts +51 -0
- package/src/db/artifacts.ts +307 -0
- package/src/db/auth-identities.ts +128 -0
- package/src/db/backlog.ts +172 -0
- package/src/db/blackboard.ts +171 -0
- package/src/db/broadcast-scope.ts +63 -0
- package/src/db/broker-memory-migration.ts +71 -0
- package/src/db/browser-sessions.ts +89 -0
- package/src/db/budget-lineage.ts +26 -0
- package/src/db/bus-outbox-read-ops.ts +29 -0
- package/src/db/bus-outbox-write-ops.ts +58 -0
- package/src/db/bus-prune-async.ts +16 -0
- package/src/db/busy-regression.worker.ts +48 -0
- package/src/db/caller-lifecycle.ts +24 -0
- package/src/db/carry-pending-marker.ts +129 -0
- package/src/db/carry-pending.ts +145 -0
- package/src/db/channel-binding-delete.ts +15 -0
- package/src/db/channel-egress-allowlist.ts +200 -0
- package/src/db/channel-identity.ts +38 -0
- package/src/db/channel-runtime.ts +19 -0
- package/src/db/channels-async.ts +55 -0
- package/src/db/channels-read-ops.ts +13 -0
- package/src/db/channels-session-fence.ts +18 -0
- package/src/db/channels-write-ops.ts +46 -0
- package/src/db/channels.ts +654 -0
- package/src/db/checkout-refresh.ts +36 -0
- package/src/db/ci-gate-runs.ts +92 -0
- package/src/db/ci-incidents-async.ts +76 -0
- package/src/db/ci-incidents-read-ops.ts +15 -0
- package/src/db/ci-incidents-write-ops.ts +57 -0
- package/src/db/ci-incidents.ts +667 -0
- package/src/db/ci-sha-observations-schema.ts +33 -0
- package/src/db/claim-sql.ts +44 -0
- package/src/db/claude-api-budget-ops.ts +15 -0
- package/src/db/claude-api-budget-reconcile.ts +39 -0
- package/src/db/claude-api-budget.ts +198 -0
- package/src/db/claude-app-oauth.ts +74 -0
- package/src/db/claude-catalog-reconcile.ts +27 -0
- package/src/db/codex-reset-consumes-async.ts +9 -0
- package/src/db/codex-reset-consumes-read-ops.ts +5 -0
- package/src/db/codex-reset-consumes-write-ops.ts +22 -0
- package/src/db/codex-reset-consumes.ts +122 -0
- package/src/db/command-agent-profiles.ts +58 -0
- package/src/db/command-row.ts +88 -0
- package/src/db/command-terminal-status.ts +33 -0
- package/src/db/command-vault-pruning.ts +30 -0
- package/src/db/commands-cancel-write.ts +45 -0
- package/src/db/commands-claim-admission.ts +144 -0
- package/src/db/commands-effort-read.ts +58 -0
- package/src/db/commands-host-land-admission.ts +106 -0
- package/src/db/commands-kernel-landing.ts +268 -0
- package/src/db/commands-land-occupancy.ts +40 -0
- package/src/db/commands-land-wait.ts +38 -0
- package/src/db/commands-landing-completeness.ts +66 -0
- package/src/db/commands-landing-tuples.ts +22 -0
- package/src/db/commands-landing.ts +1046 -0
- package/src/db/commands-leaseless-sweep.ts +72 -0
- package/src/db/commands-list-query.ts +47 -0
- package/src/db/commands-planner-stats.test-fixture.ts +97 -0
- package/src/db/commands-read-ops.ts +49 -0
- package/src/db/commands-scheduler-recovery.ts +71 -0
- package/src/db/commands-spawn-read.ts +33 -0
- package/src/db/commands-write-ops.ts +307 -0
- package/src/db/config-store-write-ops.ts +60 -0
- package/src/db/connection-instrumentation.ts +76 -0
- package/src/db/connection.ts +532 -0
- package/src/db/context-reset-carry.ts +144 -0
- package/src/db/continuation-archive-purge.ts +48 -0
- package/src/db/continuation-archive-search.ts +249 -0
- package/src/db/continuation-archives-async.ts +59 -0
- package/src/db/continuation-archives-read-ops.ts +10 -0
- package/src/db/continuation-archives-write-ops.ts +17 -0
- package/src/db/continuation-archives.ts +158 -0
- package/src/db/continuations.ts +201 -0
- package/src/db/coordinator-delivery.ts +10 -0
- package/src/db/coordinator-digest-async.ts +13 -0
- package/src/db/coordinator-digest-flush.ts +6 -0
- package/src/db/coordinator-digest.ts +145 -0
- package/src/db/coordinator-seat.ts +130 -0
- package/src/db/crash-reports.ts +115 -0
- package/src/db/db-error-registry.ts +290 -0
- package/src/db/db-reader-worker.ts +91 -0
- package/src/db/db-writer-worker.ts +66 -0
- package/src/db/deferred-lineage-report-queries.ts +28 -0
- package/src/db/deferred-lineage-reports.ts +44 -0
- package/src/db/delivery-async.ts +102 -0
- package/src/db/delivery-expiration-health.ts +97 -0
- package/src/db/delivery-expiration.ts +52 -0
- package/src/db/delivery-quality-async.ts +23 -0
- package/src/db/delivery-quality.ts +116 -0
- package/src/db/delivery-read-ops.ts +26 -0
- package/src/db/delivery-report-echo.ts +53 -0
- package/src/db/delivery-write-ops.ts +77 -0
- package/src/db/delivery.ts +545 -0
- package/src/db/deploy-events-async.ts +66 -0
- package/src/db/deploy-events-read-ops.ts +25 -0
- package/src/db/deploy-events-write-ops.ts +81 -0
- package/src/db/deploy-events.ts +554 -0
- package/src/db/deploy-task-completion.ts +48 -0
- package/src/db/drive-leases.ts +165 -0
- package/src/db/durable-payloads.ts +92 -0
- package/src/db/fixtures/writer-shutdown.ts +28 -0
- package/src/db/fts-query.ts +8 -0
- package/src/db/gate-policy.ts +27 -0
- package/src/db/gate-runs.ts +181 -0
- package/src/db/gateway.ts +513 -0
- package/src/db/generation-launch.ts +82 -0
- package/src/db/guides-search.ts +18 -0
- package/src/db/history-delivery-settle.ts +57 -0
- package/src/db/hosts-async.ts +150 -0
- package/src/db/hosts-backfill.ts +91 -0
- package/src/db/hosts-read-ops.ts +21 -0
- package/src/db/hosts-registration.ts +452 -0
- package/src/db/hosts-views.ts +259 -0
- package/src/db/hosts-write-ops.ts +108 -0
- package/src/db/hosts.ts +251 -0
- package/src/db/human-address.ts +6 -0
- package/src/db/idle-digest.ts +54 -0
- package/src/db/idle-self-care.ts +100 -0
- package/src/db/inbox-async.ts +29 -0
- package/src/db/inbox-read-ops.ts +8 -0
- package/src/db/inbox-write-ops.ts +29 -0
- package/src/db/inbox.ts +197 -0
- package/src/db/index.ts +147 -0
- package/src/db/injection-attempts.ts +41 -0
- package/src/db/insights-read-ops.ts +12 -0
- package/src/db/insights-write-ops.ts +16 -0
- package/src/db/integrations.ts +297 -0
- package/src/db/issue-associations.ts +136 -0
- package/src/db/issue-lifecycle.ts +199 -0
- package/src/db/issue-refs.ts +312 -0
- package/src/db/kernel-event-log-schema.ts +14 -0
- package/src/db/kernel-landing-admission.ts +15 -0
- package/src/db/kernel-landing-command-authority.ts +222 -0
- package/src/db/kernel-persistence-async.ts +48 -0
- package/src/db/kernel-persistence-read-ops.ts +24 -0
- package/src/db/kernel-persistence-write-ops.ts +43 -0
- package/src/db/land-boundaries.ts +138 -0
- package/src/db/land-executing.ts +147 -0
- package/src/db/land-gate-attestations.ts +161 -0
- package/src/db/land-incident-eligibility.ts +44 -0
- package/src/db/land-queue-trace.ts +28 -0
- package/src/db/land-stack.ts +80 -0
- package/src/db/land-telemetry-schema.ts +50 -0
- package/src/db/land-telemetry-write-ops.ts +16 -0
- package/src/db/land-telemetry.ts +114 -0
- package/src/db/land-withdrawal-state.ts +26 -0
- package/src/db/landed-merge-evidence.ts +72 -0
- package/src/db/landed-task-attribution.ts +23 -0
- package/src/db/landing-audit.ts +18 -0
- package/src/db/landing-controllers.ts +67 -0
- package/src/db/landing-ingress-async.ts +102 -0
- package/src/db/landing-ingress-read-ops.ts +8 -0
- package/src/db/landing-ingress-write-ops.ts +42 -0
- package/src/db/landing-ingress.ts +380 -0
- package/src/db/landing-read-ops.ts +18 -0
- package/src/db/landing-receipts.ts +206 -0
- package/src/db/landing-schema.ts +479 -0
- package/src/db/launch-facts.ts +60 -0
- package/src/db/legacy-landing-publication.ts +103 -0
- package/src/db/legacy-message-backfill.ts +90 -0
- package/src/db/lifecycle-seq.ts +127 -0
- package/src/db/lifecycle-write-window.ts +216 -0
- package/src/db/lineage-pair-dedupe-sql.ts +80 -0
- package/src/db/lineage-startup-captures.ts +43 -0
- package/src/db/long-running-work-async.ts +12 -0
- package/src/db/long-running-work-write-ops.ts +8 -0
- package/src/db/long-running-work.ts +78 -0
- package/src/db/macos-privacy.ts +72 -0
- package/src/db/main-connection-writes.ts +44 -0
- package/src/db/main-thread-state.ts +38 -0
- package/src/db/maintenance-health.ts +560 -0
- package/src/db/maintenance-indexes.ts +37 -0
- package/src/db/maintenance-job-runs-async.ts +15 -0
- package/src/db/maintenance-job-runs.ts +62 -0
- package/src/db/maintenance-job-write-ops.ts +10 -0
- package/src/db/maintenance-pauses.ts +224 -0
- package/src/db/maintenance-worker.ts +111 -0
- package/src/db/mappers.ts +422 -0
- package/src/db/memory-preamble-read.ts +13 -0
- package/src/db/memory-resolve.ts +209 -0
- package/src/db/memory-retirement-plan.ts +31 -0
- package/src/db/memory-retirement.ts +15 -0
- package/src/db/merge-drain-async.ts +8 -0
- package/src/db/merge-lease.ts +225 -0
- package/src/db/message-claims.ts +16 -0
- package/src/db/message-queries.ts +16 -0
- package/src/db/message-read-mark.ts +32 -0
- package/src/db/message-reads-async.ts +46 -0
- package/src/db/message-reads-read-ops.ts +35 -0
- package/src/db/message-reads-write-ops.ts +27 -0
- package/src/db/message-reads.ts +553 -0
- package/src/db/message-send-suppression.ts +58 -0
- package/src/db/message-send.ts +76 -0
- package/src/db/message-thread.ts +15 -0
- package/src/db/message-write-ops.ts +100 -0
- package/src/db/messages-async.ts +31 -0
- package/src/db/messages-read-ops.ts +14 -0
- package/src/db/messages.ts +1201 -0
- package/src/db/migration-marker.ts +13 -0
- package/src/db/migrations.ts +1761 -0
- package/src/db/notification-subscriptions.ts +282 -0
- package/src/db/on-loop-write-transaction.ts +34 -0
- package/src/db/operator-actions-schema.ts +10 -0
- package/src/db/operator-decisions.ts +180 -0
- package/src/db/orchestrators-async.ts +61 -0
- package/src/db/orchestrators-read-ops.ts +7 -0
- package/src/db/orchestrators-write-ops.ts +58 -0
- package/src/db/orchestrators.ts +497 -0
- package/src/db/outbox-codec.ts +16 -0
- package/src/db/pair-maintenance.ts +9 -0
- package/src/db/pairs-async.ts +10 -0
- package/src/db/pairs-write-ops.ts +8 -0
- package/src/db/pairs.ts +264 -0
- package/src/db/pending-relay-runs.ts +73 -0
- package/src/db/plan-blurb-migration.ts +158 -0
- package/src/db/plan-ci-blocks.ts +28 -0
- package/src/db/plan-completion.ts +55 -0
- package/src/db/plan-conformance.ts +104 -0
- package/src/db/plan-dispatch-schema.ts +17 -0
- package/src/db/plan-dispatch-store.ts +112 -0
- package/src/db/plan-external.ts +79 -0
- package/src/db/plan-graph-async.ts +23 -0
- package/src/db/plan-graph-read-ops.ts +16 -0
- package/src/db/plan-graph-write-ops.ts +37 -0
- package/src/db/plan-graph.ts +403 -0
- package/src/db/plan-import-schema.ts +19 -0
- package/src/db/plan-import.ts +211 -0
- package/src/db/plan-task-create.ts +44 -0
- package/src/db/planner-stats.ts +123 -0
- package/src/db/plans-async.ts +22 -0
- package/src/db/plans-read-ops.ts +11 -0
- package/src/db/plans-write-ops.ts +9 -0
- package/src/db/plans.ts +385 -0
- package/src/db/policy-runtime.ts +14 -0
- package/src/db/presence-buffer.ts +111 -0
- package/src/db/presence-loop.ts +58 -0
- package/src/db/presence-write-ops.ts +28 -0
- package/src/db/presence-write.ts +38 -0
- package/src/db/profile-artifact-backfill-migration.ts +32 -0
- package/src/db/profile-host-sources-migration.ts +150 -0
- package/src/db/profile-legacy-project-instructions-migration.ts +41 -0
- package/src/db/profile-name-case-migration.ts +46 -0
- package/src/db/profile-override-migration.ts +200 -0
- package/src/db/profile-project-ack-migration.ts +55 -0
- package/src/db/profile-slim-migration.ts +125 -0
- package/src/db/profile-slim-plan.ts +190 -0
- package/src/db/project-entries-async.ts +18 -0
- package/src/db/project-entries-read-ops.ts +28 -0
- package/src/db/project-entries.ts +514 -0
- package/src/db/project-entry-search.ts +63 -0
- package/src/db/project-identity.ts +16 -0
- package/src/db/project-journal.ts +256 -0
- package/src/db/project-lifecycle.ts +80 -0
- package/src/db/project-memory-group-migration.ts +76 -0
- package/src/db/project-phantom-merge.ts +228 -0
- package/src/db/project-root-schema.ts +30 -0
- package/src/db/project-trust-approvals.ts +98 -0
- package/src/db/projects-async.ts +50 -0
- package/src/db/projects-read-ops.ts +59 -0
- package/src/db/projects-write-ops.ts +74 -0
- package/src/db/projects.ts +629 -0
- package/src/db/prompt-templates-schema.ts +23 -0
- package/src/db/prompt-templates.ts +138 -0
- package/src/db/prompt-version-migration.ts +115 -0
- package/src/db/prompt-versions-ops.ts +17 -0
- package/src/db/prompt-versions.ts +167 -0
- package/src/db/provider-catalog-async.ts +31 -0
- package/src/db/provider-catalog-read-ops.ts +8 -0
- package/src/db/provider-catalog-write-ops.ts +16 -0
- package/src/db/provider-config-history.ts +49 -0
- package/src/db/provider-config-secrets.ts +117 -0
- package/src/db/provider-flap-messages-async.ts +6 -0
- package/src/db/provider-flap-messages-write-ops.ts +13 -0
- package/src/db/provider-flap-messages.ts +19 -0
- package/src/db/provider-quota-advisory-types.ts +39 -0
- package/src/db/provider-quota-burn.ts +322 -0
- package/src/db/provider-quota-effect-occurrences.ts +13 -0
- package/src/db/provider-quota-lease-write-ops.ts +24 -0
- package/src/db/provider-quota-leases-async.ts +35 -0
- package/src/db/provider-quota-leases.ts +174 -0
- package/src/db/provider-quota-matrix-cache.ts +85 -0
- package/src/db/provider-quota-matrix-fetch.ts +85 -0
- package/src/db/provider-quota-merge.ts +90 -0
- package/src/db/provider-quota-notification-write.ts +98 -0
- package/src/db/provider-quota-prune.ts +35 -0
- package/src/db/provider-quota-read-async.ts +77 -0
- package/src/db/provider-quota-read-ops.ts +56 -0
- package/src/db/provider-quota-recipients.ts +38 -0
- package/src/db/provider-quota-state.ts +139 -0
- package/src/db/provider-quota-visibility.ts +22 -0
- package/src/db/provider-quota-write-ops.ts +71 -0
- package/src/db/provider-quotas.ts +726 -0
- package/src/db/provider-secret-scrub.ts +64 -0
- package/src/db/provisioning-assets-migration.ts +85 -0
- package/src/db/provisioning-async.ts +116 -0
- package/src/db/provisioning-callmux.ts +184 -0
- package/src/db/provisioning-github-api.ts +16 -0
- package/src/db/provisioning-github-import-target.ts +29 -0
- package/src/db/provisioning-mcp-validation.ts +103 -0
- package/src/db/provisioning-read-ops.ts +23 -0
- package/src/db/provisioning-registry.ts +1122 -0
- package/src/db/provisioning-resolve.ts +321 -0
- package/src/db/provisioning-write-ops.ts +44 -0
- package/src/db/qa-skill-seed.ts +27 -0
- package/src/db/quota-lease-busy.worker.ts +62 -0
- package/src/db/read-op-marshaling-fixtures.ts +724 -0
- package/src/db/read-ops.ts +266 -0
- package/src/db/reader-pool.ts +252 -0
- package/src/db/recipe-read-ops.ts +15 -0
- package/src/db/recipe-write-ops.ts +68 -0
- package/src/db/reply-obligations.ts +265 -0
- package/src/db/report-suppression.ts +126 -0
- package/src/db/restart-epoch-admin-async.ts +14 -0
- package/src/db/restart-epoch-admin.ts +67 -0
- package/src/db/restart-epoch-admission.ts +114 -0
- package/src/db/restart-epoch-async.ts +80 -0
- package/src/db/restart-epoch-begin.ts +177 -0
- package/src/db/restart-epoch-read-ops.ts +40 -0
- package/src/db/restart-epoch-release.ts +248 -0
- package/src/db/restart-epoch-write-ops.ts +117 -0
- package/src/db/restart-epoch.test-fixture.ts +37 -0
- package/src/db/restart-epoch.ts +623 -0
- package/src/db/restart-sensitive.ts +81 -0
- package/src/db/retention.ts +423 -0
- package/src/db/review-ref-cleanups.ts +306 -0
- package/src/db/routing-policy.ts +64 -0
- package/src/db/scheduled-timer-projection.ts +123 -0
- package/src/db/scheduled-timer-quota-chaos-worker.ts +84 -0
- package/src/db/scheduled-timers.ts +521 -0
- package/src/db/schema.ts +1472 -0
- package/src/db/scoped-message-reads.ts +31 -0
- package/src/db/secrets-broker-async.ts +31 -0
- package/src/db/secrets-broker-read-ops.ts +8 -0
- package/src/db/secrets-broker-write-ops.ts +23 -0
- package/src/db/secrets-broker.ts +221 -0
- package/src/db/secrets-vault-import.ts +37 -0
- package/src/db/secrets-vault-key-lifecycle.ts +64 -0
- package/src/db/secrets-vault-metadata.ts +37 -0
- package/src/db/secrets-vault-migration.ts +53 -0
- package/src/db/secrets-vault-write.ts +97 -0
- package/src/db/secrets-vault.ts +69 -0
- package/src/db/self-effort-permissions.ts +50 -0
- package/src/db/service-access-read-ops.ts +10 -0
- package/src/db/services-async.ts +29 -0
- package/src/db/services-read-ops.ts +134 -0
- package/src/db/services-write-ops.ts +74 -0
- package/src/db/shared.ts +7 -0
- package/src/db/shipping-board-async.ts +6 -0
- package/src/db/shipping-board.ts +319 -0
- package/src/db/shipping-stats-async.ts +24 -0
- package/src/db/shipping-stats-histogram.ts +45 -0
- package/src/db/shipping-stats-schema.ts +8 -0
- package/src/db/shipping-stats.ts +265 -0
- package/src/db/snapshot-ledger-prune.ts +53 -0
- package/src/db/spawn-budget.ts +145 -0
- package/src/db/spawn-command-busy.worker.ts +71 -0
- package/src/db/spawn-delegation-state.ts +124 -0
- package/src/db/spawn-delegation.ts +114 -0
- package/src/db/spawn-host-cap.ts +29 -0
- package/src/db/spawn-in-flight-count.ts +37 -0
- package/src/db/spawn-in-flight.ts +15 -0
- package/src/db/spawn-process-evidence.ts +68 -0
- package/src/db/spawn-project-target.ts +57 -0
- package/src/db/spawn-registration-confirmed-backfill.ts +71 -0
- package/src/db/spawn-request-id-migration.ts +36 -0
- package/src/db/spawn-request-id.ts +35 -0
- package/src/db/spawn-request-reuse.ts +28 -0
- package/src/db/spawn-tree-cleanup.ts +92 -0
- package/src/db/spawn-tree.ts +29 -0
- package/src/db/sql-audit-indexes.ts +77 -0
- package/src/db/stalled-message-delivery.ts +52 -0
- package/src/db/startup-write-lock.ts +36 -0
- package/src/db/stats-async.ts +235 -0
- package/src/db/stats-health-read-model.ts +225 -0
- package/src/db/stats-read-ops.ts +25 -0
- package/src/db/stats.ts +633 -0
- package/src/db/target-host.ts +25 -0
- package/src/db/task-async.ts +165 -0
- package/src/db/task-comment-through-async.ts +14 -0
- package/src/db/task-comment-through-read-ops.ts +4 -0
- package/src/db/task-comment-through-write-ops.ts +7 -0
- package/src/db/task-comment-through.ts +123 -0
- package/src/db/task-core.ts +44 -0
- package/src/db/task-deliverables-async.ts +60 -0
- package/src/db/task-deliverables-read-ops.ts +4 -0
- package/src/db/task-deliverables-write-ops.ts +37 -0
- package/src/db/task-deliverables.ts +387 -0
- package/src/db/task-dependency-cycle.worker.ts +43 -0
- package/src/db/task-detail-projection.ts +91 -0
- package/src/db/task-entity-async.ts +252 -0
- package/src/db/task-entity-read-ops.ts +51 -0
- package/src/db/task-entity-write-ops.ts +197 -0
- package/src/db/task-entity.ts +1143 -0
- package/src/db/task-execution.ts +20 -0
- package/src/db/task-issue-relation.ts +23 -0
- package/src/db/task-issue-source.ts +46 -0
- package/src/db/task-land-withdraw-async.ts +10 -0
- package/src/db/task-land-withdraw-read-ops.ts +13 -0
- package/src/db/task-land-withdraw-read.ts +47 -0
- package/src/db/task-land-withdraw-write-ops.ts +31 -0
- package/src/db/task-land-withdraw.ts +423 -0
- package/src/db/task-list.ts +113 -0
- package/src/db/task-maintenance.ts +25 -0
- package/src/db/task-memory-async.ts +19 -0
- package/src/db/task-memory-read-ops.ts +9 -0
- package/src/db/task-memory-write-ops.ts +23 -0
- package/src/db/task-memory.ts +170 -0
- package/src/db/task-owner.ts +126 -0
- package/src/db/task-read-ops.ts +44 -0
- package/src/db/task-review-hold-async.ts +20 -0
- package/src/db/task-review-hold-delivery.ts +58 -0
- package/src/db/task-review-hold-write-ops.ts +26 -0
- package/src/db/task-review-hold.ts +615 -0
- package/src/db/task-state-reconcile-async.ts +12 -0
- package/src/db/task-state-reconcile.ts +163 -0
- package/src/db/task-validation.ts +71 -0
- package/src/db/task-write-ops.ts +145 -0
- package/src/db/tasks.ts +528 -0
- package/src/db/team-epics.ts +37 -0
- package/src/db/team-idle.ts +35 -0
- package/src/db/team-project.ts +69 -0
- package/src/db/team-spawn-delegation-read.ts +36 -0
- package/src/db/team-spawn-delegation.ts +49 -0
- package/src/db/teams-async.ts +58 -0
- package/src/db/teams-read-ops.ts +27 -0
- package/src/db/teams-write-ops.ts +17 -0
- package/src/db/teams.ts +504 -0
- package/src/db/terminal-events.ts +113 -0
- package/src/db/timer-async.ts +523 -0
- package/src/db/timer-cutover-core.ts +545 -0
- package/src/db/timer-cutover-report-read-ops.ts +211 -0
- package/src/db/timer-cutover-write-ops.ts +282 -0
- package/src/db/timer-ingress-payload.ts +160 -0
- package/src/db/timer-ingress-read-ops.ts +39 -0
- package/src/db/timer-ingress-request-keys.ts +282 -0
- package/src/db/timer-ingress-write-ops.ts +154 -0
- package/src/db/timer-ingress.ts +515 -0
- package/src/db/timer-message-cutover.ts +322 -0
- package/src/db/timer-message-fire-deadletter.ts +136 -0
- package/src/db/timer-message-fire.ts +209 -0
- package/src/db/timer-message-flip-chaos-worker.ts +89 -0
- package/src/db/timer-message-flip-consistency.ts +147 -0
- package/src/db/timer-message-flip.ts +676 -0
- package/src/db/timer-message-participant.ts +138 -0
- package/src/db/timer-migrate-input.ts +92 -0
- package/src/db/timer-operator-async.ts +177 -0
- package/src/db/timer-operator-read-ops.ts +21 -0
- package/src/db/timer-operator-stage10.ts +119 -0
- package/src/db/timer-operator-write-ops.ts +116 -0
- package/src/db/timer-operator.ts +393 -0
- package/src/db/timer-read-ops.ts +147 -0
- package/src/db/timer-transfer-errors.ts +10 -0
- package/src/db/timer-transfer-write-ops.ts +43 -0
- package/src/db/timer-verifier-schema.ts +29 -0
- package/src/db/timer-verifier.ts +379 -0
- package/src/db/timer-write-ops.ts +291 -0
- package/src/db/token-db-write-ops.ts +96 -0
- package/src/db/token-standing.ts +84 -0
- package/src/db/token-usage-read-ops.ts +8 -0
- package/src/db/token-usage-write-ops.ts +35 -0
- package/src/db/token-usage.ts +338 -0
- package/src/db/tool-groups-empty-migration.ts +59 -0
- package/src/db/urgent-intake.ts +30 -0
- package/src/db/user-invites.ts +107 -0
- package/src/db/user-settings-read-ops.ts +19 -0
- package/src/db/user-settings-write-ops.ts +43 -0
- package/src/db/users.ts +173 -0
- package/src/db/vault-backup.ts +59 -0
- package/src/db/vault-expiry.ts +71 -0
- package/src/db/vault-health.ts +99 -0
- package/src/db/vault-token-launch.ts +77 -0
- package/src/db/vault-token-ops.ts +14 -0
- package/src/db/vault-tokens.ts +101 -0
- package/src/db/viewer-scope.ts +117 -0
- package/src/db/wal-checkpointer-worker.ts +48 -0
- package/src/db/wal-checkpointer.ts +107 -0
- package/src/db/wal-index.ts +53 -0
- package/src/db/wal-live-log.ts +68 -0
- package/src/db/wal-reclaim-async.ts +45 -0
- package/src/db/wal-reclaim.ts +140 -0
- package/src/db/web-tool-call-ops.ts +15 -0
- package/src/db/web-tool-calls.ts +87 -0
- package/src/db/withdraw-land-error.ts +18 -0
- package/src/db/work-evidence.ts +43 -0
- package/src/db/workflow-budget.ts +44 -0
- package/src/db/workflow-contact.ts +173 -0
- package/src/db/workflow-execution.ts +10 -0
- package/src/db/workflow-journal-async.ts +64 -0
- package/src/db/workflow-journal-prune.ts +71 -0
- package/src/db/workflow-journal-read-ops.ts +21 -0
- package/src/db/workflow-journal-schema.ts +9 -0
- package/src/db/workflow-journal-write-ops.ts +33 -0
- package/src/db/workflow-journal.ts +324 -0
- package/src/db/workflow-spawn-quota.ts +57 -0
- package/src/db/workflow-stats-read-ops.ts +177 -0
- package/src/db/workflow-step-tasks.ts +74 -0
- package/src/db/workflow-task-read-ops.ts +187 -0
- package/src/db/workspace-land-state.ts +65 -0
- package/src/db/workspace-merge-hold.ts +28 -0
- package/src/db/workspace-persistence.ts +77 -0
- package/src/db/workspace-rekey-write-ops.ts +11 -0
- package/src/db/workspace-rekey.ts +148 -0
- package/src/db/workspace-steward-cancel.ts +85 -0
- package/src/db/workspace-steward-fence.ts +30 -0
- package/src/db/workspace-write-ops.ts +26 -0
- package/src/db/workspace-writes-async.ts +46 -0
- package/src/db/workspace-writes.ts +196 -0
- package/src/db/workspaces.ts +617 -0
- package/src/db/write-ops.ts +602 -0
- package/src/db/writer-drain.ts +27 -0
- package/src/db/writer-fault-seam.ts +104 -0
- package/src/db/writer-gateway.ts +843 -0
- package/src/db/writer-ledger.ts +56 -0
- package/src/db.ts +4 -0
- package/src/deploy-executor.ts +139 -0
- package/src/dev.ts +541 -0
- package/src/dispatch-availability.ts +55 -0
- package/src/dispatch-match.ts +21 -0
- package/src/ephemeral/host-landing-slots-proof-worker.ts +45 -0
- package/src/ephemeral/index.ts +58 -0
- package/src/ephemeral/instance.ts +832 -0
- package/src/ephemeral/landing-ingress-proof-worker.ts +30 -0
- package/src/ephemeral/ports.ts +40 -0
- package/src/ephemeral/profile.ts +323 -0
- package/src/ephemeral/rehearsal-stamps.ts +149 -0
- package/src/ephemeral/rehearsal.ts +213 -0
- package/src/ephemeral/snapshot-kernel.ts +41 -0
- package/src/ephemeral/snapshot.ts +753 -0
- package/src/ephemeral/sweep.ts +40 -0
- package/src/event-loop-lag.ts +584 -0
- package/src/event-loop-yield.ts +27 -0
- package/src/events.ts +140 -0
- package/src/execution-mode.ts +63 -0
- package/src/fleet-convergence.ts +123 -0
- package/src/gate-resolver.ts +151 -0
- package/src/gate-run-capture.ts +71 -0
- package/src/git-sha.ts +58 -0
- package/src/guides.ts +73 -0
- package/src/host/capacity.ts +79 -0
- package/src/host/gate-capacity-alert.ts +90 -0
- package/src/host/identity.ts +128 -0
- package/src/host/presentation.ts +234 -0
- package/src/host/pressure-details.ts +89 -0
- package/src/host/pressure.ts +216 -0
- package/src/host/state.ts +132 -0
- package/src/host/utilization-buffer.ts +71 -0
- package/src/host-awareness.ts +57 -0
- package/src/host-identity.ts +39 -0
- package/src/host-provider-enablement.ts +75 -0
- package/src/host-provider-store.ts +102 -0
- package/src/host-tools.ts +39 -0
- package/src/http-body.ts +49 -0
- package/src/http-compression.ts +16 -0
- package/src/hub-metrics-report.ts +67 -0
- package/src/hub-metrics.ts +166 -0
- package/src/idle-digest-config.ts +40 -0
- package/src/idle-self-care.ts +58 -0
- package/src/index.ts +35 -0
- package/src/injection-sweep-pacing.ts +24 -0
- package/src/insights-async.ts +16 -0
- package/src/insights-db.ts +188 -0
- package/src/internal-spawn-model.ts +18 -0
- package/src/invite-link.ts +11 -0
- package/src/issue-tracker/adapter.ts +58 -0
- package/src/issue-tracker/github.ts +342 -0
- package/src/issue-tracker/index.ts +12 -0
- package/src/issue-tracker/registry.ts +26 -0
- package/src/journal-preamble.ts +350 -0
- package/src/kernel-correlation.ts +28 -0
- package/src/land-authorization.ts +73 -0
- package/src/land-block.ts +59 -0
- package/src/land-failure-event-key.ts +8 -0
- package/src/land-gate-failure-routing.ts +69 -0
- package/src/land-gate-notifications.ts +173 -0
- package/src/land-gate-queue-progress.ts +54 -0
- package/src/land-gates-source.ts +126 -0
- package/src/land-gates.ts +29 -0
- package/src/land-lifecycle-drives.ts +15 -0
- package/src/land-settle-dispatch.ts +134 -0
- package/src/land-stack-depth.ts +11 -0
- package/src/land-telemetry.ts +40 -0
- package/src/landing-base-ref.ts +3 -0
- package/src/landing-host-safety.ts +38 -0
- package/src/landing-lane-key.ts +74 -0
- package/src/launch-mode-support.ts +11 -0
- package/src/launch-mode.ts +58 -0
- package/src/legacy-landing.test-fixture.ts +56 -0
- package/src/lifecycle-context-pressure.ts +134 -0
- package/src/lifecycle-manager.ts +831 -0
- package/src/lifecycle-signal-registry.ts +87 -0
- package/src/live-runs-section.ts +38 -0
- package/src/loop-block-attribution.ts +442 -0
- package/src/loop-block-regression-alarm.ts +156 -0
- package/src/loop-task-stamps.ts +62 -0
- package/src/main-thread-clock.ts +95 -0
- package/src/maintenance/agent-identity-archive-job.ts +15 -0
- package/src/maintenance/artifact-checkout-gc-job.ts +14 -0
- package/src/maintenance/artifact-checkout-gc.ts +33 -0
- package/src/maintenance/artifact-sweep.ts +23 -0
- package/src/maintenance/breaker.ts +200 -0
- package/src/maintenance/cd-watcher.ts +176 -0
- package/src/maintenance/checkout-refresh.ts +83 -0
- package/src/maintenance/ci-monitor.ts +14 -0
- package/src/maintenance/claude-api-budget-job.ts +16 -0
- package/src/maintenance/constants.ts +134 -0
- package/src/maintenance/continuation-archive-search-job.ts +27 -0
- package/src/maintenance/critical-job-watchdog.ts +252 -0
- package/src/maintenance/db-planner-stats-job.ts +19 -0
- package/src/maintenance/db-wal-reclaim-job.ts +82 -0
- package/src/maintenance/events.ts +28 -0
- package/src/maintenance/gate-capacity-sample-job.ts +16 -0
- package/src/maintenance/index.ts +10 -0
- package/src/maintenance/jobs.ts +857 -0
- package/src/maintenance/long-running-work.ts +41 -0
- package/src/maintenance/orphaned-sessions.ts +126 -0
- package/src/maintenance/pauses.ts +174 -0
- package/src/maintenance/provider-secret-scrub-job.ts +16 -0
- package/src/maintenance/queued-message-expiration.ts +23 -0
- package/src/maintenance/red-main-controller-job.ts +22 -0
- package/src/maintenance/reply-obligation-parity-job.ts +27 -0
- package/src/maintenance/restart-epoch-hold-health.ts +62 -0
- package/src/maintenance/run-registry.ts +194 -0
- package/src/maintenance/scheduler.ts +778 -0
- package/src/maintenance/service-access-job.ts +31 -0
- package/src/maintenance/shipping-stats-rollup-job.ts +23 -0
- package/src/maintenance/snapshot-ledger-prune-job.ts +17 -0
- package/src/maintenance/stalled-delivery-pager.ts +125 -0
- package/src/maintenance/steward-handback.ts +11 -0
- package/src/maintenance/task-state-reconcile-job.ts +22 -0
- package/src/maintenance/teams.ts +426 -0
- package/src/maintenance/types.ts +124 -0
- package/src/maintenance/vault-backup-job.ts +34 -0
- package/src/maintenance/vault-expiry-job.ts +29 -0
- package/src/maintenance/web-tool-call-prune-job.ts +13 -0
- package/src/maintenance/workflow-backstop-job.ts +12 -0
- package/src/maintenance/workflow-journal-prune-job.ts +29 -0
- package/src/maintenance/workspaces.ts +784 -0
- package/src/maintenance.ts +1 -0
- package/src/managed-policy-escalation.ts +123 -0
- package/src/managed-policy.ts +236 -0
- package/src/managed-provider-gate.ts +27 -0
- package/src/managed-spawn-reservation.ts +23 -0
- package/src/markdown-frontmatter.ts +14 -0
- package/src/mcp/activity-output.ts +57 -0
- package/src/mcp/artifact-upload.ts +53 -0
- package/src/mcp/context-output.ts +73 -0
- package/src/mcp/dispatch-shape-schema.ts +13 -0
- package/src/mcp/guides.ts +33 -0
- package/src/mcp/http.ts +27 -0
- package/src/mcp/identity-projection.ts +121 -0
- package/src/mcp/identity.ts +235 -0
- package/src/mcp/index.ts +355 -0
- package/src/mcp/issue-selector-schema.ts +12 -0
- package/src/mcp/message-read.ts +87 -0
- package/src/mcp/output-descriptions.ts +72 -0
- package/src/mcp/output-levels.ts +71 -0
- package/src/mcp/output-projection.ts +88 -0
- package/src/mcp/plan-presentation.ts +166 -0
- package/src/mcp/presentation-values.ts +11 -0
- package/src/mcp/presentation.ts +653 -0
- package/src/mcp/project-entry-search-schema.ts +7 -0
- package/src/mcp/prompts.ts +36 -0
- package/src/mcp/runtime-output.ts +84 -0
- package/src/mcp/schema-budget.ts +28 -0
- package/src/mcp/self-care-visibility.ts +23 -0
- package/src/mcp/service-access.ts +18 -0
- package/src/mcp/spawn-targets-matrix.ts +68 -0
- package/src/mcp/spawn-targets.test-fixture.ts +21 -0
- package/src/mcp/task-validation-presentation.ts +19 -0
- package/src/mcp/tool-generation.ts +8 -0
- package/src/mcp/tool-groups.ts +136 -0
- package/src/mcp/tools-artifacts.ts +82 -0
- package/src/mcp/tools-messaging.ts +541 -0
- package/src/mcp/tools-permission.ts +88 -0
- package/src/mcp/tools-run.ts +73 -0
- package/src/mcp/tools-scheduler.ts +156 -0
- package/src/mcp/tools-spawn.ts +418 -0
- package/src/mcp/tools-web-tool-calls.ts +28 -0
- package/src/mcp/tools-workspace.ts +260 -0
- package/src/mcp/types.ts +68 -0
- package/src/mcp/validation.ts +66 -0
- package/src/mcp-agent-action.ts +96 -0
- package/src/mcp-agent-keep.ts +37 -0
- package/src/mcp-backlog-tools.ts +137 -0
- package/src/mcp-blackboard-tools.ts +131 -0
- package/src/mcp-channel-binding-tools.ts +27 -0
- package/src/mcp-claude-api-budget.ts +35 -0
- package/src/mcp-codex-reset.ts +43 -0
- package/src/mcp-decision-tools.ts +96 -0
- package/src/mcp-dispatch-tools.ts +142 -0
- package/src/mcp-egress-tools.ts +168 -0
- package/src/mcp-errors.ts +7 -0
- package/src/mcp-host-tools.ts +61 -0
- package/src/mcp-interrupt-agent.ts +47 -0
- package/src/mcp-issue-activity-tools.ts +114 -0
- package/src/mcp-issue-association-tools.ts +103 -0
- package/src/mcp-issue-lifecycle-tools.ts +49 -0
- package/src/mcp-issue-ref-tools.ts +214 -0
- package/src/mcp-maintenance-tools.ts +113 -0
- package/src/mcp-merge-tools.ts +66 -0
- package/src/mcp-notification-subscription-tools.ts +297 -0
- package/src/mcp-output-levels.test-fixture.ts +95 -0
- package/src/mcp-plan-tools.ts +347 -0
- package/src/mcp-profile-trust-tools.ts +47 -0
- package/src/mcp-project-journal-tools.ts +160 -0
- package/src/mcp-project-tools.ts +420 -0
- package/src/mcp-provider-catalog.ts +9 -0
- package/src/mcp-release-tools.ts +33 -0
- package/src/mcp-routing-policy-tools.ts +35 -0
- package/src/mcp-secrets-tools.ts +87 -0
- package/src/mcp-task-deliver-tools.ts +166 -0
- package/src/mcp-task-land-withdraw-tools.ts +49 -0
- package/src/mcp-task-memory-tools.ts +119 -0
- package/src/mcp-task-review-hold-tools.ts +57 -0
- package/src/mcp-task-tools.ts +342 -0
- package/src/mcp-task-validation-tools.ts +30 -0
- package/src/mcp-task-weave-tools.ts +63 -0
- package/src/mcp-team-template-tools.ts +141 -0
- package/src/mcp-team-tools.ts +197 -0
- package/src/mcp-tool-allowlist.ts +88 -0
- package/src/mcp-workflow-tools.ts +158 -0
- package/src/mcp.ts +1 -0
- package/src/memory-admission-rank.ts +55 -0
- package/src/memory-area-injection.ts +216 -0
- package/src/memory-boundary-capture.ts +206 -0
- package/src/memory-entry-safety.ts +28 -0
- package/src/memory-inject-filter.ts +190 -0
- package/src/memory-injection.ts +954 -0
- package/src/memory-preamble-admission.ts +158 -0
- package/src/memory-preamble-async.ts +13 -0
- package/src/memory-preamble.ts +1142 -0
- package/src/memory-retirement.ts +11 -0
- package/src/memory-seam.ts +273 -0
- package/src/memory-tokens.ts +91 -0
- package/src/merge-drain.ts +101 -0
- package/src/merge-pause-maintenance.ts +19 -0
- package/src/message-visibility.ts +50 -0
- package/src/messaging-policy.ts +94 -0
- package/src/native-memory.ts +59 -0
- package/src/notification-prefs.ts +25 -0
- package/src/notification-role-policy.ts +14 -0
- package/src/notification-router.ts +329 -0
- package/src/notification-rules.ts +390 -0
- package/src/notification-settings-store.ts +47 -0
- package/src/notification-settings.ts +166 -0
- package/src/notification-subscription-rules.ts +11 -0
- package/src/notification-types.ts +312 -0
- package/src/notify.ts +55 -0
- package/src/observed-reset-boundary.ts +23 -0
- package/src/observed-reset-refresh.ts +21 -0
- package/src/operator-alarm.ts +41 -0
- package/src/operator-decisions-section.ts +29 -0
- package/src/orchestrator-lookup.ts +29 -0
- package/src/orchestrator-self-report-authz.ts +34 -0
- package/src/package-pack.ts +249 -0
- package/src/post-bind-startup.ts +58 -0
- package/src/process-guard.ts +31 -0
- package/src/profile-cells.ts +305 -0
- package/src/profile-effective-survey.ts +121 -0
- package/src/profile-host-sources.ts +73 -0
- package/src/profile-instruction-blocks.ts +11 -0
- package/src/profile-project-validation.ts +23 -0
- package/src/profile-provider-options.ts +59 -0
- package/src/profile-role-templates.ts +26 -0
- package/src/profile-workflow-policy.ts +14 -0
- package/src/project-claudemd-sweep.ts +176 -0
- package/src/project-file-source.ts +54 -0
- package/src/project-ingest.ts +195 -0
- package/src/project-instructions.ts +700 -0
- package/src/project-mcp.ts +18 -0
- package/src/project-role-assets.ts +109 -0
- package/src/project-roles-validate.ts +53 -0
- package/src/project-roles.ts +364 -0
- package/src/project-settings.ts +5 -0
- package/src/project-skills.ts +5 -0
- package/src/project-toolchain.ts +58 -0
- package/src/project-trust-fingerprint.ts +174 -0
- package/src/project-trust.ts +262 -0
- package/src/project-workflows.ts +185 -0
- package/src/prompt-resolver.ts +697 -0
- package/src/prompt-template-fallback.ts +15 -0
- package/src/prompt-version-errors.ts +13 -0
- package/src/provider-catalog-store.ts +393 -0
- package/src/provider-config-store.ts +308 -0
- package/src/provider-enablement.ts +36 -0
- package/src/provider-home-gc.ts +58 -0
- package/src/provider-model-seed.ts +18 -0
- package/src/provider-quota-async.ts +152 -0
- package/src/provider-quota-config-store.ts +60 -0
- package/src/provider-secrets.test-fixture.ts +34 -0
- package/src/provider-state.ts +93 -0
- package/src/provider-timeline-event.ts +76 -0
- package/src/quota-advisory.ts +359 -0
- package/src/quota-band-delivery.ts +13 -0
- package/src/quota-band-projection.ts +149 -0
- package/src/quota-band-transition.ts +316 -0
- package/src/quota-pacing.ts +46 -0
- package/src/quota-threshold-config.ts +46 -0
- package/src/quota.ts +61 -0
- package/src/ratchet-files.ts +202 -0
- package/src/recipe-async.ts +50 -0
- package/src/recipe-db.ts +260 -0
- package/src/recipe-loader.ts +132 -0
- package/src/recipe-runner.ts +259 -0
- package/src/recipe-validator.ts +107 -0
- package/src/relay-event-drain.ts +39 -0
- package/src/relay-host-locality.ts +20 -0
- package/src/relay-run-lease.ts +17 -0
- package/src/repo-config-source.ts +209 -0
- package/src/report-verbosity.ts +5 -0
- package/src/restart-epoch-deploy-hold.ts +221 -0
- package/src/retention-config-store.ts +32 -0
- package/src/retention-config.ts +70 -0
- package/src/reviewer-pipeline.ts +238 -0
- package/src/routes/_route.ts +70 -0
- package/src/routes/_shared.ts +513 -0
- package/src/routes/activity.ts +70 -0
- package/src/routes/agent-effort.ts +69 -0
- package/src/routes/agent-keep.ts +27 -0
- package/src/routes/agent-profiles.ts +169 -0
- package/src/routes/agent-reporting.ts +19 -0
- package/src/routes/agent-self-effort.ts +51 -0
- package/src/routes/agent-sessions.ts +650 -0
- package/src/routes/agent-sharing.ts +23 -0
- package/src/routes/agents-spawn.ts +258 -0
- package/src/routes/agents.ts +452 -0
- package/src/routes/artifacts.ts +340 -0
- package/src/routes/auth.ts +123 -0
- package/src/routes/authority-audit.ts +14 -0
- package/src/routes/automations.ts +83 -0
- package/src/routes/backlog.ts +112 -0
- package/src/routes/blackboard.ts +54 -0
- package/src/routes/browser.ts +73 -0
- package/src/routes/channel-binding-delete.ts +21 -0
- package/src/routes/channel-output.ts +17 -0
- package/src/routes/claude-api-budget.ts +65 -0
- package/src/routes/commands-listing.ts +50 -0
- package/src/routes/commands.ts +586 -0
- package/src/routes/config.ts +75 -0
- package/src/routes/connectors.ts +108 -0
- package/src/routes/context-resets.ts +35 -0
- package/src/routes/continuation-archives.ts +37 -0
- package/src/routes/coordinator-teams.ts +14 -0
- package/src/routes/decisions.ts +82 -0
- package/src/routes/deploys.ts +15 -0
- package/src/routes/fleet-convergence.ts +5 -0
- package/src/routes/guides.ts +13 -0
- package/src/routes/host-providers.ts +73 -0
- package/src/routes/host-resource-control.ts +48 -0
- package/src/routes/host-secret-files.ts +38 -0
- package/src/routes/hosts.ts +240 -0
- package/src/routes/inbox.ts +151 -0
- package/src/routes/index.ts +614 -0
- package/src/routes/insights.ts +86 -0
- package/src/routes/integrations.ts +636 -0
- package/src/routes/issue-activity.ts +78 -0
- package/src/routes/issue-associations.ts +76 -0
- package/src/routes/issue-lifecycle.ts +34 -0
- package/src/routes/issue-refs.ts +163 -0
- package/src/routes/kernel-timers-operator.ts +57 -0
- package/src/routes/memory.ts +25 -0
- package/src/routes/merges.ts +109 -0
- package/src/routes/message-viewer.ts +4 -0
- package/src/routes/messages.ts +621 -0
- package/src/routes/notifications.ts +36 -0
- package/src/routes/orchestrator-bootstrap.ts +101 -0
- package/src/routes/orchestrator-host-registration.ts +125 -0
- package/src/routes/orchestrator-host-utilization.ts +255 -0
- package/src/routes/orchestrator-proxy.ts +174 -0
- package/src/routes/orchestrator.ts +699 -0
- package/src/routes/pairs.ts +214 -0
- package/src/routes/plans.ts +98 -0
- package/src/routes/project-onboarding.ts +56 -0
- package/src/routes/project-trust.ts +73 -0
- package/src/routes/projects.ts +296 -0
- package/src/routes/prompt-templates.ts +106 -0
- package/src/routes/provider-config.ts +233 -0
- package/src/routes/provider-quota-config.ts +48 -0
- package/src/routes/provider-quotas.ts +312 -0
- package/src/routes/provisioning-registry.ts +192 -0
- package/src/routes/recipes.ts +129 -0
- package/src/routes/restart-epochs.ts +98 -0
- package/src/routes/routing-policy.ts +30 -0
- package/src/routes/run-command.ts +25 -0
- package/src/routes/secrets-backup.ts +53 -0
- package/src/routes/secrets-import.ts +32 -0
- package/src/routes/secrets-page.ts +98 -0
- package/src/routes/secrets-vault.ts +121 -0
- package/src/routes/secrets.ts +165 -0
- package/src/routes/service-access.ts +57 -0
- package/src/routes/settings.ts +191 -0
- package/src/routes/shipping.ts +56 -0
- package/src/routes/spawn-policy.ts +299 -0
- package/src/routes/spec.ts +58 -0
- package/src/routes/sse.ts +18 -0
- package/src/routes/stats.ts +159 -0
- package/src/routes/steward.ts +49 -0
- package/src/routes/task-graph.ts +30 -0
- package/src/routes/task-http.ts +27 -0
- package/src/routes/task-issues.ts +81 -0
- package/src/routes/task-reads.ts +139 -0
- package/src/routes/task-validation.ts +22 -0
- package/src/routes/tasks.ts +553 -0
- package/src/routes/team-templates.ts +65 -0
- package/src/routes/teams-config.ts +15 -0
- package/src/routes/teams.ts +141 -0
- package/src/routes/token-usage.ts +167 -0
- package/src/routes/tokens.ts +393 -0
- package/src/routes/users.ts +248 -0
- package/src/routes/viewer-read.ts +27 -0
- package/src/routes/web-tool-calls.ts +38 -0
- package/src/routes/workflows.ts +142 -0
- package/src/routes/workspaces.ts +642 -0
- package/src/routes.ts +3 -0
- package/src/routing-eligibility.ts +42 -0
- package/src/routing-model-aliases.ts +21 -0
- package/src/routing-policy-normalize.ts +412 -0
- package/src/routing-policy-push.ts +154 -0
- package/src/routing-policy-service.ts +19 -0
- package/src/routing-policy-store.ts +16 -0
- package/src/routing-preferences.ts +82 -0
- package/src/routing-step-defaults.ts +31 -0
- package/src/runtime-grant.ts +164 -0
- package/src/runtime-prefix.ts +8 -0
- package/src/runtime-tokens.ts +404 -0
- package/src/search-query.ts +10 -0
- package/src/secret-keys.ts +24 -0
- package/src/secrets-broker/config.ts +53 -0
- package/src/secrets-broker/error.ts +8 -0
- package/src/secrets-broker/infisical.ts +259 -0
- package/src/secrets-broker/reader-infisical.ts +41 -0
- package/src/secrets-broker/reader.ts +101 -0
- package/src/secrets-broker/service.ts +242 -0
- package/src/secrets-broker/tool-credentials.ts +9 -0
- package/src/secrets-vault/backend-conformance.ts +26 -0
- package/src/secrets-vault/backend.ts +102 -0
- package/src/secrets-vault/backup.ts +103 -0
- package/src/secrets-vault/config.ts +7 -0
- package/src/secrets-vault/expiry.ts +10 -0
- package/src/secrets-vault/identity.ts +27 -0
- package/src/secrets-vault/import.ts +90 -0
- package/src/secrets-vault/key-files.ts +91 -0
- package/src/secrets-vault/keys.ts +79 -0
- package/src/secrets-vault/metadata.ts +51 -0
- package/src/secrets-vault/provider-env.ts +25 -0
- package/src/secrets-vault/resolve.ts +101 -0
- package/src/secrets-vault/restore.ts +57 -0
- package/src/secrets-vault/scope.ts +25 -0
- package/src/secrets-vault/service.ts +192 -0
- package/src/secrets-vault/shared.ts +10 -0
- package/src/security.ts +772 -0
- package/src/self-effort-rule.ts +36 -0
- package/src/self-resume-carry.ts +131 -0
- package/src/self-resume-command.ts +24 -0
- package/src/self-resume-config.ts +54 -0
- package/src/self-resume-identity.ts +40 -0
- package/src/self-resume-supersede.ts +19 -0
- package/src/self-resume.ts +884 -0
- package/src/server-background.ts +24 -0
- package/src/server.ts +726 -0
- package/src/service-access/config.ts +3 -0
- package/src/service-access/health.ts +151 -0
- package/src/service-access/host-health.ts +62 -0
- package/src/service-access/host.ts +63 -0
- package/src/service-access/operations.ts +21 -0
- package/src/service-access/policy.ts +30 -0
- package/src/service-access/probe.ts +62 -0
- package/src/service-access/request-logs.ts +93 -0
- package/src/service-access/scope.ts +7 -0
- package/src/service-access/service.ts +185 -0
- package/src/service-access/tokens.ts +174 -0
- package/src/service-access/validation.ts +75 -0
- package/src/service-access/vault.ts +59 -0
- package/src/services/agent-action.ts +238 -0
- package/src/services/agent-control-host.ts +74 -0
- package/src/services/agent-effort.ts +60 -0
- package/src/services/agent-hang-watchdog-job.ts +513 -0
- package/src/services/agent-hang-watchdog-wiring.ts +487 -0
- package/src/services/agent-hang-watchdog.ts +395 -0
- package/src/services/agent-keep.ts +72 -0
- package/src/services/agent-message-fanout.ts +91 -0
- package/src/services/agent-outstanding-work.ts +66 -0
- package/src/services/agent-reporting.ts +27 -0
- package/src/services/artifact-access.ts +39 -0
- package/src/services/artifact-multipart.ts +70 -0
- package/src/services/artifact-path-host.ts +55 -0
- package/src/services/artifact-read.ts +88 -0
- package/src/services/artifact-write.ts +25 -0
- package/src/services/auth-context.ts +117 -0
- package/src/services/automatic-disposal.ts +33 -0
- package/src/services/backlog.ts +149 -0
- package/src/services/browser-inventory.ts +52 -0
- package/src/services/browser-session-state.ts +41 -0
- package/src/services/browser-session.ts +167 -0
- package/src/services/bus-command-update.ts +84 -0
- package/src/services/bus-expiration-death.ts +57 -0
- package/src/services/canonical-root.ts +284 -0
- package/src/services/captured-delivery-gate.ts +12 -0
- package/src/services/carry-pending.ts +5 -0
- package/src/services/channel-binding-delete.ts +20 -0
- package/src/services/channel-suppression-receipt.ts +28 -0
- package/src/services/checkout-refresh-state.ts +18 -0
- package/src/services/checkout-refresh.test-fixture.ts +12 -0
- package/src/services/child-work-evidence.ts +77 -0
- package/src/services/claude-app.ts +91 -0
- package/src/services/command-claim-rejection.ts +23 -0
- package/src/services/command-host.ts +42 -0
- package/src/services/coordinator-digest.ts +30 -0
- package/src/services/decision-audience.ts +26 -0
- package/src/services/delivery-gate-policy.ts +98 -0
- package/src/services/delivery-tip.test-fixture.ts +25 -0
- package/src/services/diff-gate.ts +110 -0
- package/src/services/dispatch-command.ts +388 -0
- package/src/services/effective-launch-driver.ts +240 -0
- package/src/services/effective-launch-harness.ts +257 -0
- package/src/services/errors.ts +31 -0
- package/src/services/git-process.ts +176 -0
- package/src/services/git-remote.ts +100 -0
- package/src/services/harness-subagents.ts +12 -0
- package/src/services/host-changed-paths.test-fixture.ts +134 -0
- package/src/services/host-landing-placement.ts +65 -0
- package/src/services/host-project-readiness.ts +49 -0
- package/src/services/host-providers.ts +114 -0
- package/src/services/host-utilization.ts +70 -0
- package/src/services/idle-agent-digest.ts +318 -0
- package/src/services/idle-epics.ts +105 -0
- package/src/services/idle-self-care.ts +47 -0
- package/src/services/interrupt-agent.ts +146 -0
- package/src/services/isolated-workspace-placement.ts +258 -0
- package/src/services/issue-activity.ts +23 -0
- package/src/services/issue-associations.ts +72 -0
- package/src/services/issue-completion-drain.ts +24 -0
- package/src/services/issue-completion.ts +24 -0
- package/src/services/issue-lifecycle-comments.ts +12 -0
- package/src/services/issue-lifecycle.ts +620 -0
- package/src/services/issue-refs.ts +65 -0
- package/src/services/kernel-command-bridge.ts +219 -0
- package/src/services/kernel-control-host.ts +78 -0
- package/src/services/kernel-control-http.ts +119 -0
- package/src/services/kernel-control-mcp.ts +193 -0
- package/src/services/kernel-landing-command.ts +28 -0
- package/src/services/kernel-landing-ingress.ts +65 -0
- package/src/services/kernel-timers-authoritative-ingress.ts +48 -0
- package/src/services/kernel-timers-authz.ts +229 -0
- package/src/services/kernel-timers-command.ts +182 -0
- package/src/services/kernel-timers-cutover-chaos-worker.ts +211 -0
- package/src/services/kernel-timers-cutover.ts +39 -0
- package/src/services/kernel-timers-ingress-apply.ts +39 -0
- package/src/services/kernel-timers-ingress-chaos-worker.ts +312 -0
- package/src/services/kernel-timers-ingress.ts +702 -0
- package/src/services/kernel-timers-message-authority-chaos-worker.ts +97 -0
- package/src/services/kernel-timers-migrate.ts +158 -0
- package/src/services/kernel-timers-operator-chaos-worker.ts +259 -0
- package/src/services/kernel-timers-operator-preflight.ts +18 -0
- package/src/services/kernel-timers-operator.ts +424 -0
- package/src/services/kernel-timers-outbox.ts +138 -0
- package/src/services/kernel-timers-request-key-migration-chaos-worker.ts +80 -0
- package/src/services/kernel-timers-stage10-operator.ts +210 -0
- package/src/services/kernel-timers-stage10.ts +85 -0
- package/src/services/kernel-timers-stage9.ts +57 -0
- package/src/services/kernel-timers-transfer-chaos-worker.ts +118 -0
- package/src/services/kernel-timers-transfer.ts +525 -0
- package/src/services/kernel-timers-verifier.ts +39 -0
- package/src/services/kernel-timers.ts +247 -0
- package/src/services/land-boundary-settle.ts +32 -0
- package/src/services/land-gate-placement.ts +60 -0
- package/src/services/land-issue-relations.ts +46 -0
- package/src/services/land-restart-retry.ts +77 -0
- package/src/services/landed-ancestry.ts +417 -0
- package/src/services/landed-task-attribution.ts +14 -0
- package/src/services/landing-terminal-report.ts +119 -0
- package/src/services/legacy-landing-backfill.ts +159 -0
- package/src/services/legacy-landing-host.ts +291 -0
- package/src/services/legacy-landing-publication.ts +35 -0
- package/src/services/legacy-landing-recovery.ts +111 -0
- package/src/services/macos-privacy.ts +34 -0
- package/src/services/managed-running.ts +189 -0
- package/src/services/memory-areas.ts +172 -0
- package/src/services/memory-identity.ts +162 -0
- package/src/services/merge-pause.ts +37 -0
- package/src/services/message-delivery-actions.ts +11 -0
- package/src/services/operator-decisions.ts +260 -0
- package/src/services/orchestrator-landing-recovery.ts +55 -0
- package/src/services/orchestrator-registration-recovery.ts +12 -0
- package/src/services/orchestrator-upgrade.ts +83 -0
- package/src/services/parity-harness.ts +141 -0
- package/src/services/permission-decision.ts +129 -0
- package/src/services/plan-ci-recovery.ts +76 -0
- package/src/services/plan-conformance.ts +105 -0
- package/src/services/plan-dispatch-policy.ts +79 -0
- package/src/services/plan-dispatch.ts +372 -0
- package/src/services/plan-external-view.ts +7 -0
- package/src/services/plan-frontier.ts +34 -0
- package/src/services/plan-graph.ts +703 -0
- package/src/services/plan-import.ts +66 -0
- package/src/services/plan-live-bindings.ts +139 -0
- package/src/services/plan-task-create.ts +80 -0
- package/src/services/plan-terminal-refs.ts +83 -0
- package/src/services/plan-wake-digest.ts +88 -0
- package/src/services/plan-wake-policy.ts +12 -0
- package/src/services/profile-trust.ts +54 -0
- package/src/services/project-checkout-binding.ts +65 -0
- package/src/services/project-checkout-enrollment.ts +27 -0
- package/src/services/project-cwd.ts +41 -0
- package/src/services/project-onboarding.ts +165 -0
- package/src/services/project-repo-create.ts +27 -0
- package/src/services/project-role.test-fixture.ts +74 -0
- package/src/services/project.ts +191 -0
- package/src/services/prompt-templates.ts +46 -0
- package/src/services/prompt-version-writer.ts +42 -0
- package/src/services/provider-catalog.ts +7 -0
- package/src/services/provider-hold-flap.ts +130 -0
- package/src/services/provider-hold-nudge.ts +191 -0
- package/src/services/provider-hold-record.ts +137 -0
- package/src/services/provider-state-audit.ts +214 -0
- package/src/services/provisioning-harness/analyze.ts +285 -0
- package/src/services/provisioning-harness/budget-baseline.json +391 -0
- package/src/services/provisioning-harness/capture.ts +197 -0
- package/src/services/provisioning-harness/config.ts +55 -0
- package/src/services/provisioning-harness/context-sources.ts +85 -0
- package/src/services/provisioning-harness/driver.ts +156 -0
- package/src/services/provisioning-harness/expect.ts +81 -0
- package/src/services/provisioning-harness/fixture-matrix.ts +38 -0
- package/src/services/provisioning-harness/fixtures/project/.agent-relay/land-gates.json +1 -0
- package/src/services/provisioning-harness/fixtures/project/.claude/skills/harness-skill/SKILL.md +6 -0
- package/src/services/provisioning-harness/fixtures/project/.mcp.json +1 -0
- package/src/services/provisioning-harness/fixtures/project/AGENTS.md +1 -0
- package/src/services/provisioning-harness/fixtures/project/CLAUDE.md +1 -0
- package/src/services/provisioning-harness/fixtures/project/mcp-server.ts +33 -0
- package/src/services/provisioning-harness/fixtures/provider-home/AGENTS.md +1 -0
- package/src/services/provisioning-harness/fixtures/provider-home/CLAUDE.md +1 -0
- package/src/services/provisioning-harness/host-fixtures.ts +25 -0
- package/src/services/provisioning-harness/index.ts +4 -0
- package/src/services/provisioning-harness/inventory-types.ts +8 -0
- package/src/services/provisioning-harness/inventory.ts +33 -0
- package/src/services/provisioning-harness/lifecycle.ts +193 -0
- package/src/services/provisioning-harness/live.ts +61 -0
- package/src/services/provisioning-harness/manifests.ts +118 -0
- package/src/services/provisioning-harness/prepare.ts +113 -0
- package/src/services/provisioning-harness/redundancy-report.ts +32 -0
- package/src/services/provisioning-harness/redundancy.ts +137 -0
- package/src/services/provisioning-harness/report.ts +129 -0
- package/src/services/provisioning-harness/types.ts +174 -0
- package/src/services/provisioning-registry.ts +15 -0
- package/src/services/rate-limit-resume.ts +220 -0
- package/src/services/reap-verdict.ts +52 -0
- package/src/services/red-main-auto-revert.ts +103 -0
- package/src/services/red-main-controller-deps.ts +80 -0
- package/src/services/red-main-controller.ts +262 -0
- package/src/services/red-main-incident.ts +44 -0
- package/src/services/red-main-quarantine.ts +92 -0
- package/src/services/register-agent.ts +447 -0
- package/src/services/release-readiness.ts +219 -0
- package/src/services/reported-exit-death.ts +29 -0
- package/src/services/response-report-admission.ts +17 -0
- package/src/services/restart-epoch-driver.ts +290 -0
- package/src/services/restart-epoch-reconciler.ts +326 -0
- package/src/services/restart-epoch-stale-command-recovery.ts +133 -0
- package/src/services/restart-instructions.ts +86 -0
- package/src/services/restart-project-role.ts +74 -0
- package/src/services/restart-secret-refs.ts +14 -0
- package/src/services/restart-spawn.ts +510 -0
- package/src/services/review-publish.ts +76 -0
- package/src/services/review-ref-reconcile.ts +337 -0
- package/src/services/run-command-input.ts +22 -0
- package/src/services/run-command.ts +510 -0
- package/src/services/run-completion-message.ts +70 -0
- package/src/services/run-log.ts +212 -0
- package/src/services/run-queue.ts +63 -0
- package/src/services/scheduler-command-cancel.ts +49 -0
- package/src/services/scheduler-command.ts +590 -0
- package/src/services/scheduler-create.ts +25 -0
- package/src/services/scheduler-plan.ts +202 -0
- package/src/services/scheduler-recovery.ts +31 -0
- package/src/services/scheduler.ts +406 -0
- package/src/services/self-care-state.ts +10 -0
- package/src/services/self-effort-grant.ts +93 -0
- package/src/services/self-effort.ts +152 -0
- package/src/services/send-message.ts +548 -0
- package/src/services/server-credentials.ts +53 -0
- package/src/services/shipping-board.ts +111 -0
- package/src/services/shipping-project-config.ts +86 -0
- package/src/services/shipping-stats.ts +86 -0
- package/src/services/shutdown-agent.ts +463 -0
- package/src/services/shutdown-watchdog.ts +119 -0
- package/src/services/spawn-agent.ts +967 -0
- package/src/services/spawn-approval.ts +26 -0
- package/src/services/spawn-brief.ts +39 -0
- package/src/services/spawn-chain-inspector.ts +286 -0
- package/src/services/spawn-cwd-placement.ts +250 -0
- package/src/services/spawn-identity.ts +127 -0
- package/src/services/spawn-instruction-inputs.ts +114 -0
- package/src/services/spawn-issue-activity.ts +102 -0
- package/src/services/spawn-launch-decision.ts +32 -0
- package/src/services/spawn-launch.ts +116 -0
- package/src/services/spawn-loss-escalation.ts +253 -0
- package/src/services/spawn-placement.test-fixture.ts +30 -0
- package/src/services/spawn-project-role.ts +133 -0
- package/src/services/spawn-registration-watchdog.ts +352 -0
- package/src/services/spawn-replay.ts +61 -0
- package/src/services/spawn-repo-probe.ts +118 -0
- package/src/services/spawn-tree-cleanup.ts +37 -0
- package/src/services/spawn-warnings.ts +13 -0
- package/src/services/steward-reaper.ts +244 -0
- package/src/services/task-context-hydration.ts +413 -0
- package/src/services/task-delivery-close.ts +26 -0
- package/src/services/task-delivery-event.ts +11 -0
- package/src/services/task-delivery-land-policy.ts +35 -0
- package/src/services/task-delivery-summary.ts +38 -0
- package/src/services/task-delivery.ts +762 -0
- package/src/services/task-dependency-graph.ts +116 -0
- package/src/services/task-dispatch.ts +178 -0
- package/src/services/task-done-when.ts +45 -0
- package/src/services/task-entity.ts +758 -0
- package/src/services/task-from-issue.ts +80 -0
- package/src/services/task-issue-digest.ts +45 -0
- package/src/services/task-issue-link.ts +158 -0
- package/src/services/task-issue-weave.ts +570 -0
- package/src/services/task-land-withdraw.ts +462 -0
- package/src/services/task-lifecycle.ts +668 -0
- package/src/services/task-nothing-to-land.ts +37 -0
- package/src/services/task-plan-view.ts +172 -0
- package/src/services/task-review-hold.ts +244 -0
- package/src/services/task-semantic-events.ts +396 -0
- package/src/services/task-stage-wake.ts +15 -0
- package/src/services/task-state-reconcile.ts +169 -0
- package/src/services/task-validation.ts +42 -0
- package/src/services/team-claim-race.worker.ts +72 -0
- package/src/services/team-spawn-delegation.ts +30 -0
- package/src/services/team-templates.ts +172 -0
- package/src/services/team.ts +320 -0
- package/src/services/terminal-provider-exit.ts +57 -0
- package/src/services/timer-message-fire-chaos-worker.ts +29 -0
- package/src/services/timer-message-fire-outbox.ts +184 -0
- package/src/services/transient-agent-reaper.ts +412 -0
- package/src/services/turn-reconcile-audit.ts +236 -0
- package/src/services/user-onboarding.ts +98 -0
- package/src/services/user-profile.ts +57 -0
- package/src/services/web-search.ts +83 -0
- package/src/services/web-tool-calls.ts +65 -0
- package/src/services/withdraw-steward.ts +57 -0
- package/src/services/work-finality.ts +34 -0
- package/src/services/workflow-agent-obligation.ts +35 -0
- package/src/services/workflow-auto-start.ts +126 -0
- package/src/services/workflow-backstop.ts +38 -0
- package/src/services/workflow-budget.test-fixture.ts +10 -0
- package/src/services/workflow-caller.ts +32 -0
- package/src/services/workflow-catalog.ts +43 -0
- package/src/services/workflow-child-proof-worker.ts +76 -0
- package/src/services/workflow-child.test-fixture.ts +51 -0
- package/src/services/workflow-ci-main.ts +93 -0
- package/src/services/workflow-control-proof-worker.ts +149 -0
- package/src/services/workflow-coordinator-decision-proof-worker.ts +123 -0
- package/src/services/workflow-coordinator.ts +8 -0
- package/src/services/workflow-decision-answer.ts +18 -0
- package/src/services/workflow-decision-proof-worker.ts +92 -0
- package/src/services/workflow-decision.test-fixture.ts +58 -0
- package/src/services/workflow-decisions.ts +107 -0
- package/src/services/workflow-deferred-cleanup.ts +40 -0
- package/src/services/workflow-dispatch-result.ts +20 -0
- package/src/services/workflow-effect-driver.ts +165 -0
- package/src/services/workflow-effects.ts +544 -0
- package/src/services/workflow-foreach-proof-worker.ts +209 -0
- package/src/services/workflow-land-notice.ts +18 -0
- package/src/services/workflow-land.ts +105 -0
- package/src/services/workflow-notice.ts +32 -0
- package/src/services/workflow-overdue-notice.ts +19 -0
- package/src/services/workflow-pins.ts +162 -0
- package/src/services/workflow-reconcile.ts +210 -0
- package/src/services/workflow-resume-pins.ts +30 -0
- package/src/services/workflow-run-chaos-worker.ts +67 -0
- package/src/services/workflow-run-view.ts +71 -0
- package/src/services/workflow-run.test-fixture.ts +165 -0
- package/src/services/workflow-runs.ts +370 -0
- package/src/services/workflow-scripts.ts +100 -0
- package/src/services/workflow-slice-proof.ts +14 -0
- package/src/services/workflow-stats.ts +208 -0
- package/src/services/workflow-supervisor-state.ts +117 -0
- package/src/services/workflow-supervisor.ts +122 -0
- package/src/services/workflow-verification.ts +68 -0
- package/src/services/workspace-recovery.ts +168 -0
- package/src/services/workspace-task-binding.ts +22 -0
- package/src/settings/modules.ts +149 -0
- package/src/settings/registry.ts +629 -0
- package/src/settings/user-settings.ts +81 -0
- package/src/setup.ts +199 -0
- package/src/shared-mcp.ts +87 -0
- package/src/shutdown.ts +33 -0
- package/src/spawn-admission.ts +48 -0
- package/src/spawn-budget.ts +18 -0
- package/src/spawn-command.ts +373 -0
- package/src/spawn-env.ts +27 -0
- package/src/spawn-intent.ts +17 -0
- package/src/spawn-lease.ts +41 -0
- package/src/spawn-models.ts +22 -0
- package/src/spawn-placement.ts +348 -0
- package/src/spawn-profile-errors.ts +9 -0
- package/src/spawn-quota.ts +15 -0
- package/src/spawn-targets.ts +679 -0
- package/src/sse-agent-status.ts +35 -0
- package/src/sse-outbox-cursor.ts +28 -0
- package/src/sse-visibility.ts +36 -0
- package/src/sse.ts +684 -0
- package/src/startup-context-injection.ts +518 -0
- package/src/startup-timing.ts +30 -0
- package/src/state-adoption/artifacts.ts +27 -0
- package/src/state-adoption/cd-cutover.ts +125 -0
- package/src/state-adoption/files.ts +31 -0
- package/src/state-adoption/index.ts +166 -0
- package/src/state-adoption/linux-plan.ts +67 -0
- package/src/state-adoption/linux.ts +104 -0
- package/src/state-adoption/macos-plan.ts +58 -0
- package/src/state-adoption/macos.ts +112 -0
- package/src/steward-claim-release.ts +38 -0
- package/src/steward-handoff.ts +28 -0
- package/src/steward-identity.ts +54 -0
- package/src/steward-policy-cleanup.ts +222 -0
- package/src/steward-policy-model-reconcile.ts +33 -0
- package/src/steward-policy-name.ts +13 -0
- package/src/steward-provenance.ts +59 -0
- package/src/steward-queue.ts +85 -0
- package/src/steward-slot-recovery.ts +34 -0
- package/src/steward-spawn-guard.ts +344 -0
- package/src/steward.test-fixture.ts +11 -0
- package/src/steward.ts +199 -0
- package/src/stream-proxy.ts +84 -0
- package/src/task-authz.ts +40 -0
- package/src/task-completion.ts +39 -0
- package/src/task-dispatch-live.ts +70 -0
- package/src/task-dispatcher-ranking.ts +136 -0
- package/src/task-dispatcher.ts +841 -0
- package/src/task-owner-notices.ts +35 -0
- package/src/task-owner.ts +63 -0
- package/src/task-plan-status.ts +21 -0
- package/src/task-verification.ts +35 -0
- package/src/team-idle-tracker.ts +39 -0
- package/src/team-template-config.ts +100 -0
- package/src/teams-config-store.ts +22 -0
- package/src/terminal-authz.ts +49 -0
- package/src/token-db-write.ts +44 -0
- package/src/token-db.ts +487 -0
- package/src/token-usage-async.ts +40 -0
- package/src/transport-subscriptions.ts +57 -0
- package/src/types.ts +1 -0
- package/src/upgrade-install-verify.ts +179 -0
- package/src/upgrade-local-id.ts +3 -0
- package/src/upgrade-services.ts +125 -0
- package/src/upgrade.ts +1006 -0
- package/src/user-awaiting-reply.ts +42 -0
- package/src/user-path.ts +246 -0
- package/src/user-settings-async.ts +33 -0
- package/src/user-settings-store.ts +106 -0
- package/src/user-style.ts +83 -0
- package/src/utils.ts +42 -0
- package/src/validation.ts +324 -0
- package/src/vault-backup-config.ts +28 -0
- package/src/vault-expiry-config.ts +12 -0
- package/src/versioned-prompts.ts +57 -0
- package/src/workflow-capabilities.ts +10 -0
- package/src/workflow-prompt-templates.ts +20 -0
- package/src/workspace-action-audit.ts +42 -0
- package/src/workspace-actions.ts +689 -0
- package/src/workspace-auto-merge.ts +1055 -0
- package/src/workspace-changed-paths-client.ts +97 -0
- package/src/workspace-claim.ts +45 -0
- package/src/workspace-cleanup-settle.ts +51 -0
- package/src/workspace-cleanup-stale.ts +231 -0
- package/src/workspace-command-settle.ts +589 -0
- package/src/workspace-config.ts +7 -0
- package/src/workspace-conflict-resolver.ts +182 -0
- package/src/workspace-dead-owner-recovery.ts +19 -0
- package/src/workspace-delivery-tip.ts +51 -0
- package/src/workspace-escalation.ts +107 -0
- package/src/workspace-git-state-client.ts +42 -0
- package/src/workspace-host-client.ts +86 -0
- package/src/workspace-host-target.ts +5 -0
- package/src/workspace-host.ts +61 -0
- package/src/workspace-human-escalation.ts +70 -0
- package/src/workspace-land-gate-watchdog.ts +76 -0
- package/src/workspace-land-gate.ts +99 -0
- package/src/workspace-land-result.ts +12 -0
- package/src/workspace-land-retry.ts +82 -0
- package/src/workspace-land-stopped.ts +57 -0
- package/src/workspace-merge-dispatch.ts +27 -0
- package/src/workspace-merge-progress.ts +369 -0
- package/src/workspace-merge-retry-policy.ts +59 -0
- package/src/workspace-merge.ts +614 -0
- package/src/workspace-nothing-to-land-notice.ts +27 -0
- package/src/workspace-orphans.ts +927 -0
- package/src/workspace-phase.ts +507 -0
- package/src/workspace-pr-completion.ts +285 -0
- package/src/workspace-probe.ts +212 -0
- package/src/workspace-recorded-land.ts +47 -0
- package/src/workspace-recovery-authz.ts +88 -0
- package/src/workspace-rekey.ts +106 -0
- package/src/workspace-steward-authority.ts +16 -0
- package/src/workspace-steward-failure.ts +42 -0
- package/src/workspace-steward-wake.ts +150 -0
- package/src/workspace-steward-watchdog.ts +240 -0
|
@@ -0,0 +1,1201 @@
|
|
|
1
|
+
import { reportVerbosityOf } from "../report-verbosity";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import {
|
|
4
|
+
hasWorkFinality,
|
|
5
|
+
isRecord,
|
|
6
|
+
isTurnFinalSession,
|
|
7
|
+
stringValue,
|
|
8
|
+
USER_NAMESPACE_PREFIX,
|
|
9
|
+
isMechanicalMessageKind,
|
|
10
|
+
type MessagePayload,
|
|
11
|
+
type MessageWorkFinality,
|
|
12
|
+
type MessageWorkFinalitySource,
|
|
13
|
+
} from "@humwick/sdk";
|
|
14
|
+
import { LIFECYCLE_STATE_WORKING, childSignalKey, stampLifecycleSignal, taskSignalKey } from "../lifecycle-signal-registry";
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
import { CLAIM_LEASE_MS, DEFAULT_FANOUT_TTL_SECONDS } from "../config";
|
|
20
|
+
import { messageMatchesAgent } from "../agent-ref";
|
|
21
|
+
import { isFanoutTarget } from "../channel-target";
|
|
22
|
+
import { getAgent, validateAgentSession } from "./agents.ts";
|
|
23
|
+
import { getUser } from "./users.ts";
|
|
24
|
+
import { canonicalLineageReportTarget, currentCoordinatorOf, delegatedCoordinatorTarget, resolveTeamCoordinatorAgentId } from "./coordinator-seat.ts";
|
|
25
|
+
import { getTeam, isClaimableTeam } from "./teams.ts";
|
|
26
|
+
import { cleanAttachmentRefs, linkMessageArtifacts, validateAttachmentRefs } from "./artifacts.ts";
|
|
27
|
+
import { ClaimError, ValidationError, getDb, writeTransaction } from "./connection.ts";
|
|
28
|
+
import { CHANNEL_SUPPRESSION_REASON, isDisallowedChannelContent } from "./channel-egress-allowlist.ts";
|
|
29
|
+
import { enforceQueueLimit, isChannelAgentId, isChannelEgressTarget, matchingDeliveryAgents } from "./delivery.ts";
|
|
30
|
+
import { isAgentUnavailable } from "./agent-predicates.ts";
|
|
31
|
+
import { MSG_SELECT, normalizeReactionEmoji, rowToMessage } from "./mappers.ts";
|
|
32
|
+
import { admitUrgentMessage } from "./urgent-intake.ts";
|
|
33
|
+
import { claimMessageRow } from "./message-claims.ts";
|
|
34
|
+
import { firstMessageIdSince, getMessage } from "./message-queries.ts";
|
|
35
|
+
import { deferLineageReport, takeDeferredLineageReports } from "./deferred-lineage-reports.ts";
|
|
36
|
+
import { REPORT_SUPPRESSION_REASON, decideReportSuppression, isReportSuppressed, notReportSuppressedSql } from "./report-suppression.ts";
|
|
37
|
+
import { childTaskIds, lineageDeliveryCoversCapture } from "./delivery-report-echo.ts";
|
|
38
|
+
import { LINEAGE_REPORT_BY_TURN_SQL, RECENT_EXPLICIT_LINEAGE_DUPLICATE_SQL, RECENT_LINEAGE_REPORT_SQL, TURN_EXPLICIT_REPORT_SQL, sameTurnExplicitReportSql } from "./lineage-pair-dedupe-sql.ts";
|
|
39
|
+
import { markRead } from "./message-read-mark.ts";
|
|
40
|
+
import { closeReplyObligationsOnInsert } from "./reply-obligations.ts";
|
|
41
|
+
import { settlesAsHistory } from "./history-delivery-settle.ts";
|
|
42
|
+
import { stampWorkflowContact } from "./workflow-contact.ts";
|
|
43
|
+
import { clearCoordinatorDigestRouting, enqueueCoordinatorDigest, prepareCoordinatorDigest } from "./coordinator-digest";
|
|
44
|
+
import { childStreamSubscribed, type ChildStream } from "./notification-subscriptions.ts";
|
|
45
|
+
import { runningAgentForPolicy } from "./policy-runtime.ts";
|
|
46
|
+
import { getTask, releaseExpiredClaimsBody } from "./tasks.ts";
|
|
47
|
+
import { insertTaskEvent, claimTaskWhere, CLAIM_TASK_KIND } from "./task-core.ts";
|
|
48
|
+
import type {
|
|
49
|
+
AgentCard,
|
|
50
|
+
AgentSessionGuard,
|
|
51
|
+
Message,
|
|
52
|
+
SendMessageInput,
|
|
53
|
+
Task,
|
|
54
|
+
} from "../types";
|
|
55
|
+
|
|
56
|
+
export { claimMessageRow } from "./message-claims.ts";
|
|
57
|
+
export { getMessage } from "./message-queries.ts";
|
|
58
|
+
export { runningAgentForPolicy } from "./policy-runtime.ts";
|
|
59
|
+
|
|
60
|
+
export function findMessageByIdempotencyKey(from: string, key: string): Message | null {
|
|
61
|
+
const row = getDb()
|
|
62
|
+
.query(`${MSG_SELECT} WHERE m.from_agent = ? AND m.idempotency_key = ? LIMIT 1`)
|
|
63
|
+
.get(from, key) as any;
|
|
64
|
+
return row ? rowToMessage(row) : null;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function sessionStepId(payload: Record<string, unknown> | undefined): string | undefined {
|
|
68
|
+
const session = isRecord(payload?.session) ? payload.session : undefined;
|
|
69
|
+
return stringValue(session?.stepId);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function normalizeMessagePayload(payload: MessagePayload | undefined): MessagePayload {
|
|
73
|
+
const original = payload ?? {};
|
|
74
|
+
let next: MessagePayload = original;
|
|
75
|
+
for (const key of ["session", "responseCapture"] as const) {
|
|
76
|
+
const value = next[key];
|
|
77
|
+
if (!isTurnFinalSession(value)) continue;
|
|
78
|
+
if (value.turnFinal === true && value.final === true) continue;
|
|
79
|
+
if (next === original) next = { ...original };
|
|
80
|
+
next[key] = { ...value, turnFinal: true, final: true };
|
|
81
|
+
}
|
|
82
|
+
return next;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Codex session-mirror upsert (#parity): a provider step that emits more than once — a
|
|
87
|
+
* tool's running→completed lifecycle, a reasoning/response row that streams — carries a
|
|
88
|
+
* stable `payload.session.stepId`. Instead of appending a second row (which renders as a
|
|
89
|
+
* duplicate on dashboard reload), update the EXISTING row in place: same DB id, so the
|
|
90
|
+
* dashboard's id-keyed merge replaces it. Gated on stepId presence + matching step, so the
|
|
91
|
+
* Claude transcript path (no stepId) is byte-identical. The row keeps the first event's
|
|
92
|
+
* occurredAt so long-running tools stay anchored at their start; completion time rides in
|
|
93
|
+
* payload.session.completedAt. Lifecycle rank still prevents a late running retry from
|
|
94
|
+
* clobbering an already-completed row.
|
|
95
|
+
*/
|
|
96
|
+
function upsertSessionStepInPlace(existing: Message, input: SendMessageInput, now: number): Message | null {
|
|
97
|
+
const incomingStep = sessionStepId(input.payload);
|
|
98
|
+
if (!incomingStep) return null;
|
|
99
|
+
if (existing.kind !== "session") return null;
|
|
100
|
+
if (sessionStepId(existing.payload) !== incomingStep) return null;
|
|
101
|
+
const incomingAt = sanitizeOccurredAt(input.occurredAt, now) ?? now;
|
|
102
|
+
if (sessionStepStatusRank(input.payload) < sessionStepStatusRank(existing.payload)) return null;
|
|
103
|
+
const payload = sessionPayloadWithCompletion(input.payload, incomingAt);
|
|
104
|
+
getDb().query("UPDATE messages SET body = ?, payload = ? WHERE id = ?").run(input.body, JSON.stringify(payload), existing.id);
|
|
105
|
+
return getMessage(existing.id);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// #2354 — `cancelled` (an interrupted-before-finished tool) ranks with `completed`/`failed` as a
|
|
109
|
+
// TERMINAL outcome: a late `running` retry must never clobber it, and it carries a `completedAt`.
|
|
110
|
+
function isTerminalSessionStepStatus(status: string | undefined): boolean {
|
|
111
|
+
return status === "completed" || status === "failed" || status === "cancelled";
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function sessionStepStatusRank(payload: MessagePayload | undefined): number {
|
|
115
|
+
const status = stringValue(isRecord(payload?.session) ? payload.session.status : undefined);
|
|
116
|
+
return isTerminalSessionStepStatus(status) ? 2 : status === "running" ? 1 : 0;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function sessionPayloadWithCompletion(payload: MessagePayload | undefined, completedAt: number): MessagePayload {
|
|
120
|
+
const original = payload ?? {};
|
|
121
|
+
const session = isRecord(original.session) ? original.session : undefined;
|
|
122
|
+
const status = stringValue(session?.status);
|
|
123
|
+
return isTerminalSessionStepStatus(status) ? { ...original, session: { ...session, completedAt } } : original;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function policyNameFromTarget(target: string): string | null {
|
|
127
|
+
if (!target.startsWith("policy:")) return null;
|
|
128
|
+
const name = target.slice("policy:".length).trim();
|
|
129
|
+
return name || null;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function spawnPolicyExists(policyName: string): boolean {
|
|
133
|
+
const row = getDb().query("SELECT 1 FROM config WHERE namespace = 'spawn-policy' AND key = ?").get(policyName);
|
|
134
|
+
return Boolean(row);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function claimableAllowedForTarget(target: string): boolean {
|
|
138
|
+
return matchingDeliveryAgents(target).length > 1;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function shouldStoreClaimable(input: SendMessageInput): boolean {
|
|
142
|
+
if (!input.claimable) return false;
|
|
143
|
+
if (input.kind === "task" || input.kind === "system") return true;
|
|
144
|
+
if (input.kind === "channel.event") return true;
|
|
145
|
+
return claimableAllowedForTarget(input.to);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function inferMessageKind(input: SendMessageInput): Message["kind"] {
|
|
149
|
+
if (input.kind) return input.kind;
|
|
150
|
+
if (input.claimable) return "task";
|
|
151
|
+
if (isChannelAgentId(input.from) || isChannelAgentId(input.to)) return "channel.event";
|
|
152
|
+
return "chat";
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const REPLY_DUPLICATE_WINDOW_MS = 2 * 60 * 1000;
|
|
156
|
+
const LINEAGE_REPORT_DUPLICATE_WINDOW_MS = 2 * 60 * 1000;
|
|
157
|
+
// MED-2 (r2 review): out-of-order session delivery across a turn boundary is only ever a few
|
|
158
|
+
// seconds of skew; anything wider means the explicit belongs to the NEXT turn (fail open).
|
|
159
|
+
const TURN_ORDER_SKEW_MS = 5 * 1000;
|
|
160
|
+
|
|
161
|
+
function findRecentDuplicateReply(input: SendMessageInput, threadId: number | null, now: number, hasAttachments: boolean): Message | null {
|
|
162
|
+
if (!input.replyTo || threadId === null || hasAttachments) return null;
|
|
163
|
+
const kind = inferMessageKind(input);
|
|
164
|
+
const row = getDb().query(`
|
|
165
|
+
${MSG_SELECT}
|
|
166
|
+
WHERE m.from_agent = ?
|
|
167
|
+
AND m.to_target = ?
|
|
168
|
+
AND m.kind = ?
|
|
169
|
+
AND m.thread_id = ?
|
|
170
|
+
AND m.body = ?
|
|
171
|
+
AND coalesce(m.subject, '') = coalesce(?, '')
|
|
172
|
+
AND coalesce(m.channel, '') = coalesce(?, '')
|
|
173
|
+
AND m.created_at >= ?
|
|
174
|
+
AND ${notReportSuppressedSql("m")}
|
|
175
|
+
ORDER BY m.created_at DESC
|
|
176
|
+
LIMIT 1
|
|
177
|
+
`).get(
|
|
178
|
+
input.from,
|
|
179
|
+
input.to,
|
|
180
|
+
kind,
|
|
181
|
+
threadId,
|
|
182
|
+
input.body,
|
|
183
|
+
input.subject ?? null,
|
|
184
|
+
input.channel ?? null,
|
|
185
|
+
now - REPLY_DUPLICATE_WINDOW_MS,
|
|
186
|
+
) as any;
|
|
187
|
+
return row ? rowToMessage(row) : null;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function sessionMeta(input: Message | SendMessageInput): Record<string, unknown> | undefined {
|
|
191
|
+
return isRecord(input.payload?.session) ? input.payload.session : undefined;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function responseCaptureMeta(input: Message | SendMessageInput): Record<string, unknown> | undefined {
|
|
195
|
+
return isRecord(input.payload?.responseCapture) ? input.payload.responseCapture : undefined;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function isFinalSessionResponse(session: Record<string, unknown>): boolean {
|
|
199
|
+
return session.type === "response" && isTurnFinalSession(session);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function childStreamForSession(session: Record<string, unknown>): ChildStream | null {
|
|
203
|
+
if (session.type === "response") return "responses";
|
|
204
|
+
if (session.type === "tool") return "toolCalls";
|
|
205
|
+
if (session.type === "reasoning") return "reasoning";
|
|
206
|
+
if (session.type === "narration" || session.type === "narrative") return "narrative";
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function captureTurnId(capture: Record<string, unknown>): string | undefined {
|
|
211
|
+
return stringValue(capture.turnId);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function lineageResponseTurnId(message: Message, session: Record<string, unknown>): string {
|
|
215
|
+
return stringValue(session.turnId) ?? `message-${message.id}`;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function lineageResponseReportKeyForTurn(childId: string, turnId: string): string {
|
|
219
|
+
return `response-report:${childId}:${turnId}`;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function lineageResponseReportKey(message: Message, session: Record<string, unknown>): string {
|
|
223
|
+
return lineageResponseReportKeyForTurn(message.from, lineageResponseTurnId(message, session));
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function lineageStreamTurnId(message: Message, session: Record<string, unknown>): string {
|
|
227
|
+
return stringValue(session.turnId) ?? `message-${message.id}`;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function lineageStreamEventId(message: Message, session: Record<string, unknown>): string {
|
|
231
|
+
const occurredAt = typeof session.completedAt === "number" && Number.isFinite(session.completedAt) ? Math.floor(session.completedAt) : message.occurredAt ?? message.createdAt;
|
|
232
|
+
const stepId = stringValue(session.stepId);
|
|
233
|
+
return stepId ? `${stepId}:${occurredAt}` : `message:${occurredAt}`;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function lineageStreamReportKey(message: Message, session: Record<string, unknown>, stream: ChildStream): string {
|
|
237
|
+
if (stream === "responses") return lineageResponseReportKey(message, session);
|
|
238
|
+
return `${stream}-report:${message.from}:${lineageStreamTurnId(message, session)}:${lineageStreamEventId(message, session)}`;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function findLineageReportByTurn(input: {
|
|
242
|
+
from: string;
|
|
243
|
+
to: string;
|
|
244
|
+
turnId: string;
|
|
245
|
+
since: number;
|
|
246
|
+
}): Message | null {
|
|
247
|
+
const lineageKey = lineageResponseReportKeyForTurn(input.from, input.turnId);
|
|
248
|
+
const row = getDb().query(LINEAGE_REPORT_BY_TURN_SQL).get(
|
|
249
|
+
input.from,
|
|
250
|
+
input.to,
|
|
251
|
+
input.since,
|
|
252
|
+
lineageKey,
|
|
253
|
+
`response-report:${input.from}:%:${input.turnId}`,
|
|
254
|
+
input.turnId,
|
|
255
|
+
) as any;
|
|
256
|
+
return row ? rowToMessage(row) : null;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function findRecentLineageReport(input: SendMessageInput, now: number): Message | null {
|
|
260
|
+
if ((input.kind ?? "chat") !== "chat") return null;
|
|
261
|
+
const from = input.from;
|
|
262
|
+
const to = input.to;
|
|
263
|
+
if (!from || !to) return null;
|
|
264
|
+
const child = getAgent(from);
|
|
265
|
+
if (!child?.spawnedBy || (child.spawnedBy !== to && currentCoordinatorOf(child) !== to && delegatedCoordinatorTarget(child) !== to)) return null;
|
|
266
|
+
const responseCapture = responseCaptureMeta(input);
|
|
267
|
+
const turnId = responseCapture ? captureTurnId(responseCapture) : undefined;
|
|
268
|
+
if (turnId) {
|
|
269
|
+
const duplicate = findLineageReportByTurn({
|
|
270
|
+
from,
|
|
271
|
+
to,
|
|
272
|
+
turnId,
|
|
273
|
+
since: now - LINEAGE_REPORT_DUPLICATE_WINDOW_MS,
|
|
274
|
+
});
|
|
275
|
+
if (duplicate) return duplicate;
|
|
276
|
+
}
|
|
277
|
+
if (responseCapture) return null;
|
|
278
|
+
const row = getDb().query(RECENT_LINEAGE_REPORT_SQL).get(from, to, input.body, now - LINEAGE_REPORT_DUPLICATE_WINDOW_MS, `response-report:${from}:%`) as any;
|
|
279
|
+
return row ? rowToMessage(row) : null;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// T4458 (Edin's rule #2844 1a) — the sender's currently-open provider turn: the newest
|
|
283
|
+
// session turnId with no final row yet and a row inside the duplicate window (a live turn
|
|
284
|
+
// streams constantly). Lets a mid-turn explicit carry its turn exactly; a closed, stale or
|
|
285
|
+
// absent turn yields undefined and the forward keeps today's content checks.
|
|
286
|
+
export function senderOpenTurnId(sender: string, now: number): string | undefined {
|
|
287
|
+
const since = now - LINEAGE_REPORT_DUPLICATE_WINDOW_MS;
|
|
288
|
+
// MED-3: seed one id bound from the created_at index so both queries below range
|
|
289
|
+
// idx_msg_from_id on (from_agent, id) instead of filtering created_at per row.
|
|
290
|
+
const bound = firstMessageIdSince(since);
|
|
291
|
+
if (bound === null) return undefined;
|
|
292
|
+
const row = getDb().query(`
|
|
293
|
+
SELECT json_extract(payload, '$.session.turnId') AS turnId
|
|
294
|
+
FROM messages
|
|
295
|
+
WHERE from_agent = ? AND kind = 'session' AND id >= ?
|
|
296
|
+
AND json_extract(payload, '$.session.turnId') IS NOT NULL
|
|
297
|
+
AND created_at >= ?
|
|
298
|
+
GROUP BY turnId
|
|
299
|
+
ORDER BY MAX(created_at) DESC
|
|
300
|
+
LIMIT 1
|
|
301
|
+
`).get(sender, bound, since) as { turnId: string } | undefined;
|
|
302
|
+
if (!row?.turnId) return undefined;
|
|
303
|
+
// Time-bound like the turn search above — never a full-sender scan with json_extract
|
|
304
|
+
// inside the writer txn. A final older than the window with a newer live row is pathological.
|
|
305
|
+
const closed = getDb().query(`
|
|
306
|
+
SELECT 1 FROM messages
|
|
307
|
+
WHERE from_agent = ? AND kind = 'session' AND id >= ?
|
|
308
|
+
AND json_extract(payload, '$.session.turnId') = ?
|
|
309
|
+
AND (json_extract(payload, '$.session.final') = 1 OR json_extract(payload, '$.session.turnFinal') = 1)
|
|
310
|
+
AND created_at >= ?
|
|
311
|
+
LIMIT 1
|
|
312
|
+
`).get(sender, bound, row.turnId, since);
|
|
313
|
+
return closed ? undefined : row.turnId;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// #2844 — unknown-turn fallback: an explicit already carrying this capture's news, newest
|
|
317
|
+
// first. Only the explicit-includes-capture direction adopts; a stamped same-turn explicit is
|
|
318
|
+
// adopted by exact turn equality instead. Bare acks and `responseCapture` rows never count.
|
|
319
|
+
const SAME_TURN_MIN_CHARS = 16;
|
|
320
|
+
|
|
321
|
+
const normBody = (value: string): string => value.replace(/\s+/g, " ").trim();
|
|
322
|
+
|
|
323
|
+
function findSameTurnExplicitReport(input: {
|
|
324
|
+
from: string;
|
|
325
|
+
to: string;
|
|
326
|
+
body: string;
|
|
327
|
+
at: number;
|
|
328
|
+
turnId?: string;
|
|
329
|
+
}): Message | null {
|
|
330
|
+
const body = normBody(input.body);
|
|
331
|
+
// A stub capture ("Landed.") carries no news an explicit could subsume — and must never be
|
|
332
|
+
// adopted by an explicit that merely contains it ("Not landed. ...").
|
|
333
|
+
if (body.length < SAME_TURN_MIN_CHARS) return null;
|
|
334
|
+
// Same-turn keyed on the turn itself (its first session row), so a prior turn's escalation
|
|
335
|
+
// cannot swallow this final. No turn id → the duplicate window behind the capture. Forwarded
|
|
336
|
+
// reports, suppressed rows and bare acks never count as explicit.
|
|
337
|
+
const fallback = input.at - LINEAGE_REPORT_DUPLICATE_WINDOW_MS;
|
|
338
|
+
const rows = getDb().query(sameTurnExplicitReportSql(Boolean(input.turnId))).all(
|
|
339
|
+
input.from,
|
|
340
|
+
input.to,
|
|
341
|
+
...(input.turnId ? [input.from, input.turnId, fallback] : [fallback]),
|
|
342
|
+
input.at + LINEAGE_REPORT_DUPLICATE_WINDOW_MS,
|
|
343
|
+
) as any[];
|
|
344
|
+
for (const row of rows) {
|
|
345
|
+
const explicit = normBody(String(row?.body ?? ""));
|
|
346
|
+
if (explicit.length >= SAME_TURN_MIN_CHARS && explicit.includes(body)) return rowToMessage(row);
|
|
347
|
+
}
|
|
348
|
+
return null;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// T4458 (Edin's rule + ratio) — the explicit the child sent its parent DURING this turn,
|
|
352
|
+
// adopted whatever the wording ONLY when report-sized (>= half the final's length); a short
|
|
353
|
+
// ack falls through to the content checks. Previous turns, unstamped sends and ambiguous
|
|
354
|
+
// (interleaving) stamps miss here. Sub-16 bodies never count.
|
|
355
|
+
function findTurnExplicitReport(input: {
|
|
356
|
+
from: string;
|
|
357
|
+
to: string;
|
|
358
|
+
turnId: string;
|
|
359
|
+
before: number;
|
|
360
|
+
captureId: number;
|
|
361
|
+
captureLen: number;
|
|
362
|
+
captureOccurredAt: number;
|
|
363
|
+
}): Message | null {
|
|
364
|
+
const row = getDb().query(TURN_EXPLICIT_REPORT_SQL).get(input.from, input.to, input.turnId, input.before) as any;
|
|
365
|
+
if (!row) return null;
|
|
366
|
+
const message = rowToMessage(row);
|
|
367
|
+
const explicitLen = normBody(String(message.body ?? "")).length;
|
|
368
|
+
if (explicitLen < SAME_TURN_MIN_CHARS || explicitLen < 0.5 * input.captureLen) return null;
|
|
369
|
+
// MED-1 (r1 review): a stamp is turn inference and can go stale — t1's late final can land
|
|
370
|
+
// after t2 already stamped an explicit with the old id, swallowing t1's final. Refuse the
|
|
371
|
+
// ambiguous stamp (fail open = forward) when another turn's rows interleave between the
|
|
372
|
+
// explicit and this capture; a cleanly sequenced turn has none. Ordered by row id, not
|
|
373
|
+
// wall-clock: same-millisecond sends must not read as ordered either way.
|
|
374
|
+
const interleaved = getDb().query(`
|
|
375
|
+
SELECT 1 FROM messages
|
|
376
|
+
WHERE from_agent = ? AND kind = 'session'
|
|
377
|
+
AND json_extract(payload, '$.session.turnId') IS NOT NULL
|
|
378
|
+
AND json_extract(payload, '$.session.turnId') <> ?
|
|
379
|
+
AND id > ? AND created_at <= ?
|
|
380
|
+
LIMIT 1
|
|
381
|
+
`).get(input.from, input.turnId, message.id, input.before);
|
|
382
|
+
if (interleaved) return null;
|
|
383
|
+
// MED-1 (r2 review): tool work after the explicit means the final carries more — a
|
|
384
|
+
// report-sized note must not swallow it. Refuse when more than one same-turn tool row sits
|
|
385
|
+
// between explicit and capture; the live pair's single send-result row still folds.
|
|
386
|
+
const toolWork = getDb().query(`
|
|
387
|
+
SELECT COUNT(*) AS n FROM messages
|
|
388
|
+
WHERE from_agent = ? AND kind = 'session'
|
|
389
|
+
AND json_extract(payload, '$.session.turnId') = ?
|
|
390
|
+
AND json_extract(payload, '$.session.type') = 'tool'
|
|
391
|
+
AND id > ? AND id < ?
|
|
392
|
+
`).get(input.from, input.turnId, message.id, input.captureId) as { n: number };
|
|
393
|
+
// MED-2 (r2 review): out-of-order delivery across a turn boundary — the capture's event
|
|
394
|
+
// time predates the explicit beyond skew, so the explicit belongs to the NEXT turn despite
|
|
395
|
+
// its stamp. Refuse (fail open); normal order (explicit first) always passes.
|
|
396
|
+
if (message.createdAt > input.captureOccurredAt + TURN_ORDER_SKEW_MS) return null;
|
|
397
|
+
if (toolWork.n > 1) return null;
|
|
398
|
+
return message;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
function findRecentExplicitLineageDuplicate(input: {
|
|
402
|
+
from: string;
|
|
403
|
+
to: string;
|
|
404
|
+
body: string;
|
|
405
|
+
since: number;
|
|
406
|
+
}): Message | null {
|
|
407
|
+
const row = getDb().query(RECENT_EXPLICIT_LINEAGE_DUPLICATE_SQL).get(
|
|
408
|
+
input.from,
|
|
409
|
+
input.to,
|
|
410
|
+
input.body,
|
|
411
|
+
input.since,
|
|
412
|
+
) as any;
|
|
413
|
+
return row ? rowToMessage(row) : null;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// #1084/#3304 — reporting a definitive provider completion does not close its work window.
|
|
417
|
+
// Keep recent captures for work-final metadata and legacy/uncertain captures for fallback delivery.
|
|
418
|
+
const LINEAGE_FINAL_GROUP_RECENCY_MS = 10 * 60 * 1000;
|
|
419
|
+
export { __resetDeferredLineageReports, restoreDeferredLineageReports, takeDeferredLineageReports } from "./deferred-lineage-reports.ts";
|
|
420
|
+
|
|
421
|
+
export interface WorkFinalFlushResult {
|
|
422
|
+
/** The chat report(s) forwarded (or found already-forwarded) to the spawner, oldest first. */
|
|
423
|
+
forwarded: Array<{ message: Message; created: boolean }>;
|
|
424
|
+
/** The original session-mirror captures retroactively tagged `payload.finality` (for the
|
|
425
|
+
* `message.finalized` SSE upgrade of already-rendered bubbles). */
|
|
426
|
+
finalizedOriginals: Message[];
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* #1084 — close a child's work window: flush its held turn-final group to its spawner as ONE
|
|
431
|
+
* work-final unit sharing a fresh `windowId`, tagged with `source` (the explicit signal that closed
|
|
432
|
+
* the window) and an incrementing `groupOrder`. No-op when nothing was held. This is the ONLY path
|
|
433
|
+
* that marks a capture WORK-final (definitive provider completions can report before this).
|
|
434
|
+
* Also delivers held captures to the spawner (besides the `verbose` bypass in
|
|
435
|
+
* promoteLineageCapturedResponse) — call it from the finality service, never from a bus status edge.
|
|
436
|
+
*/
|
|
437
|
+
export function flushWorkFinalReports(childId: string, source: MessageWorkFinalitySource, options: { includeStaleCompletedFinals?: boolean } = {}): WorkFinalFlushResult {
|
|
438
|
+
const queue = takeDeferredLineageReports([childId])[childId];
|
|
439
|
+
if (!queue || queue.length === 0) return { forwarded: [], finalizedOriginals: [] };
|
|
440
|
+
return flushWorkFinalReportsFromQueue(childId, queue, source, options);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/** DB half of a finality flush using a queue captured from the main-thread hold map. */
|
|
444
|
+
export function flushWorkFinalReportsFromQueue(
|
|
445
|
+
childId: string,
|
|
446
|
+
queue: number[],
|
|
447
|
+
source: MessageWorkFinalitySource,
|
|
448
|
+
options: { includeStaleCompletedFinals?: boolean } = {},
|
|
449
|
+
markedAt: number = Date.now(),
|
|
450
|
+
): WorkFinalFlushResult {
|
|
451
|
+
const child = getAgent(childId);
|
|
452
|
+
const parent = currentCoordinatorOf(child);
|
|
453
|
+
if (!child || !parent) return { forwarded: [], finalizedOriginals: [] };
|
|
454
|
+
|
|
455
|
+
const windowId = randomUUID();
|
|
456
|
+
const recencyCutoff = markedAt - LINEAGE_FINAL_GROUP_RECENCY_MS;
|
|
457
|
+
const forwarded: Array<{ message: Message; created: boolean }> = [];
|
|
458
|
+
const finalizedOriginals: Message[] = [];
|
|
459
|
+
const held: Array<{ original: Message; session: Record<string, unknown> }> = [];
|
|
460
|
+
for (const messageId of queue) {
|
|
461
|
+
const original = getMessage(messageId);
|
|
462
|
+
if (!original || isReportSuppressed(original)) continue;
|
|
463
|
+
// #1084 MEDIUM — drop stale mid-work narration the count-capped ring is still holding from an
|
|
464
|
+
// earlier steer cycle; only captures from the completing sequence ride along in this group.
|
|
465
|
+
if (!options.includeStaleCompletedFinals && (original.occurredAt ?? original.createdAt) < recencyCutoff) continue;
|
|
466
|
+
const session = sessionMeta(original);
|
|
467
|
+
if (!session) continue;
|
|
468
|
+
held.push({ original, session });
|
|
469
|
+
}
|
|
470
|
+
const selected = source === "edge-fallback" ? selectEdgeFallbackLineageReports(held) : held;
|
|
471
|
+
let groupOrder = 0;
|
|
472
|
+
for (const { original, session } of selected) {
|
|
473
|
+
const suppress = reportVerbosityOf(child) === "off" || (reportVerbosityOf(child) !== "verbose" && lineageDeliveryCoversCapture(original, child, parent, markedAt));
|
|
474
|
+
const finality: MessageWorkFinality = { windowId, source, groupOrder, markedAt };
|
|
475
|
+
const result = suppress ? null : forwardLineageStreamCapture(original, session, "responses", child, parent, finality);
|
|
476
|
+
if (!suppress && !result) continue;
|
|
477
|
+
if (result) forwarded.push(result);
|
|
478
|
+
groupOrder++;
|
|
479
|
+
const finalizedOriginal = setMessageWorkFinality(original.id, finality);
|
|
480
|
+
if (finalizedOriginal) finalizedOriginals.push(finalizedOriginal);
|
|
481
|
+
}
|
|
482
|
+
return { forwarded, finalizedOriginals };
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// #1469 — a bare acknowledgement / content-free coda a child emits as a turn-final. Anchored and
|
|
486
|
+
// whole-string (allowing only trailing whitespace/punctuation), so a real report that merely
|
|
487
|
+
// CONTAINS one of these words ("Done. Gates green, committed…") is never matched — only a body that
|
|
488
|
+
// is nothing BUT the ack. Deliberately TIGHT — a small explicit set, not a fuzzy "looks short"
|
|
489
|
+
// heuristic: absence of report structure is NOT grounds to drop (that would regress a legitimately
|
|
490
|
+
// short final like "Landed abc123 on main."), only an empty body or a positive ack match is.
|
|
491
|
+
const NON_SUBSTANTIVE_ECHO = /^(?:ok(?:ay)?|ack|acknowledged?|noted|thanks|thank you|got it|will do|done|roger)[\s.!]*$/i;
|
|
492
|
+
|
|
493
|
+
function selectEdgeFallbackLineageReports<T extends { original: Message }>(held: T[]): T[] {
|
|
494
|
+
if (held.length === 0) return held;
|
|
495
|
+
let bestIndex = -1;
|
|
496
|
+
let bestScore = -Infinity;
|
|
497
|
+
for (let i = 0; i < held.length; i++) {
|
|
498
|
+
const score = edgeFallbackReportScore(held[i]!.original.body);
|
|
499
|
+
if (score > bestScore || (score === bestScore && i > bestIndex)) {
|
|
500
|
+
bestScore = score;
|
|
501
|
+
bestIndex = i;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
const selected = bestScore > 0 && bestIndex >= 0 ? held[bestIndex]! : held.at(-1)!;
|
|
505
|
+
// #1469 — an `edge-fallback` flush fires at teardown/reap/prune, long after the turn was captured
|
|
506
|
+
// and after the spawner has moved on from (and often reaped) the child. A bare non-substantive
|
|
507
|
+
// turn-final ("Acknowledged.") carries no report value and lands as pure noise on a spawner that no
|
|
508
|
+
// longer tracks the child — the recurring #1469 stray. Drop it rather than forward. A SUBSTANTIVE
|
|
509
|
+
// held final (genuine crash-final-loss recovery, #1136/#1084) scores > 0 above, or is a short-but-
|
|
510
|
+
// real report the tight ack filter never matches, and rides through untouched.
|
|
511
|
+
const body = selected.original.body.trim();
|
|
512
|
+
return body.length === 0 || NON_SUBSTANTIVE_ECHO.test(body) ? [] : [selected];
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
const EDGE_FALLBACK_REPORT_BOUNDARY = /(^|\n)(#{1,6}\s|\*\*(summary|what changed|rca|fix|tests?|gates?|verification|risk)\b|(?:summary|what changed|rca|fix|tests?|gates?|verification|risk):)/i;
|
|
516
|
+
const EDGE_FALLBACK_REPORT_STRUCTURE = /(^|\n)\s*[-*]\s+\S|`[^`]+`|\b(typecheck|bun test|tests? pass(?:ed)?|gates? green|rca|verified|implemented)\b/i;
|
|
517
|
+
const EDGE_FALLBACK_GENERIC_CODA = /^(?:done|landed(?: on main)?|committed|merged|ready|no further action|nothing further|all set)\b|(?:\bno further action needed\b|\bnothing further needed\b)$/i;
|
|
518
|
+
const EDGE_FALLBACK_NARRATION = /^(?:i(?:'|’)ll|i(?:'|’)m|let me|checking|running|reading|found\b|now\b)/i;
|
|
519
|
+
|
|
520
|
+
function edgeFallbackReportScore(body: string): number {
|
|
521
|
+
const trimmed = body.trim();
|
|
522
|
+
if (!trimmed) return -10;
|
|
523
|
+
if (trimmed.length <= 180 && EDGE_FALLBACK_GENERIC_CODA.test(trimmed) && !EDGE_FALLBACK_REPORT_BOUNDARY.test(trimmed)) return -5;
|
|
524
|
+
let score = 0;
|
|
525
|
+
if (trimmed.length >= 120) score += 2;
|
|
526
|
+
if (EDGE_FALLBACK_REPORT_BOUNDARY.test(trimmed)) score += 6;
|
|
527
|
+
if (EDGE_FALLBACK_REPORT_STRUCTURE.test(trimmed)) score += 3;
|
|
528
|
+
if (EDGE_FALLBACK_NARRATION.test(trimmed)) score -= 3;
|
|
529
|
+
return score;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
// #1032b — a delivered report-up is a first-class lifecycle signal to the spawner. Stamp it so a
|
|
533
|
+
// redundant "Task status pulse" for the same child/task is suppressed rather than double-waking.
|
|
534
|
+
// #1038 — a report-up conveys "the child is progressing", so it is state-keyed to `working`: it
|
|
535
|
+
// supersedes only a redundant `working` pulse, never a later distinct milestone (committed/landed/done).
|
|
536
|
+
function stampReportUpLifecycleSignal(parent: string, child: AgentCard): void {
|
|
537
|
+
stampLifecycleSignal(parent, childSignalKey(child.id));
|
|
538
|
+
for (const taskId of childTaskIds(child)) stampLifecycleSignal(parent, taskSignalKey(taskId, LIFECYCLE_STATE_WORKING));
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
export function promoteLineageCapturedResponse(message: Message): { message: Message; created: boolean } | null {
|
|
542
|
+
if (message.kind !== "session" || isReportSuppressed(message)) return null;
|
|
543
|
+
const session = sessionMeta(message);
|
|
544
|
+
if (!session) return null;
|
|
545
|
+
const stream = childStreamForSession(session);
|
|
546
|
+
if (!stream) return null;
|
|
547
|
+
if (stream === "responses" && !isFinalSessionResponse(session)) return null;
|
|
548
|
+
const child = getAgent(message.from);
|
|
549
|
+
const parent = currentCoordinatorOf(child);
|
|
550
|
+
if (!child || !parent) return null;
|
|
551
|
+
const verbosity = reportVerbosityOf(child);
|
|
552
|
+
if (verbosity === "off") return null;
|
|
553
|
+
// #1037 verbose: forward every child stream without an explicit per-stream subscription.
|
|
554
|
+
if (stream !== "responses" && verbosity !== "verbose" && !childStreamSubscribed({ parentId: parent, child, stream })) return null;
|
|
555
|
+
|
|
556
|
+
// #3304 — provider completion is enough to report a turn, without declaring the Task done.
|
|
557
|
+
// Keep the ring for later work-final metadata; addressed captures already have a runner reply.
|
|
558
|
+
if (stream === "responses" && verbosity !== "verbose") {
|
|
559
|
+
deferLineageReport(child.id, message.id);
|
|
560
|
+
if (session.confidence !== "definitive" || session.endedBy !== "completed" || message.replyTo) return null;
|
|
561
|
+
if (lineageDeliveryCoversCapture(message, child, parent, message.createdAt)) return null;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
return forwardLineageStreamCapture(message, session, stream, child, parent);
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* Forward one captured child-stream event to its spawner as a `chat` report-up. Shared by the
|
|
569
|
+
* `verbose` immediate bypass (no `finality`) and `flushWorkFinalReports` (tags the forwarded report
|
|
570
|
+
* — and, via the caller, the original capture — with the closing work window's `finality`).
|
|
571
|
+
*/
|
|
572
|
+
function forwardLineageStreamCapture(
|
|
573
|
+
message: Message,
|
|
574
|
+
session: Record<string, unknown>,
|
|
575
|
+
stream: ChildStream,
|
|
576
|
+
child: AgentCard,
|
|
577
|
+
parent: string,
|
|
578
|
+
finality?: MessageWorkFinality,
|
|
579
|
+
): { message: Message; created: boolean } | null {
|
|
580
|
+
const parentAgentId = parent;
|
|
581
|
+
parent = canonicalLineageReportTarget(child, parent);
|
|
582
|
+
const idempotencyKey = lineageStreamReportKey(message, session, stream);
|
|
583
|
+
const existing = findMessageByIdempotencyKey(message.from, idempotencyKey);
|
|
584
|
+
if (existing) {
|
|
585
|
+
// #1084 MEDIUM (Lens-3 retroactive-finality) fix-forward — an already-forwarded report (e.g. a
|
|
586
|
+
// `verbose` bypass, or a duplicate suppressed on an earlier attempt) must still pick up the
|
|
587
|
+
// finality tag when its window later closes, or its dashboard bubble never upgrades from
|
|
588
|
+
// ordinary mid-turn narration to a closing message. Only patch when it isn't already tagged —
|
|
589
|
+
// an existing tag reflects an earlier, equally-valid window close and must not be overwritten.
|
|
590
|
+
if ((finality && !hasWorkFinality(existing.payload)) || (stream === "responses" && existing.messageType !== "final-turn")) {
|
|
591
|
+
const updatedPayload: MessagePayload = { ...(existing.payload ?? {}), finality };
|
|
592
|
+
getDb().query("UPDATE messages SET payload = ?, message_type = ?, source_message_id = ? WHERE id = ?")
|
|
593
|
+
.run(JSON.stringify(updatedPayload), stream === "responses" ? "final-turn" : existing.messageType ?? null, stream === "responses" ? message.id : existing.sourceMessageId ?? null, existing.id);
|
|
594
|
+
return { message: getMessage(existing.id) ?? existing, created: false };
|
|
595
|
+
}
|
|
596
|
+
return { message: existing, created: false };
|
|
597
|
+
}
|
|
598
|
+
if (stream === "responses") {
|
|
599
|
+
// A child may close its turn by pointing at the full report it already sent to this
|
|
600
|
+
// parent. The explicit report is the parent delivery; keep this capture in the
|
|
601
|
+
// dashboard, but do not manufacture a second inbox message for its pointer.
|
|
602
|
+
const pointer = message.body.trim().match(/^(?:(.{1,160}?)\s*(?:\.{3}|…)\s*)?(?:full\s+)?report\s+(?:sent\s*:\s*(?:message\s+)?(?:id\s*)?|in\s+message\s+(?:id\s*)?)#?(\d+)[.!\s]*$/i);
|
|
603
|
+
if (pointer) {
|
|
604
|
+
const explicit = getMessage(Number(pointer[2]));
|
|
605
|
+
const repeatedSummary = pointer[1]?.trim();
|
|
606
|
+
if (explicit && explicit.from === message.from && explicit.to === parent && explicit.kind === "chat" && !isReportSuppressed(explicit)
|
|
607
|
+
&& (!repeatedSummary || explicit.body.includes(repeatedSummary))
|
|
608
|
+
&& explicit.id !== message.id && explicit.createdAt <= message.createdAt
|
|
609
|
+
&& message.createdAt - explicit.createdAt <= LINEAGE_REPORT_DUPLICATE_WINDOW_MS) {
|
|
610
|
+
return { message: explicit, created: false };
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
const turnId = captureTurnId(session);
|
|
614
|
+
if (turnId) {
|
|
615
|
+
const crossKeyDuplicate = findLineageReportByTurn({
|
|
616
|
+
from: message.from,
|
|
617
|
+
to: parent,
|
|
618
|
+
turnId,
|
|
619
|
+
since: message.createdAt - LINEAGE_REPORT_DUPLICATE_WINDOW_MS,
|
|
620
|
+
});
|
|
621
|
+
if (crossKeyDuplicate) {
|
|
622
|
+
getDb().query("UPDATE messages SET message_type = 'final-turn', source_message_id = ? WHERE id = ?")
|
|
623
|
+
.run(message.id, crossKeyDuplicate.id);
|
|
624
|
+
return { message: getMessage(crossKeyDuplicate.id) ?? crossKeyDuplicate, created: false };
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
const duplicate = findRecentExplicitLineageDuplicate({
|
|
629
|
+
from: message.from,
|
|
630
|
+
to: parent,
|
|
631
|
+
body: message.body,
|
|
632
|
+
since: message.createdAt - LINEAGE_REPORT_DUPLICATE_WINDOW_MS,
|
|
633
|
+
});
|
|
634
|
+
if (duplicate && !responseCaptureMeta(duplicate)) {
|
|
635
|
+
const updatedPayload: MessagePayload = {
|
|
636
|
+
...(duplicate.payload ?? {}),
|
|
637
|
+
responseCapture: { ...session },
|
|
638
|
+
...(finality ? { finality } : {}),
|
|
639
|
+
};
|
|
640
|
+
getDb().query(`
|
|
641
|
+
UPDATE messages
|
|
642
|
+
SET idempotency_key = coalesce(idempotency_key, ?),
|
|
643
|
+
payload = ?,
|
|
644
|
+
message_type = 'final-turn',
|
|
645
|
+
source_message_id = ?
|
|
646
|
+
WHERE id = ?
|
|
647
|
+
`).run(idempotencyKey, JSON.stringify(updatedPayload), message.id, duplicate.id);
|
|
648
|
+
return { message: getMessage(duplicate.id) ?? duplicate, created: false };
|
|
649
|
+
}
|
|
650
|
+
// T4458 (Edin's rule #2844 1a): the child already told its parent explicitly during THIS
|
|
651
|
+
// turn (server-stamped senderTurnId) — when report-sized (Edin's ratio) that explicit IS
|
|
652
|
+
// the parent delivery, so the turn-final stays transcript-only. Same no-new-row shape, no
|
|
653
|
+
// metadata merge (bodies differ). Previous turns, unstamped sends and short acks fall
|
|
654
|
+
// through to the content check. The `verbose` firehose bypasses both.
|
|
655
|
+
if (reportVerbosityOf(child) !== "verbose") {
|
|
656
|
+
const captureLen = normBody(message.body).length;
|
|
657
|
+
if (turnId && captureLen >= SAME_TURN_MIN_CHARS) {
|
|
658
|
+
const turnExplicit = findTurnExplicitReport({ from: message.from, to: parent, turnId, before: message.createdAt, captureId: message.id, captureLen, captureOccurredAt: message.occurredAt ?? message.createdAt });
|
|
659
|
+
if (turnExplicit) return { message: turnExplicit, created: false };
|
|
660
|
+
}
|
|
661
|
+
const sameTurnExplicit = findSameTurnExplicitReport({ from: message.from, to: parent, body: message.body, at: message.createdAt, turnId });
|
|
662
|
+
if (sameTurnExplicit) return { message: sameTurnExplicit, created: false };
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
const result = sendMessageWithResult({
|
|
667
|
+
from: message.from,
|
|
668
|
+
to: parent,
|
|
669
|
+
kind: "chat",
|
|
670
|
+
// #1935 — a final forward is ordinary delivery metadata plus the exact captured turn. Provider
|
|
671
|
+
// delivery (not the server) owns the single full-vs-stub decision.
|
|
672
|
+
body: message.body,
|
|
673
|
+
...(stream === "responses" ? { messageType: "final-turn" as const, sourceMessageId: message.id } : {}),
|
|
674
|
+
replyExpected: false,
|
|
675
|
+
idempotencyKey,
|
|
676
|
+
payload: stream === "responses"
|
|
677
|
+
? { responseCapture: { ...session }, ...(finality ? { finality } : {}) }
|
|
678
|
+
: { childStreamCapture: { stream, ...session } },
|
|
679
|
+
occurredAt: message.occurredAt ?? message.createdAt,
|
|
680
|
+
});
|
|
681
|
+
if (stream === "responses" && result.created) {
|
|
682
|
+
stampReportUpLifecycleSignal(parentAgentId, child);
|
|
683
|
+
}
|
|
684
|
+
return result;
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
export function setMessageWorkFinality(messageId: number, finality: MessageWorkFinality): Message | null {
|
|
688
|
+
const message = getMessage(messageId);
|
|
689
|
+
if (!message) return null;
|
|
690
|
+
const payload: MessagePayload = { ...(message.payload ?? {}), finality };
|
|
691
|
+
getDb().query("UPDATE messages SET payload = ? WHERE id = ?").run(JSON.stringify(payload), messageId);
|
|
692
|
+
return getMessage(messageId);
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
/** Mark the durable self-resume recovery artifact only after its matching provider injection was
|
|
696
|
+
* accepted. Creating the message is storage, not delivery; keeping those facts separate prevents
|
|
697
|
+
* the dashboard from claiming a cleared agent received context when replay is still pending.
|
|
698
|
+
* #2550 — ingestion settles the TRANSPORT ledger too: the row was previously left
|
|
699
|
+
* delivery_status='pending' with zero attempts even after the envelope provably reached the
|
|
700
|
+
* provider, so it read back as undelivered mail forever and stayed a live candidate for the
|
|
701
|
+
* ordinary delivery pipeline. One terminal stamp (delivered + one attempt, error/retry/poison
|
|
702
|
+
* cleared) makes the transport state reflect reality; the caller emits the SSE update. */
|
|
703
|
+
export function markSelfResumeContinuationIngested(messageId: number, now = Date.now()): Message | null {
|
|
704
|
+
const message = getMessage(messageId);
|
|
705
|
+
if (!message || message.payload?.kind !== "agent.self_resume_continuation") return null;
|
|
706
|
+
const delivery = isRecord(message.payload.delivery) ? message.payload.delivery : undefined;
|
|
707
|
+
if (delivery?.state === "ingested") return message;
|
|
708
|
+
const payload: MessagePayload = {
|
|
709
|
+
...message.payload,
|
|
710
|
+
delivery: { state: "ingested", ingestedAt: now },
|
|
711
|
+
};
|
|
712
|
+
getDb().query(`
|
|
713
|
+
UPDATE messages
|
|
714
|
+
SET payload = ?,
|
|
715
|
+
delivery_status = 'delivered',
|
|
716
|
+
delivery_attempts = delivery_attempts + 1,
|
|
717
|
+
delivery_last_error = NULL,
|
|
718
|
+
delivery_next_retry_at = NULL,
|
|
719
|
+
delivery_poison_reason = NULL,
|
|
720
|
+
delivery_updated_at = ?
|
|
721
|
+
WHERE id = ?
|
|
722
|
+
`).run(JSON.stringify(payload), now, messageId);
|
|
723
|
+
return getMessage(messageId);
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
/** #2545 — true when the self-resume recovery artifact for `messageId` was positively accepted by
|
|
727
|
+
* the provider (the runner's stored→ingested promotion). This is the DELIVERY ground truth the
|
|
728
|
+
* re-injection sweep dedupes on: a boundary whose attempt ledger says failed/timed_out but whose
|
|
729
|
+
* artifact provably landed is a bookkeeping lie, not a missing delivery, and re-delivering it to
|
|
730
|
+
* an idle agent on every lifecycle epoch is exactly the duplicate-continuation spam #2545 fixes.
|
|
731
|
+
* A missing/unreadable message or payload answers false — fail toward re-delivering (#1023). */
|
|
732
|
+
export function selfResumeContinuationIngested(messageId: number | undefined): boolean {
|
|
733
|
+
if (messageId === undefined) return false;
|
|
734
|
+
const message = getMessage(messageId);
|
|
735
|
+
if (!message || message.payload?.kind !== "agent.self_resume_continuation") return false;
|
|
736
|
+
const delivery = isRecord(message.payload.delivery) ? message.payload.delivery : undefined;
|
|
737
|
+
return delivery?.state === "ingested";
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
// Event time may be queued-then-backfilled, so it can legitimately be older than the
|
|
741
|
+
// receive time — but it must be a sane epoch-ms value. Returns null (column stays NULL, so
|
|
742
|
+
// readers fall back to created_at) for absent/invalid values or anything more than a minute
|
|
743
|
+
// in the future (clock-skew guard). Only a real backfilled time is stored.
|
|
744
|
+
function sanitizeOccurredAt(occurredAt: number | undefined, receivedAt: number): number | null {
|
|
745
|
+
if (typeof occurredAt !== "number" || !Number.isFinite(occurredAt)) return null;
|
|
746
|
+
if (occurredAt <= 0 || occurredAt > receivedAt + 60_000) return null;
|
|
747
|
+
return Math.floor(occurredAt);
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
/** Hot send-path read: the next sender-local sequence number. Kept exported so the query-plan
|
|
751
|
+
* gate exercises this exact production statement rather than a hand-written approximation.
|
|
752
|
+
* `seq IS NOT NULL` lets the partial idx_msg_from_seq serve MAX() as one seek (#3044). */
|
|
753
|
+
export const NEXT_MESSAGE_SEQ_SQL = "SELECT COALESCE(MAX(seq), 0) + 1 AS seq FROM messages WHERE from_agent = ? AND seq IS NOT NULL";
|
|
754
|
+
|
|
755
|
+
function nextMessageSeq(from: string): number {
|
|
756
|
+
const row = getDb().query(NEXT_MESSAGE_SEQ_SQL).get(from) as { seq: number } | undefined;
|
|
757
|
+
return row?.seq ?? 1;
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
export interface SendMessageResult {
|
|
761
|
+
message: Message;
|
|
762
|
+
created: boolean;
|
|
763
|
+
updated?: boolean;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
export interface SendMessageWriteOptions {
|
|
767
|
+
/** #1538 — timer-fire-outbox durable replay ONLY. Skip the live sender-registration check because
|
|
768
|
+
* the send carries a frozen captured identity whose agent may have deregistered. Never set on a
|
|
769
|
+
* live wire send. */
|
|
770
|
+
allowUnregisteredSender?: boolean;
|
|
771
|
+
internalCoordinatorDigest?: boolean;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
type ServerMessageInput = SendMessageInput & { messageType?: "final-turn"; sourceMessageId?: number };
|
|
775
|
+
|
|
776
|
+
export function sendMessageWithResult(input: ServerMessageInput, opts: SendMessageWriteOptions = {}): SendMessageResult {
|
|
777
|
+
return sendMessageWithResultInternal(input, true, opts);
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
// The batch body: one INSERT per input under a SINGLE held write lock (ALL-OR-NOTHING — one caller's
|
|
781
|
+
// atomic multi-row request; §3.9.1). `now` is threaded through so a relocated op captures time once at
|
|
782
|
+
// submission (H6). Bounded by MAX_MESSAGE_BATCH (100) so the synchronous lock-hold stays short.
|
|
783
|
+
// Exported so the `messages.sendBatch` writer op (message-write-ops.ts) can relocate the WHOLE batch as
|
|
784
|
+
// ONE atomic op: any input throwing rolls back every sibling (the executor's single BEGIN IMMEDIATE),
|
|
785
|
+
// which is the correct contract for one caller's batch and is DISTINCT from the per-caller SAVEPOINT
|
|
786
|
+
// isolation `messages.send` uses to coalesce INDEPENDENT same-tick callers.
|
|
787
|
+
export function insertMessageBatch(inputs: ServerMessageInput[], now: number = Date.now()): SendMessageResult[] {
|
|
788
|
+
return inputs.map((input) => sendMessageWithResultInternal(input, false, {}, now));
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
/** Synchronous batch insert in one BEGIN IMMEDIATE transaction (#1428). Single attempt: a BUSY that
|
|
792
|
+
* survives busy_timeout throws. Off-loop request paths use `sendMessagesBatchWithResultAsync`
|
|
793
|
+
* (src/db/message-send.ts), which routes through the async gateway `messages.send` op (L1 seam). */
|
|
794
|
+
export function sendMessagesBatchWithResult(inputs: ServerMessageInput[]): SendMessageResult[] {
|
|
795
|
+
return writeTransaction(() => insertMessageBatch(inputs));
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
// The single-send op BODY (registered as `messages.send` in src/db/message-write-ops.ts). Exported so
|
|
799
|
+
// the writer op registry can relocate it onto the worker thread; `wrapTransaction=false` is the op
|
|
800
|
+
// shape (the executor already opened the BEGIN IMMEDIATE / per-caller SAVEPOINT, §3.4). See
|
|
801
|
+
// message-write-ops.ts for the L1 seam rationale (TOCTOU fold, H5 idempotency, coalescing).
|
|
802
|
+
/** A `user:<id>` address of an existing user. */
|
|
803
|
+
function isUserSink(id: string): boolean {
|
|
804
|
+
const userId = id.startsWith(USER_NAMESPACE_PREFIX) ? id.slice(USER_NAMESPACE_PREFIX.length) : "";
|
|
805
|
+
return Boolean(userId && getUser(userId));
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
export function sendMessageWithResultInternal(
|
|
809
|
+
input: ServerMessageInput,
|
|
810
|
+
wrapTransaction: boolean,
|
|
811
|
+
opts: SendMessageWriteOptions = {},
|
|
812
|
+
// H6 (§3.1/§3.4): wall-clock is captured at op SUBMISSION on the main thread and passed IN, never
|
|
813
|
+
// re-read `Date.now()` worker-side (which would run at some later worker-scheduling instant). Sync
|
|
814
|
+
// in-process callers default to now; the `messages.send` writer op passes `ctx.now`.
|
|
815
|
+
now: number = Date.now(),
|
|
816
|
+
): SendMessageResult {
|
|
817
|
+
if (wrapTransaction) return writeTransaction(() => sendMessageWithResultInternal(input, false, opts, now));
|
|
818
|
+
const payload = clearCoordinatorDigestRouting(normalizeMessagePayload(input.payload));
|
|
819
|
+
input.payload = payload;
|
|
820
|
+
const attachmentRefs = cleanAttachmentRefs(payload);
|
|
821
|
+
|
|
822
|
+
// The registration guard is the LIVE-send anti-spoof: a wire sender must currently exist. The
|
|
823
|
+
// durable timer-fire-outbox is the single exception (#1538) — it replays a committed decision on a
|
|
824
|
+
// frozen captured identity, so the creating agent may have deregistered; the `from` was already
|
|
825
|
+
// authorized (and #362 anti-spoofed) at create time. Only that internal path passes the flag.
|
|
826
|
+
const sender = getAgent(input.from);
|
|
827
|
+
// #3567 — a real user's `user:<id>` sink has no agent row; the send service already pinned it to the session.
|
|
828
|
+
if (!opts.allowUnregisteredSender && !sender && !isUserSink(input.from)) {
|
|
829
|
+
throw new ValidationError(`sender agent ${input.from} not registered`);
|
|
830
|
+
}
|
|
831
|
+
validateAttachmentRefs(attachmentRefs);
|
|
832
|
+
|
|
833
|
+
if (sender && responseCaptureMeta(input)) input.to = canonicalLineageReportTarget(sender, input.to);
|
|
834
|
+
const lineageDuplicate = findRecentLineageReport(input, now);
|
|
835
|
+
if (lineageDuplicate) return { message: lineageDuplicate, created: false };
|
|
836
|
+
|
|
837
|
+
if (input.idempotencyKey) {
|
|
838
|
+
const existing = findMessageByIdempotencyKey(input.from, input.idempotencyKey);
|
|
839
|
+
if (existing) {
|
|
840
|
+
// Session-step upsert: a re-emitted provider step (tool running→completed, streamed
|
|
841
|
+
// reasoning/response) updates its row in place instead of being dropped as a dup retry.
|
|
842
|
+
const upserted = upsertSessionStepInPlace(existing, input, now);
|
|
843
|
+
if (upserted) return { message: upserted, created: false, updated: true };
|
|
844
|
+
return { message: existing, created: false };
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
// Resolve thread: if replying, inherit from parent; reject unknown replyTo
|
|
849
|
+
// rather than silently orphaning the message (leaves thread_id NULL).
|
|
850
|
+
let threadId: number | null = null;
|
|
851
|
+
if (input.replyTo !== undefined && input.replyTo !== null) {
|
|
852
|
+
const parent = getMessage(input.replyTo);
|
|
853
|
+
if (!parent) throw new ValidationError(`replyTo message ${input.replyTo} not found`);
|
|
854
|
+
threadId = parent.threadId ?? parent.id;
|
|
855
|
+
}
|
|
856
|
+
const duplicateReply = findRecentDuplicateReply(input, threadId, now, attachmentRefs.length > 0);
|
|
857
|
+
if (duplicateReply) return { message: duplicateReply, created: false };
|
|
858
|
+
|
|
859
|
+
// #3060 — a root threads itself in its own single-row INSERT, on the id AUTOINCREMENT would pick: a second UPDATE
|
|
860
|
+
// would fire the reply-obligation update trigger, and INSERT ... SELECT a statement journal, on every send.
|
|
861
|
+
const nextId = "(SELECT max(coalesce((SELECT seq FROM sqlite_sequence WHERE name = 'messages'), 0), coalesce((SELECT max(id) FROM messages), 0)) + 1)";
|
|
862
|
+
const insert = getDb().query(`
|
|
863
|
+
INSERT INTO messages (
|
|
864
|
+
id, from_agent, to_target, kind, message_type, source_message_id, channel, subject, body, thread_id, reply_to, reply_expected, claimable,
|
|
865
|
+
urgent_requested, urgent_throttled,
|
|
866
|
+
idempotency_key, delivery_status, delivery_last_error, delivery_poison_reason, delivery_updated_at, queued_at, max_age_seconds, resolved_to_agent,
|
|
867
|
+
payload, meta, created_at, occurred_at, seq
|
|
868
|
+
)
|
|
869
|
+
VALUES (
|
|
870
|
+
${nextId}, $from, $to, $kind, $messageType, $sourceMessageId, $channel, $subject, $body, coalesce($threadId, ${nextId}), $replyTo, $replyExpected, $claimable,
|
|
871
|
+
$urgentRequested, $urgentThrottled,
|
|
872
|
+
$idempotencyKey, $deliveryStatus, $deliveryLastError, $deliveryPoisonReason, $deliveryUpdatedAt, $queuedAt, $maxAgeSeconds, $resolvedToAgent,
|
|
873
|
+
$payload, $meta, $now, $occurredAt, $seq
|
|
874
|
+
)
|
|
875
|
+
`);
|
|
876
|
+
const claimable = shouldStoreClaimable(input);
|
|
877
|
+
const kind = inferMessageKind(input);
|
|
878
|
+
// #2335 (P1 privacy, supersedes #2089) — CHANNEL-EGRESS ALLOWLIST. Anything addressed to a channel
|
|
879
|
+
// bridge that is not deliberate channel content is stamped here so decideDelivery routes it to
|
|
880
|
+
// `history` and is NEVER fanned to the channels-host bridge (which would DM it to a real human).
|
|
881
|
+
// Stamped onto the persisted payload below (`$payload`), so every later live/replay/poll delivery
|
|
882
|
+
// decides identically. The DECISION is the pure isDisallowedChannelContent in
|
|
883
|
+
// ./channel-egress-allowlist.ts; only the channel-target read and the insert-time stamp are here.
|
|
884
|
+
// Pure predicate FIRST: it answers false immediately for the overwhelmingly common send (an ordinary
|
|
885
|
+
// kind with no payload), so the channel lookup's getAgent + channels SELECT is paid only by a send
|
|
886
|
+
// that could actually be suppressed — never by every message in the system.
|
|
887
|
+
const channelSuppressed = isDisallowedChannelContent(input.payload, kind, input.meta) && isChannelEgressTarget(input.to);
|
|
888
|
+
if (channelSuppressed) payload.channelReportSuppressed = true;
|
|
889
|
+
// #2831 — decided once here, inside the writer transaction; see ./report-suppression.ts.
|
|
890
|
+
const { suppression: reportSuppression, answers: answeredQuestion } = decideReportSuppression(input, kind, sender, now);
|
|
891
|
+
if (reportSuppression) payload.reportSuppression = reportSuppression;
|
|
892
|
+
// T4458 (Edin's rule #2844 1a) — stamp the sender's open provider turn on an explicit child
|
|
893
|
+
// chat, so the turn-final forward matches its turn exactly. Cheap gates first: only a spawned
|
|
894
|
+
// child's plain chat pays the open-turn lookup; mirrors, capture forwards and server notices
|
|
895
|
+
// never do. Unknown turn → unstamped, and the forward keeps today's content checks.
|
|
896
|
+
if (kind === "chat" && input.messageType !== "final-turn" && sender?.spawnedBy
|
|
897
|
+
&& !isRecord(payload.responseCapture) && !isRecord(payload.childStreamCapture)) {
|
|
898
|
+
const openTurn = senderOpenTurnId(input.from, now);
|
|
899
|
+
if (openTurn) payload.senderTurnId = openTurn;
|
|
900
|
+
}
|
|
901
|
+
// A suppressed runner report is permanently undeliverable, exactly like a channel-suppressed row.
|
|
902
|
+
const suppressionReason = channelSuppressed ? CHANNEL_SUPPRESSION_REASON
|
|
903
|
+
: reportSuppression && kind !== "session" ? REPORT_SUPPRESSION_REASON : null;
|
|
904
|
+
const policyName = policyNameFromTarget(input.to);
|
|
905
|
+
let deliveryStatus: Message["deliveryStatus"] = "pending";
|
|
906
|
+
let queuedAt: number | null = null;
|
|
907
|
+
// Distinguish "unspecified" (apply the #451 fan-out default below) from an explicit `null`
|
|
908
|
+
// (authoritative never-expire — routeNotification sets this for store-ahead notification types,
|
|
909
|
+
// and the baseline must not override it). Both store as NULL, but only unspecified gets a default.
|
|
910
|
+
const ttlUnspecified = input.maxAgeSeconds === undefined;
|
|
911
|
+
let maxAgeSeconds = input.maxAgeSeconds ?? null;
|
|
912
|
+
let resolvedToAgent: string | null = null;
|
|
913
|
+
|
|
914
|
+
if (input.to.startsWith("coordinator:")) {
|
|
915
|
+
const teamId = input.to.slice(12);
|
|
916
|
+
if (!isClaimableTeam(getTeam(teamId))) throw new ValidationError(`active team ${teamId} not found`);
|
|
917
|
+
resolvedToAgent = resolveTeamCoordinatorAgentId(teamId);
|
|
918
|
+
if (!resolvedToAgent) {
|
|
919
|
+
deliveryStatus = "queued";
|
|
920
|
+
queuedAt = now;
|
|
921
|
+
if (ttlUnspecified) maxAgeSeconds = 86_400;
|
|
922
|
+
}
|
|
923
|
+
} else if (policyName) {
|
|
924
|
+
if (!spawnPolicyExists(policyName)) throw new ValidationError(`spawn policy ${policyName} not found`);
|
|
925
|
+
resolvedToAgent = runningAgentForPolicy(policyName);
|
|
926
|
+
if (!resolvedToAgent) {
|
|
927
|
+
deliveryStatus = "queued";
|
|
928
|
+
queuedAt = now;
|
|
929
|
+
if (ttlUnspecified) maxAgeSeconds = 86_400;
|
|
930
|
+
}
|
|
931
|
+
} else if (!isFanoutTarget(input.to) && !isMechanicalMessageKind(input.kind)) {
|
|
932
|
+
// #416 — queue messages to a registered-but-temporarily-unavailable direct target so they
|
|
933
|
+
// are not silently held as "pending" while the agent cannot process them. The flush fires
|
|
934
|
+
// when the agent returns to available (heartbeat stale→idle, re-registration, rate-limit
|
|
935
|
+
// resume). Offline agents use the existing store-ahead path (policyName is null, status
|
|
936
|
+
// "offline" → resolveQueuedDirectMessages is never called for them — the queue is cleared
|
|
937
|
+
// only when the agent actually comes back as non-offline).
|
|
938
|
+
const directAgent = getAgent(input.to);
|
|
939
|
+
if (directAgent && isAgentUnavailable(directAgent)) {
|
|
940
|
+
deliveryStatus = "queued";
|
|
941
|
+
queuedAt = now;
|
|
942
|
+
if (ttlUnspecified) maxAgeSeconds = 86_400;
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
// #451/#461 — moderate default TTL for non-claimable FAN-OUT messages the sender didn't bound,
|
|
947
|
+
// so stale broadcast/tag/cap/label/team chat cannot wake a late-joining agent hours later. Exempt
|
|
948
|
+
// (never auto-expire, preserving store-ahead #234): direct DMs and policy targets (single
|
|
949
|
+
// recipient), claimable work, and any message that already carried an explicit TTL — including an
|
|
950
|
+
// explicit `null` from routeNotification, whose per-type decision (e.g. a store-ahead
|
|
951
|
+
// `plan.bound_agent_exited` to `team:`) must win here.
|
|
952
|
+
if (ttlUnspecified && !claimable && isFanoutTarget(input.to)) {
|
|
953
|
+
maxAgeSeconds = DEFAULT_FANOUT_TTL_SECONDS;
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
// #2395 — a channel-suppressed row is PERMANENTLY undeliverable (isDisallowedChannelContent is a
|
|
957
|
+
// point-in-time payload-shape decision, not a transient recipient state), so it must not read back
|
|
958
|
+
// as an ordinary "pending"/"queued" send: that made the earlier silent-loss bug possible — the row
|
|
959
|
+
// sat at `delivery_status='pending'` with zero attempts forever, indistinguishable from a message
|
|
960
|
+
// that simply hadn't been polled yet. Overriding to `dead` here (after the policy/offline-queue
|
|
961
|
+
// resolution above, so it wins over both) makes the outcome OBSERVABLE the same way every other
|
|
962
|
+
// permanent delivery failure is: excluded from every poll (message-reads.ts's unconditional
|
|
963
|
+
// `delivery_status NOT IN ('failed','dead')`, on top of the channel poll's own suppression-stamp
|
|
964
|
+
// filter), surfaced as a dashboard delivery-failure notification (sse.ts notificationForDelivery),
|
|
965
|
+
// and visible via `GET /messages/:id/delivery`. See channel-egress-allowlist.ts for the reason text.
|
|
966
|
+
// #3013 — no turn ever attempts or reads a history row either; settle it now so no poll rescans it.
|
|
967
|
+
stampWorkflowContact({ message: input, kind, payload, sender, resolvedToAgent }); // #3045 — the run's, not its coordinator's
|
|
968
|
+
const insertDigest = (digest: SendMessageInput) => sendMessageWithResultInternal(digest, false, { internalCoordinatorDigest: true }, now).message;
|
|
969
|
+
const digestRecipient = opts.internalCoordinatorDigest ? null : prepareCoordinatorDigest(input, kind, payload, resolvedToAgent,
|
|
970
|
+
Boolean(suppressionReason) || settlesAsHistory({ kind, payload }), now, insertDigest);
|
|
971
|
+
const settledStatus = suppressionReason ? "dead" : settlesAsHistory({ kind, payload }) ? "history" : null;
|
|
972
|
+
if (settledStatus) {
|
|
973
|
+
deliveryStatus = settledStatus;
|
|
974
|
+
queuedAt = null;
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
const insertMessage = () => {
|
|
978
|
+
if (input.messageType !== undefined || input.sourceMessageId !== undefined) {
|
|
979
|
+
if (input.messageType !== "final-turn" || !Number.isSafeInteger(input.sourceMessageId) || input.sourceMessageId! <= 0) {
|
|
980
|
+
throw new ValidationError("invalid final-turn message lineage");
|
|
981
|
+
}
|
|
982
|
+
const source = getMessage(input.sourceMessageId!);
|
|
983
|
+
const sourceSession = source ? sessionMeta(source) : undefined;
|
|
984
|
+
if (!source || source.from !== input.from || !sourceSession || !isFinalSessionResponse(sourceSession)) {
|
|
985
|
+
throw new ValidationError("final-turn source must be a same-sender turn-final response");
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
// The debit is inside the message transaction and after all duplicate checks: retries never
|
|
989
|
+
// consume another token, while any failed insert rolls its budget mutation back with the row.
|
|
990
|
+
const urgentRequested = input.urgent === true;
|
|
991
|
+
const urgentThrottled = urgentRequested && !admitUrgentMessage(input.from, input.to, now);
|
|
992
|
+
const result = insert.run({
|
|
993
|
+
$from: input.from,
|
|
994
|
+
$to: input.to,
|
|
995
|
+
$kind: kind,
|
|
996
|
+
$messageType: input.messageType ?? null,
|
|
997
|
+
$sourceMessageId: input.sourceMessageId ?? null,
|
|
998
|
+
$channel: input.channel ?? null,
|
|
999
|
+
$subject: input.subject ?? null,
|
|
1000
|
+
$body: input.body,
|
|
1001
|
+
$threadId: threadId,
|
|
1002
|
+
$replyTo: input.replyTo ?? null,
|
|
1003
|
+
// Server-owned reply obligation (#283): true by default; only an explicit false marks
|
|
1004
|
+
// a notification. Stored 0/1 so the footer renderer + reply tracker key off one column.
|
|
1005
|
+
$replyExpected: input.replyExpected === false ? 0 : 1,
|
|
1006
|
+
$claimable: claimable ? 1 : 0,
|
|
1007
|
+
$urgentRequested: urgentRequested ? 1 : 0,
|
|
1008
|
+
$urgentThrottled: urgentThrottled ? 1 : 0,
|
|
1009
|
+
$idempotencyKey: input.idempotencyKey ?? null,
|
|
1010
|
+
$deliveryStatus: deliveryStatus,
|
|
1011
|
+
$deliveryLastError: suppressionReason,
|
|
1012
|
+
$deliveryPoisonReason: suppressionReason,
|
|
1013
|
+
$deliveryUpdatedAt: settledStatus ? now : null,
|
|
1014
|
+
$queuedAt: queuedAt,
|
|
1015
|
+
$maxAgeSeconds: maxAgeSeconds,
|
|
1016
|
+
$resolvedToAgent: resolvedToAgent,
|
|
1017
|
+
$payload: JSON.stringify(payload),
|
|
1018
|
+
$meta: JSON.stringify(input.meta ?? {}),
|
|
1019
|
+
$now: now,
|
|
1020
|
+
// Sanitize: only accept a plausible epoch-ms event time, else fall back to receive time.
|
|
1021
|
+
$occurredAt: sanitizeOccurredAt(input.occurredAt, now),
|
|
1022
|
+
$seq: nextMessageSeq(input.from),
|
|
1023
|
+
});
|
|
1024
|
+
const newId = Number(result.lastInsertRowid);
|
|
1025
|
+
if (digestRecipient) enqueueCoordinatorDigest(newId, digestRecipient, now, insertDigest);
|
|
1026
|
+
closeReplyObligationsOnInsert({ id: newId, from: input.from, replyTo: input.replyTo ?? null, threadId, channel: input.channel ?? null });
|
|
1027
|
+
if (answeredQuestion) markRead(answeredQuestion, input.from, now);
|
|
1028
|
+
linkMessageArtifacts(newId, attachmentRefs, input.body, input.from, now);
|
|
1029
|
+
if (deliveryStatus === "queued") {
|
|
1030
|
+
enforceQueueLimit(input.to);
|
|
1031
|
+
}
|
|
1032
|
+
return newId;
|
|
1033
|
+
};
|
|
1034
|
+
const id = insertMessage();
|
|
1035
|
+
|
|
1036
|
+
return { message: getMessage(id)!, created: true };
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
export function sendMessage(input: SendMessageInput): Message {
|
|
1040
|
+
return sendMessageWithResult(input).message;
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
export { getThread } from "./message-thread";
|
|
1044
|
+
|
|
1045
|
+
export function setMessageReaction(input: {
|
|
1046
|
+
messageId: number;
|
|
1047
|
+
actorId: string;
|
|
1048
|
+
emoji: string;
|
|
1049
|
+
action?: "add" | "remove";
|
|
1050
|
+
}, now: number = Date.now()): { ok: true; message: Message } | { ok: false; error: string } {
|
|
1051
|
+
if (!getMessage(input.messageId)) return { ok: false, error: "message not found" };
|
|
1052
|
+
const actorId = input.actorId.trim();
|
|
1053
|
+
const emoji = normalizeReactionEmoji(input.emoji);
|
|
1054
|
+
if (!actorId) return { ok: false, error: "actorId required" };
|
|
1055
|
+
if (!emoji) return { ok: false, error: "emoji required" };
|
|
1056
|
+
|
|
1057
|
+
if (input.action === "remove") {
|
|
1058
|
+
getDb().query("DELETE FROM message_reactions WHERE message_id = ? AND actor_id = ? AND emoji = ?")
|
|
1059
|
+
.run(input.messageId, actorId, emoji);
|
|
1060
|
+
} else {
|
|
1061
|
+
getDb().query(`
|
|
1062
|
+
INSERT INTO message_reactions (message_id, actor_id, emoji, created_at, updated_at)
|
|
1063
|
+
VALUES (?, ?, ?, ?, ?)
|
|
1064
|
+
ON CONFLICT(message_id, actor_id, emoji) DO UPDATE SET updated_at = excluded.updated_at
|
|
1065
|
+
`).run(input.messageId, actorId, emoji, now, now);
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
return { ok: true, message: getMessage(input.messageId)! };
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
export function findMessageByTelegramSource(input: {
|
|
1072
|
+
accountId?: string;
|
|
1073
|
+
chatId: string;
|
|
1074
|
+
messageId: string;
|
|
1075
|
+
}): Message | null {
|
|
1076
|
+
const rows = getDb().query(`
|
|
1077
|
+
${MSG_SELECT}
|
|
1078
|
+
WHERE json_extract(m.payload, '$.source.telegram.chatId') = ?
|
|
1079
|
+
AND json_extract(m.payload, '$.source.telegram.messageId') = ?
|
|
1080
|
+
AND (? IS NULL OR json_extract(m.payload, '$.channel.accountId') = ?)
|
|
1081
|
+
ORDER BY m.id DESC
|
|
1082
|
+
LIMIT 1
|
|
1083
|
+
`).all(input.chatId, input.messageId, input.accountId ?? null, input.accountId ?? null) as any[];
|
|
1084
|
+
const row = rows[0];
|
|
1085
|
+
return row ? rowToMessage(row) : null;
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
export type MessageClaimResult = { ok: boolean; error?: string; task?: Task; claimExpiresAt?: number };
|
|
1089
|
+
|
|
1090
|
+
// The complete claim transition is one writer operation (ADR 0001 §3.4): expiring a stale
|
|
1091
|
+
// lease, validating the caller/recipient, claiming the message, and claiming its linked task all
|
|
1092
|
+
// share the executor's transaction. Do not split the expiry sweep into an awaited preflight: that
|
|
1093
|
+
// would reintroduce the stale-lease/eligibility TOCTOU window this body closes.
|
|
1094
|
+
export function claimMessageBody(messageId: number, agentId: string, guard: AgentSessionGuard | undefined, now: number): MessageClaimResult {
|
|
1095
|
+
releaseExpiredClaimsBody(now);
|
|
1096
|
+
const session = validateAgentSession(agentId, guard);
|
|
1097
|
+
if (!session.ok) return { ok: false, error: session.error };
|
|
1098
|
+
const agent = getAgent(agentId);
|
|
1099
|
+
if (!agent) return { ok: false, error: "claiming agent not found" };
|
|
1100
|
+
if (agent.status === "offline") return { ok: false, error: "claiming agent is offline" };
|
|
1101
|
+
|
|
1102
|
+
const msg = getMessage(messageId);
|
|
1103
|
+
if (!msg) return { ok: false, error: "message not found" };
|
|
1104
|
+
if (!msg.claimable) return { ok: false, error: "message is not claimable" };
|
|
1105
|
+
// A same-agent re-claim is allowed (idempotent lease refresh, see claimMessageRow); only a
|
|
1106
|
+
// claim held by a *different* agent blocks (#261).
|
|
1107
|
+
if (msg.claimedBy && msg.claimedBy !== agentId) return { ok: false, error: `already claimed by ${msg.claimedBy}` };
|
|
1108
|
+
// The claimer must actually be a recipient — the same predicate that gates live delivery (bus/sse
|
|
1109
|
+
// push) and poll. Without it an unrelated agent could claim a claimable addressed directly to
|
|
1110
|
+
// someone else, and `pollMessages`/`messageMatchesAgent` then hid it from the rightful recipient,
|
|
1111
|
+
// so the message vanished for its intended owner (#1022 F7). Checked AFTER the claimedBy guard so
|
|
1112
|
+
// a genuine "already claimed" contention still reports that precise reason; a fan-out claimable
|
|
1113
|
+
// (tag:/cap:/broadcast/…) still matches every eligible pool member, and the holder's own re-claim
|
|
1114
|
+
// still matches (claimedBy is null or itself here, so the ownership short-circuit never fires).
|
|
1115
|
+
if (!messageMatchesAgent(msg, agentId, agent)) return { ok: false, error: "message is not addressed to this agent" };
|
|
1116
|
+
|
|
1117
|
+
const expiresAt = now + CLAIM_LEASE_MS;
|
|
1118
|
+
const messageClaim = claimMessageRow(messageId, agentId, now);
|
|
1119
|
+
if (!messageClaim.ok) return messageClaim;
|
|
1120
|
+
|
|
1121
|
+
const taskId = typeof msg.payload?.taskId === "number" && Number.isSafeInteger(msg.payload.taskId)
|
|
1122
|
+
? msg.payload.taskId
|
|
1123
|
+
: null;
|
|
1124
|
+
if (!taskId) return { ok: true, claimExpiresAt: expiresAt };
|
|
1125
|
+
|
|
1126
|
+
const task = getTask(taskId);
|
|
1127
|
+
if (!task) return { ok: true, claimExpiresAt: expiresAt };
|
|
1128
|
+
// Fence (#834): the claim-lease lane only manages kind='claim' tasks. A deliverable Task
|
|
1129
|
+
// is never lease-managed, so neither the same-agent refresh nor the claim update below may
|
|
1130
|
+
// touch it — even via a stray linked-message payload.
|
|
1131
|
+
if (task.kind !== CLAIM_TASK_KIND) return { ok: true, claimExpiresAt: expiresAt };
|
|
1132
|
+
|
|
1133
|
+
// Same-agent re-claim: this agent already holds the linked task. Refresh the lease in place
|
|
1134
|
+
// rather than re-transitioning (which would throw, since the task is no longer open/blocked).
|
|
1135
|
+
if (task.claimedBy === agentId && ["claimed", "in_progress"].includes(task.status)) {
|
|
1136
|
+
getDb().query(`UPDATE tasks SET claim_expires_at = ?, updated_at = ? WHERE id = ? AND ${claimTaskWhere()} AND claimed_by = ?`)
|
|
1137
|
+
.run(expiresAt, now, taskId, agentId);
|
|
1138
|
+
return { ok: true, task: getTask(taskId)!, claimExpiresAt: expiresAt };
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
if (!["open", "blocked"].includes(task.status)) {
|
|
1142
|
+
throw new ClaimError(`linked task is ${task.status}`);
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
const taskClaim = getDb().query(`
|
|
1146
|
+
UPDATE tasks SET status = 'claimed', claimed_by = ?, claimed_at = ?, claim_expires_at = ?, updated_at = ?
|
|
1147
|
+
WHERE id = ? AND message_id = ? AND ${claimTaskWhere()} AND status IN ('open', 'blocked')
|
|
1148
|
+
`).run(agentId, now, expiresAt, now, taskId, messageId);
|
|
1149
|
+
if (taskClaim.changes === 0) throw new ClaimError("linked task claim race — already claimed");
|
|
1150
|
+
|
|
1151
|
+
insertTaskEvent(taskId, {
|
|
1152
|
+
source: "agent-relay",
|
|
1153
|
+
type: "claimed",
|
|
1154
|
+
severity: task.severity,
|
|
1155
|
+
title: `Task claimed by ${agentId}`,
|
|
1156
|
+
body: `Task claimed by ${agentId}`,
|
|
1157
|
+
metadata: { agentId, messageId },
|
|
1158
|
+
}, now);
|
|
1159
|
+
|
|
1160
|
+
return { ok: true, task: getTask(taskId)!, claimExpiresAt: expiresAt };
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
export function claimMessage(messageId: number, agentId: string, guard?: AgentSessionGuard): MessageClaimResult {
|
|
1164
|
+
try {
|
|
1165
|
+
return writeTransaction(() => claimMessageBody(messageId, agentId, guard, Date.now()));
|
|
1166
|
+
} catch (e) {
|
|
1167
|
+
if (e instanceof ClaimError) return { ok: false, error: e.message };
|
|
1168
|
+
throw e;
|
|
1169
|
+
}
|
|
1170
|
+
}
|
|
1171
|
+
|
|
1172
|
+
// Like claimMessageBody, renewal folds expiry cleanup, ownership validation, and both lease updates
|
|
1173
|
+
// into the one writer transaction. This matters when a lease crosses its deadline while the request
|
|
1174
|
+
// is queued: a reader preflight followed by a writer hop could otherwise renew the wrong owner.
|
|
1175
|
+
export function renewMessageClaimBody(messageId: number, agentId: string, guard: AgentSessionGuard | undefined, now: number): MessageClaimResult {
|
|
1176
|
+
releaseExpiredClaimsBody(now);
|
|
1177
|
+
const session = validateAgentSession(agentId, guard);
|
|
1178
|
+
if (!session.ok) return { ok: false, error: session.error };
|
|
1179
|
+
const agent = getAgent(agentId);
|
|
1180
|
+
if (!agent) return { ok: false, error: "claiming agent not found" };
|
|
1181
|
+
if (agent.status === "offline") return { ok: false, error: "claiming agent is offline" };
|
|
1182
|
+
const msg = getMessage(messageId);
|
|
1183
|
+
if (!msg) return { ok: false, error: "message not found" };
|
|
1184
|
+
if (!msg.claimable) return { ok: false, error: "message is not claimable" };
|
|
1185
|
+
if (msg.claimedBy !== agentId) return { ok: false, error: msg.claimedBy ? `claimed by ${msg.claimedBy}` : "message is not claimed" };
|
|
1186
|
+
|
|
1187
|
+
const expiresAt = now + CLAIM_LEASE_MS;
|
|
1188
|
+
let task: Task | undefined;
|
|
1189
|
+
getDb().query("UPDATE messages SET claim_expires_at = ? WHERE id = ? AND claimed_by = ?").run(expiresAt, messageId, agentId);
|
|
1190
|
+
const taskId = typeof msg.payload?.taskId === "number" && Number.isSafeInteger(msg.payload.taskId)
|
|
1191
|
+
? msg.payload.taskId
|
|
1192
|
+
: null;
|
|
1193
|
+
if (taskId) {
|
|
1194
|
+
// Fenced to the claim lane (#834): never refresh a deliverable Task's (non-existent) lease.
|
|
1195
|
+
getDb().query(`UPDATE tasks SET claim_expires_at = ?, updated_at = ? WHERE id = ? AND ${claimTaskWhere()} AND claimed_by = ?`).run(expiresAt, now, taskId, agentId);
|
|
1196
|
+
task = getTask(taskId) ?? undefined;
|
|
1197
|
+
}
|
|
1198
|
+
return { ok: true, task, claimExpiresAt: expiresAt };
|
|
1199
|
+
}
|
|
1200
|
+
|
|
1201
|
+
export function renewMessageClaim(messageId: number, agentId: string, guard?: AgentSessionGuard): MessageClaimResult { return writeTransaction(() => renewMessageClaimBody(messageId, agentId, guard, Date.now())); }
|