@humwick/server 0.130.2 → 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/bundled/prompts/manifest.json +1 -0
- package/bundled/prompts/task.hydration.md +1 -1
- package/bundled/roles/builder.md +1 -1
- package/docs/guides/sub-coordinators.md +12 -5
- package/docs/guides/tools-coordination.md +1 -0
- package/docs/guides/workflows.md +16 -0
- package/docs/openapi.json +73 -4
- package/package.json +8 -7
- package/public/assets/{MessageBubble-BWLqMGKG.js → MessageBubble-Bq9kr21N.js} +2 -2
- package/public/assets/{PlanGraphPanel-3TlIQpjk.js → PlanGraphPanel-Dqiroy06.js} +2 -2
- package/public/assets/{TraceView-Wimm0Czv.js → TraceView-DYU962-H.js} +2 -2
- package/public/assets/{VaultDecisionCard-Bau_vNax.js → VaultDecisionCard-DhPfzioE.js} +2 -2
- package/public/assets/{activity-CrSurn-r.js → activity-DzCcQTee.js} +2 -2
- package/public/assets/{agent-lineage-CknAJKcb.js → agent-lineage-SgDt9i3T.js} +2 -2
- package/public/assets/agent-liveness-Bq-s73jW.js +2 -0
- package/public/assets/{agent-name-DKbiIhBo.js → agent-name-CcY3Aijy.js} +2 -2
- package/public/assets/{agent-profiles-DwF6EQ4R.js → agent-profiles-cxtRBn6O.js} +2 -2
- package/public/assets/{agent-project-badge-Diz4Sjjb.js → agent-project-badge-DGYbIhaI.js} +2 -2
- package/public/assets/{agent-tools-CRhpRQza.js → agent-tools-DHbftV0N.js} +2 -2
- package/public/assets/{agent-type-icon-LrUEU3lB.js → agent-type-icon-CY113sp-.js} +2 -2
- package/public/assets/{agents-B-v66C-4.js → agents-BPzY7IlQ.js} +2 -2
- package/public/assets/{analytics-BqCb-LKi.js → analytics-DENFPv_a.js} +2 -2
- package/public/assets/{artifact-viewer-kf4pGuAR.js → artifact-viewer-KRvSc7sl.js} +2 -2
- package/public/assets/{artifacts-DJevXcvg.js → artifacts-C9gSmL3s.js} +2 -2
- package/public/assets/{artifacts-D32zyw4Y.js → artifacts-DT-HkI5O.js} +2 -2
- package/public/assets/{automation-BpRajx_5.js → automation-BsmjQhKD.js} +2 -2
- package/public/assets/{backlog-D_UjTdzX.js → backlog-8NYH_62t.js} +2 -2
- package/public/assets/{busy-health-N3VEh4ao.js → busy-health-D3hwvYb4.js} +2 -2
- package/public/assets/{channels-9jopungq.js → channels-DCJ5WL7O.js} +2 -2
- package/public/assets/{chat-CSXrTB3C.js → chat-DAIl357U.js} +3 -3
- package/public/assets/{code-preview-p1NnmqK0.js → code-preview-CzrZfr9U.js} +2 -2
- package/public/assets/{connectors-CZdqlDNL.js → connectors-xTxtlyou.js} +2 -2
- package/public/assets/{cosmos-BgdsE4dG.js → cosmos-BpebFLK2.js} +2 -2
- package/public/assets/{crate-agent-30aXTKva.js → crate-agent-BHvI5wXC.js} +2 -2
- package/public/assets/{dependency-graph-B_jvw2GE.js → dependency-graph-DGT0o3wJ.js} +2 -2
- package/public/assets/{deploys-DoN6bAb5.js → deploys-hqWOHSHE.js} +2 -2
- package/public/assets/{display-BrKWFGJz.js → display-CDeH4I8T.js} +2 -2
- package/public/assets/{files-D6XEu8Ng.js → files-BTeGVmTg.js} +2 -2
- package/public/assets/{fleet-C7jQWbw2.js → fleet-DgXtNgCa.js} +2 -2
- package/public/assets/{fleet-metrics-BiDs3MLx.js → fleet-metrics-BHEt5yc_.js} +2 -2
- package/public/assets/{formatted-body-CQBwc1fb.js → formatted-body-MLtodyPp.js} +3 -3
- package/public/assets/{formatted-body-impl-DyG0WsQS.js → formatted-body-impl-CAe664Z8.js} +2 -2
- package/public/assets/{host-providers-dialog-DKaW31dN.js → host-providers-dialog-mapF4Fj9.js} +2 -2
- package/public/assets/{index-CRHep3M9.js → index-CqqgOI5R.js} +5 -5
- package/public/assets/{insights-CzrtkpOE.js → insights-DNyf7IzF.js} +2 -2
- package/public/assets/{integrations-aVsUmigt.js → integrations-DlYOHq7T.js} +2 -2
- package/public/assets/{issue-ref-chip-BnSlM_95.js → issue-ref-chip-CeWBNWn7.js} +2 -2
- package/public/assets/{log-viewer-qe7Ee47Z.js → log-viewer-Cib8nqdE.js} +2 -2
- package/public/assets/{maintenance-NfjqFZAk.js → maintenance-DSn1cPm7.js} +2 -2
- package/public/assets/{managed-agents-BiH0HgaE.js → managed-agents-C3CkM81m.js} +2 -2
- package/public/assets/{markdown-preview-BixaT3Xr.js → markdown-preview-W4VQQPAv.js} +3 -3
- package/public/assets/{markdown-preview-impl-DNGlWIS3.js → markdown-preview-impl-CMsTdhjq.js} +2 -2
- package/public/assets/{memory-DNsCl6UX.js → memory-BV17qtO4.js} +2 -2
- package/public/assets/{messages-DopU1L1X.js → messages-Bm_1AqSA.js} +2 -2
- package/public/assets/{orchestrators-Cq7ckLQT.js → orchestrators-Dg-vfP09.js} +2 -2
- package/public/assets/{overview-C1DCTzzV.js → overview-DcYCrvlr.js} +2 -2
- package/public/assets/{pairs-DE_m6rrE.js → pairs-8o9nuG3V.js} +2 -2
- package/public/assets/{profile-icon-B3rfh77F.js → profile-icon-BsRyBMea.js} +2 -2
- package/public/assets/{project-profile-instructions-DQWZE0kA.js → project-profile-instructions-DETKFn_E.js} +2 -2
- package/public/assets/{projects-Br2Bd2h1.js → projects-M_m6AHws.js} +2 -2
- package/public/assets/{prompt-settings-BKvFsvGD.js → prompt-settings-C_mNCgeL.js} +2 -2
- package/public/assets/provider-display-BEeLXC_D.js +2 -0
- package/public/assets/{registry-Cw38_6gW.js → registry-DDHHHE5N.js} +2 -2
- package/public/assets/run-card-Dt4I4jaP.js +2 -0
- package/public/assets/{secrets-DxI-vzSq.js → secrets-BkVwxI5O.js} +2 -2
- package/public/assets/{service-access-settings-D9s_VJbd.js → service-access-settings-Crq-6a-B.js} +2 -2
- package/public/assets/{settings-CKZTVGIx.js → settings-CYcavMFu.js} +2 -2
- package/public/assets/shipping-H6gzEeZB.js +2 -0
- package/public/assets/{stats-DyUBKyWI.js → stats-BJVeWkpV.js} +2 -2
- package/public/assets/{status-dot-DYqlEUhJ.js → status-dot-BcHyw1Vw.js} +2 -2
- package/public/assets/store-DKPDIZBe.js +9 -0
- package/public/assets/{tasks-Bh7Chr4-.js → tasks-qJjlQPpx.js} +2 -2
- package/public/assets/{teams-bowI7qVY.js → teams-Cd5Sk1uX.js} +2 -2
- package/public/assets/{terminal-viewer-BgVLHdsU.js → terminal-viewer-CpY5_m7W.js} +3 -3
- package/public/assets/{terminal-viewer-impl-Dz22UPy6.js → terminal-viewer-impl-DI_2llFR.js} +2 -2
- package/public/assets/{use-agent-terminal-DSQQ-iY7.js → use-agent-terminal-0yJA_buM.js} +2 -2
- package/public/assets/{use-decisions-samMQhQf.js → use-decisions-uJXHf34W.js} +2 -2
- package/public/assets/{use-project-list-59LheVP7.js → use-project-list-CpWl6eHQ.js} +2 -2
- package/public/assets/{use-selectors-BZa25xEB.js → use-selectors-BdxBW8mL.js} +2 -2
- package/public/assets/{user-avatar-DHxlvUvV.js → user-avatar-3IndfpOc.js} +2 -2
- package/public/assets/{versioned-prompt-editor-BmED5DnJ.js → versioned-prompt-editor-CIVg7XB1.js} +2 -2
- package/public/assets/{work-queue-CSvpuNLz.js → work-queue-B9rnLwHZ.js} +2 -2
- package/public/assets/{workflow-marker-DAZcj5qt.js → workflow-marker-X8wxyhzC.js} +2 -2
- package/public/assets/{workflows-DdmxRSyg.js → workflows-o5YyMFW7.js} +2 -2
- package/public/assets/{workspaces-BxeKfVuF.js → workspaces-CzEGoAng.js} +2 -2
- package/public/cosmos.html +4 -4
- package/public/index.html +28 -28
- package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/runner/src/adapters/claude-headless.ts +1 -1
- package/runner/src/adapters/claude-launch-exit.ts +26 -0
- package/runner/src/adapters/claude-session-probe.ts +1 -1
- package/runner/src/adapters/claude-tmux.ts +38 -10
- package/runner/src/adapters/claude.ts +28 -75
- package/runner/src/adapters/provider-quota-harvest.ts +20 -71
- package/runner/src/agent-runner/lifecycle-milestones.ts +2 -2
- package/runner/src/agent-runner/liveness-exchange.ts +104 -0
- package/runner/src/claude-system-prompt.ts +49 -0
- package/runner/src/launch-assembly.ts +14 -10
- package/runner/src/profile-home.ts +1 -1
- package/runner/src/project-instructions.ts +2 -2
- package/runner/src/provider-command.ts +18 -0
- package/runner/src/provider-setup.ts +2 -1
- package/runner/src/runner-core.ts +14 -15
- package/runner/src/runner-helpers.ts +0 -8
- package/runner/src/session-scratch.ts +6 -2
- package/runner/test-support/provisioning-context.ts +4 -2
- package/runner/test-support/runner-harness.ts +2 -1
- package/scripts/steward-policy-cleanup.ts +2 -2
- package/src/agent-authz.ts +2 -2
- package/src/agent-drive-arbiter.ts +3 -8
- package/src/agent-exit-cleanup-async.ts +2 -2
- package/src/agent-exit-cleanup.ts +23 -19
- package/src/agent-lifecycle-events.ts +112 -85
- package/src/agent-ref.ts +3 -2
- package/src/agent-status-events.ts +43 -14
- package/src/auth/password.ts +4 -3
- package/src/auth/session-refresh.ts +1 -1
- package/src/auth/session.test-fixture.ts +2 -2
- package/src/auth/session.ts +7 -7
- package/src/automations/crud.ts +8 -81
- package/src/automations/dispatch.ts +33 -58
- package/src/automations/index.ts +1 -1
- package/src/automations/persistence.ts +65 -0
- package/src/automations/precheck.ts +18 -16
- package/src/automations/read-async.ts +11 -0
- package/src/automations/reconcile.ts +30 -39
- package/src/automations/storage.ts +33 -10
- package/src/automations/write-async.ts +33 -0
- package/src/branch-land-notice.ts +3 -3
- package/src/branch-landed.ts +25 -23
- package/src/bus.ts +21 -19
- package/src/cd-deploy-notify.ts +2 -2
- package/src/ci/notifications.ts +4 -4
- package/src/ci/root-missing.ts +3 -3
- package/src/ci/transition-notify.ts +5 -5
- package/src/claude-app/oauth-http.ts +3 -3
- package/src/cli/workflow.ts +12 -3
- package/src/commands-db.ts +4 -4
- package/src/commands-write.ts +8 -0
- package/src/compaction-watch.ts +10 -8
- package/src/config-store-write.ts +2 -2
- package/src/config.ts +4 -11
- package/src/connectors.ts +10 -8
- package/src/context-advisory.ts +22 -21
- package/src/db/agent-action-write.ts +36 -0
- package/src/db/agent-control-async.ts +9 -0
- package/src/db/agent-control-write.ts +49 -0
- package/src/db/agent-effort-observe.ts +22 -0
- package/src/db/agent-meta.ts +14 -3
- package/src/db/agents-async.ts +8 -5
- package/src/db/agents.ts +15 -12
- package/src/db/auth-identities.ts +2 -2
- package/src/db/automation-read-ops.ts +11 -0
- package/src/db/automation-write-ops.ts +46 -0
- package/src/db/blackboard.ts +2 -2
- package/src/db/browser-session-write.ts +32 -0
- package/src/db/bus-outbox-write-ops.ts +3 -1
- package/src/db/checkout-refresh-schema.ts +47 -0
- package/src/db/checkout-refresh.ts +5 -5
- package/src/db/command-agent-profile-backfill.ts +39 -0
- package/src/db/command-agent-profiles.ts +5 -1
- package/src/db/command-retention.ts +126 -0
- package/src/db/commands-planner-stats.test-fixture.ts +8 -0
- package/src/db/commands-read-ops.ts +16 -0
- package/src/db/connection.ts +1 -182
- package/src/db/context-carry-write.ts +74 -0
- package/src/db/continuations.ts +4 -4
- package/src/db/db-error-registry.ts +12 -0
- package/src/db/gateway.ts +26 -133
- package/src/db/history-retention-ops.ts +13 -0
- package/src/db/inbox-async.ts +2 -2
- package/src/db/inbox-read-ops.ts +1 -1
- package/src/db/inbox.ts +9 -3
- package/src/db/issue-associations.ts +2 -2
- package/src/db/issue-refs-async.ts +4 -1
- package/src/db/issue-refs-read-ops.ts +6 -0
- package/src/db/issue-refs.ts +8 -8
- package/src/db/kernel-event-log-schema.ts +2 -0
- package/src/db/land-boundaries.ts +51 -5
- package/src/db/land-gate-attestations.ts +2 -2
- package/src/db/landing-receipts.ts +2 -2
- package/src/db/lifecycle-context-write.ts +5 -0
- package/src/db/lifecycle-tail-async.ts +76 -0
- package/src/db/lifecycle-tail-write-ops.ts +62 -0
- package/src/db/lifecycle-write-window.ts +2 -1
- package/src/db/lineage-pair-dedupe-sql.ts +3 -3
- package/src/db/main-connection-mode.ts +11 -0
- package/src/db/main-connection-writes.ts +20 -2
- package/src/db/maintenance-job-runs-async.ts +2 -2
- package/src/db/maintenance-job-write-ops.ts +1 -1
- package/src/db/maintenance-pauses.ts +2 -2
- package/src/db/message-send.ts +4 -0
- package/src/db/messages.ts +31 -25
- package/src/db/migrations.ts +18 -1
- package/src/db/notification-write-ops.ts +19 -0
- package/src/db/operator-answer-write.ts +19 -0
- package/src/db/orchestrators.ts +10 -4
- package/src/db/pairs-async.ts +22 -1
- package/src/db/pairs-write-ops.ts +8 -3
- package/src/db/pairs.ts +41 -48
- package/src/db/plan-dispatch-schema.ts +5 -1
- package/src/db/plan-ready-notices.ts +43 -0
- package/src/db/plan-tools-include-migration.ts +36 -0
- package/src/db/plans-write-ops.ts +2 -0
- package/src/db/presence-buffer.ts +5 -0
- package/src/db/presence-loop.ts +18 -23
- package/src/db/presence-write.ts +0 -6
- package/src/db/project-entries-async.ts +14 -0
- package/src/db/project-entries-read-ops.ts +5 -1
- package/src/db/project-entries-write-ops.ts +8 -0
- package/src/db/project-entries.ts +15 -12
- package/src/db/project-journal.ts +2 -2
- package/src/db/project-trust-approvals.ts +2 -2
- package/src/db/prompt-templates.ts +4 -4
- package/src/db/read-op-marshaling-fixtures.ts +18 -0
- package/src/db/read-ops.ts +4 -0
- package/src/db/retention.ts +13 -2
- package/src/db/review-publish-write.ts +8 -0
- package/src/db/runtime-admin-async.ts +19 -0
- package/src/db/runtime-admin-write-ops.ts +36 -0
- package/src/db/runtime-tail-async.ts +288 -0
- package/src/db/runtime-tail-write-ops.ts +97 -0
- package/src/db/schema.ts +4 -1
- package/src/db/spawn-budget.ts +5 -0
- package/src/db/spawn-delegation.ts +1 -11
- package/src/db/sql-audit-indexes.ts +3 -0
- package/src/db/stats-async.ts +5 -3
- package/src/db/task-entity.ts +5 -4
- package/src/db/team-claim-policy.ts +60 -0
- package/src/db/teams-async.ts +4 -0
- package/src/db/teams-write-ops.ts +4 -0
- package/src/db/terminal-events.ts +15 -0
- package/src/db/timer-cutover-bodies.ts +292 -0
- package/src/db/timer-cutover-core.ts +37 -278
- package/src/db/timer-cutover-state.ts +40 -0
- package/src/db/timer-cutover-write-ops.ts +1 -40
- package/src/db/token-db-write-ops.ts +2 -0
- package/src/db/token-standing-async.ts +12 -0
- package/src/db/token-standing.ts +6 -9
- package/src/db/token-usage-retention.ts +33 -0
- package/src/db/token-usage-write-ops.ts +1 -1
- package/src/db/token-usage.ts +4 -1
- package/src/db/user-invites-async.ts +13 -0
- package/src/db/user-invites.ts +3 -3
- package/src/db/users.ts +14 -6
- package/src/db/workspaces.ts +8 -5
- package/src/db/write-ops.ts +31 -12
- package/src/db/writer-fault-seam.ts +2 -9
- package/src/db/writer-fault-test-ops.ts +18 -0
- package/src/db/writer-gateway.ts +42 -46
- package/src/dev.ts +8 -3
- package/src/event-loop-lag.ts +4 -2
- package/src/event-loop-yield.ts +2 -2
- package/src/events.ts +10 -8
- package/src/host-provider-store.ts +5 -4
- package/src/hub-metrics-report.ts +5 -1
- package/src/hub-metrics.ts +38 -18
- package/src/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 +104 -98
- package/src/maintenance/breaker.ts +18 -16
- package/src/maintenance/checkout-refresh.ts +18 -1
- package/src/maintenance/critical-job-watchdog.ts +3 -3
- package/src/maintenance/events.ts +3 -3
- package/src/maintenance/history-retention-job.ts +30 -0
- package/src/maintenance/jobs.ts +29 -67
- package/src/maintenance/long-running-work.ts +3 -1
- package/src/maintenance/offline-agent-prune-job.ts +28 -0
- package/src/maintenance/orphaned-sessions.ts +5 -4
- package/src/maintenance/pauses.ts +4 -10
- package/src/maintenance/plan-ready-notice-job.ts +71 -0
- package/src/maintenance/scheduler.ts +18 -13
- package/src/maintenance/stalled-delivery-pager.ts +4 -4
- package/src/maintenance/teams.ts +19 -30
- package/src/maintenance/workspaces.ts +17 -27
- package/src/managed-policy-escalation.ts +7 -7
- package/src/managed-policy.ts +3 -3
- package/src/managed-provider-gate.ts +5 -4
- package/src/managed-spawn-reservation.ts +5 -4
- package/src/mcp/index.ts +8 -8
- package/src/mcp/output-descriptions.ts +1 -1
- package/src/mcp/presentation.ts +2 -1
- package/src/mcp/runtime-output.ts +6 -1
- package/src/mcp/self-care-visibility.ts +2 -2
- package/src/mcp/spawn-targets-matrix.ts +10 -1
- package/src/mcp/tool-groups.ts +3 -2
- package/src/mcp/tool-roles.ts +81 -0
- package/src/mcp/tools-workspace.ts +1 -1
- package/src/mcp-blackboard-tools.ts +6 -5
- package/src/mcp-decision-tools.ts +7 -7
- package/src/mcp-egress-tools.ts +10 -9
- package/src/mcp-issue-activity-tools.ts +2 -2
- package/src/mcp-issue-association-tools.ts +4 -4
- package/src/mcp-issue-ref-tools.ts +3 -3
- package/src/mcp-merge-tools.ts +5 -5
- package/src/mcp-notification-subscription-tools.ts +14 -15
- package/src/mcp-output-levels.test-fixture.ts +1 -1
- package/src/mcp-profile-trust-tools.ts +1 -1
- package/src/mcp-project-journal-tools.ts +4 -12
- package/src/mcp-project-tools.ts +17 -18
- package/src/mcp-routing-policy-tools.ts +3 -2
- package/src/mcp-team-tools.ts +6 -6
- package/src/mcp-workflow-tools.ts +5 -3
- package/src/memory-area-injection.ts +13 -12
- package/src/memory-boundary-capture.ts +6 -6
- package/src/memory-injection.ts +45 -43
- package/src/merge-pause-maintenance.ts +5 -4
- package/src/notification-router.ts +44 -17
- package/src/notify.ts +5 -5
- package/src/observed-reset-refresh.ts +4 -4
- package/src/operator-alarm.ts +2 -5
- package/src/project-ingest.ts +6 -6
- package/src/project-instructions.ts +8 -1
- package/src/project-trust.ts +12 -11
- package/src/prompt-resolver.ts +3 -3
- package/src/provider-quota-async.ts +5 -7
- package/src/provider-timeline-event.ts +4 -7
- package/src/quota-band-delivery.ts +2 -2
- package/src/recipe-runner.ts +4 -3
- package/src/retention-config-store.ts +4 -3
- package/src/reviewer-pipeline.ts +11 -10
- package/src/routes/_route.ts +4 -4
- package/src/routes/_shared.ts +13 -12
- package/src/routes/agent-effort.ts +5 -5
- package/src/routes/agent-heartbeat-quota.ts +23 -0
- package/src/routes/agent-keep.ts +1 -1
- package/src/routes/agent-reporting.ts +1 -1
- package/src/routes/agent-self-effort.ts +5 -5
- package/src/routes/agent-sessions.ts +24 -24
- package/src/routes/agents-spawn.ts +1 -1
- package/src/routes/agents.ts +17 -119
- package/src/routes/auth.ts +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 +1 -1
- package/src/routes/commands.ts +29 -27
- package/src/routes/context-resets.ts +2 -2
- package/src/routes/coordinator-teams.ts +1 -1
- package/src/routes/decisions.ts +2 -2
- package/src/routes/host-secret-files.ts +1 -1
- package/src/routes/hosts.ts +11 -11
- package/src/routes/inbox.ts +3 -2
- package/src/routes/index.ts +2 -1
- package/src/routes/integrations.ts +9 -7
- package/src/routes/issue-activity.ts +2 -2
- package/src/routes/issue-associations.ts +4 -4
- package/src/routes/issue-refs.ts +3 -3
- package/src/routes/kernel-timers-operator.ts +1 -1
- package/src/routes/memory.ts +1 -1
- package/src/routes/merges.ts +11 -11
- package/src/routes/messages.ts +23 -17
- package/src/routes/orchestrator-bootstrap.ts +1 -1
- package/src/routes/orchestrator-host-registration.ts +2 -0
- package/src/routes/orchestrator-host-utilization.ts +2 -2
- package/src/routes/orchestrator-proxy.ts +2 -2
- package/src/routes/orchestrator.ts +27 -18
- package/src/routes/pairs.ts +8 -8
- package/src/routes/project-profile-instructions.ts +1 -1
- package/src/routes/project-trust.ts +1 -1
- package/src/routes/projects.ts +16 -16
- package/src/routes/prompt-templates.ts +12 -12
- package/src/routes/provider-quotas.ts +10 -10
- package/src/routes/run-command.ts +1 -1
- package/src/routes/secrets-backup.ts +2 -2
- package/src/routes/secrets-import.ts +1 -1
- package/src/routes/secrets-vault.ts +7 -7
- package/src/routes/settings.ts +1 -1
- package/src/routes/shipping.ts +9 -1
- package/src/routes/spawn-policy.ts +8 -7
- package/src/routes/sse.ts +2 -2
- package/src/routes/team-templates.ts +7 -7
- package/src/routes/teams.ts +10 -10
- package/src/routes/tokens.ts +18 -17
- package/src/routes/users.ts +24 -24
- package/src/routes/viewer-read.ts +3 -3
- package/src/routes/web-tool-calls.ts +4 -4
- package/src/routes/workflows.ts +2 -2
- package/src/routes/workspaces.ts +17 -16
- package/src/routing-policy-push.ts +6 -6
- package/src/runtime-grant.ts +17 -11
- package/src/runtime-tokens.ts +20 -28
- package/src/secrets-broker/config.ts +1 -1
- package/src/secrets-broker/service.ts +2 -2
- package/src/security.ts +3 -1
- package/src/self-resume-carry.ts +21 -110
- package/src/self-resume-supersede.ts +4 -3
- package/src/self-resume.ts +54 -66
- package/src/server-background.ts +1 -1
- package/src/server.ts +21 -22
- 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 +9 -9
- package/src/services/idle-agent-digest.ts +17 -12
- package/src/services/idle-epics.ts +4 -4
- package/src/services/interrupt-agent.ts +12 -9
- package/src/services/issue-activity.ts +3 -3
- package/src/services/issue-associations.ts +15 -18
- package/src/services/issue-lifecycle-comments.ts +3 -2
- package/src/services/issue-lifecycle.ts +14 -13
- package/src/services/issue-refs.ts +4 -5
- package/src/services/kernel-timers-cutover-chaos-worker.ts +1 -1
- package/src/services/kernel-timers-ingress-chaos-worker.ts +6 -1
- package/src/services/kernel-timers-ingress.ts +3 -3
- package/src/services/kernel-timers-message-authority-chaos-worker.ts +3 -10
- package/src/services/kernel-timers-operator-chaos-worker.ts +3 -2
- package/src/services/kernel-timers-outbox.ts +1 -1
- package/src/services/kernel-timers-stage10-operator.ts +1 -1
- package/src/services/kernel-timers.ts +4 -3
- package/src/services/land-gate-placement.ts +11 -2
- package/src/services/land-issue-relations.ts +5 -4
- package/src/services/land-restart-retry.ts +7 -6
- package/src/services/landed-ancestry.ts +6 -5
- package/src/services/legacy-landing-host.ts +4 -1
- package/src/services/legacy-landing-recovery.ts +8 -6
- package/src/services/managed-running.ts +17 -17
- package/src/services/memory-areas.ts +3 -3
- package/src/services/merge-pause.ts +9 -15
- package/src/services/operator-decisions.ts +37 -41
- package/src/services/orchestrator-registration-recovery.ts +6 -2
- package/src/services/orchestrator-upgrade.ts +14 -12
- package/src/services/permission-decision.ts +4 -3
- package/src/services/plan-ci-notice.ts +1 -1
- package/src/services/plan-conformance.ts +4 -4
- package/src/services/plan-dispatch-policy.ts +10 -3
- package/src/services/plan-dispatch.ts +35 -14
- package/src/services/plan-graph.ts +39 -261
- package/src/services/plan-import.ts +1 -1
- package/src/services/plan-live-bindings.ts +8 -37
- package/src/services/plan-task-create.ts +1 -1
- package/src/services/plan-terminal-refs.ts +2 -12
- package/src/services/plan-wake-digest.ts +8 -3
- package/src/services/profile-trust.ts +2 -2
- package/src/services/project.ts +11 -10
- package/src/services/prompt-templates.ts +6 -5
- package/src/services/provider-hold-nudge.ts +9 -9
- package/src/services/provider-hold-record.ts +13 -12
- package/src/services/provider-state-audit.ts +19 -18
- package/src/services/provisioning-harness/driver.ts +1 -1
- package/src/services/provisioning-harness/fixture-matrix.ts +3 -3
- package/src/services/provisioning-harness/lifecycle.ts +24 -22
- package/src/services/provisioning-harness/prepare.ts +16 -17
- package/src/services/rate-limit-resume.ts +10 -9
- package/src/services/red-main-auto-revert.ts +7 -5
- package/src/services/red-main-controller-deps.ts +20 -3
- package/src/services/red-main-incident.ts +3 -1
- package/src/services/red-main-quarantine.ts +2 -3
- package/src/services/register-agent.ts +22 -22
- package/src/services/restart-project-role.ts +1 -1
- package/src/services/restart-spawn.ts +17 -16
- package/src/services/review-publish.ts +7 -24
- package/src/services/review-ref-reconcile.ts +29 -38
- package/src/services/runtime-dependency-alert.ts +27 -0
- package/src/services/scheduler-command.ts +11 -9
- package/src/services/scheduler.ts +5 -5
- package/src/services/self-effort-grant.ts +5 -25
- package/src/services/send-message.ts +16 -33
- package/src/services/shutdown-agent.ts +17 -14
- package/src/services/spawn-agent.ts +12 -41
- package/src/services/spawn-chain-inspector.ts +1 -1
- package/src/services/spawn-cwd-placement.ts +21 -5
- package/src/services/spawn-issue-activity.ts +8 -6
- package/src/services/spawn-launch.ts +17 -1
- package/src/services/spawn-loss-escalation.ts +1 -1
- package/src/services/spawn-registration-watchdog.ts +2 -2
- package/src/services/spawn-repo-probe.ts +7 -5
- package/src/services/spawn-tree-cleanup.ts +7 -8
- package/src/services/steward-reaper.ts +4 -4
- package/src/services/task-context-hydration.ts +25 -1
- package/src/services/task-delivery.ts +20 -34
- package/src/services/task-entity.ts +40 -203
- package/src/services/task-issue-link.ts +13 -20
- package/src/services/task-issue-weave.ts +12 -11
- package/src/services/task-lifecycle.ts +27 -31
- package/src/services/task-repo-cwd.ts +37 -0
- package/src/services/task-review-hold.ts +4 -17
- package/src/services/task-semantic-events.ts +13 -11
- package/src/services/task-state-reconcile.ts +3 -4
- package/src/services/task-validation.ts +2 -2
- package/src/services/team-templates.ts +5 -5
- package/src/services/team.ts +31 -98
- package/src/services/terminal-provider-exit.ts +6 -5
- package/src/services/timer-message-fire-chaos-worker.ts +7 -3
- package/src/services/timer-message-fire-outbox.ts +1 -1
- package/src/services/transient-agent-reaper.ts +22 -19
- package/src/services/turn-reconcile-audit.ts +9 -9
- package/src/services/user-onboarding.ts +8 -6
- package/src/services/user-profile.ts +6 -9
- package/src/services/work-finality.ts +16 -4
- package/src/services/workflow-auto-start.ts +2 -1
- package/src/services/workflow-caller.ts +61 -4
- package/src/services/workflow-child-proof-worker.ts +1 -1
- package/src/services/workflow-control-proof-worker.ts +1 -1
- package/src/services/workflow-coordinator.ts +8 -2
- package/src/services/workflow-decisions.ts +5 -5
- package/src/services/workflow-deferred-cleanup.ts +1 -1
- package/src/services/workflow-effect-driver.ts +42 -19
- package/src/services/workflow-effects.ts +41 -27
- package/src/services/workflow-pins.ts +7 -4
- package/src/services/workflow-reconcile.ts +1 -0
- package/src/services/workflow-resume-pins.ts +3 -3
- package/src/services/workflow-routing-defaults.ts +18 -0
- package/src/services/workflow-run-view.ts +4 -3
- package/src/services/workflow-run.test-fixture.ts +1 -1
- package/src/services/workflow-runs.ts +34 -22
- package/src/services/workflow-supervisor-state.ts +21 -1
- package/src/services/workflow-supervisor.ts +4 -3
- package/src/services/workspace-recovery.ts +4 -3
- package/src/spawn-admission.ts +10 -2
- package/src/spawn-placement.ts +27 -9
- package/src/spawn-targets.ts +8 -8
- package/src/sse-agent-status.ts +15 -6
- package/src/sse.ts +49 -24
- package/src/startup-context-injection.ts +61 -57
- package/src/steward-handoff.ts +4 -3
- package/src/steward-policy-cleanup.ts +9 -8
- package/src/steward.ts +2 -2
- package/src/task-dispatch-live.ts +5 -2
- package/src/task-dispatcher.ts +2 -2
- package/src/token-db.ts +2 -2
- package/src/token-usage-async.ts +2 -4
- package/src/user-awaiting-reply.ts +5 -5
- package/src/workspace-actions.ts +24 -29
- package/src/workspace-auto-merge.ts +14 -12
- package/src/workspace-changed-paths-client.ts +16 -5
- package/src/workspace-cleanup-stale.ts +30 -7
- package/src/workspace-command-settle.ts +24 -16
- package/src/workspace-config.ts +1 -1
- package/src/workspace-conflict-resolver.ts +9 -7
- package/src/workspace-dead-owner-recovery.ts +5 -4
- package/src/workspace-escalation.ts +12 -11
- package/src/workspace-human-escalation.ts +3 -3
- package/src/workspace-land-gate-watchdog.ts +3 -3
- package/src/workspace-land-refusal.ts +20 -0
- package/src/workspace-land-stopped.ts +1 -0
- package/src/workspace-merge.ts +10 -26
- package/src/workspace-nothing-to-land-notice.ts +2 -2
- package/src/workspace-orphans.ts +18 -37
- package/src/workspace-pr-completion.ts +10 -8
- package/src/workspace-rekey.ts +3 -3
- package/src/workspace-steward-failure.ts +2 -2
- package/src/workspace-steward-wake.ts +2 -2
- package/public/assets/agent-liveness-CaNwK0Zf.js +0 -2
- package/public/assets/provider-display-DsuWMvVL.js +0 -2
- package/public/assets/run-card-CpKqRbhg.js +0 -2
- package/public/assets/shipping-B9YtnwtG.js +0 -2
- package/public/assets/store-DcClXLH0.js +0 -9
- package/runner/src/agent-runner/http-liveness.ts +0 -85
- package/src/db/on-loop-write-transaction.ts +0 -34
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
removeAssociation,
|
|
6
|
-
} from "../db/issue-associations";
|
|
7
|
-
import { getIssueRef, resolveIssueRefByExternalKey, resolveIssueRefFromString } from "../db/issue-refs";
|
|
1
|
+
import { resolveIssueRefFromStringAsync, resolveIssueRefByExternalKeyAsync } from "../db/issue-refs-async";
|
|
2
|
+
import { removeAssociationAsync, associateIssueAsync } from "../db/runtime-tail-async";
|
|
3
|
+
import { listEntitiesForIssue, listIssuesForEntity } from "../db/issue-associations";
|
|
4
|
+
import { getIssueRef } from "../db/issue-refs";
|
|
8
5
|
import type { IssueAssociationEntityType, IssueAssociationIssue, IssueProvider } from "../types";
|
|
9
6
|
import { ValidationError } from "../db/connection";
|
|
10
7
|
|
|
@@ -24,36 +21,36 @@ interface AssociateIssueInput extends ResolveAssociationIssueInput {
|
|
|
24
21
|
entityId: string;
|
|
25
22
|
}
|
|
26
23
|
|
|
27
|
-
export function resolveAssociationIssueRef(input: ResolveAssociationIssueInput) {
|
|
24
|
+
export async function resolveAssociationIssueRef(input: ResolveAssociationIssueInput) {
|
|
28
25
|
if (input.issueRefId) {
|
|
29
26
|
const issueRef = getIssueRef(input.issueRefId);
|
|
30
27
|
if (!issueRef) throw new ValidationError(`issue ref ${input.issueRefId} not found`);
|
|
31
28
|
return issueRef;
|
|
32
29
|
}
|
|
33
30
|
if (input.ref) {
|
|
34
|
-
return
|
|
31
|
+
return (await resolveIssueRefFromStringAsync({
|
|
35
32
|
ref: input.ref,
|
|
36
33
|
defaultRepo: input.defaultRepo ?? input.repo,
|
|
37
34
|
provider: input.provider,
|
|
38
35
|
title: input.title,
|
|
39
|
-
});
|
|
36
|
+
}));
|
|
40
37
|
}
|
|
41
38
|
if (input.provider && input.repo && input.externalKey) {
|
|
42
|
-
return
|
|
39
|
+
return (await resolveIssueRefByExternalKeyAsync({
|
|
43
40
|
provider: input.provider,
|
|
44
41
|
repo: input.repo,
|
|
45
42
|
externalKey: input.externalKey,
|
|
46
43
|
url: input.url,
|
|
47
44
|
title: input.title,
|
|
48
|
-
});
|
|
45
|
+
}));
|
|
49
46
|
}
|
|
50
47
|
throw new ValidationError("issueRefId, ref, or provider/repo/externalKey required");
|
|
51
48
|
}
|
|
52
49
|
|
|
53
|
-
export function associateIssueRef(input: AssociateIssueInput) {
|
|
54
|
-
const issueRef = resolveAssociationIssueRef(input);
|
|
50
|
+
export async function associateIssueRef(input: AssociateIssueInput) {
|
|
51
|
+
const issueRef = (await resolveAssociationIssueRef(input));
|
|
55
52
|
return {
|
|
56
|
-
association:
|
|
53
|
+
association: (await associateIssueAsync(issueRef.id, input.entityType, input.entityId)),
|
|
57
54
|
issueRef,
|
|
58
55
|
};
|
|
59
56
|
}
|
|
@@ -66,7 +63,7 @@ export function listIssueEntities(issueRefId: string) {
|
|
|
66
63
|
return listEntitiesForIssue(issueRefId);
|
|
67
64
|
}
|
|
68
65
|
|
|
69
|
-
export function removeIssueAssociation(input: AssociateIssueInput): { deleted: boolean } {
|
|
70
|
-
const issueRef = resolveAssociationIssueRef(input);
|
|
71
|
-
return { deleted:
|
|
66
|
+
export async function removeIssueAssociation(input: AssociateIssueInput): Promise<{ deleted: boolean }> {
|
|
67
|
+
const issueRef = (await resolveAssociationIssueRef(input));
|
|
68
|
+
return { deleted: (await removeAssociationAsync(issueRef.id, input.entityType, input.entityId)) };
|
|
72
69
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { recordIssueLifecycleCommentAsync } from "../db/runtime-tail-async";
|
|
1
2
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { hasIssueLifecycleComment
|
|
3
|
+
import { hasIssueLifecycleComment } from "../db/long-running-work";
|
|
3
4
|
import type { IssueTrackerAdapter } from "../issue-tracker";
|
|
4
5
|
import type { IssueRef } from "../types";
|
|
5
6
|
|
|
@@ -8,5 +9,5 @@ export async function commentIssueLifecycleOnce(adapter: IssueTrackerAdapter, re
|
|
|
8
9
|
const commentKey = createHash("sha256").update(body).digest("hex");
|
|
9
10
|
if (hasIssueLifecycleComment(ref.id, landKey, commentKey)) return;
|
|
10
11
|
await adapter.comment(ref, body);
|
|
11
|
-
|
|
12
|
+
(await recordIssueLifecycleCommentAsync(ref.id, landKey, commentKey));
|
|
12
13
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
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,
|
|
@@ -11,7 +12,7 @@ import {
|
|
|
11
12
|
} from "../db/issue-lifecycle";
|
|
12
13
|
import { getIssueRef } from "../db/issue-refs";
|
|
13
14
|
import { resolveIssueRefByExternalKeyAsync, resolveIssueRefFromStringAsync, updateIssueRefAsync, upsertIssueLifecycleActionAsync } from "../db/issue-refs-async";
|
|
14
|
-
|
|
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
|
|
@@ -226,18 +227,18 @@ function taskIssueLinkMismatches(taskIds: number[], declared: IssueRef[] | undef
|
|
|
226
227
|
});
|
|
227
228
|
}
|
|
228
229
|
|
|
229
|
-
function recordIssueLinkMismatch(taskId: number, mismatch: IssueLinkMismatch, input: LandedIssueLifecycleInput): void {
|
|
230
|
+
async function recordIssueLinkMismatch(taskId: number, mismatch: IssueLinkMismatch, input: LandedIssueLifecycleInput): Promise<void> {
|
|
230
231
|
const key = landKey(input);
|
|
231
232
|
if (listTaskEvents(taskId).some((event) => event.type === "issue-link-mismatch" && event.metadata.landKey === key)) return;
|
|
232
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.`;
|
|
233
|
-
|
|
234
|
+
(await insertTaskEventAsync(taskId, {
|
|
234
235
|
source: "issue-lifecycle",
|
|
235
236
|
type: "issue-link-mismatch",
|
|
236
237
|
severity: "warning",
|
|
237
238
|
title: "Commit issue declaration differs from Task link",
|
|
238
239
|
body,
|
|
239
240
|
metadata: { landKey: key, declared: mismatch.declared, associated: mismatch.associated, source: "commit-declaration" },
|
|
240
|
-
}, Date.now());
|
|
241
|
+
}, Date.now()));
|
|
241
242
|
const task = getTaskDetail(taskId);
|
|
242
243
|
if (task) emitTaskChanged(task, "task.issue-link-mismatch");
|
|
243
244
|
}
|
|
@@ -479,7 +480,7 @@ export async function closeIssueRefForLand(
|
|
|
479
480
|
status: "succeeded",
|
|
480
481
|
});
|
|
481
482
|
if (input.workspace.ownerAgentId) {
|
|
482
|
-
recordAndEmitIssueActivity({
|
|
483
|
+
(await recordAndEmitIssueActivity({
|
|
483
484
|
agentId: input.workspace.ownerAgentId,
|
|
484
485
|
action: "done",
|
|
485
486
|
issueRefId: latest.id,
|
|
@@ -487,7 +488,7 @@ export async function closeIssueRefForLand(
|
|
|
487
488
|
title: "Issue closed on land",
|
|
488
489
|
body: comment,
|
|
489
490
|
metadata: { workspaceId: input.workspace.id, branch: input.workspace.branch, commitSha: input.mergedSha, source },
|
|
490
|
-
});
|
|
491
|
+
}));
|
|
491
492
|
}
|
|
492
493
|
// #2520 — relay's own completed close is a terminal trigger for the plan nodes bound to
|
|
493
494
|
// this ref. Awaited post-commit effect: the close is already durable, and the plan update
|
|
@@ -546,9 +547,9 @@ export async function handleLandedIssueLifecycle(input: LandedIssueLifecycleInpu
|
|
|
546
547
|
const taskIds = resolveLandedTaskIds(input);
|
|
547
548
|
const links = landTaskIssueLinks(taskIds);
|
|
548
549
|
const resolved = await resolveIssueRefsForLand(input, links);
|
|
549
|
-
recordReferencesOnlyLand(links, resolved.refs, landKey(input));
|
|
550
|
+
(await recordReferencesOnlyLand(links, resolved.refs, landKey(input)));
|
|
550
551
|
const mismatches = taskIssueLinkMismatches(taskIds, resolved.declared);
|
|
551
|
-
for (const mismatch of mismatches) recordIssueLinkMismatch(mismatch.taskId, mismatch, input);
|
|
552
|
+
for (const mismatch of mismatches) (await recordIssueLinkMismatch(mismatch.taskId, mismatch, input));
|
|
552
553
|
if (resolved.refs.length === 0 && taskIds.length > 0 && taskIds.every((id) => listIssuesForEntity("task", String(id)).length === 0)) {
|
|
553
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"}`);
|
|
554
555
|
}
|
|
@@ -566,15 +567,15 @@ async function resolveReopenRef(input: ReopenIssueLifecycleInput): Promise<Issue
|
|
|
566
567
|
if (!issueRef) throw new Error(`issue ref ${input.issueRefId} not found`);
|
|
567
568
|
return issueRef;
|
|
568
569
|
}
|
|
569
|
-
if (input.ref) return resolveIssueRefFromStringAsync({ ref: input.ref, defaultRepo: input.defaultRepo ?? input.repo, provider: input.provider, title: input.title });
|
|
570
|
+
if (input.ref) return (await resolveIssueRefFromStringAsync({ ref: input.ref, defaultRepo: input.defaultRepo ?? input.repo, provider: input.provider, title: input.title }));
|
|
570
571
|
if (input.provider && input.repo && input.externalKey) {
|
|
571
|
-
return resolveIssueRefByExternalKeyAsync({
|
|
572
|
+
return (await resolveIssueRefByExternalKeyAsync({
|
|
572
573
|
provider: input.provider,
|
|
573
574
|
repo: input.repo,
|
|
574
575
|
externalKey: input.externalKey,
|
|
575
576
|
url: input.url,
|
|
576
577
|
title: input.title,
|
|
577
|
-
});
|
|
578
|
+
}));
|
|
578
579
|
}
|
|
579
580
|
throw new Error("issueRefId, ref, or provider/repo/externalKey required");
|
|
580
581
|
}
|
|
@@ -596,7 +597,7 @@ export async function reopenIssueLifecycle(input: ReopenIssueLifecycleInput, opt
|
|
|
596
597
|
status: "succeeded",
|
|
597
598
|
source: "explicit",
|
|
598
599
|
});
|
|
599
|
-
if (input.entityType && input.entityId)
|
|
600
|
+
if (input.entityType && input.entityId) (await associateIssueAsync(issueRef.id, input.entityType, input.entityId));
|
|
600
601
|
return { issueRef: opened, action: "reopened", landKey: key };
|
|
601
602
|
} catch (error) {
|
|
602
603
|
const message = errMessage(error);
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { deleteIssueRefAsync, resolveIssueRefByExternalKeyAsync, resolveIssueRefFromStringAsync, updateIssueRefAsync, upsertIssueRefAsync } from "../db/issue-refs-async";
|
|
1
|
+
import { deleteIssueRefAsync, listIssueRefsAsync, resolveIssueRefByExternalKeyAsync, resolveIssueRefFromStringAsync, updateIssueRefAsync, upsertIssueRefAsync } from "../db/issue-refs-async";
|
|
2
2
|
import {
|
|
3
3
|
getIssueRef,
|
|
4
|
-
listIssueRefs,
|
|
5
4
|
type ListIssueRefsOptions,
|
|
6
5
|
type ResolveIssueRefByExternalKeyInput,
|
|
7
6
|
type ResolveIssueRefFromStringInput,
|
|
@@ -9,14 +8,14 @@ import {
|
|
|
9
8
|
type UpsertIssueRefInput,
|
|
10
9
|
} from "../db/issue-refs";
|
|
11
10
|
|
|
12
|
-
export { getIssueRef,
|
|
11
|
+
export { getIssueRef, listIssueRefsAsync, type ListIssueRefsOptions };
|
|
13
12
|
|
|
14
13
|
export function upsertIssueRefMappingAsync(input: UpsertIssueRefInput) {
|
|
15
14
|
return upsertIssueRefAsync(input);
|
|
16
15
|
}
|
|
17
16
|
|
|
18
|
-
export function resolveIssueRefMappingAsync(input: ResolveIssueRefByExternalKeyInput | ResolveIssueRefFromStringInput) {
|
|
19
|
-
return "ref" in input ? resolveIssueRefFromStringAsync(input) : resolveIssueRefByExternalKeyAsync(input);
|
|
17
|
+
export async function resolveIssueRefMappingAsync(input: ResolveIssueRefByExternalKeyInput | ResolveIssueRefFromStringInput) {
|
|
18
|
+
return "ref" in input ? (await resolveIssueRefFromStringAsync(input)) : (await resolveIssueRefByExternalKeyAsync(input));
|
|
20
19
|
}
|
|
21
20
|
|
|
22
21
|
export function patchIssueRefMappingAsync(id: string, input: UpdateIssueRefInput) {
|
|
@@ -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 {
|
|
@@ -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
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createActivityEventAsync } from "../db/activity-async";
|
|
2
|
+
import { updateWorkspaceStatusAsync } from "../db";
|
|
2
3
|
import { deferLandSettleSideEffect } from "../land-settle-dispatch";
|
|
3
4
|
import { routeNotification } from "../notification-router";
|
|
4
5
|
import { resolveCoordinatorAgentId } from "../steward-identity";
|
|
@@ -37,17 +38,17 @@ export async function settleRestartKilledLand(command: Command, workspace: Works
|
|
|
37
38
|
...mergeRetryEnqueuedAtPatch(mergeResult, command),
|
|
38
39
|
});
|
|
39
40
|
if (transitioned) {
|
|
40
|
-
deferLandSettleSideEffect("land-restart-retry", () => notifyLandRedispatching(transitioned, command, headSha));
|
|
41
|
+
deferLandSettleSideEffect("land-restart-retry", async () => await notifyLandRedispatching(transitioned, command, headSha));
|
|
41
42
|
}
|
|
42
43
|
return transitioned;
|
|
43
44
|
}
|
|
44
45
|
|
|
45
|
-
function notifyLandRedispatching(workspace: WorkspaceRecord, command: Command, headSha: string | undefined): void {
|
|
46
|
+
async function notifyLandRedispatching(workspace: WorkspaceRecord, command: Command, headSha: string | undefined): Promise<void> {
|
|
46
47
|
const branch = workspace.branch ?? workspace.id;
|
|
47
48
|
const base = workspace.baseRef ?? "main";
|
|
48
49
|
const head = headSha ? ` at \`${headSha.slice(0, 12)}\`` : "";
|
|
49
50
|
const body = `\`${branch}\` → \`${base}\`: ${LAND_RESTART_RETRY_REASON}. Relay re-dispatches the same land${head} automatically and re-runs its gate. No action needed; do not re-deliver. A land result follows.`;
|
|
50
|
-
|
|
51
|
+
(await createActivityEventAsync({
|
|
51
52
|
clientId: `land-restart-retry-${command.id}`,
|
|
52
53
|
kind: "state",
|
|
53
54
|
title: "Land killed by restart; re-dispatching",
|
|
@@ -56,12 +57,12 @@ function notifyLandRedispatching(workspace: WorkspaceRecord, command: Command, h
|
|
|
56
57
|
icon: "ti-refresh-alert",
|
|
57
58
|
view: "orchestrators",
|
|
58
59
|
metadata: { source: "server", workspaceId: workspace.id, commandId: command.id },
|
|
59
|
-
});
|
|
60
|
+
}));
|
|
60
61
|
const author = workspace.ownerAgentId;
|
|
61
62
|
const coordinator = resolveCoordinatorAgentId(author);
|
|
62
63
|
const recipients = withWorkspaceTaskOwnerRoles([author, coordinator], workspace);
|
|
63
64
|
if (!recipients.length) return;
|
|
64
|
-
routeNotification({
|
|
65
|
+
await routeNotification({
|
|
65
66
|
type: "workspace.land_redispatched",
|
|
66
67
|
scope: { author, parent: coordinator ?? undefined, repoRoot: workspace.repoRoot, workspaceId: workspace.id },
|
|
67
68
|
recipients,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createActivityEventAsync } from "../db/activity-async";
|
|
1
2
|
import { repoDefaultBranch } from "@humwick/sdk/land-gates";
|
|
2
3
|
import { withWorkspaceTaskOwnerRoles } from "../task-owner-notices";
|
|
3
4
|
// #1713 — the coordinator's "landed" signal, derived from GIT ANCESTRY rather than a command's
|
|
@@ -15,7 +16,7 @@ import { withWorkspaceTaskOwnerRoles } from "../task-owner-notices";
|
|
|
15
16
|
// transport error). We do NOT guess "landed" — we degrade to an actionable
|
|
16
17
|
// "verify manually" signal that names the sha and the stalled merge command id.
|
|
17
18
|
import { landFailureEventKey } from "../land-failure-event-key";
|
|
18
|
-
|
|
19
|
+
|
|
19
20
|
import { stewardFallbackTarget } from "../config";
|
|
20
21
|
import { emitRelayEvent } from "../events";
|
|
21
22
|
import { routeNotification } from "../notification-router";
|
|
@@ -372,7 +373,7 @@ function landUnconfirmedText(input: LandUnconfirmedInput): { subject: string; bo
|
|
|
372
373
|
* obligation) to the branch owner's coordinator and the fallback steward, and always leaves a
|
|
373
374
|
* durable relay event + activity event so the outcome is auditable even if no one is reachable.
|
|
374
375
|
*/
|
|
375
|
-
export function notifyLandUnconfirmed(input: LandUnconfirmedInput): void {
|
|
376
|
+
export async function notifyLandUnconfirmed(input: LandUnconfirmedInput): Promise<void> {
|
|
376
377
|
const { workspace, kind } = input;
|
|
377
378
|
const owner = workspace.ownerAgentId ?? undefined;
|
|
378
379
|
const coordinator = resolveCoordinatorAgentId(owner);
|
|
@@ -398,7 +399,7 @@ export function notifyLandUnconfirmed(input: LandUnconfirmedInput): void {
|
|
|
398
399
|
|
|
399
400
|
// #1912 §4 retained: command settlement schedules this through a synchronous deferred callback;
|
|
400
401
|
// it cannot await without changing the settle/error contract for land completion.
|
|
401
|
-
|
|
402
|
+
(await createActivityEventAsync({
|
|
402
403
|
clientId: `workspace-land-unconfirmed-${workspace.id}-${input.commandId ?? "nocmd"}-${kind}`,
|
|
403
404
|
kind: "state",
|
|
404
405
|
title: kind === "not-ancestor"
|
|
@@ -411,11 +412,11 @@ export function notifyLandUnconfirmed(input: LandUnconfirmedInput): void {
|
|
|
411
412
|
icon: "ti-alert-octagon",
|
|
412
413
|
view: "orchestrators",
|
|
413
414
|
metadata: { source: "server", maintenanceJobId: "workspace-land-unconfirmed", workspaceId: workspace.id, mergeCommandId: input.commandId, landOutcome: kind },
|
|
414
|
-
});
|
|
415
|
+
}));
|
|
415
416
|
|
|
416
417
|
const recipients = withWorkspaceTaskOwnerRoles([owner, coordinator, fallback], workspace);
|
|
417
418
|
if (recipients.length === 0) return;
|
|
418
|
-
routeNotification({
|
|
419
|
+
await routeNotification({
|
|
419
420
|
type: "workspace.land_unconfirmed",
|
|
420
421
|
scope: { workspaceId: workspace.id, repoRoot: workspace.repoRoot, ...(owner ? { author: owner } : {}), ...(coordinator ? { parent: coordinator } : {}) },
|
|
421
422
|
recipients,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { cleanDeliveryGatePolicy, cleanLandGateRequirements } from "@humwick/sdk/land-gates";
|
|
2
|
-
import type { CapturedDeliveryGateRequirement, LandGatesConfig } from "@humwick/sdk";
|
|
2
|
+
import type { CapturedDeliveryGateRequirement, LandGatesConfig, WorktreeProvisionConfig } from "@humwick/sdk";
|
|
3
3
|
import { errMessage, exactLandingSourceIdentity, RELAY_TOKEN_HEADER, isRecord, stringValue, type LandingContainmentMode } from "@humwick/sdk";
|
|
4
4
|
import { isTrustedOrchestratorApiUrl, relayToken } from "../config";
|
|
5
5
|
import { classifyLegacyLanding, type LandingLaneIdentity } from "../landing-lane-key";
|
|
@@ -14,6 +14,7 @@ export interface HostResolvedLandingIdentity extends LandingLaneIdentity {
|
|
|
14
14
|
readonly sourceHeadSha: string;
|
|
15
15
|
readonly baseHeadSha?: string;
|
|
16
16
|
readonly gateRequirements?: LandGatesConfig["requirements"];
|
|
17
|
+
readonly gateDepsStrategy?: WorktreeProvisionConfig["depsStrategy"];
|
|
17
18
|
readonly deliveryGate?: CapturedDeliveryGateRequirement;
|
|
18
19
|
readonly landGateTimeoutBudgetMs?: number;
|
|
19
20
|
}
|
|
@@ -131,6 +132,8 @@ export async function discoverLandingIdentityOnHost(
|
|
|
131
132
|
return { ...classified.laneIdentity, sourceHeadSha: source.sourceHeadSha, ...(baseHeadSha ? { baseHeadSha } : {}),
|
|
132
133
|
...(delivery.deliveryRequire ? { deliveryGate: { command: delivery.delivery!, require: delivery.deliveryRequire } } : {}),
|
|
133
134
|
...(gateRequirements ? { gateRequirements } : {}),
|
|
135
|
+
...(body.gateDepsStrategy === "command" || body.gateDepsStrategy === "none" || body.gateDepsStrategy === "symlink"
|
|
136
|
+
? { gateDepsStrategy: body.gateDepsStrategy } : {}),
|
|
134
137
|
...(typeof body.landGateTimeoutBudgetMs === "number" && Number.isSafeInteger(body.landGateTimeoutBudgetMs) && body.landGateTimeoutBudgetMs >= 0
|
|
135
138
|
? { landGateTimeoutBudgetMs: body.landGateTimeoutBudgetMs } : {}) };
|
|
136
139
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { releaseMergeLeaseAsync } from "../db/runtime-tail-async";
|
|
2
|
+
import { updateCommandAsync } from "../commands-write";
|
|
3
|
+
import { commandExecutorConfirmedGone, getCommandClaimOwnerToken } from "../commands-db.ts";
|
|
4
|
+
|
|
3
5
|
import { recordExecutionProofAsync, terminalizeLegacyLandingAsync } from "../commands-landing-async.ts";
|
|
4
6
|
import { resolveCommandExecutorOwner } from "../merge-drain.ts";
|
|
5
7
|
import type { Command, Orchestrator } from "../types.ts";
|
|
@@ -30,9 +32,9 @@ export async function reconcileLegacyLandingExecution(
|
|
|
30
32
|
&& commandExecutorConfirmedGone(command, getCommandClaimOwnerToken(command.id),
|
|
31
33
|
resolveCommandExecutorOwner(command, orchestrators), now);
|
|
32
34
|
if (!pastLease && !ownerGone) return null;
|
|
33
|
-
const terminal =
|
|
34
|
-
? LEGACY_UNFENCED_RESTART_ERROR : "command timed out" }, { executor: true });
|
|
35
|
-
if (terminal)
|
|
35
|
+
const terminal = (await updateCommandAsync(command.id, { status: "timed_out", error: ownerGone
|
|
36
|
+
? LEGACY_UNFENCED_RESTART_ERROR : "command timed out" }, { executor: true }));
|
|
37
|
+
if (terminal) (await releaseMergeLeaseAsync({ commandId: terminal.id }));
|
|
36
38
|
return terminal;
|
|
37
39
|
}
|
|
38
40
|
if (command.landingContainmentMode !== "cgroup-v2-close-v1") return null;
|
|
@@ -82,7 +84,7 @@ export async function reconcileLegacyLandingExecution(
|
|
|
82
84
|
const ownerState = resolveCommandExecutorOwner(command, orchestrators);
|
|
83
85
|
if (!commandExecutorConfirmedGone(command, claimOwnerToken, ownerState, now)) {
|
|
84
86
|
if (typeof command.expiresAt === "number" && command.expiresAt <= now && ownerState?.status !== "online") {
|
|
85
|
-
alertUnprovenLandLaneHolder(command);
|
|
87
|
+
await alertUnprovenLandLaneHolder(command);
|
|
86
88
|
}
|
|
87
89
|
return null;
|
|
88
90
|
}
|