@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,17 +1,18 @@
|
|
|
1
|
+
import { associateIssueAsync, insertTaskEventAsync } from "../db/runtime-tail-async";
|
|
1
2
|
import { commentIssueLifecycleOnce } from "./issue-lifecycle-comments";
|
|
2
3
|
import { deferIssueClose, pendingDoneWhenTasks } from "./issue-completion";
|
|
3
4
|
import { canCloseBacklink, landTaskIssueLinks, recordReferencesOnlyLand } from "./land-issue-relations";
|
|
4
5
|
import { errMessage } from "@humwick/sdk";
|
|
5
6
|
import { resolveLandedTaskIds, type LandedTaskAttributionInput } from "./landed-task-attribution";
|
|
6
|
-
import { getTaskDetail,
|
|
7
|
+
import { getTaskDetail, listTaskEvents } from "../db";
|
|
7
8
|
import { listEntitiesForIssue, listIssuesForEntity } from "../db/issue-associations";
|
|
8
9
|
import {
|
|
9
10
|
getSuccessfulIssueLifecycleAction,
|
|
10
11
|
listSuccessfulCloseActionsForCommit,
|
|
11
|
-
upsertIssueLifecycleAction,
|
|
12
12
|
} from "../db/issue-lifecycle";
|
|
13
|
-
import { getIssueRef
|
|
14
|
-
import {
|
|
13
|
+
import { getIssueRef } from "../db/issue-refs";
|
|
14
|
+
import { resolveIssueRefByExternalKeyAsync, resolveIssueRefFromStringAsync, updateIssueRefAsync, upsertIssueLifecycleActionAsync } from "../db/issue-refs-async";
|
|
15
|
+
|
|
15
16
|
import { resolveIssueTrackerAdapter } from "../issue-tracker";
|
|
16
17
|
import { defaultIssueRepo } from "../config";
|
|
17
18
|
// `repoFromGitRemote` / `parseOwnerRepoFromRemote` live in the shared ./git-remote module
|
|
@@ -141,42 +142,53 @@ const ISSUE_REF_AT_START_RE = /^(https:\/\/github\.com\/[A-Za-z0-9_.-]+\/[A-Za-z
|
|
|
141
142
|
const REF_SEPARATOR_RE = /^(?:\s*,\s*|\s+(?:and|&)\s+)/i;
|
|
142
143
|
|
|
143
144
|
// A run of issue refs ("#1, #2 and owner/repo#3") starting at the head of `segment`.
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
function collectRefRun(segment: string, fallbackDefaultRepo: string | undefined, into: IssueRef[]): void {
|
|
145
|
+
function refRun(segment: string): string[] {
|
|
146
|
+
const refs: string[] = [];
|
|
147
147
|
let rest = segment;
|
|
148
148
|
while (rest.trim()) {
|
|
149
149
|
rest = rest.trimStart();
|
|
150
150
|
const refMatch = rest.match(ISSUE_REF_AT_START_RE);
|
|
151
151
|
if (!refMatch) break;
|
|
152
|
-
|
|
153
|
-
into.push(resolveIssueRefFromString({ ref: refMatch[1]!, defaultRepo: fallbackDefaultRepo }));
|
|
154
|
-
} catch {
|
|
155
|
-
// Invalid or bare-without-default refs are ignored; the land itself must never fail here.
|
|
156
|
-
}
|
|
152
|
+
refs.push(refMatch[1]!);
|
|
157
153
|
rest = rest.slice(refMatch[0].length);
|
|
158
154
|
const separator = rest.match(REF_SEPARATOR_RE);
|
|
159
155
|
if (!separator) break;
|
|
160
156
|
rest = rest.slice(separator[0].length);
|
|
161
157
|
}
|
|
158
|
+
return refs;
|
|
162
159
|
}
|
|
163
160
|
|
|
164
|
-
|
|
165
|
-
|
|
161
|
+
// Bare refs resolve against `fallbackDefaultRepo`; unresolvable ones are skipped so a land never fails here.
|
|
162
|
+
async function resolveRefRuns(segments: Iterable<string>, fallbackDefaultRepo: string | undefined): Promise<IssueRef[]> {
|
|
166
163
|
const refs: IssueRef[] = [];
|
|
167
|
-
for (const
|
|
164
|
+
for (const segment of segments) {
|
|
165
|
+
for (const ref of refRun(segment)) {
|
|
166
|
+
try {
|
|
167
|
+
refs.push(await resolveIssueRefFromStringAsync({ ref, defaultRepo: fallbackDefaultRepo }));
|
|
168
|
+
} catch {
|
|
169
|
+
// Invalid or bare-without-default refs are ignored; the land itself must never fail here.
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
168
173
|
return issueRefMap(refs);
|
|
169
174
|
}
|
|
170
175
|
|
|
176
|
+
export function parseClosingIssueRefsAsync(text: string | undefined, fallbackDefaultRepo = defaultIssueRepo()): Promise<IssueRef[]> {
|
|
177
|
+
return resolveRefRuns(text ? [...text.matchAll(CLOSING_KEYWORD_RE)].map((match) => match[1] ?? "") : [], fallbackDefaultRepo);
|
|
178
|
+
}
|
|
179
|
+
|
|
171
180
|
// Parenthesized backlink groups: the trailing `(#NNN)` convention agents (and a squash merge)
|
|
172
181
|
// stamp on a subject without a closing keyword. Non-issue parens (conventional-commit scopes
|
|
173
182
|
// like `fix(tokens)`, notes like `(see also)`) carry no `#` and fall out.
|
|
174
183
|
const BACKLINK_GROUP_RE = /\(([^()]*#[0-9]+[^()]*)\)/g;
|
|
175
184
|
|
|
176
|
-
export function
|
|
177
|
-
|
|
185
|
+
export function parseBacklinkIssueRefsAsync(text: string | undefined, fallbackDefaultRepo = defaultIssueRepo()): Promise<IssueRef[]> {
|
|
186
|
+
return resolveRefRuns(text ? [...text.matchAll(BACKLINK_GROUP_RE)].map((group) => group[1] ?? "") : [], fallbackDefaultRepo);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
async function eachSubject(subjects: string[], parse: (text: string) => Promise<IssueRef[]>): Promise<IssueRef[]> {
|
|
178
190
|
const refs: IssueRef[] = [];
|
|
179
|
-
for (const
|
|
191
|
+
for (const subject of subjects) refs.push(...await parse(subject));
|
|
180
192
|
return issueRefMap(refs);
|
|
181
193
|
}
|
|
182
194
|
|
|
@@ -190,13 +202,13 @@ async function resolveIssueRefsForLand(input: LandedIssueLifecycleInput, links:
|
|
|
190
202
|
const associated = issueRefMap(links.flatMap((link) => link.issues.filter((issue) => issue.relation === "delivers").map((issue) => issue.ref)));
|
|
191
203
|
const fallbackDefaultRepo = await landDefaultRepo(input.workspace);
|
|
192
204
|
const subjects = landedSubjectTexts(input);
|
|
193
|
-
const keyworded =
|
|
205
|
+
const keyworded = await eachSubject(subjects, (subject) => parseClosingIssueRefsAsync(subject, fallbackDefaultRepo));
|
|
194
206
|
// A commit declaration is authored at the change boundary, unlike a Task association
|
|
195
207
|
// which can legitimately be historical or span several work items. It is the sole close
|
|
196
208
|
// target when present (#1694).
|
|
197
209
|
if (keyworded.length > 0) return { source: "commit", refs: keyworded, declared: keyworded };
|
|
198
210
|
if (!input.prLand && links.some((link) => link.buildLike)) {
|
|
199
|
-
const backlinks =
|
|
211
|
+
const backlinks = (await eachSubject(subjects, (subject) => parseBacklinkIssueRefsAsync(subject, fallbackDefaultRepo)))
|
|
200
212
|
.filter((ref) => canCloseBacklink(ref, links));
|
|
201
213
|
if (backlinks.length) return { source: "backlink", refs: backlinks, declared: backlinks };
|
|
202
214
|
}
|
|
@@ -215,18 +227,18 @@ function taskIssueLinkMismatches(taskIds: number[], declared: IssueRef[] | undef
|
|
|
215
227
|
});
|
|
216
228
|
}
|
|
217
229
|
|
|
218
|
-
function recordIssueLinkMismatch(taskId: number, mismatch: IssueLinkMismatch, input: LandedIssueLifecycleInput): void {
|
|
230
|
+
async function recordIssueLinkMismatch(taskId: number, mismatch: IssueLinkMismatch, input: LandedIssueLifecycleInput): Promise<void> {
|
|
219
231
|
const key = landKey(input);
|
|
220
232
|
if (listTaskEvents(taskId).some((event) => event.type === "issue-link-mismatch" && event.metadata.landKey === key)) return;
|
|
221
233
|
const body = `Landed commit declared issue(s) ${mismatch.declared.map((key) => `#${key}`).join(", ")}, while Task T${taskId} remains linked to ${mismatch.associated.map((key) => `#${key}`).join(", ")}. Used the commit declaration for issue lifecycle; Task links were not changed.`;
|
|
222
|
-
|
|
234
|
+
(await insertTaskEventAsync(taskId, {
|
|
223
235
|
source: "issue-lifecycle",
|
|
224
236
|
type: "issue-link-mismatch",
|
|
225
237
|
severity: "warning",
|
|
226
238
|
title: "Commit issue declaration differs from Task link",
|
|
227
239
|
body,
|
|
228
240
|
metadata: { landKey: key, declared: mismatch.declared, associated: mismatch.associated, source: "commit-declaration" },
|
|
229
|
-
}, Date.now());
|
|
241
|
+
}, Date.now()));
|
|
230
242
|
const task = getTaskDetail(taskId);
|
|
231
243
|
if (task) emitTaskChanged(task, "task.issue-link-mismatch");
|
|
232
244
|
}
|
|
@@ -348,7 +360,7 @@ async function reconcileClosedIssueRefBeforeSkip(issueRef: IssueRef, opts: Issue
|
|
|
348
360
|
// LOW-4 (#2520 review) — thread the live closeReason through: a completed close observed
|
|
349
361
|
// here was dropped, so the cached ref stayed reason-less and could never count as a
|
|
350
362
|
// completed close. updateIssueRef preserves the cached reason when live carries none.
|
|
351
|
-
issueRef:
|
|
363
|
+
issueRef: await updateIssueRefAsync(issueRef.id, { status, title: live.title, closeReason: live.closeReason, statusSyncedAt: Date.now() }) ?? issueRef,
|
|
352
364
|
liveStatus: live.status,
|
|
353
365
|
};
|
|
354
366
|
} catch (error) {
|
|
@@ -406,7 +418,7 @@ export async function closeIssueRefForLand(
|
|
|
406
418
|
logFailure(opts, `issue lifecycle epic-guard title lookup returned no title for ${latest.id} on ${key}`);
|
|
407
419
|
return { issueRef: latest, action: "skipped", reason: "title-unavailable", landKey: key };
|
|
408
420
|
}
|
|
409
|
-
latest =
|
|
421
|
+
latest = await updateIssueRefAsync(latest.id, { title, statusSyncedAt: Date.now() }) ?? latest;
|
|
410
422
|
} catch (error) {
|
|
411
423
|
logFailure(opts, `issue lifecycle epic-guard title lookup failed for ${latest.id} on ${key}: ${errMessage(error)}`);
|
|
412
424
|
return { issueRef: latest, action: "skipped", reason: "title-unavailable", landKey: key };
|
|
@@ -423,22 +435,25 @@ export async function closeIssueRefForLand(
|
|
|
423
435
|
return { issueRef: latest, action: "skipped", reason: "epic-issue", landKey: key };
|
|
424
436
|
}
|
|
425
437
|
|
|
438
|
+
const closeAction = {
|
|
439
|
+
issueRefId: latest.id,
|
|
440
|
+
action: "close" as const,
|
|
441
|
+
landKey: key,
|
|
442
|
+
workspaceId: input.workspace.id,
|
|
443
|
+
branch: input.workspace.branch,
|
|
444
|
+
baseRef: input.workspace.baseRef ?? "main",
|
|
445
|
+
commitSha: input.mergedSha,
|
|
446
|
+
commitSubject: input.subject,
|
|
447
|
+
agentId: input.workspace.ownerAgentId,
|
|
448
|
+
source,
|
|
449
|
+
};
|
|
426
450
|
let openSubIssues: IssueTrackerIssueSummary[];
|
|
427
451
|
try {
|
|
428
452
|
openSubIssues = await listOpenSubIssuesForLand(latest, opts);
|
|
429
453
|
} catch (error) {
|
|
430
454
|
const message = `sub-issue lookup failed: ${errMessage(error)}`;
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
action: "close",
|
|
434
|
-
landKey: key,
|
|
435
|
-
workspaceId: input.workspace.id,
|
|
436
|
-
branch: input.workspace.branch,
|
|
437
|
-
baseRef: input.workspace.baseRef ?? "main",
|
|
438
|
-
commitSha: input.mergedSha,
|
|
439
|
-
commitSubject: input.subject,
|
|
440
|
-
agentId: input.workspace.ownerAgentId,
|
|
441
|
-
source,
|
|
455
|
+
await upsertIssueLifecycleActionAsync({
|
|
456
|
+
...closeAction,
|
|
442
457
|
status: "failed",
|
|
443
458
|
error: message,
|
|
444
459
|
});
|
|
@@ -458,23 +473,14 @@ export async function closeIssueRefForLand(
|
|
|
458
473
|
const comment = closeAuditComment(input);
|
|
459
474
|
try {
|
|
460
475
|
await adapterFor(latest, opts).close(latest, { comment, labels: ["fixed"], closeReason: "completed" });
|
|
461
|
-
const closed =
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
action: "close",
|
|
465
|
-
landKey: key,
|
|
466
|
-
workspaceId: input.workspace.id,
|
|
467
|
-
branch: input.workspace.branch,
|
|
468
|
-
baseRef: input.workspace.baseRef ?? "main",
|
|
469
|
-
commitSha: input.mergedSha,
|
|
470
|
-
commitSubject: input.subject,
|
|
471
|
-
agentId: input.workspace.ownerAgentId,
|
|
472
|
-
source,
|
|
476
|
+
const closed = await updateIssueRefAsync(latest.id, { status: "closed", closeReason: "completed", statusSyncedAt: Date.now() }) ?? latest;
|
|
477
|
+
await upsertIssueLifecycleActionAsync({
|
|
478
|
+
...closeAction,
|
|
473
479
|
comment,
|
|
474
480
|
status: "succeeded",
|
|
475
481
|
});
|
|
476
482
|
if (input.workspace.ownerAgentId) {
|
|
477
|
-
recordAndEmitIssueActivity({
|
|
483
|
+
(await recordAndEmitIssueActivity({
|
|
478
484
|
agentId: input.workspace.ownerAgentId,
|
|
479
485
|
action: "done",
|
|
480
486
|
issueRefId: latest.id,
|
|
@@ -482,7 +488,7 @@ export async function closeIssueRefForLand(
|
|
|
482
488
|
title: "Issue closed on land",
|
|
483
489
|
body: comment,
|
|
484
490
|
metadata: { workspaceId: input.workspace.id, branch: input.workspace.branch, commitSha: input.mergedSha, source },
|
|
485
|
-
});
|
|
491
|
+
}));
|
|
486
492
|
}
|
|
487
493
|
// #2520 — relay's own completed close is a terminal trigger for the plan nodes bound to
|
|
488
494
|
// this ref. Awaited post-commit effect: the close is already durable, and the plan update
|
|
@@ -494,17 +500,8 @@ export async function closeIssueRefForLand(
|
|
|
494
500
|
return { issueRef: closed, action: "closed", source, landKey: key };
|
|
495
501
|
} catch (error) {
|
|
496
502
|
const message = errMessage(error);
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
action: "close",
|
|
500
|
-
landKey: key,
|
|
501
|
-
workspaceId: input.workspace.id,
|
|
502
|
-
branch: input.workspace.branch,
|
|
503
|
-
baseRef: input.workspace.baseRef ?? "main",
|
|
504
|
-
commitSha: input.mergedSha,
|
|
505
|
-
commitSubject: input.subject,
|
|
506
|
-
agentId: input.workspace.ownerAgentId,
|
|
507
|
-
source,
|
|
503
|
+
await upsertIssueLifecycleActionAsync({
|
|
504
|
+
...closeAction,
|
|
508
505
|
comment,
|
|
509
506
|
status: "failed",
|
|
510
507
|
error: message,
|
|
@@ -550,9 +547,9 @@ export async function handleLandedIssueLifecycle(input: LandedIssueLifecycleInpu
|
|
|
550
547
|
const taskIds = resolveLandedTaskIds(input);
|
|
551
548
|
const links = landTaskIssueLinks(taskIds);
|
|
552
549
|
const resolved = await resolveIssueRefsForLand(input, links);
|
|
553
|
-
recordReferencesOnlyLand(links, resolved.refs, landKey(input));
|
|
550
|
+
(await recordReferencesOnlyLand(links, resolved.refs, landKey(input)));
|
|
554
551
|
const mismatches = taskIssueLinkMismatches(taskIds, resolved.declared);
|
|
555
|
-
for (const mismatch of mismatches) recordIssueLinkMismatch(mismatch.taskId, mismatch, input);
|
|
552
|
+
for (const mismatch of mismatches) (await recordIssueLinkMismatch(mismatch.taskId, mismatch, input));
|
|
556
553
|
if (resolved.refs.length === 0 && taskIds.length > 0 && taskIds.every((id) => listIssuesForEntity("task", String(id)).length === 0)) {
|
|
557
554
|
logFailure(opts, `issue lifecycle found landed task(s) without linked issue refs: tasks=${taskIds.join(",")} workspace=${input.workspace.id} branch=${input.workspace.branch ?? "unknown"}`);
|
|
558
555
|
}
|
|
@@ -564,34 +561,34 @@ export async function handleLandedIssueLifecycle(input: LandedIssueLifecycleInpu
|
|
|
564
561
|
return { source: resolved.source, closed, reopened, skipped: [], mismatches };
|
|
565
562
|
}
|
|
566
563
|
|
|
567
|
-
function resolveReopenRef(input: ReopenIssueLifecycleInput): IssueRef {
|
|
564
|
+
async function resolveReopenRef(input: ReopenIssueLifecycleInput): Promise<IssueRef> {
|
|
568
565
|
if (input.issueRefId) {
|
|
569
566
|
const issueRef = getIssueRef(input.issueRefId);
|
|
570
567
|
if (!issueRef) throw new Error(`issue ref ${input.issueRefId} not found`);
|
|
571
568
|
return issueRef;
|
|
572
569
|
}
|
|
573
|
-
if (input.ref) return
|
|
570
|
+
if (input.ref) return (await resolveIssueRefFromStringAsync({ ref: input.ref, defaultRepo: input.defaultRepo ?? input.repo, provider: input.provider, title: input.title }));
|
|
574
571
|
if (input.provider && input.repo && input.externalKey) {
|
|
575
|
-
return
|
|
572
|
+
return (await resolveIssueRefByExternalKeyAsync({
|
|
576
573
|
provider: input.provider,
|
|
577
574
|
repo: input.repo,
|
|
578
575
|
externalKey: input.externalKey,
|
|
579
576
|
url: input.url,
|
|
580
577
|
title: input.title,
|
|
581
|
-
});
|
|
578
|
+
}));
|
|
582
579
|
}
|
|
583
580
|
throw new Error("issueRefId, ref, or provider/repo/externalKey required");
|
|
584
581
|
}
|
|
585
582
|
|
|
586
583
|
export async function reopenIssueLifecycle(input: ReopenIssueLifecycleInput, opts: IssueLifecycleOptions = {}): Promise<ReopenIssueLifecycleResult> {
|
|
587
|
-
const issueRef = resolveReopenRef(input);
|
|
584
|
+
const issueRef = await resolveReopenRef(input);
|
|
588
585
|
const key = manualReopenKey(issueRef);
|
|
589
586
|
if (issueRef.status === "open") return { issueRef, action: "skipped", reason: "already-open", landKey: key };
|
|
590
587
|
const comment = input.comment ?? "Reopened by Humwick issue lifecycle.";
|
|
591
588
|
try {
|
|
592
589
|
await adapterFor(issueRef, opts).reopen(issueRef, { comment });
|
|
593
|
-
const opened =
|
|
594
|
-
|
|
590
|
+
const opened = await updateIssueRefAsync(issueRef.id, { status: "open", statusSyncedAt: Date.now() }) ?? issueRef;
|
|
591
|
+
await upsertIssueLifecycleActionAsync({
|
|
595
592
|
issueRefId: issueRef.id,
|
|
596
593
|
action: "reopen",
|
|
597
594
|
landKey: key,
|
|
@@ -600,11 +597,11 @@ export async function reopenIssueLifecycle(input: ReopenIssueLifecycleInput, opt
|
|
|
600
597
|
status: "succeeded",
|
|
601
598
|
source: "explicit",
|
|
602
599
|
});
|
|
603
|
-
if (input.entityType && input.entityId)
|
|
600
|
+
if (input.entityType && input.entityId) (await associateIssueAsync(issueRef.id, input.entityType, input.entityId));
|
|
604
601
|
return { issueRef: opened, action: "reopened", landKey: key };
|
|
605
602
|
} catch (error) {
|
|
606
603
|
const message = errMessage(error);
|
|
607
|
-
|
|
604
|
+
await upsertIssueLifecycleActionAsync({
|
|
608
605
|
issueRefId: issueRef.id,
|
|
609
606
|
action: "reopen",
|
|
610
607
|
landKey: key,
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
+
import { deleteIssueRefAsync, listIssueRefsAsync, resolveIssueRefByExternalKeyAsync, resolveIssueRefFromStringAsync, updateIssueRefAsync, upsertIssueRefAsync } from "../db/issue-refs-async";
|
|
1
2
|
import {
|
|
2
|
-
deleteIssueRef,
|
|
3
3
|
getIssueRef,
|
|
4
|
-
listIssueRefs,
|
|
5
|
-
resolveIssueRefByExternalKey,
|
|
6
|
-
resolveIssueRefFromString,
|
|
7
|
-
updateIssueRef,
|
|
8
|
-
upsertIssueRef,
|
|
9
4
|
type ListIssueRefsOptions,
|
|
10
5
|
type ResolveIssueRefByExternalKeyInput,
|
|
11
6
|
type ResolveIssueRefFromStringInput,
|
|
@@ -13,22 +8,22 @@ import {
|
|
|
13
8
|
type UpsertIssueRefInput,
|
|
14
9
|
} from "../db/issue-refs";
|
|
15
10
|
|
|
16
|
-
export { getIssueRef,
|
|
11
|
+
export { getIssueRef, listIssueRefsAsync, type ListIssueRefsOptions };
|
|
17
12
|
|
|
18
|
-
export function
|
|
19
|
-
return
|
|
13
|
+
export function upsertIssueRefMappingAsync(input: UpsertIssueRefInput) {
|
|
14
|
+
return upsertIssueRefAsync(input);
|
|
20
15
|
}
|
|
21
16
|
|
|
22
|
-
export function
|
|
23
|
-
return "ref" in input ?
|
|
17
|
+
export async function resolveIssueRefMappingAsync(input: ResolveIssueRefByExternalKeyInput | ResolveIssueRefFromStringInput) {
|
|
18
|
+
return "ref" in input ? (await resolveIssueRefFromStringAsync(input)) : (await resolveIssueRefByExternalKeyAsync(input));
|
|
24
19
|
}
|
|
25
20
|
|
|
26
|
-
export function
|
|
27
|
-
return
|
|
21
|
+
export function patchIssueRefMappingAsync(id: string, input: UpdateIssueRefInput) {
|
|
22
|
+
return updateIssueRefAsync(id, input);
|
|
28
23
|
}
|
|
29
24
|
|
|
30
|
-
export function
|
|
31
|
-
return
|
|
25
|
+
export function deleteIssueRefMappingAsync(id: string) {
|
|
26
|
+
return deleteIssueRefAsync(id);
|
|
32
27
|
}
|
|
33
28
|
|
|
34
29
|
// --- Caller-supplied issue-ref normalization (#2214/#1930) ---------------------------------
|
|
@@ -24,6 +24,8 @@ const releaseFile = process.env.CUTOVER_CHAOS_RELEASE_FILE;
|
|
|
24
24
|
const resultFile = process.env.CUTOVER_CHAOS_RESULT_FILE;
|
|
25
25
|
const owner = process.env.CUTOVER_CHAOS_OWNER ?? `worker-${process.pid}`;
|
|
26
26
|
const leaseMs = Number(process.env.CUTOVER_CHAOS_LEASE_MS ?? "400");
|
|
27
|
+
let now = Number(required("CUTOVER_CHAOS_NOW"));
|
|
28
|
+
const clock = () => now;
|
|
27
29
|
|
|
28
30
|
function required(name: string): string {
|
|
29
31
|
const value = relayEnv(process.env, name);
|
|
@@ -60,7 +62,7 @@ function timerInput(idSuffix = String(process.pid)): CreateScheduledTimerRowInpu
|
|
|
60
62
|
createdByKind: "system",
|
|
61
63
|
createdByScopes: ["message:send"],
|
|
62
64
|
deliveryFrom: "system",
|
|
63
|
-
nextRunAt:
|
|
65
|
+
nextRunAt: now + 100_000,
|
|
64
66
|
scheduleKind: "once",
|
|
65
67
|
scheduleDef: { afterMs: 100_000 },
|
|
66
68
|
body: `cutover-${idSuffix}`,
|
|
@@ -87,6 +89,7 @@ async function main(): Promise<void> {
|
|
|
87
89
|
};
|
|
88
90
|
const c = new TimerMessageCutoverCoordinator({
|
|
89
91
|
ownerId: owner,
|
|
92
|
+
now: clock,
|
|
90
93
|
leaseMs,
|
|
91
94
|
tickMs: 25,
|
|
92
95
|
quiesceTimeoutMs: 5_000,
|
|
@@ -94,12 +97,12 @@ async function main(): Promise<void> {
|
|
|
94
97
|
faults,
|
|
95
98
|
});
|
|
96
99
|
await c.requestQuiesce();
|
|
97
|
-
if (boundary === "after-renewal")
|
|
100
|
+
if (boundary === "after-renewal") now += Math.ceil(leaseMs * 0.75);
|
|
98
101
|
await c.tick();
|
|
99
102
|
await c.tick();
|
|
100
103
|
await c.tick();
|
|
101
104
|
if (boundary === "before-release") {
|
|
102
|
-
c.requestAbort("chaos release");
|
|
105
|
+
await c.requestAbort("chaos release");
|
|
103
106
|
await c.tick();
|
|
104
107
|
await c.tick();
|
|
105
108
|
}
|
|
@@ -112,7 +115,7 @@ async function main(): Promise<void> {
|
|
|
112
115
|
const ticks = phaseTicks[boundary];
|
|
113
116
|
if (ticks === undefined) throw new Error(`unknown deadline-watch phase ${boundary}`);
|
|
114
117
|
const c = new TimerMessageCutoverCoordinator({
|
|
115
|
-
ownerId: owner, leaseMs: 10_000, tickMs: 25, quiesceTimeoutMs: 8_000, worstCaseDrainTransferMs: 10_000,
|
|
118
|
+
ownerId: owner, now: clock, leaseMs: 10_000, tickMs: 25, quiesceTimeoutMs: 8_000, worstCaseDrainTransferMs: 10_000,
|
|
116
119
|
});
|
|
117
120
|
await c.requestQuiesce();
|
|
118
121
|
for (let i = 0; i < ticks; i++) await c.tick();
|
|
@@ -124,14 +127,14 @@ async function main(): Promise<void> {
|
|
|
124
127
|
|
|
125
128
|
if (command === "claim-bound") {
|
|
126
129
|
const c = new TimerMessageCutoverCoordinator({
|
|
127
|
-
ownerId: owner, leaseMs: 1_000, tickMs: 25, quiesceTimeoutMs: 300, worstCaseDrainTransferMs: 1_000,
|
|
130
|
+
ownerId: owner, now: clock, leaseMs: 1_000, tickMs: 25, quiesceTimeoutMs: 300, worstCaseDrainTransferMs: 1_000,
|
|
128
131
|
});
|
|
129
132
|
await c.requestQuiesce();
|
|
130
133
|
await c.tick();
|
|
131
134
|
await c.tick();
|
|
132
135
|
const drain = await c.tick();
|
|
133
136
|
if (boundary === "held") {
|
|
134
|
-
|
|
137
|
+
now += 340;
|
|
135
138
|
await c.tick();
|
|
136
139
|
await c.tick();
|
|
137
140
|
}
|
|
@@ -141,7 +144,7 @@ async function main(): Promise<void> {
|
|
|
141
144
|
|
|
142
145
|
if (command === "recover") {
|
|
143
146
|
const c = new TimerMessageCutoverCoordinator({
|
|
144
|
-
ownerId: owner, leaseMs, tickMs: 25, quiesceTimeoutMs: 5_000, worstCaseDrainTransferMs: 6_000,
|
|
147
|
+
ownerId: owner, now: clock, leaseMs, tickMs: 25, quiesceTimeoutMs: 5_000, worstCaseDrainTransferMs: 6_000,
|
|
145
148
|
});
|
|
146
149
|
const outcomes = [];
|
|
147
150
|
for (let i = 0; i < 5; i++) outcomes.push(await c.tick());
|
|
@@ -152,7 +155,7 @@ async function main(): Promise<void> {
|
|
|
152
155
|
if (command === "close-gate") {
|
|
153
156
|
marker();
|
|
154
157
|
const c = new TimerMessageCutoverCoordinator({
|
|
155
|
-
ownerId: owner, leaseMs: 5_000, tickMs: 25, quiesceTimeoutMs: 5_000, worstCaseDrainTransferMs: 6_000,
|
|
158
|
+
ownerId: owner, now: clock, leaseMs: 5_000, tickMs: 25, quiesceTimeoutMs: 5_000, worstCaseDrainTransferMs: 6_000,
|
|
156
159
|
});
|
|
157
160
|
const acquired = await c.requestQuiesce();
|
|
158
161
|
const outcome = acquired ? await c.tick() : null;
|
|
@@ -123,7 +123,7 @@ function writeResult(result: Record<string, unknown>): void {
|
|
|
123
123
|
* live-slow-applier boundary, a LIVE stall handshaken over marker files). */
|
|
124
124
|
function faultsFor(boundary: string): TimerIngressFaults {
|
|
125
125
|
switch (boundary) {
|
|
126
|
-
case "accept-before-commit": return {
|
|
126
|
+
case "accept-before-commit": return {}; // Armed on the writer thread in main().
|
|
127
127
|
case "accept-after-commit": return { afterAcceptCommit: selfKill };
|
|
128
128
|
case "apply-after-claim": return { afterClaim: selfKill };
|
|
129
129
|
case "apply-after-target": return { afterApply: selfKill };
|
|
@@ -253,6 +253,11 @@ async function recoverLoop(host: ModuleHost, ingress: TimerIngress): Promise<voi
|
|
|
253
253
|
|
|
254
254
|
async function main(): Promise<void> {
|
|
255
255
|
initDb(DB_PATH);
|
|
256
|
+
if (BOUNDARY === "accept-before-commit") {
|
|
257
|
+
const { getGateway } = await import("../db/gateway");
|
|
258
|
+
const kind = CMD === "accept-cancel" ? "Cancel" : "Create";
|
|
259
|
+
await getGateway().write("seam.armFault", { name: `timerIngress.accept${kind}.beforeCommit`, action: "kill" });
|
|
260
|
+
}
|
|
256
261
|
const host = buildHost();
|
|
257
262
|
|
|
258
263
|
if (CMD === "accept-create") {
|
|
@@ -121,6 +121,7 @@
|
|
|
121
121
|
* undriven seed only parks later).
|
|
122
122
|
*
|
|
123
123
|
*/
|
|
124
|
+
import { framed } from "../hub-metrics";
|
|
124
125
|
import { randomUUID } from "node:crypto";
|
|
125
126
|
import { errMessage } from "@humwick/sdk";
|
|
126
127
|
import {
|
|
@@ -322,7 +323,7 @@ export class TimerIngressRejectedError extends Error {
|
|
|
322
323
|
}
|
|
323
324
|
|
|
324
325
|
export function createTimerIngress(options: TimerIngressOptions): TimerIngress {
|
|
325
|
-
installTimerIngressSchema();
|
|
326
|
+
installTimerIngressSchema({ ifNotInstalled: true });
|
|
326
327
|
const apply = options.apply;
|
|
327
328
|
const ownerId = options.ownerId ?? `${process.pid}-${randomUUID()}`;
|
|
328
329
|
const now = options.now ?? Date.now;
|
|
@@ -669,9 +670,8 @@ export function createTimerIngress(options: TimerIngressOptions): TimerIngress {
|
|
|
669
670
|
|
|
670
671
|
start() {
|
|
671
672
|
if (ticker) return;
|
|
672
|
-
const pass = () =>
|
|
673
|
-
|
|
674
|
-
};
|
|
673
|
+
const pass = framed("timer kernel-timer-ingress", () =>
|
|
674
|
+
api.applyOnce().catch((error) => console.warn(`timer ingress applier pass failed: ${errMessage(error)}`)));
|
|
675
675
|
pass(); // boot recovery: converge whatever a prior process left unsettled
|
|
676
676
|
ticker = setInterval(pass, tickMs);
|
|
677
677
|
},
|
|
@@ -1,14 +1,7 @@
|
|
|
1
|
+
import { upsertAgentAsync } from "../db/agents-async";
|
|
1
2
|
import { createControllableClock, createSqliteModuleHost, createSeededRng, type WorkflowStepCommitFaults } from "@humwick/kernel";
|
|
2
3
|
import { timers } from "@humwick/kernel/timers.pilot";
|
|
3
|
-
import {
|
|
4
|
-
getDb,
|
|
5
|
-
getScheduledTimer,
|
|
6
|
-
initDb,
|
|
7
|
-
insertScheduledTimer,
|
|
8
|
-
TimerMessageAuthorityParticipantStore,
|
|
9
|
-
TimerMessageAuthorityStore,
|
|
10
|
-
upsertAgent,
|
|
11
|
-
} from "../db";
|
|
4
|
+
import { getDb, getScheduledTimer, initDb, insertScheduledTimer, TimerMessageAuthorityParticipantStore, TimerMessageAuthorityStore } from "../db";
|
|
12
5
|
import { migrateInputFor } from "./kernel-timers-migrate";
|
|
13
6
|
|
|
14
7
|
const [dbPath, command, boundary = "none", shape = "once"] = process.argv.slice(2);
|
|
@@ -49,7 +42,7 @@ const host = createSqliteModuleHost({
|
|
|
49
42
|
host.register(timers);
|
|
50
43
|
|
|
51
44
|
if (command === "seed") {
|
|
52
|
-
|
|
45
|
+
upsertAgentAsync({ id: "stage5-agent", name: "stage5-agent", status: "online", ready: true });
|
|
53
46
|
const inserted = insertScheduledTimer({
|
|
54
47
|
target: "stage5-agent",
|
|
55
48
|
createdBy: "stage5-agent",
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { upsertAgentAsync } from "../db/agents-async";
|
|
1
2
|
import { relayEnv } from "@humwick/sdk/env";
|
|
2
3
|
import { Database } from "bun:sqlite";
|
|
3
4
|
import { existsSync, writeFileSync } from "node:fs";
|
|
4
|
-
import { applyConnectionPragmas, getDb, initDb, insertScheduledTimer, setDb
|
|
5
|
+
import { applyConnectionPragmas, getDb, initDb, insertScheduledTimer, setDb } from "../db";
|
|
5
6
|
import { decideLegacyTimerMessageFire } from "../db/timer-message-fire";
|
|
6
7
|
import { executeTimerMessageOperator } from "./kernel-timers-operator";
|
|
7
8
|
import { createToken } from "../token-db";
|
|
@@ -73,7 +74,7 @@ const audit = { actor: "dashboard:chaos", authenticated: true, authorized: true
|
|
|
73
74
|
async function main(): Promise<void> {
|
|
74
75
|
if (action === "seed") {
|
|
75
76
|
initDb(dbPath);
|
|
76
|
-
|
|
77
|
+
(await upsertAgentAsync({ id: "chaos-agent", name: "chaos-agent", status: "online", ready: true }));
|
|
77
78
|
seed("message-a");
|
|
78
79
|
seed("message-b");
|
|
79
80
|
seed("message-c");
|
|
@@ -124,7 +124,7 @@ export async function drainKernelRelayOutbox(host: ModuleHost, options: DrainOut
|
|
|
124
124
|
try {
|
|
125
125
|
// At-least-once: a re-drained row re-presents the SAME `base:run:N` key, so `sendMessageService`
|
|
126
126
|
// returns the already-stored message (`created:false`) instead of storing a second — no double-send.
|
|
127
|
-
const message = send(sendInputOf(row), sendAuthContext(row));
|
|
127
|
+
const message = await send(sendInputOf(row), sendAuthContext(row));
|
|
128
128
|
await host.invoke(timers, "markRelaySendSent", DRAINER_IDENTITY, { id: row.id, messageId: message.message.id });
|
|
129
129
|
result.sent += 1;
|
|
130
130
|
} catch (error) {
|
|
@@ -181,7 +181,7 @@ export async function runStage10OperatorTransfer(
|
|
|
181
181
|
if (!await recordG1TransferAsync(input.requestId, options.ownerId, fenced.epoch, g1)) {
|
|
182
182
|
return access.result(input, commandId, "running");
|
|
183
183
|
}
|
|
184
|
-
} else coordinator.markReverseTransferDesired(targetMode, sourceMode);
|
|
184
|
+
} else (await coordinator.markReverseTransferDesired(targetMode, sourceMode));
|
|
185
185
|
|
|
186
186
|
let batchNumber = 0;
|
|
187
187
|
for (;;) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { framed } from "../hub-metrics";
|
|
1
2
|
import { errMessage } from "@humwick/sdk";
|
|
2
3
|
import { createModuleHost, type ModuleHost } from "@humwick/kernel";
|
|
3
4
|
import type { WorkflowRuntime } from "@humwick/kernel/workflow-runtime";
|
|
@@ -213,11 +214,11 @@ export function startKernelServedTimers(options: { autoTick?: boolean } = {}): K
|
|
|
213
214
|
|
|
214
215
|
// Boot + interval both drive the single-flight pass. Capturing `running` per tick means a tick that
|
|
215
216
|
// fires after teardown returns early rather than pumping a torn-down supervisor.
|
|
216
|
-
const pump = () => {
|
|
217
|
+
const pump = framed("timer kernel-timers", () => {
|
|
217
218
|
const current = running;
|
|
218
219
|
if (!current) return;
|
|
219
|
-
|
|
220
|
-
};
|
|
220
|
+
return pumpRunningTimers(current).catch((error) => console.warn(`kernel timers pump failed: ${errMessage(error)}`));
|
|
221
|
+
});
|
|
221
222
|
// Tests that drive the supervisor only by awaited pumps opt out of the boot pass and the interval.
|
|
222
223
|
if (options.autoTick === false) return running;
|
|
223
224
|
pump();
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import type { Command, LandGatesConfig, Orchestrator, WorkspaceRecord } from "@humwick/sdk";
|
|
1
|
+
import type { Command, LandGatesConfig, Orchestrator, WorkspaceRecord, WorktreeProvisionConfig } from "@humwick/sdk";
|
|
2
|
+
import { DELEGATED_LAND_DEPS_REQUIRED } from "@humwick/sdk/worktree-config";
|
|
3
|
+
import { LandConfigurationError } from "../workspace-land-refusal";
|
|
2
4
|
import { recordTaskEventAsync } from "../db/task-async";
|
|
3
5
|
import { boundTaskIdsForWorkspace } from "./workspace-task-binding";
|
|
4
6
|
import { listOrchestrators } from "../db";
|
|
@@ -13,7 +15,7 @@ export function gateHostMeetsRequirements(host: Orchestrator, requirements: NonN
|
|
|
13
15
|
|
|
14
16
|
/** Absence preserves local landing; declared requirements opt into fleet placement. */
|
|
15
17
|
export async function selectLandGateHost(workspace: WorkspaceRecord, owner: Orchestrator,
|
|
16
|
-
remoteIdentity: string, requirements?: LandGatesConfig["requirements"],
|
|
18
|
+
remoteIdentity: string, requirements?: LandGatesConfig["requirements"], depsStrategy?: WorktreeProvisionConfig["depsStrategy"],
|
|
17
19
|
): Promise<{ orchestrator: Orchestrator; repoRoot: string; delegated: boolean }> {
|
|
18
20
|
if (!requirements) return { orchestrator: owner, repoRoot: workspace.repoRoot, delegated: false };
|
|
19
21
|
const views = new Map(listHostViews(Date.now()).map((host) => [host.id, host]));
|
|
@@ -39,6 +41,13 @@ export async function selectLandGateHost(workspace: WorkspaceRecord, owner: Orch
|
|
|
39
41
|
};
|
|
40
42
|
const delegates = eligible.filter((host) => host.id !== owner.id && host.capabilities?.delegatedLandGateV1 === true)
|
|
41
43
|
.sort((a, b) => availableSlots(b) - availableSlots(a));
|
|
44
|
+
if (delegates.length && depsStrategy === "symlink") {
|
|
45
|
+
if (gateHostMeetsRequirements(owner, requirements)) {
|
|
46
|
+
throw new Error(`owner ${owner.hostname} temporarily unavailable for local symlink dependency gates`
|
|
47
|
+
+ (notReady.length ? `: ${notReady.join("; ")}` : " (gate admission disabled)"));
|
|
48
|
+
}
|
|
49
|
+
throw new LandConfigurationError(`${DELEGATED_LAND_DEPS_REQUIRED}; owner ${owner.hostname} does not meet gate host requirements`);
|
|
50
|
+
}
|
|
42
51
|
const mapped = delegates.length ? await repoCwdsByHost(workspace.sourceCwd || workspace.repoRoot,
|
|
43
52
|
remoteIdentity, delegates.map((host) => host.id), true) : undefined;
|
|
44
53
|
for (const host of delegates) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { insertTaskEventAsync } from "../db/runtime-tail-async";
|
|
2
|
+
import { getTask, getTaskDetail, listTaskEvents } from "../db";
|
|
2
3
|
import { listIssuesForEntity } from "../db/issue-associations";
|
|
3
4
|
import { defaultTaskIssueRelation } from "../db/task-issue-relation";
|
|
4
5
|
import { emitTaskChanged } from "../sse";
|
|
@@ -29,17 +30,17 @@ export function canCloseBacklink(ref: IssueRef, links: LandTaskIssueLinks): bool
|
|
|
29
30
|
return (linkedTasks.length ? linkedTasks : links).some((link) => link.buildLike);
|
|
30
31
|
}
|
|
31
32
|
|
|
32
|
-
export function recordReferencesOnlyLand(links: LandTaskIssueLinks, selected: IssueRef[], landKey: string): void {
|
|
33
|
+
export async function recordReferencesOnlyLand(links: LandTaskIssueLinks, selected: IssueRef[], landKey: string): Promise<void> {
|
|
33
34
|
const selectedIds = new Set(selected.map((ref) => ref.id));
|
|
34
35
|
for (const link of links) {
|
|
35
36
|
const refs = link.issues.filter((issue) => issue.relation === "references" && issue.ref.status !== "closed" && !selectedIds.has(issue.ref.id));
|
|
36
37
|
if (!refs.length || listTaskEvents(link.taskId).some((event) => event.type === "issue-left-open" && event.metadata.landKey === landKey)) continue;
|
|
37
|
-
|
|
38
|
+
(await insertTaskEventAsync(link.taskId, {
|
|
38
39
|
source: "issue-lifecycle", type: "issue-left-open", severity: "info",
|
|
39
40
|
title: "Issue left open: references-only",
|
|
40
41
|
body: `Left open because this Task references these issues: ${refs.map((issue) => `${issue.ref.repo}#${issue.ref.externalKey}`).join(", ")}.`,
|
|
41
42
|
metadata: { landKey, reason: "references-only", issueRefIds: refs.map((issue) => issue.ref.id) },
|
|
42
|
-
}, Date.now());
|
|
43
|
+
}, Date.now()));
|
|
43
44
|
const task = getTaskDetail(link.taskId);
|
|
44
45
|
if (task) emitTaskChanged(task, "task.issue-left-open");
|
|
45
46
|
}
|