@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
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
|
+
import { setConfigAsync, setAgentProfileAsync } from "../config-store-write";
|
|
3
|
+
import { upsertOrchestratorAsync } from "../db/orchestrators-async";
|
|
4
|
+
import { allowLocalLandingHost } from "./spawn-placement.test-fixture";
|
|
5
|
+
import { upsertAgentAsync } from "../db/agents-async";
|
|
2
6
|
import { relayEnv, writeChildEnv } from "@humwick/sdk/env";
|
|
3
7
|
import { appendFileSync, closeSync, fsyncSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, writeSync } from "node:fs";
|
|
4
8
|
import { createHash } from "node:crypto";
|
|
5
9
|
import { hostname } from "node:os";
|
|
6
10
|
import { dirname, join } from "node:path";
|
|
7
|
-
import { getAgent, getOrchestrator, initDb
|
|
11
|
+
import { getAgent, getOrchestrator, initDb } from "../db";
|
|
8
12
|
import { assemblePreparedSpawnChain, prepareCommandChain, prepareSpawnChain, type PreparedSpawnChain } from "./spawn-chain-inspector";
|
|
9
13
|
import { ClaudeApiAdapter } from "../../runner/src/adapters/claude-api";
|
|
10
14
|
import type { ApiBudgetAccounting } from "../../runner/src/api-budget-accounting";
|
|
@@ -27,7 +31,7 @@ import { listCommands } from "../commands-db";
|
|
|
27
31
|
import { restartSpawnParamsForAgent, restartSpawnParamsForAgentAsync } from "./restart-spawn";
|
|
28
32
|
import { landOnOrigin } from "./project-role.test-fixture";
|
|
29
33
|
import { prepareServiceAccessConfig } from "../../runner/src/adapters/service-access";
|
|
30
|
-
import { deleteAgentProfile
|
|
34
|
+
import { deleteAgentProfile } from "../config-store";
|
|
31
35
|
import { setRoutingPolicy } from "../routing-policy-store";
|
|
32
36
|
|
|
33
37
|
const SPAWN_AGENT_ORCHESTRATOR_ID = "effective-launch";
|
|
@@ -36,16 +40,17 @@ const SPAWN_AGENT_ORCHESTRATOR_ID = "effective-launch";
|
|
|
36
40
|
async function spawnAgentCommandParams(request: EffectiveLaunchRequest): Promise<Record<string, unknown>> {
|
|
37
41
|
// This host's own orchestrator: the spawn reads repo content locally, as on the relay host.
|
|
38
42
|
const auto = request.autoRouting;
|
|
39
|
-
|
|
43
|
+
(await upsertOrchestratorAsync({ id: SPAWN_AGENT_ORCHESTRATOR_ID, hostname: hostname(), providers: auto?.providers ?? [request.provider], baseDir: request.cwd }));
|
|
44
|
+
allowLocalLandingHost(SPAWN_AGENT_ORCHESTRATOR_ID);
|
|
40
45
|
if (auto) {
|
|
41
46
|
setRoutingPolicy(auto.policy, { updatedBy: "effective-launch" });
|
|
42
|
-
for (const provider of auto.providers)
|
|
47
|
+
for (const provider of auto.providers) (await setConfigAsync("provider-enablement", provider, { enabled: !auto.disabled?.includes(provider) }, "effective-launch"));
|
|
43
48
|
const result = await spawnAgent({ provider: "auto", dispatch: auto.dispatch, orchestratorId: SPAWN_AGENT_ORCHESTRATOR_ID, cwd: request.cwd,
|
|
44
49
|
taskless: true, workflow: false, approvalMode: "open", waitForRegistrationMs: 0, requestedVia: "effective-launch", requestedBy: "effective-launch" } as SpawnAgentInput, authContextFromSystem());
|
|
45
50
|
return result.command.params;
|
|
46
51
|
}
|
|
47
52
|
if (request.dispatchTask && request.role !== undefined) {
|
|
48
|
-
const task = createTaskEntity({ title: "Dispatch a role", intent: "Dispatch a role", dispatch: request.dispatchTask.dispatch, createdBy: "effective-launch" });
|
|
53
|
+
const task = await createTaskEntity({ title: "Dispatch a role", intent: "Dispatch a role", dispatch: request.dispatchTask.dispatch, createdBy: "effective-launch" });
|
|
49
54
|
const dispatched = await relayDispatchTool({ kind: "server", actor: "effective-launch" }, "relay_task_dispatch", {
|
|
50
55
|
taskId: task.id, role: request.role, cwd: request.cwd, orchestratorId: SPAWN_AGENT_ORCHESTRATOR_ID, pin: { provider: request.provider }, createReview: false, workflow: false,
|
|
51
56
|
});
|
|
@@ -77,7 +82,7 @@ async function spawnAgentCommandParams(request: EffectiveLaunchRequest): Promise
|
|
|
77
82
|
async function restartCommandParams(spawned: Record<string, unknown>, request: EffectiveLaunchRequest & { role: string; restart: { land: Record<string, string> } }): Promise<Record<string, unknown>> {
|
|
78
83
|
const agentId = spawned.agentId as string;
|
|
79
84
|
const meta = { provider: request.provider, cwd: request.cwd, spawnRequestId: spawned.spawnRequestId, profile: spawned.profile, model: spawned.model, effort: spawned.effort, approvalMode: spawned.approvalMode, workspaceMode: spawned.workspaceMode };
|
|
80
|
-
|
|
85
|
+
(await upsertAgentAsync({ id: agentId, name: agentId, kind: "provider", status: "online", ready: true, machine: SPAWN_AGENT_ORCHESTRATOR_ID, meta }));
|
|
81
86
|
landOnOrigin(request.cwd, request.restart.land, "role edit after the spawn", { fetch: true });
|
|
82
87
|
const params = await restartSpawnParamsForAgentAsync(getAgent(agentId)!, getOrchestrator(SPAWN_AGENT_ORCHESTRATOR_ID), undefined, spawned.spawnRequestId as string);
|
|
83
88
|
if (!params) throw new Error(`restarting ${agentId} built no successor spawn`);
|
|
@@ -86,7 +91,7 @@ async function restartCommandParams(spawned: Record<string, unknown>, request: E
|
|
|
86
91
|
|
|
87
92
|
async function restartWithoutProfileParams(spawned: Record<string, unknown>, request: EffectiveLaunchRequest & { profile: string; restart: { deleteProfile: true; mode: "sync" | "async" } }): Promise<Record<string, unknown>> {
|
|
88
93
|
const id = spawned.agentId as string;
|
|
89
|
-
registerAgent({ id, name: id, kind: "provider", status: "idle", ready: true, instanceId: "before-profile-deletion",
|
|
94
|
+
await registerAgent({ id, name: id, kind: "provider", status: "idle", ready: true, instanceId: "before-profile-deletion",
|
|
90
95
|
meta: { provider: request.provider, cwd: request.cwd, profile: request.profile, spawnRequestId: spawned.spawnRequestId,
|
|
91
96
|
harnessSubagents: request.spawn?.harnessSubagents, approvalMode: spawned.approvalMode } }, authContextFromSystem());
|
|
92
97
|
if (!deleteAgentProfile(request.profile)) throw new Error(`profile not deleted: ${request.profile}`);
|
|
@@ -147,7 +152,7 @@ export async function main(): Promise<void> {
|
|
|
147
152
|
mkdirSync(process.env.CLAUDE_CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
148
153
|
mkdirSync(process.env.CODEX_HOME, { recursive: true, mode: 0o700 });
|
|
149
154
|
initDb(":memory:");
|
|
150
|
-
if (request.profileDefinition)
|
|
155
|
+
if (request.profileDefinition) (await setAgentProfileAsync(request.profileDefinition));
|
|
151
156
|
|
|
152
157
|
if (relayEnv(process.env, "AGENT_RELAY_EFFECTIVE_LAUNCH_FAULT") === "enable-runner-managed-tool-deferral") {
|
|
153
158
|
const manifest = getManifest(request.provider)?.mcpToolManifest;
|
|
@@ -179,7 +184,7 @@ export async function main(): Promise<void> {
|
|
|
179
184
|
prepared = request.commandParams
|
|
180
185
|
? prepareCommandChain(request.commandParams, { ...chainRequest, spawn: { headless: true } }, observe)
|
|
181
186
|
: request.managedPolicy
|
|
182
|
-
? prepareCommandChain(buildManagedSpawnParams(request.managedPolicy, "sp_effective_managed", { createdBy: "effective-launch", authority: SYSTEM_LAUNCH }), chainRequest, observe)
|
|
187
|
+
? prepareCommandChain((await buildManagedSpawnParams(request.managedPolicy, "sp_effective_managed", { createdBy: "effective-launch", authority: SYSTEM_LAUNCH })), chainRequest, observe)
|
|
183
188
|
: prepareSpawnChain(chainRequest, observe);
|
|
184
189
|
}
|
|
185
190
|
trace("adapter-assembly", "start");
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { spawnSync } from "node:child_process";
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
-
import {
|
|
4
|
+
import { readProjectFiles, type ProjectDirExtension } from "@humwick/sdk";
|
|
5
|
+
import { workspaceChangedPaths } from "../../orchestrator/src/workspace-probe/changed-paths";
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* In-process stand-in for an OWNING orchestrator host (#2535 cross-host test coverage). The
|
|
8
9
|
* delivery diff gate routes through the owner's `GET /api/workspace/changed-paths`; these
|
|
9
10
|
* helpers let a test's `globalThis.fetch` stub ANSWER that route the way a real host does —
|
|
10
|
-
* by
|
|
11
|
+
* by running the REAL host probe (`workspaceChangedPaths`) against the simulated
|
|
11
12
|
* host's own disk view, which can differ from what the server process can see:
|
|
12
13
|
*
|
|
13
14
|
* - `mapHostRepo(serverVisiblePath, hostRepoDir)` — the host resolves `serverVisiblePath` to
|
|
@@ -95,10 +96,8 @@ export async function changedPathsResponse(url: URL): Promise<Response | undefin
|
|
|
95
96
|
if (failure === "truncated") return Response.json({ ok: false, reason: "git diff unavailable (probe output truncated on the owning host)" });
|
|
96
97
|
const dir = hostDir(serverVisiblePath);
|
|
97
98
|
if (!existsSync(dir)) return Response.json({ ok: false, reason: "worktree unavailable", missing: true });
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
return { ok: r.status === 0, out: r.stdout ?? "", err: r.stderr ?? "" };
|
|
101
|
-
}, {
|
|
99
|
+
// The REAL owning-host probe (base fetch + shared SDK baseline) against the host's disk view.
|
|
100
|
+
const result = await workspaceChangedPaths({
|
|
102
101
|
worktreePath: dir,
|
|
103
102
|
baseRef: url.searchParams.get("baseRef") ?? undefined,
|
|
104
103
|
baseSha: url.searchParams.get("baseSha") ?? undefined,
|
|
@@ -5,10 +5,10 @@ import { checkoutRefreshEnabled } from "../config";
|
|
|
5
5
|
import { cleanHostProjectToolchainStatus } from "../project-toolchain";
|
|
6
6
|
import { probeHostRepo } from "./spawn-repo-probe";
|
|
7
7
|
|
|
8
|
-
/** A refresh receipt whose dependency hook failed: the checkout's dependencies do not match its head.
|
|
8
|
+
/** A refresh receipt whose dependency hook failed: the checkout's dependencies do not match its head. Skipped or in-progress refreshes stay ready; their reason is not a hook failure. */
|
|
9
9
|
function failedDependencyHook(row: CheckoutRefreshStatus): string | undefined {
|
|
10
10
|
const result = row.result;
|
|
11
|
-
return result?.enabled && result.dependency?.status === "pending" && result.reason ? result.reason : undefined;
|
|
11
|
+
return result?.enabled && result.status === "error" && result.dependency?.status === "pending" && result.reason ? result.reason : undefined;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
/**
|
|
@@ -44,7 +44,7 @@ function cleanToggle(body: unknown): HostProviderWrite {
|
|
|
44
44
|
/** Env-migration seed through the same per-host chain as operator writes, with audit. */
|
|
45
45
|
export async function seedHostProviders(hostId: string, envProviders: readonly string[], switchableCatalog: readonly SpawnProvider[]) {
|
|
46
46
|
return serializeHostWrite(hostId, async () => {
|
|
47
|
-
const seeded = seedHostProvidersFromEnv(hostId, envProviders, switchableCatalog);
|
|
47
|
+
const seeded = (await seedHostProvidersFromEnv(hostId, envProviders, switchableCatalog));
|
|
48
48
|
if (!seeded) return null;
|
|
49
49
|
const disabled = Object.entries(seeded.providers).filter(([, t]) => !t.enabled).map(([p]) => p);
|
|
50
50
|
await auditEvent({
|
|
@@ -11,10 +11,14 @@
|
|
|
11
11
|
// 2. the §4.4 in-memory last-hour series, ONLY once the durable write landed, so the Monitor
|
|
12
12
|
// chart can never show a point the Fleet card cannot corroborate;
|
|
13
13
|
// 3. #2822 — the one operator page a gate-capacity transition owes, decided by that same write.
|
|
14
|
+
// 4. #3762 — the one low-disk page (ntfy + coordinator) a disk level change owes, same write.
|
|
14
15
|
import type { HostDaemonSample, HostMachineSample } from "@humwick/sdk";
|
|
15
16
|
import { recordHostUtilizationAsync } from "../db";
|
|
16
17
|
import { recordHostUtilizationSample } from "../host/utilization-buffer";
|
|
17
18
|
import { composeGateCapacityNotice, type GateCapacityAlert } from "../host/gate-capacity-alert";
|
|
19
|
+
import { composeDiskNotice, type DiskAlert } from "../host/disk-alert";
|
|
20
|
+
import { stewardFallbackTarget } from "../config";
|
|
21
|
+
import { notifyTarget } from "../maintenance/events";
|
|
18
22
|
import { notifyWorkspaceHumanEscalation } from "../workspace-human-escalation";
|
|
19
23
|
|
|
20
24
|
export interface RecordHostUtilizationInput {
|
|
@@ -51,13 +55,32 @@ export async function recordHostUtilization(input: RecordHostUtilizationInput):
|
|
|
51
55
|
return false;
|
|
52
56
|
}
|
|
53
57
|
recordHostUtilizationSample(input.hostId, input.machine, input.now ?? Date.now());
|
|
54
|
-
if (recorded?.gateAlert) notifyGateCapacity(input.hostId, recorded.hostLabel ?? input.hostId, recorded.gateAlert, input.now ?? Date.now());
|
|
58
|
+
if (recorded?.gateAlert) (await notifyGateCapacity(input.hostId, recorded.hostLabel ?? input.hostId, recorded.gateAlert, input.now ?? Date.now()));
|
|
59
|
+
if (recorded?.diskAlert) (await notifyDisk(input.hostId, recorded.hostLabel ?? input.hostId, recorded.diskAlert));
|
|
55
60
|
return true;
|
|
56
61
|
}
|
|
57
62
|
|
|
58
|
-
|
|
63
|
+
/** Operator ntfy plus the steward/coordinator target — the same two recipients as the critical-job watchdog. */
|
|
64
|
+
async function notifyDisk(hostId: string, label: string, alert: DiskAlert): Promise<void> {
|
|
65
|
+
const notice = composeDiskNotice(hostId, label, alert);
|
|
66
|
+
const payload = { ...alert, kind: `host-disk.${alert.kind}`, hostId };
|
|
67
|
+
const human = (await notifyWorkspaceHumanEscalation({
|
|
68
|
+
subject: notice.subject,
|
|
69
|
+
body: notice.body,
|
|
70
|
+
priority: notice.priority,
|
|
71
|
+
tags: ["agent-relay", "host-disk"],
|
|
72
|
+
source: "host-disk",
|
|
73
|
+
payload,
|
|
74
|
+
idempotencyKey: notice.idempotencyKey,
|
|
75
|
+
}));
|
|
76
|
+
const target = stewardFallbackTarget();
|
|
77
|
+
const routed = target ? await notifyTarget("maintenance.degraded", {}, target, notice.subject, notice.body, payload, notice.idempotencyKey) : null;
|
|
78
|
+
console.warn(`[relay] ${notice.subject}${human.accepted || routed ? "" : " — nobody was notified (no ntfy channel or steward target)"}`);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async function notifyGateCapacity(hostId: string, label: string, alert: GateCapacityAlert, now: number): Promise<void> {
|
|
59
82
|
const notice = composeGateCapacityNotice(hostId, label, alert, now);
|
|
60
|
-
const result = notifyWorkspaceHumanEscalation({
|
|
83
|
+
const result = (await notifyWorkspaceHumanEscalation({
|
|
61
84
|
subject: notice.subject,
|
|
62
85
|
body: notice.body,
|
|
63
86
|
priority: notice.priority,
|
|
@@ -65,6 +88,6 @@ function notifyGateCapacity(hostId: string, label: string, alert: GateCapacityAl
|
|
|
65
88
|
source: "gate-capacity",
|
|
66
89
|
payload: { ...alert, kind: `gate-capacity.${alert.kind}`, hostId },
|
|
67
90
|
idempotencyKey: notice.idempotencyKey,
|
|
68
|
-
});
|
|
91
|
+
}));
|
|
69
92
|
console.warn(`[relay] ${notice.subject}${result.accepted ? "" : ` — operator NOT paged: ${result.reason}`}`);
|
|
70
93
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { updateIdleDigestScanAsync, startIdleDigestWindowAsync, finishIdleDigestScanAsync } from "../db/runtime-tail-async";
|
|
1
2
|
// #3428 — the one idle-children classifier and the coordinator digest built on it. Each team's
|
|
2
3
|
// coordinator gets at most one digest per window, and only when something qualifies. Provably safe
|
|
3
4
|
// children can be stopped automatically; the digest reports them only once termination is confirmed.
|
|
@@ -13,7 +14,7 @@ import {
|
|
|
13
14
|
listWorkspaces,
|
|
14
15
|
workflowRunIdOf,
|
|
15
16
|
} from "../db";
|
|
16
|
-
import {
|
|
17
|
+
import { getIdleDigestWindow } from "../db/idle-digest";
|
|
17
18
|
import { workflowOwnsAgent } from "../db/workflow-task-read-ops";
|
|
18
19
|
import { getIdleDigestConfig, idleDigestMayRun, teamIdleDigestSettings } from "../idle-digest-config";
|
|
19
20
|
import { providerIdleAnchor } from "../idle-self-care";
|
|
@@ -45,7 +46,7 @@ export interface IdleChildRow {
|
|
|
45
46
|
action: string;
|
|
46
47
|
}
|
|
47
48
|
|
|
48
|
-
interface SafeCandidate { row: IdleChildRow; instanceId?: string; epoch: number; idleAt: number }
|
|
49
|
+
export interface SafeCandidate { row: IdleChildRow; instanceId?: string; epoch: number; idleAt: number }
|
|
49
50
|
|
|
50
51
|
export interface IdleDigestStop {
|
|
51
52
|
agentId: string;
|
|
@@ -164,7 +165,7 @@ export async function classifyIdleChildren(children: AgentCard[], now: number):
|
|
|
164
165
|
|
|
165
166
|
/** Why a safe candidate may no longer be stopped, read from the fresh card. Runs before the stop and
|
|
166
167
|
* again inside shutdownAgent at command admission, after its host probe and audit, in one write transaction. */
|
|
167
|
-
function stopRefusal(candidate: SafeCandidate, current: AgentCard, now: number): { reason: string; openTasks: OwnedTask[] } | undefined {
|
|
168
|
+
export function stopRefusal(candidate: SafeCandidate, current: AgentCard, now: number): { reason: string; openTasks: OwnedTask[] } | undefined {
|
|
168
169
|
if (current.instanceId !== candidate.instanceId || current.epoch !== candidate.epoch) return { reason: "incarnation-changed", openTasks: [] };
|
|
169
170
|
const eligibility = childEligibility(current, now);
|
|
170
171
|
if (eligibility.excluded) return { reason: eligibility.excluded, openTasks: [] };
|
|
@@ -189,12 +190,16 @@ async function stopSafeChild(candidate: SafeCandidate, now: number, teamId: stri
|
|
|
189
190
|
try {
|
|
190
191
|
// requestedBy names the parent, so the child's exit does not also wake it: this digest reports it.
|
|
191
192
|
const { command } = await shutdownAgent({
|
|
192
|
-
agentId: agent.id, requestedVia: "maintenance", reason: IDLE_DIGEST_REAP_REASON,
|
|
193
|
+
agentId: agent.id, requestedVia: "maintenance", reason: IDLE_DIGEST_REAP_REASON, idleCandidate: candidate,
|
|
193
194
|
requestedBy: agent.spawnedBy ?? "idle-digest", auditMetadata: { idleDigest: true, teamId },
|
|
194
195
|
}, authContextFromSystem());
|
|
195
196
|
return { stop: { ...base, commandId: command.id, outcome: "pending" } };
|
|
196
197
|
} catch (error) {
|
|
197
|
-
if (error instanceof AutomaticShutdownRefused)
|
|
198
|
+
if (error instanceof AutomaticShutdownRefused) {
|
|
199
|
+
const current = getAgent(agent.id);
|
|
200
|
+
if (current) refusal = stopRefusal(candidate, current, now);
|
|
201
|
+
return asRefused();
|
|
202
|
+
}
|
|
198
203
|
// The guard's fresh probe found unique work or could not verify the branch: a check row, not a failed stop.
|
|
199
204
|
if (error instanceof UnlandedWorkRefusal || error instanceof UnverifiedWorkRefusal) {
|
|
200
205
|
const { verdict } = error;
|
|
@@ -251,18 +256,18 @@ function idleDigestSubject(scan: IdleDigestScan): string {
|
|
|
251
256
|
}
|
|
252
257
|
|
|
253
258
|
/** Deliver once every stop has resolved, or the settle window lapsed; an empty window sends nothing. */
|
|
254
|
-
function settleScan(teamId: string, coordinatorId: string, scan: IdleDigestScan, now: number): "waiting" | "sent" | "empty" {
|
|
259
|
+
async function settleScan(teamId: string, coordinatorId: string, scan: IdleDigestScan, now: number): Promise<"waiting" | "sent" | "empty"> {
|
|
255
260
|
const resolved = { ...scan, stops: scan.stops.map(resolveStop) };
|
|
256
261
|
if (resolved.stops.some((stop) => stop.outcome === "pending") && now - scan.at < STOP_SETTLE_MS) {
|
|
257
|
-
|
|
262
|
+
(await updateIdleDigestScanAsync(teamId, resolved));
|
|
258
263
|
return "waiting";
|
|
259
264
|
}
|
|
260
265
|
const body = renderIdleDigest(resolved);
|
|
261
266
|
if (!body) {
|
|
262
|
-
|
|
267
|
+
(await finishIdleDigestScanAsync(teamId));
|
|
263
268
|
return "empty";
|
|
264
269
|
}
|
|
265
|
-
const [message] = routeNotification({
|
|
270
|
+
const [message] = await routeNotification({
|
|
266
271
|
type: "agent.idle_digest",
|
|
267
272
|
scope: { agentId: coordinatorId },
|
|
268
273
|
recipients: [coordinatorId],
|
|
@@ -274,7 +279,7 @@ function settleScan(teamId: string, coordinatorId: string, scan: IdleDigestScan,
|
|
|
274
279
|
replyExpected: false,
|
|
275
280
|
},
|
|
276
281
|
});
|
|
277
|
-
|
|
282
|
+
(await finishIdleDigestScanAsync(teamId, message ? { at: now, messageId: message.id } : undefined));
|
|
278
283
|
return "sent";
|
|
279
284
|
}
|
|
280
285
|
|
|
@@ -306,11 +311,11 @@ export async function runIdleAgentDigest(context: { signal?: AbortSignal; now?:
|
|
|
306
311
|
}
|
|
307
312
|
}
|
|
308
313
|
scan = { at: now, check: classes.check, safe: settings.autoReapSafe ? [] : classes.safe.map((c) => c.row), stops };
|
|
309
|
-
|
|
314
|
+
(await startIdleDigestWindowAsync(team.id, now, scan));
|
|
310
315
|
result.scanned.push(team.id);
|
|
311
316
|
result.stopsRequested += stops.filter((stop) => stop.commandId).length;
|
|
312
317
|
}
|
|
313
|
-
const outcome = settleScan(team.id, team.coordinatorId, scan, now);
|
|
318
|
+
const outcome = await settleScan(team.id, team.coordinatorId, scan, now);
|
|
314
319
|
if (outcome === "waiting") result.waiting.push(team.id);
|
|
315
320
|
if (outcome === "sent") result.sent.push(team.id);
|
|
316
321
|
}
|
|
@@ -3,8 +3,8 @@ import { isTerminalTaskStatus } from "./task-entity";
|
|
|
3
3
|
import { errMessage } from "@humwick/sdk";
|
|
4
4
|
import { coordinatedTeamIds } from "../db/coordinator-seat";
|
|
5
5
|
import { teamEpicWork } from "../db/team-epics";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { issueTrackerNotFoundCount, getIssueHierarchy } from "../db/long-running-work";
|
|
7
|
+
import { putIssueHierarchyAsync, recordIssueRefLiveStatusAsync, recordIssueTrackerNotFoundAsync } from "../db/issue-refs-async";
|
|
8
8
|
import { resolveIssueTrackerAdapter } from "../issue-tracker";
|
|
9
9
|
import { GitHubApiError } from "../issue-tracker/github";
|
|
10
10
|
import { routeNotification } from "../notification-router";
|
|
@@ -16,8 +16,8 @@ function inFlight(task: Task): boolean {
|
|
|
16
16
|
&& (task.status !== "open" || !!task.ownerAgentId);
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
function reportUnresolvable(teamId: string, issue: IssueRef): void {
|
|
20
|
-
routeNotification({
|
|
19
|
+
async function reportUnresolvable(teamId: string, issue: IssueRef): Promise<void> {
|
|
20
|
+
await routeNotification({
|
|
21
21
|
type: "team.idle", scope: { teamId }, recipients: [`coordinator:${teamId}`],
|
|
22
22
|
message: { kind: "system", from: "system", subject: "Tracker reference unresolvable",
|
|
23
23
|
body: `${issue.repo}#${issue.externalKey} was not found on two tracker refreshes. Automatic refresh stopped; correct or remove the reference.`,
|
|
@@ -32,7 +32,7 @@ export async function refreshTeamEpicHierarchy(teamId: string, signal?: AbortSig
|
|
|
32
32
|
for (const issue of teamEpicWork(teamId).issues) {
|
|
33
33
|
if (signal?.aborted) break;
|
|
34
34
|
if (issueTrackerNotFoundCount(issue.id) >= 2) {
|
|
35
|
-
reportUnresolvable(teamId, issue);
|
|
35
|
+
await reportUnresolvable(teamId, issue);
|
|
36
36
|
continue;
|
|
37
37
|
}
|
|
38
38
|
let statusLoaded = false;
|
|
@@ -41,15 +41,14 @@ export async function refreshTeamEpicHierarchy(teamId: string, signal?: AbortSig
|
|
|
41
41
|
const live = await adapter.getStatus(issue);
|
|
42
42
|
if (signal?.aborted) break;
|
|
43
43
|
statusLoaded = true;
|
|
44
|
-
|
|
45
|
-
updateIssueRef(issue.id, { status: live.status, title: live.title, closeReason: live.closeReason, statusSyncedAt: Date.now() });
|
|
44
|
+
await recordIssueRefLiveStatusAsync(issue.id, { status: live.status, title: live.title, closeReason: live.closeReason, statusSyncedAt: Date.now() });
|
|
46
45
|
if (live.status !== "open") continue;
|
|
47
46
|
const children = adapter.listSubIssues ? await adapter.listSubIssues(issue) : await adapter.listOpenSubIssues?.(issue);
|
|
48
|
-
if (children)
|
|
47
|
+
if (children) await putIssueHierarchyAsync(issue.id, children);
|
|
49
48
|
} catch (error) {
|
|
50
49
|
if (!statusLoaded && error instanceof GitHubApiError && error.statusCode === 404
|
|
51
|
-
&&
|
|
52
|
-
reportUnresolvable(teamId, issue);
|
|
50
|
+
&& await recordIssueTrackerNotFoundAsync(issue.id) >= 2) {
|
|
51
|
+
await reportUnresolvable(teamId, issue);
|
|
53
52
|
continue;
|
|
54
53
|
}
|
|
55
54
|
const failure = `Tracker refresh failed for ${issue.repo}#${issue.externalKey}: ${errMessage(error)}; retained prior snapshot.`;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { deleteMessageAsync } from "../db/message-reads-async";
|
|
2
|
+
import { sendMessageAsync } from "../db/message-send";
|
|
1
3
|
import { isHumanAgentId } from "@humwick/sdk";
|
|
2
4
|
import { randomUUID } from "node:crypto";
|
|
3
|
-
import {
|
|
5
|
+
import { createAgentControlAsync } from "../db/agent-control-async";
|
|
4
6
|
import { emitCommandEvent } from "../command-events";
|
|
5
|
-
import { ValidationError, createActivityEventAsync,
|
|
7
|
+
import { ValidationError, createActivityEventAsync, getAgent, getMessage } from "../db";
|
|
6
8
|
import { emitActivityEvent, emitMessageDeleted, emitNewMessage } from "../sse";
|
|
7
9
|
import type { ActivityEventInput, AgentCard, Command, CreateCommandInput } from "../types";
|
|
8
10
|
import type { AuthContext } from "./auth-context";
|
|
@@ -41,11 +43,11 @@ function assertInterruptSupported(agent: AgentCard, mode: InterruptMode): void {
|
|
|
41
43
|
}
|
|
42
44
|
}
|
|
43
45
|
|
|
44
|
-
function sessionMessageForRedirect(agentId: string, ctx: AuthContext, body: string, commandId: string) {
|
|
46
|
+
async function sessionMessageForRedirect(agentId: string, ctx: AuthContext, body: string, commandId: string) {
|
|
45
47
|
const from = ctx.callerAgentId && getAgent(ctx.callerAgentId) ? ctx.callerAgentId : "system";
|
|
46
48
|
// This ownership marker is created only by this server-side redirect flow. Terminal settlement
|
|
47
49
|
// must never trust activity rows: activity:write callers may write arbitrary observability metadata.
|
|
48
|
-
return
|
|
50
|
+
return (await sendMessageAsync({ from, to: agentId, kind: "session", body, meta: { createdByCommandId: commandId } }));
|
|
49
51
|
}
|
|
50
52
|
|
|
51
53
|
function revalidateAgentInstance(snapshot: AgentCard): AgentCard {
|
|
@@ -56,7 +58,7 @@ function revalidateAgentInstance(snapshot: AgentCard): AgentCard {
|
|
|
56
58
|
return current;
|
|
57
59
|
}
|
|
58
60
|
|
|
59
|
-
export function settleInterruptRedirectMessage(command: Command): boolean {
|
|
61
|
+
export async function settleInterruptRedirectMessage(command: Command): Promise<boolean> {
|
|
60
62
|
if (command.type !== "agent.interrupt" || !["failed", "timed_out", "rejected", "canceled"].includes(command.status)) return false;
|
|
61
63
|
if (command.params.action !== "interrupt" || command.params.agentId !== command.target) return false;
|
|
62
64
|
const redirect = command.params.redirect;
|
|
@@ -69,7 +71,7 @@ export function settleInterruptRedirectMessage(command: Command): boolean {
|
|
|
69
71
|
// Exact primary-key lookup plus the server-stamped message owner is the authorization link. The
|
|
70
72
|
// activity row is observability only and cannot authorize this destructive deletion.
|
|
71
73
|
if (message.meta?.createdByCommandId !== command.id) return false;
|
|
72
|
-
if (!
|
|
74
|
+
if (!(await deleteMessageAsync(message.id))) return false;
|
|
73
75
|
emitMessageDeleted(message.id);
|
|
74
76
|
return true;
|
|
75
77
|
}
|
|
@@ -81,7 +83,7 @@ export function settleInterruptRedirectMessage(command: Command): boolean {
|
|
|
81
83
|
export async function dispatchInterrupt(input: InterruptAgentInput, ctx: AuthContext): Promise<InterruptAgentResult> {
|
|
82
84
|
const agent = getAgent(input.agentId);
|
|
83
85
|
if (!agent) throw new ShutdownTargetError(`agent ${input.agentId} not found`);
|
|
84
|
-
authorizeShutdown(ctx, { agentId: input.agentId, requestedVia: input.requestedVia });
|
|
86
|
+
(await authorizeShutdown(ctx, { agentId: input.agentId, requestedVia: input.requestedVia }));
|
|
85
87
|
assertInterruptSupported(agent, input.mode);
|
|
86
88
|
|
|
87
89
|
if (input.mode === "stop" && agent.status !== "busy") {
|
|
@@ -134,11 +136,12 @@ export async function dispatchInterrupt(input: InterruptAgentInput, ctx: AuthCon
|
|
|
134
136
|
// the await is rejected rather than receiving predecessor-bound interrupt state.
|
|
135
137
|
const event = await createActivityEventAsync(activityInput);
|
|
136
138
|
const current = revalidateAgentInstance(agent);
|
|
137
|
-
const sessionMessage = body ? sessionMessageForRedirect(current.id, ctx, body, commandId) : undefined;
|
|
139
|
+
const sessionMessage = body ? (await sessionMessageForRedirect(current.id, ctx, body, commandId)) : undefined;
|
|
138
140
|
if (sessionMessage && commandInput.params.redirect && typeof commandInput.params.redirect === "object") {
|
|
139
141
|
(commandInput.params.redirect as Record<string, unknown>).messageId = sessionMessage.id;
|
|
140
142
|
}
|
|
141
|
-
const command =
|
|
143
|
+
const { command: admitted } = await createAgentControlAsync({ agent, commandInput, commandId });
|
|
144
|
+
const command = admitted!;
|
|
142
145
|
if (sessionMessage) emitNewMessage(sessionMessage);
|
|
143
146
|
emitCommandEvent(command, "command.requested");
|
|
144
147
|
emitActivityEvent(event);
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
type IssueActivityAction,
|
|
5
5
|
type RecordIssueActivityInput,
|
|
6
6
|
} from "../db/activity";
|
|
7
|
-
import { listAgentIssueActivityAsync, listIssueActivityAgentsAsync } from "../db/activity-async";
|
|
7
|
+
import { recordIssueActivityAsync, listAgentIssueActivityAsync, listIssueActivityAgentsAsync } from "../db/activity-async";
|
|
8
8
|
import { emitActivityEvent } from "../sse";
|
|
9
9
|
|
|
10
10
|
export {
|
|
@@ -16,8 +16,8 @@ export {
|
|
|
16
16
|
type RecordIssueActivityInput,
|
|
17
17
|
};
|
|
18
18
|
|
|
19
|
-
export function recordAndEmitIssueActivity(input: RecordIssueActivityInput) {
|
|
20
|
-
const event =
|
|
19
|
+
export async function recordAndEmitIssueActivity(input: RecordIssueActivityInput) {
|
|
20
|
+
const event = await recordIssueActivityAsync(input);
|
|
21
21
|
emitActivityEvent(event);
|
|
22
22
|
return event;
|
|
23
23
|
}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
removeAssociation,
|
|
6
|
-
} from "../db/issue-associations";
|
|
7
|
-
import { getIssueRef, resolveIssueRefByExternalKey, resolveIssueRefFromString } from "../db/issue-refs";
|
|
1
|
+
import { resolveIssueRefFromStringAsync, resolveIssueRefByExternalKeyAsync } from "../db/issue-refs-async";
|
|
2
|
+
import { removeAssociationAsync, associateIssueAsync } from "../db/runtime-tail-async";
|
|
3
|
+
import { listEntitiesForIssue, listIssuesForEntity } from "../db/issue-associations";
|
|
4
|
+
import { getIssueRef } from "../db/issue-refs";
|
|
8
5
|
import type { IssueAssociationEntityType, IssueAssociationIssue, IssueProvider } from "../types";
|
|
9
6
|
import { ValidationError } from "../db/connection";
|
|
10
7
|
|
|
@@ -24,36 +21,36 @@ interface AssociateIssueInput extends ResolveAssociationIssueInput {
|
|
|
24
21
|
entityId: string;
|
|
25
22
|
}
|
|
26
23
|
|
|
27
|
-
export function resolveAssociationIssueRef(input: ResolveAssociationIssueInput) {
|
|
24
|
+
export async function resolveAssociationIssueRef(input: ResolveAssociationIssueInput) {
|
|
28
25
|
if (input.issueRefId) {
|
|
29
26
|
const issueRef = getIssueRef(input.issueRefId);
|
|
30
27
|
if (!issueRef) throw new ValidationError(`issue ref ${input.issueRefId} not found`);
|
|
31
28
|
return issueRef;
|
|
32
29
|
}
|
|
33
30
|
if (input.ref) {
|
|
34
|
-
return
|
|
31
|
+
return (await resolveIssueRefFromStringAsync({
|
|
35
32
|
ref: input.ref,
|
|
36
33
|
defaultRepo: input.defaultRepo ?? input.repo,
|
|
37
34
|
provider: input.provider,
|
|
38
35
|
title: input.title,
|
|
39
|
-
});
|
|
36
|
+
}));
|
|
40
37
|
}
|
|
41
38
|
if (input.provider && input.repo && input.externalKey) {
|
|
42
|
-
return
|
|
39
|
+
return (await resolveIssueRefByExternalKeyAsync({
|
|
43
40
|
provider: input.provider,
|
|
44
41
|
repo: input.repo,
|
|
45
42
|
externalKey: input.externalKey,
|
|
46
43
|
url: input.url,
|
|
47
44
|
title: input.title,
|
|
48
|
-
});
|
|
45
|
+
}));
|
|
49
46
|
}
|
|
50
47
|
throw new ValidationError("issueRefId, ref, or provider/repo/externalKey required");
|
|
51
48
|
}
|
|
52
49
|
|
|
53
|
-
export function associateIssueRef(input: AssociateIssueInput) {
|
|
54
|
-
const issueRef = resolveAssociationIssueRef(input);
|
|
50
|
+
export async function associateIssueRef(input: AssociateIssueInput) {
|
|
51
|
+
const issueRef = (await resolveAssociationIssueRef(input));
|
|
55
52
|
return {
|
|
56
|
-
association:
|
|
53
|
+
association: (await associateIssueAsync(issueRef.id, input.entityType, input.entityId)),
|
|
57
54
|
issueRef,
|
|
58
55
|
};
|
|
59
56
|
}
|
|
@@ -66,7 +63,7 @@ export function listIssueEntities(issueRefId: string) {
|
|
|
66
63
|
return listEntitiesForIssue(issueRefId);
|
|
67
64
|
}
|
|
68
65
|
|
|
69
|
-
export function removeIssueAssociation(input: AssociateIssueInput): { deleted: boolean } {
|
|
70
|
-
const issueRef = resolveAssociationIssueRef(input);
|
|
71
|
-
return { deleted:
|
|
66
|
+
export async function removeIssueAssociation(input: AssociateIssueInput): Promise<{ deleted: boolean }> {
|
|
67
|
+
const issueRef = (await resolveAssociationIssueRef(input));
|
|
68
|
+
return { deleted: (await removeAssociationAsync(issueRef.id, input.entityType, input.entityId)) };
|
|
72
69
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { recordIssueLifecycleCommentAsync } from "../db/runtime-tail-async";
|
|
1
2
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { hasIssueLifecycleComment
|
|
3
|
+
import { hasIssueLifecycleComment } from "../db/long-running-work";
|
|
3
4
|
import type { IssueTrackerAdapter } from "../issue-tracker";
|
|
4
5
|
import type { IssueRef } from "../types";
|
|
5
6
|
|
|
@@ -8,5 +9,5 @@ export async function commentIssueLifecycleOnce(adapter: IssueTrackerAdapter, re
|
|
|
8
9
|
const commentKey = createHash("sha256").update(body).digest("hex");
|
|
9
10
|
if (hasIssueLifecycleComment(ref.id, landKey, commentKey)) return;
|
|
10
11
|
await adapter.comment(ref, body);
|
|
11
|
-
|
|
12
|
+
(await recordIssueLifecycleCommentAsync(ref.id, landKey, commentKey));
|
|
12
13
|
}
|