@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/maintenance/teams.ts
CHANGED
|
@@ -1,18 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
agentsWithPendingOwnRelayRun,
|
|
6
|
-
getAgent,
|
|
7
|
-
getCrashReport,
|
|
8
|
-
hasTerminalEvent,
|
|
9
|
-
getTeamBusyState,
|
|
10
|
-
getTeamRoster,
|
|
11
|
-
listActiveTeams,
|
|
12
|
-
setTeamZeroMembersSince,
|
|
13
|
-
TEAM_AUTO_REAP_SUMMARY_PREFIX,
|
|
14
|
-
} from "../db";
|
|
15
|
-
import { clearTeamIdleEntry, coordinatorsWithPendingTimers, getTeamIdleEntries, setTeamIdleEntry } from "../db/team-idle";
|
|
1
|
+
import { setTeamIdleEntryAsync, clearTeamIdleEntryAsync } from "../db/runtime-tail-async";
|
|
2
|
+
import { setTeamZeroMembersSinceAsync, clearTeamZeroMembersSinceAsync } from "../db/teams-async";
|
|
3
|
+
import { countLiveTeamMembers, createActivityEventAsync, agentsWithPendingOwnRelayRun, getAgent, getCrashReport, hasTerminalEvent, getTeamBusyState, getTeamRoster, listActiveTeams, TEAM_AUTO_REAP_SUMMARY_PREFIX } from "../db";
|
|
4
|
+
import { coordinatorsWithPendingTimers, getTeamIdleEntries } from "../db/team-idle";
|
|
16
5
|
import { openWorkflowRunHolders } from "../db/workflow-task-read-ops";
|
|
17
6
|
import { STALE_TTL_MS, stewardFallbackTarget } from "../config";
|
|
18
7
|
import { agentProviderState } from "../provider-state";
|
|
@@ -48,13 +37,13 @@ function memberIsAlive(member: AgentCard, freshCutoff: number): boolean {
|
|
|
48
37
|
* after its land, a graceful shutdown). This watchdog must surface ONLY a genuine silent death:
|
|
49
38
|
* an agent that went quiet with NO terminal event of any kind.
|
|
50
39
|
*/
|
|
51
|
-
function detectSilentMembers(
|
|
40
|
+
async function detectSilentMembers(
|
|
52
41
|
teamId: string,
|
|
53
42
|
coordinatorId: string | undefined,
|
|
54
43
|
now: number,
|
|
55
44
|
thresholdMs: number,
|
|
56
45
|
out: { pingedMembers: string[]; watchedMembers: number },
|
|
57
|
-
): void {
|
|
46
|
+
): Promise<void> {
|
|
58
47
|
const freshCutoff = now - thresholdMs;
|
|
59
48
|
const watch = teamMemberWatchTracker.get(teamId) ?? new Map<string, TeamMemberWatch>();
|
|
60
49
|
teamMemberWatchTracker.set(teamId, watch);
|
|
@@ -85,7 +74,7 @@ function detectSilentMembers(
|
|
|
85
74
|
if (getCrashReport(memberId) || hasTerminalEvent(memberId, entry.epoch)) continue;
|
|
86
75
|
if (!coordinatorId) continue;
|
|
87
76
|
const minutes = Math.floor(gapMs / 60_000);
|
|
88
|
-
notifyTarget(
|
|
77
|
+
await notifyTarget(
|
|
89
78
|
"team.member_silent",
|
|
90
79
|
{ teamId, agentId: memberId },
|
|
91
80
|
coordinatorId,
|
|
@@ -179,7 +168,7 @@ async function detectGoneCoordinator(
|
|
|
179
168
|
watch.escalated = true; // the committed no-target audit is the complete no-silent-dissolve action
|
|
180
169
|
return;
|
|
181
170
|
}
|
|
182
|
-
const sent = notifyTarget(
|
|
171
|
+
const sent = await notifyTarget(
|
|
183
172
|
"team.coordinator_gone",
|
|
184
173
|
{ teamId, agentId: coordinatorId, parent: resolveCoordinatorAgentId(coordinatorId) ?? undefined },
|
|
185
174
|
escalationTarget,
|
|
@@ -222,10 +211,10 @@ function teamIdlePayload(teamId: string, coordinatorId: string, thresholdMinutes
|
|
|
222
211
|
};
|
|
223
212
|
}
|
|
224
213
|
|
|
225
|
-
function notifyTeamIdle(teamId: string, coordinatorId: string, thresholdMinutes: number, idleForMs: number, firstNoBusyAt: number): string | null {
|
|
214
|
+
async function notifyTeamIdle(teamId: string, coordinatorId: string, thresholdMinutes: number, idleForMs: number, firstNoBusyAt: number): Promise<string | null> {
|
|
226
215
|
const roundedIdleMinutes = Math.max(thresholdMinutes, Math.floor(idleForMs / 60_000));
|
|
227
216
|
const payload = teamIdlePayload(teamId, coordinatorId, thresholdMinutes, idleForMs, firstNoBusyAt);
|
|
228
|
-
return notifyTarget(
|
|
217
|
+
return await notifyTarget(
|
|
229
218
|
"team.idle",
|
|
230
219
|
{ teamId, agentId: coordinatorId },
|
|
231
220
|
coordinatorId,
|
|
@@ -270,7 +259,7 @@ export async function runTeamIdleWatchdog(input: { now?: number; signal?: AbortS
|
|
|
270
259
|
seen.add(team.id);
|
|
271
260
|
// #634 — runs every cycle, independent of the team-level idle gate below: a single silent
|
|
272
261
|
// member must surface even while OTHER members keep the team "busy".
|
|
273
|
-
detectSilentMembers(team.id, team.coordinatorId, now, thresholdMs, memberSilence);
|
|
262
|
+
await detectSilentMembers(team.id, team.coordinatorId, now, thresholdMs, memberSilence);
|
|
274
263
|
// #412/#468 — coordinator-gone escalation, also every cycle and independent of the idle gate: a
|
|
275
264
|
// dead coordinator must surface even if the team isn't (yet) idle, and the idle-ping path can't
|
|
276
265
|
// reach it (it would just ping the void).
|
|
@@ -299,7 +288,7 @@ export async function runTeamIdleWatchdog(input: { now?: number; signal?: AbortS
|
|
|
299
288
|
? busy.busyMemberIds.filter((id) => id !== team.coordinatorId)
|
|
300
289
|
: busy.busyMemberIds;
|
|
301
290
|
if (busyMemberIds.length > 0) {
|
|
302
|
-
if (existingEntry)
|
|
291
|
+
if (existingEntry) (await clearTeamIdleEntryAsync(team.id));
|
|
303
292
|
teamIdleTracker.delete(team.id);
|
|
304
293
|
busyTeamIds.push(team.id);
|
|
305
294
|
continue;
|
|
@@ -311,7 +300,7 @@ export async function runTeamIdleWatchdog(input: { now?: number; signal?: AbortS
|
|
|
311
300
|
}
|
|
312
301
|
|
|
313
302
|
const entry = existingEntry ?? { firstNoBusyAt: now, pinged: false };
|
|
314
|
-
if (!existingEntry)
|
|
303
|
+
if (!existingEntry) (await setTeamIdleEntryAsync(team.id, entry));
|
|
315
304
|
teamIdleTracker.set(team.id, entry);
|
|
316
305
|
const idleForMs = now - entry.firstNoBusyAt;
|
|
317
306
|
if (idleForMs < thresholdMs) {
|
|
@@ -328,10 +317,10 @@ export async function runTeamIdleWatchdog(input: { now?: number; signal?: AbortS
|
|
|
328
317
|
continue;
|
|
329
318
|
}
|
|
330
319
|
|
|
331
|
-
const sent = notifyTeamIdle(team.id, team.coordinatorId, config.thresholdMinutes, idleForMs, entry.firstNoBusyAt);
|
|
320
|
+
const sent = await notifyTeamIdle(team.id, team.coordinatorId, config.thresholdMinutes, idleForMs, entry.firstNoBusyAt);
|
|
332
321
|
if (!sent) continue;
|
|
333
322
|
entry.pinged = true;
|
|
334
|
-
|
|
323
|
+
(await setTeamIdleEntryAsync(team.id, entry));
|
|
335
324
|
pingedTeamIds.push(team.id);
|
|
336
325
|
}
|
|
337
326
|
|
|
@@ -341,7 +330,7 @@ export async function runTeamIdleWatchdog(input: { now?: number; signal?: AbortS
|
|
|
341
330
|
// coordinator that was already told. Skip the sweep instead; the next full pass reclaims them.
|
|
342
331
|
if (!signal?.aborted) {
|
|
343
332
|
for (const key of teamIdleTracker.keys()) if (!seen.has(key)) {
|
|
344
|
-
|
|
333
|
+
(await clearTeamIdleEntryAsync(key));
|
|
345
334
|
teamIdleTracker.delete(key);
|
|
346
335
|
}
|
|
347
336
|
for (const key of teamMemberWatchTracker.keys()) if (!seen.has(key)) teamMemberWatchTracker.delete(key);
|
|
@@ -385,7 +374,7 @@ export async function reapZeroMemberTeams(context: { signal?: AbortSignal } = {}
|
|
|
385
374
|
const live = countLiveTeamMembers(team.id, cutoff);
|
|
386
375
|
if (live > 0) {
|
|
387
376
|
if (team.zeroMembersSince !== undefined) {
|
|
388
|
-
|
|
377
|
+
(await clearTeamZeroMembersSinceAsync(team.id));
|
|
389
378
|
clearedTeamIds.push(team.id);
|
|
390
379
|
}
|
|
391
380
|
continue;
|
|
@@ -393,7 +382,7 @@ export async function reapZeroMemberTeams(context: { signal?: AbortSignal } = {}
|
|
|
393
382
|
|
|
394
383
|
zeroMemberTeams++;
|
|
395
384
|
if (team.zeroMembersSince === undefined) {
|
|
396
|
-
|
|
385
|
+
(await setTeamZeroMembersSinceAsync(team.id, now));
|
|
397
386
|
trackedTeamIds.push(team.id);
|
|
398
387
|
continue;
|
|
399
388
|
}
|
|
@@ -401,7 +390,7 @@ export async function reapZeroMemberTeams(context: { signal?: AbortSignal } = {}
|
|
|
401
390
|
|
|
402
391
|
const outcomeSummary = `${TEAM_AUTO_REAP_SUMMARY_PREFIX} zero live members for ${grace}ms`;
|
|
403
392
|
// Leave outcomeStatus null (unknown): an abandoned team is NOT a failed one.
|
|
404
|
-
const dissolved = dissolveTeamById(team.id, { outcomeSummary });
|
|
393
|
+
const dissolved = await dissolveTeamById(team.id, { outcomeSummary });
|
|
405
394
|
await createActivityEventAsync({
|
|
406
395
|
clientId: `team-reap-${team.id}-${now}`,
|
|
407
396
|
kind: "state",
|
|
@@ -1,19 +1,9 @@
|
|
|
1
|
+
import { releaseExpiredMergeLeasesAsync, reelectRepoStewardAsync } from "../db/runtime-tail-async";
|
|
2
|
+
import { deleteWorkspaceAsync } from "../db/lifecycle-tail-async";
|
|
3
|
+
import { createCommandAsync } from "../commands-write";
|
|
1
4
|
import { releaseExpiredStewardHandbacks } from "./steward-handback";
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
agentsWithRunningCommandTimers,
|
|
5
|
-
createActivityEventAsync,
|
|
6
|
-
deleteWorkspace,
|
|
7
|
-
getAgent,
|
|
8
|
-
getRepoSteward,
|
|
9
|
-
getWorkspace,
|
|
10
|
-
listOrchestrators,
|
|
11
|
-
listWorkspaces,
|
|
12
|
-
patchWorkspaceMetadata,
|
|
13
|
-
reelectRepoSteward,
|
|
14
|
-
releaseExpiredMergeLeases,
|
|
15
|
-
updateWorkspaceStatusAsync,
|
|
16
|
-
setWorkspaceBranchAsync, patchWorkspaceMetadataAsync} from "../db";
|
|
5
|
+
|
|
6
|
+
import { agentsWithRunningCommandTimers, createActivityEventAsync, getAgent, getRepoSteward, getWorkspace, listOrchestrators, listWorkspaces, patchWorkspaceMetadata, updateWorkspaceStatusAsync, setWorkspaceBranchAsync, patchWorkspaceMetadataAsync } from "../db";
|
|
17
7
|
import type { WorkspaceMergePreview, WorkspaceRecord, WorkspaceStatus } from "../types";
|
|
18
8
|
import { reconcileLandedWorkspace } from "../branch-landed";
|
|
19
9
|
import { workspaceStewardEligible } from "../steward-queue";
|
|
@@ -187,7 +177,7 @@ export async function scanWorkspaceConflicts(context: { signal?: AbortSignal } =
|
|
|
187
177
|
// a landing steward would spawn, find nothing to resolve, and re-strand the row. Route it to
|
|
188
178
|
// the branch agent's COORDINATOR (owner/fallback) via the custody path instead — they own the
|
|
189
179
|
// decision to rebase or abandon. (The event-driven auto-merge hook escalates the same way.)
|
|
190
|
-
const targets = routeWorkspaceCustodyEscalation({
|
|
180
|
+
const targets = await routeWorkspaceCustodyEscalation({
|
|
191
181
|
workspace: ws,
|
|
192
182
|
subject: "Workspace land keeps reverting (moved base)",
|
|
193
183
|
body: `Workspace \`${ws.branch ?? ws.id}\` in ${ws.repoRoot} keeps getting its tip reverted as ${p.baseRef ?? "base"} moves under it (#1242); it can't auto-land. Please coordinate a rebase or clean-up.`,
|
|
@@ -360,7 +350,7 @@ export async function workspaceGC(context: { signal?: AbortSignal } = {}): Promi
|
|
|
360
350
|
const now = Date.now();
|
|
361
351
|
const cutoff = now - WORKSPACE_RETENTION_MS;
|
|
362
352
|
const reviewCutoff = now - WORKSPACE_REVIEW_TTL_MS;
|
|
363
|
-
const releasedLeaseRepos =
|
|
353
|
+
const releasedLeaseRepos = (await releaseExpiredMergeLeasesAsync(now));
|
|
364
354
|
|
|
365
355
|
const all = listWorkspaces();
|
|
366
356
|
// #1726 — reclaim expired-terminal rows in a BOUNDED batch. GC can be paused for long stretches
|
|
@@ -376,7 +366,7 @@ export async function workspaceGC(context: { signal?: AbortSignal } = {}): Promi
|
|
|
376
366
|
const terminalIds: string[] = [];
|
|
377
367
|
for (const ws of terminalBatch) {
|
|
378
368
|
if (signal?.aborted) break;
|
|
379
|
-
|
|
369
|
+
(await deleteWorkspaceAsync(ws.id));
|
|
380
370
|
terminalIds.push(ws.id);
|
|
381
371
|
}
|
|
382
372
|
// Rows the abort left undeleted are still expired and terminal, so they stay in the backlog the
|
|
@@ -394,7 +384,7 @@ export async function workspaceGC(context: { signal?: AbortSignal } = {}): Promi
|
|
|
394
384
|
for (const ws of all) {
|
|
395
385
|
if (signal?.aborted) break;
|
|
396
386
|
if (!STRANDABLE_STATUSES.has(ws.status) || ws.mode !== "isolated" || !ws.worktreePath) continue;
|
|
397
|
-
|
|
387
|
+
(await reelectRepoStewardAsync(ws.repoRoot));
|
|
398
388
|
const fresh = getWorkspace(ws.id);
|
|
399
389
|
if (!fresh || !STRANDABLE_STATUSES.has(fresh.status)) continue;
|
|
400
390
|
const ownerAlive = isOwnerAlive(fresh.ownerAgentId);
|
|
@@ -487,7 +477,7 @@ export async function workspaceGC(context: { signal?: AbortSignal } = {}): Promi
|
|
|
487
477
|
const proof = landedElsewhere === "confirmed" ? "ancestor" : landedElsewhere;
|
|
488
478
|
await reconcileLandedWorkspace(fresh, zeroCommitCloseOut
|
|
489
479
|
? { strategy: preview && !("available" in preview) ? preview.strategy : "rebase-ff", baseRef, ahead: 0, unmergedAhead: 0, dirtyCount: 0 }
|
|
490
|
-
: { strategy: preview && !("available" in preview) ? preview.strategy : "rebase-ff", baseRef, headSha: currentTip, landed: true, landedSha: currentTip });
|
|
480
|
+
: { strategy: preview && !("available" in preview) ? preview.strategy : "rebase-ff", baseRef, headSha: currentTip, landed: true, landedSha: currentTip }, landedElsewhere === "confirmed" ? currentTip : undefined);
|
|
491
481
|
await patchWorkspaceMetadataAsync(fresh.id, {
|
|
492
482
|
landedElsewhere: true,
|
|
493
483
|
landedElsewhereAt: now,
|
|
@@ -518,7 +508,7 @@ export async function workspaceGC(context: { signal?: AbortSignal } = {}): Promi
|
|
|
518
508
|
// resolve. (A stranded row that is genuinely in `conflict` status is already handed to a steward
|
|
519
509
|
// by the conflict-scan path; the GC backstop's job here is custody, not conflict resolution.)
|
|
520
510
|
const strandedHours = Math.round((now - strandedAt) / (60 * 60 * 1000));
|
|
521
|
-
const targets = routeWorkspaceCustodyEscalation({
|
|
511
|
+
const targets = await routeWorkspaceCustodyEscalation({
|
|
522
512
|
workspace: fresh,
|
|
523
513
|
subject: "Stranded workspace needs an owner",
|
|
524
514
|
body: `Workspace \`${fresh.branch ?? fresh.id}\` in ${fresh.repoRoot} is ${fresh.status} and has been stranded for ${strandedHours}h. Please coordinate ${fresh.status === "conflict" ? "conflict resolution" : "review/merge"} or clean up the worktree.`,
|
|
@@ -530,13 +520,13 @@ export async function workspaceGC(context: { signal?: AbortSignal } = {}): Promi
|
|
|
530
520
|
// fallback configured). Marking this "escalated" would silently swallow the strand and
|
|
531
521
|
// repeat every sweep forever. Instead leave it UNescalated (don't stamp escalatedAt, so
|
|
532
522
|
// the next sweep retries once recipients exist) and raise a louder operator-visible alarm.
|
|
533
|
-
raiseOperatorAlarm({
|
|
523
|
+
(await raiseOperatorAlarm({
|
|
534
524
|
clientId: `workspace-gc-unescalatable-${fresh.id}:${strandedAt}:${Math.floor(now / escalationMs)}`,
|
|
535
525
|
source: "workspace-gc",
|
|
536
526
|
subject: "Stranded workspace has no one to escalate to",
|
|
537
527
|
detail: `${fresh.branch ?? fresh.id} in ${fresh.repoRoot} has been ${fresh.status} for ${strandedHours}h but has no owner, coordinator, or fallback configured to escalate to. Configure AGENT_RELAY_WORKSPACE_STEWARD_FALLBACK or reclaim the worktree manually.`,
|
|
538
528
|
metadata: { maintenanceJobId: "workspace-gc", workspaceId: fresh.id, repoRoot: fresh.repoRoot, branch: fresh.branch, status: fresh.status, strandedAt },
|
|
539
|
-
});
|
|
529
|
+
}));
|
|
540
530
|
continue;
|
|
541
531
|
}
|
|
542
532
|
escalationTargets.push(...targets);
|
|
@@ -589,7 +579,7 @@ export async function workspaceGC(context: { signal?: AbortSignal } = {}): Promi
|
|
|
589
579
|
// operator alarm when it resolves to nobody) instead of `stewardAgentId ?? fallback`.
|
|
590
580
|
// Most strandable workspaces have no steward, so the old notice silently dropped while
|
|
591
581
|
// the state change still happened.
|
|
592
|
-
const targets = routeWorkspaceCustodyEscalationOrAlarm({
|
|
582
|
+
const targets = await routeWorkspaceCustodyEscalationOrAlarm({
|
|
593
583
|
source: "workspace-gc",
|
|
594
584
|
workspace: fresh,
|
|
595
585
|
type: "workspace.auto_abandoned",
|
|
@@ -620,12 +610,12 @@ export async function workspaceGC(context: { signal?: AbortSignal } = {}): Promi
|
|
|
620
610
|
if (signal?.aborted) break;
|
|
621
611
|
const orch = orchestrators.find((candidate) => workspacePathWithinBase(repoRoot, candidate.baseDir));
|
|
622
612
|
if (!orch?.agentId) continue;
|
|
623
|
-
const command =
|
|
613
|
+
const command = (await createCommandAsync({
|
|
624
614
|
type: "workspace.prune",
|
|
625
615
|
source: "system",
|
|
626
616
|
target: orch.agentId,
|
|
627
617
|
params: { repoRoot, requestedBy: "workspace-gc", requestedAt: now },
|
|
628
|
-
});
|
|
618
|
+
}));
|
|
629
619
|
emitCommand(command);
|
|
630
620
|
pruneCommands.push(command.id);
|
|
631
621
|
}
|
|
@@ -696,7 +686,7 @@ export async function refreshIdleWorkspaces(context: { signal?: AbortSignal } =
|
|
|
696
686
|
if (gitAhead !== undefined && gitAhead > 0) { skipped.push(`${ws.id}:ahead`); continue; }
|
|
697
687
|
if (gitDirtyCount !== undefined && gitDirtyCount > 0) { skipped.push(`${ws.id}:dirty`); continue; }
|
|
698
688
|
|
|
699
|
-
const command =
|
|
689
|
+
const command = (await createCommandAsync({
|
|
700
690
|
type: "workspace.idle-refresh",
|
|
701
691
|
source: "system",
|
|
702
692
|
target: orch.agentId,
|
|
@@ -711,7 +701,7 @@ export async function refreshIdleWorkspaces(context: { signal?: AbortSignal } =
|
|
|
711
701
|
requestedBy: "workspace-idle-refresh",
|
|
712
702
|
requestedAt: now,
|
|
713
703
|
},
|
|
714
|
-
});
|
|
704
|
+
}));
|
|
715
705
|
emitCommand(command);
|
|
716
706
|
dispatched.push(ws.id);
|
|
717
707
|
}
|
|
@@ -28,11 +28,11 @@ function managedPolicyEscalationRecipients(policy: SpawnPolicy, state: ManagedAg
|
|
|
28
28
|
// agent — often the repo steward that lands branches — is down. Route those to the same
|
|
29
29
|
// recipients as the offline branch, and when there is no reachable recipient raise an
|
|
30
30
|
// operator-visible alarm instead of silently dropping the signal.
|
|
31
|
-
export function escalateManagedSpawnFailure(
|
|
31
|
+
export async function escalateManagedSpawnFailure(
|
|
32
32
|
policy: SpawnPolicy,
|
|
33
33
|
state: ManagedAgentState,
|
|
34
34
|
opts: { phase: "failed" | "register-timeout" | "spawn-backoff"; error: string },
|
|
35
|
-
): void {
|
|
35
|
+
): Promise<void> {
|
|
36
36
|
const recipients = managedPolicyEscalationRecipients(policy, state);
|
|
37
37
|
const queuedMessages = queuedPolicyMessageCount(policy.name);
|
|
38
38
|
const subject = opts.phase === "failed"
|
|
@@ -55,17 +55,17 @@ export function escalateManagedSpawnFailure(
|
|
|
55
55
|
error: opts.error,
|
|
56
56
|
};
|
|
57
57
|
if (!recipients.length) {
|
|
58
|
-
raiseOperatorAlarm({
|
|
58
|
+
(await raiseOperatorAlarm({
|
|
59
59
|
clientId: `managed-policy-alarm-${opts.phase}-${policy.name}-${policy.orchestratorId}`,
|
|
60
60
|
source: "lifecycle-manager",
|
|
61
61
|
subject,
|
|
62
62
|
detail: `${body}\nNo owner, coordinator, or fallback is reachable to page.`,
|
|
63
63
|
view: "managed-agents",
|
|
64
64
|
metadata: payload,
|
|
65
|
-
});
|
|
65
|
+
}));
|
|
66
66
|
return;
|
|
67
67
|
}
|
|
68
|
-
routeNotification({
|
|
68
|
+
await routeNotification({
|
|
69
69
|
type: "agent.spawn_failed",
|
|
70
70
|
scope: { target: `policy:${policy.name}` },
|
|
71
71
|
recipients,
|
|
@@ -85,14 +85,14 @@ export function escalateManagedSpawnFailure(
|
|
|
85
85
|
});
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
export function escalateOfflineOrchestrator(policy: SpawnPolicy, state: ManagedAgentState, orch: Orchestrator | null | undefined): void {
|
|
88
|
+
export async function escalateOfflineOrchestrator(policy: SpawnPolicy, state: ManagedAgentState, orch: Orchestrator | null | undefined): Promise<void> {
|
|
89
89
|
if (state.consecutiveFailures < ORCHESTRATOR_OFFLINE_ESCALATION_FAILURES) return;
|
|
90
90
|
const recipients = managedPolicyEscalationRecipients(policy, state);
|
|
91
91
|
if (!recipients.length) return;
|
|
92
92
|
const host = orch?.hostname ? `${orch.hostname} (${policy.orchestratorId})` : policy.orchestratorId;
|
|
93
93
|
const queuedMessages = queuedPolicyMessageCount(policy.name);
|
|
94
94
|
const nextRetry = state.backoffUntil ? new Date(state.backoffUntil).toISOString() : "not scheduled";
|
|
95
|
-
routeNotification({
|
|
95
|
+
await routeNotification({
|
|
96
96
|
type: "agent.spawn_failed",
|
|
97
97
|
scope: { target: `policy:${policy.name}` },
|
|
98
98
|
recipients,
|
package/src/managed-policy.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { runnerRuntimeTokenEnvAsync, type RunnerLaunchAuthority, type RunnerRuntimeTokenInput } from "./runtime-tokens";
|
|
1
2
|
import { getManifest } from "@humwick/providers";
|
|
2
3
|
import { getAgentProfile, resolveAgentProfileKey } from "./config-store";
|
|
3
4
|
import { effectiveProviderCatalogListAsync, ValidationError, withResolvedProvisioning, withResolvedProvisioningAsync } from "./db";
|
|
@@ -7,14 +8,12 @@ import { getAgent } from "./db/agents";
|
|
|
7
8
|
import { getOrchestratorAsync } from "./db/orchestrators-async";
|
|
8
9
|
import { composeProfileSpawnInstructions, composeProfileSpawnInstructionsAsync } from "./project-instructions";
|
|
9
10
|
import { getSelfEffortCeiling } from "./db/self-effort-permissions";
|
|
10
|
-
import { runnerRuntimeTokenEnv, type RunnerLaunchAuthority } from "./runtime-tokens";
|
|
11
|
-
import { gatewayBackend } from "./db/gateway";
|
|
12
11
|
import { recordedLaunchMode, resolveHostLaunchMode } from "./launch-mode";
|
|
13
12
|
import { buildSpawnCommand, generateSpawnAgentId, resolveSpawnModelParams, resolveSpawnModelParamsAsync } from "./spawn-command";
|
|
14
13
|
import { applyDefaultSharedMcp } from "./shared-mcp";
|
|
15
14
|
import { AGENT_SYSTEM_TAGS, systemTagsForSpawn } from "./agent-system-tags";
|
|
16
15
|
import { buildWhoamiDefaultForAgent } from "./mcp/identity-projection";
|
|
17
|
-
import {
|
|
16
|
+
import { isGenuineStewardPolicy, stewardWorktreeCwdPrefixes } from "./steward-spawn-guard";
|
|
18
17
|
// #2033 — from isolated-workspace-placement.ts, NOT ./services/spawn-identity: that module also
|
|
19
18
|
// exports buildProspectiveSpawnIdentity, which imports mcp/identity.ts → self-resume.ts →
|
|
20
19
|
// restart-spawn.ts → managed-policy.ts, and importing it here would close that into a cycle.
|
|
@@ -66,7 +65,7 @@ function systemTagsForManagedPolicy(policy: SpawnPolicy): string[] {
|
|
|
66
65
|
return tags;
|
|
67
66
|
}
|
|
68
67
|
|
|
69
|
-
export function buildManagedSpawnParams(policy: SpawnPolicy, requestId: string, ctx: ManagedSpawnContext): Record<string, unknown
|
|
68
|
+
export async function buildManagedSpawnParams(policy: SpawnPolicy, requestId: string, ctx: ManagedSpawnContext): Promise<Record<string, unknown>> {
|
|
70
69
|
if (policy.profile) policy = { ...policy, profile: resolveAgentProfileKey(policy.profile) ?? policy.profile };
|
|
71
70
|
assertManagedProviderEnabled(managedPolicyProviderDisabledMessage(policy));
|
|
72
71
|
const agentId = ctx.identityAgentId ?? generateSpawnAgentId();
|
|
@@ -97,7 +96,8 @@ export function buildManagedSpawnParams(policy: SpawnPolicy, requestId: string,
|
|
|
97
96
|
const composed = composeProfileSpawnInstructions(managedInstructionInput(policy, agentProfile, agentRelayIdentity, orchestratorHost, alwaysOnAppend));
|
|
98
97
|
|
|
99
98
|
return buildManagedCommand({ policy, requestId, ctx, agentId, prompt, agentProfile, orchestrator, extraCwdPrefixes, composed,
|
|
100
|
-
modelParams: resolveSpawnModelParams(policy.provider, policy.model, policy.effort
|
|
99
|
+
modelParams: resolveSpawnModelParams(policy.provider, policy.model, policy.effort),
|
|
100
|
+
env: (await runnerRuntimeTokenEnvAsync(managedTokenInput(policy, requestId, ctx, agentId, extraCwdPrefixes))),
|
|
101
101
|
});
|
|
102
102
|
}
|
|
103
103
|
|
|
@@ -147,6 +147,7 @@ function buildManagedCommand(input: {
|
|
|
147
147
|
extraCwdPrefixes: string[];
|
|
148
148
|
composed: ReturnType<typeof composeProfileSpawnInstructions>;
|
|
149
149
|
modelParams: ReturnType<typeof resolveSpawnModelParams>;
|
|
150
|
+
env: Record<string, string>;
|
|
150
151
|
}): Record<string, unknown> {
|
|
151
152
|
const { policy, requestId, ctx, agentId, prompt, agentProfile, orchestrator, extraCwdPrefixes, composed, modelParams } = input;
|
|
152
153
|
return buildSpawnCommand({
|
|
@@ -177,26 +178,31 @@ function buildManagedCommand(input: {
|
|
|
177
178
|
headless: true,
|
|
178
179
|
policyName: policy.name,
|
|
179
180
|
spawnRequestId: requestId,
|
|
180
|
-
env:
|
|
181
|
-
agentId,
|
|
182
|
-
orchestratorId: policy.orchestratorId,
|
|
183
|
-
cwd: policy.cwd,
|
|
184
|
-
provider: policy.provider,
|
|
185
|
-
label: policy.label,
|
|
186
|
-
policyName: policy.name,
|
|
187
|
-
spawnRequestId: requestId,
|
|
188
|
-
createdBy: ctx.createdBy,
|
|
189
|
-
authority: ctx.authority,
|
|
190
|
-
profile: policy.profile || undefined,
|
|
191
|
-
// #2245 — the same posture this launch is given above; stamped into the signed constraints.
|
|
192
|
-
approvalMode: policy.permissionMode,
|
|
193
|
-
...(extraCwdPrefixes.length ? { extraCwdPrefixes } : {}),
|
|
194
|
-
}),
|
|
181
|
+
env: input.env,
|
|
195
182
|
requestedBy: ctx.createdBy,
|
|
196
183
|
requestedAt: ctx.requestedAt ?? Date.now(),
|
|
197
184
|
});
|
|
198
185
|
}
|
|
199
186
|
|
|
187
|
+
/** The runner token a managed launch carries; the sync builder and the writer-op builder mint the same input. */
|
|
188
|
+
function managedTokenInput(policy: SpawnPolicy, requestId: string, ctx: ManagedSpawnContext, agentId: string, extraCwdPrefixes: string[]): RunnerRuntimeTokenInput {
|
|
189
|
+
return {
|
|
190
|
+
agentId,
|
|
191
|
+
orchestratorId: policy.orchestratorId,
|
|
192
|
+
cwd: policy.cwd,
|
|
193
|
+
provider: policy.provider,
|
|
194
|
+
label: policy.label,
|
|
195
|
+
policyName: policy.name,
|
|
196
|
+
spawnRequestId: requestId,
|
|
197
|
+
createdBy: ctx.createdBy,
|
|
198
|
+
authority: ctx.authority,
|
|
199
|
+
profile: policy.profile || undefined,
|
|
200
|
+
// #2245 — the same posture this launch is given above; stamped into the signed constraints.
|
|
201
|
+
approvalMode: policy.permissionMode,
|
|
202
|
+
...(extraCwdPrefixes.length ? { extraCwdPrefixes } : {}),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
|
|
200
206
|
// #2656 — backstop for every managed launch path (policy start/restart routes, agent restart): no
|
|
201
207
|
// new process starts on a disabled provider. The lifecycle manager parks the policy before this.
|
|
202
208
|
function assertManagedProviderEnabled(message: string | undefined): void {
|
|
@@ -205,15 +211,12 @@ function assertManagedProviderEnabled(message: string | undefined): void {
|
|
|
205
211
|
|
|
206
212
|
/** Worker-safe counterpart used by every runtime managed launch path. The synchronous builder
|
|
207
213
|
* remains for in-process unit fixtures; production must never borrow its main-thread connection. */
|
|
208
|
-
export function buildManagedSpawnParamsAsync(policy: SpawnPolicy, requestId: string, ctx: ManagedSpawnContext):
|
|
214
|
+
export async function buildManagedSpawnParamsAsync(policy: SpawnPolicy, requestId: string, ctx: ManagedSpawnContext): Promise<Record<string, unknown>> {
|
|
209
215
|
if (effectiveManagedPolicyWorkspaceMode(policy) === "isolated" && ctx.gitRepoRoot === undefined) {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
}));
|
|
216
|
+
const host = await getOrchestratorAsync(policy.orchestratorId);
|
|
217
|
+
ctx = { ...ctx, gitRepoRoot: host ? await resolveSpawnRepoRoot(host, policy.cwd) : null };
|
|
213
218
|
}
|
|
214
|
-
|
|
215
|
-
// backend never enters this synchronous branch, so it cannot reopen the closed-main DB path.
|
|
216
|
-
return gatewayBackend() === "in-process" ? buildManagedSpawnParams(policy, requestId, ctx) : buildManagedSpawnParamsWorkerAsync(policy, requestId, ctx);
|
|
219
|
+
return buildManagedSpawnParamsWorkerAsync(policy, requestId, ctx);
|
|
217
220
|
}
|
|
218
221
|
|
|
219
222
|
async function buildManagedSpawnParamsWorkerAsync(policy: SpawnPolicy, requestId: string, ctx: ManagedSpawnContext): Promise<Record<string, unknown>> {
|
|
@@ -231,6 +234,7 @@ async function buildManagedSpawnParamsWorkerAsync(policy: SpawnPolicy, requestId
|
|
|
231
234
|
const extraCwdPrefixes = managedCwdPrefixes(policy, requestId, ctx, orchestrator);
|
|
232
235
|
const composed = await composeProfileSpawnInstructionsAsync(managedInstructionInput(policy, agentProfile, agentRelayIdentity, orchestratorHost, alwaysOnAppend));
|
|
233
236
|
return buildManagedCommand({ policy, requestId, ctx, agentId, prompt, agentProfile, orchestrator, extraCwdPrefixes, composed,
|
|
234
|
-
modelParams: await resolveSpawnModelParamsAsync(policy.provider, policy.model, policy.effort
|
|
237
|
+
modelParams: await resolveSpawnModelParamsAsync(policy.provider, policy.model, policy.effort),
|
|
238
|
+
env: await runnerRuntimeTokenEnvAsync(managedTokenInput(policy, requestId, ctx, agentId, extraCwdPrefixes)),
|
|
235
239
|
});
|
|
236
240
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { upsertManagedAgentStateAsync, updateManagedAgentStateAsync } from "./db/lifecycle-tail-async";
|
|
1
2
|
// #2656 — "off means nothing new starts on it": a managed policy whose provider is disabled (operator
|
|
2
3
|
// switch or all models disabled) must not launch. The lifecycle manager parks the policy with a
|
|
3
4
|
// visible reason instead of spawning — no backoff churn, no crash loop — and its normal reconcile
|
|
4
5
|
// tick resumes the policy on its own once the provider is re-enabled.
|
|
5
6
|
import { findProviderCatalog, providerDisabledMessage, type ProviderCatalogEntry } from "@humwick/sdk/provider-catalog";
|
|
6
|
-
import { getManagedAgentState
|
|
7
|
+
import { getManagedAgentState } from "./config-store";
|
|
7
8
|
import { effectiveProviderCatalogList } from "./provider-catalog-store";
|
|
8
9
|
import type { ManagedAgentState, SpawnPolicy } from "./types";
|
|
9
10
|
|
|
@@ -17,11 +18,11 @@ export function managedPolicyProviderDisabledMessage(policy: Pick<SpawnPolicy, "
|
|
|
17
18
|
* Record the skipped launch on the policy's state (`stopped` + lastError) so the dashboard shows why.
|
|
18
19
|
* Returns the new state only when it changed, so a caller emits once rather than every tick.
|
|
19
20
|
*/
|
|
20
|
-
export function parkManagedPolicyForDisabledProvider(policy: SpawnPolicy, message: string): ManagedAgentState | undefined {
|
|
21
|
+
export async function parkManagedPolicyForDisabledProvider(policy: SpawnPolicy, message: string): Promise<ManagedAgentState | undefined> {
|
|
21
22
|
const state = getManagedAgentState(policy.name);
|
|
22
23
|
if (state?.status === "stopped" && state.lastError === message) return undefined;
|
|
23
24
|
const next = state
|
|
24
|
-
?
|
|
25
|
-
:
|
|
25
|
+
? (await updateManagedAgentStateAsync(policy.name, { status: "stopped", spawnRequestId: undefined, lastError: message }))
|
|
26
|
+
: (await upsertManagedAgentStateAsync({ policyName: policy.name, status: "stopped", orchestratorId: policy.orchestratorId, provider: policy.provider, restartCount: 0, consecutiveFailures: 0, lastError: message }));
|
|
26
27
|
return next ?? undefined;
|
|
27
28
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { upsertManagedAgentStateAsync } from "./db/lifecycle-tail-async";
|
|
2
|
+
import { getManagedAgentState, getSpawnPolicy } from "./config-store";
|
|
2
3
|
import type { ManagedAgentState, SpawnPolicy } from "./types";
|
|
3
4
|
|
|
4
5
|
/** True only while an async preparation still owns the policy's starting reservation. */
|
|
@@ -15,9 +16,9 @@ export function managedSpawnReservationCurrent(policy: SpawnPolicy, policySnapsh
|
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
/** Return a preparation's own reservation to its pre-spawn state when the host drains. */
|
|
18
|
-
export function restoreDrainedSpawnReservation(policy: SpawnPolicy, requestId: string, prior: ManagedAgentState | null): void {
|
|
19
|
+
export async function restoreDrainedSpawnReservation(policy: SpawnPolicy, requestId: string, prior: ManagedAgentState | null): Promise<void> {
|
|
19
20
|
const current = getManagedAgentState(policy.name);
|
|
20
21
|
if (current?.status !== "starting" || current.spawnRequestId !== requestId) return;
|
|
21
|
-
|
|
22
|
-
provider: policy.provider, spawnRequestId: undefined, restartCount: 0, consecutiveFailures: 0 });
|
|
22
|
+
(await upsertManagedAgentStateAsync(prior ?? { policyName: policy.name, status: "stopped", orchestratorId: policy.orchestratorId,
|
|
23
|
+
provider: policy.provider, spawnRequestId: undefined, restartCount: 0, consecutiveFailures: 0 }));
|
|
23
24
|
}
|
package/src/mcp/index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { normalizeOutputArgs, outputToolDefinition, presentToolOutput } from "./output-levels";
|
|
2
2
|
import { PROMPT_TOOLS, relayPrompt } from "./prompts";
|
|
3
|
+
import { PROJECT_PROFILE_INSTRUCTION_TOOLS, relayProjectProfileInstructions } from "./project-profile-instructions";
|
|
3
4
|
import { PromptVersionConflictError } from "../prompt-version-errors";
|
|
4
5
|
import { memoryRetirementMessage } from "../memory-retirement";
|
|
5
6
|
import { GUIDE_TOOLS, relayGuide } from "./guides";
|
|
@@ -60,6 +61,7 @@ const MCP_PROTOCOL_VERSION = "2024-11-05";
|
|
|
60
61
|
const MCP_BODY_OVERHEAD_BYTES = ARTIFACT_BODY_OVERHEAD_BYTES;
|
|
61
62
|
const TOOLS: ToolDefinition[] = [
|
|
62
63
|
...PROMPT_TOOLS,
|
|
64
|
+
...PROJECT_PROFILE_INSTRUCTION_TOOLS,
|
|
63
65
|
...WEB_TOOL_CALL_TOOLS,
|
|
64
66
|
...MESSAGING_TOOLS,
|
|
65
67
|
...ARTIFACT_TOOLS,
|
|
@@ -215,6 +217,7 @@ async function callTool(auth: VerifiedMcpAuthContext, params: unknown, signal?:
|
|
|
215
217
|
else if (name === "relay_hosts") result = await relayHosts(auth, args);
|
|
216
218
|
else if (name === "relay_host_gate_budget") result = await relayHostGateBudget(auth, args);
|
|
217
219
|
else if (name === "relay_prompt") result = await relayPrompt(auth, args);
|
|
220
|
+
else if (name === "relay_project_profile_instructions") result = await relayProjectProfileInstructions(auth, args);
|
|
218
221
|
else if (name === "relay_service_access") result = await relayServiceAccess(auth, args);
|
|
219
222
|
else if (name.startsWith("relay_secret_")) result = await relaySecretTool(auth, name, args);
|
|
220
223
|
else if (name === "relay_my_agents") result = await relayMyAgents(auth, args);
|
|
@@ -223,7 +226,7 @@ async function callTool(auth: VerifiedMcpAuthContext, params: unknown, signal?:
|
|
|
223
226
|
else if (name === "relay_agent_keep") result = await relayAgentKeep(auth, args);
|
|
224
227
|
else if (name === "relay_codex_reset_consume") result = await relayCodexResetConsume(args);
|
|
225
228
|
else if (name === "relay_claude_api_budget") result = await relayClaudeApiBudget(args);
|
|
226
|
-
else if (name === "relay_profile_trust") result = relayProfileTrust(auth, args);
|
|
229
|
+
else if (name === "relay_profile_trust") result = await relayProfileTrust(auth, args);
|
|
227
230
|
else if (name.startsWith("relay_routing_policy_")) result = await relayRoutingPolicyTool(auth, name, args);
|
|
228
231
|
else if (name === "relay_agent_action") result = await relayAgentAction(auth, args);
|
|
229
232
|
else if (name === "relay_set_effort") result = await relaySetEffort(auth, args);
|
|
@@ -236,7 +239,7 @@ async function callTool(auth: VerifiedMcpAuthContext, params: unknown, signal?:
|
|
|
236
239
|
else if (name === "relay_workspace_merge_resume") result = await relayWorkspaceMutation(auth, "resume-merge", args);
|
|
237
240
|
else if (name === "relay_red_main_recover") result = await relayRedMainRecover(auth, args);
|
|
238
241
|
else if (name === "relay_workspace_release") result = await relayWorkspaceMutation(auth, "release-claim", args);
|
|
239
|
-
else if (name.startsWith("relay_merge_")) result = relayMergeTool(auth, name, args); else if (name.startsWith("relay_maintenance_")) result = await relayMaintenanceTool(auth, name, args); else if (name.startsWith("relay_team_")) result = await relayTeamTool(auth, name, args); else if (name === "relay_decision") result = relayDecisionTool(auth, args);
|
|
242
|
+
else if (name.startsWith("relay_merge_")) result = (await relayMergeTool(auth, name, args)); else if (name.startsWith("relay_maintenance_")) result = await relayMaintenanceTool(auth, name, args); else if (name.startsWith("relay_team_")) result = await relayTeamTool(auth, name, args); else if (name === "relay_decision") result = (await relayDecisionTool(auth, args));
|
|
240
243
|
else if (name.startsWith("relay_plan_")) result = await relayPlanTool(auth, name, args);
|
|
241
244
|
else if (name === "relay_task_deliver") result = await relayTaskDeliverTool(auth, name, args);
|
|
242
245
|
else if (TASK_VALIDATION_TOOLS.some((tool) => tool.name === name)) result = await relayTaskValidationTool(auth, name, args);
|
|
@@ -249,16 +252,16 @@ async function callTool(auth: VerifiedMcpAuthContext, params: unknown, signal?:
|
|
|
249
252
|
else if (name === "relay_task_comment" || name === "relay_task_close_bridge") result = await relayTaskWeaveTool(auth, name, args);
|
|
250
253
|
else if (name === "relay_release_readiness") result = await relayReleaseTool(name, args);
|
|
251
254
|
else if (name.startsWith("relay_task_")) result = await relayTaskTool(auth, name, args);
|
|
252
|
-
else if (name.startsWith("relay_blackboard_")) result = relayBlackboardTool(auth, name, args);
|
|
255
|
+
else if (name.startsWith("relay_blackboard_")) result = (await relayBlackboardTool(auth, name, args));
|
|
253
256
|
// #2591 — the journal tools must claim their prefix BEFORE the generic relay_project_
|
|
254
257
|
// dispatcher, or they would fall through to relayProjectTool as "unknown tool".
|
|
255
|
-
else if (name.startsWith("relay_project_journal_")) result = relayProjectJournalTool(auth, name, args);
|
|
256
|
-
else if (name === "relay_project_ingest_claudemd") result = await relayProjectIngestClaudeMd(auth, args); else if (name.startsWith("relay_project_")) result = await relayProjectTool(auth, name, args); else if (name.startsWith("relay_issue_ref_")) result = relayIssueRefTool(auth, name, args); else if (name.startsWith("relay_issue_association_")) result = relayIssueAssociationTool(auth, name, args); else if (name.startsWith("relay_issue_activity_")) result = await relayIssueActivityTool(auth, name, args); else if (name.startsWith("relay_issue_lifecycle_")) result = await relayIssueLifecycleTool(auth, name, args);
|
|
258
|
+
else if (name.startsWith("relay_project_journal_")) result = (await relayProjectJournalTool(auth, name, args));
|
|
259
|
+
else if (name === "relay_project_ingest_claudemd") result = await relayProjectIngestClaudeMd(auth, args); else if (name.startsWith("relay_project_")) result = await relayProjectTool(auth, name, args); else if (name.startsWith("relay_issue_ref_")) result = await relayIssueRefTool(auth, name, args); else if (name.startsWith("relay_issue_association_")) result = (await relayIssueAssociationTool(auth, name, args)); else if (name.startsWith("relay_issue_activity_")) result = await relayIssueActivityTool(auth, name, args); else if (name.startsWith("relay_issue_lifecycle_")) result = await relayIssueLifecycleTool(auth, name, args);
|
|
257
260
|
else if (name === "relay_subscribe" || name === "relay_unsubscribe" || name === "relay_list_subscriptions" || name === "relay_why_notified" || name === "relay_notification_preview") result = await relayNotificationSubscriptionTool(auth, name, args);
|
|
258
|
-
else if (name === "relay_notify_ntfy") result = relayNotifyNtfy(args);
|
|
261
|
+
else if (name === "relay_notify_ntfy") result = (await relayNotifyNtfy(args));
|
|
259
262
|
else if (name === "relay_delete_channel_binding") result = await relayDeleteChannelBinding(args, auth);
|
|
260
263
|
else if (name === "relay_channel_output") result = await relayChannelOutput(args, auth);
|
|
261
|
-
else if (name === "relay_send_to_channel") result = relayEgressToChannel(args, auth);
|
|
264
|
+
else if (name === "relay_send_to_channel") result = (await relayEgressToChannel(args, auth));
|
|
262
265
|
else throw new ValidationError(`unknown tool: ${wireName}`);
|
|
263
266
|
|
|
264
267
|
return toolResult(presentToolOutput(name, result, verbosity, args));
|
|
@@ -292,9 +295,9 @@ async function visibleTools(auth: McpAuthContext, generation: ToolGeneration): P
|
|
|
292
295
|
alwaysOn: auth.component?.role === "provider" && Boolean(constraints.profile || auth.component.sub.startsWith("runner:")),
|
|
293
296
|
allowUnknownGroups: true,
|
|
294
297
|
})
|
|
295
|
-
: null;
|
|
298
|
+
: auth.component?.role === "provider" ? resolveRelayTools({}, { alwaysOn: false }) : null;
|
|
296
299
|
if (auth.component?.role === "provider") {
|
|
297
|
-
for (const name of
|
|
300
|
+
for (const name of resolveRelayTools({ groups: [SELF_CARE_TOOL_GROUP] }, { alwaysOn: false })) allowedNames?.add(name);
|
|
298
301
|
}
|
|
299
302
|
// #1570 — an explicit per-tool allowlist narrows the surface further (still ∩ scopes ∩ groups). This
|
|
300
303
|
// is the Codex-worker provider-split: it trims the always-loaded MCP set the client eager-loads every
|
|
@@ -27,14 +27,14 @@ export const OUTPUT_DESCRIPTIONS: Record<string, string> = {
|
|
|
27
27
|
relay_kernel_listEntities: "List entities.",
|
|
28
28
|
relay_kernel_listEvents: "List events.",
|
|
29
29
|
relay_kernel_listInstances: "List workflow instances.",
|
|
30
|
-
relay_list_artifacts: "List artifacts
|
|
30
|
+
relay_list_artifacts: "List artifacts (metadata only).",
|
|
31
31
|
relay_list_subscriptions: "Your subscriptions",
|
|
32
32
|
relay_list_timers: "List your scheduled timers.",
|
|
33
33
|
relay_maintenance_jobs: "Job health; jobId reads runbook.",
|
|
34
34
|
relay_maintenance_pauses: "Maintenance pauses.",
|
|
35
35
|
relay_merge_pauses: "Merge holds",
|
|
36
36
|
relay_notification_preview: "Preview notification routing.",
|
|
37
|
-
relay_plan_get: "Read plan; mode:resume
|
|
37
|
+
relay_plan_get: "Read plan; mode:resume reads the frontier.",
|
|
38
38
|
relay_plan_list: "List team plans.",
|
|
39
39
|
relay_project_checkout: "Inspect, bind, unbind (keeps files) or remove (deletes files) a checkout.",
|
|
40
40
|
relay_project_get: "Read project and roots.",
|
|
@@ -44,7 +44,7 @@ export const OUTPUT_DESCRIPTIONS: Record<string, string> = {
|
|
|
44
44
|
relay_project_search: "Search memory; read full bodies by returned ids.",
|
|
45
45
|
relay_prompt: "Read/edit prompts; writes need expectedVersion; restore/adopt append.",
|
|
46
46
|
relay_read_artifact: "Page artifact text; binary returns download command.",
|
|
47
|
-
relay_recall: "Search history; read a returned ref
|
|
47
|
+
relay_recall: "Search history; read a returned ref.",
|
|
48
48
|
relay_release_readiness: "Read release readiness.",
|
|
49
49
|
relay_routing_policy_get: "Read policy",
|
|
50
50
|
relay_run: "Run shell work. Long work: waitMs:0, END YOUR TURN and await completion; never poll.",
|
|
@@ -53,17 +53,17 @@ export const OUTPUT_DESCRIPTIONS: Record<string, string> = {
|
|
|
53
53
|
relay_task_close_bridge: "Read Task close-bridge state.",
|
|
54
54
|
relay_task_get: "Read Task hydration.",
|
|
55
55
|
relay_task_history: "Read Task history.",
|
|
56
|
-
relay_task_list: "
|
|
56
|
+
relay_task_list: "Tasks.",
|
|
57
57
|
relay_task_memory_read: "Read Task continuation.",
|
|
58
58
|
relay_task_needs_validation: "List Tasks awaiting validation.",
|
|
59
59
|
relay_team_get: "Read team and roster summary.",
|
|
60
60
|
relay_team_template_get: "Read saved",
|
|
61
61
|
relay_team_template_list: "Saved",
|
|
62
|
-
relay_web_tool_calls: "Page web calls newest first;
|
|
62
|
+
relay_web_tool_calls: "Page web calls, newest first; epoch ms.",
|
|
63
63
|
relay_why_notified: "Explain delivery.",
|
|
64
|
-
relay_workflow_cancel: "Cancel run
|
|
65
|
-
relay_workflow_get: "Read run status; history
|
|
66
|
-
relay_workflow_resume: "Resume or answer
|
|
64
|
+
relay_workflow_cancel: "Cancel run; reap agents.",
|
|
65
|
+
relay_workflow_get: "Read run status; history opt-in.",
|
|
66
|
+
relay_workflow_resume: "Resume, pause/unpause, re-pin, or answer decisions.",
|
|
67
67
|
relay_workflow_start: "Start Task workflow.",
|
|
68
68
|
relay_workspace_deps: "Check or refresh workspace dependencies.",
|
|
69
69
|
relay_workspace_list: "List workspaces.",
|