@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
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import type { pruneWorkspaceOrphanAlerts, pruneOrphanedSharedWorkspaces, claimWorkspaceOrphanAlert, claimWorkspaceHumanEscalationAlert, pruneStaleWorkspaceHumanEscalationAlerts, reelectRepoSteward } from "./workspaces";
|
|
2
|
+
import type { upsertProjectTrustApproval } from "./project-trust-approvals";
|
|
3
|
+
import type { setProjectJournalFields } from "./project-journal";
|
|
4
|
+
import type { promoteLineageCapturedResponse, markSelfResumeContinuationIngested } from "./messages";
|
|
5
|
+
import type { acquireMergePause, acquireMergeLease, releaseMergeLease, releaseExpiredMergeLeases, releaseExpiredMergePauses, renewMergePause, releaseMergePause } from "./merge-lease";
|
|
6
|
+
import type { ingestIntegrationEvent, upsertIntegrationRegistry } from "./integrations";
|
|
7
|
+
import type { refreshPendingLandQueueLease } from "./commands-claim-admission";
|
|
8
|
+
import type { writeEntry, retractEntry } from "./blackboard";
|
|
9
|
+
import type { fencePublishForPush, cancelPendingCommand } from "../commands-db";
|
|
10
|
+
import { randomUUID } from "node:crypto";
|
|
11
|
+
import { getGateway } from "./gateway";
|
|
12
|
+
import { deferLineageReport } from "./deferred-lineage-reports";
|
|
13
|
+
import { applyLineageReportEffects } from "./messages";
|
|
14
|
+
import { evictPendingPresence } from "./presence-buffer";
|
|
15
|
+
import type { deleteOrchestratorRow } from "./orchestrators";
|
|
16
|
+
import type { setUserSecret, createAuthIdentity } from "./auth-identities";
|
|
17
|
+
import type { markWorkspaceCarryPending, confirmWorkspaceCarryPendingForTask } from "./carry-pending-marker";
|
|
18
|
+
import type { ensureContinuationEnvelope, updateContinuationObjective } from "./continuations";
|
|
19
|
+
import type { releaseDriveLease, releaseExpiredDriveLeases } from "./drive-leases";
|
|
20
|
+
import type { finishIdleDigestScan, updateIdleDigestScan, startIdleDigestWindow } from "./idle-digest";
|
|
21
|
+
import type { associateIssue, removeAssociation } from "./issue-associations";
|
|
22
|
+
import type { insertLandGateAttestation } from "./land-gate-attestations";
|
|
23
|
+
import type { insertLandingReceipt } from "./landing-receipts";
|
|
24
|
+
import type { recordIssueLifecycleComment } from "./long-running-work";
|
|
25
|
+
import type { pauseMaintenanceJob, resumeMaintenanceJob } from "./maintenance-pauses";
|
|
26
|
+
import type { updateOpenOperatorDecision, withdrawOpenOperatorDecision } from "./operator-decisions";
|
|
27
|
+
import type { deleteOrchestrator } from "./orchestrators";
|
|
28
|
+
import type { upsertTemplate, resetTemplate } from "./prompt-templates";
|
|
29
|
+
import type { setReviewRefFenceToken, markReviewRefPublished, markReviewRefAnnounced, markReviewRefFailed, markReviewRefClosed, recordReviewRefCleanupDispatch, deleteReviewRefCleanup } from "./review-ref-cleanups";
|
|
30
|
+
import type { insertTaskEvent } from "./task-core";
|
|
31
|
+
import type { clearTeamIdleEntry, setTeamIdleEntry } from "./team-idle";
|
|
32
|
+
import type { updateUserProfile, updateUserAccess } from "./users";
|
|
33
|
+
import type { upsertTokenProfile, updateTokenProfile, deleteTokenProfile } from "../token-db";
|
|
34
|
+
|
|
35
|
+
export function setUserSecretAsync(...args: Parameters<typeof setUserSecret>): Promise<ReturnType<typeof setUserSecret>> {
|
|
36
|
+
return getGateway().write("runtimeTail.setUserSecret", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof setUserSecret>>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function createAuthIdentityAsync(...args: Parameters<typeof createAuthIdentity>): Promise<ReturnType<typeof createAuthIdentity>> {
|
|
40
|
+
return getGateway().write("runtimeTail.createAuthIdentity", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof createAuthIdentity>>;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function retractEntryAsync(...args: Parameters<typeof retractEntry>): Promise<ReturnType<typeof retractEntry>> {
|
|
44
|
+
return getGateway().write("runtimeTail.retractEntry", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof retractEntry>>;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function markWorkspaceCarryPendingAsync(...args: Parameters<typeof markWorkspaceCarryPending>): Promise<ReturnType<typeof markWorkspaceCarryPending>> {
|
|
48
|
+
return getGateway().write("runtimeTail.markWorkspaceCarryPending", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof markWorkspaceCarryPending>>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function confirmWorkspaceCarryPendingForTaskAsync(...args: Parameters<typeof confirmWorkspaceCarryPendingForTask>): Promise<ReturnType<typeof confirmWorkspaceCarryPendingForTask>> {
|
|
52
|
+
return getGateway().write("runtimeTail.confirmWorkspaceCarryPendingForTask", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof confirmWorkspaceCarryPendingForTask>>;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function ensureContinuationEnvelopeAsync(...args: Parameters<typeof ensureContinuationEnvelope>): Promise<ReturnType<typeof ensureContinuationEnvelope>> {
|
|
56
|
+
return getGateway().write("runtimeTail.ensureContinuationEnvelope", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof ensureContinuationEnvelope>>;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function updateContinuationObjectiveAsync(...args: Parameters<typeof updateContinuationObjective>): Promise<ReturnType<typeof updateContinuationObjective>> {
|
|
60
|
+
return getGateway().write("runtimeTail.updateContinuationObjective", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof updateContinuationObjective>>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function releaseDriveLeaseAsync(...args: Parameters<typeof releaseDriveLease>): Promise<ReturnType<typeof releaseDriveLease>> {
|
|
64
|
+
return getGateway().write("runtimeTail.releaseDriveLease", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof releaseDriveLease>>;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function releaseExpiredDriveLeasesAsync(...args: Parameters<typeof releaseExpiredDriveLeases>): Promise<ReturnType<typeof releaseExpiredDriveLeases>> {
|
|
68
|
+
return getGateway().write("runtimeTail.releaseExpiredDriveLeases", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof releaseExpiredDriveLeases>>;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function finishIdleDigestScanAsync(...args: Parameters<typeof finishIdleDigestScan>): Promise<ReturnType<typeof finishIdleDigestScan>> {
|
|
72
|
+
return getGateway().write("runtimeTail.finishIdleDigestScan", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof finishIdleDigestScan>>;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function updateIdleDigestScanAsync(...args: Parameters<typeof updateIdleDigestScan>): Promise<ReturnType<typeof updateIdleDigestScan>> {
|
|
76
|
+
return getGateway().write("runtimeTail.updateIdleDigestScan", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof updateIdleDigestScan>>;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function startIdleDigestWindowAsync(...args: Parameters<typeof startIdleDigestWindow>): Promise<ReturnType<typeof startIdleDigestWindow>> {
|
|
80
|
+
return getGateway().write("runtimeTail.startIdleDigestWindow", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof startIdleDigestWindow>>;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function associateIssueAsync(...args: Parameters<typeof associateIssue>): Promise<ReturnType<typeof associateIssue>> {
|
|
84
|
+
return getGateway().write("runtimeTail.associateIssue", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof associateIssue>>;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function removeAssociationAsync(...args: Parameters<typeof removeAssociation>): Promise<ReturnType<typeof removeAssociation>> {
|
|
88
|
+
return getGateway().write("runtimeTail.removeAssociation", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof removeAssociation>>;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function insertLandGateAttestationAsync(...args: Parameters<typeof insertLandGateAttestation>): Promise<ReturnType<typeof insertLandGateAttestation>> {
|
|
92
|
+
return getGateway().write("runtimeTail.insertLandGateAttestation", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof insertLandGateAttestation>>;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function insertLandingReceiptAsync(...args: Parameters<typeof insertLandingReceipt>): Promise<ReturnType<typeof insertLandingReceipt>> {
|
|
96
|
+
return getGateway().write("runtimeTail.insertLandingReceipt", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof insertLandingReceipt>>;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function recordIssueLifecycleCommentAsync(...args: Parameters<typeof recordIssueLifecycleComment>): Promise<ReturnType<typeof recordIssueLifecycleComment>> {
|
|
100
|
+
return getGateway().write("runtimeTail.recordIssueLifecycleComment", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof recordIssueLifecycleComment>>;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function pauseMaintenanceJobAsync(...args: Parameters<typeof pauseMaintenanceJob>): Promise<ReturnType<typeof pauseMaintenanceJob>> {
|
|
104
|
+
return getGateway().write("runtimeTail.pauseMaintenanceJob", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof pauseMaintenanceJob>>;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function resumeMaintenanceJobAsync(...args: Parameters<typeof resumeMaintenanceJob>): Promise<ReturnType<typeof resumeMaintenanceJob>> {
|
|
108
|
+
return getGateway().write("runtimeTail.resumeMaintenanceJob", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof resumeMaintenanceJob>>;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function releaseMergeLeaseAsync(...args: Parameters<typeof releaseMergeLease>): Promise<ReturnType<typeof releaseMergeLease>> {
|
|
112
|
+
return getGateway().write("runtimeTail.releaseMergeLease", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof releaseMergeLease>>;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function releaseExpiredMergeLeasesAsync(...args: Parameters<typeof releaseExpiredMergeLeases>): Promise<ReturnType<typeof releaseExpiredMergeLeases>> {
|
|
116
|
+
return getGateway().write("runtimeTail.releaseExpiredMergeLeases", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof releaseExpiredMergeLeases>>;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function releaseExpiredMergePausesAsync(...args: Parameters<typeof releaseExpiredMergePauses>): Promise<ReturnType<typeof releaseExpiredMergePauses>> {
|
|
120
|
+
return getGateway().write("runtimeTail.releaseExpiredMergePauses", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof releaseExpiredMergePauses>>;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export function renewMergePauseAsync(...args: Parameters<typeof renewMergePause>): Promise<ReturnType<typeof renewMergePause>> {
|
|
124
|
+
return getGateway().write("runtimeTail.renewMergePause", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof renewMergePause>>;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function releaseMergePauseAsync(...args: Parameters<typeof releaseMergePause>): Promise<ReturnType<typeof releaseMergePause>> {
|
|
128
|
+
return getGateway().write("runtimeTail.releaseMergePause", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof releaseMergePause>>;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export function markSelfResumeContinuationIngestedAsync(...args: Parameters<typeof markSelfResumeContinuationIngested>): Promise<ReturnType<typeof markSelfResumeContinuationIngested>> {
|
|
132
|
+
return getGateway().write("runtimeTail.markSelfResumeContinuationIngested", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof markSelfResumeContinuationIngested>>;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export function updateOpenOperatorDecisionAsync(...args: Parameters<typeof updateOpenOperatorDecision>): Promise<ReturnType<typeof updateOpenOperatorDecision>> {
|
|
136
|
+
return getGateway().write("runtimeTail.updateOpenOperatorDecision", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof updateOpenOperatorDecision>>;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function withdrawOpenOperatorDecisionAsync(...args: Parameters<typeof withdrawOpenOperatorDecision>): Promise<ReturnType<typeof withdrawOpenOperatorDecision>> {
|
|
140
|
+
return getGateway().write("runtimeTail.withdrawOpenOperatorDecision", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof withdrawOpenOperatorDecision>>;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export async function deleteOrchestratorAsync(...args: Parameters<typeof deleteOrchestrator>): Promise<ReturnType<typeof deleteOrchestrator>> {
|
|
144
|
+
const result = await getGateway().write("runtimeTail.deleteOrchestrator", args, { idempotencyKey: randomUUID() }) as unknown as ReturnType<typeof deleteOrchestratorRow>;
|
|
145
|
+
if (result.agentId) evictPendingPresence(result.agentId);
|
|
146
|
+
return result.deleted;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function upsertTemplateAsync(...args: Parameters<typeof upsertTemplate>): Promise<ReturnType<typeof upsertTemplate>> {
|
|
150
|
+
return getGateway().write("runtimeTail.upsertTemplate", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof upsertTemplate>>;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function resetTemplateAsync(...args: Parameters<typeof resetTemplate>): Promise<ReturnType<typeof resetTemplate>> {
|
|
154
|
+
return getGateway().write("runtimeTail.resetTemplate", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof resetTemplate>>;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export function setReviewRefFenceTokenAsync(...args: Parameters<typeof setReviewRefFenceToken>): Promise<ReturnType<typeof setReviewRefFenceToken>> {
|
|
158
|
+
return getGateway().write("runtimeTail.setReviewRefFenceToken", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof setReviewRefFenceToken>>;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export function markReviewRefPublishedAsync(...args: Parameters<typeof markReviewRefPublished>): Promise<ReturnType<typeof markReviewRefPublished>> {
|
|
162
|
+
return getGateway().write("runtimeTail.markReviewRefPublished", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof markReviewRefPublished>>;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export function markReviewRefAnnouncedAsync(...args: Parameters<typeof markReviewRefAnnounced>): Promise<ReturnType<typeof markReviewRefAnnounced>> {
|
|
166
|
+
return getGateway().write("runtimeTail.markReviewRefAnnounced", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof markReviewRefAnnounced>>;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export function markReviewRefFailedAsync(...args: Parameters<typeof markReviewRefFailed>): Promise<ReturnType<typeof markReviewRefFailed>> {
|
|
170
|
+
return getGateway().write("runtimeTail.markReviewRefFailed", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof markReviewRefFailed>>;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export function markReviewRefClosedAsync(...args: Parameters<typeof markReviewRefClosed>): Promise<ReturnType<typeof markReviewRefClosed>> {
|
|
174
|
+
return getGateway().write("runtimeTail.markReviewRefClosed", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof markReviewRefClosed>>;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export function recordReviewRefCleanupDispatchAsync(...args: Parameters<typeof recordReviewRefCleanupDispatch>): Promise<ReturnType<typeof recordReviewRefCleanupDispatch>> {
|
|
178
|
+
return getGateway().write("runtimeTail.recordReviewRefCleanupDispatch", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof recordReviewRefCleanupDispatch>>;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export function deleteReviewRefCleanupAsync(...args: Parameters<typeof deleteReviewRefCleanup>): Promise<ReturnType<typeof deleteReviewRefCleanup>> {
|
|
182
|
+
return getGateway().write("runtimeTail.deleteReviewRefCleanup", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof deleteReviewRefCleanup>>;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export function insertTaskEventAsync(...args: Parameters<typeof insertTaskEvent>): Promise<ReturnType<typeof insertTaskEvent>> {
|
|
186
|
+
return getGateway().write("runtimeTail.insertTaskEvent", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof insertTaskEvent>>;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export function clearTeamIdleEntryAsync(...args: Parameters<typeof clearTeamIdleEntry>): Promise<ReturnType<typeof clearTeamIdleEntry>> {
|
|
190
|
+
return getGateway().write("runtimeTail.clearTeamIdleEntry", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof clearTeamIdleEntry>>;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export function setTeamIdleEntryAsync(...args: Parameters<typeof setTeamIdleEntry>): Promise<ReturnType<typeof setTeamIdleEntry>> {
|
|
194
|
+
return getGateway().write("runtimeTail.setTeamIdleEntry", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof setTeamIdleEntry>>;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export function updateUserProfileAsync(...args: Parameters<typeof updateUserProfile>): Promise<ReturnType<typeof updateUserProfile>> {
|
|
198
|
+
return getGateway().write("runtimeTail.updateUserProfile", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof updateUserProfile>>;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export function updateUserAccessAsync(...args: Parameters<typeof updateUserAccess>): Promise<ReturnType<typeof updateUserAccess>> {
|
|
202
|
+
return getGateway().write("runtimeTail.updateUserAccess", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof updateUserAccess>>;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export function claimWorkspaceOrphanAlertAsync(...args: Parameters<typeof claimWorkspaceOrphanAlert>): Promise<ReturnType<typeof claimWorkspaceOrphanAlert>> {
|
|
206
|
+
return getGateway().write("runtimeTail.claimWorkspaceOrphanAlert", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof claimWorkspaceOrphanAlert>>;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export function claimWorkspaceHumanEscalationAlertAsync(...args: Parameters<typeof claimWorkspaceHumanEscalationAlert>): Promise<ReturnType<typeof claimWorkspaceHumanEscalationAlert>> {
|
|
210
|
+
return getGateway().write("runtimeTail.claimWorkspaceHumanEscalationAlert", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof claimWorkspaceHumanEscalationAlert>>;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export function pruneStaleWorkspaceHumanEscalationAlertsAsync(...args: Parameters<typeof pruneStaleWorkspaceHumanEscalationAlerts>): Promise<ReturnType<typeof pruneStaleWorkspaceHumanEscalationAlerts>> {
|
|
214
|
+
return getGateway().write("runtimeTail.pruneStaleWorkspaceHumanEscalationAlerts", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof pruneStaleWorkspaceHumanEscalationAlerts>>;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export function reelectRepoStewardAsync(...args: Parameters<typeof reelectRepoSteward>): Promise<ReturnType<typeof reelectRepoSteward>> {
|
|
218
|
+
return getGateway().write("runtimeTail.reelectRepoSteward", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof reelectRepoSteward>>;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export function upsertTokenProfileAsync(...args: Parameters<typeof upsertTokenProfile>): Promise<ReturnType<typeof upsertTokenProfile>> {
|
|
222
|
+
return getGateway().write("runtimeTail.upsertTokenProfile", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof upsertTokenProfile>>;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export function updateTokenProfileAsync(...args: Parameters<typeof updateTokenProfile>): Promise<ReturnType<typeof updateTokenProfile>> {
|
|
226
|
+
return getGateway().write("runtimeTail.updateTokenProfile", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof updateTokenProfile>>;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export function deleteTokenProfileAsync(...args: Parameters<typeof deleteTokenProfile>): Promise<ReturnType<typeof deleteTokenProfile>> {
|
|
230
|
+
return getGateway().write("runtimeTail.deleteTokenProfile", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof deleteTokenProfile>>;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export function cancelPendingCommandAsync(...args: Parameters<typeof cancelPendingCommand>): Promise<ReturnType<typeof cancelPendingCommand>> {
|
|
234
|
+
return getGateway().write("runtimeTail.cancelPendingCommand", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof cancelPendingCommand>>;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
export function fencePublishForPushAsync(...args: Parameters<typeof fencePublishForPush>): Promise<ReturnType<typeof fencePublishForPush>> {
|
|
238
|
+
return getGateway().write("runtimeTail.fencePublishForPush", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof fencePublishForPush>>;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
export function writeEntryAsync(...args: Parameters<typeof writeEntry>): Promise<ReturnType<typeof writeEntry>> {
|
|
242
|
+
return getGateway().write("runtimeTail.writeEntry", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof writeEntry>>;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
export function refreshPendingLandQueueLeaseAsync(...args: Parameters<typeof refreshPendingLandQueueLease>): Promise<ReturnType<typeof refreshPendingLandQueueLease>> {
|
|
246
|
+
return getGateway().write("runtimeTail.refreshPendingLandQueueLease", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof refreshPendingLandQueueLease>>;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export function upsertIntegrationRegistryAsync(...args: Parameters<typeof upsertIntegrationRegistry>): Promise<ReturnType<typeof upsertIntegrationRegistry>> {
|
|
250
|
+
return getGateway().write("runtimeTail.upsertIntegrationRegistry", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof upsertIntegrationRegistry>>;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export function ingestIntegrationEventAsync(...args: Parameters<typeof ingestIntegrationEvent>): Promise<ReturnType<typeof ingestIntegrationEvent>> {
|
|
254
|
+
return getGateway().write("runtimeTail.ingestIntegrationEvent", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof ingestIntegrationEvent>>;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export function acquireMergeLeaseAsync(...args: Parameters<typeof acquireMergeLease>): Promise<ReturnType<typeof acquireMergeLease>> {
|
|
258
|
+
return getGateway().write("runtimeTail.acquireMergeLease", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof acquireMergeLease>>;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
export function acquireMergePauseAsync(...args: Parameters<typeof acquireMergePause>): Promise<ReturnType<typeof acquireMergePause>> {
|
|
262
|
+
return getGateway().write("runtimeTail.acquireMergePause", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof acquireMergePause>>;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export async function promoteLineageCapturedResponseAsync(message: Parameters<typeof promoteLineageCapturedResponse>[0]): Promise<ReturnType<typeof promoteLineageCapturedResponse>> {
|
|
266
|
+
const value = await getGateway().write("runtimeTail.promoteLineageCapturedResponse", [message], { idempotencyKey: randomUUID() }) as unknown as {
|
|
267
|
+
result: ReturnType<typeof promoteLineageCapturedResponse>; deferred: Array<{ childId: string; messageId: number }>;
|
|
268
|
+
};
|
|
269
|
+
for (const effect of value.deferred) deferLineageReport(effect.childId, effect.messageId);
|
|
270
|
+
applyLineageReportEffects(value.result);
|
|
271
|
+
return value.result;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export function setProjectJournalFieldsAsync(...args: Parameters<typeof setProjectJournalFields>): Promise<ReturnType<typeof setProjectJournalFields>> {
|
|
275
|
+
return getGateway().write("runtimeTail.setProjectJournalFields", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof setProjectJournalFields>>;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export function upsertProjectTrustApprovalAsync(...args: Parameters<typeof upsertProjectTrustApproval>): Promise<ReturnType<typeof upsertProjectTrustApproval>> {
|
|
279
|
+
return getGateway().write("runtimeTail.upsertProjectTrustApproval", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof upsertProjectTrustApproval>>;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
export function pruneOrphanedSharedWorkspacesAsync(...args: Parameters<typeof pruneOrphanedSharedWorkspaces>): Promise<ReturnType<typeof pruneOrphanedSharedWorkspaces>> {
|
|
283
|
+
return getGateway().write("runtimeTail.pruneOrphanedSharedWorkspaces", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof pruneOrphanedSharedWorkspaces>>;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
export function pruneWorkspaceOrphanAlertsAsync(...args: Parameters<typeof pruneWorkspaceOrphanAlerts>): Promise<ReturnType<typeof pruneWorkspaceOrphanAlerts>> {
|
|
287
|
+
return getGateway().write("runtimeTail.pruneWorkspaceOrphanAlerts", args, { idempotencyKey: randomUUID() }) as unknown as Promise<ReturnType<typeof pruneWorkspaceOrphanAlerts>>;
|
|
288
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { redactCommandSecrets } from "../command-secrets";
|
|
2
|
+
import { pruneWorkspaceOrphanAlerts, pruneOrphanedSharedWorkspaces, claimWorkspaceOrphanAlert, claimWorkspaceHumanEscalationAlert, pruneStaleWorkspaceHumanEscalationAlerts, reelectRepoSteward } from "./workspaces";
|
|
3
|
+
import { upsertProjectTrustApproval } from "./project-trust-approvals";
|
|
4
|
+
import { setProjectJournalFields } from "./project-journal";
|
|
5
|
+
import { promoteLineageCapturedResponse, markSelfResumeContinuationIngested } from "./messages";
|
|
6
|
+
import { acquireMergePause, acquireMergeLease, releaseMergeLease, releaseExpiredMergeLeases, releaseExpiredMergePauses, renewMergePause, releaseMergePause } from "./merge-lease";
|
|
7
|
+
import { ingestIntegrationEvent, upsertIntegrationRegistry } from "./integrations";
|
|
8
|
+
import { refreshPendingLandQueueLease } from "./commands-claim-admission";
|
|
9
|
+
import { writeEntry, retractEntry } from "./blackboard";
|
|
10
|
+
import { fencePublishForPush, cancelPendingCommand } from "../commands-db";
|
|
11
|
+
import { setUserSecret, createAuthIdentity } from "./auth-identities";
|
|
12
|
+
import { markWorkspaceCarryPending, confirmWorkspaceCarryPendingForTask } from "./carry-pending-marker";
|
|
13
|
+
import { ensureContinuationEnvelope, updateContinuationObjective } from "./continuations";
|
|
14
|
+
import { releaseDriveLease, releaseExpiredDriveLeases } from "./drive-leases";
|
|
15
|
+
import { finishIdleDigestScan, updateIdleDigestScan, startIdleDigestWindow } from "./idle-digest";
|
|
16
|
+
import { associateIssue, removeAssociation } from "./issue-associations";
|
|
17
|
+
import { insertLandGateAttestation } from "./land-gate-attestations";
|
|
18
|
+
import { insertLandingReceipt } from "./landing-receipts";
|
|
19
|
+
import { recordIssueLifecycleComment } from "./long-running-work";
|
|
20
|
+
import { pauseMaintenanceJob, resumeMaintenanceJob } from "./maintenance-pauses";
|
|
21
|
+
import { updateOpenOperatorDecision, withdrawOpenOperatorDecision } from "./operator-decisions";
|
|
22
|
+
import { deleteOrchestratorRow } from "./orchestrators";
|
|
23
|
+
import { upsertTemplate, resetTemplate } from "./prompt-templates";
|
|
24
|
+
import { setReviewRefFenceToken, markReviewRefPublished, markReviewRefAnnounced, markReviewRefFailed, markReviewRefClosed, recordReviewRefCleanupDispatch, deleteReviewRefCleanup } from "./review-ref-cleanups";
|
|
25
|
+
import { insertTaskEvent } from "./task-core";
|
|
26
|
+
import { clearTeamIdleEntry, setTeamIdleEntry } from "./team-idle";
|
|
27
|
+
import { updateUserProfile, updateUserAccess } from "./users";
|
|
28
|
+
import { upsertTokenProfile, updateTokenProfile, deleteTokenProfile } from "../token-db";
|
|
29
|
+
import type { WriterOpSpec } from "./write-ops";
|
|
30
|
+
|
|
31
|
+
export const RUNTIME_TAIL_WRITE_OPS: Readonly<Record<string, WriterOpSpec>> = Object.freeze({
|
|
32
|
+
"runtimeTail.setUserSecret": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof setUserSecret>) => setUserSecret(...args) ?? null },
|
|
33
|
+
"runtimeTail.createAuthIdentity": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof createAuthIdentity>, ctx) => { const values: Parameters<typeof createAuthIdentity> = [...args]; values[1] ??= ctx.now; return createAuthIdentity(...values) ?? null; } },
|
|
34
|
+
"runtimeTail.retractEntry": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof retractEntry>, ctx) => { const values: Parameters<typeof retractEntry> = [...args]; values[1] ??= ctx.now; return retractEntry(...values) ?? null; } },
|
|
35
|
+
"runtimeTail.markWorkspaceCarryPending": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof markWorkspaceCarryPending>) => markWorkspaceCarryPending(...args) ?? null },
|
|
36
|
+
"runtimeTail.confirmWorkspaceCarryPendingForTask": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof confirmWorkspaceCarryPendingForTask>) => confirmWorkspaceCarryPendingForTask(...args) ?? null },
|
|
37
|
+
"runtimeTail.ensureContinuationEnvelope": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof ensureContinuationEnvelope>, ctx) => { const values: Parameters<typeof ensureContinuationEnvelope> = [...args]; values[1] ??= ctx.now; return ensureContinuationEnvelope(...values) ?? null; } },
|
|
38
|
+
"runtimeTail.updateContinuationObjective": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof updateContinuationObjective>, ctx) => { const values: Parameters<typeof updateContinuationObjective> = [...args]; values[1] ??= ctx.now; return updateContinuationObjective(...values) ?? null; } },
|
|
39
|
+
"runtimeTail.releaseDriveLease": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof releaseDriveLease>) => releaseDriveLease(...args) ?? null },
|
|
40
|
+
"runtimeTail.releaseExpiredDriveLeases": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof releaseExpiredDriveLeases>, ctx) => { const values: Parameters<typeof releaseExpiredDriveLeases> = [...args]; values[0] ??= ctx.now; return releaseExpiredDriveLeases(...values) ?? null; } },
|
|
41
|
+
"runtimeTail.finishIdleDigestScan": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof finishIdleDigestScan>) => finishIdleDigestScan(...args) ?? null },
|
|
42
|
+
"runtimeTail.updateIdleDigestScan": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof updateIdleDigestScan>) => updateIdleDigestScan(...args) ?? null },
|
|
43
|
+
"runtimeTail.startIdleDigestWindow": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof startIdleDigestWindow>) => startIdleDigestWindow(...args) ?? null },
|
|
44
|
+
"runtimeTail.associateIssue": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof associateIssue>, ctx) => { const values: Parameters<typeof associateIssue> = [...args]; values[4] ??= ctx.now; return associateIssue(...values) ?? null; } },
|
|
45
|
+
"runtimeTail.removeAssociation": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof removeAssociation>) => removeAssociation(...args) ?? null },
|
|
46
|
+
"runtimeTail.insertLandGateAttestation": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof insertLandGateAttestation>, ctx) => { const values: Parameters<typeof insertLandGateAttestation> = [...args]; values[1] ??= ctx.now; return insertLandGateAttestation(...values) ?? null; } },
|
|
47
|
+
"runtimeTail.insertLandingReceipt": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof insertLandingReceipt>, ctx) => { const values: Parameters<typeof insertLandingReceipt> = [...args]; values[1] ??= ctx.now; return insertLandingReceipt(...values) ?? null; } },
|
|
48
|
+
"runtimeTail.recordIssueLifecycleComment": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof recordIssueLifecycleComment>) => recordIssueLifecycleComment(...args) ?? null },
|
|
49
|
+
"runtimeTail.pauseMaintenanceJob": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof pauseMaintenanceJob>, ctx) => { const values: Parameters<typeof pauseMaintenanceJob> = [...args]; values[1] ??= ctx.now; return pauseMaintenanceJob(...values) ?? null; } },
|
|
50
|
+
"runtimeTail.resumeMaintenanceJob": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof resumeMaintenanceJob>) => resumeMaintenanceJob(...args) ?? null },
|
|
51
|
+
"runtimeTail.releaseMergeLease": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof releaseMergeLease>) => releaseMergeLease(...args) ?? null },
|
|
52
|
+
"runtimeTail.releaseExpiredMergeLeases": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof releaseExpiredMergeLeases>, ctx) => { const values: Parameters<typeof releaseExpiredMergeLeases> = [...args]; values[0] ??= ctx.now; return releaseExpiredMergeLeases(...values) ?? null; } },
|
|
53
|
+
"runtimeTail.releaseExpiredMergePauses": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof releaseExpiredMergePauses>, ctx) => { const values: Parameters<typeof releaseExpiredMergePauses> = [...args]; values[0] ??= ctx.now; return releaseExpiredMergePauses(...values) ?? null; } },
|
|
54
|
+
"runtimeTail.renewMergePause": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof renewMergePause>, ctx) => { const values: Parameters<typeof renewMergePause> = [...args]; values[2] ??= ctx.now; return renewMergePause(...values) ?? null; } },
|
|
55
|
+
"runtimeTail.releaseMergePause": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof releaseMergePause>) => releaseMergePause(...args) ?? null },
|
|
56
|
+
"runtimeTail.markSelfResumeContinuationIngested": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof markSelfResumeContinuationIngested>, ctx) => { const values: Parameters<typeof markSelfResumeContinuationIngested> = [...args]; values[1] ??= ctx.now; return markSelfResumeContinuationIngested(...values) ?? null; } },
|
|
57
|
+
"runtimeTail.updateOpenOperatorDecision": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof updateOpenOperatorDecision>, ctx) => { const values: Parameters<typeof updateOpenOperatorDecision> = [...args]; values[2] ??= ctx.now; return updateOpenOperatorDecision(...values) ?? null; } },
|
|
58
|
+
"runtimeTail.withdrawOpenOperatorDecision": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof withdrawOpenOperatorDecision>, ctx) => { const values: Parameters<typeof withdrawOpenOperatorDecision> = [...args]; values[1] ??= ctx.now; return withdrawOpenOperatorDecision(...values) ?? null; } },
|
|
59
|
+
"runtimeTail.deleteOrchestrator": { offLoop: true, idempotent: false, fn: (args: [string], ctx) => deleteOrchestratorRow(args[0], ctx.now) },
|
|
60
|
+
"runtimeTail.upsertTemplate": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof upsertTemplate>, ctx) => { const values: Parameters<typeof upsertTemplate> = [...args]; values[2] ??= ctx.now; return upsertTemplate(...values) ?? null; } },
|
|
61
|
+
"runtimeTail.resetTemplate": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof resetTemplate>, ctx) => { const values: Parameters<typeof resetTemplate> = [...args]; values[1] ??= ctx.now; return resetTemplate(...values) ?? null; } },
|
|
62
|
+
"runtimeTail.setReviewRefFenceToken": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof setReviewRefFenceToken>, ctx) => { const values: Parameters<typeof setReviewRefFenceToken> = [...args]; values[2] ??= ctx.now; return setReviewRefFenceToken(...values) ?? null; } },
|
|
63
|
+
"runtimeTail.markReviewRefPublished": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof markReviewRefPublished>, ctx) => { const values: Parameters<typeof markReviewRefPublished> = [...args]; values[2] ??= ctx.now; return markReviewRefPublished(...values) ?? null; } },
|
|
64
|
+
"runtimeTail.markReviewRefAnnounced": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof markReviewRefAnnounced>, ctx) => { const values: Parameters<typeof markReviewRefAnnounced> = [...args]; values[1] ??= ctx.now; return markReviewRefAnnounced(...values) ?? null; } },
|
|
65
|
+
"runtimeTail.markReviewRefFailed": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof markReviewRefFailed>, ctx) => { const values: Parameters<typeof markReviewRefFailed> = [...args]; values[1] ??= ctx.now; return markReviewRefFailed(...values) ?? null; } },
|
|
66
|
+
"runtimeTail.markReviewRefClosed": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof markReviewRefClosed>, ctx) => { const values: Parameters<typeof markReviewRefClosed> = [...args]; values[1] ??= ctx.now; return markReviewRefClosed(...values) ?? null; } },
|
|
67
|
+
"runtimeTail.recordReviewRefCleanupDispatch": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof recordReviewRefCleanupDispatch>, ctx) => { const values: Parameters<typeof recordReviewRefCleanupDispatch> = [...args]; values[3] ??= ctx.now; return recordReviewRefCleanupDispatch(...values) ?? null; } },
|
|
68
|
+
"runtimeTail.deleteReviewRefCleanup": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof deleteReviewRefCleanup>) => deleteReviewRefCleanup(...args) ?? null },
|
|
69
|
+
"runtimeTail.insertTaskEvent": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof insertTaskEvent>, ctx) => { const values: Parameters<typeof insertTaskEvent> = [...args]; values[2] ??= ctx.now; return insertTaskEvent(...values) ?? null; } },
|
|
70
|
+
"runtimeTail.clearTeamIdleEntry": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof clearTeamIdleEntry>) => clearTeamIdleEntry(...args) ?? null },
|
|
71
|
+
"runtimeTail.setTeamIdleEntry": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof setTeamIdleEntry>) => setTeamIdleEntry(...args) ?? null },
|
|
72
|
+
"runtimeTail.updateUserProfile": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof updateUserProfile>, ctx) => { const values: Parameters<typeof updateUserProfile> = [...args]; values[1] ??= ctx.now; return updateUserProfile(...values) ?? null; } },
|
|
73
|
+
"runtimeTail.updateUserAccess": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof updateUserAccess>, ctx) => { const values: Parameters<typeof updateUserAccess> = [...args]; values[1] ??= ctx.now; return updateUserAccess(...values) ?? null; } },
|
|
74
|
+
"runtimeTail.claimWorkspaceOrphanAlert": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof claimWorkspaceOrphanAlert>, ctx) => { const values: Parameters<typeof claimWorkspaceOrphanAlert> = [...args]; values[2] ??= ctx.now; return claimWorkspaceOrphanAlert(...values) ?? null; } },
|
|
75
|
+
"runtimeTail.claimWorkspaceHumanEscalationAlert": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof claimWorkspaceHumanEscalationAlert>, ctx) => { const values: Parameters<typeof claimWorkspaceHumanEscalationAlert> = [...args]; values[1] ??= ctx.now; return claimWorkspaceHumanEscalationAlert(...values) ?? null; } },
|
|
76
|
+
"runtimeTail.pruneStaleWorkspaceHumanEscalationAlerts": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof pruneStaleWorkspaceHumanEscalationAlerts>, ctx) => { const values: Parameters<typeof pruneStaleWorkspaceHumanEscalationAlerts> = [...args]; values[0] ??= ctx.now; return pruneStaleWorkspaceHumanEscalationAlerts(...values) ?? null; } },
|
|
77
|
+
"runtimeTail.reelectRepoSteward": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof reelectRepoSteward>) => reelectRepoSteward(...args) ?? null },
|
|
78
|
+
"runtimeTail.upsertTokenProfile": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof upsertTokenProfile>, ctx) => { const values: Parameters<typeof upsertTokenProfile> = [...args]; values[1] ??= ctx.now; return upsertTokenProfile(...values) ?? null; } },
|
|
79
|
+
"runtimeTail.updateTokenProfile": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof updateTokenProfile>) => updateTokenProfile(...args) ?? null },
|
|
80
|
+
"runtimeTail.deleteTokenProfile": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof deleteTokenProfile>) => deleteTokenProfile(...args) ?? null },
|
|
81
|
+
"runtimeTail.cancelPendingCommand": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof cancelPendingCommand>, ctx) => { const values: Parameters<typeof cancelPendingCommand> = [...args]; values[3] ??= ctx.now; return cancelPendingCommand(...values) ?? null; } },
|
|
82
|
+
"runtimeTail.fencePublishForPush": { offLoop: true, idempotent: false, serializeIdempotencyResult: value => value ? redactCommandSecrets(value as import("../types").Command) : null, fn: (args: Parameters<typeof fencePublishForPush>) => fencePublishForPush(...args) ?? null },
|
|
83
|
+
"runtimeTail.writeEntry": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof writeEntry>) => writeEntry(...args) ?? null },
|
|
84
|
+
"runtimeTail.refreshPendingLandQueueLease": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof refreshPendingLandQueueLease>, ctx) => { const values: Parameters<typeof refreshPendingLandQueueLease> = [...args]; values[1] ??= ctx.now; return refreshPendingLandQueueLease(...values) ?? null; } },
|
|
85
|
+
"runtimeTail.upsertIntegrationRegistry": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof upsertIntegrationRegistry>, ctx) => { const values: Parameters<typeof upsertIntegrationRegistry> = [...args]; values[1] ??= ctx.now; return upsertIntegrationRegistry(...values) ?? null; } },
|
|
86
|
+
"runtimeTail.ingestIntegrationEvent": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof ingestIntegrationEvent>) => ingestIntegrationEvent(...args) ?? null },
|
|
87
|
+
"runtimeTail.acquireMergeLease": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof acquireMergeLease>) => acquireMergeLease(...args) ?? null },
|
|
88
|
+
"runtimeTail.acquireMergePause": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof acquireMergePause>) => acquireMergePause(...args) ?? null },
|
|
89
|
+
"runtimeTail.promoteLineageCapturedResponse": { offLoop: true, idempotent: false, fn: (args: [Parameters<typeof promoteLineageCapturedResponse>[0]]) => {
|
|
90
|
+
const deferred: NonNullable<Parameters<typeof promoteLineageCapturedResponse>[1]> = [];
|
|
91
|
+
return { result: promoteLineageCapturedResponse(args[0], deferred), deferred };
|
|
92
|
+
} },
|
|
93
|
+
"runtimeTail.setProjectJournalFields": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof setProjectJournalFields>, ctx) => { const values: Parameters<typeof setProjectJournalFields> = [...args]; values[1] ??= ctx.now; return setProjectJournalFields(...values) ?? null; } },
|
|
94
|
+
"runtimeTail.upsertProjectTrustApproval": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof upsertProjectTrustApproval>, ctx) => { const values: Parameters<typeof upsertProjectTrustApproval> = [...args]; values[1] ??= ctx.now; return upsertProjectTrustApproval(...values) ?? null; } },
|
|
95
|
+
"runtimeTail.pruneOrphanedSharedWorkspaces": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof pruneOrphanedSharedWorkspaces>) => pruneOrphanedSharedWorkspaces(...args) ?? null },
|
|
96
|
+
"runtimeTail.pruneWorkspaceOrphanAlerts": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof pruneWorkspaceOrphanAlerts>) => pruneWorkspaceOrphanAlerts(...args) ?? null },
|
|
97
|
+
});
|
package/src/db/schema.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { COMMAND_RETENTION_SCHEMA } from "./command-retention";
|
|
2
|
+
import { TOKEN_USAGE_RETENTION_SCHEMA } from "./token-usage-retention";
|
|
1
3
|
import { DURABLE_PAYLOAD_SCHEMA } from "./durable-payloads"; import { PLAN_IMPORT_SCHEMA_SQL } from "./plan-import-schema";
|
|
2
4
|
import { PROJECT_ROOTS_SCHEMA } from "./project-root-schema";
|
|
3
5
|
import { seedBuiltInTokenProfiles } from "../token-db";
|
|
@@ -964,7 +966,6 @@ export function initDb(path: string = "agent-relay.db"): Database {
|
|
|
964
966
|
shutdown_requested_at INTEGER
|
|
965
967
|
);
|
|
966
968
|
CREATE INDEX IF NOT EXISTS idx_automation_runs_automation ON automation_runs(automation_id, created_at);
|
|
967
|
-
CREATE INDEX IF NOT EXISTS idx_automation_runs_status ON automation_runs(status);
|
|
968
969
|
CREATE INDEX IF NOT EXISTS idx_automation_runs_task ON automation_runs(task_id);
|
|
969
970
|
|
|
970
971
|
CREATE TABLE IF NOT EXISTS task_events (
|
|
@@ -1264,6 +1265,8 @@ export function initDb(path: string = "agent-relay.db"): Database {
|
|
|
1264
1265
|
${PLAN_IMPORT_SCHEMA_SQL};
|
|
1265
1266
|
${IDLE_DIGEST_SCHEMA_SQL};
|
|
1266
1267
|
${TASK_TOKEN_TOTALS_SCHEMA};
|
|
1268
|
+
${TOKEN_USAGE_RETENTION_SCHEMA};
|
|
1269
|
+
${COMMAND_RETENTION_SCHEMA};
|
|
1267
1270
|
${LONG_RUNNING_WORK_SCHEMA};
|
|
1268
1271
|
${SHIPPING_STATS_SCHEMA};
|
|
1269
1272
|
${OPERATOR_ACTIONS_SCHEMA};
|
package/src/db/spawn-budget.ts
CHANGED
|
@@ -45,6 +45,11 @@ function observedTokens(agentIds: string[]): ObservedSubtreeSpend {
|
|
|
45
45
|
COALESCE(SUM(usage_status IS NOT NULL), 0) AS unknownReports
|
|
46
46
|
FROM session_token_usage WHERE agent_id IN (SELECT value FROM json_each(?))`)
|
|
47
47
|
.get(ids) as { tokens: number; unknownReports: number };
|
|
48
|
+
const retired = getDb().query(`SELECT COALESCE(SUM(tokens), 0) AS tokens,
|
|
49
|
+
COALESCE(SUM(unknown_reports), 0) AS unknownReports FROM retired_token_usage_totals
|
|
50
|
+
WHERE agent_id IN (SELECT value FROM json_each(?))`).get(ids) as { tokens: number; unknownReports: number };
|
|
51
|
+
row.tokens += retired.tokens;
|
|
52
|
+
row.unknownReports += retired.unknownReports;
|
|
48
53
|
const live = getDb().query(`SELECT COALESCE(SUM(status = 'busy'), 0) AS busyAgents,
|
|
49
54
|
COALESCE(SUM(CASE WHEN json_valid(meta) THEN MAX(0, COALESCE(json_extract(meta, '$.unreportedTokenUsage'), 0)) ELSE 0 END), 0) AS unreportedReports
|
|
50
55
|
FROM agents WHERE id IN (SELECT value FROM json_each(?))`)
|
|
@@ -5,8 +5,6 @@ import { getPersistedAgentRuntimeCard as getAgent } from "./agent-card-read";
|
|
|
5
5
|
import { getDb, ValidationError } from "./connection";
|
|
6
6
|
import { runnerSpawnGrantForAgent } from "../runtime-grant";
|
|
7
7
|
import { optionalNonNegativeInt } from "../validation";
|
|
8
|
-
import { sameHostIdentity } from "../utils";
|
|
9
|
-
import { getOrchestrator } from "./orchestrators";
|
|
10
8
|
import { stringValue } from "@humwick/sdk";
|
|
11
9
|
import type { CreateCommandInput } from "../types";
|
|
12
10
|
import { getLaunchFact } from "./launch-facts";
|
|
@@ -37,15 +35,7 @@ export function assertDelegatedSpawnTarget(input: CreateCommandInput) {
|
|
|
37
35
|
return !agent || agent.status === "offline" || agent.meta?.lifecycleAction === "shutting-down";
|
|
38
36
|
})) throw new ValidationError("SPAWN_SUBTREE_STOPPING: caller or ancestor has stopped");
|
|
39
37
|
const projectId = delegatedProjectTarget(input, state);
|
|
40
|
-
|
|
41
|
-
const targetHost = stringValue(input.params?.orchestratorId);
|
|
42
|
-
if (parentHost && targetHost) {
|
|
43
|
-
// #3650: machine is the raw os.hostname() ("WBOX"); orchestrator identity is configured ("wbox"/"wbox-1").
|
|
44
|
-
const target = getOrchestrator(targetHost);
|
|
45
|
-
const sameHost = sameHostIdentity(parentHost, targetHost)
|
|
46
|
-
|| (target && [target.id, target.hostname, target.agentId].some(identity => sameHostIdentity(identity, parentHost)));
|
|
47
|
-
if (!sameHost) throw new ValidationError("SPAWN_PROJECT_MISMATCH: delegated launches stay on their parent's host");
|
|
48
|
-
}
|
|
38
|
+
// #3769 — placement owns the host; delegatedProjectTarget checks its registered project checkout.
|
|
49
39
|
if (state.depth === 1 && profile === "sub-coordinator") throw new ValidationError("SPAWN_DEPTH_EXCEEDED: sub-coordinators cannot delegate another coordinator");
|
|
50
40
|
const workflow = Boolean(input.params?.workflowRunId);
|
|
51
41
|
const grant = runnerSpawnGrantForAgent(parentId);
|
|
@@ -44,6 +44,9 @@ export const SQL_AUDIT_INDEXES = [
|
|
|
44
44
|
`CREATE INDEX IF NOT EXISTS idx_task_events_land_workspace ON task_events(json_extract(metadata, '$.workspaceId'))
|
|
45
45
|
WHERE type = 'deliverable' AND json_extract(metadata, '$.land.requested') = 1`,
|
|
46
46
|
LAND_WITHDRAWN_INDEX_SQL,
|
|
47
|
+
// #3779 spawnRequestId -> Task resolution (every register/land/deliver auth check): a full task_events scan blocked the loop.
|
|
48
|
+
`CREATE INDEX IF NOT EXISTS idx_task_events_spawn_request ON task_events(json_extract(metadata, '$.spawnRequestId'))
|
|
49
|
+
WHERE type = 'agent.spawn_requested'`,
|
|
47
50
|
`CREATE INDEX IF NOT EXISTS idx_task_events_land_bound_workspace ON task_events(${LAND_WORKSPACE_EXPRESSION})
|
|
48
51
|
WHERE type = 'deliverable' AND json_extract(metadata, '$.land.requested') = 1`,
|
|
49
52
|
`CREATE INDEX IF NOT EXISTS idx_task_events_deliverable_workspace ON task_events(${LAND_WORKSPACE_EXPRESSION}, task_id)
|
package/src/db/stats-async.ts
CHANGED
|
@@ -117,7 +117,9 @@ export function buildDbGatewayCheck(stats: DbGatewayStats): HealthCheck {
|
|
|
117
117
|
const detail = [
|
|
118
118
|
`writer=${stats.writerBackend}`,
|
|
119
119
|
`reader=${stats.readerBackend}`,
|
|
120
|
-
|
|
120
|
+
// #3798 — the op split counts executed writes; the registered op definitions are named as such.
|
|
121
|
+
`onLoopOps=${stats.writer.onLoopOps}; writerThreadOps=${stats.writer.writerThreadOps}`,
|
|
122
|
+
`opDefinitions onLoop=${specs.length - offLoop} offLoop=${offLoop}`,
|
|
121
123
|
`mainConnectionWrites1h=${JSON.stringify(writes)}`,
|
|
122
124
|
...(wedged ? [`writer wedged: op ${wedged.op} running ${Math.round(wedged.runningMs / 1000)}s`] : []),
|
|
123
125
|
...(shedCount > 0 ? [`${shedCount} reader shed(s)`] : []),
|
|
@@ -128,8 +130,8 @@ export function buildDbGatewayCheck(stats: DbGatewayStats): HealthCheck {
|
|
|
128
130
|
deployRole: "load",
|
|
129
131
|
detail,
|
|
130
132
|
metrics: {
|
|
131
|
-
onLoopOps:
|
|
132
|
-
writerThreadOps:
|
|
133
|
+
onLoopOps: stats.writer.onLoopOps,
|
|
134
|
+
writerThreadOps: stats.writer.writerThreadOps,
|
|
133
135
|
mainConnectionWrites1h: Object.values(writes).reduce((sum, count) => sum + count, 0),
|
|
134
136
|
mainConnectionBootWrites: mainConnectionBootWrites(),
|
|
135
137
|
writerQueued: stats.writer.queued,
|
package/src/db/task-entity.ts
CHANGED
|
@@ -1085,14 +1085,15 @@ export function deliverableTaskIdsByOwnerAgent(agentId: string): number[] {
|
|
|
1085
1085
|
// event (recorded BEFORE the child registers) carries the spawnRequestId. The landing worker's
|
|
1086
1086
|
// `meta.spawnRequestId` resolves back through it to the Task. Returns every matching task id so a
|
|
1087
1087
|
// reused spawnRequestId can't silently drop a link.
|
|
1088
|
+
export const TASK_IDS_BY_SPAWN_REQUEST_SQL = `SELECT DISTINCT te.task_id AS id FROM task_events te INDEXED BY idx_task_events_spawn_request
|
|
1089
|
+
JOIN tasks t ON t.id = te.task_id AND t.kind = '${DELIVERABLE_TASK_KIND}'
|
|
1090
|
+
WHERE te.type = 'agent.spawn_requested' AND json_extract(te.metadata, '$.spawnRequestId') = ?
|
|
1091
|
+
ORDER BY te.task_id ASC`;
|
|
1088
1092
|
export function deliverableTaskIdsBySpawnRequestId(spawnRequestId: string): number[] {
|
|
1089
1093
|
const cleaned = spawnRequestId?.trim();
|
|
1090
1094
|
if (!cleaned) return [];
|
|
1091
1095
|
return (getDb()
|
|
1092
|
-
.query(
|
|
1093
|
-
JOIN tasks t ON t.id = te.task_id AND t.kind = '${DELIVERABLE_TASK_KIND}'
|
|
1094
|
-
WHERE te.type = 'agent.spawn_requested' AND json_extract(te.metadata, '$.spawnRequestId') = ?
|
|
1095
|
-
ORDER BY te.task_id ASC`)
|
|
1096
|
+
.query(TASK_IDS_BY_SPAWN_REQUEST_SQL)
|
|
1096
1097
|
.all(cleaned) as Array<{ id: number }>)
|
|
1097
1098
|
.map((r) => r.id);
|
|
1098
1099
|
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { STALE_TTL_MS } from "../config";
|
|
2
|
+
import { getAgent } from "./agents";
|
|
3
|
+
import { countLiveTeamMembers, getTeam, claimTeamWithAdoption, isClaimableTeam } from "./teams";
|
|
4
|
+
import type { Team } from "../types";
|
|
5
|
+
export class TeamAuthError extends Error {}
|
|
6
|
+
export class TeamNotFoundError extends Error {}
|
|
7
|
+
function lineageRootForAgent(agentId: string): string | undefined {
|
|
8
|
+
let current = getAgent(agentId);
|
|
9
|
+
const seen = new Set<string>();
|
|
10
|
+
while (current) {
|
|
11
|
+
if (seen.has(current.id)) return undefined;
|
|
12
|
+
seen.add(current.id);
|
|
13
|
+
if (!current.spawnedBy) return current.id;
|
|
14
|
+
current = getAgent(current.spawnedBy);
|
|
15
|
+
}
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function coordinatorIsLive(team: Team): boolean {
|
|
20
|
+
if (!team.coordinatorId) return false;
|
|
21
|
+
const coordinator = getAgent(team.coordinatorId);
|
|
22
|
+
if (!coordinator || coordinator.status === "offline") return false;
|
|
23
|
+
if (coordinator.teamId === team.id) return countLiveTeamMembers(team.id, Date.now() - STALE_TTL_MS) > 0;
|
|
24
|
+
return coordinator.lastSeen > Date.now() - STALE_TTL_MS;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** How a claim was authorized — carried into the audit trail so an orphan takeover is
|
|
28
|
+
* distinguishable from a routine same-lineage reclaim. */
|
|
29
|
+
export type TeamClaimMode = "admin" | "same-lineage" | "orphan-takeover";
|
|
30
|
+
|
|
31
|
+
// #1454 — live owners require same-lineage authority; dead owners permit orphan takeover.
|
|
32
|
+
|
|
33
|
+
function assertCanClaimTeam(admin: boolean, team: Team, callerAgentId: string): TeamClaimMode {
|
|
34
|
+
const caller = getAgent(callerAgentId);
|
|
35
|
+
const callerTeam = caller?.teamId ? getTeam(caller.teamId) : null;
|
|
36
|
+
if (!admin && callerTeam?.parentTeamId && team.id !== callerTeam.id) {
|
|
37
|
+
throw new TeamAuthError("a sub-coordinator may claim only its own private team");
|
|
38
|
+
}
|
|
39
|
+
const callerRoot = lineageRootForAgent(callerAgentId);
|
|
40
|
+
const teamRoot = team.rootCoordinatorId ?? team.coordinatorId;
|
|
41
|
+
// Same-lineage reclaim is the routine fast path (a replacement spawned under the original
|
|
42
|
+
// founder) and stays allowed regardless of owner liveness.
|
|
43
|
+
if (callerRoot && teamRoot && callerRoot === teamRoot) return "same-lineage";
|
|
44
|
+
if (admin) return "admin";
|
|
45
|
+
// #1454 orphan takeover: a replacement coordinator of a DIFFERENT lineage may adopt the team only
|
|
46
|
+
// when its owning coordinator is not live (offline, or stale past the heartbeat TTL). This is the
|
|
47
|
+
// sole security boundary for the cross-lineage path — a healthy owner is never displaced.
|
|
48
|
+
if (!coordinatorIsLive(team)) return "orphan-takeover";
|
|
49
|
+
throw new TeamAuthError(`caller ${callerAgentId} cannot claim team ${team.id}`);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
export function claimAuthorizedTeam(teamId: string, agentId: string, admin: boolean) {
|
|
54
|
+
if (!isClaimableTeam(getTeam(teamId))) throw new TeamNotFoundError(`active team ${teamId} not found`);
|
|
55
|
+
let captured: { mode: TeamClaimMode; priorCoordinatorId: string | null } | undefined;
|
|
56
|
+
const result = claimTeamWithAdoption(teamId, agentId, team => {
|
|
57
|
+
captured = { mode: assertCanClaimTeam(admin, team, agentId), priorCoordinatorId: team.coordinatorId ?? null };
|
|
58
|
+
});
|
|
59
|
+
return { ...result, ...captured! };
|
|
60
|
+
}
|
package/src/db/teams-async.ts
CHANGED
|
@@ -56,3 +56,7 @@ export function setTeamBriefAsync(input: Parameters<typeof setTeamBrief>[0]): Pr
|
|
|
56
56
|
export function dissolveTeamAsync(teamId: string, input?: Parameters<typeof dissolveTeam>[1], requestId: string = randomUUID()): Promise<ReturnType<typeof dissolveTeam>> {
|
|
57
57
|
return getGateway().write("teams.dissolve", { teamId, input }, { idempotencyKey: requestId }) as unknown as Promise<ReturnType<typeof dissolveTeam>>;
|
|
58
58
|
}
|
|
59
|
+
|
|
60
|
+
export function ensureTeamAsync(agentId: string, opts: { projectId?: string } = {}): Promise<NonNullable<ReturnType<typeof getTeam>>> {
|
|
61
|
+
return write("teams.ensure", { agentId, id: `team_${randomUUID()}`, ...opts });
|
|
62
|
+
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { claimAuthorizedTeam } from "./team-claim-policy";
|
|
2
|
+
import { ensureTeamInternal } from "./teams";
|
|
1
3
|
// Team writer operations. Guards that were formerly adjacent sync statements now execute inside
|
|
2
4
|
// the writer transaction; async callers submit a main-thread generated id and never rely on worker
|
|
3
5
|
// process-local state.
|
|
@@ -10,6 +12,8 @@ import {
|
|
|
10
12
|
import type { WriterOpContext, WriterOpSpec } from "./write-ops.ts";
|
|
11
13
|
|
|
12
14
|
export const TEAMS_WRITE_OPS: Readonly<Record<string, WriterOpSpec>> = Object.freeze({
|
|
15
|
+
"teams.ensure": { offLoop: true, idempotent: true, fn: (a: { agentId: string; id: string; projectId?: string }, ctx) => ensureTeamInternal(a.agentId, a.id, ctx.now, false, a.projectId ?? null) },
|
|
16
|
+
"teams.claimAuthorized": { offLoop: true, idempotent: true, fn: (a: { teamId: string; agentId: string; admin: boolean }) => claimAuthorizedTeam(a.teamId, a.agentId, a.admin) },
|
|
13
17
|
"teams.zeroMembers.set": { offLoop: true, idempotent: true, fn: (a: { teamId: string; ts: number }) => setTeamZeroMembersSince(a.teamId, a.ts) },
|
|
14
18
|
"teams.zeroMembers.clear": { offLoop: true, idempotent: true, fn: (a: { teamId: string }, ctx) => clearTeamZeroMembersSince(a.teamId, ctx.now) },
|
|
15
19
|
"teams.brief.set": { offLoop: true, idempotent: true, fn: (a: Parameters<typeof setTeamBrief>[0], ctx) => setTeamBrief(a, ctx.now) },
|