@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,54 +1,11 @@
|
|
|
1
|
+
import { setTaskStatusAsync, setTaskStageAsync, markTaskAgentReapedAsync } from "../db/task-entity-async";
|
|
2
|
+
import { confirmWorkspaceCarryPendingForTaskAsync } from "../db/runtime-tail-async";
|
|
3
|
+
import { removeSubscriptionsForTaskAsync } from "../db/lifecycle-tail-async";
|
|
1
4
|
// #834 — service facade for the durable Task entity. Transports (HTTP routes, MCP tools)
|
|
2
5
|
// call THIS, not the db writers directly (transport-thinness, epic #342): the service owns
|
|
3
6
|
// the db mutation + the SSE emission so the transport stays thin. The kind partition and all
|
|
4
7
|
// validation live in the db layer (src/db/task-entity.ts); this layer adds eventing.
|
|
5
|
-
import {
|
|
6
|
-
addTaskDependencyAsync,
|
|
7
|
-
addTaskRelationAsync,
|
|
8
|
-
assignTaskAgent,
|
|
9
|
-
assignTaskAgentAsync,
|
|
10
|
-
clearTaskParentAsync,
|
|
11
|
-
confirmWorkspaceCarryPendingForTask,
|
|
12
|
-
createDeliverableTask,
|
|
13
|
-
createDeliverableTaskAsync,
|
|
14
|
-
deliverableTaskIdsByOwnerAgent,
|
|
15
|
-
deliverableTaskIdsByOwnerAgentAsync,
|
|
16
|
-
deliverableTaskIdsBySpawnRequestId,
|
|
17
|
-
deliverableTaskIdsBySpawnRequestIdAsync,
|
|
18
|
-
getAgent,
|
|
19
|
-
getTaskDetail,
|
|
20
|
-
getTaskDetailAsync, getTaskViewAsync,
|
|
21
|
-
listAgents,
|
|
22
|
-
listDeliverableTaskSummariesAsync,
|
|
23
|
-
listDeliverableTasksAsync,
|
|
24
|
-
listTaskEvents,
|
|
25
|
-
listTaskEventsAsync,
|
|
26
|
-
listWorkspaces,
|
|
27
|
-
markTaskAgentReaped,
|
|
28
|
-
markTaskAgentReapedAsync,
|
|
29
|
-
recordGate,
|
|
30
|
-
recordGateAsync,
|
|
31
|
-
recordTaskDispatchDecisionAsync,
|
|
32
|
-
removeTaskDependencyAsync,
|
|
33
|
-
removeTaskRefAsync,
|
|
34
|
-
removeTaskRelationAsync,
|
|
35
|
-
setTaskParentAsync,
|
|
36
|
-
setTaskStage,
|
|
37
|
-
setTaskStageAsync,
|
|
38
|
-
setTaskStatus,
|
|
39
|
-
setTaskStatusAsync,
|
|
40
|
-
updateDeliverableTask,
|
|
41
|
-
updateDeliverableTaskAsync,
|
|
42
|
-
ValidationError,
|
|
43
|
-
type ListDeliverableTasksFilter,
|
|
44
|
-
type RecordTaskDispatchDecisionInput,
|
|
45
|
-
type RecordGateInput,
|
|
46
|
-
type RemoveTaskRefInput,
|
|
47
|
-
type SetTaskStageInput,
|
|
48
|
-
type SetTaskStatusInput,
|
|
49
|
-
type TaskEntityWriteOptions,
|
|
50
|
-
type UpdateDeliverableTaskInput,
|
|
51
|
-
} from "../db";
|
|
8
|
+
import { addTaskDependencyAsync, addTaskRelationAsync, assignTaskAgent, assignTaskAgentAsync, clearTaskParentAsync, createDeliverableTask, createDeliverableTaskAsync, deliverableTaskIdsByOwnerAgent, deliverableTaskIdsByOwnerAgentAsync, deliverableTaskIdsBySpawnRequestId, deliverableTaskIdsBySpawnRequestIdAsync, getAgent, getTaskDetail, getTaskDetailAsync, getTaskViewAsync, listAgents, listDeliverableTaskSummariesAsync, listDeliverableTasksAsync, listTaskEvents, listTaskEventsAsync, listWorkspaces, recordGate, recordGateAsync, recordTaskDispatchDecisionAsync, removeTaskDependencyAsync, removeTaskRefAsync, removeTaskRelationAsync, setTaskParentAsync, updateDeliverableTask, updateDeliverableTaskAsync, ValidationError, type ListDeliverableTasksFilter, type RecordTaskDispatchDecisionInput, type RecordGateInput, type RemoveTaskRefInput, type SetTaskStageInput, type SetTaskStatusInput, type TaskEntityWriteOptions, type UpdateDeliverableTaskInput } from "../db";
|
|
52
9
|
|
|
53
10
|
import { validationCompletionStatus } from "../task-completion.ts";
|
|
54
11
|
import { findSpawnCommandByRequestId } from "../commands-db";
|
|
@@ -56,7 +13,6 @@ import { findSpawnCommandByRequestId } from "../commands-db";
|
|
|
56
13
|
import { emitTaskChanged } from "../sse";
|
|
57
14
|
import { isCarryPendingBlocker } from "./carry-pending";
|
|
58
15
|
import type { CommandStatus, Task, TaskBlocker, TaskCommitRef, TaskDeliverableEventMetadata, TaskDetail, TaskEvent, TaskGateState, TaskListItem, TaskStatus, TaskTerminalStage, WorkspaceRecord } from "../types";
|
|
59
|
-
import { removeSubscriptionsForTask } from "../db/notification-subscriptions";
|
|
60
16
|
import { emitRelayEvent } from "../events";
|
|
61
17
|
import { routeNotification } from "../notification-router";
|
|
62
18
|
import { isAgentExitDoneWhen } from "./task-done-when";
|
|
@@ -73,19 +29,8 @@ import { taskOwnerTarget } from "../task-owner";
|
|
|
73
29
|
export type { CreateTaskEntityInput } from "./task-issue-link";
|
|
74
30
|
export { addTaskEntityRef, addTaskEntityRefAsync, attachTaskRefs } from "./task-issue-link";
|
|
75
31
|
|
|
76
|
-
export function createTaskEntity(input: CreateTaskEntityInput): TaskDetail {
|
|
77
|
-
|
|
78
|
-
const created = createDeliverableTask(input);
|
|
79
|
-
const detail = addInitialIssueRefs(created.id, input);
|
|
80
|
-
autoSubscribeTaskCoordinator(input.createdBy, detail.id);
|
|
81
|
-
emitTaskChanged(detail, "task.created");
|
|
82
|
-
emitTaskSemanticNotification({
|
|
83
|
-
task: detail,
|
|
84
|
-
transition: "created",
|
|
85
|
-
actor: input.createdBy,
|
|
86
|
-
occurrenceKey: latestTaskEventOccurrence(detail.id, "task.created"),
|
|
87
|
-
});
|
|
88
|
-
return detail;
|
|
32
|
+
export async function createTaskEntity(input: CreateTaskEntityInput): Promise<TaskDetail> {
|
|
33
|
+
return createTaskEntityAsync(input);
|
|
89
34
|
}
|
|
90
35
|
|
|
91
36
|
/** The off-loop twin of createTaskEntity (S3.2 L-D2 #1904) — the sanctioned HTTP/MCP create path. */
|
|
@@ -93,9 +38,9 @@ export async function createTaskEntityAsync(input: CreateTaskEntityInput, option
|
|
|
93
38
|
cleanIssueRefRelation(input.relation);
|
|
94
39
|
const created = await createDeliverableTaskAsync(input, options);
|
|
95
40
|
const detail = await addInitialIssueRefsAsync(created.id, input, options);
|
|
96
|
-
autoSubscribeTaskCoordinator(input.createdBy, detail.id);
|
|
41
|
+
(await autoSubscribeTaskCoordinator(input.createdBy, detail.id));
|
|
97
42
|
emitTaskChanged(detail, "task.created");
|
|
98
|
-
emitTaskSemanticNotification({
|
|
43
|
+
await emitTaskSemanticNotification({
|
|
99
44
|
task: detail,
|
|
100
45
|
transition: "created",
|
|
101
46
|
actor: input.createdBy,
|
|
@@ -118,10 +63,8 @@ export function listTaskEntitySummariesAsync(filter: ListDeliverableTasksFilter
|
|
|
118
63
|
return listDeliverableTaskSummariesAsync(filter);
|
|
119
64
|
}
|
|
120
65
|
|
|
121
|
-
export function updateTaskEntity(id: number, input: UpdateDeliverableTaskInput): TaskDetail {
|
|
122
|
-
|
|
123
|
-
emitTaskChanged(detail, "task.updated");
|
|
124
|
-
return detail;
|
|
66
|
+
export async function updateTaskEntity(id: number, input: UpdateDeliverableTaskInput): Promise<TaskDetail> {
|
|
67
|
+
return updateTaskEntityAsync(id, input);
|
|
125
68
|
}
|
|
126
69
|
|
|
127
70
|
/** The off-loop twin of updateTaskEntity (S3.2 L-D2 #1904). */
|
|
@@ -136,30 +79,22 @@ export async function updateTaskEntityAsync(id: number, input: UpdateDeliverable
|
|
|
136
79
|
// interface that cannot yet await, S3.2 L-D2 #1904 follow-up) and the off-loop path
|
|
137
80
|
// (setTaskEntityStatusAsync) apply IDENTICAL business logic over their differently-sourced `before`/
|
|
138
81
|
// `detail` rows, instead of forking the notification/work-finality logic in two places.
|
|
139
|
-
export function emitStatusChangeEffects(before: TaskDetail | null, detail: TaskDetail, actor: string | undefined, occurrenceKey: string | undefined): void {
|
|
82
|
+
export async function emitStatusChangeEffects(before: TaskDetail | null, detail: TaskDetail, actor: string | undefined, occurrenceKey: string | undefined): Promise<void> {
|
|
140
83
|
emitTaskChanged(detail, "task.status");
|
|
141
84
|
const transition = taskTransitionForStatus(detail.status, detail.blockedBy);
|
|
142
85
|
if (actor !== "task-lifecycle" && transition && shouldEmitStatusTransition(before, detail, transition)) {
|
|
143
|
-
emitTaskSemanticNotification({ task: detail, transition, actor, occurrenceKey });
|
|
86
|
+
await emitTaskSemanticNotification({ task: detail, transition, actor, occurrenceKey });
|
|
144
87
|
}
|
|
145
|
-
if (isTerminalTaskStatus(detail.status))
|
|
88
|
+
if (isTerminalTaskStatus(detail.status)) await removeSubscriptionsForTaskAsync(detail.id);
|
|
146
89
|
// #1084 — a task reaching `done` is an explicit, platform-owned completion signal for its
|
|
147
90
|
// owning agent's work window: close it, forwarding only the held final group. The #2520
|
|
148
91
|
// plan-ref propagation trigger lives with its CALLERS (below): the sync twin runs the
|
|
149
92
|
// in-process op body; the async path awaits the gateway-backed seam.
|
|
150
|
-
if (before?.status !== "done" && detail.status === "done") markAgentWorkFinal(detail.ownerAgentId, "task-done");
|
|
93
|
+
if (before?.status !== "done" && detail.status === "done") (await markAgentWorkFinal(detail.ownerAgentId, "task-done"));
|
|
151
94
|
}
|
|
152
95
|
|
|
153
|
-
export function setTaskEntityStatus(id: number, input: SetTaskStatusInput): TaskDetail {
|
|
154
|
-
|
|
155
|
-
const detail = setTaskStatus(id, input);
|
|
156
|
-
emitStatusChangeEffects(before, detail, input.actor, latestTaskEventOccurrence(detail.id, `status:${detail.status}`));
|
|
157
|
-
if (before?.status !== "done" && detail.status === "done") {
|
|
158
|
-
// #2520 — durable status=done trigger for ref-driven plan-node terminal propagation
|
|
159
|
-
// (in-process twin: the bus-dispatcher seam cannot await; no fire-and-forget promises).
|
|
160
|
-
advanceTerminalPlanRefs({ taskId: detail.id, actor: input.actor });
|
|
161
|
-
}
|
|
162
|
-
return detail;
|
|
96
|
+
export async function setTaskEntityStatus(id: number, input: SetTaskStatusInput): Promise<TaskDetail> {
|
|
97
|
+
return setTaskEntityStatusAsync(id, input);
|
|
163
98
|
}
|
|
164
99
|
|
|
165
100
|
/**
|
|
@@ -175,7 +110,7 @@ export function setTaskEntityStatus(id: number, input: SetTaskStatusInput): Task
|
|
|
175
110
|
export async function setTaskEntityStatusAsync(id: number, input: SetTaskStatusInput, options?: TaskEntityWriteOptions): Promise<TaskDetail> {
|
|
176
111
|
const before = await getTaskDetailAsync(id);
|
|
177
112
|
const detail = await setTaskStatusAsync(id, input, options);
|
|
178
|
-
emitStatusChangeEffects(before, detail, input.actor, await latestTaskEventOccurrenceAsync(detail.id, `status:${detail.status}`));
|
|
113
|
+
await emitStatusChangeEffects(before, detail, input.actor, await latestTaskEventOccurrenceAsync(detail.id, `status:${detail.status}`));
|
|
179
114
|
if (before?.status !== "done" && detail.status === "done") {
|
|
180
115
|
// #2520 — awaited on the sanctioned async path so the trigger's plan writes settle in order.
|
|
181
116
|
await advanceTerminalPlanRefsAsync({ taskId: detail.id, actor: input.actor });
|
|
@@ -188,33 +123,14 @@ export function isTerminalTaskStatus(status: Task["status"]): boolean {
|
|
|
188
123
|
}
|
|
189
124
|
|
|
190
125
|
// #1456 — the un-bypassable carry-pending landing gate is enforced in the LOWEST stage writer
|
|
191
|
-
// (`db/task-entity.ts`
|
|
126
|
+
// (`db/task-entity.ts` setTaskStageAsync), so it covers EVERY entrypoint — the land pipeline, the
|
|
192
127
|
// no-mergedSha out-of-band reconciliation, PR/squash, a manual `relay_task_set_stage`, and the
|
|
193
128
|
// deploy path (`stampDeployedTasks`, which calls the primitive directly). This service wrapper adds
|
|
194
129
|
// only eventing; it does NOT re-check (guarding the wrapper too would be a second, drift-prone code
|
|
195
130
|
// path — round-4: guard the primitive, not the wrapper). The land pipeline (driveTaskOnLand)
|
|
196
131
|
// short-circuits earlier with a superseded event; the primitive throw is the backstop for the rest.
|
|
197
|
-
export function setTaskEntityStage(id: number, input: SetTaskStageInput): TaskDetail {
|
|
198
|
-
|
|
199
|
-
let detail = setTaskStage(id, input);
|
|
200
|
-
emitTaskChanged(detail, "task.stage");
|
|
201
|
-
const transition = taskTransitionForStage(detail.deliverableStage);
|
|
202
|
-
if (input.actor !== "task-lifecycle" && transition && before?.deliverableStage !== detail.deliverableStage) {
|
|
203
|
-
emitTaskSemanticNotification({
|
|
204
|
-
task: detail,
|
|
205
|
-
transition,
|
|
206
|
-
actor: input.actor,
|
|
207
|
-
branch: detail.branch,
|
|
208
|
-
occurrenceKey: latestTaskEventOccurrence(detail.id, `stage:${detail.deliverableStage}`),
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
const deliverableStage = detail.deliverableStage ?? "none";
|
|
212
|
-
if (LANDED_STAGES.has(deliverableStage)) {
|
|
213
|
-
// #2520 — a landed/deploying/deployed stage is terminal success for ref-driven propagation.
|
|
214
|
-
advanceTerminalPlanRefs({ taskId: detail.id, actor: input.actor });
|
|
215
|
-
}
|
|
216
|
-
if (before?.status !== detail.status) emitStatusChangeEffects(before, detail, input.actor, undefined);
|
|
217
|
-
return detail;
|
|
132
|
+
export async function setTaskEntityStage(id: number, input: SetTaskStageInput): Promise<TaskDetail> {
|
|
133
|
+
return setTaskEntityStageAsync(id, input);
|
|
218
134
|
}
|
|
219
135
|
|
|
220
136
|
/** The off-loop twin of setTaskEntityStage (S3.2 L-D2 #1904). */
|
|
@@ -224,7 +140,7 @@ export async function setTaskEntityStageAsync(id: number, input: SetTaskStageInp
|
|
|
224
140
|
emitTaskChanged(detail, "task.stage");
|
|
225
141
|
const transition = taskTransitionForStage(detail.deliverableStage);
|
|
226
142
|
if (input.actor !== "task-lifecycle" && transition && before?.deliverableStage !== detail.deliverableStage) {
|
|
227
|
-
emitTaskSemanticNotification({
|
|
143
|
+
await emitTaskSemanticNotification({
|
|
228
144
|
task: detail,
|
|
229
145
|
transition,
|
|
230
146
|
actor: input.actor,
|
|
@@ -237,7 +153,7 @@ export async function setTaskEntityStageAsync(id: number, input: SetTaskStageInp
|
|
|
237
153
|
// #2520 — the off-loop stage trigger for ref-driven plan-node terminal propagation.
|
|
238
154
|
await advanceTerminalPlanRefsAsync({ taskId: detail.id, actor: input.actor });
|
|
239
155
|
}
|
|
240
|
-
if (before?.status !== detail.status) emitStatusChangeEffects(before, detail, input.actor, undefined);
|
|
156
|
+
if (before?.status !== detail.status) await emitStatusChangeEffects(before, detail, input.actor, undefined);
|
|
241
157
|
return detail;
|
|
242
158
|
}
|
|
243
159
|
|
|
@@ -254,39 +170,11 @@ export async function setTaskEntityStageAsync(id: number, input: SetTaskStageInp
|
|
|
254
170
|
// #831). The `deliverable.superseded` event already alerts the coordinator, who handles any
|
|
255
171
|
// issue-close/reap manually in the rare revert window. Automatic host-side tree-level carry
|
|
256
172
|
// verification (and lifecycle re-drive) is tracked as the #1458 follow-up.
|
|
257
|
-
export function confirmTaskCarry(id: number, opts: { actor?: string; note?: string; commit?: TaskCommitRef; branch?: string } = {}): TaskDetail {
|
|
258
|
-
|
|
259
|
-
if (!task) throw new ValidationError("task not found");
|
|
260
|
-
const blockers = task.blockedBy ?? [];
|
|
261
|
-
const remaining = blockers.filter((b: TaskBlocker) => !isCarryPendingBlocker(b));
|
|
262
|
-
const hadCarryPending = remaining.length !== blockers.length;
|
|
263
|
-
const note = opts.note?.trim() || "delivered change confirmed carried onto the current base (#1456)";
|
|
264
|
-
let detail = task;
|
|
265
|
-
if (hadCarryPending) {
|
|
266
|
-
// `allowCarryPendingClear` authorizes the primitive latch (BLOCKER 1) to drop the carry-pending
|
|
267
|
-
// blocker(s) — this confirm is the ONLY path that may. Scoped: preserves unrelated blockers.
|
|
268
|
-
detail = remaining.length > 0
|
|
269
|
-
? setTaskEntityStatus(id, { status: "blocked", blockedBy: remaining, note, actor: opts.actor, allowCarryPendingClear: true })
|
|
270
|
-
: setTaskEntityStatus(id, { status: "in_progress", note, actor: opts.actor, allowCarryPendingClear: true });
|
|
271
|
-
}
|
|
272
|
-
// Clear the workspace-durable marker too (round-4 BLOCKER 3): a late-bound Task can be gated purely
|
|
273
|
-
// by the workspace's unconfirmed head with no task-level blocker, and the marker would otherwise
|
|
274
|
-
// re-gate the very land this confirm authorizes. Cleared for the Task's bound workspace(s).
|
|
275
|
-
confirmWorkspaceCarryPendingForTask(task);
|
|
276
|
-
// Optionally complete the land the carry-pending gate refused. Both obligation carriers are cleared
|
|
277
|
-
// above, so the stage gate now permits the advance; doneWhen closes the Task as usual.
|
|
278
|
-
if (opts.commit) {
|
|
279
|
-
detail = setTaskEntityStage(id, {
|
|
280
|
-
deliverableStage: "landed-on-main",
|
|
281
|
-
...(opts.branch ? { branch: opts.branch } : {}),
|
|
282
|
-
commit: opts.commit,
|
|
283
|
-
actor: opts.actor,
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
return detail;
|
|
173
|
+
export async function confirmTaskCarry(id: number, opts: { actor?: string; note?: string; commit?: TaskCommitRef; branch?: string } = {}): Promise<TaskDetail> {
|
|
174
|
+
return confirmTaskCarryAsync(id, opts);
|
|
287
175
|
}
|
|
288
176
|
|
|
289
|
-
/** The off-loop twin of confirmTaskCarry (S3.2 L-D2 #1904). `
|
|
177
|
+
/** The off-loop twin of confirmTaskCarry (S3.2 L-D2 #1904). `confirmWorkspaceCarryPendingForTaskAsync`
|
|
290
178
|
* (workspaces/carry-pending-marker.ts) is a genuinely cross-domain, not-yet-migrated write — left on the
|
|
291
179
|
* sync facade like the retained sync callers elsewhere in this migration; it is a single small metadata
|
|
292
180
|
* write, not a hot path, so it does not defeat the point of awaiting the task-entity writes around it. */
|
|
@@ -303,7 +191,7 @@ export async function confirmTaskCarryAsync(id: number, opts: { actor?: string;
|
|
|
303
191
|
? await setTaskEntityStatusAsync(id, { status: "blocked", blockedBy: remaining, note, actor: opts.actor, allowCarryPendingClear: true })
|
|
304
192
|
: await setTaskEntityStatusAsync(id, { status: "in_progress", note, actor: opts.actor, allowCarryPendingClear: true });
|
|
305
193
|
}
|
|
306
|
-
|
|
194
|
+
(await confirmWorkspaceCarryPendingForTaskAsync(task));
|
|
307
195
|
if (opts.commit) {
|
|
308
196
|
detail = await setTaskEntityStageAsync(id, {
|
|
309
197
|
deliverableStage: "landed-on-main",
|
|
@@ -335,20 +223,8 @@ function shouldEmitStatusTransition(before: TaskDetail | null, detail: TaskDetai
|
|
|
335
223
|
return false;
|
|
336
224
|
}
|
|
337
225
|
|
|
338
|
-
export function recordTaskEntityGate(id: number, input: RecordGateInput): { gate: TaskGateState; gates: TaskGateState[] } {
|
|
339
|
-
|
|
340
|
-
const detail = getTaskDetail(id);
|
|
341
|
-
if (detail) emitTaskChanged(detail, "task.gate");
|
|
342
|
-
if (detail && gate.status === "fail") {
|
|
343
|
-
emitTaskSemanticNotification({
|
|
344
|
-
task: detail,
|
|
345
|
-
transition: "gate-failed",
|
|
346
|
-
actor: input.actor,
|
|
347
|
-
occurrenceKey: latestTaskEventOccurrence(detail.id, `gate:${gate.gate}`),
|
|
348
|
-
outcome: { gate: gate.gate, status: gate.status, ...(gate.detail ? { detail: gate.detail } : {}) },
|
|
349
|
-
});
|
|
350
|
-
}
|
|
351
|
-
return { gate, gates: detail?.gates ?? [] };
|
|
226
|
+
export async function recordTaskEntityGate(id: number, input: RecordGateInput): Promise<{ gate: TaskGateState; gates: TaskGateState[] }> {
|
|
227
|
+
return recordTaskEntityGateAsync(id, input);
|
|
352
228
|
}
|
|
353
229
|
|
|
354
230
|
/** The off-loop twin of recordTaskEntityGate (S3.2 L-D2 #1904). */
|
|
@@ -357,7 +233,7 @@ export async function recordTaskEntityGateAsync(id: number, input: RecordGateInp
|
|
|
357
233
|
const detail = await getTaskDetailAsync(id);
|
|
358
234
|
if (detail) emitTaskChanged(detail, "task.gate");
|
|
359
235
|
if (detail && gate.status === "fail") {
|
|
360
|
-
emitTaskSemanticNotification({
|
|
236
|
+
await emitTaskSemanticNotification({
|
|
361
237
|
task: detail,
|
|
362
238
|
transition: "gate-failed",
|
|
363
239
|
actor: input.actor,
|
|
@@ -419,10 +295,8 @@ export async function removeTaskEntityRefAsync(id: number, input: RemoveTaskRefI
|
|
|
419
295
|
* `registerAgent` — the same synchronous plugin/hook constraint as `setTaskEntityStatus` above. Every
|
|
420
296
|
* other production caller (routes/tasks.ts, the MCP task tools) now calls `assignTaskEntityAgentAsync`.
|
|
421
297
|
*/
|
|
422
|
-
export function assignTaskEntityAgent(id: number, agentId: string, role?: string, actor?: string): TaskDetail {
|
|
423
|
-
|
|
424
|
-
emitTaskChanged(detail, "task.updated");
|
|
425
|
-
return detail;
|
|
298
|
+
export async function assignTaskEntityAgent(id: number, agentId: string, role?: string, actor?: string): Promise<TaskDetail> {
|
|
299
|
+
return assignTaskEntityAgentAsync(id, agentId, role, actor);
|
|
426
300
|
}
|
|
427
301
|
|
|
428
302
|
/** The off-loop twin of assignTaskEntityAgent (S3.2 L-D2 #1904) — the sanctioned HTTP/MCP path. */
|
|
@@ -600,10 +474,10 @@ async function latestDeliverableEventAsync(taskId: number): Promise<TaskEvent |
|
|
|
600
474
|
return [...(await listTaskEventsAsync(taskId))].reverse().find((event) => event.type === "deliverable");
|
|
601
475
|
}
|
|
602
476
|
|
|
603
|
-
function restoreDeliveredDisposition(task: TaskDetail, event: TaskEvent): void {
|
|
477
|
+
async function restoreDeliveredDisposition(task: TaskDetail, event: TaskEvent): Promise<void> {
|
|
604
478
|
const metadata = event.metadata as unknown as Partial<TaskDeliverableEventMetadata>;
|
|
605
479
|
if (metadata.disposition === "failed" && task.status !== "failed") {
|
|
606
|
-
setTaskEntityStatus(task.id, {
|
|
480
|
+
await setTaskEntityStatus(task.id, {
|
|
607
481
|
status: "failed",
|
|
608
482
|
...(typeof metadata.reason === "string" && metadata.reason.trim() ? { note: metadata.reason } : {}),
|
|
609
483
|
actor: "task-lifecycle",
|
|
@@ -611,7 +485,7 @@ function restoreDeliveredDisposition(task: TaskDetail, event: TaskEvent): void {
|
|
|
611
485
|
return;
|
|
612
486
|
}
|
|
613
487
|
if (metadata.disposition === "blocked" && task.status !== "blocked" && Array.isArray(metadata.blockedBy) && metadata.blockedBy.length > 0) {
|
|
614
|
-
setTaskEntityStatus(task.id, {
|
|
488
|
+
await setTaskEntityStatus(task.id, {
|
|
615
489
|
status: "blocked",
|
|
616
490
|
blockedBy: metadata.blockedBy,
|
|
617
491
|
...(typeof metadata.reason === "string" && metadata.reason.trim() ? { note: metadata.reason } : {}),
|
|
@@ -643,46 +517,9 @@ async function restoreDeliveredDispositionAsync(task: TaskDetail, event: TaskEve
|
|
|
643
517
|
// #889 — finalize bound tasks for a reaped agent whose doneWhen is "agent-exit" / "reaped".
|
|
644
518
|
// Called by the transient reaper after requesting shutdown so ephemeral run-and-exit workers
|
|
645
519
|
// don't leave their auto-scaffolded Task stuck in_progress forever.
|
|
646
|
-
// Never overrides an already-terminal status. Idempotent (reapedAt guard inside
|
|
647
|
-
export function finalizeEphemeralTasksOnReap(agentId: string, opts: { spawnRequestId?: string; reason?: string; producedWork?: boolean; evidence?: string } = {}): number[] {
|
|
648
|
-
|
|
649
|
-
for (const id of deliverableTaskIdsByOwnerAgent(agentId)) ids.add(id);
|
|
650
|
-
if (opts.spawnRequestId) {
|
|
651
|
-
for (const id of deliverableTaskIdsBySpawnRequestId(opts.spawnRequestId)) ids.add(id);
|
|
652
|
-
}
|
|
653
|
-
const finalized: number[] = [];
|
|
654
|
-
for (const taskId of ids) {
|
|
655
|
-
const task = getTaskDetail(taskId);
|
|
656
|
-
if (!task) continue;
|
|
657
|
-
if (task.status === "done" || task.status === "failed" || task.status === "canceled") continue;
|
|
658
|
-
if (!isAgentExitDoneWhen(task.doneWhen)) continue;
|
|
659
|
-
if (opts.producedWork === false) {
|
|
660
|
-
try {
|
|
661
|
-
const deliverable = latestDeliverableEvent(taskId);
|
|
662
|
-
if (deliverable) {
|
|
663
|
-
if (!task.reapedAt) markTaskAgentReaped(taskId, { agentId, reason: opts.reason ?? "agent-exit" });
|
|
664
|
-
restoreDeliveredDisposition(task, deliverable);
|
|
665
|
-
finalized.push(taskId);
|
|
666
|
-
continue;
|
|
667
|
-
}
|
|
668
|
-
if (!task.reapedAt) markTaskAgentReaped(taskId, { agentId, reason: opts.reason ?? "agent-exit" });
|
|
669
|
-
setTaskEntityStatus(taskId, { status: "canceled", note: "worker reaped without landing or producing work; task canceled", actor: "task-lifecycle" });
|
|
670
|
-
notifyEmptyTransientReap(agentId, task, opts);
|
|
671
|
-
finalized.push(taskId);
|
|
672
|
-
} catch {
|
|
673
|
-
// best-effort; failures must not surface into the reaper scan
|
|
674
|
-
}
|
|
675
|
-
continue;
|
|
676
|
-
}
|
|
677
|
-
try {
|
|
678
|
-
if (!task.reapedAt) markTaskAgentReaped(taskId, { agentId, reason: opts.reason ?? "agent-exit" });
|
|
679
|
-
setTaskEntityStatus(taskId, { status: validationCompletionStatus(task.validationItems), note: "doneWhen=agent-exit satisfied by worker reap", actor: "task-lifecycle" });
|
|
680
|
-
finalized.push(taskId);
|
|
681
|
-
} catch {
|
|
682
|
-
// best-effort; failures must not surface into the reaper scan
|
|
683
|
-
}
|
|
684
|
-
}
|
|
685
|
-
return finalized;
|
|
520
|
+
// Never overrides an already-terminal status. Idempotent (reapedAt guard inside markTaskAgentReapedAsync).
|
|
521
|
+
export async function finalizeEphemeralTasksOnReap(agentId: string, opts: { spawnRequestId?: string; reason?: string; producedWork?: boolean; evidence?: string } = {}): Promise<number[]> {
|
|
522
|
+
return finalizeEphemeralTasksOnReapAsync(agentId, opts);
|
|
686
523
|
}
|
|
687
524
|
|
|
688
525
|
/** The off-loop twin of finalizeEphemeralTasksOnReap (S3.2 L-D2 #1904) — the sanctioned scheduled-job
|
|
@@ -710,7 +547,7 @@ export async function finalizeEphemeralTasksOnReapAsync(agentId: string, opts: {
|
|
|
710
547
|
}
|
|
711
548
|
if (!task.reapedAt) await markTaskAgentReapedAsync(taskId, { agentId, reason: opts.reason ?? "agent-exit" });
|
|
712
549
|
await setTaskEntityStatusAsync(taskId, { status: "canceled", note: "worker reaped without landing or producing work; task canceled", actor: "task-lifecycle" });
|
|
713
|
-
notifyEmptyTransientReap(agentId, task, opts);
|
|
550
|
+
await notifyEmptyTransientReap(agentId, task, opts);
|
|
714
551
|
finalized.push(taskId);
|
|
715
552
|
} catch {
|
|
716
553
|
// best-effort; failures must not surface into the reaper scan
|
|
@@ -728,7 +565,7 @@ export async function finalizeEphemeralTasksOnReapAsync(agentId: string, opts: {
|
|
|
728
565
|
return finalized;
|
|
729
566
|
}
|
|
730
567
|
|
|
731
|
-
function notifyEmptyTransientReap(agentId: string, task: TaskDetail, opts: { spawnRequestId?: string; reason?: string; evidence?: string }): void {
|
|
568
|
+
async function notifyEmptyTransientReap(agentId: string, task: TaskDetail, opts: { spawnRequestId?: string; reason?: string; evidence?: string }): Promise<void> {
|
|
732
569
|
const agent = getAgent(agentId);
|
|
733
570
|
const parent = agent?.spawnedBy;
|
|
734
571
|
const recipients = [...new Set([parent, taskOwnerTarget(task)].filter((value): value is string => Boolean(value && value.trim())))];
|
|
@@ -743,7 +580,7 @@ function notifyEmptyTransientReap(agentId: string, task: TaskDetail, opts: { spa
|
|
|
743
580
|
evidence: opts.evidence ?? "no-produced-work",
|
|
744
581
|
};
|
|
745
582
|
emitRelayEvent({ type: "agent.transient_empty_reap", source: "task-lifecycle", subject: agentId, data: payload });
|
|
746
|
-
routeNotification({
|
|
583
|
+
await routeNotification({
|
|
747
584
|
type: "agent.transient_empty_reap",
|
|
748
585
|
scope: { agentId, parent, taskId: String(task.id) },
|
|
749
586
|
recipients,
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { addTaskRefAsync } from "../db/task-entity-async";
|
|
2
|
+
import { insertTaskEventAsync } from "../db/runtime-tail-async";
|
|
1
3
|
// #834/#2214 — the Task ↔ issue ATTACH seam: everything that turns "this Task is about issue N"
|
|
2
4
|
// into a real `issue_associations` row, split out of the task-entity service (which owns status /
|
|
3
5
|
// stage / gates / attribution) so both stay under the file-size ratchet and this rule has one home.
|
|
@@ -11,18 +13,9 @@
|
|
|
11
13
|
// - after create — `relay_task_add_ref` / `POST /api/tasks/:id/refs` via attachTaskRefs.
|
|
12
14
|
// Both resolve a bare `#N` through the same default-repo chain (see issueRepoForCreate).
|
|
13
15
|
import { errMessage } from "@humwick/sdk";
|
|
14
|
-
import {
|
|
15
|
-
addTaskRef,
|
|
16
|
-
addTaskRefAsync,
|
|
17
|
-
getTaskDetail,
|
|
18
|
-
getTaskDetailAsync,
|
|
19
|
-
ValidationError,
|
|
20
|
-
type AddTaskRefInput,
|
|
21
|
-
type CreateDeliverableTaskInput,
|
|
22
|
-
type TaskEntityWriteOptions,
|
|
23
|
-
} from "../db";
|
|
16
|
+
import { getTaskDetail, getTaskDetailAsync, ValidationError, type AddTaskRefInput, type CreateDeliverableTaskInput, type TaskEntityWriteOptions } from "../db";
|
|
24
17
|
import { isBareIssueRef } from "../db/issue-refs";
|
|
25
|
-
|
|
18
|
+
|
|
26
19
|
import { resolveActorIssueRepo } from "../agent-issue-repo";
|
|
27
20
|
import { emitTaskChanged } from "../sse";
|
|
28
21
|
import { cleanIssueRefRelation } from "../db/task-issue-relation";
|
|
@@ -54,31 +47,31 @@ export function issueRepoForCreate(input: CreateTaskEntityInput): string | undef
|
|
|
54
47
|
// A ref the caller ASKED for that could not be linked must not vanish into a server log: record it
|
|
55
48
|
// on the Task's own ledger so it shows up in history (and in a spawned worker's hydrated brief).
|
|
56
49
|
// Creation itself still succeeds — a Task without its issue link is degraded, not invalid.
|
|
57
|
-
function recordIssueLinkFailure(taskId: number, issue: string, defaultRepo: string | undefined, error: unknown): void {
|
|
50
|
+
async function recordIssueLinkFailure(taskId: number, issue: string, defaultRepo: string | undefined, error: unknown): Promise<void> {
|
|
58
51
|
const message = errMessage(error);
|
|
59
52
|
console.warn(`task ${taskId} issue ref '${issue}' could not be linked on create: ${message}`);
|
|
60
53
|
try {
|
|
61
|
-
|
|
54
|
+
(await insertTaskEventAsync(taskId, {
|
|
62
55
|
source: "agent-relay",
|
|
63
56
|
type: "ref.issue.link_failed",
|
|
64
57
|
severity: "warning",
|
|
65
58
|
title: `Issue ref '${issue}' could not be linked`,
|
|
66
59
|
body: message,
|
|
67
60
|
metadata: { issue, ...(defaultRepo ? { defaultRepo } : {}) },
|
|
68
|
-
}, Date.now());
|
|
61
|
+
}, Date.now()));
|
|
69
62
|
} catch (eventError) {
|
|
70
63
|
console.warn(`task ${taskId} could not record issue-link failure: ${errMessage(eventError)}`);
|
|
71
64
|
}
|
|
72
65
|
}
|
|
73
66
|
|
|
74
|
-
export function addInitialIssueRefs(taskId: number, input: CreateTaskEntityInput): TaskDetail {
|
|
67
|
+
export async function addInitialIssueRefs(taskId: number, input: CreateTaskEntityInput): Promise<TaskDetail> {
|
|
75
68
|
const defaultRepo = issueRepoForCreate(input);
|
|
76
69
|
let detail = getTaskDetail(taskId)!;
|
|
77
70
|
for (const { issue, relation } of initialIssueRefs(input)) {
|
|
78
71
|
try {
|
|
79
|
-
detail =
|
|
72
|
+
detail = (await addTaskRefAsync(taskId, { issue, relation, defaultRepo, actor: input.createdBy }));
|
|
80
73
|
} catch (error) {
|
|
81
|
-
recordIssueLinkFailure(taskId, issue, defaultRepo, error);
|
|
74
|
+
(await recordIssueLinkFailure(taskId, issue, defaultRepo, error));
|
|
82
75
|
}
|
|
83
76
|
}
|
|
84
77
|
return detail;
|
|
@@ -95,7 +88,7 @@ export async function addInitialIssueRefsAsync(taskId: number, input: CreateTask
|
|
|
95
88
|
...(options?.idempotencyKey ? { idempotencyKey: `${options.idempotencyKey}:initial-ref:${index}` } : {}),
|
|
96
89
|
});
|
|
97
90
|
} catch (error) {
|
|
98
|
-
recordIssueLinkFailure(taskId, issue, defaultRepo, error);
|
|
91
|
+
(await recordIssueLinkFailure(taskId, issue, defaultRepo, error));
|
|
99
92
|
}
|
|
100
93
|
}
|
|
101
94
|
return detail;
|
|
@@ -115,8 +108,8 @@ function needsIssueRepo(input: AddTaskRefInput): boolean {
|
|
|
115
108
|
return isBareIssueRef(input.issue) && !input.defaultRepo?.trim();
|
|
116
109
|
}
|
|
117
110
|
|
|
118
|
-
export function addTaskEntityRef(id: number, input: AddTaskRefInput): TaskDetail {
|
|
119
|
-
const detail =
|
|
111
|
+
export async function addTaskEntityRef(id: number, input: AddTaskRefInput): Promise<TaskDetail> {
|
|
112
|
+
const detail = (await addTaskRefAsync(id, needsIssueRepo(input) ? withResolvedIssueRepo(input, getTaskDetail(id)) : input));
|
|
120
113
|
emitTaskChanged(detail, "task.updated");
|
|
121
114
|
return detail;
|
|
122
115
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { insertTaskEventAsync } from "../db/runtime-tail-async";
|
|
1
2
|
// #833 — the Task ↔ GitHub issue weave-through. This is the WRITE-THROUGH lens that
|
|
2
3
|
// the design refinement (weave-in, not duplicate) calls for: a comment on a Task does
|
|
3
4
|
// not land in a relay table that can drift — it writes a structured comment THROUGH to
|
|
@@ -32,7 +33,7 @@ import { getTaskDetail } from "../db/task-entity";
|
|
|
32
33
|
import { getTaskDetailAsync } from "../db/task-entity-async";
|
|
33
34
|
import { getIssueRef } from "../db/issue-refs";
|
|
34
35
|
import { listSuccessfulCloseActionsForIssueRef } from "../db/issue-lifecycle";
|
|
35
|
-
import {
|
|
36
|
+
import { getTaskEvent } from "../db/task-core";
|
|
36
37
|
import { listTaskEvents } from "../db/tasks";
|
|
37
38
|
import { type TaskCommentThroughKind, type TaskCommentThroughRecord } from "../db/task-comment-through";
|
|
38
39
|
import { failCommentThroughAsync, finalizeCommentThroughAsync, reserveCommentThroughAsync } from "../db/task-comment-through-async";
|
|
@@ -249,7 +250,7 @@ async function reconcileReclaim(params: {
|
|
|
249
250
|
body: string;
|
|
250
251
|
githubLinks: TaskIssueLink[];
|
|
251
252
|
reservation: TaskCommentThroughRecord;
|
|
252
|
-
recordReceipt: (posted: TaskIssueLink[], failed: Array<{ link: TaskIssueLink; error: string }>) => TaskEvent
|
|
253
|
+
recordReceipt: (posted: TaskIssueLink[], failed: Array<{ link: TaskIssueLink; error: string }>) => Promise<TaskEvent>;
|
|
253
254
|
opts: WeaveOptions;
|
|
254
255
|
}): Promise<WeaveWriteResult> {
|
|
255
256
|
const { taskId, kind, slotKey, payload, body, githubLinks, reservation, recordReceipt, opts } = params;
|
|
@@ -281,7 +282,7 @@ async function reconcileReclaim(params: {
|
|
|
281
282
|
}
|
|
282
283
|
|
|
283
284
|
// Every link now satisfied (already-present + freshly-posted) → finalize exactly once.
|
|
284
|
-
const event = recordReceipt(posted, []);
|
|
285
|
+
const event = await recordReceipt(posted, []);
|
|
285
286
|
await finalizeCommentThroughAsync(reservation.id, event.id);
|
|
286
287
|
await emitChanged(taskId);
|
|
287
288
|
return { taskId, posted, failed: [], event, deduped: recon.missing.length === 0 };
|
|
@@ -351,8 +352,8 @@ export async function commentOnTaskThrough(input: CommentOnTaskInput, opts: Weav
|
|
|
351
352
|
// The success-scoped receipt writer (shared by the normal-post and reconcile-found paths):
|
|
352
353
|
// an AUDIT of what actually landed on GitHub (posted only), not a second store of the
|
|
353
354
|
// discussion. GitHub stays canonical; the Task renders by reading it back.
|
|
354
|
-
const recordReceipt = (posted: TaskIssueLink[], failed: Array<{ link: TaskIssueLink; error: string }>): TaskEvent =>
|
|
355
|
-
|
|
355
|
+
const recordReceipt = async (posted: TaskIssueLink[], failed: Array<{ link: TaskIssueLink; error: string }>): Promise<TaskEvent> =>
|
|
356
|
+
(await insertTaskEventAsync(taskId, {
|
|
356
357
|
source: author,
|
|
357
358
|
type: "comment.posted",
|
|
358
359
|
severity: "info",
|
|
@@ -365,7 +366,7 @@ export async function commentOnTaskThrough(input: CommentOnTaskInput, opts: Weav
|
|
|
365
366
|
posted: posted.map((l) => ({ issueRefId: l.issueRefId, repo: l.repo, externalKey: l.externalKey, url: l.url })),
|
|
366
367
|
...(failed.length > 0 ? { failed: failed.map((f) => ({ issueRefId: f.link.issueRefId, error: f.error })) } : {}),
|
|
367
368
|
},
|
|
368
|
-
}, Date.now());
|
|
369
|
+
}, Date.now()));
|
|
369
370
|
|
|
370
371
|
// Idempotency = reserve→post→finalize (NOT scan→post→insert): the (taskId,kind,clientId)
|
|
371
372
|
// slot is claimed TRANSACTIONALLY before the awaited GitHub append, so concurrent same-key
|
|
@@ -401,7 +402,7 @@ export async function commentOnTaskThrough(input: CommentOnTaskInput, opts: Weav
|
|
|
401
402
|
);
|
|
402
403
|
}
|
|
403
404
|
|
|
404
|
-
const event = recordReceipt(result.posted, result.failed);
|
|
405
|
+
const event = (await recordReceipt(result.posted, result.failed));
|
|
405
406
|
if (reservation) await finalizeCommentThroughAsync(reservation.id, event.id);
|
|
406
407
|
await emitChanged(taskId);
|
|
407
408
|
return { taskId, posted: result.posted, failed: result.failed, event, deduped: false };
|
|
@@ -452,8 +453,8 @@ export async function postTaskMilestoneComment(input: MilestoneCommentInput, opt
|
|
|
452
453
|
const body = `${summary}${input.commitSha ? `\ncommit: \`${input.commitSha.slice(0, 12)}\`` : ""}${gatesLine(input.gates)}`;
|
|
453
454
|
const payload: TaskCommentPayload = { v: TASK_COMMENT_FORMAT_VERSION, kind: "milestone", taskId, author, milestone, ...(slotKey ? { key: slotKey } : {}) };
|
|
454
455
|
|
|
455
|
-
const recordReceipt = (posted: TaskIssueLink[], failed: Array<{ link: TaskIssueLink; error: string }>): TaskEvent =>
|
|
456
|
-
|
|
456
|
+
const recordReceipt = async (posted: TaskIssueLink[], failed: Array<{ link: TaskIssueLink; error: string }>): Promise<TaskEvent> =>
|
|
457
|
+
(await insertTaskEventAsync(taskId, {
|
|
457
458
|
source: author,
|
|
458
459
|
type: "milestone.posted",
|
|
459
460
|
severity: "info",
|
|
@@ -468,7 +469,7 @@ export async function postTaskMilestoneComment(input: MilestoneCommentInput, opt
|
|
|
468
469
|
posted: posted.map((l) => ({ issueRefId: l.issueRefId, repo: l.repo, externalKey: l.externalKey, url: l.url })),
|
|
469
470
|
...(failed.length > 0 ? { failed: failed.map((f) => ({ issueRefId: f.link.issueRefId, error: f.error })) } : {}),
|
|
470
471
|
},
|
|
471
|
-
}, Date.now());
|
|
472
|
+
}, Date.now()));
|
|
472
473
|
|
|
473
474
|
// Same reserve→post→finalize + reconcile-on-reclaim discipline as discussion, so a re-fired
|
|
474
475
|
// land posts at most one summary even across concurrency and post-before-finalize crashes.
|
|
@@ -502,7 +503,7 @@ export async function postTaskMilestoneComment(input: MilestoneCommentInput, opt
|
|
|
502
503
|
);
|
|
503
504
|
}
|
|
504
505
|
|
|
505
|
-
const event = recordReceipt(result.posted, result.failed);
|
|
506
|
+
const event = (await recordReceipt(result.posted, result.failed));
|
|
506
507
|
if (reservation) await finalizeCommentThroughAsync(reservation.id, event.id);
|
|
507
508
|
await emitChanged(taskId);
|
|
508
509
|
return { taskId, posted: result.posted, failed: result.failed, event, deduped: false };
|