@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
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { hasScope, isRecord } from "@humwick/sdk";
|
|
3
|
+
import type { ProjectProfileInstructions } from "../types";
|
|
4
|
+
import { listAgentProfiles, resolveAgentProfileKey } from "../config-store";
|
|
5
|
+
import { getGateway } from "../db/gateway";
|
|
6
|
+
import { ValidationError } from "../db/connection";
|
|
7
|
+
import { promptActorFromContext, promptVersionNumber } from "./prompt-version-writer";
|
|
8
|
+
import type { AuthContext } from "./auth-context";
|
|
9
|
+
import { cleanString } from "../validation";
|
|
10
|
+
import { emitConfigChanged } from "../sse";
|
|
11
|
+
|
|
12
|
+
export async function projectProfileInstructionKey(projectId: string, profile: string) {
|
|
13
|
+
const canonical = resolveAgentProfileKey(profile);
|
|
14
|
+
if (!canonical) throw new ValidationError("profile not found");
|
|
15
|
+
if (!await getGateway().read("projects.get", { id: projectId })) throw new ValidationError("project not found");
|
|
16
|
+
return { projectId, profile: canonical };
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function readProjectProfileInstructions(projectId: string, profile: string) {
|
|
20
|
+
return getGateway().read("projectProfileInstructions.get", await projectProfileInstructionKey(projectId, profile));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export async function projectProfileInstructionHistory(projectId: string, profile: string) {
|
|
24
|
+
return { versions: await getGateway().read("projectProfileInstructions.history", await projectProfileInstructionKey(projectId, profile)) };
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export async function listProjectProfileInstructions(filter: { projectId?: string; profile?: string }) {
|
|
28
|
+
const gateway = getGateway();
|
|
29
|
+
const profile = filter.profile ? resolveAgentProfileKey(filter.profile) : undefined;
|
|
30
|
+
if (filter.profile && !profile) throw new ValidationError("profile not found");
|
|
31
|
+
if (filter.projectId && !await gateway.read("projects.get", { id: filter.projectId })) throw new ValidationError("project not found");
|
|
32
|
+
if (!filter.projectId && !profile) throw new ValidationError("projectId or profile required");
|
|
33
|
+
const stored = await gateway.read("projectProfileInstructions.list", { projectId: filter.projectId, profile });
|
|
34
|
+
const byKey = new Map(stored.map(entry => [JSON.stringify([entry.projectId, entry.profile]), entry]));
|
|
35
|
+
const entry = (projectId: string, profile: string): ProjectProfileInstructions => byKey.get(JSON.stringify([projectId, profile])) ?? { projectId, profile, template: "", version: 0, updatedAt: 0 };
|
|
36
|
+
return { instructions: filter.projectId
|
|
37
|
+
? listAgentProfiles().filter(item => !profile || item.key === profile).map(item => entry(filter.projectId!, item.key))
|
|
38
|
+
: (await gateway.read("projects.list", { includeArchived: true })).map(project => ({ ...entry(project.id, profile!), projectTitle: project.title, projectSlug: project.slug })) };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export async function mutateProjectProfileInstructions(ctx: AuthContext, projectId: string, profile: string, input: unknown, restore = false) {
|
|
42
|
+
if (ctx.actor.kind !== "system" && !hasScope(ctx.scopes, "agent:write")) throw new ValidationError("agent:write scope required");
|
|
43
|
+
const key = await projectProfileInstructionKey(projectId, profile);
|
|
44
|
+
if (!isRecord(input)) throw new ValidationError("JSON object body required");
|
|
45
|
+
if (!Number.isSafeInteger(input.expectedVersion) || (input.expectedVersion as number) < 0) throw new ValidationError("expectedVersion must be a non-negative integer");
|
|
46
|
+
const result = await getGateway().write("projectProfileInstructions.write", {
|
|
47
|
+
...key, expectedVersion: input.expectedVersion as number,
|
|
48
|
+
template: restore ? undefined : input.template as string,
|
|
49
|
+
restoreVersion: restore ? promptVersionNumber(input.version, "version") : undefined,
|
|
50
|
+
actor: promptActorFromContext(ctx), reason: cleanString(input.reason, "reason", { max: 2000 }),
|
|
51
|
+
}, { idempotencyKey: randomUUID() }) as unknown as ProjectProfileInstructions;
|
|
52
|
+
emitConfigChanged("project-profile-instructions", `${key.projectId}:${key.profile}`, result.version);
|
|
53
|
+
return result;
|
|
54
|
+
}
|
package/src/services/project.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { setProjectIssueRepoAsync, ensureProjectAsync, addProjectRootAsync } from "../db/projects-async";
|
|
1
2
|
import { basename } from "node:path";
|
|
2
|
-
import { getProjectBySlug, getProjectBySlugAsync,
|
|
3
|
+
import { getProjectBySlug, getProjectBySlugAsync, projectByRemoteUrl, projectByRemoteUrlAsync, resolveProjectForCwd, resolveProjectForCwdAsync, rootsForProject, rootsForProjectAsync, workspaceRepoRootForCwd } from "../db";
|
|
3
4
|
import { ingestClaudeMd } from "../project-ingest";
|
|
4
5
|
import { resolveProjectForCanonicalCwd, type CanonicalCwdMatch } from "./project-cwd";
|
|
5
6
|
import { canonicalRoot, canonicalRootAsync, findGitRepoRoot, findGitRepoRootAsync } from "./canonical-root";
|
|
@@ -42,23 +43,23 @@ interface AutoSeedProjectResult {
|
|
|
42
43
|
* project-entry mutations are intentionally outside this projects-root migration. New
|
|
43
44
|
* async-capable callers must use {@link ensureProjectRootAsync}.
|
|
44
45
|
*/
|
|
45
|
-
export function ensureProjectRoot(input: EnsureProjectRootInput): EnsureProjectRootResult {
|
|
46
|
-
const project =
|
|
46
|
+
export async function ensureProjectRoot(input: EnsureProjectRootInput): Promise<EnsureProjectRootResult> {
|
|
47
|
+
const project = (await ensureProjectAsync({
|
|
47
48
|
slug: input.slug,
|
|
48
49
|
matchingRemoteUrl: input.matchingRemoteUrl,
|
|
49
50
|
...(input.title !== undefined ? { title: input.title } : {}),
|
|
50
51
|
...(input.description !== undefined ? { description: input.description } : {}),
|
|
51
52
|
...(input.tenantId !== undefined ? { tenantId: input.tenantId } : {}),
|
|
52
53
|
...(input.issueRepo !== undefined ? { issueRepo: input.issueRepo } : {}),
|
|
53
|
-
});
|
|
54
|
+
}));
|
|
54
55
|
const remoteUrl = input.remoteUrl ?? remoteUrlFromGitRemote(input.rootPath);
|
|
55
|
-
const roots =
|
|
56
|
+
const roots = (await addProjectRootAsync(project.id, input.rootPath, { remoteUrl, ref: input.ref, orchestratorId: input.orchestratorId }));
|
|
56
57
|
// Auto-derive issueRepo from the root's git remote (#533) when not explicitly provided.
|
|
57
58
|
// `onlyIfNull` ensures an explicit override (or earlier derivation) is never clobbered.
|
|
58
59
|
if (input.issueRepo === undefined && !project.issueRepo) {
|
|
59
60
|
const derived = repoFromGitRemote(input.rootPath);
|
|
60
61
|
if (derived) {
|
|
61
|
-
const updated =
|
|
62
|
+
const updated = (await setProjectIssueRepoAsync(project.id, derived, { onlyIfNull: true }));
|
|
62
63
|
if (updated) return { project: updated, roots };
|
|
63
64
|
}
|
|
64
65
|
}
|
|
@@ -117,17 +118,17 @@ async function resolveProjectForWorkspaceCwdAsync(cwd: string): Promise<Canonica
|
|
|
117
118
|
* Synchronous compatibility seam for legacy callers. New async-capable registration/spawn
|
|
118
119
|
* paths use {@link autoSeedProjectForCwdAsync} so root writes reach the writer gateway.
|
|
119
120
|
*/
|
|
120
|
-
export function autoSeedProjectForCwd(cwd: string, authorId: string): AutoSeedProjectResult | null {
|
|
121
|
+
export async function autoSeedProjectForCwd(cwd: string, authorId: string): Promise<AutoSeedProjectResult | null> {
|
|
121
122
|
const match = resolveProjectForCanonicalCwd(cwd);
|
|
122
123
|
if (match.project) {
|
|
123
124
|
const repoRoot = match.repoRoot ?? cwd;
|
|
124
125
|
// A remote-URL match owns no root containing this checkout yet — register it so every
|
|
125
126
|
// later resolve is plain containment again, and never re-derives the remote.
|
|
126
|
-
if (match.matchedByRemote)
|
|
127
|
+
if (match.matchedByRemote) (await addProjectRootAsync(match.project.id, repoRoot, { remoteUrl: remoteUrlFromGitRemote(repoRoot) }));
|
|
127
128
|
let project = match.project;
|
|
128
129
|
if (!project.issueRepo) {
|
|
129
130
|
const derived = repoFromGitRemote(repoRoot);
|
|
130
|
-
const updated = derived ?
|
|
131
|
+
const updated = derived ? (await setProjectIssueRepoAsync(project.id, derived, { onlyIfNull: true })) : null;
|
|
131
132
|
if (updated) project = updated;
|
|
132
133
|
}
|
|
133
134
|
return { project, repoRoot, roots: rootsForProject(project.id) };
|
|
@@ -139,7 +140,7 @@ export function autoSeedProjectForCwd(cwd: string, authorId: string): AutoSeedPr
|
|
|
139
140
|
if (!slug) return null;
|
|
140
141
|
|
|
141
142
|
if (getProjectBySlug(slug)?.status === "archived" || resolveProjectForCwd(repoRoot, { includeArchived: true })?.status === "archived" || projectByRemoteUrl(remoteUrlFromGitRemote(repoRoot), { includeArchived: true })?.status === "archived") return null;
|
|
142
|
-
const { project, roots } = ensureProjectRoot({ slug, rootPath: repoRoot });
|
|
143
|
+
const { project, roots } = (await ensureProjectRoot({ slug, rootPath: repoRoot }));
|
|
143
144
|
try {
|
|
144
145
|
// Legacy synchronous callers cannot await filesystem ingestion. Their async
|
|
145
146
|
// counterparts below perform it without blocking the server loop.
|
|
@@ -1,25 +1,26 @@
|
|
|
1
|
+
import { upsertTemplateAsync, resetTemplateAsync } from "../db/runtime-tail-async";
|
|
1
2
|
import { getGateway } from "../db/gateway";
|
|
2
3
|
import { promptTemplateFallback } from "../prompt-template-fallback";
|
|
3
4
|
import { defaultPromptTemplates } from "../prompt-resolver";
|
|
4
5
|
import { memoryRetirementMessage } from "../memory-retirement";
|
|
5
6
|
import { ValidationError } from "../db/connection";
|
|
6
|
-
import { getTemplate, listTemplates,
|
|
7
|
+
import { getTemplate, listTemplates, type PromptTemplateRecord } from "../db";
|
|
7
8
|
|
|
8
9
|
export function listPromptTemplates(category?: string): PromptTemplateRecord[] {
|
|
9
10
|
return listTemplates(category).filter((entry) => !memoryRetirementMessage(entry.slug));
|
|
10
11
|
}
|
|
11
12
|
|
|
12
|
-
export function updatePromptTemplate(slug: string, template: string): PromptTemplateRecord | null {
|
|
13
|
+
export async function updatePromptTemplate(slug: string, template: string): Promise<PromptTemplateRecord | null> {
|
|
13
14
|
const retirement = memoryRetirementMessage(slug);
|
|
14
15
|
if (retirement) throw new ValidationError(retirement);
|
|
15
|
-
|
|
16
|
+
(await upsertTemplateAsync(slug, template));
|
|
16
17
|
return getTemplate(slug);
|
|
17
18
|
}
|
|
18
19
|
|
|
19
|
-
export function resetPromptTemplate(slug: string): PromptTemplateRecord | null {
|
|
20
|
+
export async function resetPromptTemplate(slug: string): Promise<PromptTemplateRecord | null> {
|
|
20
21
|
const retirement = memoryRetirementMessage(slug);
|
|
21
22
|
if (retirement) throw new ValidationError(retirement);
|
|
22
|
-
|
|
23
|
+
(await resetTemplateAsync(slug));
|
|
23
24
|
return getTemplate(slug);
|
|
24
25
|
}
|
|
25
26
|
|
|
@@ -97,7 +97,7 @@ export async function sendStillHeldNudges(nowMs: number = Date.now(), signal?: A
|
|
|
97
97
|
) {
|
|
98
98
|
if (await providerHoldCloseWasAggregated(agent.id, pendingClose.kind, pendingClose.seq)) {
|
|
99
99
|
const { pendingCloseAt: _pendingClose, ...closed } = pendingClose;
|
|
100
|
-
persistProviderHold(agent.id, closed);
|
|
100
|
+
(await persistProviderHold(agent.id, closed));
|
|
101
101
|
} else {
|
|
102
102
|
await notifyProviderHoldClosed(agent, pendingClose, nowMs);
|
|
103
103
|
}
|
|
@@ -105,20 +105,20 @@ export async function sendStillHeldNudges(nowMs: number = Date.now(), signal?: A
|
|
|
105
105
|
|
|
106
106
|
if (!agent.spawnedBy) {
|
|
107
107
|
if (blocked && agent.kind === "provider" && agent.status !== "offline" && agentProviderState(agent)) {
|
|
108
|
-
const hold = openProviderHold(agent.id, agentProviderState(agent), nowMs, { continuing: true });
|
|
108
|
+
const hold = (await openProviderHold(agent.id, agentProviderState(agent), nowMs, { continuing: true }));
|
|
109
109
|
if (hold.humanPagedAt === undefined && nowMs - hold.startedAt >= TOP_LEVEL_PAGE_THRESHOLD_MS()) {
|
|
110
110
|
const holdMs = Math.max(0, nowMs - hold.startedAt);
|
|
111
111
|
const state = agentProviderState(agent)!;
|
|
112
112
|
const label = state.label ?? state.reason ?? hold.kind;
|
|
113
|
-
const result = notifyWorkspaceHumanEscalation({
|
|
113
|
+
const result = (await notifyWorkspaceHumanEscalation({
|
|
114
114
|
subject: `Agent blocked: ${agent.label ?? agent.name ?? agent.id}`,
|
|
115
115
|
body: `${agent.label ?? agent.name ?? agent.id} on ${agent.machine ?? "unknown host"} has been blocked for ${formatHoldDuration(holdMs)}: ${label} (${hold.kind}).`,
|
|
116
116
|
payload: { kind: "agent.provider_blocked", agentId: agent.id, holdId: hold.holdId, holdMs, providerState: state },
|
|
117
117
|
source: "provider-state-audit",
|
|
118
118
|
tags: ["agent-relay", "provider"],
|
|
119
119
|
idempotencyKey: `provider-human-blocked:${agent.id}:${hold.holdId}`,
|
|
120
|
-
});
|
|
121
|
-
if (result.accepted) persistProviderHold(agent.id, { ...hold, humanPagedAt: nowMs });
|
|
120
|
+
}));
|
|
121
|
+
if (result.accepted) (await persistProviderHold(agent.id, { ...hold, humanPagedAt: nowMs }));
|
|
122
122
|
}
|
|
123
123
|
}
|
|
124
124
|
continue;
|
|
@@ -142,7 +142,7 @@ export async function sendStillHeldNudges(nowMs: number = Date.now(), signal?: A
|
|
|
142
142
|
const quietFlaps = await quietProviderFlapsForAgents(flapCandidates.map((agent) => agent.id), nowMs);
|
|
143
143
|
for (const agent of flapCandidates) {
|
|
144
144
|
if (signal?.aborted) break;
|
|
145
|
-
for (const flap of quietFlaps.get(agent.id) ?? []) notifyProviderFlap(agent, flap, isProviderBlocked(agent));
|
|
145
|
+
for (const flap of quietFlaps.get(agent.id) ?? []) await notifyProviderFlap(agent, flap, isProviderBlocked(agent));
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
for (const agent of nudgeCandidates) {
|
|
@@ -153,7 +153,7 @@ export async function sendStillHeldNudges(nowMs: number = Date.now(), signal?: A
|
|
|
153
153
|
// `continuing: true` — the sweep only ever sees an already-blocked agent. Self-healing: a
|
|
154
154
|
// hold whose block edge the relay missed (restart mid-hold, pre-#1615 record) is adopted here
|
|
155
155
|
// rather than going unwatched.
|
|
156
|
-
const hold = openProviderHold(agent.id, state, nowMs, { continuing: true });
|
|
156
|
+
const hold = (await openProviderHold(agent.id, state, nowMs, { continuing: true }));
|
|
157
157
|
const sinceLastSignal = nowMs - (hold.lastNudgeAt ?? hold.startedAt);
|
|
158
158
|
if (sinceLastSignal < nextNudgeIntervalMs(hold.nudgeCount)) continue;
|
|
159
159
|
|
|
@@ -162,7 +162,7 @@ export async function sendStillHeldNudges(nowMs: number = Date.now(), signal?: A
|
|
|
162
162
|
const resetSuffix = typeof state.resetAt === "number" ? ` · resets ${formatClockUtc(state.resetAt)}` : "";
|
|
163
163
|
const label = agent.label ?? agent.name ?? agent.id;
|
|
164
164
|
|
|
165
|
-
routeNotification({
|
|
165
|
+
await routeNotification({
|
|
166
166
|
type: "agent.provider_still_held",
|
|
167
167
|
scope: { agentId: agent.id, parent: agent.spawnedBy },
|
|
168
168
|
recipients: [agent.spawnedBy],
|
|
@@ -183,7 +183,7 @@ export async function sendStillHeldNudges(nowMs: number = Date.now(), signal?: A
|
|
|
183
183
|
},
|
|
184
184
|
});
|
|
185
185
|
|
|
186
|
-
persistProviderHold(agent.id, { ...hold, nudgeCount: hold.nudgeCount + 1, lastNudgeAt: nowMs });
|
|
186
|
+
(await persistProviderHold(agent.id, { ...hold, nudgeCount: hold.nudgeCount + 1, lastNudgeAt: nowMs }));
|
|
187
187
|
notified.push(agent.id);
|
|
188
188
|
}
|
|
189
189
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { mergeAgentMetaAsync } from "../db/agents-async";
|
|
1
2
|
// #1615 — durable identity + delivery bookkeeping for a provider hold.
|
|
2
3
|
//
|
|
3
4
|
// The #1610 sweep derived both from values that are neither stable nor durable: the unblock
|
|
@@ -10,14 +11,14 @@
|
|
|
10
11
|
//
|
|
11
12
|
// This module gives a hold ONE identity, minted server-side on the edge the relay actually
|
|
12
13
|
// observes and persisted in the agent's SQLite meta (`meta.providerHold`). The runner never
|
|
13
|
-
// sends that key, and `
|
|
14
|
+
// sends that key, and `mergeAgentMetaAsync` is a shallow merge, so a status frame can't clobber it.
|
|
14
15
|
// Every notification for a hold — block, still-held nudges, unblock — keys on that id, so:
|
|
15
16
|
// * permanent idempotency now bounds messages PER HOLD instead of per agent-lifetime;
|
|
16
17
|
// * a restart mid-hold resumes the same key sequence instead of replaying it;
|
|
17
18
|
// * `startedAt` is read from the provider ONCE, when the episode opens, and frozen — an
|
|
18
19
|
// adapter that re-stamps `enteredAt` on every poll can no longer stall the nudge clock.
|
|
19
20
|
import { isRecord } from "@humwick/sdk";
|
|
20
|
-
import { getAgent
|
|
21
|
+
import { getAgent } from "../db";
|
|
21
22
|
import type { ProviderState } from "../provider-state";
|
|
22
23
|
|
|
23
24
|
/**
|
|
@@ -85,8 +86,8 @@ export function readProviderHold(agent: HasMeta | null | undefined): ProviderHol
|
|
|
85
86
|
}
|
|
86
87
|
|
|
87
88
|
/** Persist the record. Shallow-merged, so it survives every runner status frame. */
|
|
88
|
-
export function persistProviderHold(agentId: string, record: ProviderHoldRecord): ProviderHoldRecord {
|
|
89
|
-
|
|
89
|
+
export async function persistProviderHold(agentId: string, record: ProviderHoldRecord): Promise<ProviderHoldRecord> {
|
|
90
|
+
(await mergeAgentMetaAsync(agentId, { providerHold: record }));
|
|
90
91
|
return record;
|
|
91
92
|
}
|
|
92
93
|
|
|
@@ -96,10 +97,10 @@ function seedStartedAt(state: ProviderState | null | undefined, nowMs: number):
|
|
|
96
97
|
return typeof entered === "number" && Number.isFinite(entered) ? Math.min(entered, nowMs) : nowMs;
|
|
97
98
|
}
|
|
98
99
|
|
|
99
|
-
function mintProviderHold(agentId: string, prior: ProviderHoldRecord | null, state: ProviderState | null | undefined, nowMs: number): ProviderHoldRecord {
|
|
100
|
+
async function mintProviderHold(agentId: string, prior: ProviderHoldRecord | null, state: ProviderState | null | undefined, nowMs: number): Promise<ProviderHoldRecord> {
|
|
100
101
|
const seq = (prior?.seq ?? 0) + 1;
|
|
101
102
|
const startedAt = seedStartedAt(state, nowMs);
|
|
102
|
-
return persistProviderHold(agentId, { holdId: `h${seq}-${startedAt}`, seq, startedAt, kind: providerHoldKind(state), nudgeCount: 0 });
|
|
103
|
+
return (await persistProviderHold(agentId, { holdId: `h${seq}-${startedAt}`, seq, startedAt, kind: providerHoldKind(state), nudgeCount: 0 }));
|
|
103
104
|
}
|
|
104
105
|
|
|
105
106
|
/**
|
|
@@ -110,15 +111,15 @@ function mintProviderHold(agentId: string, prior: ProviderHoldRecord | null, sta
|
|
|
110
111
|
* that finds an un-cleared record means the relay missed the clear, so that record is abandoned
|
|
111
112
|
* rather than resurrected with an hours-stale `startedAt`.
|
|
112
113
|
*/
|
|
113
|
-
export function openProviderHold(agentId: string, state: ProviderState | null | undefined, nowMs: number, opts: { continuing: boolean }): ProviderHoldRecord {
|
|
114
|
+
export async function openProviderHold(agentId: string, state: ProviderState | null | undefined, nowMs: number, opts: { continuing: boolean }): Promise<ProviderHoldRecord> {
|
|
114
115
|
const prior = readProviderHold(getAgent(agentId));
|
|
115
116
|
const open = prior !== null && prior.clearedAt === undefined;
|
|
116
117
|
if (prior && open && opts.continuing) return prior;
|
|
117
118
|
if (prior && !open && prior.kind === providerHoldKind(state) && nowMs - prior.clearedAt! <= HOLD_COALESCE_MS) {
|
|
118
119
|
const { clearedAt: _cleared, pendingCloseAt: _pendingClose, ...reopened } = prior;
|
|
119
|
-
return persistProviderHold(agentId, reopened);
|
|
120
|
+
return (await persistProviderHold(agentId, reopened));
|
|
120
121
|
}
|
|
121
|
-
return mintProviderHold(agentId, prior, state, nowMs);
|
|
122
|
+
return (await mintProviderHold(agentId, prior, state, nowMs));
|
|
122
123
|
}
|
|
123
124
|
|
|
124
125
|
/**
|
|
@@ -129,9 +130,9 @@ export function openProviderHold(agentId: string, state: ProviderState | null |
|
|
|
129
130
|
* fallback start so the reported duration stays honest. The maintenance sweep sends the closing
|
|
130
131
|
* notice only after `pendingCloseAt` has survived the coalescing window.
|
|
131
132
|
*/
|
|
132
|
-
export function closeProviderHold(agentId: string, previous: ProviderState | null | undefined, clearedAt: number): ProviderHoldRecord | null {
|
|
133
|
+
export async function closeProviderHold(agentId: string, previous: ProviderState | null | undefined, clearedAt: number): Promise<ProviderHoldRecord | null> {
|
|
133
134
|
const prior = readProviderHold(getAgent(agentId));
|
|
134
135
|
if (prior && prior.clearedAt !== undefined) return prior;
|
|
135
|
-
const record = prior ?? mintProviderHold(agentId, null, previous, clearedAt);
|
|
136
|
-
return persistProviderHold(agentId, { ...record, clearedAt, pendingCloseAt: clearedAt });
|
|
136
|
+
const record = prior ?? (await mintProviderHold(agentId, null, previous, clearedAt));
|
|
137
|
+
return (await persistProviderHold(agentId, { ...record, clearedAt, pendingCloseAt: clearedAt }));
|
|
137
138
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createActivityEventAsync } from "../db/activity-async";
|
|
2
|
+
|
|
2
3
|
import { routeNotification } from "../notification-router";
|
|
3
4
|
import { agentProviderState, formatHoldDuration, type ProviderState } from "../provider-state";
|
|
4
5
|
import { redactSecrets } from "../../runner/src/adapters/tool-summary";
|
|
@@ -30,7 +31,7 @@ export async function auditProviderStateTransition(agentId: string, before: Agen
|
|
|
30
31
|
try {
|
|
31
32
|
// #1912 §4 retained: bus status-frame ingress invokes this synchronously immediately after
|
|
32
33
|
// accepting the card mutation. A detached async audit would lose that ordering boundary.
|
|
33
|
-
|
|
34
|
+
(await createActivityEventAsync({
|
|
34
35
|
clientId: `server-agent-${agentId}-provider-state-${nextKey ?? "cleared"}-${Date.now()}`,
|
|
35
36
|
kind: "state",
|
|
36
37
|
title: blocked ? `Agent blocked: ${label}` : "Agent provider unblocked",
|
|
@@ -43,35 +44,35 @@ export async function auditProviderStateTransition(agentId: string, before: Agen
|
|
|
43
44
|
previousProviderState: previous ?? null,
|
|
44
45
|
providerState: next ?? null,
|
|
45
46
|
},
|
|
46
|
-
});
|
|
47
|
+
}));
|
|
47
48
|
if (!after) return;
|
|
48
49
|
if (!after.spawnedBy) {
|
|
49
50
|
if (blocked) {
|
|
50
|
-
openProviderHold(agentId, next, nowMs, { continuing: previous?.state === "blocked" });
|
|
51
|
+
(await openProviderHold(agentId, next, nowMs, { continuing: previous?.state === "blocked" }));
|
|
51
52
|
} else if (previous?.state === "blocked") {
|
|
52
53
|
const clearedAt = typeof next?.enteredAt === "number" ? next.enteredAt : nowMs;
|
|
53
|
-
closeProviderHold(agentId, previous, clearedAt);
|
|
54
|
+
(await closeProviderHold(agentId, previous, clearedAt));
|
|
54
55
|
}
|
|
55
56
|
return;
|
|
56
57
|
}
|
|
57
58
|
if (blocked) {
|
|
58
59
|
// A prior flap that has been quiet for a full window is conclusively settled before this
|
|
59
60
|
// fresh edge is evaluated. The `currentlyHeld` value is the state we observe NOW.
|
|
60
|
-
for (const flap of await quietProviderFlaps(agentId, nowMs)) notifyProviderFlap(after, flap, true);
|
|
61
|
+
for (const flap of await quietProviderFlaps(agentId, nowMs)) await notifyProviderFlap(after, flap, true);
|
|
61
62
|
// A blocked→blocked reason change continues the SAME episode (the hold never lifted), so it
|
|
62
63
|
// must not re-announce; `continuing` also stops a fresh block edge from resurrecting a record
|
|
63
64
|
// left open by a clear the relay missed.
|
|
64
|
-
const hold = openProviderHold(agentId, next, nowMs, { continuing: previous?.state === "blocked" });
|
|
65
|
+
const hold = (await openProviderHold(agentId, next, nowMs, { continuing: previous?.state === "blocked" }));
|
|
65
66
|
if (hold.blockNotifiedAt !== undefined) return;
|
|
66
67
|
const announcement = await providerHoldAnnouncement(agentId, hold.kind, hold.seq, nowMs);
|
|
67
68
|
if (announcement.kind === "summary") {
|
|
68
|
-
notifyProviderFlap(after, announcement.flap, true);
|
|
69
|
+
await notifyProviderFlap(after, announcement.flap, true);
|
|
69
70
|
return;
|
|
70
71
|
}
|
|
71
72
|
if (announcement.kind === "suppressed") {
|
|
72
73
|
return;
|
|
73
74
|
}
|
|
74
|
-
routeNotification({
|
|
75
|
+
await routeNotification({
|
|
75
76
|
type: "agent.provider_blocked",
|
|
76
77
|
scope: { agentId, parent: after.spawnedBy },
|
|
77
78
|
recipients: [after.spawnedBy],
|
|
@@ -83,7 +84,7 @@ export async function auditProviderStateTransition(agentId: string, before: Agen
|
|
|
83
84
|
idempotencyKey: `provider-blocked:${agentId}:${hold.holdId}`,
|
|
84
85
|
},
|
|
85
86
|
});
|
|
86
|
-
persistProviderHold(agentId, { ...hold, blockNotifiedAt: nowMs });
|
|
87
|
+
(await persistProviderHold(agentId, { ...hold, blockNotifiedAt: nowMs }));
|
|
87
88
|
return;
|
|
88
89
|
}
|
|
89
90
|
// The closing bracket on a block: only fires when the transition actually came FROM blocked
|
|
@@ -92,7 +93,7 @@ export async function auditProviderStateTransition(agentId: string, before: Agen
|
|
|
92
93
|
// The runner stamps `enteredAt` on every state, so `next.enteredAt` is when the hold actually
|
|
93
94
|
// cleared — preferred over `nowMs` so the duration is exact even if this audit runs late.
|
|
94
95
|
const clearedAt = typeof next?.enteredAt === "number" ? next.enteredAt : nowMs;
|
|
95
|
-
closeProviderHold(agentId, previous, clearedAt);
|
|
96
|
+
(await closeProviderHold(agentId, previous, clearedAt));
|
|
96
97
|
} catch {
|
|
97
98
|
// Audit trail writes must never block bus status updates.
|
|
98
99
|
}
|
|
@@ -108,17 +109,17 @@ export async function notifyProviderHoldClosed(agent: AgentCard, hold: ProviderH
|
|
|
108
109
|
if (!agent.spawnedBy) {
|
|
109
110
|
if (hold.humanPagedAt === undefined) return;
|
|
110
111
|
const holdMs = Math.max(0, (hold.clearedAt ?? nowMs) - hold.startedAt);
|
|
111
|
-
const result = notifyWorkspaceHumanEscalation({
|
|
112
|
+
const result = (await notifyWorkspaceHumanEscalation({
|
|
112
113
|
subject: `Agent unblocked: ${agent.label ?? agent.name ?? agent.id}`,
|
|
113
114
|
body: `${agent.label ?? agent.name ?? agent.id} on ${agent.machine ?? "unknown host"} unblocked after ${formatHoldDuration(holdMs)} (${hold.kind}).`,
|
|
114
115
|
payload: { kind: "agent.provider_unblocked", agentId: agent.id, holdId: hold.holdId, holdMs },
|
|
115
116
|
source: "provider-state-audit",
|
|
116
117
|
tags: ["agent-relay", "provider"],
|
|
117
118
|
idempotencyKey: `provider-human-unblocked:${agent.id}:${hold.holdId}`,
|
|
118
|
-
});
|
|
119
|
+
}));
|
|
119
120
|
if (result.accepted) {
|
|
120
121
|
const { pendingCloseAt: _pendingClose, ...closed } = hold;
|
|
121
|
-
persistProviderHold(agent.id, { ...closed, unblockNotifiedAt: nowMs });
|
|
122
|
+
(await persistProviderHold(agent.id, { ...closed, unblockNotifiedAt: nowMs }));
|
|
122
123
|
}
|
|
123
124
|
return;
|
|
124
125
|
}
|
|
@@ -127,7 +128,7 @@ export async function notifyProviderHoldClosed(agent: AgentCard, hold: ProviderH
|
|
|
127
128
|
const label = typeof state?.label === "string" ? state.label : "provider blocked";
|
|
128
129
|
const holdMs = Math.max(0, (hold.clearedAt ?? nowMs) - hold.startedAt);
|
|
129
130
|
const holdSuffix = ` (held ${formatHoldDuration(holdMs)}${hold.kind ? `, ${hold.kind}` : ""})`;
|
|
130
|
-
routeNotification({
|
|
131
|
+
await routeNotification({
|
|
131
132
|
type: "agent.provider_unblocked",
|
|
132
133
|
scope: { agentId: agent.id, parent: agent.spawnedBy },
|
|
133
134
|
recipients: [agent.spawnedBy],
|
|
@@ -147,15 +148,15 @@ export async function notifyProviderHoldClosed(agent: AgentCard, hold: ProviderH
|
|
|
147
148
|
},
|
|
148
149
|
});
|
|
149
150
|
const { pendingCloseAt: _pendingClose, ...closed } = hold;
|
|
150
|
-
persistProviderHold(agent.id, { ...closed, unblockNotifiedAt: nowMs });
|
|
151
|
+
(await persistProviderHold(agent.id, { ...closed, unblockNotifiedAt: nowMs }));
|
|
151
152
|
}
|
|
152
153
|
|
|
153
154
|
/** Route one uniquely-keyed flap summary or its terminal settle correction. */
|
|
154
|
-
export function notifyProviderFlap(agent: AgentCard, flap: ProviderFlap, currentlyHeld: boolean): void {
|
|
155
|
+
export async function notifyProviderFlap(agent: AgentCard, flap: ProviderFlap, currentlyHeld: boolean): Promise<void> {
|
|
155
156
|
if (!agent.spawnedBy) return;
|
|
156
157
|
const terminal = flap.settledAt !== undefined;
|
|
157
158
|
const durationMs = Math.max(0, (flap.settledAt ?? flap.lastEpisodeAt) - flap.flapStartedAt);
|
|
158
|
-
routeNotification({
|
|
159
|
+
await routeNotification({
|
|
159
160
|
type: "agent.provider_flapping",
|
|
160
161
|
scope: { agentId: agent.id, parent: agent.spawnedBy },
|
|
161
162
|
recipients: [agent.spawnedBy],
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"unknown": 0
|
|
20
20
|
},
|
|
21
21
|
"mcp:relay-schemas": {
|
|
22
|
-
"residentKnown":
|
|
22
|
+
"residentKnown": 24574,
|
|
23
23
|
"onDemandAvailable": 0,
|
|
24
24
|
"unknown": 0
|
|
25
25
|
},
|
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
"unknown": 0
|
|
115
115
|
},
|
|
116
116
|
"mcp:relay-schemas": {
|
|
117
|
-
"residentKnown":
|
|
117
|
+
"residentKnown": 24574,
|
|
118
118
|
"onDemandAvailable": 0,
|
|
119
119
|
"unknown": 0
|
|
120
120
|
},
|
|
@@ -364,11 +364,11 @@
|
|
|
364
364
|
"reviewer:codex": 11221,
|
|
365
365
|
"sec-ops:claude": 11610,
|
|
366
366
|
"sec-ops:codex": 10644,
|
|
367
|
-
"ops-assistant:claude":
|
|
367
|
+
"ops-assistant:claude": 25390,
|
|
368
368
|
"ops-assistant:codex": 25562,
|
|
369
369
|
"sub-coordinator:claude": 20137,
|
|
370
370
|
"sub-coordinator:codex": 20392,
|
|
371
|
-
"coordinator:claude":
|
|
371
|
+
"coordinator:claude": 26584,
|
|
372
372
|
"coordinator:codex": 26622,
|
|
373
373
|
"isolated-research:claude": 2852,
|
|
374
374
|
"isolated-research:codex": 2790,
|
|
@@ -95,7 +95,7 @@ export async function main(): Promise<void> {
|
|
|
95
95
|
trace("record", "complete", launch.processes);
|
|
96
96
|
|
|
97
97
|
trace("lifecycle", "start");
|
|
98
|
-
const lifecycle = captureLifecycleBoundaries(prepared, request, context.systemPromptAppend);
|
|
98
|
+
const lifecycle = (await captureLifecycleBoundaries(prepared, request, context.systemPromptAppend));
|
|
99
99
|
lifecycle.boundaries.spawn.launch = { command: launch.command, argv: launch.argv, cwd: launch.cwd };
|
|
100
100
|
trace("lifecycle", "complete", lifecycle.boundaries);
|
|
101
101
|
|
|
@@ -22,11 +22,11 @@ export async function fixtureStartupMatrix(): Promise<ContextInventory[]> {
|
|
|
22
22
|
cpSync(join(import.meta.dir, "fixtures/project"), cwd, { recursive: true });
|
|
23
23
|
mkdirSync(join(cwd, ".git"));
|
|
24
24
|
initDb(":memory:");
|
|
25
|
-
seedHarnessHost(cwd);
|
|
26
|
-
seedMemory(cwd, { scenario: { id: "startup-inventory", cwd, profile: "worker", provider: "codex", now: 1_700_000_000_000, boundaries: [], fixtures: { memory: [
|
|
25
|
+
(await seedHarnessHost(cwd));
|
|
26
|
+
(await seedMemory(cwd, { scenario: { id: "startup-inventory", cwd, profile: "worker", provider: "codex", now: 1_700_000_000_000, boundaries: [], fixtures: { memory: [
|
|
27
27
|
{ id: "manual", cell: "project", title: "Harness project manual", body: "HARNESS_PROJECT_MANUAL_RULE", inject: "pinned" },
|
|
28
28
|
{ id: "indexed", cell: "project", title: "Harness indexed rule", body: "HARNESS_INDEXED_BODY_IS_NOT_RESIDENT", inject: "indexed" },
|
|
29
|
-
] } }, options: { mcp: "fixture-only" } });
|
|
29
|
+
] } }, options: { mcp: "fixture-only" } }));
|
|
30
30
|
return await startupContextInventory(cwd);
|
|
31
31
|
} finally {
|
|
32
32
|
await flushRelayEvents();
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { updateCommandAsync, createCommandAsync } from "../../commands-write";
|
|
2
|
+
import { upsertAgentAsync } from "../../db/agents-async";
|
|
3
|
+
import { listCommands } from "../../commands-db";
|
|
2
4
|
import { getManifest } from "@humwick/providers";
|
|
3
|
-
|
|
5
|
+
|
|
4
6
|
import { enqueueMemoryInjectionAfterContextCommand, sweepMissedMemoryInjections } from "../../memory-injection";
|
|
5
7
|
import { parseMemorySeam } from "../../memory-seam";
|
|
6
8
|
import { enqueueStartupContextInjectionAfterContextCommand } from "../../startup-context-injection";
|
|
@@ -32,9 +34,9 @@ function capabilities(provider: "claude" | "codex"): ProviderCapabilities {
|
|
|
32
34
|
lastUpdatedAt: 1,
|
|
33
35
|
};
|
|
34
36
|
}
|
|
35
|
-
function registerCapturedAgent(prepared: PreparedProvisioningSpawn, request: ProvisioningDriverRequest): AgentCard {
|
|
37
|
+
async function registerCapturedAgent(prepared: PreparedProvisioningSpawn, request: ProvisioningDriverRequest): Promise<AgentCard> {
|
|
36
38
|
const params = prepared.command.params;
|
|
37
|
-
return
|
|
39
|
+
return (await upsertAgentAsync({
|
|
38
40
|
id: String(params.agentId),
|
|
39
41
|
name: `Harness ${request.scenario.profile}`,
|
|
40
42
|
kind: "provider",
|
|
@@ -49,7 +51,7 @@ function registerCapturedAgent(prepared: PreparedProvisioningSpawn, request: Pro
|
|
|
49
51
|
spawnRequestId: String(params.spawnRequestId),
|
|
50
52
|
approvalMode: "open",
|
|
51
53
|
},
|
|
52
|
-
});
|
|
54
|
+
}));
|
|
53
55
|
}
|
|
54
56
|
|
|
55
57
|
function injectionRows(command: Command): Array<{ reason: string; content: string }> {
|
|
@@ -71,18 +73,18 @@ const BOUNDARY_SETTLE_ERROR: Record<Exclude<BoundarySettleStatus, "succeeded">,
|
|
|
71
73
|
timed_out: "command timed out",
|
|
72
74
|
};
|
|
73
75
|
|
|
74
|
-
function contextBoundary(
|
|
76
|
+
async function contextBoundary(
|
|
75
77
|
type: "agent.clearContext" | "agent.compact",
|
|
76
78
|
agent: AgentCard,
|
|
77
79
|
request: ProvisioningDriverRequest,
|
|
78
|
-
): { capture: BoundaryCapture; commands: Command[] } {
|
|
80
|
+
): Promise<{ capture: BoundaryCapture; commands: Command[] }> {
|
|
79
81
|
const boundary: SettleableBoundary = type === "agent.clearContext" ? "clear" : "compact";
|
|
80
82
|
const continuation = [
|
|
81
83
|
`You have been resumed by Agent Relay — provisioning harness ${boundary}.`,
|
|
82
84
|
`Objective: ${request.scenario.fixtures?.continuation?.objective ?? "validate effective provisioning"}.`,
|
|
83
85
|
`Working state: ${request.scenario.fixtures?.continuation?.workingState ?? "capture boundary parity"}.`,
|
|
84
86
|
].join("\n\n");
|
|
85
|
-
const command =
|
|
87
|
+
const command = (await createCommandAsync({
|
|
86
88
|
type,
|
|
87
89
|
source: "system",
|
|
88
90
|
target: agent.id,
|
|
@@ -95,16 +97,16 @@ function contextBoundary(
|
|
|
95
97
|
},
|
|
96
98
|
...(boundary === "compact" ? { instructions: continuation } : {}),
|
|
97
99
|
},
|
|
98
|
-
});
|
|
100
|
+
}));
|
|
99
101
|
// #2291 — the status the runner reported, NOT an assumed success. This line read
|
|
100
102
|
// `{ status: "succeeded" }` unconditionally, which is the single status under which every
|
|
101
103
|
// boundary re-delivery seam fires: the harness could not express the failure mode that dropped
|
|
102
104
|
// memory on 14 of one coordinator's 17 boundaries, so it never caught it.
|
|
103
105
|
const status = request.scenario.boundaryStatus?.[boundary] ?? "succeeded";
|
|
104
|
-
const settled =
|
|
106
|
+
const settled = (await updateCommandAsync(command.id, {
|
|
105
107
|
status,
|
|
106
108
|
...(status === "succeeded" ? {} : { error: BOUNDARY_SETTLE_ERROR[status] }),
|
|
107
|
-
})!;
|
|
109
|
+
}))!;
|
|
108
110
|
// #2293 — WHEN the reactive settle chain runs, modelled as the field runs it.
|
|
109
111
|
//
|
|
110
112
|
// `timed_out` is not a status any runner reports: the ONLY producer on a clear/compact is the DB
|
|
@@ -115,16 +117,16 @@ function contextBoundary(
|
|
|
115
117
|
// crash scenario (#1023 window 2: the relay died between persisting the status and enqueuing).
|
|
116
118
|
const crashed = request.scenario.boundarySettleCrash?.includes(boundary) === true;
|
|
117
119
|
if (!crashed && status !== "timed_out") {
|
|
118
|
-
enqueueContinuationInjectionAfterSelfResume(settled);
|
|
119
|
-
enqueueLifecycleIdentityInjectionAfterContextCommand(settled);
|
|
120
|
-
enqueueMemoryInjectionAfterContextCommand(settled, request.scenario.now);
|
|
121
|
-
enqueueStartupContextInjectionAfterContextCommand(settled, request.scenario.now);
|
|
120
|
+
(await enqueueContinuationInjectionAfterSelfResume(settled));
|
|
121
|
+
(await enqueueLifecycleIdentityInjectionAfterContextCommand(settled));
|
|
122
|
+
(await enqueueMemoryInjectionAfterContextCommand(settled, request.scenario.now));
|
|
123
|
+
(await enqueueStartupContextInjectionAfterContextCommand(settled, request.scenario.now));
|
|
122
124
|
}
|
|
123
125
|
// …and then the periodic backstops, which in the field run every REAP_INTERVAL_MS regardless.
|
|
124
126
|
// Running them on EVERY capture (not only the crashed ones) is deliberate: on the reactive
|
|
125
127
|
// captures they prove the sweeps do not double-inject against a settle that already ran.
|
|
126
|
-
sweepMissedContinuationInjections(request.scenario.now);
|
|
127
|
-
sweepMissedMemoryInjections(request.scenario.now);
|
|
128
|
+
(await sweepMissedContinuationInjections(request.scenario.now));
|
|
129
|
+
(await sweepMissedMemoryInjections(request.scenario.now));
|
|
128
130
|
const injections = injectionRows(settled);
|
|
129
131
|
const commands = [settled, ...listCommands({ target: agent.id, type: "agent.injectContext", limit: 100 }).filter((item) => item.correlationId === settled.id)];
|
|
130
132
|
return {
|
|
@@ -147,12 +149,12 @@ function preparedSeam(agent: AgentCard): BoundaryCapture["memorySeam"] {
|
|
|
147
149
|
return seam as BoundaryCapture["memorySeam"];
|
|
148
150
|
}
|
|
149
151
|
|
|
150
|
-
export function captureLifecycleBoundaries(
|
|
152
|
+
export async function captureLifecycleBoundaries(
|
|
151
153
|
prepared: PreparedProvisioningSpawn,
|
|
152
154
|
request: ProvisioningDriverRequest,
|
|
153
155
|
spawnSystemPromptAppend: string,
|
|
154
|
-
): { boundaries: Record<ContextBoundary, BoundaryCapture>; lifecycleCommands: Command[] } {
|
|
155
|
-
const agent = registerCapturedAgent(prepared, request);
|
|
156
|
+
): Promise<{ boundaries: Record<ContextBoundary, BoundaryCapture>; lifecycleCommands: Command[] }> {
|
|
157
|
+
const agent = (await registerCapturedAgent(prepared, request));
|
|
156
158
|
const restartParams = restartInstructionParamsForAgent(agent, {
|
|
157
159
|
spawnRequestId: String(agent.meta?.spawnRequestId),
|
|
158
160
|
cwd: request.scenario.cwd,
|
|
@@ -168,8 +170,8 @@ export function captureLifecycleBoundaries(
|
|
|
168
170
|
});
|
|
169
171
|
const restartArgs = assemblePreparedSpawnChain(restartPrepared);
|
|
170
172
|
const restartAppend = systemPromptAppendFromSpawnArgs(request.scenario.provider, restartArgs, restartPrepared.runnerConfig);
|
|
171
|
-
const clear = contextBoundary("agent.clearContext", agent, request);
|
|
172
|
-
const compact = contextBoundary("agent.compact", agent, request);
|
|
173
|
+
const clear = (await contextBoundary("agent.clearContext", agent, request));
|
|
174
|
+
const compact = (await contextBoundary("agent.compact", agent, request));
|
|
173
175
|
return {
|
|
174
176
|
boundaries: {
|
|
175
177
|
spawn: {
|