@humwick/server 0.130.2 → 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/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 +73 -4
- package/package.json +8 -7
- package/public/assets/{MessageBubble-BWLqMGKG.js → MessageBubble-Bq9kr21N.js} +2 -2
- package/public/assets/{PlanGraphPanel-3TlIQpjk.js → PlanGraphPanel-Dqiroy06.js} +2 -2
- package/public/assets/{TraceView-Wimm0Czv.js → TraceView-DYU962-H.js} +2 -2
- package/public/assets/{VaultDecisionCard-Bau_vNax.js → VaultDecisionCard-DhPfzioE.js} +2 -2
- package/public/assets/{activity-CrSurn-r.js → activity-DzCcQTee.js} +2 -2
- package/public/assets/{agent-lineage-CknAJKcb.js → agent-lineage-SgDt9i3T.js} +2 -2
- package/public/assets/agent-liveness-Bq-s73jW.js +2 -0
- package/public/assets/{agent-name-DKbiIhBo.js → agent-name-CcY3Aijy.js} +2 -2
- package/public/assets/{agent-profiles-DwF6EQ4R.js → agent-profiles-cxtRBn6O.js} +2 -2
- package/public/assets/{agent-project-badge-Diz4Sjjb.js → agent-project-badge-DGYbIhaI.js} +2 -2
- package/public/assets/{agent-tools-CRhpRQza.js → agent-tools-DHbftV0N.js} +2 -2
- package/public/assets/{agent-type-icon-LrUEU3lB.js → agent-type-icon-CY113sp-.js} +2 -2
- package/public/assets/{agents-B-v66C-4.js → agents-BPzY7IlQ.js} +2 -2
- package/public/assets/{analytics-BqCb-LKi.js → analytics-DENFPv_a.js} +2 -2
- package/public/assets/{artifact-viewer-kf4pGuAR.js → artifact-viewer-KRvSc7sl.js} +2 -2
- package/public/assets/{artifacts-DJevXcvg.js → artifacts-C9gSmL3s.js} +2 -2
- package/public/assets/{artifacts-D32zyw4Y.js → artifacts-DT-HkI5O.js} +2 -2
- package/public/assets/{automation-BpRajx_5.js → automation-BsmjQhKD.js} +2 -2
- package/public/assets/{backlog-D_UjTdzX.js → backlog-8NYH_62t.js} +2 -2
- package/public/assets/{busy-health-N3VEh4ao.js → busy-health-D3hwvYb4.js} +2 -2
- package/public/assets/{channels-9jopungq.js → channels-DCJ5WL7O.js} +2 -2
- package/public/assets/{chat-CSXrTB3C.js → chat-DAIl357U.js} +3 -3
- package/public/assets/{code-preview-p1NnmqK0.js → code-preview-CzrZfr9U.js} +2 -2
- package/public/assets/{connectors-CZdqlDNL.js → connectors-xTxtlyou.js} +2 -2
- package/public/assets/{cosmos-BgdsE4dG.js → cosmos-BpebFLK2.js} +2 -2
- package/public/assets/{crate-agent-30aXTKva.js → crate-agent-BHvI5wXC.js} +2 -2
- package/public/assets/{dependency-graph-B_jvw2GE.js → dependency-graph-DGT0o3wJ.js} +2 -2
- package/public/assets/{deploys-DoN6bAb5.js → deploys-hqWOHSHE.js} +2 -2
- package/public/assets/{display-BrKWFGJz.js → display-CDeH4I8T.js} +2 -2
- package/public/assets/{files-D6XEu8Ng.js → files-BTeGVmTg.js} +2 -2
- package/public/assets/{fleet-C7jQWbw2.js → fleet-DgXtNgCa.js} +2 -2
- package/public/assets/{fleet-metrics-BiDs3MLx.js → fleet-metrics-BHEt5yc_.js} +2 -2
- package/public/assets/{formatted-body-CQBwc1fb.js → formatted-body-MLtodyPp.js} +3 -3
- package/public/assets/{formatted-body-impl-DyG0WsQS.js → formatted-body-impl-CAe664Z8.js} +2 -2
- package/public/assets/{host-providers-dialog-DKaW31dN.js → host-providers-dialog-mapF4Fj9.js} +2 -2
- package/public/assets/{index-CRHep3M9.js → index-CqqgOI5R.js} +5 -5
- package/public/assets/{insights-CzrtkpOE.js → insights-DNyf7IzF.js} +2 -2
- package/public/assets/{integrations-aVsUmigt.js → integrations-DlYOHq7T.js} +2 -2
- package/public/assets/{issue-ref-chip-BnSlM_95.js → issue-ref-chip-CeWBNWn7.js} +2 -2
- package/public/assets/{log-viewer-qe7Ee47Z.js → log-viewer-Cib8nqdE.js} +2 -2
- package/public/assets/{maintenance-NfjqFZAk.js → maintenance-DSn1cPm7.js} +2 -2
- package/public/assets/{managed-agents-BiH0HgaE.js → managed-agents-C3CkM81m.js} +2 -2
- package/public/assets/{markdown-preview-BixaT3Xr.js → markdown-preview-W4VQQPAv.js} +3 -3
- package/public/assets/{markdown-preview-impl-DNGlWIS3.js → markdown-preview-impl-CMsTdhjq.js} +2 -2
- package/public/assets/{memory-DNsCl6UX.js → memory-BV17qtO4.js} +2 -2
- package/public/assets/{messages-DopU1L1X.js → messages-Bm_1AqSA.js} +2 -2
- package/public/assets/{orchestrators-Cq7ckLQT.js → orchestrators-Dg-vfP09.js} +2 -2
- package/public/assets/{overview-C1DCTzzV.js → overview-DcYCrvlr.js} +2 -2
- package/public/assets/{pairs-DE_m6rrE.js → pairs-8o9nuG3V.js} +2 -2
- package/public/assets/{profile-icon-B3rfh77F.js → profile-icon-BsRyBMea.js} +2 -2
- package/public/assets/{project-profile-instructions-DQWZE0kA.js → project-profile-instructions-DETKFn_E.js} +2 -2
- package/public/assets/{projects-Br2Bd2h1.js → projects-M_m6AHws.js} +2 -2
- package/public/assets/{prompt-settings-BKvFsvGD.js → prompt-settings-C_mNCgeL.js} +2 -2
- package/public/assets/provider-display-BEeLXC_D.js +2 -0
- package/public/assets/{registry-Cw38_6gW.js → registry-DDHHHE5N.js} +2 -2
- package/public/assets/run-card-Dt4I4jaP.js +2 -0
- package/public/assets/{secrets-DxI-vzSq.js → secrets-BkVwxI5O.js} +2 -2
- package/public/assets/{service-access-settings-D9s_VJbd.js → service-access-settings-Crq-6a-B.js} +2 -2
- package/public/assets/{settings-CKZTVGIx.js → settings-CYcavMFu.js} +2 -2
- package/public/assets/shipping-H6gzEeZB.js +2 -0
- package/public/assets/{stats-DyUBKyWI.js → stats-BJVeWkpV.js} +2 -2
- package/public/assets/{status-dot-DYqlEUhJ.js → status-dot-BcHyw1Vw.js} +2 -2
- package/public/assets/store-DKPDIZBe.js +9 -0
- package/public/assets/{tasks-Bh7Chr4-.js → tasks-qJjlQPpx.js} +2 -2
- package/public/assets/{teams-bowI7qVY.js → teams-Cd5Sk1uX.js} +2 -2
- package/public/assets/{terminal-viewer-BgVLHdsU.js → terminal-viewer-CpY5_m7W.js} +3 -3
- package/public/assets/{terminal-viewer-impl-Dz22UPy6.js → terminal-viewer-impl-DI_2llFR.js} +2 -2
- package/public/assets/{use-agent-terminal-DSQQ-iY7.js → use-agent-terminal-0yJA_buM.js} +2 -2
- package/public/assets/{use-decisions-samMQhQf.js → use-decisions-uJXHf34W.js} +2 -2
- package/public/assets/{use-project-list-59LheVP7.js → use-project-list-CpWl6eHQ.js} +2 -2
- package/public/assets/{use-selectors-BZa25xEB.js → use-selectors-BdxBW8mL.js} +2 -2
- package/public/assets/{user-avatar-DHxlvUvV.js → user-avatar-3IndfpOc.js} +2 -2
- package/public/assets/{versioned-prompt-editor-BmED5DnJ.js → versioned-prompt-editor-CIVg7XB1.js} +2 -2
- package/public/assets/{work-queue-CSvpuNLz.js → work-queue-B9rnLwHZ.js} +2 -2
- package/public/assets/{workflow-marker-DAZcj5qt.js → workflow-marker-X8wxyhzC.js} +2 -2
- package/public/assets/{workflows-DdmxRSyg.js → workflows-o5YyMFW7.js} +2 -2
- package/public/assets/{workspaces-BxeKfVuF.js → workspaces-CzEGoAng.js} +2 -2
- package/public/cosmos.html +4 -4
- package/public/index.html +28 -28
- package/runner/plugins/claude/.claude-plugin/plugin.json +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 +2 -1
- 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/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/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 +1 -11
- 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/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 +8 -3
- 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/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 +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 +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 +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-secret-files.ts +1 -1
- package/src/routes/hosts.ts +11 -11
- package/src/routes/inbox.ts +3 -2
- package/src/routes/index.ts +2 -1
- 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 +1 -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 +2 -2
- package/src/routes/secrets-import.ts +1 -1
- package/src/routes/secrets-vault.ts +7 -7
- 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-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 +21 -22
- 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 +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-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/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/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/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
|
@@ -42,6 +42,6 @@ export async function relayProfileTrust(auth: McpAuthContext, args: Record<strin
|
|
|
42
42
|
const capability = optionalEnum(args.capability, "capability", PROJECT_TRUST_CAPABILITIES);
|
|
43
43
|
if (!capability) throw new ValidationError("capability is required");
|
|
44
44
|
if (args.action === "ack") return { ack: (await updateProfileProjectTrustAsync(name, { ack: [capability] }, by)).value.sources?.project?.[capability]?.ack };
|
|
45
|
-
if (args.action === "approve") return { approval: approveProfileProjectTrust({ name, capability, repoKey: text(args, "repoKey"), value: text(args, "value"), by }) };
|
|
45
|
+
if (args.action === "approve") return { approval: (await approveProfileProjectTrust({ name, capability, repoKey: text(args, "repoKey"), value: text(args, "value"), by })) };
|
|
46
46
|
throw new ValidationError("action must be set-review, ack or approve");
|
|
47
47
|
}
|
|
@@ -1,13 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
listProjectJournal,
|
|
4
|
-
listProjectJournalHistory,
|
|
5
|
-
PROJECT_JOURNAL_FIELDS,
|
|
6
|
-
PROJECT_JOURNAL_FIELD_LABELS,
|
|
7
|
-
setProjectJournalFields,
|
|
8
|
-
ValidationError,
|
|
9
|
-
type ProjectJournalField,
|
|
10
|
-
} from "./db";
|
|
1
|
+
import { setProjectJournalFieldsAsync } from "./db/runtime-tail-async";
|
|
2
|
+
import { isProjectJournalField, listProjectJournal, listProjectJournalHistory, PROJECT_JOURNAL_FIELDS, PROJECT_JOURNAL_FIELD_LABELS, ValidationError, type ProjectJournalField } from "./db";
|
|
11
3
|
import { callerProjectId } from "./mcp-project-tools";
|
|
12
4
|
import { formatRelativeTime } from "./mcp/presentation";
|
|
13
5
|
import { authContextFromMcp, type AuthContext } from "./services/auth-context";
|
|
@@ -109,7 +101,7 @@ function journalFieldViews(projectId: string, profile: string, filter: ProjectJo
|
|
|
109
101
|
});
|
|
110
102
|
}
|
|
111
103
|
|
|
112
|
-
export function relayProjectJournalTool(auth: McpAuthLike, name: string, args: Record<string, unknown>): Record<string, unknown
|
|
104
|
+
export async function relayProjectJournalTool(auth: McpAuthLike, name: string, args: Record<string, unknown>): Promise<Record<string, unknown>> {
|
|
113
105
|
const ctx = authContextFromMcp(auth);
|
|
114
106
|
const { projectId, profile } = journalScope(ctx);
|
|
115
107
|
|
|
@@ -127,7 +119,7 @@ export function relayProjectJournalTool(auth: McpAuthLike, name: string, args: R
|
|
|
127
119
|
}
|
|
128
120
|
fields[field] = value;
|
|
129
121
|
}
|
|
130
|
-
|
|
122
|
+
(await setProjectJournalFieldsAsync({ projectId, profile, fields, changedBy: authorId(ctx) }));
|
|
131
123
|
return { ok: true };
|
|
132
124
|
}
|
|
133
125
|
|
package/src/mcp-project-tools.ts
CHANGED
|
@@ -1,33 +1,32 @@
|
|
|
1
|
-
import { validateProjectEntryText } from "./validation";
|
|
1
|
+
import { validateProjectEntryText, cleanString, cleanStringArray, optionalEnum } from "./validation";
|
|
2
2
|
import { bindProjectCheckout, unbindProjectCheckout } from "./services/project-checkout-binding";
|
|
3
3
|
import type { ToolDefinition } from "./mcp/types";
|
|
4
4
|
import { PROJECT_ENTRY_SEARCH_PROPERTIES } from "./mcp/project-entry-search-schema";
|
|
5
5
|
import { archiveProject, checkoutStatus, removeCheckout, onboardProject, registerProjectRoot } from "./services/project-onboarding";
|
|
6
6
|
import {
|
|
7
|
-
|
|
7
|
+
addEdgeAsync,
|
|
8
8
|
edgesFor,
|
|
9
9
|
getAgent,
|
|
10
10
|
getProject,
|
|
11
|
-
|
|
11
|
+
getProjectEntryAsync,
|
|
12
12
|
listProjects,
|
|
13
|
-
|
|
13
|
+
promoteBlackboardEntryAsync,
|
|
14
14
|
readMemoryEntriesByIdsAsync,
|
|
15
|
-
|
|
15
|
+
removeEdgeAsync,
|
|
16
16
|
resolveProject,
|
|
17
17
|
resolveProjectEntriesAsync,
|
|
18
18
|
resolveProjectForCwd,
|
|
19
|
-
|
|
19
|
+
retractProjectEntryAsync,
|
|
20
20
|
rootsForProject,
|
|
21
21
|
searchProjectEntriesAsync,
|
|
22
22
|
ValidationError,
|
|
23
|
-
|
|
23
|
+
writeProjectEntryAsync,
|
|
24
24
|
} from "./db";
|
|
25
25
|
import { McpAuthError, McpNotFoundError } from "./mcp-errors";
|
|
26
26
|
import { authContextFromMcp, type AuthContext } from "./services/auth-context";
|
|
27
27
|
import { callerMemoryIdentity, callerProfile, resolveAgentWriteInject, resolveMemoryAudience } from "./services/memory-identity";
|
|
28
28
|
import { areaCallerFromCtx, MEMORY_AREAS_SCHEMA, areaDeliveryReport, resolveWriteAreas } from "./services/memory-areas";
|
|
29
29
|
import { ingestProjectClaudeMd } from "./services/project";
|
|
30
|
-
import { cleanString, cleanStringArray, optionalEnum } from "./validation";
|
|
31
30
|
import { PROJECT_EDGE_KINDS, PROJECT_ENTRY_INJECT_TIERS, PROJECT_ENTRY_KINDS, PROJECT_ENTRY_SOURCES, type ProjectEdgeKind, type ProjectEntry, type ProjectEntryInject, type ProjectEntryKind, type ProjectEntrySource } from "./types";
|
|
32
31
|
|
|
33
32
|
const PROJECT_EDGE_INPUT_SCHEMA = {
|
|
@@ -267,8 +266,8 @@ function requireProjectId(ref: unknown, field: string): string {
|
|
|
267
266
|
/** Load `entryId` and confirm it belongs to `projectId`, or throw not-found. Returns the entry
|
|
268
267
|
* (not just void) so a supersede caller can reuse it — e.g. to inherit its audience (#2268)
|
|
269
268
|
* instead of re-fetching. */
|
|
270
|
-
function ensureSameProject(entryId: string, projectId: string): ProjectEntry {
|
|
271
|
-
const entry =
|
|
269
|
+
async function ensureSameProject(entryId: string, projectId: string): Promise<ProjectEntry> {
|
|
270
|
+
const entry = await getProjectEntryAsync(entryId);
|
|
272
271
|
if (!entry) throw new McpNotFoundError("project entry not found");
|
|
273
272
|
if (entry.projectId !== projectId) throw new McpNotFoundError("project entry not found");
|
|
274
273
|
return entry;
|
|
@@ -326,7 +325,7 @@ export async function relayProjectTool(auth: McpAuthLike, name: string, args: Re
|
|
|
326
325
|
// previously-universal (`all`) rule silently stops injecting for every other role the moment
|
|
327
326
|
// anyone re-saves it without naming an audience. Only true omission inherits; `self` still
|
|
328
327
|
// means "just me" even here.
|
|
329
|
-
const priorEntry = supersedes ? ensureSameProject(supersedes, projectId) : undefined;
|
|
328
|
+
const priorEntry = supersedes ? await ensureSameProject(supersedes, projectId) : undefined;
|
|
330
329
|
const anchor = getProject(projectId);
|
|
331
330
|
if (!anchor) throw new McpNotFoundError("project not found");
|
|
332
331
|
const areas = await resolveWriteAreas(anchor, areaCallerFromCtx(ctx), args.areas, { prior: priorEntry?.areas });
|
|
@@ -335,7 +334,7 @@ export async function relayProjectTool(auth: McpAuthLike, name: string, args: Re
|
|
|
335
334
|
callerProfile(ctx),
|
|
336
335
|
{ kind, ...(priorEntry ? { priorInject: priorEntry.inject } : {}) },
|
|
337
336
|
);
|
|
338
|
-
const entry =
|
|
337
|
+
const entry = await writeProjectEntryAsync({
|
|
339
338
|
projectId,
|
|
340
339
|
authorId: authorId(ctx),
|
|
341
340
|
kind,
|
|
@@ -354,7 +353,7 @@ export async function relayProjectTool(auth: McpAuthLike, name: string, args: Re
|
|
|
354
353
|
inject: tier.inject,
|
|
355
354
|
areas,
|
|
356
355
|
});
|
|
357
|
-
return { ...entry, ...(tier.note ? { injectNote: tier.note } : {}), ...areaDeliveryReport(entry) } as unknown as Record<string, unknown>;
|
|
356
|
+
return { ...entry, ...(tier.note ? { injectNote: tier.note } : {}), ...await areaDeliveryReport(entry) } as unknown as Record<string, unknown>;
|
|
358
357
|
}
|
|
359
358
|
|
|
360
359
|
if (name === "relay_project_read") {
|
|
@@ -386,8 +385,8 @@ export async function relayProjectTool(auth: McpAuthLike, name: string, args: Re
|
|
|
386
385
|
if (name === "relay_project_retract") {
|
|
387
386
|
const projectId = targetProjectId(ctx, cleanString(args.project, "project", { max: 200 }));
|
|
388
387
|
const id = cleanString(args.id, "id", { required: true, max: 120 })!;
|
|
389
|
-
ensureSameProject(id, projectId);
|
|
390
|
-
const entry =
|
|
388
|
+
await ensureSameProject(id, projectId);
|
|
389
|
+
const entry = await retractProjectEntryAsync(id);
|
|
391
390
|
if (!entry) throw new McpNotFoundError("project entry not found");
|
|
392
391
|
return entry as unknown as Record<string, unknown>;
|
|
393
392
|
}
|
|
@@ -395,21 +394,21 @@ export async function relayProjectTool(auth: McpAuthLike, name: string, args: Re
|
|
|
395
394
|
if (name === "relay_project_add_edge") {
|
|
396
395
|
const from = requireProjectId(args.from, "from");
|
|
397
396
|
const to = requireProjectId(args.to, "to");
|
|
398
|
-
const edge =
|
|
397
|
+
const edge = await addEdgeAsync(from, to, cleanEdgeKind(args.kind));
|
|
399
398
|
return { edge: edge as unknown as Record<string, unknown> };
|
|
400
399
|
}
|
|
401
400
|
|
|
402
401
|
if (name === "relay_project_remove_edge") {
|
|
403
402
|
const from = requireProjectId(args.from, "from");
|
|
404
403
|
const to = requireProjectId(args.to, "to");
|
|
405
|
-
const removed =
|
|
404
|
+
const removed = await removeEdgeAsync(from, to, cleanEdgeKind(args.kind));
|
|
406
405
|
return { removed };
|
|
407
406
|
}
|
|
408
407
|
|
|
409
408
|
if (name === "relay_project_promote_entry") {
|
|
410
409
|
const projectId = targetProjectId(ctx, cleanString(args.project, "project", { max: 200 }));
|
|
411
410
|
const blackboardEntryId = cleanString(args.blackboardEntryId, "blackboardEntryId", { required: true, max: 120 })!;
|
|
412
|
-
return
|
|
411
|
+
return await promoteBlackboardEntryAsync({ blackboardEntryId, projectId }) as unknown as Record<string, unknown>;
|
|
413
412
|
}
|
|
414
413
|
|
|
415
414
|
if (name === "relay_project_ingest_claudemd") {
|
|
@@ -27,9 +27,10 @@ export const ROUTING_POLICY_TOOLS: ToolDefinition[] = [
|
|
|
27
27
|
},
|
|
28
28
|
];
|
|
29
29
|
|
|
30
|
-
export function relayRoutingPolicyTool(auth: McpAuthContext, name: string, args: Record<string, unknown>): unknown {
|
|
30
|
+
export async function relayRoutingPolicyTool(auth: McpAuthContext, name: string, args: Record<string, unknown>): Promise<unknown> {
|
|
31
31
|
if (name === "relay_routing_policy_get") return getRoutingPolicyEnvelope();
|
|
32
32
|
if (name !== "relay_routing_policy_set") throw new ValidationError(`unknown tool: ${name}`);
|
|
33
33
|
if (!isRecord(args.policy)) throw new ValidationError("policy must be an object");
|
|
34
|
-
|
|
34
|
+
const { revision } = await saveRoutingPolicy(args.policy, args.expectedRevision, callerAgentId(auth) ?? "mcp");
|
|
35
|
+
return { revision };
|
|
35
36
|
}
|
package/src/mcp-team-tools.ts
CHANGED
|
@@ -164,23 +164,23 @@ export async function relayTeamTool(auth: McpAuthLike, name: string, args: Recor
|
|
|
164
164
|
return { ...projectTeamPayload(payload, args), ...(payload.team.spawnDelegation || payload.team.parentTeamId ? { spawnDelegationState: await getTeamSpawnDelegation(ctx, payload.team.parentTeamId ?? payload.team.id) } : {}) };
|
|
165
165
|
}
|
|
166
166
|
if (name === "relay_team_set_brief") {
|
|
167
|
-
const payload = setCallerTeamBrief(ctx, {
|
|
167
|
+
const payload = (await setCallerTeamBrief(ctx, {
|
|
168
168
|
title: cleanString(args.title, "title", { max: 240 }),
|
|
169
169
|
brief: cleanString(args.brief, "brief", { max: 16_000 }),
|
|
170
170
|
definitionOfDone: cleanString(args.definitionOfDone, "definitionOfDone", { max: 4000 }),
|
|
171
|
-
});
|
|
171
|
+
}));
|
|
172
172
|
return projectTeamPayload(payload, args);
|
|
173
173
|
}
|
|
174
174
|
if (name === "relay_team_claim") {
|
|
175
|
-
const payload = claimTeamForCaller(
|
|
175
|
+
const payload = (await claimTeamForCaller(
|
|
176
176
|
ctx,
|
|
177
177
|
cleanString(args.teamId, "teamId", { required: true, max: 240 })!,
|
|
178
178
|
cleanString(args.reason, "reason", { max: 2000 }),
|
|
179
|
-
);
|
|
179
|
+
));
|
|
180
180
|
return projectTeamPayload(payload, args);
|
|
181
181
|
}
|
|
182
182
|
if (name === "relay_team_dissolve") {
|
|
183
|
-
return dissolveCallerTeam(ctx, {
|
|
183
|
+
return (await dissolveCallerTeam(ctx, {
|
|
184
184
|
outcomeStatus: optionalEnum(args.outcomeStatus, "outcomeStatus", OUTCOME_STATUSES) as Team["outcomeStatus"] | undefined,
|
|
185
185
|
outcomeSummary: cleanString(args.outcomeSummary, "outcomeSummary", { max: 4000 }),
|
|
186
186
|
landsClean: args.landsClean === undefined || args.landsClean === null
|
|
@@ -188,7 +188,7 @@ export async function relayTeamTool(auth: McpAuthLike, name: string, args: Recor
|
|
|
188
188
|
: typeof args.landsClean === "boolean"
|
|
189
189
|
? args.landsClean
|
|
190
190
|
: (() => { throw new ValidationError("landsClean must be a boolean"); })(),
|
|
191
|
-
}) as unknown as Record<string, unknown>;
|
|
191
|
+
})) as unknown as Record<string, unknown>;
|
|
192
192
|
}
|
|
193
193
|
} catch (error) {
|
|
194
194
|
mapTeamError(error);
|
|
@@ -35,6 +35,7 @@ export const WORKFLOW_TOOLS = [
|
|
|
35
35
|
properties: {
|
|
36
36
|
workflow: { type: "string" },
|
|
37
37
|
taskId: TASK_ID_PROP,
|
|
38
|
+
cwd: { type: "string", description: "Project checkout; defaults to the caller or Task repo." },
|
|
38
39
|
pins: PINS_PROP,
|
|
39
40
|
budget: { type: "object", properties: { tokenCap: { type: "integer", minimum: 1, maximum: Number.MAX_SAFE_INTEGER } }, required: ["tokenCap"], additionalProperties: false },
|
|
40
41
|
inputs: { type: "object" },
|
|
@@ -48,7 +49,7 @@ export const WORKFLOW_TOOLS = [
|
|
|
48
49
|
{
|
|
49
50
|
name: "relay_workflow_resume",
|
|
50
51
|
description:
|
|
51
|
-
"Resume, pause/unpause, or answer
|
|
52
|
+
"Resume, pause/unpause, re-pin, or answer decisions.",
|
|
52
53
|
requiredScopes: ["task:write"],
|
|
53
54
|
inputSchema: {
|
|
54
55
|
type: "object",
|
|
@@ -113,7 +114,7 @@ type McpAuthLike = Parameters<typeof authContextFromMcp>[0];
|
|
|
113
114
|
|
|
114
115
|
function mutationReceipt(full: Record<string, unknown>, verbose: unknown): Record<string, unknown> {
|
|
115
116
|
if (verbose === true) return full;
|
|
116
|
-
const fields = ["runId", "taskId", "workflow", "status", "step", "round", "callerAgentId", "budget", "existing", "resumed", "cancelled", "paused", "reason", "warnings"];
|
|
117
|
+
const fields = ["runId", "taskId", "workflow", "status", "step", "round", "callerAgentId", "budget", "existing", "resumed", "pinsUpdated", "cancelled", "paused", "reason", "warnings"];
|
|
117
118
|
return Object.fromEntries(fields.filter(key => full[key] !== undefined).map(key => [key, full[key]]));
|
|
118
119
|
}
|
|
119
120
|
|
|
@@ -125,8 +126,9 @@ export async function relayWorkflowTool(auth: McpAuthLike, name: string, args: R
|
|
|
125
126
|
if (name === "relay_workflow_start") {
|
|
126
127
|
const workflow = cleanString(args.workflow, "workflow", { max: 64 });
|
|
127
128
|
if (!workflow) throw new ValidationError("workflow is required");
|
|
129
|
+
const cwd = cleanString(args.cwd, "cwd", { max: 4000 });
|
|
128
130
|
const pins = parseWorkflowPins(args.pins);
|
|
129
|
-
return mutationReceipt(await startWorkflowRun({ workflow, ...(args.inputs !== undefined ? { inputs: args.inputs as Record<string, unknown> } : {}), ...(args.requestKey ? { requestKey: String(args.requestKey) } : {}), taskId: taskIdField(args.taskId), ...(pins ? { pins } : {}), budget: args.budget }, ctx), args.verbose);
|
|
131
|
+
return mutationReceipt(await startWorkflowRun({ workflow, ...(cwd ? { cwd } : {}), ...(args.inputs !== undefined ? { inputs: args.inputs as Record<string, unknown> } : {}), ...(args.requestKey ? { requestKey: String(args.requestKey) } : {}), taskId: taskIdField(args.taskId), ...(pins ? { pins } : {}), budget: args.budget }, ctx), args.verbose);
|
|
130
132
|
}
|
|
131
133
|
if (name === "relay_workflow_resume") {
|
|
132
134
|
const runId = cleanString(args.runId, "runId", { max: 200 });
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createCommandAsync } from "./commands-write";
|
|
1
2
|
// #3410 — on-touch area memory. The runner reports the first file an agent touches in a path area
|
|
2
3
|
// (`.agent-relay/areas.json`) in a context generation. This selects that area's memories of the
|
|
3
4
|
// agent's own project that the startup block holds out (#3409, #3508), renders them, and
|
|
@@ -6,10 +7,10 @@
|
|
|
6
7
|
|
|
7
8
|
import { injectsAtStartup, cleanAreasConfig, type AreaDefinition } from "@humwick/sdk/areas";
|
|
8
9
|
import { isRecord, stringValue, type AreaEnteredInput, type AreaEnteredResult } from "@humwick/sdk";
|
|
9
|
-
|
|
10
|
+
|
|
10
11
|
import { emitCommandEvent } from "./command-events";
|
|
11
12
|
import { contextInjectUnsupported } from "./context-injection-channel";
|
|
12
|
-
import {
|
|
13
|
+
import { listActiveEntriesInAreaAsync, ValidationError } from "./db";
|
|
13
14
|
import { entryInjectability } from "./memory-inject-filter";
|
|
14
15
|
import { memoryHeadline, neutralizeMemoryMarkers } from "./memory-preamble";
|
|
15
16
|
import { memorySeamForAgent, projectMemoryEnabledForSeam } from "./memory-seam";
|
|
@@ -45,8 +46,8 @@ export function parseAreaEnteredInput(body: unknown): AreaEnteredInput {
|
|
|
45
46
|
|
|
46
47
|
/** The agent's own project's active entries for `area` that its startup block does not carry
|
|
47
48
|
* (#3508), and it may receive: pinned first, then newest. Ancestor projects are not walked. */
|
|
48
|
-
export function selectAreaEntries(projectId: string, area: string, profile: string | undefined, exclude: ReadonlySet<string>, now: number): ProjectEntry[] {
|
|
49
|
-
const selected =
|
|
49
|
+
export async function selectAreaEntries(projectId: string, area: string, profile: string | undefined, exclude: ReadonlySet<string>, now: number): Promise<ProjectEntry[]> {
|
|
50
|
+
const selected = (await listActiveEntriesInAreaAsync(projectId, area)).filter((entry) =>
|
|
50
51
|
entry.areas?.includes(area)
|
|
51
52
|
&& !injectsAtStartup(entry)
|
|
52
53
|
&& !exclude.has(entry.id)
|
|
@@ -123,7 +124,7 @@ async function selectForAgent(agent: AgentCard, input: AreaEnteredInput, now: nu
|
|
|
123
124
|
const projectId = seam.identity.projectId;
|
|
124
125
|
if (!projectId) return { definition, entries: [], skipped: "no-project" };
|
|
125
126
|
if (!projectMemoryEnabledForSeam(seam)) return { definition, entries: [], skipped: "project-memory-off" };
|
|
126
|
-
return { definition, entries: selectAreaEntries(projectId, input.area, seam.identity.profile, new Set(input.exclude), now) };
|
|
127
|
+
return { definition, entries: await selectAreaEntries(projectId, input.area, seam.identity.profile, new Set(input.exclude), now) };
|
|
127
128
|
}
|
|
128
129
|
|
|
129
130
|
function areaSummary(area: string, entries: number, tokens: number): string {
|
|
@@ -143,7 +144,7 @@ export async function enqueueAreaMemoryInjection(agent: AgentCard, input: AreaEn
|
|
|
143
144
|
const tokens = selected ? block.tokens : 0;
|
|
144
145
|
const omitted = selected ? block.omitted : 0;
|
|
145
146
|
if (queued) {
|
|
146
|
-
const command =
|
|
147
|
+
const command = (await createCommandAsync({
|
|
147
148
|
type: "agent.injectContext",
|
|
148
149
|
source: "system",
|
|
149
150
|
target: agent.id,
|
|
@@ -158,10 +159,10 @@ export async function enqueueAreaMemoryInjection(agent: AgentCard, input: AreaEn
|
|
|
158
159
|
tokens,
|
|
159
160
|
omitted,
|
|
160
161
|
},
|
|
161
|
-
});
|
|
162
|
+
}));
|
|
162
163
|
emitCommandEvent(command, "command.requested");
|
|
163
164
|
}
|
|
164
|
-
emitRelayInjectionEvent({
|
|
165
|
+
(await emitRelayInjectionEvent({
|
|
165
166
|
agentId: agent.id,
|
|
166
167
|
category: AREA_MEMORY_REASON,
|
|
167
168
|
summary: areaSummary(input.area, entryIds.length, tokens),
|
|
@@ -178,12 +179,12 @@ export async function enqueueAreaMemoryInjection(agent: AgentCard, input: AreaEn
|
|
|
178
179
|
...(skipped ? { skipped } : {}),
|
|
179
180
|
},
|
|
180
181
|
timestamp: now,
|
|
181
|
-
});
|
|
182
|
+
}));
|
|
182
183
|
return { area: input.area, queued, entryIds, tokens, omitted, ...(input.inline ? { content: selected ? block.content : "" } : {}) };
|
|
183
184
|
}
|
|
184
185
|
|
|
185
186
|
/** A `memory-area` inject the runner reported delivered: one more event, `delivered: true`. A stale-generation skip is not one. */
|
|
186
|
-
export function settleAreaMemoryCommand(command: Command, now: number = Date.now()): void {
|
|
187
|
+
export async function settleAreaMemoryCommand(command: Command, now: number = Date.now()): Promise<void> {
|
|
187
188
|
if (command.type !== "agent.injectContext" || command.status !== "succeeded" || command.params.reason !== AREA_MEMORY_REASON) return;
|
|
188
189
|
// #3411 — the runner drops an inject queued before a context reset and reports it in providerResult.
|
|
189
190
|
const providerResult = command.result?.providerResult;
|
|
@@ -194,7 +195,7 @@ export function settleAreaMemoryCommand(command: Command, now: number = Date.now
|
|
|
194
195
|
const generation = typeof params.generation === "number" ? params.generation : 0;
|
|
195
196
|
const entryIds = Array.isArray(params.memoryIds) ? params.memoryIds.filter((id): id is string => typeof id === "string") : [];
|
|
196
197
|
const tokens = typeof params.tokens === "number" ? params.tokens : 0;
|
|
197
|
-
emitRelayInjectionEvent({
|
|
198
|
+
(await emitRelayInjectionEvent({
|
|
198
199
|
agentId: command.target,
|
|
199
200
|
category: AREA_MEMORY_REASON,
|
|
200
201
|
summary: `${areaSummary(area, entryIds.length, tokens)} delivered`,
|
|
@@ -212,5 +213,5 @@ export function settleAreaMemoryCommand(command: Command, now: number = Date.now
|
|
|
212
213
|
},
|
|
213
214
|
timestamp: now,
|
|
214
215
|
idempotencyKey: `memory-area:${command.id}:settled`,
|
|
215
|
-
});
|
|
216
|
+
}));
|
|
216
217
|
}
|
|
@@ -138,12 +138,12 @@ export function isBoundaryCaptureDefect(clause: BoundaryCaptureClause): boolean
|
|
|
138
138
|
* abort the boundary AFTER the continuation envelope has already been advanced. Both are strictly
|
|
139
139
|
* worse outcomes than a missing sentence, so every path here ends in a string.
|
|
140
140
|
*/
|
|
141
|
-
export function boundaryCaptureClause(input: {
|
|
141
|
+
export async function boundaryCaptureClause(input: {
|
|
142
142
|
seam: BoundaryCaptureSeam;
|
|
143
143
|
agentId: string;
|
|
144
144
|
slug?: string;
|
|
145
145
|
now?: number;
|
|
146
|
-
}): string {
|
|
146
|
+
}): Promise<string> {
|
|
147
147
|
let clause: BoundaryCaptureClause;
|
|
148
148
|
try {
|
|
149
149
|
clause = resolveBoundaryCaptureClause(input.seam, input.slug);
|
|
@@ -157,7 +157,7 @@ export function boundaryCaptureClause(input: {
|
|
|
157
157
|
error: errMessage(error),
|
|
158
158
|
};
|
|
159
159
|
}
|
|
160
|
-
if (isBoundaryCaptureDefect(clause)) reportBoundaryCaptureDefect(clause, input.agentId, input.now ?? Date.now());
|
|
160
|
+
if (isBoundaryCaptureDefect(clause)) (await reportBoundaryCaptureDefect(clause, input.agentId, input.now ?? Date.now()));
|
|
161
161
|
return clause.text;
|
|
162
162
|
}
|
|
163
163
|
|
|
@@ -180,9 +180,9 @@ function describeBoundaryCaptureDefect(clause: BoundaryCaptureClause): string {
|
|
|
180
180
|
* timeline write itself fails there is nowhere left to say so — the boundary still proceeds, which
|
|
181
181
|
* is the outcome that matters.
|
|
182
182
|
*/
|
|
183
|
-
function reportBoundaryCaptureDefect(clause: BoundaryCaptureClause, agentId: string, now: number): void {
|
|
183
|
+
async function reportBoundaryCaptureDefect(clause: BoundaryCaptureClause, agentId: string, now: number): Promise<void> {
|
|
184
184
|
try {
|
|
185
|
-
emitRelayInjectionEvent({
|
|
185
|
+
(await emitRelayInjectionEvent({
|
|
186
186
|
agentId,
|
|
187
187
|
category: "memory",
|
|
188
188
|
summary: describeBoundaryCaptureDefect(clause),
|
|
@@ -198,7 +198,7 @@ function reportBoundaryCaptureDefect(clause: BoundaryCaptureClause, agentId: str
|
|
|
198
198
|
},
|
|
199
199
|
timestamp: now,
|
|
200
200
|
idempotencyKey: `memory-capture-clause:${clause.seam}:${agentId}:${clause.status}`,
|
|
201
|
-
});
|
|
201
|
+
}));
|
|
202
202
|
} catch {
|
|
203
203
|
// Intentionally swallowed: see the doc comment above. A boundary must not fail because its
|
|
204
204
|
// capture ask could not be announced.
|