@humwick/server 0.130.2 → 0.130.4
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/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-coordination.md +1 -0
- package/docs/guides/workflows.md +16 -0
- package/docs/openapi.json +175 -4
- package/package.json +8 -7
- package/public/assets/{MessageBubble-BWLqMGKG.js → MessageBubble-BOkmEvgZ.js} +2 -2
- package/public/assets/{PlanGraphPanel-3TlIQpjk.js → PlanGraphPanel-BkaDJp0r.js} +2 -2
- package/public/assets/{TraceView-Wimm0Czv.js → TraceView-B99Uu2yT.js} +2 -2
- package/public/assets/{VaultDecisionCard-Bau_vNax.js → VaultDecisionCard-DUIfTTFF.js} +2 -2
- package/public/assets/{activity-CrSurn-r.js → activity-ZIX0N1El.js} +2 -2
- package/public/assets/{agent-lineage-CknAJKcb.js → agent-lineage-kq9TPYFw.js} +2 -2
- package/public/assets/agent-liveness-DSQY1Aa_.js +2 -0
- package/public/assets/{agent-name-DKbiIhBo.js → agent-name-C_7F4DFR.js} +2 -2
- package/public/assets/{agent-profiles-DwF6EQ4R.js → agent-profiles-BNOcrGcY.js} +2 -2
- package/public/assets/{agent-project-badge-Diz4Sjjb.js → agent-project-badge-B6yAh70a.js} +2 -2
- package/public/assets/{agent-tools-CRhpRQza.js → agent-tools-CcrhmOzF.js} +2 -2
- package/public/assets/{agent-type-icon-LrUEU3lB.js → agent-type-icon-CXSLrKiq.js} +2 -2
- package/public/assets/{agents-B-v66C-4.js → agents-DIZG97_X.js} +2 -2
- package/public/assets/{analytics-BqCb-LKi.js → analytics-rasmoPjR.js} +2 -2
- package/public/assets/{artifact-viewer-kf4pGuAR.js → artifact-viewer-tBpTrEPb.js} +2 -2
- package/public/assets/{artifacts-DJevXcvg.js → artifacts-BNkrynP1.js} +2 -2
- package/public/assets/{artifacts-D32zyw4Y.js → artifacts-Bjq-ZyBA.js} +2 -2
- package/public/assets/{automation-BpRajx_5.js → automation-Cx422L3L.js} +2 -2
- package/public/assets/{backlog-D_UjTdzX.js → backlog-RuFQ8PUu.js} +2 -2
- package/public/assets/{busy-health-N3VEh4ao.js → busy-health-BvNQ9g5x.js} +2 -2
- package/public/assets/{channels-9jopungq.js → channels-DNbKAS0I.js} +2 -2
- package/public/assets/{chat-CSXrTB3C.js → chat-Bp3Fx73h.js} +3 -3
- package/public/assets/{code-preview-p1NnmqK0.js → code-preview-KIRZA6cz.js} +2 -2
- package/public/assets/{connectors-CZdqlDNL.js → connectors-k7vO4vvc.js} +2 -2
- package/public/assets/{cosmos-BgdsE4dG.js → cosmos-BuVoq1aw.js} +2 -2
- package/public/assets/{crate-agent-30aXTKva.js → crate-agent-irqlt4NH.js} +2 -2
- package/public/assets/{dependency-graph-B_jvw2GE.js → dependency-graph-D_rurNBz.js} +2 -2
- package/public/assets/{deploys-DoN6bAb5.js → deploys-yzZqIpxE.js} +2 -2
- package/public/assets/{display-BrKWFGJz.js → display-BemJG1f_.js} +2 -2
- package/public/assets/{files-D6XEu8Ng.js → files-DXWcrxOz.js} +2 -2
- package/public/assets/{fleet-C7jQWbw2.js → fleet-TEuOCZXE.js} +2 -2
- package/public/assets/{fleet-metrics-BiDs3MLx.js → fleet-metrics-BGoDAFI-.js} +2 -2
- package/public/assets/{formatted-body-impl-DyG0WsQS.js → formatted-body-impl-BB9eq9nN.js} +2 -2
- package/public/assets/{formatted-body-CQBwc1fb.js → formatted-body-qy2nTD_1.js} +3 -3
- package/public/assets/{host-providers-dialog-DKaW31dN.js → host-providers-dialog-BGPHxuwT.js} +2 -2
- package/public/assets/{index-CRHep3M9.js → index-BC5XZc0z.js} +5 -5
- package/public/assets/{index-MYAIwYTX.css → index-D8Rp9pz2.css} +1 -1
- package/public/assets/{insights-CzrtkpOE.js → insights-C-KQG0h-.js} +2 -2
- package/public/assets/{integrations-aVsUmigt.js → integrations-ClPRPyKU.js} +2 -2
- package/public/assets/{issue-ref-chip-BnSlM_95.js → issue-ref-chip-DbH8J9Ak.js} +2 -2
- package/public/assets/{log-viewer-qe7Ee47Z.js → log-viewer-PH4zVn24.js} +2 -2
- package/public/assets/{maintenance-NfjqFZAk.js → maintenance-5lV43uTL.js} +2 -2
- package/public/assets/{managed-agents-BiH0HgaE.js → managed-agents-BdgU35aX.js} +2 -2
- package/public/assets/{markdown-preview-BixaT3Xr.js → markdown-preview-DNT4OUwQ.js} +3 -3
- package/public/assets/{markdown-preview-impl-DNGlWIS3.js → markdown-preview-impl-CnCcPy0A.js} +2 -2
- package/public/assets/{memory-DNsCl6UX.js → memory--GgWH1gH.js} +2 -2
- package/public/assets/{messages-DopU1L1X.js → messages-CzFl_97O.js} +2 -2
- package/public/assets/{orchestrators-Cq7ckLQT.js → orchestrators-CVvJVkzv.js} +2 -2
- package/public/assets/overview-DsrZvE86.js +2 -0
- package/public/assets/{pairs-DE_m6rrE.js → pairs-D2d0d2py.js} +2 -2
- package/public/assets/{profile-icon-B3rfh77F.js → profile-icon-_SMuSbYF.js} +2 -2
- package/public/assets/{project-profile-instructions-DQWZE0kA.js → project-profile-instructions-Apn15y43.js} +2 -2
- package/public/assets/{projects-Br2Bd2h1.js → projects-D3B6kto5.js} +2 -2
- package/public/assets/{prompt-settings-BKvFsvGD.js → prompt-settings-DnPB6Ez6.js} +2 -2
- package/public/assets/provider-display-bWwiuedV.js +2 -0
- package/public/assets/{registry-Cw38_6gW.js → registry-D790cIhN.js} +2 -2
- package/public/assets/run-card-BCro-Odj.js +2 -0
- package/public/assets/{secrets-DxI-vzSq.js → secrets-CVXvfvbU.js} +2 -2
- package/public/assets/{service-access-settings-D9s_VJbd.js → service-access-settings-D3Xxqb9w.js} +2 -2
- package/public/assets/{settings-CKZTVGIx.js → settings-CoUC7Jci.js} +2 -2
- package/public/assets/shipping-D_Lp9n_J.js +2 -0
- package/public/assets/{stats-DyUBKyWI.js → stats-CXiNjB9S.js} +2 -2
- package/public/assets/{status-dot-DYqlEUhJ.js → status-dot-C703YIy1.js} +2 -2
- package/public/assets/store-BgDALGIX.js +9 -0
- package/public/assets/{tasks-Bh7Chr4-.js → tasks-DO0WpJCx.js} +2 -2
- package/public/assets/{teams-bowI7qVY.js → teams-FGkdi_tL.js} +2 -2
- package/public/assets/{terminal-viewer-BgVLHdsU.js → terminal-viewer-Dh8dSC7e.js} +3 -3
- package/public/assets/{terminal-viewer-impl-Dz22UPy6.js → terminal-viewer-impl-B5Zriip3.js} +2 -2
- package/public/assets/{use-agent-terminal-DSQQ-iY7.js → use-agent-terminal-CRUVDvLC.js} +2 -2
- package/public/assets/{use-decisions-samMQhQf.js → use-decisions-CoaqRh4l.js} +2 -2
- package/public/assets/{use-project-list-59LheVP7.js → use-project-list-X-BgT53X.js} +2 -2
- package/public/assets/{use-selectors-BZa25xEB.js → use-selectors-0X_UZkk-.js} +2 -2
- package/public/assets/{user-avatar-DHxlvUvV.js → user-avatar-CkLhVBGu.js} +2 -2
- package/public/assets/{versioned-prompt-editor-BmED5DnJ.js → versioned-prompt-editor-BkTi7eim.js} +2 -2
- package/public/assets/{work-queue-CSvpuNLz.js → work-queue-DDOLEyKo.js} +2 -2
- package/public/assets/{workflow-marker-DAZcj5qt.js → workflow-marker-CzOsB8BM.js} +2 -2
- package/public/assets/{workflows-DdmxRSyg.js → workflows-DJilvmRM.js} +2 -2
- package/public/assets/{workspaces-BxeKfVuF.js → workspaces-CHcfbLR3.js} +2 -2
- package/public/cosmos.html +4 -4
- package/public/index.html +29 -29
- package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/runner/src/adapters/claude-api.ts +1 -1
- 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/provider-quota-harvest.ts +20 -71
- package/runner/src/agent-runner/lifecycle-milestones.ts +2 -2
- package/runner/src/agent-runner/liveness-exchange.ts +104 -0
- package/runner/src/claude-system-prompt.ts +49 -0
- 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 +3 -2
- package/runner/src/runner-core.ts +14 -15
- package/runner/src/runner-helpers.ts +0 -8
- package/runner/src/session-scratch.ts +6 -2
- package/runner/test-support/provisioning-context.ts +4 -2
- package/runner/test-support/runner-harness.ts +2 -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/login-link.ts +35 -0
- 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 +3 -3
- package/src/branch-landed.ts +25 -23
- package/src/bus.ts +21 -19
- package/src/cd-deploy-notify.ts +2 -2
- package/src/ci/notifications.ts +4 -4
- package/src/ci/root-missing.ts +3 -3
- package/src/ci/transition-notify.ts +5 -5
- package/src/claude-app/oauth-http.ts +3 -3
- package/src/cli/index.ts +7 -1
- package/src/cli/init.ts +53 -0
- package/src/cli/orchestrator.ts +1 -7
- package/src/cli/setup.ts +6 -4
- package/src/cli/workflow.ts +12 -3
- package/src/commands-db.ts +4 -4
- package/src/commands-write.ts +8 -0
- package/src/compaction-watch.ts +10 -8
- package/src/config-store-write.ts +2 -2
- package/src/config.ts +4 -11
- package/src/connectors.ts +10 -8
- package/src/context-advisory.ts +22 -21
- 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/agents-async.ts +8 -5
- package/src/db/agents.ts +15 -12
- 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/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/commands-planner-stats.test-fixture.ts +8 -0
- package/src/db/commands-read-ops.ts +16 -0
- package/src/db/connection.ts +1 -182
- package/src/db/context-carry-write.ts +74 -0
- package/src/db/continuations.ts +4 -4
- package/src/db/db-error-registry.ts +12 -0
- package/src/db/gateway.ts +26 -133
- package/src/db/history-retention-ops.ts +13 -0
- package/src/db/inbox-async.ts +2 -2
- package/src/db/inbox-read-ops.ts +1 -1
- package/src/db/inbox.ts +9 -3
- package/src/db/issue-associations.ts +2 -2
- package/src/db/issue-refs-async.ts +4 -1
- package/src/db/issue-refs-read-ops.ts +6 -0
- package/src/db/issue-refs.ts +8 -8
- 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/main-connection-mode.ts +11 -0
- package/src/db/main-connection-writes.ts +20 -2
- package/src/db/maintenance-job-runs-async.ts +2 -2
- package/src/db/maintenance-job-write-ops.ts +1 -1
- package/src/db/maintenance-pauses.ts +2 -2
- package/src/db/message-send.ts +4 -0
- package/src/db/messages.ts +31 -25
- package/src/db/migrations.ts +18 -1
- package/src/db/notification-write-ops.ts +19 -0
- package/src/db/operator-answer-write.ts +19 -0
- package/src/db/orchestrators.ts +10 -4
- package/src/db/pairs-async.ts +22 -1
- package/src/db/pairs-write-ops.ts +8 -3
- package/src/db/pairs.ts +41 -48
- 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-trust-approvals.ts +2 -2
- package/src/db/prompt-templates.ts +4 -4
- package/src/db/read-op-marshaling-fixtures.ts +18 -0
- package/src/db/read-ops.ts +4 -0
- package/src/db/retention.ts +13 -2
- package/src/db/review-publish-write.ts +8 -0
- 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 +4 -1
- package/src/db/spawn-budget.ts +5 -0
- package/src/db/spawn-delegation.ts +3 -12
- package/src/db/sql-audit-indexes.ts +3 -0
- package/src/db/stats-async.ts +5 -3
- package/src/db/task-entity.ts +5 -4
- 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/token-db-write-ops.ts +2 -0
- package/src/db/token-standing-async.ts +12 -0
- package/src/db/token-standing.ts +6 -9
- 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-execution.ts +3 -3
- package/src/db/workspaces.ts +8 -5
- package/src/db/write-ops.ts +31 -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 +42 -46
- package/src/dev.ts +12 -16
- 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-provider-store.ts +5 -4
- package/src/hub-metrics-report.ts +5 -1
- package/src/hub-metrics.ts +38 -18
- package/src/init.ts +299 -0
- package/src/injection-sweep-pacing.ts +6 -8
- package/src/invite-link.ts +16 -9
- 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 +104 -98
- package/src/maintenance/breaker.ts +18 -16
- package/src/maintenance/checkout-refresh.ts +18 -1
- package/src/maintenance/critical-job-watchdog.ts +3 -3
- package/src/maintenance/events.ts +3 -3
- package/src/maintenance/history-retention-job.ts +30 -0
- package/src/maintenance/jobs.ts +29 -67
- 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 +18 -13
- package/src/maintenance/stalled-delivery-pager.ts +4 -4
- package/src/maintenance/teams.ts +19 -30
- package/src/maintenance/workspaces.ts +17 -27
- package/src/managed-policy-escalation.ts +7 -7
- package/src/managed-policy.ts +3 -3
- package/src/managed-provider-gate.ts +5 -4
- package/src/managed-spawn-reservation.ts +5 -4
- package/src/mcp/index.ts +8 -8
- package/src/mcp/output-descriptions.ts +1 -1
- package/src/mcp/presentation.ts +2 -1
- 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 +3 -2
- package/src/mcp/tool-roles.ts +81 -0
- package/src/mcp/tools-workspace.ts +1 -1
- 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 +3 -3
- 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 +1 -1
- package/src/mcp-project-journal-tools.ts +4 -12
- package/src/mcp-project-tools.ts +17 -18
- package/src/mcp-routing-policy-tools.ts +3 -2
- package/src/mcp-team-tools.ts +6 -6
- package/src/mcp-workflow-tools.ts +5 -3
- 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/notify.ts +5 -5
- package/src/observed-reset-refresh.ts +4 -4
- package/src/operator-alarm.ts +2 -5
- package/src/project-ingest.ts +6 -6
- package/src/project-instructions.ts +8 -1
- package/src/project-trust.ts +12 -11
- package/src/prompt-resolver.ts +3 -3
- package/src/provider-quota-async.ts +5 -7
- package/src/provider-timeline-event.ts +4 -7
- package/src/quota-band-delivery.ts +2 -2
- package/src/recipe-runner.ts +4 -3
- 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-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 +1 -1
- package/src/routes/agents.ts +17 -119
- package/src/routes/auth.ts +44 -17
- 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 +1 -1
- package/src/routes/commands.ts +29 -27
- package/src/routes/context-resets.ts +2 -2
- package/src/routes/coordinator-teams.ts +1 -1
- package/src/routes/decisions.ts +2 -2
- package/src/routes/host-providers.ts +18 -0
- 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 +7 -3
- package/src/routes/integrations.ts +9 -7
- package/src/routes/issue-activity.ts +2 -2
- package/src/routes/issue-associations.ts +4 -4
- package/src/routes/issue-refs.ts +3 -3
- 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 +3 -1
- package/src/routes/orchestrator-host-registration.ts +2 -0
- package/src/routes/orchestrator-host-utilization.ts +2 -2
- package/src/routes/orchestrator-proxy.ts +2 -2
- package/src/routes/orchestrator.ts +27 -18
- package/src/routes/pairs.ts +8 -8
- package/src/routes/project-profile-instructions.ts +1 -1
- package/src/routes/project-trust.ts +1 -1
- package/src/routes/projects.ts +16 -16
- package/src/routes/prompt-templates.ts +12 -12
- package/src/routes/provider-quotas.ts +10 -10
- package/src/routes/run-command.ts +1 -1
- package/src/routes/secrets-backup.ts +4 -5
- package/src/routes/secrets-import.ts +3 -4
- package/src/routes/secrets-vault.ts +12 -14
- package/src/routes/settings.ts +1 -1
- 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/team-templates.ts +7 -7
- package/src/routes/teams.ts +10 -10
- package/src/routes/tokens.ts +18 -17
- 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 +2 -2
- package/src/routes/workspaces.ts +17 -16
- package/src/routing-policy-push.ts +6 -6
- package/src/runtime-grant.ts +17 -11
- package/src/runtime-install.ts +30 -0
- package/src/runtime-tokens.ts +20 -28
- package/src/secrets-broker/config.ts +1 -1
- package/src/secrets-broker/service.ts +2 -2
- package/src/security.ts +3 -1
- 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 +1 -1
- package/src/server.ts +25 -26
- 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/auth-context.ts +6 -0
- 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 +9 -9
- package/src/services/idle-agent-digest.ts +17 -12
- package/src/services/idle-epics.ts +4 -4
- 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 +14 -13
- package/src/services/issue-refs.ts +4 -5
- package/src/services/kernel-timers-cutover-chaos-worker.ts +1 -1
- package/src/services/kernel-timers-ingress-chaos-worker.ts +6 -1
- package/src/services/kernel-timers-ingress.ts +3 -3
- 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 +6 -5
- 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 +3 -3
- 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 +1 -1
- 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 +8 -3
- package/src/services/profile-trust.ts +2 -2
- package/src/services/project.ts +11 -10
- package/src/services/prompt-templates.ts +6 -5
- package/src/services/provider-api-key.ts +73 -0
- 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/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 +17 -16
- 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-effort-grant.ts +5 -25
- package/src/services/send-message.ts +16 -33
- package/src/services/shutdown-agent.ts +17 -14
- package/src/services/spawn-agent.ts +12 -41
- package/src/services/spawn-chain-inspector.ts +1 -1
- 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-registration-watchdog.ts +2 -2
- package/src/services/spawn-repo-probe.ts +7 -5
- package/src/services/spawn-tree-cleanup.ts +7 -8
- 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-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 +3 -4
- package/src/services/task-validation.ts +2 -2
- package/src/services/team-templates.ts +5 -5
- 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 +22 -19
- 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 +2 -1
- package/src/services/workflow-caller.ts +61 -4
- package/src/services/workflow-child-proof-worker.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 +1 -1
- package/src/services/workflow-effect-driver.ts +42 -19
- package/src/services/workflow-effects.ts +41 -27
- package/src/services/workflow-pins.ts +7 -4
- package/src/services/workflow-reconcile.ts +1 -0
- 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 +4 -3
- package/src/services/workflow-run.test-fixture.ts +1 -1
- package/src/services/workflow-runs.ts +34 -22
- package/src/services/workflow-supervisor-state.ts +21 -1
- package/src/services/workflow-supervisor.ts +4 -3
- package/src/services/workspace-recovery.ts +4 -3
- package/src/setup.ts +47 -8
- package/src/spawn-admission.ts +10 -2
- package/src/spawn-placement.ts +27 -9
- package/src/spawn-targets.ts +8 -8
- package/src/sse-agent-status.ts +15 -6
- package/src/sse.ts +49 -24
- package/src/startup-context-injection.ts +61 -57
- package/src/steward-handoff.ts +4 -3
- package/src/steward-policy-cleanup.ts +9 -8
- package/src/steward.ts +2 -2
- package/src/task-dispatch-live.ts +5 -2
- package/src/task-dispatcher.ts +2 -2
- 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/utils.ts +7 -0
- 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 +24 -16
- 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 +2 -2
- package/public/assets/agent-liveness-CaNwK0Zf.js +0 -2
- package/public/assets/overview-C1DCTzzV.js +0 -2
- package/public/assets/provider-display-DsuWMvVL.js +0 -2
- package/public/assets/run-card-CpKqRbhg.js +0 -2
- package/public/assets/shipping-B9YtnwtG.js +0 -2
- package/public/assets/store-DcClXLH0.js +0 -9
- package/runner/src/agent-runner/http-liveness.ts +0 -85
- package/src/db/on-loop-write-transaction.ts +0 -34
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 });
|