@humwick/server 0.130.2 → 0.130.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled/prompts/manifest.json +1 -0
- package/bundled/prompts/task.hydration.md +1 -1
- package/bundled/roles/builder.md +1 -1
- package/docs/guides/sub-coordinators.md +12 -5
- package/docs/guides/tools-coordination.md +1 -0
- package/docs/guides/workflows.md +16 -0
- package/docs/openapi.json +175 -4
- package/package.json +8 -7
- package/public/assets/{MessageBubble-BWLqMGKG.js → MessageBubble-BOkmEvgZ.js} +2 -2
- package/public/assets/{PlanGraphPanel-3TlIQpjk.js → PlanGraphPanel-BkaDJp0r.js} +2 -2
- package/public/assets/{TraceView-Wimm0Czv.js → TraceView-B99Uu2yT.js} +2 -2
- package/public/assets/{VaultDecisionCard-Bau_vNax.js → VaultDecisionCard-DUIfTTFF.js} +2 -2
- package/public/assets/{activity-CrSurn-r.js → activity-ZIX0N1El.js} +2 -2
- package/public/assets/{agent-lineage-CknAJKcb.js → agent-lineage-kq9TPYFw.js} +2 -2
- package/public/assets/agent-liveness-DSQY1Aa_.js +2 -0
- package/public/assets/{agent-name-DKbiIhBo.js → agent-name-C_7F4DFR.js} +2 -2
- package/public/assets/{agent-profiles-DwF6EQ4R.js → agent-profiles-BNOcrGcY.js} +2 -2
- package/public/assets/{agent-project-badge-Diz4Sjjb.js → agent-project-badge-B6yAh70a.js} +2 -2
- package/public/assets/{agent-tools-CRhpRQza.js → agent-tools-CcrhmOzF.js} +2 -2
- package/public/assets/{agent-type-icon-LrUEU3lB.js → agent-type-icon-CXSLrKiq.js} +2 -2
- package/public/assets/{agents-B-v66C-4.js → agents-DIZG97_X.js} +2 -2
- package/public/assets/{analytics-BqCb-LKi.js → analytics-rasmoPjR.js} +2 -2
- package/public/assets/{artifact-viewer-kf4pGuAR.js → artifact-viewer-tBpTrEPb.js} +2 -2
- package/public/assets/{artifacts-DJevXcvg.js → artifacts-BNkrynP1.js} +2 -2
- package/public/assets/{artifacts-D32zyw4Y.js → artifacts-Bjq-ZyBA.js} +2 -2
- package/public/assets/{automation-BpRajx_5.js → automation-Cx422L3L.js} +2 -2
- package/public/assets/{backlog-D_UjTdzX.js → backlog-RuFQ8PUu.js} +2 -2
- package/public/assets/{busy-health-N3VEh4ao.js → busy-health-BvNQ9g5x.js} +2 -2
- package/public/assets/{channels-9jopungq.js → channels-DNbKAS0I.js} +2 -2
- package/public/assets/{chat-CSXrTB3C.js → chat-Bp3Fx73h.js} +3 -3
- package/public/assets/{code-preview-p1NnmqK0.js → code-preview-KIRZA6cz.js} +2 -2
- package/public/assets/{connectors-CZdqlDNL.js → connectors-k7vO4vvc.js} +2 -2
- package/public/assets/{cosmos-BgdsE4dG.js → cosmos-BuVoq1aw.js} +2 -2
- package/public/assets/{crate-agent-30aXTKva.js → crate-agent-irqlt4NH.js} +2 -2
- package/public/assets/{dependency-graph-B_jvw2GE.js → dependency-graph-D_rurNBz.js} +2 -2
- package/public/assets/{deploys-DoN6bAb5.js → deploys-yzZqIpxE.js} +2 -2
- package/public/assets/{display-BrKWFGJz.js → display-BemJG1f_.js} +2 -2
- package/public/assets/{files-D6XEu8Ng.js → files-DXWcrxOz.js} +2 -2
- package/public/assets/{fleet-C7jQWbw2.js → fleet-TEuOCZXE.js} +2 -2
- package/public/assets/{fleet-metrics-BiDs3MLx.js → fleet-metrics-BGoDAFI-.js} +2 -2
- package/public/assets/{formatted-body-impl-DyG0WsQS.js → formatted-body-impl-BB9eq9nN.js} +2 -2
- package/public/assets/{formatted-body-CQBwc1fb.js → formatted-body-qy2nTD_1.js} +3 -3
- package/public/assets/{host-providers-dialog-DKaW31dN.js → host-providers-dialog-BGPHxuwT.js} +2 -2
- package/public/assets/{index-CRHep3M9.js → index-BC5XZc0z.js} +5 -5
- package/public/assets/{index-MYAIwYTX.css → index-D8Rp9pz2.css} +1 -1
- package/public/assets/{insights-CzrtkpOE.js → insights-C-KQG0h-.js} +2 -2
- package/public/assets/{integrations-aVsUmigt.js → integrations-ClPRPyKU.js} +2 -2
- package/public/assets/{issue-ref-chip-BnSlM_95.js → issue-ref-chip-DbH8J9Ak.js} +2 -2
- package/public/assets/{log-viewer-qe7Ee47Z.js → log-viewer-PH4zVn24.js} +2 -2
- package/public/assets/{maintenance-NfjqFZAk.js → maintenance-5lV43uTL.js} +2 -2
- package/public/assets/{managed-agents-BiH0HgaE.js → managed-agents-BdgU35aX.js} +2 -2
- package/public/assets/{markdown-preview-BixaT3Xr.js → markdown-preview-DNT4OUwQ.js} +3 -3
- package/public/assets/{markdown-preview-impl-DNGlWIS3.js → markdown-preview-impl-CnCcPy0A.js} +2 -2
- package/public/assets/{memory-DNsCl6UX.js → memory--GgWH1gH.js} +2 -2
- package/public/assets/{messages-DopU1L1X.js → messages-CzFl_97O.js} +2 -2
- package/public/assets/{orchestrators-Cq7ckLQT.js → orchestrators-CVvJVkzv.js} +2 -2
- package/public/assets/overview-DsrZvE86.js +2 -0
- package/public/assets/{pairs-DE_m6rrE.js → pairs-D2d0d2py.js} +2 -2
- package/public/assets/{profile-icon-B3rfh77F.js → profile-icon-_SMuSbYF.js} +2 -2
- package/public/assets/{project-profile-instructions-DQWZE0kA.js → project-profile-instructions-Apn15y43.js} +2 -2
- package/public/assets/{projects-Br2Bd2h1.js → projects-D3B6kto5.js} +2 -2
- package/public/assets/{prompt-settings-BKvFsvGD.js → prompt-settings-DnPB6Ez6.js} +2 -2
- package/public/assets/provider-display-bWwiuedV.js +2 -0
- package/public/assets/{registry-Cw38_6gW.js → registry-D790cIhN.js} +2 -2
- package/public/assets/run-card-BCro-Odj.js +2 -0
- package/public/assets/{secrets-DxI-vzSq.js → secrets-CVXvfvbU.js} +2 -2
- package/public/assets/{service-access-settings-D9s_VJbd.js → service-access-settings-D3Xxqb9w.js} +2 -2
- package/public/assets/{settings-CKZTVGIx.js → settings-CoUC7Jci.js} +2 -2
- package/public/assets/shipping-D_Lp9n_J.js +2 -0
- package/public/assets/{stats-DyUBKyWI.js → stats-CXiNjB9S.js} +2 -2
- package/public/assets/{status-dot-DYqlEUhJ.js → status-dot-C703YIy1.js} +2 -2
- package/public/assets/store-BgDALGIX.js +9 -0
- package/public/assets/{tasks-Bh7Chr4-.js → tasks-DO0WpJCx.js} +2 -2
- package/public/assets/{teams-bowI7qVY.js → teams-FGkdi_tL.js} +2 -2
- package/public/assets/{terminal-viewer-BgVLHdsU.js → terminal-viewer-Dh8dSC7e.js} +3 -3
- package/public/assets/{terminal-viewer-impl-Dz22UPy6.js → terminal-viewer-impl-B5Zriip3.js} +2 -2
- package/public/assets/{use-agent-terminal-DSQQ-iY7.js → use-agent-terminal-CRUVDvLC.js} +2 -2
- package/public/assets/{use-decisions-samMQhQf.js → use-decisions-CoaqRh4l.js} +2 -2
- package/public/assets/{use-project-list-59LheVP7.js → use-project-list-X-BgT53X.js} +2 -2
- package/public/assets/{use-selectors-BZa25xEB.js → use-selectors-0X_UZkk-.js} +2 -2
- package/public/assets/{user-avatar-DHxlvUvV.js → user-avatar-CkLhVBGu.js} +2 -2
- package/public/assets/{versioned-prompt-editor-BmED5DnJ.js → versioned-prompt-editor-BkTi7eim.js} +2 -2
- package/public/assets/{work-queue-CSvpuNLz.js → work-queue-DDOLEyKo.js} +2 -2
- package/public/assets/{workflow-marker-DAZcj5qt.js → workflow-marker-CzOsB8BM.js} +2 -2
- package/public/assets/{workflows-DdmxRSyg.js → workflows-DJilvmRM.js} +2 -2
- package/public/assets/{workspaces-BxeKfVuF.js → workspaces-CHcfbLR3.js} +2 -2
- package/public/cosmos.html +4 -4
- package/public/index.html +29 -29
- package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/runner/src/adapters/claude-api.ts +1 -1
- package/runner/src/adapters/claude-headless.ts +1 -1
- package/runner/src/adapters/claude-launch-exit.ts +26 -0
- package/runner/src/adapters/claude-session-probe.ts +1 -1
- package/runner/src/adapters/claude-tmux.ts +38 -10
- package/runner/src/adapters/claude.ts +28 -75
- package/runner/src/adapters/provider-quota-harvest.ts +20 -71
- package/runner/src/agent-runner/lifecycle-milestones.ts +2 -2
- package/runner/src/agent-runner/liveness-exchange.ts +104 -0
- package/runner/src/claude-system-prompt.ts +49 -0
- package/runner/src/launch-assembly.ts +14 -10
- package/runner/src/profile-home.ts +1 -1
- package/runner/src/project-instructions.ts +2 -2
- package/runner/src/provider-command.ts +18 -0
- package/runner/src/provider-setup.ts +3 -2
- package/runner/src/runner-core.ts +14 -15
- package/runner/src/runner-helpers.ts +0 -8
- package/runner/src/session-scratch.ts +6 -2
- package/runner/test-support/provisioning-context.ts +4 -2
- package/runner/test-support/runner-harness.ts +2 -1
- package/scripts/steward-policy-cleanup.ts +2 -2
- package/src/agent-authz.ts +2 -2
- package/src/agent-drive-arbiter.ts +3 -8
- package/src/agent-exit-cleanup-async.ts +2 -2
- package/src/agent-exit-cleanup.ts +23 -19
- package/src/agent-lifecycle-events.ts +112 -85
- package/src/agent-ref.ts +3 -2
- package/src/agent-status-events.ts +43 -14
- package/src/auth/login-link.ts +35 -0
- package/src/auth/password.ts +4 -3
- package/src/auth/session-refresh.ts +1 -1
- package/src/auth/session.test-fixture.ts +2 -2
- package/src/auth/session.ts +7 -7
- package/src/automations/crud.ts +8 -81
- package/src/automations/dispatch.ts +33 -58
- package/src/automations/index.ts +1 -1
- package/src/automations/persistence.ts +65 -0
- package/src/automations/precheck.ts +18 -16
- package/src/automations/read-async.ts +11 -0
- package/src/automations/reconcile.ts +30 -39
- package/src/automations/storage.ts +33 -10
- package/src/automations/write-async.ts +33 -0
- package/src/branch-land-notice.ts +3 -3
- package/src/branch-landed.ts +25 -23
- package/src/bus.ts +21 -19
- package/src/cd-deploy-notify.ts +2 -2
- package/src/ci/notifications.ts +4 -4
- package/src/ci/root-missing.ts +3 -3
- package/src/ci/transition-notify.ts +5 -5
- package/src/claude-app/oauth-http.ts +3 -3
- package/src/cli/index.ts +7 -1
- package/src/cli/init.ts +53 -0
- package/src/cli/orchestrator.ts +1 -7
- package/src/cli/setup.ts +6 -4
- package/src/cli/workflow.ts +12 -3
- package/src/commands-db.ts +4 -4
- package/src/commands-write.ts +8 -0
- package/src/compaction-watch.ts +10 -8
- package/src/config-store-write.ts +2 -2
- package/src/config.ts +4 -11
- package/src/connectors.ts +10 -8
- package/src/context-advisory.ts +22 -21
- package/src/db/agent-action-write.ts +36 -0
- package/src/db/agent-control-async.ts +9 -0
- package/src/db/agent-control-write.ts +49 -0
- package/src/db/agent-effort-observe.ts +22 -0
- package/src/db/agent-meta.ts +14 -3
- package/src/db/agents-async.ts +8 -5
- package/src/db/agents.ts +15 -12
- package/src/db/auth-identities.ts +2 -2
- package/src/db/automation-read-ops.ts +11 -0
- package/src/db/automation-write-ops.ts +46 -0
- package/src/db/blackboard.ts +2 -2
- package/src/db/browser-session-write.ts +32 -0
- package/src/db/bus-outbox-write-ops.ts +3 -1
- package/src/db/checkout-refresh-schema.ts +47 -0
- package/src/db/checkout-refresh.ts +5 -5
- package/src/db/command-agent-profile-backfill.ts +39 -0
- package/src/db/command-agent-profiles.ts +5 -1
- package/src/db/command-retention.ts +126 -0
- package/src/db/commands-planner-stats.test-fixture.ts +8 -0
- package/src/db/commands-read-ops.ts +16 -0
- package/src/db/connection.ts +1 -182
- package/src/db/context-carry-write.ts +74 -0
- package/src/db/continuations.ts +4 -4
- package/src/db/db-error-registry.ts +12 -0
- package/src/db/gateway.ts +26 -133
- package/src/db/history-retention-ops.ts +13 -0
- package/src/db/inbox-async.ts +2 -2
- package/src/db/inbox-read-ops.ts +1 -1
- package/src/db/inbox.ts +9 -3
- package/src/db/issue-associations.ts +2 -2
- package/src/db/issue-refs-async.ts +4 -1
- package/src/db/issue-refs-read-ops.ts +6 -0
- package/src/db/issue-refs.ts +8 -8
- package/src/db/kernel-event-log-schema.ts +2 -0
- package/src/db/land-boundaries.ts +51 -5
- package/src/db/land-gate-attestations.ts +2 -2
- package/src/db/landing-receipts.ts +2 -2
- package/src/db/lifecycle-context-write.ts +5 -0
- package/src/db/lifecycle-tail-async.ts +76 -0
- package/src/db/lifecycle-tail-write-ops.ts +62 -0
- package/src/db/lifecycle-write-window.ts +2 -1
- package/src/db/lineage-pair-dedupe-sql.ts +3 -3
- package/src/db/main-connection-mode.ts +11 -0
- package/src/db/main-connection-writes.ts +20 -2
- package/src/db/maintenance-job-runs-async.ts +2 -2
- package/src/db/maintenance-job-write-ops.ts +1 -1
- package/src/db/maintenance-pauses.ts +2 -2
- package/src/db/message-send.ts +4 -0
- package/src/db/messages.ts +31 -25
- package/src/db/migrations.ts +18 -1
- package/src/db/notification-write-ops.ts +19 -0
- package/src/db/operator-answer-write.ts +19 -0
- package/src/db/orchestrators.ts +10 -4
- package/src/db/pairs-async.ts +22 -1
- package/src/db/pairs-write-ops.ts +8 -3
- package/src/db/pairs.ts +41 -48
- package/src/db/plan-dispatch-schema.ts +5 -1
- package/src/db/plan-ready-notices.ts +43 -0
- package/src/db/plan-tools-include-migration.ts +36 -0
- package/src/db/plans-write-ops.ts +2 -0
- package/src/db/presence-buffer.ts +5 -0
- package/src/db/presence-loop.ts +18 -23
- package/src/db/presence-write.ts +0 -6
- package/src/db/project-entries-async.ts +14 -0
- package/src/db/project-entries-read-ops.ts +5 -1
- package/src/db/project-entries-write-ops.ts +8 -0
- package/src/db/project-entries.ts +15 -12
- package/src/db/project-journal.ts +2 -2
- package/src/db/project-trust-approvals.ts +2 -2
- package/src/db/prompt-templates.ts +4 -4
- package/src/db/read-op-marshaling-fixtures.ts +18 -0
- package/src/db/read-ops.ts +4 -0
- package/src/db/retention.ts +13 -2
- package/src/db/review-publish-write.ts +8 -0
- package/src/db/runtime-admin-async.ts +19 -0
- package/src/db/runtime-admin-write-ops.ts +36 -0
- package/src/db/runtime-tail-async.ts +288 -0
- package/src/db/runtime-tail-write-ops.ts +97 -0
- package/src/db/schema.ts +4 -1
- package/src/db/spawn-budget.ts +5 -0
- package/src/db/spawn-delegation.ts +3 -12
- package/src/db/sql-audit-indexes.ts +3 -0
- package/src/db/stats-async.ts +5 -3
- package/src/db/task-entity.ts +5 -4
- package/src/db/team-claim-policy.ts +60 -0
- package/src/db/teams-async.ts +4 -0
- package/src/db/teams-write-ops.ts +4 -0
- package/src/db/terminal-events.ts +15 -0
- package/src/db/timer-cutover-bodies.ts +292 -0
- package/src/db/timer-cutover-core.ts +37 -278
- package/src/db/timer-cutover-state.ts +40 -0
- package/src/db/timer-cutover-write-ops.ts +1 -40
- package/src/db/token-db-write-ops.ts +2 -0
- package/src/db/token-standing-async.ts +12 -0
- package/src/db/token-standing.ts +6 -9
- package/src/db/token-usage-retention.ts +33 -0
- package/src/db/token-usage-write-ops.ts +1 -1
- package/src/db/token-usage.ts +4 -1
- package/src/db/user-invites-async.ts +13 -0
- package/src/db/user-invites.ts +3 -3
- package/src/db/users.ts +14 -6
- package/src/db/workflow-execution.ts +3 -3
- package/src/db/workspaces.ts +8 -5
- package/src/db/write-ops.ts +31 -12
- package/src/db/writer-fault-seam.ts +2 -9
- package/src/db/writer-fault-test-ops.ts +18 -0
- package/src/db/writer-gateway.ts +42 -46
- package/src/dev.ts +12 -16
- package/src/event-loop-lag.ts +4 -2
- package/src/event-loop-yield.ts +2 -2
- package/src/events.ts +10 -8
- package/src/host-provider-store.ts +5 -4
- package/src/hub-metrics-report.ts +5 -1
- package/src/hub-metrics.ts +38 -18
- package/src/init.ts +299 -0
- package/src/injection-sweep-pacing.ts +6 -8
- package/src/invite-link.ts +16 -9
- package/src/land-gate-notifications.ts +11 -10
- package/src/land-gate-queue-progress.ts +3 -3
- package/src/land-settle-dispatch.ts +52 -92
- package/src/lifecycle-context-pressure.ts +11 -10
- package/src/lifecycle-manager.ts +104 -98
- package/src/maintenance/breaker.ts +18 -16
- package/src/maintenance/checkout-refresh.ts +18 -1
- package/src/maintenance/critical-job-watchdog.ts +3 -3
- package/src/maintenance/events.ts +3 -3
- package/src/maintenance/history-retention-job.ts +30 -0
- package/src/maintenance/jobs.ts +29 -67
- package/src/maintenance/long-running-work.ts +3 -1
- package/src/maintenance/offline-agent-prune-job.ts +28 -0
- package/src/maintenance/orphaned-sessions.ts +5 -4
- package/src/maintenance/pauses.ts +4 -10
- package/src/maintenance/plan-ready-notice-job.ts +71 -0
- package/src/maintenance/scheduler.ts +18 -13
- package/src/maintenance/stalled-delivery-pager.ts +4 -4
- package/src/maintenance/teams.ts +19 -30
- package/src/maintenance/workspaces.ts +17 -27
- package/src/managed-policy-escalation.ts +7 -7
- package/src/managed-policy.ts +3 -3
- package/src/managed-provider-gate.ts +5 -4
- package/src/managed-spawn-reservation.ts +5 -4
- package/src/mcp/index.ts +8 -8
- package/src/mcp/output-descriptions.ts +1 -1
- package/src/mcp/presentation.ts +2 -1
- package/src/mcp/runtime-output.ts +6 -1
- package/src/mcp/self-care-visibility.ts +2 -2
- package/src/mcp/spawn-targets-matrix.ts +10 -1
- package/src/mcp/tool-groups.ts +3 -2
- package/src/mcp/tool-roles.ts +81 -0
- package/src/mcp/tools-workspace.ts +1 -1
- package/src/mcp-blackboard-tools.ts +6 -5
- package/src/mcp-decision-tools.ts +7 -7
- package/src/mcp-egress-tools.ts +10 -9
- package/src/mcp-issue-activity-tools.ts +2 -2
- package/src/mcp-issue-association-tools.ts +4 -4
- package/src/mcp-issue-ref-tools.ts +3 -3
- package/src/mcp-merge-tools.ts +5 -5
- package/src/mcp-notification-subscription-tools.ts +14 -15
- package/src/mcp-output-levels.test-fixture.ts +1 -1
- package/src/mcp-profile-trust-tools.ts +1 -1
- package/src/mcp-project-journal-tools.ts +4 -12
- package/src/mcp-project-tools.ts +17 -18
- package/src/mcp-routing-policy-tools.ts +3 -2
- package/src/mcp-team-tools.ts +6 -6
- package/src/mcp-workflow-tools.ts +5 -3
- package/src/memory-area-injection.ts +13 -12
- package/src/memory-boundary-capture.ts +6 -6
- package/src/memory-injection.ts +45 -43
- package/src/merge-pause-maintenance.ts +5 -4
- package/src/notification-router.ts +44 -17
- package/src/notify.ts +5 -5
- package/src/observed-reset-refresh.ts +4 -4
- package/src/operator-alarm.ts +2 -5
- package/src/project-ingest.ts +6 -6
- package/src/project-instructions.ts +8 -1
- package/src/project-trust.ts +12 -11
- package/src/prompt-resolver.ts +3 -3
- package/src/provider-quota-async.ts +5 -7
- package/src/provider-timeline-event.ts +4 -7
- package/src/quota-band-delivery.ts +2 -2
- package/src/recipe-runner.ts +4 -3
- package/src/retention-config-store.ts +4 -3
- package/src/reviewer-pipeline.ts +11 -10
- package/src/routes/_route.ts +4 -4
- package/src/routes/_shared.ts +13 -12
- package/src/routes/agent-effort.ts +5 -5
- package/src/routes/agent-heartbeat-quota.ts +23 -0
- package/src/routes/agent-keep.ts +1 -1
- package/src/routes/agent-reporting.ts +1 -1
- package/src/routes/agent-self-effort.ts +5 -5
- package/src/routes/agent-sessions.ts +24 -24
- package/src/routes/agents-spawn.ts +1 -1
- package/src/routes/agents.ts +17 -119
- package/src/routes/auth.ts +44 -17
- package/src/routes/authority-audit.ts +2 -2
- package/src/routes/automations.ts +6 -5
- package/src/routes/channel-binding-delete.ts +1 -1
- package/src/routes/channel-output.ts +3 -3
- package/src/routes/claude-api-budget.ts +5 -5
- package/src/routes/commands-listing.ts +1 -1
- package/src/routes/commands.ts +29 -27
- package/src/routes/context-resets.ts +2 -2
- package/src/routes/coordinator-teams.ts +1 -1
- package/src/routes/decisions.ts +2 -2
- package/src/routes/host-providers.ts +18 -0
- 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 +7 -3
- package/src/routes/integrations.ts +9 -7
- package/src/routes/issue-activity.ts +2 -2
- package/src/routes/issue-associations.ts +4 -4
- package/src/routes/issue-refs.ts +3 -3
- package/src/routes/kernel-timers-operator.ts +1 -1
- package/src/routes/memory.ts +1 -1
- package/src/routes/merges.ts +11 -11
- package/src/routes/messages.ts +23 -17
- package/src/routes/orchestrator-bootstrap.ts +3 -1
- package/src/routes/orchestrator-host-registration.ts +2 -0
- package/src/routes/orchestrator-host-utilization.ts +2 -2
- package/src/routes/orchestrator-proxy.ts +2 -2
- package/src/routes/orchestrator.ts +27 -18
- package/src/routes/pairs.ts +8 -8
- package/src/routes/project-profile-instructions.ts +1 -1
- package/src/routes/project-trust.ts +1 -1
- package/src/routes/projects.ts +16 -16
- package/src/routes/prompt-templates.ts +12 -12
- package/src/routes/provider-quotas.ts +10 -10
- package/src/routes/run-command.ts +1 -1
- package/src/routes/secrets-backup.ts +4 -5
- package/src/routes/secrets-import.ts +3 -4
- package/src/routes/secrets-vault.ts +12 -14
- package/src/routes/settings.ts +1 -1
- package/src/routes/shipping.ts +9 -1
- package/src/routes/spawn-policy.ts +8 -7
- package/src/routes/sse.ts +2 -2
- package/src/routes/team-templates.ts +7 -7
- package/src/routes/teams.ts +10 -10
- package/src/routes/tokens.ts +18 -17
- package/src/routes/users.ts +24 -24
- package/src/routes/viewer-read.ts +3 -3
- package/src/routes/web-tool-calls.ts +4 -4
- package/src/routes/workflows.ts +2 -2
- package/src/routes/workspaces.ts +17 -16
- package/src/routing-policy-push.ts +6 -6
- package/src/runtime-grant.ts +17 -11
- package/src/runtime-install.ts +30 -0
- package/src/runtime-tokens.ts +20 -28
- package/src/secrets-broker/config.ts +1 -1
- package/src/secrets-broker/service.ts +2 -2
- package/src/security.ts +3 -1
- package/src/self-resume-carry.ts +21 -110
- package/src/self-resume-supersede.ts +4 -3
- package/src/self-resume.ts +54 -66
- package/src/server-background.ts +1 -1
- package/src/server.ts +25 -26
- 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/auth-context.ts +6 -0
- package/src/services/browser-inventory.ts +3 -3
- package/src/services/browser-session-state.ts +3 -2
- package/src/services/browser-session.ts +21 -27
- package/src/services/bus-command-update.ts +9 -9
- package/src/services/checkout-refresh-state.ts +1 -0
- package/src/services/checkout-refresh.test-fixture.ts +3 -2
- package/src/services/command-host.ts +7 -2
- package/src/services/coordinator-digest.ts +3 -2
- package/src/services/dispatch-command.ts +12 -13
- package/src/services/effective-launch-driver.ts +14 -9
- package/src/services/host-changed-paths.test-fixture.ts +5 -6
- package/src/services/host-project-readiness.ts +2 -2
- package/src/services/host-providers.ts +1 -1
- package/src/services/host-utilization.ts +9 -9
- package/src/services/idle-agent-digest.ts +17 -12
- package/src/services/idle-epics.ts +4 -4
- package/src/services/interrupt-agent.ts +12 -9
- package/src/services/issue-activity.ts +3 -3
- package/src/services/issue-associations.ts +15 -18
- package/src/services/issue-lifecycle-comments.ts +3 -2
- package/src/services/issue-lifecycle.ts +14 -13
- package/src/services/issue-refs.ts +4 -5
- package/src/services/kernel-timers-cutover-chaos-worker.ts +1 -1
- package/src/services/kernel-timers-ingress-chaos-worker.ts +6 -1
- package/src/services/kernel-timers-ingress.ts +3 -3
- package/src/services/kernel-timers-message-authority-chaos-worker.ts +3 -10
- package/src/services/kernel-timers-operator-chaos-worker.ts +3 -2
- package/src/services/kernel-timers-outbox.ts +1 -1
- package/src/services/kernel-timers-stage10-operator.ts +1 -1
- package/src/services/kernel-timers.ts +4 -3
- package/src/services/land-gate-placement.ts +11 -2
- package/src/services/land-issue-relations.ts +5 -4
- package/src/services/land-restart-retry.ts +7 -6
- package/src/services/landed-ancestry.ts +6 -5
- package/src/services/legacy-landing-host.ts +4 -1
- package/src/services/legacy-landing-recovery.ts +8 -6
- package/src/services/managed-running.ts +17 -17
- package/src/services/memory-areas.ts +3 -3
- package/src/services/merge-pause.ts +9 -15
- package/src/services/operator-decisions.ts +37 -41
- package/src/services/orchestrator-registration-recovery.ts +6 -2
- package/src/services/orchestrator-upgrade.ts +14 -12
- package/src/services/permission-decision.ts +4 -3
- package/src/services/plan-ci-notice.ts +1 -1
- package/src/services/plan-conformance.ts +4 -4
- package/src/services/plan-dispatch-policy.ts +10 -3
- package/src/services/plan-dispatch.ts +35 -14
- package/src/services/plan-graph.ts +39 -261
- package/src/services/plan-import.ts +1 -1
- package/src/services/plan-live-bindings.ts +8 -37
- package/src/services/plan-task-create.ts +1 -1
- package/src/services/plan-terminal-refs.ts +2 -12
- package/src/services/plan-wake-digest.ts +8 -3
- package/src/services/profile-trust.ts +2 -2
- package/src/services/project.ts +11 -10
- package/src/services/prompt-templates.ts +6 -5
- package/src/services/provider-api-key.ts +73 -0
- package/src/services/provider-hold-nudge.ts +9 -9
- package/src/services/provider-hold-record.ts +13 -12
- package/src/services/provider-state-audit.ts +19 -18
- package/src/services/provisioning-harness/driver.ts +1 -1
- package/src/services/provisioning-harness/fixture-matrix.ts +3 -3
- package/src/services/provisioning-harness/lifecycle.ts +24 -22
- package/src/services/provisioning-harness/prepare.ts +16 -17
- package/src/services/rate-limit-resume.ts +10 -9
- package/src/services/red-main-auto-revert.ts +7 -5
- package/src/services/red-main-controller-deps.ts +20 -3
- package/src/services/red-main-incident.ts +3 -1
- package/src/services/red-main-quarantine.ts +2 -3
- package/src/services/register-agent.ts +22 -22
- package/src/services/restart-project-role.ts +1 -1
- package/src/services/restart-spawn.ts +17 -16
- package/src/services/review-publish.ts +7 -24
- package/src/services/review-ref-reconcile.ts +29 -38
- package/src/services/runtime-dependency-alert.ts +27 -0
- package/src/services/scheduler-command.ts +11 -9
- package/src/services/scheduler.ts +5 -5
- package/src/services/self-effort-grant.ts +5 -25
- package/src/services/send-message.ts +16 -33
- package/src/services/shutdown-agent.ts +17 -14
- package/src/services/spawn-agent.ts +12 -41
- package/src/services/spawn-chain-inspector.ts +1 -1
- package/src/services/spawn-cwd-placement.ts +21 -5
- package/src/services/spawn-issue-activity.ts +8 -6
- package/src/services/spawn-launch.ts +17 -1
- package/src/services/spawn-loss-escalation.ts +1 -1
- package/src/services/spawn-registration-watchdog.ts +2 -2
- package/src/services/spawn-repo-probe.ts +7 -5
- package/src/services/spawn-tree-cleanup.ts +7 -8
- package/src/services/steward-reaper.ts +4 -4
- package/src/services/task-context-hydration.ts +25 -1
- package/src/services/task-delivery.ts +20 -34
- package/src/services/task-entity.ts +40 -203
- package/src/services/task-issue-link.ts +13 -20
- package/src/services/task-issue-weave.ts +12 -11
- package/src/services/task-lifecycle.ts +27 -31
- package/src/services/task-repo-cwd.ts +37 -0
- package/src/services/task-review-hold.ts +4 -17
- package/src/services/task-semantic-events.ts +13 -11
- package/src/services/task-state-reconcile.ts +3 -4
- package/src/services/task-validation.ts +2 -2
- package/src/services/team-templates.ts +5 -5
- package/src/services/team.ts +31 -98
- package/src/services/terminal-provider-exit.ts +6 -5
- package/src/services/timer-message-fire-chaos-worker.ts +7 -3
- package/src/services/timer-message-fire-outbox.ts +1 -1
- package/src/services/transient-agent-reaper.ts +22 -19
- package/src/services/turn-reconcile-audit.ts +9 -9
- package/src/services/user-onboarding.ts +8 -6
- package/src/services/user-profile.ts +6 -9
- package/src/services/work-finality.ts +16 -4
- package/src/services/workflow-auto-start.ts +2 -1
- package/src/services/workflow-caller.ts +61 -4
- package/src/services/workflow-child-proof-worker.ts +1 -1
- package/src/services/workflow-control-proof-worker.ts +1 -1
- package/src/services/workflow-coordinator.ts +8 -2
- package/src/services/workflow-decisions.ts +5 -5
- package/src/services/workflow-deferred-cleanup.ts +1 -1
- package/src/services/workflow-effect-driver.ts +42 -19
- package/src/services/workflow-effects.ts +41 -27
- package/src/services/workflow-pins.ts +7 -4
- package/src/services/workflow-reconcile.ts +1 -0
- package/src/services/workflow-resume-pins.ts +3 -3
- package/src/services/workflow-routing-defaults.ts +18 -0
- package/src/services/workflow-run-view.ts +4 -3
- package/src/services/workflow-run.test-fixture.ts +1 -1
- package/src/services/workflow-runs.ts +34 -22
- package/src/services/workflow-supervisor-state.ts +21 -1
- package/src/services/workflow-supervisor.ts +4 -3
- package/src/services/workspace-recovery.ts +4 -3
- package/src/setup.ts +47 -8
- package/src/spawn-admission.ts +10 -2
- package/src/spawn-placement.ts +27 -9
- package/src/spawn-targets.ts +8 -8
- package/src/sse-agent-status.ts +15 -6
- package/src/sse.ts +49 -24
- package/src/startup-context-injection.ts +61 -57
- package/src/steward-handoff.ts +4 -3
- package/src/steward-policy-cleanup.ts +9 -8
- package/src/steward.ts +2 -2
- package/src/task-dispatch-live.ts +5 -2
- package/src/task-dispatcher.ts +2 -2
- package/src/token-db.ts +2 -2
- package/src/token-usage-async.ts +2 -4
- package/src/user-awaiting-reply.ts +5 -5
- package/src/utils.ts +7 -0
- package/src/workspace-actions.ts +24 -29
- package/src/workspace-auto-merge.ts +14 -12
- package/src/workspace-changed-paths-client.ts +16 -5
- package/src/workspace-cleanup-stale.ts +30 -7
- package/src/workspace-command-settle.ts +24 -16
- package/src/workspace-config.ts +1 -1
- package/src/workspace-conflict-resolver.ts +9 -7
- package/src/workspace-dead-owner-recovery.ts +5 -4
- package/src/workspace-escalation.ts +12 -11
- package/src/workspace-human-escalation.ts +3 -3
- package/src/workspace-land-gate-watchdog.ts +3 -3
- package/src/workspace-land-refusal.ts +20 -0
- package/src/workspace-land-stopped.ts +1 -0
- package/src/workspace-merge.ts +10 -26
- package/src/workspace-nothing-to-land-notice.ts +2 -2
- package/src/workspace-orphans.ts +18 -37
- package/src/workspace-pr-completion.ts +10 -8
- package/src/workspace-rekey.ts +3 -3
- package/src/workspace-steward-failure.ts +2 -2
- package/src/workspace-steward-wake.ts +2 -2
- package/public/assets/agent-liveness-CaNwK0Zf.js +0 -2
- package/public/assets/overview-C1DCTzzV.js +0 -2
- package/public/assets/provider-display-DsuWMvVL.js +0 -2
- package/public/assets/run-card-CpKqRbhg.js +0 -2
- package/public/assets/shipping-B9YtnwtG.js +0 -2
- package/public/assets/store-DcClXLH0.js +0 -9
- package/runner/src/agent-runner/http-liveness.ts +0 -85
- package/src/db/on-loop-write-transaction.ts +0 -34
|
@@ -4,13 +4,14 @@ import { selectProviderConfigEnv } from "@humwick/sdk/child-env";
|
|
|
4
4
|
import type { ProviderAdapter, ProviderStatusEvent } from "./adapter";
|
|
5
5
|
import { logger } from "./logger";
|
|
6
6
|
import { hostSourcesFor } from "./host-asset-plan";
|
|
7
|
+
import { resolveLaunchCommand } from "./provider-command";
|
|
7
8
|
|
|
8
9
|
/** All real adapters share the managed-spawn login check, including replacements (#3751). */
|
|
9
10
|
export function withProviderSetup(adapter: ProviderAdapter): ProviderAdapter {
|
|
10
11
|
const spawn = adapter.spawn.bind(adapter);
|
|
11
12
|
adapter.spawn = async (config) => {
|
|
12
13
|
const env = selectProviderConfigEnv(config.providerConfig.env, hostSourcesFor(config).settings);
|
|
13
|
-
const auth = await checkProviderAuth(config.provider, undefined, env, config.providerConfig.command);
|
|
14
|
+
const auth = await checkProviderAuth(config.provider, undefined, env, resolveLaunchCommand(config.providerConfig.command), config.env);
|
|
14
15
|
if (!auth.ok) throw new Error(auth.reason);
|
|
15
16
|
return spawn(config);
|
|
16
17
|
};
|
|
@@ -21,7 +22,7 @@ export function providerStartupFailure(error: unknown): ProviderStatusEvent {
|
|
|
21
22
|
const message = `Provider startup failed: ${errMessage(error)}`;
|
|
22
23
|
return { status: "error", reason: "provider-turn", providerState: {
|
|
23
24
|
state: "blocked", terminal: true, reason: "providerSetupRequired", label: "Provider setup required", message,
|
|
24
|
-
recommendedAction: "
|
|
25
|
+
recommendedAction: "Resolve the provider startup failure shown above, then restart the runner.",
|
|
25
26
|
} };
|
|
26
27
|
}
|
|
27
28
|
|
|
@@ -11,7 +11,7 @@ import { PromptCommands, promptOrigin } from "./agent-runner/commands/prompt";
|
|
|
11
11
|
import type { NativeSelfResumeHandoff } from "./native-self-resume";
|
|
12
12
|
import { LifecyclePhase } from "./agent-runner/lifecycle-phase";
|
|
13
13
|
import { startRunnerMcpProxy, runnerWebToolLog, runnerWebSearch, runnerMcpHiddenTools } from "./runner-mcp-proxy";
|
|
14
|
-
import {
|
|
14
|
+
import { LivenessExchange } from "./agent-runner/liveness-exchange";
|
|
15
15
|
import { TaskClaims } from "./agent-runner/task-claims";
|
|
16
16
|
import { TurnReport } from "./agent-runner/turn-report";
|
|
17
17
|
import { SessionMirror } from "./agent-runner/session-mirror";
|
|
@@ -22,7 +22,7 @@ import { hostname } from "node:os";
|
|
|
22
22
|
import { resolveEnvLayers, selectProviderConfigEnv } from "@humwick/sdk/child-env";
|
|
23
23
|
import { createHash } from "node:crypto";
|
|
24
24
|
import { join } from "node:path";
|
|
25
|
-
import { type ContextState, type Message, type ProviderState, HELD_FOR_PAYLOAD_KEY, PROVIDER_SUBMIT_UNCONFIRMED, PROXY_AUTH_HOLD_KIND, errMessage, frameSuppressedFromTurn, stringValue } from "@humwick/sdk";
|
|
25
|
+
import { type ContextState, type Message, type ProviderState, HELD_FOR_PAYLOAD_KEY, PROVIDER_SUBMIT_UNCONFIRMED, PROXY_AUTH_HOLD_KIND, errMessage, frameSuppressedFromTurn, relayBusUrl, stringValue } from "@humwick/sdk";
|
|
26
26
|
import { exitRunner } from "./runner-exit";
|
|
27
27
|
import { isResumeWake, ProviderHoldEpisodes } from "./provider-hold";
|
|
28
28
|
import { contextStateFromProbeMetrics, quotaStateFromProbeMetrics } from "@humwick/sdk/context-probe";
|
|
@@ -88,7 +88,6 @@ import {
|
|
|
88
88
|
providerMonitorUnavailableMessage,
|
|
89
89
|
providerStateFromActiveWork,
|
|
90
90
|
registerWithinDeadline,
|
|
91
|
-
relayBusUrl,
|
|
92
91
|
runnerAgentStatus,
|
|
93
92
|
runnerBusErrorAction,
|
|
94
93
|
runnerMessageMatches,
|
|
@@ -218,7 +217,7 @@ export class AgentRunner {
|
|
|
218
217
|
private terminalProviderExit?: Record<string, unknown>;
|
|
219
218
|
private nativeSelfResume = new NativeSelfResumeTracker();
|
|
220
219
|
private readonly registration: Registration;
|
|
221
|
-
private readonly
|
|
220
|
+
private readonly liveness: LivenessExchange;
|
|
222
221
|
private readonly taskClaims: TaskClaims;
|
|
223
222
|
private delivering = false;
|
|
224
223
|
private drainTimer?: Timer;
|
|
@@ -367,7 +366,7 @@ export class AgentRunner {
|
|
|
367
366
|
disposeEmptyTurns: () => this.emptyTurns.dispose(), resetEmptyTurns: () => this.emptyTurns.reset(), resetLateClearRecovery: () => { this.lateClearRecovery.reset(); this.continuationFence.reset(); },
|
|
368
367
|
clearLifecycleAction: () => this.lifecycle.setLifecycleAction(undefined), setOffline: () => this.claims.setTerminalStatus("offline"), publishStatus: () => this.publishStatus(),
|
|
369
368
|
stopDrainTimer: () => { if (this.drainTimer) clearTimeout(this.drainTimer); this.drainTimer = undefined; }, stopSubmitRecoveryPoll: () => this.stopSubmitRecoveryPoll(),
|
|
370
|
-
stopTaskClaims: () => this.taskClaims.stop(),
|
|
369
|
+
stopTaskClaims: () => this.taskClaims.stop(), stopLiveness: () => this.liveness.stop(), stopCredentials: () => this.credentials.stop(),
|
|
371
370
|
disarmBusyLivenessReconcile: () => this.disarmBusyLivenessReconcile(), disarmBusyReconciler: () => this.busyReconciler.disarm(),
|
|
372
371
|
disposeProviderInput: () => this.providerInput.dispose(), disposeParkPosts: () => this.parkPosts.dispose(),
|
|
373
372
|
stopReasoningTail: () => this.sessionMirror.stopReasoningTail(), clearNativeSessionCapture: () => this.sessionMirror.clearNativeSessionCapture(), stopObligationCache: () => this.obligationCache.stop(),
|
|
@@ -433,11 +432,11 @@ export class AgentRunner {
|
|
|
433
432
|
void this.proxy?.refreshTools().catch(() => {});
|
|
434
433
|
},
|
|
435
434
|
resumeLivenessAndPublishRotation: (status, jti) => {
|
|
436
|
-
this.
|
|
435
|
+
this.liveness.resetAuthFailure();
|
|
437
436
|
// An earlier auth failure may have stopped the liveness loop; restart it so the
|
|
438
|
-
// agent reports live again on the fresh token.
|
|
437
|
+
// agent reports live again on the fresh token. startLiveness clears any
|
|
439
438
|
// existing timer first, so this is safe on the normal (proactive) renew path too.
|
|
440
|
-
this.
|
|
439
|
+
this.startLiveness();
|
|
441
440
|
this.pendingTimelineEvent = { status, id: jti, timestamp: Date.now() };
|
|
442
441
|
this.bus.reconnectTransport(status === "runtime-token-reminted" ? "runtime token re-minted" : "runtime token renewed");
|
|
443
442
|
this.publishStatus();
|
|
@@ -469,14 +468,14 @@ export class AgentRunner {
|
|
|
469
468
|
// #2514 — the per-provider config env carries a dedicated-home provider's (claude-b's) own
|
|
470
469
|
// credential, which the quota harvest needs to key its reports under the B subscription.
|
|
471
470
|
providerConfigEnv: () => this.options.providerConfig.env,
|
|
472
|
-
http: () => this.http,
|
|
473
471
|
});
|
|
474
|
-
this.
|
|
475
|
-
http: this.http, agentId: this.agentId, instanceId: options.instanceId, logIntervalMs: HTTP_LIVENESS_LOG_INTERVAL_MS,
|
|
472
|
+
this.liveness = new LivenessExchange({
|
|
473
|
+
http: this.http, bus: () => this.bus, agentId: this.agentId, instanceId: options.instanceId, logIntervalMs: HTTP_LIVENESS_LOG_INTERVAL_MS,
|
|
476
474
|
isStopped: () => this.lifecycle.stopped, isTerminalStatusLatched: () => this.lifecycle.terminalStatusLatched,
|
|
477
475
|
currentStatus: () => this.claims.currentStatus(),
|
|
478
|
-
|
|
479
|
-
|
|
476
|
+
sampleQuota: () => this.providerQuotaHarvest.sample(),
|
|
477
|
+
acceptQuota: (report, result) => this.providerQuotaHarvest.accept(report, result),
|
|
478
|
+
enqueueMessage: (message) => this.enqueueMessage(message), triggerEffort: () => this.effort.trigger(),
|
|
480
479
|
recoverRuntimeTokenAfterAuthFailure: (source) => this.credentials.recoverRuntimeTokenAfterAuthFailure(source),
|
|
481
480
|
logRunnerDiagnostic: (message) => this.logRunnerDiagnostic(message),
|
|
482
481
|
});
|
|
@@ -741,7 +740,7 @@ export class AgentRunner {
|
|
|
741
740
|
}, (status) => this.setProviderStatus(status));
|
|
742
741
|
await this.bootstrapUnreadMessages();
|
|
743
742
|
this.taskClaims.start();
|
|
744
|
-
this.
|
|
743
|
+
this.startLiveness();
|
|
745
744
|
this.testRunDedupSweep.start();
|
|
746
745
|
this.credentials.scheduleRuntimeTokenRenewal();
|
|
747
746
|
this.scheduleDrain();
|
|
@@ -2861,7 +2860,7 @@ export class AgentRunner {
|
|
|
2861
2860
|
if (published && this.pendingTimelineEvent === timelineEvent) this.pendingTimelineEvent = undefined;
|
|
2862
2861
|
}
|
|
2863
2862
|
|
|
2864
|
-
private
|
|
2863
|
+
private startLiveness(): void { this.liveness.start(); }
|
|
2865
2864
|
|
|
2866
2865
|
private logRunnerDiagnostic(message: string): void { this.context.logRunnerDiagnostic(message); }
|
|
2867
2866
|
private sessionLog(message: string): void { this.context.sessionLog(message); }
|
|
@@ -133,14 +133,6 @@ export function csvTags(raw: string | undefined): string[] {
|
|
|
133
133
|
return (raw || "").split(",").map((tag) => tag.trim()).filter(Boolean);
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
-
export function relayBusUrl(relayUrl: string): string {
|
|
137
|
-
const url = new URL(relayUrl);
|
|
138
|
-
url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
|
|
139
|
-
url.pathname = `${url.pathname.replace(/\/+$/, "")}/bus`;
|
|
140
|
-
url.search = "";
|
|
141
|
-
return url.toString();
|
|
142
|
-
}
|
|
143
|
-
|
|
144
136
|
export function runnerAgentStatus(status: "idle" | "busy" | "offline" | "error"): "idle" | "busy" | "offline" {
|
|
145
137
|
return status === "error" ? "offline" : status;
|
|
146
138
|
}
|
|
@@ -194,9 +194,13 @@ export function reapSessionScratch(target: SessionScratchTarget): void {
|
|
|
194
194
|
// scratch dir reap to avoid leaking one file per spawn.
|
|
195
195
|
export function reapSessionLauncher(target: SessionLauncherTarget): string[] {
|
|
196
196
|
const removed: string[] = [];
|
|
197
|
-
|
|
197
|
+
const launchers = dedupePaths([
|
|
198
198
|
target.launcherScript,
|
|
199
199
|
target.tmuxSession ? launcherScriptPathForSession(target.tmuxSession, target.launcherDir) : undefined,
|
|
200
|
+
]);
|
|
201
|
+
for (const path of dedupePaths([
|
|
202
|
+
...launchers,
|
|
203
|
+
...launchers.flatMap(path => [`${path}.exit-code`, `${path}.exit-code.stderr`]),
|
|
200
204
|
target.tmuxSession ? launcherGatePathForSession(target.tmuxSession, target.launcherDir) : undefined,
|
|
201
205
|
])) {
|
|
202
206
|
try {
|
|
@@ -286,7 +290,7 @@ export async function sweepStaleLaunchersAsync(opts: LauncherSweepOptions): Prom
|
|
|
286
290
|
try {
|
|
287
291
|
const current = await stat(scriptPath);
|
|
288
292
|
if (!current.isFile() || opts.now - current.mtimeMs < minAge) continue;
|
|
289
|
-
const agentId = await launcherAgentId(scriptPath);
|
|
293
|
+
const agentId = await launcherAgentId(scriptPath.replace(/\.exit-code(?:\.stderr)?$/, ""));
|
|
290
294
|
if (agentId && opts.keepAgentIds.has(agentId)) continue;
|
|
291
295
|
await rm(scriptPath, { force: true });
|
|
292
296
|
removed.push(scriptPath);
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { getManifest } from "@humwick/providers";
|
|
1
3
|
import type { SpawnProvider } from "@humwick/sdk";
|
|
2
4
|
import type { RunnerSpawnConfig, SpawnArgs } from "../src/adapter";
|
|
3
5
|
import { codexLaunchContext } from "../src/adapters/codex";
|
|
@@ -16,8 +18,8 @@ export function systemPromptAppendFromSpawnArgs(
|
|
|
16
18
|
spawnArgs: Pick<SpawnArgs, "args">,
|
|
17
19
|
runnerConfig: RunnerSpawnConfig,
|
|
18
20
|
): string {
|
|
19
|
-
return provider === "claude"
|
|
20
|
-
? flagValue(spawnArgs.args, "--append-system-prompt")
|
|
21
|
+
return getManifest(provider)?.shim?.kind === "claude-relay"
|
|
22
|
+
? readFileSync(flagValue(spawnArgs.args, "--append-system-prompt-file")!, "utf8")
|
|
21
23
|
: codexLaunchContext({ meta: { config: runnerConfig } }) ?? "";
|
|
22
24
|
}
|
|
23
25
|
|
|
@@ -91,7 +91,8 @@ export class RunnerHttp {
|
|
|
91
91
|
});
|
|
92
92
|
for (const method of ["listPromptTemplates", "listReplyObligations", "listAgents", "pollMessages"] as const) this.when(method, async () => []);
|
|
93
93
|
this.when("getProviderQuotaConfig", async () => ({}));
|
|
94
|
-
|
|
94
|
+
this.when("heartbeat", async () => ({ ok: true, messages: [] }));
|
|
95
|
+
for (const method of ["setStatus", "setReady", "markRead"] as const) this.when(method, async () => {});
|
|
95
96
|
this.when("recordMessageDeliveryAttempt", async () => ({}) as Awaited<ReturnType<HumwickHttpClient["recordMessageDeliveryAttempt"]>>);
|
|
96
97
|
this.when("claimMessageResult", async () => ({ ok: true, claimExpiresAt: Date.now() + 60_000 }));
|
|
97
98
|
this.when("updateTaskStatus", async () => ({}) as Awaited<ReturnType<HumwickHttpClient["updateTaskStatus"]>>);
|
|
@@ -44,7 +44,7 @@ const USAGE = [
|
|
|
44
44
|
" --db <path> target DB (default: $DB_PATH, else <stateDir>/agent-relay.db)",
|
|
45
45
|
].join("\n");
|
|
46
46
|
|
|
47
|
-
function main(): void {
|
|
47
|
+
async function main(): Promise<void> {
|
|
48
48
|
const args = parseCleanupArgs(process.argv.slice(2));
|
|
49
49
|
if (args.help) {
|
|
50
50
|
console.log(USAGE);
|
|
@@ -58,7 +58,7 @@ function main(): void {
|
|
|
58
58
|
console.log(`[steward-policy-cleanup] db=${dbPath} mode=${dryRun ? "DRY RUN" : "APPLY"}`);
|
|
59
59
|
console.log(`[steward-policy-cleanup] scanned ${plan.scanned} steward polic${plan.scanned === 1 ? "y" : "ies"}`);
|
|
60
60
|
|
|
61
|
-
const result = applyStewardPolicyCleanup(plan, { dryRun });
|
|
61
|
+
const result = (await applyStewardPolicyCleanup(plan, { dryRun }));
|
|
62
62
|
for (const line of result.log) console.log(` ${line}`);
|
|
63
63
|
if (result.log.length === 0) console.log(" (nothing to change — already canonical)");
|
|
64
64
|
|
package/src/agent-authz.ts
CHANGED
|
@@ -189,9 +189,9 @@ export function sessionControlsOwnAgentsOnly(ctx: AuthContext): boolean {
|
|
|
189
189
|
* operator on agents they are principal of, viewer never. Agent: coordinator authority and, with
|
|
190
190
|
* several users, the target's principal (or an admin principal). Full-reach callers: always.
|
|
191
191
|
* Single-user installs keep today's behavior: only the agent coordinator rule applies. */
|
|
192
|
-
export function authorizeAgentControl(ctx: AuthContext, target: Pick<AgentCard, "id" | "spawnedBy" | "teamId">, action = "control"): AgentControlDenial | null {
|
|
192
|
+
export async function authorizeAgentControl(ctx: AuthContext, target: Pick<AgentCard, "id" | "spawnedBy" | "teamId">, action = "control"): Promise<AgentControlDenial | null> {
|
|
193
193
|
const denied = agentControlDecision(ctx, target);
|
|
194
|
-
if (denied) recordAuthorityDenial(ctx, target.id, action, denied.reason);
|
|
194
|
+
if (denied) (await recordAuthorityDenial(ctx, target.id, action, denied.reason));
|
|
195
195
|
return denied;
|
|
196
196
|
}
|
|
197
197
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { releaseDriveLeaseAsync } from "./db/runtime-tail-async";
|
|
1
2
|
// Concurrency arbitration — "two humans driving one agent safely" (#388 users wave 5, #394).
|
|
2
3
|
//
|
|
3
4
|
// THE single decision home for "may this user drive this agent right now?". It composes three
|
|
@@ -18,13 +19,7 @@ import { canonicalHumanAgentId, userSinkId } from "@humwick/sdk";
|
|
|
18
19
|
import { isMultiUserWorldAsync } from "./db/agent-ownership-async.ts";
|
|
19
20
|
import { resolveViewer } from "./agent-authz.ts";
|
|
20
21
|
import { getUser } from "./db/users.ts";
|
|
21
|
-
import {
|
|
22
|
-
acquireDriveLease,
|
|
23
|
-
getDriveLease,
|
|
24
|
-
releaseDriveLease,
|
|
25
|
-
takeOverDriveLease,
|
|
26
|
-
type DriveLeaseRecord,
|
|
27
|
-
} from "./db/drive-leases.ts";
|
|
22
|
+
import { acquireDriveLease, getDriveLease, takeOverDriveLease, type DriveLeaseRecord } from "./db/drive-leases.ts";
|
|
28
23
|
|
|
29
24
|
/** Who holds (or held) the wheel, resolved for human-readable "X is driving" messaging. */
|
|
30
25
|
interface DriveHolder {
|
|
@@ -100,7 +95,7 @@ export async function releaseDrive(userId: string, agentId: string, opts: { forc
|
|
|
100
95
|
if (!(await isMultiUserWorldAsync())) return { released: false };
|
|
101
96
|
const current = getDriveLease(agentId);
|
|
102
97
|
const isAdmin = resolveViewer(userId)?.role === "admin";
|
|
103
|
-
const released =
|
|
98
|
+
const released = (await releaseDriveLeaseAsync(opts.force && isAdmin ? { agentId } : { agentId, userId }));
|
|
104
99
|
return released && current ? { released, previousHolder: driveHolder(current.holderUserId) } : { released };
|
|
105
100
|
}
|
|
106
101
|
|
|
@@ -51,11 +51,11 @@ export async function settleAgentExitCleanupAsync(command: Command): Promise<boo
|
|
|
51
51
|
const settled = await getGateway().write("commands.settleAgentCleanupSlice", { command: { ...command,
|
|
52
52
|
result: { owners: [{ ...owner, workspaceIds: ids.slice(at, at + 8) }] } } }) as unknown as AgentCleanupSettlement;
|
|
53
53
|
for (const workspace of settled.changed) emitWorkspaceChange(workspace);
|
|
54
|
-
for (const alert of settled.alerts) alertCleanup(command, alert.agentId, alert.detail, owner);
|
|
54
|
+
for (const alert of settled.alerts) await alertCleanup(command, alert.agentId, alert.detail, owner);
|
|
55
55
|
await Bun.sleep(5);
|
|
56
56
|
}
|
|
57
57
|
if (typeof owner.agentId === "string" && typeof owner.error === "string") {
|
|
58
|
-
alertCleanup(command, owner.agentId, owner.error, owner);
|
|
58
|
+
await alertCleanup(command, owner.agentId, owner.error, owner);
|
|
59
59
|
await Bun.sleep(5);
|
|
60
60
|
}
|
|
61
61
|
}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
+
import { deleteWorkspaceAsync } from "./db/lifecycle-tail-async";
|
|
2
|
+
import { getGateway } from "./db/gateway";
|
|
3
|
+
import type { AgentCleanupSettlement } from "./db/agent-exit-cleanup";
|
|
4
|
+
import { createCommandAsync } from "./commands-write";
|
|
1
5
|
import { subscribeRelayEvents } from "./events";
|
|
2
6
|
import { createHash } from "node:crypto";
|
|
3
7
|
import { isHumanAgentId, isRecord } from "@humwick/sdk";
|
|
4
|
-
|
|
5
|
-
import { hasActiveAgentCleanup
|
|
8
|
+
|
|
9
|
+
import { hasActiveAgentCleanup } from "./db/agent-exit-cleanup";
|
|
6
10
|
import { emitCommandEvent } from "./command-events";
|
|
7
|
-
import {
|
|
11
|
+
import { emitWorkspaceChange, getAgent, listOrchestrators, listWorkspaces, getWorkspace } from "./db";
|
|
8
12
|
import { workspaceOwnerOrchestrator } from "./workspace-host";
|
|
9
13
|
import { raiseOperatorAlarm } from "./operator-alarm";
|
|
10
14
|
import { routeNotification } from "./notification-router";
|
|
@@ -14,17 +18,17 @@ import { exitCleanupCondition } from "./agent-exit-alarm";
|
|
|
14
18
|
import { reapAgentBrowserSessions } from "./services/browser-session";
|
|
15
19
|
|
|
16
20
|
// #3489 — HTTP, bus self-exit, host reports and reapers share the persisted status event.
|
|
17
|
-
subscribeRelayEvents((event) => {
|
|
18
|
-
if (event.type === "agent.status" && event.data.status === "offline" && event.subject) reapAgentBrowserSessions(event.subject);
|
|
21
|
+
subscribeRelayEvents(async (event) => {
|
|
22
|
+
if (event.type === "agent.status" && event.data.status === "offline" && event.subject) (await reapAgentBrowserSessions(event.subject));
|
|
19
23
|
});
|
|
20
24
|
|
|
21
|
-
export function requestAgentExitCleanup(agentId?: string): number {
|
|
25
|
+
export async function requestAgentExitCleanup(agentId?: string): Promise<number> {
|
|
22
26
|
if (agentId === "system" || isHumanAgentId(agentId)) return 0;
|
|
23
27
|
const agent = agentId ? getAgent(agentId) : null;
|
|
24
28
|
if (agent && agent.status !== "offline") return 0;
|
|
25
|
-
if (agentId) reapAgentBrowserSessions(agentId); // #3489 — a browser never outlives its agent
|
|
29
|
+
if (agentId) (await reapAgentBrowserSessions(agentId)); // #3489 — a browser never outlives its agent
|
|
26
30
|
if (agentId) for (const ws of listWorkspaces({ ownerAgentId: agentId })) {
|
|
27
|
-
if (ws.mode === "shared")
|
|
31
|
+
if (ws.mode === "shared") (await deleteWorkspaceAsync(ws.id));
|
|
28
32
|
}
|
|
29
33
|
const hosts = listOrchestrators().filter((host) => host.status === "online");
|
|
30
34
|
const owned = agentId ? listWorkspaces({ ownerAgentId: agentId }) : [];
|
|
@@ -34,8 +38,8 @@ export function requestAgentExitCleanup(agentId?: string): number {
|
|
|
34
38
|
for (const host of hosts) {
|
|
35
39
|
if (agentId && hostIds.size && !hostIds.has(host.id)) continue;
|
|
36
40
|
if (hasActiveAgentCleanup(host.agentId, agentId)) continue;
|
|
37
|
-
const command =
|
|
38
|
-
params: { ...(agentId ? { agentId } : { sweep: true }), requestedBy: "agent-exit-cleanup" } });
|
|
41
|
+
const command = (await createCommandAsync({ type: "agent.cleanup", source: "system", target: host.agentId, ttlMs: 10 * 60_000,
|
|
42
|
+
params: { ...(agentId ? { agentId } : { sweep: true }), requestedBy: "agent-exit-cleanup" } }));
|
|
39
43
|
emitCommandEvent(command, "command.requested");
|
|
40
44
|
dispatched++;
|
|
41
45
|
}
|
|
@@ -53,25 +57,25 @@ export async function settleAgentExitCleanup(command: Command): Promise<boolean>
|
|
|
53
57
|
const error = command.error ?? "No cleanup inventory owner found; cleanup retained";
|
|
54
58
|
await settleWorkspaceCleanupCommand({ ...command, status: "failed", error,
|
|
55
59
|
result: { ...result, workspaceId: typeof command.params.workspaceId === "string" ? command.params.workspaceId : command.correlationId } });
|
|
56
|
-
if (command.status === "succeeded") alertCleanup(command, undefined, error);
|
|
60
|
+
if (command.status === "succeeded") await alertCleanup(command, undefined, error);
|
|
57
61
|
}
|
|
58
|
-
const settled =
|
|
62
|
+
const settled = await getGateway().write("commands.settleAgentCleanupSlice", { command }) as unknown as AgentCleanupSettlement;
|
|
59
63
|
for (const workspace of settled.changed) emitWorkspaceChange(workspace);
|
|
60
|
-
for (const alert of settled.alerts) alertCleanup(command, alert.agentId, alert.detail);
|
|
64
|
+
for (const alert of settled.alerts) await alertCleanup(command, alert.agentId, alert.detail);
|
|
61
65
|
for (const owner of owners) {
|
|
62
66
|
if (typeof owner.agentId !== "string") continue;
|
|
63
|
-
if (typeof owner.error === "string") alertCleanup(command, owner.agentId, owner.error, owner);
|
|
67
|
+
if (typeof owner.error === "string") await alertCleanup(command, owner.agentId, owner.error, owner);
|
|
64
68
|
}
|
|
65
69
|
if (command.status !== "succeeded" && !owners.some((owner) => typeof owner.error === "string")) {
|
|
66
70
|
console.warn(`[agent-exit-cleanup] host ${command.target} agent ${command.params.agentId ?? "host sweep"}: ${command.error ?? "host cleanup failed"}`);
|
|
67
71
|
}
|
|
68
72
|
if (Array.isArray(result?.unattributed) && result.unattributed.length) {
|
|
69
|
-
alertCleanup(command, undefined, `Host artifacts retained because ownership is unavailable: ${result.unattributed.join(", ")}`, { artifactPaths: result.unattributed });
|
|
73
|
+
await alertCleanup(command, undefined, `Host artifacts retained because ownership is unavailable: ${result.unattributed.join(", ")}`, { artifactPaths: result.unattributed });
|
|
70
74
|
}
|
|
71
75
|
return true;
|
|
72
76
|
}
|
|
73
77
|
|
|
74
|
-
export function alertCleanup(command: Command, agentId: string | undefined, detail: string, artifacts?: Record<string, unknown>): void {
|
|
78
|
+
export async function alertCleanup(command: Command, agentId: string | undefined, detail: string, artifacts?: Record<string, unknown>): Promise<void> {
|
|
75
79
|
const owner = artifacts ?? (Array.isArray(command.result?.owners) ? command.result.owners.filter(isRecord)
|
|
76
80
|
.find((owner) => owner.agentId === agentId) : undefined);
|
|
77
81
|
if (owner?.inventoryFailed === true) return;
|
|
@@ -91,9 +95,9 @@ export function alertCleanup(command: Command, agentId: string | undefined, deta
|
|
|
91
95
|
const host = listOrchestrators().find((host) => host.agentId === command.target);
|
|
92
96
|
const body = `Agent ${agent?.label ?? agent?.name ?? "unknown"} (${identity ?? "unknown"}) on host ${host ? `${host.hostname} (${host.id})` : command.target}\nPaths: ${paths.join(", ")}\n${detail}`;
|
|
93
97
|
const digest = createHash("sha256").update(`${command.target}:${identity}:${exitCleanupCondition(detail)}:${JSON.stringify(paths)}`).digest("hex").slice(0, 24);
|
|
94
|
-
if (!raiseOperatorAlarm({ clientId: `exit-cleanup:${digest}`, source: "agent-exit-cleanup", subject: "Agent exit cleanup retained files", detail: body, dedupeEvent: true,
|
|
95
|
-
metadata: { agentId, commandId: command.id, orchestrator: command.target, paths } })) return;
|
|
98
|
+
if (!(await raiseOperatorAlarm({ clientId: `exit-cleanup:${digest}`, source: "agent-exit-cleanup", subject: "Agent exit cleanup retained files", detail: body, dedupeEvent: true,
|
|
99
|
+
metadata: { agentId, commandId: command.id, orchestrator: command.target, paths } }))) return;
|
|
96
100
|
const parent = agent?.spawnedBy;
|
|
97
|
-
if (parent) routeNotification({ type: "agent.cleanup_failed", scope: { agentId, parent }, recipients: [parent], forceDelivery: true,
|
|
101
|
+
if (parent) await routeNotification({ type: "agent.cleanup_failed", scope: { agentId, parent }, recipients: [parent], forceDelivery: true,
|
|
98
102
|
message: { subject: "Agent exit cleanup retained files", body, replyExpected: false, idempotencyKey: `exit-cleanup:${digest}`, payload: { kind: "agent.cleanup_failed", agentId, commandId: command.id } } });
|
|
99
103
|
}
|