@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/operator-alarm.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createActivityEventWithResult } from "./db";
|
|
2
|
+
import { createActivityEventByClientIdAsync } from "./db/activity-async";
|
|
2
3
|
import { emitRelayEvent } from "./events";
|
|
3
4
|
|
|
4
5
|
export interface OperatorAlarmInput {
|
|
@@ -20,22 +21,33 @@ export interface OperatorAlarmInput {
|
|
|
20
21
|
// done. This raises a distinct `operator.alarm` relay event (dashboard banner) plus a
|
|
21
22
|
// persisted `operator`-kind activity event, so a relay with no reachable escalation target
|
|
22
23
|
// is observable instead of looping forever in the dark.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
24
|
+
const alarmEvent = (input: OperatorAlarmInput) => ({
|
|
25
|
+
clientId: input.clientId,
|
|
26
|
+
kind: "operator" as const,
|
|
27
|
+
title: input.subject,
|
|
28
|
+
body: input.detail,
|
|
29
|
+
icon: "ti-alert-octagon",
|
|
30
|
+
view: input.view ?? "orchestrators",
|
|
31
|
+
metadata: { source: input.source, operatorAlarm: true, ...(input.metadata ?? {}) },
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
function emitAlarm(input: OperatorAlarmInput): void {
|
|
34
35
|
emitRelayEvent({
|
|
35
36
|
type: "operator.alarm",
|
|
36
37
|
source: input.source,
|
|
37
38
|
subject: input.subject,
|
|
38
39
|
data: { subject: input.subject, detail: input.detail, ...(input.metadata ?? {}) },
|
|
39
40
|
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function raiseOperatorAlarm(input: OperatorAlarmInput): Promise<boolean> {
|
|
44
|
+
return raiseOperatorAlarmAsync(input);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Same as `raiseOperatorAlarm`, with the activity row written on the writer thread. */
|
|
48
|
+
export async function raiseOperatorAlarmAsync(input: OperatorAlarmInput): Promise<boolean> {
|
|
49
|
+
const { created } = await createActivityEventByClientIdAsync(alarmEvent(input));
|
|
50
|
+
if (input.dedupeEvent && !created) return false;
|
|
51
|
+
emitAlarm(input);
|
|
40
52
|
return true;
|
|
41
53
|
}
|
package/src/project-ingest.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
|
-
import {
|
|
2
|
+
import { listProjectEntriesAsync, rootsForProjectAsync, retractProjectEntryAsync, writeProjectEntryAsync } from "./db";
|
|
3
3
|
import { projectFileRoots, readProjectRootFile } from "./project-file-source";
|
|
4
4
|
import type { ProjectEntry } from "./types";
|
|
5
5
|
|
|
@@ -117,7 +117,7 @@ export async function ingestClaudeMd(projectId: string, authorId: string): Promi
|
|
|
117
117
|
// Index prior *ingested* entries by origin_ref (newest active wins). We only ever
|
|
118
118
|
// read source:'ingested' here — manual/promoted are invisible to ingest by design.
|
|
119
119
|
const byOrigin = new Map<string, ProjectEntry>();
|
|
120
|
-
for (const entry of
|
|
120
|
+
for (const entry of await listProjectEntriesAsync(projectId)) {
|
|
121
121
|
if (entry.source !== "ingested" || !entry.originRef) continue;
|
|
122
122
|
if (!byOrigin.has(entry.originRef)) byOrigin.set(entry.originRef, entry);
|
|
123
123
|
}
|
|
@@ -128,7 +128,7 @@ export async function ingestClaudeMd(projectId: string, authorId: string): Promi
|
|
|
128
128
|
let updated = 0;
|
|
129
129
|
let unchanged = 0;
|
|
130
130
|
|
|
131
|
-
const registered = projectFileRoots(
|
|
131
|
+
const registered = projectFileRoots(await rootsForProjectAsync(projectId));
|
|
132
132
|
if (!registered.length && byOrigin.size) throw new Error(`no confirmed checkout host owns project ${projectId}`);
|
|
133
133
|
for (const root of registered) {
|
|
134
134
|
let filePath = join(root.rootPath, INGEST_FILENAME);
|
|
@@ -153,7 +153,7 @@ export async function ingestClaudeMd(projectId: string, authorId: string): Promi
|
|
|
153
153
|
unchanged++;
|
|
154
154
|
continue;
|
|
155
155
|
}
|
|
156
|
-
|
|
156
|
+
await writeProjectEntryAsync({
|
|
157
157
|
projectId,
|
|
158
158
|
authorId,
|
|
159
159
|
kind: "rule",
|
|
@@ -166,7 +166,7 @@ export async function ingestClaudeMd(projectId: string, authorId: string): Promi
|
|
|
166
166
|
});
|
|
167
167
|
updated++;
|
|
168
168
|
} else {
|
|
169
|
-
|
|
169
|
+
await writeProjectEntryAsync({
|
|
170
170
|
projectId,
|
|
171
171
|
authorId,
|
|
172
172
|
kind: "rule",
|
|
@@ -187,7 +187,7 @@ export async function ingestClaudeMd(projectId: string, authorId: string): Promi
|
|
|
187
187
|
let retracted = 0;
|
|
188
188
|
for (const [originRef, entry] of byOrigin) {
|
|
189
189
|
if (seen.has(originRef)) continue;
|
|
190
|
-
|
|
190
|
+
await retractProjectEntryAsync(entry.id);
|
|
191
191
|
retracted++;
|
|
192
192
|
}
|
|
193
193
|
|
|
@@ -2,6 +2,7 @@ import { composeMemoryPreambleAsync } from "./memory-preamble-async";
|
|
|
2
2
|
import { composeHostAwareness } from "./host-awareness";
|
|
3
3
|
import { composeGuideIndex } from "./guides";
|
|
4
4
|
import { profileInstructionBlocks } from "./profile-instruction-blocks";
|
|
5
|
+
import { projectProfileInstructionBlock } from "./project-profile-instructions";
|
|
5
6
|
// Spawn-time instruction sources (#557) — the relay-owned composer that assembles what a spawned
|
|
6
7
|
// agent's systemPromptAppend says, from declared sources only, never from host CLAUDE.md.
|
|
7
8
|
//
|
|
@@ -261,6 +262,13 @@ export function stripHumwickIdentitySection(value: string): string {
|
|
|
261
262
|
.replace(/\n\n+$/, "");
|
|
262
263
|
}
|
|
263
264
|
|
|
265
|
+
/** The relay-owned marked sections a prompt carries on top of the startup blocks: identity, memory
|
|
266
|
+
* and journal. The ONE strip every reader of a launched prompt uses, so a block added here (#3782:
|
|
267
|
+
* the journal) cannot be forgotten by one of them. */
|
|
268
|
+
export function stripRelayOwnedSections(value: string): string {
|
|
269
|
+
return stripJournalPreamble(stripMemoryPreamble(stripHumwickIdentitySection(value)));
|
|
270
|
+
}
|
|
271
|
+
|
|
264
272
|
export function composeSpawnInstructionsWithEvents(input: {
|
|
265
273
|
/** Resolved fact from the selected profile's Project Instructions cell. Absent fails closed. */
|
|
266
274
|
projectInstructionsEnabled?: boolean;
|
|
@@ -283,6 +291,7 @@ export function composeSpawnInstructionsWithEvents(input: {
|
|
|
283
291
|
* host → project`, audience-filtered by `profile`). Absent → no memory block at all, so a
|
|
284
292
|
* caller that does not know the identity produces a byte-identical pre-#1565 spawn. */
|
|
285
293
|
memoryIdentity?: MemoryIdentity;
|
|
294
|
+
projectId?: string;
|
|
286
295
|
profile?: Pick<AgentProfile, "instructions" | "maxSpawnedAgents" | "hostAwareness" | "roleAssets"> & { name?: string; relay?: AgentProfile["relay"] };
|
|
287
296
|
spawnedBy?: string;
|
|
288
297
|
/** #3045 — a workflow step agent: its step reporting block replaces the spawned-child report-up. */
|
|
@@ -475,6 +484,8 @@ export function composeSpawnInstructionsWithEvents(input: {
|
|
|
475
484
|
const { system: profileSystem, append: profileAppend } = profileInstructionBlocks(input.profile, input.memoryIdentity?.provider);
|
|
476
485
|
if (profileSystem) appendBlocks.push(profileSystem);
|
|
477
486
|
appendBlocks.push(...profileAppend);
|
|
487
|
+
const projectProfile = projectProfileInstructionBlock(input.projectId ?? input.memoryIdentity?.projectId, input.profile?.name ?? input.memoryIdentity?.profile);
|
|
488
|
+
if (projectProfile) { appendBlocks.push(projectProfile.content); relayInjectionEvents.push(projectProfile.event); }
|
|
478
489
|
// After the profile, so the step rule is the last word over a charter's report-to-spawner text.
|
|
479
490
|
if (input.workflowRunId) {
|
|
480
491
|
const instruction = renderTemplate("spawn.reportup.workflow-step", { runId: input.workflowRunId });
|
|
@@ -522,7 +533,7 @@ export function composeSpawnInstructionsWithEvents(input: {
|
|
|
522
533
|
// strict about what it removes, so a brief that merely mentions a marker survives intact — and
|
|
523
534
|
// neutralizing what survives keeps it from being read as this prompt's memory/journal block later.
|
|
524
535
|
const callerSystemPromptAppend = input.callerSystemPromptAppend
|
|
525
|
-
? neutralizeJournalMarkers(neutralizeMemoryMarkers(
|
|
536
|
+
? neutralizeJournalMarkers(neutralizeMemoryMarkers(stripRelayOwnedSections(input.callerSystemPromptAppend)))
|
|
526
537
|
: undefined;
|
|
527
538
|
if (callerSystemPromptAppend?.trim()) {
|
|
528
539
|
appendBlocks.push(callerSystemPromptAppend);
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { assertNoControlBytes, ValidationError } from "@humwick/sdk";
|
|
2
|
+
|
|
3
|
+
export function validateProjectProfileInstructionText(value: unknown, source: string): asserts value is string {
|
|
4
|
+
if (typeof value !== "string" || value.length > 16_000) throw new ValidationError(`${source} must be a string up to 16000 characters`);
|
|
5
|
+
assertNoControlBytes(value, source);
|
|
6
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { errMessage } from "@humwick/sdk";
|
|
2
|
+
import { getProjectProfileInstructions } from "./db/project-profile-instructions";
|
|
3
|
+
import { validateProjectProfileInstructionText } from "./project-profile-instruction-text";
|
|
4
|
+
|
|
5
|
+
/** #3515 — one optional block at the charter seam, independent of project memory's switch. */
|
|
6
|
+
export function projectProfileInstructionBlock(projectId: string | undefined, profile: string | undefined) {
|
|
7
|
+
if (!projectId || !profile) return;
|
|
8
|
+
const source = `project ${projectId} profile ${profile} instructions`;
|
|
9
|
+
try {
|
|
10
|
+
const entry = getProjectProfileInstructions({ projectId, profile });
|
|
11
|
+
validateProjectProfileInstructionText(entry.template, source);
|
|
12
|
+
const content = entry.template.trim();
|
|
13
|
+
if (!content) return;
|
|
14
|
+
return { content, event: { category: "instructions" as const,
|
|
15
|
+
summary: `injected ${source} v${entry.version}`,
|
|
16
|
+
detail: { source: "project-profile-instructions", projectId, profile, version: entry.version, content } } };
|
|
17
|
+
} catch (error) {
|
|
18
|
+
console.warn(`[launch] skipped ${source}: ${errMessage(error)}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
package/src/project-trust.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { upsertProjectTrustApprovalAsync } from "./db/runtime-tail-async";
|
|
1
2
|
import { createHash } from "node:crypto";
|
|
2
3
|
import { resolve } from "node:path";
|
|
3
4
|
import { shellEscape, ValidationError, type AgentProfile, type ProfileAssetCell, type ProfileProjectCells, type ProfileProjectGate, type ProfileProjectReviewMode, type ProfileProjectTrustScope, type Project } from "@humwick/sdk";
|
|
4
5
|
import { rootsForProject, resolveProjectForCwd } from "./db/projects";
|
|
5
|
-
import { getProjectTrustApproval,
|
|
6
|
+
import { getProjectTrustApproval, type ProjectTrustApproval, type ProjectTrustCapability } from "./db/project-trust-approvals";
|
|
6
7
|
import { observeCapabilityReview } from "./project-trust-fingerprint";
|
|
7
8
|
import { canonicalRoot } from "./services/canonical-root";
|
|
8
9
|
import { isPathWithinBase } from "./utils";
|
|
@@ -35,26 +36,26 @@ function repoKeyFor(cwd: string): string {
|
|
|
35
36
|
/** Records `approvedValue` (a `sha256:<hex>` or `commit:<sha>`, matching `mode`) as trusted for
|
|
36
37
|
* this (profile, repo, capability) — the dashboard/API one-click approve action. Format-validated
|
|
37
38
|
* here so a malformed value can never be written through the trust store's only public writer. */
|
|
38
|
-
export function approveProjectCapabilityReview(input: {
|
|
39
|
+
export async function approveProjectCapabilityReview(input: {
|
|
39
40
|
profileName: string;
|
|
40
41
|
repoKey: string;
|
|
41
42
|
capability: ProjectCapability;
|
|
42
43
|
mode: "fingerprint" | "commit";
|
|
43
44
|
approvedValue: string;
|
|
44
45
|
approvedBy: string;
|
|
45
|
-
}): ProjectTrustApproval {
|
|
46
|
+
}): Promise<ProjectTrustApproval> {
|
|
46
47
|
const prefix = input.mode === "commit" ? "commit:" : "sha256:";
|
|
47
48
|
if (!input.approvedValue.startsWith(prefix)) {
|
|
48
49
|
throw new ValidationError(`approved value must be prefixed "${prefix}" for ${input.mode} review`);
|
|
49
50
|
}
|
|
50
|
-
return
|
|
51
|
+
return (await upsertProjectTrustApprovalAsync({
|
|
51
52
|
profileName: input.profileName,
|
|
52
53
|
repoKey: input.repoKey,
|
|
53
54
|
capability: input.capability,
|
|
54
55
|
reviewMode: input.mode,
|
|
55
56
|
approvedValue: input.approvedValue,
|
|
56
57
|
approvedBy: input.approvedBy,
|
|
57
|
-
});
|
|
58
|
+
}));
|
|
58
59
|
}
|
|
59
60
|
|
|
60
61
|
/** Stable JSON is intentionally local to this small trust seam. The hash is an
|
|
@@ -142,13 +143,13 @@ export interface ProjectCapabilityGateOpts {
|
|
|
142
143
|
pinnedMcpCommit?: string;
|
|
143
144
|
}
|
|
144
145
|
|
|
145
|
-
export function projectCapabilityGate(
|
|
146
|
+
export async function projectCapabilityGate(
|
|
146
147
|
profile: AgentProfile,
|
|
147
148
|
capability: ProjectCapability,
|
|
148
149
|
cwd: string,
|
|
149
150
|
registeredProject?: Project | null,
|
|
150
151
|
opts?: ProjectCapabilityGateOpts,
|
|
151
|
-
): ProfileProjectGate {
|
|
152
|
+
): Promise<ProfileProjectGate> {
|
|
152
153
|
const project = profile.sources?.project;
|
|
153
154
|
const cell = capabilityCell(profile, capability);
|
|
154
155
|
if (!project || !cell?.enabled) {
|
|
@@ -238,7 +239,7 @@ export function projectCapabilityGate(
|
|
|
238
239
|
// approved instead of failing closed, so shipping G3 does not instantly regress every
|
|
239
240
|
// already-trusted profile. Only a SUBSEQUENT change (a different observed value) fails
|
|
240
241
|
// closed from here on.
|
|
241
|
-
|
|
242
|
+
(await upsertProjectTrustApprovalAsync({ profileName: profile.name, repoKey, capability, reviewMode: mode, approvedValue: observed, approvedBy: "system:grandfathered" }));
|
|
242
243
|
return { allowed: true, reason: "allowed", detail: gateDetail(capability, `${scopeDetail} (grandfathered ${observed})`), observed, repoKey, reviewMode: mode };
|
|
243
244
|
}
|
|
244
245
|
// `commit` review has no grandfather: it is the stricter opt-in mode, so first encounter
|
|
@@ -254,9 +255,9 @@ export function projectCapabilityGate(
|
|
|
254
255
|
/** Stamp the server's per-spawn decisions onto a cloned profile. The source cells
|
|
255
256
|
* remain visible for truthful projection; the runner consumes only these decisions
|
|
256
257
|
* for filesystem materialization. */
|
|
257
|
-
export function applyProjectCapabilityGates(profile: AgentProfile, cwd: string, registeredProject?: Project | null, opts?: ProjectCapabilityGateOpts): AgentProfile {
|
|
258
|
+
export async function applyProjectCapabilityGates(profile: AgentProfile, cwd: string, registeredProject?: Project | null, opts?: ProjectCapabilityGateOpts): Promise<AgentProfile> {
|
|
258
259
|
if (!profile.sources?.project) return profile;
|
|
259
|
-
const hooks = projectCapabilityGate(profile, "hooks", cwd, registeredProject, opts);
|
|
260
|
-
const mcp = projectCapabilityGate(profile, "mcp", cwd, registeredProject, opts);
|
|
260
|
+
const hooks = (await projectCapabilityGate(profile, "hooks", cwd, registeredProject, opts));
|
|
261
|
+
const mcp = (await projectCapabilityGate(profile, "mcp", cwd, registeredProject, opts));
|
|
261
262
|
return { ...profile, projectGates: { hooks, mcp } };
|
|
262
263
|
}
|
package/src/prompt-resolver.ts
CHANGED
|
@@ -250,7 +250,7 @@ const DEFAULT_PROMPT_TEMPLATES = [
|
|
|
250
250
|
"{{context}}",
|
|
251
251
|
"Acceptance — done when:",
|
|
252
252
|
"{{doneWhen}}",
|
|
253
|
-
"",
|
|
253
|
+
"{{afterLand}}",
|
|
254
254
|
"Linked issue spec (resolved server-side once — do NOT re-read GitHub):",
|
|
255
255
|
"{{issues}}",
|
|
256
256
|
"",
|
|
@@ -275,7 +275,7 @@ const DEFAULT_PROMPT_TEMPLATES = [
|
|
|
275
275
|
"{{context}}",
|
|
276
276
|
"Acceptance — done when:",
|
|
277
277
|
"{{doneWhen}}",
|
|
278
|
-
"",
|
|
278
|
+
"{{afterLand}}",
|
|
279
279
|
"Linked issue spec (resolved server-side once — do NOT re-read GitHub):",
|
|
280
280
|
"{{issues}}",
|
|
281
281
|
"",
|
|
@@ -288,7 +288,7 @@ const DEFAULT_PROMPT_TEMPLATES = [
|
|
|
288
288
|
"Latest steer (act on this now):",
|
|
289
289
|
"{{steer}}",
|
|
290
290
|
),
|
|
291
|
-
variables: ["taskId", "title", "status", "stage", "owner", "intent", "context", "doneWhen", "issues", "decisions", "history", "memory", "steer"],
|
|
291
|
+
variables: ["taskId", "title", "status", "stage", "owner", "intent", "context", "doneWhen", "afterLand", "issues", "decisions", "history", "memory", "steer"],
|
|
292
292
|
},
|
|
293
293
|
{
|
|
294
294
|
slug: "context.advisory.warn",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
deriveProviderDisabledState,
|
|
3
3
|
disabledProviderSet,
|
|
4
|
-
|
|
4
|
+
providerMetadataList,
|
|
5
5
|
type ProviderCatalogEntry,
|
|
6
6
|
type ProviderContextThreshold,
|
|
7
7
|
type ProviderEnablementSetting,
|
|
@@ -44,7 +44,7 @@ export interface ProviderModelOverrideInput {
|
|
|
44
44
|
|
|
45
45
|
function listProviderModelOverrides(): ProviderModelOverride[] {
|
|
46
46
|
const rows = getDb()
|
|
47
|
-
.query("SELECT * FROM provider_model_overrides ORDER BY provider ASC,
|
|
47
|
+
.query("SELECT * FROM provider_model_overrides ORDER BY provider ASC, rowid ASC")
|
|
48
48
|
.all() as ProviderModelOverrideRow[];
|
|
49
49
|
return rows.map(rowToOverride).filter((entry): entry is ProviderModelOverride => Boolean(entry));
|
|
50
50
|
}
|
|
@@ -120,7 +120,7 @@ export function setProviderDefaultModel(provider: SpawnProvider, alias: string,
|
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
export function effectiveProviderCatalogList(now = Date.now()): ProviderCatalogEntry[] {
|
|
123
|
-
const catalog = mergeProviderCatalog(
|
|
123
|
+
const catalog = mergeProviderCatalog(providerMetadataList(), listProviderModelOverrides());
|
|
124
124
|
const defaults = getDb().query("SELECT provider, alias FROM provider_model_defaults").all() as Array<{ provider: string; alias: string }>;
|
|
125
125
|
for (const { provider, alias } of defaults) {
|
|
126
126
|
const entry = catalog.find((item) => item.provider === provider);
|
|
@@ -215,9 +215,6 @@ function normalizeOverrideInput(input: ProviderModelOverrideInput): ProviderMode
|
|
|
215
215
|
if (limits) entry.limits = limits;
|
|
216
216
|
else delete entry.limits;
|
|
217
217
|
delete entry.disabled;
|
|
218
|
-
// #368 — unavailable is a static catalog fact (provider-side suspension), not an operator toggle;
|
|
219
|
-
// strip it from DB overrides so an admin can't accidentally clear a catalog-level suspension.
|
|
220
|
-
delete entry.unavailable;
|
|
221
218
|
// #2598 — `deleted` is a row-level tombstone column, never part of a stored entry blob.
|
|
222
219
|
delete (entry as unknown as Record<string, unknown>).deleted;
|
|
223
220
|
return {
|
|
@@ -288,49 +285,6 @@ function allowlistedLimitConfidence(value: unknown): ProviderModelLimitWindow["c
|
|
|
288
285
|
: "declared";
|
|
289
286
|
}
|
|
290
287
|
|
|
291
|
-
/**
|
|
292
|
-
* #2598 — additive, idempotent backfill of every static-catalog model into `provider_model_overrides`,
|
|
293
|
-
* so the whole catalogue is uniformly DB-backed and operator-editable. Rules:
|
|
294
|
-
* - INSERT-ONLY-IF-ABSENT (`ON CONFLICT DO NOTHING`): an existing row — a prior seed OR an operator
|
|
295
|
-
* edit OR an operator delete-tombstone — is never touched, so operator edits ALWAYS win and a
|
|
296
|
-
* deleted static model is never resurrected. Re-runnable; a re-run inserts only genuinely NEW
|
|
297
|
-
* static models (e.g. added by a later release).
|
|
298
|
-
* - SKIP disabled/unavailable static models: materializing them would strip those flags at the
|
|
299
|
-
* write chokepoint (#368/#643) and resurrect a suspended model as spawnable. They stay
|
|
300
|
-
* static-only until an operator explicitly adds them.
|
|
301
|
-
* Stamped `updated_by = <stamp>` (e.g. `seed:<version>`) purely for provenance; precedence is decided
|
|
302
|
-
* by row EXISTENCE, not by parsing the stamp.
|
|
303
|
-
*/
|
|
304
|
-
export function seedProviderModelOverrides(stamp: string, now = Date.now()): { inserted: number } {
|
|
305
|
-
const db = getDb();
|
|
306
|
-
const existing = new Map<string, Set<string>>();
|
|
307
|
-
for (const row of db.query("SELECT provider, alias FROM provider_model_overrides").all() as Array<{ provider: string; alias: string }>) {
|
|
308
|
-
let aliases = existing.get(row.provider);
|
|
309
|
-
if (!aliases) existing.set(row.provider, (aliases = new Set()));
|
|
310
|
-
aliases.add(row.alias);
|
|
311
|
-
}
|
|
312
|
-
let inserted = 0;
|
|
313
|
-
const insert = db.query(`
|
|
314
|
-
INSERT INTO provider_model_overrides (provider, alias, entry, deleted, disabled, updated_at, updated_by)
|
|
315
|
-
VALUES (?, ?, ?, 0, 0, ?, ?)
|
|
316
|
-
ON CONFLICT(provider, alias) DO NOTHING
|
|
317
|
-
`);
|
|
318
|
-
const seed = db.transaction(() => {
|
|
319
|
-
for (const providerEntry of providerCatalogList()) {
|
|
320
|
-
const seen = existing.get(providerEntry.provider);
|
|
321
|
-
for (const model of providerEntry.models) {
|
|
322
|
-
if (model.disabled || model.unavailable) continue;
|
|
323
|
-
if (seen?.has(model.alias)) continue;
|
|
324
|
-
const normalized = normalizeOverrideInput({ provider: providerEntry.provider, alias: model.alias, entry: model, updatedBy: stamp });
|
|
325
|
-
const result = insert.run(normalized.provider, normalized.alias, JSON.stringify(normalized.entry), now, normalized.updatedBy ?? null);
|
|
326
|
-
if (result.changes > 0) inserted++;
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
});
|
|
330
|
-
seed();
|
|
331
|
-
return { inserted };
|
|
332
|
-
}
|
|
333
|
-
|
|
334
288
|
function rowToOverride(row: ProviderModelOverrideRow): ProviderModelOverride | undefined {
|
|
335
289
|
const parsed = parseJson<ProviderModelCatalogEntry | undefined>(row.entry, undefined);
|
|
336
290
|
if (!parsed || typeof parsed.alias !== "string") return undefined;
|
|
@@ -4,7 +4,8 @@ import { hostname } from "node:os";
|
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { ValidationError, listOrchestrators } from "./db";
|
|
6
6
|
import { isSecretEnvKey } from "./db/provider-config-secrets";
|
|
7
|
-
import { getConfig, listConfig
|
|
7
|
+
import { getConfig, listConfig } from "./config-store";
|
|
8
|
+
import { setConfigAsync } from "./config-store-write";
|
|
8
9
|
import { localOrchestratorIdFromEnv, providerConfigHomeFromEnv } from "./config";
|
|
9
10
|
import { cleanString, cleanStringArray, optionalEnum } from "./validation";
|
|
10
11
|
import { emitConfigChanged } from "./sse";
|
|
@@ -90,11 +91,11 @@ export function listProviderConfigEntries(host = defaultProviderConfigHost()): R
|
|
|
90
91
|
) as Record<SpawnProvider, ProviderConfigEntry>;
|
|
91
92
|
}
|
|
92
93
|
|
|
93
|
-
export function
|
|
94
|
+
export async function setProviderConfigAsync(
|
|
94
95
|
provider: string,
|
|
95
96
|
value: unknown,
|
|
96
97
|
opts: { host?: string; updatedBy?: string } = {},
|
|
97
|
-
): ProviderConfigEntry {
|
|
98
|
+
): Promise<ProviderConfigEntry> {
|
|
98
99
|
const cleanProvider = normalizeProviderConfigProvider(provider);
|
|
99
100
|
const host = normalizeProviderConfigHost(opts.host ?? defaultProviderConfigHost());
|
|
100
101
|
const normalized = cleanProviderConfig(cleanProvider, resolveMaskedEnvSentinels(value, host, cleanProvider));
|
|
@@ -102,7 +103,7 @@ export function setProviderConfig(
|
|
|
102
103
|
ensureProviderConfigDescriptors([key]);
|
|
103
104
|
const validation = validateSettingValue(PROVIDER_CONFIG_NAMESPACE, key, normalized);
|
|
104
105
|
if (!validation.valid) throw new ValidationError(validation.errors.join("; "));
|
|
105
|
-
return
|
|
106
|
+
return await setConfigAsync(PROVIDER_CONFIG_NAMESPACE, key, normalized, opts.updatedBy) as ProviderConfigEntry;
|
|
106
107
|
}
|
|
107
108
|
|
|
108
109
|
export function providerConfigPublic(entry: ProviderConfigEntry, opts: { maskEnv?: boolean } = {}): Record<string, unknown> {
|
|
@@ -138,11 +139,11 @@ export function providerConfigPublic(entry: ProviderConfigEntry, opts: { maskEnv
|
|
|
138
139
|
* This is the server-authority write path: callers are in-process (local migration
|
|
139
140
|
* or the orchestrator command-bus result handler), so no HTTP scope is required.
|
|
140
141
|
*/
|
|
141
|
-
export function
|
|
142
|
+
export async function seedProviderConfigsAsync(
|
|
142
143
|
host: string,
|
|
143
144
|
rawByProvider: Record<string, unknown>,
|
|
144
145
|
opts: { legacyHost?: string } = {},
|
|
145
|
-
): ProviderConfigEntry[] {
|
|
146
|
+
): Promise<ProviderConfigEntry[]> {
|
|
146
147
|
const seeded: ProviderConfigEntry[] = [];
|
|
147
148
|
const cleanHost = normalizeProviderConfigHost(host);
|
|
148
149
|
const legacyHost = opts.legacyHost ? normalizeProviderConfigHost(opts.legacyHost) : undefined;
|
|
@@ -159,7 +160,7 @@ export function seedProviderConfigs(
|
|
|
159
160
|
// still validates; the relay owns the schema, the reporter stays dumb.
|
|
160
161
|
const value = legacy?.value ?? { ...providerConfigDefaults(provider), ...(isRecord(raw) ? raw : {}) };
|
|
161
162
|
try {
|
|
162
|
-
const entry =
|
|
163
|
+
const entry = await setProviderConfigAsync(provider, value, { host: cleanHost, updatedBy: `migration:${cleanHost}` });
|
|
163
164
|
emitConfigChanged(entry.namespace, entry.key, entry.version);
|
|
164
165
|
seeded.push(entry);
|
|
165
166
|
} catch {
|
|
@@ -174,16 +175,16 @@ export function seedProviderConfigs(
|
|
|
174
175
|
* owns the stable-id/legacy-hostname resolution together so command routes do
|
|
175
176
|
* not re-parse or accidentally bypass the migration authority rules.
|
|
176
177
|
*/
|
|
177
|
-
export function
|
|
178
|
+
export async function seedMigratedProviderConfigsAsync(result: unknown): Promise<{ host: string; seeded: ProviderConfigEntry[] } | null> {
|
|
178
179
|
if (!isRecord(result)) return null;
|
|
179
180
|
const host = cleanString(result.host, "result.host", { max: 120 });
|
|
180
181
|
const hostname = cleanString(result.hostname, "result.hostname", { max: 120 });
|
|
181
182
|
const configs = isRecord(result.configs) ? result.configs : undefined;
|
|
182
183
|
if (!host || !configs) return null;
|
|
183
|
-
return { host, seeded:
|
|
184
|
+
return { host, seeded: await seedProviderConfigsAsync(host, configs, { legacyHost: hostname }) };
|
|
184
185
|
}
|
|
185
186
|
|
|
186
|
-
export function
|
|
187
|
+
export async function migrateLocalProviderConfigsAsync(home = humwickHome(), host = defaultProviderConfigHost()): Promise<ProviderConfigEntry[]> {
|
|
187
188
|
const dir = join(home, "providers");
|
|
188
189
|
if (!existsSync(dir)) return [];
|
|
189
190
|
const raw: Record<string, unknown> = {};
|
|
@@ -192,7 +193,7 @@ export function migrateLocalProviderConfigs(home = humwickHome(), host = default
|
|
|
192
193
|
if (!VALID_PROVIDER_CONFIGS.includes(provider as SpawnProvider)) continue;
|
|
193
194
|
raw[provider] = loadLocalProviderConfig(provider, home);
|
|
194
195
|
}
|
|
195
|
-
return
|
|
196
|
+
return seedProviderConfigsAsync(host, raw);
|
|
196
197
|
}
|
|
197
198
|
|
|
198
199
|
function normalizeProviderConfigHost(host: string): string {
|
|
@@ -1,18 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { seedProviderModelOverrides } from "./provider-catalog-store";
|
|
3
|
-
import { reconcileClaudeCatalogSeeds } from "./db/claude-catalog-reconcile";
|
|
4
|
-
import { VERSION } from "./config";
|
|
5
|
-
import { errMessage } from "@humwick/sdk";
|
|
6
|
-
|
|
7
|
-
// Stamp only after the transactional seed succeeds so a failure retries next boot.
|
|
8
|
-
export function reconcileProviderModelSeed(): void {
|
|
9
|
-
try {
|
|
10
|
-
reconcileClaudeCatalogSeeds();
|
|
11
|
-
const stamp = `seed:${VERSION}`;
|
|
12
|
-
if (getConfig<string>("system", "provider-model-seed-version")?.value === stamp) return;
|
|
13
|
-
seedProviderModelOverrides(stamp);
|
|
14
|
-
setConfig("system", "provider-model-seed-version", stamp, "server-startup");
|
|
15
|
-
} catch (err) {
|
|
16
|
-
console.warn(`[provider-model-seed] skipped: ${errMessage(err)}`);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
1
|
+
export { reconcileProviderModelSeed, seedProviderModelOverrides } from "./db/provider-model-seed";
|
|
@@ -51,27 +51,25 @@ export async function upsertProviderQuotaAsync(
|
|
|
51
51
|
* Synchronous in-process compatibility wrapper for direct callers and existing tests. Runs the writer
|
|
52
52
|
* body directly (no gateway hop) and fires the returned effects synchronously.
|
|
53
53
|
*/
|
|
54
|
-
export function upsertProviderQuota(input: ProviderQuotaUpdateInput, now = Date.now()): ProviderQuotaRecord {
|
|
55
|
-
const result =
|
|
56
|
-
invalidateProviderQuotaMatrixCache();
|
|
54
|
+
export async function upsertProviderQuota(input: ProviderQuotaUpdateInput, now = Date.now()): Promise<ProviderQuotaRecord> {
|
|
55
|
+
const result = await upsertProviderQuotaAsync(input, { now });
|
|
57
56
|
if (result.outcome.kind !== "stored") throw new Error("provider quota lease not held");
|
|
58
|
-
deliverProviderQuotaEffects(result, { isolate: false });
|
|
59
57
|
return result.outcome.record;
|
|
60
58
|
}
|
|
61
59
|
|
|
62
60
|
/** Fire each event+notification pair in production order; `isolate` logs (not throws) per-pair faults. */
|
|
63
|
-
function deliverProviderQuotaEffects(result: ProviderQuotaUpsertOpResult, options: { isolate: boolean }): void {
|
|
61
|
+
async function deliverProviderQuotaEffects(result: ProviderQuotaUpsertOpResult, options: { isolate: boolean }): Promise<void> {
|
|
64
62
|
for (const effect of result.advisory?.effects ?? []) {
|
|
65
63
|
if (options.isolate) {
|
|
66
64
|
try {
|
|
67
65
|
emitRelayEvent(effect.event);
|
|
68
|
-
if (effect.notification) routeNotification(effect.notification);
|
|
66
|
+
if (effect.notification) await routeNotification(effect.notification);
|
|
69
67
|
} catch (error) {
|
|
70
68
|
console.error("provider quota post-commit effect failed", error);
|
|
71
69
|
}
|
|
72
70
|
} else {
|
|
73
71
|
emitRelayEvent(effect.event);
|
|
74
|
-
if (effect.notification) routeNotification(effect.notification);
|
|
72
|
+
if (effect.notification) await routeNotification(effect.notification);
|
|
75
73
|
}
|
|
76
74
|
}
|
|
77
75
|
}
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
// provider *spawn* config (provider-config-store.ts) by design — different scope,
|
|
10
10
|
// different cardinality.
|
|
11
11
|
import { ValidationError } from "./db";
|
|
12
|
-
import { getConfig, listConfig
|
|
12
|
+
import { getConfig, listConfig } from "./config-store";
|
|
13
|
+
import { setConfigAsync } from "./config-store-write";
|
|
13
14
|
import { emitConfigChanged } from "./sse";
|
|
14
15
|
import {
|
|
15
16
|
DEFAULT_PROVIDER_QUOTA_CONFIG,
|
|
@@ -47,14 +48,14 @@ export function listProviderQuotaConfigs(): ProviderQuotaConfigMap {
|
|
|
47
48
|
* clamped to 5m–15m, unset fields defaulted), so a partial body still validates.
|
|
48
49
|
* Emits `config.changed` so the orchestrator + dashboard pick it up live.
|
|
49
50
|
*/
|
|
50
|
-
export function
|
|
51
|
+
export async function setProviderQuotaConfigAsync(
|
|
51
52
|
provider: string,
|
|
52
53
|
value: unknown,
|
|
53
54
|
opts: { updatedBy?: string } = {},
|
|
54
|
-
): ProviderQuotaConfig {
|
|
55
|
+
): Promise<ProviderQuotaConfig> {
|
|
55
56
|
const clean = assertValidProvider(provider);
|
|
56
57
|
const normalized = normalizeProviderQuotaConfig(value);
|
|
57
|
-
const entry =
|
|
58
|
+
const entry = await setConfigAsync(PROVIDER_QUOTA_CONFIG_NAMESPACE, clean, normalized, opts.updatedBy);
|
|
58
59
|
emitConfigChanged(entry.namespace, entry.key, entry.version);
|
|
59
60
|
return normalized;
|
|
60
61
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getDb } from "./db";
|
|
2
|
-
import {
|
|
2
|
+
import { setProviderConfigAsync } from "./provider-config-store";
|
|
3
3
|
|
|
4
4
|
// #3402 — fake values under every key name the hub's central provider config holds, plus one no masking
|
|
5
5
|
// list knows, so a test proves masking follows the configured values rather than key names.
|
|
@@ -25,9 +25,9 @@ export function leakedProviderSecrets(text: string): string[] {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
/** Seeds the central provider config of `host` and returns its rows the way `sqlite3 ... select` prints them. */
|
|
28
|
-
export function seedProviderSecrets(host: string): string {
|
|
28
|
+
export async function seedProviderSecrets(host: string): Promise<string> {
|
|
29
29
|
for (const [provider, env] of Object.entries(PROVIDER_SECRET_ENV)) {
|
|
30
|
-
|
|
30
|
+
await setProviderConfigAsync(provider, { command: provider, env: { ...env, OPENCODE_CONFIG: "/srv/opencode.json" } }, { host });
|
|
31
31
|
}
|
|
32
32
|
return (getDb().query("SELECT namespace, key, value FROM config WHERE namespace = 'provider-config'").all() as Array<Record<string, string>>)
|
|
33
33
|
.map((row) => `${row.namespace}|${row.key}|${row.value}`).join("\n");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isRecord, stringValue } from "@humwick/sdk";
|
|
2
|
-
import {
|
|
2
|
+
import { createActivityEventByClientIdAsync } from "./db/activity-async";
|
|
3
3
|
import { emitRelayEvent } from "./events";
|
|
4
4
|
|
|
5
5
|
interface HasMeta {
|
|
@@ -28,7 +28,7 @@ function numberValue(value: unknown): number | undefined {
|
|
|
28
28
|
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
export function auditRunnerTimelineEvent(agentId: string, timelineEvent: ProviderTimelineEvent | null): void {
|
|
31
|
+
export async function auditRunnerTimelineEvent(agentId: string, timelineEvent: ProviderTimelineEvent | null): Promise<void> {
|
|
32
32
|
if (!timelineEvent) return;
|
|
33
33
|
const metadata = isRecord(timelineEvent.metadata) ? timelineEvent.metadata : {};
|
|
34
34
|
if (metadata.source !== "runner") return;
|
|
@@ -41,10 +41,7 @@ export function auditRunnerTimelineEvent(agentId: string, timelineEvent: Provide
|
|
|
41
41
|
const body = stringValue(timelineEvent.body);
|
|
42
42
|
const icon = stringValue(timelineEvent.icon) ?? "ti-activity";
|
|
43
43
|
try {
|
|
44
|
-
|
|
45
|
-
// into an unawaited gateway write would reorder/drop the audit relative to the frame; moving
|
|
46
|
-
// the whole hot status ingress is the later owner.
|
|
47
|
-
const result = createActivityEventWithResult({
|
|
44
|
+
const result = (await createActivityEventByClientIdAsync({
|
|
48
45
|
clientId: `runner-timeline-${agentId}-${id}`,
|
|
49
46
|
kind: "state",
|
|
50
47
|
title,
|
|
@@ -60,7 +57,7 @@ export function auditRunnerTimelineEvent(agentId: string, timelineEvent: Provide
|
|
|
60
57
|
timelineId: id,
|
|
61
58
|
timelineTimestamp: timestamp,
|
|
62
59
|
},
|
|
63
|
-
});
|
|
60
|
+
}));
|
|
64
61
|
// A repeated frame may still carry the same event during reconnect/retry. The durable activity
|
|
65
62
|
// clientId dedup is authoritative; only a newly inserted row owns an activity.created edge.
|
|
66
63
|
if (!result.created) return;
|
|
@@ -6,8 +6,8 @@ import { getSpawnCapableAgentIds } from "./routing-policy-push";
|
|
|
6
6
|
import { renderBandTransition } from "./quota-band-transition";
|
|
7
7
|
import type { ProviderBandWindow, QuotaBand } from "./quota-band-projection";
|
|
8
8
|
|
|
9
|
-
export function deliverBandTransition(input: { provider: string; window: ProviderBandWindow; previousBand: QuotaBand; recommendedAction: string; now: number }): void {
|
|
9
|
+
export async function deliverBandTransition(input: { provider: string; window: ProviderBandWindow; previousBand: QuotaBand; recommendedAction: string; now: number }): Promise<void> {
|
|
10
10
|
const effect = renderBandTransition(input, getSpawnCapableAgentIds());
|
|
11
11
|
emitRelayEvent(effect.event);
|
|
12
|
-
if (effect.notification) routeNotification(effect.notification);
|
|
12
|
+
if (effect.notification) await routeNotification(effect.notification);
|
|
13
13
|
}
|