@humwick/server 0.130.1 → 0.130.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/bundled/prompts/manifest.json +1 -0
- package/bundled/prompts/task.hydration.md +1 -1
- package/bundled/roles/builder.md +1 -1
- package/docs/guides/sub-coordinators.md +12 -5
- package/docs/guides/tools-administration.md +4 -0
- package/docs/guides/tools-coordination.md +2 -0
- package/docs/guides/tools-tasks.md +8 -0
- package/docs/guides/workflows.md +74 -0
- package/docs/openapi.json +486 -4
- package/package.json +10 -18
- package/public/assets/{MessageBubble-BWpoBjl4.js → MessageBubble-Bq9kr21N.js} +2 -2
- package/public/assets/{PlanGraphPanel-C0auck3n.js → PlanGraphPanel-Dqiroy06.js} +2 -2
- package/public/assets/{TraceView-DBnOx7AQ.js → TraceView-DYU962-H.js} +2 -2
- package/public/assets/{VaultDecisionCard-0kp2oNBC.js → VaultDecisionCard-DhPfzioE.js} +2 -2
- package/public/assets/{activity-yLztXEBt.js → activity-DzCcQTee.js} +2 -2
- package/public/assets/{agent-lineage-BbJDR1dW.js → agent-lineage-SgDt9i3T.js} +2 -2
- package/public/assets/agent-liveness-Bq-s73jW.js +2 -0
- package/public/assets/{agent-name-CTZBrSD9.js → agent-name-CcY3Aijy.js} +2 -2
- package/public/assets/agent-profiles-cxtRBn6O.js +2 -0
- package/public/assets/{agent-project-badge-9TqzUUYE.js → agent-project-badge-DGYbIhaI.js} +2 -2
- package/public/assets/{agent-tools-D4n40pn8.js → agent-tools-DHbftV0N.js} +2 -2
- package/public/assets/{agent-type-icon-D6FUarOf.js → agent-type-icon-CY113sp-.js} +2 -2
- package/public/assets/{agents-BYDslkJc.js → agents-BPzY7IlQ.js} +2 -2
- package/public/assets/{analytics-B-XSbEMC.js → analytics-DENFPv_a.js} +2 -2
- package/public/assets/{artifact-viewer-DdWIfV6M.js → artifact-viewer-KRvSc7sl.js} +2 -2
- package/public/assets/{artifacts-DPN1q4pA.js → artifacts-C9gSmL3s.js} +2 -2
- package/public/assets/{artifacts-oBOqks-2.js → artifacts-DT-HkI5O.js} +2 -2
- package/public/assets/{automation-4KcRFXEu.js → automation-BsmjQhKD.js} +2 -2
- package/public/assets/{backlog-Cw9xPTCF.js → backlog-8NYH_62t.js} +2 -2
- package/public/assets/{busy-health-CTu32MZt.js → busy-health-D3hwvYb4.js} +2 -2
- package/public/assets/{channels-BiXzg1G9.js → channels-DCJ5WL7O.js} +2 -2
- package/public/assets/{chat-Ctk2qwvA.js → chat-DAIl357U.js} +3 -3
- package/public/assets/{code-preview-Bm1wWqAp.js → code-preview-CzrZfr9U.js} +2 -2
- package/public/assets/{connectors-C36ax4Vw.js → connectors-xTxtlyou.js} +2 -2
- package/public/assets/{cosmos-Jj9LK2Wf.js → cosmos-BpebFLK2.js} +2 -2
- package/public/assets/{crate-agent-H6S7-B9T.js → crate-agent-BHvI5wXC.js} +2 -2
- package/public/assets/{dependency-graph-Cd1E23wa.js → dependency-graph-DGT0o3wJ.js} +2 -2
- package/public/assets/{deploys-Bwfq146q.js → deploys-hqWOHSHE.js} +2 -2
- package/public/assets/{display-CfO7rTuF.js → display-CDeH4I8T.js} +2 -2
- package/public/assets/{files-DhhZI2Ih.js → files-BTeGVmTg.js} +2 -2
- package/public/assets/{fleet-B_rFEbnL.js → fleet-DgXtNgCa.js} +2 -2
- package/public/assets/{fleet-metrics-BkHP-P3R.js → fleet-metrics-BHEt5yc_.js} +2 -2
- package/public/assets/{formatted-body-Cm1RrzmN.js → formatted-body-MLtodyPp.js} +3 -3
- package/public/assets/{formatted-body-impl-DQiOuOD1.js → formatted-body-impl-CAe664Z8.js} +2 -2
- package/public/assets/{host-providers-dialog-CHqwXTov.js → host-providers-dialog-mapF4Fj9.js} +2 -2
- package/public/assets/index-CqqgOI5R.js +15 -0
- package/public/assets/index-MYAIwYTX.css +2 -0
- package/public/assets/{insights-fH1EL-qZ.js → insights-DNyf7IzF.js} +2 -2
- package/public/assets/{integrations-C5Oix6ng.js → integrations-DlYOHq7T.js} +2 -2
- package/public/assets/{issue-ref-chip-ODyondIa.js → issue-ref-chip-CeWBNWn7.js} +2 -2
- package/public/assets/{log-viewer-Cvfy6PW7.js → log-viewer-Cib8nqdE.js} +2 -2
- package/public/assets/{maintenance-D8CDH5wZ.js → maintenance-DSn1cPm7.js} +2 -2
- package/public/assets/{managed-agents-egllbpij.js → managed-agents-C3CkM81m.js} +2 -2
- package/public/assets/{markdown-preview-CYSFgVgK.js → markdown-preview-W4VQQPAv.js} +3 -3
- package/public/assets/{markdown-preview-impl-BteVIjX4.js → markdown-preview-impl-CMsTdhjq.js} +2 -2
- package/public/assets/{memory-C8WmXsyr.js → memory-BV17qtO4.js} +2 -2
- package/public/assets/{messages-BzQdqlO6.js → messages-Bm_1AqSA.js} +2 -2
- package/public/assets/{orchestrators-B1HxzkNw.js → orchestrators-Dg-vfP09.js} +2 -2
- package/public/assets/{overview-DCUnI4Z7.js → overview-DcYCrvlr.js} +2 -2
- package/public/assets/{pairs-ftCd2XcD.js → pairs-8o9nuG3V.js} +2 -2
- package/public/assets/{profile-icon-B2zH8DMH.js → profile-icon-BsRyBMea.js} +2 -2
- package/public/assets/project-profile-instructions-DETKFn_E.js +2 -0
- package/public/assets/projects-M_m6AHws.js +2 -0
- package/public/assets/{prompt-settings-Bftq9czX.js → prompt-settings-C_mNCgeL.js} +2 -2
- package/public/assets/provider-display-BEeLXC_D.js +2 -0
- package/public/assets/{registry-DWCU5c8q.js → registry-DDHHHE5N.js} +2 -2
- package/public/assets/run-card-Dt4I4jaP.js +2 -0
- package/public/assets/scroll-text-BKXS1ahr.js +2 -0
- package/public/assets/{secrets-C7GIUATz.js → secrets-BkVwxI5O.js} +2 -2
- package/public/assets/{service-access-settings-C3aujqTG.js → service-access-settings-Crq-6a-B.js} +2 -2
- package/public/assets/{settings-C6sZ9eBa.js → settings-CYcavMFu.js} +2 -2
- package/public/assets/shipping-H6gzEeZB.js +2 -0
- package/public/assets/{stats-V9Z-GxUd.js → stats-BJVeWkpV.js} +2 -2
- package/public/assets/{status-dot-CVv0iGHL.js → status-dot-BcHyw1Vw.js} +2 -2
- package/public/assets/store-DKPDIZBe.js +9 -0
- package/public/assets/{tasks-CXU75HRF.js → tasks-qJjlQPpx.js} +2 -2
- package/public/assets/{teams-BPf976zb.js → teams-Cd5Sk1uX.js} +2 -2
- package/public/assets/{terminal-viewer-DE9BOe-8.js → terminal-viewer-CpY5_m7W.js} +3 -3
- package/public/assets/{terminal-viewer-impl-D04pjmGh.js → terminal-viewer-impl-DI_2llFR.js} +2 -2
- package/public/assets/token-estimate-Co-Jdphh.js +2 -0
- package/public/assets/{use-agent-terminal-B1yR456R.js → use-agent-terminal-0yJA_buM.js} +2 -2
- package/public/assets/{use-decisions-D-S4tpDf.js → use-decisions-uJXHf34W.js} +2 -2
- package/public/assets/use-project-list-CpWl6eHQ.js +2 -0
- package/public/assets/{use-selectors-CnrAk2YP.js → use-selectors-BdxBW8mL.js} +2 -2
- package/public/assets/{user-avatar-nBFIcR4M.js → user-avatar-3IndfpOc.js} +2 -2
- package/public/assets/versioned-prompt-editor-CIVg7XB1.js +8 -0
- package/public/assets/{work-queue-TCjJxeT-.js → work-queue-B9rnLwHZ.js} +2 -2
- package/public/assets/{workflow-marker-Cf3Hf2fN.js → workflow-marker-X8wxyhzC.js} +2 -2
- package/public/assets/{workflows-CXQX20Qj.js → workflows-o5YyMFW7.js} +2 -2
- package/public/assets/{workspaces-qSYzKYMA.js → workspaces-CzEGoAng.js} +2 -2
- package/public/cosmos.html +4 -4
- package/public/index.html +31 -29
- package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/runner/plugins/claude/hooks/gate-run-guard.provisioned.mjs +31 -1
- package/runner/src/adapters/claude-effort.ts +2 -4
- package/runner/src/adapters/claude-headless.ts +1 -1
- package/runner/src/adapters/claude-launch-exit.ts +26 -0
- package/runner/src/adapters/claude-session-probe.ts +1 -1
- package/runner/src/adapters/claude-tmux.ts +38 -10
- package/runner/src/adapters/claude.ts +28 -75
- package/runner/src/adapters/codex-launch-config.ts +4 -5
- package/runner/src/adapters/codex.ts +1 -1
- package/runner/src/adapters/opencode-provider.ts +7 -22
- package/runner/src/adapters/opencode.ts +4 -4
- package/runner/src/adapters/provider-quota-harvest.ts +20 -71
- package/runner/src/agent-runner/credentials.ts +42 -12
- package/runner/src/agent-runner/inbox.ts +27 -0
- package/runner/src/agent-runner/lifecycle-milestones.ts +2 -4
- package/runner/src/agent-runner/liveness-exchange.ts +104 -0
- package/runner/src/bin/claude.ts +4 -0
- package/runner/src/bin/codex.ts +4 -0
- package/runner/src/bin/opencode.ts +4 -0
- package/runner/src/claude-system-prompt.ts +49 -0
- package/runner/src/index.ts +5 -2
- package/runner/src/launch-assembly.ts +14 -10
- package/runner/src/profile-home.ts +1 -1
- package/runner/src/project-instructions.ts +2 -2
- package/runner/src/provider-command.ts +18 -0
- package/runner/src/provider-setup.ts +35 -0
- package/runner/src/providers.ts +2 -1
- package/runner/src/runner-core.ts +32 -38
- package/runner/src/runner-helpers.ts +0 -8
- package/runner/src/session-scratch.ts +6 -2
- package/runner/src/spawn-input.ts +2 -1
- package/runner/src/test-run-dedup.ts +59 -56
- package/runner/test-support/provisioning-context.ts +4 -2
- package/runner/test-support/runner-harness.ts +2 -1
- package/scripts/cd-config.ts +8 -0
- package/scripts/gate-run-lease.ts +10 -7
- package/scripts/gate.sh +5 -1
- package/scripts/steward-policy-cleanup.ts +2 -2
- package/src/agent-authz.ts +2 -2
- package/src/agent-drive-arbiter.ts +3 -8
- package/src/agent-exit-cleanup-async.ts +2 -2
- package/src/agent-exit-cleanup.ts +23 -19
- package/src/agent-lifecycle-events.ts +112 -85
- package/src/agent-ref.ts +3 -2
- package/src/agent-status-events.ts +43 -14
- package/src/auth/password.ts +4 -3
- package/src/auth/session-refresh.ts +1 -1
- package/src/auth/session.test-fixture.ts +2 -2
- package/src/auth/session.ts +7 -7
- package/src/automations/crud.ts +8 -81
- package/src/automations/dispatch.ts +33 -58
- package/src/automations/index.ts +1 -1
- package/src/automations/persistence.ts +65 -0
- package/src/automations/precheck.ts +18 -16
- package/src/automations/read-async.ts +11 -0
- package/src/automations/reconcile.ts +30 -39
- package/src/automations/storage.ts +33 -10
- package/src/automations/write-async.ts +33 -0
- package/src/branch-land-notice.ts +93 -0
- package/src/branch-landed.ts +31 -98
- package/src/bus.ts +40 -39
- package/src/cd-deploy-notify.ts +32 -4
- package/src/cd-host-lag-notify.ts +7 -6
- package/src/ci/incidents.ts +2 -2
- package/src/ci/monitor.ts +5 -8
- package/src/ci/notifications.ts +4 -4
- package/src/ci/root-missing.ts +4 -9
- package/src/ci/transition-notify.ts +12 -44
- package/src/claude-app/oauth-http.ts +3 -3
- package/src/cli/cd-pauses.ts +19 -0
- package/src/cli/orchestrator.ts +1 -1
- package/src/cli/state.ts +2 -19
- package/src/cli/task-edit.ts +22 -0
- package/src/cli/task.ts +3 -1
- package/src/cli/workflow.ts +19 -4
- package/src/commands-db.ts +7 -7
- package/src/commands-write.ts +8 -0
- package/src/compaction-watch.ts +10 -8
- package/src/config-store-write.ts +13 -1
- package/src/config-store.ts +25 -14
- package/src/config.ts +4 -11
- package/src/connectors.ts +10 -8
- package/src/context-advisory.ts +22 -21
- package/src/db/activity-async.ts +6 -1
- package/src/db/activity-write-ops.ts +12 -1
- package/src/db/activity.ts +1 -14
- package/src/db/agent-action-write.ts +36 -0
- package/src/db/agent-control-async.ts +9 -0
- package/src/db/agent-control-write.ts +49 -0
- package/src/db/agent-effort-observe.ts +22 -0
- package/src/db/agent-meta.ts +14 -3
- package/src/db/agent-search.ts +1 -15
- package/src/db/agents-async.ts +59 -9
- package/src/db/agents-write-ops.ts +12 -3
- package/src/db/agents.ts +95 -65
- package/src/db/auth-identities.ts +2 -2
- package/src/db/automation-read-ops.ts +11 -0
- package/src/db/automation-write-ops.ts +46 -0
- package/src/db/blackboard.ts +2 -2
- package/src/db/browser-session-write.ts +32 -0
- package/src/db/bus-outbox-write-ops.ts +3 -1
- package/src/db/checkout-refresh-schema.ts +47 -0
- package/src/db/checkout-refresh.ts +5 -5
- package/src/db/ci-incidents-async.ts +5 -5
- package/src/db/ci-incidents-write-ops.ts +2 -2
- package/src/db/command-agent-profile-backfill.ts +39 -0
- package/src/db/command-agent-profiles.ts +5 -1
- package/src/db/command-retention.ts +126 -0
- package/src/db/command-row.ts +10 -2
- package/src/db/commands-list-query.ts +2 -0
- package/src/db/commands-planner-stats.test-fixture.ts +8 -0
- package/src/db/commands-read-ops.ts +16 -0
- package/src/db/commands-spawn-read.ts +1 -1
- package/src/db/config-store-write-ops.ts +7 -2
- package/src/db/connection.ts +1 -182
- package/src/db/context-carry-write.ts +74 -0
- package/src/db/continuation-archives-async.ts +5 -0
- package/src/db/continuation-archives-write-ops.ts +7 -0
- package/src/db/continuations.ts +6 -6
- package/src/db/db-error-registry.ts +12 -0
- package/src/db/db-writer-worker.ts +8 -1
- package/src/db/deploy-events-async.ts +1 -0
- package/src/db/deploy-events-read-ops.ts +2 -1
- package/src/db/deploy-events.ts +35 -4
- package/src/db/gateway.ts +26 -133
- package/src/db/history-retention-ops.ts +13 -0
- package/src/db/hosts-registration.ts +10 -2
- package/src/db/hosts.ts +9 -6
- package/src/db/inbox-async.ts +2 -2
- package/src/db/inbox-read-ops.ts +1 -1
- package/src/db/inbox.ts +9 -17
- package/src/db/index.ts +2 -0
- package/src/db/integrations-async.ts +8 -0
- package/src/db/integrations-ops.ts +15 -0
- package/src/db/integrations.ts +15 -21
- package/src/db/issue-associations.ts +2 -2
- package/src/db/issue-lifecycle.ts +3 -4
- package/src/db/issue-refs-async.ts +23 -0
- package/src/db/issue-refs-read-ops.ts +6 -0
- package/src/db/issue-refs-write-ops.ts +29 -0
- package/src/db/issue-refs.ts +15 -16
- package/src/db/kernel-event-log-schema.ts +2 -0
- package/src/db/land-boundaries.ts +51 -5
- package/src/db/land-gate-attestations.ts +2 -2
- package/src/db/landing-receipts.ts +2 -2
- package/src/db/lifecycle-context-write.ts +5 -0
- package/src/db/lifecycle-tail-async.ts +76 -0
- package/src/db/lifecycle-tail-write-ops.ts +62 -0
- package/src/db/lifecycle-write-window.ts +2 -1
- package/src/db/lineage-pair-dedupe-sql.ts +3 -3
- package/src/db/long-running-work.ts +2 -2
- package/src/db/main-connection-mode.ts +11 -0
- package/src/db/main-connection-writes.ts +41 -2
- package/src/db/maintenance-job-reconcile.ts +61 -0
- package/src/db/maintenance-job-runs-async.ts +14 -0
- package/src/db/maintenance-job-write-ops.ts +9 -0
- package/src/db/maintenance-pauses.ts +2 -2
- package/src/db/mappers.ts +2 -14
- package/src/db/merge-lease.ts +1 -15
- package/src/db/message-send.ts +4 -0
- package/src/db/messages.ts +31 -25
- package/src/db/migrations.ts +25 -16
- package/src/db/notification-write-ops.ts +19 -0
- package/src/db/operator-answer-write.ts +19 -0
- package/src/db/orchestrators.ts +14 -76
- package/src/db/pairs-async.ts +22 -1
- package/src/db/pairs-write-ops.ts +8 -3
- package/src/db/pairs.ts +42 -61
- package/src/db/plan-dispatch-schema.ts +5 -1
- package/src/db/plan-ready-notices.ts +43 -0
- package/src/db/plan-tools-include-migration.ts +36 -0
- package/src/db/plans-write-ops.ts +2 -0
- package/src/db/presence-buffer.ts +5 -0
- package/src/db/presence-loop.ts +18 -23
- package/src/db/presence-write.ts +0 -6
- package/src/db/project-entries-async.ts +14 -0
- package/src/db/project-entries-read-ops.ts +5 -1
- package/src/db/project-entries-write-ops.ts +8 -0
- package/src/db/project-entries.ts +15 -12
- package/src/db/project-journal.ts +2 -2
- package/src/db/project-profile-instructions.ts +50 -0
- package/src/db/project-trust-approvals.ts +2 -2
- package/src/db/prompt-templates.ts +4 -4
- package/src/db/prompt-versions.ts +9 -2
- package/src/db/provider-config-history.ts +8 -3
- package/src/db/provider-model-seed.ts +34 -0
- package/src/db/read-op-marshaling-fixtures.ts +23 -0
- package/src/db/read-ops.ts +8 -0
- package/src/db/retention.ts +13 -2
- package/src/db/review-publish-write.ts +8 -0
- package/src/db/routing-policy.ts +2 -3
- package/src/db/runtime-admin-async.ts +19 -0
- package/src/db/runtime-admin-write-ops.ts +36 -0
- package/src/db/runtime-tail-async.ts +288 -0
- package/src/db/runtime-tail-write-ops.ts +97 -0
- package/src/db/schema.ts +13 -4
- package/src/db/spawn-budget.ts +5 -0
- package/src/db/spawn-delegation-state.ts +11 -4
- package/src/db/spawn-delegation.ts +1 -11
- package/src/db/sql-audit-indexes.ts +3 -0
- package/src/db/stats-async.ts +9 -6
- package/src/db/task-entity.ts +28 -6
- package/src/db/task-list.ts +3 -1
- package/src/db/tasks.ts +1 -17
- package/src/db/team-claim-policy.ts +60 -0
- package/src/db/teams-async.ts +4 -0
- package/src/db/teams-write-ops.ts +4 -0
- package/src/db/terminal-events.ts +15 -0
- package/src/db/timer-cutover-bodies.ts +292 -0
- package/src/db/timer-cutover-core.ts +37 -278
- package/src/db/timer-cutover-state.ts +40 -0
- package/src/db/timer-cutover-write-ops.ts +1 -40
- package/src/db/timer-ingress.ts +7 -1
- package/src/db/token-db-write-ops.ts +19 -0
- package/src/db/token-standing-async.ts +12 -0
- package/src/db/token-standing.ts +21 -20
- package/src/db/token-usage-retention.ts +33 -0
- package/src/db/token-usage-write-ops.ts +1 -1
- package/src/db/token-usage.ts +4 -1
- package/src/db/user-invites-async.ts +13 -0
- package/src/db/user-invites.ts +3 -3
- package/src/db/users.ts +14 -6
- package/src/db/workflow-contact.ts +1 -1
- package/src/db/workflow-task-read-ops.ts +30 -0
- package/src/db/workspaces.ts +8 -5
- package/src/db/write-ops.ts +37 -12
- package/src/db/writer-fault-seam.ts +2 -9
- package/src/db/writer-fault-test-ops.ts +18 -0
- package/src/db/writer-gateway.ts +58 -56
- package/src/dev.ts +8 -3
- package/src/dispatch-availability.ts +10 -6
- package/src/ephemeral/{landing-ingress-proof-worker.ts → landing-ingress-proof.test-fixture.ts} +4 -2
- package/src/event-loop-lag.ts +4 -2
- package/src/event-loop-yield.ts +2 -2
- package/src/events.ts +10 -8
- package/src/host/disk-alert.ts +121 -0
- package/src/host-provider-store.ts +5 -4
- package/src/hub-metrics-report.ts +5 -1
- package/src/hub-metrics.ts +38 -18
- package/src/injection-sweep-pacing.ts +6 -8
- package/src/land-gate-notifications.ts +11 -10
- package/src/land-gate-queue-progress.ts +3 -3
- package/src/land-settle-dispatch.ts +52 -92
- package/src/lifecycle-context-pressure.ts +11 -10
- package/src/lifecycle-manager.ts +107 -100
- package/src/maintenance/breaker.ts +18 -16
- package/src/maintenance/cd-watcher.ts +3 -3
- package/src/maintenance/checkout-refresh.ts +18 -1
- package/src/maintenance/critical-job-watchdog.ts +19 -20
- package/src/maintenance/events.ts +3 -3
- package/src/maintenance/history-retention-job.ts +30 -0
- package/src/maintenance/index.ts +1 -0
- package/src/maintenance/jobs.ts +32 -69
- package/src/maintenance/long-running-work.ts +3 -1
- package/src/maintenance/offline-agent-prune-job.ts +28 -0
- package/src/maintenance/orphaned-sessions.ts +5 -4
- package/src/maintenance/pauses.ts +4 -10
- package/src/maintenance/plan-ready-notice-job.ts +71 -0
- package/src/maintenance/scheduler.ts +98 -137
- package/src/maintenance/stalled-delivery-pager.ts +10 -9
- package/src/maintenance/teams.ts +19 -30
- package/src/maintenance/workspaces.ts +18 -28
- package/src/managed-policy-escalation.ts +7 -7
- package/src/managed-policy.ts +32 -28
- package/src/managed-provider-gate.ts +5 -4
- package/src/managed-spawn-reservation.ts +5 -4
- package/src/mcp/index.ts +12 -9
- package/src/mcp/output-descriptions.ts +8 -8
- package/src/mcp/presentation.ts +6 -5
- package/src/mcp/project-profile-instructions.ts +32 -0
- package/src/mcp/runtime-output.ts +6 -1
- package/src/mcp/self-care-visibility.ts +2 -2
- package/src/mcp/spawn-targets-matrix.ts +10 -1
- package/src/mcp/tool-groups.ts +4 -3
- package/src/mcp/tool-roles.ts +81 -0
- package/src/mcp/tools-spawn.ts +4 -3
- package/src/mcp/tools-workspace.ts +1 -1
- package/src/mcp-agent-action.ts +1 -2
- package/src/mcp-blackboard-tools.ts +6 -5
- package/src/mcp-decision-tools.ts +7 -7
- package/src/mcp-egress-tools.ts +10 -9
- package/src/mcp-issue-activity-tools.ts +2 -2
- package/src/mcp-issue-association-tools.ts +4 -4
- package/src/mcp-issue-ref-tools.ts +13 -12
- package/src/mcp-maintenance-tools.ts +2 -2
- package/src/mcp-merge-tools.ts +5 -5
- package/src/mcp-notification-subscription-tools.ts +14 -15
- package/src/mcp-output-levels.test-fixture.ts +1 -1
- package/src/mcp-profile-trust-tools.ts +5 -5
- package/src/mcp-project-journal-tools.ts +4 -12
- package/src/mcp-project-tools.ts +17 -18
- package/src/mcp-provider-catalog.ts +2 -2
- package/src/mcp-routing-policy-tools.ts +3 -2
- package/src/mcp-task-tools.ts +11 -5
- package/src/mcp-team-template-tools.ts +3 -3
- package/src/mcp-team-tools.ts +6 -6
- package/src/mcp-workflow-tools.ts +13 -4
- package/src/memory-area-injection.ts +13 -12
- package/src/memory-boundary-capture.ts +6 -6
- package/src/memory-injection.ts +45 -43
- package/src/merge-pause-maintenance.ts +5 -4
- package/src/notification-router.ts +44 -17
- package/src/notification-types.ts +2 -1
- package/src/notify.ts +5 -5
- package/src/observed-reset-refresh.ts +4 -4
- package/src/operator-alarm.ts +23 -11
- package/src/project-ingest.ts +6 -6
- package/src/project-instructions.ts +12 -1
- package/src/project-profile-instruction-text.ts +6 -0
- package/src/project-profile-instructions.ts +20 -0
- package/src/project-trust.ts +12 -11
- package/src/prompt-resolver.ts +3 -3
- package/src/provider-catalog-store.ts +3 -49
- package/src/provider-config-store.ts +12 -11
- package/src/provider-model-seed.ts +1 -18
- package/src/provider-quota-async.ts +5 -7
- package/src/provider-quota-config-store.ts +5 -4
- package/src/provider-secrets.test-fixture.ts +3 -3
- package/src/provider-timeline-event.ts +4 -7
- package/src/quota-band-delivery.ts +2 -2
- package/src/recipe-runner.ts +6 -5
- package/src/repo-config-source.ts +10 -4
- package/src/retention-config-store.ts +4 -3
- package/src/reviewer-pipeline.ts +11 -10
- package/src/routes/_route.ts +4 -4
- package/src/routes/_shared.ts +13 -12
- package/src/routes/agent-effort.ts +5 -5
- package/src/routes/agent-heartbeat-quota.ts +23 -0
- package/src/routes/agent-keep.ts +1 -1
- package/src/routes/agent-profiles.ts +6 -6
- package/src/routes/agent-reporting.ts +1 -1
- package/src/routes/agent-self-effort.ts +5 -5
- package/src/routes/agent-sessions.ts +24 -24
- package/src/routes/agents-spawn.ts +2 -2
- package/src/routes/agents.ts +19 -121
- package/src/routes/auth.ts +14 -15
- package/src/routes/authority-audit.ts +2 -2
- package/src/routes/automations.ts +6 -5
- package/src/routes/channel-binding-delete.ts +1 -1
- package/src/routes/channel-output.ts +3 -3
- package/src/routes/claude-api-budget.ts +5 -5
- package/src/routes/commands-listing.ts +5 -1
- package/src/routes/commands.ts +31 -29
- package/src/routes/context-resets.ts +2 -2
- package/src/routes/continuation-archives.ts +2 -2
- package/src/routes/coordinator-teams.ts +1 -1
- package/src/routes/decisions.ts +2 -2
- package/src/routes/host-secret-files.ts +1 -1
- package/src/routes/hosts.ts +11 -11
- package/src/routes/inbox.ts +3 -2
- package/src/routes/index.ts +12 -2
- package/src/routes/integrations.ts +32 -56
- package/src/routes/issue-activity.ts +2 -2
- package/src/routes/issue-associations.ts +4 -4
- package/src/routes/issue-refs.ts +9 -9
- package/src/routes/kernel-timers-operator.ts +1 -1
- package/src/routes/memory.ts +1 -1
- package/src/routes/merges.ts +11 -11
- package/src/routes/messages.ts +23 -17
- package/src/routes/orchestrator-bootstrap.ts +2 -2
- package/src/routes/orchestrator-host-registration.ts +4 -2
- package/src/routes/orchestrator-host-utilization.ts +5 -3
- package/src/routes/orchestrator-proxy.ts +4 -4
- package/src/routes/orchestrator.ts +28 -19
- package/src/routes/pairs.ts +8 -8
- package/src/routes/project-profile-instructions.ts +27 -0
- package/src/routes/project-trust.ts +3 -3
- package/src/routes/projects.ts +16 -16
- package/src/routes/prompt-templates.ts +12 -12
- package/src/routes/provider-config.ts +6 -6
- package/src/routes/provider-quota-config.ts +2 -2
- package/src/routes/provider-quotas.ts +10 -10
- package/src/routes/run-command.ts +1 -1
- package/src/routes/secrets-backup.ts +2 -2
- package/src/routes/secrets-import.ts +1 -1
- package/src/routes/secrets-vault.ts +7 -7
- package/src/routes/settings.ts +6 -6
- package/src/routes/shipping.ts +9 -1
- package/src/routes/spawn-policy.ts +8 -7
- package/src/routes/sse.ts +2 -2
- package/src/routes/stats.ts +6 -6
- package/src/routes/task-http.ts +15 -1
- package/src/routes/task-issues.ts +11 -26
- package/src/routes/tasks.ts +22 -53
- package/src/routes/team-templates.ts +12 -12
- package/src/routes/teams-config.ts +2 -2
- package/src/routes/teams.ts +10 -10
- package/src/routes/tokens.ts +30 -22
- package/src/routes/users.ts +24 -24
- package/src/routes/viewer-read.ts +3 -3
- package/src/routes/web-tool-calls.ts +4 -4
- package/src/routes/workflows.ts +22 -7
- package/src/routes/workspaces.ts +17 -16
- package/src/routing-policy-normalize.ts +1 -2
- package/src/routing-policy-push.ts +6 -6
- package/src/routing-step-defaults.ts +0 -2
- package/src/runner-token-mint-limit.ts +63 -0
- package/src/runtime-grant.ts +21 -13
- package/src/runtime-tokens.ts +59 -35
- package/src/secrets-broker/config.ts +1 -1
- package/src/secrets-broker/service.ts +2 -2
- package/src/security.ts +16 -21
- package/src/self-resume-carry.ts +21 -110
- package/src/self-resume-supersede.ts +4 -3
- package/src/self-resume.ts +54 -66
- package/src/server-background.ts +2 -2
- package/src/server.ts +26 -24
- package/src/services/agent-action.ts +12 -31
- package/src/services/agent-effort.ts +7 -32
- package/src/services/agent-hang-watchdog-job.ts +2 -2
- package/src/services/agent-heartbeat.ts +166 -0
- package/src/services/agent-reporting.ts +1 -1
- package/src/services/browser-inventory.ts +3 -3
- package/src/services/browser-session-state.ts +3 -2
- package/src/services/browser-session.ts +21 -27
- package/src/services/bus-command-update.ts +9 -9
- package/src/services/checkout-refresh-state.ts +1 -0
- package/src/services/checkout-refresh.test-fixture.ts +3 -2
- package/src/services/command-host.ts +7 -2
- package/src/services/coordinator-digest.ts +3 -2
- package/src/services/dispatch-command.ts +12 -13
- package/src/services/effective-launch-driver.ts +14 -9
- package/src/services/host-changed-paths.test-fixture.ts +5 -6
- package/src/services/host-project-readiness.ts +2 -2
- package/src/services/host-providers.ts +1 -1
- package/src/services/host-utilization.ts +27 -4
- package/src/services/idle-agent-digest.ts +17 -12
- package/src/services/idle-epics.ts +9 -10
- package/src/services/interrupt-agent.ts +12 -9
- package/src/services/issue-activity.ts +3 -3
- package/src/services/issue-associations.ts +15 -18
- package/src/services/issue-lifecycle-comments.ts +3 -2
- package/src/services/issue-lifecycle.ts +69 -72
- package/src/services/issue-refs.ts +10 -15
- package/src/services/kernel-timers-cutover-chaos-worker.ts +11 -8
- package/src/services/kernel-timers-ingress-chaos-worker.ts +6 -1
- package/src/services/kernel-timers-ingress.ts +4 -4
- package/src/services/kernel-timers-message-authority-chaos-worker.ts +3 -10
- package/src/services/kernel-timers-operator-chaos-worker.ts +3 -2
- package/src/services/kernel-timers-outbox.ts +1 -1
- package/src/services/kernel-timers-stage10-operator.ts +1 -1
- package/src/services/kernel-timers.ts +4 -3
- package/src/services/land-gate-placement.ts +11 -2
- package/src/services/land-issue-relations.ts +5 -4
- package/src/services/land-restart-retry.ts +7 -6
- package/src/services/landed-ancestry.ts +25 -8
- package/src/services/legacy-landing-host.ts +4 -1
- package/src/services/legacy-landing-recovery.ts +8 -6
- package/src/services/managed-running.ts +17 -17
- package/src/services/memory-areas.ts +17 -53
- package/src/services/merge-pause.ts +9 -15
- package/src/services/operator-decisions.ts +37 -41
- package/src/services/orchestrator-registration-recovery.ts +6 -2
- package/src/services/orchestrator-upgrade.ts +14 -12
- package/src/services/permission-decision.ts +4 -3
- package/src/services/plan-ci-notice.ts +57 -0
- package/src/services/plan-ci-recovery.ts +2 -55
- package/src/services/plan-conformance.ts +4 -4
- package/src/services/plan-dispatch-policy.ts +10 -3
- package/src/services/plan-dispatch.ts +35 -14
- package/src/services/plan-graph.ts +39 -261
- package/src/services/plan-import.ts +1 -1
- package/src/services/plan-live-bindings.ts +8 -37
- package/src/services/plan-task-create.ts +1 -1
- package/src/services/plan-terminal-refs.ts +2 -12
- package/src/services/plan-wake-digest.ts +9 -3
- package/src/services/profile-trust.ts +6 -5
- package/src/services/project-config-read.ts +70 -0
- package/src/services/project-profile-instructions.ts +54 -0
- package/src/services/project.ts +11 -10
- package/src/services/prompt-templates.ts +6 -5
- package/src/services/provider-hold-nudge.ts +9 -9
- package/src/services/provider-hold-record.ts +13 -12
- package/src/services/provider-state-audit.ts +19 -18
- package/src/services/provisioning-harness/budget-baseline.json +4 -4
- package/src/services/provisioning-harness/driver.ts +1 -1
- package/src/services/provisioning-harness/fixture-matrix.ts +3 -3
- package/src/services/provisioning-harness/lifecycle.ts +24 -22
- package/src/services/provisioning-harness/prepare.ts +16 -17
- package/src/services/rate-limit-resume.ts +10 -9
- package/src/services/red-main-auto-revert.ts +7 -5
- package/src/services/red-main-controller-deps.ts +20 -3
- package/src/services/red-main-incident.ts +3 -1
- package/src/services/red-main-quarantine.ts +2 -3
- package/src/services/register-agent.ts +22 -22
- package/src/services/restart-project-role.ts +1 -1
- package/src/services/restart-spawn.ts +74 -61
- package/src/services/review-publish.ts +7 -24
- package/src/services/review-ref-reconcile.ts +29 -38
- package/src/services/runtime-dependency-alert.ts +27 -0
- package/src/services/scheduler-command.ts +11 -9
- package/src/services/scheduler.ts +5 -5
- package/src/services/self-care-state.ts +2 -1
- package/src/services/self-effort-grant.ts +5 -25
- package/src/services/self-effort.ts +5 -5
- package/src/services/send-message.ts +21 -34
- package/src/services/shutdown-agent.ts +17 -14
- package/src/services/spawn-agent.ts +25 -43
- package/src/services/spawn-chain-inspector.ts +7 -14
- package/src/services/spawn-cwd-placement.ts +21 -5
- package/src/services/spawn-issue-activity.ts +8 -6
- package/src/services/spawn-launch.ts +17 -1
- package/src/services/spawn-loss-escalation.ts +1 -1
- package/src/services/spawn-policy.ts +68 -0
- package/src/services/spawn-registration-watchdog.ts +2 -2
- package/src/services/spawn-repo-probe.ts +7 -5
- package/src/services/spawn-tree-cleanup.ts +8 -9
- package/src/services/steward-reaper.ts +4 -4
- package/src/services/task-context-hydration.ts +25 -1
- package/src/services/task-delivery.ts +20 -34
- package/src/services/task-dispatch.ts +3 -0
- package/src/services/task-entity.ts +40 -203
- package/src/services/task-issue-link.ts +13 -20
- package/src/services/task-issue-weave.ts +12 -11
- package/src/services/task-lifecycle.ts +27 -31
- package/src/services/task-repo-cwd.ts +37 -0
- package/src/services/task-review-hold.ts +4 -17
- package/src/services/task-semantic-events.ts +13 -11
- package/src/services/task-state-reconcile.ts +8 -17
- package/src/services/task-validation.ts +2 -2
- package/src/services/team-templates.ts +12 -11
- package/src/services/team.ts +31 -98
- package/src/services/terminal-provider-exit.ts +6 -5
- package/src/services/timer-message-fire-chaos-worker.ts +7 -3
- package/src/services/timer-message-fire-outbox.ts +1 -1
- package/src/services/transient-agent-reaper.ts +25 -20
- package/src/services/turn-reconcile-audit.ts +9 -9
- package/src/services/user-onboarding.ts +8 -6
- package/src/services/user-profile.ts +6 -9
- package/src/services/work-finality.ts +16 -4
- package/src/services/workflow-auto-start.ts +26 -13
- package/src/services/workflow-caller.ts +61 -4
- package/src/services/workflow-child-proof-worker.ts +1 -1
- package/src/services/workflow-ci-main.ts +1 -1
- package/src/services/workflow-control-proof-worker.ts +1 -1
- package/src/services/workflow-coordinator.ts +8 -2
- package/src/services/workflow-decisions.ts +5 -5
- package/src/services/workflow-deferred-cleanup.ts +5 -3
- package/src/services/workflow-effect-driver.ts +42 -17
- package/src/services/workflow-effects.ts +58 -37
- package/src/services/workflow-land-notice.ts +10 -0
- package/src/services/workflow-pause-text.ts +43 -0
- package/src/services/workflow-pins.ts +7 -4
- package/src/services/workflow-reconcile.ts +14 -11
- package/src/services/workflow-resume-pins.ts +3 -3
- package/src/services/workflow-routing-defaults.ts +18 -0
- package/src/services/workflow-run-view.ts +6 -3
- package/src/services/workflow-run.test-fixture.ts +1 -1
- package/src/services/workflow-runs.ts +61 -33
- package/src/services/workflow-supervisor-state.ts +26 -1
- package/src/services/workflow-supervisor.ts +11 -6
- package/src/services/workspace-recovery.ts +4 -3
- package/src/settings/registry.ts +1 -2
- package/src/spawn-admission.ts +10 -2
- package/src/spawn-command.ts +4 -4
- package/src/spawn-models.ts +10 -12
- package/src/spawn-placement.ts +28 -10
- package/src/spawn-targets.ts +9 -9
- package/src/sse-agent-status.ts +15 -6
- package/src/sse.ts +49 -24
- package/src/startup-context-injection.ts +62 -57
- package/src/state-adoption/cd-cutover.ts +53 -7
- package/src/state-adoption/fleet-cutover.ts +35 -0
- package/src/state-adoption/fleet-plan.ts +36 -0
- package/src/state-adoption/index.ts +2 -2
- package/src/state-adoption/linux-plan.ts +2 -2
- package/src/state-adoption/linux.ts +2 -2
- package/src/state-adoption/macos-plan.ts +2 -2
- package/src/state-adoption/macos.ts +1 -1
- package/src/steward-handoff.ts +4 -3
- package/src/steward-policy-cleanup.ts +9 -8
- package/src/steward.ts +9 -8
- package/src/task-dispatch-live.ts +6 -3
- package/src/task-dispatcher.ts +3 -3
- package/src/teams-config-store.ts +4 -3
- package/src/token-db-write.ts +10 -0
- package/src/token-db.ts +2 -2
- package/src/token-usage-async.ts +2 -4
- package/src/user-awaiting-reply.ts +5 -5
- package/src/workspace-actions.ts +24 -29
- package/src/workspace-auto-merge.ts +14 -12
- package/src/workspace-changed-paths-client.ts +16 -5
- package/src/workspace-cleanup-stale.ts +30 -7
- package/src/workspace-command-settle.ts +26 -17
- package/src/workspace-config.ts +1 -1
- package/src/workspace-conflict-resolver.ts +9 -7
- package/src/workspace-dead-owner-recovery.ts +5 -4
- package/src/workspace-escalation.ts +12 -11
- package/src/workspace-human-escalation.ts +3 -3
- package/src/workspace-land-gate-watchdog.ts +3 -3
- package/src/workspace-land-refusal.ts +20 -0
- package/src/workspace-land-stopped.ts +1 -0
- package/src/workspace-merge.ts +10 -26
- package/src/workspace-nothing-to-land-notice.ts +2 -2
- package/src/workspace-orphans.ts +18 -37
- package/src/workspace-pr-completion.ts +10 -8
- package/src/workspace-rekey.ts +3 -3
- package/src/workspace-steward-failure.ts +2 -2
- package/src/workspace-steward-wake.ts +4 -4
- package/node_modules/@humwick/kernel/LICENSE +0 -167
- package/node_modules/@humwick/kernel/async-entity-persistence.ts +0 -344
- package/node_modules/@humwick/kernel/async-event-log.ts +0 -107
- package/node_modules/@humwick/kernel/automations.pilot.ts +0 -147
- package/node_modules/@humwick/kernel/config.ts +0 -111
- package/node_modules/@humwick/kernel/contract.ts +0 -572
- package/node_modules/@humwick/kernel/control-authz.ts +0 -281
- package/node_modules/@humwick/kernel/control.ts +0 -645
- package/node_modules/@humwick/kernel/effects.ts +0 -493
- package/node_modules/@humwick/kernel/event-log.ts +0 -319
- package/node_modules/@humwick/kernel/http-transport.ts +0 -384
- package/node_modules/@humwick/kernel/identity-grammar.ts +0 -20
- package/node_modules/@humwick/kernel/identity.ts +0 -248
- package/node_modules/@humwick/kernel/index.ts +0 -28
- package/node_modules/@humwick/kernel/kernel-persistence.ts +0 -181
- package/node_modules/@humwick/kernel/landing-incident.ts +0 -306
- package/node_modules/@humwick/kernel/landing.ts +0 -953
- package/node_modules/@humwick/kernel/manifest-validation.ts +0 -460
- package/node_modules/@humwick/kernel/mcp-transport.ts +0 -109
- package/node_modules/@humwick/kernel/message-authority-chaos-worker.ts +0 -200
- package/node_modules/@humwick/kernel/message-authority.ts +0 -281
- package/node_modules/@humwick/kernel/module-host.ts +0 -722
- package/node_modules/@humwick/kernel/openapi-init.ts +0 -14
- package/node_modules/@humwick/kernel/package.json +0 -39
- package/node_modules/@humwick/kernel/persistence-schema.ts +0 -248
- package/node_modules/@humwick/kernel/persistence.ts +0 -510
- package/node_modules/@humwick/kernel/registry.ts +0 -60
- package/node_modules/@humwick/kernel/sqlite-kernel-persistence.ts +0 -499
- package/node_modules/@humwick/kernel/sqlite-module-host.ts +0 -87
- package/node_modules/@humwick/kernel/timers-chaos-worker.ts +0 -186
- package/node_modules/@humwick/kernel/timers.pilot.ts +0 -1411
- package/node_modules/@humwick/kernel/workflow-activation.ts +0 -25
- package/node_modules/@humwick/kernel/workflow-backstop.ts +0 -40
- package/node_modules/@humwick/kernel/workflow-cancel-tree.ts +0 -20
- package/node_modules/@humwick/kernel/workflow-chaos-worker.ts +0 -213
- package/node_modules/@humwick/kernel/workflow-composition.ts +0 -231
- package/node_modules/@humwick/kernel/workflow-container.ts +0 -72
- package/node_modules/@humwick/kernel/workflow-control.test-fixture.ts +0 -42
- package/node_modules/@humwick/kernel/workflow-control.ts +0 -178
- package/node_modules/@humwick/kernel/workflow-definition.ts +0 -507
- package/node_modules/@humwick/kernel/workflow-dispatch.ts +0 -60
- package/node_modules/@humwick/kernel/workflow-foreach.ts +0 -167
- package/node_modules/@humwick/kernel/workflow-journal-codec.ts +0 -339
- package/node_modules/@humwick/kernel/workflow-journal.ts +0 -922
- package/node_modules/@humwick/kernel/workflow-lane.ts +0 -48
- package/node_modules/@humwick/kernel/workflow-lease-owner.ts +0 -60
- package/node_modules/@humwick/kernel/workflow-recovery.test-fixture.ts +0 -19
- package/node_modules/@humwick/kernel/workflow-runtime.ts +0 -938
- package/node_modules/@humwick/kernel/workflow-script.ts +0 -11
- package/node_modules/@humwick/kernel/workflow-state.ts +0 -299
- package/node_modules/@humwick/kernel/workflow-step-commit.ts +0 -195
- package/node_modules/@humwick/kernel/workflow-transitions.ts +0 -317
- package/node_modules/@humwick/kernel/workflow-values.ts +0 -153
- package/node_modules/@humwick/kernel/workflow.pilot.ts +0 -376
- package/node_modules/@humwick/offload/LICENSE +0 -167
- package/node_modules/@humwick/offload/README.md +0 -57
- package/node_modules/@humwick/offload/dist/async-runner.d.ts +0 -18
- package/node_modules/@humwick/offload/dist/async-runner.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/async-runner.js +0 -158
- package/node_modules/@humwick/offload/dist/async-runner.js.map +0 -1
- package/node_modules/@humwick/offload/dist/envelope.d.ts +0 -25
- package/node_modules/@humwick/offload/dist/envelope.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/envelope.js +0 -80
- package/node_modules/@humwick/offload/dist/envelope.js.map +0 -1
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts +0 -10
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.js +0 -59
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.js.map +0 -1
- package/node_modules/@humwick/offload/dist/index.d.ts +0 -5
- package/node_modules/@humwick/offload/dist/index.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/index.js +0 -5
- package/node_modules/@humwick/offload/dist/index.js.map +0 -1
- package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts +0 -62
- package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/subprocess-runner.js +0 -295
- package/node_modules/@humwick/offload/dist/subprocess-runner.js.map +0 -1
- package/node_modules/@humwick/offload/dist/types.d.ts +0 -111
- package/node_modules/@humwick/offload/dist/types.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/types.js +0 -176
- package/node_modules/@humwick/offload/dist/types.js.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-pool.d.ts +0 -23
- package/node_modules/@humwick/offload/dist/worker-pool.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-pool.js +0 -435
- package/node_modules/@humwick/offload/dist/worker-pool.js.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-runtime.d.ts +0 -2
- package/node_modules/@humwick/offload/dist/worker-runtime.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-runtime.js +0 -27
- package/node_modules/@humwick/offload/dist/worker-runtime.js.map +0 -1
- package/node_modules/@humwick/offload/dist/worker.d.ts +0 -5
- package/node_modules/@humwick/offload/dist/worker.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/worker.js +0 -1
- package/node_modules/@humwick/offload/dist/worker.js.map +0 -1
- package/node_modules/@humwick/offload/package.json +0 -42
- package/node_modules/@humwick/offload/src/async-runner.ts +0 -170
- package/node_modules/@humwick/offload/src/envelope.ts +0 -92
- package/node_modules/@humwick/offload/src/fixtures/worker-task.ts +0 -49
- package/node_modules/@humwick/offload/src/index.ts +0 -4
- package/node_modules/@humwick/offload/src/subprocess-runner.ts +0 -334
- package/node_modules/@humwick/offload/src/types.ts +0 -235
- package/node_modules/@humwick/offload/src/worker-pool.ts +0 -463
- package/node_modules/@humwick/offload/src/worker-runtime.ts +0 -32
- package/node_modules/@humwick/offload/src/worker.ts +0 -5
- package/public/assets/agent-liveness-DyqxfB-t.js +0 -2
- package/public/assets/agent-profiles-BpI_jTxq.js +0 -2
- package/public/assets/index-B7ZerHLY.css +0 -2
- package/public/assets/index-BU3uWo2t.js +0 -15
- package/public/assets/projects-B_lmcqfO.js +0 -2
- package/public/assets/provider-display-DbLWpP3j.js +0 -2
- package/public/assets/run-card-CO_bguQf.js +0 -2
- package/public/assets/shipping-Bu8p1gEw.js +0 -2
- package/public/assets/store-BvtFdlGX.js +0 -9
- package/public/assets/use-project-list-B-T2Bnnn.js +0 -2
- package/public/assets/versioned-prompt-editor-Diu8BIaM.js +0 -8
- package/runner/src/agent-runner/http-liveness.ts +0 -85
- package/runner/src/gate-run-lease-probe.ts +0 -38
- package/src/db/claude-catalog-reconcile.ts +0 -27
- package/src/db/on-loop-write-transaction.ts +0 -34
- package/src/routing-model-aliases.ts +0 -21
package/src/ci/incidents.ts
CHANGED
|
@@ -169,7 +169,7 @@ export function ingestCiObservation(observation: CiObservation, now: number = Da
|
|
|
169
169
|
|
|
170
170
|
/** Gateway-routed form for async-capable polling jobs. The complete observation transition is one
|
|
171
171
|
* writer operation, so no gateway await exposes a stale watch state to a later incident decision. */
|
|
172
|
-
export async function ingestCiObservationAsync(observation: CiObservation): Promise<CiIncidentIngestResult> {
|
|
172
|
+
export async function ingestCiObservationAsync(observation: CiObservation, now?: number): Promise<CiIncidentIngestResult> {
|
|
173
173
|
const transition = transitionInput(observation);
|
|
174
|
-
return formatTransitionResult(await ingestCiObservationTransitionAsync(transition.input), transition.watchKey, transition.fingerprint);
|
|
174
|
+
return formatTransitionResult(await ingestCiObservationTransitionAsync(transition.input, now), transition.watchKey, transition.fingerprint);
|
|
175
175
|
}
|
package/src/ci/monitor.ts
CHANGED
|
@@ -12,8 +12,8 @@ import { isPathWithinBase } from "../utils";
|
|
|
12
12
|
import { computeCiWatchKey, isFailingJob } from "./incidents.ts";
|
|
13
13
|
import { ghApi, type GitHubApi } from "../issue-tracker/github.ts";
|
|
14
14
|
import { resolveCoordinatorAgentId } from "../steward-identity.ts";
|
|
15
|
-
import { notifyCiRootMissing,
|
|
16
|
-
import { notifyCiTransition,
|
|
15
|
+
import { notifyCiRootMissing, type CiRootMissing } from "./root-missing.ts";
|
|
16
|
+
import { notifyCiTransition, type CiTransitionNotifyResult } from "./transition-notify.ts";
|
|
17
17
|
import { workflowNotTriggered } from "./not-triggered.ts";
|
|
18
18
|
import type { CiJobRef, CiObservation, CiObservationStatus, CiRunRef } from "./provider.ts";
|
|
19
19
|
|
|
@@ -343,7 +343,7 @@ export interface CiMonitorDeps {
|
|
|
343
343
|
rootsForProject: (projectId: string) => ProjectRoot[];
|
|
344
344
|
loadConfig: (root: ProjectRoot) => CiMonitorConfig | null | Promise<CiMonitorConfig | null>;
|
|
345
345
|
api: GitHubApi;
|
|
346
|
-
notify: typeof notifyCiTransition
|
|
346
|
+
notify: (...args: Parameters<typeof notifyCiTransition>) => CiTransitionNotifyResult | Promise<CiTransitionNotifyResult>;
|
|
347
347
|
resolveCoordinator: (rootPath: string) => string | undefined;
|
|
348
348
|
/** Commits workflows wait on: each watch of their root reports its verdict on them too. */
|
|
349
349
|
shaWaits: () => Promise<CiShaWait[]>;
|
|
@@ -419,7 +419,6 @@ export async function runCiMonitor(input: Partial<CiMonitorDeps> = {}): Promise<
|
|
|
419
419
|
readinessMs: 0, historyMs: 0, historyApiCalls: 0,
|
|
420
420
|
transitions: { went_red: 0, back_green: 0, never_matched: 0, config_mismatch: 0, none: 0 },
|
|
421
421
|
};
|
|
422
|
-
const useAsync = deps.notify === notifyCiTransition && !deps.now;
|
|
423
422
|
// A repository counts as missing only if no root of it has the config, so a duplicate root cannot flap the notice.
|
|
424
423
|
const missingRoots = new Map<string, CiRootMissing>();
|
|
425
424
|
const presentRepositories = new Set<string>();
|
|
@@ -464,9 +463,7 @@ export async function runCiMonitor(input: Partial<CiMonitorDeps> = {}): Promise<
|
|
|
464
463
|
const observation = await observeGitHubCiMonitorWatch(repository, watch, deps.api, runsPayload);
|
|
465
464
|
if (deps.signal?.aborted) break;
|
|
466
465
|
const notificationDeps = { resolveCoordinator: () => deps.resolveCoordinator(root.rootPath), ...(deps.now ? { now: deps.now() } : {}) };
|
|
467
|
-
const transition =
|
|
468
|
-
? await notifyCiTransitionAsync(observation, notificationDeps)
|
|
469
|
-
: deps.notify(observation, notificationDeps);
|
|
466
|
+
const transition = await deps.notify(observation, notificationDeps);
|
|
470
467
|
result.transitions[transition.transition] += 1;
|
|
471
468
|
// The branch-tip row keys the watch; the same key carries its verdict on each waited commit.
|
|
472
469
|
const watchKey = computeCiWatchKey(observation);
|
|
@@ -495,7 +492,7 @@ export async function runCiMonitor(input: Partial<CiMonitorDeps> = {}): Promise<
|
|
|
495
492
|
if (presentRepositories.has(key) || deps.signal?.aborted) continue;
|
|
496
493
|
const notifyDeps = { resolveCoordinator: () => deps.resolveCoordinator(missing.rootPath), ...(deps.now ? { now: deps.now() } : {}) };
|
|
497
494
|
try {
|
|
498
|
-
if (
|
|
495
|
+
if (await notifyCiRootMissing(missing, notifyDeps)) result.missingRoots += 1;
|
|
499
496
|
} catch (error) {
|
|
500
497
|
result.errors += 1;
|
|
501
498
|
console.warn(`ci monitor ${missing.repository} root-missing notice skipped: ${errMessage(error)}`);
|
package/src/ci/notifications.ts
CHANGED
|
@@ -120,13 +120,13 @@ export interface RouteCiIncidentNotificationResult {
|
|
|
120
120
|
* through routeNotification so its TTL, idempotency, routing explanation, and
|
|
121
121
|
* Activity audit behavior stay identical to every other Relay notification.
|
|
122
122
|
*/
|
|
123
|
-
export function routeCiIncidentNotification(input: RouteCiIncidentNotificationInput): RouteCiIncidentNotificationResult {
|
|
123
|
+
export async function routeCiIncidentNotification(input: RouteCiIncidentNotificationInput): Promise<RouteCiIncidentNotificationResult> {
|
|
124
124
|
const { payload } = input;
|
|
125
125
|
const subject = input.subject ?? defaultSubject(input.type, payload.repository, payload.branch);
|
|
126
126
|
const body = input.body ?? defaultBody(input);
|
|
127
127
|
const recipients = input.recipients ?? [payload.coordinatorAgentId];
|
|
128
128
|
const idempotencyKey = input.idempotencyKey ?? defaultIdempotencyKey(input);
|
|
129
|
-
const messages = routeNotification({
|
|
129
|
+
const messages = await routeNotification({
|
|
130
130
|
type: input.type,
|
|
131
131
|
scope: {
|
|
132
132
|
repoRoot: payload.repoRoot ?? payload.repository,
|
|
@@ -148,14 +148,14 @@ export function routeCiIncidentNotification(input: RouteCiIncidentNotificationIn
|
|
|
148
148
|
});
|
|
149
149
|
|
|
150
150
|
if (!input.alertHuman) return { messages };
|
|
151
|
-
const humanFallback = notifyWorkspaceHumanEscalation({
|
|
151
|
+
const humanFallback = (await notifyWorkspaceHumanEscalation({
|
|
152
152
|
subject,
|
|
153
153
|
body,
|
|
154
154
|
payload: { kind: input.type, ...payload },
|
|
155
155
|
priority: humanAlertPriority(input.type),
|
|
156
156
|
tags: ["agent-relay", "ci", humanAlertTag(input.type)],
|
|
157
157
|
source: "ci-incident",
|
|
158
|
-
});
|
|
158
|
+
}));
|
|
159
159
|
return { messages, humanFallback };
|
|
160
160
|
}
|
|
161
161
|
|
package/src/ci/root-missing.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { markCiRootMissingNotified } from "../db/ci-incidents.ts";
|
|
2
1
|
import { markCiRootMissingNotifiedAsync } from "../db/ci-incidents-async.ts";
|
|
3
2
|
import { routeCiIncidentNotification } from "./notifications.ts";
|
|
4
3
|
import { resolveCoordinator, type CiTransitionNotifyDeps } from "./transition-notify.ts";
|
|
@@ -12,11 +11,11 @@ export interface CiRootMissing {
|
|
|
12
11
|
|
|
13
12
|
type Deps = Pick<CiTransitionNotifyDeps, "resolveCoordinator" | "route" | "now">;
|
|
14
13
|
|
|
15
|
-
function notify(input: CiRootMissing, deps: Deps, fired: boolean): boolean {
|
|
14
|
+
async function notify(input: CiRootMissing, deps: Deps, fired: boolean): Promise<boolean> {
|
|
16
15
|
if (!fired) return false;
|
|
17
16
|
const route = deps.route ?? routeCiIncidentNotification;
|
|
18
17
|
const observedAt = deps.now ?? Date.now();
|
|
19
|
-
route({
|
|
18
|
+
await route({
|
|
20
19
|
type: "ci.root_missing",
|
|
21
20
|
payload: { provider: "github-actions", repository: input.repository, repoRoot: input.rootPath, branch: "*", coordinatorAgentId: resolveCoordinator(deps), observedAt },
|
|
22
21
|
alertHuman: true,
|
|
@@ -26,10 +25,6 @@ function notify(input: CiRootMissing, deps: Deps, fired: boolean): boolean {
|
|
|
26
25
|
return true;
|
|
27
26
|
}
|
|
28
27
|
|
|
29
|
-
export function notifyCiRootMissing(input: CiRootMissing, deps: Deps = {}): boolean {
|
|
30
|
-
return notify(input, deps,
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export async function notifyCiRootMissingAsync(input: CiRootMissing, deps: Deps = {}): Promise<boolean> {
|
|
34
|
-
return notify(input, deps, await markCiRootMissingNotifiedAsync(input.repository));
|
|
28
|
+
export async function notifyCiRootMissing(input: CiRootMissing, deps: Deps = {}): Promise<boolean> {
|
|
29
|
+
return await notify(input, deps, await markCiRootMissingNotifiedAsync(input.repository, deps.now));
|
|
35
30
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { stewardFallbackTarget } from "../config.ts";
|
|
2
2
|
import { emitRelayEvent } from "../events.ts";
|
|
3
3
|
import type { WorkspaceHumanEscalationResult } from "../workspace-human-escalation.ts";
|
|
4
|
-
import {
|
|
4
|
+
import { ingestCiObservationAsync, type CiIncidentIngestResult } from "./incidents.ts";
|
|
5
5
|
import {
|
|
6
6
|
routeCiIncidentNotification,
|
|
7
7
|
type CiFailedNotificationPayload,
|
|
@@ -41,8 +41,8 @@ import type { CiObservation, CiRunRef } from "./provider.ts";
|
|
|
41
41
|
export const CI_MAIN_WATCH_COORDINATOR = "cd-watcher";
|
|
42
42
|
|
|
43
43
|
export interface CiTransitionNotifyDeps {
|
|
44
|
-
ingest?: (observation: CiObservation, now?: number) => CiIncidentIngestResult
|
|
45
|
-
route?: (input: Parameters<typeof routeCiIncidentNotification>[0]) => RouteCiIncidentNotificationResult
|
|
44
|
+
ingest?: (observation: CiObservation, now?: number) => CiIncidentIngestResult | Promise<CiIncidentIngestResult>;
|
|
45
|
+
route?: (input: Parameters<typeof routeCiIncidentNotification>[0]) => RouteCiIncidentNotificationResult | Promise<RouteCiIncidentNotificationResult>;
|
|
46
46
|
/** Resolve the coordinator/owner agent the relay message addresses. Defaults to the configured
|
|
47
47
|
* steward fallback, then the system watch actor. */
|
|
48
48
|
resolveCoordinator?: () => string | undefined;
|
|
@@ -65,16 +65,17 @@ export interface CiTransitionNotifyResult {
|
|
|
65
65
|
* Detect and (if a flip occurred) alert on a CI red/green transition for a single observed watch.
|
|
66
66
|
* Idempotent per transition — safe to call every poll tick.
|
|
67
67
|
*/
|
|
68
|
-
export function notifyCiTransition(
|
|
68
|
+
export async function notifyCiTransition(
|
|
69
69
|
observation: CiObservation | null | undefined,
|
|
70
70
|
deps: CiTransitionNotifyDeps = {},
|
|
71
|
-
): CiTransitionNotifyResult {
|
|
71
|
+
): Promise<CiTransitionNotifyResult> {
|
|
72
72
|
if (!observation) return { transition: "none", notified: false, messages: 0 };
|
|
73
|
-
const ingest = deps.ingest ??
|
|
73
|
+
const ingest = deps.ingest ?? ingestCiObservationAsync;
|
|
74
74
|
const route = deps.route ?? routeCiIncidentNotification;
|
|
75
75
|
const now = deps.now ?? Date.now();
|
|
76
76
|
|
|
77
|
-
|
|
77
|
+
// Notification emission follows the committed transition (one writer op, #1870), never a pre-write observation.
|
|
78
|
+
const result = await ingest(observation, deps.now);
|
|
78
79
|
emitCiStatus(result);
|
|
79
80
|
|
|
80
81
|
if (result.kind === "opened") {
|
|
@@ -92,7 +93,7 @@ export function notifyCiTransition(
|
|
|
92
93
|
failingRunIds: observation.failingRuns.map((run) => run.id),
|
|
93
94
|
failingJobNames: failingJobNames(observation),
|
|
94
95
|
};
|
|
95
|
-
const routed = route({
|
|
96
|
+
const routed = await route({
|
|
96
97
|
type: "ci.failed",
|
|
97
98
|
payload,
|
|
98
99
|
alertHuman: true,
|
|
@@ -116,7 +117,7 @@ export function notifyCiTransition(
|
|
|
116
117
|
greenHeadSha: observation.headSha,
|
|
117
118
|
...(result.incident.resolution ? { resolution: result.incident.resolution } : {}),
|
|
118
119
|
};
|
|
119
|
-
const routed = route({
|
|
120
|
+
const routed = await route({
|
|
120
121
|
type: "ci.recovered",
|
|
121
122
|
payload,
|
|
122
123
|
alertHuman: true,
|
|
@@ -137,7 +138,7 @@ export function notifyCiTransition(
|
|
|
137
138
|
firstSeenAt: result.firstSeenAt,
|
|
138
139
|
observedAt: observation.observedAt,
|
|
139
140
|
};
|
|
140
|
-
const routed = route({
|
|
141
|
+
const routed = await route({
|
|
141
142
|
type: "ci.never_matched",
|
|
142
143
|
payload,
|
|
143
144
|
alertHuman: true,
|
|
@@ -148,46 +149,13 @@ export function notifyCiTransition(
|
|
|
148
149
|
}
|
|
149
150
|
|
|
150
151
|
if (result.kind === "config_mismatch") {
|
|
151
|
-
const routed = route(configMismatchRoute(observation, resolveCoordinator(deps), result.unmatchedJobs));
|
|
152
|
+
const routed = await route(configMismatchRoute(observation, resolveCoordinator(deps), result.unmatchedJobs));
|
|
152
153
|
return { transition: "config_mismatch", notified: true, messages: routed.messages.length, ...(routed.humanFallback ? { humanFallback: routed.humanFallback } : {}) };
|
|
153
154
|
}
|
|
154
155
|
|
|
155
156
|
return { transition: "none", ...(result.kind === "deduped" ? { incidentId: result.incident.id } : {}), notified: false, messages: 0 };
|
|
156
157
|
}
|
|
157
158
|
|
|
158
|
-
/** Gateway-routed companion for async maintenance polling. Notification emission follows the
|
|
159
|
-
* committed transition, never a pre-write observation. */
|
|
160
|
-
export async function notifyCiTransitionAsync(
|
|
161
|
-
observation: CiObservation | null | undefined,
|
|
162
|
-
deps: Omit<CiTransitionNotifyDeps, "ingest"> = {},
|
|
163
|
-
): Promise<CiTransitionNotifyResult> {
|
|
164
|
-
if (!observation) return { transition: "none", notified: false, messages: 0 };
|
|
165
|
-
const route = deps.route ?? routeCiIncidentNotification;
|
|
166
|
-
const now = deps.now ?? Date.now();
|
|
167
|
-
const result = await ingestCiObservationAsync(observation);
|
|
168
|
-
emitCiStatus(result);
|
|
169
|
-
if (result.kind === "opened") {
|
|
170
|
-
const coordinatorAgentId = resolveCoordinator(deps);
|
|
171
|
-
const routed = route({ type: "ci.failed", payload: { incidentId: result.incident.id, provider: observation.provider, repository: observation.repository, branch: observation.branch, workflow: observation.workflow, failingHeadSha: observation.headSha, coordinatorAgentId, observedAt: observation.observedAt, ...(observation.conclusion ? { conclusion: observation.conclusion } : {}), failingRunIds: observation.failingRuns.map((run) => run.id), failingJobNames: failingJobNames(observation) }, alertHuman: true, subject: redSubject(observation), body: redBody(observation, result.incident.id) });
|
|
172
|
-
return { transition: "went_red", incidentId: result.incident.id, notified: true, messages: routed.messages.length, ...(routed.humanFallback ? { humanFallback: routed.humanFallback } : {}) };
|
|
173
|
-
}
|
|
174
|
-
if (result.kind === "resolved") {
|
|
175
|
-
const coordinatorAgentId = resolveCoordinator(deps);
|
|
176
|
-
const routed = route({ type: "ci.recovered", payload: { incidentId: result.incident.id, provider: observation.provider, repository: observation.repository, branch: observation.branch, workflow: observation.workflow, failingHeadSha: result.incident.openedHeadSha, coordinatorAgentId, recoveredAt: now, greenHeadSha: observation.headSha, ...(result.incident.resolution ? { resolution: result.incident.resolution } : {}) }, alertHuman: true, subject: greenSubject(observation), body: greenBody(observation, result.incident.id, result.incident.openedHeadSha) });
|
|
177
|
-
return { transition: "back_green", incidentId: result.incident.id, notified: true, messages: routed.messages.length, ...(routed.humanFallback ? { humanFallback: routed.humanFallback } : {}) };
|
|
178
|
-
}
|
|
179
|
-
if (result.kind === "never_matched") {
|
|
180
|
-
const coordinatorAgentId = resolveCoordinator(deps);
|
|
181
|
-
const routed = route({ type: "ci.never_matched", payload: { provider: observation.provider, repository: observation.repository, branch: observation.branch, workflow: observation.workflow, coordinatorAgentId, firstSeenAt: result.firstSeenAt, observedAt: observation.observedAt }, alertHuman: true, subject: neverMatchedSubject(observation), body: neverMatchedBody(observation) });
|
|
182
|
-
return { transition: "never_matched", notified: true, messages: routed.messages.length, ...(routed.humanFallback ? { humanFallback: routed.humanFallback } : {}) };
|
|
183
|
-
}
|
|
184
|
-
if (result.kind === "config_mismatch") {
|
|
185
|
-
const routed = route(configMismatchRoute(observation, resolveCoordinator(deps), result.unmatchedJobs));
|
|
186
|
-
return { transition: "config_mismatch", notified: true, messages: routed.messages.length, ...(routed.humanFallback ? { humanFallback: routed.humanFallback } : {}) };
|
|
187
|
-
}
|
|
188
|
-
return { transition: "none", ...(result.kind === "deduped" ? { incidentId: result.incident.id } : {}), notified: false, messages: 0 };
|
|
189
|
-
}
|
|
190
|
-
|
|
191
159
|
/** Live CI view (#3011): one `ci.status` event per watch status transition, never per poll. */
|
|
192
160
|
function emitCiStatus(result: CiIncidentIngestResult): void {
|
|
193
161
|
if (result.statusChange) emitRelayEvent({ type: "ci.status", source: "server", subject: result.watchKey, data: { ...result.statusChange } });
|
|
@@ -68,12 +68,12 @@ async function getRuntime(): Promise<Runtime> {
|
|
|
68
68
|
removeShutdownHook = onShutdown("claude-app-oauth", stopClaudeAppOAuth);
|
|
69
69
|
outcome = { status: "ok", detail: "OAuth available" };
|
|
70
70
|
return { provider, server, base: `http://127.0.0.1:${address.port}` };
|
|
71
|
-
})().catch(error => withRelayEventDrain(() => {
|
|
71
|
+
})().catch(error => withRelayEventDrain(async () => {
|
|
72
72
|
runtime = undefined;
|
|
73
73
|
const detail = `OAuth unavailable: ${errMessage(error)}`;
|
|
74
74
|
outcome = { status: "error", detail };
|
|
75
|
-
raiseOperatorAlarm({ clientId: `claude-app-oauth:${detail}`, source: "claude-app-oauth",
|
|
76
|
-
subject: "Claude app OAuth unavailable", detail, view: "overview", dedupeEvent: true });
|
|
75
|
+
(await raiseOperatorAlarm({ clientId: `claude-app-oauth:${detail}`, source: "claude-app-oauth",
|
|
76
|
+
subject: "Claude app OAuth unavailable", detail, view: "overview", dedupeEvent: true }));
|
|
77
77
|
throw error;
|
|
78
78
|
}));
|
|
79
79
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { CdPause, CdPauseControl } from "../state-adoption/cd-cutover";
|
|
2
|
+
import { apiRequest, ApiRequestError } from "./_shared";
|
|
3
|
+
|
|
4
|
+
/** The audited maintenance pause API (#1645) shared by local and fleet cutovers (#3470). */
|
|
5
|
+
export const cdWatcherPauses: CdPauseControl = {
|
|
6
|
+
async pause(holder, reason) {
|
|
7
|
+
try {
|
|
8
|
+
return ((await apiRequest("POST", "/api/maintenance/jobs/cd-watcher/pause", { holder, reason, indefinite: true })) as { pause: CdPause }).pause;
|
|
9
|
+
} catch (error) {
|
|
10
|
+
if (error instanceof ApiRequestError && error.status === 409) return (error.responseBody as { pause: CdPause }).pause;
|
|
11
|
+
throw error;
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
async current() {
|
|
15
|
+
const { pauses } = (await apiRequest("GET", "/api/maintenance/pauses")) as { pauses: Array<CdPause & { jobId: string }> };
|
|
16
|
+
return pauses.find((pause) => pause.jobId === "cd-watcher") ?? null;
|
|
17
|
+
},
|
|
18
|
+
async resume() { await apiRequest("POST", "/api/maintenance/jobs/cd-watcher/resume"); },
|
|
19
|
+
};
|
package/src/cli/orchestrator.ts
CHANGED
|
@@ -118,7 +118,7 @@ export async function handleOrchestratorCommand(args: string[]): Promise<void> {
|
|
|
118
118
|
// Install the server package too so a real `humwick` bin lands in the
|
|
119
119
|
// runtime .bin dir (#1421): under bunx there is no global install, so without
|
|
120
120
|
// this the darwin shim below would point at a bin that does not exist.
|
|
121
|
-
const packageCommand = skipInstall ? [] : ["npm", "install", "--prefix", runtimePrefix,
|
|
121
|
+
const packageCommand = skipInstall ? [] : ["npm", "install", "--prefix", runtimePrefix, `@humwick/runner@${version}`, `@humwick/orchestrator@${version}`, `@humwick/server@${version}`, OPENCODE_HARNESS_PACKAGE];
|
|
122
122
|
// W1: on macOS, put `humwick` on the interactive PATH (shim + profile
|
|
123
123
|
// block). Gated to darwin — Linux global-npm installs already get the shim via
|
|
124
124
|
// the postinstall, and we avoid editing Linux user profiles unnecessarily.
|
package/src/cli/state.ts
CHANGED
|
@@ -2,8 +2,7 @@ import { readFileSync } from "node:fs";
|
|
|
2
2
|
import { adoptMacos } from "../state-adoption/macos";
|
|
3
3
|
import { adoptLinux } from "../state-adoption/linux";
|
|
4
4
|
import { adoptState } from "../state-adoption";
|
|
5
|
-
import
|
|
6
|
-
import { apiRequest, ApiRequestError } from "./_shared";
|
|
5
|
+
import { cdWatcherPauses } from "./cd-pauses";
|
|
7
6
|
|
|
8
7
|
export const STATE_USAGE = "humwick state adopt|linux-adopt|macos-adopt|cd-cutover|cd-resume --manifest PATH [--interrupt-after STEP] [--rollback] [--systemctl PATH] [--launchctl PATH]";
|
|
9
8
|
const COMMANDS = ["adopt", "linux-adopt", "macos-adopt", "cd-cutover", "cd-resume"];
|
|
@@ -43,6 +42,7 @@ export async function handleStateCommand(args: string[]): Promise<void> {
|
|
|
43
42
|
async function cdCutover(command: string, input: any, options: { rollback: boolean; systemctl?: string; launchctl?: string; interrupt: (step: string) => void }) {
|
|
44
43
|
const { runCutover, resumeCutoverCd } = await import("../state-adoption/cd-cutover");
|
|
45
44
|
if (command === "cd-resume") return resumeCutoverCd(input, cdWatcherPauses);
|
|
45
|
+
if (input?.fleet) throw new Error("Fleet activation uses bun run release --deploy-only --cutover-manifest PATH under the existing executor");
|
|
46
46
|
const [{ resolveCanonicalRelayDbPath, withDeployLedgerDb }, { resolveReleaseLocalOrchestratorId }] = await Promise.all([
|
|
47
47
|
import("../../scripts/cd-config"), import("../../scripts/release-upgrade")]);
|
|
48
48
|
const dbPath = resolveCanonicalRelayDbPath();
|
|
@@ -54,20 +54,3 @@ async function cdCutover(command: string, input: any, options: { rollback: boole
|
|
|
54
54
|
: adoptLinux(input.handoff, { rollback, systemctl: options.systemctl, interrupt: options.interrupt }),
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
|
-
|
|
58
|
-
/** The audited maintenance pause API (#1645) for cd-watcher; an existing pause is returned, ours or not. */
|
|
59
|
-
const cdWatcherPauses: CdPauseControl = {
|
|
60
|
-
async pause(holder, reason) {
|
|
61
|
-
try {
|
|
62
|
-
return ((await apiRequest("POST", "/api/maintenance/jobs/cd-watcher/pause", { holder, reason, indefinite: true })) as { pause: CdPause }).pause;
|
|
63
|
-
} catch (error) {
|
|
64
|
-
if (error instanceof ApiRequestError && error.status === 409) return (error.responseBody as { pause: CdPause }).pause;
|
|
65
|
-
throw error;
|
|
66
|
-
}
|
|
67
|
-
},
|
|
68
|
-
async current() {
|
|
69
|
-
const { pauses } = (await apiRequest("GET", "/api/maintenance/pauses")) as { pauses: Array<CdPause & { jobId: string }> };
|
|
70
|
-
return pauses.find((pause) => pause.jobId === "cd-watcher") ?? null;
|
|
71
|
-
},
|
|
72
|
-
async resume() { await apiRequest("POST", "/api/maintenance/jobs/cd-watcher/resume"); },
|
|
73
|
-
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { parseTaskIdValue } from "../validation";
|
|
2
|
+
import { apiRequest } from "./_shared";
|
|
3
|
+
|
|
4
|
+
const fields: Record<string, string> = { "--title": "title", "--intent": "intent", "--done-when": "doneWhen", "--on-deploy": "onDeploy", "--team": "teamId", "--repo": "repo" };
|
|
5
|
+
|
|
6
|
+
export async function editTaskCommand(args: string[]): Promise<void> {
|
|
7
|
+
const create = args[0] === "create";
|
|
8
|
+
const id = create ? undefined : parseTaskIdValue(args[1] ?? "");
|
|
9
|
+
if (!create && !id) throw new Error("taskId must be a positive integer (TNNNN accepted)");
|
|
10
|
+
const body: Record<string, string> = {};
|
|
11
|
+
for (let i = create ? 1 : 2; i < args.length; i++) {
|
|
12
|
+
const flag = args[i]!;
|
|
13
|
+
if (flag === "--json") continue;
|
|
14
|
+
const field = fields[flag];
|
|
15
|
+
if (!field || i + 1 >= args.length) throw new Error(`Unknown or missing task ${args[0]} option: ${flag}`);
|
|
16
|
+
body[field] = args[++i]!;
|
|
17
|
+
}
|
|
18
|
+
if (create && (!body.title || !body.intent)) throw new Error("task create requires --title and --intent");
|
|
19
|
+
if (!Object.keys(body).length) throw new Error("task update requires a field such as --on-deploy");
|
|
20
|
+
const result = await apiRequest(create ? "POST" : "PATCH", create ? "/api/tasks" : `/api/tasks/${id}`, body);
|
|
21
|
+
console.log(JSON.stringify(result, null, 2));
|
|
22
|
+
}
|
package/src/cli/task.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { editTaskCommand } from "./task-edit";
|
|
1
2
|
// Task commands — #2518 review-hold control (`humwick task review-hold …`) + #2312
|
|
2
3
|
// withdraw-land (`humwick task withdraw-land …`). Thin HTTP clients (same apiRequest seam
|
|
3
4
|
// as workspace.ts): all policy — coordinator-only authorization, the expected-HEAD CAS,
|
|
@@ -11,7 +12,7 @@ function parseTaskId(raw: string | undefined): number | null {
|
|
|
11
12
|
return raw === undefined ? null : parseTaskIdValue(raw);
|
|
12
13
|
}
|
|
13
14
|
|
|
14
|
-
export const TASK_USAGE = "Usage: humwick task get <taskId> [--verbose] [--json] | humwick task review-hold <taskId> <status|set|clear> [--expected-head SHA] [--reason TEXT] [--json] | humwick task withdraw-land <workspaceId> [--reason TEXT] [--json]";
|
|
15
|
+
export const TASK_USAGE = "Usage: humwick task create --title TEXT --intent TEXT [--on-deploy TEXT] | humwick task update <taskId> [--on-deploy TEXT] | humwick task get <taskId> [--verbose] [--json] | humwick task review-hold <taskId> <status|set|clear> [--expected-head SHA] [--reason TEXT] [--json] | humwick task withdraw-land <workspaceId> [--reason TEXT] [--json]";
|
|
15
16
|
|
|
16
17
|
interface ReviewHoldStatusView {
|
|
17
18
|
id: number;
|
|
@@ -48,6 +49,7 @@ function renderStatus(task: ReviewHoldStatusView): string {
|
|
|
48
49
|
|
|
49
50
|
export async function handleTaskCommand(args: string[]): Promise<void> {
|
|
50
51
|
const sub = args[0];
|
|
52
|
+
if (sub === "create" || sub === "update") return editTaskCommand(args);
|
|
51
53
|
if (sub === "get") {
|
|
52
54
|
const taskId = parseTaskId(args[1]);
|
|
53
55
|
if (taskId === null) throw new Error(`taskId must be a positive integer (TNNNN accepted). ${TASK_USAGE}`);
|
package/src/cli/workflow.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { apiRequest } from "./_shared";
|
|
2
2
|
import { probeWorkflowDeployment } from "../../scripts/wait-for-deploy";
|
|
3
3
|
|
|
4
|
-
export const WORKFLOW_USAGE = "Usage: humwick workflow start <workflow> <taskId> [--json] | workflow get <runId> [--verbose] [--include-held] [--results-ref <id>] [--results-cursor <cursor>] [--json] | workflow resume <runId> [--activation <id>]";
|
|
4
|
+
export const WORKFLOW_USAGE = "Usage: humwick workflow start <workflow> <taskId> [--json] | workflow get <runId> [--verbose] [--include-held] [--results-ref <id>] [--results-cursor <cursor>] [--json] | workflow resume <runId> [--activation <id>] [--step <step>] [--pins <json>] [--note <text>] | workflow pause <runId> --reason <text> | workflow unpause <runId>";
|
|
5
5
|
|
|
6
6
|
export async function handleWorkflowCommand(args: string[]): Promise<void> {
|
|
7
7
|
const [command, runId, ...flags] = args;
|
|
@@ -25,10 +25,25 @@ export async function handleWorkflowCommand(args: string[]): Promise<void> {
|
|
|
25
25
|
}
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
|
-
if (!["get", "resume"].includes(command ?? "") || !runId || runId.startsWith("--")) throw new Error(WORKFLOW_USAGE);
|
|
28
|
+
if (!["get", "resume", "pause", "unpause"].includes(command ?? "") || !runId || runId.startsWith("--")) throw new Error(WORKFLOW_USAGE);
|
|
29
|
+
if (command === "pause" || command === "unpause") {
|
|
30
|
+
// #3757 — a pause says why the run waits; the server refuses an empty reason.
|
|
31
|
+
if (command === "pause" ? flags.length !== 2 || flags[0] !== "--reason" || !flags[1]?.trim() : flags.length) throw new Error(WORKFLOW_USAGE);
|
|
32
|
+
console.log(JSON.stringify(await apiRequest("POST", `/api/workflows/runs/${encodeURIComponent(runId)}/${command}`, command === "pause" ? { reason: flags[1] } : {}), null, 2));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
29
35
|
if (command === "resume") {
|
|
30
|
-
|
|
31
|
-
|
|
36
|
+
const body: Record<string, unknown> = {};
|
|
37
|
+
const fields: Record<string, string> = { "--activation": "activationId", "--step": "step", "--pins": "pins", "--note": "note" };
|
|
38
|
+
for (let index = 0; index < flags.length; index++) {
|
|
39
|
+
const flag = flags[index]!;
|
|
40
|
+
if (flag === "--json") continue;
|
|
41
|
+
const field = fields[flag];
|
|
42
|
+
const value = flags[++index];
|
|
43
|
+
if (!field || !value || value.startsWith("--")) throw new Error(WORKFLOW_USAGE);
|
|
44
|
+
body[field] = field === "pins" ? JSON.parse(value) : value;
|
|
45
|
+
}
|
|
46
|
+
console.log(JSON.stringify(await apiRequest("POST", `/api/workflows/runs/${encodeURIComponent(runId)}/resume`, body), null, 2));
|
|
32
47
|
return;
|
|
33
48
|
}
|
|
34
49
|
const query = new URLSearchParams();
|
package/src/commands-db.ts
CHANGED
|
@@ -305,7 +305,7 @@ export { buildListCommandsQuery } from "./db/commands-list-query";
|
|
|
305
305
|
|
|
306
306
|
export function listCommands(filters: CommandFilters = {}): Command[] {
|
|
307
307
|
const { sql, params } = buildListCommandsQuery(filters);
|
|
308
|
-
return (getDb().query(sql).all(...params as any[]) as CommandRow[]).map(rowToCommand);
|
|
308
|
+
return (getDb().query(sql).all(...params as any[]) as CommandRow[]).map((row) => rowToCommand(row, { slim: filters.slim }));
|
|
309
309
|
}
|
|
310
310
|
|
|
311
311
|
|
|
@@ -834,13 +834,13 @@ export function deleteCommand(id: string): boolean {
|
|
|
834
834
|
|
|
835
835
|
// Race the host claim on the same pending row; only the winning cancellation records stop intent.
|
|
836
836
|
// Legacy landing cancellation stays confined to its unfenced rows.
|
|
837
|
-
export function cancelPendingCommand(id: string, expectedType: string, reason = "canceled before dispatch"): boolean {
|
|
837
|
+
export function cancelPendingCommand(id: string, expectedType: string, reason = "canceled before dispatch", submittedAt: number = Date.now()): boolean {
|
|
838
838
|
if (expectedType === "workspace.merge") {
|
|
839
839
|
const existing = getCommand(id);
|
|
840
840
|
if (!existing || !isLegacyUnfencedWorkspaceMerge(existing)) return false;
|
|
841
841
|
}
|
|
842
842
|
return inWriteTransaction(() => {
|
|
843
|
-
const now =
|
|
843
|
+
const now = submittedAt;
|
|
844
844
|
const changes = getDb()
|
|
845
845
|
.query(`UPDATE commands SET status = 'canceled', result = ${canceledSpawnResultSql()}, error = ?, updated_at = ? WHERE id = ? AND status = 'pending' AND type = ?`)
|
|
846
846
|
.run(reason, now, id, expectedType).changes;
|
|
@@ -920,7 +920,7 @@ export const ACCEPTED_BY_OWNER_SQL = `SELECT * FROM commands INDEXED BY idx_comm
|
|
|
920
920
|
export function listAcceptedCommandsByOwner(target: string, ownerToken: string): Command[] {
|
|
921
921
|
if (!target || !ownerToken) return [];
|
|
922
922
|
const rows = getDb().query(ACCEPTED_BY_OWNER_SQL).all(target, ownerToken, Date.now()) as CommandRow[];
|
|
923
|
-
return rows.map(rowToCommand);
|
|
923
|
+
return rows.map((row) => rowToCommand(row));
|
|
924
924
|
}
|
|
925
925
|
|
|
926
926
|
// #1452 round-12 HIGH#2 — RE-FENCE a claimed review-publish command IMMEDIATELY before the host's
|
|
@@ -978,7 +978,7 @@ export const EXPIRED_PENDING_COMMANDS_SQL = `SELECT * FROM commands WHERE (type
|
|
|
978
978
|
|
|
979
979
|
export function expireCommands(
|
|
980
980
|
now: number = Date.now(),
|
|
981
|
-
opts: { isTargetGone?: (command: Command) => boolean } = {},
|
|
981
|
+
opts: { isTargetGone?: (command: Command) => boolean; update?: typeof updateCommand } = {},
|
|
982
982
|
): Command[] {
|
|
983
983
|
const activeRows = getDb().query(EXPIRED_CLAIMED_COMMANDS_SQL).all(now, ...CLAIMED_ACTIVE_STATUSES) as CommandRow[];
|
|
984
984
|
const pendingCandidates = getDb().query(EXPIRED_PENDING_COMMANDS_SQL).all(now) as CommandRow[];
|
|
@@ -998,7 +998,7 @@ export function expireCommands(
|
|
|
998
998
|
// #1452 round-13 — the TTL sweep is an AUTHORIZED terminalizer of a claimed publish (executor:true):
|
|
999
999
|
// it is the fail-closed path that lets the reconciler clean a host-death-after-claim, and timed_out is
|
|
1000
1000
|
// ambiguous (ref retained), never a ref-drop. External surfaces get no such flag (see updateCommand).
|
|
1001
|
-
updateCommand(row.id, {
|
|
1001
|
+
(opts.update ?? updateCommand)(row.id, {
|
|
1002
1002
|
status: "timed_out",
|
|
1003
1003
|
error: row.status === "pending"
|
|
1004
1004
|
? ((row.type === "agent.spawn" || row.type === "agent.restart") && hostSpawnsDrained(row.target) ? "host draining: spawns disabled; expired before dispatch" : "command target gone; expired before dispatch")
|
|
@@ -1142,7 +1142,7 @@ export function activeRestartSensitiveCommands(now: number = Date.now()): Comman
|
|
|
1142
1142
|
AND (type != 'agent.spawn' OR coalesce(json_extract(params, '$.registrationConfirmed'), 0) != 1)
|
|
1143
1143
|
ORDER BY updated_at ASC`,
|
|
1144
1144
|
)
|
|
1145
|
-
.all(...CLAIMED_ACTIVE_STATUSES, now, now) as CommandRow[]).map(rowToCommand);
|
|
1145
|
+
.all(...CLAIMED_ACTIVE_STATUSES, now, now) as CommandRow[]).map((row) => rowToCommand(row));
|
|
1146
1146
|
}
|
|
1147
1147
|
|
|
1148
1148
|
// #1746 RC-2 / issue ask 4 — when a shutdown command settles WITHOUT a confirmed kill (the
|
package/src/commands-write.ts
CHANGED
|
@@ -49,6 +49,10 @@ export async function createCommandAsync(
|
|
|
49
49
|
vaultProjectId?: string,
|
|
50
50
|
): Promise<Command> {
|
|
51
51
|
const args = await prepareCommandWriteAsync(input, options, vaultActor, vaultProjectId);
|
|
52
|
+
return submitPreparedCommandAsync(args);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function submitPreparedCommandAsync(args: CreateCommandWriteArgs): Promise<Command> {
|
|
52
56
|
return getGateway().coalesce(
|
|
53
57
|
"commands.create",
|
|
54
58
|
args,
|
|
@@ -82,6 +86,10 @@ export function getCommandAsync(id: string): Promise<Command | null> {
|
|
|
82
86
|
return getGateway().read("commands.get", { id }) as unknown as Promise<Command | null>;
|
|
83
87
|
}
|
|
84
88
|
|
|
89
|
+
export function findLatestCommandByCorrelationAsync(type: string, correlationId: string): Promise<Command | null> {
|
|
90
|
+
return getGateway().read("commands.latestByCorrelation", { type, correlationId }) as unknown as Promise<Command | null>;
|
|
91
|
+
}
|
|
92
|
+
|
|
85
93
|
/** #2969 — an agent's confirmed effort changes within a chat window's time range, read off-loop. */
|
|
86
94
|
export function listEffortChangesAsync(agentId: string, from: number, to: number, after?: EffortChangeCursor): Promise<{ changes: EffortChange[]; next?: EffortChangeCursor }> {
|
|
87
95
|
return getGateway().read("commands.effortChanges", { agentId, from, to, ...(after ? { after } : {}) }) as unknown as Promise<{ changes: EffortChange[]; next?: EffortChangeCursor }>;
|
package/src/compaction-watch.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { framed } from "./hub-metrics";
|
|
2
|
+
import { createActivityEventAsync } from "./db/activity-async";
|
|
1
3
|
import { timePostBindPhase } from "./post-bind-startup";
|
|
2
4
|
import { guardedInterval, isRecord } from "@humwick/sdk";
|
|
3
|
-
import { getAgent
|
|
5
|
+
import { getAgent } from "./db";
|
|
4
6
|
import { emitRelayEvent } from "./events";
|
|
5
7
|
import { isContinuationSelfResumeCommand } from "./self-resume-command";
|
|
6
8
|
import type { AgentCard, Command } from "./types";
|
|
@@ -74,7 +76,7 @@ export class CompactionWatch {
|
|
|
74
76
|
start(): void {
|
|
75
77
|
if (this.timer) return;
|
|
76
78
|
// #3643 — the tick writes an activity event; a BUSY from a bare timer would exit the hub.
|
|
77
|
-
this.timer = guardedInterval("[compaction-watch] tick", this.tickMs, () => timePostBindPhase("compaction-watch.tick", () => this.tick()));
|
|
79
|
+
this.timer = guardedInterval("[compaction-watch] tick", this.tickMs, framed("timer compaction-watch", () => timePostBindPhase("compaction-watch.tick", async () => (await this.tick()))));
|
|
78
80
|
}
|
|
79
81
|
|
|
80
82
|
stop(): void {
|
|
@@ -116,7 +118,7 @@ export class CompactionWatch {
|
|
|
116
118
|
this.pending.delete(agentId);
|
|
117
119
|
}
|
|
118
120
|
|
|
119
|
-
tick(): void {
|
|
121
|
+
async tick(): Promise<void> {
|
|
120
122
|
const now = this.now();
|
|
121
123
|
for (const [agentId, watch] of this.pending) {
|
|
122
124
|
if (watch.deadline > now) continue;
|
|
@@ -138,15 +140,15 @@ export class CompactionWatch {
|
|
|
138
140
|
continue;
|
|
139
141
|
}
|
|
140
142
|
this.pending.delete(agentId);
|
|
141
|
-
this.emitStalled(watch, true);
|
|
143
|
+
(await this.emitStalled(watch, true));
|
|
142
144
|
continue;
|
|
143
145
|
}
|
|
144
146
|
this.pending.delete(agentId);
|
|
145
|
-
this.emitStalled(watch);
|
|
147
|
+
(await this.emitStalled(watch));
|
|
146
148
|
}
|
|
147
149
|
}
|
|
148
150
|
|
|
149
|
-
private emitStalled(watch: PendingWatch, busyCapped = false): void {
|
|
151
|
+
private async emitStalled(watch: PendingWatch, busyCapped = false): Promise<void> {
|
|
150
152
|
const verb = watch.kind === "compact" ? "Compaction" : "Context clear";
|
|
151
153
|
// #2043 F3 — the busy-capped variant means the agent is STILL taking turns (not stuck at a menu)
|
|
152
154
|
// yet the compaction never started after a bounded wait — the runaway shape from #2043.
|
|
@@ -159,7 +161,7 @@ export class CompactionWatch {
|
|
|
159
161
|
subject: watch.agentId,
|
|
160
162
|
data: { agentId: watch.agentId, commandId: watch.commandId, kind: watch.kind, detail, busyCapped },
|
|
161
163
|
});
|
|
162
|
-
|
|
164
|
+
(await createActivityEventAsync({
|
|
163
165
|
clientId: `command-stalled-${watch.commandId}-${this.now()}-${++this.seq}`,
|
|
164
166
|
kind: "state",
|
|
165
167
|
title: `${verb} stalled: ${watch.agentId}`,
|
|
@@ -168,7 +170,7 @@ export class CompactionWatch {
|
|
|
168
170
|
view: "agents",
|
|
169
171
|
agentId: watch.agentId,
|
|
170
172
|
metadata: { source: "compaction-watch", commandId: watch.commandId, kind: watch.kind, stalled: true, detail, busyCapped },
|
|
171
|
-
});
|
|
173
|
+
}));
|
|
172
174
|
}
|
|
173
175
|
}
|
|
174
176
|
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
import { randomUUID } from "node:crypto";
|
|
8
8
|
import { getGateway } from "./db/gateway.ts";
|
|
9
|
-
import
|
|
9
|
+
import { agentProfileDeleteTarget, agentProfileWriteNamespace, savedAgentProfileEntry } from "./config-store.ts";
|
|
10
|
+
import type { AgentProfile, ConfigEntry } from "./types.ts";
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* Set a config entry off-loop (landmine #2). Routes through a single serialized `config.set` writer op
|
|
@@ -37,3 +38,14 @@ export function setConfigAsync<T = unknown>(
|
|
|
37
38
|
export function deleteConfigAsync(namespace: string, key: string, updatedBy?: string): Promise<boolean> {
|
|
38
39
|
return getGateway().write("config.delete", { namespace, key, updatedBy }) as unknown as Promise<boolean>;
|
|
39
40
|
}
|
|
41
|
+
|
|
42
|
+
/** `setAgentProfile` on the writer thread (#1870 S7). */
|
|
43
|
+
export async function setAgentProfileAsync(profile: AgentProfile, updatedBy?: string, opts: { overrideBuiltIn?: boolean } = {}): Promise<ConfigEntry<AgentProfile>> {
|
|
44
|
+
return savedAgentProfileEntry(await setConfigAsync(agentProfileWriteNamespace(profile, opts), profile.name, profile, updatedBy));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** `deleteAgentProfile` on the writer thread (#1870 S7). */
|
|
48
|
+
export async function deleteAgentProfileAsync(name: string, updatedBy?: string, opts: { resetBuiltInOverride?: boolean } = {}): Promise<boolean> {
|
|
49
|
+
const target = agentProfileDeleteTarget(name, opts);
|
|
50
|
+
return (await deleteConfigAsync(target.namespace, target.key, updatedBy));
|
|
51
|
+
}
|