@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/sse-agent-status.ts
CHANGED
|
@@ -2,15 +2,23 @@ import { isRecord } from "@humwick/sdk";
|
|
|
2
2
|
|
|
3
3
|
const FULL_CARD_KEYS = ["name", "kind", "label", "tags", "systemTags", "instanceId", "epoch", "capabilities", "providerCapabilities"];
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
export interface AgentStatusChange {
|
|
6
|
+
previous?: number;
|
|
7
|
+
seq: number;
|
|
8
|
+
full: Record<string, unknown>;
|
|
9
|
+
delta: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Build once in source order; consumers need only the last sequence they received. */
|
|
6
13
|
export class AgentStatusDeltas {
|
|
7
|
-
private readonly agents = new Map<string, Map<string, string | undefined
|
|
14
|
+
private readonly agents = new Map<string, { seq: number; fields: Map<string, string | undefined> }>();
|
|
8
15
|
|
|
9
16
|
remove(id: string): void { this.agents.delete(id); }
|
|
10
17
|
|
|
11
|
-
project(data: Record<string, unknown
|
|
18
|
+
project(data: Record<string, unknown>, seq: number): AgentStatusChange {
|
|
12
19
|
const id = data.id as string;
|
|
13
|
-
const
|
|
20
|
+
const baseline = this.agents.get(id);
|
|
21
|
+
const previous = baseline?.fields;
|
|
14
22
|
const fields = new Map<string, string | undefined>();
|
|
15
23
|
const delta: Record<string, unknown> = { id, status: data.status, statusSeq: data.statusSeq, epoch: data.epoch };
|
|
16
24
|
for (const [key, value] of Object.entries(data)) {
|
|
@@ -29,7 +37,8 @@ export class AgentStatusDeltas {
|
|
|
29
37
|
}
|
|
30
38
|
}
|
|
31
39
|
if (data.status === "offline") this.remove(id);
|
|
32
|
-
else this.agents.set(id, fields);
|
|
33
|
-
return
|
|
40
|
+
else this.agents.set(id, { seq, fields });
|
|
41
|
+
return { previous: baseline?.seq, seq, full: data,
|
|
42
|
+
delta: !previous || FULL_CARD_KEYS.some((key) => previous.get(key) !== fields.get(key)) ? data : delta };
|
|
34
43
|
}
|
|
35
44
|
}
|
package/src/sse.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { sendMessageWithResultAsync } from "./db/message-send";
|
|
1
2
|
import { eventVisibleTo } from "./sse-visibility";
|
|
2
3
|
import { taskVisibleTo, memoizeViewerScope } from "./db/viewer-scope";
|
|
3
4
|
import { agentPrincipalSink } from "./db/agent-ownership";
|
|
4
|
-
import { getAgent, getMessage, getOperatorDecision, getOrchestrator, matchingDeliveryAgents, onWorkspaceChange,
|
|
5
|
+
import { getAgent, getMessage, getOperatorDecision, getOrchestrator, matchingDeliveryAgents, onWorkspaceChange, setChannelSubscriberProbe } from "./db";
|
|
5
6
|
import { hasReplayGap, type BusEvent } from "./bus-outbox";
|
|
6
7
|
import { replayEventsSliceAsync } from "./bus-outbox-async";
|
|
7
8
|
import { getFannedSeq } from "./sse-outbox-cursor";
|
|
@@ -14,10 +15,11 @@ import type { ActivityEvent, AgentCard, Message, RelayInjectionCategory, RelayNo
|
|
|
14
15
|
import { isHumanAgentId } from "@humwick/sdk";
|
|
15
16
|
import { messageVisibleTo, visibleMessages, type MessageViewer } from "./message-visibility";
|
|
16
17
|
import { emitNotificationCreated, notificationForMessage, notificationForDelivery } from "./dashboard-notifications";
|
|
17
|
-
import { AgentStatusDeltas } from "./sse-agent-status";
|
|
18
|
+
import { AgentStatusDeltas, type AgentStatusChange } from "./sse-agent-status";
|
|
19
|
+
import { getDbGeneration } from "./db/connection";
|
|
18
20
|
import { AgentStatusSubscribers, wantsAgentStatus } from "./transport-subscriptions";
|
|
19
21
|
import { withLoopFrameCapture } from "./loop-block-attribution";
|
|
20
|
-
import { recordEmitBytes } from "./hub-metrics";
|
|
22
|
+
import { framed, recordEmitBytes } from "./hub-metrics";
|
|
21
23
|
|
|
22
24
|
interface Connection {
|
|
23
25
|
id: string;
|
|
@@ -27,7 +29,8 @@ interface Connection {
|
|
|
27
29
|
queuedBytes: number;
|
|
28
30
|
/** Bytes ever enqueued on the controller; the replay pump measures its byte budget against it. */
|
|
29
31
|
writtenBytes: number;
|
|
30
|
-
statusDeltas?:
|
|
32
|
+
statusDeltas?: Map<string, number>;
|
|
33
|
+
replayDeltas?: AgentStatusDeltas;
|
|
31
34
|
// Pending backpressure re-check. Set when a stream crosses the byte floor; cleared
|
|
32
35
|
// once it drains or is closed after making no progress during the grace interval.
|
|
33
36
|
drainCheck?: Timer;
|
|
@@ -46,6 +49,8 @@ interface Connection {
|
|
|
46
49
|
const connections = new Map<string, Connection>();
|
|
47
50
|
const statusSubscribers = new AgentStatusSubscribers<Connection>("sse");
|
|
48
51
|
const encoder = new TextEncoder();
|
|
52
|
+
let sourceDeltas = new AgentStatusDeltas();
|
|
53
|
+
let statusGeneration = getDbGeneration();
|
|
49
54
|
|
|
50
55
|
const SSE_KEEPALIVE_MS = 15_000;
|
|
51
56
|
const SSE_RETRY_MS = 5_000;
|
|
@@ -65,7 +70,7 @@ subscribeRelayEvents((event) => {
|
|
|
65
70
|
fanoutBytes = 0;
|
|
66
71
|
withLoopFrameCapture(FANOUT_FRAME, () => fanout(event));
|
|
67
72
|
recordEmitBytes(event.type, fanoutBytes);
|
|
68
|
-
});
|
|
73
|
+
}, "sse.fanout");
|
|
69
74
|
|
|
70
75
|
function fanoutAgent(agentId: string, cache: Map<string, AgentCard | null>): AgentCard | null {
|
|
71
76
|
if (!cache.has(agentId)) cache.set(agentId, getAgent(agentId));
|
|
@@ -90,14 +95,14 @@ export function createSSEStream(agentId: string | null, lastEventId = 0, statusD
|
|
|
90
95
|
{
|
|
91
96
|
start(controller) {
|
|
92
97
|
connId = crypto.randomUUID();
|
|
93
|
-
const keepalive = setInterval(() => {
|
|
98
|
+
const keepalive = setInterval(framed("timer sse-keepalive", () => {
|
|
94
99
|
const conn = connections.get(connId);
|
|
95
100
|
if (!conn) return;
|
|
96
101
|
sendEncoded(conn, encoder.encode(": keepalive\n\n"));
|
|
97
|
-
}, SSE_KEEPALIVE_MS);
|
|
102
|
+
}), SSE_KEEPALIVE_MS);
|
|
98
103
|
|
|
99
104
|
connections.set(connId, { id: connId, agentId, controller, keepalive, queuedBytes: 0, writtenBytes: 0,
|
|
100
|
-
statusDeltas: statusDeltas ? new
|
|
105
|
+
statusDeltas: statusDeltas ? new Map() : undefined, viewer });
|
|
101
106
|
statusSubscribers.add(connections.get(connId)!);
|
|
102
107
|
|
|
103
108
|
const replay = replayPlan(lastEventId, agentId === null);
|
|
@@ -216,18 +221,34 @@ function sendDirect(conn: Connection, event: string, data: unknown, id?: number)
|
|
|
216
221
|
writeFrame(conn, sseFrame(event, data, id));
|
|
217
222
|
}
|
|
218
223
|
|
|
219
|
-
// #
|
|
220
|
-
// through it in the order the client receives it, so the per-connection delta baseline matches the client.
|
|
224
|
+
// #3608 — share live deltas and encoded frames; select full/delta in client order even during replay.
|
|
221
225
|
function tracksStatus(conn: Connection, event: RelayEvent): boolean {
|
|
222
226
|
return conn.statusDeltas !== undefined && (event.type === "agent.status" || event.type === "agent.removed");
|
|
223
227
|
}
|
|
224
228
|
|
|
229
|
+
// An ephemeral frame carries no `id:` line: it must not move the client's Last-Event-ID resume cursor.
|
|
230
|
+
function frameId(event: RelayEvent): number | undefined {
|
|
231
|
+
return event.ephemeral ? undefined : event.seq;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Ephemeral events all carry seq 0, so they take a unique negative baseline token: two live-only
|
|
235
|
+
// frames must never look like the same client-visible state.
|
|
236
|
+
let ephemeralStatusToken = 0;
|
|
237
|
+
|
|
225
238
|
// Reads `conn.statusDeltas` when called, not when queued: a replay.gap swaps in a fresh baseline.
|
|
226
|
-
function
|
|
227
|
-
const
|
|
228
|
-
|
|
229
|
-
deltas.
|
|
230
|
-
|
|
239
|
+
function prepareStatusFrame(event: RelayEvent, deltas: AgentStatusDeltas, full = sseFrame(event.type, event.data, frameId(event))) {
|
|
240
|
+
const id = event.data.id as string;
|
|
241
|
+
const token = event.ephemeral ? --ephemeralStatusToken : event.seq;
|
|
242
|
+
const change: AgentStatusChange | undefined = event.type === "agent.status" ? deltas.project(event.data, token) : undefined;
|
|
243
|
+
if (!change) deltas.remove(id);
|
|
244
|
+
let delta: Uint8Array | undefined;
|
|
245
|
+
return (conn: Connection): Uint8Array => {
|
|
246
|
+
const previous = conn.statusDeltas!.get(id);
|
|
247
|
+
if (event.data.status === "offline" || !change) conn.statusDeltas!.delete(id);
|
|
248
|
+
else conn.statusDeltas!.set(id, token);
|
|
249
|
+
return change && previous !== undefined && previous === change.previous
|
|
250
|
+
? (delta ??= change.delta === change.full ? full : sseFrame(event.type, change.delta, frameId(event))) : full;
|
|
251
|
+
};
|
|
231
252
|
}
|
|
232
253
|
|
|
233
254
|
function flushPendingLive(conn: Connection): void {
|
|
@@ -282,14 +303,17 @@ function fanout(event: RelayEvent): void {
|
|
|
282
303
|
sendTaskChanged(event.data as unknown as Task, event.type, event.seq);
|
|
283
304
|
return;
|
|
284
305
|
}
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
306
|
+
const chunk = sseFrame(event.type, event.data, frameId(event));
|
|
307
|
+
if (statusGeneration !== getDbGeneration()) {
|
|
308
|
+
sourceDeltas = new AgentStatusDeltas();
|
|
309
|
+
statusGeneration = getDbGeneration();
|
|
310
|
+
}
|
|
311
|
+
const status = event.type === "agent.status" || event.type === "agent.removed" ? prepareStatusFrame(event, sourceDeltas, chunk) : undefined;
|
|
288
312
|
const recipients = event.type === "agent.status" ? statusSubscribers.forEvent(event.subject, event.data.id) : connections.values();
|
|
289
313
|
const visible = memoizeViewerScope((viewer) => eventVisibleTo(viewer, event));
|
|
290
314
|
for (const conn of recipients) {
|
|
291
315
|
if (!visible(conn.viewer)) continue;
|
|
292
|
-
sendEncoded(conn, chunk,
|
|
316
|
+
sendEncoded(conn, chunk, conn.statusDeltas && status ? () => status(conn) : undefined);
|
|
293
317
|
}
|
|
294
318
|
}
|
|
295
319
|
|
|
@@ -394,9 +418,9 @@ interface RelayInjectionTimelineInput {
|
|
|
394
418
|
idempotencyKey?: string;
|
|
395
419
|
}
|
|
396
420
|
|
|
397
|
-
export function emitRelayInjectionEvent(input: RelayInjectionTimelineInput): Message {
|
|
421
|
+
export async function emitRelayInjectionEvent(input: RelayInjectionTimelineInput): Promise<Message> {
|
|
398
422
|
const timestamp = input.timestamp ?? Date.now();
|
|
399
|
-
const result =
|
|
423
|
+
const result = (await sendMessageWithResultAsync({
|
|
400
424
|
from: input.source ?? input.agentId,
|
|
401
425
|
to: input.source ? input.agentId : agentPrincipalSink(input.agentId),
|
|
402
426
|
kind: "session",
|
|
@@ -416,7 +440,7 @@ export function emitRelayInjectionEvent(input: RelayInjectionTimelineInput): Mes
|
|
|
416
440
|
},
|
|
417
441
|
},
|
|
418
442
|
},
|
|
419
|
-
});
|
|
443
|
+
}));
|
|
420
444
|
if (result.created || result.updated) emitNewMessage(result.message);
|
|
421
445
|
return result.message;
|
|
422
446
|
}
|
|
@@ -561,7 +585,7 @@ async function pumpReplay(connId: string, plan: ReplayPlan): Promise<void> {
|
|
|
561
585
|
// The client's REST reload covers everything up to the ceiling; the buffered live tail follows.
|
|
562
586
|
// That reload brings full cards, so restart the delta baseline as a fresh connection would.
|
|
563
587
|
sendDirect(conn, "replay.gap", { since: plan.since }, ceiling);
|
|
564
|
-
|
|
588
|
+
conn.statusDeltas?.clear();
|
|
565
589
|
break;
|
|
566
590
|
}
|
|
567
591
|
if (!slice.truncated) break;
|
|
@@ -570,6 +594,7 @@ async function pumpReplay(connId: string, plan: ReplayPlan): Promise<void> {
|
|
|
570
594
|
drained = true;
|
|
571
595
|
} finally {
|
|
572
596
|
conn.replaying = false;
|
|
597
|
+
conn.replayDeltas = undefined;
|
|
573
598
|
// Only flush into a still-open controller — a cancelled connection was already removed from
|
|
574
599
|
// `connections` (and stopped receiving anything into `pendingLive` the moment it was removed,
|
|
575
600
|
// since fanout only iterates live map entries), so there is nothing left to deliver.
|
|
@@ -615,7 +640,7 @@ function sendReplayEvent(conn: Connection, event: RelayEvent, agentCache: Map<st
|
|
|
615
640
|
return;
|
|
616
641
|
}
|
|
617
642
|
if (tracksStatus(conn, event)) {
|
|
618
|
-
writeFrame(conn,
|
|
643
|
+
writeFrame(conn, prepareStatusFrame(event, conn.replayDeltas ??= new AgentStatusDeltas())(conn));
|
|
619
644
|
return;
|
|
620
645
|
}
|
|
621
646
|
sendDirect(conn, event.type, event.data, event.seq);
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { setConfigAsync } from "./config-store-write";
|
|
2
|
+
import { createCommandAsync } from "./commands-write";
|
|
1
3
|
import { contextInjectUnsupported, launchContextIsUserMessage, launchContextSurvivesCompact, launchSystemPromptAppend } from "./context-injection-channel";
|
|
2
4
|
import { stripAgentCore } from "@humwick/sdk/prompt-template-defaults";
|
|
3
5
|
import { renderAgentCore } from "./agent-core";
|
|
@@ -26,10 +28,10 @@ import { renderAgentCore } from "./agent-core";
|
|
|
26
28
|
// inputs are gathered by the shared `resolveAgentSpawnInstructionInputs` (spawn-instruction-
|
|
27
29
|
// inputs.ts), the same resolver the restart projection uses, so the two cannot drift.
|
|
28
30
|
//
|
|
29
|
-
// • DELTA-GATED AT COMPACT. A
|
|
30
|
-
// block is skipped (hashed; launch prompt read
|
|
31
|
-
// seam). No skip when launch text rides user messages (OpenCode family, Codex:
|
|
32
|
-
// drops them)
|
|
31
|
+
// • DELTA-GATED AT CLEAR AND COMPACT. A persistent system prompt survives both a native compact
|
|
32
|
+
// and a /clear, so an unchanged block is skipped (hashed; launch prompt read, like the memory
|
|
33
|
+
// seam; #3782). No skip when launch text rides user messages (OpenCode family, Codex:
|
|
34
|
+
// compaction drops them). Re-injects on persistent-system-prompt providers strip the
|
|
33
35
|
// core (their context re-delivers it); the rest re-injects.
|
|
34
36
|
//
|
|
35
37
|
// PROVIDER-AGNOSTIC: delivery is an `agent.injectContext` command (declared `context.inject`); a
|
|
@@ -38,15 +40,14 @@ import { renderAgentCore } from "./agent-core";
|
|
|
38
40
|
|
|
39
41
|
import { createHash } from "node:crypto";
|
|
40
42
|
import { errMessage, isRelayInjectionCategory, stringValue } from "@humwick/sdk";
|
|
41
|
-
import {
|
|
43
|
+
import { findLaunchPromptCommandForAgent } from "./commands-db";
|
|
42
44
|
import { emitCommandEvent } from "./command-events";
|
|
43
45
|
import { REAP_INTERVAL_MS } from "./config";
|
|
44
|
-
import { getConfig
|
|
46
|
+
import { getConfig } from "./config-store";
|
|
45
47
|
import { agentPrincipalUserId, findMessageByIdempotencyKey, getAgent } from "./db";
|
|
46
48
|
import { resolveCanonicalHost } from "./host-identity";
|
|
47
49
|
import { memorySeamForAgent } from "./memory-seam";
|
|
48
|
-
import {
|
|
49
|
-
import { composeSpawnInstructionsWithEvents, stripHumwickIdentitySection, type ComposedSpawnInstructions } from "./project-instructions";
|
|
50
|
+
import { composeSpawnInstructionsWithEvents, stripRelayOwnedSections, type ComposedSpawnInstructions } from "./project-instructions";
|
|
50
51
|
import { resolveAgentSpawnInstructionInputs } from "./services/spawn-instruction-inputs";
|
|
51
52
|
import { INJECTION_SWEEP_BACKLOG_INTERVAL_MS, pacedInjectionSweep } from "./injection-sweep-pacing";
|
|
52
53
|
import { isSqliteBusyError } from "./db/connection";
|
|
@@ -106,8 +107,8 @@ export function readStartupContextInjectionState(agentId: string): StartupContex
|
|
|
106
107
|
return getConfig<StartupContextInjectionState>(STARTUP_CONTEXT_NAMESPACE, agentId)?.value ?? null;
|
|
107
108
|
}
|
|
108
109
|
|
|
109
|
-
export function recordStartupContextInjectionState(agentId: string, state: StartupContextInjectionState): void {
|
|
110
|
-
|
|
110
|
+
export async function recordStartupContextInjectionState(agentId: string, state: StartupContextInjectionState): Promise<void> {
|
|
111
|
+
(await setConfigAsync(STARTUP_CONTEXT_NAMESPACE, agentId, state, "startup-context-injection"));
|
|
111
112
|
}
|
|
112
113
|
|
|
113
114
|
/** #2171 — the machine this agent runs on, named the way the spawn named it (see the call site).
|
|
@@ -132,6 +133,7 @@ export function composeStartupContextForAgent(agent: AgentCard): ComposedSpawnIn
|
|
|
132
133
|
if (!inputs) return null;
|
|
133
134
|
const landGatesHost = landGatesHostForAgent(agent);
|
|
134
135
|
return composeSpawnInstructionsWithEvents({
|
|
136
|
+
projectId: memorySeamForAgent(agent).identity.projectId,
|
|
135
137
|
...(inputs.cwd ? { cwd: inputs.cwd } : {}),
|
|
136
138
|
// #2171 — the validation block belongs to the machine this agent runs on. This seam is
|
|
137
139
|
// synchronous (it settles a lifecycle command), so for a remote host it serves what that host's
|
|
@@ -162,12 +164,14 @@ export function composeStartupContextForAgent(agent: AgentCard): ComposedSpawnIn
|
|
|
162
164
|
* A prior inject rode the summarized transcript, so the recorded delivery hash proves delivery,
|
|
163
165
|
* not survival — trusting it lets a summarized-away block skip forever. The launch prompt rode
|
|
164
166
|
* the preserved system prompt, so only it proves the block is still there. Unresolvable ⇒ null
|
|
165
|
-
* ⇒ re-inject, never skip. (Mirrors launchBakedMemoryHash/launchBakedJournalHash.)
|
|
167
|
+
* ⇒ re-inject, never skip. (Mirrors launchBakedMemoryHash/launchBakedJournalHash.) The strip must
|
|
168
|
+
* remove EVERY relay-owned section (identity, memory, journal): a leftover journal block made this
|
|
169
|
+
* hash never match a real coordinator launch, so every /clear re-injected the full charter (#3782).
|
|
166
170
|
*/
|
|
167
171
|
function launchBakedStartupHash(agent: AgentCard): string | null {
|
|
168
172
|
const prompt = launchSystemPromptAppend(findLaunchPromptCommandForAgent(agent.id, stringValue(agent.meta?.spawnRequestId)));
|
|
169
173
|
if (!prompt) return null;
|
|
170
|
-
const portion = normalizeStartupBlock(
|
|
174
|
+
const portion = normalizeStartupBlock(stripRelayOwnedSections(prompt));
|
|
171
175
|
return portion ? startupBlockHash(portion) : null;
|
|
172
176
|
}
|
|
173
177
|
|
|
@@ -179,7 +183,7 @@ function launchBakedStartupHash(agent: AgentCard): string | null {
|
|
|
179
183
|
* outcome (unchanged block, provider cannot inject, nothing composable, nothing to inject), always
|
|
180
184
|
* reported in a `relay-injection` event rather than inferred from silence.
|
|
181
185
|
*/
|
|
182
|
-
export function enqueueStartupContextInjectionAfterContextCommand(command: Command, now: number = Date.now()): Command | null {
|
|
186
|
+
export async function enqueueStartupContextInjectionAfterContextCommand(command: Command, now: number = Date.now()): Promise<Command | null> {
|
|
183
187
|
// A lifecycle command's status is the runner's confirmation verdict, not proof that the
|
|
184
188
|
// destructive boundary did not happen. In particular, a clear-inject that cannot confirm its
|
|
185
189
|
// `/clear` may have committed and is deliberately settled failed so the continuation beside this
|
|
@@ -196,28 +200,29 @@ export function enqueueStartupContextInjectionAfterContextCommand(command: Comma
|
|
|
196
200
|
const composed = composeStartupContextForAgent(agent);
|
|
197
201
|
|
|
198
202
|
if (contextInjectUnsupported(agent)) {
|
|
199
|
-
emitStartupSkip(agent, event, "inject-unsupported", command, now);
|
|
203
|
+
(await emitStartupSkip(agent, event, "inject-unsupported", command, now));
|
|
200
204
|
return null;
|
|
201
205
|
}
|
|
202
206
|
if (!composed) {
|
|
203
207
|
// No profile prompt to recompose (not a spawn provider). Reported once so an operator can tell
|
|
204
208
|
// it apart from a broken seam.
|
|
205
|
-
emitStartupSkip(agent, event, "not-composable", command, now);
|
|
209
|
+
(await emitStartupSkip(agent, event, "not-composable", command, now));
|
|
206
210
|
return null;
|
|
207
211
|
}
|
|
208
212
|
|
|
209
213
|
const block = composed.systemPromptAppend?.trim() ? composed.systemPromptAppend : "";
|
|
210
214
|
const hash = startupBlockHash(block);
|
|
211
215
|
if (!block) {
|
|
212
|
-
emitStartupSkip(agent, event, "nothing-to-inject", command, now);
|
|
216
|
+
(await emitStartupSkip(agent, event, "nothing-to-inject", command, now));
|
|
213
217
|
return null;
|
|
214
218
|
}
|
|
215
219
|
|
|
216
|
-
//
|
|
217
|
-
//
|
|
218
|
-
//
|
|
219
|
-
|
|
220
|
-
|
|
220
|
+
// #3782 — a persistent system prompt (Claude's --append-system-prompt) survives BOTH a native
|
|
221
|
+
// compact and a /clear, so a block still equal to the launch-baked one is already above: skip.
|
|
222
|
+
// A changed charter (hash differs), an unresolvable launch prompt, or a provider whose launch
|
|
223
|
+
// text rides summarizable parts / user messages (OpenCode, Codex) re-injects at either boundary.
|
|
224
|
+
if (launchContextSurvivesCompact(agent) && launchBakedStartupHash(agent) === hash) {
|
|
225
|
+
(await emitStartupSkip(agent, event, "unchanged", command, now));
|
|
221
226
|
return null;
|
|
222
227
|
}
|
|
223
228
|
|
|
@@ -232,7 +237,7 @@ export function enqueueStartupContextInjectionAfterContextCommand(command: Comma
|
|
|
232
237
|
// Delivered WITH the superseding note; hashed and gated on the canonical block (note excluded), so
|
|
233
238
|
// the gate cannot loop.
|
|
234
239
|
const content = `${STARTUP_CONTEXT_SUPERSEDE_NOTICE}\n\n${injectBlock}`;
|
|
235
|
-
const inject =
|
|
240
|
+
const inject = (await createCommandAsync({
|
|
236
241
|
type: "agent.injectContext",
|
|
237
242
|
source: "system",
|
|
238
243
|
target: command.target,
|
|
@@ -251,13 +256,13 @@ export function enqueueStartupContextInjectionAfterContextCommand(command: Comma
|
|
|
251
256
|
...(command.type === "agent.clearContext" ? { afterClearCommandId: command.id } : { afterCompactCommandId: command.id }),
|
|
252
257
|
},
|
|
253
258
|
},
|
|
254
|
-
});
|
|
259
|
+
}));
|
|
255
260
|
emitCommandEvent(inject, "command.requested");
|
|
256
261
|
|
|
257
262
|
// Anti-lie: queueing a command is not injecting a charter. The detailed per-block "injected"
|
|
258
263
|
// events move to settleStartupContextInjectionCommand, where the runner has reported success.
|
|
259
264
|
// This one row makes pending work visible without claiming the provider has it already.
|
|
260
|
-
emitRelayInjectionEvent({
|
|
265
|
+
(await emitRelayInjectionEvent({
|
|
261
266
|
agentId: agent.id,
|
|
262
267
|
category: "context",
|
|
263
268
|
summary: `startup context re-injection queued after ${event}`,
|
|
@@ -272,7 +277,7 @@ export function enqueueStartupContextInjectionAfterContextCommand(command: Comma
|
|
|
272
277
|
},
|
|
273
278
|
timestamp: now,
|
|
274
279
|
idempotencyKey: `startup-context-injection-queued:${agent.id}:${inject.id}`,
|
|
275
|
-
});
|
|
280
|
+
}));
|
|
276
281
|
return inject;
|
|
277
282
|
}
|
|
278
283
|
|
|
@@ -282,45 +287,45 @@ export function enqueueStartupContextInjectionAfterContextCommand(command: Comma
|
|
|
282
287
|
* ownership and cwd→project resolution, so a throw here must NOT take the rest of the settle chain
|
|
283
288
|
* down with it; it is reported on the agent's timeline instead.
|
|
284
289
|
*/
|
|
285
|
-
export function settleStartupContextInjectionAfterContextCommand(command: Command, now: number = Date.now()): Command | null {
|
|
290
|
+
export async function settleStartupContextInjectionAfterContextCommand(command: Command, now: number = Date.now()): Promise<Command | null> {
|
|
286
291
|
try {
|
|
287
|
-
const inject = enqueueStartupContextInjectionAfterContextCommand(command, now);
|
|
288
|
-
settleStartupContextInjectionCommand(command, now);
|
|
292
|
+
const inject = (await enqueueStartupContextInjectionAfterContextCommand(command, now));
|
|
293
|
+
(await settleStartupContextInjectionCommand(command, now));
|
|
289
294
|
return inject;
|
|
290
295
|
} catch (error) {
|
|
291
|
-
emitRelayInjectionEvent({
|
|
296
|
+
(await emitRelayInjectionEvent({
|
|
292
297
|
agentId: command.target,
|
|
293
298
|
category: "context",
|
|
294
299
|
summary: `startup-context re-injection failed to compose after ${command.type === "agent.compact" ? "compact" : command.type === "agent.clearContext" ? "clear" : command.type}: ${errMessage(error)}`,
|
|
295
300
|
detail: { source: "startup-context", agentId: command.target, commandId: command.id, failed: true },
|
|
296
301
|
timestamp: now,
|
|
297
302
|
idempotencyKey: `startup-context-injection-error:${command.target}:${command.id}`,
|
|
298
|
-
});
|
|
303
|
+
}));
|
|
299
304
|
return null;
|
|
300
305
|
}
|
|
301
306
|
}
|
|
302
307
|
|
|
303
|
-
function emitStartupSkip(
|
|
308
|
+
async function emitStartupSkip(
|
|
304
309
|
agent: AgentCard,
|
|
305
310
|
event: StartupContextInjectionEvent,
|
|
306
311
|
skipped: StartupContextInjectionSkip,
|
|
307
312
|
command: Command,
|
|
308
313
|
now: number,
|
|
309
|
-
): void {
|
|
314
|
+
): Promise<void> {
|
|
310
315
|
const summaries: Record<StartupContextInjectionSkip, string> = {
|
|
311
316
|
unchanged: `startup context unchanged after ${event} — re-injection skipped`,
|
|
312
317
|
"inject-unsupported": `startup context NOT re-injected after ${event}: provider declares context.inject:false (spawn-time block only)`,
|
|
313
318
|
"nothing-to-inject": `startup context resolved nothing to inject after ${event}`,
|
|
314
319
|
"not-composable": `startup context not recomposable after ${event}: agent has no spawn-provider profile prompt`,
|
|
315
320
|
};
|
|
316
|
-
emitRelayInjectionEvent({
|
|
321
|
+
(await emitRelayInjectionEvent({
|
|
317
322
|
agentId: agent.id,
|
|
318
323
|
category: "context",
|
|
319
324
|
summary: summaries[skipped],
|
|
320
325
|
detail: { source: "startup-context", event, agentId: agent.id, skipped, commandId: command.id },
|
|
321
326
|
timestamp: now,
|
|
322
327
|
idempotencyKey: `startup-context-injection-skip:${agent.id}:${command.id}`,
|
|
323
|
-
});
|
|
328
|
+
}));
|
|
324
329
|
}
|
|
325
330
|
|
|
326
331
|
/**
|
|
@@ -330,7 +335,7 @@ function emitStartupSkip(
|
|
|
330
335
|
* Recording on success makes the gate self-healing — a failed delivery leaves the previous hash and
|
|
331
336
|
* the next boundary retries.
|
|
332
337
|
*/
|
|
333
|
-
export function settleStartupContextInjectionCommand(command: Command, now: number = Date.now()): void {
|
|
338
|
+
export async function settleStartupContextInjectionCommand(command: Command, now: number = Date.now()): Promise<void> {
|
|
334
339
|
if (command.type !== "agent.injectContext" || command.status !== "succeeded") return;
|
|
335
340
|
if (command.params.reason !== STARTUP_CONTEXT_INJECTION_REASON) return;
|
|
336
341
|
const startup = command.params.startupContext;
|
|
@@ -338,12 +343,12 @@ export function settleStartupContextInjectionCommand(command: Command, now: numb
|
|
|
338
343
|
const record = startup as Record<string, unknown>;
|
|
339
344
|
const hash = typeof record.hash === "string" ? record.hash : undefined;
|
|
340
345
|
if (hash === undefined) return;
|
|
341
|
-
recordStartupContextInjectionState(command.target, {
|
|
346
|
+
(await recordStartupContextInjectionState(command.target, {
|
|
342
347
|
hash,
|
|
343
348
|
event: record.event === "clear" ? "clear" : "compact",
|
|
344
349
|
at: now,
|
|
345
|
-
});
|
|
346
|
-
emitStartupContextDeliveredEvents(command, record, now);
|
|
350
|
+
}));
|
|
351
|
+
(await emitStartupContextDeliveredEvents(command, record, now));
|
|
347
352
|
}
|
|
348
353
|
|
|
349
354
|
/** Preserve only enough of the composition for the success-side audit event. The actual charter
|
|
@@ -378,12 +383,12 @@ function queuedStartupBlockEvents(record: Record<string, unknown>): Array<{ cate
|
|
|
378
383
|
});
|
|
379
384
|
}
|
|
380
385
|
|
|
381
|
-
function emitStartupContextDeliveredEvents(command: Command, record: Record<string, unknown>, now: number): void {
|
|
386
|
+
async function emitStartupContextDeliveredEvents(command: Command, record: Record<string, unknown>, now: number): Promise<void> {
|
|
382
387
|
const event: StartupContextInjectionEvent = record.event === "clear" ? "clear" : "compact";
|
|
383
388
|
const boundaryCommandId = stringValue(record.afterClearCommandId) ?? stringValue(record.afterCompactCommandId) ?? command.correlationId;
|
|
384
389
|
for (const [index, blockEvent] of queuedStartupBlockEvents(record).entries()) {
|
|
385
390
|
const source = stringValue(blockEvent.detail.source) ?? "startup-context";
|
|
386
|
-
emitRelayInjectionEvent({
|
|
391
|
+
(await emitRelayInjectionEvent({
|
|
387
392
|
agentId: command.target,
|
|
388
393
|
category: blockEvent.category,
|
|
389
394
|
summary: `re-injected after ${event}: ${blockEvent.summary}`,
|
|
@@ -396,26 +401,26 @@ function emitStartupContextDeliveredEvents(command: Command, record: Record<stri
|
|
|
396
401
|
},
|
|
397
402
|
timestamp: now,
|
|
398
403
|
idempotencyKey: `startup-context-injection-delivered:${command.target}:${command.id}:${source}:${index}`,
|
|
399
|
-
});
|
|
404
|
+
}));
|
|
400
405
|
}
|
|
401
406
|
}
|
|
402
407
|
|
|
403
408
|
/** A failed startup-context composer must not make a maintenance tick throw or block every later
|
|
404
409
|
* candidate. The reactive settle has the same containment in its public wrapper. */
|
|
405
|
-
function containedStartupContextInjection(command: Command, now: number): { inject: Command | null; composeFailed: boolean } {
|
|
410
|
+
async function containedStartupContextInjection(command: Command, now: number): Promise<{ inject: Command | null; composeFailed: boolean }> {
|
|
406
411
|
try {
|
|
407
|
-
return { inject: enqueueStartupContextInjectionAfterContextCommand(command, now), composeFailed: false };
|
|
412
|
+
return { inject: (await enqueueStartupContextInjectionAfterContextCommand(command, now)), composeFailed: false };
|
|
408
413
|
} catch (error) {
|
|
409
414
|
// #2712 — a held write lock is contention, not a compose failure: defer, never count it.
|
|
410
415
|
if (isSqliteBusyError(error)) throw error;
|
|
411
|
-
emitRelayInjectionEvent({
|
|
416
|
+
(await emitRelayInjectionEvent({
|
|
412
417
|
agentId: command.target,
|
|
413
418
|
category: "context",
|
|
414
419
|
summary: `startup-context re-injection failed to compose after ${command.type === "agent.compact" ? "compact" : "clear"}: ${errMessage(error)}`,
|
|
415
420
|
detail: { source: "startup-context", agentId: command.target, commandId: command.id, failed: true },
|
|
416
421
|
timestamp: now,
|
|
417
422
|
idempotencyKey: `startup-context-injection-error:${command.target}:${command.id}`,
|
|
418
|
-
});
|
|
423
|
+
}));
|
|
419
424
|
return { inject: null, composeFailed: true };
|
|
420
425
|
}
|
|
421
426
|
}
|
|
@@ -427,11 +432,11 @@ function containedStartupContextInjection(command: Command, now: number): { inje
|
|
|
427
432
|
* prompt's context; collapsing the two would silently strand the clear's charter recovery. The
|
|
428
433
|
* shared attempt ledger is keyed by boundary correlation id, so it is both the idempotency fence
|
|
429
434
|
* and the retry state — there is no second per-agent collapse to keep in sync with it. */
|
|
430
|
-
export function sweepMissedStartupContextInjections(now: number = Date.now(), signal?: AbortSignal): { enqueuedCommandIds: string[]; aborted?: true } {
|
|
435
|
+
export async function sweepMissedStartupContextInjections(now: number = Date.now(), signal?: AbortSignal): Promise<{ enqueuedCommandIds: string[]; aborted?: true }> {
|
|
431
436
|
const enqueuedCommandIds: string[] = [];
|
|
432
437
|
for (const command of sweepableBoundaryCommands(now, signal)) {
|
|
433
438
|
if (signal?.aborted) break;
|
|
434
|
-
sweepStartupBoundary(command, now, enqueuedCommandIds);
|
|
439
|
+
(await sweepStartupBoundary(command, now, enqueuedCommandIds));
|
|
435
440
|
}
|
|
436
441
|
return { enqueuedCommandIds, ...(signal?.aborted ? { aborted: true as const } : {}) };
|
|
437
442
|
}
|
|
@@ -440,24 +445,24 @@ export function sweepMissedStartupContextInjections(now: number = Date.now(), si
|
|
|
440
445
|
* macrotask each. */
|
|
441
446
|
async function sweepMissedStartupContextInjectionsPaced(now: number, signal?: AbortSignal): Promise<{ enqueuedCommandIds: string[]; aborted?: true; moreWork?: true }> {
|
|
442
447
|
const enqueuedCommandIds: string[] = [];
|
|
443
|
-
const { moreWork } = await pacedInjectionSweep(() => sweepableBoundaryCommands(now, signal), (command) => sweepStartupBoundary(command, now, enqueuedCommandIds), signal);
|
|
448
|
+
const { moreWork } = await pacedInjectionSweep(() => sweepableBoundaryCommands(now, signal), async (command) => (await sweepStartupBoundary(command, now, enqueuedCommandIds)), signal);
|
|
444
449
|
return { enqueuedCommandIds, ...(signal?.aborted ? { aborted: true as const } : {}), ...(moreWork ? { moreWork: true as const } : {}) };
|
|
445
450
|
}
|
|
446
451
|
|
|
447
|
-
function sweepStartupBoundary(command: Command, now: number, enqueuedCommandIds: string[]): void {
|
|
452
|
+
async function sweepStartupBoundary(command: Command, now: number, enqueuedCommandIds: string[]): Promise<void> {
|
|
448
453
|
const { decision, attempts } = injectionAttemptDecision(command, STARTUP_CONTEXT_INJECTION_REASON);
|
|
449
454
|
if (decision === "in-flight") return;
|
|
450
455
|
if (decision === "exhausted") {
|
|
451
|
-
notifyStartupContextInjectionExhausted(command, attempts, now);
|
|
456
|
+
(await notifyStartupContextInjectionExhausted(command, attempts, now));
|
|
452
457
|
return;
|
|
453
458
|
}
|
|
454
459
|
if (attempts === 0 && (startupSweepAlreadyDecided(command) || startupBoundaryAlreadyDecided(command))) return;
|
|
455
|
-
const { inject, composeFailed } = containedStartupContextInjection(command, now);
|
|
460
|
+
const { inject, composeFailed } = (await containedStartupContextInjection(command, now));
|
|
456
461
|
if (inject) {
|
|
457
462
|
enqueuedCommandIds.push(inject.id);
|
|
458
463
|
return;
|
|
459
464
|
}
|
|
460
|
-
rememberStartupSweepDecision(command, composeFailed, now);
|
|
465
|
+
(await rememberStartupSweepDecision(command, composeFailed, now));
|
|
461
466
|
}
|
|
462
467
|
|
|
463
468
|
/**
|
|
@@ -476,32 +481,32 @@ function startupSweepAlreadyDecided(command: Command): boolean {
|
|
|
476
481
|
return sweptStartupBoundaryDecisions.get(command.id)?.done ?? false;
|
|
477
482
|
}
|
|
478
483
|
|
|
479
|
-
function rememberStartupSweepDecision(command: Command, composeFailed: boolean, now: number): void {
|
|
484
|
+
async function rememberStartupSweepDecision(command: Command, composeFailed: boolean, now: number): Promise<void> {
|
|
480
485
|
const held = sweptStartupBoundaryDecisions.get(command.id);
|
|
481
486
|
const composeFailures = (held?.composeFailures ?? 0) + (composeFailed ? 1 : 0);
|
|
482
487
|
const done = !composeFailed || composeFailures >= MAX_INJECTION_ATTEMPTS;
|
|
483
488
|
if (sweptStartupBoundaryDecisions.size >= MAX_SWEPT_STARTUP_DECISIONS && !held) sweptStartupBoundaryDecisions.clear();
|
|
484
489
|
sweptStartupBoundaryDecisions.set(command.id, { composeFailures, done });
|
|
485
|
-
if (composeFailed && done) notifyStartupContextInjectionExhausted(command, composeFailures, now, "compose");
|
|
490
|
+
if (composeFailed && done) (await notifyStartupContextInjectionExhausted(command, composeFailures, now, "compose"));
|
|
486
491
|
}
|
|
487
492
|
|
|
488
493
|
function startupBoundaryAlreadyDecided(command: Command): boolean {
|
|
489
494
|
return findMessageByIdempotencyKey(command.target, `startup-context-injection-skip:${command.target}:${command.id}`) !== null;
|
|
490
495
|
}
|
|
491
496
|
|
|
492
|
-
function notifyStartupContextInjectionExhausted(command: Command, attempts: number, now: number, kind: "delivery" | "compose" = "delivery"): void {
|
|
497
|
+
async function notifyStartupContextInjectionExhausted(command: Command, attempts: number, now: number, kind: "delivery" | "compose" = "delivery"): Promise<void> {
|
|
493
498
|
const idempotencyKey = `startup-context-injection-exhausted${kind === "compose" ? "-compose" : ""}:${command.target}:${command.id}`;
|
|
494
499
|
if (findMessageByIdempotencyKey(command.target, idempotencyKey)) return;
|
|
495
500
|
const event = command.type === "agent.compact" ? "compact" : "clear";
|
|
496
501
|
const what = kind === "compose" ? "failed to compose" : "could not be delivered";
|
|
497
|
-
emitRelayInjectionEvent({
|
|
502
|
+
(await emitRelayInjectionEvent({
|
|
498
503
|
agentId: command.target,
|
|
499
504
|
category: "context",
|
|
500
505
|
summary: `startup-context re-injection gave up after ${attempts} attempt(s) at a ${event} boundary — it ${what}, so this agent may be running without its current profile charter`,
|
|
501
506
|
detail: { source: "startup-context", agentId: command.target, commandId: command.id, event, attempts, exhausted: kind },
|
|
502
507
|
timestamp: now,
|
|
503
508
|
idempotencyKey,
|
|
504
|
-
});
|
|
509
|
+
}));
|
|
505
510
|
}
|
|
506
511
|
|
|
507
512
|
export const STARTUP_CONTEXT_INJECTION_SWEEP_JOB = {
|