@humwick/server 0.130.1 → 0.130.3
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/README.md +5 -0
- package/bundled/prompts/manifest.json +1 -0
- package/bundled/prompts/task.hydration.md +1 -1
- package/bundled/roles/builder.md +1 -1
- package/docs/guides/sub-coordinators.md +12 -5
- package/docs/guides/tools-administration.md +4 -0
- package/docs/guides/tools-coordination.md +2 -0
- package/docs/guides/tools-tasks.md +8 -0
- package/docs/guides/workflows.md +74 -0
- package/docs/openapi.json +486 -4
- package/package.json +10 -18
- package/public/assets/{MessageBubble-BWpoBjl4.js → MessageBubble-Bq9kr21N.js} +2 -2
- package/public/assets/{PlanGraphPanel-C0auck3n.js → PlanGraphPanel-Dqiroy06.js} +2 -2
- package/public/assets/{TraceView-DBnOx7AQ.js → TraceView-DYU962-H.js} +2 -2
- package/public/assets/{VaultDecisionCard-0kp2oNBC.js → VaultDecisionCard-DhPfzioE.js} +2 -2
- package/public/assets/{activity-yLztXEBt.js → activity-DzCcQTee.js} +2 -2
- package/public/assets/{agent-lineage-BbJDR1dW.js → agent-lineage-SgDt9i3T.js} +2 -2
- package/public/assets/agent-liveness-Bq-s73jW.js +2 -0
- package/public/assets/{agent-name-CTZBrSD9.js → agent-name-CcY3Aijy.js} +2 -2
- package/public/assets/agent-profiles-cxtRBn6O.js +2 -0
- package/public/assets/{agent-project-badge-9TqzUUYE.js → agent-project-badge-DGYbIhaI.js} +2 -2
- package/public/assets/{agent-tools-D4n40pn8.js → agent-tools-DHbftV0N.js} +2 -2
- package/public/assets/{agent-type-icon-D6FUarOf.js → agent-type-icon-CY113sp-.js} +2 -2
- package/public/assets/{agents-BYDslkJc.js → agents-BPzY7IlQ.js} +2 -2
- package/public/assets/{analytics-B-XSbEMC.js → analytics-DENFPv_a.js} +2 -2
- package/public/assets/{artifact-viewer-DdWIfV6M.js → artifact-viewer-KRvSc7sl.js} +2 -2
- package/public/assets/{artifacts-DPN1q4pA.js → artifacts-C9gSmL3s.js} +2 -2
- package/public/assets/{artifacts-oBOqks-2.js → artifacts-DT-HkI5O.js} +2 -2
- package/public/assets/{automation-4KcRFXEu.js → automation-BsmjQhKD.js} +2 -2
- package/public/assets/{backlog-Cw9xPTCF.js → backlog-8NYH_62t.js} +2 -2
- package/public/assets/{busy-health-CTu32MZt.js → busy-health-D3hwvYb4.js} +2 -2
- package/public/assets/{channels-BiXzg1G9.js → channels-DCJ5WL7O.js} +2 -2
- package/public/assets/{chat-Ctk2qwvA.js → chat-DAIl357U.js} +3 -3
- package/public/assets/{code-preview-Bm1wWqAp.js → code-preview-CzrZfr9U.js} +2 -2
- package/public/assets/{connectors-C36ax4Vw.js → connectors-xTxtlyou.js} +2 -2
- package/public/assets/{cosmos-Jj9LK2Wf.js → cosmos-BpebFLK2.js} +2 -2
- package/public/assets/{crate-agent-H6S7-B9T.js → crate-agent-BHvI5wXC.js} +2 -2
- package/public/assets/{dependency-graph-Cd1E23wa.js → dependency-graph-DGT0o3wJ.js} +2 -2
- package/public/assets/{deploys-Bwfq146q.js → deploys-hqWOHSHE.js} +2 -2
- package/public/assets/{display-CfO7rTuF.js → display-CDeH4I8T.js} +2 -2
- package/public/assets/{files-DhhZI2Ih.js → files-BTeGVmTg.js} +2 -2
- package/public/assets/{fleet-B_rFEbnL.js → fleet-DgXtNgCa.js} +2 -2
- package/public/assets/{fleet-metrics-BkHP-P3R.js → fleet-metrics-BHEt5yc_.js} +2 -2
- package/public/assets/{formatted-body-Cm1RrzmN.js → formatted-body-MLtodyPp.js} +3 -3
- package/public/assets/{formatted-body-impl-DQiOuOD1.js → formatted-body-impl-CAe664Z8.js} +2 -2
- package/public/assets/{host-providers-dialog-CHqwXTov.js → host-providers-dialog-mapF4Fj9.js} +2 -2
- package/public/assets/index-CqqgOI5R.js +15 -0
- package/public/assets/index-MYAIwYTX.css +2 -0
- package/public/assets/{insights-fH1EL-qZ.js → insights-DNyf7IzF.js} +2 -2
- package/public/assets/{integrations-C5Oix6ng.js → integrations-DlYOHq7T.js} +2 -2
- package/public/assets/{issue-ref-chip-ODyondIa.js → issue-ref-chip-CeWBNWn7.js} +2 -2
- package/public/assets/{log-viewer-Cvfy6PW7.js → log-viewer-Cib8nqdE.js} +2 -2
- package/public/assets/{maintenance-D8CDH5wZ.js → maintenance-DSn1cPm7.js} +2 -2
- package/public/assets/{managed-agents-egllbpij.js → managed-agents-C3CkM81m.js} +2 -2
- package/public/assets/{markdown-preview-CYSFgVgK.js → markdown-preview-W4VQQPAv.js} +3 -3
- package/public/assets/{markdown-preview-impl-BteVIjX4.js → markdown-preview-impl-CMsTdhjq.js} +2 -2
- package/public/assets/{memory-C8WmXsyr.js → memory-BV17qtO4.js} +2 -2
- package/public/assets/{messages-BzQdqlO6.js → messages-Bm_1AqSA.js} +2 -2
- package/public/assets/{orchestrators-B1HxzkNw.js → orchestrators-Dg-vfP09.js} +2 -2
- package/public/assets/{overview-DCUnI4Z7.js → overview-DcYCrvlr.js} +2 -2
- package/public/assets/{pairs-ftCd2XcD.js → pairs-8o9nuG3V.js} +2 -2
- package/public/assets/{profile-icon-B2zH8DMH.js → profile-icon-BsRyBMea.js} +2 -2
- package/public/assets/project-profile-instructions-DETKFn_E.js +2 -0
- package/public/assets/projects-M_m6AHws.js +2 -0
- package/public/assets/{prompt-settings-Bftq9czX.js → prompt-settings-C_mNCgeL.js} +2 -2
- package/public/assets/provider-display-BEeLXC_D.js +2 -0
- package/public/assets/{registry-DWCU5c8q.js → registry-DDHHHE5N.js} +2 -2
- package/public/assets/run-card-Dt4I4jaP.js +2 -0
- package/public/assets/scroll-text-BKXS1ahr.js +2 -0
- package/public/assets/{secrets-C7GIUATz.js → secrets-BkVwxI5O.js} +2 -2
- package/public/assets/{service-access-settings-C3aujqTG.js → service-access-settings-Crq-6a-B.js} +2 -2
- package/public/assets/{settings-C6sZ9eBa.js → settings-CYcavMFu.js} +2 -2
- package/public/assets/shipping-H6gzEeZB.js +2 -0
- package/public/assets/{stats-V9Z-GxUd.js → stats-BJVeWkpV.js} +2 -2
- package/public/assets/{status-dot-CVv0iGHL.js → status-dot-BcHyw1Vw.js} +2 -2
- package/public/assets/store-DKPDIZBe.js +9 -0
- package/public/assets/{tasks-CXU75HRF.js → tasks-qJjlQPpx.js} +2 -2
- package/public/assets/{teams-BPf976zb.js → teams-Cd5Sk1uX.js} +2 -2
- package/public/assets/{terminal-viewer-DE9BOe-8.js → terminal-viewer-CpY5_m7W.js} +3 -3
- package/public/assets/{terminal-viewer-impl-D04pjmGh.js → terminal-viewer-impl-DI_2llFR.js} +2 -2
- package/public/assets/token-estimate-Co-Jdphh.js +2 -0
- package/public/assets/{use-agent-terminal-B1yR456R.js → use-agent-terminal-0yJA_buM.js} +2 -2
- package/public/assets/{use-decisions-D-S4tpDf.js → use-decisions-uJXHf34W.js} +2 -2
- package/public/assets/use-project-list-CpWl6eHQ.js +2 -0
- package/public/assets/{use-selectors-CnrAk2YP.js → use-selectors-BdxBW8mL.js} +2 -2
- package/public/assets/{user-avatar-nBFIcR4M.js → user-avatar-3IndfpOc.js} +2 -2
- package/public/assets/versioned-prompt-editor-CIVg7XB1.js +8 -0
- package/public/assets/{work-queue-TCjJxeT-.js → work-queue-B9rnLwHZ.js} +2 -2
- package/public/assets/{workflow-marker-Cf3Hf2fN.js → workflow-marker-X8wxyhzC.js} +2 -2
- package/public/assets/{workflows-CXQX20Qj.js → workflows-o5YyMFW7.js} +2 -2
- package/public/assets/{workspaces-qSYzKYMA.js → workspaces-CzEGoAng.js} +2 -2
- package/public/cosmos.html +4 -4
- package/public/index.html +31 -29
- package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/runner/plugins/claude/hooks/gate-run-guard.provisioned.mjs +31 -1
- package/runner/src/adapters/claude-effort.ts +2 -4
- package/runner/src/adapters/claude-headless.ts +1 -1
- package/runner/src/adapters/claude-launch-exit.ts +26 -0
- package/runner/src/adapters/claude-session-probe.ts +1 -1
- package/runner/src/adapters/claude-tmux.ts +38 -10
- package/runner/src/adapters/claude.ts +28 -75
- package/runner/src/adapters/codex-launch-config.ts +4 -5
- package/runner/src/adapters/codex.ts +1 -1
- package/runner/src/adapters/opencode-provider.ts +7 -22
- package/runner/src/adapters/opencode.ts +4 -4
- package/runner/src/adapters/provider-quota-harvest.ts +20 -71
- package/runner/src/agent-runner/credentials.ts +42 -12
- package/runner/src/agent-runner/inbox.ts +27 -0
- package/runner/src/agent-runner/lifecycle-milestones.ts +2 -4
- package/runner/src/agent-runner/liveness-exchange.ts +104 -0
- package/runner/src/bin/claude.ts +4 -0
- package/runner/src/bin/codex.ts +4 -0
- package/runner/src/bin/opencode.ts +4 -0
- package/runner/src/claude-system-prompt.ts +49 -0
- package/runner/src/index.ts +5 -2
- package/runner/src/launch-assembly.ts +14 -10
- package/runner/src/profile-home.ts +1 -1
- package/runner/src/project-instructions.ts +2 -2
- package/runner/src/provider-command.ts +18 -0
- package/runner/src/provider-setup.ts +35 -0
- package/runner/src/providers.ts +2 -1
- package/runner/src/runner-core.ts +32 -38
- package/runner/src/runner-helpers.ts +0 -8
- package/runner/src/session-scratch.ts +6 -2
- package/runner/src/spawn-input.ts +2 -1
- package/runner/src/test-run-dedup.ts +59 -56
- package/runner/test-support/provisioning-context.ts +4 -2
- package/runner/test-support/runner-harness.ts +2 -1
- package/scripts/cd-config.ts +8 -0
- package/scripts/gate-run-lease.ts +10 -7
- package/scripts/gate.sh +5 -1
- package/scripts/steward-policy-cleanup.ts +2 -2
- package/src/agent-authz.ts +2 -2
- package/src/agent-drive-arbiter.ts +3 -8
- package/src/agent-exit-cleanup-async.ts +2 -2
- package/src/agent-exit-cleanup.ts +23 -19
- package/src/agent-lifecycle-events.ts +112 -85
- package/src/agent-ref.ts +3 -2
- package/src/agent-status-events.ts +43 -14
- package/src/auth/password.ts +4 -3
- package/src/auth/session-refresh.ts +1 -1
- package/src/auth/session.test-fixture.ts +2 -2
- package/src/auth/session.ts +7 -7
- package/src/automations/crud.ts +8 -81
- package/src/automations/dispatch.ts +33 -58
- package/src/automations/index.ts +1 -1
- package/src/automations/persistence.ts +65 -0
- package/src/automations/precheck.ts +18 -16
- package/src/automations/read-async.ts +11 -0
- package/src/automations/reconcile.ts +30 -39
- package/src/automations/storage.ts +33 -10
- package/src/automations/write-async.ts +33 -0
- package/src/branch-land-notice.ts +93 -0
- package/src/branch-landed.ts +31 -98
- package/src/bus.ts +40 -39
- package/src/cd-deploy-notify.ts +32 -4
- package/src/cd-host-lag-notify.ts +7 -6
- package/src/ci/incidents.ts +2 -2
- package/src/ci/monitor.ts +5 -8
- package/src/ci/notifications.ts +4 -4
- package/src/ci/root-missing.ts +4 -9
- package/src/ci/transition-notify.ts +12 -44
- package/src/claude-app/oauth-http.ts +3 -3
- package/src/cli/cd-pauses.ts +19 -0
- package/src/cli/orchestrator.ts +1 -1
- package/src/cli/state.ts +2 -19
- package/src/cli/task-edit.ts +22 -0
- package/src/cli/task.ts +3 -1
- package/src/cli/workflow.ts +19 -4
- package/src/commands-db.ts +7 -7
- package/src/commands-write.ts +8 -0
- package/src/compaction-watch.ts +10 -8
- package/src/config-store-write.ts +13 -1
- package/src/config-store.ts +25 -14
- package/src/config.ts +4 -11
- package/src/connectors.ts +10 -8
- package/src/context-advisory.ts +22 -21
- package/src/db/activity-async.ts +6 -1
- package/src/db/activity-write-ops.ts +12 -1
- package/src/db/activity.ts +1 -14
- package/src/db/agent-action-write.ts +36 -0
- package/src/db/agent-control-async.ts +9 -0
- package/src/db/agent-control-write.ts +49 -0
- package/src/db/agent-effort-observe.ts +22 -0
- package/src/db/agent-meta.ts +14 -3
- package/src/db/agent-search.ts +1 -15
- package/src/db/agents-async.ts +59 -9
- package/src/db/agents-write-ops.ts +12 -3
- package/src/db/agents.ts +95 -65
- package/src/db/auth-identities.ts +2 -2
- package/src/db/automation-read-ops.ts +11 -0
- package/src/db/automation-write-ops.ts +46 -0
- package/src/db/blackboard.ts +2 -2
- package/src/db/browser-session-write.ts +32 -0
- package/src/db/bus-outbox-write-ops.ts +3 -1
- package/src/db/checkout-refresh-schema.ts +47 -0
- package/src/db/checkout-refresh.ts +5 -5
- package/src/db/ci-incidents-async.ts +5 -5
- package/src/db/ci-incidents-write-ops.ts +2 -2
- package/src/db/command-agent-profile-backfill.ts +39 -0
- package/src/db/command-agent-profiles.ts +5 -1
- package/src/db/command-retention.ts +126 -0
- package/src/db/command-row.ts +10 -2
- package/src/db/commands-list-query.ts +2 -0
- package/src/db/commands-planner-stats.test-fixture.ts +8 -0
- package/src/db/commands-read-ops.ts +16 -0
- package/src/db/commands-spawn-read.ts +1 -1
- package/src/db/config-store-write-ops.ts +7 -2
- package/src/db/connection.ts +1 -182
- package/src/db/context-carry-write.ts +74 -0
- package/src/db/continuation-archives-async.ts +5 -0
- package/src/db/continuation-archives-write-ops.ts +7 -0
- package/src/db/continuations.ts +6 -6
- package/src/db/db-error-registry.ts +12 -0
- package/src/db/db-writer-worker.ts +8 -1
- package/src/db/deploy-events-async.ts +1 -0
- package/src/db/deploy-events-read-ops.ts +2 -1
- package/src/db/deploy-events.ts +35 -4
- package/src/db/gateway.ts +26 -133
- package/src/db/history-retention-ops.ts +13 -0
- package/src/db/hosts-registration.ts +10 -2
- package/src/db/hosts.ts +9 -6
- package/src/db/inbox-async.ts +2 -2
- package/src/db/inbox-read-ops.ts +1 -1
- package/src/db/inbox.ts +9 -17
- package/src/db/index.ts +2 -0
- package/src/db/integrations-async.ts +8 -0
- package/src/db/integrations-ops.ts +15 -0
- package/src/db/integrations.ts +15 -21
- package/src/db/issue-associations.ts +2 -2
- package/src/db/issue-lifecycle.ts +3 -4
- package/src/db/issue-refs-async.ts +23 -0
- package/src/db/issue-refs-read-ops.ts +6 -0
- package/src/db/issue-refs-write-ops.ts +29 -0
- package/src/db/issue-refs.ts +15 -16
- package/src/db/kernel-event-log-schema.ts +2 -0
- package/src/db/land-boundaries.ts +51 -5
- package/src/db/land-gate-attestations.ts +2 -2
- package/src/db/landing-receipts.ts +2 -2
- package/src/db/lifecycle-context-write.ts +5 -0
- package/src/db/lifecycle-tail-async.ts +76 -0
- package/src/db/lifecycle-tail-write-ops.ts +62 -0
- package/src/db/lifecycle-write-window.ts +2 -1
- package/src/db/lineage-pair-dedupe-sql.ts +3 -3
- package/src/db/long-running-work.ts +2 -2
- package/src/db/main-connection-mode.ts +11 -0
- package/src/db/main-connection-writes.ts +41 -2
- package/src/db/maintenance-job-reconcile.ts +61 -0
- package/src/db/maintenance-job-runs-async.ts +14 -0
- package/src/db/maintenance-job-write-ops.ts +9 -0
- package/src/db/maintenance-pauses.ts +2 -2
- package/src/db/mappers.ts +2 -14
- package/src/db/merge-lease.ts +1 -15
- package/src/db/message-send.ts +4 -0
- package/src/db/messages.ts +31 -25
- package/src/db/migrations.ts +25 -16
- package/src/db/notification-write-ops.ts +19 -0
- package/src/db/operator-answer-write.ts +19 -0
- package/src/db/orchestrators.ts +14 -76
- package/src/db/pairs-async.ts +22 -1
- package/src/db/pairs-write-ops.ts +8 -3
- package/src/db/pairs.ts +42 -61
- package/src/db/plan-dispatch-schema.ts +5 -1
- package/src/db/plan-ready-notices.ts +43 -0
- package/src/db/plan-tools-include-migration.ts +36 -0
- package/src/db/plans-write-ops.ts +2 -0
- package/src/db/presence-buffer.ts +5 -0
- package/src/db/presence-loop.ts +18 -23
- package/src/db/presence-write.ts +0 -6
- package/src/db/project-entries-async.ts +14 -0
- package/src/db/project-entries-read-ops.ts +5 -1
- package/src/db/project-entries-write-ops.ts +8 -0
- package/src/db/project-entries.ts +15 -12
- package/src/db/project-journal.ts +2 -2
- package/src/db/project-profile-instructions.ts +50 -0
- package/src/db/project-trust-approvals.ts +2 -2
- package/src/db/prompt-templates.ts +4 -4
- package/src/db/prompt-versions.ts +9 -2
- package/src/db/provider-config-history.ts +8 -3
- package/src/db/provider-model-seed.ts +34 -0
- package/src/db/read-op-marshaling-fixtures.ts +23 -0
- package/src/db/read-ops.ts +8 -0
- package/src/db/retention.ts +13 -2
- package/src/db/review-publish-write.ts +8 -0
- package/src/db/routing-policy.ts +2 -3
- package/src/db/runtime-admin-async.ts +19 -0
- package/src/db/runtime-admin-write-ops.ts +36 -0
- package/src/db/runtime-tail-async.ts +288 -0
- package/src/db/runtime-tail-write-ops.ts +97 -0
- package/src/db/schema.ts +13 -4
- package/src/db/spawn-budget.ts +5 -0
- package/src/db/spawn-delegation-state.ts +11 -4
- package/src/db/spawn-delegation.ts +1 -11
- package/src/db/sql-audit-indexes.ts +3 -0
- package/src/db/stats-async.ts +9 -6
- package/src/db/task-entity.ts +28 -6
- package/src/db/task-list.ts +3 -1
- package/src/db/tasks.ts +1 -17
- package/src/db/team-claim-policy.ts +60 -0
- package/src/db/teams-async.ts +4 -0
- package/src/db/teams-write-ops.ts +4 -0
- package/src/db/terminal-events.ts +15 -0
- package/src/db/timer-cutover-bodies.ts +292 -0
- package/src/db/timer-cutover-core.ts +37 -278
- package/src/db/timer-cutover-state.ts +40 -0
- package/src/db/timer-cutover-write-ops.ts +1 -40
- package/src/db/timer-ingress.ts +7 -1
- package/src/db/token-db-write-ops.ts +19 -0
- package/src/db/token-standing-async.ts +12 -0
- package/src/db/token-standing.ts +21 -20
- package/src/db/token-usage-retention.ts +33 -0
- package/src/db/token-usage-write-ops.ts +1 -1
- package/src/db/token-usage.ts +4 -1
- package/src/db/user-invites-async.ts +13 -0
- package/src/db/user-invites.ts +3 -3
- package/src/db/users.ts +14 -6
- package/src/db/workflow-contact.ts +1 -1
- package/src/db/workflow-task-read-ops.ts +30 -0
- package/src/db/workspaces.ts +8 -5
- package/src/db/write-ops.ts +37 -12
- package/src/db/writer-fault-seam.ts +2 -9
- package/src/db/writer-fault-test-ops.ts +18 -0
- package/src/db/writer-gateway.ts +58 -56
- package/src/dev.ts +8 -3
- package/src/dispatch-availability.ts +10 -6
- package/src/ephemeral/{landing-ingress-proof-worker.ts → landing-ingress-proof.test-fixture.ts} +4 -2
- package/src/event-loop-lag.ts +4 -2
- package/src/event-loop-yield.ts +2 -2
- package/src/events.ts +10 -8
- package/src/host/disk-alert.ts +121 -0
- package/src/host-provider-store.ts +5 -4
- package/src/hub-metrics-report.ts +5 -1
- package/src/hub-metrics.ts +38 -18
- package/src/injection-sweep-pacing.ts +6 -8
- package/src/land-gate-notifications.ts +11 -10
- package/src/land-gate-queue-progress.ts +3 -3
- package/src/land-settle-dispatch.ts +52 -92
- package/src/lifecycle-context-pressure.ts +11 -10
- package/src/lifecycle-manager.ts +107 -100
- package/src/maintenance/breaker.ts +18 -16
- package/src/maintenance/cd-watcher.ts +3 -3
- package/src/maintenance/checkout-refresh.ts +18 -1
- package/src/maintenance/critical-job-watchdog.ts +19 -20
- package/src/maintenance/events.ts +3 -3
- package/src/maintenance/history-retention-job.ts +30 -0
- package/src/maintenance/index.ts +1 -0
- package/src/maintenance/jobs.ts +32 -69
- package/src/maintenance/long-running-work.ts +3 -1
- package/src/maintenance/offline-agent-prune-job.ts +28 -0
- package/src/maintenance/orphaned-sessions.ts +5 -4
- package/src/maintenance/pauses.ts +4 -10
- package/src/maintenance/plan-ready-notice-job.ts +71 -0
- package/src/maintenance/scheduler.ts +98 -137
- package/src/maintenance/stalled-delivery-pager.ts +10 -9
- package/src/maintenance/teams.ts +19 -30
- package/src/maintenance/workspaces.ts +18 -28
- package/src/managed-policy-escalation.ts +7 -7
- package/src/managed-policy.ts +32 -28
- package/src/managed-provider-gate.ts +5 -4
- package/src/managed-spawn-reservation.ts +5 -4
- package/src/mcp/index.ts +12 -9
- package/src/mcp/output-descriptions.ts +8 -8
- package/src/mcp/presentation.ts +6 -5
- package/src/mcp/project-profile-instructions.ts +32 -0
- package/src/mcp/runtime-output.ts +6 -1
- package/src/mcp/self-care-visibility.ts +2 -2
- package/src/mcp/spawn-targets-matrix.ts +10 -1
- package/src/mcp/tool-groups.ts +4 -3
- package/src/mcp/tool-roles.ts +81 -0
- package/src/mcp/tools-spawn.ts +4 -3
- package/src/mcp/tools-workspace.ts +1 -1
- package/src/mcp-agent-action.ts +1 -2
- package/src/mcp-blackboard-tools.ts +6 -5
- package/src/mcp-decision-tools.ts +7 -7
- package/src/mcp-egress-tools.ts +10 -9
- package/src/mcp-issue-activity-tools.ts +2 -2
- package/src/mcp-issue-association-tools.ts +4 -4
- package/src/mcp-issue-ref-tools.ts +13 -12
- package/src/mcp-maintenance-tools.ts +2 -2
- package/src/mcp-merge-tools.ts +5 -5
- package/src/mcp-notification-subscription-tools.ts +14 -15
- package/src/mcp-output-levels.test-fixture.ts +1 -1
- package/src/mcp-profile-trust-tools.ts +5 -5
- package/src/mcp-project-journal-tools.ts +4 -12
- package/src/mcp-project-tools.ts +17 -18
- package/src/mcp-provider-catalog.ts +2 -2
- package/src/mcp-routing-policy-tools.ts +3 -2
- package/src/mcp-task-tools.ts +11 -5
- package/src/mcp-team-template-tools.ts +3 -3
- package/src/mcp-team-tools.ts +6 -6
- package/src/mcp-workflow-tools.ts +13 -4
- package/src/memory-area-injection.ts +13 -12
- package/src/memory-boundary-capture.ts +6 -6
- package/src/memory-injection.ts +45 -43
- package/src/merge-pause-maintenance.ts +5 -4
- package/src/notification-router.ts +44 -17
- package/src/notification-types.ts +2 -1
- package/src/notify.ts +5 -5
- package/src/observed-reset-refresh.ts +4 -4
- package/src/operator-alarm.ts +23 -11
- package/src/project-ingest.ts +6 -6
- package/src/project-instructions.ts +12 -1
- package/src/project-profile-instruction-text.ts +6 -0
- package/src/project-profile-instructions.ts +20 -0
- package/src/project-trust.ts +12 -11
- package/src/prompt-resolver.ts +3 -3
- package/src/provider-catalog-store.ts +3 -49
- package/src/provider-config-store.ts +12 -11
- package/src/provider-model-seed.ts +1 -18
- package/src/provider-quota-async.ts +5 -7
- package/src/provider-quota-config-store.ts +5 -4
- package/src/provider-secrets.test-fixture.ts +3 -3
- package/src/provider-timeline-event.ts +4 -7
- package/src/quota-band-delivery.ts +2 -2
- package/src/recipe-runner.ts +6 -5
- package/src/repo-config-source.ts +10 -4
- package/src/retention-config-store.ts +4 -3
- package/src/reviewer-pipeline.ts +11 -10
- package/src/routes/_route.ts +4 -4
- package/src/routes/_shared.ts +13 -12
- package/src/routes/agent-effort.ts +5 -5
- package/src/routes/agent-heartbeat-quota.ts +23 -0
- package/src/routes/agent-keep.ts +1 -1
- package/src/routes/agent-profiles.ts +6 -6
- package/src/routes/agent-reporting.ts +1 -1
- package/src/routes/agent-self-effort.ts +5 -5
- package/src/routes/agent-sessions.ts +24 -24
- package/src/routes/agents-spawn.ts +2 -2
- package/src/routes/agents.ts +19 -121
- package/src/routes/auth.ts +14 -15
- package/src/routes/authority-audit.ts +2 -2
- package/src/routes/automations.ts +6 -5
- package/src/routes/channel-binding-delete.ts +1 -1
- package/src/routes/channel-output.ts +3 -3
- package/src/routes/claude-api-budget.ts +5 -5
- package/src/routes/commands-listing.ts +5 -1
- package/src/routes/commands.ts +31 -29
- package/src/routes/context-resets.ts +2 -2
- package/src/routes/continuation-archives.ts +2 -2
- package/src/routes/coordinator-teams.ts +1 -1
- package/src/routes/decisions.ts +2 -2
- package/src/routes/host-secret-files.ts +1 -1
- package/src/routes/hosts.ts +11 -11
- package/src/routes/inbox.ts +3 -2
- package/src/routes/index.ts +12 -2
- package/src/routes/integrations.ts +32 -56
- package/src/routes/issue-activity.ts +2 -2
- package/src/routes/issue-associations.ts +4 -4
- package/src/routes/issue-refs.ts +9 -9
- package/src/routes/kernel-timers-operator.ts +1 -1
- package/src/routes/memory.ts +1 -1
- package/src/routes/merges.ts +11 -11
- package/src/routes/messages.ts +23 -17
- package/src/routes/orchestrator-bootstrap.ts +2 -2
- package/src/routes/orchestrator-host-registration.ts +4 -2
- package/src/routes/orchestrator-host-utilization.ts +5 -3
- package/src/routes/orchestrator-proxy.ts +4 -4
- package/src/routes/orchestrator.ts +28 -19
- package/src/routes/pairs.ts +8 -8
- package/src/routes/project-profile-instructions.ts +27 -0
- package/src/routes/project-trust.ts +3 -3
- package/src/routes/projects.ts +16 -16
- package/src/routes/prompt-templates.ts +12 -12
- package/src/routes/provider-config.ts +6 -6
- package/src/routes/provider-quota-config.ts +2 -2
- package/src/routes/provider-quotas.ts +10 -10
- package/src/routes/run-command.ts +1 -1
- package/src/routes/secrets-backup.ts +2 -2
- package/src/routes/secrets-import.ts +1 -1
- package/src/routes/secrets-vault.ts +7 -7
- package/src/routes/settings.ts +6 -6
- package/src/routes/shipping.ts +9 -1
- package/src/routes/spawn-policy.ts +8 -7
- package/src/routes/sse.ts +2 -2
- package/src/routes/stats.ts +6 -6
- package/src/routes/task-http.ts +15 -1
- package/src/routes/task-issues.ts +11 -26
- package/src/routes/tasks.ts +22 -53
- package/src/routes/team-templates.ts +12 -12
- package/src/routes/teams-config.ts +2 -2
- package/src/routes/teams.ts +10 -10
- package/src/routes/tokens.ts +30 -22
- package/src/routes/users.ts +24 -24
- package/src/routes/viewer-read.ts +3 -3
- package/src/routes/web-tool-calls.ts +4 -4
- package/src/routes/workflows.ts +22 -7
- package/src/routes/workspaces.ts +17 -16
- package/src/routing-policy-normalize.ts +1 -2
- package/src/routing-policy-push.ts +6 -6
- package/src/routing-step-defaults.ts +0 -2
- package/src/runner-token-mint-limit.ts +63 -0
- package/src/runtime-grant.ts +21 -13
- package/src/runtime-tokens.ts +59 -35
- package/src/secrets-broker/config.ts +1 -1
- package/src/secrets-broker/service.ts +2 -2
- package/src/security.ts +16 -21
- package/src/self-resume-carry.ts +21 -110
- package/src/self-resume-supersede.ts +4 -3
- package/src/self-resume.ts +54 -66
- package/src/server-background.ts +2 -2
- package/src/server.ts +26 -24
- package/src/services/agent-action.ts +12 -31
- package/src/services/agent-effort.ts +7 -32
- package/src/services/agent-hang-watchdog-job.ts +2 -2
- package/src/services/agent-heartbeat.ts +166 -0
- package/src/services/agent-reporting.ts +1 -1
- package/src/services/browser-inventory.ts +3 -3
- package/src/services/browser-session-state.ts +3 -2
- package/src/services/browser-session.ts +21 -27
- package/src/services/bus-command-update.ts +9 -9
- package/src/services/checkout-refresh-state.ts +1 -0
- package/src/services/checkout-refresh.test-fixture.ts +3 -2
- package/src/services/command-host.ts +7 -2
- package/src/services/coordinator-digest.ts +3 -2
- package/src/services/dispatch-command.ts +12 -13
- package/src/services/effective-launch-driver.ts +14 -9
- package/src/services/host-changed-paths.test-fixture.ts +5 -6
- package/src/services/host-project-readiness.ts +2 -2
- package/src/services/host-providers.ts +1 -1
- package/src/services/host-utilization.ts +27 -4
- package/src/services/idle-agent-digest.ts +17 -12
- package/src/services/idle-epics.ts +9 -10
- package/src/services/interrupt-agent.ts +12 -9
- package/src/services/issue-activity.ts +3 -3
- package/src/services/issue-associations.ts +15 -18
- package/src/services/issue-lifecycle-comments.ts +3 -2
- package/src/services/issue-lifecycle.ts +69 -72
- package/src/services/issue-refs.ts +10 -15
- package/src/services/kernel-timers-cutover-chaos-worker.ts +11 -8
- package/src/services/kernel-timers-ingress-chaos-worker.ts +6 -1
- package/src/services/kernel-timers-ingress.ts +4 -4
- package/src/services/kernel-timers-message-authority-chaos-worker.ts +3 -10
- package/src/services/kernel-timers-operator-chaos-worker.ts +3 -2
- package/src/services/kernel-timers-outbox.ts +1 -1
- package/src/services/kernel-timers-stage10-operator.ts +1 -1
- package/src/services/kernel-timers.ts +4 -3
- package/src/services/land-gate-placement.ts +11 -2
- package/src/services/land-issue-relations.ts +5 -4
- package/src/services/land-restart-retry.ts +7 -6
- package/src/services/landed-ancestry.ts +25 -8
- package/src/services/legacy-landing-host.ts +4 -1
- package/src/services/legacy-landing-recovery.ts +8 -6
- package/src/services/managed-running.ts +17 -17
- package/src/services/memory-areas.ts +17 -53
- package/src/services/merge-pause.ts +9 -15
- package/src/services/operator-decisions.ts +37 -41
- package/src/services/orchestrator-registration-recovery.ts +6 -2
- package/src/services/orchestrator-upgrade.ts +14 -12
- package/src/services/permission-decision.ts +4 -3
- package/src/services/plan-ci-notice.ts +57 -0
- package/src/services/plan-ci-recovery.ts +2 -55
- package/src/services/plan-conformance.ts +4 -4
- package/src/services/plan-dispatch-policy.ts +10 -3
- package/src/services/plan-dispatch.ts +35 -14
- package/src/services/plan-graph.ts +39 -261
- package/src/services/plan-import.ts +1 -1
- package/src/services/plan-live-bindings.ts +8 -37
- package/src/services/plan-task-create.ts +1 -1
- package/src/services/plan-terminal-refs.ts +2 -12
- package/src/services/plan-wake-digest.ts +9 -3
- package/src/services/profile-trust.ts +6 -5
- package/src/services/project-config-read.ts +70 -0
- package/src/services/project-profile-instructions.ts +54 -0
- package/src/services/project.ts +11 -10
- package/src/services/prompt-templates.ts +6 -5
- package/src/services/provider-hold-nudge.ts +9 -9
- package/src/services/provider-hold-record.ts +13 -12
- package/src/services/provider-state-audit.ts +19 -18
- package/src/services/provisioning-harness/budget-baseline.json +4 -4
- package/src/services/provisioning-harness/driver.ts +1 -1
- package/src/services/provisioning-harness/fixture-matrix.ts +3 -3
- package/src/services/provisioning-harness/lifecycle.ts +24 -22
- package/src/services/provisioning-harness/prepare.ts +16 -17
- package/src/services/rate-limit-resume.ts +10 -9
- package/src/services/red-main-auto-revert.ts +7 -5
- package/src/services/red-main-controller-deps.ts +20 -3
- package/src/services/red-main-incident.ts +3 -1
- package/src/services/red-main-quarantine.ts +2 -3
- package/src/services/register-agent.ts +22 -22
- package/src/services/restart-project-role.ts +1 -1
- package/src/services/restart-spawn.ts +74 -61
- package/src/services/review-publish.ts +7 -24
- package/src/services/review-ref-reconcile.ts +29 -38
- package/src/services/runtime-dependency-alert.ts +27 -0
- package/src/services/scheduler-command.ts +11 -9
- package/src/services/scheduler.ts +5 -5
- package/src/services/self-care-state.ts +2 -1
- package/src/services/self-effort-grant.ts +5 -25
- package/src/services/self-effort.ts +5 -5
- package/src/services/send-message.ts +21 -34
- package/src/services/shutdown-agent.ts +17 -14
- package/src/services/spawn-agent.ts +25 -43
- package/src/services/spawn-chain-inspector.ts +7 -14
- package/src/services/spawn-cwd-placement.ts +21 -5
- package/src/services/spawn-issue-activity.ts +8 -6
- package/src/services/spawn-launch.ts +17 -1
- package/src/services/spawn-loss-escalation.ts +1 -1
- package/src/services/spawn-policy.ts +68 -0
- package/src/services/spawn-registration-watchdog.ts +2 -2
- package/src/services/spawn-repo-probe.ts +7 -5
- package/src/services/spawn-tree-cleanup.ts +8 -9
- package/src/services/steward-reaper.ts +4 -4
- package/src/services/task-context-hydration.ts +25 -1
- package/src/services/task-delivery.ts +20 -34
- package/src/services/task-dispatch.ts +3 -0
- package/src/services/task-entity.ts +40 -203
- package/src/services/task-issue-link.ts +13 -20
- package/src/services/task-issue-weave.ts +12 -11
- package/src/services/task-lifecycle.ts +27 -31
- package/src/services/task-repo-cwd.ts +37 -0
- package/src/services/task-review-hold.ts +4 -17
- package/src/services/task-semantic-events.ts +13 -11
- package/src/services/task-state-reconcile.ts +8 -17
- package/src/services/task-validation.ts +2 -2
- package/src/services/team-templates.ts +12 -11
- package/src/services/team.ts +31 -98
- package/src/services/terminal-provider-exit.ts +6 -5
- package/src/services/timer-message-fire-chaos-worker.ts +7 -3
- package/src/services/timer-message-fire-outbox.ts +1 -1
- package/src/services/transient-agent-reaper.ts +25 -20
- package/src/services/turn-reconcile-audit.ts +9 -9
- package/src/services/user-onboarding.ts +8 -6
- package/src/services/user-profile.ts +6 -9
- package/src/services/work-finality.ts +16 -4
- package/src/services/workflow-auto-start.ts +26 -13
- package/src/services/workflow-caller.ts +61 -4
- package/src/services/workflow-child-proof-worker.ts +1 -1
- package/src/services/workflow-ci-main.ts +1 -1
- package/src/services/workflow-control-proof-worker.ts +1 -1
- package/src/services/workflow-coordinator.ts +8 -2
- package/src/services/workflow-decisions.ts +5 -5
- package/src/services/workflow-deferred-cleanup.ts +5 -3
- package/src/services/workflow-effect-driver.ts +42 -17
- package/src/services/workflow-effects.ts +58 -37
- package/src/services/workflow-land-notice.ts +10 -0
- package/src/services/workflow-pause-text.ts +43 -0
- package/src/services/workflow-pins.ts +7 -4
- package/src/services/workflow-reconcile.ts +14 -11
- package/src/services/workflow-resume-pins.ts +3 -3
- package/src/services/workflow-routing-defaults.ts +18 -0
- package/src/services/workflow-run-view.ts +6 -3
- package/src/services/workflow-run.test-fixture.ts +1 -1
- package/src/services/workflow-runs.ts +61 -33
- package/src/services/workflow-supervisor-state.ts +26 -1
- package/src/services/workflow-supervisor.ts +11 -6
- package/src/services/workspace-recovery.ts +4 -3
- package/src/settings/registry.ts +1 -2
- package/src/spawn-admission.ts +10 -2
- package/src/spawn-command.ts +4 -4
- package/src/spawn-models.ts +10 -12
- package/src/spawn-placement.ts +28 -10
- package/src/spawn-targets.ts +9 -9
- package/src/sse-agent-status.ts +15 -6
- package/src/sse.ts +49 -24
- package/src/startup-context-injection.ts +62 -57
- package/src/state-adoption/cd-cutover.ts +53 -7
- package/src/state-adoption/fleet-cutover.ts +35 -0
- package/src/state-adoption/fleet-plan.ts +36 -0
- package/src/state-adoption/index.ts +2 -2
- package/src/state-adoption/linux-plan.ts +2 -2
- package/src/state-adoption/linux.ts +2 -2
- package/src/state-adoption/macos-plan.ts +2 -2
- package/src/state-adoption/macos.ts +1 -1
- package/src/steward-handoff.ts +4 -3
- package/src/steward-policy-cleanup.ts +9 -8
- package/src/steward.ts +9 -8
- package/src/task-dispatch-live.ts +6 -3
- package/src/task-dispatcher.ts +3 -3
- package/src/teams-config-store.ts +4 -3
- package/src/token-db-write.ts +10 -0
- package/src/token-db.ts +2 -2
- package/src/token-usage-async.ts +2 -4
- package/src/user-awaiting-reply.ts +5 -5
- package/src/workspace-actions.ts +24 -29
- package/src/workspace-auto-merge.ts +14 -12
- package/src/workspace-changed-paths-client.ts +16 -5
- package/src/workspace-cleanup-stale.ts +30 -7
- package/src/workspace-command-settle.ts +26 -17
- package/src/workspace-config.ts +1 -1
- package/src/workspace-conflict-resolver.ts +9 -7
- package/src/workspace-dead-owner-recovery.ts +5 -4
- package/src/workspace-escalation.ts +12 -11
- package/src/workspace-human-escalation.ts +3 -3
- package/src/workspace-land-gate-watchdog.ts +3 -3
- package/src/workspace-land-refusal.ts +20 -0
- package/src/workspace-land-stopped.ts +1 -0
- package/src/workspace-merge.ts +10 -26
- package/src/workspace-nothing-to-land-notice.ts +2 -2
- package/src/workspace-orphans.ts +18 -37
- package/src/workspace-pr-completion.ts +10 -8
- package/src/workspace-rekey.ts +3 -3
- package/src/workspace-steward-failure.ts +2 -2
- package/src/workspace-steward-wake.ts +4 -4
- package/node_modules/@humwick/kernel/LICENSE +0 -167
- package/node_modules/@humwick/kernel/async-entity-persistence.ts +0 -344
- package/node_modules/@humwick/kernel/async-event-log.ts +0 -107
- package/node_modules/@humwick/kernel/automations.pilot.ts +0 -147
- package/node_modules/@humwick/kernel/config.ts +0 -111
- package/node_modules/@humwick/kernel/contract.ts +0 -572
- package/node_modules/@humwick/kernel/control-authz.ts +0 -281
- package/node_modules/@humwick/kernel/control.ts +0 -645
- package/node_modules/@humwick/kernel/effects.ts +0 -493
- package/node_modules/@humwick/kernel/event-log.ts +0 -319
- package/node_modules/@humwick/kernel/http-transport.ts +0 -384
- package/node_modules/@humwick/kernel/identity-grammar.ts +0 -20
- package/node_modules/@humwick/kernel/identity.ts +0 -248
- package/node_modules/@humwick/kernel/index.ts +0 -28
- package/node_modules/@humwick/kernel/kernel-persistence.ts +0 -181
- package/node_modules/@humwick/kernel/landing-incident.ts +0 -306
- package/node_modules/@humwick/kernel/landing.ts +0 -953
- package/node_modules/@humwick/kernel/manifest-validation.ts +0 -460
- package/node_modules/@humwick/kernel/mcp-transport.ts +0 -109
- package/node_modules/@humwick/kernel/message-authority-chaos-worker.ts +0 -200
- package/node_modules/@humwick/kernel/message-authority.ts +0 -281
- package/node_modules/@humwick/kernel/module-host.ts +0 -722
- package/node_modules/@humwick/kernel/openapi-init.ts +0 -14
- package/node_modules/@humwick/kernel/package.json +0 -39
- package/node_modules/@humwick/kernel/persistence-schema.ts +0 -248
- package/node_modules/@humwick/kernel/persistence.ts +0 -510
- package/node_modules/@humwick/kernel/registry.ts +0 -60
- package/node_modules/@humwick/kernel/sqlite-kernel-persistence.ts +0 -499
- package/node_modules/@humwick/kernel/sqlite-module-host.ts +0 -87
- package/node_modules/@humwick/kernel/timers-chaos-worker.ts +0 -186
- package/node_modules/@humwick/kernel/timers.pilot.ts +0 -1411
- package/node_modules/@humwick/kernel/workflow-activation.ts +0 -25
- package/node_modules/@humwick/kernel/workflow-backstop.ts +0 -40
- package/node_modules/@humwick/kernel/workflow-cancel-tree.ts +0 -20
- package/node_modules/@humwick/kernel/workflow-chaos-worker.ts +0 -213
- package/node_modules/@humwick/kernel/workflow-composition.ts +0 -231
- package/node_modules/@humwick/kernel/workflow-container.ts +0 -72
- package/node_modules/@humwick/kernel/workflow-control.test-fixture.ts +0 -42
- package/node_modules/@humwick/kernel/workflow-control.ts +0 -178
- package/node_modules/@humwick/kernel/workflow-definition.ts +0 -507
- package/node_modules/@humwick/kernel/workflow-dispatch.ts +0 -60
- package/node_modules/@humwick/kernel/workflow-foreach.ts +0 -167
- package/node_modules/@humwick/kernel/workflow-journal-codec.ts +0 -339
- package/node_modules/@humwick/kernel/workflow-journal.ts +0 -922
- package/node_modules/@humwick/kernel/workflow-lane.ts +0 -48
- package/node_modules/@humwick/kernel/workflow-lease-owner.ts +0 -60
- package/node_modules/@humwick/kernel/workflow-recovery.test-fixture.ts +0 -19
- package/node_modules/@humwick/kernel/workflow-runtime.ts +0 -938
- package/node_modules/@humwick/kernel/workflow-script.ts +0 -11
- package/node_modules/@humwick/kernel/workflow-state.ts +0 -299
- package/node_modules/@humwick/kernel/workflow-step-commit.ts +0 -195
- package/node_modules/@humwick/kernel/workflow-transitions.ts +0 -317
- package/node_modules/@humwick/kernel/workflow-values.ts +0 -153
- package/node_modules/@humwick/kernel/workflow.pilot.ts +0 -376
- package/node_modules/@humwick/offload/LICENSE +0 -167
- package/node_modules/@humwick/offload/README.md +0 -57
- package/node_modules/@humwick/offload/dist/async-runner.d.ts +0 -18
- package/node_modules/@humwick/offload/dist/async-runner.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/async-runner.js +0 -158
- package/node_modules/@humwick/offload/dist/async-runner.js.map +0 -1
- package/node_modules/@humwick/offload/dist/envelope.d.ts +0 -25
- package/node_modules/@humwick/offload/dist/envelope.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/envelope.js +0 -80
- package/node_modules/@humwick/offload/dist/envelope.js.map +0 -1
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts +0 -10
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.js +0 -59
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.js.map +0 -1
- package/node_modules/@humwick/offload/dist/index.d.ts +0 -5
- package/node_modules/@humwick/offload/dist/index.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/index.js +0 -5
- package/node_modules/@humwick/offload/dist/index.js.map +0 -1
- package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts +0 -62
- package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/subprocess-runner.js +0 -295
- package/node_modules/@humwick/offload/dist/subprocess-runner.js.map +0 -1
- package/node_modules/@humwick/offload/dist/types.d.ts +0 -111
- package/node_modules/@humwick/offload/dist/types.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/types.js +0 -176
- package/node_modules/@humwick/offload/dist/types.js.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-pool.d.ts +0 -23
- package/node_modules/@humwick/offload/dist/worker-pool.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-pool.js +0 -435
- package/node_modules/@humwick/offload/dist/worker-pool.js.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-runtime.d.ts +0 -2
- package/node_modules/@humwick/offload/dist/worker-runtime.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-runtime.js +0 -27
- package/node_modules/@humwick/offload/dist/worker-runtime.js.map +0 -1
- package/node_modules/@humwick/offload/dist/worker.d.ts +0 -5
- package/node_modules/@humwick/offload/dist/worker.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/worker.js +0 -1
- package/node_modules/@humwick/offload/dist/worker.js.map +0 -1
- package/node_modules/@humwick/offload/package.json +0 -42
- package/node_modules/@humwick/offload/src/async-runner.ts +0 -170
- package/node_modules/@humwick/offload/src/envelope.ts +0 -92
- package/node_modules/@humwick/offload/src/fixtures/worker-task.ts +0 -49
- package/node_modules/@humwick/offload/src/index.ts +0 -4
- package/node_modules/@humwick/offload/src/subprocess-runner.ts +0 -334
- package/node_modules/@humwick/offload/src/types.ts +0 -235
- package/node_modules/@humwick/offload/src/worker-pool.ts +0 -463
- package/node_modules/@humwick/offload/src/worker-runtime.ts +0 -32
- package/node_modules/@humwick/offload/src/worker.ts +0 -5
- package/public/assets/agent-liveness-DyqxfB-t.js +0 -2
- package/public/assets/agent-profiles-BpI_jTxq.js +0 -2
- package/public/assets/index-B7ZerHLY.css +0 -2
- package/public/assets/index-BU3uWo2t.js +0 -15
- package/public/assets/projects-B_lmcqfO.js +0 -2
- package/public/assets/provider-display-DbLWpP3j.js +0 -2
- package/public/assets/run-card-CO_bguQf.js +0 -2
- package/public/assets/shipping-Bu8p1gEw.js +0 -2
- package/public/assets/store-BvtFdlGX.js +0 -9
- package/public/assets/use-project-list-B-T2Bnnn.js +0 -2
- package/public/assets/versioned-prompt-editor-Diu8BIaM.js +0 -8
- package/runner/src/agent-runner/http-liveness.ts +0 -85
- package/runner/src/gate-run-lease-probe.ts +0 -38
- package/src/db/claude-catalog-reconcile.ts +0 -27
- package/src/db/on-loop-write-transaction.ts +0 -34
- package/src/routing-model-aliases.ts +0 -21
package/src/db/schema.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { COMMAND_RETENTION_SCHEMA } from "./command-retention";
|
|
2
|
+
import { TOKEN_USAGE_RETENTION_SCHEMA } from "./token-usage-retention";
|
|
1
3
|
import { DURABLE_PAYLOAD_SCHEMA } from "./durable-payloads"; import { PLAN_IMPORT_SCHEMA_SQL } from "./plan-import-schema";
|
|
2
4
|
import { PROJECT_ROOTS_SCHEMA } from "./project-root-schema";
|
|
3
5
|
import { seedBuiltInTokenProfiles } from "../token-db";
|
|
@@ -25,7 +27,8 @@ import { resetLifecycleSeqSeed } from "./lifecycle-seq.ts";
|
|
|
25
27
|
import { resetFannedSeq } from "../sse-outbox-cursor";
|
|
26
28
|
import { dropLegacyContinuationArchiveIndex } from "./continuation-archive-search.ts";
|
|
27
29
|
import { applyMigrations } from "./migrations.ts";
|
|
28
|
-
import { PROMPT_TEMPLATES_SCHEMA_SQL, seedPromptTemplatesIfNeeded } from "./prompt-templates-schema";
|
|
30
|
+
import { reconcileProviderModelSeed } from "./provider-model-seed"; import { PROMPT_TEMPLATES_SCHEMA_SQL, seedPromptTemplatesIfNeeded } from "./prompt-templates-schema";
|
|
31
|
+
import { PROJECT_PROFILE_INSTRUCTIONS_SCHEMA_SQL } from "./project-profile-instructions";
|
|
29
32
|
import { ensureLandingPhaseOneSchema } from "./landing-schema.ts";
|
|
30
33
|
import { beginStartupPhase, timeStartupPhase } from "../startup-timing";
|
|
31
34
|
import { resetMainConnectionWrites } from "./main-connection-writes";
|
|
@@ -552,6 +555,7 @@ export function initDb(path: string = "agent-relay.db"): Database {
|
|
|
552
555
|
CREATE INDEX IF NOT EXISTS idx_config_history_key ON config_history(namespace, key, version);
|
|
553
556
|
|
|
554
557
|
${PROMPT_TEMPLATES_SCHEMA_SQL}
|
|
558
|
+
${PROJECT_PROFILE_INSTRUCTIONS_SCHEMA_SQL}
|
|
555
559
|
|
|
556
560
|
-- Per-user settings (#391, epic #388). The user dimension the global \`config\` table lacks:
|
|
557
561
|
-- the same \`(namespace, key)\` descriptor address resolves to a per-user value, keyed by the
|
|
@@ -844,6 +848,8 @@ export function initDb(path: string = "agent-relay.db"): Database {
|
|
|
844
848
|
-- distinct from severity). Both optional; absent on claim-kind rows.
|
|
845
849
|
tags TEXT,
|
|
846
850
|
priority TEXT,
|
|
851
|
+
-- #3736 — paths[] (JSON array of repo-relative paths) a project spawn policy matches.
|
|
852
|
+
paths TEXT,
|
|
847
853
|
-- #1535 WS1 — parent/epic tree edge: a task has at most one parent. Cycle-guarded
|
|
848
854
|
-- in application code (src/db/task-entity.ts setTaskParent), the same way as the
|
|
849
855
|
-- depends-on DAG below (#834 finding 7) — SQLite CHECK can't express acyclicity.
|
|
@@ -858,7 +864,7 @@ export function initDb(path: string = "agent-relay.db"): Database {
|
|
|
858
864
|
-- gate-validated but does NOT arm a land (no ingress); the coordinator's clear (CAS on
|
|
859
865
|
-- the held delivery's host-probed HEAD) promotes that exact delivery. Distinct from the
|
|
860
866
|
-- permanent workspace landBlocked. Default 0 keeps every pre-#2518 Task unheld.
|
|
861
|
-
validation_items TEXT, terminal_stage TEXT, completed_at INTEGER,
|
|
867
|
+
validation_items TEXT, terminal_stage TEXT, completed_at INTEGER, on_deploy TEXT,
|
|
862
868
|
review_hold INTEGER NOT NULL DEFAULT 0 CHECK (review_hold IN (0, 1)),
|
|
863
869
|
-- #2862 durable owner: a coordinator role (coordinator:TEAM) or a human id, never an agent id.
|
|
864
870
|
owner TEXT
|
|
@@ -867,6 +873,8 @@ export function initDb(path: string = "agent-relay.db"): Database {
|
|
|
867
873
|
CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
|
|
868
874
|
CREATE INDEX IF NOT EXISTS idx_tasks_target ON tasks(target);
|
|
869
875
|
CREATE INDEX IF NOT EXISTS idx_tasks_updated ON tasks(updated_at);
|
|
876
|
+
-- #3740: cover the integration aggregation without fetching task bodies/metadata.
|
|
877
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_integration_stats ON tasks(coalesce(json_extract(metadata, '$.relayIntegrationName'), source), status, claimed_by, last_seen_at, updated_at, source);
|
|
870
878
|
CREATE INDEX IF NOT EXISTS idx_tasks_message_status
|
|
871
879
|
ON tasks(message_id, status)
|
|
872
880
|
WHERE message_id IS NOT NULL;
|
|
@@ -958,7 +966,6 @@ export function initDb(path: string = "agent-relay.db"): Database {
|
|
|
958
966
|
shutdown_requested_at INTEGER
|
|
959
967
|
);
|
|
960
968
|
CREATE INDEX IF NOT EXISTS idx_automation_runs_automation ON automation_runs(automation_id, created_at);
|
|
961
|
-
CREATE INDEX IF NOT EXISTS idx_automation_runs_status ON automation_runs(status);
|
|
962
969
|
CREATE INDEX IF NOT EXISTS idx_automation_runs_task ON automation_runs(task_id);
|
|
963
970
|
|
|
964
971
|
CREATE TABLE IF NOT EXISTS task_events (
|
|
@@ -1258,6 +1265,8 @@ export function initDb(path: string = "agent-relay.db"): Database {
|
|
|
1258
1265
|
${PLAN_IMPORT_SCHEMA_SQL};
|
|
1259
1266
|
${IDLE_DIGEST_SCHEMA_SQL};
|
|
1260
1267
|
${TASK_TOKEN_TOTALS_SCHEMA};
|
|
1268
|
+
${TOKEN_USAGE_RETENTION_SCHEMA};
|
|
1269
|
+
${COMMAND_RETENTION_SCHEMA};
|
|
1261
1270
|
${LONG_RUNNING_WORK_SCHEMA};
|
|
1262
1271
|
${SHIPPING_STATS_SCHEMA};
|
|
1263
1272
|
${OPERATOR_ACTIONS_SCHEMA};
|
|
@@ -1456,7 +1465,7 @@ export function initDb(path: string = "agent-relay.db"): Database {
|
|
|
1456
1465
|
ensureLandingPhaseOneSchema();
|
|
1457
1466
|
// Vault catalog, environments and metadata upgrades share applyMigrations (#3561, #3562).
|
|
1458
1467
|
timeStartupPhase("db.migrations", applyMigrations);
|
|
1459
|
-
timeStartupPhase("db.prompt-seed", seedPromptTemplatesIfNeeded);
|
|
1468
|
+
timeStartupPhase("db.prompt-seed", seedPromptTemplatesIfNeeded); timeStartupPhase("db.model-seed", reconcileProviderModelSeed);
|
|
1460
1469
|
timeStartupPhase("db.token-profile-seed", seedBuiltInTokenProfiles);
|
|
1461
1470
|
|
|
1462
1471
|
timeStartupPhase("db.planner-statistics", () => refreshPlannerStats(getDb()));
|
package/src/db/spawn-budget.ts
CHANGED
|
@@ -45,6 +45,11 @@ function observedTokens(agentIds: string[]): ObservedSubtreeSpend {
|
|
|
45
45
|
COALESCE(SUM(usage_status IS NOT NULL), 0) AS unknownReports
|
|
46
46
|
FROM session_token_usage WHERE agent_id IN (SELECT value FROM json_each(?))`)
|
|
47
47
|
.get(ids) as { tokens: number; unknownReports: number };
|
|
48
|
+
const retired = getDb().query(`SELECT COALESCE(SUM(tokens), 0) AS tokens,
|
|
49
|
+
COALESCE(SUM(unknown_reports), 0) AS unknownReports FROM retired_token_usage_totals
|
|
50
|
+
WHERE agent_id IN (SELECT value FROM json_each(?))`).get(ids) as { tokens: number; unknownReports: number };
|
|
51
|
+
row.tokens += retired.tokens;
|
|
52
|
+
row.unknownReports += retired.unknownReports;
|
|
48
53
|
const live = getDb().query(`SELECT COALESCE(SUM(status = 'busy'), 0) AS busyAgents,
|
|
49
54
|
COALESCE(SUM(CASE WHEN json_valid(meta) THEN MAX(0, COALESCE(json_extract(meta, '$.unreportedTokenUsage'), 0)) ELSE 0 END), 0) AS unreportedReports
|
|
50
55
|
FROM agents WHERE id IN (SELECT value FROM json_each(?))`)
|
|
@@ -77,13 +77,20 @@ export function spawnDelegationState(agentId: string, launchProfile?: string) {
|
|
|
77
77
|
participating: Boolean((ancestors?.length !== 1 || launchProfile === "sub-coordinator")
|
|
78
78
|
&& (grant || ownTeam?.parentTeamId || (rootTeam && hasPrivateTeams(rootTeam.id)))), enabled: grant?.enabled === true,
|
|
79
79
|
grant, projectId: ancestors && ancestors.length > 1 ? delegatedProjectId(agentId) ?? projectIdForAgent(agent) : rootTeam?.projectId,
|
|
80
|
-
displaced: (ancestors ?? [agentId])
|
|
81
|
-
const ancestor = getAgent(id);
|
|
82
|
-
return isDisplacedSeat(id, ancestor?.teamId ?? seatTeam(id)?.id);
|
|
83
|
-
}),
|
|
80
|
+
displaced: displacedThroughDelegation(ancestors ?? [agentId]),
|
|
84
81
|
};
|
|
85
82
|
}
|
|
86
83
|
|
|
84
|
+
/** The agent's own seat was claimed, or that of an ancestor it reaches only through delegated launches. An
|
|
85
|
+
* ordinary child is inherited by the claimant and keeps its standing (#3773). */
|
|
86
|
+
function displacedThroughDelegation(ancestors: readonly string[]): boolean {
|
|
87
|
+
for (const id of ancestors) {
|
|
88
|
+
if (isDisplacedSeat(id, getAgent(id)?.teamId ?? seatTeam(id)?.id)) return true;
|
|
89
|
+
if (!delegatedLaunch(id)) return false;
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
|
|
87
94
|
/** Ordinary tokens avoid ancestry reads; private-team linkage survives grant removal. */
|
|
88
95
|
export function participatesInSpawnDelegation(agentId: string): boolean {
|
|
89
96
|
return Boolean(getDb().query(`WITH RECURSIVE lineage(id, depth) AS (
|
|
@@ -5,8 +5,6 @@ import { getPersistedAgentRuntimeCard as getAgent } from "./agent-card-read";
|
|
|
5
5
|
import { getDb, ValidationError } from "./connection";
|
|
6
6
|
import { runnerSpawnGrantForAgent } from "../runtime-grant";
|
|
7
7
|
import { optionalNonNegativeInt } from "../validation";
|
|
8
|
-
import { sameHostIdentity } from "../utils";
|
|
9
|
-
import { getOrchestrator } from "./orchestrators";
|
|
10
8
|
import { stringValue } from "@humwick/sdk";
|
|
11
9
|
import type { CreateCommandInput } from "../types";
|
|
12
10
|
import { getLaunchFact } from "./launch-facts";
|
|
@@ -37,15 +35,7 @@ export function assertDelegatedSpawnTarget(input: CreateCommandInput) {
|
|
|
37
35
|
return !agent || agent.status === "offline" || agent.meta?.lifecycleAction === "shutting-down";
|
|
38
36
|
})) throw new ValidationError("SPAWN_SUBTREE_STOPPING: caller or ancestor has stopped");
|
|
39
37
|
const projectId = delegatedProjectTarget(input, state);
|
|
40
|
-
|
|
41
|
-
const targetHost = stringValue(input.params?.orchestratorId);
|
|
42
|
-
if (parentHost && targetHost) {
|
|
43
|
-
// #3650: machine is the raw os.hostname() ("WBOX"); orchestrator identity is configured ("wbox"/"wbox-1").
|
|
44
|
-
const target = getOrchestrator(targetHost);
|
|
45
|
-
const sameHost = sameHostIdentity(parentHost, targetHost)
|
|
46
|
-
|| (target && [target.id, target.hostname, target.agentId].some(identity => sameHostIdentity(identity, parentHost)));
|
|
47
|
-
if (!sameHost) throw new ValidationError("SPAWN_PROJECT_MISMATCH: delegated launches stay on their parent's host");
|
|
48
|
-
}
|
|
38
|
+
// #3769 — placement owns the host; delegatedProjectTarget checks its registered project checkout.
|
|
49
39
|
if (state.depth === 1 && profile === "sub-coordinator") throw new ValidationError("SPAWN_DEPTH_EXCEEDED: sub-coordinators cannot delegate another coordinator");
|
|
50
40
|
const workflow = Boolean(input.params?.workflowRunId);
|
|
51
41
|
const grant = runnerSpawnGrantForAgent(parentId);
|
|
@@ -44,6 +44,9 @@ export const SQL_AUDIT_INDEXES = [
|
|
|
44
44
|
`CREATE INDEX IF NOT EXISTS idx_task_events_land_workspace ON task_events(json_extract(metadata, '$.workspaceId'))
|
|
45
45
|
WHERE type = 'deliverable' AND json_extract(metadata, '$.land.requested') = 1`,
|
|
46
46
|
LAND_WITHDRAWN_INDEX_SQL,
|
|
47
|
+
// #3779 spawnRequestId -> Task resolution (every register/land/deliver auth check): a full task_events scan blocked the loop.
|
|
48
|
+
`CREATE INDEX IF NOT EXISTS idx_task_events_spawn_request ON task_events(json_extract(metadata, '$.spawnRequestId'))
|
|
49
|
+
WHERE type = 'agent.spawn_requested'`,
|
|
47
50
|
`CREATE INDEX IF NOT EXISTS idx_task_events_land_bound_workspace ON task_events(${LAND_WORKSPACE_EXPRESSION})
|
|
48
51
|
WHERE type = 'deliverable' AND json_extract(metadata, '$.land.requested') = 1`,
|
|
49
52
|
`CREATE INDEX IF NOT EXISTS idx_task_events_deliverable_workspace ON task_events(${LAND_WORKSPACE_EXPRESSION}, task_id)
|
package/src/db/stats-async.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mainConnectionWrites } from "./main-connection-writes";
|
|
1
|
+
import { mainConnectionBootWrites, mainConnectionWrites } from "./main-connection-writes";
|
|
2
2
|
import { allWriterOps } from "./write-ops";
|
|
3
3
|
import { assertMainThreadState } from "./main-thread-state";
|
|
4
4
|
// Async reader-pool facades for DB-only stats. Health is a deliberate documented deferral: its
|
|
@@ -105,7 +105,7 @@ async function probeDatabaseLiveness(): Promise<HealthCheck> {
|
|
|
105
105
|
* `readerBackend`/`writerBackend` plus reader-pool depth/in-flight/shed counts unconditionally (the
|
|
106
106
|
* in-process backend's zeroed pool numbers ARE the "report that plainly" answer, not a special case).
|
|
107
107
|
*/
|
|
108
|
-
function buildDbGatewayCheck(stats: DbGatewayStats): HealthCheck {
|
|
108
|
+
export function buildDbGatewayCheck(stats: DbGatewayStats): HealthCheck {
|
|
109
109
|
const reader = stats.reader;
|
|
110
110
|
const readerActive = reader.backend !== "uninitialized";
|
|
111
111
|
const wedged = stats.writer.wedged;
|
|
@@ -117,9 +117,11 @@ function buildDbGatewayCheck(stats: DbGatewayStats): HealthCheck {
|
|
|
117
117
|
const detail = [
|
|
118
118
|
`writer=${stats.writerBackend}`,
|
|
119
119
|
`reader=${stats.readerBackend}`,
|
|
120
|
-
|
|
120
|
+
// #3798 — the op split counts executed writes; the registered op definitions are named as such.
|
|
121
|
+
`onLoopOps=${stats.writer.onLoopOps}; writerThreadOps=${stats.writer.writerThreadOps}`,
|
|
122
|
+
`opDefinitions onLoop=${specs.length - offLoop} offLoop=${offLoop}`,
|
|
121
123
|
`mainConnectionWrites1h=${JSON.stringify(writes)}`,
|
|
122
|
-
...(wedged ? [
|
|
124
|
+
...(wedged ? [`writer wedged: op ${wedged.op} running ${Math.round(wedged.runningMs / 1000)}s`] : []),
|
|
123
125
|
...(shedCount > 0 ? [`${shedCount} reader shed(s)`] : []),
|
|
124
126
|
].join("; ");
|
|
125
127
|
return {
|
|
@@ -128,9 +130,10 @@ function buildDbGatewayCheck(stats: DbGatewayStats): HealthCheck {
|
|
|
128
130
|
deployRole: "load",
|
|
129
131
|
detail,
|
|
130
132
|
metrics: {
|
|
131
|
-
onLoopOps:
|
|
132
|
-
writerThreadOps:
|
|
133
|
+
onLoopOps: stats.writer.onLoopOps,
|
|
134
|
+
writerThreadOps: stats.writer.writerThreadOps,
|
|
133
135
|
mainConnectionWrites1h: Object.values(writes).reduce((sum, count) => sum + count, 0),
|
|
136
|
+
mainConnectionBootWrites: mainConnectionBootWrites(),
|
|
134
137
|
writerQueued: stats.writer.queued,
|
|
135
138
|
writerBusy: stats.writer.busy,
|
|
136
139
|
writerHighWater: stats.writer.highWater,
|
package/src/db/task-entity.ts
CHANGED
|
@@ -37,6 +37,7 @@ import {
|
|
|
37
37
|
type TaskStatus,
|
|
38
38
|
} from "../types";
|
|
39
39
|
import { parseJson } from "../utils";
|
|
40
|
+
import { repoRelativePath } from "@humwick/sdk/spawn-policy";
|
|
40
41
|
import { cleanEnum, cleanStringArray, optionalEnum } from "../validation";
|
|
41
42
|
import { getDb, writeTransaction, ValidationError } from "./connection.ts";
|
|
42
43
|
import { ownerForNewTask } from "./task-owner.ts";
|
|
@@ -108,6 +109,16 @@ function cleanTags(value: unknown, field = "tags"): string[] | undefined {
|
|
|
108
109
|
return cleanStringArray(value, field, { itemMax: 60, maxItems: 30 });
|
|
109
110
|
}
|
|
110
111
|
|
|
112
|
+
/** #3736 — repo-relative, normalized; a path that leaves the repo is refused. Stored null when empty. */
|
|
113
|
+
function taskPathsColumn(value: unknown): string | null {
|
|
114
|
+
const paths = (cleanStringArray(value, "paths", { itemMax: 300, maxItems: 50 }) ?? []).map((path, i) => {
|
|
115
|
+
const rel = repoRelativePath(path);
|
|
116
|
+
if (rel === undefined) throw new ValidationError(`paths[${i}] must be a repo-relative path inside the repo`);
|
|
117
|
+
return rel;
|
|
118
|
+
});
|
|
119
|
+
return paths.length ? JSON.stringify([...new Set(paths)]) : null;
|
|
120
|
+
}
|
|
121
|
+
|
|
111
122
|
// #1535 WS3 — backlog lifecycle state. Optional (like priority): absent stays undefined so a
|
|
112
123
|
// non-backlog task's column is NULL; a present-but-invalid value throws rather than silently
|
|
113
124
|
// dropping. The backlog→promoted flip is a distinct writer (setTaskBacklogState in db/backlog.ts).
|
|
@@ -196,6 +207,7 @@ export interface CreateDeliverableTaskInput {
|
|
|
196
207
|
complexity?: TaskComplexity;
|
|
197
208
|
context?: string;
|
|
198
209
|
terminalStage?: Task["terminalStage"];
|
|
210
|
+
onDeploy?: string;
|
|
199
211
|
doneWhen?: string; branch?: string;
|
|
200
212
|
teamId?: string;
|
|
201
213
|
projectId?: string;
|
|
@@ -206,6 +218,7 @@ export interface CreateDeliverableTaskInput {
|
|
|
206
218
|
latestSteer?: string;
|
|
207
219
|
dispatch?: TaskDispatch;
|
|
208
220
|
tags?: string[];
|
|
221
|
+
paths?: string[];
|
|
209
222
|
priority?: TaskPriority;
|
|
210
223
|
/** #1535 WS3 — seed the task directly into the backlog (`backlog`) so it shows up in the
|
|
211
224
|
* prioritized backlog query until promoted. Absent ⇒ not backlog-managed. */
|
|
@@ -225,6 +238,7 @@ export function createDeliverableTaskBody(input: CreateDeliverableTaskInput, now
|
|
|
225
238
|
const intent = requireText(input.intent, "intent", 1_000_000);
|
|
226
239
|
const dispatch = cleanTaskDispatch(input.dispatch);
|
|
227
240
|
const complexity = cleanTaskComplexity(input.complexity ?? dispatch?.complexity, "complexity") ?? DEFAULT_TASK_COMPLEXITY;
|
|
241
|
+
const onDeploy = optionalText(input.onDeploy, "onDeploy", 500);
|
|
228
242
|
const context = optionalText(input.context, "context", 1_000_000);
|
|
229
243
|
const branch = optionalText(input.branch, "branch", 500);
|
|
230
244
|
const taskProject = cleanTaskProject(input);
|
|
@@ -237,8 +251,8 @@ export function createDeliverableTaskBody(input: CreateDeliverableTaskInput, now
|
|
|
237
251
|
INSERT INTO tasks (
|
|
238
252
|
source, title, body, severity, status, target, occurrence_count, metadata,
|
|
239
253
|
created_at, updated_at, last_seen_at,
|
|
240
|
-
kind, intent, complexity, context, latest_steer, deliverable_stage, done_when, branch, team_id, project_id, repo, created_by, dispatch, tags, priority, backlog_state, owner
|
|
241
|
-
) VALUES (?, ?, ?, 'info', 'open', ?, 1, '{}', ?, ?, ?, '${DELIVERABLE_TASK_KIND}', ?, ?, ?, ?, 'none', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
254
|
+
kind, intent, complexity, context, latest_steer, deliverable_stage, done_when, branch, team_id, project_id, repo, created_by, dispatch, tags, paths, priority, backlog_state, owner, on_deploy
|
|
255
|
+
) VALUES (?, ?, ?, 'info', 'open', ?, 1, '{}', ?, ?, ?, '${DELIVERABLE_TASK_KIND}', ?, ?, ?, ?, 'none', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
242
256
|
`).run(
|
|
243
257
|
optionalText(input.source, "source", 200) ?? "coordinator",
|
|
244
258
|
title,
|
|
@@ -254,9 +268,11 @@ export function createDeliverableTaskBody(input: CreateDeliverableTaskInput, now
|
|
|
254
268
|
createdBy,
|
|
255
269
|
dispatch ? JSON.stringify(dispatch) : null,
|
|
256
270
|
tags.length ? JSON.stringify(tags) : null,
|
|
271
|
+
taskPathsColumn(input.paths),
|
|
257
272
|
priority ?? null,
|
|
258
273
|
backlogState ?? null,
|
|
259
274
|
ownerForNewTask(createdBy, teamId),
|
|
275
|
+
onDeploy ?? null,
|
|
260
276
|
);
|
|
261
277
|
const id = Number(result.lastInsertRowid);
|
|
262
278
|
if (input.terminalStage) getDb().query("UPDATE tasks SET terminal_stage = ? WHERE id = ?").run(input.terminalStage, id);
|
|
@@ -282,6 +298,7 @@ export interface UpdateDeliverableTaskInput {
|
|
|
282
298
|
complexity?: TaskComplexity;
|
|
283
299
|
context?: string;
|
|
284
300
|
latestSteer?: string;
|
|
301
|
+
onDeploy?: string;
|
|
285
302
|
doneWhen?: string;
|
|
286
303
|
dispatch?: TaskDispatch;
|
|
287
304
|
teamId?: string;
|
|
@@ -290,6 +307,8 @@ export interface UpdateDeliverableTaskInput {
|
|
|
290
307
|
actor?: string;
|
|
291
308
|
/** Absent ⇒ untouched. `[]` (or `null`) ⇒ clear all tags. */
|
|
292
309
|
tags?: string[] | null;
|
|
310
|
+
/** Absent ⇒ untouched. `[]` (or `null`) ⇒ clear all paths. */
|
|
311
|
+
paths?: string[] | null;
|
|
293
312
|
/** Absent ⇒ untouched. `null` ⇒ clear (priority has no default, unlike complexity). */
|
|
294
313
|
priority?: TaskPriority | null;
|
|
295
314
|
}
|
|
@@ -309,6 +328,7 @@ export function updateDeliverableTaskBody(id: number, input: UpdateDeliverableTa
|
|
|
309
328
|
if (input.complexity !== undefined) push("complexity", cleanTaskComplexity(input.complexity) ?? null);
|
|
310
329
|
if (input.context !== undefined) push("context", optionalText(input.context, "context", 1_000_000) ?? null);
|
|
311
330
|
if (input.latestSteer !== undefined) push("latest_steer", optionalText(input.latestSteer, "latestSteer", 1_000_000) ?? null);
|
|
331
|
+
if (input.onDeploy !== undefined) push("on_deploy", optionalText(input.onDeploy, "onDeploy", 500) ?? null);
|
|
312
332
|
if (input.doneWhen !== undefined) push("done_when", optionalText(input.doneWhen, "doneWhen", 1_000_000) ?? null);
|
|
313
333
|
if (input.teamId !== undefined) push("team_id", optionalText(input.teamId, "teamId", 200) ?? null);
|
|
314
334
|
if (input.projectId !== undefined || input.repo !== undefined) {
|
|
@@ -321,6 +341,7 @@ export function updateDeliverableTaskBody(id: number, input: UpdateDeliverableTa
|
|
|
321
341
|
const tags = input.tags === null ? [] : (cleanTags(input.tags) ?? []);
|
|
322
342
|
push("tags", tags.length ? JSON.stringify(tags) : null);
|
|
323
343
|
}
|
|
344
|
+
if (input.paths !== undefined) push("paths", taskPathsColumn(input.paths ?? []));
|
|
324
345
|
if (input.terminalStage !== undefined) push("terminal_stage", input.terminalStage === null ? null : cleanTaskTerminalStage(input.terminalStage));
|
|
325
346
|
if (input.priority !== undefined) push("priority", input.priority === null ? null : requireTaskPriority(input.priority));
|
|
326
347
|
if (sets.length > 0) {
|
|
@@ -1064,14 +1085,15 @@ export function deliverableTaskIdsByOwnerAgent(agentId: string): number[] {
|
|
|
1064
1085
|
// event (recorded BEFORE the child registers) carries the spawnRequestId. The landing worker's
|
|
1065
1086
|
// `meta.spawnRequestId` resolves back through it to the Task. Returns every matching task id so a
|
|
1066
1087
|
// reused spawnRequestId can't silently drop a link.
|
|
1088
|
+
export const TASK_IDS_BY_SPAWN_REQUEST_SQL = `SELECT DISTINCT te.task_id AS id FROM task_events te INDEXED BY idx_task_events_spawn_request
|
|
1089
|
+
JOIN tasks t ON t.id = te.task_id AND t.kind = '${DELIVERABLE_TASK_KIND}'
|
|
1090
|
+
WHERE te.type = 'agent.spawn_requested' AND json_extract(te.metadata, '$.spawnRequestId') = ?
|
|
1091
|
+
ORDER BY te.task_id ASC`;
|
|
1067
1092
|
export function deliverableTaskIdsBySpawnRequestId(spawnRequestId: string): number[] {
|
|
1068
1093
|
const cleaned = spawnRequestId?.trim();
|
|
1069
1094
|
if (!cleaned) return [];
|
|
1070
1095
|
return (getDb()
|
|
1071
|
-
.query(
|
|
1072
|
-
JOIN tasks t ON t.id = te.task_id AND t.kind = '${DELIVERABLE_TASK_KIND}'
|
|
1073
|
-
WHERE te.type = 'agent.spawn_requested' AND json_extract(te.metadata, '$.spawnRequestId') = ?
|
|
1074
|
-
ORDER BY te.task_id ASC`)
|
|
1096
|
+
.query(TASK_IDS_BY_SPAWN_REQUEST_SQL)
|
|
1075
1097
|
.all(cleaned) as Array<{ id: number }>)
|
|
1076
1098
|
.map((r) => r.id);
|
|
1077
1099
|
}
|
package/src/db/task-list.ts
CHANGED
|
@@ -41,7 +41,8 @@ function buildDeliverableTasksWhere(filter: ListDeliverableTasksFilter): { claus
|
|
|
41
41
|
}
|
|
42
42
|
if (filter.staleOwnerGone) conditions.push(STALE_TASK_OWNER_SQL);
|
|
43
43
|
if (filter.status) { conditions.push("status = ?"); params.push(filter.status); }
|
|
44
|
-
if (filter.deliverableStage)
|
|
44
|
+
if (filter.deliverableStage === "awaiting-deploy") conditions.push("deliverable_stage IN ('landed-on-main', 'deploying')");
|
|
45
|
+
else if (filter.deliverableStage) { conditions.push("deliverable_stage = ?"); params.push(filter.deliverableStage); }
|
|
45
46
|
if (filter.teamId) { conditions.push("team_id = ?"); params.push(filter.teamId); }
|
|
46
47
|
if (filter.createdBy) { conditions.push("created_by = ?"); params.push(filter.createdBy); }
|
|
47
48
|
if (filter.ownerAgentId) { conditions.push("owner_agent_id = ?"); params.push(filter.ownerAgentId); }
|
|
@@ -87,6 +88,7 @@ function taskListItem(task: Task): TaskListItem {
|
|
|
87
88
|
status: task.status,
|
|
88
89
|
kind: task.kind,
|
|
89
90
|
...(task.validationItems ? { validationItems: task.validationItems } : {}),
|
|
91
|
+
...(task.onDeploy ? { onDeploy: task.onDeploy } : {}),
|
|
90
92
|
...(task.terminalStage ? { terminalStage: task.terminalStage } : {}),
|
|
91
93
|
...(task.completedAt ? { completedAt: task.completedAt } : {}),
|
|
92
94
|
...(task.staleOwnerGone ? { staleOwnerGone: true } : {}),
|
package/src/db/tasks.ts
CHANGED
|
@@ -1,19 +1,5 @@
|
|
|
1
1
|
import { taskVisibilitySql, type ViewerScope } from "./viewer-scope";
|
|
2
|
-
import {
|
|
3
|
-
import { isRecord, stringValue, isMechanicalMessageKind } from "@humwick/sdk";
|
|
4
|
-
import { ORCHESTRATOR_PROTOCOL_VERSION, VERSION } from "../config.ts";
|
|
5
|
-
import { parseJson } from "../utils";
|
|
6
|
-
import { isLiveIsolatedWorkspace } from "../workspace-phase";
|
|
7
|
-
import {
|
|
8
|
-
CONTRACT_REQUIREMENTS,
|
|
9
|
-
contractCompatibility,
|
|
10
|
-
parseRuntimeCapabilities,
|
|
11
|
-
parseRuntimeContracts,
|
|
12
|
-
parseRuntimePackage,
|
|
13
|
-
type RuntimeContracts,
|
|
14
|
-
} from "../contracts";
|
|
15
|
-
import { STALE_TTL_MS, DAY_MS, CLAIM_LEASE_MS, POOL_CLAIM_LEASE_MS, WORKSPACE_MERGE_LEASE_MS } from "../config";
|
|
16
|
-
import { matchAgents } from "../agent-ref";
|
|
2
|
+
import { CLAIM_LEASE_MS } from "../config";
|
|
17
3
|
import { getAgent, validateAgentSession } from "./agents.ts";
|
|
18
4
|
import { messageTaskClosed } from "./claim-sql.ts";
|
|
19
5
|
import { ClaimError, getDb, writeTransaction } from "./connection.ts";
|
|
@@ -51,7 +37,6 @@ export function taskMessageBody(task: Pick<Task, "id" | "source" | "severity" |
|
|
|
51
37
|
return lines.join("\n");
|
|
52
38
|
}
|
|
53
39
|
|
|
54
|
-
|
|
55
40
|
export function getTask(id: number): Task | null {
|
|
56
41
|
const row = getDb().query(`${TASK_SELECT} WHERE id = ?`).get(id) as any;
|
|
57
42
|
return row ? rowToTask(row) : null;
|
|
@@ -85,7 +70,6 @@ export function listTasks(filter?: { viewer?: ViewerScope | null; status?: strin
|
|
|
85
70
|
return (getDb().query(`${TASK_SELECT} ${where} ORDER BY updated_at DESC LIMIT ?`).all(...params) as any[]).map(rowToTask);
|
|
86
71
|
}
|
|
87
72
|
|
|
88
|
-
|
|
89
73
|
/** Deliverable stages meaning the work already left the worker's hands (#2036): a Task sitting in
|
|
90
74
|
* `in_progress` while its land gate runs is not a stalled worker. Excluded IN SQL, not after the
|
|
91
75
|
* fact — these rows carry the OLDEST claims, so a post-LIMIT filter would let them consume the
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { STALE_TTL_MS } from "../config";
|
|
2
|
+
import { getAgent } from "./agents";
|
|
3
|
+
import { countLiveTeamMembers, getTeam, claimTeamWithAdoption, isClaimableTeam } from "./teams";
|
|
4
|
+
import type { Team } from "../types";
|
|
5
|
+
export class TeamAuthError extends Error {}
|
|
6
|
+
export class TeamNotFoundError extends Error {}
|
|
7
|
+
function lineageRootForAgent(agentId: string): string | undefined {
|
|
8
|
+
let current = getAgent(agentId);
|
|
9
|
+
const seen = new Set<string>();
|
|
10
|
+
while (current) {
|
|
11
|
+
if (seen.has(current.id)) return undefined;
|
|
12
|
+
seen.add(current.id);
|
|
13
|
+
if (!current.spawnedBy) return current.id;
|
|
14
|
+
current = getAgent(current.spawnedBy);
|
|
15
|
+
}
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function coordinatorIsLive(team: Team): boolean {
|
|
20
|
+
if (!team.coordinatorId) return false;
|
|
21
|
+
const coordinator = getAgent(team.coordinatorId);
|
|
22
|
+
if (!coordinator || coordinator.status === "offline") return false;
|
|
23
|
+
if (coordinator.teamId === team.id) return countLiveTeamMembers(team.id, Date.now() - STALE_TTL_MS) > 0;
|
|
24
|
+
return coordinator.lastSeen > Date.now() - STALE_TTL_MS;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** How a claim was authorized — carried into the audit trail so an orphan takeover is
|
|
28
|
+
* distinguishable from a routine same-lineage reclaim. */
|
|
29
|
+
export type TeamClaimMode = "admin" | "same-lineage" | "orphan-takeover";
|
|
30
|
+
|
|
31
|
+
// #1454 — live owners require same-lineage authority; dead owners permit orphan takeover.
|
|
32
|
+
|
|
33
|
+
function assertCanClaimTeam(admin: boolean, team: Team, callerAgentId: string): TeamClaimMode {
|
|
34
|
+
const caller = getAgent(callerAgentId);
|
|
35
|
+
const callerTeam = caller?.teamId ? getTeam(caller.teamId) : null;
|
|
36
|
+
if (!admin && callerTeam?.parentTeamId && team.id !== callerTeam.id) {
|
|
37
|
+
throw new TeamAuthError("a sub-coordinator may claim only its own private team");
|
|
38
|
+
}
|
|
39
|
+
const callerRoot = lineageRootForAgent(callerAgentId);
|
|
40
|
+
const teamRoot = team.rootCoordinatorId ?? team.coordinatorId;
|
|
41
|
+
// Same-lineage reclaim is the routine fast path (a replacement spawned under the original
|
|
42
|
+
// founder) and stays allowed regardless of owner liveness.
|
|
43
|
+
if (callerRoot && teamRoot && callerRoot === teamRoot) return "same-lineage";
|
|
44
|
+
if (admin) return "admin";
|
|
45
|
+
// #1454 orphan takeover: a replacement coordinator of a DIFFERENT lineage may adopt the team only
|
|
46
|
+
// when its owning coordinator is not live (offline, or stale past the heartbeat TTL). This is the
|
|
47
|
+
// sole security boundary for the cross-lineage path — a healthy owner is never displaced.
|
|
48
|
+
if (!coordinatorIsLive(team)) return "orphan-takeover";
|
|
49
|
+
throw new TeamAuthError(`caller ${callerAgentId} cannot claim team ${team.id}`);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
export function claimAuthorizedTeam(teamId: string, agentId: string, admin: boolean) {
|
|
54
|
+
if (!isClaimableTeam(getTeam(teamId))) throw new TeamNotFoundError(`active team ${teamId} not found`);
|
|
55
|
+
let captured: { mode: TeamClaimMode; priorCoordinatorId: string | null } | undefined;
|
|
56
|
+
const result = claimTeamWithAdoption(teamId, agentId, team => {
|
|
57
|
+
captured = { mode: assertCanClaimTeam(admin, team, agentId), priorCoordinatorId: team.coordinatorId ?? null };
|
|
58
|
+
});
|
|
59
|
+
return { ...result, ...captured! };
|
|
60
|
+
}
|
package/src/db/teams-async.ts
CHANGED
|
@@ -56,3 +56,7 @@ export function setTeamBriefAsync(input: Parameters<typeof setTeamBrief>[0]): Pr
|
|
|
56
56
|
export function dissolveTeamAsync(teamId: string, input?: Parameters<typeof dissolveTeam>[1], requestId: string = randomUUID()): Promise<ReturnType<typeof dissolveTeam>> {
|
|
57
57
|
return getGateway().write("teams.dissolve", { teamId, input }, { idempotencyKey: requestId }) as unknown as Promise<ReturnType<typeof dissolveTeam>>;
|
|
58
58
|
}
|
|
59
|
+
|
|
60
|
+
export function ensureTeamAsync(agentId: string, opts: { projectId?: string } = {}): Promise<NonNullable<ReturnType<typeof getTeam>>> {
|
|
61
|
+
return write("teams.ensure", { agentId, id: `team_${randomUUID()}`, ...opts });
|
|
62
|
+
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { claimAuthorizedTeam } from "./team-claim-policy";
|
|
2
|
+
import { ensureTeamInternal } from "./teams";
|
|
1
3
|
// Team writer operations. Guards that were formerly adjacent sync statements now execute inside
|
|
2
4
|
// the writer transaction; async callers submit a main-thread generated id and never rely on worker
|
|
3
5
|
// process-local state.
|
|
@@ -10,6 +12,8 @@ import {
|
|
|
10
12
|
import type { WriterOpContext, WriterOpSpec } from "./write-ops.ts";
|
|
11
13
|
|
|
12
14
|
export const TEAMS_WRITE_OPS: Readonly<Record<string, WriterOpSpec>> = Object.freeze({
|
|
15
|
+
"teams.ensure": { offLoop: true, idempotent: true, fn: (a: { agentId: string; id: string; projectId?: string }, ctx) => ensureTeamInternal(a.agentId, a.id, ctx.now, false, a.projectId ?? null) },
|
|
16
|
+
"teams.claimAuthorized": { offLoop: true, idempotent: true, fn: (a: { teamId: string; agentId: string; admin: boolean }) => claimAuthorizedTeam(a.teamId, a.agentId, a.admin) },
|
|
13
17
|
"teams.zeroMembers.set": { offLoop: true, idempotent: true, fn: (a: { teamId: string; ts: number }) => setTeamZeroMembersSince(a.teamId, a.ts) },
|
|
14
18
|
"teams.zeroMembers.clear": { offLoop: true, idempotent: true, fn: (a: { teamId: string }, ctx) => clearTeamZeroMembersSince(a.teamId, ctx.now) },
|
|
15
19
|
"teams.brief.set": { offLoop: true, idempotent: true, fn: (a: Parameters<typeof setTeamBrief>[0], ctx) => setTeamBrief(a, ctx.now) },
|
|
@@ -111,3 +111,18 @@ export function clearAgentNotice(child: Pick<AgentCard, "id" | "epoch" | "meta">
|
|
|
111
111
|
getDb().query("DELETE FROM agent_exit_notices WHERE agent_id = ? AND epoch = ? AND spawn_request_id = ? AND kind = ?")
|
|
112
112
|
.run(child.id, child.epoch, stringValue(child.meta?.spawnRequestId) ?? "", kind);
|
|
113
113
|
}
|
|
114
|
+
|
|
115
|
+
export interface AgentNoticeSlot {
|
|
116
|
+
child: Pick<AgentCard, "id" | "epoch" | "meta">;
|
|
117
|
+
kind: string;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Called inside notifications.agentNotice, so failure rolls back the slot and all sends. */
|
|
121
|
+
export function insertAgentNoticeSlot({ child, kind }: AgentNoticeSlot, now: number): boolean {
|
|
122
|
+
if (kind === "agent.ready") {
|
|
123
|
+
getDb().query("DELETE FROM agent_exit_notices WHERE agent_id = ? AND kind = 'agent.ready' AND NOT (epoch = ? AND spawn_request_id = ?)")
|
|
124
|
+
.run(child.id, child.epoch, stringValue(child.meta?.spawnRequestId) ?? "");
|
|
125
|
+
}
|
|
126
|
+
return getDb().query("INSERT OR IGNORE INTO agent_exit_notices (agent_id, epoch, spawn_request_id, kind, created_at) VALUES (?, ?, ?, ?, ?)")
|
|
127
|
+
.run(child.id, child.epoch, stringValue(child.meta?.spawnRequestId) ?? "", kind, now).changes > 0;
|
|
128
|
+
}
|