@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/messages.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { sendMessageWithResultAsync, sendMessageAsync } from "../db/message-send";
|
|
1
2
|
import { authorityDenied } from "../authority-audit";
|
|
2
3
|
// Auto-split from routes.ts (#299). Domain: messages.
|
|
3
4
|
import { MAX_BODY_BYTES } from "../config";
|
|
4
|
-
import { ValidationError, applyMessageDeliveryActionAsync, claimMessageAsync, deleteMessageAsync, getAgent, getLatestMessageIdAsync, getMessage, getMessageAsync, getMessageDeliveryStatusAsync, getThreadAsync, listQueuedMessagesAsync, listRecentMessagesAsync, markReadAsync, pollMessagesAsync, recordMessageDeliveryAttemptAsync, renewMessageClaimAsync,
|
|
5
|
+
import { ValidationError, applyMessageDeliveryActionAsync, claimMessageAsync, deleteMessageAsync, getAgent, getLatestMessageIdAsync, getMessage, getMessageAsync, getMessageDeliveryStatusAsync, getThreadAsync, listQueuedMessagesAsync, listRecentMessagesAsync, markReadAsync, pollMessagesAsync, recordMessageDeliveryAttemptAsync, renewMessageClaimAsync, setMessageReactionAsync, isChannelEgressTarget } from "../db";
|
|
5
6
|
import { requestUserAddress, resolveActingUser, auditEvent, cleanAttachmentRefs, dispatchTaskCallbacksInBackground, emitCommand, error, json, normalizeAgentSessionGuard, parseBody, parseId, parseQueryInt, reactionEmoji, sendReactionNotificationToAuthor, withPayloadAttachments, type Handler } from "./_shared";
|
|
6
7
|
import { cleanMeta, cleanParams, cleanPositiveId, cleanString, optionalEnum } from "../validation";
|
|
7
8
|
import { emitMessageClaimed, emitMessageDeleted, emitMessageDeliveryUpdated, emitMessageQueued, emitMessageReactionUpdated, emitNewMessage, emitTaskChanged } from "../sse";
|
|
@@ -12,12 +13,11 @@ import { authContextFromRequest } from "../services/auth-context";
|
|
|
12
13
|
import { sendMessagesBatchService, sendMessageServiceAsync } from "../services/send-message";
|
|
13
14
|
import { recordFanoutSuppression } from "../services/channel-suppression-receipt";
|
|
14
15
|
import { fanOutToAgent } from "../services/agent-message-fanout";
|
|
15
|
-
import { isChannelEgressTarget } from "../db";
|
|
16
16
|
import { CHANNEL_SUPPRESSION_REASON, isDisallowedChannelContent } from "../db/channel-egress-allowlist.ts";
|
|
17
17
|
import { settleParkedSelfResumeContinuation } from "../self-resume";
|
|
18
18
|
import { AmbiguousTargetError, ServiceAuthError } from "../services/errors";
|
|
19
19
|
import { reEvaluateChannelDelivery } from "../services/message-delivery-actions";
|
|
20
|
-
import { isOtherHumanSink, messageVisibleTo } from "../message-visibility";
|
|
20
|
+
import { isOtherHumanSink, messageVisibleTo, type MessageViewer } from "../message-visibility";
|
|
21
21
|
import { messageViewerForRequest, visibleMessages } from "./message-viewer";
|
|
22
22
|
import { type AgentSessionGuard, type Message, type PollQuery, type SendMessageInput } from "../types";
|
|
23
23
|
|
|
@@ -136,7 +136,7 @@ export const postMessageDeliveryAttempt: Handler = async (req, params) => {
|
|
|
136
136
|
}, idempotencyKey);
|
|
137
137
|
if (!result.ok) return error(result.error ?? "message not found", result.error === "message not found" ? 404 : 409);
|
|
138
138
|
emitMessageDeliveryUpdated(result.message!);
|
|
139
|
-
if (status === "delivered") settleParkedSelfResumeContinuation(result.message!);
|
|
139
|
+
if (status === "delivered") (await settleParkedSelfResumeContinuation(result.message!));
|
|
140
140
|
return json(await getMessageDeliveryStatusAsync(id), 201);
|
|
141
141
|
} catch (e) {
|
|
142
142
|
if (e instanceof ValidationError) return error(e.message, 400);
|
|
@@ -222,13 +222,13 @@ export const postSystemBroadcast: Handler = async (req) => {
|
|
|
222
222
|
const body = parsed.body;
|
|
223
223
|
if (!body?.body) return error("body required");
|
|
224
224
|
try {
|
|
225
|
-
const msg =
|
|
225
|
+
const msg = (await sendMessageAsync({
|
|
226
226
|
from: "system",
|
|
227
227
|
to: "broadcast",
|
|
228
228
|
kind: "system",
|
|
229
229
|
subject: body.subject ?? undefined,
|
|
230
230
|
body: body.body,
|
|
231
|
-
});
|
|
231
|
+
}));
|
|
232
232
|
emitNewMessage(msg);
|
|
233
233
|
return json(msg, 201);
|
|
234
234
|
} catch (e) {
|
|
@@ -351,7 +351,7 @@ export const getMessages: Handler = async (req) => {
|
|
|
351
351
|
const channel = url.searchParams.get("channel") ?? undefined;
|
|
352
352
|
// #3567 D6 — a non-admin reads only their own human sink; another human's inbox is a 403.
|
|
353
353
|
const viewer = messageViewerForRequest(req);
|
|
354
|
-
if (forAgent && isOtherHumanSink(viewer, forAgent)) return authorityDenied(req, "you can only read your own messages", 403, forAgent, "read sink");
|
|
354
|
+
if (forAgent && isOtherHumanSink(viewer, forAgent)) return (await authorityDenied(req, "you can only read your own messages", 403, forAgent, "read sink"));
|
|
355
355
|
|
|
356
356
|
// No agent filter — return all recent messages
|
|
357
357
|
if (!forAgent) {
|
|
@@ -367,6 +367,12 @@ export const getMessages: Handler = async (req) => {
|
|
|
367
367
|
channel,
|
|
368
368
|
limit,
|
|
369
369
|
};
|
|
370
|
+
return json(await pollAgentMessages(viewer, pollQuery));
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
/** Shared display/turn-delivery polling for GET messages and the liveness exchange (#3608). */
|
|
374
|
+
export async function pollAgentMessages(viewer: MessageViewer | null, pollQuery: PollQuery): Promise<Message[]> {
|
|
375
|
+
const forAgent = pollQuery.for;
|
|
370
376
|
//
|
|
371
377
|
// #2335 (P1 privacy) — a poll whose `for` resolves to a channel-egress bridge is a DELIVERY poll by
|
|
372
378
|
// construction: the only thing on the other end is a bridge about to forward what it receives into a
|
|
@@ -394,18 +400,18 @@ export const getMessages: Handler = async (req) => {
|
|
|
394
400
|
// gets the COMPLETE set: `history` is still dashboard/thread-visible by definition, and this endpoint is
|
|
395
401
|
// where the dashboard reads it. Suppressing there would evict it from the view (dashboard merge REPLACEs),
|
|
396
402
|
// breaking the "no data loss" invariant — so the seam gates delivery, never display.
|
|
397
|
-
if (
|
|
403
|
+
if (!pollQuery.turnDelivery) return polled;
|
|
398
404
|
const delivered: Message[] = [];
|
|
399
405
|
for (const msg of polled) fanOutToAgent(forAgent, msg, () => delivered.push(msg));
|
|
400
|
-
return
|
|
401
|
-
}
|
|
406
|
+
return delivered;
|
|
407
|
+
}
|
|
402
408
|
|
|
403
409
|
export const getMessageById: Handler = async (req, params) => {
|
|
404
410
|
const id = parseId(params.id);
|
|
405
411
|
if (id === null) return error("invalid message id");
|
|
406
412
|
const msg = await getMessageAsync(id);
|
|
407
413
|
if (!msg) return error("message not found", 404);
|
|
408
|
-
return messageVisibleTo(messageViewerForRequest(req), msg) ? json(msg) : authorityDenied(req, "you can only read your own messages", 403, String(id), "read message");
|
|
414
|
+
return messageVisibleTo(messageViewerForRequest(req), msg) ? json(msg) : (await authorityDenied(req, "you can only read your own messages", 403, String(id), "read message"));
|
|
409
415
|
};
|
|
410
416
|
|
|
411
417
|
export const getMessageThread: Handler = async (req, params) => {
|
|
@@ -415,7 +421,7 @@ export const getMessageThread: Handler = async (req, params) => {
|
|
|
415
421
|
if (!thread.length) return error("message not found", 404);
|
|
416
422
|
const viewer = messageViewerForRequest(req);
|
|
417
423
|
const root = thread.find((message) => message.id === id);
|
|
418
|
-
if (root && !messageVisibleTo(viewer, root)) return authorityDenied(req, "you can only read your own messages", 403, String(id), "read thread");
|
|
424
|
+
if (root && !messageVisibleTo(viewer, root)) return (await authorityDenied(req, "you can only read your own messages", 403, String(id), "read thread"));
|
|
419
425
|
return json(visibleMessages(viewer, thread));
|
|
420
426
|
};
|
|
421
427
|
|
|
@@ -537,7 +543,7 @@ function channelReactionActor(actorId: string): Record<string, unknown> {
|
|
|
537
543
|
};
|
|
538
544
|
}
|
|
539
545
|
|
|
540
|
-
function sendOutboundChannelReaction(parent: Message, actorId: string, emoji: string): void {
|
|
546
|
+
async function sendOutboundChannelReaction(parent: Message, actorId: string, emoji: string): Promise<void> {
|
|
541
547
|
if (!parent.channel) return;
|
|
542
548
|
const target = telegramTargetFromMessage(parent);
|
|
543
549
|
if (!target) return;
|
|
@@ -545,7 +551,7 @@ function sendOutboundChannelReaction(parent: Message, actorId: string, emoji: st
|
|
|
545
551
|
const accountId = target.accountId ?? cleanString(payloadChannel.accountId, "payload.channel.accountId", { max: 200 }) ?? "default";
|
|
546
552
|
const conversation = isRecord(parent.payload?.conversation) ? parent.payload.conversation : undefined;
|
|
547
553
|
const now = Date.now();
|
|
548
|
-
const result =
|
|
554
|
+
const result = (await sendMessageWithResultAsync({
|
|
549
555
|
from: actorId,
|
|
550
556
|
to: parent.channel,
|
|
551
557
|
kind: "channel.event",
|
|
@@ -580,7 +586,7 @@ function sendOutboundChannelReaction(parent: Message, actorId: string, emoji: st
|
|
|
580
586
|
},
|
|
581
587
|
},
|
|
582
588
|
},
|
|
583
|
-
});
|
|
589
|
+
}));
|
|
584
590
|
if (result.created) {
|
|
585
591
|
if (result.message.deliveryStatus === "queued") emitMessageQueued(result.message);
|
|
586
592
|
else emitNewMessage(result.message);
|
|
@@ -601,8 +607,8 @@ export const postMessageReaction: Handler = async (req, params) => {
|
|
|
601
607
|
const result = await setMessageReactionAsync({ messageId: id, actorId, emoji, action });
|
|
602
608
|
if (!result.ok) return error(result.error, result.error === "message not found" ? 404 : 400);
|
|
603
609
|
emitMessageReactionUpdated(result.message);
|
|
604
|
-
if (action === "add") sendOutboundChannelReaction(result.message, actorId, emoji);
|
|
605
|
-
sendReactionNotificationToAuthor(result.message, actorId, emoji, action);
|
|
610
|
+
if (action === "add") (await sendOutboundChannelReaction(result.message, actorId, emoji));
|
|
611
|
+
(await sendReactionNotificationToAuthor(result.message, actorId, emoji, action));
|
|
606
612
|
return json(result.message);
|
|
607
613
|
} catch (e) {
|
|
608
614
|
if (e instanceof ValidationError) return error(e.message, 400);
|
|
@@ -50,7 +50,7 @@ export const postOrchestratorBootstrap: Handler = async (req) => {
|
|
|
50
50
|
"--yes",
|
|
51
51
|
];
|
|
52
52
|
for (const entry of pathPrefix ?? []) args.push("--path-prefix", entry);
|
|
53
|
-
const command = ["bunx",
|
|
53
|
+
const command = ["bunx", `@humwick/server@${version}`, ...args].map(quoteInstallCommandArg).join(" ");
|
|
54
54
|
return json({
|
|
55
55
|
command,
|
|
56
56
|
relayUrl,
|
|
@@ -76,7 +76,7 @@ export const postOrchestratorBootstrapExchange: Handler = async (req) => {
|
|
|
76
76
|
if (!isRecord(parsed.body)) return error("body required");
|
|
77
77
|
const id = cleanString(parsed.body.id, "id", { required: true, max: 120 })!;
|
|
78
78
|
const baseDir = cleanString(parsed.body.baseDir, "baseDir", { required: true, max: 500 })!;
|
|
79
|
-
const denied = authorizeRoute(req, { scope: "token:write", resource: { orchestratorId: id } });
|
|
79
|
+
const denied = (await authorizeRoute(req, { scope: "token:write", resource: { orchestratorId: id } }));
|
|
80
80
|
if (denied) return denied;
|
|
81
81
|
const auth = getComponentAuth(req);
|
|
82
82
|
if (!auth || auth.role !== "orchestrator-bootstrap") return error("bootstrap token required", 403);
|
|
@@ -4,10 +4,11 @@
|
|
|
4
4
|
// upsert, and fanning the operator-facing events out as activity events — lives here.
|
|
5
5
|
import { isRecord } from "@humwick/sdk";
|
|
6
6
|
import type { HostHardware } from "@humwick/sdk";
|
|
7
|
-
import { upsertHostFromRegistrationAsync, type HostRegistrationEvent } from "../db";
|
|
7
|
+
import { conflictingHardwareFields, upsertHostFromRegistrationAsync, type HostRegistrationEvent } from "../db";
|
|
8
8
|
import { auditEvent, cleanSafeNumber } from "./_shared";
|
|
9
9
|
import { recordOrchestratorUtilization } from "./orchestrator-host-utilization";
|
|
10
10
|
import { cleanString } from "../validation";
|
|
11
|
+
import { reportRuntimeDependencyFailure } from "../services/runtime-dependency-alert";
|
|
11
12
|
|
|
12
13
|
// The machine fingerprint an orchestrator reports at registration (§3.5). Lenient/observability-grade
|
|
13
14
|
// like `cleanQueuedSpawns`: a malformed blob yields `undefined` (treated as "no fingerprint", never a
|
|
@@ -55,7 +56,7 @@ async function emitHostRegistrationEvents(events: readonly HostRegistrationEvent
|
|
|
55
56
|
clientId: `host-identity-conflict-${ev.hostId}-${ev.orchestratorId}-${Date.now()}`,
|
|
56
57
|
kind: "state",
|
|
57
58
|
title: "Host identity conflict",
|
|
58
|
-
body: `${ev.hostname}: reported hardware differs from the stored fingerprint — bound anyway, kept first-seen (conflict:pending)`,
|
|
59
|
+
body: `${ev.hostname}: reported hardware differs from the stored fingerprint (${conflictingHardwareFields(ev.stored, ev.reported).join(", ")} changed) — bound anyway, kept first-seen (conflict:pending)`,
|
|
59
60
|
meta: ev.hostId,
|
|
60
61
|
icon: "ti-alert-triangle",
|
|
61
62
|
view: "orchestrators",
|
|
@@ -118,6 +119,7 @@ export async function linkOrchestratorHost(orchestratorId: string, hostname: str
|
|
|
118
119
|
const result = await upsertHostFromRegistrationAsync({ orchestratorId, hostname, hardware });
|
|
119
120
|
await emitHostRegistrationEvents(result.events);
|
|
120
121
|
await recordOrchestratorUtilization(orchestratorId, result.host.id, body);
|
|
122
|
+
await reportRuntimeDependencyFailure(result.host.id, hostname, body);
|
|
121
123
|
} catch (err) {
|
|
122
124
|
// Additive over the orchestrator row; log so it is visible, then let the heartbeat path retry.
|
|
123
125
|
console.warn(`[relay] host registration for orchestrator ${orchestratorId} (${hostname}) failed; will self-heal on next heartbeat:`, err);
|
|
@@ -141,6 +141,7 @@ export function cleanHostUtilizationSample(value: unknown, now: number): HostUti
|
|
|
141
141
|
const swapUsedMb = nonNegative(value.swapUsedMb);
|
|
142
142
|
const diskTotalMb = nonNegative(value.diskTotalMb);
|
|
143
143
|
const diskFreeMb = nonNegative(value.diskFreeMb);
|
|
144
|
+
const diskPath = optionalString(value.diskPath, "utilization.diskPath", 200);
|
|
144
145
|
|
|
145
146
|
return {
|
|
146
147
|
at,
|
|
@@ -162,7 +163,7 @@ export function cleanHostUtilizationSample(value: unknown, now: number): HostUti
|
|
|
162
163
|
...(swapTotalMb !== undefined && swapUsedMb !== undefined && swapUsedMb <= swapTotalMb
|
|
163
164
|
? { swapTotalMb, swapUsedMb } : {}),
|
|
164
165
|
...(diskTotalMb !== undefined && diskFreeMb !== undefined && diskFreeMb <= diskTotalMb
|
|
165
|
-
? { diskTotalMb, diskFreeMb } : {}),
|
|
166
|
+
? { diskTotalMb, diskFreeMb, ...(diskPath ? { diskPath } : {}) } : {}),
|
|
166
167
|
memPressure,
|
|
167
168
|
agentCountThisDaemon,
|
|
168
169
|
queuedSpawnsThisDaemon,
|
|
@@ -207,6 +208,7 @@ export function toMachineSample(sample: HostUtilizationSample): HostMachineSampl
|
|
|
207
208
|
...(sample.swapTotalMb !== undefined ? { swapTotalMb: sample.swapTotalMb } : {}),
|
|
208
209
|
...(sample.diskFreeMb !== undefined ? { diskFreeMb: sample.diskFreeMb } : {}),
|
|
209
210
|
...(sample.diskTotalMb !== undefined ? { diskTotalMb: sample.diskTotalMb } : {}),
|
|
211
|
+
...(sample.diskPath ? { diskPath: sample.diskPath } : {}),
|
|
210
212
|
memPressure: sample.memPressure,
|
|
211
213
|
};
|
|
212
214
|
}
|
|
@@ -245,11 +247,11 @@ export async function recordOrchestratorUtilization(
|
|
|
245
247
|
const sample = cleanHostUtilizationSample(raw, now);
|
|
246
248
|
if (!sample) return false;
|
|
247
249
|
const gateArming = cleanGateArming(isRecord(body) ? body.gateArming : undefined, now);
|
|
248
|
-
return recordHostUtilization({
|
|
250
|
+
return (await recordHostUtilization({
|
|
249
251
|
hostId,
|
|
250
252
|
orchestratorId,
|
|
251
253
|
machine: { ...toMachineSample(sample), ...(gateArming ? { gateArming } : {}) },
|
|
252
254
|
daemon: toDaemonSample(sample),
|
|
253
255
|
now,
|
|
254
|
-
});
|
|
256
|
+
}));
|
|
255
257
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Auto-split from routes.ts (#299). Domain: orchestrator-proxy.
|
|
2
2
|
import { RELAY_TOKEN_HEADER, SPAWN_PROVIDERS, isRecord } from "@humwick/sdk";
|
|
3
|
-
import { ValidationError, getOrchestrator,
|
|
3
|
+
import { ValidationError, getOrchestrator, orchestratorHeartbeatAsync } from "../db";
|
|
4
4
|
import { authorizeRoute, cleanJsonArray, error, json, type Handler } from "./_shared";
|
|
5
5
|
import { cleanStringArray } from "../validation";
|
|
6
6
|
import { emitOrchestratorStatus } from "../sse";
|
|
@@ -136,7 +136,7 @@ export const getOrchestratorProviders: Handler = async (req, params) => {
|
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
}
|
|
139
|
-
const updated =
|
|
139
|
+
const updated = await orchestratorHeartbeatAsync(params.id!, {
|
|
140
140
|
providers,
|
|
141
141
|
providerStatus: cleanJsonArray(payload.providerStatus, "providerStatus") as OrchestratorRuntimeInput["providerStatus"],
|
|
142
142
|
providerCatalog: cleanJsonArray(payload.providerCatalog, "providerCatalog") as OrchestratorRuntimeInput["providerCatalog"],
|
|
@@ -153,8 +153,8 @@ export const getOrchestratorSessions: Handler = (req, params) => proxyOrchestrat
|
|
|
153
153
|
|
|
154
154
|
export const getOrchestratorVersion: Handler = (req, params) => proxyOrchestratorGet(req, params.id!, "/api/version");
|
|
155
155
|
|
|
156
|
-
export const getOrchestratorLogs: Handler = (req, params) => {
|
|
157
|
-
const denied = authorizeRoute(req, { scope: "logs:read", resource: { orchestratorId: params.id!, logsRead: true } });
|
|
156
|
+
export const getOrchestratorLogs: Handler = async (req, params) => {
|
|
157
|
+
const denied = (await authorizeRoute(req, { scope: "logs:read", resource: { orchestratorId: params.id!, logsRead: true } }));
|
|
158
158
|
return denied ?? proxyOrchestratorGet(req, params.id!, `/api/logs/${encodeURIComponent(params.session!)}`);
|
|
159
159
|
};
|
|
160
160
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { deleteOrchestratorAsync } from "../db/runtime-tail-async";
|
|
1
2
|
import { cleanBrowserInventory, reconcileBrowserInventory } from "../services/browser-inventory";
|
|
2
3
|
// Auto-split from routes.ts (#299). Domain: orchestrator.
|
|
3
4
|
import { APPROVAL_MODES, SPAWN_PROVIDERS, VALID_WORKSPACE_MODES, fireAndForget, isRecord } from "@humwick/sdk";
|
|
@@ -6,7 +7,7 @@ import { CONTRACT_VERSIONS, parseRuntimeCapabilities, parseRuntimeContracts, par
|
|
|
6
7
|
import { notifyAgentOffline, notifyAgentSpawnQueued } from "../agent-lifecycle-events";
|
|
7
8
|
import { diagnoseReportedExit } from "../services/reported-exit-death";
|
|
8
9
|
import { VERSION } from "../config";
|
|
9
|
-
import { ValidationError,
|
|
10
|
+
import { ValidationError, effectiveProviderCatalogListAsync, getAgent, getOrchestrator, getOrchestratorAsync, listOrchestrators, listOrchestratorsAsync, orchestratorHeartbeatAsync, recordAgentExitDiagnosticsAsync, reportOrchestratorRosterAsync, setOrchestratorUpgradeStateAsync, upsertOrchestratorAsync } from "../db";
|
|
10
11
|
import { reconcileOrchestratorSchedulerCommands } from "../services/scheduler-recovery.ts";
|
|
11
12
|
import { recoverRegisteredOrchestrator } from "../services/orchestrator-registration-recovery";
|
|
12
13
|
import { recoverOrchestratorLegacyLandings } from "../services/orchestrator-landing-recovery";
|
|
@@ -24,10 +25,9 @@ import { serializeCommandForRead } from "../services/dispatch-command";
|
|
|
24
25
|
import { isOrchestratorRegistrationAuthorized } from "../security";
|
|
25
26
|
import { isOrchestratorSelfReportAuthorized } from "../orchestrator-self-report-authz";
|
|
26
27
|
import { getHostProviderSetting } from "../host-provider-store";
|
|
27
|
-
import { hostDisabledFromValue } from "../host-provider-enablement";
|
|
28
|
+
import { hostDisabledFromValue, isHostSwitchableProvider } from "../host-provider-enablement";
|
|
28
29
|
import { seedHostProviders } from "../services/host-providers";
|
|
29
|
-
import {
|
|
30
|
-
import { type ManagedAgent, type ManagedSessionExitDiagnostics, type OrchestratorRuntimeInput, type QueuedSpawn, type RegisterOrchestratorInput, type SpawnApprovalMode, type SpawnProvider } from "../types";
|
|
30
|
+
import { type ManagedAgent, type ManagedSessionExitDiagnostics, type Orchestrator, type OrchestratorRuntimeInput, type QueuedSpawn, type RegisterOrchestratorInput, type SpawnApprovalMode, type SpawnProvider } from "../types";
|
|
31
31
|
import { restartSpawnParamsForAgentAsync } from "../services/restart-spawn";
|
|
32
32
|
import { cleanProjectToolchain } from "../project-toolchain";
|
|
33
33
|
import { cleanHostTools } from "../host-tools";
|
|
@@ -215,8 +215,17 @@ function orchestratorSelfReportDenied(req: Request, orchestratorId: string): Res
|
|
|
215
215
|
return error("forbidden: only the orchestrator itself may report its host state", 403);
|
|
216
216
|
}
|
|
217
217
|
|
|
218
|
+
// #2410 — the list is polled by every open dashboard and the per-host `providerCatalog` (a
|
|
219
|
+
// deprecated host snapshot, stored in the row and again in `meta`) was ~85% of a 515 KB response
|
|
220
|
+
// nothing reads: the hub owns the model catalog. It stays on the row (`GET /:id`) and in the DB.
|
|
221
|
+
function withoutHostCatalog(orch: Orchestrator): Orchestrator {
|
|
222
|
+
const { providerCatalog: _snapshot, ...row } = orch;
|
|
223
|
+
const { providerCatalog: _metaSnapshot, ...meta } = orch.meta;
|
|
224
|
+
return { ...row, meta };
|
|
225
|
+
}
|
|
226
|
+
|
|
218
227
|
export const getOrchestrators: Handler = async () => {
|
|
219
|
-
return json(await listOrchestratorsAsync());
|
|
228
|
+
return json((await listOrchestratorsAsync()).map(withoutHostCatalog));
|
|
220
229
|
};
|
|
221
230
|
|
|
222
231
|
export const getOrchestratorById: Handler = async (_req, params) => {
|
|
@@ -239,7 +248,7 @@ export const postOrchestratorHeartbeat: Handler = async (req, params) => {
|
|
|
239
248
|
const parsed = await parseBody<unknown>(req);
|
|
240
249
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
241
250
|
try {
|
|
242
|
-
const denied = authorizeRoute(req, { scope: "command:write", resource: { orchestratorId: params.id! } });
|
|
251
|
+
const denied = (await authorizeRoute(req, { scope: "command:write", resource: { orchestratorId: params.id! } }));
|
|
243
252
|
if (denied) return denied;
|
|
244
253
|
// #1797 round 2 (F1) — same self-report claim as the roster PATCH: this writes the host's
|
|
245
254
|
// reported version/providers/capabilities, which the upgrade reconcile then acts on.
|
|
@@ -292,7 +301,7 @@ export const patchOrchestratorAgents: Handler = async (req, params) => {
|
|
|
292
301
|
try {
|
|
293
302
|
const orch = getOrchestrator(params.id!);
|
|
294
303
|
if (!orch) return error("orchestrator not found", 404);
|
|
295
|
-
const denied = authorizeRoute(req, { scope: "command:write", resource: { orchestratorId: orch.id } });
|
|
304
|
+
const denied = (await authorizeRoute(req, { scope: "command:write", resource: { orchestratorId: orch.id } }));
|
|
296
305
|
if (denied) return denied;
|
|
297
306
|
// #1797 round 2 (F1) — this roster IS the input to the managed-state reconcile; the scope +
|
|
298
307
|
// resource check above cannot establish that the caller IS this orchestrator. See the helper.
|
|
@@ -344,7 +353,7 @@ export const patchOrchestratorAgents: Handler = async (req, params) => {
|
|
|
344
353
|
if (queuedSpawns) {
|
|
345
354
|
for (const queued of queuedSpawns) {
|
|
346
355
|
if (!queued.spawnedBy) continue;
|
|
347
|
-
notifyAgentSpawnQueued({
|
|
356
|
+
await notifyAgentSpawnQueued({
|
|
348
357
|
parent: queued.spawnedBy,
|
|
349
358
|
spawnRequestId: queued.spawnRequestId,
|
|
350
359
|
provider: queued.provider,
|
|
@@ -357,7 +366,7 @@ export const patchOrchestratorAgents: Handler = async (req, params) => {
|
|
|
357
366
|
// between the ack and this call, so reconciles still run in request order. Running it after
|
|
358
367
|
// the exit-audit loop below (which awaits the async gateway per exited agent) let a stale,
|
|
359
368
|
// superseded roster from a slow request land AFTER a newer report's reconcile and overwrite it.
|
|
360
|
-
getLifecycleManager().onOrchestratorManagedAgentsReported(params.id!, cleaned, exitedAgents);
|
|
369
|
+
(await getLifecycleManager().onOrchestratorManagedAgentsReported(params.id!, cleaned, exitedAgents));
|
|
361
370
|
for (const exited of exitedAgents) {
|
|
362
371
|
const agent = await recordAgentExitDiagnosticsAsync(exited.agentId, exited);
|
|
363
372
|
if (agent) {
|
|
@@ -370,7 +379,7 @@ export const patchOrchestratorAgents: Handler = async (req, params) => {
|
|
|
370
379
|
// #636 — classify the death from the captured exit diagnostics + agent state and ride the
|
|
371
380
|
// verdict on the terminal event (also persisted as a crash report inside notifyAgentOffline).
|
|
372
381
|
// Exit diagnostics remain on replay; the shared generation ledger dedups the parent notice.
|
|
373
|
-
notifyAgentOffline(exited.agentId, exitReason(exited), diagnoseReportedExit(agent, exitReason(exited), exited));
|
|
382
|
+
(await notifyAgentOffline(exited.agentId, exitReason(exited), diagnoseReportedExit(agent, exitReason(exited), exited)));
|
|
374
383
|
}
|
|
375
384
|
await auditEvent({
|
|
376
385
|
clientId: [
|
|
@@ -550,9 +559,9 @@ export const postOrchestratorAction: Handler = async (req, params) => {
|
|
|
550
559
|
if (action === "migrate-provider-config") {
|
|
551
560
|
// #1259 — fleet-wide host action: a command:fleet-scoped token may cross its own
|
|
552
561
|
// cwd/orchestrator sandbox pin for this action only.
|
|
553
|
-
const denied = authorizeFleetRoute(req, { orchestratorId: orch.id });
|
|
562
|
+
const denied = (await authorizeFleetRoute(req, { orchestratorId: orch.id }));
|
|
554
563
|
if (denied) return denied;
|
|
555
|
-
const command = dispatchProviderConfigMigration(orch, "dashboard");
|
|
564
|
+
const command = (await dispatchProviderConfigMigration(orch, "dashboard"));
|
|
556
565
|
if (!command) return error(`orchestrator ${orch.id} does not support provider-config migration; upgrade it first`, 409);
|
|
557
566
|
await auditEvent({
|
|
558
567
|
clientId: `server-orchestrator-migrate-provider-config-${orch.id}-${command.id}`,
|
|
@@ -570,7 +579,7 @@ export const postOrchestratorAction: Handler = async (req, params) => {
|
|
|
570
579
|
if (action === "upgrade") {
|
|
571
580
|
// #1259 — fleet-wide host action: a command:fleet-scoped token may cross its own
|
|
572
581
|
// cwd/orchestrator sandbox pin for this action only.
|
|
573
|
-
const denied = authorizeFleetRoute(req, { orchestratorId: orch.id });
|
|
582
|
+
const denied = (await authorizeFleetRoute(req, { orchestratorId: orch.id }));
|
|
574
583
|
if (denied) return denied;
|
|
575
584
|
const targetVersion = cleanString(parsed.body.targetVersion, "targetVersion", { max: 80 }) ?? VERSION;
|
|
576
585
|
if (!ORCH_UPGRADE_SEMVER_RE.test(targetVersion)) return error("targetVersion must be a semver like 0.10.20");
|
|
@@ -624,7 +633,7 @@ export const postOrchestratorAction: Handler = async (req, params) => {
|
|
|
624
633
|
...(mode === "git-checkout" ? { mode, commitSha, repoUrl } : (npmReuseRepoUrl ? { repoUrl: npmReuseRepoUrl } : {})),
|
|
625
634
|
},
|
|
626
635
|
});
|
|
627
|
-
|
|
636
|
+
await setOrchestratorUpgradeStateAsync(orch.id, {
|
|
628
637
|
desiredVersion: targetVersion, ...(mode === "git-checkout" && commitSha ? { targetGitSha: commitSha } : {}),
|
|
629
638
|
status: "pending",
|
|
630
639
|
commandId: command.id,
|
|
@@ -657,8 +666,8 @@ export const postOrchestratorAction: Handler = async (req, params) => {
|
|
|
657
666
|
// command:fleet; "shutdown" is NOT in that enumeration and stays on the constrained path.
|
|
658
667
|
const resource = { orchestratorId: orch.id, agentId, policyName, spawnRequestId };
|
|
659
668
|
const denied = action === "restart"
|
|
660
|
-
? authorizeFleetRoute(req, resource)
|
|
661
|
-
: authorizeRoute(req, { scope: "command:write", resource });
|
|
669
|
+
? (await authorizeFleetRoute(req, resource))
|
|
670
|
+
: (await authorizeRoute(req, { scope: "command:write", resource }));
|
|
662
671
|
if (denied) return denied;
|
|
663
672
|
const agent = action === "restart" && agentId ? getAgent(agentId) : undefined;
|
|
664
673
|
const restartSpawn = agent ? await restartSpawnParamsForAgentAsync(agent, orch, policyName, spawnRequestId) : undefined;
|
|
@@ -690,10 +699,10 @@ export const postOrchestratorAction: Handler = async (req, params) => {
|
|
|
690
699
|
}
|
|
691
700
|
};
|
|
692
701
|
|
|
693
|
-
export const deleteOrchestratorById: Handler = (req, params) => {
|
|
694
|
-
const denied = authorizeRoute(req, { scope: "system:admin", resource: { orchestratorId: params.id! } });
|
|
702
|
+
export const deleteOrchestratorById: Handler = async (req, params) => {
|
|
703
|
+
const denied = (await authorizeRoute(req, { scope: "system:admin", resource: { orchestratorId: params.id! } }));
|
|
695
704
|
if (denied) return denied;
|
|
696
|
-
const deleted =
|
|
705
|
+
const deleted = (await deleteOrchestratorAsync(params.id!));
|
|
697
706
|
if (!deleted) return error("orchestrator not found", 404);
|
|
698
707
|
return json({ ok: true });
|
|
699
708
|
};
|
package/src/routes/pairs.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { sendPairMessageAsync, rejectPairAsync, endPairAsync, createPairAsync, acceptPairAsync, getPairAsync, listPairsAsync } from "../db/pairs-async";
|
|
1
2
|
// Auto-split from routes.ts (#299). Domain: pairs.
|
|
2
3
|
import { MAX_BODY_BYTES } from "../config";
|
|
3
|
-
import { ValidationError,
|
|
4
|
+
import { ValidationError, getPair, listAgents, listPairs } from "../db";
|
|
4
5
|
import { resolveCallerAgentId } from "../agent-ref";
|
|
5
6
|
import { getComponentAuth, hasComponentScope } from "../security";
|
|
6
7
|
import { auditEvent, authorizeRoute, error, json, parseBody, type Handler } from "./_shared";
|
|
@@ -59,7 +60,7 @@ export const postPair: Handler = async (req) => {
|
|
|
59
60
|
const parsed = await parseBody<unknown>(req);
|
|
60
61
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
61
62
|
try {
|
|
62
|
-
const result =
|
|
63
|
+
const result = (await createPairAsync(normalizeCreatePairInput(parsed.body)));
|
|
63
64
|
if (!result.ok) return pairError(result);
|
|
64
65
|
emitNewMessage(result.invite);
|
|
65
66
|
await auditEvent({
|
|
@@ -96,7 +97,7 @@ export const getPairs: Handler = async (req) => {
|
|
|
96
97
|
? resolveCallerAgentId(component.constraints, listAgents)
|
|
97
98
|
: undefined;
|
|
98
99
|
if (!(agentId && callerAgentId === agentId && component && hasComponentScope(component, "agent:read"))) {
|
|
99
|
-
const denied = authorizeRoute(req, { scope: "pairs:read" });
|
|
100
|
+
const denied = (await authorizeRoute(req, { scope: "pairs:read" }));
|
|
100
101
|
if (denied) return denied;
|
|
101
102
|
}
|
|
102
103
|
|
|
@@ -115,7 +116,7 @@ export const postAcceptPair: Handler = async (req, params) => {
|
|
|
115
116
|
const parsed = await parseBody<unknown>(req);
|
|
116
117
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
117
118
|
try {
|
|
118
|
-
const result =
|
|
119
|
+
const result = (await acceptPairAsync(params.id!, normalizePairActionInput(parsed.body)));
|
|
119
120
|
if (!result.ok) return pairError(result);
|
|
120
121
|
for (const notice of result.notices) emitNewMessage(notice);
|
|
121
122
|
await auditEvent({
|
|
@@ -140,7 +141,7 @@ export const postRejectPair: Handler = async (req, params) => {
|
|
|
140
141
|
const parsed = await parseBody<unknown>(req);
|
|
141
142
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
142
143
|
try {
|
|
143
|
-
const result =
|
|
144
|
+
const result = (await rejectPairAsync(params.id!, normalizePairActionInput(parsed.body)));
|
|
144
145
|
if (!result.ok) return pairError(result);
|
|
145
146
|
emitNewMessage(result.notice);
|
|
146
147
|
await auditEvent({
|
|
@@ -165,7 +166,7 @@ export const postHangupPair: Handler = async (req, params) => {
|
|
|
165
166
|
const parsed = await parseBody<unknown>(req);
|
|
166
167
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
167
168
|
try {
|
|
168
|
-
const result =
|
|
169
|
+
const result = (await endPairAsync(params.id!, normalizePairActionInput(parsed.body)));
|
|
169
170
|
if (!result.ok) return pairError(result);
|
|
170
171
|
if (result.notice) emitNewMessage(result.notice);
|
|
171
172
|
await auditEvent({
|
|
@@ -190,7 +191,7 @@ export const postPairMessage: Handler = async (req, params) => {
|
|
|
190
191
|
const parsed = await parseBody<unknown>(req);
|
|
191
192
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
192
193
|
try {
|
|
193
|
-
const result =
|
|
194
|
+
const result = (await sendPairMessageAsync(params.id!, normalizePairMessageInput(parsed.body)));
|
|
194
195
|
if (!result.ok) return pairError(result);
|
|
195
196
|
emitNewMessage(result.message);
|
|
196
197
|
await auditEvent({
|
|
@@ -211,4 +212,3 @@ export const postPairMessage: Handler = async (req, params) => {
|
|
|
211
212
|
throw e;
|
|
212
213
|
}
|
|
213
214
|
};
|
|
214
|
-
import { getPairAsync, listPairsAsync } from "../db/pairs-async";
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { cleanString } from "../validation";
|
|
2
|
+
import { ValidationError } from "../db/connection";
|
|
3
|
+
import { authorizeRoute, error, json, parseBody, type Handler } from "./_shared";
|
|
4
|
+
import { authContextFromRequest } from "../services/auth-context";
|
|
5
|
+
import { PromptVersionConflictError } from "../prompt-version-errors";
|
|
6
|
+
import { listProjectProfileInstructions, mutateProjectProfileInstructions, projectProfileInstructionHistory, readProjectProfileInstructions } from "../services/project-profile-instructions";
|
|
7
|
+
|
|
8
|
+
export const projectProfileInstructionsRoute: Handler = async (req, params) => {
|
|
9
|
+
const denied = (await authorizeRoute(req, { scope: req.method === "GET" ? "agent:read" : "agent:write" }));
|
|
10
|
+
if (denied) return denied;
|
|
11
|
+
try {
|
|
12
|
+
const projectId = cleanString(params.id, "projectId", { max: 200 });
|
|
13
|
+
const profile = cleanString(params.profile ?? params.name, "profile", { max: 200 });
|
|
14
|
+
if (!projectId || !profile) return json(await listProjectProfileInstructions({ projectId, profile }));
|
|
15
|
+
const path = new URL(req.url).pathname;
|
|
16
|
+
if (req.method === "GET") return json(path.endsWith("/history")
|
|
17
|
+
? await projectProfileInstructionHistory(projectId, profile)
|
|
18
|
+
: await readProjectProfileInstructions(projectId, profile));
|
|
19
|
+
const body = await parseBody<unknown>(req);
|
|
20
|
+
if (!body.ok) return error(body.error, body.status);
|
|
21
|
+
return json(await mutateProjectProfileInstructions(authContextFromRequest(req), projectId, profile, body.body, path.endsWith("/restore")));
|
|
22
|
+
} catch (err) {
|
|
23
|
+
if (err instanceof PromptVersionConflictError) return json({ error: err.message, current: err.current }, 409);
|
|
24
|
+
if (err instanceof ValidationError) return error(err.message, /not found/.test(err.message) ? 404 : 400);
|
|
25
|
+
throw err;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// code runs, and built-in profiles are admin-edited anyway.
|
|
6
6
|
import { isRecord } from "@humwick/sdk";
|
|
7
7
|
import { ValidationError } from "../db";
|
|
8
|
-
import { approveProfileProjectTrust, PROJECT_REVIEW_MODES, PROJECT_TRUST_CAPABILITIES,
|
|
8
|
+
import { approveProfileProjectTrust, PROJECT_REVIEW_MODES, PROJECT_TRUST_CAPABILITIES, updateProfileProjectTrustAsync } from "../services/profile-trust";
|
|
9
9
|
import { cleanString, optionalEnum } from "../validation";
|
|
10
10
|
import { auditEvent, error, isAdminRequest, json, normalizeConfigPathParam, parseBody, requestUserAddress, type Handler } from "./_shared";
|
|
11
11
|
import { getAgentProfile } from "../config-store";
|
|
@@ -32,7 +32,7 @@ export const postProjectTrustApproveRoute: Handler = async (req, params) => {
|
|
|
32
32
|
const mode = optionalEnum(body.mode, "mode", ["fingerprint", "commit"] as const);
|
|
33
33
|
if (mode && !approvedValue.startsWith(mode === "commit" ? "commit:" : "sha256:")) return error(`approved value must be prefixed "${mode === "commit" ? "commit:" : "sha256:"}" for ${mode} review`, 400);
|
|
34
34
|
|
|
35
|
-
const approval = approveProfileProjectTrust({ name, capability, repoKey, value: approvedValue, by: requestUserAddress(req) });
|
|
35
|
+
const approval = (await approveProfileProjectTrust({ name, capability, repoKey, value: approvedValue, by: requestUserAddress(req) }));
|
|
36
36
|
await auditEvent({
|
|
37
37
|
kind: "state",
|
|
38
38
|
title: `Project trust approved: ${name} / ${capability}`,
|
|
@@ -57,7 +57,7 @@ export const patchProjectTrustRoute: Handler = async (req, params) => {
|
|
|
57
57
|
if (body.ack !== undefined && !Array.isArray(body.ack)) return error("ack must be an array of hooks|mcp", 400);
|
|
58
58
|
const ack = (body.ack as unknown[] | undefined)?.map((capability) => optionalEnum(capability, "ack", PROJECT_TRUST_CAPABILITIES)!);
|
|
59
59
|
const by = requestUserAddress(req);
|
|
60
|
-
const saved =
|
|
60
|
+
const saved = await updateProfileProjectTrustAsync(name, { ...(review ? { review } : {}), ...(ack ? { ack } : {}) }, by);
|
|
61
61
|
await auditEvent({
|
|
62
62
|
kind: "state",
|
|
63
63
|
title: `Project trust updated: ${saved.value.name}`,
|