@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/auth/password.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { createAuthIdentityAsync } from "../db/runtime-tail-async";
|
|
1
2
|
// Password authentication provider (#389). The only built-in provider in Phase 1. Secrets are
|
|
2
3
|
// hashed with scrypt (node:crypto — no dependency) and compared with `timingSafeEqual`, the same
|
|
3
4
|
// constant-time primitive the token layer uses. The hash is stored in `auth_identities.secret_hash`
|
|
4
5
|
// keyed by (provider="password", provider_subject=<username>).
|
|
5
6
|
import { randomBytes, scrypt, timingSafeEqual } from "node:crypto";
|
|
6
|
-
import {
|
|
7
|
+
import { getAuthIdentity, type AuthIdentity } from "../db/auth-identities.ts";
|
|
7
8
|
import { isRecord } from "@humwick/sdk";
|
|
8
9
|
import type { AuthProvider, AuthVerifyResult } from "./provider.ts";
|
|
9
10
|
|
|
@@ -98,13 +99,13 @@ export async function createPasswordIdentity(input: {
|
|
|
98
99
|
password: string;
|
|
99
100
|
metadata?: Record<string, unknown>;
|
|
100
101
|
}): Promise<AuthIdentity> {
|
|
101
|
-
return
|
|
102
|
+
return (await createAuthIdentityAsync({
|
|
102
103
|
userId: input.userId,
|
|
103
104
|
provider: PASSWORD_PROVIDER_ID,
|
|
104
105
|
providerSubject: input.username,
|
|
105
106
|
secretHash: await hashPassword(input.password),
|
|
106
107
|
metadata: input.metadata,
|
|
107
|
-
});
|
|
108
|
+
}));
|
|
108
109
|
}
|
|
109
110
|
|
|
110
111
|
/** Parse `{ username, password }` from a login request body. */
|
|
@@ -31,7 +31,7 @@ export async function refreshUserSession(refreshToken: string, nowMs = Date.now(
|
|
|
31
31
|
expiresAt: Math.min(nowMs + REFRESH_GRACE_MS, (resolved.payload.exp ?? Infinity) * 1000),
|
|
32
32
|
result: (async () => {
|
|
33
33
|
if (!(await revokeTokenAsync(jti, "rotation"))) return null;
|
|
34
|
-
const session = mintUserSession(resolved.user, resolved.payload.constraints?.sessionId);
|
|
34
|
+
const session = (await mintUserSession(resolved.user, resolved.payload.constraints?.sessionId));
|
|
35
35
|
return { accessJti: session.accessJti, refreshJti: session.refreshJti };
|
|
36
36
|
})(),
|
|
37
37
|
};
|
|
@@ -4,7 +4,7 @@ import { mintUserSession } from "./session.ts";
|
|
|
4
4
|
|
|
5
5
|
/** An `authorization` header carrying a fresh access token for `userId`. An unknown id models a
|
|
6
6
|
* session whose user no longer exists (it carries operator scopes). */
|
|
7
|
-
export function sessionAuthHeader(userId: string): Record<string, string
|
|
7
|
+
export async function sessionAuthHeader(userId: string): Promise<Record<string, string>> {
|
|
8
8
|
const user = getUser(userId) ?? { id: userId, handle: userId, displayName: userId, role: "operator" as const, status: "active" as const, tenantId: "default", avatarArtifactId: null, avatarUrl: null, createdAt: 0, updatedAt: 0 };
|
|
9
|
-
return { authorization: `Bearer ${mintUserSession(user).accessToken}` };
|
|
9
|
+
return { authorization: `Bearer ${(await mintUserSession(user)).accessToken}` };
|
|
10
10
|
}
|
package/src/auth/session.ts
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
// `role` ("user"), so no machine-token path branches on it.
|
|
6
6
|
import { userSinkId, userIdFromAddress, isHumanAgentId, type User, type UserRole } from "@humwick/sdk";
|
|
7
7
|
import { randomUUID } from "node:crypto";
|
|
8
|
-
import { revokeTokenAsync } from "../token-db-write.ts";
|
|
9
|
-
import {
|
|
8
|
+
import { createTokenAsync, revokeTokenAsync } from "../token-db-write.ts";
|
|
9
|
+
import { liveTokenJtisForSession } from "../token-db.ts";
|
|
10
10
|
import { verifyComponentToken } from "../security.ts";
|
|
11
11
|
import { getUser } from "../db/users.ts";
|
|
12
12
|
import { scopesForRole } from "./role-scopes";
|
|
@@ -50,25 +50,25 @@ export interface MintedSession {
|
|
|
50
50
|
* SaaS seam (identity-only — enforces nothing). Both tokens share the `user:<id>` sub so a single
|
|
51
51
|
* "sign out everywhere" revoke (by sub) kills the whole session family.
|
|
52
52
|
*/
|
|
53
|
-
export function mintUserSession(user: User, sessionId: string = randomUUID()): MintedSession {
|
|
53
|
+
export async function mintUserSession(user: User, sessionId: string = randomUUID()): Promise<MintedSession> {
|
|
54
54
|
const sub = userSinkId(user.id);
|
|
55
55
|
const constraints = { sessionId, ...(user.tenantId ? { tenantId: user.tenantId } : {}) };
|
|
56
|
-
const access =
|
|
56
|
+
const access = (await createTokenAsync({
|
|
57
57
|
sub,
|
|
58
58
|
role: USER_TOKEN_ROLE,
|
|
59
59
|
scope: scopesForUserRole(user.role),
|
|
60
60
|
constraints,
|
|
61
61
|
ttlSeconds: ACCESS_TTL_SECONDS,
|
|
62
62
|
createdBy: `auth:login:${user.id}`,
|
|
63
|
-
});
|
|
64
|
-
const refresh =
|
|
63
|
+
}));
|
|
64
|
+
const refresh = (await createTokenAsync({
|
|
65
65
|
sub,
|
|
66
66
|
role: USER_TOKEN_ROLE,
|
|
67
67
|
scope: [REFRESH_SCOPE],
|
|
68
68
|
constraints,
|
|
69
69
|
ttlSeconds: REFRESH_TTL_SECONDS,
|
|
70
70
|
createdBy: `auth:refresh:${user.id}`,
|
|
71
|
-
});
|
|
71
|
+
}));
|
|
72
72
|
return {
|
|
73
73
|
accessToken: access.token,
|
|
74
74
|
refreshToken: refresh.token,
|
package/src/automations/crud.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { insertAutomationAsync, updateAutomationNormalizedAsync } from "./write-async";
|
|
1
2
|
import { randomUUID } from "node:crypto";
|
|
2
3
|
import { getOrchestrator, ValidationError } from "../db";
|
|
3
4
|
import { AUTOMATION_KIND } from "./constants";
|
|
@@ -6,63 +7,18 @@ import { db, ensureAutomationTables, getAutomation } from "./storage";
|
|
|
6
7
|
import { normalizeCreateInput, normalizeCreateInputAsync } from "./validation";
|
|
7
8
|
import type { Automation, CreateAutomationInput, UpdateAutomationInput } from "../types";
|
|
8
9
|
|
|
9
|
-
export function createAutomation(input: CreateAutomationInput, now = Date.now()): Automation {
|
|
10
|
-
|
|
11
|
-
const normalized = normalizeCreateInput(input);
|
|
12
|
-
return insertAutomation(normalized, now);
|
|
10
|
+
export function createAutomation(input: CreateAutomationInput, now = Date.now()): Promise<Automation> {
|
|
11
|
+
return createAutomationAsync(input, now);
|
|
13
12
|
}
|
|
14
13
|
|
|
15
14
|
/** HTTP request path: catalog validation happens through the reader pool before this write. */
|
|
16
15
|
export async function createAutomationAsync(input: CreateAutomationInput, now = Date.now()): Promise<Automation> {
|
|
17
16
|
ensureAutomationTables();
|
|
18
|
-
return
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function insertAutomation(normalized: ReturnType<typeof normalizeCreateInput>, now: number): Automation {
|
|
22
|
-
if (!getOrchestrator(normalized.orchestratorId)) throw new ValidationError(`orchestrator ${normalized.orchestratorId} not found`);
|
|
23
|
-
const id = randomUUID();
|
|
24
|
-
const nextRunAt = normalized.enabled ? nextScheduledAt(normalized.schedule, normalized.timezone, now) : undefined;
|
|
25
|
-
db().query(`
|
|
26
|
-
INSERT INTO automations (id, kind, name, description, enabled, schedule, timezone, next_run_at, catch_up_policy, concurrency_policy, orchestrator_id, target_policy, task_template, created_at, updated_at)
|
|
27
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
28
|
-
`).run(
|
|
29
|
-
id,
|
|
30
|
-
AUTOMATION_KIND,
|
|
31
|
-
normalized.name,
|
|
32
|
-
normalized.description ?? null,
|
|
33
|
-
normalized.enabled ? 1 : 0,
|
|
34
|
-
normalized.schedule,
|
|
35
|
-
normalized.timezone,
|
|
36
|
-
nextRunAt ?? null,
|
|
37
|
-
normalized.catchUpPolicy,
|
|
38
|
-
normalized.concurrencyPolicy,
|
|
39
|
-
normalized.orchestratorId,
|
|
40
|
-
JSON.stringify(normalized.targetPolicy),
|
|
41
|
-
JSON.stringify(normalized.taskTemplate),
|
|
42
|
-
now,
|
|
43
|
-
now,
|
|
44
|
-
);
|
|
45
|
-
return getAutomation(id)!;
|
|
17
|
+
return insertAutomationAsync(await normalizeCreateInputAsync(input), now);
|
|
46
18
|
}
|
|
47
19
|
|
|
48
|
-
export function updateAutomation(id: string, input: UpdateAutomationInput, now = Date.now()): Automation | null {
|
|
49
|
-
|
|
50
|
-
const existing = getAutomation(id);
|
|
51
|
-
if (!existing) return null;
|
|
52
|
-
const next: CreateAutomationInput = {
|
|
53
|
-
kind: AUTOMATION_KIND,
|
|
54
|
-
name: input.name ?? existing.name,
|
|
55
|
-
description: input.description === null ? undefined : input.description ?? existing.description,
|
|
56
|
-
enabled: input.enabled ?? existing.enabled,
|
|
57
|
-
schedule: input.schedule ?? existing.schedule,
|
|
58
|
-
timezone: input.timezone ?? existing.timezone,
|
|
59
|
-
catchUpPolicy: input.catchUpPolicy ?? existing.catchUpPolicy,
|
|
60
|
-
concurrencyPolicy: input.concurrencyPolicy ?? existing.concurrencyPolicy,
|
|
61
|
-
orchestratorId: input.orchestratorId ?? existing.orchestratorId,
|
|
62
|
-
targetPolicy: input.targetPolicy ?? existing.targetPolicy,
|
|
63
|
-
taskTemplate: input.taskTemplate ?? existing.taskTemplate,
|
|
64
|
-
};
|
|
65
|
-
return updateAutomationNormalized(id, normalizeCreateInput(next), now);
|
|
20
|
+
export function updateAutomation(id: string, input: UpdateAutomationInput, now = Date.now()): Promise<Automation | null> {
|
|
21
|
+
return updateAutomationAsync(id, input, now);
|
|
66
22
|
}
|
|
67
23
|
|
|
68
24
|
/** HTTP request path: catalog validation happens through the reader pool before this write. */
|
|
@@ -78,7 +34,7 @@ export async function updateAutomationAsync(id: string, input: UpdateAutomationI
|
|
|
78
34
|
if (!current || JSON.stringify(current) !== JSON.stringify(existing)) {
|
|
79
35
|
throw new ValidationError("automation changed or was deleted during catalog validation");
|
|
80
36
|
}
|
|
81
|
-
return
|
|
37
|
+
return updateAutomationNormalizedAsync(id, normalized, existing, now);
|
|
82
38
|
}
|
|
83
39
|
|
|
84
40
|
function automationUpdateInput(existing: Automation, input: UpdateAutomationInput): CreateAutomationInput {
|
|
@@ -97,33 +53,4 @@ function automationUpdateInput(existing: Automation, input: UpdateAutomationInpu
|
|
|
97
53
|
};
|
|
98
54
|
}
|
|
99
55
|
|
|
100
|
-
|
|
101
|
-
if (!getOrchestrator(normalized.orchestratorId)) throw new ValidationError(`orchestrator ${normalized.orchestratorId} not found`);
|
|
102
|
-
const nextRunAt = normalized.enabled ? nextScheduledAt(normalized.schedule, normalized.timezone, now) : undefined;
|
|
103
|
-
db().query(`
|
|
104
|
-
UPDATE automations
|
|
105
|
-
SET name = ?, description = ?, enabled = ?, schedule = ?, timezone = ?, next_run_at = ?,
|
|
106
|
-
catch_up_policy = ?, concurrency_policy = ?, orchestrator_id = ?, target_policy = ?, task_template = ?, updated_at = ?
|
|
107
|
-
WHERE id = ?
|
|
108
|
-
`).run(
|
|
109
|
-
normalized.name,
|
|
110
|
-
normalized.description ?? null,
|
|
111
|
-
normalized.enabled ? 1 : 0,
|
|
112
|
-
normalized.schedule,
|
|
113
|
-
normalized.timezone,
|
|
114
|
-
nextRunAt ?? null,
|
|
115
|
-
normalized.catchUpPolicy,
|
|
116
|
-
normalized.concurrencyPolicy,
|
|
117
|
-
normalized.orchestratorId,
|
|
118
|
-
JSON.stringify(normalized.targetPolicy),
|
|
119
|
-
JSON.stringify(normalized.taskTemplate),
|
|
120
|
-
now,
|
|
121
|
-
id,
|
|
122
|
-
);
|
|
123
|
-
return getAutomation(id)!;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export function deleteAutomation(id: string): boolean {
|
|
127
|
-
ensureAutomationTables();
|
|
128
|
-
return db().query("DELETE FROM automations WHERE id = ?").run(id).changes > 0;
|
|
129
|
-
}
|
|
56
|
+
export { deleteAutomationAsync } from "./write-async";
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
import { rescheduleAutomationAsync as persistNextRunAsync, updateRunAsync, insertRunAsync, enqueueAutomationRunAsync, cancelActiveRunsAsync, admitAutomationRunAsync } from "./write-async";
|
|
2
|
+
import { ingestIntegrationEventAsync } from "../db/runtime-tail-async";
|
|
3
|
+
import { runnerRuntimeTokenEnvAsync, SYSTEM_LAUNCH } from "../runtime-tokens";
|
|
4
|
+
import { createCommandAsync, prepareCommandWriteAsync, submitPreparedCommandAsync } from "../commands-write";
|
|
1
5
|
import { isHumanAgentId, errMessage } from "@humwick/sdk";
|
|
2
6
|
import { emitAutomationRunCosmosEventAsync } from "../cosmos-events";
|
|
3
|
-
|
|
4
|
-
import { prepareCommandWriteAsync } from "../commands-write";
|
|
7
|
+
|
|
5
8
|
import { getAgentProfile, getSpawnPolicy, resolveAgentProfileKey } from "../config-store";
|
|
6
|
-
import { effectiveProviderCatalogListAsync, getOrchestrator,
|
|
9
|
+
import { effectiveProviderCatalogListAsync, getOrchestrator, listAgents, ValidationError, withResolvedProvisioningAsync } from "../db";
|
|
7
10
|
import { composeProfileSpawnInstructionsAsync } from "../project-instructions";
|
|
8
|
-
import { SYSTEM_LAUNCH, runnerRuntimeTokenEnv } from "../runtime-tokens";
|
|
9
11
|
import { generateSpawnAgentId } from "../services/spawn-identity";
|
|
10
12
|
import { applyDefaultSharedMcp } from "../shared-mcp";
|
|
11
13
|
import { resolveHostLaunchMode } from "../launch-mode";
|
|
@@ -14,22 +16,8 @@ import { systemTagsForSpawn } from "../agent-system-tags";
|
|
|
14
16
|
import { hostProviderRefusal, isProviderDisabledOnHost } from "../host-provider-store";
|
|
15
17
|
import { nextScheduledAt, formatRunDate } from "./cron";
|
|
16
18
|
import { alertPrecheckAutomationFailure, precheckTaskSection, startAutomationPrecheck } from "./precheck";
|
|
17
|
-
import {
|
|
18
|
-
|
|
19
|
-
db,
|
|
20
|
-
enqueueAutomationRun,
|
|
21
|
-
ensureAutomationTables,
|
|
22
|
-
getAutomation,
|
|
23
|
-
getAutomationRun,
|
|
24
|
-
hasActiveRun,
|
|
25
|
-
insertRun,
|
|
26
|
-
listAutomations,
|
|
27
|
-
listDispatchableQueuedRuns,
|
|
28
|
-
rowToAutomation,
|
|
29
|
-
rowToAutomationRun,
|
|
30
|
-
updateRun,
|
|
31
|
-
rescheduleAutomation as persistNextRun,
|
|
32
|
-
} from "./storage";
|
|
19
|
+
import { ensureAutomationTables, getAutomation, getAutomationRun, hasActiveRun, listAutomations } from "./storage";
|
|
20
|
+
import { listDispatchableQueuedRunsAsync, listDueAutomationsAsync } from "./read-async";
|
|
33
21
|
import type { AutomationDispatchResult } from "./types";
|
|
34
22
|
import type { AgentCard, Automation, AutomationTargetPolicy, ManagedAgent, Orchestrator } from "../types";
|
|
35
23
|
|
|
@@ -53,24 +41,13 @@ export { runDueAutomationsAsync as runDueAutomations, runAutomationNowAsync as r
|
|
|
53
41
|
export async function runDueAutomationsAsync(now = Date.now()): Promise<AutomationDispatchResult[]> {
|
|
54
42
|
ensureAutomationTables();
|
|
55
43
|
const results: AutomationDispatchResult[] = [];
|
|
56
|
-
for (const run of
|
|
57
|
-
const
|
|
58
|
-
if (
|
|
59
|
-
results.push(await dispatchAutomationRunAsync(automation, run, now));
|
|
44
|
+
for (const run of await listDispatchableQueuedRunsAsync()) {
|
|
45
|
+
const admitted = await admitAutomationRunAsync({ automationId: run.automationId, queuedRunId: run.id, now });
|
|
46
|
+
if (admitted) results.push(await dispatchAutomationRunAsync(admitted.automation, admitted.run, now));
|
|
60
47
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (
|
|
64
|
-
if (automation.concurrencyPolicy === "replace") cancelActiveRuns(automation.id, now, "Replaced by newer scheduled run");
|
|
65
|
-
else {
|
|
66
|
-
if (automation.concurrencyPolicy === "queue") enqueueAutomationRun(automation, automation.nextRunAt ?? now, now);
|
|
67
|
-
rescheduleAutomation(automation, now);
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
const run = insertRun(automation, automation.nextRunAt ?? now, now);
|
|
72
|
-
results.push(await dispatchAutomationRunAsync(automation, run, now));
|
|
73
|
-
rescheduleAutomation(automation, now);
|
|
48
|
+
for (const automation of await listDueAutomationsAsync(now)) {
|
|
49
|
+
const admitted = await admitAutomationRunAsync({ automationId: automation.id, now });
|
|
50
|
+
if (admitted) results.push(await dispatchAutomationRunAsync(admitted.automation, admitted.run, now));
|
|
74
51
|
}
|
|
75
52
|
return results;
|
|
76
53
|
}
|
|
@@ -78,10 +55,8 @@ export async function runDueAutomationsAsync(now = Date.now()): Promise<Automati
|
|
|
78
55
|
/** HTTP-triggered twin: on-demand spawn composition may canonicalize a caller cwd. */
|
|
79
56
|
export async function runAutomationNowAsync(id: string, now = Date.now()): Promise<AutomationDispatchResult | null> {
|
|
80
57
|
ensureAutomationTables();
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
if (hasActiveRun(automation.id)) throw new ValidationError("automation already has an active run");
|
|
84
|
-
return dispatchAutomationRunAsync(automation, insertRun(automation, now, now), now);
|
|
58
|
+
const admitted = await admitAutomationRunAsync({ automationId: id, manual: true, now });
|
|
59
|
+
return admitted ? dispatchAutomationRunAsync(admitted.automation, admitted.run, now) : null;
|
|
85
60
|
}
|
|
86
61
|
|
|
87
62
|
async function dispatchAutomationRunAsync(
|
|
@@ -89,24 +64,24 @@ async function dispatchAutomationRunAsync(
|
|
|
89
64
|
run: ReturnType<typeof getAutomationRun> & NonNullable<unknown>,
|
|
90
65
|
now: number,
|
|
91
66
|
): Promise<AutomationDispatchResult> {
|
|
92
|
-
|
|
67
|
+
(await updateRunAsync(run.id, { status: "dispatching" }, now));
|
|
93
68
|
try {
|
|
94
69
|
await emitAutomationDispatchCosmosEventAsync(automation, run.id);
|
|
95
70
|
await afterAsyncAutomationCosmosForTests?.();
|
|
96
71
|
assertAutomationUnchangedBeforeAsyncSpawn(automation);
|
|
97
72
|
const orchestrator = requireOnlineOrchestrator(automation.orchestratorId);
|
|
98
|
-
const prechecking = startAutomationPrecheck(automation, run, orchestrator, now);
|
|
73
|
+
const prechecking = (await startAutomationPrecheck(automation, run, orchestrator, now));
|
|
99
74
|
if (prechecking) return prechecking;
|
|
100
75
|
if (automation.targetPolicy.mode === "existing_agent") {
|
|
101
76
|
const agent = resolveExistingAgent(automation.targetPolicy, orchestrator);
|
|
102
77
|
if (!agent && automation.targetPolicy.ifNoMatch !== "spawn") throw new ValidationError("no matching managed agent for automation");
|
|
103
|
-
if (agent) return createRunTask(automation, run, durableExistingAgentTarget(automation.targetPolicy), now, { targetMode: "existing_agent", resolvedAgentId: agent.id });
|
|
78
|
+
if (agent) return (await createRunTask(automation, run, durableExistingAgentTarget(automation.targetPolicy), now, { targetMode: "existing_agent", resolvedAgentId: agent.id }));
|
|
104
79
|
return await dispatchOnDemandAutomationAsync(automation, run, orchestrator, { mode: "on_demand_agent", provider: orchestrator.providers[0] ?? "codex", keepAlive: false }, now);
|
|
105
80
|
}
|
|
106
81
|
return await dispatchOnDemandAutomationAsync(automation, run, orchestrator, automation.targetPolicy, now);
|
|
107
82
|
} catch (e) {
|
|
108
|
-
|
|
109
|
-
alertPrecheckAutomationFailure(automation, run.id, errMessage(e));
|
|
83
|
+
(await updateRunAsync(run.id, { status: "failed", finishedAt: now, error: errMessage(e) }, now));
|
|
84
|
+
(await alertPrecheckAutomationFailure(automation, run.id, errMessage(e)));
|
|
110
85
|
return { automation, run: getAutomationRun(run.id)! };
|
|
111
86
|
}
|
|
112
87
|
}
|
|
@@ -156,13 +131,13 @@ async function dispatchOnDemandAutomationAsync(
|
|
|
156
131
|
...(composed.systemPromptAppend ? { systemPromptAppend: composed.systemPromptAppend } : {}),
|
|
157
132
|
...(composed.relayInjectionEvents.length ? { relayInjectionEvents: composed.relayInjectionEvents } : {}),
|
|
158
133
|
...(composed.memorySeam ? { memorySeam: composed.memorySeam } : {}),
|
|
159
|
-
env:
|
|
134
|
+
env: (await runnerRuntimeTokenEnvAsync({ authority: SYSTEM_LAUNCH, agentId, orchestratorId: orchestrator.id, cwd, provider: policy.provider, label, createdBy: "automation", profile: policy.profile })),
|
|
160
135
|
}),
|
|
161
136
|
}, {}, "system");
|
|
162
137
|
assertAutomationUnchangedBeforeAsyncSpawn(automation);
|
|
163
|
-
const command =
|
|
164
|
-
const result = createRunTask(automation, run, `label:${label}`, now, { targetMode: "on_demand_agent", provider: policy.provider, label, profile: policy.profile, workspaceMode: policy.workspaceMode ?? "inherit" });
|
|
165
|
-
|
|
138
|
+
const command = (await submitPreparedCommandAsync(prepared));
|
|
139
|
+
const result = (await createRunTask(automation, run, `label:${label}`, now, { targetMode: "on_demand_agent", provider: policy.provider, label, profile: policy.profile, workspaceMode: policy.workspaceMode ?? "inherit" }));
|
|
140
|
+
(await updateRunAsync(run.id, { status: "waiting_agent", meta: { ...result.run.meta, onDemandLabel: label, spawnCommandId: command.id, workspaceMode: policy.workspaceMode ?? "inherit" } }, now));
|
|
166
141
|
return { ...result, run: getAutomationRun(run.id)!, command };
|
|
167
142
|
}
|
|
168
143
|
|
|
@@ -173,13 +148,13 @@ function assertAutomationUnchangedBeforeAsyncSpawn(automation: Automation): void
|
|
|
173
148
|
}
|
|
174
149
|
}
|
|
175
150
|
|
|
176
|
-
function createRunTask(
|
|
151
|
+
async function createRunTask(
|
|
177
152
|
automation: Automation,
|
|
178
153
|
run: ReturnType<typeof getAutomationRun> & NonNullable<unknown>,
|
|
179
154
|
target: string,
|
|
180
155
|
now: number,
|
|
181
156
|
meta: Record<string, unknown>,
|
|
182
|
-
): AutomationDispatchResult {
|
|
157
|
+
): Promise<AutomationDispatchResult> {
|
|
183
158
|
const template = automation.taskTemplate;
|
|
184
159
|
// Inject the authoritative dispatch-time run date (#480). A long-lived managed agent's
|
|
185
160
|
// session-start day awareness goes stale across midnight, so it can't be trusted to derive
|
|
@@ -193,7 +168,7 @@ function createRunTask(
|
|
|
193
168
|
const usesRunDateToken = /\{\{\s*(runDate|runWeekday|runDateLine)\s*\}\}/.test(`${template.title}\n${template.body}`);
|
|
194
169
|
const title = fill(template.title);
|
|
195
170
|
const body = (usesRunDateToken ? fill(template.body) : `Run date: ${runDate.line}.\n\n${template.body}`) + precheckTaskSection(run);
|
|
196
|
-
const result =
|
|
171
|
+
const result = (await ingestIntegrationEventAsync({
|
|
197
172
|
source: "automation",
|
|
198
173
|
type: "scheduled_task",
|
|
199
174
|
severity: template.severity ?? "info",
|
|
@@ -218,8 +193,8 @@ function createRunTask(
|
|
|
218
193
|
runTimezone: automation.timezone,
|
|
219
194
|
...meta,
|
|
220
195
|
},
|
|
221
|
-
}, "automation");
|
|
222
|
-
|
|
196
|
+
}, "automation"));
|
|
197
|
+
(await updateRunAsync(run.id, {
|
|
223
198
|
status: meta.targetMode === "on_demand_agent" ? "waiting_agent" : "running",
|
|
224
199
|
startedAt: now,
|
|
225
200
|
targetAgentId: typeof meta.resolvedAgentId === "string"
|
|
@@ -230,7 +205,7 @@ function createRunTask(
|
|
|
230
205
|
taskId: result.task.id,
|
|
231
206
|
messageId: result.message?.id,
|
|
232
207
|
meta: { ...run.meta, ...meta },
|
|
233
|
-
}, now);
|
|
208
|
+
}, now));
|
|
234
209
|
return { automation, run: getAutomationRun(run.id)!, task: result.task, message: result.message };
|
|
235
210
|
}
|
|
236
211
|
|
|
@@ -242,9 +217,9 @@ function durableExistingAgentTarget(policy: Extract<AutomationTargetPolicy, { mo
|
|
|
242
217
|
throw new ValidationError("existing-agent automation target selector must include a label or capability");
|
|
243
218
|
}
|
|
244
219
|
|
|
245
|
-
function rescheduleAutomation(automation: Automation, now: number): void {
|
|
220
|
+
async function rescheduleAutomation(automation: Automation, now: number): Promise<void> {
|
|
246
221
|
const next = automation.enabled ? nextScheduledAt(automation.schedule, automation.timezone, now) : undefined;
|
|
247
|
-
|
|
222
|
+
(await persistNextRunAsync(automation, next, now));
|
|
248
223
|
}
|
|
249
224
|
|
|
250
225
|
function requireOnlineOrchestrator(orchestratorId: string): Orchestrator {
|
package/src/automations/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type { AutomationDispatchResult, AutomationReconcileResult } from "./types";
|
|
2
|
-
export { createAutomation, createAutomationAsync,
|
|
2
|
+
export { createAutomation, createAutomationAsync, deleteAutomationAsync, updateAutomation, updateAutomationAsync } from "./crud";
|
|
3
3
|
export { getAutomation, listAutomationRuns, listAutomations } from "./storage";
|
|
4
4
|
export { runAutomationNow, runAutomationNowAsync, runDueAutomations, runDueAutomationsAsync } from "./dispatch";
|
|
5
5
|
export { reconcileAutomationRuns } from "./reconcile";
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { getOrchestrator, ValidationError } from "../db";
|
|
3
|
+
import { AUTOMATION_KIND } from "./constants";
|
|
4
|
+
import { nextScheduledAt } from "./cron";
|
|
5
|
+
import { db, ensureAutomationTables, getAutomation } from "./storage";
|
|
6
|
+
import type { normalizeCreateInput } from "./validation";
|
|
7
|
+
import type { Automation } from "../types";
|
|
8
|
+
|
|
9
|
+
export function insertAutomation(normalized: ReturnType<typeof normalizeCreateInput>, now: number): Automation {
|
|
10
|
+
if (!getOrchestrator(normalized.orchestratorId)) throw new ValidationError(`orchestrator ${normalized.orchestratorId} not found`);
|
|
11
|
+
const id = randomUUID();
|
|
12
|
+
const nextRunAt = normalized.enabled ? nextScheduledAt(normalized.schedule, normalized.timezone, now) : undefined;
|
|
13
|
+
db().query(`
|
|
14
|
+
INSERT INTO automations (id, kind, name, description, enabled, schedule, timezone, next_run_at, catch_up_policy, concurrency_policy, orchestrator_id, target_policy, task_template, created_at, updated_at)
|
|
15
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
16
|
+
`).run(
|
|
17
|
+
id,
|
|
18
|
+
AUTOMATION_KIND,
|
|
19
|
+
normalized.name,
|
|
20
|
+
normalized.description ?? null,
|
|
21
|
+
normalized.enabled ? 1 : 0,
|
|
22
|
+
normalized.schedule,
|
|
23
|
+
normalized.timezone,
|
|
24
|
+
nextRunAt ?? null,
|
|
25
|
+
normalized.catchUpPolicy,
|
|
26
|
+
normalized.concurrencyPolicy,
|
|
27
|
+
normalized.orchestratorId,
|
|
28
|
+
JSON.stringify(normalized.targetPolicy),
|
|
29
|
+
JSON.stringify(normalized.taskTemplate),
|
|
30
|
+
now,
|
|
31
|
+
now,
|
|
32
|
+
);
|
|
33
|
+
return getAutomation(id)!;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function updateAutomationNormalized(id: string, normalized: ReturnType<typeof normalizeCreateInput>, now: number): Automation {
|
|
37
|
+
if (!getOrchestrator(normalized.orchestratorId)) throw new ValidationError(`orchestrator ${normalized.orchestratorId} not found`);
|
|
38
|
+
const nextRunAt = normalized.enabled ? nextScheduledAt(normalized.schedule, normalized.timezone, now) : undefined;
|
|
39
|
+
db().query(`
|
|
40
|
+
UPDATE automations
|
|
41
|
+
SET name = ?, description = ?, enabled = ?, schedule = ?, timezone = ?, next_run_at = ?,
|
|
42
|
+
catch_up_policy = ?, concurrency_policy = ?, orchestrator_id = ?, target_policy = ?, task_template = ?, updated_at = ?
|
|
43
|
+
WHERE id = ?
|
|
44
|
+
`).run(
|
|
45
|
+
normalized.name,
|
|
46
|
+
normalized.description ?? null,
|
|
47
|
+
normalized.enabled ? 1 : 0,
|
|
48
|
+
normalized.schedule,
|
|
49
|
+
normalized.timezone,
|
|
50
|
+
nextRunAt ?? null,
|
|
51
|
+
normalized.catchUpPolicy,
|
|
52
|
+
normalized.concurrencyPolicy,
|
|
53
|
+
normalized.orchestratorId,
|
|
54
|
+
JSON.stringify(normalized.targetPolicy),
|
|
55
|
+
JSON.stringify(normalized.taskTemplate),
|
|
56
|
+
now,
|
|
57
|
+
id,
|
|
58
|
+
);
|
|
59
|
+
return getAutomation(id)!;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function deleteAutomation(id: string): boolean {
|
|
63
|
+
ensureAutomationTables();
|
|
64
|
+
return db().query("DELETE FROM automations WHERE id = ?").run(id).changes > 0;
|
|
65
|
+
}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
+
import { updateRunAsync } from "./write-async";
|
|
2
|
+
import { createCommandAsync, getCommandAsync } from "../commands-write";
|
|
1
3
|
// #3175 — an automation precheck is a plain script run on the automation's host before any agent is
|
|
2
4
|
// involved, so a quiet scheduled run costs no model quota. It reuses the `scheduler.command` executor
|
|
3
5
|
// (bounded, process-group reaped, output capped); only exit {@link AUTOMATION_PRECHECK_HITS_EXIT_CODE}
|
|
4
6
|
// re-queues the run for its normal target dispatch.
|
|
5
7
|
import { AUTOMATION_PRECHECK_HITS_EXIT_CODE, OUTPUT_WITHHELD, RELAY_RUN_OUTPUT_MASKED_CAPABILITY } from "@humwick/sdk";
|
|
6
|
-
|
|
7
|
-
import { getCommandAsync } from "../commands-write";
|
|
8
|
+
|
|
8
9
|
import { isTerminalCommandStatus } from "../db/command-terminal-status";
|
|
9
10
|
import { raiseOperatorAlarm } from "../operator-alarm";
|
|
10
11
|
import { notifyWorkspaceHumanEscalation } from "../workspace-human-escalation";
|
|
11
12
|
import { DEFAULT_PRECHECK_TIMEOUT_MS } from "./constants";
|
|
12
|
-
import { getAutomation, getAutomationRun
|
|
13
|
+
import { getAutomation, getAutomationRun } from "./storage";
|
|
14
|
+
import { listPendingPrecheckRunsAsync } from "./read-async";
|
|
13
15
|
import type { AutomationDispatchResult, AutomationReconcileResult } from "./types";
|
|
14
16
|
import type { Automation, AutomationRun, Command, Orchestrator } from "../types";
|
|
15
17
|
|
|
@@ -31,7 +33,7 @@ export function runPrecheck(run: AutomationRun): AutomationRunPrecheck | undefin
|
|
|
31
33
|
}
|
|
32
34
|
|
|
33
35
|
/** Starts the precheck when the automation has one and this run has not passed it yet. */
|
|
34
|
-
export function startAutomationPrecheck(automation: Automation, run: AutomationRun, orchestrator: Orchestrator, now: number): AutomationDispatchResult | undefined {
|
|
36
|
+
export async function startAutomationPrecheck(automation: Automation, run: AutomationRun, orchestrator: Orchestrator, now: number): Promise<AutomationDispatchResult | undefined> {
|
|
35
37
|
const precheck = automation.targetPolicy.precheck;
|
|
36
38
|
if (!precheck || runPrecheck(run)?.status === "hits") return undefined;
|
|
37
39
|
// An executor that does not mask would store raw script output in the command, run and Task, so refuse it.
|
|
@@ -40,7 +42,7 @@ export function startAutomationPrecheck(automation: Automation, run: AutomationR
|
|
|
40
42
|
}
|
|
41
43
|
const timeoutMs = precheck.timeoutMs ?? DEFAULT_PRECHECK_TIMEOUT_MS;
|
|
42
44
|
const policyCwd = automation.targetPolicy.mode === "on_demand_agent" ? automation.targetPolicy.cwd : undefined;
|
|
43
|
-
const command =
|
|
45
|
+
const command = (await createCommandAsync({
|
|
44
46
|
type: "scheduler.command",
|
|
45
47
|
source: "automation",
|
|
46
48
|
target: orchestrator.agentId,
|
|
@@ -56,16 +58,16 @@ export function startAutomationPrecheck(automation: Automation, run: AutomationR
|
|
|
56
58
|
automationId: automation.id,
|
|
57
59
|
automationRunId: run.id,
|
|
58
60
|
},
|
|
59
|
-
});
|
|
61
|
+
}));
|
|
60
62
|
const state: AutomationRunPrecheck = { commandId: command.id, status: "running" };
|
|
61
|
-
|
|
63
|
+
(await updateRunAsync(run.id, { status: "running", startedAt: now, meta: { ...run.meta, precheck: state } }, now));
|
|
62
64
|
return { automation, run: getAutomationRun(run.id)!, command };
|
|
63
65
|
}
|
|
64
66
|
|
|
65
67
|
/** Settles finished prechecks: quiet runs succeed with no agent, hits re-queue for target dispatch. */
|
|
66
68
|
export async function settleAutomationPrechecks(now: number): Promise<AutomationReconcileResult[]> {
|
|
67
69
|
const results: AutomationReconcileResult[] = [];
|
|
68
|
-
for (const run of
|
|
70
|
+
for (const run of await listPendingPrecheckRunsAsync()) {
|
|
69
71
|
const state = runPrecheck(run)!;
|
|
70
72
|
const command = await getCommandAsync(state.commandId);
|
|
71
73
|
if (command && !isTerminalCommandStatus(command.status)) continue;
|
|
@@ -74,15 +76,15 @@ export async function settleAutomationPrechecks(now: number): Promise<Automation
|
|
|
74
76
|
const meta = { ...run.meta, precheck };
|
|
75
77
|
const automation = getAutomation(run.automationId);
|
|
76
78
|
if (!automation) {
|
|
77
|
-
|
|
79
|
+
(await updateRunAsync(run.id, { status: "failed", finishedAt: now, error: "automation deleted while its precheck ran", meta }, now));
|
|
78
80
|
} else if (outcome.status === "hits") {
|
|
79
81
|
// `scheduled` hands the run to the queued-run dispatch, which skips the precheck on `hits`.
|
|
80
|
-
|
|
82
|
+
(await updateRunAsync(run.id, { status: "scheduled", meta }, now));
|
|
81
83
|
} else if (outcome.status === "quiet") {
|
|
82
|
-
|
|
84
|
+
(await updateRunAsync(run.id, { status: "succeeded", finishedAt: now, result: { precheck: "quiet", exitCode: 0 }, meta }, now));
|
|
83
85
|
} else {
|
|
84
|
-
|
|
85
|
-
alertPrecheckAutomationFailure(automation, run.id, outcome.error!);
|
|
86
|
+
(await updateRunAsync(run.id, { status: "failed", finishedAt: now, error: outcome.error, meta }, now));
|
|
87
|
+
(await alertPrecheckAutomationFailure(automation, run.id, outcome.error!));
|
|
86
88
|
}
|
|
87
89
|
results.push({ run: getAutomationRun(run.id)! });
|
|
88
90
|
}
|
|
@@ -107,12 +109,12 @@ function precheckOutcome(command: Command | null): { status: AutomationRunPreche
|
|
|
107
109
|
}
|
|
108
110
|
|
|
109
111
|
/** A precheck automation that stops running is a monitoring gap, so it pages the operator once per run. */
|
|
110
|
-
export function alertPrecheckAutomationFailure(automation: Automation, runId: string, error: string): void {
|
|
112
|
+
export async function alertPrecheckAutomationFailure(automation: Automation, runId: string, error: string): Promise<void> {
|
|
111
113
|
if (!automation.targetPolicy.precheck) return;
|
|
112
114
|
const subject = `Automation precheck failed: ${automation.name}`;
|
|
113
115
|
const detail = `Run ${runId} on ${automation.orchestratorId}: ${error}`;
|
|
114
|
-
raiseOperatorAlarm({ clientId: `automation-precheck-failed:${runId}`, source: "automation", subject, detail, view: "automation", metadata: { automationId: automation.id, automationRunId: runId } });
|
|
115
|
-
const human = notifyWorkspaceHumanEscalation({ subject, body: detail, priority: "high", tags: ["agent-relay", "automation"], source: "automation", idempotencyKey: `automation-precheck-failed:${runId}`, payload: { automationId: automation.id, automationRunId: runId } });
|
|
116
|
+
(await raiseOperatorAlarm({ clientId: `automation-precheck-failed:${runId}`, source: "automation", subject, detail, view: "automation", metadata: { automationId: automation.id, automationRunId: runId } }));
|
|
117
|
+
const human = (await notifyWorkspaceHumanEscalation({ subject, body: detail, priority: "high", tags: ["agent-relay", "automation"], source: "automation", idempotencyKey: `automation-precheck-failed:${runId}`, payload: { automationId: automation.id, automationRunId: runId } }));
|
|
116
118
|
if (!human.accepted) console.warn(`[automations] precheck failure for ${automation.id} paged nobody: ${human.reason ?? "unknown reason"}`);
|
|
117
119
|
}
|
|
118
120
|
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// #3799 — async facades over the automation reader ops; the main thread never scans automation tables.
|
|
2
|
+
import { getGateway } from "../db/gateway";
|
|
3
|
+
import type { Automation, AutomationRun } from "../types";
|
|
4
|
+
|
|
5
|
+
const read = <T>(op: string, args: unknown = {}): Promise<T> => getGateway().read(op as never, args as never) as unknown as Promise<T>;
|
|
6
|
+
|
|
7
|
+
export const listAutomationRunsAsync = (filter: { automationId?: string; status?: string; limit?: number } = {}) => read<AutomationRun[]>("automations.listRuns", filter);
|
|
8
|
+
export const listPendingPrecheckRunsAsync = () => read<AutomationRun[]>("automations.pendingPrecheckRuns");
|
|
9
|
+
export const listReconcilableRunsAsync = () => read<AutomationRun[]>("automations.reconcilableRuns");
|
|
10
|
+
export const listDispatchableQueuedRunsAsync = () => read<AutomationRun[]>("automations.dispatchableQueuedRuns");
|
|
11
|
+
export const listDueAutomationsAsync = (now: number) => read<Automation[]>("automations.dueAutomations", { now });
|