@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
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Install Humwick packages into a runtime prefix: from the registry, or from packed tarballs
|
|
2
|
+
// (`dev install`, and `init --tarball-dir` while the registry set is broken, #2680/#2324).
|
|
3
|
+
import { execFile } from "node:child_process";
|
|
4
|
+
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { promisify } from "node:util";
|
|
7
|
+
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
const INSTALL_TIMEOUT_MS = 10 * 60_000;
|
|
10
|
+
const SERVER_TARBALL = /^humwick-server-.*\.tgz$/;
|
|
11
|
+
|
|
12
|
+
/** `npm install` into `prefix`; bounded, and the error carries npm's output. */
|
|
13
|
+
export async function npmInstallIntoPrefix(prefix: string, specs: string[]): Promise<string> {
|
|
14
|
+
mkdirSync(prefix, { recursive: true });
|
|
15
|
+
const manifest = join(prefix, "package.json");
|
|
16
|
+
if (!existsSync(manifest)) writeFileSync(manifest, JSON.stringify({ private: true, name: "humwick-runtime" }, null, 2) + "\n", "utf8");
|
|
17
|
+
const args = ["install", "--prefix", prefix, "--no-audit", "--no-fund", "--force", ...specs];
|
|
18
|
+
try {
|
|
19
|
+
const result = await execFileAsync("npm", args, { cwd: prefix, timeout: INSTALL_TIMEOUT_MS, maxBuffer: 16 * 1024 * 1024 });
|
|
20
|
+
return result.stdout.trim();
|
|
21
|
+
} catch (e) {
|
|
22
|
+
const err = e as Error & { stdout?: string; stderr?: string; killed?: boolean };
|
|
23
|
+
const tail = `${err.stdout ?? ""}\n${err.stderr ?? ""}`.trim().split("\n").slice(-20).join("\n");
|
|
24
|
+
throw new Error(`npm ${args.slice(0, 6).join(" ")} … failed${err.killed ? ` (timed out after ${INSTALL_TIMEOUT_MS / 1000} s)` : ""}:\n${tail || err.message}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function isServerTarball(name: string): boolean {
|
|
29
|
+
return SERVER_TARBALL.test(name);
|
|
30
|
+
}
|
package/src/runtime-tokens.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { stringValue } from "@humwick/sdk";
|
|
2
2
|
import { writeChildEnv } from "@humwick/sdk/env";
|
|
3
3
|
import { deriveRunnerGrant, successorGrant } from "./runtime-grant";
|
|
4
4
|
export { runnerSpawnGrantForAgent } from "./runtime-grant";
|
|
@@ -13,11 +13,9 @@ import { getLaunchFact, recordLaunchFact, type LaunchFact } from "./db/launch-fa
|
|
|
13
13
|
import type { ComponentToken, SpawnApprovalMode, TokenConstraints, TokenRecord } from "./types";
|
|
14
14
|
import { listManagedOrchestratorsForAgent } from "./orchestrator-lookup";
|
|
15
15
|
import { sameHostIdentity } from "./utils";
|
|
16
|
-
import {
|
|
17
|
-
import { canonicalAgentProfileName, hasScope } from "@humwick/sdk/types";
|
|
16
|
+
import { canonicalAgentProfileName } from "@humwick/sdk/types";
|
|
18
17
|
import { COORDINATOR_PROFILE_NAMES } from "./agent-system-tags";
|
|
19
18
|
import { SECRETS_DEFAULT_PROFILES, SECRETS_TOOL_GROUP, SECRETS_WRITE_SCOPE } from "./secrets-broker/config";
|
|
20
|
-
import { INCLUDED_TOOL_SCOPE_NEEDS, RELAY_TOOL_GROUPS, resolveRelayTools, SELF_CARE_TOOL_GROUP } from "./mcp/tool-groups";
|
|
21
19
|
|
|
22
20
|
/**
|
|
23
21
|
* Who vouches for a runner launch's authority (#3110 review). A launch without a positively identified
|
|
@@ -194,8 +192,8 @@ export function issueOrchestratorRuntimeToken(input: {
|
|
|
194
192
|
}
|
|
195
193
|
|
|
196
194
|
/** #1870 S6c — the mint on the writer thread, for the async routes. */
|
|
197
|
-
export function issueOrchestratorRuntimeTokenAsync(input: Parameters<typeof issueOrchestratorRuntimeToken>[0]): Promise<RuntimeTokenResult> {
|
|
198
|
-
return createTokenAsync(orchestratorTokenSpec(input));
|
|
195
|
+
export async function issueOrchestratorRuntimeTokenAsync(input: Parameters<typeof issueOrchestratorRuntimeToken>[0]): Promise<RuntimeTokenResult> {
|
|
196
|
+
return (await createTokenAsync(orchestratorTokenSpec(input)));
|
|
199
197
|
}
|
|
200
198
|
|
|
201
199
|
function orchestratorTokenSpec(input: Parameters<typeof issueOrchestratorRuntimeToken>[0]): CreateTokenInput {
|
|
@@ -269,21 +267,15 @@ function runnerTokenSpec(input: RunnerRuntimeTokenInput): { token: CreateTokenIn
|
|
|
269
267
|
const grant = authority.kind === "successor" ? successorGrant(input.agentId, profile)
|
|
270
268
|
: { ...deriveRunnerGrant(profile, authority.kind === "delegated" ? { agentInitiated, callerScopes: authority.callerScopes, parentAgentId: input.spawnedBy, projectId: input.projectId, maxSpawnedAgents: input.maxSpawnedAgents } : { agentInitiated }), agentInitiated };
|
|
271
269
|
const { canSpawn, maxSpawnedAgents, toolGroups, toolInclude, toolExclude } = grant;
|
|
272
|
-
|
|
273
|
-
for (const authoredName of toolInclude ?? []) {
|
|
274
|
-
const name = registryToolName(authoredName);
|
|
275
|
-
if (!selected.has(name)) continue;
|
|
276
|
-
const needs = INCLUDED_TOOL_SCOPE_NEEDS[name];
|
|
277
|
-
if (RELAY_TOOL_GROUPS.kernel!.includes(name) || (needs && !needs.some((need) => hasScope(grant.scope, need)))) {
|
|
278
|
-
throw new Error(`relay.tools.include: ${name} requires ${needs?.join(" or ") ?? "kernel control scopes"}; profile ${profile} cannot grant that scope under this launch authority`);
|
|
279
|
-
}
|
|
280
|
-
}
|
|
270
|
+
// Includes choose the surface, not launch authority. MCP scope filtering hides unavailable tools (#3817).
|
|
281
271
|
// #1570 — provider-split: a Codex worker eager-loads every listed tool schema every turn (no
|
|
282
272
|
// client-native deferral), so trim its always-loaded MCP surface to the lean worker set. Classified
|
|
283
273
|
// by explicit worker profile (not tool-group shape — reviewers share the groups but aren't workers).
|
|
284
274
|
const toolAllowlist = toolInclude !== undefined || toolExclude !== undefined
|
|
285
275
|
? undefined : toolAllowlistForRunner(input.provider, profile);
|
|
286
|
-
|
|
276
|
+
// #3804 — an agent-spawned child stays on its launch host, except a delegated sub-coordinator: its home host is
|
|
277
|
+
// often full, so it places spawns wherever its parent can unless the launch pinned it.
|
|
278
|
+
const hostPinned = grant.agentInitiated && !grant.delegated ? true : (input.hostPinned ?? hostPinForProfile(input.profile));
|
|
287
279
|
const subject = input.policyName
|
|
288
280
|
? `runner:policy:${input.policyName}`
|
|
289
281
|
: input.spawnRequestId
|
|
@@ -339,7 +331,7 @@ export function issueRunnerRuntimeTokenAsync(input: RunnerRuntimeTokenInput): Pr
|
|
|
339
331
|
return createRunnerTokenAsync(spec.token, spec.launchFact ? { agentId: input.agentId, fact: spec.launchFact } : undefined);
|
|
340
332
|
}
|
|
341
333
|
|
|
342
|
-
export function issueInteractiveRunnerRuntimeToken(input: {
|
|
334
|
+
export async function issueInteractiveRunnerRuntimeToken(input: {
|
|
343
335
|
provider: string;
|
|
344
336
|
cwd: string;
|
|
345
337
|
runnerId: string;
|
|
@@ -351,9 +343,9 @@ export function issueInteractiveRunnerRuntimeToken(input: {
|
|
|
351
343
|
* authorization, so it must ride the signature rather than the caller-writable agent card. */
|
|
352
344
|
approvalMode?: SpawnApprovalMode;
|
|
353
345
|
createdBy?: string;
|
|
354
|
-
}): RuntimeTokenResult {
|
|
346
|
+
}): Promise<RuntimeTokenResult> {
|
|
355
347
|
const agentId = input.agentId ?? input.runnerId;
|
|
356
|
-
return
|
|
348
|
+
return (await createTokenAsync({
|
|
357
349
|
profileId: "provider-interactive",
|
|
358
350
|
sub: `runner:interactive:${input.host ?? "local"}:${input.runnerId}`,
|
|
359
351
|
role: "provider",
|
|
@@ -368,22 +360,22 @@ export function issueInteractiveRunnerRuntimeToken(input: {
|
|
|
368
360
|
canDelegate: false,
|
|
369
361
|
},
|
|
370
362
|
createdBy: input.createdBy ?? "interactive-runner",
|
|
371
|
-
});
|
|
363
|
+
}));
|
|
372
364
|
}
|
|
373
365
|
|
|
374
|
-
export function issueMcpRuntimeToken(input: {
|
|
366
|
+
export async function issueMcpRuntimeToken(input: {
|
|
375
367
|
sessionId: string;
|
|
376
368
|
agentId?: string;
|
|
377
369
|
targets?: string[];
|
|
378
370
|
channels?: string[];
|
|
379
371
|
createdBy?: string;
|
|
380
|
-
}): RuntimeTokenResult {
|
|
372
|
+
}): Promise<RuntimeTokenResult> {
|
|
381
373
|
const targets = input.targets?.length
|
|
382
374
|
? input.targets
|
|
383
375
|
: input.agentId
|
|
384
376
|
? ["user", input.agentId]
|
|
385
377
|
: undefined;
|
|
386
|
-
return
|
|
378
|
+
return (await createTokenAsync({
|
|
387
379
|
profileId: "mcp-client",
|
|
388
380
|
sub: input.agentId ? `mcp:${input.agentId}:${input.sessionId}` : `mcp:session:${input.sessionId}`,
|
|
389
381
|
role: "mcp",
|
|
@@ -394,16 +386,16 @@ export function issueMcpRuntimeToken(input: {
|
|
|
394
386
|
canDelegate: false,
|
|
395
387
|
},
|
|
396
388
|
createdBy: input.createdBy ?? "runtime",
|
|
397
|
-
});
|
|
389
|
+
}));
|
|
398
390
|
}
|
|
399
391
|
|
|
400
|
-
export function issueIntegrationRuntimeToken(input: {
|
|
392
|
+
export async function issueIntegrationRuntimeToken(input: {
|
|
401
393
|
name: string;
|
|
402
394
|
targets?: string[];
|
|
403
395
|
channels?: string[];
|
|
404
396
|
createdBy?: string;
|
|
405
|
-
}): RuntimeTokenResult {
|
|
406
|
-
return
|
|
397
|
+
}): Promise<RuntimeTokenResult> {
|
|
398
|
+
return (await createTokenAsync({
|
|
407
399
|
profileId: "integration-client",
|
|
408
400
|
sub: input.name,
|
|
409
401
|
role: "integration",
|
|
@@ -414,7 +406,7 @@ export function issueIntegrationRuntimeToken(input: {
|
|
|
414
406
|
canDelegate: false,
|
|
415
407
|
},
|
|
416
408
|
createdBy: input.createdBy ?? "runtime",
|
|
417
|
-
});
|
|
409
|
+
}));
|
|
418
410
|
}
|
|
419
411
|
|
|
420
412
|
export function runnerRuntimeTokenEnv(input: RunnerRuntimeTokenInput): Record<string, string> {
|
|
@@ -9,7 +9,7 @@ import { envFilePath } from "@humwick/sdk/child-env";
|
|
|
9
9
|
export const SECRETS_TOOL_GROUP = "secrets";
|
|
10
10
|
export const SECRETS_WRITE_SCOPE = "secrets:write";
|
|
11
11
|
/** Built-in profiles whose default full surface includes the secrets group. */
|
|
12
|
-
export const SECRETS_DEFAULT_PROFILES: ReadonlySet<string> = new Set(["coordinator"
|
|
12
|
+
export const SECRETS_DEFAULT_PROFILES: ReadonlySet<string> = new Set(["coordinator"]);
|
|
13
13
|
|
|
14
14
|
export const UPLOAD_LINK_TTL_MS = 15 * 60_000;
|
|
15
15
|
export const SECRET_UPLOAD_PATH_PREFIX = "/api/secrets/upload/";
|
|
@@ -27,13 +27,13 @@ let client: InfisicalBrokerClient | undefined;
|
|
|
27
27
|
|
|
28
28
|
function brokerClient(): InfisicalBrokerClient {
|
|
29
29
|
client ??= new InfisicalBrokerClient(secretsBrokerSettings(), {
|
|
30
|
-
onLoginBlocked: (detail) => raiseOperatorAlarm({
|
|
30
|
+
onLoginBlocked: async (detail) => (await raiseOperatorAlarm({
|
|
31
31
|
clientId: "secrets-broker:login-blocked",
|
|
32
32
|
source: "secrets-broker",
|
|
33
33
|
subject: "Secrets broker login blocked",
|
|
34
34
|
detail: `${detail}. Fix the cause, then rotate or touch the credential files to re-arm.`,
|
|
35
35
|
dedupeEvent: true,
|
|
36
|
-
}),
|
|
36
|
+
})),
|
|
37
37
|
});
|
|
38
38
|
return client;
|
|
39
39
|
}
|
package/src/security.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { retireHandedOffPredecessor, tokenRetirementPending } from "./db/token-standing-async";
|
|
1
2
|
import { BRIDGED_CORS_HEADERS, relayHeader } from "@humwick/sdk";
|
|
2
3
|
import { versionedPromptsEnabled } from "./versioned-prompts";
|
|
3
4
|
import { serviceAccessRouteScope } from "./service-access/scope";
|
|
@@ -242,6 +243,7 @@ const SHARED_UI_ROUTE_SCOPES: Record<string, string> = {
|
|
|
242
243
|
"/api/metrics/hub": "stats:read",
|
|
243
244
|
"/api/shipping/board": "stats:read",
|
|
244
245
|
"/api/shipping/stats": "stats:read",
|
|
246
|
+
"/api/shipping/known-failures": "agent:read", // #3362 §11: read by builders' delivery gates
|
|
245
247
|
"/api/stats/token-usage": "stats:read",
|
|
246
248
|
// #3567 — every signed-in user reads their profile and sets their password (the handler requires a session or the admin token).
|
|
247
249
|
"/api/users/me": "agent:read",
|
|
@@ -539,7 +541,7 @@ export function verifyComponentToken(token: string, nowSeconds = Math.floor(Date
|
|
|
539
541
|
const payload = parseBase64urlJson(payloadRaw);
|
|
540
542
|
if (!isComponentToken(payload)) return null;
|
|
541
543
|
if (payload.exp !== undefined && payload.exp <= nowSeconds) return null;
|
|
542
|
-
if (payload.jti && isTokenRevoked(payload.jti)) return null;
|
|
544
|
+
if (payload.jti && (tokenRetirementPending(payload.jti) || isTokenRevoked(payload.jti, retireHandedOffPredecessor))) return null;
|
|
543
545
|
return payload;
|
|
544
546
|
}
|
|
545
547
|
|
package/src/self-resume-carry.ts
CHANGED
|
@@ -1,69 +1,35 @@
|
|
|
1
1
|
import { errMessage, isRecord, stringValue } from "@humwick/sdk";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
} from "./db";
|
|
2
|
+
import { getAgent } from "./db";
|
|
3
|
+
import type { ContextResetFact } from "./db/context-reset-carry";
|
|
4
|
+
import { commandBoundary } from "./db/context-carry-write";
|
|
5
|
+
import { getGateway } from "./db/gateway";
|
|
6
|
+
import type { SendMessageResult } from "./db/messages";
|
|
6
7
|
import { emitCommandEvent } from "./command-events";
|
|
7
8
|
import { createSelfRestartCommandAsync } from "./services/restart-spawn";
|
|
8
|
-
import { isContinuationSelfResumeCommand } from "./self-resume-command";
|
|
9
9
|
import { emitNewMessage } from "./sse";
|
|
10
10
|
import type { Command, Message } from "./types";
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
// "Possible unread messages" list. At least once: a listed message may already be handled.
|
|
15
|
-
|
|
16
|
-
const LISTED_IDS = 200;
|
|
17
|
-
// The loss #3398 fixes is reads in the minutes before the self-care call or during it (#3523); earlier ones are in the saved state.
|
|
18
|
-
const CARRY_MARGIN_MS = 10 * 60_000;
|
|
19
|
-
// A failed or swept command proves nothing about its destructive input, so its list is only a fallback.
|
|
20
|
-
const FALLBACK_STATUSES: ReadonlySet<Command["status"]> = new Set(["failed", "canceled", "timed_out", "rejected"]);
|
|
21
|
-
|
|
22
|
-
/** Opens the obligation at accept, before the boundary command exists. */
|
|
23
|
-
export function openContextRecovery(agentId: string, generation: number, now: number): void {
|
|
24
|
-
openRecoveryObligation(agentId, generation, now);
|
|
12
|
+
export async function openContextRecovery(agentId: string, generation: number, now: number): Promise<void> {
|
|
13
|
+
await getGateway().write("contextCarry.open", { agentId, generation, now });
|
|
25
14
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
attachRecoveryCommand(agentId, generation, commandId);
|
|
15
|
+
export async function attachContextRecoveryCommand(agentId: string, generation: number, commandId: string): Promise<void> {
|
|
16
|
+
await getGateway().write("contextCarry.attach", { agentId, generation, commandId });
|
|
29
17
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
export function recordContextReset(fact: ContextResetFact): Message | null {
|
|
33
|
-
const now = Date.now();
|
|
34
|
-
return sendAndEmit(() => {
|
|
35
|
-
if (!insertContextReset(fact, now)) return null;
|
|
36
|
-
const carrying = carryingRecoveryObligations(fact.agentId);
|
|
37
|
-
if (!carrying.length) return null;
|
|
38
|
-
const result = sendCarry(fact.agentId, carrying, `${fact.resetId}:0`, { resetId: fact.resetId, kind: fact.kind });
|
|
39
|
-
closeRecoveryObligations(fact.agentId, settledBy(fact, carrying), `reset:${fact.resetId}`, now);
|
|
40
|
-
return result;
|
|
41
|
-
});
|
|
18
|
+
export async function recordContextReset(fact: ContextResetFact): Promise<Message | null> {
|
|
19
|
+
return emitCarry(await getGateway().write("contextCarry.reset", { fact }) as unknown as SendMessageResult | null);
|
|
42
20
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
export function settleContextResetCarry(command: Command): Message | null {
|
|
49
|
-
const boundary = FALLBACK_STATUSES.has(command.status) ? commandBoundary(command) : null;
|
|
50
|
-
if (!boundary) return null;
|
|
51
|
-
const message = sendAndEmit(() => {
|
|
52
|
-
const carrying = carryingRecoveryObligations(boundary.agentId);
|
|
53
|
-
if (!carrying.some((obligation) => obligation.open && obligation.generation === boundary.generation)) return null;
|
|
54
|
-
const sent = sendCarry(boundary.agentId, carrying, `${command.id}:fallback`, { boundaryCommandId: command.id, status: command.status });
|
|
55
|
-
// The runner aborted before any destructive input reached the provider: no reset can follow, so nothing is owed (#3441).
|
|
56
|
-
if (isRecord(command.result) && command.result.destructiveInputSubmitted === false) {
|
|
57
|
-
closeRecoveryObligations(boundary.agentId, [boundary.generation], `submit-aborted:${command.id}`, Date.now());
|
|
58
|
-
}
|
|
59
|
-
return sent;
|
|
60
|
-
});
|
|
61
|
-
if (command.status === "failed" && isRecord(command.result) && command.result.destructiveInputUnsettled === true) {
|
|
62
|
-
void replaceUnsettledBoundary(command, boundary).catch((error) => console.error(`#3398 self-restart after unsettled ${command.type} ${command.id} failed: ${errMessage(error)}`));
|
|
21
|
+
export async function settleContextResetCarry(command: Command): Promise<Message | null> {
|
|
22
|
+
const result = emitCarry(await getGateway().write("contextCarry.settle", { command }) as unknown as SendMessageResult | null);
|
|
23
|
+
const boundary = commandBoundary(command);
|
|
24
|
+
if (boundary && command.status === "failed" && isRecord(command.result) && command.result.destructiveInputUnsettled === true) {
|
|
25
|
+
await replaceUnsettledBoundary(command, boundary);
|
|
63
26
|
}
|
|
64
|
-
return
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
function emitCarry(result: SendMessageResult | null): Message | null {
|
|
30
|
+
if (result && (result.created || result.updated)) emitNewMessage(result.message);
|
|
31
|
+
return result?.message ?? null;
|
|
65
32
|
}
|
|
66
|
-
|
|
67
33
|
/** The provider may still apply the input without any observable reset: a successor's registration is the reset instead. */
|
|
68
34
|
async function replaceUnsettledBoundary(command: Command, boundary: { agentId: string; generation: number }): Promise<void> {
|
|
69
35
|
const agent = getAgent(boundary.agentId);
|
|
@@ -74,58 +40,3 @@ async function replaceUnsettledBoundary(command: Command, boundary: { agentId: s
|
|
|
74
40
|
const restart = await createSelfRestartCommandAsync(agent, boundary.generation, continuation, fullContextMessageId, "reset-unconfirmed", Date.now());
|
|
75
41
|
emitCommandEvent(restart, "command.requested");
|
|
76
42
|
}
|
|
77
|
-
|
|
78
|
-
/** A reset settles only the boundary its provider evidence names; a replaced process settles all. */
|
|
79
|
-
function settledBy(fact: ContextResetFact, carrying: RecoveryObligation[]): number[] {
|
|
80
|
-
const open = carrying.filter((obligation) => obligation.open);
|
|
81
|
-
if (fact.kind === "restart") return open.map((obligation) => obligation.generation);
|
|
82
|
-
return open.filter((obligation) => fact.commandId !== undefined && obligation.commandId === fact.commandId).map((obligation) => obligation.generation);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
function commandBoundary(command: Command): { agentId: string; generation: number } | null {
|
|
86
|
-
const selfResume = isRecord(command.params.selfResume) ? command.params.selfResume : undefined;
|
|
87
|
-
const generation = selfResume?.generation;
|
|
88
|
-
if (typeof generation !== "number") return null;
|
|
89
|
-
if (command.type === "agent.restart") {
|
|
90
|
-
const agentId = stringValue(command.params.agentId);
|
|
91
|
-
return agentId && isRecord(command.params.selfRestart) ? { agentId, generation } : null;
|
|
92
|
-
}
|
|
93
|
-
return isContinuationSelfResumeCommand(command) ? { agentId: command.target, generation } : null;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
type SendResult = ReturnType<typeof sendMessageWithResult>;
|
|
97
|
-
|
|
98
|
-
function sendAndEmit(write: () => SendResult | null): Message | null {
|
|
99
|
-
const result = writeTransaction(write);
|
|
100
|
-
if (result && (result.created || result.updated)) emitNewMessage(result.message);
|
|
101
|
-
return result?.message ?? null;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Floor: the earliest capture start minus the margin. No upper bound: a read after the reset is a duplicate, never a loss, and needs no clock comparison.
|
|
105
|
-
function sendCarry(agentId: string, carrying: RecoveryObligation[], key: string, detail: Record<string, unknown>): SendResult | null {
|
|
106
|
-
const ids = readsToCarry(agentId, Math.min(...carrying.map((obligation) => obligation.openedAt)) - CARRY_MARGIN_MS);
|
|
107
|
-
if (!ids.length) return null;
|
|
108
|
-
return sendMessageWithResult({
|
|
109
|
-
from: "system",
|
|
110
|
-
to: agentId,
|
|
111
|
-
kind: "system",
|
|
112
|
-
subject: "Possible unread messages",
|
|
113
|
-
body: renderCarryBody(ids),
|
|
114
|
-
payload: { selfResumeCarry: { ...detail, generations: carrying.map((obligation) => obligation.generation), messageIds: ids } },
|
|
115
|
-
idempotencyKey: `self-resume-carry:${agentId}:${key}`,
|
|
116
|
-
replyExpected: false,
|
|
117
|
-
maxAgeSeconds: null,
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
function renderCarryBody(ids: number[]): string {
|
|
122
|
-
const listed = ids.slice(0, LISTED_IDS).map((id) => `#${id}`).join(" ");
|
|
123
|
-
const rest = ids.length > LISTED_IDS ? `\n…and ${ids.length - LISTED_IDS} more, up to #${ids.at(-1)}; every id is in this message's payload.` : "";
|
|
124
|
-
return [
|
|
125
|
-
`Possible unread messages: ${ids.length} message${ids.length === 1 ? "" : "s"} reached you around your context reset, after or shortly before you saved your working state, so your current context may not hold them.`,
|
|
126
|
-
"Check each one your working state does not already cover with relay_get_message <id>, and handle it. Some may be duplicates of work you have done.",
|
|
127
|
-
"Messages you already handled may appear here, including the reset instruction itself: do not repeat a reset instruction found here.",
|
|
128
|
-
"",
|
|
129
|
-
`${listed}${rest}`,
|
|
130
|
-
].join("\n");
|
|
131
|
-
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { updateCommandAsync } from "./commands-write";
|
|
1
2
|
import { getContinuationEnvelope } from "./db/continuations";
|
|
2
|
-
|
|
3
|
+
|
|
3
4
|
import type { Command } from "./types";
|
|
4
5
|
|
|
5
6
|
/** #3662 — a continuation belongs to one generation; once a newer one is captured, an older boundary is
|
|
@@ -14,6 +15,6 @@ export function supersedingGeneration(boundary: Command): number | null {
|
|
|
14
15
|
|
|
15
16
|
/** Cancel (never fail) the not-yet-started injects of a superseded boundary. Accepted/running ones are
|
|
16
17
|
* already in the provider's hands and settle on their own. */
|
|
17
|
-
export function cancelSupersededInjects(pendingAttemptIds: string[], current: number): void {
|
|
18
|
-
for (const id of pendingAttemptIds)
|
|
18
|
+
export async function cancelSupersededInjects(pendingAttemptIds: string[], current: number): Promise<void> {
|
|
19
|
+
for (const id of pendingAttemptIds) (await updateCommandAsync(id, { status: "canceled", error: `superseded by continuation generation ${current}` }));
|
|
19
20
|
}
|