@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/routes/projects.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getProjectEntryAsync, getProjectEntryChainAsync, listProjectsAsync, resolveProjectAsync, resolveProjectEntriesAsync, retractProjectEntryAsync, rootsForProjectAsync, searchProjectEntriesAsync, writeProjectEntryAsync, ValidationError } from "../db";
|
|
2
2
|
import { resolveProjectForCanonicalCwdAsync } from "../services/project";
|
|
3
3
|
import { authContextFromRequest } from "../services/auth-context";
|
|
4
4
|
import { callerProfile, resolveAgentWriteInject } from "../services/memory-identity";
|
|
@@ -14,7 +14,7 @@ import { PROJECT_ENTRY_INJECT_TIERS, PROJECT_ENTRY_KINDS, type ProjectEntry, typ
|
|
|
14
14
|
//
|
|
15
15
|
// #1940 Part 2 — manual/promoted entry CRUD from the dashboard. Mutations are thin wrappers
|
|
16
16
|
// around the SAME db functions the audited `relay_project_write_entry`/`relay_project_retract`
|
|
17
|
-
// MCP tools call (
|
|
17
|
+
// MCP tools call (writeProjectEntryAsync/retractProjectEntryAsync, src/db/project-entries.ts) — one
|
|
18
18
|
// write path for both surfaces, never a direct/duplicated DB write here. `ingested` entries
|
|
19
19
|
// are refused because the CLAUDE.md ingest pipeline owns them. `steward` entries remain
|
|
20
20
|
// operator-curatable: an edit adopts the replacement as `manual` input for a later sweep.
|
|
@@ -103,12 +103,12 @@ export const getProjectResolveRoute: Handler = async (req) => {
|
|
|
103
103
|
}
|
|
104
104
|
};
|
|
105
105
|
|
|
106
|
-
export const getProjectEntryRoute: Handler = (req, params) => {
|
|
106
|
+
export const getProjectEntryRoute: Handler = async (req, params) => {
|
|
107
107
|
try {
|
|
108
108
|
const id = cleanString(params.entryId, "entryId", { required: true, max: 120 })!;
|
|
109
|
-
const entry =
|
|
109
|
+
const entry = await getProjectEntryAsync(id);
|
|
110
110
|
if (!entry) return error("project entry not found", 404);
|
|
111
|
-
return json({ entry, chain:
|
|
111
|
+
return json({ entry, chain: await getProjectEntryChainAsync(id) });
|
|
112
112
|
} catch (err) {
|
|
113
113
|
return error(err instanceof Error ? err.message : "projects route failed");
|
|
114
114
|
}
|
|
@@ -130,8 +130,8 @@ function cleanAudience(value: unknown): ProjectEntryAudience | undefined {
|
|
|
130
130
|
|
|
131
131
|
// Historical steward entries retain the same curation rights as manual entries (#3456).
|
|
132
132
|
// Only the current active version is editable, preserving supersession and retraction.
|
|
133
|
-
function loadEditableEntry(projectId: string, entryId: string): { entry: ProjectEntry } | { errorResponse: Response } {
|
|
134
|
-
const entry =
|
|
133
|
+
async function loadEditableEntry(projectId: string, entryId: string): Promise<{ entry: ProjectEntry } | { errorResponse: Response }> {
|
|
134
|
+
const entry = await getProjectEntryAsync(entryId);
|
|
135
135
|
if (!entry || entry.projectId !== projectId) return { errorResponse: error("project entry not found", 404) };
|
|
136
136
|
if (!isEditableSource(entry.source)) {
|
|
137
137
|
return { errorResponse: error(`${entry.source} entries are owned by the ingest pipeline and cannot be edited or removed here`, 409) };
|
|
@@ -170,7 +170,7 @@ export const postProjectEntryRoute: Handler = async (req, params) => {
|
|
|
170
170
|
// Use the same caller placement as MCP writes; dashboard callers fall back to project roots.
|
|
171
171
|
// Areas stay optional because the dashboard has no areas input yet.
|
|
172
172
|
const areas = await resolveWriteAreas(project, areaCallerFromCtx(authContextFromRequest(req)), parsed.body.areas, { requireDeclared: false });
|
|
173
|
-
const entry =
|
|
173
|
+
const entry = await writeProjectEntryAsync({
|
|
174
174
|
projectId: project.id,
|
|
175
175
|
authorId: requestUserAddress(req),
|
|
176
176
|
kind,
|
|
@@ -188,7 +188,7 @@ export const postProjectEntryRoute: Handler = async (req, params) => {
|
|
|
188
188
|
agentId: entry.authorId,
|
|
189
189
|
metadata: projectEntryAuditMetadata(req, "relay_project_write_entry", project.id, entry.id),
|
|
190
190
|
});
|
|
191
|
-
return json({ entry, ...(tier.note ? { injectNote: tier.note } : {}), ...areaDeliveryReport(entry) }, 201);
|
|
191
|
+
return json({ entry, ...(tier.note ? { injectNote: tier.note } : {}), ...await areaDeliveryReport(entry) }, 201);
|
|
192
192
|
} catch (err) {
|
|
193
193
|
if (err instanceof ValidationError) return error(err.message, 400);
|
|
194
194
|
return error(err instanceof Error ? err.message : "projects route failed");
|
|
@@ -196,7 +196,7 @@ export const postProjectEntryRoute: Handler = async (req, params) => {
|
|
|
196
196
|
};
|
|
197
197
|
|
|
198
198
|
// PATCH /api/projects/:id/entries/:entryId — Edit (#1940 Part 2). There is no in-place UPDATE
|
|
199
|
-
// in the ledger (
|
|
199
|
+
// in the ledger (writeProjectEntryAsync only inserts); an edit is a new entry that `supersedes` the
|
|
200
200
|
// old one — the exact mechanism relay_project_write_entry's `supersedes` param already gives
|
|
201
201
|
// agents. Omitted fields fall back to the current entry's value (a partial patch, not a
|
|
202
202
|
// full-replace); an explicit `null` for `body` clears it.
|
|
@@ -206,7 +206,7 @@ export const patchProjectEntryRoute: Handler = async (req, params) => {
|
|
|
206
206
|
const project = await resolveProjectAsync(ref);
|
|
207
207
|
if (!project) return error("project not found", 404);
|
|
208
208
|
const entryId = cleanString(params.entryId, "entryId", { required: true, max: 120 })!;
|
|
209
|
-
const loaded = loadEditableEntry(project.id, entryId);
|
|
209
|
+
const loaded = await loadEditableEntry(project.id, entryId);
|
|
210
210
|
if ("errorResponse" in loaded) return loaded.errorResponse;
|
|
211
211
|
const { entry } = loaded;
|
|
212
212
|
|
|
@@ -234,7 +234,7 @@ export const patchProjectEntryRoute: Handler = async (req, params) => {
|
|
|
234
234
|
);
|
|
235
235
|
const areas = await resolveWriteAreas(project, areaCallerFromCtx(authContextFromRequest(req)), body.areas, { prior: entry.areas, requireDeclared: false });
|
|
236
236
|
|
|
237
|
-
const updated =
|
|
237
|
+
const updated = await writeProjectEntryAsync({
|
|
238
238
|
projectId: project.id,
|
|
239
239
|
authorId: requestUserAddress(req),
|
|
240
240
|
kind,
|
|
@@ -250,7 +250,7 @@ export const patchProjectEntryRoute: Handler = async (req, params) => {
|
|
|
250
250
|
source: entry.source === "steward" ? "manual" : entry.source,
|
|
251
251
|
originRef: entry.originRef,
|
|
252
252
|
sensitivity: entry.sensitivity,
|
|
253
|
-
// Carry a POSITIVE prior TTL only:
|
|
253
|
+
// Carry a POSITIVE prior TTL only: writeProjectEntryAsync rejects invalid epochs, so a corrupt
|
|
254
254
|
// legacy value cannot turn a partial dashboard edit into a failed adoption.
|
|
255
255
|
...(entry.expiresAt !== undefined && entry.expiresAt > 0 ? { expiresAt: entry.expiresAt } : {}),
|
|
256
256
|
});
|
|
@@ -261,7 +261,7 @@ export const patchProjectEntryRoute: Handler = async (req, params) => {
|
|
|
261
261
|
agentId: updated.authorId,
|
|
262
262
|
metadata: projectEntryAuditMetadata(req, "relay_project_write_entry", project.id, updated.id, { supersedes: entry.id }),
|
|
263
263
|
});
|
|
264
|
-
return json({ entry: updated, ...(tier.note ? { injectNote: tier.note } : {}), ...areaDeliveryReport(updated) });
|
|
264
|
+
return json({ entry: updated, ...(tier.note ? { injectNote: tier.note } : {}), ...await areaDeliveryReport(updated) });
|
|
265
265
|
} catch (err) {
|
|
266
266
|
if (err instanceof ValidationError) return error(err.message, 400);
|
|
267
267
|
return error(err instanceof Error ? err.message : "projects route failed");
|
|
@@ -276,10 +276,10 @@ export const deleteProjectEntryRoute: Handler = async (req, params) => {
|
|
|
276
276
|
const project = await resolveProjectAsync(ref);
|
|
277
277
|
if (!project) return error("project not found", 404);
|
|
278
278
|
const entryId = cleanString(params.entryId, "entryId", { required: true, max: 120 })!;
|
|
279
|
-
const loaded = loadEditableEntry(project.id, entryId);
|
|
279
|
+
const loaded = await loadEditableEntry(project.id, entryId);
|
|
280
280
|
if ("errorResponse" in loaded) return loaded.errorResponse;
|
|
281
281
|
|
|
282
|
-
const retracted =
|
|
282
|
+
const retracted = await retractProjectEntryAsync(entryId);
|
|
283
283
|
if (!retracted) return error("project entry not found", 404);
|
|
284
284
|
await auditEvent({
|
|
285
285
|
kind: "state",
|
|
@@ -21,21 +21,21 @@ function routeError(err: unknown): Response {
|
|
|
21
21
|
return error(err instanceof Error ? err.message : "prompt template route failed");
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
function authorizePromptRead(req: Request): Response | null {
|
|
24
|
+
async function authorizePromptRead(req: Request): Promise<Response | null> {
|
|
25
25
|
const auth = getComponentAuth(req);
|
|
26
26
|
if (auth && (hasComponentScope(auth, "system:admin") || hasComponentScope(auth, "agent:read"))) return null;
|
|
27
|
-
return authorizeRoute(req, { scope: "system:admin" });
|
|
27
|
+
return (await authorizeRoute(req, { scope: "system:admin" }));
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
export const getPromptTemplatesRoute: Handler = async (req) => {
|
|
31
|
-
const denied = authorizePromptRead(req);
|
|
31
|
+
const denied = (await authorizePromptRead(req));
|
|
32
32
|
if (denied) return denied;
|
|
33
33
|
const category = cleanString(new URL(req.url).searchParams.get("category"), "category", { max: 120 }) ?? undefined;
|
|
34
34
|
return json({ templates: (await readPromptTemplates(category)).filter(entry => !memoryRetirementMessage(entry.slug)) });
|
|
35
35
|
};
|
|
36
36
|
|
|
37
37
|
export const getPromptTemplateRoute: Handler = async (req, params) => {
|
|
38
|
-
const denied = authorizePromptRead(req);
|
|
38
|
+
const denied = (await authorizePromptRead(req));
|
|
39
39
|
if (denied) return denied;
|
|
40
40
|
const slug = slugParam(params);
|
|
41
41
|
const retirement = memoryRetirementMessage(slug);
|
|
@@ -45,7 +45,7 @@ export const getPromptTemplateRoute: Handler = async (req, params) => {
|
|
|
45
45
|
};
|
|
46
46
|
|
|
47
47
|
export const putPromptTemplateRoute: Handler = async (req, params) => {
|
|
48
|
-
const denied = authorizeRoute(req, { scope: versionedPromptsEnabled() ? "agent:write" : "system:admin" });
|
|
48
|
+
const denied = (await authorizeRoute(req, { scope: versionedPromptsEnabled() ? "agent:write" : "system:admin" }));
|
|
49
49
|
if (denied) return denied;
|
|
50
50
|
const parsed = await parseBody<Record<string, unknown>>(req);
|
|
51
51
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -55,31 +55,31 @@ export const putPromptTemplateRoute: Handler = async (req, params) => {
|
|
|
55
55
|
await mutatePrompt(authContextFromRequest(req), slug, parsed.body);
|
|
56
56
|
return json(await readPromptTemplate(slug));
|
|
57
57
|
}
|
|
58
|
-
const legacyDenied = authorizeRoute(req, { scope: "system:admin" });
|
|
58
|
+
const legacyDenied = (await authorizeRoute(req, { scope: "system:admin" }));
|
|
59
59
|
if (legacyDenied) return legacyDenied;
|
|
60
60
|
const template = cleanString(parsed.body?.template, "template", { required: true, max: 200_000 })!;
|
|
61
|
-
return json(updatePromptTemplate(slug, template));
|
|
61
|
+
return json((await updatePromptTemplate(slug, template)));
|
|
62
62
|
} catch (err) {
|
|
63
63
|
return routeError(err);
|
|
64
64
|
}
|
|
65
65
|
};
|
|
66
66
|
|
|
67
67
|
export const postPromptTemplateResetRoute: Handler = async (req, params) => {
|
|
68
|
-
const denied = authorizeRoute(req, { scope: versionedPromptsEnabled() ? "agent:write" : "system:admin" });
|
|
68
|
+
const denied = (await authorizeRoute(req, { scope: versionedPromptsEnabled() ? "agent:write" : "system:admin" }));
|
|
69
69
|
if (denied) return denied;
|
|
70
70
|
try {
|
|
71
71
|
const slug = slugParam(params);
|
|
72
72
|
if (versionedPromptsEnabled() && (await readPromptTemplate(slug))?.version !== undefined) return mutateRevision(req, slug, "adopt");
|
|
73
|
-
const legacyDenied = authorizeRoute(req, { scope: "system:admin" });
|
|
73
|
+
const legacyDenied = (await authorizeRoute(req, { scope: "system:admin" }));
|
|
74
74
|
if (legacyDenied) return legacyDenied;
|
|
75
|
-
return json(resetPromptTemplate(slug));
|
|
75
|
+
return json((await resetPromptTemplate(slug)));
|
|
76
76
|
} catch (err) {
|
|
77
77
|
return routeError(err);
|
|
78
78
|
}
|
|
79
79
|
};
|
|
80
80
|
|
|
81
81
|
export const getPromptHistoryRoute: Handler = async (req, params) => {
|
|
82
|
-
const denied = authorizePromptRead(req);
|
|
82
|
+
const denied = (await authorizePromptRead(req));
|
|
83
83
|
if (denied) return denied;
|
|
84
84
|
const slug = slugParam(params);
|
|
85
85
|
if (!versionedPromptsEnabled() || (await readPromptTemplate(slug))?.version === undefined) return error("versioned prompt not found", 404);
|
|
@@ -100,7 +100,7 @@ async function mutateRevision(req: Request, slug: string, action: "adopt" | "res
|
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
export const postPromptRevisionRoute: Handler = async (req, params) => {
|
|
103
|
-
const denied = authorizeRoute(req, { scope: "agent:write" });
|
|
103
|
+
const denied = (await authorizeRoute(req, { scope: "agent:write" }));
|
|
104
104
|
if (denied) return denied;
|
|
105
105
|
return mutateRevision(req, slugParam(params), new URL(req.url).pathname.endsWith("/restore") ? "restore" : "adopt");
|
|
106
106
|
};
|
|
@@ -6,7 +6,7 @@ import { cleanString, cleanStringArray, optionalEnum } from "../validation";
|
|
|
6
6
|
import { getCommand } from "../commands-db";
|
|
7
7
|
import { deleteCommandAsync } from "../commands-write";
|
|
8
8
|
import { emitCommand, error, json, parseBody, type Handler } from "./_shared";
|
|
9
|
-
import { getProviderConfigEntry, listProviderConfigEntries,
|
|
9
|
+
import { getProviderConfigEntry, listProviderConfigEntries, migrateLocalProviderConfigsAsync, providerConfigPublic, setProviderConfigAsync, VALID_PROVIDER_CONFIGS } from "../provider-config-store";
|
|
10
10
|
import { cleanProviderModelLimits } from "../provider-catalog-store";
|
|
11
11
|
import { emitConfigChanged } from "../sse";
|
|
12
12
|
import { setConfigAsync } from "../config-store-write";
|
|
@@ -28,9 +28,9 @@ export const getProvidersRoute: Handler = async () => {
|
|
|
28
28
|
});
|
|
29
29
|
};
|
|
30
30
|
|
|
31
|
-
export const getProviderConfigsRoute: Handler = (req) => {
|
|
31
|
+
export const getProviderConfigsRoute: Handler = async (req) => {
|
|
32
32
|
const host = new URL(req.url).searchParams.get("host") ?? undefined;
|
|
33
|
-
|
|
33
|
+
await migrateLocalProviderConfigsAsync();
|
|
34
34
|
const entries = listProviderConfigEntries(host);
|
|
35
35
|
return json(Object.fromEntries(VALID_PROVIDER_CONFIGS.map((provider) => {
|
|
36
36
|
return [provider, providerConfigPublic(entries[provider] ?? getProviderConfigEntry(provider, host))];
|
|
@@ -127,12 +127,12 @@ export const deleteProviderModelRoute: Handler = async (_req, params) => {
|
|
|
127
127
|
}
|
|
128
128
|
};
|
|
129
129
|
|
|
130
|
-
export const getProviderConfigRoute: Handler = (_req, params) => {
|
|
130
|
+
export const getProviderConfigRoute: Handler = async (_req, params) => {
|
|
131
131
|
const provider = optionalEnum(params.provider, "provider", VALID_PROVIDER_CONFIGS);
|
|
132
132
|
if (!provider) return error("provider required");
|
|
133
133
|
const host = new URL(_req.url).searchParams.get("host") ?? undefined;
|
|
134
134
|
const includeSecrets = new URL(_req.url).searchParams.get("includeSecrets") === "1";
|
|
135
|
-
|
|
135
|
+
await migrateLocalProviderConfigsAsync();
|
|
136
136
|
return json(providerConfigPublic(getProviderConfigEntry(provider, host), { maskEnv: !includeSecrets }));
|
|
137
137
|
};
|
|
138
138
|
|
|
@@ -145,7 +145,7 @@ export const putProviderConfigRoute: Handler = async (req, params) => {
|
|
|
145
145
|
if (!isRecord(parsed.body)) return error("provider config body must be an object");
|
|
146
146
|
const host = new URL(req.url).searchParams.get("host") ?? undefined;
|
|
147
147
|
const updatedBy = cleanString(parsed.body.updatedBy, "updatedBy", { max: 200 });
|
|
148
|
-
const entry =
|
|
148
|
+
const entry = await setProviderConfigAsync(provider, parsed.body, { host, updatedBy });
|
|
149
149
|
emitConfigChanged(entry.namespace, entry.key, entry.version);
|
|
150
150
|
return json(providerConfigPublic(entry), entry.version === 1 ? 201 : 200);
|
|
151
151
|
} catch (e) {
|
|
@@ -8,7 +8,7 @@ import { error, json, parseBody, type Handler } from "./_shared";
|
|
|
8
8
|
import {
|
|
9
9
|
getProviderQuotaConfig,
|
|
10
10
|
listProviderQuotaConfigs,
|
|
11
|
-
|
|
11
|
+
setProviderQuotaConfigAsync,
|
|
12
12
|
VALID_QUOTA_CONFIG_PROVIDERS,
|
|
13
13
|
} from "../provider-quota-config-store";
|
|
14
14
|
import { cleanString, optionalEnum } from "../validation";
|
|
@@ -40,7 +40,7 @@ export const putProviderQuotaConfigRoute: Handler = async (req, params) => {
|
|
|
40
40
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
41
41
|
try {
|
|
42
42
|
const updatedBy = isRecord(parsed.body) ? cleanString(parsed.body.updatedBy, "updatedBy", { max: 200 }) : undefined;
|
|
43
|
-
return json(
|
|
43
|
+
return json(await setProviderQuotaConfigAsync(provider, parsed.body, { updatedBy }));
|
|
44
44
|
} catch (e) {
|
|
45
45
|
if (e instanceof ValidationError) return error(e.message, 400);
|
|
46
46
|
throw e;
|
|
@@ -45,7 +45,7 @@ function cleanUnavailableWindows(value: unknown): ProviderQuotaWindowIdentity[]
|
|
|
45
45
|
return windows;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
function cleanProviderQuotaUpdate(body: unknown): ProviderQuotaUpdateInput | string {
|
|
48
|
+
export function cleanProviderQuotaUpdate(body: unknown): ProviderQuotaUpdateInput | string {
|
|
49
49
|
if (!isRecord(body)) return "JSON object body required";
|
|
50
50
|
const provider = cleanString(body.provider, "provider", { required: true, max: 80 })!;
|
|
51
51
|
const accountKey = cleanString(body.accountKey, "accountKey", { required: true, max: 240 })!;
|
|
@@ -122,7 +122,7 @@ export const postProviderQuotaRoute: Handler = async (req) => {
|
|
|
122
122
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
123
123
|
const input = cleanProviderQuotaUpdate(parsed.body);
|
|
124
124
|
if (typeof input === "string") return error(input);
|
|
125
|
-
const providerWriteGate = authorizeProviderQuotaWrite(req, input);
|
|
125
|
+
const providerWriteGate = (await authorizeProviderQuotaWrite(req, input));
|
|
126
126
|
if (providerWriteGate) return providerWriteGate;
|
|
127
127
|
if ((VALID_QUOTA_CONFIG_PROVIDERS as readonly string[]).includes(input.provider) && getProviderQuotaConfig(input.provider).enabled === false) return json({ skipped: true, reason: "provider quota collection disabled" }, 202);
|
|
128
128
|
const providerContext = authContextFromRequest(req);
|
|
@@ -218,19 +218,19 @@ function cleanPublisherLeaseBody(body: unknown): {
|
|
|
218
218
|
|
|
219
219
|
const runnerLeaseHolderId = (sourceAgentId: string) => `runner:${sourceAgentId}`;
|
|
220
220
|
|
|
221
|
-
function authorizeProviderQuotaSourceAgent(req: Request, sourceAgentId: string): Response | null {
|
|
221
|
+
async function authorizeProviderQuotaSourceAgent(req: Request, sourceAgentId: string): Promise<Response | null> {
|
|
222
222
|
const ctx = authContextFromRequest(req);
|
|
223
223
|
if (ctx.component?.role !== "provider") return null;
|
|
224
|
-
const denied = authorizeRoute(req, { scope: "quota:write" });
|
|
224
|
+
const denied = (await authorizeRoute(req, { scope: "quota:write" }));
|
|
225
225
|
if (denied) return denied;
|
|
226
226
|
return ctx.callerAgentId === sourceAgentId ? null : error("forbidden", 403);
|
|
227
227
|
}
|
|
228
228
|
|
|
229
|
-
function authorizeProviderQuotaWrite(req: Request, input: ProviderQuotaUpdateInput): Response | null {
|
|
229
|
+
export async function authorizeProviderQuotaWrite(req: Request, input: ProviderQuotaUpdateInput): Promise<Response | null> {
|
|
230
230
|
const ctx = authContextFromRequest(req);
|
|
231
231
|
if (ctx.component?.role !== "provider") return null;
|
|
232
232
|
if (!input.sourceAgentId) return error("sourceAgentId required for provider quota writer", 403);
|
|
233
|
-
const denied = authorizeProviderQuotaSourceAgent(req, input.sourceAgentId);
|
|
233
|
+
const denied = (await authorizeProviderQuotaSourceAgent(req, input.sourceAgentId));
|
|
234
234
|
if (denied) return denied;
|
|
235
235
|
// The authority fence is deliberately folded into providerQuotas.upsert. A pre-read here would
|
|
236
236
|
// race lease transfer while the async writer is queued.
|
|
@@ -242,7 +242,7 @@ export const postProviderQuotaPublisherLeaseAcquireRoute: Handler = async (req)
|
|
|
242
242
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
243
243
|
const input = cleanPublisherLeaseBody(parsed.body);
|
|
244
244
|
if (typeof input === "string") return error(input);
|
|
245
|
-
const denied = authorizeProviderQuotaSourceAgent(req, input.sourceAgentId);
|
|
245
|
+
const denied = (await authorizeProviderQuotaSourceAgent(req, input.sourceAgentId));
|
|
246
246
|
if (denied) return denied;
|
|
247
247
|
return json(await acquireProviderQuotaLeaseAsync({
|
|
248
248
|
provider: input.provider,
|
|
@@ -260,7 +260,7 @@ export const postProviderQuotaPublisherLeaseReleaseRoute: Handler = async (req)
|
|
|
260
260
|
const input = cleanPublisherLeaseBody(parsed.body);
|
|
261
261
|
if (typeof input === "string") return error(input);
|
|
262
262
|
if (!input.leaseToken) return error("leaseToken required");
|
|
263
|
-
const denied = authorizeProviderQuotaSourceAgent(req, input.sourceAgentId);
|
|
263
|
+
const denied = (await authorizeProviderQuotaSourceAgent(req, input.sourceAgentId));
|
|
264
264
|
if (denied) return denied;
|
|
265
265
|
return json({
|
|
266
266
|
released: await releaseProviderQuotaLeaseAsync({
|
|
@@ -275,7 +275,7 @@ export const postProviderQuotaPublisherLeaseReleaseRoute: Handler = async (req)
|
|
|
275
275
|
export const postProviderQuotaLeaseAcquireRoute: Handler = async (req, params) => {
|
|
276
276
|
const orch = getOrchestrator(params.id!);
|
|
277
277
|
if (!orch) return error("orchestrator not found", 404);
|
|
278
|
-
const denied = authorizeRoute(req, { scope: "command:write", resource: { orchestratorId: orch.id } });
|
|
278
|
+
const denied = (await authorizeRoute(req, { scope: "command:write", resource: { orchestratorId: orch.id } }));
|
|
279
279
|
if (denied) return denied;
|
|
280
280
|
const parsed = await parseBody<unknown>(req);
|
|
281
281
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -294,7 +294,7 @@ export const postProviderQuotaLeaseAcquireRoute: Handler = async (req, params) =
|
|
|
294
294
|
export const postProviderQuotaLeaseReleaseRoute: Handler = async (req, params) => {
|
|
295
295
|
const orch = getOrchestrator(params.id!);
|
|
296
296
|
if (!orch) return error("orchestrator not found", 404);
|
|
297
|
-
const denied = authorizeRoute(req, { scope: "command:write", resource: { orchestratorId: orch.id } });
|
|
297
|
+
const denied = (await authorizeRoute(req, { scope: "command:write", resource: { orchestratorId: orch.id } }));
|
|
298
298
|
if (denied) return denied;
|
|
299
299
|
const parsed = await parseBody<unknown>(req);
|
|
300
300
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -10,7 +10,7 @@ import { authorizeRoute, error, json, parseBody, type Handler } from "./_shared"
|
|
|
10
10
|
export const postRunCommand: Handler = async (req) => {
|
|
11
11
|
// Require authentication even when the server permits credential-less development requests.
|
|
12
12
|
if (!hasPresentedCredential(req) || !isAuthorized(req)) return error("authentication required", 401);
|
|
13
|
-
const denied = authorizeRoute(req, { scope: "command:write" });
|
|
13
|
+
const denied = (await authorizeRoute(req, { scope: "command:write" }));
|
|
14
14
|
if (denied) return denied;
|
|
15
15
|
const parsed = await parseBody<unknown>(req);
|
|
16
16
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -20,7 +20,7 @@ function backupError(cause: unknown): Response {
|
|
|
20
20
|
/** Backup and restore move every secret at once: the operator only, never a secrets-scoped agent. */
|
|
21
21
|
function operatorRoute(handle: (body: Record<string, unknown>, actor: string) => Promise<Response>): Handler {
|
|
22
22
|
return async req => {
|
|
23
|
-
const denied = authorizeRoute(req, { scope: "secrets:write" });
|
|
23
|
+
const denied = (await authorizeRoute(req, { scope: "secrets:write" }));
|
|
24
24
|
if (denied) return denied;
|
|
25
25
|
if (!isRootCredentialRequest(req) && getComponentAuth(req)?.role !== "dashboard") return error("operator token required for vault backup and restore", 403);
|
|
26
26
|
let body: unknown = {};
|
|
@@ -37,7 +37,7 @@ function operatorRoute(handle: (body: Record<string, unknown>, actor: string) =>
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
export const getVaultBackupRoute: Handler = async req => {
|
|
40
|
-
const denied = authorizeRoute(req, { scope: "secrets:write" });
|
|
40
|
+
const denied = (await authorizeRoute(req, { scope: "secrets:write" }));
|
|
41
41
|
if (denied) return denied;
|
|
42
42
|
try { return json(await vaultBackupStatus()); } catch (cause) { return backupError(cause); }
|
|
43
43
|
};
|
|
@@ -9,7 +9,7 @@ import { authorizeRoute, error, isRootCredentialRequest, json, parseBody, type H
|
|
|
9
9
|
|
|
10
10
|
function importRoute(preview: boolean): Handler {
|
|
11
11
|
return async req => {
|
|
12
|
-
const denied = authorizeRoute(req, { scope: "secrets:write" });
|
|
12
|
+
const denied = (await authorizeRoute(req, { scope: "secrets:write" }));
|
|
13
13
|
if (denied) return denied;
|
|
14
14
|
// Import is the operator's batch approval; a secrets-scoped agent may not approve its own migration.
|
|
15
15
|
if (!isRootCredentialRequest(req) && getComponentAuth(req)?.role !== "dashboard") return error("operator token required to import secrets", 403);
|
|
@@ -13,7 +13,7 @@ import { resolveHostProviderEnv } from "../secrets-vault/provider-env";
|
|
|
13
13
|
import { isOrchestratorSelfReportAuthorized } from "../orchestrator-self-report-authz";
|
|
14
14
|
|
|
15
15
|
export const getVaultMetadataRoute: Handler = async (req) => {
|
|
16
|
-
const denied = authorizeRoute(req, { scope: "secrets:write" });
|
|
16
|
+
const denied = (await authorizeRoute(req, { scope: "secrets:write" }));
|
|
17
17
|
if (denied) return denied;
|
|
18
18
|
// health() opens a row, so a missing or wrong key answers 503 here instead of listing names that nothing can resolve.
|
|
19
19
|
try {
|
|
@@ -49,7 +49,7 @@ function vaultWriteError(cause: unknown): Response {
|
|
|
49
49
|
|
|
50
50
|
/** The operator creates a new secret straight from the dashboard; the value is never echoed or logged. */
|
|
51
51
|
export const postVaultSecretRoute: Handler = async (req) => {
|
|
52
|
-
const denied = authorizeRoute(req, { scope: "secrets:write" });
|
|
52
|
+
const denied = (await authorizeRoute(req, { scope: "secrets:write" }));
|
|
53
53
|
if (denied) return denied;
|
|
54
54
|
const parsed = await parseBody<unknown>(req);
|
|
55
55
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -60,7 +60,7 @@ export const postVaultSecretRoute: Handler = async (req) => {
|
|
|
60
60
|
|
|
61
61
|
/** #3558 — the operator sets a new version of an existing secret (`:name` is `NAME` or `project:<id>:NAME`). */
|
|
62
62
|
export const putVaultSecretRoute: Handler = async (req, params) => {
|
|
63
|
-
const denied = authorizeRoute(req, { scope: "secrets:write" });
|
|
63
|
+
const denied = (await authorizeRoute(req, { scope: "secrets:write" }));
|
|
64
64
|
if (denied) return denied;
|
|
65
65
|
const parsed = await parseBody<unknown>(req);
|
|
66
66
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -72,7 +72,7 @@ export const putVaultSecretRoute: Handler = async (req, params) => {
|
|
|
72
72
|
|
|
73
73
|
/** #3554 — the operator deletes every version of one secret. */
|
|
74
74
|
export const deleteVaultSecretRoute: Handler = async (req, params) => {
|
|
75
|
-
const denied = authorizeRoute(req, { scope: "secrets:write" });
|
|
75
|
+
const denied = (await authorizeRoute(req, { scope: "secrets:write" }));
|
|
76
76
|
if (denied) return denied;
|
|
77
77
|
try { return json(await deleteOperatorSecret(operatorActor(req), params.name!, new URL(req.url).searchParams.get("environment") ?? undefined)); }
|
|
78
78
|
catch (cause) { return vaultWriteError(cause); }
|
|
@@ -91,7 +91,7 @@ export const getVaultAuditRoute: Handler = async (req, params) => {
|
|
|
91
91
|
export const getOrchestratorProviderEnvRoute: Handler = async (req, params) => {
|
|
92
92
|
const orch = getOrchestrator(params.id!);
|
|
93
93
|
if (!orch) return error("orchestrator not found", 404);
|
|
94
|
-
const denied = authorizeRoute(req, { scope: "command:write", resource: { orchestratorId: orch.id } });
|
|
94
|
+
const denied = (await authorizeRoute(req, { scope: "command:write", resource: { orchestratorId: orch.id } }));
|
|
95
95
|
if (denied) return denied;
|
|
96
96
|
// Plaintext keys: only this orchestrator's own host credential (or admin), never a runner token with command:write.
|
|
97
97
|
if (!isOrchestratorSelfReportAuthorized(req, orch.id)) return error("forbidden", 403);
|
|
@@ -105,14 +105,14 @@ export const getOrchestratorProviderEnvRoute: Handler = async (req, params) => {
|
|
|
105
105
|
};
|
|
106
106
|
|
|
107
107
|
export const getVaultSecretRoute: Handler = async (req, params) => {
|
|
108
|
-
const denied = authorizeRoute(req, { scope: "secrets:write" });
|
|
108
|
+
const denied = (await authorizeRoute(req, { scope: "secrets:write" }));
|
|
109
109
|
if (denied) return denied;
|
|
110
110
|
try { return json(await getSecretMetadata(params.name!, new URL(req.url).searchParams.get("environment") ?? undefined)); }
|
|
111
111
|
catch (cause) { return vaultWriteError(cause); }
|
|
112
112
|
};
|
|
113
113
|
|
|
114
114
|
export const patchVaultMetadataRoute: Handler = async (req, params) => {
|
|
115
|
-
const denied = authorizeRoute(req, { scope: "secrets:write" });
|
|
115
|
+
const denied = (await authorizeRoute(req, { scope: "secrets:write" }));
|
|
116
116
|
if (denied) return denied;
|
|
117
117
|
const parsed = await parseBody<unknown>(req);
|
|
118
118
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
package/src/routes/settings.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { ValidationError } from "../db";
|
|
|
4
4
|
import { getConfig } from "../config-store";
|
|
5
5
|
import { setConfigAsync } from "../config-store-write";
|
|
6
6
|
import { getUserSettingAsync, setUserSettingAsync } from "../user-settings-async";
|
|
7
|
-
import { ensureProviderConfigDescriptors,
|
|
7
|
+
import { ensureProviderConfigDescriptors, migrateLocalProviderConfigsAsync } from "../provider-config-store";
|
|
8
8
|
import { ensureNotificationSettingDescriptors } from "../notification-settings-store";
|
|
9
9
|
import { NOTIFICATIONS_NAMESPACE } from "../notification-settings";
|
|
10
10
|
import { getSettingDescriptor, listSettingDescriptors, validateSettingValue, PROVIDER_CONFIG_NAMESPACE } from "../settings/registry";
|
|
@@ -23,7 +23,7 @@ type SettingEnvelope = SettingEntry;
|
|
|
23
23
|
// as before the migration (back-compat). Server-runtime/bootstrap/browser tiers ignore this.
|
|
24
24
|
|
|
25
25
|
export const getSettingsRoute: Handler = async (req) => {
|
|
26
|
-
|
|
26
|
+
await migrateLocalProviderConfigsAsync();
|
|
27
27
|
ensureProviderConfigDescriptors();
|
|
28
28
|
ensureNotificationSettingDescriptors();
|
|
29
29
|
return json({ settings: await listVisibleSettings(req) });
|
|
@@ -31,7 +31,7 @@ export const getSettingsRoute: Handler = async (req) => {
|
|
|
31
31
|
|
|
32
32
|
export const getSettingsNamespaceRoute: Handler = async (req, params) => {
|
|
33
33
|
const namespace = normalizeConfigPathParam(params.namespace, "namespace");
|
|
34
|
-
|
|
34
|
+
await migrateLocalProviderConfigsAsync();
|
|
35
35
|
ensureProviderConfigDescriptors();
|
|
36
36
|
if (namespace === NOTIFICATIONS_NAMESPACE) ensureNotificationSettingDescriptors();
|
|
37
37
|
const settings = await listVisibleSettings(req);
|
|
@@ -41,7 +41,7 @@ export const getSettingsNamespaceRoute: Handler = async (req, params) => {
|
|
|
41
41
|
export const getSettingRoute: Handler = async (req, params) => {
|
|
42
42
|
const namespace = normalizeConfigPathParam(params.namespace, "namespace");
|
|
43
43
|
const key = normalizeConfigPathParam(params.key, "key");
|
|
44
|
-
|
|
44
|
+
await migrateLocalProviderConfigsAsync();
|
|
45
45
|
ensureProviderConfigDescriptors(namespace === PROVIDER_CONFIG_NAMESPACE ? [key] : []);
|
|
46
46
|
if (namespace === NOTIFICATIONS_NAMESPACE) ensureNotificationSettingDescriptors([key]);
|
|
47
47
|
const descriptor = getSettingDescriptor(namespace, key);
|
|
@@ -70,7 +70,7 @@ export async function setRegisteredSettingValue(namespace: string, key: string,
|
|
|
70
70
|
const validation = validateSettingValue(namespace, key, merged);
|
|
71
71
|
if (!validation.valid) throw new ValidationError(validation.errors.join("; "));
|
|
72
72
|
if (descriptor.tier === "user") return setUserSettingAsync(DEFAULT_USER_ID, namespace, key, merged, updatedBy);
|
|
73
|
-
return setConfigAsync(namespace, key, merged, updatedBy);
|
|
73
|
+
return (await setConfigAsync(namespace, key, merged, updatedBy));
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
async function putSetting(req: Request, namespaceRaw: string | undefined, keyRaw: string | undefined): Promise<Response> {
|
|
@@ -82,7 +82,7 @@ async function putSetting(req: Request, namespaceRaw: string | undefined, keyRaw
|
|
|
82
82
|
if (!Object.prototype.hasOwnProperty.call(parsed.body, "value")) return error("value required", 400);
|
|
83
83
|
|
|
84
84
|
try {
|
|
85
|
-
|
|
85
|
+
await migrateLocalProviderConfigsAsync();
|
|
86
86
|
ensureProviderConfigDescriptors(namespace === PROVIDER_CONFIG_NAMESPACE ? [key] : []);
|
|
87
87
|
if (namespace === NOTIFICATIONS_NAMESPACE) ensureNotificationSettingDescriptors([key]);
|
|
88
88
|
const descriptor = getSettingDescriptor(namespace, key);
|
package/src/routes/shipping.ts
CHANGED
|
@@ -5,12 +5,13 @@ import { readGateStatsAsync, resolveProjectAsync } from "../db";
|
|
|
5
5
|
import { getShippingBoard } from "../services/shipping-board";
|
|
6
6
|
import { getShippingStats } from "../services/shipping-stats";
|
|
7
7
|
import { abandonRedMainIncident } from "../services/red-main-incident";
|
|
8
|
+
import { baseKnownFailures } from "../db/land-boundaries";
|
|
8
9
|
import { OpError } from "@humwick/kernel/contract";
|
|
9
10
|
import { cleanString } from "../validation";
|
|
10
11
|
import { authorizeRoute, error, json, parseBody, resolveActorLabel, type Handler } from "./_shared";
|
|
11
12
|
|
|
12
13
|
export const postRedMainAbandonRoute: Handler = async (req, params) => {
|
|
13
|
-
const denied = authorizeRoute(req, { scope: "command:write" });
|
|
14
|
+
const denied = (await authorizeRoute(req, { scope: "command:write" }));
|
|
14
15
|
if (denied) return denied;
|
|
15
16
|
const parsed = await parseBody<{ reason?: unknown }>(req);
|
|
16
17
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -23,6 +24,13 @@ export const postRedMainAbandonRoute: Handler = async (req, params) => {
|
|
|
23
24
|
}
|
|
24
25
|
};
|
|
25
26
|
|
|
27
|
+
// #3362 §11: what a builder's delivery gate holds out of unrelated runs. agent:read, so every agent token reads it.
|
|
28
|
+
export const getKnownFailuresRoute: Handler = async (req) => {
|
|
29
|
+
const remote = new URL(req.url).searchParams.get("remote")?.trim();
|
|
30
|
+
if (!remote || !/^[\w.-]+\/[\w.-]+$/.test(remote)) return error("remote must be owner/repo", 400);
|
|
31
|
+
return json({ failures: baseKnownFailures(remote) });
|
|
32
|
+
};
|
|
33
|
+
|
|
26
34
|
/** A `projectId` query names a project by id or slug; absent means all projects. */
|
|
27
35
|
async function projectFilter(req: Request): Promise<{ projectId?: string } | Response> {
|
|
28
36
|
const ref = new URL(req.url).searchParams.get("projectId")?.trim();
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { upsertManagedAgentStateAsync } from "../db/lifecycle-tail-async";
|
|
1
2
|
// Auto-split from routes.ts (#299). Domain: spawn-policy.
|
|
2
3
|
import { ValidationError, getCrashReport, getManagedPolicyTimelineAsync, getOrchestrator } from "../db";
|
|
3
4
|
import { auditEvent, authAuditMetadata, dashboardAttribution, emitCommand, error, json, parseBody, parseQueryInt, spawnRequestId, type Handler } from "./_shared";
|
|
@@ -6,7 +7,7 @@ import { SYSTEM_LAUNCH } from "../runtime-tokens";
|
|
|
6
7
|
import { cleanString } from "../validation";
|
|
7
8
|
import { hostSpawnsDrained } from "../db/spawn-host-cap";
|
|
8
9
|
import { createCommandAsync } from "../commands-write";
|
|
9
|
-
import { getManagedAgentState, getSpawnPolicy, listSpawnPolicies
|
|
10
|
+
import { getManagedAgentState, getSpawnPolicy, listSpawnPolicies } from "../config-store";
|
|
10
11
|
import { deleteConfigAsync, setConfigAsync } from "../config-store-write";
|
|
11
12
|
import { managedSpawnReservationCurrent, restoreDrainedSpawnReservation } from "../managed-spawn-reservation";
|
|
12
13
|
import { emitConfigChanged, emitManagedAgentStateChanged } from "../sse";
|
|
@@ -72,7 +73,7 @@ async function enqueuePolicyStart(policy: SpawnPolicy, reason: string): Promise<
|
|
|
72
73
|
if (stewardDeny) return error(`steward spawn refused: ${stewardDeny}`, 409);
|
|
73
74
|
const requestId = spawnRequestId();
|
|
74
75
|
const existing = getManagedAgentState(policy.name);
|
|
75
|
-
const state =
|
|
76
|
+
const state = (await upsertManagedAgentStateAsync({
|
|
76
77
|
policyName: policy.name,
|
|
77
78
|
status: "starting",
|
|
78
79
|
orchestratorId: policy.orchestratorId,
|
|
@@ -82,7 +83,7 @@ async function enqueuePolicyStart(policy: SpawnPolicy, reason: string): Promise<
|
|
|
82
83
|
// An operator start deliberately retries a failed policy after correcting its launch.
|
|
83
84
|
restartCount: existing?.restartCount ?? 0,
|
|
84
85
|
consecutiveFailures: 0,
|
|
85
|
-
});
|
|
86
|
+
}));
|
|
86
87
|
emitManagedAgentStateChanged(policy.name, state as unknown as Record<string, unknown>);
|
|
87
88
|
const policySnapshot = JSON.stringify(policy);
|
|
88
89
|
const spawnParams = await buildManagedSpawnParamsAsync(policy, requestId, { createdBy: "managed-agent", authority: SYSTEM_LAUNCH });
|
|
@@ -93,7 +94,7 @@ async function enqueuePolicyStart(policy: SpawnPolicy, reason: string): Promise<
|
|
|
93
94
|
return error("managed policy start was superseded", 409);
|
|
94
95
|
}
|
|
95
96
|
if (hostSpawnsDrained(orch.agentId)) {
|
|
96
|
-
restoreDrainedSpawnReservation(policy, requestId, existing);
|
|
97
|
+
(await restoreDrainedSpawnReservation(policy, requestId, existing));
|
|
97
98
|
return error(`host ${orch.hostname} is draining: new spawns disabled`, 409);
|
|
98
99
|
}
|
|
99
100
|
const command = await createCommandAsync({
|
|
@@ -131,7 +132,7 @@ async function enqueuePolicyStop(policy: SpawnPolicy, action: "shutdown" | "rest
|
|
|
131
132
|
})
|
|
132
133
|
: undefined;
|
|
133
134
|
if (action === "restart" && hostSpawnsDrained(orch.agentId)) return error(`host ${orch.hostname} is draining: new spawns disabled`, 409);
|
|
134
|
-
const nextState =
|
|
135
|
+
const nextState = (await upsertManagedAgentStateAsync({
|
|
135
136
|
policyName: policy.name,
|
|
136
137
|
status: "stopping",
|
|
137
138
|
agentId: state?.agentId,
|
|
@@ -143,7 +144,7 @@ async function enqueuePolicyStop(policy: SpawnPolicy, action: "shutdown" | "rest
|
|
|
143
144
|
lastStopAt: Date.now(),
|
|
144
145
|
restartCount: state?.restartCount ?? 0,
|
|
145
146
|
consecutiveFailures: state?.consecutiveFailures ?? 0,
|
|
146
|
-
});
|
|
147
|
+
}));
|
|
147
148
|
emitManagedAgentStateChanged(policy.name, nextState as unknown as Record<string, unknown>);
|
|
148
149
|
const command = await createCommandAsync({
|
|
149
150
|
type: action === "restart" ? "agent.restart" : "agent.shutdown",
|
|
@@ -209,7 +210,7 @@ export const putSpawnPolicyRoute: Handler = async (req, params) => {
|
|
|
209
210
|
const updatedBy = isRecord(parsed.body) ? cleanString(parsed.body.updatedBy, "updatedBy", { max: 200 }) : undefined;
|
|
210
211
|
const entry = await setConfigAsync("spawn-policy", params.name!, value, updatedBy);
|
|
211
212
|
emitConfigChanged(entry.namespace, entry.key, entry.version);
|
|
212
|
-
getLifecycleManager().onConfigChanged("spawn-policy", entry.key);
|
|
213
|
+
(await getLifecycleManager().onConfigChanged("spawn-policy", entry.key));
|
|
213
214
|
return json(entry, entry.version === 1 ? 201 : 200);
|
|
214
215
|
} catch (e) {
|
|
215
216
|
if (e instanceof ValidationError) return error(e.message, 400);
|
package/src/routes/sse.ts
CHANGED
|
@@ -5,13 +5,13 @@ import { isOtherHumanSink } from "../message-visibility";
|
|
|
5
5
|
import { canViewAgentRoute, error, type Handler } from "./_shared";
|
|
6
6
|
import { messageViewerForRequest } from "./message-viewer";
|
|
7
7
|
|
|
8
|
-
export const getEvents: Handler = (req) => {
|
|
8
|
+
export const getEvents: Handler = async (req) => {
|
|
9
9
|
const url = new URL(req.url);
|
|
10
10
|
const agentId = url.searchParams.get("for") || null;
|
|
11
11
|
const lastEventId = Number(req.headers.get("last-event-id") ?? "");
|
|
12
12
|
// #3567 D6 — a signed-in human streams their own messages and notifications only.
|
|
13
13
|
const viewer = messageViewerForRequest(req) ?? undefined;
|
|
14
|
-
if (agentId && isOtherHumanSink(viewer, agentId)) return authorityDenied(req, "you can only read your own messages", 403, agentId, "read sink stream");
|
|
14
|
+
if (agentId && isOtherHumanSink(viewer, agentId)) return (await authorityDenied(req, "you can only read your own messages", 403, agentId, "read sink stream"));
|
|
15
15
|
if (agentId && !canViewAgentRoute(req, agentId)) return error("agent not found", 404);
|
|
16
16
|
return createSSEStream(agentId, Number.isSafeInteger(lastEventId) && lastEventId > 0 ? lastEventId : 0,
|
|
17
17
|
url.searchParams.get("agentStatus") === "delta", viewer);
|