@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
|
@@ -2,9 +2,10 @@ import { renderLiveRunsSection } from "../live-runs-section";
|
|
|
2
2
|
import { renderOpenDecisionsSection } from "../operator-decisions-section";
|
|
3
3
|
import { renderIdleEpicsSection } from "./idle-epics";
|
|
4
4
|
import { renderPlanWakeDigest } from "./plan-wake-digest";
|
|
5
|
+
import { renderPausedRunsSection } from "./workflow-pause-text";
|
|
5
6
|
|
|
6
7
|
/** Stored live state survives every self-care boundary; tracker refresh must never block a wake. */
|
|
7
8
|
export function renderSelfCareState(agentId: string): string {
|
|
8
9
|
return [renderLiveRunsSection(agentId), renderOpenDecisionsSection(agentId),
|
|
9
|
-
renderIdleEpicsSection(agentId, [], false), renderPlanWakeDigest(agentId)].filter(Boolean).join("\n\n");
|
|
10
|
+
renderIdleEpicsSection(agentId, [], false), renderPlanWakeDigest(agentId), renderPausedRunsSection(agentId)].filter(Boolean).join("\n\n");
|
|
10
11
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { grantSelfEffortAsync } from "../db/agent-control-async";
|
|
2
|
+
export { SELF_EFFORT_GRANT_COMMAND } from "../db/agent-control-write";
|
|
1
3
|
import { randomUUID } from "node:crypto";
|
|
2
4
|
import { stringValue } from "@humwick/sdk";
|
|
3
5
|
import { createCommandInternal, updateCommandInternal } from "../commands-db";
|
|
@@ -14,7 +16,7 @@ import type { Command } from "../types";
|
|
|
14
16
|
|
|
15
17
|
// #2966 — the operator turns selfEffort on or off for a running agent. The permission row is the
|
|
16
18
|
// state; the settled command written beside it is the audit record.
|
|
17
|
-
|
|
19
|
+
|
|
18
20
|
|
|
19
21
|
interface SelfEffortGrantInput extends SelfEffortSpawnInput {
|
|
20
22
|
agentId: string;
|
|
@@ -27,7 +29,7 @@ interface SelfEffortGrantInput extends SelfEffortSpawnInput {
|
|
|
27
29
|
export async function grantSelfEffort(input: SelfEffortGrantInput, ctx: AuthContext): Promise<{ selfEffort: SelfEffortPolicy | null; command: Command }> {
|
|
28
30
|
const agent = getAgent(input.agentId);
|
|
29
31
|
if (!agent) throw new AgentActionTargetError(`agent ${input.agentId} not found`);
|
|
30
|
-
authorizeShutdown(ctx, { agentId: agent.id, requestedVia: input.requestedVia });
|
|
32
|
+
(await authorizeShutdown(ctx, { agentId: agent.id, requestedVia: input.requestedVia }));
|
|
31
33
|
const spawnRequestId = stringValue(agent.meta?.spawnRequestId);
|
|
32
34
|
if (typeof input.selfEffort !== "boolean") throw new ValidationError("selfEffort must be true or false");
|
|
33
35
|
const model = agent.providerCapabilities?.model;
|
|
@@ -64,29 +66,7 @@ export async function grantSelfEffort(input: SelfEffortGrantInput, ctx: AuthCont
|
|
|
64
66
|
revalidateAgentInstance(agent);
|
|
65
67
|
// Nothing executes a grant: it is written settled with the permission in one transaction. The
|
|
66
68
|
// identity is resolved inside it, so a stale writer cannot restore a deleted policy's row.
|
|
67
|
-
const command =
|
|
68
|
-
const now = Date.now();
|
|
69
|
-
const identity = selfEffortIdentity(agent);
|
|
70
|
-
setSelfEffortCeilingInternal(identity, !grant ? null : "band" in grant ? SELF_EFFORT_BAND : grant.ceiling, requestedBy, now);
|
|
71
|
-
createCommandInternal({ id: commandId, input: {
|
|
72
|
-
type: SELF_EFFORT_GRANT_COMMAND,
|
|
73
|
-
source: "system",
|
|
74
|
-
target: agent.id,
|
|
75
|
-
...(spawnRequestId ? { correlationId: spawnRequestId } : {}),
|
|
76
|
-
params: {
|
|
77
|
-
agentId: agent.id,
|
|
78
|
-
...(spawnRequestId ? { spawnRequestId } : {}),
|
|
79
|
-
permission: identity,
|
|
80
|
-
selfEffort,
|
|
81
|
-
previousSelfEffort: previous,
|
|
82
|
-
requestedBy,
|
|
83
|
-
...(input.requestedByUser ? { requestedByUser: input.requestedByUser } : {}),
|
|
84
|
-
requestedVia: input.requestedVia,
|
|
85
|
-
requestedAt: now,
|
|
86
|
-
},
|
|
87
|
-
} }, now);
|
|
88
|
-
return updateCommandInternal(commandId, { status: "succeeded", result: { selfEffort } }, {}, now).command!;
|
|
89
|
-
});
|
|
69
|
+
const command = await grantSelfEffortAsync({ agent, grant, requestedBy, commandId, spawnRequestId, input, selfEffort, previous });
|
|
90
70
|
emitCommandEvent(command, "command.succeeded");
|
|
91
71
|
emitActivityEvent(event);
|
|
92
72
|
return { selfEffort, command };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { stringValue, type SpawnProvider } from "@humwick/sdk";
|
|
2
|
-
import {
|
|
2
|
+
import { findProviderCatalog, findProviderCatalogModel, type ProviderCatalogEntry } from "@humwick/sdk/provider-catalog";
|
|
3
3
|
import { findConfirmedEffortSwitch, findLaunchEffort, type LaunchEffort } from "../db/commands-effort-read";
|
|
4
4
|
import { getAgentEffortState } from "../db/agent-effort-state";
|
|
5
5
|
import { SELF_EFFORT_BAND, getSelfEffortCeiling, type SelfEffortIdentity } from "../db/self-effort-permissions";
|
|
@@ -44,7 +44,7 @@ export function resolveSpawnSelfEffort(
|
|
|
44
44
|
if (!(base ?? known?.defaultEffort)) throw new ValidationError("selfEffort without selfEffortCeiling needs a base effort: set effort, or pass selfEffortCeiling");
|
|
45
45
|
return { band: true };
|
|
46
46
|
}
|
|
47
|
-
const levels = known?.efforts ??
|
|
47
|
+
const levels = known?.efforts ?? [];
|
|
48
48
|
if (!levels.includes(ceiling)) {
|
|
49
49
|
throw new ValidationError(`selfEffortCeiling ${ceiling} is not an effort ${known ? `${known.provider} model ${known.alias}` : provider} offers (${levels.join(", ")})`);
|
|
50
50
|
}
|
|
@@ -90,7 +90,7 @@ export function selfEffortBase(agent: AgentCard): string | undefined {
|
|
|
90
90
|
|
|
91
91
|
/** One step down and one step up from `base` on `ladder`, clamped at both ends. */
|
|
92
92
|
export function selfEffortBand(base: string, ladder: readonly string[]): { floor: string; ceiling: string } {
|
|
93
|
-
const levels = ladder.includes(base) ? ladder :
|
|
93
|
+
const levels = ladder.includes(base) ? ladder : [base];
|
|
94
94
|
const at = levels.indexOf(base);
|
|
95
95
|
return { floor: levels[Math.max(0, at - 1)]!, ceiling: levels[Math.min(levels.length - 1, at + 1)]! };
|
|
96
96
|
}
|
|
@@ -119,7 +119,7 @@ export function selfEffortPolicyFor(agent: AgentCard, grant: SelfEffortGrant, mo
|
|
|
119
119
|
if ("ceiling" in grant) return { ceiling: grant.ceiling };
|
|
120
120
|
const base = selfEffortBase(agent);
|
|
121
121
|
if (!base) throw new ValidationError("your self-change band has no base effort; ask your coordinator to set your effort");
|
|
122
|
-
return { band: true, base, ...selfEffortBand(base, modelEfforts ?? agentCatalogModel(agent)?.efforts ??
|
|
122
|
+
return { band: true, base, ...selfEffortBand(base, modelEfforts ?? agentCatalogModel(agent)?.efforts ?? [base]) };
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
/** #2950 H3 — a restart successor launches at the agent's desired effort (#2984: applied or still pending),
|
|
@@ -138,7 +138,7 @@ export function restartEffortState(agent: AgentCard): { effort?: string; carried
|
|
|
138
138
|
export function assertSelfEffortAllowed(agent: AgentCard, level: string, modelEfforts: readonly string[] | undefined): SelfEffortPolicy {
|
|
139
139
|
const policy = spawnSelfEffortPolicy(agent, modelEfforts);
|
|
140
140
|
if (!policy) throw new ValidationError("selfEffort is not enabled for you, so you cannot change your own effort; ask your coordinator");
|
|
141
|
-
const ladder = modelEfforts
|
|
141
|
+
const ladder = modelEfforts ?? agentCatalogModel(agent)?.efforts ?? [];
|
|
142
142
|
const at = ladder.indexOf(level);
|
|
143
143
|
if (at < 0 || at > ladder.indexOf(policy.ceiling)) {
|
|
144
144
|
throw new ValidationError(policy.band
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { promoteLineageCapturedResponseAsync } from "../db/runtime-tail-async";
|
|
2
|
+
import { sendMessageWithResultAsync } from "../db/message-send";
|
|
1
3
|
import { refusedResponseReport } from "./response-report-admission";
|
|
2
4
|
import { suppressResultsOnlyAck, isResultsOnlyAckCandidate } from "../db/message-send-suppression";
|
|
3
5
|
import { getGateway } from "../db/gateway";
|
|
4
|
-
import { getMessageAsync, channelObligationAnsweredByAsync } from "../db";
|
|
6
|
+
import { getMessageAsync, channelObligationAnsweredByAsync, ValidationError, getAgent, getMessage, isChannelAgentId, listAgents, sendMessagesBatchWithResultAsync, channelObligationAnsweredBy, agentPrincipalUserId, isMultiUserWorld, type SendMessageResult as DbSendMessageResult } from "../db";
|
|
5
7
|
import { agentPrincipalSink } from "../db/agent-ownership";
|
|
6
8
|
// Transport convergence (epic #342, slice #346) — the message-send service.
|
|
7
9
|
//
|
|
@@ -27,24 +29,10 @@ import { agentPrincipalSink } from "../db/agent-ownership";
|
|
|
27
29
|
// OUT OF SCOPE (transport-edge, excluded from the parity facet): automatic memory injection
|
|
28
30
|
// (needs request-derived context) and per-transport audit (HTTP domain row vs MCP tool-call row).
|
|
29
31
|
import { LEGACY_HUMAN_AGENT_ID, USER_NAMESPACE_PREFIX, userSinkId, canonicalHumanAgentId, heldForSender, isHumanAgentId, isMechanicalMessageKind, isRecord, isReservedAgentId, isTurnFinalSession } from "@humwick/sdk";
|
|
30
|
-
import {
|
|
31
|
-
ValidationError,
|
|
32
|
-
getAgent,
|
|
33
|
-
getMessage,
|
|
34
|
-
isChannelAgentId,
|
|
35
|
-
listAgents,
|
|
36
|
-
promoteLineageCapturedResponse,
|
|
37
|
-
sendMessagesBatchWithResultAsync,
|
|
38
|
-
sendMessageWithResult,
|
|
39
|
-
sendMessageWithResultAsync,
|
|
40
|
-
channelObligationAnsweredBy,
|
|
41
|
-
agentPrincipalUserId,
|
|
42
|
-
isMultiUserWorld,
|
|
43
|
-
type SendMessageResult as DbSendMessageResult,
|
|
44
|
-
} from "../db";
|
|
45
32
|
import { recentFinalResponseCaptureIds } from "../db/lineage-startup-captures";
|
|
46
33
|
import { yieldToEventLoop } from "../event-loop-yield";
|
|
47
34
|
import { markAgentWorkFinal } from "./work-finality";
|
|
35
|
+
import { agentProviderState } from "../provider-state";
|
|
48
36
|
import { planSend, type DeliveryReceipt } from "../agent-ref";
|
|
49
37
|
import { receiptWithChannelSuppression } from "./channel-suppression-receipt";
|
|
50
38
|
import { emitMessageDeliveryUpdated, emitMessageQueued, emitNewMessages } from "../sse";
|
|
@@ -203,7 +191,8 @@ function resolveSendTarget(input: SendMessageInput, from: string): DeliveryRecei
|
|
|
203
191
|
}
|
|
204
192
|
// excludeId: a bare ref must never resolve back to its own author — that self-loop silently
|
|
205
193
|
// swallows the message (the reddit-briefing → telegram bridge break, #290).
|
|
206
|
-
const
|
|
194
|
+
const agents = listAgents();
|
|
195
|
+
const plan = planSend(input.to, agents, { excludeId: from });
|
|
207
196
|
// Ambiguous is a real "can't decide" → reject on every transport (categorically unlike
|
|
208
197
|
// not_found, which stores). HTTP → 409, MCP → invalid-params.
|
|
209
198
|
if (plan.kind === "ambiguous") throw new AmbiguousTargetError(plan.message);
|
|
@@ -215,6 +204,8 @@ function resolveSendTarget(input: SendMessageInput, from: string): DeliveryRecei
|
|
|
215
204
|
// direct (incl. a single OFFLINE match — receipt already carries reason "recipient offline")
|
|
216
205
|
// / fanout / passthrough: adopt the canonical (possibly rewritten) id + the receipt.
|
|
217
206
|
input.to = plan.to;
|
|
207
|
+
const providerState = agentProviderState(agents.find(agent => agent.id === plan.to));
|
|
208
|
+
if (providerState?.reason === "providerSetupRequired") throw new ValidationError(providerState.message ?? providerState.recommendedAction ?? "Provider setup required; restart the runner after completing setup.");
|
|
218
209
|
return plan.receipt;
|
|
219
210
|
}
|
|
220
211
|
|
|
@@ -363,18 +354,12 @@ function agentSendAllowed(input: SendMessageInput, ctx: AuthContext, sender: Mes
|
|
|
363
354
|
return inSameMessagingRun(sender, getAgent(input.to));
|
|
364
355
|
}
|
|
365
356
|
|
|
366
|
-
export function sendMessageService(
|
|
357
|
+
export async function sendMessageService(
|
|
367
358
|
input: SendMessageInput,
|
|
368
359
|
ctx: AuthContext,
|
|
369
360
|
opts: SendMessageOptions = {},
|
|
370
|
-
): SendMessageResult {
|
|
371
|
-
|
|
372
|
-
if (suppressedParent) return { message: suppressedParent, created: false, receipt };
|
|
373
|
-
const result = sendMessageWithResult(input, { allowUnregisteredSender: opts.allowUnregisteredSender });
|
|
374
|
-
const sent = { message: result.message, created: result.created, receipt: finalizeReceipt(result.message, receipt) };
|
|
375
|
-
if (opts.deferLiveEffects) return { ...sent, publish: () => emitSendResults([result]) };
|
|
376
|
-
emitSendResults([result]);
|
|
377
|
-
return sent;
|
|
361
|
+
): Promise<SendMessageResult> {
|
|
362
|
+
return sendMessageServiceAsync(input, ctx, opts);
|
|
378
363
|
}
|
|
379
364
|
|
|
380
365
|
/** Async persistence and message-history reads; live target authorization and emits stay on main.
|
|
@@ -387,8 +372,10 @@ export async function sendMessageServiceAsync(
|
|
|
387
372
|
const { receipt, suppressedParent } = await prepareSendMessageAsync(input, ctx, opts);
|
|
388
373
|
if (suppressedParent) return { message: suppressedParent, created: false, receipt };
|
|
389
374
|
const result = await sendMessageWithResultAsync(input, { allowUnregisteredSender: opts.allowUnregisteredSender });
|
|
390
|
-
|
|
391
|
-
return {
|
|
375
|
+
const sent = { message: result.message, created: result.created, receipt: finalizeReceipt(result.message, receipt) };
|
|
376
|
+
if (opts.deferLiveEffects) return { ...sent, publish: async () => (await emitSendResults([result])) };
|
|
377
|
+
(await emitSendResults([result]));
|
|
378
|
+
return sent;
|
|
392
379
|
}
|
|
393
380
|
|
|
394
381
|
export async function sendMessagesBatchService(
|
|
@@ -422,7 +409,7 @@ export async function sendMessagesBatchService(
|
|
|
422
409
|
receipt: finalizeReceipt(result.message, prepared[outputIndex]!.receipt),
|
|
423
410
|
};
|
|
424
411
|
}
|
|
425
|
-
emitSendResults(stored);
|
|
412
|
+
(await emitSendResults(stored));
|
|
426
413
|
return results;
|
|
427
414
|
}
|
|
428
415
|
|
|
@@ -500,11 +487,11 @@ export async function sweepDeferredLineageReportsOnStartup(now: number = Date.no
|
|
|
500
487
|
// A tagged capture was already flushed before boot (or by an earlier sweep). Skipping it avoids
|
|
501
488
|
// re-arming the held ring, minting a second finality window, and re-emitting `message.finalized`.
|
|
502
489
|
if (isRecord(capture.payload?.finality)) continue;
|
|
503
|
-
const promoted =
|
|
490
|
+
const promoted = (await promoteLineageCapturedResponseAsync(capture));
|
|
504
491
|
if (promoted?.created) emitted.push(promoted.message);
|
|
505
492
|
// The ordinary 10-minute cutoff protects live coalescing. Recovery is already bounded by the
|
|
506
493
|
// 24-hour query, and persistence proves this capture's source turn completed before boot.
|
|
507
|
-
const recovered = markAgentWorkFinal(capture.from, "edge-fallback", { includeStaleCompletedFinals: true });
|
|
494
|
+
const recovered = (await markAgentWorkFinal(capture.from, "edge-fallback", { includeStaleCompletedFinals: true }));
|
|
508
495
|
recoveredCount += recovered.forwarded.filter((entry) => entry.created).length;
|
|
509
496
|
}
|
|
510
497
|
if (emitted.length > 0) emitNewMessages(emitted);
|
|
@@ -513,7 +500,7 @@ export async function sweepDeferredLineageReportsOnStartup(now: number = Date.no
|
|
|
513
500
|
return { promoted: emitted.length + recoveredCount, scanned, ...(signal?.aborted ? { aborted: true as const } : {}) };
|
|
514
501
|
}
|
|
515
502
|
|
|
516
|
-
function emitSendResults(results: DbSendMessageResult[]): void {
|
|
503
|
+
export async function emitSendResults(results: DbSendMessageResult[]): Promise<void> {
|
|
517
504
|
const liveMessages: Message[] = [];
|
|
518
505
|
for (const result of results) {
|
|
519
506
|
if (result.created) {
|
|
@@ -534,13 +521,13 @@ function emitSendResults(results: DbSendMessageResult[]): void {
|
|
|
534
521
|
emitMessageDeliveryUpdated(result.message);
|
|
535
522
|
}
|
|
536
523
|
}
|
|
537
|
-
const promoted =
|
|
524
|
+
const promoted = (await promoteLineageCapturedResponseAsync(result.message));
|
|
538
525
|
if (promoted?.created) liveMessages.push(promoted.message);
|
|
539
526
|
} else if (result.updated) {
|
|
540
527
|
// Session-step upsert (#parity): the row changed in place (same DB id). Re-emit so the
|
|
541
528
|
// dashboard's id-keyed merge replaces the existing step live — no duplicate row.
|
|
542
529
|
liveMessages.push(result.message);
|
|
543
|
-
const promoted =
|
|
530
|
+
const promoted = (await promoteLineageCapturedResponseAsync(result.message));
|
|
544
531
|
if (promoted?.created) liveMessages.push(promoted.message);
|
|
545
532
|
}
|
|
546
533
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { createAgentControlAsync } from "../db/agent-control-async";
|
|
2
|
+
import type { SafeCandidate } from "./idle-agent-digest";
|
|
1
3
|
import { spawnTreeContains } from "../db/spawn-tree";
|
|
2
4
|
import { spawnDelegationState } from "../db/spawn-delegation-state";
|
|
3
5
|
// Transport convergence (epic #342, slice #347) — the agent-shutdown service.
|
|
@@ -37,7 +39,6 @@ import { spawnDelegationState } from "../db/spawn-delegation-state";
|
|
|
37
39
|
// system auth" — the steward-reaper's forceful escalation does; its graceful first attempt does not.
|
|
38
40
|
import {
|
|
39
41
|
ValidationError,
|
|
40
|
-
inWriteTransaction,
|
|
41
42
|
createActivityEventAsync,
|
|
42
43
|
getAgent,
|
|
43
44
|
getOrchestrator,
|
|
@@ -46,7 +47,7 @@ import {
|
|
|
46
47
|
mergeAgentMetaAsync,
|
|
47
48
|
} from "../db";
|
|
48
49
|
import { randomUUID } from "node:crypto";
|
|
49
|
-
import {
|
|
50
|
+
import { findSpawnCommandByRequestId, getCommand } from "../commands-db";
|
|
50
51
|
import { SPAWN_CANCELABLE_STATUSES } from "../spawn-intent";
|
|
51
52
|
import { isRestartSensitiveCommand } from "../db/restart-sensitive";
|
|
52
53
|
import { cancelCommandIfStatusAsync } from "../commands-write";
|
|
@@ -112,6 +113,7 @@ interface ShutdownAgentInput {
|
|
|
112
113
|
/** #3428 — automatic disposal only: re-checked on the fresh card at command admission, after
|
|
113
114
|
* every await; a returned reason refuses the shutdown. */
|
|
114
115
|
admit?: (agent: AgentCard) => string | undefined;
|
|
116
|
+
idleCandidate?: SafeCandidate;
|
|
115
117
|
}
|
|
116
118
|
|
|
117
119
|
interface ShutdownAgentResult {
|
|
@@ -173,7 +175,7 @@ export interface ShutdownAuthorization {
|
|
|
173
175
|
|
|
174
176
|
/** The #221 parent→child gate — the single home for shutdown authorization across all
|
|
175
177
|
* three transports. Throws `ShutdownAuthError` on denial; full-reach callers bypass ownership. */
|
|
176
|
-
export function authorizeShutdown(ctx: AuthContext, input: ShutdownAgentInput, action = "shutdown"): ShutdownAuthorization {
|
|
178
|
+
export async function authorizeShutdown(ctx: AuthContext, input: ShutdownAgentInput, action = "shutdown"): Promise<ShutdownAuthorization> {
|
|
177
179
|
const callerId = ctx.callerAgentId;
|
|
178
180
|
// A scoped agent caller may target only its OWN live spawned children — or (#2618) live members
|
|
179
181
|
// of a team it currently coordinates, e.g. after claiming a dead coordinator's team. Two PRECISE
|
|
@@ -211,7 +213,7 @@ export function authorizeShutdown(ctx: AuthContext, input: ShutdownAgentInput, a
|
|
|
211
213
|
}
|
|
212
214
|
}
|
|
213
215
|
// #3567 — the one lifecycle-control check (principal, role, coordinator authority).
|
|
214
|
-
const denied = authorizeAgentControl(ctx, target, action);
|
|
216
|
+
const denied = (await authorizeAgentControl(ctx, target, action));
|
|
215
217
|
if (denied) {
|
|
216
218
|
throw new ShutdownAuthError(denied.reason === "coordinator" && !input.agentId
|
|
217
219
|
? `no spawned child of yours matches spawnRequestId ${input.spawnRequestId}` : denied.message);
|
|
@@ -315,7 +317,7 @@ async function reapInFlightSpawnCommand(
|
|
|
315
317
|
return { command: canceled ?? command, orchestratorId: (canceled ?? command).target, agent: null };
|
|
316
318
|
}
|
|
317
319
|
emitCommandEvent(canceled, "command.canceled");
|
|
318
|
-
notifyAgentSpawnFailed({
|
|
320
|
+
await notifyAgentSpawnFailed({
|
|
319
321
|
parent: stringValue(canceled.params.spawnedBy) ?? ctx.callerAgentId ?? ctx.actor.id,
|
|
320
322
|
spawnRequestId: input.spawnRequestId,
|
|
321
323
|
provider: stringValue(canceled.params.provider),
|
|
@@ -334,11 +336,11 @@ async function reapInFlightSpawnCommand(
|
|
|
334
336
|
* shutting-down (uniform across transports — MCP previously skipped this), and writes the
|
|
335
337
|
* audit row. The single fat-service entry point the three thin transports call. */
|
|
336
338
|
export function shutdownAgent(input: ShutdownAgentInput, ctx: AuthContext): Promise<ShutdownAgentResult> {
|
|
337
|
-
return withRelayEventDrain(() => shutdownAgentBody(input, ctx));
|
|
339
|
+
return withRelayEventDrain(async () => (await shutdownAgentBody(input, ctx)));
|
|
338
340
|
}
|
|
339
341
|
|
|
340
342
|
async function shutdownAgentBody(input: ShutdownAgentInput, ctx: AuthContext): Promise<ShutdownAgentResult> {
|
|
341
|
-
const authz = authorizeShutdown(ctx, input);
|
|
343
|
+
const authz = (await authorizeShutdown(ctx, input));
|
|
342
344
|
if (authz.spawnCommand) return reapInFlightSpawnCommand(authz.spawnCommand, input, ctx);
|
|
343
345
|
|
|
344
346
|
const agent = input.agentId ? getAgent(input.agentId) : null;
|
|
@@ -414,19 +416,20 @@ async function shutdownAgentBody(input: ShutdownAgentInput, ctx: AuthContext): P
|
|
|
414
416
|
const priorCommand = input.commandId ? getCommand(commandId) : null;
|
|
415
417
|
if (priorCommand) return { command: priorCommand, orchestratorId: orchestrator.id, agent: currentAgent };
|
|
416
418
|
const admit = input.admit;
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
const refused = admit(getAgent(currentAgent.id) ?? currentAgent);
|
|
419
|
+
if (admit && currentAgent) {
|
|
420
|
+
const refused = admit(currentAgent);
|
|
420
421
|
if (refused) throw new AutomaticShutdownRefused(`automatic shutdown of ${currentAgent.id} refused at admission: ${refused}`);
|
|
421
|
-
|
|
422
|
-
|
|
422
|
+
}
|
|
423
|
+
const admitted = await createAgentControlAsync({ agent: currentAgent, commandId, commandInput, idleCandidate: input.idleCandidate });
|
|
424
|
+
if (!admitted.command) throw new AutomaticShutdownRefused(`automatic shutdown of ${currentAgent?.id} refused at admission: ${admitted.refused}`);
|
|
425
|
+
const command = admitted.command;
|
|
423
426
|
emitCommandEvent(command, "command.requested");
|
|
424
|
-
if (targetAgentId) reapAgentBrowserSessions(targetAgentId); // #3489 — a requested stop takes its browser with it
|
|
427
|
+
if (targetAgentId) (await reapAgentBrowserSessions(targetAgentId)); // #3489 — a requested stop takes its browser with it
|
|
425
428
|
// #1084 — an explicit shutdown is a platform-owned teardown signal: close the target's work
|
|
426
429
|
// window now rather than let a held final group die silently with the process. `edge-fallback`
|
|
427
430
|
// is the closest fit in the closed source enum — there is no cleaner workspace-ready/task-done
|
|
428
431
|
// signal backing an arbitrary teardown (which may target an agent with neither).
|
|
429
|
-
if (targetAgentId) markAgentWorkFinal(targetAgentId, "edge-fallback");
|
|
432
|
+
if (targetAgentId) (await markAgentWorkFinal(targetAgentId, "edge-fallback"));
|
|
430
433
|
|
|
431
434
|
// Lifecycle indicator — uniform across transports. The MCP path previously skipped
|
|
432
435
|
// this, so an MCP-initiated shutdown left the agent with no "shutting down" signal in
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { taskLinkedRepoCwd } from "./task-repo-cwd";
|
|
2
|
+
export { taskLinkedRepoCwd } from "./task-repo-cwd";
|
|
1
3
|
import { writeChildEnv } from "@humwick/sdk/env";
|
|
2
4
|
import { bindSpawnProjectCheckout } from "./project-checkout-binding";
|
|
3
|
-
import { REPORT_VERBOSITIES, resolveReportVerbosity } from "@humwick/sdk";
|
|
5
|
+
import { REPORT_VERBOSITIES, resolveReportVerbosity, DEFAULT_USER_ID, errMessage, isRecord, stringValue, type LaunchMode, type ReportVerbosity, type SpawnProvider, type TaskDispatch } from "@humwick/sdk";
|
|
4
6
|
import { cleanCallerSpawnEnv } from "../spawn-env";
|
|
5
|
-
import { optionalEnum } from "../validation";
|
|
6
|
-
import { optionalNonNegativeInt } from "../validation";
|
|
7
|
+
import { optionalEnum, optionalNonNegativeInt } from "../validation";
|
|
7
8
|
import { cleanSpawnBudget } from "../spawn-budget";
|
|
8
9
|
import { teamId as newTeamId } from "../db/teams";
|
|
9
10
|
import { getGateway } from "../db/gateway";
|
|
@@ -35,8 +36,7 @@ import type { WorkflowSpawnQuota } from "../db/spawn-in-flight";
|
|
|
35
36
|
// deliberately out of scope here — this slice converges the two external TRANSPORTS.
|
|
36
37
|
import { resolveSpawnApprovalMode } from "./spawn-approval";
|
|
37
38
|
import { assertOrchestratorSupportsLaunchMode, resolveSpawnLaunchMode } from "../launch-mode";
|
|
38
|
-
import {
|
|
39
|
-
import { addProjectRootAsync, countLiveSpawnedAgents, createActivityEventAsync, getAgent, getProject, getTaskDetailAsync, listAgents, listProjects, listWorkspaces, recordTaskSpawnRequestedAsync, reportedRepoRootForCwd, resolveAgentOwnershipAsync, resolveProjectForCwd, rootsForProject, ValidationError, withResolvedProvisioningAsync } from "../db";
|
|
39
|
+
import { addProjectRootAsync, countLiveSpawnedAgents, createActivityEventAsync, getAgent, getProject, listAgents, listWorkspaces, recordTaskSpawnRequestedAsync, reportedRepoRootForCwd, resolveAgentOwnershipAsync, resolveProjectForCwd, rootsForProject, ValidationError, withResolvedProvisioningAsync } from "../db";
|
|
40
40
|
import { acquireCoordinatorTeam } from "./team";
|
|
41
41
|
import { countInFlightSpawnCommands } from "../commands-db";
|
|
42
42
|
import { createSpawnCommandWithinQuotaAsync } from "../commands-write";
|
|
@@ -44,7 +44,7 @@ import { emitCommandEvent } from "../command-events";
|
|
|
44
44
|
import { redactCommandSecrets } from "../command-secrets";
|
|
45
45
|
import { buildSpawnCommand, generateSpawnRequestId } from "../spawn-command"; import { systemTagsForSpawn } from "../agent-system-tags";
|
|
46
46
|
import { resolveSpawnLandBlocked } from "../land-block";
|
|
47
|
-
import {
|
|
47
|
+
import { runnerRuntimeTokenEnvAsync } from "../runtime-tokens";
|
|
48
48
|
import { liveSpawnQuota } from "../spawn-quota";
|
|
49
49
|
import { resolveCanonicalHost } from "../host-identity";
|
|
50
50
|
import { resolveSpawnHostAnchor } from "../spawn-targets";
|
|
@@ -54,11 +54,12 @@ import { profileNotFoundMessage } from "../spawn-profile-errors";
|
|
|
54
54
|
import { composeSpawnInstructionsWithEventsAsync } from "../project-instructions";
|
|
55
55
|
import { applyDefaultSharedMcp, type SharedMcpSpawnOverride } from "../shared-mcp";
|
|
56
56
|
import { findGitRepoRoot, isInsideGitWorkTree, pathVisibleLocally } from "./canonical-root";
|
|
57
|
-
import { selectSpawnCwdPlacement } from "./spawn-cwd-placement";
|
|
57
|
+
import { selectSpawnCwdPlacement, spawnBuildWork } from "./spawn-cwd-placement";
|
|
58
58
|
import { isolatedSpawnGitRepoError, resolveSpawnRepoRoot } from "./spawn-repo-probe";
|
|
59
59
|
import { autoSeedProjectForCwdAsync } from "./project"; import { applyProjectCapabilityGates } from "../project-trust";
|
|
60
60
|
import { assertProjectRoleMcpCwd, assertProjectRoleMcpTrusted, projectRoleProfile, projectRoleProvenance, projectRoleSpawnDefaults, withRoleProfile } from "../project-roles";
|
|
61
61
|
import { spawnWarnings } from "./spawn-warnings";
|
|
62
|
+
import { enforceSpawnPolicy, spawnerKind, spawnPolicyTask, type AppliedSpawnPolicy } from "./spawn-policy";
|
|
62
63
|
import { resolveSpawnProjectRole } from "./spawn-project-role";
|
|
63
64
|
import { profileProviderPin, resolveSpawnLaunch } from "./spawn-launch";
|
|
64
65
|
import { hydrateTaskContext, projectTaskHydration } from "./task-context-hydration";
|
|
@@ -151,35 +152,6 @@ export function acquisitionManifestFor(projectId: string, cwd: string): {
|
|
|
151
152
|
};
|
|
152
153
|
}
|
|
153
154
|
|
|
154
|
-
export async function taskLinkedRepoCwd(taskId: number, callerCwd?: string): Promise<string> {
|
|
155
|
-
const task = await getTaskDetailAsync(taskId);
|
|
156
|
-
if (!task) throw new ValidationError(`task ${taskId} not found or not a deliverable task`);
|
|
157
|
-
// #2844 — a Task created with `repo:` but no linked issue still names its project repo.
|
|
158
|
-
const repos = [...new Set([...task.issues.map((issue) => issue.repo), task.repo].filter((repo): repo is string => Boolean(repo)))];
|
|
159
|
-
if (repos.length === 0) {
|
|
160
|
-
throw new ValidationError(`task ${taskId} has no linked issue repo; pass cwd/orchestratorId explicitly`);
|
|
161
|
-
}
|
|
162
|
-
const candidates = listProjects()
|
|
163
|
-
.filter((project) => project.issueRepo && repos.includes(project.issueRepo))
|
|
164
|
-
.flatMap((project) => rootsForProject(project.id).map((root) => ({ project, root })));
|
|
165
|
-
if (candidates.length === 0) {
|
|
166
|
-
// #1627 — this refusal is real and names its own cause: with no registered root, relay has no
|
|
167
|
-
// way to turn "repo owner/name" into a checkout path on a specific host. What made it a trap
|
|
168
|
-
// was the NEXT step: following its advice (pass cwd + orchestratorId) used to hit the isolated
|
|
169
|
-
// precondition's local-filesystem probe and get told the repo was "not a git repo". That lie is
|
|
170
|
-
// fixed at assertIsolatedSpawnHasGitRepo, so the remedy below now works. Name the tool so it is
|
|
171
|
-
// mechanical rather than a step you have to know exists.
|
|
172
|
-
throw new ValidationError(`task ${taskId} links repo ${repos.join(", ")} but no Relay project root is registered for it, so relay cannot resolve a checkout path for it; pass cwd + orchestratorId explicitly, or register the checkout with relay_project_add_root`);
|
|
173
|
-
}
|
|
174
|
-
const matchingCallerRoot = callerCwd
|
|
175
|
-
? candidates
|
|
176
|
-
.filter((candidate) => isPathWithinBase(callerCwd, candidate.root.rootPath))
|
|
177
|
-
.sort((a, b) => b.root.rootPath.length - a.root.rootPath.length)[0]
|
|
178
|
-
: undefined;
|
|
179
|
-
if (matchingCallerRoot) return matchingCallerRoot.root.rootPath;
|
|
180
|
-
if (candidates.length === 1) return candidates[0]!.root.rootPath;
|
|
181
|
-
throw new ValidationError(`task ${taskId} links repo ${repos.join(", ")} with multiple registered roots; pass cwd explicitly`);
|
|
182
|
-
}
|
|
183
155
|
|
|
184
156
|
/**
|
|
185
157
|
* A normalized spawn request — every transport validates its own wire shape (enums,
|
|
@@ -210,6 +182,8 @@ export interface SpawnAgentInput extends SelfEffortSpawnInput {
|
|
|
210
182
|
roleSnapshot?: import("../project-roles").ProjectRole;
|
|
211
183
|
workflowCaller?: WorkflowSpawnQuota;
|
|
212
184
|
roleSha?: string; workflowRunId?: string; roleProfile?: string; taskRepoCwd?: string; roleHost?: string;
|
|
185
|
+
/** #3736 — the workflows of the run tree spawning this step, for a spawn-policy `require.workflow`. Service-only. */
|
|
186
|
+
workflowNames?: string[];
|
|
213
187
|
prompt?: string;
|
|
214
188
|
systemPromptAppend?: string;
|
|
215
189
|
/**
|
|
@@ -324,6 +298,8 @@ export interface SpawnAgentResult {
|
|
|
324
298
|
dispatchDecision?: Awaited<ReturnType<typeof dispatchTaskAsync>>;
|
|
325
299
|
/** #3043 — the spawn went ahead, but the caller should know (a role read from a stale default branch). */
|
|
326
300
|
warnings?: string[];
|
|
301
|
+
/** #3736 — the project spawn-policy rules that applied to this spawn. */
|
|
302
|
+
spawnPolicy?: AppliedSpawnPolicy;
|
|
327
303
|
}
|
|
328
304
|
|
|
329
305
|
/** Reject when a component token's signed resource constraints disallow the target (#323). */
|
|
@@ -385,7 +361,7 @@ export async function spawnAgent(input: SpawnAgentInput, ctx: AuthContext): Prom
|
|
|
385
361
|
const lineageAgent: AgentCard | undefined = (lineageAgentId ? getAgent(lineageAgentId) : undefined) ?? undefined;
|
|
386
362
|
const callerCwd = stringValue(caller?.meta?.cwd) ?? stringValue(lineageAgent?.meta?.cwd);
|
|
387
363
|
const taskDefaultCwd = input.taskId !== undefined && (!input.orchestratorId || input.role !== undefined) && !input.cwd
|
|
388
|
-
? input.taskRepoCwd ?? await taskLinkedRepoCwd(input.taskId, callerCwd)
|
|
364
|
+
? input.taskRepoCwd ?? await taskLinkedRepoCwd(input.taskId, callerCwd, caller ?? lineageAgent)
|
|
389
365
|
: undefined;
|
|
390
366
|
const requestedCwd = input.cwd ?? taskDefaultCwd ?? (input.role !== undefined ? callerCwd : undefined);
|
|
391
367
|
const roleSpawn = input.roleSnapshot ? { role: input.roleSnapshot, warnings: [] } : input.role === undefined && input.roleSha === undefined ? undefined : await resolveSpawnProjectRole({ role: input.role, roleSha: input.roleSha, profile: input.profile, orchestratorId: input.orchestratorId, cwd: requestedCwd, preferHost: input.roleHost ?? caller?.machine ?? lineageAgent?.machine, allowedOrchestratorIds: ctx.constraints?.orchestrators, canSpawn: canSpawn(ctx) });
|
|
@@ -424,10 +400,15 @@ export async function spawnAgent(input: SpawnAgentInput, ctx: AuthContext): Prom
|
|
|
424
400
|
provider: resolvedProvider, orchestratorId: input.orchestratorId, requestedCwd: repoSource ? undefined : requestedCwd, repoSource,
|
|
425
401
|
resumeWorkspace: input.resumeWorkspace, caller, lineageMachine: lineageAgent?.machine,
|
|
426
402
|
callerCwd, allowedOrchestratorIds: ctx.constraints?.orchestrators,
|
|
427
|
-
shared: workspaceMode === "shared", workspaceMode, canLand: !landBlockResolution.landBlocked, model: modelParams.model, effort: modelParams.effort,
|
|
403
|
+
shared: workspaceMode === "shared", workspaceMode, canLand: !landBlockResolution.landBlocked, buildWork: spawnBuildWork(profileName, (input.dispatch ?? linkedTask?.dispatch ?? profileSpawnDefaults.dispatch)?.type), model: modelParams.model, effort: modelParams.effort,
|
|
428
404
|
});
|
|
429
405
|
|
|
430
406
|
assertOrchestratorSupportsLaunchMode(orchestrator, launchMode, input.providerArgs);
|
|
407
|
+
// #3736 — the project's spawn policy, before any side effect: a refusal names the rule, the allowed set and the hint.
|
|
408
|
+
const spawnPolicy = await enforceSpawnPolicy(
|
|
409
|
+
{ projectId: lazyRoot?.projectId ?? resolveProjectForCwd(resolvedCwd)?.id, ...(lazyRoot ? {} : { checkout: { cwd: resolvedCwd, orchestratorId: orchestrator.id } }) },
|
|
410
|
+
{ spawner: spawnerKind(ctx, input, caller), task: spawnPolicyTask(linkedTask), subject: { role: projectRole?.name, profile: profileName, workflows: input.workflowNames } },
|
|
411
|
+
);
|
|
431
412
|
|
|
432
413
|
// Resolve + validate the named agent profile server-side (was HTTP-only; the MCP path passed
|
|
433
414
|
// the name through unvalidated). Omitted profile uses Relay's spawn default so coordinator
|
|
@@ -476,7 +457,7 @@ export async function spawnAgent(input: SpawnAgentInput, ctx: AuthContext): Prom
|
|
|
476
457
|
|
|
477
458
|
if (shouldAutoScaffoldTask(input, profileName)) {
|
|
478
459
|
const brief = spawnBrief(input)!;
|
|
479
|
-
linkedTask = createTaskEntity({
|
|
460
|
+
linkedTask = await createTaskEntity({
|
|
480
461
|
title: taskTitleFromBrief(brief, input.label),
|
|
481
462
|
intent: brief,
|
|
482
463
|
latestSteer: input.steer,
|
|
@@ -534,7 +515,7 @@ export async function spawnAgent(input: SpawnAgentInput, ctx: AuthContext): Prom
|
|
|
534
515
|
// disk. That's only trustworthy when the spawn's target orchestrator actually shares this
|
|
535
516
|
// filesystem — a remote orchestrator's host can coincidentally have the same path with
|
|
536
517
|
// DIFFERENT content, so the gate is told explicitly rather than inferring from path existence.
|
|
537
|
-
if (agentProfile.sources?.project) agentProfile = applyProjectCapabilityGates(agentProfile, resolvedCwd, registeredProjectBeforeAutoSeed, { orchestratorLocal: isOrchestratorLocalToRelay(orchestrator), ...(projectRole ? { pinnedMcpCommit: projectRole.source.sha } : {}) });
|
|
518
|
+
if (agentProfile.sources?.project) agentProfile = (await applyProjectCapabilityGates(agentProfile, resolvedCwd, registeredProjectBeforeAutoSeed, { orchestratorLocal: isOrchestratorLocalToRelay(orchestrator), ...(projectRole ? { pinnedMcpCommit: projectRole.source.sha } : {}) }));
|
|
538
519
|
if (projectRole) assertProjectRoleMcpTrusted(projectRole, agentProfile);
|
|
539
520
|
|
|
540
521
|
// N7 — project hooks/MCP are executable code and are gated against the project
|
|
@@ -589,7 +570,7 @@ export async function spawnAgent(input: SpawnAgentInput, ctx: AuthContext): Prom
|
|
|
589
570
|
}
|
|
590
571
|
|
|
591
572
|
// #3107 — the lineage coordinator's active team; a coordinator takes its project's seat, never a dissolved id.
|
|
592
|
-
const callerTeam = lineageAgentId ? acquireCoordinatorTeam(lineageAgentId) : undefined;
|
|
573
|
+
const callerTeam = lineageAgentId ? (await acquireCoordinatorTeam(lineageAgentId)) : undefined;
|
|
593
574
|
const privateTeamId = profileName === "sub-coordinator" ? newTeamId() : undefined;
|
|
594
575
|
const launchTeamId = privateTeamId ?? callerTeam?.id;
|
|
595
576
|
|
|
@@ -703,7 +684,7 @@ export async function spawnAgent(input: SpawnAgentInput, ctx: AuthContext): Prom
|
|
|
703
684
|
// Child runner token. `agentInitiated` (set whenever an agent is the caller) forces a
|
|
704
685
|
// non-spawn-capable child (no grandchildren); `spawnedBy` stamps authoritative lineage the
|
|
705
686
|
// child can't forge (it registers with spawnedBy = caller, read from the signed token).
|
|
706
|
-
const env = { ...callerEnv, ...
|
|
687
|
+
const env = { ...callerEnv, ...await runnerRuntimeTokenEnvAsync({
|
|
707
688
|
agentId: targetAgentId,
|
|
708
689
|
orchestratorId: orchestrator.id,
|
|
709
690
|
cwd: resolvedCwd,
|
|
@@ -875,7 +856,7 @@ export async function spawnAgent(input: SpawnAgentInput, ctx: AuthContext): Prom
|
|
|
875
856
|
requestedBy,
|
|
876
857
|
...(currentTask?.latestSteer ? { steer: currentTask.latestSteer } : {}),
|
|
877
858
|
});
|
|
878
|
-
autoSubscribeTaskCoordinator(requestedBy, input.taskId);
|
|
859
|
+
(await autoSubscribeTaskCoordinator(requestedBy, input.taskId));
|
|
879
860
|
} catch (err) {
|
|
880
861
|
console.warn(`task ${input.taskId} spawn attribution skipped: ${errMessage(err)}`);
|
|
881
862
|
}
|
|
@@ -900,6 +881,7 @@ export async function spawnAgent(input: SpawnAgentInput, ctx: AuthContext): Prom
|
|
|
900
881
|
...(autoScaffoldedTask ? { task: autoScaffoldedTask } : {}),
|
|
901
882
|
...(taskDispatchDecision ? { dispatchDecision: taskDispatchDecision } : {}),
|
|
902
883
|
...(warnings.length ? { warnings } : {}),
|
|
884
|
+
...(spawnPolicy ? { spawnPolicy } : {}),
|
|
903
885
|
};
|
|
904
886
|
}
|
|
905
887
|
|
|
@@ -24,7 +24,7 @@ import { join } from "node:path";
|
|
|
24
24
|
import type { LaunchMode, SpawnProvider } from "@humwick/sdk";
|
|
25
25
|
import { withResolvedProvisioning } from "../db";
|
|
26
26
|
import { getAgentProfile } from "../config-store";
|
|
27
|
-
import { buildSpawnCommand } from "../spawn-command";
|
|
27
|
+
import { buildSpawnCommand, resolveSpawnModelParams } from "../spawn-command";
|
|
28
28
|
import { spawnOptionsFromControl } from "../../orchestrator/src/control";
|
|
29
29
|
import type { SpawnOptions } from "../../orchestrator/src/spawn/types";
|
|
30
30
|
import { buildEnv, buildRunnerCommand } from "../../orchestrator/src/spawn/command";
|
|
@@ -50,7 +50,7 @@ export interface SpawnChainInspection {
|
|
|
50
50
|
settings: Record<string, unknown> | null;
|
|
51
51
|
/** The effective launch argv the adapter would exec. */
|
|
52
52
|
argv: string[];
|
|
53
|
-
/** The launch command (
|
|
53
|
+
/** The launch command (e.g. claude). */
|
|
54
54
|
command: string;
|
|
55
55
|
/** relay-provisioned-hooks/<ref> dir for the baseline guard. */
|
|
56
56
|
baselineHookAssetDir: string | undefined;
|
|
@@ -139,18 +139,10 @@ export function prepareSpawnChain(opts: SpawnChainRequest, observe?: SpawnChainP
|
|
|
139
139
|
prompt: opts.spawn?.prompt,
|
|
140
140
|
systemPromptAppend: opts.spawn?.systemPromptAppend,
|
|
141
141
|
headless: opts.spawn?.headless ?? true,
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
...(opts.spawn.effort ? { effort: opts.spawn.effort } : {}),
|
|
147
|
-
// #2595 — window passes through the same payload field production threads.
|
|
148
|
-
...(typeof opts.spawn.contextWindowTokens === "number" && Number.isSafeInteger(opts.spawn.contextWindowTokens) && opts.spawn.contextWindowTokens > 0
|
|
149
|
-
? { contextWindowTokens: opts.spawn.contextWindowTokens }
|
|
150
|
-
: {}),
|
|
151
|
-
},
|
|
152
|
-
}
|
|
153
|
-
: {}),
|
|
142
|
+
modelParams: {
|
|
143
|
+
...resolveSpawnModelParams(provider, opts.spawn?.model, opts.spawn?.effort),
|
|
144
|
+
...(opts.spawn?.contextWindowTokens !== undefined ? { contextWindowTokens: opts.spawn.contextWindowTokens } : {}),
|
|
145
|
+
},
|
|
154
146
|
} as Parameters<typeof buildSpawnCommand>[0]);
|
|
155
147
|
|
|
156
148
|
return prepareCommandChain(cmdParams, opts, observe);
|
|
@@ -216,6 +208,7 @@ export function prepareCommandChain(
|
|
|
216
208
|
provider: cli.provider,
|
|
217
209
|
...(cli.model ? { model: cli.model } : {}),
|
|
218
210
|
...(cli.effort ? { effort: cli.effort } : {}),
|
|
211
|
+
...(cli.modelRecord ? { modelRecord: cli.modelRecord } : {}),
|
|
219
212
|
// #2595 — the real runner CLI carries the window as a flag; carry it through the same seam.
|
|
220
213
|
...(cli.contextWindowTokens !== undefined ? { contextWindowTokens: cli.contextWindowTokens } : {}),
|
|
221
214
|
runnerId: "inspector",
|
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
import { basename, join, relative } from "node:path";
|
|
2
2
|
import { hostname } from "node:os";
|
|
3
|
-
import { normalizeGitRemoteIdentity, stringValue, type AgentCard, type Orchestrator, type SpawnProvider, type WorkspaceMode, type ProjectRoot } from "@humwick/sdk";
|
|
4
|
-
import { listAgents, listOrchestrators, listWorkspaces, resolveProjectForCwd, rootsForProject, ValidationError } from "../db";
|
|
3
|
+
import { normalizeGitRemoteIdentity, stringValue, type AgentCard, type Orchestrator, type SpawnProvider, type WorkspaceMode, type ProjectRoot, type TaskDispatch } from "@humwick/sdk";
|
|
4
|
+
import { getOrchestrator, listAgents, listOrchestrators, listWorkspaces, resolveProjectForCwd, rootsForProject, ValidationError } from "../db";
|
|
5
|
+
import { listHostViews } from "../db/hosts-views";
|
|
5
6
|
import { unboundOnHost, unboundProjectRoots } from "../db/project-lifecycle";
|
|
6
7
|
import { isOrchestratorLocalToRelay, isPathWithinBase, sameHostIdentity } from "../utils";
|
|
7
8
|
import { findGitRepoRoot } from "./canonical-root";
|
|
8
9
|
import { TERMINAL_WORKSPACE_STATUSES } from "../workspace-phase";
|
|
9
|
-
import { selectSpawnPlacement, spawnPlacementCandidates, isRelayHost } from "../spawn-placement";
|
|
10
|
+
import { selectSpawnPlacement, spawnPlacementCandidates, isRelayHost, type SpawnCapOptions } from "../spawn-placement";
|
|
10
11
|
import { remoteUrlFromGitRemote } from "./git-remote";
|
|
11
12
|
import { probeHostRepo, probeLocalSourceRepo } from "./spawn-repo-probe";
|
|
12
13
|
import { hostProjectReadiness } from "./host-project-readiness";
|
|
13
14
|
|
|
15
|
+
export function spawnBuildWork(profile: string, type?: TaskDispatch["type"]): boolean {
|
|
16
|
+
return type ? !["review", "research", "ops"].includes(type) : !["reviewer", "qa", "probe", "sec-ops"].includes(profile.toLowerCase());
|
|
17
|
+
}
|
|
18
|
+
|
|
14
19
|
/** Resolve host and working directory together so capacity routing keeps the caller's repo. */
|
|
15
20
|
export async function selectSpawnCwdPlacement(input: {
|
|
16
21
|
provider: SpawnProvider;
|
|
@@ -26,15 +31,16 @@ export async function selectSpawnCwdPlacement(input: {
|
|
|
26
31
|
shared: boolean;
|
|
27
32
|
workspaceMode?: WorkspaceMode;
|
|
28
33
|
canLand?: boolean;
|
|
34
|
+
buildWork?: boolean;
|
|
29
35
|
model?: string;
|
|
30
36
|
effort?: string;
|
|
31
37
|
}): Promise<{ orchestrator: Orchestrator; placementReason: string; resolvedCwd: string; lazyRoot?: ProjectRoot }> {
|
|
32
38
|
const platformRule = input.workspaceMode === "isolated" && !input.shared && input.resumeWorkspace?.mode !== "attach"
|
|
33
39
|
? await sourcePlacementPlatforms(input) : undefined;
|
|
34
|
-
const capOpts = { ...(input.caller ? { callerAgentId: input.caller.id } : {}), attach: input.resumeWorkspace?.mode === "attach" };
|
|
40
|
+
const capOpts: SpawnCapOptions = { ...(input.caller ? { callerAgentId: input.caller.id } : {}), attach: input.resumeWorkspace?.mode === "attach", buildWork: input.buildWork };
|
|
35
41
|
const earlyPlacement = !input.orchestratorId && input.resumeWorkspace?.mode !== "attach"
|
|
36
42
|
? spawnPlacementCandidates(input.provider, input.requestedCwd, input.allowedOrchestratorIds,
|
|
37
|
-
input.shared, input.model, input.effort, input.workspaceMode, platformRule, input.canLand, capOpts)
|
|
43
|
+
input.shared, input.model, input.effort, input.buildWork === false ? undefined : input.workspaceMode, platformRule, input.canLand, capOpts)
|
|
38
44
|
: undefined;
|
|
39
45
|
const survivors = earlyPlacement?.candidates.map((host) => host.id) ?? input.allowedOrchestratorIds;
|
|
40
46
|
// Preserve selection's detailed exclusion error without probing hosts already ruled out.
|
|
@@ -43,6 +49,16 @@ export async function selectSpawnCwdPlacement(input: {
|
|
|
43
49
|
input.model, input.effort, input.workspaceMode, platformRule, input.canLand, capOpts);
|
|
44
50
|
const { attachWorkspace, hostCwds, allowedOrchestratorIds, lazyRoots, exclusions: checkoutExclusions = [] } = await omittedHostContext({ ...input, allowedOrchestratorIds: survivors });
|
|
45
51
|
const requestedCwd = input.repoSource && !hostCwds ? input.repoSource : input.requestedCwd;
|
|
52
|
+
// Review/QA setup depends on the target checkout HEAD; a caller's policy base cannot vouch for it (#3805).
|
|
53
|
+
if (input.workspaceMode === "isolated" && input.buildWork === false && !input.resumeWorkspace) {
|
|
54
|
+
const views = new Map(listHostViews(Date.now()).map((view) => [view.id, view]));
|
|
55
|
+
const hosts = input.orchestratorId ? [getOrchestrator(input.orchestratorId)].filter((host): host is Orchestrator => !!host) : earlyPlacement?.candidates ?? [];
|
|
56
|
+
const lightHosts = await Promise.all(hosts.filter((host) => isRelayHost(host, host.hostId ? views.get(host.hostId) : undefined)).map(async (host) => {
|
|
57
|
+
const probe = await probeHostRepo(host, requestedCwd ?? hostCwds?.get(host.id) ?? input.callerCwd ?? host.baseDir, undefined, true);
|
|
58
|
+
return probe.kind === "present" && probe.workspaceDepsDisabled === true ? host.id : undefined;
|
|
59
|
+
}));
|
|
60
|
+
capOpts.workspaceDepsDisabledHosts = lightHosts.filter((id): id is string => id !== undefined);
|
|
61
|
+
}
|
|
46
62
|
// #3169/#3625 — capacity ranks only hosts whose own checkout is ready for the project (refresh hook, toolchain).
|
|
47
63
|
const readiness = hostProjectReadiness();
|
|
48
64
|
const readinessExclusions: string[] = [];
|