@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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Auto-split from routes.ts (#299). Domain: continuation archives.
|
|
2
2
|
import { isRecord } from "@humwick/sdk";
|
|
3
3
|
import { resolveCallerAgentId } from "../agent-ref";
|
|
4
|
-
import { archiveContinuationSegmentAsync,
|
|
4
|
+
import { archiveContinuationSegmentAsync, appendContinuationArchiveRefsAsync, getAgent, listAgents, ValidationError } from "../db";
|
|
5
5
|
import { getComponentAuth } from "../security";
|
|
6
6
|
import { cleanEpoch, cleanPositiveId, cleanString } from "../validation";
|
|
7
7
|
import { error, json, parseBody, type Handler } from "./_shared";
|
|
@@ -21,7 +21,7 @@ export const postContinuationArchiveRoute: Handler = async (req) => {
|
|
|
21
21
|
generation: cleanPositiveId(parsed.body.generation, "generation"),
|
|
22
22
|
now: cleanEpoch(parsed.body.occurredAt, "occurredAt"),
|
|
23
23
|
});
|
|
24
|
-
const envelope =
|
|
24
|
+
const envelope = await appendContinuationArchiveRefsAsync(agentId, [archive.ref]);
|
|
25
25
|
return json({ archive, envelope }, 201);
|
|
26
26
|
} catch (e) {
|
|
27
27
|
if (e instanceof ValidationError) return error(e.message, 400);
|
|
@@ -4,7 +4,7 @@ import type { CoordinatorTeamSummary } from "../types";
|
|
|
4
4
|
|
|
5
5
|
/** Connector discovery: no roster, plan, or per-team runtime queries. */
|
|
6
6
|
export const getCoordinatorTeams: Handler = async req => {
|
|
7
|
-
const denied = authorizeRoute(req, { scope: "channel:read" });
|
|
7
|
+
const denied = (await authorizeRoute(req, { scope: "channel:read" }));
|
|
8
8
|
if (denied) return denied;
|
|
9
9
|
const teams: CoordinatorTeamSummary[] = (await listCoordinatorTeamsAsync()).filter(team => team.coordinatorId).map(team => ({
|
|
10
10
|
id: team.id, coordinatorId: team.coordinatorId!, title: team.title ?? null, projectId: team.projectId, projectName: team.projectName,
|
package/src/routes/decisions.ts
CHANGED
|
@@ -48,7 +48,7 @@ export const postDecisionAnswerRoute: Handler = async (req, params) => {
|
|
|
48
48
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
49
49
|
const body = isRecord(parsed.body) ? parsed.body : {};
|
|
50
50
|
try {
|
|
51
|
-
return json(answerDecision(authContextFromRequest(req), id, { answers: body.answers, note: body.note }));
|
|
51
|
+
return json((await answerDecision(authContextFromRequest(req), id, { answers: body.answers, note: body.note })));
|
|
52
52
|
} catch (err) {
|
|
53
53
|
return routeError(err);
|
|
54
54
|
}
|
|
@@ -59,7 +59,7 @@ export const postDecisionRoute: Handler = async (req) => {
|
|
|
59
59
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
60
60
|
try {
|
|
61
61
|
const ctx = authContextFromRequest(req);
|
|
62
|
-
return json(fileDecision(ctx, isRecord(parsed.body) ? parsed.body : {}, callerProjectId(ctx)), 201);
|
|
62
|
+
return json((await fileDecision(ctx, isRecord(parsed.body) ? parsed.body : {}, callerProjectId(ctx))), 201);
|
|
63
63
|
} catch (err) {
|
|
64
64
|
return routeError(err);
|
|
65
65
|
}
|
|
@@ -10,7 +10,7 @@ import { authorizeRoute, error, parseBody, type Handler } from "./_shared";
|
|
|
10
10
|
export const postHostSecretFilesResolve: Handler = async (req, params) => {
|
|
11
11
|
const orch = getOrchestrator(params.id!);
|
|
12
12
|
if (!orch) return error("orchestrator not found", 404);
|
|
13
|
-
const denied = authorizeRoute(req, { scope: "command:write", resource: { orchestratorId: orch.id } });
|
|
13
|
+
const denied = (await authorizeRoute(req, { scope: "command:write", resource: { orchestratorId: orch.id } }));
|
|
14
14
|
if (denied) return denied;
|
|
15
15
|
const component = getComponentAuth(req);
|
|
16
16
|
if (!isFullReachRequest(req) && !(component?.role === "orchestrator" && component.constraints?.orchestrators?.includes(orch.id))) return error("forbidden", 403);
|
package/src/routes/hosts.ts
CHANGED
|
@@ -14,7 +14,7 @@ function queryTags(value: string | null, field: string): string[] | undefined {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export const getHostsRoute: Handler = async (req) => {
|
|
17
|
-
const denied = authorizeRoute(req, { scope: "hosts:read" });
|
|
17
|
+
const denied = (await authorizeRoute(req, { scope: "hosts:read" }));
|
|
18
18
|
if (denied) return denied;
|
|
19
19
|
const query = new URL(req.url).searchParams;
|
|
20
20
|
try {
|
|
@@ -44,7 +44,7 @@ export const getHostsRoute: Handler = async (req) => {
|
|
|
44
44
|
* relay shows a rebuilding chart, not a stale one).
|
|
45
45
|
*/
|
|
46
46
|
export const getHostUtilizationSeries: Handler = async (req, params) => {
|
|
47
|
-
const denied = authorizeRoute(req, { scope: "hosts:read" });
|
|
47
|
+
const denied = (await authorizeRoute(req, { scope: "hosts:read" }));
|
|
48
48
|
if (denied) return denied;
|
|
49
49
|
const samples = readHostUtilizationSeries(params.id!);
|
|
50
50
|
return json({ host: params.id!, window_ms: HOST_UTILIZATION_BUFFER_MS, samples });
|
|
@@ -54,7 +54,7 @@ export const getHostUtilizationSeries: Handler = async (req, params) => {
|
|
|
54
54
|
// gateway write ops the MCP host tools already use (hosts.setLabel / hosts.setTags); this route is
|
|
55
55
|
// just the HTTP door onto them, same shape as patchAgentLabel/patchAgentTags in agents.ts.
|
|
56
56
|
export const patchHostLabel: Handler = async (req, params) => {
|
|
57
|
-
const denied = authorizeRoute(req, { scope: "hosts:write" });
|
|
57
|
+
const denied = (await authorizeRoute(req, { scope: "hosts:write" }));
|
|
58
58
|
if (denied) return denied;
|
|
59
59
|
const parsed = await parseBody<unknown>(req);
|
|
60
60
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -81,7 +81,7 @@ export const patchHostLabel: Handler = async (req, params) => {
|
|
|
81
81
|
};
|
|
82
82
|
|
|
83
83
|
export const patchHostTags: Handler = async (req, params) => {
|
|
84
|
-
const denied = authorizeRoute(req, { scope: "hosts:write" });
|
|
84
|
+
const denied = (await authorizeRoute(req, { scope: "hosts:write" }));
|
|
85
85
|
if (denied) return denied;
|
|
86
86
|
const parsed = await parseBody<unknown>(req);
|
|
87
87
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -111,7 +111,7 @@ export const patchHostTags: Handler = async (req, params) => {
|
|
|
111
111
|
// write is idempotent: an already-accepted host remains accepted and a later identity change still
|
|
112
112
|
// traverses the registration tripwire.
|
|
113
113
|
export const postAcceptHostHardware: Handler = async (req, params) => {
|
|
114
|
-
const denied = authorizeRoute(req, { scope: "hosts:write" });
|
|
114
|
+
const denied = (await authorizeRoute(req, { scope: "hosts:write" }));
|
|
115
115
|
if (denied) return denied;
|
|
116
116
|
const host = await acceptHostHardwareAsync(params.id!);
|
|
117
117
|
if (!host) return error("host not found", 404);
|
|
@@ -129,7 +129,7 @@ export const postAcceptHostHardware: Handler = async (req, params) => {
|
|
|
129
129
|
};
|
|
130
130
|
|
|
131
131
|
export const patchHostLandingPlacement: Handler = async (req, params) => {
|
|
132
|
-
const denied = authorizeRoute(req, { scope: "hosts:write" });
|
|
132
|
+
const denied = (await authorizeRoute(req, { scope: "hosts:write" }));
|
|
133
133
|
if (denied) return denied;
|
|
134
134
|
const parsed = await parseBody<unknown>(req);
|
|
135
135
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -153,7 +153,7 @@ export const patchHostLandingPlacement: Handler = async (req, params) => {
|
|
|
153
153
|
};
|
|
154
154
|
|
|
155
155
|
export const patchHostAgentCap: Handler = async (req, params) => {
|
|
156
|
-
const denied = authorizeRoute(req, { scope: "hosts:write" });
|
|
156
|
+
const denied = (await authorizeRoute(req, { scope: "hosts:write" }));
|
|
157
157
|
if (denied) return denied;
|
|
158
158
|
const parsed = await parseBody<unknown>(req);
|
|
159
159
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -177,7 +177,7 @@ export const patchHostAgentCap: Handler = async (req, params) => {
|
|
|
177
177
|
};
|
|
178
178
|
|
|
179
179
|
export const patchHostLandingCap: Handler = async (req, params) => {
|
|
180
|
-
const denied = authorizeRoute(req, { scope: "hosts:write" });
|
|
180
|
+
const denied = (await authorizeRoute(req, { scope: "hosts:write" }));
|
|
181
181
|
if (denied) return denied;
|
|
182
182
|
const parsed = await parseBody<unknown>(req);
|
|
183
183
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -201,7 +201,7 @@ export const patchHostLandingCap: Handler = async (req, params) => {
|
|
|
201
201
|
};
|
|
202
202
|
|
|
203
203
|
export const patchHostGateBudget: Handler = async (req, params) => {
|
|
204
|
-
const denied = authorizeRoute(req, { scope: "hosts:write" });
|
|
204
|
+
const denied = (await authorizeRoute(req, { scope: "hosts:write" }));
|
|
205
205
|
if (denied) return denied;
|
|
206
206
|
const parsed = await parseBody<unknown>(req);
|
|
207
207
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -217,7 +217,7 @@ export const patchHostGateBudget: Handler = async (req, params) => {
|
|
|
217
217
|
};
|
|
218
218
|
|
|
219
219
|
export const patchHostAdmission: Handler = async (req, params) => {
|
|
220
|
-
const denied = authorizeRoute(req, { scope: "hosts:write" });
|
|
220
|
+
const denied = (await authorizeRoute(req, { scope: "hosts:write" }));
|
|
221
221
|
if (denied) return denied;
|
|
222
222
|
const parsed = await parseBody<unknown>(req);
|
|
223
223
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -232,7 +232,7 @@ export const patchHostAdmission: Handler = async (req, params) => {
|
|
|
232
232
|
};
|
|
233
233
|
|
|
234
234
|
export const getHostAdmission: Handler = async (req, params) => {
|
|
235
|
-
const denied = getComponentAuth(req) ? null : authorizeRoute(req, { scope: "hosts:read" });
|
|
235
|
+
const denied = getComponentAuth(req) ? null : (await authorizeRoute(req, { scope: "hosts:read" }));
|
|
236
236
|
if (denied) return denied;
|
|
237
237
|
const host = await getHostAsync(resolveHostId(params.id!) ?? params.id!);
|
|
238
238
|
if (!host) return error("host not found", 404);
|
package/src/routes/inbox.ts
CHANGED
|
@@ -78,7 +78,8 @@ function normalizeChatHistoryImportInput(body: unknown): {
|
|
|
78
78
|
export const getInboxStateRoute: Handler = async (req) => {
|
|
79
79
|
const url = new URL(req.url);
|
|
80
80
|
const operatorId = inboxOperatorId(req, url.searchParams.get("operatorId") ?? undefined);
|
|
81
|
-
|
|
81
|
+
const raw = url.searchParams.get("excludeOffline");
|
|
82
|
+
return json(await getInboxStateAsync(operatorId, { excludeOffline: raw === "1" || raw === "true" }));
|
|
82
83
|
};
|
|
83
84
|
|
|
84
85
|
export const patchInboxThreadState: Handler = async (req) => {
|
|
@@ -140,7 +141,7 @@ export const postChatHistoryImportRoute: Handler = async (req) => {
|
|
|
140
141
|
try {
|
|
141
142
|
const input = normalizeChatHistoryImportInput(parsed.body);
|
|
142
143
|
if (resolveActingUser(req)?.source === "session") input.importedBy = requestUserAddress(req);
|
|
143
|
-
const denied = authorizeRoute(req, { scope: "agent:write", resource: { agentId: input.targetAgentId, spawnRequestId: input.targetSpawnRequestId } });
|
|
144
|
+
const denied = (await authorizeRoute(req, { scope: "agent:write", resource: { agentId: input.targetAgentId, spawnRequestId: input.targetSpawnRequestId } }));
|
|
144
145
|
if (denied) return denied;
|
|
145
146
|
const imported = await createChatHistoryImportAsync(input);
|
|
146
147
|
return json(imported, 201);
|
package/src/routes/index.ts
CHANGED
|
@@ -70,6 +70,7 @@ import { postIssueLifecycleReopenRoute } from "./issue-lifecycle";
|
|
|
70
70
|
import { deleteIssueRefRoute, getIssueRefRoute, listIssueRefsRoute, patchIssueRefRoute, postIssueRefRoute, resolveIssueRefRoute } from "./issue-refs";
|
|
71
71
|
import { deleteProjectEntryRoute, getProjectEntriesRoute, getProjectEntryRoute, getProjectInjectionPreviewRoute, getProjectResolveRoute, getProjectRoute, getProjectsRoute, patchProjectEntryRoute, postProjectEntryRoute } from "./projects";
|
|
72
72
|
import { getPromptHistoryRoute, postPromptRevisionRoute, getPromptTemplateRoute, getPromptTemplatesRoute, postPromptTemplateResetRoute, putPromptTemplateRoute } from "./prompt-templates";
|
|
73
|
+
import { projectProfileInstructionsRoute } from "./project-profile-instructions";
|
|
73
74
|
import { getRecipeByName, getRecipeInstanceArtifacts, getRecipeInstanceById, getRecipeInstances, getRecipes, postRecipeInstanceArtifacts, postRecipeStart, postRecipeStop } from "./recipes";
|
|
74
75
|
import { getSettingRoute, getSettingsNamespaceRoute, getSettingsRoute, putSettingRoute, putSettingsDefaultRoute } from "./settings";
|
|
75
76
|
import { postNotificationPreviewRoute } from "./notifications";
|
|
@@ -84,8 +85,8 @@ import { getMergeDrain, getMergePauseById, getMergePauses, postMergePause, postM
|
|
|
84
85
|
import { postMcp } from "../mcp";
|
|
85
86
|
import { postOrchestratorBootstrap, postOrchestratorBootstrapExchange } from "./orchestrator-bootstrap";
|
|
86
87
|
import { getDeploysRoute } from "./deploys";
|
|
87
|
-
import { getGateStatsRoute, getShippingBoardRoute, getShippingStatsRoute, postRedMainAbandonRoute } from "./shipping";
|
|
88
|
-
import { getWorkflowCatalogRoute, getWorkflowDefinitionsRoute, getWorkflowRunBudgetRoute, getWorkflowRunRoute, getWorkflowRunsRoute, getWorkflowStatsRoute, patchWorkflowRunBudgetRoute, postWorkflowRunCancelRoute, postWorkflowRunResumeRoute, postWorkflowRunStartRoute } from "./workflows";
|
|
88
|
+
import { getGateStatsRoute, getKnownFailuresRoute, getShippingBoardRoute, getShippingStatsRoute, postRedMainAbandonRoute } from "./shipping";
|
|
89
|
+
import { getWorkflowCatalogRoute, getWorkflowDefinitionsRoute, getWorkflowRunBudgetRoute, getWorkflowRunRoute, getWorkflowRunsRoute, getWorkflowStatsRoute, patchWorkflowRunBudgetRoute, postWorkflowRunCancelRoute, postWorkflowRunPauseRoute, postWorkflowRunResumeRoute, postWorkflowRunStartRoute, postWorkflowRunUnpauseRoute } from "./workflows";
|
|
89
90
|
import { getRestartEpochRoute, postRestartEpochAbandonRoute } from "./restart-epochs";
|
|
90
91
|
import { getFleetConvergenceRoute } from "./fleet-convergence";
|
|
91
92
|
import { postTimerMessageOperator } from "./kernel-timers-operator";
|
|
@@ -318,6 +319,7 @@ const routes: Route[] = [
|
|
|
318
319
|
route("DELETE", "/api/commands/:id", deleteCommandById),
|
|
319
320
|
route("POST", "/api/system/timer-message-cutover/:verb", postTimerMessageOperator),
|
|
320
321
|
route("GET", "/api/agent-profiles", getAgentProfilesRoute),
|
|
322
|
+
route("GET", "/api/agent-profiles/:name/project-instructions", projectProfileInstructionsRoute),
|
|
321
323
|
route("GET", "/api/agent-profiles/tool-groups", getAgentProfileToolGroupsRoute),
|
|
322
324
|
route("POST", "/api/agent-profiles/preview", postAgentProfilePreviewRoute),
|
|
323
325
|
route("GET", "/api/agent-profiles/:name/resolved", getResolvedAgentProfileRoute),
|
|
@@ -546,6 +548,11 @@ const routes: Route[] = [
|
|
|
546
548
|
route("PATCH", "/api/issue-refs/:id", patchIssueRefRoute),
|
|
547
549
|
route("DELETE", "/api/issue-refs/:id", deleteIssueRefRoute),
|
|
548
550
|
route("GET", "/api/projects", getProjectsRoute),
|
|
551
|
+
route("GET", "/api/projects/:id/profile-instructions", projectProfileInstructionsRoute),
|
|
552
|
+
route("GET", "/api/projects/:id/profile-instructions/:profile", projectProfileInstructionsRoute),
|
|
553
|
+
route("PUT", "/api/projects/:id/profile-instructions/:profile", projectProfileInstructionsRoute),
|
|
554
|
+
route("GET", "/api/projects/:id/profile-instructions/:profile/history", projectProfileInstructionsRoute),
|
|
555
|
+
route("POST", "/api/projects/:id/profile-instructions/:profile/restore", projectProfileInstructionsRoute),
|
|
549
556
|
route("POST", "/api/projects", postProjectOnboardRoute),
|
|
550
557
|
route("POST", "/api/projects/:id/checkouts/bind", postProjectBindCheckoutRoute),
|
|
551
558
|
route("POST", "/api/projects/:id/checkouts/unbind", postProjectUnbindCheckoutRoute),
|
|
@@ -592,6 +599,7 @@ const routes: Route[] = [
|
|
|
592
599
|
route("POST", "/api/shipping/incidents/:id/abandon", postRedMainAbandonRoute),
|
|
593
600
|
route("GET", "/api/shipping/board", getShippingBoardRoute),
|
|
594
601
|
route("GET", "/api/shipping/stats", getShippingStatsRoute),
|
|
602
|
+
route("GET", "/api/shipping/known-failures", getKnownFailuresRoute),
|
|
595
603
|
route("GET", "/api/gates/stats", getGateStatsRoute),
|
|
596
604
|
route("GET", "/api/workflows/catalog", getWorkflowCatalogRoute),
|
|
597
605
|
route("POST", "/api/workflows/runs", postWorkflowRunStartRoute),
|
|
@@ -600,6 +608,8 @@ const routes: Route[] = [
|
|
|
600
608
|
route("GET", "/api/workflows/runs/:runId/budget", getWorkflowRunBudgetRoute),
|
|
601
609
|
route("PATCH", "/api/workflows/runs/:runId/budget", patchWorkflowRunBudgetRoute),
|
|
602
610
|
route("POST", "/api/workflows/runs/:runId/cancel", postWorkflowRunCancelRoute),
|
|
611
|
+
route("POST", "/api/workflows/runs/:runId/pause", postWorkflowRunPauseRoute),
|
|
612
|
+
route("POST", "/api/workflows/runs/:runId/unpause", postWorkflowRunUnpauseRoute),
|
|
603
613
|
route("POST", "/api/workflows/runs/:runId/resume", postWorkflowRunResumeRoute),
|
|
604
614
|
route("GET", "/api/workflows/stats", getWorkflowStatsRoute),
|
|
605
615
|
route("GET", "/api/workflows/definitions", getWorkflowDefinitionsRoute),
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { upsertIntegrationRegistryAsync, ingestIntegrationEventAsync } from "../db/runtime-tail-async";
|
|
2
|
+
import { sendMessageWithResultAsync } from "../db/message-send";
|
|
3
|
+
import type { IntegrationRegistryInput } from "../db/integrations";
|
|
1
4
|
// Auto-split from routes.ts (#299). Domain: integrations.
|
|
2
5
|
import { INTEGRATION_RATE_LIMIT_PER_MINUTE, MAX_BODY_BYTES, getIntegrationTokens, type IntegrationTokenConfig } from "../config";
|
|
3
6
|
import { VALID_ARTIFACT_KINDS, VALID_ARTIFACT_ROLES, VALID_TASK_STATUSES, agentSessionStatus, authorizeRoute, cleanAttachmentRefs, dispatchTaskCallbacksInBackground, error, json, normalizeAgentSessionGuard, parseBody, reactionEmoji, sendReactionNotificationToAuthor, validateChannelAttachmentSourceRef, withPayloadAttachments, type Handler } from "./_shared";
|
|
4
|
-
import { ValidationError, evaluatePoolBindingsAsync, findMessageByTelegramSourceAsync, getAgent, getChannelAsync, getMessage,
|
|
7
|
+
import { ValidationError, evaluatePoolBindingsAsync, findMessageByTelegramSourceAsync, getAgent, getChannelAsync, getMessage, isIntegrationRegistryEnabled, listChannelBindingsAsync, listChannelsAsync, listIntegrationTaskStatsAsync, reconcileIntegrationRegistryAsync, resolveChannelRoutesAsync, setMessageReactionAsync, upsertChannelBindingAsync, validateAgentSession } from "../db";
|
|
5
8
|
import { cleanMeta, cleanString, cleanStringArray, optionalEnum } from "../validation";
|
|
6
9
|
import { emitChannelActivity, emitMessageQueued, emitMessageReactionUpdated, emitNewMessage, emitTaskChanged } from "../sse";
|
|
7
10
|
import { getComponentAuth, getIntegrationAuth, hasIntegrationScope, isRequestAuthorizedFor } from "../security";
|
|
@@ -256,24 +259,7 @@ function normalizeIntegrationEvent(body: unknown): IntegrationEventInput {
|
|
|
256
259
|
};
|
|
257
260
|
}
|
|
258
261
|
|
|
259
|
-
function normalizeIntegrationRegistryInput(name: string, body: unknown): {
|
|
260
|
-
name: string;
|
|
261
|
-
displayName?: string;
|
|
262
|
-
description?: string;
|
|
263
|
-
enabled?: boolean;
|
|
264
|
-
scopes?: string[];
|
|
265
|
-
targets?: string[];
|
|
266
|
-
channels?: string[];
|
|
267
|
-
type?: string;
|
|
268
|
-
icon?: string;
|
|
269
|
-
accentColor?: string;
|
|
270
|
-
tags?: string[];
|
|
271
|
-
homepageUrl?: string;
|
|
272
|
-
repositoryUrl?: string;
|
|
273
|
-
docsUrl?: string;
|
|
274
|
-
manifest?: Record<string, unknown>;
|
|
275
|
-
source: "api";
|
|
276
|
-
} {
|
|
262
|
+
function normalizeIntegrationRegistryInput(name: string, body: unknown): IntegrationRegistryInput & { source: "api" } {
|
|
277
263
|
if (!isRecord(body)) throw new ValidationError("body must be an object");
|
|
278
264
|
if (body.enabled !== undefined && typeof body.enabled !== "boolean") throw new ValidationError("enabled must be a boolean");
|
|
279
265
|
return {
|
|
@@ -364,40 +350,30 @@ function safeCallbackHost(url: string | undefined): string | undefined {
|
|
|
364
350
|
}
|
|
365
351
|
}
|
|
366
352
|
|
|
367
|
-
function
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
});
|
|
386
|
-
}
|
|
387
|
-
for (const stats of observedStats.values()) {
|
|
388
|
-
upsertIntegrationRegistry({
|
|
389
|
-
name: stats.source,
|
|
390
|
-
enabled: true,
|
|
391
|
-
source: "observed",
|
|
392
|
-
});
|
|
393
|
-
}
|
|
394
|
-
return new Map(listIntegrationRegistry().map((integration) => [integration.name, integration]));
|
|
353
|
+
async function reconcileRegistry(configured: Map<string, IntegrationTokenConfig>, observedSources: string[]) {
|
|
354
|
+
const registry = await reconcileIntegrationRegistryAsync([...configured.values()].map((config) => ({
|
|
355
|
+
name: config.name,
|
|
356
|
+
displayName: config.displayName,
|
|
357
|
+
description: config.description,
|
|
358
|
+
scopes: config.scopes,
|
|
359
|
+
targets: config.targets,
|
|
360
|
+
channels: config.channels,
|
|
361
|
+
type: config.type,
|
|
362
|
+
icon: config.icon,
|
|
363
|
+
accentColor: config.accentColor,
|
|
364
|
+
tags: config.tags,
|
|
365
|
+
homepageUrl: config.homepageUrl,
|
|
366
|
+
repositoryUrl: config.repositoryUrl,
|
|
367
|
+
docsUrl: config.docsUrl,
|
|
368
|
+
manifest: config.manifest,
|
|
369
|
+
})), observedSources);
|
|
370
|
+
return new Map(registry.map((integration) => [integration.name, integration]));
|
|
395
371
|
}
|
|
396
372
|
|
|
397
|
-
export const getIntegrations: Handler = () => {
|
|
373
|
+
export const getIntegrations: Handler = async () => {
|
|
398
374
|
const configured = new Map(getIntegrationTokens().map((integration) => [integration.name, integration]));
|
|
399
|
-
const observedStats = new Map(
|
|
400
|
-
const registry =
|
|
375
|
+
const observedStats = new Map((await listIntegrationTaskStatsAsync()).map((stats) => [stats.source, stats]));
|
|
376
|
+
const registry = await reconcileRegistry(configured, [...observedStats.keys()]);
|
|
401
377
|
const names = [...new Set([...configured.keys(), ...observedStats.keys(), ...registry.keys()])].sort((a, b) => a.localeCompare(b));
|
|
402
378
|
const now = Date.now();
|
|
403
379
|
|
|
@@ -451,7 +427,7 @@ export const putIntegrationRegistryRoute: Handler = async (req, params) => {
|
|
|
451
427
|
const parsed = await parseBody<unknown>(req);
|
|
452
428
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
453
429
|
try {
|
|
454
|
-
return json(
|
|
430
|
+
return json((await upsertIntegrationRegistryAsync(normalizeIntegrationRegistryInput(name, parsed.body))));
|
|
455
431
|
} catch (e) {
|
|
456
432
|
if (e instanceof ValidationError) return error(e.message, 400);
|
|
457
433
|
throw e;
|
|
@@ -523,7 +499,7 @@ async function applyInboundChannelReaction(payload: Record<string, unknown>): Pr
|
|
|
523
499
|
const result = await setMessageReactionAsync({ messageId: parent.id, actorId, emoji, action });
|
|
524
500
|
if (result.ok) {
|
|
525
501
|
emitMessageReactionUpdated(result.message);
|
|
526
|
-
sendReactionNotificationToAuthor(result.message, actorId, emoji, action);
|
|
502
|
+
(await sendReactionNotificationToAuthor(result.message, actorId, emoji, action));
|
|
527
503
|
}
|
|
528
504
|
}
|
|
529
505
|
|
|
@@ -535,7 +511,7 @@ export const postChannelEvent: Handler = async (req, params) => {
|
|
|
535
511
|
if (!channel) return error("channel not found", 404);
|
|
536
512
|
const sessionError = requireChannelSession(req, parsed.body, channel);
|
|
537
513
|
if (sessionError) return sessionError;
|
|
538
|
-
const denied = authorizeRoute(req, { scope: "channel:write", resource: { channel: channel.id } });
|
|
514
|
+
const denied = (await authorizeRoute(req, { scope: "channel:write", resource: { channel: channel.id } }));
|
|
539
515
|
if (denied) return denied;
|
|
540
516
|
const input = normalizeChannelEventBody(parsed.body);
|
|
541
517
|
validateChannelEnvelope(input.payload, channel);
|
|
@@ -547,7 +523,7 @@ export const postChannelEvent: Handler = async (req, params) => {
|
|
|
547
523
|
await applyInboundChannelReaction(input.payload);
|
|
548
524
|
const bindings = await resolveChannelRoutesAsync(channel.id, input.conversationId);
|
|
549
525
|
if (!bindings.length) return error("channel has no binding", 409);
|
|
550
|
-
const results = bindings.map((binding) =>
|
|
526
|
+
const results = await Promise.all(bindings.map(async (binding) => (await sendMessageWithResultAsync({
|
|
551
527
|
from: channel.agentId,
|
|
552
528
|
to: messageTargetForChannelTarget(binding.target, binding),
|
|
553
529
|
kind: "channel.event",
|
|
@@ -556,7 +532,7 @@ export const postChannelEvent: Handler = async (req, params) => {
|
|
|
556
532
|
payload: input.payload,
|
|
557
533
|
idempotencyKey: scopedChannelIdempotencyKey(input.idempotencyKey, binding),
|
|
558
534
|
claimable: false,
|
|
559
|
-
}));
|
|
535
|
+
}))));
|
|
560
536
|
for (const result of results) {
|
|
561
537
|
if (!result.created) continue;
|
|
562
538
|
if (result.message.deliveryStatus === "queued") emitMessageQueued(result.message);
|
|
@@ -624,7 +600,7 @@ export const postIntegrationEvent: Handler = async (req) => {
|
|
|
624
600
|
return error("integration token cannot target this task", 403);
|
|
625
601
|
}
|
|
626
602
|
const input = await resolveIntegrationEventTarget({ ...normalized, source: normalized.source ?? integrationName });
|
|
627
|
-
const result =
|
|
603
|
+
const result = (await ingestIntegrationEventAsync(input, integrationName));
|
|
628
604
|
if (result.message) emitNewMessage(result.message);
|
|
629
605
|
emitTaskChanged(result.task, result.created ? "task.created" : "task.updated");
|
|
630
606
|
dispatchTaskCallbacksInBackground(result.task.id, result.created ? "task.created" : "task.updated");
|
|
@@ -31,7 +31,7 @@ export const postIssueActivityRoute: Handler = async (req) => {
|
|
|
31
31
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
32
32
|
try {
|
|
33
33
|
if (!isRecord(parsed.body)) throw new ValidationError("issue activity body required");
|
|
34
|
-
const event = recordAndEmitIssueActivity({
|
|
34
|
+
const event = (await recordAndEmitIssueActivity({
|
|
35
35
|
agentId: cleanString(parsed.body.agentId, "agentId", { required: true, max: 200 })!,
|
|
36
36
|
action: cleanAction(parsed.body.action),
|
|
37
37
|
issueRefId: cleanString(parsed.body.issueRefId, "issueRefId", { max: 120 }),
|
|
@@ -42,7 +42,7 @@ export const postIssueActivityRoute: Handler = async (req) => {
|
|
|
42
42
|
title: cleanString(parsed.body.title, "title", { max: 200 }),
|
|
43
43
|
body: cleanString(parsed.body.body, "body", { max: 1000 }),
|
|
44
44
|
metadata: cleanMeta(parsed.body.metadata),
|
|
45
|
-
});
|
|
45
|
+
}));
|
|
46
46
|
return json({ event }, 201);
|
|
47
47
|
} catch (err) {
|
|
48
48
|
if (err instanceof ValidationError) return error(err.message, 400);
|
|
@@ -37,7 +37,7 @@ export const postIssueAssociationRoute: Handler = async (req) => {
|
|
|
37
37
|
const parsed = await parseBody<unknown>(req);
|
|
38
38
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
39
39
|
try {
|
|
40
|
-
return json(associateIssueRef(cleanAssociationBody(parsed.body)));
|
|
40
|
+
return json((await associateIssueRef(cleanAssociationBody(parsed.body))));
|
|
41
41
|
} catch (err) {
|
|
42
42
|
return routeError(err);
|
|
43
43
|
}
|
|
@@ -56,9 +56,9 @@ export const getIssueAssociationEntityIssuesRoute: Handler = (_req, params) => {
|
|
|
56
56
|
}
|
|
57
57
|
};
|
|
58
58
|
|
|
59
|
-
export const getIssueAssociationIssueEntitiesRoute: Handler = (_req, params) => {
|
|
59
|
+
export const getIssueAssociationIssueEntitiesRoute: Handler = async (_req, params) => {
|
|
60
60
|
try {
|
|
61
|
-
const issueRef = resolveAssociationIssueRef({ issueRefId: cleanString(params.issueRefId, "issueRefId", { required: true, max: 120 })! });
|
|
61
|
+
const issueRef = (await resolveAssociationIssueRef({ issueRefId: cleanString(params.issueRefId, "issueRefId", { required: true, max: 120 })! }));
|
|
62
62
|
return json({ issueRef, entities: listIssueEntities(issueRef.id) });
|
|
63
63
|
} catch (err) {
|
|
64
64
|
return routeError(err);
|
|
@@ -69,7 +69,7 @@ export const deleteIssueAssociationRoute: Handler = async (req) => {
|
|
|
69
69
|
const parsed = await parseBody<unknown>(req);
|
|
70
70
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
71
71
|
try {
|
|
72
|
-
return json(removeIssueAssociation(cleanAssociationBody(parsed.body)));
|
|
72
|
+
return json((await removeIssueAssociation(cleanAssociationBody(parsed.body))));
|
|
73
73
|
} catch (err) {
|
|
74
74
|
return routeError(err);
|
|
75
75
|
}
|
package/src/routes/issue-refs.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { deleteIssueRefMappingAsync, getIssueRef, listIssueRefsAsync, patchIssueRefMappingAsync, resolveIssueRefMappingAsync, upsertIssueRefMappingAsync, type ListIssueRefsOptions } from "../services/issue-refs";
|
|
2
2
|
import { getIssueRefByExternalKey, issueRefClosedCompleted, issueRefForRefString } from "../db/issue-refs";
|
|
3
3
|
import { advanceTerminalPlanRefsAsync } from "../services/plan-terminal-refs";
|
|
4
4
|
import { cleanEnum, cleanString, optionalEnum } from "../validation";
|
|
@@ -53,7 +53,7 @@ function cleanResolveBody(body: unknown) {
|
|
|
53
53
|
return body;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
export const listIssueRefsRoute: Handler = (req) => {
|
|
56
|
+
export const listIssueRefsRoute: Handler = async (req) => {
|
|
57
57
|
try {
|
|
58
58
|
const url = new URL(req.url);
|
|
59
59
|
const rawLimit = parseQueryInt(url.searchParams.get("limit"), { min: 1, max: 500, clamp: true });
|
|
@@ -64,7 +64,7 @@ export const listIssueRefsRoute: Handler = (req) => {
|
|
|
64
64
|
status: optionalEnum(url.searchParams.get("status") ?? undefined, "status", ISSUE_REF_STATUSES) as IssueRefStatus | undefined,
|
|
65
65
|
limit: rawLimit ?? undefined,
|
|
66
66
|
};
|
|
67
|
-
return json({ issueRefs:
|
|
67
|
+
return json({ issueRefs: await listIssueRefsAsync(opts) });
|
|
68
68
|
} catch (err) {
|
|
69
69
|
return error(err instanceof Error ? err.message : "issue refs route failed");
|
|
70
70
|
}
|
|
@@ -76,7 +76,7 @@ export const postIssueRefRoute: Handler = async (req) => {
|
|
|
76
76
|
try {
|
|
77
77
|
const body = cleanUpsertBody(parsed.body);
|
|
78
78
|
const before = getIssueRefByExternalKey(body.provider, body.repo, body.externalKey);
|
|
79
|
-
const issueRef =
|
|
79
|
+
const issueRef = await upsertIssueRefMappingAsync(body);
|
|
80
80
|
// #2520 — a completed close cached here propagates to the plan nodes bound to this ref.
|
|
81
81
|
if (issueRefClosedCompleted(before, issueRef)) await advanceTerminalPlanRefsAsync({ issueRefId: issueRef.id });
|
|
82
82
|
return json({ issueRef });
|
|
@@ -98,7 +98,7 @@ export const resolveIssueRefRoute: Handler = async (req) => {
|
|
|
98
98
|
? issueRefForRefString(ref, cleanString(value.defaultRepo ?? value.repo, "defaultRepo", { max: 500 }))
|
|
99
99
|
: getIssueRefByExternalKey(cleanProvider(value.provider), cleanString(value.repo, "repo", { required: true, max: 500 })!, cleanString(value.externalKey, "externalKey", { required: true, max: 240 })!);
|
|
100
100
|
const issueRef = ref
|
|
101
|
-
?
|
|
101
|
+
? await resolveIssueRefMappingAsync({
|
|
102
102
|
ref,
|
|
103
103
|
defaultRepo: cleanString(value.defaultRepo ?? value.repo, "defaultRepo", { max: 500 }),
|
|
104
104
|
provider: optionalEnum(value.provider, "provider", ISSUE_PROVIDERS, "github") as IssueProvider,
|
|
@@ -107,7 +107,7 @@ export const resolveIssueRefRoute: Handler = async (req) => {
|
|
|
107
107
|
closeReason: cleanCloseReason(value.closeReason),
|
|
108
108
|
statusSyncedAt: cleanTimestamp(value.statusSyncedAt),
|
|
109
109
|
})
|
|
110
|
-
:
|
|
110
|
+
: await resolveIssueRefMappingAsync({
|
|
111
111
|
provider: cleanProvider(value.provider),
|
|
112
112
|
repo: cleanString(value.repo, "repo", { required: true, max: 500 })!,
|
|
113
113
|
externalKey: cleanString(value.externalKey, "externalKey", { required: true, max: 240 })!,
|
|
@@ -142,7 +142,7 @@ export const patchIssueRefRoute: Handler = async (req, params) => {
|
|
|
142
142
|
try {
|
|
143
143
|
const id = cleanString(params.id, "id", { required: true, max: 120 })!;
|
|
144
144
|
const before = getIssueRef(id);
|
|
145
|
-
const issueRef =
|
|
145
|
+
const issueRef = await patchIssueRefMappingAsync(id, cleanPatchBody(parsed.body));
|
|
146
146
|
if (!issueRef) return error("issue ref not found", 404);
|
|
147
147
|
// #2520 — a completed close cached here propagates to the plan nodes bound to this ref.
|
|
148
148
|
if (issueRefClosedCompleted(before, issueRef)) await advanceTerminalPlanRefsAsync({ issueRefId: issueRef.id });
|
|
@@ -152,9 +152,9 @@ export const patchIssueRefRoute: Handler = async (req, params) => {
|
|
|
152
152
|
}
|
|
153
153
|
};
|
|
154
154
|
|
|
155
|
-
export const deleteIssueRefRoute: Handler = (_req, params) => {
|
|
155
|
+
export const deleteIssueRefRoute: Handler = async (_req, params) => {
|
|
156
156
|
try {
|
|
157
|
-
const deleted =
|
|
157
|
+
const deleted = await deleteIssueRefMappingAsync(cleanString(params.id, "id", { required: true, max: 120 })!);
|
|
158
158
|
if (!deleted) return error("issue ref not found", 404);
|
|
159
159
|
return json({ deleted });
|
|
160
160
|
} catch (err) {
|
|
@@ -22,7 +22,7 @@ export const postTimerMessageOperator: Handler = async (req, params) => {
|
|
|
22
22
|
// Unlike routine routes in allow-unauth development mode, the migration trigger always requires
|
|
23
23
|
// an actual credential. This keeps "authenticated" a property of the action, not deployment mode.
|
|
24
24
|
if (!hasPresentedCredential(req)) return error("authentication required", 401);
|
|
25
|
-
const denied = authorizeRoute(req, { scope: "system:admin" });
|
|
25
|
+
const denied = (await authorizeRoute(req, { scope: "system:admin" }));
|
|
26
26
|
if (denied) return denied;
|
|
27
27
|
const actor = resolveActorLabel(req);
|
|
28
28
|
if (!actor) return error("authenticated operator identity required", 403);
|
package/src/routes/memory.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { authorizeRoute, error, json, parseBody, type Handler } from "./_shared"
|
|
|
7
7
|
// that area's memories (src/memory-area-injection.ts).
|
|
8
8
|
export const postAgentAreaEntered: Handler = async (req, params) => {
|
|
9
9
|
const agentId = params.id!;
|
|
10
|
-
const denied = authorizeRoute(req, { scope: "agent:write", resource: { agentId } });
|
|
10
|
+
const denied = (await authorizeRoute(req, { scope: "agent:write", resource: { agentId } }));
|
|
11
11
|
if (denied) return denied;
|
|
12
12
|
const ctx = authContextFromRequest(req);
|
|
13
13
|
if (ctx.actor.kind !== "system" && ctx.callerAgentId !== agentId) return error("forbidden: only the agent's own runner may report its area touches", 403);
|
package/src/routes/merges.ts
CHANGED
|
@@ -22,8 +22,8 @@ function actorFromRequest(req: Request): string {
|
|
|
22
22
|
: "root";
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
export const getMergePauses: Handler = (req) => {
|
|
26
|
-
const denied = authorizeRoute(req, { scope: "command:read" });
|
|
25
|
+
export const getMergePauses: Handler = async (req) => {
|
|
26
|
+
const denied = (await authorizeRoute(req, { scope: "command:read" }));
|
|
27
27
|
if (denied) return denied;
|
|
28
28
|
return json({ pauses: listAutoMergePauses() });
|
|
29
29
|
};
|
|
@@ -37,13 +37,13 @@ export const getMergePauses: Handler = (req) => {
|
|
|
37
37
|
* indefinitely, and #2094's fast reclaim covers whatever the interlock misses.
|
|
38
38
|
*/
|
|
39
39
|
export const getMergeDrain: Handler = async (req) => {
|
|
40
|
-
const denied = authorizeRoute(req, { scope: "command:read" });
|
|
40
|
+
const denied = (await authorizeRoute(req, { scope: "command:read" }));
|
|
41
41
|
if (denied) return denied;
|
|
42
42
|
return json(await workspaceMergeDrainStatusAsync());
|
|
43
43
|
};
|
|
44
44
|
|
|
45
45
|
export const postMergePause: Handler = async (req) => {
|
|
46
|
-
const denied = authorizeRoute(req, { scope: "command:write" });
|
|
46
|
+
const denied = (await authorizeRoute(req, { scope: "command:write" }));
|
|
47
47
|
if (denied) return denied;
|
|
48
48
|
const parsed = await parseBody<unknown>(req);
|
|
49
49
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -54,7 +54,7 @@ export const postMergePause: Handler = async (req) => {
|
|
|
54
54
|
const holder = cleanString(parsed.body.holder, "holder", { max: 240 }) ?? actorFromRequest(req);
|
|
55
55
|
const reason = cleanString(parsed.body.reason, "reason", { max: 500 });
|
|
56
56
|
const ttlMs = cleanTtlMs(parsed.body.ttlMs);
|
|
57
|
-
const result = pauseAutoMerge({ repoRoot, baseRef, holder, reason, ttlMs });
|
|
57
|
+
const result = (await pauseAutoMerge({ repoRoot, baseRef, holder, reason, ttlMs }));
|
|
58
58
|
if (!result.ok) {
|
|
59
59
|
return json({ error: "merge target already paused", pause: result.pause }, 409);
|
|
60
60
|
}
|
|
@@ -66,7 +66,7 @@ export const postMergePause: Handler = async (req) => {
|
|
|
66
66
|
};
|
|
67
67
|
|
|
68
68
|
export const postMergePauseRenew: Handler = async (req) => {
|
|
69
|
-
const denied = authorizeRoute(req, { scope: "command:write" });
|
|
69
|
+
const denied = (await authorizeRoute(req, { scope: "command:write" }));
|
|
70
70
|
if (denied) return denied;
|
|
71
71
|
const parsed = await parseBody<unknown>(req);
|
|
72
72
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -74,7 +74,7 @@ export const postMergePauseRenew: Handler = async (req) => {
|
|
|
74
74
|
if (!isRecord(parsed.body)) return error("body required");
|
|
75
75
|
const id = cleanString(parsed.body.id, "id", { required: true, max: 120 })!;
|
|
76
76
|
const ttlMs = cleanTtlMs(parsed.body.ttlMs);
|
|
77
|
-
const pause = renewAutoMergePause(id, ttlMs);
|
|
77
|
+
const pause = (await renewAutoMergePause(id, ttlMs));
|
|
78
78
|
return pause ? json({ pause }) : error("merge pause not found or expired", 404);
|
|
79
79
|
} catch (e) {
|
|
80
80
|
if (e instanceof ValidationError) return error(e.message, 400);
|
|
@@ -83,7 +83,7 @@ export const postMergePauseRenew: Handler = async (req) => {
|
|
|
83
83
|
};
|
|
84
84
|
|
|
85
85
|
export const postMergePauseResume: Handler = async (req) => {
|
|
86
|
-
const denied = authorizeRoute(req, { scope: "command:write" });
|
|
86
|
+
const denied = (await authorizeRoute(req, { scope: "command:write" }));
|
|
87
87
|
if (denied) return denied;
|
|
88
88
|
const parsed = await parseBody<unknown>(req);
|
|
89
89
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -93,7 +93,7 @@ export const postMergePauseResume: Handler = async (req) => {
|
|
|
93
93
|
const repoRoot = cleanString(parsed.body.repoRoot, "repoRoot", { max: 1000 });
|
|
94
94
|
const baseRef = cleanString(parsed.body.baseRef, "baseRef", { max: 240 });
|
|
95
95
|
if (!id && !repoRoot) return error("id or repoRoot required", 400);
|
|
96
|
-
const released = resumeAutoMerge(id ? { id } : { repoRoot: repoRoot!, baseRef: baseRef ?? "main" });
|
|
96
|
+
const released = (await resumeAutoMerge(id ? { id } : { repoRoot: repoRoot!, baseRef: baseRef ?? "main" }));
|
|
97
97
|
return json({ released });
|
|
98
98
|
} catch (e) {
|
|
99
99
|
if (e instanceof ValidationError) return error(e.message, 400);
|
|
@@ -101,8 +101,8 @@ export const postMergePauseResume: Handler = async (req) => {
|
|
|
101
101
|
}
|
|
102
102
|
};
|
|
103
103
|
|
|
104
|
-
export const getMergePauseById: Handler = (req, params) => {
|
|
105
|
-
const denied = authorizeRoute(req, { scope: "command:read" });
|
|
104
|
+
export const getMergePauseById: Handler = async (req, params) => {
|
|
105
|
+
const denied = (await authorizeRoute(req, { scope: "command:read" }));
|
|
106
106
|
if (denied) return denied;
|
|
107
107
|
const pause = getAutoMergePause(params.id!);
|
|
108
108
|
return pause ? json(pause) : error("merge pause not found", 404);
|