@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/recipe-runner.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { createCommandAsync } from "./commands-write";
|
|
1
2
|
import { writeChildEnv } from "@humwick/sdk/env";
|
|
2
3
|
import { randomUUID } from "node:crypto";
|
|
3
|
-
import {
|
|
4
|
+
import { type CreateCommandWriteArgs } from "./commands-db";
|
|
4
5
|
import { effectiveProviderCatalogListAsync, listOrchestrators } from "./db";
|
|
5
6
|
import { resolveProviderSelection } from "@humwick/sdk/provider-catalog";
|
|
6
7
|
import { getRecipeAsync } from "./recipe-loader";
|
|
@@ -15,7 +16,7 @@ import {
|
|
|
15
16
|
validateRecipeArtifactRefsAsync,
|
|
16
17
|
} from "./recipe-async";
|
|
17
18
|
import type { AttachmentRef, Command, RecipeInstance } from "./types";
|
|
18
|
-
import { SYSTEM_LAUNCH,
|
|
19
|
+
import { SYSTEM_LAUNCH, runnerRuntimeTokenEnvAsync } from "./runtime-tokens";
|
|
19
20
|
import { generateSpawnAgentId } from "./services/spawn-identity";
|
|
20
21
|
|
|
21
22
|
interface StartRecipeInput {
|
|
@@ -114,7 +115,7 @@ export async function startRecipe(input: StartRecipeInput): Promise<StartRecipeR
|
|
|
114
115
|
env: {
|
|
115
116
|
...(agent.env ?? {}),
|
|
116
117
|
...(attachments.length ? writeChildEnv({}, { AGENT_RELAY_RECIPE_ARTIFACTS: JSON.stringify(attachments) }) : {}),
|
|
117
|
-
...
|
|
118
|
+
...await runnerRuntimeTokenEnvAsync({ authority: SYSTEM_LAUNCH,
|
|
118
119
|
agentId,
|
|
119
120
|
orchestratorId: orchestrator.id,
|
|
120
121
|
cwd,
|
|
@@ -148,13 +149,13 @@ export async function stopRecipe(instanceId: string, stoppedBy = "cli"): Promise
|
|
|
148
149
|
// canceled by beginStop; a claimed one is already ordered before this stop and cannot be
|
|
149
150
|
// targeted with an agent.shutdown command until its spawn result supplies a real agent id.
|
|
150
151
|
if (agent.agentId.startsWith("pending:")) continue;
|
|
151
|
-
const command =
|
|
152
|
+
const command = (await createCommandAsync({
|
|
152
153
|
type: "agent.shutdown",
|
|
153
154
|
source: stoppedBy,
|
|
154
155
|
target: agent.agentId,
|
|
155
156
|
params: { recipeInstanceId: instance.id, role: agent.role },
|
|
156
157
|
ttlMs: 30_000,
|
|
157
|
-
});
|
|
158
|
+
}));
|
|
158
159
|
commands.push(command);
|
|
159
160
|
await updateRecipeAgentInstanceAsync(instance.id, agent.agentId, "stopping");
|
|
160
161
|
}
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
import { dirname, resolve } from "node:path";
|
|
7
7
|
import { isRecord, stringValue } from "@humwick/sdk";
|
|
8
8
|
import { isTrustedOrchestratorApiUrl, relayAuthHeaders } from "./config";
|
|
9
|
-
import { getConfig
|
|
9
|
+
import { getConfig } from "./config-store";
|
|
10
|
+
import { setConfigAsync } from "./config-store-write";
|
|
10
11
|
import { listOrchestrators, reportedRepoRootForCwd } from "./db";
|
|
11
12
|
import { hostIsRelayHost } from "./relay-host-locality";
|
|
12
13
|
import { normalizeHostToken, parseJson, sameHostIdentity } from "./utils";
|
|
@@ -70,11 +71,16 @@ export function hostRepoConfigSource<T>(spec: HostRepoConfigSpec<T>): HostRepoCo
|
|
|
70
71
|
return null;
|
|
71
72
|
}
|
|
72
73
|
|
|
73
|
-
|
|
74
|
+
/** #1870 S7: writes on the writer thread, and only when the answer changed. `at` is evidence, not a
|
|
75
|
+
* TTL, so re-stamping an identical answer on every read only bumped the version and history. */
|
|
76
|
+
async function writeCached(host: string, keys: readonly string[], found: RepoConfigSource<T> | null): Promise<void> {
|
|
74
77
|
const at = Date.now();
|
|
78
|
+
const answer = JSON.stringify(found);
|
|
75
79
|
for (const key of keys) {
|
|
76
80
|
try {
|
|
77
|
-
|
|
81
|
+
const current = getConfig<CachedRepoConfigSource<T>>(spec.cacheNamespace, cacheKey(host, key))?.value;
|
|
82
|
+
if (current?.at && JSON.stringify(current.found) === answer) continue;
|
|
83
|
+
await setConfigAsync<CachedRepoConfigSource<T>>(spec.cacheNamespace, cacheKey(host, key), { found, at }, spec.cacheNamespace);
|
|
78
84
|
} catch {
|
|
79
85
|
// The cache is an optimization for the sync paths; failing to record it must never fail a caller.
|
|
80
86
|
}
|
|
@@ -149,7 +155,7 @@ export function hostRepoConfigSource<T>(spec: HostRepoConfigSpec<T>): HostRepoCo
|
|
|
149
155
|
if (hostIsRelayHost(host)) return { known: true, found: await spec.findLocalAsync(cwd) };
|
|
150
156
|
const read = await readFromHost(cwd, host!);
|
|
151
157
|
if (read.known) {
|
|
152
|
-
writeCached(host!, cacheWriteKeys(cwd, read.found, opts.alsoCacheFor), read.found);
|
|
158
|
+
await writeCached(host!, cacheWriteKeys(cwd, read.found, opts.alsoCacheFor), read.found);
|
|
153
159
|
return read;
|
|
154
160
|
}
|
|
155
161
|
return cachedLookup(host!, cwd);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { setConfigAsync } from "./config-store-write";
|
|
2
|
+
import { getConfig } from "./config-store";
|
|
2
3
|
import {
|
|
3
4
|
RETENTION_CONFIG_DEFAULTS,
|
|
4
5
|
RETENTION_KEY,
|
|
@@ -27,6 +28,6 @@ export function getRetentionConfigEntry(): ConfigEntry<RetentionConfig> {
|
|
|
27
28
|
};
|
|
28
29
|
}
|
|
29
30
|
|
|
30
|
-
export function setRetentionConfig(value: unknown, updatedBy?: string): ConfigEntry<RetentionConfig
|
|
31
|
-
return
|
|
31
|
+
export async function setRetentionConfig(value: unknown, updatedBy?: string): Promise<ConfigEntry<RetentionConfig>> {
|
|
32
|
+
return (await setConfigAsync(RETENTION_NAMESPACE, RETENTION_KEY, value as RetentionConfig, updatedBy));
|
|
32
33
|
}
|
package/src/reviewer-pipeline.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { createCommandAsync } from "./commands-write";
|
|
1
2
|
import { isRecord } from "@humwick/sdk";
|
|
2
3
|
import { planSend } from "./agent-ref";
|
|
3
|
-
|
|
4
|
+
|
|
4
5
|
import { getSpawnPolicy } from "./config-store";
|
|
5
6
|
import { deferLandSettleSideEffect } from "./land-settle-dispatch";
|
|
6
7
|
import { getLifecycleManager } from "./lifecycle-manager";
|
|
@@ -68,7 +69,7 @@ export async function handleReviewerMergeResult(command: Command, result: Record
|
|
|
68
69
|
// it must reach the reviewer even if they're offline a while — not a bystander notice. So, like the
|
|
69
70
|
// landing receipt, it is written SYNCHRONOUSLY on the settle path; only the bystander announcement
|
|
70
71
|
// ping and the eager spawn defer off the hot path below.
|
|
71
|
-
routeNotification({
|
|
72
|
+
await routeNotification({
|
|
72
73
|
type: "workspace.review_request",
|
|
73
74
|
scope: { workspaceId: workspace.id, repoRoot: workspace.repoRoot },
|
|
74
75
|
recipients: [target],
|
|
@@ -102,8 +103,8 @@ export async function handleReviewerMergeResult(command: Command, result: Record
|
|
|
102
103
|
// (`handleReviewerMergeResult` runs inside `settleWorkspaceMergeCommand`). They defer off the hot
|
|
103
104
|
// path; the spawn self-heals via `reconcilePolicy` even if a deferred dispatch is missed, and the
|
|
104
105
|
// review-request obligation it consumes is already durably queued synchronously above.
|
|
105
|
-
deferLandSettleSideEffect("reviewer-review-request", () => {
|
|
106
|
-
emitWorkspaceTaskSemanticNotifications({
|
|
106
|
+
deferLandSettleSideEffect("reviewer-review-request", async () => {
|
|
107
|
+
await emitWorkspaceTaskSemanticNotifications({
|
|
107
108
|
workspace: reviewWorkspace,
|
|
108
109
|
transition: "review-requested",
|
|
109
110
|
actor: "reviewer-pipeline",
|
|
@@ -144,7 +145,7 @@ export async function handleReviewerPipelineScan(
|
|
|
144
145
|
|
|
145
146
|
if (decision === "APPROVED") {
|
|
146
147
|
if (!prNumber && !prUrl) return { skipped: "missing-pr" };
|
|
147
|
-
const command =
|
|
148
|
+
const command = (await createCommandAsync({
|
|
148
149
|
type: "workspace.pr-arm-auto-merge",
|
|
149
150
|
source: "system",
|
|
150
151
|
target: orchestratorAgentId,
|
|
@@ -161,7 +162,7 @@ export async function handleReviewerPipelineScan(
|
|
|
161
162
|
requestedBy: "reviewer-pipeline",
|
|
162
163
|
requestedAt: now,
|
|
163
164
|
},
|
|
164
|
-
});
|
|
165
|
+
}));
|
|
165
166
|
await patchWorkspaceMetadataAsync(workspace.id, {
|
|
166
167
|
autoMergeArmed: true,
|
|
167
168
|
autoMergeArmCommandId: command.id,
|
|
@@ -176,7 +177,7 @@ export async function handleReviewerPipelineScan(
|
|
|
176
177
|
const last = text(workspace.metadata.lastReviewDecision);
|
|
177
178
|
if (last === "CHANGES_REQUESTED") return { skipped: "changes-requested-already-notified" };
|
|
178
179
|
const notifiedOwner = workspace.ownerAgentId
|
|
179
|
-
? notifyReviewChangesRequested(workspace, preview, prUrl, prNumber)
|
|
180
|
+
? await notifyReviewChangesRequested(workspace, preview, prUrl, prNumber)
|
|
180
181
|
: undefined;
|
|
181
182
|
await patchWorkspaceMetadataAsync(workspace.id, {
|
|
182
183
|
lastReviewDecision: decision,
|
|
@@ -198,17 +199,17 @@ function workspaceActiveArm(workspace: WorkspaceRecord): boolean {
|
|
|
198
199
|
return workspace.metadata.autoMergeArmed === true || typeof workspace.metadata.autoMergeArmCommandId === "string";
|
|
199
200
|
}
|
|
200
201
|
|
|
201
|
-
function notifyReviewChangesRequested(
|
|
202
|
+
async function notifyReviewChangesRequested(
|
|
202
203
|
workspace: WorkspaceRecord,
|
|
203
204
|
preview: WorkspaceMergePreview,
|
|
204
205
|
prUrl: string | undefined,
|
|
205
206
|
prNumber: number | undefined,
|
|
206
|
-
): string | undefined {
|
|
207
|
+
): Promise<string | undefined> {
|
|
207
208
|
const target = workspace.ownerAgentId;
|
|
208
209
|
if (!target) return undefined;
|
|
209
210
|
// Durable (ttl null): the owner must learn changes were requested on THEIR workspace even after
|
|
210
211
|
// being offline — store-ahead, not a freshness-gated bystander notice.
|
|
211
|
-
routeNotification({
|
|
212
|
+
await routeNotification({
|
|
212
213
|
type: "workspace.review_changes_requested",
|
|
213
214
|
scope: { workspaceId: workspace.id, repoRoot: workspace.repoRoot, author: target },
|
|
214
215
|
recipients: [target],
|
package/src/routes/_route.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { scopeResourceReads } from "./viewer-read";
|
|
2
|
-
import { captureSyncFrame
|
|
2
|
+
import { captureSyncFrame } from "../loop-block-attribution";
|
|
3
3
|
import { withRelayEventDrain } from "../relay-event-drain";
|
|
4
|
-
import {
|
|
4
|
+
import { runInFrame } from "../hub-metrics";
|
|
5
5
|
import { error, type Handler } from "./_shared";
|
|
6
6
|
import type { LoopCallsiteContext } from "../loop-block-attribution";
|
|
7
7
|
|
|
@@ -42,8 +42,8 @@ export function runMatchedRoute(
|
|
|
42
42
|
req: Request,
|
|
43
43
|
finish: (response: Response) => Promise<Response>,
|
|
44
44
|
): Promise<Response> {
|
|
45
|
-
return
|
|
46
|
-
finish(await captureSyncFrame(matched.loop.frame, () => matched.handler(req, matched.params)))))
|
|
45
|
+
return runInFrame(matched.loop.scope, () => withRelayEventDrain(async () =>
|
|
46
|
+
finish(await captureSyncFrame(matched.loop.frame, () => matched.handler(req, matched.params)))));
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
export function matchRoutes(
|
package/src/routes/_shared.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { sendMessageWithResultAsync } from "../db/message-send";
|
|
1
2
|
import { hasPresentedCredential, relayHeader, canonicalHumanAgentId, DEFAULT_USER_ID, errMessage, fireAndForget, isHumanAgentId, isRecord, userIdFromAddress, userSinkId } from "@humwick/sdk";
|
|
2
3
|
import { authorityDenied } from "../authority-audit";
|
|
3
4
|
// Auto-split from routes.ts (#299). Domain: _shared.
|
|
4
5
|
import { agentVisibleTo, visibleAgentIds, viewerScope, type ViewerScope } from "../db/viewer-scope";
|
|
5
6
|
import { MAX_BODY_BYTES, getIntegrationTokens } from "../config";
|
|
6
|
-
import { ValidationError, createActivityEventAsync, createCallbackDeliveryAsync, finishCallbackDeliveryAsync, getAgent, getTaskAsync, normalizeReactionEmoji
|
|
7
|
+
import { ValidationError, createActivityEventAsync, createCallbackDeliveryAsync, finishCallbackDeliveryAsync, getAgent, getTaskAsync, normalizeReactionEmoji } from "../db";
|
|
7
8
|
import { cleanEpoch, cleanString, optionalEnum } from "../validation";
|
|
8
9
|
import { emitActivityEvent, emitMessageQueued, emitNewMessage } from "../sse";
|
|
9
10
|
import { authorizeAgentForUser, type AgentAction } from "../agent-authz";
|
|
@@ -25,19 +26,19 @@ export const json = (data: unknown, status = 200) =>
|
|
|
25
26
|
export const error = (msg: string, status = 400) =>
|
|
26
27
|
json({ error: msg }, status);
|
|
27
28
|
|
|
28
|
-
export function authorizeRoute(req: Request, check: Parameters<typeof isRequestAuthorizedFor>[1]): Response | null {
|
|
29
|
+
export async function authorizeRoute(req: Request, check: Parameters<typeof isRequestAuthorizedFor>[1]): Promise<Response | null> {
|
|
29
30
|
if (!hasPresentedCredential(req)) return null;
|
|
30
|
-
return isRequestAuthorizedFor(req, check) ? null : authorityDenied(req, "forbidden");
|
|
31
|
+
return isRequestAuthorizedFor(req, check) ? null : (await authorityDenied(req, "forbidden"));
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
/** A write about agent `agentId` by that agent's own credential: the agent, its agent:write check and the parsed body. */
|
|
34
35
|
export async function agentWriteRequest(req: Request, agentId: string): Promise<{ agent: NonNullable<ReturnType<typeof getAgent>>; body: Record<string, unknown> } | Response> {
|
|
35
36
|
const agent = getAgent(agentId);
|
|
36
37
|
if (!agent) return error("agent not found", 404);
|
|
37
|
-
const denied = authorizeRoute(req, {
|
|
38
|
+
const denied = (await authorizeRoute(req, {
|
|
38
39
|
scope: "agent:write",
|
|
39
40
|
resource: { agentId: agent.id, policyName: metaString(agent.meta, "policyName"), spawnRequestId: metaString(agent.meta, "spawnRequestId") },
|
|
40
|
-
});
|
|
41
|
+
}));
|
|
41
42
|
if (denied) return denied;
|
|
42
43
|
const parsed = await parseBody<Record<string, unknown>>(req);
|
|
43
44
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -49,9 +50,9 @@ export async function agentWriteRequest(req: Request, agentId: string): Promise<
|
|
|
49
50
|
// `command:fleet`-scoped token is authorized here without the sandbox constraint; every other
|
|
50
51
|
// caller falls back to the normal constrained `command:write` check. Use ONLY at those three call
|
|
51
52
|
// sites — everywhere else must keep going through `authorizeRoute`.
|
|
52
|
-
export function authorizeFleetRoute(req: Request, resource?: Parameters<typeof isFleetActionAuthorized>[1]): Response | null {
|
|
53
|
+
export async function authorizeFleetRoute(req: Request, resource?: Parameters<typeof isFleetActionAuthorized>[1]): Promise<Response | null> {
|
|
53
54
|
if (!hasPresentedCredential(req)) return null;
|
|
54
|
-
return isFleetActionAuthorized(req, resource) ? null : authorityDenied(req, "forbidden");
|
|
55
|
+
return isFleetActionAuthorized(req, resource) ? null : (await authorityDenied(req, "forbidden"));
|
|
55
56
|
}
|
|
56
57
|
|
|
57
58
|
export function authAuditMetadata(req: Request): Record<string, unknown> {
|
|
@@ -181,8 +182,8 @@ export function requestUserAddress(req: Request): string {
|
|
|
181
182
|
* Single-user worlds fail-open inside {@link authorizeAgentForUser}, so existing routes are
|
|
182
183
|
* unchanged until #389 upgrades {@link requestUserId} to the real session user.
|
|
183
184
|
*/
|
|
184
|
-
export function authorizeAgentRoute(req: Request, agentId: string, action: AgentAction, auditAction: string = action): Response | null {
|
|
185
|
-
return authorizeAgentForUser(requestUserId(req), agentId, action) ? null : authorityDenied(req, "agent visibility or role", 403, agentId, auditAction);
|
|
185
|
+
export async function authorizeAgentRoute(req: Request, agentId: string, action: AgentAction, auditAction: string = action): Promise<Response | null> {
|
|
186
|
+
return authorizeAgentForUser(requestUserId(req), agentId, action) ? null : (await authorityDenied(req, "agent visibility or role", 403, agentId, auditAction));
|
|
186
187
|
}
|
|
187
188
|
|
|
188
189
|
/** Machine callers retain their existing reach; user sessions share one read scope. */
|
|
@@ -468,7 +469,7 @@ function reactionNotificationSender(parent: Message, actorId: string): string {
|
|
|
468
469
|
return parent.channel && getAgent(parent.channel) ? parent.channel : "user";
|
|
469
470
|
}
|
|
470
471
|
|
|
471
|
-
export function sendReactionNotificationToAuthor(parent: Message, actorId: string, emoji: string, action: "add" | "remove"): void {
|
|
472
|
+
export async function sendReactionNotificationToAuthor(parent: Message, actorId: string, emoji: string, action: "add" | "remove"): Promise<void> {
|
|
472
473
|
if (isHumanAgentId(parent.from) || parent.from === "system") return;
|
|
473
474
|
const targetAgent = getAgent(parent.from);
|
|
474
475
|
if (!targetAgent || targetAgent.kind === "channel") return;
|
|
@@ -477,7 +478,7 @@ export function sendReactionNotificationToAuthor(parent: Message, actorId: strin
|
|
|
477
478
|
const now = Date.now();
|
|
478
479
|
const actor = reactionActorView(actorId);
|
|
479
480
|
const verb = action === "remove" ? "removed reaction" : "reacted";
|
|
480
|
-
const result =
|
|
481
|
+
const result = (await sendMessageWithResultAsync({
|
|
481
482
|
from,
|
|
482
483
|
to: parent.from,
|
|
483
484
|
kind: "system",
|
|
@@ -505,7 +506,7 @@ export function sendReactionNotificationToAuthor(parent: Message, actorId: strin
|
|
|
505
506
|
},
|
|
506
507
|
},
|
|
507
508
|
},
|
|
508
|
-
});
|
|
509
|
+
}));
|
|
509
510
|
if (result.created) {
|
|
510
511
|
if (result.message.deliveryStatus === "queued") emitMessageQueued(result.message);
|
|
511
512
|
else emitNewMessage(result.message);
|
|
@@ -13,12 +13,12 @@ import { agentWriteRequest, authAuditMetadata, authorizeAgentRoute, authorizeRou
|
|
|
13
13
|
export async function postAgentEffortAction(req: Request, agentId: string, body: Record<string, unknown>): Promise<Response> {
|
|
14
14
|
const agent = getAgent(agentId);
|
|
15
15
|
if (!agent) return error("agent not found", 404);
|
|
16
|
-
const driveDenied = authorizeAgentRoute(req, agent.id, "drive", "effort");
|
|
16
|
+
const driveDenied = (await authorizeAgentRoute(req, agent.id, "drive", "effort"));
|
|
17
17
|
if (driveDenied) return driveDenied;
|
|
18
|
-
const denied = authorizeRoute(req, {
|
|
18
|
+
const denied = (await authorizeRoute(req, {
|
|
19
19
|
scope: "agent:write",
|
|
20
20
|
resource: { agentId: agent.id, policyName: metaString(agent.meta, "policyName"), spawnRequestId: metaString(agent.meta, "spawnRequestId") },
|
|
21
|
-
});
|
|
21
|
+
}));
|
|
22
22
|
if (denied) return denied;
|
|
23
23
|
try {
|
|
24
24
|
const result = await dispatchAgentAction({
|
|
@@ -54,12 +54,12 @@ export const postAgentEffortObservedRoute: Handler = async (req, params) => {
|
|
|
54
54
|
try {
|
|
55
55
|
const version = body.version;
|
|
56
56
|
if (typeof version !== "number" || !Number.isSafeInteger(version) || version < 1) throw new ValidationError("version must be a positive integer");
|
|
57
|
-
const observed = reportEffortObserved(agent.id, {
|
|
57
|
+
const observed = (await reportEffortObserved(agent.id, {
|
|
58
58
|
instanceId: cleanString(body.instanceId, "instanceId", { required: true, max: 200 })!,
|
|
59
59
|
version,
|
|
60
60
|
effort: cleanString(body.effort, "effort", { required: true, max: 32 })!,
|
|
61
61
|
previousEffort: cleanString(body.previousEffort, "previousEffort", { max: 32 }) ?? null,
|
|
62
|
-
});
|
|
62
|
+
}));
|
|
63
63
|
return json(observed);
|
|
64
64
|
} catch (e) {
|
|
65
65
|
if (e instanceof ValidationError || e instanceof EffortReportRejected) return error(e.message, 400);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { HeartbeatResult, ProviderQuotaUpdateInput } from "@humwick/sdk";
|
|
2
|
+
import { acquireProviderQuotaLeaseAsync } from "../db";
|
|
3
|
+
import { getProviderQuotaConfig } from "../provider-quota-config-store";
|
|
4
|
+
import { upsertProviderQuotaAsync } from "../provider-quota-async";
|
|
5
|
+
import { emitRelayEvent } from "../events";
|
|
6
|
+
|
|
7
|
+
/** Same lease and writer as standalone quota reports, with config resolved on the hub (#3608). */
|
|
8
|
+
export async function publishHeartbeatQuota(input: ProviderQuotaUpdateInput, leaseToken?: string): Promise<NonNullable<HeartbeatResult["providerQuota"]>> {
|
|
9
|
+
const config = getProviderQuotaConfig(input.provider);
|
|
10
|
+
if (!config.enabled) return { reported: false, retryAfterMs: 60_000 };
|
|
11
|
+
const holder = `runner:${input.sourceAgentId}`;
|
|
12
|
+
const lease = await acquireProviderQuotaLeaseAsync({
|
|
13
|
+
provider: input.provider, accountKey: input.accountKey, orchestratorId: holder, leaseToken,
|
|
14
|
+
ttlMs: Math.min(10 * 60_000, config.pollIntervalMs + 60_000),
|
|
15
|
+
});
|
|
16
|
+
if (!lease.acquired || !lease.lease) return { reported: false, retryAfterMs: Math.min(lease.retryAfterMs ?? config.pollIntervalMs, config.pollIntervalMs) };
|
|
17
|
+
const result = await upsertProviderQuotaAsync(input, { requiredLeaseHolder: holder });
|
|
18
|
+
if (result.outcome.kind === "stored") {
|
|
19
|
+
const record = result.outcome.record;
|
|
20
|
+
emitRelayEvent({ type: "provider-quota.updated", source: "server", subject: `${record.provider}:${record.accountKey}`, data: {} });
|
|
21
|
+
}
|
|
22
|
+
return { reported: result.outcome.kind === "stored", retryAfterMs: config.pollIntervalMs, leaseToken: lease.lease.leaseToken };
|
|
23
|
+
}
|
package/src/routes/agent-keep.ts
CHANGED
|
@@ -9,7 +9,7 @@ export const putAgentKeep: Handler = async (req, params) => {
|
|
|
9
9
|
const parsed = await parseBody<unknown>(req);
|
|
10
10
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
11
11
|
if (!isRecord(parsed.body)) return error("keep required");
|
|
12
|
-
const denied = authorizeRoute(req, { scope: "agent:write" });
|
|
12
|
+
const denied = (await authorizeRoute(req, { scope: "agent:write" }));
|
|
13
13
|
if (denied) return denied;
|
|
14
14
|
try {
|
|
15
15
|
const result = await setAgentKeep({
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { PromptVersionConflictError } from "../prompt-version-errors";
|
|
2
2
|
import { versionedPromptsEnabled } from "../versioned-prompts";
|
|
3
3
|
import { promptActor } from "../services/prompt-version-writer";
|
|
4
|
-
import { setConfigAsync } from "../config-store-write";
|
|
4
|
+
import { deleteAgentProfileAsync, setAgentProfileAsync, setConfigAsync } from "../config-store-write";
|
|
5
5
|
import { memoryRetirementMessage } from "../memory-retirement";
|
|
6
6
|
// Auto-split from routes.ts (#299). Domain: agent-profiles.
|
|
7
7
|
import { ValidationError, withResolvedProvisioningAsync } from "../db";
|
|
8
8
|
import { cleanString, optionalEnum } from "../validation";
|
|
9
|
-
import {
|
|
9
|
+
import { getAgentProfile, listAgentProfiles, resolveAgentProfileKey, validateAgentProfile } from "../config-store";
|
|
10
10
|
import { RELAY_TOOL_GROUPS } from "../mcp";
|
|
11
11
|
import { emitConfigChanged } from "../sse";
|
|
12
12
|
import { error, isAdminRequest, json, normalizeConfigPathParam, parseBody, type Handler } from "./_shared";
|
|
@@ -140,8 +140,8 @@ export const putAgentProfileRoute: Handler = async (req, params) => {
|
|
|
140
140
|
return json(saved);
|
|
141
141
|
}
|
|
142
142
|
const profile = existing?.value.builtIn && isAdminRequest(req)
|
|
143
|
-
?
|
|
144
|
-
:
|
|
143
|
+
? await setAgentProfileAsync({ ...parsed.body, name } as AgentProfile, updatedBy, { overrideBuiltIn: true })
|
|
144
|
+
: await setAgentProfileAsync({ ...parsed.body, name } as AgentProfile, updatedBy);
|
|
145
145
|
emitConfigChanged(profile.namespace, profile.key, profile.version);
|
|
146
146
|
return json(profile, existing ? 200 : profile.version === 1 ? 201 : 200);
|
|
147
147
|
} catch (e) {
|
|
@@ -151,14 +151,14 @@ export const putAgentProfileRoute: Handler = async (req, params) => {
|
|
|
151
151
|
}
|
|
152
152
|
};
|
|
153
153
|
|
|
154
|
-
export const deleteAgentProfileRoute: Handler = (req, params) => {
|
|
154
|
+
export const deleteAgentProfileRoute: Handler = async (req, params) => {
|
|
155
155
|
try {
|
|
156
156
|
const name = normalizeConfigPathParam(params.name, "name");
|
|
157
157
|
const existing = getAgentProfile(name);
|
|
158
158
|
if (!existing) return error(memoryRetirementMessage(name) ?? "agent profile not found", 404);
|
|
159
159
|
const updatedBy = versionedPromptsEnabled() ? promptActor(req) : cleanString(new URL(req.url).searchParams.get("updatedBy") ?? undefined, "updatedBy", { max: 200 });
|
|
160
160
|
if (existing.value.builtIn && !isAdminRequest(req)) return error("built-in agent profiles are managed by Relay", 400);
|
|
161
|
-
|
|
161
|
+
await deleteAgentProfileAsync(name, updatedBy, { resetBuiltInOverride: existing.value.builtIn });
|
|
162
162
|
emitConfigChanged(existing.namespace, existing.key, existing.version + 1);
|
|
163
163
|
return json({ ok: true });
|
|
164
164
|
} catch (e) {
|
|
@@ -6,7 +6,7 @@ import { cleanString } from "../validation";
|
|
|
6
6
|
import { authorizeAgentRoute, authorizeRoute, error, json } from "./_shared";
|
|
7
7
|
|
|
8
8
|
export async function postAgentReportingAction(req: Request, agentId: string, body: Record<string, unknown>): Promise<Response> {
|
|
9
|
-
const denied = authorizeAgentRoute(req, agentId, "drive") ?? authorizeRoute(req, { scope: "agent:write", resource: { agentId } });
|
|
9
|
+
const denied = (await authorizeAgentRoute(req, agentId, "drive")) ?? (await authorizeRoute(req, { scope: "agent:write", resource: { agentId } }));
|
|
10
10
|
if (denied) return denied;
|
|
11
11
|
try {
|
|
12
12
|
return json({ ok: true, ...await setAgentReportVerbosity({ agentId, reportVerbosity: body.reportVerbosity, reason: cleanString(body.reason, "reason", { max: 500 }), requestedVia: "http" }, authContextFromRequest(req)) });
|
|
@@ -9,10 +9,10 @@ import { ShutdownAuthError, ShutdownTargetError } from "../services/shutdown-age
|
|
|
9
9
|
import { authAuditMetadata, authorizeAgentRoute, authorizeRoute, dashboardAttribution, error, json, metaString, parseBody, requestUserAddress, type Handler } from "./_shared";
|
|
10
10
|
import { isRecord } from "../types";
|
|
11
11
|
|
|
12
|
-
export const getAgentSelfEffort: Handler = (req, params) => {
|
|
12
|
+
export const getAgentSelfEffort: Handler = async (req, params) => {
|
|
13
13
|
const agent = getAgent(params.id!);
|
|
14
14
|
if (!agent) return error("agent not found", 404);
|
|
15
|
-
const denied = authorizeAgentRoute(req, agent.id, "view");
|
|
15
|
+
const denied = (await authorizeAgentRoute(req, agent.id, "view"));
|
|
16
16
|
if (denied) return denied;
|
|
17
17
|
return json({ agentId: agent.id, selfEffort: spawnSelfEffortPolicy(agent) ?? null });
|
|
18
18
|
};
|
|
@@ -24,12 +24,12 @@ export const putAgentSelfEffort: Handler = async (req, params) => {
|
|
|
24
24
|
const body = parsed.body;
|
|
25
25
|
const agent = getAgent(params.id!);
|
|
26
26
|
if (!agent) return error("agent not found", 404);
|
|
27
|
-
const driveDenied = authorizeAgentRoute(req, agent.id, "drive");
|
|
27
|
+
const driveDenied = (await authorizeAgentRoute(req, agent.id, "drive"));
|
|
28
28
|
if (driveDenied) return driveDenied;
|
|
29
|
-
const denied = authorizeRoute(req, {
|
|
29
|
+
const denied = (await authorizeRoute(req, {
|
|
30
30
|
scope: "agent:write",
|
|
31
31
|
resource: { agentId: agent.id, policyName: metaString(agent.meta, "policyName"), spawnRequestId: metaString(agent.meta, "spawnRequestId") },
|
|
32
|
-
});
|
|
32
|
+
}));
|
|
33
33
|
if (denied) return denied;
|
|
34
34
|
try {
|
|
35
35
|
const result = await grantSelfEffort({
|
|
@@ -4,7 +4,7 @@ import { isHumanAgentId, PROVIDER_SUBMIT_UNCONFIRMED, RELAY_TOKEN_HEADER, SUBMIT
|
|
|
4
4
|
import { authorizeAgentControl } from "../agent-authz";
|
|
5
5
|
import { VALID_AGENT_ACTIONS, agentControlActionIcon, auditEvent, authAuditMetadata, authorizeAgentRoute, authorizeRoute, canViewAgentRoute, cleanAttachmentRefs, dashboardAttribution, emitCommand, error, json, metaString, parseBody, requestUserAddress, requestUserId, spawnRequestId, type AgentControlAction, type Handler } from "./_shared";
|
|
6
6
|
import { arbitrateDrive, currentDriver, drivingMessage, releaseDrive, type DriveArbitration } from "../agent-drive-arbiter";
|
|
7
|
-
import { ValidationError, getAgent, getAgentTimelineAsync, getOrchestrator, markReadyAsync, mergeAgentMetaAsync
|
|
7
|
+
import { sendMessageAsync, ValidationError, getAgent, getAgentTimelineAsync, getOrchestrator, markReadyAsync, mergeAgentMetaAsync } from "../db";
|
|
8
8
|
import { announcePresence, viewersForAgent } from "../dashboard-presence";
|
|
9
9
|
import { cleanString, optionalEnum } from "../validation";
|
|
10
10
|
import { createCommandAsync } from "../commands-write";
|
|
@@ -40,10 +40,10 @@ export const postAgentSelfRestartRecheck: Handler = async (req, params) => {
|
|
|
40
40
|
// orchestrator's own runtime token authorizes this exactly as it authorizes the agent.restart it
|
|
41
41
|
// is executing — no over-refusal that would silently abort every self-restart.
|
|
42
42
|
const orchestrator = agent ? managedControlOrchestrator(agent) : null;
|
|
43
|
-
const denied = authorizeRoute(req, {
|
|
43
|
+
const denied = (await authorizeRoute(req, {
|
|
44
44
|
scope: "command:write",
|
|
45
45
|
resource: { agentId: params.id!, orchestratorId: orchestrator?.id, policyName: metaString(agent?.meta, "policyName"), spawnRequestId: metaString(agent?.meta, "spawnRequestId") },
|
|
46
|
-
});
|
|
46
|
+
}));
|
|
47
47
|
if (denied) return denied;
|
|
48
48
|
if (!agent) return json({ ok: false, reason: `self-restart safe-point re-check: agent ${params.id} not found` });
|
|
49
49
|
const violation = await evaluateSelfRestartSafePoint(agent);
|
|
@@ -161,11 +161,11 @@ export const postAgentAction: Handler = async (req, params) => {
|
|
|
161
161
|
if (!agent) return error("agent not found", 404);
|
|
162
162
|
// #392: the acting user must be allowed to drive this agent (fail-open single-user). Gated
|
|
163
163
|
// before the capability probe so an unauthorized user learns nothing about what the agent supports.
|
|
164
|
-
const driveDenied = authorizeAgentRoute(req, agent.id, "drive", action);
|
|
164
|
+
const driveDenied = (await authorizeAgentRoute(req, agent.id, "drive", action));
|
|
165
165
|
if (driveDenied) return driveDenied;
|
|
166
166
|
// #3567 — the one lifecycle-control check (the services re-run it for bus/MCP); self excepted.
|
|
167
167
|
const actionCtx = authContextFromRequest(req);
|
|
168
|
-
const controlDenied = actionCtx.callerAgentId === agent.id ? null : authorizeAgentControl(actionCtx, agent, action);
|
|
168
|
+
const controlDenied = actionCtx.callerAgentId === agent.id ? null : (await authorizeAgentControl(actionCtx, agent, action));
|
|
169
169
|
if (controlDenied) return error(controlDenied.message, 403);
|
|
170
170
|
// #2664 — releasing a hold that is already gone (recovered, or a double click) is an idempotent no-op.
|
|
171
171
|
if (action === "releaseSubmitHold" && agentIsControlEligible(agent) && !agentSubmitHoldActive(agent)) return json({ ok: true, action, released: false }, 200);
|
|
@@ -181,10 +181,10 @@ export const postAgentAction: Handler = async (req, params) => {
|
|
|
181
181
|
if (action === "interrupt") {
|
|
182
182
|
const arb = await arbitrateDrive(requestUserId(req), agent.id);
|
|
183
183
|
if (!arb.allowed) return driveBlockedResponse(arb);
|
|
184
|
-
const denied = authorizeRoute(req, {
|
|
184
|
+
const denied = (await authorizeRoute(req, {
|
|
185
185
|
scope: "agent:write",
|
|
186
186
|
resource: controlResource,
|
|
187
|
-
});
|
|
187
|
+
}));
|
|
188
188
|
if (denied) return denied;
|
|
189
189
|
try {
|
|
190
190
|
const result = await dispatchInterrupt({
|
|
@@ -208,10 +208,10 @@ export const postAgentAction: Handler = async (req, params) => {
|
|
|
208
208
|
// bus + MCP surfaces. The route still enforces the coarse `agent:write` scope +
|
|
209
209
|
// constraint-list; the service adds the fine parent→child gate.
|
|
210
210
|
if (action === "shutdown") {
|
|
211
|
-
const denied = authorizeRoute(req, {
|
|
211
|
+
const denied = (await authorizeRoute(req, {
|
|
212
212
|
scope: "agent:write",
|
|
213
213
|
resource: controlResource,
|
|
214
|
-
});
|
|
214
|
+
}));
|
|
215
215
|
if (denied) return denied;
|
|
216
216
|
try {
|
|
217
217
|
if (parsed.body.hard !== undefined && typeof parsed.body.hard !== "boolean") throw new ValidationError("hard must be a boolean");
|
|
@@ -243,10 +243,10 @@ export const postAgentAction: Handler = async (req, params) => {
|
|
|
243
243
|
const resumeId = action === "resume" ? await latestResumeIdForAgent(agent) : undefined;
|
|
244
244
|
if (action === "resume" && !orchestrator) return error("no online orchestrator available to resume agent", 409);
|
|
245
245
|
if (action === "resume" && !resumeId) return error("no resume id recorded for agent", 422);
|
|
246
|
-
const denied = authorizeRoute(req, {
|
|
246
|
+
const denied = (await authorizeRoute(req, {
|
|
247
247
|
scope: "agent:write",
|
|
248
248
|
resource: { ...controlResource, orchestratorId: orchestrator?.id },
|
|
249
|
-
});
|
|
249
|
+
}));
|
|
250
250
|
if (denied) return denied;
|
|
251
251
|
// #1953 RC3 — a dashboard restart/resume of a disabled steward is refused (see helper).
|
|
252
252
|
// #1955 (#1953-review nit 2) — AFTER authorizeRoute: run pre-auth, the 409 disclosed to an
|
|
@@ -320,7 +320,7 @@ export const postAgentPrompt: Handler = async (req, params) => {
|
|
|
320
320
|
const agent = getAgent(params.id!);
|
|
321
321
|
if (!agent) return error("agent not found", 404);
|
|
322
322
|
// #392: only a user authorized to drive this agent may prompt it (fail-open single-user).
|
|
323
|
-
const driveDenied = authorizeAgentRoute(req, agent.id, "drive");
|
|
323
|
+
const driveDenied = (await authorizeAgentRoute(req, agent.id, "drive"));
|
|
324
324
|
if (driveDenied) return driveDenied;
|
|
325
325
|
// #394: submitting a prompt takes/refreshes the drive lease. A second human driving the same
|
|
326
326
|
// agent is blocked here (single-user is a no-op), so two operators can't double-submit into one
|
|
@@ -328,10 +328,10 @@ export const postAgentPrompt: Handler = async (req, params) => {
|
|
|
328
328
|
const arb = await arbitrateDrive(requestUserId(req), agent.id);
|
|
329
329
|
if (!arb.allowed) return driveBlockedResponse(arb);
|
|
330
330
|
if (agent.status === "offline") return error("agent is offline", 422);
|
|
331
|
-
const denied = authorizeRoute(req, {
|
|
331
|
+
const denied = (await authorizeRoute(req, {
|
|
332
332
|
scope: "message:send",
|
|
333
333
|
resource: { target: agent.id, agentId: requestUserAddress(req) },
|
|
334
|
-
});
|
|
334
|
+
}));
|
|
335
335
|
if (denied) return denied;
|
|
336
336
|
// #2664 — the runner holds exactly one unconfirmed prompt for the operator's resend; a new one
|
|
337
337
|
// must not queue behind (or replace) it. Refused before any message row exists.
|
|
@@ -341,13 +341,13 @@ export const postAgentPrompt: Handler = async (req, params) => {
|
|
|
341
341
|
// canonical `user` sink, so today's single operator routes/renders exactly as before; once
|
|
342
342
|
// auth (#389) sets the real session user, the bubble carries the real `user:<id>`.
|
|
343
343
|
const fromUser = requestUserAddress(req);
|
|
344
|
-
const message =
|
|
344
|
+
const message = (await sendMessageAsync({
|
|
345
345
|
from: fromUser,
|
|
346
346
|
to: agent.id,
|
|
347
347
|
kind: "session",
|
|
348
348
|
body,
|
|
349
349
|
...(attachments ? { payload: { attachments } } : {}),
|
|
350
|
-
});
|
|
350
|
+
}));
|
|
351
351
|
const command = await createCommandAsync({
|
|
352
352
|
type: "prompt.inject",
|
|
353
353
|
source: "dashboard",
|
|
@@ -397,7 +397,7 @@ export const postAgentPermissionDecision: Handler = async (req, params) => {
|
|
|
397
397
|
const agent = getAgent(params.id!);
|
|
398
398
|
if (!agent) return error("agent not found", 404);
|
|
399
399
|
// #392: approving/denying a permission is driving the agent (fail-open single-user).
|
|
400
|
-
const driveDenied = authorizeAgentRoute(req, agent.id, "drive");
|
|
400
|
+
const driveDenied = (await authorizeAgentRoute(req, agent.id, "drive"));
|
|
401
401
|
if (driveDenied) return driveDenied;
|
|
402
402
|
// #394: a plan-approve / AskUserQuestion answer drives the turn — only the lease holder (or an
|
|
403
403
|
// admin override) may answer, so two humans can't race competing decisions into one prompt.
|
|
@@ -405,10 +405,10 @@ export const postAgentPermissionDecision: Handler = async (req, params) => {
|
|
|
405
405
|
if (!arb.allowed) return driveBlockedResponse(arb);
|
|
406
406
|
const metaPolicyName = typeof agent.meta?.policyName === "string" ? agent.meta.policyName : undefined;
|
|
407
407
|
const metaSpawnRequestId = typeof agent.meta?.spawnRequestId === "string" ? agent.meta.spawnRequestId : undefined;
|
|
408
|
-
const denied = authorizeRoute(req, {
|
|
408
|
+
const denied = (await authorizeRoute(req, {
|
|
409
409
|
scope: "agent:write",
|
|
410
410
|
resource: { agentId: agent.id, policyName: metaPolicyName, spawnRequestId: metaSpawnRequestId },
|
|
411
|
-
});
|
|
411
|
+
}));
|
|
412
412
|
if (denied) return denied;
|
|
413
413
|
const result = await dispatchAgentPermissionDecision({
|
|
414
414
|
agentId: agent.id,
|
|
@@ -487,7 +487,7 @@ export const postAgentDrive: Handler = async (req, params) => {
|
|
|
487
487
|
const agent = getAgent(params.id!);
|
|
488
488
|
if (!agent) return error("agent not found", 404);
|
|
489
489
|
// Driving the wheel requires the same #392 drive authorization the prompt/interrupt routes use.
|
|
490
|
-
const driveDenied = authorizeAgentRoute(req, agent.id, "drive");
|
|
490
|
+
const driveDenied = (await authorizeAgentRoute(req, agent.id, "drive"));
|
|
491
491
|
if (driveDenied) return driveDenied;
|
|
492
492
|
const userId = requestUserId(req);
|
|
493
493
|
|
|
@@ -545,10 +545,10 @@ export const postAgentTerminalSession: Handler = async (req, params) => {
|
|
|
545
545
|
const metaTmuxSession = typeof agent.meta?.tmuxSession === "string" ? agent.meta.tmuxSession : undefined;
|
|
546
546
|
const metaPolicyName = typeof agent.meta?.policyName === "string" ? agent.meta.policyName : undefined;
|
|
547
547
|
const metaSpawnRequestId = typeof agent.meta?.spawnRequestId === "string" ? agent.meta.spawnRequestId : undefined;
|
|
548
|
-
const denied = authorizeRoute(req, {
|
|
548
|
+
const denied = (await authorizeRoute(req, {
|
|
549
549
|
scope: "terminal:attach",
|
|
550
550
|
resource: { agentId: agent.id, orchestratorId: orchestrator.id, policyName: metaPolicyName, spawnRequestId: metaSpawnRequestId, terminalAttach: true },
|
|
551
|
-
});
|
|
551
|
+
}));
|
|
552
552
|
if (denied) return denied;
|
|
553
553
|
// Provider-owned attach surfaces are more specific than the runner's tmux pane.
|
|
554
554
|
// Codex runs its real interactive TUI as a guest attached to the app-server thread;
|
|
@@ -588,7 +588,7 @@ export const deleteAgentTerminalSession: Handler = async (req, params) => {
|
|
|
588
588
|
if (!agent) return error("agent not found", 404);
|
|
589
589
|
const orchestrator = managedControlOrchestrator(agent);
|
|
590
590
|
if (!orchestrator) return error("agent does not have an online orchestrator", 422);
|
|
591
|
-
const denied = authorizeRoute(req, {
|
|
591
|
+
const denied = (await authorizeRoute(req, {
|
|
592
592
|
scope: "terminal:attach",
|
|
593
593
|
resource: {
|
|
594
594
|
agentId: agent.id,
|
|
@@ -597,7 +597,7 @@ export const deleteAgentTerminalSession: Handler = async (req, params) => {
|
|
|
597
597
|
spawnRequestId: typeof agent.meta?.spawnRequestId === "string" ? agent.meta.spawnRequestId : undefined,
|
|
598
598
|
terminalAttach: true,
|
|
599
599
|
},
|
|
600
|
-
});
|
|
600
|
+
}));
|
|
601
601
|
if (denied) return denied;
|
|
602
602
|
const session = params.session!;
|
|
603
603
|
return proxyOrchestratorDelete(req, orchestrator.id, `/api/terminal-guests/${encodeURIComponent(session)}`);
|
|
@@ -85,7 +85,7 @@ export const postAgent: Handler = async (req) => {
|
|
|
85
85
|
// timeline note, parent-wake, audit) live in src/services/register-agent.ts so the HTTP,
|
|
86
86
|
// bus, and orchestrator-report paths cannot drift (epic #342).
|
|
87
87
|
const input = normalizeAgentInput(parsed.body);
|
|
88
|
-
const agent = registerAgent(input, authContextFromRequest(req));
|
|
88
|
+
const agent = await registerAgent(input, authContextFromRequest(req));
|
|
89
89
|
return json(agent, 201);
|
|
90
90
|
} catch (e) {
|
|
91
91
|
if (e instanceof ValidationError) return error(e.message, 400);
|
|
@@ -208,7 +208,7 @@ export const postAgentSpawn: Handler = async (req) => {
|
|
|
208
208
|
// strip the heavy inlined provisioning file contents from the echoed-back summary.
|
|
209
209
|
return json({
|
|
210
210
|
ok: true, spawnRequestId: result.spawnRequestId, harnessSubagents: result.harnessSubagents, orchestratorId: result.orchestratorId, placementReason: result.placementReason, provider: result.provider, command: summarizeSpawnCommandForCaller(result.command),
|
|
211
|
-
...(result.task ? { task: result.task } : {}), ...(result.warnings ? { warnings: result.warnings } : {}), ...(result.dispatchDecision ? { dispatchDecision: result.dispatchDecision } : {}), ...(workflow.reason ? { workflow: { started: false, reason: workflow.reason } } : {}),
|
|
211
|
+
...(result.task ? { task: result.task } : {}), ...(result.warnings ? { warnings: result.warnings } : {}), ...(result.spawnPolicy ? { spawnPolicy: result.spawnPolicy } : {}), ...(result.dispatchDecision ? { dispatchDecision: result.dispatchDecision } : {}), ...(workflow.reason ? { workflow: { started: false, reason: workflow.reason } } : {}),
|
|
212
212
|
}, 202);
|
|
213
213
|
} catch (e) {
|
|
214
214
|
if (e instanceof McpAuthError) return error(e.message, 403);
|