@humwick/server 0.130.1 → 0.130.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/bundled/prompts/manifest.json +1 -0
- package/bundled/prompts/task.hydration.md +1 -1
- package/bundled/roles/builder.md +1 -1
- package/docs/guides/sub-coordinators.md +12 -5
- package/docs/guides/tools-administration.md +4 -0
- package/docs/guides/tools-coordination.md +2 -0
- package/docs/guides/tools-tasks.md +8 -0
- package/docs/guides/workflows.md +74 -0
- package/docs/openapi.json +486 -4
- package/package.json +10 -18
- package/public/assets/{MessageBubble-BWpoBjl4.js → MessageBubble-Bq9kr21N.js} +2 -2
- package/public/assets/{PlanGraphPanel-C0auck3n.js → PlanGraphPanel-Dqiroy06.js} +2 -2
- package/public/assets/{TraceView-DBnOx7AQ.js → TraceView-DYU962-H.js} +2 -2
- package/public/assets/{VaultDecisionCard-0kp2oNBC.js → VaultDecisionCard-DhPfzioE.js} +2 -2
- package/public/assets/{activity-yLztXEBt.js → activity-DzCcQTee.js} +2 -2
- package/public/assets/{agent-lineage-BbJDR1dW.js → agent-lineage-SgDt9i3T.js} +2 -2
- package/public/assets/agent-liveness-Bq-s73jW.js +2 -0
- package/public/assets/{agent-name-CTZBrSD9.js → agent-name-CcY3Aijy.js} +2 -2
- package/public/assets/agent-profiles-cxtRBn6O.js +2 -0
- package/public/assets/{agent-project-badge-9TqzUUYE.js → agent-project-badge-DGYbIhaI.js} +2 -2
- package/public/assets/{agent-tools-D4n40pn8.js → agent-tools-DHbftV0N.js} +2 -2
- package/public/assets/{agent-type-icon-D6FUarOf.js → agent-type-icon-CY113sp-.js} +2 -2
- package/public/assets/{agents-BYDslkJc.js → agents-BPzY7IlQ.js} +2 -2
- package/public/assets/{analytics-B-XSbEMC.js → analytics-DENFPv_a.js} +2 -2
- package/public/assets/{artifact-viewer-DdWIfV6M.js → artifact-viewer-KRvSc7sl.js} +2 -2
- package/public/assets/{artifacts-DPN1q4pA.js → artifacts-C9gSmL3s.js} +2 -2
- package/public/assets/{artifacts-oBOqks-2.js → artifacts-DT-HkI5O.js} +2 -2
- package/public/assets/{automation-4KcRFXEu.js → automation-BsmjQhKD.js} +2 -2
- package/public/assets/{backlog-Cw9xPTCF.js → backlog-8NYH_62t.js} +2 -2
- package/public/assets/{busy-health-CTu32MZt.js → busy-health-D3hwvYb4.js} +2 -2
- package/public/assets/{channels-BiXzg1G9.js → channels-DCJ5WL7O.js} +2 -2
- package/public/assets/{chat-Ctk2qwvA.js → chat-DAIl357U.js} +3 -3
- package/public/assets/{code-preview-Bm1wWqAp.js → code-preview-CzrZfr9U.js} +2 -2
- package/public/assets/{connectors-C36ax4Vw.js → connectors-xTxtlyou.js} +2 -2
- package/public/assets/{cosmos-Jj9LK2Wf.js → cosmos-BpebFLK2.js} +2 -2
- package/public/assets/{crate-agent-H6S7-B9T.js → crate-agent-BHvI5wXC.js} +2 -2
- package/public/assets/{dependency-graph-Cd1E23wa.js → dependency-graph-DGT0o3wJ.js} +2 -2
- package/public/assets/{deploys-Bwfq146q.js → deploys-hqWOHSHE.js} +2 -2
- package/public/assets/{display-CfO7rTuF.js → display-CDeH4I8T.js} +2 -2
- package/public/assets/{files-DhhZI2Ih.js → files-BTeGVmTg.js} +2 -2
- package/public/assets/{fleet-B_rFEbnL.js → fleet-DgXtNgCa.js} +2 -2
- package/public/assets/{fleet-metrics-BkHP-P3R.js → fleet-metrics-BHEt5yc_.js} +2 -2
- package/public/assets/{formatted-body-Cm1RrzmN.js → formatted-body-MLtodyPp.js} +3 -3
- package/public/assets/{formatted-body-impl-DQiOuOD1.js → formatted-body-impl-CAe664Z8.js} +2 -2
- package/public/assets/{host-providers-dialog-CHqwXTov.js → host-providers-dialog-mapF4Fj9.js} +2 -2
- package/public/assets/index-CqqgOI5R.js +15 -0
- package/public/assets/index-MYAIwYTX.css +2 -0
- package/public/assets/{insights-fH1EL-qZ.js → insights-DNyf7IzF.js} +2 -2
- package/public/assets/{integrations-C5Oix6ng.js → integrations-DlYOHq7T.js} +2 -2
- package/public/assets/{issue-ref-chip-ODyondIa.js → issue-ref-chip-CeWBNWn7.js} +2 -2
- package/public/assets/{log-viewer-Cvfy6PW7.js → log-viewer-Cib8nqdE.js} +2 -2
- package/public/assets/{maintenance-D8CDH5wZ.js → maintenance-DSn1cPm7.js} +2 -2
- package/public/assets/{managed-agents-egllbpij.js → managed-agents-C3CkM81m.js} +2 -2
- package/public/assets/{markdown-preview-CYSFgVgK.js → markdown-preview-W4VQQPAv.js} +3 -3
- package/public/assets/{markdown-preview-impl-BteVIjX4.js → markdown-preview-impl-CMsTdhjq.js} +2 -2
- package/public/assets/{memory-C8WmXsyr.js → memory-BV17qtO4.js} +2 -2
- package/public/assets/{messages-BzQdqlO6.js → messages-Bm_1AqSA.js} +2 -2
- package/public/assets/{orchestrators-B1HxzkNw.js → orchestrators-Dg-vfP09.js} +2 -2
- package/public/assets/{overview-DCUnI4Z7.js → overview-DcYCrvlr.js} +2 -2
- package/public/assets/{pairs-ftCd2XcD.js → pairs-8o9nuG3V.js} +2 -2
- package/public/assets/{profile-icon-B2zH8DMH.js → profile-icon-BsRyBMea.js} +2 -2
- package/public/assets/project-profile-instructions-DETKFn_E.js +2 -0
- package/public/assets/projects-M_m6AHws.js +2 -0
- package/public/assets/{prompt-settings-Bftq9czX.js → prompt-settings-C_mNCgeL.js} +2 -2
- package/public/assets/provider-display-BEeLXC_D.js +2 -0
- package/public/assets/{registry-DWCU5c8q.js → registry-DDHHHE5N.js} +2 -2
- package/public/assets/run-card-Dt4I4jaP.js +2 -0
- package/public/assets/scroll-text-BKXS1ahr.js +2 -0
- package/public/assets/{secrets-C7GIUATz.js → secrets-BkVwxI5O.js} +2 -2
- package/public/assets/{service-access-settings-C3aujqTG.js → service-access-settings-Crq-6a-B.js} +2 -2
- package/public/assets/{settings-C6sZ9eBa.js → settings-CYcavMFu.js} +2 -2
- package/public/assets/shipping-H6gzEeZB.js +2 -0
- package/public/assets/{stats-V9Z-GxUd.js → stats-BJVeWkpV.js} +2 -2
- package/public/assets/{status-dot-CVv0iGHL.js → status-dot-BcHyw1Vw.js} +2 -2
- package/public/assets/store-DKPDIZBe.js +9 -0
- package/public/assets/{tasks-CXU75HRF.js → tasks-qJjlQPpx.js} +2 -2
- package/public/assets/{teams-BPf976zb.js → teams-Cd5Sk1uX.js} +2 -2
- package/public/assets/{terminal-viewer-DE9BOe-8.js → terminal-viewer-CpY5_m7W.js} +3 -3
- package/public/assets/{terminal-viewer-impl-D04pjmGh.js → terminal-viewer-impl-DI_2llFR.js} +2 -2
- package/public/assets/token-estimate-Co-Jdphh.js +2 -0
- package/public/assets/{use-agent-terminal-B1yR456R.js → use-agent-terminal-0yJA_buM.js} +2 -2
- package/public/assets/{use-decisions-D-S4tpDf.js → use-decisions-uJXHf34W.js} +2 -2
- package/public/assets/use-project-list-CpWl6eHQ.js +2 -0
- package/public/assets/{use-selectors-CnrAk2YP.js → use-selectors-BdxBW8mL.js} +2 -2
- package/public/assets/{user-avatar-nBFIcR4M.js → user-avatar-3IndfpOc.js} +2 -2
- package/public/assets/versioned-prompt-editor-CIVg7XB1.js +8 -0
- package/public/assets/{work-queue-TCjJxeT-.js → work-queue-B9rnLwHZ.js} +2 -2
- package/public/assets/{workflow-marker-Cf3Hf2fN.js → workflow-marker-X8wxyhzC.js} +2 -2
- package/public/assets/{workflows-CXQX20Qj.js → workflows-o5YyMFW7.js} +2 -2
- package/public/assets/{workspaces-qSYzKYMA.js → workspaces-CzEGoAng.js} +2 -2
- package/public/cosmos.html +4 -4
- package/public/index.html +31 -29
- package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/runner/plugins/claude/hooks/gate-run-guard.provisioned.mjs +31 -1
- package/runner/src/adapters/claude-effort.ts +2 -4
- package/runner/src/adapters/claude-headless.ts +1 -1
- package/runner/src/adapters/claude-launch-exit.ts +26 -0
- package/runner/src/adapters/claude-session-probe.ts +1 -1
- package/runner/src/adapters/claude-tmux.ts +38 -10
- package/runner/src/adapters/claude.ts +28 -75
- package/runner/src/adapters/codex-launch-config.ts +4 -5
- package/runner/src/adapters/codex.ts +1 -1
- package/runner/src/adapters/opencode-provider.ts +7 -22
- package/runner/src/adapters/opencode.ts +4 -4
- package/runner/src/adapters/provider-quota-harvest.ts +20 -71
- package/runner/src/agent-runner/credentials.ts +42 -12
- package/runner/src/agent-runner/inbox.ts +27 -0
- package/runner/src/agent-runner/lifecycle-milestones.ts +2 -4
- package/runner/src/agent-runner/liveness-exchange.ts +104 -0
- package/runner/src/bin/claude.ts +4 -0
- package/runner/src/bin/codex.ts +4 -0
- package/runner/src/bin/opencode.ts +4 -0
- package/runner/src/claude-system-prompt.ts +49 -0
- package/runner/src/index.ts +5 -2
- package/runner/src/launch-assembly.ts +14 -10
- package/runner/src/profile-home.ts +1 -1
- package/runner/src/project-instructions.ts +2 -2
- package/runner/src/provider-command.ts +18 -0
- package/runner/src/provider-setup.ts +35 -0
- package/runner/src/providers.ts +2 -1
- package/runner/src/runner-core.ts +32 -38
- package/runner/src/runner-helpers.ts +0 -8
- package/runner/src/session-scratch.ts +6 -2
- package/runner/src/spawn-input.ts +2 -1
- package/runner/src/test-run-dedup.ts +59 -56
- package/runner/test-support/provisioning-context.ts +4 -2
- package/runner/test-support/runner-harness.ts +2 -1
- package/scripts/cd-config.ts +8 -0
- package/scripts/gate-run-lease.ts +10 -7
- package/scripts/gate.sh +5 -1
- package/scripts/steward-policy-cleanup.ts +2 -2
- package/src/agent-authz.ts +2 -2
- package/src/agent-drive-arbiter.ts +3 -8
- package/src/agent-exit-cleanup-async.ts +2 -2
- package/src/agent-exit-cleanup.ts +23 -19
- package/src/agent-lifecycle-events.ts +112 -85
- package/src/agent-ref.ts +3 -2
- package/src/agent-status-events.ts +43 -14
- package/src/auth/password.ts +4 -3
- package/src/auth/session-refresh.ts +1 -1
- package/src/auth/session.test-fixture.ts +2 -2
- package/src/auth/session.ts +7 -7
- package/src/automations/crud.ts +8 -81
- package/src/automations/dispatch.ts +33 -58
- package/src/automations/index.ts +1 -1
- package/src/automations/persistence.ts +65 -0
- package/src/automations/precheck.ts +18 -16
- package/src/automations/read-async.ts +11 -0
- package/src/automations/reconcile.ts +30 -39
- package/src/automations/storage.ts +33 -10
- package/src/automations/write-async.ts +33 -0
- package/src/branch-land-notice.ts +93 -0
- package/src/branch-landed.ts +31 -98
- package/src/bus.ts +40 -39
- package/src/cd-deploy-notify.ts +32 -4
- package/src/cd-host-lag-notify.ts +7 -6
- package/src/ci/incidents.ts +2 -2
- package/src/ci/monitor.ts +5 -8
- package/src/ci/notifications.ts +4 -4
- package/src/ci/root-missing.ts +4 -9
- package/src/ci/transition-notify.ts +12 -44
- package/src/claude-app/oauth-http.ts +3 -3
- package/src/cli/cd-pauses.ts +19 -0
- package/src/cli/orchestrator.ts +1 -1
- package/src/cli/state.ts +2 -19
- package/src/cli/task-edit.ts +22 -0
- package/src/cli/task.ts +3 -1
- package/src/cli/workflow.ts +19 -4
- package/src/commands-db.ts +7 -7
- package/src/commands-write.ts +8 -0
- package/src/compaction-watch.ts +10 -8
- package/src/config-store-write.ts +13 -1
- package/src/config-store.ts +25 -14
- package/src/config.ts +4 -11
- package/src/connectors.ts +10 -8
- package/src/context-advisory.ts +22 -21
- package/src/db/activity-async.ts +6 -1
- package/src/db/activity-write-ops.ts +12 -1
- package/src/db/activity.ts +1 -14
- package/src/db/agent-action-write.ts +36 -0
- package/src/db/agent-control-async.ts +9 -0
- package/src/db/agent-control-write.ts +49 -0
- package/src/db/agent-effort-observe.ts +22 -0
- package/src/db/agent-meta.ts +14 -3
- package/src/db/agent-search.ts +1 -15
- package/src/db/agents-async.ts +59 -9
- package/src/db/agents-write-ops.ts +12 -3
- package/src/db/agents.ts +95 -65
- package/src/db/auth-identities.ts +2 -2
- package/src/db/automation-read-ops.ts +11 -0
- package/src/db/automation-write-ops.ts +46 -0
- package/src/db/blackboard.ts +2 -2
- package/src/db/browser-session-write.ts +32 -0
- package/src/db/bus-outbox-write-ops.ts +3 -1
- package/src/db/checkout-refresh-schema.ts +47 -0
- package/src/db/checkout-refresh.ts +5 -5
- package/src/db/ci-incidents-async.ts +5 -5
- package/src/db/ci-incidents-write-ops.ts +2 -2
- package/src/db/command-agent-profile-backfill.ts +39 -0
- package/src/db/command-agent-profiles.ts +5 -1
- package/src/db/command-retention.ts +126 -0
- package/src/db/command-row.ts +10 -2
- package/src/db/commands-list-query.ts +2 -0
- package/src/db/commands-planner-stats.test-fixture.ts +8 -0
- package/src/db/commands-read-ops.ts +16 -0
- package/src/db/commands-spawn-read.ts +1 -1
- package/src/db/config-store-write-ops.ts +7 -2
- package/src/db/connection.ts +1 -182
- package/src/db/context-carry-write.ts +74 -0
- package/src/db/continuation-archives-async.ts +5 -0
- package/src/db/continuation-archives-write-ops.ts +7 -0
- package/src/db/continuations.ts +6 -6
- package/src/db/db-error-registry.ts +12 -0
- package/src/db/db-writer-worker.ts +8 -1
- package/src/db/deploy-events-async.ts +1 -0
- package/src/db/deploy-events-read-ops.ts +2 -1
- package/src/db/deploy-events.ts +35 -4
- package/src/db/gateway.ts +26 -133
- package/src/db/history-retention-ops.ts +13 -0
- package/src/db/hosts-registration.ts +10 -2
- package/src/db/hosts.ts +9 -6
- package/src/db/inbox-async.ts +2 -2
- package/src/db/inbox-read-ops.ts +1 -1
- package/src/db/inbox.ts +9 -17
- package/src/db/index.ts +2 -0
- package/src/db/integrations-async.ts +8 -0
- package/src/db/integrations-ops.ts +15 -0
- package/src/db/integrations.ts +15 -21
- package/src/db/issue-associations.ts +2 -2
- package/src/db/issue-lifecycle.ts +3 -4
- package/src/db/issue-refs-async.ts +23 -0
- package/src/db/issue-refs-read-ops.ts +6 -0
- package/src/db/issue-refs-write-ops.ts +29 -0
- package/src/db/issue-refs.ts +15 -16
- package/src/db/kernel-event-log-schema.ts +2 -0
- package/src/db/land-boundaries.ts +51 -5
- package/src/db/land-gate-attestations.ts +2 -2
- package/src/db/landing-receipts.ts +2 -2
- package/src/db/lifecycle-context-write.ts +5 -0
- package/src/db/lifecycle-tail-async.ts +76 -0
- package/src/db/lifecycle-tail-write-ops.ts +62 -0
- package/src/db/lifecycle-write-window.ts +2 -1
- package/src/db/lineage-pair-dedupe-sql.ts +3 -3
- package/src/db/long-running-work.ts +2 -2
- package/src/db/main-connection-mode.ts +11 -0
- package/src/db/main-connection-writes.ts +41 -2
- package/src/db/maintenance-job-reconcile.ts +61 -0
- package/src/db/maintenance-job-runs-async.ts +14 -0
- package/src/db/maintenance-job-write-ops.ts +9 -0
- package/src/db/maintenance-pauses.ts +2 -2
- package/src/db/mappers.ts +2 -14
- package/src/db/merge-lease.ts +1 -15
- package/src/db/message-send.ts +4 -0
- package/src/db/messages.ts +31 -25
- package/src/db/migrations.ts +25 -16
- package/src/db/notification-write-ops.ts +19 -0
- package/src/db/operator-answer-write.ts +19 -0
- package/src/db/orchestrators.ts +14 -76
- package/src/db/pairs-async.ts +22 -1
- package/src/db/pairs-write-ops.ts +8 -3
- package/src/db/pairs.ts +42 -61
- package/src/db/plan-dispatch-schema.ts +5 -1
- package/src/db/plan-ready-notices.ts +43 -0
- package/src/db/plan-tools-include-migration.ts +36 -0
- package/src/db/plans-write-ops.ts +2 -0
- package/src/db/presence-buffer.ts +5 -0
- package/src/db/presence-loop.ts +18 -23
- package/src/db/presence-write.ts +0 -6
- package/src/db/project-entries-async.ts +14 -0
- package/src/db/project-entries-read-ops.ts +5 -1
- package/src/db/project-entries-write-ops.ts +8 -0
- package/src/db/project-entries.ts +15 -12
- package/src/db/project-journal.ts +2 -2
- package/src/db/project-profile-instructions.ts +50 -0
- package/src/db/project-trust-approvals.ts +2 -2
- package/src/db/prompt-templates.ts +4 -4
- package/src/db/prompt-versions.ts +9 -2
- package/src/db/provider-config-history.ts +8 -3
- package/src/db/provider-model-seed.ts +34 -0
- package/src/db/read-op-marshaling-fixtures.ts +23 -0
- package/src/db/read-ops.ts +8 -0
- package/src/db/retention.ts +13 -2
- package/src/db/review-publish-write.ts +8 -0
- package/src/db/routing-policy.ts +2 -3
- package/src/db/runtime-admin-async.ts +19 -0
- package/src/db/runtime-admin-write-ops.ts +36 -0
- package/src/db/runtime-tail-async.ts +288 -0
- package/src/db/runtime-tail-write-ops.ts +97 -0
- package/src/db/schema.ts +13 -4
- package/src/db/spawn-budget.ts +5 -0
- package/src/db/spawn-delegation-state.ts +11 -4
- package/src/db/spawn-delegation.ts +1 -11
- package/src/db/sql-audit-indexes.ts +3 -0
- package/src/db/stats-async.ts +9 -6
- package/src/db/task-entity.ts +28 -6
- package/src/db/task-list.ts +3 -1
- package/src/db/tasks.ts +1 -17
- package/src/db/team-claim-policy.ts +60 -0
- package/src/db/teams-async.ts +4 -0
- package/src/db/teams-write-ops.ts +4 -0
- package/src/db/terminal-events.ts +15 -0
- package/src/db/timer-cutover-bodies.ts +292 -0
- package/src/db/timer-cutover-core.ts +37 -278
- package/src/db/timer-cutover-state.ts +40 -0
- package/src/db/timer-cutover-write-ops.ts +1 -40
- package/src/db/timer-ingress.ts +7 -1
- package/src/db/token-db-write-ops.ts +19 -0
- package/src/db/token-standing-async.ts +12 -0
- package/src/db/token-standing.ts +21 -20
- package/src/db/token-usage-retention.ts +33 -0
- package/src/db/token-usage-write-ops.ts +1 -1
- package/src/db/token-usage.ts +4 -1
- package/src/db/user-invites-async.ts +13 -0
- package/src/db/user-invites.ts +3 -3
- package/src/db/users.ts +14 -6
- package/src/db/workflow-contact.ts +1 -1
- package/src/db/workflow-task-read-ops.ts +30 -0
- package/src/db/workspaces.ts +8 -5
- package/src/db/write-ops.ts +37 -12
- package/src/db/writer-fault-seam.ts +2 -9
- package/src/db/writer-fault-test-ops.ts +18 -0
- package/src/db/writer-gateway.ts +58 -56
- package/src/dev.ts +8 -3
- package/src/dispatch-availability.ts +10 -6
- package/src/ephemeral/{landing-ingress-proof-worker.ts → landing-ingress-proof.test-fixture.ts} +4 -2
- package/src/event-loop-lag.ts +4 -2
- package/src/event-loop-yield.ts +2 -2
- package/src/events.ts +10 -8
- package/src/host/disk-alert.ts +121 -0
- package/src/host-provider-store.ts +5 -4
- package/src/hub-metrics-report.ts +5 -1
- package/src/hub-metrics.ts +38 -18
- package/src/injection-sweep-pacing.ts +6 -8
- package/src/land-gate-notifications.ts +11 -10
- package/src/land-gate-queue-progress.ts +3 -3
- package/src/land-settle-dispatch.ts +52 -92
- package/src/lifecycle-context-pressure.ts +11 -10
- package/src/lifecycle-manager.ts +107 -100
- package/src/maintenance/breaker.ts +18 -16
- package/src/maintenance/cd-watcher.ts +3 -3
- package/src/maintenance/checkout-refresh.ts +18 -1
- package/src/maintenance/critical-job-watchdog.ts +19 -20
- package/src/maintenance/events.ts +3 -3
- package/src/maintenance/history-retention-job.ts +30 -0
- package/src/maintenance/index.ts +1 -0
- package/src/maintenance/jobs.ts +32 -69
- package/src/maintenance/long-running-work.ts +3 -1
- package/src/maintenance/offline-agent-prune-job.ts +28 -0
- package/src/maintenance/orphaned-sessions.ts +5 -4
- package/src/maintenance/pauses.ts +4 -10
- package/src/maintenance/plan-ready-notice-job.ts +71 -0
- package/src/maintenance/scheduler.ts +98 -137
- package/src/maintenance/stalled-delivery-pager.ts +10 -9
- package/src/maintenance/teams.ts +19 -30
- package/src/maintenance/workspaces.ts +18 -28
- package/src/managed-policy-escalation.ts +7 -7
- package/src/managed-policy.ts +32 -28
- package/src/managed-provider-gate.ts +5 -4
- package/src/managed-spawn-reservation.ts +5 -4
- package/src/mcp/index.ts +12 -9
- package/src/mcp/output-descriptions.ts +8 -8
- package/src/mcp/presentation.ts +6 -5
- package/src/mcp/project-profile-instructions.ts +32 -0
- package/src/mcp/runtime-output.ts +6 -1
- package/src/mcp/self-care-visibility.ts +2 -2
- package/src/mcp/spawn-targets-matrix.ts +10 -1
- package/src/mcp/tool-groups.ts +4 -3
- package/src/mcp/tool-roles.ts +81 -0
- package/src/mcp/tools-spawn.ts +4 -3
- package/src/mcp/tools-workspace.ts +1 -1
- package/src/mcp-agent-action.ts +1 -2
- package/src/mcp-blackboard-tools.ts +6 -5
- package/src/mcp-decision-tools.ts +7 -7
- package/src/mcp-egress-tools.ts +10 -9
- package/src/mcp-issue-activity-tools.ts +2 -2
- package/src/mcp-issue-association-tools.ts +4 -4
- package/src/mcp-issue-ref-tools.ts +13 -12
- package/src/mcp-maintenance-tools.ts +2 -2
- package/src/mcp-merge-tools.ts +5 -5
- package/src/mcp-notification-subscription-tools.ts +14 -15
- package/src/mcp-output-levels.test-fixture.ts +1 -1
- package/src/mcp-profile-trust-tools.ts +5 -5
- package/src/mcp-project-journal-tools.ts +4 -12
- package/src/mcp-project-tools.ts +17 -18
- package/src/mcp-provider-catalog.ts +2 -2
- package/src/mcp-routing-policy-tools.ts +3 -2
- package/src/mcp-task-tools.ts +11 -5
- package/src/mcp-team-template-tools.ts +3 -3
- package/src/mcp-team-tools.ts +6 -6
- package/src/mcp-workflow-tools.ts +13 -4
- package/src/memory-area-injection.ts +13 -12
- package/src/memory-boundary-capture.ts +6 -6
- package/src/memory-injection.ts +45 -43
- package/src/merge-pause-maintenance.ts +5 -4
- package/src/notification-router.ts +44 -17
- package/src/notification-types.ts +2 -1
- package/src/notify.ts +5 -5
- package/src/observed-reset-refresh.ts +4 -4
- package/src/operator-alarm.ts +23 -11
- package/src/project-ingest.ts +6 -6
- package/src/project-instructions.ts +12 -1
- package/src/project-profile-instruction-text.ts +6 -0
- package/src/project-profile-instructions.ts +20 -0
- package/src/project-trust.ts +12 -11
- package/src/prompt-resolver.ts +3 -3
- package/src/provider-catalog-store.ts +3 -49
- package/src/provider-config-store.ts +12 -11
- package/src/provider-model-seed.ts +1 -18
- package/src/provider-quota-async.ts +5 -7
- package/src/provider-quota-config-store.ts +5 -4
- package/src/provider-secrets.test-fixture.ts +3 -3
- package/src/provider-timeline-event.ts +4 -7
- package/src/quota-band-delivery.ts +2 -2
- package/src/recipe-runner.ts +6 -5
- package/src/repo-config-source.ts +10 -4
- package/src/retention-config-store.ts +4 -3
- package/src/reviewer-pipeline.ts +11 -10
- package/src/routes/_route.ts +4 -4
- package/src/routes/_shared.ts +13 -12
- package/src/routes/agent-effort.ts +5 -5
- package/src/routes/agent-heartbeat-quota.ts +23 -0
- package/src/routes/agent-keep.ts +1 -1
- package/src/routes/agent-profiles.ts +6 -6
- package/src/routes/agent-reporting.ts +1 -1
- package/src/routes/agent-self-effort.ts +5 -5
- package/src/routes/agent-sessions.ts +24 -24
- package/src/routes/agents-spawn.ts +2 -2
- package/src/routes/agents.ts +19 -121
- package/src/routes/auth.ts +14 -15
- package/src/routes/authority-audit.ts +2 -2
- package/src/routes/automations.ts +6 -5
- package/src/routes/channel-binding-delete.ts +1 -1
- package/src/routes/channel-output.ts +3 -3
- package/src/routes/claude-api-budget.ts +5 -5
- package/src/routes/commands-listing.ts +5 -1
- package/src/routes/commands.ts +31 -29
- package/src/routes/context-resets.ts +2 -2
- package/src/routes/continuation-archives.ts +2 -2
- package/src/routes/coordinator-teams.ts +1 -1
- package/src/routes/decisions.ts +2 -2
- package/src/routes/host-secret-files.ts +1 -1
- package/src/routes/hosts.ts +11 -11
- package/src/routes/inbox.ts +3 -2
- package/src/routes/index.ts +12 -2
- package/src/routes/integrations.ts +32 -56
- package/src/routes/issue-activity.ts +2 -2
- package/src/routes/issue-associations.ts +4 -4
- package/src/routes/issue-refs.ts +9 -9
- package/src/routes/kernel-timers-operator.ts +1 -1
- package/src/routes/memory.ts +1 -1
- package/src/routes/merges.ts +11 -11
- package/src/routes/messages.ts +23 -17
- package/src/routes/orchestrator-bootstrap.ts +2 -2
- package/src/routes/orchestrator-host-registration.ts +4 -2
- package/src/routes/orchestrator-host-utilization.ts +5 -3
- package/src/routes/orchestrator-proxy.ts +4 -4
- package/src/routes/orchestrator.ts +28 -19
- package/src/routes/pairs.ts +8 -8
- package/src/routes/project-profile-instructions.ts +27 -0
- package/src/routes/project-trust.ts +3 -3
- package/src/routes/projects.ts +16 -16
- package/src/routes/prompt-templates.ts +12 -12
- package/src/routes/provider-config.ts +6 -6
- package/src/routes/provider-quota-config.ts +2 -2
- package/src/routes/provider-quotas.ts +10 -10
- package/src/routes/run-command.ts +1 -1
- package/src/routes/secrets-backup.ts +2 -2
- package/src/routes/secrets-import.ts +1 -1
- package/src/routes/secrets-vault.ts +7 -7
- package/src/routes/settings.ts +6 -6
- package/src/routes/shipping.ts +9 -1
- package/src/routes/spawn-policy.ts +8 -7
- package/src/routes/sse.ts +2 -2
- package/src/routes/stats.ts +6 -6
- package/src/routes/task-http.ts +15 -1
- package/src/routes/task-issues.ts +11 -26
- package/src/routes/tasks.ts +22 -53
- package/src/routes/team-templates.ts +12 -12
- package/src/routes/teams-config.ts +2 -2
- package/src/routes/teams.ts +10 -10
- package/src/routes/tokens.ts +30 -22
- package/src/routes/users.ts +24 -24
- package/src/routes/viewer-read.ts +3 -3
- package/src/routes/web-tool-calls.ts +4 -4
- package/src/routes/workflows.ts +22 -7
- package/src/routes/workspaces.ts +17 -16
- package/src/routing-policy-normalize.ts +1 -2
- package/src/routing-policy-push.ts +6 -6
- package/src/routing-step-defaults.ts +0 -2
- package/src/runner-token-mint-limit.ts +63 -0
- package/src/runtime-grant.ts +21 -13
- package/src/runtime-tokens.ts +59 -35
- package/src/secrets-broker/config.ts +1 -1
- package/src/secrets-broker/service.ts +2 -2
- package/src/security.ts +16 -21
- package/src/self-resume-carry.ts +21 -110
- package/src/self-resume-supersede.ts +4 -3
- package/src/self-resume.ts +54 -66
- package/src/server-background.ts +2 -2
- package/src/server.ts +26 -24
- package/src/services/agent-action.ts +12 -31
- package/src/services/agent-effort.ts +7 -32
- package/src/services/agent-hang-watchdog-job.ts +2 -2
- package/src/services/agent-heartbeat.ts +166 -0
- package/src/services/agent-reporting.ts +1 -1
- package/src/services/browser-inventory.ts +3 -3
- package/src/services/browser-session-state.ts +3 -2
- package/src/services/browser-session.ts +21 -27
- package/src/services/bus-command-update.ts +9 -9
- package/src/services/checkout-refresh-state.ts +1 -0
- package/src/services/checkout-refresh.test-fixture.ts +3 -2
- package/src/services/command-host.ts +7 -2
- package/src/services/coordinator-digest.ts +3 -2
- package/src/services/dispatch-command.ts +12 -13
- package/src/services/effective-launch-driver.ts +14 -9
- package/src/services/host-changed-paths.test-fixture.ts +5 -6
- package/src/services/host-project-readiness.ts +2 -2
- package/src/services/host-providers.ts +1 -1
- package/src/services/host-utilization.ts +27 -4
- package/src/services/idle-agent-digest.ts +17 -12
- package/src/services/idle-epics.ts +9 -10
- package/src/services/interrupt-agent.ts +12 -9
- package/src/services/issue-activity.ts +3 -3
- package/src/services/issue-associations.ts +15 -18
- package/src/services/issue-lifecycle-comments.ts +3 -2
- package/src/services/issue-lifecycle.ts +69 -72
- package/src/services/issue-refs.ts +10 -15
- package/src/services/kernel-timers-cutover-chaos-worker.ts +11 -8
- package/src/services/kernel-timers-ingress-chaos-worker.ts +6 -1
- package/src/services/kernel-timers-ingress.ts +4 -4
- package/src/services/kernel-timers-message-authority-chaos-worker.ts +3 -10
- package/src/services/kernel-timers-operator-chaos-worker.ts +3 -2
- package/src/services/kernel-timers-outbox.ts +1 -1
- package/src/services/kernel-timers-stage10-operator.ts +1 -1
- package/src/services/kernel-timers.ts +4 -3
- package/src/services/land-gate-placement.ts +11 -2
- package/src/services/land-issue-relations.ts +5 -4
- package/src/services/land-restart-retry.ts +7 -6
- package/src/services/landed-ancestry.ts +25 -8
- package/src/services/legacy-landing-host.ts +4 -1
- package/src/services/legacy-landing-recovery.ts +8 -6
- package/src/services/managed-running.ts +17 -17
- package/src/services/memory-areas.ts +17 -53
- package/src/services/merge-pause.ts +9 -15
- package/src/services/operator-decisions.ts +37 -41
- package/src/services/orchestrator-registration-recovery.ts +6 -2
- package/src/services/orchestrator-upgrade.ts +14 -12
- package/src/services/permission-decision.ts +4 -3
- package/src/services/plan-ci-notice.ts +57 -0
- package/src/services/plan-ci-recovery.ts +2 -55
- package/src/services/plan-conformance.ts +4 -4
- package/src/services/plan-dispatch-policy.ts +10 -3
- package/src/services/plan-dispatch.ts +35 -14
- package/src/services/plan-graph.ts +39 -261
- package/src/services/plan-import.ts +1 -1
- package/src/services/plan-live-bindings.ts +8 -37
- package/src/services/plan-task-create.ts +1 -1
- package/src/services/plan-terminal-refs.ts +2 -12
- package/src/services/plan-wake-digest.ts +9 -3
- package/src/services/profile-trust.ts +6 -5
- package/src/services/project-config-read.ts +70 -0
- package/src/services/project-profile-instructions.ts +54 -0
- package/src/services/project.ts +11 -10
- package/src/services/prompt-templates.ts +6 -5
- package/src/services/provider-hold-nudge.ts +9 -9
- package/src/services/provider-hold-record.ts +13 -12
- package/src/services/provider-state-audit.ts +19 -18
- package/src/services/provisioning-harness/budget-baseline.json +4 -4
- package/src/services/provisioning-harness/driver.ts +1 -1
- package/src/services/provisioning-harness/fixture-matrix.ts +3 -3
- package/src/services/provisioning-harness/lifecycle.ts +24 -22
- package/src/services/provisioning-harness/prepare.ts +16 -17
- package/src/services/rate-limit-resume.ts +10 -9
- package/src/services/red-main-auto-revert.ts +7 -5
- package/src/services/red-main-controller-deps.ts +20 -3
- package/src/services/red-main-incident.ts +3 -1
- package/src/services/red-main-quarantine.ts +2 -3
- package/src/services/register-agent.ts +22 -22
- package/src/services/restart-project-role.ts +1 -1
- package/src/services/restart-spawn.ts +74 -61
- package/src/services/review-publish.ts +7 -24
- package/src/services/review-ref-reconcile.ts +29 -38
- package/src/services/runtime-dependency-alert.ts +27 -0
- package/src/services/scheduler-command.ts +11 -9
- package/src/services/scheduler.ts +5 -5
- package/src/services/self-care-state.ts +2 -1
- package/src/services/self-effort-grant.ts +5 -25
- package/src/services/self-effort.ts +5 -5
- package/src/services/send-message.ts +21 -34
- package/src/services/shutdown-agent.ts +17 -14
- package/src/services/spawn-agent.ts +25 -43
- package/src/services/spawn-chain-inspector.ts +7 -14
- package/src/services/spawn-cwd-placement.ts +21 -5
- package/src/services/spawn-issue-activity.ts +8 -6
- package/src/services/spawn-launch.ts +17 -1
- package/src/services/spawn-loss-escalation.ts +1 -1
- package/src/services/spawn-policy.ts +68 -0
- package/src/services/spawn-registration-watchdog.ts +2 -2
- package/src/services/spawn-repo-probe.ts +7 -5
- package/src/services/spawn-tree-cleanup.ts +8 -9
- package/src/services/steward-reaper.ts +4 -4
- package/src/services/task-context-hydration.ts +25 -1
- package/src/services/task-delivery.ts +20 -34
- package/src/services/task-dispatch.ts +3 -0
- package/src/services/task-entity.ts +40 -203
- package/src/services/task-issue-link.ts +13 -20
- package/src/services/task-issue-weave.ts +12 -11
- package/src/services/task-lifecycle.ts +27 -31
- package/src/services/task-repo-cwd.ts +37 -0
- package/src/services/task-review-hold.ts +4 -17
- package/src/services/task-semantic-events.ts +13 -11
- package/src/services/task-state-reconcile.ts +8 -17
- package/src/services/task-validation.ts +2 -2
- package/src/services/team-templates.ts +12 -11
- package/src/services/team.ts +31 -98
- package/src/services/terminal-provider-exit.ts +6 -5
- package/src/services/timer-message-fire-chaos-worker.ts +7 -3
- package/src/services/timer-message-fire-outbox.ts +1 -1
- package/src/services/transient-agent-reaper.ts +25 -20
- package/src/services/turn-reconcile-audit.ts +9 -9
- package/src/services/user-onboarding.ts +8 -6
- package/src/services/user-profile.ts +6 -9
- package/src/services/work-finality.ts +16 -4
- package/src/services/workflow-auto-start.ts +26 -13
- package/src/services/workflow-caller.ts +61 -4
- package/src/services/workflow-child-proof-worker.ts +1 -1
- package/src/services/workflow-ci-main.ts +1 -1
- package/src/services/workflow-control-proof-worker.ts +1 -1
- package/src/services/workflow-coordinator.ts +8 -2
- package/src/services/workflow-decisions.ts +5 -5
- package/src/services/workflow-deferred-cleanup.ts +5 -3
- package/src/services/workflow-effect-driver.ts +42 -17
- package/src/services/workflow-effects.ts +58 -37
- package/src/services/workflow-land-notice.ts +10 -0
- package/src/services/workflow-pause-text.ts +43 -0
- package/src/services/workflow-pins.ts +7 -4
- package/src/services/workflow-reconcile.ts +14 -11
- package/src/services/workflow-resume-pins.ts +3 -3
- package/src/services/workflow-routing-defaults.ts +18 -0
- package/src/services/workflow-run-view.ts +6 -3
- package/src/services/workflow-run.test-fixture.ts +1 -1
- package/src/services/workflow-runs.ts +61 -33
- package/src/services/workflow-supervisor-state.ts +26 -1
- package/src/services/workflow-supervisor.ts +11 -6
- package/src/services/workspace-recovery.ts +4 -3
- package/src/settings/registry.ts +1 -2
- package/src/spawn-admission.ts +10 -2
- package/src/spawn-command.ts +4 -4
- package/src/spawn-models.ts +10 -12
- package/src/spawn-placement.ts +28 -10
- package/src/spawn-targets.ts +9 -9
- package/src/sse-agent-status.ts +15 -6
- package/src/sse.ts +49 -24
- package/src/startup-context-injection.ts +62 -57
- package/src/state-adoption/cd-cutover.ts +53 -7
- package/src/state-adoption/fleet-cutover.ts +35 -0
- package/src/state-adoption/fleet-plan.ts +36 -0
- package/src/state-adoption/index.ts +2 -2
- package/src/state-adoption/linux-plan.ts +2 -2
- package/src/state-adoption/linux.ts +2 -2
- package/src/state-adoption/macos-plan.ts +2 -2
- package/src/state-adoption/macos.ts +1 -1
- package/src/steward-handoff.ts +4 -3
- package/src/steward-policy-cleanup.ts +9 -8
- package/src/steward.ts +9 -8
- package/src/task-dispatch-live.ts +6 -3
- package/src/task-dispatcher.ts +3 -3
- package/src/teams-config-store.ts +4 -3
- package/src/token-db-write.ts +10 -0
- package/src/token-db.ts +2 -2
- package/src/token-usage-async.ts +2 -4
- package/src/user-awaiting-reply.ts +5 -5
- package/src/workspace-actions.ts +24 -29
- package/src/workspace-auto-merge.ts +14 -12
- package/src/workspace-changed-paths-client.ts +16 -5
- package/src/workspace-cleanup-stale.ts +30 -7
- package/src/workspace-command-settle.ts +26 -17
- package/src/workspace-config.ts +1 -1
- package/src/workspace-conflict-resolver.ts +9 -7
- package/src/workspace-dead-owner-recovery.ts +5 -4
- package/src/workspace-escalation.ts +12 -11
- package/src/workspace-human-escalation.ts +3 -3
- package/src/workspace-land-gate-watchdog.ts +3 -3
- package/src/workspace-land-refusal.ts +20 -0
- package/src/workspace-land-stopped.ts +1 -0
- package/src/workspace-merge.ts +10 -26
- package/src/workspace-nothing-to-land-notice.ts +2 -2
- package/src/workspace-orphans.ts +18 -37
- package/src/workspace-pr-completion.ts +10 -8
- package/src/workspace-rekey.ts +3 -3
- package/src/workspace-steward-failure.ts +2 -2
- package/src/workspace-steward-wake.ts +4 -4
- package/node_modules/@humwick/kernel/LICENSE +0 -167
- package/node_modules/@humwick/kernel/async-entity-persistence.ts +0 -344
- package/node_modules/@humwick/kernel/async-event-log.ts +0 -107
- package/node_modules/@humwick/kernel/automations.pilot.ts +0 -147
- package/node_modules/@humwick/kernel/config.ts +0 -111
- package/node_modules/@humwick/kernel/contract.ts +0 -572
- package/node_modules/@humwick/kernel/control-authz.ts +0 -281
- package/node_modules/@humwick/kernel/control.ts +0 -645
- package/node_modules/@humwick/kernel/effects.ts +0 -493
- package/node_modules/@humwick/kernel/event-log.ts +0 -319
- package/node_modules/@humwick/kernel/http-transport.ts +0 -384
- package/node_modules/@humwick/kernel/identity-grammar.ts +0 -20
- package/node_modules/@humwick/kernel/identity.ts +0 -248
- package/node_modules/@humwick/kernel/index.ts +0 -28
- package/node_modules/@humwick/kernel/kernel-persistence.ts +0 -181
- package/node_modules/@humwick/kernel/landing-incident.ts +0 -306
- package/node_modules/@humwick/kernel/landing.ts +0 -953
- package/node_modules/@humwick/kernel/manifest-validation.ts +0 -460
- package/node_modules/@humwick/kernel/mcp-transport.ts +0 -109
- package/node_modules/@humwick/kernel/message-authority-chaos-worker.ts +0 -200
- package/node_modules/@humwick/kernel/message-authority.ts +0 -281
- package/node_modules/@humwick/kernel/module-host.ts +0 -722
- package/node_modules/@humwick/kernel/openapi-init.ts +0 -14
- package/node_modules/@humwick/kernel/package.json +0 -39
- package/node_modules/@humwick/kernel/persistence-schema.ts +0 -248
- package/node_modules/@humwick/kernel/persistence.ts +0 -510
- package/node_modules/@humwick/kernel/registry.ts +0 -60
- package/node_modules/@humwick/kernel/sqlite-kernel-persistence.ts +0 -499
- package/node_modules/@humwick/kernel/sqlite-module-host.ts +0 -87
- package/node_modules/@humwick/kernel/timers-chaos-worker.ts +0 -186
- package/node_modules/@humwick/kernel/timers.pilot.ts +0 -1411
- package/node_modules/@humwick/kernel/workflow-activation.ts +0 -25
- package/node_modules/@humwick/kernel/workflow-backstop.ts +0 -40
- package/node_modules/@humwick/kernel/workflow-cancel-tree.ts +0 -20
- package/node_modules/@humwick/kernel/workflow-chaos-worker.ts +0 -213
- package/node_modules/@humwick/kernel/workflow-composition.ts +0 -231
- package/node_modules/@humwick/kernel/workflow-container.ts +0 -72
- package/node_modules/@humwick/kernel/workflow-control.test-fixture.ts +0 -42
- package/node_modules/@humwick/kernel/workflow-control.ts +0 -178
- package/node_modules/@humwick/kernel/workflow-definition.ts +0 -507
- package/node_modules/@humwick/kernel/workflow-dispatch.ts +0 -60
- package/node_modules/@humwick/kernel/workflow-foreach.ts +0 -167
- package/node_modules/@humwick/kernel/workflow-journal-codec.ts +0 -339
- package/node_modules/@humwick/kernel/workflow-journal.ts +0 -922
- package/node_modules/@humwick/kernel/workflow-lane.ts +0 -48
- package/node_modules/@humwick/kernel/workflow-lease-owner.ts +0 -60
- package/node_modules/@humwick/kernel/workflow-recovery.test-fixture.ts +0 -19
- package/node_modules/@humwick/kernel/workflow-runtime.ts +0 -938
- package/node_modules/@humwick/kernel/workflow-script.ts +0 -11
- package/node_modules/@humwick/kernel/workflow-state.ts +0 -299
- package/node_modules/@humwick/kernel/workflow-step-commit.ts +0 -195
- package/node_modules/@humwick/kernel/workflow-transitions.ts +0 -317
- package/node_modules/@humwick/kernel/workflow-values.ts +0 -153
- package/node_modules/@humwick/kernel/workflow.pilot.ts +0 -376
- package/node_modules/@humwick/offload/LICENSE +0 -167
- package/node_modules/@humwick/offload/README.md +0 -57
- package/node_modules/@humwick/offload/dist/async-runner.d.ts +0 -18
- package/node_modules/@humwick/offload/dist/async-runner.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/async-runner.js +0 -158
- package/node_modules/@humwick/offload/dist/async-runner.js.map +0 -1
- package/node_modules/@humwick/offload/dist/envelope.d.ts +0 -25
- package/node_modules/@humwick/offload/dist/envelope.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/envelope.js +0 -80
- package/node_modules/@humwick/offload/dist/envelope.js.map +0 -1
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts +0 -10
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.js +0 -59
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.js.map +0 -1
- package/node_modules/@humwick/offload/dist/index.d.ts +0 -5
- package/node_modules/@humwick/offload/dist/index.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/index.js +0 -5
- package/node_modules/@humwick/offload/dist/index.js.map +0 -1
- package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts +0 -62
- package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/subprocess-runner.js +0 -295
- package/node_modules/@humwick/offload/dist/subprocess-runner.js.map +0 -1
- package/node_modules/@humwick/offload/dist/types.d.ts +0 -111
- package/node_modules/@humwick/offload/dist/types.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/types.js +0 -176
- package/node_modules/@humwick/offload/dist/types.js.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-pool.d.ts +0 -23
- package/node_modules/@humwick/offload/dist/worker-pool.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-pool.js +0 -435
- package/node_modules/@humwick/offload/dist/worker-pool.js.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-runtime.d.ts +0 -2
- package/node_modules/@humwick/offload/dist/worker-runtime.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-runtime.js +0 -27
- package/node_modules/@humwick/offload/dist/worker-runtime.js.map +0 -1
- package/node_modules/@humwick/offload/dist/worker.d.ts +0 -5
- package/node_modules/@humwick/offload/dist/worker.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/worker.js +0 -1
- package/node_modules/@humwick/offload/dist/worker.js.map +0 -1
- package/node_modules/@humwick/offload/package.json +0 -42
- package/node_modules/@humwick/offload/src/async-runner.ts +0 -170
- package/node_modules/@humwick/offload/src/envelope.ts +0 -92
- package/node_modules/@humwick/offload/src/fixtures/worker-task.ts +0 -49
- package/node_modules/@humwick/offload/src/index.ts +0 -4
- package/node_modules/@humwick/offload/src/subprocess-runner.ts +0 -334
- package/node_modules/@humwick/offload/src/types.ts +0 -235
- package/node_modules/@humwick/offload/src/worker-pool.ts +0 -463
- package/node_modules/@humwick/offload/src/worker-runtime.ts +0 -32
- package/node_modules/@humwick/offload/src/worker.ts +0 -5
- package/public/assets/agent-liveness-DyqxfB-t.js +0 -2
- package/public/assets/agent-profiles-BpI_jTxq.js +0 -2
- package/public/assets/index-B7ZerHLY.css +0 -2
- package/public/assets/index-BU3uWo2t.js +0 -15
- package/public/assets/projects-B_lmcqfO.js +0 -2
- package/public/assets/provider-display-DbLWpP3j.js +0 -2
- package/public/assets/run-card-CO_bguQf.js +0 -2
- package/public/assets/shipping-Bu8p1gEw.js +0 -2
- package/public/assets/store-BvtFdlGX.js +0 -9
- package/public/assets/use-project-list-B-T2Bnnn.js +0 -2
- package/public/assets/versioned-prompt-editor-Diu8BIaM.js +0 -8
- package/runner/src/agent-runner/http-liveness.ts +0 -85
- package/runner/src/gate-run-lease-probe.ts +0 -38
- package/src/db/claude-catalog-reconcile.ts +0 -27
- package/src/db/on-loop-write-transaction.ts +0 -34
- package/src/routing-model-aliases.ts +0 -21
package/src/config-store.ts
CHANGED
|
@@ -1120,24 +1120,35 @@ export function listAgentProfiles(): ConfigEntry<AgentProfile>[] {
|
|
|
1120
1120
|
].sort((a, b) => Number(Boolean(b.value.builtIn)) - Number(Boolean(a.value.builtIn)) || a.key.localeCompare(b.key));
|
|
1121
1121
|
}
|
|
1122
1122
|
|
|
1123
|
+
/** Where a profile write lands: a built-in's override row, else its own row. The rollback snapshot is
|
|
1124
|
+
* dropped by setConfigInternal on an override write (#1963 N10). */
|
|
1125
|
+
export function agentProfileWriteNamespace(profile: AgentProfile, opts: { overrideBuiltIn?: boolean } = {}): string {
|
|
1126
|
+
return BUILT_IN_AGENT_PROFILE_NAMES.has(profile.name) && opts.overrideBuiltIn ? AGENT_PROFILE_OVERRIDE_NAMESPACE : AGENT_PROFILE_NAMESPACE;
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
/** The stored entry a profile write returns: an override reads back merged over its built-in. */
|
|
1130
|
+
export function savedAgentProfileEntry(saved: ConfigEntry<AgentProfile>): ConfigEntry<AgentProfile> {
|
|
1131
|
+
return saved.namespace === AGENT_PROFILE_OVERRIDE_NAMESPACE ? getAgentProfile(saved.key)! : applyProfilePromptEntry(saved)!;
|
|
1132
|
+
}
|
|
1133
|
+
|
|
1134
|
+
/** Sync twin for tests and boot; runtime callers use `setAgentProfileAsync` (#1870 S7). */
|
|
1123
1135
|
export function setAgentProfile(profile: AgentProfile, updatedBy?: string, opts: { overrideBuiltIn?: boolean } = {}): ConfigEntry<AgentProfile> {
|
|
1124
|
-
|
|
1125
|
-
// The rollback snapshot is dropped by setConfigInternal on this override write (#1963 N10).
|
|
1126
|
-
setConfig(AGENT_PROFILE_OVERRIDE_NAMESPACE, profile.name, profile, updatedBy);
|
|
1127
|
-
return getAgentProfile(profile.name)!;
|
|
1128
|
-
}
|
|
1129
|
-
return applyProfilePromptEntry(setConfig(AGENT_PROFILE_NAMESPACE, profile.name, profile, updatedBy))!;
|
|
1136
|
+
return savedAgentProfileEntry(setConfig(agentProfileWriteNamespace(profile, opts), profile.name, profile, updatedBy));
|
|
1130
1137
|
}
|
|
1131
1138
|
|
|
1132
|
-
|
|
1133
|
-
|
|
1139
|
+
/** The row a profile delete removes. #2791 — resolves case-insensitively, so DELETE /qa drops "QA". The
|
|
1140
|
+
* rollback snapshot is dropped by deleteConfigInternal on an override delete (#1963 N10). */
|
|
1141
|
+
export function agentProfileDeleteTarget(name: string, opts: { resetBuiltInOverride?: boolean } = {}): { namespace: string; key: string } {
|
|
1134
1142
|
const canonical = resolveAgentProfileKey(name) ?? name;
|
|
1135
|
-
if (BUILT_IN_AGENT_PROFILE_NAMES.has(canonical)) {
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1143
|
+
if (!BUILT_IN_AGENT_PROFILE_NAMES.has(canonical)) return { namespace: AGENT_PROFILE_NAMESPACE, key: canonical };
|
|
1144
|
+
if (opts.resetBuiltInOverride) return { namespace: AGENT_PROFILE_OVERRIDE_NAMESPACE, key: canonical };
|
|
1145
|
+
throw new ValidationError("built-in agent profiles are managed by Relay");
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
/** Sync twin for tests; runtime callers use `deleteAgentProfileAsync` (#1870 S7). */
|
|
1149
|
+
export function deleteAgentProfile(name: string, updatedBy?: string, opts: { resetBuiltInOverride?: boolean } = {}): boolean {
|
|
1150
|
+
const target = agentProfileDeleteTarget(name, opts);
|
|
1151
|
+
return deleteConfig(target.namespace, target.key, updatedBy);
|
|
1141
1152
|
}
|
|
1142
1153
|
|
|
1143
1154
|
export function getManagedAgentState(policyName: string): ManagedAgentState | null {
|
package/src/config.ts
CHANGED
|
@@ -637,21 +637,14 @@ export const DB_READER_JOB_TIMEOUT_MS = envPositiveInt("AGENT_RELAY_DB_READER_JO
|
|
|
637
637
|
export const DB_READER_MARSHAL_IN_PROCESS =
|
|
638
638
|
process.env.NODE_ENV === "test" || relayEnv(process.env, "AGENT_RELAY_DB_MARSHAL") === "1";
|
|
639
639
|
|
|
640
|
-
/**
|
|
641
|
-
* Phase-R rollout gate (#1960 T2 — ADR 0001 §7 Phase 1) for the gateway's READER half only. The
|
|
642
|
-
* writer stays in-process unconditionally: Phase W (a worker writer taking the sole RW connection) is
|
|
643
|
-
* a separate, much larger burn-down (#1870) and is deliberately NOT wired here. Any value other than
|
|
644
|
-
* the literal `"worker"` — unset included — resolves to `"in-process"`, so this is behavior-preserving
|
|
645
|
-
* by default; an operator opts in explicitly per the same string-literal convention as
|
|
646
|
-
* `parseKernelTimersMode`.
|
|
647
|
-
*/
|
|
640
|
+
/** Explicit reader placement override. Otherwise file databases use workers (#3339). */
|
|
648
641
|
export type GatewayReaderBackendMode = "in-process" | "worker";
|
|
649
642
|
|
|
650
|
-
export function parseGatewayReaderBackend(value: string | undefined): GatewayReaderBackendMode {
|
|
651
|
-
return value === "worker"
|
|
643
|
+
export function parseGatewayReaderBackend(value: string | undefined): GatewayReaderBackendMode | undefined {
|
|
644
|
+
return value === "worker" || value === "in-process" ? value : undefined;
|
|
652
645
|
}
|
|
653
646
|
|
|
654
|
-
export function gatewayReaderBackendFromEnv(): GatewayReaderBackendMode {
|
|
647
|
+
export function gatewayReaderBackendFromEnv(): GatewayReaderBackendMode | undefined {
|
|
655
648
|
return parseGatewayReaderBackend(relayEnv(process.env, "AGENT_RELAY_GATEWAY_READER_BACKEND"));
|
|
656
649
|
}
|
|
657
650
|
|
package/src/connectors.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
import { framed } from "./hub-metrics";
|
|
2
|
+
import { upsertAgentAsync } from "./db/agents-async";
|
|
1
3
|
import { writeChildEnv } from "@humwick/sdk/env";
|
|
2
4
|
import { timePostBindPhase } from "./post-bind-startup";
|
|
3
5
|
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
6
|
import { homedir } from "node:os";
|
|
5
7
|
import { dirname, join, resolve } from "node:path";
|
|
6
8
|
import type { ConnectorAction, ConnectorActionResult, ConnectorManifest, ConnectorSummary } from "./types";
|
|
7
|
-
import {
|
|
9
|
+
import { ValidationError } from "./db";
|
|
8
10
|
import { CHANNELS_HOST_SECRETS } from "@humwick/sdk/channels-host-service";
|
|
9
11
|
import { fireAndForget, guardedInterval, isRecord } from "@humwick/sdk";
|
|
10
12
|
import { registerConnectorConfigSetting, validateConnectorConfig } from "./settings/modules";
|
|
@@ -274,11 +276,11 @@ export function startConnectorStatusPoller(): void {
|
|
|
274
276
|
// deploy that took down the relay/orchestrator tree) BEFORE the first status
|
|
275
277
|
// poll overwrites their persisted "running" flag with the now-dead reality.
|
|
276
278
|
void fireAndForget("[connectors] boot reconcile", async () => {
|
|
277
|
-
await fireAndForget("[connectors] ensure channels host", () => timePostBindPhase("connectors.ensureChannelsHostConnector", () => ensureChannelsHostOnBoot()));
|
|
279
|
+
await fireAndForget("[connectors] ensure channels host", () => timePostBindPhase("connectors.ensureChannelsHostConnector", async () => (await ensureChannelsHostOnBoot())));
|
|
278
280
|
await fireAndForget("[connectors] reconcile on boot", () => timePostBindPhase("connectors.reconcileConnectorsOnBoot", reconcileConnectorsOnBoot));
|
|
279
281
|
await timePostBindPhase("connectors.refreshAllConnectorStatuses", refreshAllConnectorStatuses);
|
|
280
282
|
});
|
|
281
|
-
guardedInterval("[connectors] status poll", STATUS_POLL_INTERVAL_MS, () => timePostBindPhase("connectors.refreshAllConnectorStatuses", refreshAllConnectorStatuses));
|
|
283
|
+
guardedInterval("[connectors] status poll", STATUS_POLL_INTERVAL_MS, framed("timer connector-status", () => timePostBindPhase("connectors.refreshAllConnectorStatuses", refreshAllConnectorStatuses)));
|
|
282
284
|
}
|
|
283
285
|
|
|
284
286
|
const CHANNELS_HOST_ID = "channels-host";
|
|
@@ -386,14 +388,14 @@ function configuredNtfyTopic(): string | null {
|
|
|
386
388
|
* adapter's own gate — an unconfigured relay genuinely has no escalation target and must
|
|
387
389
|
* still warn. Returns true when the row was (re)registered.
|
|
388
390
|
*/
|
|
389
|
-
export function ensureEscalationChannelRegistered(): boolean {
|
|
391
|
+
export async function ensureEscalationChannelRegistered(): Promise<boolean> {
|
|
390
392
|
if (isEphemeralMode()) return false;
|
|
391
393
|
const topic = configuredNtfyTopic();
|
|
392
394
|
if (!topic) return false;
|
|
393
395
|
// Shape matches the channels-host adapter's registration (channels-host/src/relay.ts
|
|
394
396
|
// registerChannel + adapters/ntfy.ts channels()), so its later re-registration updates
|
|
395
397
|
// the same row in place rather than churning it.
|
|
396
|
-
|
|
398
|
+
(await upsertAgentAsync({
|
|
397
399
|
id: ESCALATION_NTFY_CHANNEL_ID,
|
|
398
400
|
name: "ntfy",
|
|
399
401
|
kind: "channel",
|
|
@@ -411,7 +413,7 @@ export function ensureEscalationChannelRegistered(): boolean {
|
|
|
411
413
|
displayName: "ntfy",
|
|
412
414
|
topicChannels: [topic],
|
|
413
415
|
},
|
|
414
|
-
});
|
|
416
|
+
}));
|
|
415
417
|
return true;
|
|
416
418
|
}
|
|
417
419
|
|
|
@@ -429,7 +431,7 @@ export async function ensureChannelsHostConnector(entry = resolveChannelsHostEnt
|
|
|
429
431
|
// Register the escalation channel row now that config (incl. any legacy-migrated topic)
|
|
430
432
|
// is persisted, so the escalation-target check passes without waiting for the async
|
|
431
433
|
// channels-host SSE connect (#1510).
|
|
432
|
-
ensureEscalationChannelRegistered();
|
|
434
|
+
(await ensureEscalationChannelRegistered());
|
|
433
435
|
|
|
434
436
|
|
|
435
437
|
}
|
|
@@ -437,7 +439,7 @@ export async function ensureChannelsHostConnector(entry = resolveChannelsHostEnt
|
|
|
437
439
|
/** Boot wrapper: a failed bring-up is logged with its stack and raised to /api/health, never swallowed (#3393). */
|
|
438
440
|
export async function ensureChannelsHostOnBoot(entry?: string | null): Promise<void> {
|
|
439
441
|
try {
|
|
440
|
-
await (entry === undefined ? ensureChannelsHostConnector() : ensureChannelsHostConnector(entry));
|
|
442
|
+
await (entry === undefined ? (await ensureChannelsHostConnector()) : (await ensureChannelsHostConnector(entry)));
|
|
441
443
|
clearChannelsHostEnsureFailure();
|
|
442
444
|
} catch (error) {
|
|
443
445
|
console.error("[connectors] ensureChannelsHostConnector failed:", error instanceof Error ? (error.stack ?? error.message) : error);
|
package/src/context-advisory.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { getGateway } from "./db/gateway";
|
|
1
2
|
import { deriveContextThresholdFromWindowTokens, findProviderCatalogModel, resolveProviderContextThreshold, type ProviderModelCatalogEntry, type ResolvedProviderContextThreshold } from "@humwick/sdk/provider-catalog";
|
|
2
|
-
import { isRecord, isSpawnProvider } from "@humwick/sdk";
|
|
3
|
+
import { fireAndForget, isRecord, isSpawnProvider } from "@humwick/sdk";
|
|
3
4
|
import { HARD_BACKSTOP_BUSY_GRACE_MS } from "./config";
|
|
4
5
|
import { getConfig } from "./config-store";
|
|
5
6
|
import { getToken } from "./token-db";
|
|
@@ -39,7 +40,7 @@ interface EffectiveContextThreshold extends ResolvedProviderContextThreshold {
|
|
|
39
40
|
* #315 — context pressure is a relay-native signal: durable event for observers,
|
|
40
41
|
* plus an agent-facing system push when lifecycle notifications are enabled.
|
|
41
42
|
*/
|
|
42
|
-
function notifyContextAdvisory(input: ContextAdvisoryInput): void {
|
|
43
|
+
async function notifyContextAdvisory(input: ContextAdvisoryInput): Promise<void> {
|
|
43
44
|
const payload = {
|
|
44
45
|
kind: "agent.context_threshold",
|
|
45
46
|
agentId: input.agentId,
|
|
@@ -63,20 +64,20 @@ function notifyContextAdvisory(input: ContextAdvisoryInput): void {
|
|
|
63
64
|
|
|
64
65
|
// Short default TTL (per-type): a stale context advisory is misleading — the band may have moved
|
|
65
66
|
// by the time the agent next polls, so old advice shouldn't wake it.
|
|
66
|
-
routeNotification({
|
|
67
|
+
await routeNotification({
|
|
67
68
|
type: "agent.context_threshold",
|
|
68
69
|
scope: { agentId: input.agentId },
|
|
69
70
|
recipients: [input.agentId],
|
|
70
71
|
message: {
|
|
71
72
|
subject: input.stage === "warn" ? "Context threshold warning" : "Context self-compact threshold reached",
|
|
72
|
-
body: contextAdvisoryBody(input),
|
|
73
|
+
body: (await contextAdvisoryBody(input)),
|
|
73
74
|
payload,
|
|
74
75
|
replyExpected: false,
|
|
75
76
|
},
|
|
76
77
|
});
|
|
77
78
|
}
|
|
78
79
|
|
|
79
|
-
function contextAdvisoryBody(input: ContextAdvisoryInput): string {
|
|
80
|
+
async function contextAdvisoryBody(input: ContextAdvisoryInput): Promise<string> {
|
|
80
81
|
const tokens = `${formatTokens(input.tokens)} / ${formatTokens(input.windowTokens)} tokens used`;
|
|
81
82
|
const percent = `${input.percent}% of window, ${input.band}% band`;
|
|
82
83
|
const threshold = `resolved self-compact threshold ${input.selfCompactPercent}% (${input.thresholdSource})`;
|
|
@@ -96,7 +97,7 @@ function contextAdvisoryBody(input: ContextAdvisoryInput): string {
|
|
|
96
97
|
threshold,
|
|
97
98
|
hardBackstop: `${input.hardBackstopPercent}%`,
|
|
98
99
|
});
|
|
99
|
-
return withPreBoundaryCapture(advisory, input.agentId);
|
|
100
|
+
return (await withPreBoundaryCapture(advisory, input.agentId));
|
|
100
101
|
}
|
|
101
102
|
|
|
102
103
|
/**
|
|
@@ -110,8 +111,8 @@ function contextAdvisoryBody(input: ContextAdvisoryInput): string {
|
|
|
110
111
|
* Appended rather than woven into the advisory templates so a blank slug leaves the advisory body
|
|
111
112
|
* BYTE-IDENTICAL to the pre-P5 one.
|
|
112
113
|
*/
|
|
113
|
-
function withPreBoundaryCapture(advisory: string, agentId: string): string {
|
|
114
|
-
const capture = boundaryCaptureClause({ seam: "pre", agentId });
|
|
114
|
+
async function withPreBoundaryCapture(advisory: string, agentId: string): Promise<string> {
|
|
115
|
+
const capture = (await boundaryCaptureClause({ seam: "pre", agentId }));
|
|
115
116
|
return capture ? `${advisory}\n\n${capture}` : advisory;
|
|
116
117
|
}
|
|
117
118
|
|
|
@@ -123,12 +124,12 @@ function contextAdvisoryBand(utilization: number, threshold: EffectiveContextThr
|
|
|
123
124
|
return { band: utilizationPercent(threshold.warnUtilization), stage: "warn" };
|
|
124
125
|
}
|
|
125
126
|
|
|
126
|
-
export function handleContextPressure(input: {
|
|
127
|
+
export async function handleContextPressure(input: {
|
|
127
128
|
agent: AgentCard;
|
|
128
129
|
now: () => number;
|
|
129
130
|
hasActiveCommand: (target: string, type: string) => boolean;
|
|
130
|
-
compact: (reason: string) => Command | null
|
|
131
|
-
}): boolean {
|
|
131
|
+
compact: (reason: string) => Command | null | Promise<Command | null>;
|
|
132
|
+
}): Promise<boolean> {
|
|
132
133
|
const { agent, now } = input;
|
|
133
134
|
const context = agent.context;
|
|
134
135
|
if (!context) return false;
|
|
@@ -138,7 +139,7 @@ export function handleContextPressure(input: {
|
|
|
138
139
|
const advisory = contextAdvisoryBand(context.utilization, threshold);
|
|
139
140
|
if (advisory === null) {
|
|
140
141
|
if (context.lastContextAdvisoryBand !== undefined || context.lastContextAdvisoryAt !== undefined || context.hardBackstopDeferredAt !== undefined) {
|
|
141
|
-
persistContextState(agent.id, clearContextAdvisory(context));
|
|
142
|
+
(await persistContextState(agent.id, clearContextAdvisory(context)));
|
|
142
143
|
}
|
|
143
144
|
return false;
|
|
144
145
|
}
|
|
@@ -160,8 +161,8 @@ export function handleContextPressure(input: {
|
|
|
160
161
|
// mid-turn (the runner waits for the live turn to clear before submitting the keystrokes).
|
|
161
162
|
const graceElapsed = deferredAt !== undefined && now() - deferredAt >= HARD_BACKSTOP_BUSY_GRACE_MS;
|
|
162
163
|
if (!busy || graceElapsed) {
|
|
163
|
-
input.compact(busy ? "context-hard-backstop-busy" : "context-hard-backstop");
|
|
164
|
-
if (deferredAt !== undefined) persistContextState(agent.id, clearHardBackstopDefer(context));
|
|
164
|
+
await input.compact(busy ? "context-hard-backstop-busy" : "context-hard-backstop");
|
|
165
|
+
if (deferredAt !== undefined) (await persistContextState(agent.id, clearHardBackstopDefer(context)));
|
|
165
166
|
return true;
|
|
166
167
|
}
|
|
167
168
|
// Busy and within grace: start the bounded defer clock (once), then fall through so the
|
|
@@ -169,19 +170,19 @@ export function handleContextPressure(input: {
|
|
|
169
170
|
// the forced backstop.
|
|
170
171
|
if (deferredAt === undefined) {
|
|
171
172
|
state = { ...context, hardBackstopDeferredAt: now() };
|
|
172
|
-
persistContextState(agent.id, state);
|
|
173
|
+
(await persistContextState(agent.id, state));
|
|
173
174
|
}
|
|
174
175
|
} else if (context.hardBackstopDeferredAt !== undefined) {
|
|
175
176
|
// Dropped below the hard backstop (or a forced compaction is already in flight): reset the clock
|
|
176
177
|
// so a later re-crossing starts a fresh grace window rather than firing immediately.
|
|
177
178
|
state = clearHardBackstopDefer(context);
|
|
178
|
-
persistContextState(agent.id, state);
|
|
179
|
+
(await persistContextState(agent.id, state));
|
|
179
180
|
}
|
|
180
181
|
if (state.lastContextAdvisoryBand === advisory.band) return false;
|
|
181
182
|
const tokens = finiteNumber(context.tokensUsed);
|
|
182
183
|
const windowTokens = finiteNumber(context.tokensMax);
|
|
183
184
|
if (tokens === undefined || windowTokens === undefined) return false;
|
|
184
|
-
notifyContextAdvisory({
|
|
185
|
+
await fireAndForget(`[context] advisory ${input.agent.id}`, async () => (await notifyContextAdvisory({
|
|
185
186
|
agentId: agent.id,
|
|
186
187
|
agent,
|
|
187
188
|
tokens,
|
|
@@ -193,8 +194,8 @@ export function handleContextPressure(input: {
|
|
|
193
194
|
selfCompactPercent: utilizationPercent(threshold.selfCompactUtilization),
|
|
194
195
|
hardBackstopPercent: utilizationPercent(threshold.hardBackstopUtilization),
|
|
195
196
|
thresholdSource: threshold.source,
|
|
196
|
-
});
|
|
197
|
-
persistContextState(agent.id, { ...state, lastContextAdvisoryBand: advisory.band, lastContextAdvisoryAt: now() });
|
|
197
|
+
})));
|
|
198
|
+
(await persistContextState(agent.id, { ...state, lastContextAdvisoryBand: advisory.band, lastContextAdvisoryAt: now() }));
|
|
198
199
|
return true;
|
|
199
200
|
}
|
|
200
201
|
|
|
@@ -258,8 +259,8 @@ function clearHardBackstopDefer(context: ContextState): ContextState {
|
|
|
258
259
|
return rest;
|
|
259
260
|
}
|
|
260
261
|
|
|
261
|
-
function persistContextState(agentId: string, context: ContextState): void {
|
|
262
|
-
|
|
262
|
+
async function persistContextState(agentId: string, context: ContextState): Promise<void> {
|
|
263
|
+
await getGateway().write("agents.persistAdvisoryContext", [agentId, context]);
|
|
263
264
|
}
|
|
264
265
|
|
|
265
266
|
function finiteNumber(value: unknown): number | undefined {
|
package/src/db/activity-async.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { activityWriteIdempotencyKey } from "./activity-write-ops.ts";
|
|
5
5
|
import { getGateway } from "./gateway.ts";
|
|
6
6
|
import type { ActivityEvent, ActivityEventInput } from "../types";
|
|
7
|
-
import type { AgentIssueActivitySummary, AgentTimelineEntry, IssueActivityAction, IssueActivityAgentSummary, RecordIssueActivityInput } from "./activity.ts";
|
|
7
|
+
import type { AgentIssueActivitySummary, CreateActivityEventResult, AgentTimelineEntry, IssueActivityAction, IssueActivityAgentSummary, RecordIssueActivityInput } from "./activity.ts";
|
|
8
8
|
|
|
9
9
|
export async function listActivityEventsAsync(input: {
|
|
10
10
|
operatorId?: string;
|
|
@@ -43,6 +43,11 @@ export async function createActivityEventAsync(input: ActivityEventInput, idempo
|
|
|
43
43
|
return (await getGateway().write("activity.create", { input }, { idempotencyKey: key })) as unknown as ActivityEvent;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
+
/** Creates by `clientId` and reports whether this call created the row (false: the id already existed). */
|
|
47
|
+
export async function createActivityEventByClientIdAsync(input: ActivityEventInput & { clientId: string }): Promise<CreateActivityEventResult> {
|
|
48
|
+
return (await getGateway().write("activity.createByClientId", { input })) as unknown as CreateActivityEventResult;
|
|
49
|
+
}
|
|
50
|
+
|
|
46
51
|
/** See `createActivityEventAsync` — same `idempotent: false` / key-derivation contract. */
|
|
47
52
|
export async function recordIssueActivityAsync(input: RecordIssueActivityInput, idempotencyKey?: string): Promise<ActivityEvent> {
|
|
48
53
|
const key = activityWriteIdempotencyKey(idempotencyKey, input.clientId);
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
// "do not blindly retry").
|
|
15
15
|
|
|
16
16
|
import { randomUUID } from "node:crypto";
|
|
17
|
-
import { createActivityEvent, recordIssueActivity } from "./activity.ts";
|
|
17
|
+
import { createActivityEvent, createActivityEventWithResult, recordIssueActivity } from "./activity.ts";
|
|
18
|
+
import type { CreateActivityEventResult } from "./activity.ts";
|
|
18
19
|
import type { ActivityEvent, ActivityEventInput } from "../types";
|
|
19
20
|
import type { RecordIssueActivityInput } from "./activity.ts";
|
|
20
21
|
import type { WriterOpContext, WriterOpSpec } from "./write-ops.ts";
|
|
@@ -28,6 +29,16 @@ export const ACTIVITY_WRITE_OPS: Readonly<Record<string, WriterOpSpec>> = Object
|
|
|
28
29
|
idempotent: false,
|
|
29
30
|
fn: (args: ActivityCreateOpArgs, ctx: WriterOpContext): ActivityEvent => createActivityEvent(args.input, ctx.now),
|
|
30
31
|
},
|
|
32
|
+
// Dedups on `clientId` inside the body, so a replay reports `created: false` truthfully; the idempotency
|
|
33
|
+
// ledger would instead replay the first `created: true` (#1870 S7, operator alarms).
|
|
34
|
+
"activity.createByClientId": {
|
|
35
|
+
offLoop: true,
|
|
36
|
+
idempotent: true,
|
|
37
|
+
fn: (args: ActivityCreateOpArgs, ctx: WriterOpContext): CreateActivityEventResult => {
|
|
38
|
+
if (!args.input.clientId) throw new Error("activity.createByClientId requires input.clientId");
|
|
39
|
+
return createActivityEventWithResult(args.input, ctx.now);
|
|
40
|
+
},
|
|
41
|
+
},
|
|
31
42
|
"activity.recordIssueActivity": {
|
|
32
43
|
offLoop: true,
|
|
33
44
|
idempotent: false,
|
package/src/db/activity.ts
CHANGED
|
@@ -1,18 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { isRecord, stringValue, isMechanicalMessageKind } from "@humwick/sdk";
|
|
3
|
-
import { ORCHESTRATOR_PROTOCOL_VERSION, VERSION } from "../config.ts";
|
|
1
|
+
import { isRecord, stringValue } from "@humwick/sdk";
|
|
4
2
|
import { parseJson } from "../utils";
|
|
5
|
-
import { isLiveIsolatedWorkspace } from "../workspace-phase";
|
|
6
|
-
import {
|
|
7
|
-
CONTRACT_REQUIREMENTS,
|
|
8
|
-
contractCompatibility,
|
|
9
|
-
parseRuntimeCapabilities,
|
|
10
|
-
parseRuntimeContracts,
|
|
11
|
-
parseRuntimePackage,
|
|
12
|
-
type RuntimeContracts,
|
|
13
|
-
} from "../contracts";
|
|
14
|
-
import { STALE_TTL_MS, DAY_MS, CLAIM_LEASE_MS, POOL_CLAIM_LEASE_MS, WORKSPACE_MERGE_LEASE_MS } from "../config";
|
|
15
|
-
import { matchAgents } from "../agent-ref";
|
|
16
3
|
import { getDb, ValidationError } from "./connection.ts";
|
|
17
4
|
import { rowToActivityEvent } from "./mappers.ts";
|
|
18
5
|
import { getIssueRef, resolveIssueRefFromString } from "./issue-refs.ts";
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ValidationError } from "@humwick/sdk";
|
|
2
|
+
import { createCommandInternal, getCommand } from "../commands-db";
|
|
3
|
+
import { assertSelfEffortAllowed } from "../services/self-effort";
|
|
4
|
+
import { admitDesiredEffortInternal, getAgentEffortState } from "./agent-effort-state";
|
|
5
|
+
import { getAgent } from "./agents";
|
|
6
|
+
import { sendMessageWithResultInternal } from "./messages";
|
|
7
|
+
import type { AgentCard, CreateCommandInput, SendMessageInput } from "../types";
|
|
8
|
+
import type { EffortChangeActorRole } from "@humwick/sdk";
|
|
9
|
+
|
|
10
|
+
export interface AgentActionWrite {
|
|
11
|
+
agent: AgentCard;
|
|
12
|
+
commandId: string;
|
|
13
|
+
commandInput: Omit<CreateCommandInput, "params"> & { params: Record<string, unknown> };
|
|
14
|
+
requestId?: string;
|
|
15
|
+
effort?: string;
|
|
16
|
+
role: EffortChangeActorRole;
|
|
17
|
+
selfEffort?: { level: string; efforts?: readonly string[] };
|
|
18
|
+
message?: SendMessageInput;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function admitAgentActionBody(input: AgentActionWrite, now: number) {
|
|
22
|
+
const prior = input.requestId ? getCommand(input.requestId) : null;
|
|
23
|
+
if (prior) {
|
|
24
|
+
if (prior.type !== "agent.setEffort" || prior.target !== input.agent.id) throw new ValidationError("requestId belongs to another request");
|
|
25
|
+
return { command: prior, raced: true, effortState: getAgentEffortState(input.agent.id) };
|
|
26
|
+
}
|
|
27
|
+
const current = getAgent(input.agent.id);
|
|
28
|
+
if (!current || current.instanceId !== input.agent.instanceId || current.epoch !== input.agent.epoch) throw new ValidationError("agent instance changed while the action audit was committing");
|
|
29
|
+
if (input.selfEffort) assertSelfEffortAllowed(current, input.selfEffort.level, input.selfEffort.efforts);
|
|
30
|
+
const sent = input.message ? sendMessageWithResultInternal(input.message, false, {}, now) : undefined;
|
|
31
|
+
if (sent) Object.assign(input.commandInput.params, { messageId: sent.message.id, from: sent.message.from });
|
|
32
|
+
const admitted = input.effort ? admitDesiredEffortInternal({ agentId: current.id, effort: input.effort, role: input.role, commandId: input.commandId, now }) : undefined;
|
|
33
|
+
if (admitted) input.commandInput.params.effortVersion = admitted.state.desiredVersion;
|
|
34
|
+
const command = createCommandInternal({ input: input.commandInput, id: input.commandId }, now);
|
|
35
|
+
return { command, raced: false, admitted, sessionMessage: sent?.message };
|
|
36
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { getGateway } from "./gateway";
|
|
2
|
+
import type { AgentControlWrite, SelfEffortGrantWrite, createAgentControlBody, grantSelfEffortBody } from "./agent-control-write";
|
|
3
|
+
|
|
4
|
+
export function createAgentControlAsync(input: AgentControlWrite): Promise<ReturnType<typeof createAgentControlBody>> {
|
|
5
|
+
return getGateway().write("agents.createControl", input, { idempotencyKey: input.commandId, critical: true }) as unknown as Promise<ReturnType<typeof createAgentControlBody>>;
|
|
6
|
+
}
|
|
7
|
+
export function grantSelfEffortAsync(input: SelfEffortGrantWrite): Promise<ReturnType<typeof grantSelfEffortBody>> {
|
|
8
|
+
return getGateway().write("agents.grantSelfEffort", input, { idempotencyKey: input.commandId }) as unknown as Promise<ReturnType<typeof grantSelfEffortBody>>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { ValidationError } from "@humwick/sdk";
|
|
2
|
+
import { createCommandInternal, updateCommandInternal } from "../commands-db";
|
|
3
|
+
import { agentProviderState } from "../provider-state";
|
|
4
|
+
import { stopRefusal, type SafeCandidate } from "../services/idle-agent-digest";
|
|
5
|
+
import { selfEffortIdentity, type SelfEffortGrant, type SelfEffortPolicy } from "../services/self-effort";
|
|
6
|
+
import { getAgent } from "./agents";
|
|
7
|
+
import { SELF_EFFORT_BAND, setSelfEffortCeilingInternal } from "./self-effort-permissions";
|
|
8
|
+
import type { AgentCard, Command, CreateCommandInput } from "../types";
|
|
9
|
+
|
|
10
|
+
export interface AgentControlWrite {
|
|
11
|
+
agent?: AgentCard | null;
|
|
12
|
+
commandId: string;
|
|
13
|
+
commandInput: CreateCommandInput;
|
|
14
|
+
approvalId?: string;
|
|
15
|
+
idleCandidate?: SafeCandidate;
|
|
16
|
+
}
|
|
17
|
+
export function createAgentControlBody(input: AgentControlWrite, now: number): { command?: Command; refused?: string } {
|
|
18
|
+
if (input.agent) {
|
|
19
|
+
const current = getAgent(input.agent.id);
|
|
20
|
+
if (!current || current.instanceId !== input.agent.instanceId || current.epoch !== input.agent.epoch) throw new ValidationError("agent instance changed while the action audit was committing");
|
|
21
|
+
if (input.approvalId) {
|
|
22
|
+
const state = agentProviderState(current);
|
|
23
|
+
if (state?.state !== "blocked" || state.pendingApproval?.id !== input.approvalId) throw new ValidationError("approval request is no longer current");
|
|
24
|
+
}
|
|
25
|
+
if (input.idleCandidate) {
|
|
26
|
+
const refusal = stopRefusal(input.idleCandidate, current, now);
|
|
27
|
+
if (refusal) return { refused: refusal.reason };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return { command: createCommandInternal({ input: input.commandInput, id: input.commandId }, now) };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const SELF_EFFORT_GRANT_COMMAND = "agent.grantSelfEffort";
|
|
34
|
+
export interface SelfEffortGrantWrite {
|
|
35
|
+
agent: AgentCard; grant?: SelfEffortGrant; requestedBy: string; commandId: string; spawnRequestId?: string;
|
|
36
|
+
input: { requestedVia: "mcp" | "http"; requestedByUser?: string };
|
|
37
|
+
selfEffort: SelfEffortPolicy | null; previous: SelfEffortPolicy | null;
|
|
38
|
+
}
|
|
39
|
+
export function grantSelfEffortBody({ agent, grant, requestedBy, commandId, spawnRequestId, input, selfEffort, previous }: SelfEffortGrantWrite, now: number): Command {
|
|
40
|
+
const current = getAgent(agent.id);
|
|
41
|
+
if (!current || current.instanceId !== agent.instanceId || current.epoch !== agent.epoch) throw new ValidationError("agent instance changed while the action audit was committing");
|
|
42
|
+
const identity = selfEffortIdentity(current);
|
|
43
|
+
setSelfEffortCeilingInternal(identity, !grant ? null : "band" in grant ? SELF_EFFORT_BAND : grant.ceiling, requestedBy, now);
|
|
44
|
+
createCommandInternal({ id: commandId, input: { type: SELF_EFFORT_GRANT_COMMAND, source: "system", target: agent.id,
|
|
45
|
+
...(spawnRequestId ? { correlationId: spawnRequestId } : {}), params: { agentId: agent.id,
|
|
46
|
+
...(spawnRequestId ? { spawnRequestId } : {}), permission: identity, selfEffort, previousSelfEffort: previous, requestedBy,
|
|
47
|
+
...(input.requestedByUser ? { requestedByUser: input.requestedByUser } : {}), requestedVia: input.requestedVia, requestedAt: now } } }, now);
|
|
48
|
+
return updateCommandInternal(commandId, { status: "succeeded", result: { selfEffort } }, {}, now).command!;
|
|
49
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { validateAgentSession } from "./agents";
|
|
2
|
+
import { recordEffortObservedInternal } from "./agent-effort-state";
|
|
3
|
+
import { findMessageByIdempotencyKey, sendMessageWithResultInternal } from "./messages";
|
|
4
|
+
export class EffortReportFenced extends Error {}
|
|
5
|
+
/** #2984 — the prompt that resumes an agent once its own effort change applied. */
|
|
6
|
+
export function selfEffortContinuation(effort: string): string {
|
|
7
|
+
return `Effort is now ${effort}. Continue your work.`;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
export function observeEffortBody(input: Parameters<typeof recordEffortObservedInternal>[0]) {
|
|
12
|
+
const session = validateAgentSession(input.agentId, { instanceId: input.instanceId });
|
|
13
|
+
if (!session.ok) throw new EffortReportFenced(session.error ?? "stale agent instance");
|
|
14
|
+
const observed = recordEffortObservedInternal(input);
|
|
15
|
+
const version = observed.outcome !== "stale" ? observed.resumeVersion : undefined;
|
|
16
|
+
const key = `effort-continuation:${input.agentId}:${version}`;
|
|
17
|
+
const continuation = version !== undefined && !findMessageByIdempotencyKey("system", key)
|
|
18
|
+
? sendMessageWithResultInternal({ from: "system", to: input.agentId, kind: "system", subject: "Effort changed",
|
|
19
|
+
body: selfEffortContinuation(input.effort), replyExpected: false, idempotencyKey: key,
|
|
20
|
+
payload: { kind: "agent.effort_continuation", agentId: input.agentId, effortVersion: version, effort: input.effort } }, false, {}, input.now).message : null;
|
|
21
|
+
return { observed, continuation };
|
|
22
|
+
}
|
package/src/db/agent-meta.ts
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
import { isRecord } from "@humwick/sdk";
|
|
6
6
|
|
|
7
7
|
export const AGENT_META_WARN_BYTES = 64 * 1024;
|
|
8
|
+
export const PROFILE_PROJECTION_WARN_BYTES = 192 * 1024;
|
|
9
|
+
export const COMMAND_PROFILE_WARN_BYTES = 1024 * 1024;
|
|
8
10
|
|
|
9
11
|
// Log dedupe only, so a per-thread copy is correct: the writer thread warns once itself (#1870 S6c).
|
|
10
12
|
const warnedOversizeMeta = new Set<string>();
|
|
@@ -62,13 +64,22 @@ export function jsonBytes(value: string): number {
|
|
|
62
64
|
|
|
63
65
|
/** Runtime tripwire: one warning per agent/source until the payload returns below the ceiling. */
|
|
64
66
|
export function warnIfAgentMetaOversized(agentId: string, json: string, source: string): void {
|
|
65
|
-
|
|
67
|
+
warnIfOversized(`${agentId}:${source}`, json, AGENT_META_WARN_BYTES, `[agent-meta] ${agentId} ${source}`);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function warnIfOversized(key: string, json: string, threshold: number, label: string): void {
|
|
66
71
|
const bytes = jsonBytes(json);
|
|
67
|
-
if (bytes <=
|
|
72
|
+
if (bytes <= threshold) {
|
|
68
73
|
warnedOversizeMeta.delete(key);
|
|
69
74
|
return;
|
|
70
75
|
}
|
|
71
76
|
if (warnedOversizeMeta.has(key)) return;
|
|
72
77
|
warnedOversizeMeta.add(key);
|
|
73
|
-
console.warn(
|
|
78
|
+
console.warn(`${label} is ${bytes} bytes (alarm threshold ${threshold})`);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function serializeProfileProjection(agentId: string, projection: unknown): string | null {
|
|
82
|
+
const json = projection == null ? null : JSON.stringify(projection);
|
|
83
|
+
warnIfOversized(`projection:${agentId}`, json ?? "", PROFILE_PROJECTION_WARN_BYTES, `[agent-profile] ${agentId} profile_projection`);
|
|
84
|
+
return json;
|
|
74
85
|
}
|
package/src/db/agent-search.ts
CHANGED
|
@@ -1,18 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { isRecord, stringValue, isMechanicalMessageKind } from "@humwick/sdk";
|
|
3
|
-
import { ORCHESTRATOR_PROTOCOL_VERSION, VERSION } from "../config.ts";
|
|
4
|
-
import { parseJson } from "../utils";
|
|
5
|
-
import { isLiveIsolatedWorkspace } from "../workspace-phase";
|
|
6
|
-
import {
|
|
7
|
-
CONTRACT_REQUIREMENTS,
|
|
8
|
-
contractCompatibility,
|
|
9
|
-
parseRuntimeCapabilities,
|
|
10
|
-
parseRuntimeContracts,
|
|
11
|
-
parseRuntimePackage,
|
|
12
|
-
type RuntimeContracts,
|
|
13
|
-
} from "../contracts";
|
|
14
|
-
import { STALE_TTL_MS, DAY_MS, CLAIM_LEASE_MS, POOL_CLAIM_LEASE_MS, WORKSPACE_MERGE_LEASE_MS } from "../config";
|
|
15
|
-
import { matchAgents } from "../agent-ref";
|
|
1
|
+
import { STALE_TTL_MS } from "../config";
|
|
16
2
|
import { ROSTER_AGENT_COLUMNS } from "./agent-card-read.ts";
|
|
17
3
|
import { getDb } from "./connection.ts";
|
|
18
4
|
import { rowToAgent } from "./mappers.ts";
|