@humwick/server 0.130.1 → 0.130.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/bundled/prompts/manifest.json +1 -0
- package/bundled/prompts/task.hydration.md +1 -1
- package/bundled/roles/builder.md +1 -1
- package/docs/guides/sub-coordinators.md +12 -5
- package/docs/guides/tools-administration.md +4 -0
- package/docs/guides/tools-coordination.md +2 -0
- package/docs/guides/tools-tasks.md +8 -0
- package/docs/guides/workflows.md +74 -0
- package/docs/openapi.json +486 -4
- package/package.json +10 -18
- package/public/assets/{MessageBubble-BWpoBjl4.js → MessageBubble-Bq9kr21N.js} +2 -2
- package/public/assets/{PlanGraphPanel-C0auck3n.js → PlanGraphPanel-Dqiroy06.js} +2 -2
- package/public/assets/{TraceView-DBnOx7AQ.js → TraceView-DYU962-H.js} +2 -2
- package/public/assets/{VaultDecisionCard-0kp2oNBC.js → VaultDecisionCard-DhPfzioE.js} +2 -2
- package/public/assets/{activity-yLztXEBt.js → activity-DzCcQTee.js} +2 -2
- package/public/assets/{agent-lineage-BbJDR1dW.js → agent-lineage-SgDt9i3T.js} +2 -2
- package/public/assets/agent-liveness-Bq-s73jW.js +2 -0
- package/public/assets/{agent-name-CTZBrSD9.js → agent-name-CcY3Aijy.js} +2 -2
- package/public/assets/agent-profiles-cxtRBn6O.js +2 -0
- package/public/assets/{agent-project-badge-9TqzUUYE.js → agent-project-badge-DGYbIhaI.js} +2 -2
- package/public/assets/{agent-tools-D4n40pn8.js → agent-tools-DHbftV0N.js} +2 -2
- package/public/assets/{agent-type-icon-D6FUarOf.js → agent-type-icon-CY113sp-.js} +2 -2
- package/public/assets/{agents-BYDslkJc.js → agents-BPzY7IlQ.js} +2 -2
- package/public/assets/{analytics-B-XSbEMC.js → analytics-DENFPv_a.js} +2 -2
- package/public/assets/{artifact-viewer-DdWIfV6M.js → artifact-viewer-KRvSc7sl.js} +2 -2
- package/public/assets/{artifacts-DPN1q4pA.js → artifacts-C9gSmL3s.js} +2 -2
- package/public/assets/{artifacts-oBOqks-2.js → artifacts-DT-HkI5O.js} +2 -2
- package/public/assets/{automation-4KcRFXEu.js → automation-BsmjQhKD.js} +2 -2
- package/public/assets/{backlog-Cw9xPTCF.js → backlog-8NYH_62t.js} +2 -2
- package/public/assets/{busy-health-CTu32MZt.js → busy-health-D3hwvYb4.js} +2 -2
- package/public/assets/{channels-BiXzg1G9.js → channels-DCJ5WL7O.js} +2 -2
- package/public/assets/{chat-Ctk2qwvA.js → chat-DAIl357U.js} +3 -3
- package/public/assets/{code-preview-Bm1wWqAp.js → code-preview-CzrZfr9U.js} +2 -2
- package/public/assets/{connectors-C36ax4Vw.js → connectors-xTxtlyou.js} +2 -2
- package/public/assets/{cosmos-Jj9LK2Wf.js → cosmos-BpebFLK2.js} +2 -2
- package/public/assets/{crate-agent-H6S7-B9T.js → crate-agent-BHvI5wXC.js} +2 -2
- package/public/assets/{dependency-graph-Cd1E23wa.js → dependency-graph-DGT0o3wJ.js} +2 -2
- package/public/assets/{deploys-Bwfq146q.js → deploys-hqWOHSHE.js} +2 -2
- package/public/assets/{display-CfO7rTuF.js → display-CDeH4I8T.js} +2 -2
- package/public/assets/{files-DhhZI2Ih.js → files-BTeGVmTg.js} +2 -2
- package/public/assets/{fleet-B_rFEbnL.js → fleet-DgXtNgCa.js} +2 -2
- package/public/assets/{fleet-metrics-BkHP-P3R.js → fleet-metrics-BHEt5yc_.js} +2 -2
- package/public/assets/{formatted-body-Cm1RrzmN.js → formatted-body-MLtodyPp.js} +3 -3
- package/public/assets/{formatted-body-impl-DQiOuOD1.js → formatted-body-impl-CAe664Z8.js} +2 -2
- package/public/assets/{host-providers-dialog-CHqwXTov.js → host-providers-dialog-mapF4Fj9.js} +2 -2
- package/public/assets/index-CqqgOI5R.js +15 -0
- package/public/assets/index-MYAIwYTX.css +2 -0
- package/public/assets/{insights-fH1EL-qZ.js → insights-DNyf7IzF.js} +2 -2
- package/public/assets/{integrations-C5Oix6ng.js → integrations-DlYOHq7T.js} +2 -2
- package/public/assets/{issue-ref-chip-ODyondIa.js → issue-ref-chip-CeWBNWn7.js} +2 -2
- package/public/assets/{log-viewer-Cvfy6PW7.js → log-viewer-Cib8nqdE.js} +2 -2
- package/public/assets/{maintenance-D8CDH5wZ.js → maintenance-DSn1cPm7.js} +2 -2
- package/public/assets/{managed-agents-egllbpij.js → managed-agents-C3CkM81m.js} +2 -2
- package/public/assets/{markdown-preview-CYSFgVgK.js → markdown-preview-W4VQQPAv.js} +3 -3
- package/public/assets/{markdown-preview-impl-BteVIjX4.js → markdown-preview-impl-CMsTdhjq.js} +2 -2
- package/public/assets/{memory-C8WmXsyr.js → memory-BV17qtO4.js} +2 -2
- package/public/assets/{messages-BzQdqlO6.js → messages-Bm_1AqSA.js} +2 -2
- package/public/assets/{orchestrators-B1HxzkNw.js → orchestrators-Dg-vfP09.js} +2 -2
- package/public/assets/{overview-DCUnI4Z7.js → overview-DcYCrvlr.js} +2 -2
- package/public/assets/{pairs-ftCd2XcD.js → pairs-8o9nuG3V.js} +2 -2
- package/public/assets/{profile-icon-B2zH8DMH.js → profile-icon-BsRyBMea.js} +2 -2
- package/public/assets/project-profile-instructions-DETKFn_E.js +2 -0
- package/public/assets/projects-M_m6AHws.js +2 -0
- package/public/assets/{prompt-settings-Bftq9czX.js → prompt-settings-C_mNCgeL.js} +2 -2
- package/public/assets/provider-display-BEeLXC_D.js +2 -0
- package/public/assets/{registry-DWCU5c8q.js → registry-DDHHHE5N.js} +2 -2
- package/public/assets/run-card-Dt4I4jaP.js +2 -0
- package/public/assets/scroll-text-BKXS1ahr.js +2 -0
- package/public/assets/{secrets-C7GIUATz.js → secrets-BkVwxI5O.js} +2 -2
- package/public/assets/{service-access-settings-C3aujqTG.js → service-access-settings-Crq-6a-B.js} +2 -2
- package/public/assets/{settings-C6sZ9eBa.js → settings-CYcavMFu.js} +2 -2
- package/public/assets/shipping-H6gzEeZB.js +2 -0
- package/public/assets/{stats-V9Z-GxUd.js → stats-BJVeWkpV.js} +2 -2
- package/public/assets/{status-dot-CVv0iGHL.js → status-dot-BcHyw1Vw.js} +2 -2
- package/public/assets/store-DKPDIZBe.js +9 -0
- package/public/assets/{tasks-CXU75HRF.js → tasks-qJjlQPpx.js} +2 -2
- package/public/assets/{teams-BPf976zb.js → teams-Cd5Sk1uX.js} +2 -2
- package/public/assets/{terminal-viewer-DE9BOe-8.js → terminal-viewer-CpY5_m7W.js} +3 -3
- package/public/assets/{terminal-viewer-impl-D04pjmGh.js → terminal-viewer-impl-DI_2llFR.js} +2 -2
- package/public/assets/token-estimate-Co-Jdphh.js +2 -0
- package/public/assets/{use-agent-terminal-B1yR456R.js → use-agent-terminal-0yJA_buM.js} +2 -2
- package/public/assets/{use-decisions-D-S4tpDf.js → use-decisions-uJXHf34W.js} +2 -2
- package/public/assets/use-project-list-CpWl6eHQ.js +2 -0
- package/public/assets/{use-selectors-CnrAk2YP.js → use-selectors-BdxBW8mL.js} +2 -2
- package/public/assets/{user-avatar-nBFIcR4M.js → user-avatar-3IndfpOc.js} +2 -2
- package/public/assets/versioned-prompt-editor-CIVg7XB1.js +8 -0
- package/public/assets/{work-queue-TCjJxeT-.js → work-queue-B9rnLwHZ.js} +2 -2
- package/public/assets/{workflow-marker-Cf3Hf2fN.js → workflow-marker-X8wxyhzC.js} +2 -2
- package/public/assets/{workflows-CXQX20Qj.js → workflows-o5YyMFW7.js} +2 -2
- package/public/assets/{workspaces-qSYzKYMA.js → workspaces-CzEGoAng.js} +2 -2
- package/public/cosmos.html +4 -4
- package/public/index.html +31 -29
- package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/runner/plugins/claude/hooks/gate-run-guard.provisioned.mjs +31 -1
- package/runner/src/adapters/claude-effort.ts +2 -4
- package/runner/src/adapters/claude-headless.ts +1 -1
- package/runner/src/adapters/claude-launch-exit.ts +26 -0
- package/runner/src/adapters/claude-session-probe.ts +1 -1
- package/runner/src/adapters/claude-tmux.ts +38 -10
- package/runner/src/adapters/claude.ts +28 -75
- package/runner/src/adapters/codex-launch-config.ts +4 -5
- package/runner/src/adapters/codex.ts +1 -1
- package/runner/src/adapters/opencode-provider.ts +7 -22
- package/runner/src/adapters/opencode.ts +4 -4
- package/runner/src/adapters/provider-quota-harvest.ts +20 -71
- package/runner/src/agent-runner/credentials.ts +42 -12
- package/runner/src/agent-runner/inbox.ts +27 -0
- package/runner/src/agent-runner/lifecycle-milestones.ts +2 -4
- package/runner/src/agent-runner/liveness-exchange.ts +104 -0
- package/runner/src/bin/claude.ts +4 -0
- package/runner/src/bin/codex.ts +4 -0
- package/runner/src/bin/opencode.ts +4 -0
- package/runner/src/claude-system-prompt.ts +49 -0
- package/runner/src/index.ts +5 -2
- package/runner/src/launch-assembly.ts +14 -10
- package/runner/src/profile-home.ts +1 -1
- package/runner/src/project-instructions.ts +2 -2
- package/runner/src/provider-command.ts +18 -0
- package/runner/src/provider-setup.ts +35 -0
- package/runner/src/providers.ts +2 -1
- package/runner/src/runner-core.ts +32 -38
- package/runner/src/runner-helpers.ts +0 -8
- package/runner/src/session-scratch.ts +6 -2
- package/runner/src/spawn-input.ts +2 -1
- package/runner/src/test-run-dedup.ts +59 -56
- package/runner/test-support/provisioning-context.ts +4 -2
- package/runner/test-support/runner-harness.ts +2 -1
- package/scripts/cd-config.ts +8 -0
- package/scripts/gate-run-lease.ts +10 -7
- package/scripts/gate.sh +5 -1
- package/scripts/steward-policy-cleanup.ts +2 -2
- package/src/agent-authz.ts +2 -2
- package/src/agent-drive-arbiter.ts +3 -8
- package/src/agent-exit-cleanup-async.ts +2 -2
- package/src/agent-exit-cleanup.ts +23 -19
- package/src/agent-lifecycle-events.ts +112 -85
- package/src/agent-ref.ts +3 -2
- package/src/agent-status-events.ts +43 -14
- package/src/auth/password.ts +4 -3
- package/src/auth/session-refresh.ts +1 -1
- package/src/auth/session.test-fixture.ts +2 -2
- package/src/auth/session.ts +7 -7
- package/src/automations/crud.ts +8 -81
- package/src/automations/dispatch.ts +33 -58
- package/src/automations/index.ts +1 -1
- package/src/automations/persistence.ts +65 -0
- package/src/automations/precheck.ts +18 -16
- package/src/automations/read-async.ts +11 -0
- package/src/automations/reconcile.ts +30 -39
- package/src/automations/storage.ts +33 -10
- package/src/automations/write-async.ts +33 -0
- package/src/branch-land-notice.ts +93 -0
- package/src/branch-landed.ts +31 -98
- package/src/bus.ts +40 -39
- package/src/cd-deploy-notify.ts +32 -4
- package/src/cd-host-lag-notify.ts +7 -6
- package/src/ci/incidents.ts +2 -2
- package/src/ci/monitor.ts +5 -8
- package/src/ci/notifications.ts +4 -4
- package/src/ci/root-missing.ts +4 -9
- package/src/ci/transition-notify.ts +12 -44
- package/src/claude-app/oauth-http.ts +3 -3
- package/src/cli/cd-pauses.ts +19 -0
- package/src/cli/orchestrator.ts +1 -1
- package/src/cli/state.ts +2 -19
- package/src/cli/task-edit.ts +22 -0
- package/src/cli/task.ts +3 -1
- package/src/cli/workflow.ts +19 -4
- package/src/commands-db.ts +7 -7
- package/src/commands-write.ts +8 -0
- package/src/compaction-watch.ts +10 -8
- package/src/config-store-write.ts +13 -1
- package/src/config-store.ts +25 -14
- package/src/config.ts +4 -11
- package/src/connectors.ts +10 -8
- package/src/context-advisory.ts +22 -21
- package/src/db/activity-async.ts +6 -1
- package/src/db/activity-write-ops.ts +12 -1
- package/src/db/activity.ts +1 -14
- package/src/db/agent-action-write.ts +36 -0
- package/src/db/agent-control-async.ts +9 -0
- package/src/db/agent-control-write.ts +49 -0
- package/src/db/agent-effort-observe.ts +22 -0
- package/src/db/agent-meta.ts +14 -3
- package/src/db/agent-search.ts +1 -15
- package/src/db/agents-async.ts +59 -9
- package/src/db/agents-write-ops.ts +12 -3
- package/src/db/agents.ts +95 -65
- package/src/db/auth-identities.ts +2 -2
- package/src/db/automation-read-ops.ts +11 -0
- package/src/db/automation-write-ops.ts +46 -0
- package/src/db/blackboard.ts +2 -2
- package/src/db/browser-session-write.ts +32 -0
- package/src/db/bus-outbox-write-ops.ts +3 -1
- package/src/db/checkout-refresh-schema.ts +47 -0
- package/src/db/checkout-refresh.ts +5 -5
- package/src/db/ci-incidents-async.ts +5 -5
- package/src/db/ci-incidents-write-ops.ts +2 -2
- package/src/db/command-agent-profile-backfill.ts +39 -0
- package/src/db/command-agent-profiles.ts +5 -1
- package/src/db/command-retention.ts +126 -0
- package/src/db/command-row.ts +10 -2
- package/src/db/commands-list-query.ts +2 -0
- package/src/db/commands-planner-stats.test-fixture.ts +8 -0
- package/src/db/commands-read-ops.ts +16 -0
- package/src/db/commands-spawn-read.ts +1 -1
- package/src/db/config-store-write-ops.ts +7 -2
- package/src/db/connection.ts +1 -182
- package/src/db/context-carry-write.ts +74 -0
- package/src/db/continuation-archives-async.ts +5 -0
- package/src/db/continuation-archives-write-ops.ts +7 -0
- package/src/db/continuations.ts +6 -6
- package/src/db/db-error-registry.ts +12 -0
- package/src/db/db-writer-worker.ts +8 -1
- package/src/db/deploy-events-async.ts +1 -0
- package/src/db/deploy-events-read-ops.ts +2 -1
- package/src/db/deploy-events.ts +35 -4
- package/src/db/gateway.ts +26 -133
- package/src/db/history-retention-ops.ts +13 -0
- package/src/db/hosts-registration.ts +10 -2
- package/src/db/hosts.ts +9 -6
- package/src/db/inbox-async.ts +2 -2
- package/src/db/inbox-read-ops.ts +1 -1
- package/src/db/inbox.ts +9 -17
- package/src/db/index.ts +2 -0
- package/src/db/integrations-async.ts +8 -0
- package/src/db/integrations-ops.ts +15 -0
- package/src/db/integrations.ts +15 -21
- package/src/db/issue-associations.ts +2 -2
- package/src/db/issue-lifecycle.ts +3 -4
- package/src/db/issue-refs-async.ts +23 -0
- package/src/db/issue-refs-read-ops.ts +6 -0
- package/src/db/issue-refs-write-ops.ts +29 -0
- package/src/db/issue-refs.ts +15 -16
- package/src/db/kernel-event-log-schema.ts +2 -0
- package/src/db/land-boundaries.ts +51 -5
- package/src/db/land-gate-attestations.ts +2 -2
- package/src/db/landing-receipts.ts +2 -2
- package/src/db/lifecycle-context-write.ts +5 -0
- package/src/db/lifecycle-tail-async.ts +76 -0
- package/src/db/lifecycle-tail-write-ops.ts +62 -0
- package/src/db/lifecycle-write-window.ts +2 -1
- package/src/db/lineage-pair-dedupe-sql.ts +3 -3
- package/src/db/long-running-work.ts +2 -2
- package/src/db/main-connection-mode.ts +11 -0
- package/src/db/main-connection-writes.ts +41 -2
- package/src/db/maintenance-job-reconcile.ts +61 -0
- package/src/db/maintenance-job-runs-async.ts +14 -0
- package/src/db/maintenance-job-write-ops.ts +9 -0
- package/src/db/maintenance-pauses.ts +2 -2
- package/src/db/mappers.ts +2 -14
- package/src/db/merge-lease.ts +1 -15
- package/src/db/message-send.ts +4 -0
- package/src/db/messages.ts +31 -25
- package/src/db/migrations.ts +25 -16
- package/src/db/notification-write-ops.ts +19 -0
- package/src/db/operator-answer-write.ts +19 -0
- package/src/db/orchestrators.ts +14 -76
- package/src/db/pairs-async.ts +22 -1
- package/src/db/pairs-write-ops.ts +8 -3
- package/src/db/pairs.ts +42 -61
- package/src/db/plan-dispatch-schema.ts +5 -1
- package/src/db/plan-ready-notices.ts +43 -0
- package/src/db/plan-tools-include-migration.ts +36 -0
- package/src/db/plans-write-ops.ts +2 -0
- package/src/db/presence-buffer.ts +5 -0
- package/src/db/presence-loop.ts +18 -23
- package/src/db/presence-write.ts +0 -6
- package/src/db/project-entries-async.ts +14 -0
- package/src/db/project-entries-read-ops.ts +5 -1
- package/src/db/project-entries-write-ops.ts +8 -0
- package/src/db/project-entries.ts +15 -12
- package/src/db/project-journal.ts +2 -2
- package/src/db/project-profile-instructions.ts +50 -0
- package/src/db/project-trust-approvals.ts +2 -2
- package/src/db/prompt-templates.ts +4 -4
- package/src/db/prompt-versions.ts +9 -2
- package/src/db/provider-config-history.ts +8 -3
- package/src/db/provider-model-seed.ts +34 -0
- package/src/db/read-op-marshaling-fixtures.ts +23 -0
- package/src/db/read-ops.ts +8 -0
- package/src/db/retention.ts +13 -2
- package/src/db/review-publish-write.ts +8 -0
- package/src/db/routing-policy.ts +2 -3
- package/src/db/runtime-admin-async.ts +19 -0
- package/src/db/runtime-admin-write-ops.ts +36 -0
- package/src/db/runtime-tail-async.ts +288 -0
- package/src/db/runtime-tail-write-ops.ts +97 -0
- package/src/db/schema.ts +13 -4
- package/src/db/spawn-budget.ts +5 -0
- package/src/db/spawn-delegation-state.ts +11 -4
- package/src/db/spawn-delegation.ts +1 -11
- package/src/db/sql-audit-indexes.ts +3 -0
- package/src/db/stats-async.ts +9 -6
- package/src/db/task-entity.ts +28 -6
- package/src/db/task-list.ts +3 -1
- package/src/db/tasks.ts +1 -17
- package/src/db/team-claim-policy.ts +60 -0
- package/src/db/teams-async.ts +4 -0
- package/src/db/teams-write-ops.ts +4 -0
- package/src/db/terminal-events.ts +15 -0
- package/src/db/timer-cutover-bodies.ts +292 -0
- package/src/db/timer-cutover-core.ts +37 -278
- package/src/db/timer-cutover-state.ts +40 -0
- package/src/db/timer-cutover-write-ops.ts +1 -40
- package/src/db/timer-ingress.ts +7 -1
- package/src/db/token-db-write-ops.ts +19 -0
- package/src/db/token-standing-async.ts +12 -0
- package/src/db/token-standing.ts +21 -20
- package/src/db/token-usage-retention.ts +33 -0
- package/src/db/token-usage-write-ops.ts +1 -1
- package/src/db/token-usage.ts +4 -1
- package/src/db/user-invites-async.ts +13 -0
- package/src/db/user-invites.ts +3 -3
- package/src/db/users.ts +14 -6
- package/src/db/workflow-contact.ts +1 -1
- package/src/db/workflow-task-read-ops.ts +30 -0
- package/src/db/workspaces.ts +8 -5
- package/src/db/write-ops.ts +37 -12
- package/src/db/writer-fault-seam.ts +2 -9
- package/src/db/writer-fault-test-ops.ts +18 -0
- package/src/db/writer-gateway.ts +58 -56
- package/src/dev.ts +8 -3
- package/src/dispatch-availability.ts +10 -6
- package/src/ephemeral/{landing-ingress-proof-worker.ts → landing-ingress-proof.test-fixture.ts} +4 -2
- package/src/event-loop-lag.ts +4 -2
- package/src/event-loop-yield.ts +2 -2
- package/src/events.ts +10 -8
- package/src/host/disk-alert.ts +121 -0
- package/src/host-provider-store.ts +5 -4
- package/src/hub-metrics-report.ts +5 -1
- package/src/hub-metrics.ts +38 -18
- package/src/injection-sweep-pacing.ts +6 -8
- package/src/land-gate-notifications.ts +11 -10
- package/src/land-gate-queue-progress.ts +3 -3
- package/src/land-settle-dispatch.ts +52 -92
- package/src/lifecycle-context-pressure.ts +11 -10
- package/src/lifecycle-manager.ts +107 -100
- package/src/maintenance/breaker.ts +18 -16
- package/src/maintenance/cd-watcher.ts +3 -3
- package/src/maintenance/checkout-refresh.ts +18 -1
- package/src/maintenance/critical-job-watchdog.ts +19 -20
- package/src/maintenance/events.ts +3 -3
- package/src/maintenance/history-retention-job.ts +30 -0
- package/src/maintenance/index.ts +1 -0
- package/src/maintenance/jobs.ts +32 -69
- package/src/maintenance/long-running-work.ts +3 -1
- package/src/maintenance/offline-agent-prune-job.ts +28 -0
- package/src/maintenance/orphaned-sessions.ts +5 -4
- package/src/maintenance/pauses.ts +4 -10
- package/src/maintenance/plan-ready-notice-job.ts +71 -0
- package/src/maintenance/scheduler.ts +98 -137
- package/src/maintenance/stalled-delivery-pager.ts +10 -9
- package/src/maintenance/teams.ts +19 -30
- package/src/maintenance/workspaces.ts +18 -28
- package/src/managed-policy-escalation.ts +7 -7
- package/src/managed-policy.ts +32 -28
- package/src/managed-provider-gate.ts +5 -4
- package/src/managed-spawn-reservation.ts +5 -4
- package/src/mcp/index.ts +12 -9
- package/src/mcp/output-descriptions.ts +8 -8
- package/src/mcp/presentation.ts +6 -5
- package/src/mcp/project-profile-instructions.ts +32 -0
- package/src/mcp/runtime-output.ts +6 -1
- package/src/mcp/self-care-visibility.ts +2 -2
- package/src/mcp/spawn-targets-matrix.ts +10 -1
- package/src/mcp/tool-groups.ts +4 -3
- package/src/mcp/tool-roles.ts +81 -0
- package/src/mcp/tools-spawn.ts +4 -3
- package/src/mcp/tools-workspace.ts +1 -1
- package/src/mcp-agent-action.ts +1 -2
- package/src/mcp-blackboard-tools.ts +6 -5
- package/src/mcp-decision-tools.ts +7 -7
- package/src/mcp-egress-tools.ts +10 -9
- package/src/mcp-issue-activity-tools.ts +2 -2
- package/src/mcp-issue-association-tools.ts +4 -4
- package/src/mcp-issue-ref-tools.ts +13 -12
- package/src/mcp-maintenance-tools.ts +2 -2
- package/src/mcp-merge-tools.ts +5 -5
- package/src/mcp-notification-subscription-tools.ts +14 -15
- package/src/mcp-output-levels.test-fixture.ts +1 -1
- package/src/mcp-profile-trust-tools.ts +5 -5
- package/src/mcp-project-journal-tools.ts +4 -12
- package/src/mcp-project-tools.ts +17 -18
- package/src/mcp-provider-catalog.ts +2 -2
- package/src/mcp-routing-policy-tools.ts +3 -2
- package/src/mcp-task-tools.ts +11 -5
- package/src/mcp-team-template-tools.ts +3 -3
- package/src/mcp-team-tools.ts +6 -6
- package/src/mcp-workflow-tools.ts +13 -4
- package/src/memory-area-injection.ts +13 -12
- package/src/memory-boundary-capture.ts +6 -6
- package/src/memory-injection.ts +45 -43
- package/src/merge-pause-maintenance.ts +5 -4
- package/src/notification-router.ts +44 -17
- package/src/notification-types.ts +2 -1
- package/src/notify.ts +5 -5
- package/src/observed-reset-refresh.ts +4 -4
- package/src/operator-alarm.ts +23 -11
- package/src/project-ingest.ts +6 -6
- package/src/project-instructions.ts +12 -1
- package/src/project-profile-instruction-text.ts +6 -0
- package/src/project-profile-instructions.ts +20 -0
- package/src/project-trust.ts +12 -11
- package/src/prompt-resolver.ts +3 -3
- package/src/provider-catalog-store.ts +3 -49
- package/src/provider-config-store.ts +12 -11
- package/src/provider-model-seed.ts +1 -18
- package/src/provider-quota-async.ts +5 -7
- package/src/provider-quota-config-store.ts +5 -4
- package/src/provider-secrets.test-fixture.ts +3 -3
- package/src/provider-timeline-event.ts +4 -7
- package/src/quota-band-delivery.ts +2 -2
- package/src/recipe-runner.ts +6 -5
- package/src/repo-config-source.ts +10 -4
- package/src/retention-config-store.ts +4 -3
- package/src/reviewer-pipeline.ts +11 -10
- package/src/routes/_route.ts +4 -4
- package/src/routes/_shared.ts +13 -12
- package/src/routes/agent-effort.ts +5 -5
- package/src/routes/agent-heartbeat-quota.ts +23 -0
- package/src/routes/agent-keep.ts +1 -1
- package/src/routes/agent-profiles.ts +6 -6
- package/src/routes/agent-reporting.ts +1 -1
- package/src/routes/agent-self-effort.ts +5 -5
- package/src/routes/agent-sessions.ts +24 -24
- package/src/routes/agents-spawn.ts +2 -2
- package/src/routes/agents.ts +19 -121
- package/src/routes/auth.ts +14 -15
- package/src/routes/authority-audit.ts +2 -2
- package/src/routes/automations.ts +6 -5
- package/src/routes/channel-binding-delete.ts +1 -1
- package/src/routes/channel-output.ts +3 -3
- package/src/routes/claude-api-budget.ts +5 -5
- package/src/routes/commands-listing.ts +5 -1
- package/src/routes/commands.ts +31 -29
- package/src/routes/context-resets.ts +2 -2
- package/src/routes/continuation-archives.ts +2 -2
- package/src/routes/coordinator-teams.ts +1 -1
- package/src/routes/decisions.ts +2 -2
- package/src/routes/host-secret-files.ts +1 -1
- package/src/routes/hosts.ts +11 -11
- package/src/routes/inbox.ts +3 -2
- package/src/routes/index.ts +12 -2
- package/src/routes/integrations.ts +32 -56
- package/src/routes/issue-activity.ts +2 -2
- package/src/routes/issue-associations.ts +4 -4
- package/src/routes/issue-refs.ts +9 -9
- package/src/routes/kernel-timers-operator.ts +1 -1
- package/src/routes/memory.ts +1 -1
- package/src/routes/merges.ts +11 -11
- package/src/routes/messages.ts +23 -17
- package/src/routes/orchestrator-bootstrap.ts +2 -2
- package/src/routes/orchestrator-host-registration.ts +4 -2
- package/src/routes/orchestrator-host-utilization.ts +5 -3
- package/src/routes/orchestrator-proxy.ts +4 -4
- package/src/routes/orchestrator.ts +28 -19
- package/src/routes/pairs.ts +8 -8
- package/src/routes/project-profile-instructions.ts +27 -0
- package/src/routes/project-trust.ts +3 -3
- package/src/routes/projects.ts +16 -16
- package/src/routes/prompt-templates.ts +12 -12
- package/src/routes/provider-config.ts +6 -6
- package/src/routes/provider-quota-config.ts +2 -2
- package/src/routes/provider-quotas.ts +10 -10
- package/src/routes/run-command.ts +1 -1
- package/src/routes/secrets-backup.ts +2 -2
- package/src/routes/secrets-import.ts +1 -1
- package/src/routes/secrets-vault.ts +7 -7
- package/src/routes/settings.ts +6 -6
- package/src/routes/shipping.ts +9 -1
- package/src/routes/spawn-policy.ts +8 -7
- package/src/routes/sse.ts +2 -2
- package/src/routes/stats.ts +6 -6
- package/src/routes/task-http.ts +15 -1
- package/src/routes/task-issues.ts +11 -26
- package/src/routes/tasks.ts +22 -53
- package/src/routes/team-templates.ts +12 -12
- package/src/routes/teams-config.ts +2 -2
- package/src/routes/teams.ts +10 -10
- package/src/routes/tokens.ts +30 -22
- package/src/routes/users.ts +24 -24
- package/src/routes/viewer-read.ts +3 -3
- package/src/routes/web-tool-calls.ts +4 -4
- package/src/routes/workflows.ts +22 -7
- package/src/routes/workspaces.ts +17 -16
- package/src/routing-policy-normalize.ts +1 -2
- package/src/routing-policy-push.ts +6 -6
- package/src/routing-step-defaults.ts +0 -2
- package/src/runner-token-mint-limit.ts +63 -0
- package/src/runtime-grant.ts +21 -13
- package/src/runtime-tokens.ts +59 -35
- package/src/secrets-broker/config.ts +1 -1
- package/src/secrets-broker/service.ts +2 -2
- package/src/security.ts +16 -21
- package/src/self-resume-carry.ts +21 -110
- package/src/self-resume-supersede.ts +4 -3
- package/src/self-resume.ts +54 -66
- package/src/server-background.ts +2 -2
- package/src/server.ts +26 -24
- package/src/services/agent-action.ts +12 -31
- package/src/services/agent-effort.ts +7 -32
- package/src/services/agent-hang-watchdog-job.ts +2 -2
- package/src/services/agent-heartbeat.ts +166 -0
- package/src/services/agent-reporting.ts +1 -1
- package/src/services/browser-inventory.ts +3 -3
- package/src/services/browser-session-state.ts +3 -2
- package/src/services/browser-session.ts +21 -27
- package/src/services/bus-command-update.ts +9 -9
- package/src/services/checkout-refresh-state.ts +1 -0
- package/src/services/checkout-refresh.test-fixture.ts +3 -2
- package/src/services/command-host.ts +7 -2
- package/src/services/coordinator-digest.ts +3 -2
- package/src/services/dispatch-command.ts +12 -13
- package/src/services/effective-launch-driver.ts +14 -9
- package/src/services/host-changed-paths.test-fixture.ts +5 -6
- package/src/services/host-project-readiness.ts +2 -2
- package/src/services/host-providers.ts +1 -1
- package/src/services/host-utilization.ts +27 -4
- package/src/services/idle-agent-digest.ts +17 -12
- package/src/services/idle-epics.ts +9 -10
- package/src/services/interrupt-agent.ts +12 -9
- package/src/services/issue-activity.ts +3 -3
- package/src/services/issue-associations.ts +15 -18
- package/src/services/issue-lifecycle-comments.ts +3 -2
- package/src/services/issue-lifecycle.ts +69 -72
- package/src/services/issue-refs.ts +10 -15
- package/src/services/kernel-timers-cutover-chaos-worker.ts +11 -8
- package/src/services/kernel-timers-ingress-chaos-worker.ts +6 -1
- package/src/services/kernel-timers-ingress.ts +4 -4
- package/src/services/kernel-timers-message-authority-chaos-worker.ts +3 -10
- package/src/services/kernel-timers-operator-chaos-worker.ts +3 -2
- package/src/services/kernel-timers-outbox.ts +1 -1
- package/src/services/kernel-timers-stage10-operator.ts +1 -1
- package/src/services/kernel-timers.ts +4 -3
- package/src/services/land-gate-placement.ts +11 -2
- package/src/services/land-issue-relations.ts +5 -4
- package/src/services/land-restart-retry.ts +7 -6
- package/src/services/landed-ancestry.ts +25 -8
- package/src/services/legacy-landing-host.ts +4 -1
- package/src/services/legacy-landing-recovery.ts +8 -6
- package/src/services/managed-running.ts +17 -17
- package/src/services/memory-areas.ts +17 -53
- package/src/services/merge-pause.ts +9 -15
- package/src/services/operator-decisions.ts +37 -41
- package/src/services/orchestrator-registration-recovery.ts +6 -2
- package/src/services/orchestrator-upgrade.ts +14 -12
- package/src/services/permission-decision.ts +4 -3
- package/src/services/plan-ci-notice.ts +57 -0
- package/src/services/plan-ci-recovery.ts +2 -55
- package/src/services/plan-conformance.ts +4 -4
- package/src/services/plan-dispatch-policy.ts +10 -3
- package/src/services/plan-dispatch.ts +35 -14
- package/src/services/plan-graph.ts +39 -261
- package/src/services/plan-import.ts +1 -1
- package/src/services/plan-live-bindings.ts +8 -37
- package/src/services/plan-task-create.ts +1 -1
- package/src/services/plan-terminal-refs.ts +2 -12
- package/src/services/plan-wake-digest.ts +9 -3
- package/src/services/profile-trust.ts +6 -5
- package/src/services/project-config-read.ts +70 -0
- package/src/services/project-profile-instructions.ts +54 -0
- package/src/services/project.ts +11 -10
- package/src/services/prompt-templates.ts +6 -5
- package/src/services/provider-hold-nudge.ts +9 -9
- package/src/services/provider-hold-record.ts +13 -12
- package/src/services/provider-state-audit.ts +19 -18
- package/src/services/provisioning-harness/budget-baseline.json +4 -4
- package/src/services/provisioning-harness/driver.ts +1 -1
- package/src/services/provisioning-harness/fixture-matrix.ts +3 -3
- package/src/services/provisioning-harness/lifecycle.ts +24 -22
- package/src/services/provisioning-harness/prepare.ts +16 -17
- package/src/services/rate-limit-resume.ts +10 -9
- package/src/services/red-main-auto-revert.ts +7 -5
- package/src/services/red-main-controller-deps.ts +20 -3
- package/src/services/red-main-incident.ts +3 -1
- package/src/services/red-main-quarantine.ts +2 -3
- package/src/services/register-agent.ts +22 -22
- package/src/services/restart-project-role.ts +1 -1
- package/src/services/restart-spawn.ts +74 -61
- package/src/services/review-publish.ts +7 -24
- package/src/services/review-ref-reconcile.ts +29 -38
- package/src/services/runtime-dependency-alert.ts +27 -0
- package/src/services/scheduler-command.ts +11 -9
- package/src/services/scheduler.ts +5 -5
- package/src/services/self-care-state.ts +2 -1
- package/src/services/self-effort-grant.ts +5 -25
- package/src/services/self-effort.ts +5 -5
- package/src/services/send-message.ts +21 -34
- package/src/services/shutdown-agent.ts +17 -14
- package/src/services/spawn-agent.ts +25 -43
- package/src/services/spawn-chain-inspector.ts +7 -14
- package/src/services/spawn-cwd-placement.ts +21 -5
- package/src/services/spawn-issue-activity.ts +8 -6
- package/src/services/spawn-launch.ts +17 -1
- package/src/services/spawn-loss-escalation.ts +1 -1
- package/src/services/spawn-policy.ts +68 -0
- package/src/services/spawn-registration-watchdog.ts +2 -2
- package/src/services/spawn-repo-probe.ts +7 -5
- package/src/services/spawn-tree-cleanup.ts +8 -9
- package/src/services/steward-reaper.ts +4 -4
- package/src/services/task-context-hydration.ts +25 -1
- package/src/services/task-delivery.ts +20 -34
- package/src/services/task-dispatch.ts +3 -0
- package/src/services/task-entity.ts +40 -203
- package/src/services/task-issue-link.ts +13 -20
- package/src/services/task-issue-weave.ts +12 -11
- package/src/services/task-lifecycle.ts +27 -31
- package/src/services/task-repo-cwd.ts +37 -0
- package/src/services/task-review-hold.ts +4 -17
- package/src/services/task-semantic-events.ts +13 -11
- package/src/services/task-state-reconcile.ts +8 -17
- package/src/services/task-validation.ts +2 -2
- package/src/services/team-templates.ts +12 -11
- package/src/services/team.ts +31 -98
- package/src/services/terminal-provider-exit.ts +6 -5
- package/src/services/timer-message-fire-chaos-worker.ts +7 -3
- package/src/services/timer-message-fire-outbox.ts +1 -1
- package/src/services/transient-agent-reaper.ts +25 -20
- package/src/services/turn-reconcile-audit.ts +9 -9
- package/src/services/user-onboarding.ts +8 -6
- package/src/services/user-profile.ts +6 -9
- package/src/services/work-finality.ts +16 -4
- package/src/services/workflow-auto-start.ts +26 -13
- package/src/services/workflow-caller.ts +61 -4
- package/src/services/workflow-child-proof-worker.ts +1 -1
- package/src/services/workflow-ci-main.ts +1 -1
- package/src/services/workflow-control-proof-worker.ts +1 -1
- package/src/services/workflow-coordinator.ts +8 -2
- package/src/services/workflow-decisions.ts +5 -5
- package/src/services/workflow-deferred-cleanup.ts +5 -3
- package/src/services/workflow-effect-driver.ts +42 -17
- package/src/services/workflow-effects.ts +58 -37
- package/src/services/workflow-land-notice.ts +10 -0
- package/src/services/workflow-pause-text.ts +43 -0
- package/src/services/workflow-pins.ts +7 -4
- package/src/services/workflow-reconcile.ts +14 -11
- package/src/services/workflow-resume-pins.ts +3 -3
- package/src/services/workflow-routing-defaults.ts +18 -0
- package/src/services/workflow-run-view.ts +6 -3
- package/src/services/workflow-run.test-fixture.ts +1 -1
- package/src/services/workflow-runs.ts +61 -33
- package/src/services/workflow-supervisor-state.ts +26 -1
- package/src/services/workflow-supervisor.ts +11 -6
- package/src/services/workspace-recovery.ts +4 -3
- package/src/settings/registry.ts +1 -2
- package/src/spawn-admission.ts +10 -2
- package/src/spawn-command.ts +4 -4
- package/src/spawn-models.ts +10 -12
- package/src/spawn-placement.ts +28 -10
- package/src/spawn-targets.ts +9 -9
- package/src/sse-agent-status.ts +15 -6
- package/src/sse.ts +49 -24
- package/src/startup-context-injection.ts +62 -57
- package/src/state-adoption/cd-cutover.ts +53 -7
- package/src/state-adoption/fleet-cutover.ts +35 -0
- package/src/state-adoption/fleet-plan.ts +36 -0
- package/src/state-adoption/index.ts +2 -2
- package/src/state-adoption/linux-plan.ts +2 -2
- package/src/state-adoption/linux.ts +2 -2
- package/src/state-adoption/macos-plan.ts +2 -2
- package/src/state-adoption/macos.ts +1 -1
- package/src/steward-handoff.ts +4 -3
- package/src/steward-policy-cleanup.ts +9 -8
- package/src/steward.ts +9 -8
- package/src/task-dispatch-live.ts +6 -3
- package/src/task-dispatcher.ts +3 -3
- package/src/teams-config-store.ts +4 -3
- package/src/token-db-write.ts +10 -0
- package/src/token-db.ts +2 -2
- package/src/token-usage-async.ts +2 -4
- package/src/user-awaiting-reply.ts +5 -5
- package/src/workspace-actions.ts +24 -29
- package/src/workspace-auto-merge.ts +14 -12
- package/src/workspace-changed-paths-client.ts +16 -5
- package/src/workspace-cleanup-stale.ts +30 -7
- package/src/workspace-command-settle.ts +26 -17
- package/src/workspace-config.ts +1 -1
- package/src/workspace-conflict-resolver.ts +9 -7
- package/src/workspace-dead-owner-recovery.ts +5 -4
- package/src/workspace-escalation.ts +12 -11
- package/src/workspace-human-escalation.ts +3 -3
- package/src/workspace-land-gate-watchdog.ts +3 -3
- package/src/workspace-land-refusal.ts +20 -0
- package/src/workspace-land-stopped.ts +1 -0
- package/src/workspace-merge.ts +10 -26
- package/src/workspace-nothing-to-land-notice.ts +2 -2
- package/src/workspace-orphans.ts +18 -37
- package/src/workspace-pr-completion.ts +10 -8
- package/src/workspace-rekey.ts +3 -3
- package/src/workspace-steward-failure.ts +2 -2
- package/src/workspace-steward-wake.ts +4 -4
- package/node_modules/@humwick/kernel/LICENSE +0 -167
- package/node_modules/@humwick/kernel/async-entity-persistence.ts +0 -344
- package/node_modules/@humwick/kernel/async-event-log.ts +0 -107
- package/node_modules/@humwick/kernel/automations.pilot.ts +0 -147
- package/node_modules/@humwick/kernel/config.ts +0 -111
- package/node_modules/@humwick/kernel/contract.ts +0 -572
- package/node_modules/@humwick/kernel/control-authz.ts +0 -281
- package/node_modules/@humwick/kernel/control.ts +0 -645
- package/node_modules/@humwick/kernel/effects.ts +0 -493
- package/node_modules/@humwick/kernel/event-log.ts +0 -319
- package/node_modules/@humwick/kernel/http-transport.ts +0 -384
- package/node_modules/@humwick/kernel/identity-grammar.ts +0 -20
- package/node_modules/@humwick/kernel/identity.ts +0 -248
- package/node_modules/@humwick/kernel/index.ts +0 -28
- package/node_modules/@humwick/kernel/kernel-persistence.ts +0 -181
- package/node_modules/@humwick/kernel/landing-incident.ts +0 -306
- package/node_modules/@humwick/kernel/landing.ts +0 -953
- package/node_modules/@humwick/kernel/manifest-validation.ts +0 -460
- package/node_modules/@humwick/kernel/mcp-transport.ts +0 -109
- package/node_modules/@humwick/kernel/message-authority-chaos-worker.ts +0 -200
- package/node_modules/@humwick/kernel/message-authority.ts +0 -281
- package/node_modules/@humwick/kernel/module-host.ts +0 -722
- package/node_modules/@humwick/kernel/openapi-init.ts +0 -14
- package/node_modules/@humwick/kernel/package.json +0 -39
- package/node_modules/@humwick/kernel/persistence-schema.ts +0 -248
- package/node_modules/@humwick/kernel/persistence.ts +0 -510
- package/node_modules/@humwick/kernel/registry.ts +0 -60
- package/node_modules/@humwick/kernel/sqlite-kernel-persistence.ts +0 -499
- package/node_modules/@humwick/kernel/sqlite-module-host.ts +0 -87
- package/node_modules/@humwick/kernel/timers-chaos-worker.ts +0 -186
- package/node_modules/@humwick/kernel/timers.pilot.ts +0 -1411
- package/node_modules/@humwick/kernel/workflow-activation.ts +0 -25
- package/node_modules/@humwick/kernel/workflow-backstop.ts +0 -40
- package/node_modules/@humwick/kernel/workflow-cancel-tree.ts +0 -20
- package/node_modules/@humwick/kernel/workflow-chaos-worker.ts +0 -213
- package/node_modules/@humwick/kernel/workflow-composition.ts +0 -231
- package/node_modules/@humwick/kernel/workflow-container.ts +0 -72
- package/node_modules/@humwick/kernel/workflow-control.test-fixture.ts +0 -42
- package/node_modules/@humwick/kernel/workflow-control.ts +0 -178
- package/node_modules/@humwick/kernel/workflow-definition.ts +0 -507
- package/node_modules/@humwick/kernel/workflow-dispatch.ts +0 -60
- package/node_modules/@humwick/kernel/workflow-foreach.ts +0 -167
- package/node_modules/@humwick/kernel/workflow-journal-codec.ts +0 -339
- package/node_modules/@humwick/kernel/workflow-journal.ts +0 -922
- package/node_modules/@humwick/kernel/workflow-lane.ts +0 -48
- package/node_modules/@humwick/kernel/workflow-lease-owner.ts +0 -60
- package/node_modules/@humwick/kernel/workflow-recovery.test-fixture.ts +0 -19
- package/node_modules/@humwick/kernel/workflow-runtime.ts +0 -938
- package/node_modules/@humwick/kernel/workflow-script.ts +0 -11
- package/node_modules/@humwick/kernel/workflow-state.ts +0 -299
- package/node_modules/@humwick/kernel/workflow-step-commit.ts +0 -195
- package/node_modules/@humwick/kernel/workflow-transitions.ts +0 -317
- package/node_modules/@humwick/kernel/workflow-values.ts +0 -153
- package/node_modules/@humwick/kernel/workflow.pilot.ts +0 -376
- package/node_modules/@humwick/offload/LICENSE +0 -167
- package/node_modules/@humwick/offload/README.md +0 -57
- package/node_modules/@humwick/offload/dist/async-runner.d.ts +0 -18
- package/node_modules/@humwick/offload/dist/async-runner.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/async-runner.js +0 -158
- package/node_modules/@humwick/offload/dist/async-runner.js.map +0 -1
- package/node_modules/@humwick/offload/dist/envelope.d.ts +0 -25
- package/node_modules/@humwick/offload/dist/envelope.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/envelope.js +0 -80
- package/node_modules/@humwick/offload/dist/envelope.js.map +0 -1
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts +0 -10
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.js +0 -59
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.js.map +0 -1
- package/node_modules/@humwick/offload/dist/index.d.ts +0 -5
- package/node_modules/@humwick/offload/dist/index.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/index.js +0 -5
- package/node_modules/@humwick/offload/dist/index.js.map +0 -1
- package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts +0 -62
- package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/subprocess-runner.js +0 -295
- package/node_modules/@humwick/offload/dist/subprocess-runner.js.map +0 -1
- package/node_modules/@humwick/offload/dist/types.d.ts +0 -111
- package/node_modules/@humwick/offload/dist/types.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/types.js +0 -176
- package/node_modules/@humwick/offload/dist/types.js.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-pool.d.ts +0 -23
- package/node_modules/@humwick/offload/dist/worker-pool.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-pool.js +0 -435
- package/node_modules/@humwick/offload/dist/worker-pool.js.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-runtime.d.ts +0 -2
- package/node_modules/@humwick/offload/dist/worker-runtime.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-runtime.js +0 -27
- package/node_modules/@humwick/offload/dist/worker-runtime.js.map +0 -1
- package/node_modules/@humwick/offload/dist/worker.d.ts +0 -5
- package/node_modules/@humwick/offload/dist/worker.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/worker.js +0 -1
- package/node_modules/@humwick/offload/dist/worker.js.map +0 -1
- package/node_modules/@humwick/offload/package.json +0 -42
- package/node_modules/@humwick/offload/src/async-runner.ts +0 -170
- package/node_modules/@humwick/offload/src/envelope.ts +0 -92
- package/node_modules/@humwick/offload/src/fixtures/worker-task.ts +0 -49
- package/node_modules/@humwick/offload/src/index.ts +0 -4
- package/node_modules/@humwick/offload/src/subprocess-runner.ts +0 -334
- package/node_modules/@humwick/offload/src/types.ts +0 -235
- package/node_modules/@humwick/offload/src/worker-pool.ts +0 -463
- package/node_modules/@humwick/offload/src/worker-runtime.ts +0 -32
- package/node_modules/@humwick/offload/src/worker.ts +0 -5
- package/public/assets/agent-liveness-DyqxfB-t.js +0 -2
- package/public/assets/agent-profiles-BpI_jTxq.js +0 -2
- package/public/assets/index-B7ZerHLY.css +0 -2
- package/public/assets/index-BU3uWo2t.js +0 -15
- package/public/assets/projects-B_lmcqfO.js +0 -2
- package/public/assets/provider-display-DbLWpP3j.js +0 -2
- package/public/assets/run-card-CO_bguQf.js +0 -2
- package/public/assets/shipping-Bu8p1gEw.js +0 -2
- package/public/assets/store-BvtFdlGX.js +0 -9
- package/public/assets/use-project-list-B-T2Bnnn.js +0 -2
- package/public/assets/versioned-prompt-editor-Diu8BIaM.js +0 -8
- package/runner/src/agent-runner/http-liveness.ts +0 -85
- package/runner/src/gate-run-lease-probe.ts +0 -38
- package/src/db/claude-catalog-reconcile.ts +0 -27
- package/src/db/on-loop-write-transaction.ts +0 -34
- package/src/routing-model-aliases.ts +0 -21
package/src/routes/stats.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { listPauses, pauseJob, resumeJobAsync } from "../maintenance/pauses";
|
|
|
7
7
|
import { defaultIssueRepo } from "../config";
|
|
8
8
|
import { listSpawnPolicies } from "../config-store";
|
|
9
9
|
import { disabledBackingPolicyNames } from "../channel-policy-health";
|
|
10
|
-
import { cancelMaintenanceRun,
|
|
10
|
+
import { cancelMaintenanceRun, listMaintenanceJobsAsync, listRecentMaintenanceRuns, listRunningMaintenanceRuns, runLegacyMaintenanceReaper, runMaintenanceJobNow } from "../maintenance";
|
|
11
11
|
import { claudeAppOAuthHealth } from "../claude-app/oauth-http";
|
|
12
12
|
import { getConnector } from "../connectors";
|
|
13
13
|
import { channelsHostEnsureHealthCheck } from "../connector-boot-health";
|
|
@@ -66,7 +66,7 @@ export const getHealthRoute: Handler = async () => {
|
|
|
66
66
|
// #3606 — rolling 60 s load breakdown: callers by rate and CPU, emits, reader-pool ops.
|
|
67
67
|
export const getHubMetricsRoute: Handler = () => json(hubMetricsReport());
|
|
68
68
|
|
|
69
|
-
export const getMaintenanceJobs: Handler = () => json(
|
|
69
|
+
export const getMaintenanceJobs: Handler = async () => json(await listMaintenanceJobsAsync());
|
|
70
70
|
|
|
71
71
|
// #1728 stage 0 — a POST-HOC diagnostic surface, not a live incident one: it reads the in-memory
|
|
72
72
|
// run registry the scheduler maintains (see src/maintenance/scheduler.ts). That registry can only
|
|
@@ -87,7 +87,7 @@ export const postMaintenanceJobRun: Handler = async (req, params) => {
|
|
|
87
87
|
const parsed = await parseBody<{ overridePause?: unknown }>(req);
|
|
88
88
|
const overridePause = parsed.ok && parsed.body?.overridePause === true;
|
|
89
89
|
const run = await runMaintenanceJobNow(params.id!, { overridePause });
|
|
90
|
-
return json({ run, jobs:
|
|
90
|
+
return json({ run, jobs: await listMaintenanceJobsAsync() }, run.status === "failed" ? 500 : 202);
|
|
91
91
|
} catch (e) {
|
|
92
92
|
if (e instanceof Error && e.message.includes("not found")) return error(e.message, 404);
|
|
93
93
|
throw e;
|
|
@@ -110,7 +110,7 @@ export const postMaintenanceJobCancel: Handler = async (req, params) => {
|
|
|
110
110
|
if (cancelledRunIds.length === 0) {
|
|
111
111
|
return json({ ok: false, error: "maintenance job is not running", cancelledRunIds: [] }, 404);
|
|
112
112
|
}
|
|
113
|
-
return json({ ok: true, cancelledRunIds, requester, jobs:
|
|
113
|
+
return json({ ok: true, cancelledRunIds, requester, jobs: await listMaintenanceJobsAsync() });
|
|
114
114
|
};
|
|
115
115
|
|
|
116
116
|
export const getMaintenancePauses: Handler = () => {
|
|
@@ -136,7 +136,7 @@ export const postMaintenanceJobPause: Handler = async (req, params) => {
|
|
|
136
136
|
if (!result.ok) {
|
|
137
137
|
return json({ ok: false, error: "maintenance job already paused", pause: result.pause }, 409);
|
|
138
138
|
}
|
|
139
|
-
return json({ ok: true, pause: result.pause, jobs:
|
|
139
|
+
return json({ ok: true, pause: result.pause, jobs: await listMaintenanceJobsAsync() });
|
|
140
140
|
} catch (e) {
|
|
141
141
|
if (e instanceof ValidationError) return error(e.message, 400);
|
|
142
142
|
throw e;
|
|
@@ -147,7 +147,7 @@ export const postMaintenanceJobResume: Handler = async (_req, params) => {
|
|
|
147
147
|
try {
|
|
148
148
|
const result = await resumeJobAsync({ jobId: params.id! });
|
|
149
149
|
if (!result.resumed) return error("maintenance job is not paused", 404);
|
|
150
|
-
return json({ ok: true, ...result, jobs:
|
|
150
|
+
return json({ ok: true, ...result, jobs: await listMaintenanceJobsAsync() });
|
|
151
151
|
} catch (e) {
|
|
152
152
|
if (e instanceof ValidationError) return error(e.message, 400);
|
|
153
153
|
throw e;
|
package/src/routes/task-http.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isRecord } from "@humwick/sdk";
|
|
2
|
+
import { resolveActingUser, requestUserAddress, resolveActorLabel, error, parseBody, parseId } from "./_shared";
|
|
2
3
|
import { ValidationError } from "../db/connection";
|
|
3
4
|
import { authContextFromRequest } from "../services/auth-context";
|
|
4
5
|
import { isRequestAuthorizedFor } from "../security";
|
|
@@ -25,3 +26,16 @@ export function taskEntityError(e: unknown): Response {
|
|
|
25
26
|
}
|
|
26
27
|
throw e;
|
|
27
28
|
}
|
|
29
|
+
|
|
30
|
+
export async function parseTaskMutation(req: Request, rawId: string | undefined): Promise<
|
|
31
|
+
{ ok: true; id: number; body: Record<string, unknown> } | { ok: false; response: Response }
|
|
32
|
+
> {
|
|
33
|
+
const id = parseId(rawId);
|
|
34
|
+
if (id === null) return { ok: false, response: error("invalid task id") };
|
|
35
|
+
const forbidden = await requireTaskMutationAuth(req, id);
|
|
36
|
+
if (forbidden) return { ok: false, response: forbidden };
|
|
37
|
+
const parsed = await parseBody<Record<string, unknown>>(req);
|
|
38
|
+
if (!parsed.ok) return { ok: false, response: error(parsed.error, parsed.status) };
|
|
39
|
+
if (!isRecord(parsed.body)) return { ok: false, response: error("JSON object body required") };
|
|
40
|
+
return { ok: true, id, body: parsed.body };
|
|
41
|
+
}
|
|
@@ -6,18 +6,13 @@ import { cleanIssueRefRelation } from "../db/task-issue-relation";
|
|
|
6
6
|
import { issueRefsFromArgs } from "../services/issue-refs";
|
|
7
7
|
import { cleanString } from "../validation";
|
|
8
8
|
import { isRecord } from "@humwick/sdk";
|
|
9
|
-
import { error, json,
|
|
10
|
-
import { taskHttpActor as actorOf,
|
|
9
|
+
import { error, json, type Handler } from "./_shared";
|
|
10
|
+
import { taskHttpActor as actorOf, parseTaskMutation, taskEntityError as entityError } from "./task-http";
|
|
11
11
|
|
|
12
12
|
export const postTaskRef: Handler = async (req, params) => {
|
|
13
|
-
const
|
|
14
|
-
if (
|
|
15
|
-
const
|
|
16
|
-
if (forbidden) return forbidden;
|
|
17
|
-
const parsed = await parseBody<Record<string, unknown>>(req);
|
|
18
|
-
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
19
|
-
const body = parsed.body;
|
|
20
|
-
if (!isRecord(body)) return error("JSON object body required");
|
|
13
|
+
const parsed = await parseTaskMutation(req, params.id);
|
|
14
|
+
if (!parsed.ok) return parsed.response;
|
|
15
|
+
const { id, body } = parsed;
|
|
21
16
|
try {
|
|
22
17
|
// Same alias tolerance + attach-nothing rejection as relay_task_add_ref (#2214), one body.
|
|
23
18
|
return json(await attachTaskRefs(id, {
|
|
@@ -33,14 +28,9 @@ export const postTaskRef: Handler = async (req, params) => {
|
|
|
33
28
|
}
|
|
34
29
|
};
|
|
35
30
|
export const deleteTaskRef: Handler = async (req, params) => {
|
|
36
|
-
const
|
|
37
|
-
if (
|
|
38
|
-
const
|
|
39
|
-
if (forbidden) return forbidden;
|
|
40
|
-
const parsed = await parseBody<Record<string, unknown>>(req);
|
|
41
|
-
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
42
|
-
const body = parsed.body;
|
|
43
|
-
if (!isRecord(body)) return error("JSON object body required");
|
|
31
|
+
const parsed = await parseTaskMutation(req, params.id);
|
|
32
|
+
if (!parsed.ok) return parsed.response;
|
|
33
|
+
const { id, body } = parsed;
|
|
44
34
|
try {
|
|
45
35
|
const detail = await removeTaskEntityRefAsync(id, {
|
|
46
36
|
issueRefId: cleanString(body.issueRefId, "issueRefId", { max: 120 }),
|
|
@@ -57,14 +47,9 @@ export const deleteTaskRef: Handler = async (req, params) => {
|
|
|
57
47
|
// #833 — comment-on-Task writes THROUGH to the linked GitHub issue (discussion lives in
|
|
58
48
|
// GitHub, never a relay table). Execution telemetry never reaches this path.
|
|
59
49
|
export const postTaskComment: Handler = async (req, params) => {
|
|
60
|
-
const
|
|
61
|
-
if (
|
|
62
|
-
const
|
|
63
|
-
if (forbidden) return forbidden;
|
|
64
|
-
const parsed = await parseBody<Record<string, unknown>>(req);
|
|
65
|
-
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
66
|
-
const body = parsed.body;
|
|
67
|
-
if (!isRecord(body)) return error("JSON object body required");
|
|
50
|
+
const parsed = await parseTaskMutation(req, params.id);
|
|
51
|
+
if (!parsed.ok) return parsed.response;
|
|
52
|
+
const { id, body } = parsed;
|
|
68
53
|
try {
|
|
69
54
|
const result = await commentOnTaskThrough({
|
|
70
55
|
taskId: id,
|
package/src/routes/tasks.ts
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
export { postTaskRef, deleteTaskRef, postTaskComment } from "./task-issues";
|
|
3
3
|
import { createPlanTaskAsync, isPlanTaskCreate } from "../services/plan-task-create";
|
|
4
4
|
import { prepareIssueTaskCreate, refreshTaskIssueUpdateAsync } from "../services/task-from-issue";
|
|
5
|
-
import { taskHttpActor as actorOf, requireTaskMutationAuth, taskEntityError as entityError } from "./task-http";
|
|
5
|
+
import { taskHttpActor as actorOf, requireTaskMutationAuth, parseTaskMutation, taskEntityError as entityError } from "./task-http";
|
|
6
6
|
import { MAX_BODY_BYTES } from "../config";
|
|
7
|
-
import { VALID_TASK_STATUSES, agentSessionStatus, auditEvent, dispatchTaskCallbacksInBackground,
|
|
7
|
+
import { VALID_TASK_STATUSES, agentSessionStatus, auditEvent, dispatchTaskCallbacksInBackground, error, json, normalizeAgentSessionGuard, parseBody, parseId, type Handler } from "./_shared";
|
|
8
8
|
import { isRequestAuthorizedFor } from "../security";
|
|
9
9
|
import { authContextFromRequest } from "../services/auth-context";
|
|
10
10
|
import { hasTaskReadAdminScope } from "../task-authz";
|
|
@@ -25,7 +25,7 @@ import { cleanIssueRefRelation } from "../db/task-issue-relation";
|
|
|
25
25
|
import { issueRefsFromArgs } from "../services/issue-refs";
|
|
26
26
|
import { cleanEpoch, cleanMeta, cleanString, dependencyRefField, optionalEnum, taskIdField } from "../validation";
|
|
27
27
|
import { emitMessageClaimed, emitTaskChanged } from "../sse";
|
|
28
|
-
import {
|
|
28
|
+
import { isRecord, TASK_TERMINAL_STAGES, TASK_DELIVERABLE_STAGES, TASK_DISPATCH_COMPLEXITIES, type TaskBlocker, type TaskDispatch, type TaskGateStatus, type TaskPriority } from "@humwick/sdk";
|
|
29
29
|
import { type AgentSessionGuard, type TaskStatus, type TaskStatusInput } from "../types";
|
|
30
30
|
|
|
31
31
|
async function taskDetailOr404(id: number) {
|
|
@@ -100,6 +100,7 @@ export const postTaskCreate: Handler = async (req) => {
|
|
|
100
100
|
complexity: optionalEnum(body.complexity, "complexity", TASK_DISPATCH_COMPLEXITIES),
|
|
101
101
|
context: cleanString(body.context, "context", { max: MAX_BODY_BYTES }),
|
|
102
102
|
terminalStage: optionalEnum(body.terminalStage, "terminalStage", TASK_TERMINAL_STAGES),
|
|
103
|
+
onDeploy: cleanString(body.onDeploy, "onDeploy", { max: 500 }),
|
|
103
104
|
doneWhen: cleanString(body.doneWhen, "doneWhen", { max: MAX_BODY_BYTES }),
|
|
104
105
|
teamId: cleanString(body.teamId, "teamId", { max: 200 }),
|
|
105
106
|
projectId: cleanString(body.projectId, "projectId", { max: 120 }),
|
|
@@ -109,6 +110,7 @@ export const postTaskCreate: Handler = async (req) => {
|
|
|
109
110
|
// Raw passthrough (same convention as `dispatch` above) — validated inside
|
|
110
111
|
// createDeliverableTask (cleanTags / cleanTaskPriority), not at the route layer.
|
|
111
112
|
tags: body.tags as string[] | undefined,
|
|
113
|
+
paths: body.paths as string[] | undefined,
|
|
112
114
|
priority: body.priority as TaskPriority | undefined,
|
|
113
115
|
// Same alias-tolerant normalization the MCP surface uses (#2214) — one home, both transports.
|
|
114
116
|
issueRefs: issueRefsFromArgs(body),
|
|
@@ -148,21 +150,10 @@ export const postTaskCreate: Handler = async (req) => {
|
|
|
148
150
|
}
|
|
149
151
|
};
|
|
150
152
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
153
|
export const patchTaskEntity: Handler = async (req, params) => {
|
|
158
|
-
const
|
|
159
|
-
if (
|
|
160
|
-
const
|
|
161
|
-
if (forbidden) return forbidden;
|
|
162
|
-
const parsed = await parseBody<Record<string, unknown>>(req);
|
|
163
|
-
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
164
|
-
const body = parsed.body;
|
|
165
|
-
if (!isRecord(body)) return error("JSON object body required");
|
|
154
|
+
const parsed = await parseTaskMutation(req, params.id);
|
|
155
|
+
if (!parsed.ok) return parsed.response;
|
|
156
|
+
const { id, body } = parsed;
|
|
166
157
|
try {
|
|
167
158
|
if (body.refreshIssue !== undefined) return json(await refreshTaskIssueUpdateAsync(id, body, actorOf(req)));
|
|
168
159
|
const detail = await updateTaskEntityAsync(id, {
|
|
@@ -171,6 +162,7 @@ export const patchTaskEntity: Handler = async (req, params) => {
|
|
|
171
162
|
...(body.complexity !== undefined ? { complexity: optionalEnum(body.complexity, "complexity", TASK_DISPATCH_COMPLEXITIES) } : {}),
|
|
172
163
|
...(body.context !== undefined ? { context: cleanString(body.context, "context", { max: MAX_BODY_BYTES }) ?? "" } : {}),
|
|
173
164
|
...(body.latestSteer !== undefined ? { latestSteer: cleanString(body.latestSteer, "latestSteer", { max: MAX_BODY_BYTES }) ?? "" } : {}),
|
|
165
|
+
...(body.onDeploy !== undefined ? { onDeploy: cleanString(body.onDeploy, "onDeploy", { max: 500 }) ?? "" } : {}),
|
|
174
166
|
...(body.doneWhen !== undefined ? { doneWhen: cleanString(body.doneWhen, "doneWhen", { max: MAX_BODY_BYTES }) ?? "" } : {}),
|
|
175
167
|
...(body.dispatch !== undefined ? { dispatch: body.dispatch as TaskDispatch } : {}),
|
|
176
168
|
...(body.teamId !== undefined ? { teamId: cleanString(body.teamId, "teamId", { max: 200 }) ?? "" } : {}),
|
|
@@ -180,6 +172,7 @@ export const patchTaskEntity: Handler = async (req, params) => {
|
|
|
180
172
|
// survive into updateDeliverableTask, which cleanString's `?? ""` collapse would erase.
|
|
181
173
|
...(body.terminalStage !== undefined ? { terminalStage: body.terminalStage === null ? null : optionalEnum(body.terminalStage, "terminalStage", TASK_TERMINAL_STAGES) } : {}),
|
|
182
174
|
...(body.tags !== undefined ? { tags: body.tags as string[] | null } : {}),
|
|
175
|
+
...(body.paths !== undefined ? { paths: body.paths as string[] | null } : {}),
|
|
183
176
|
...(body.priority !== undefined ? { priority: body.priority as TaskPriority | null } : {}),
|
|
184
177
|
actor: actorOf(req),
|
|
185
178
|
});
|
|
@@ -190,14 +183,9 @@ export const patchTaskEntity: Handler = async (req, params) => {
|
|
|
190
183
|
};
|
|
191
184
|
|
|
192
185
|
export const postTaskEntityStatus: Handler = async (req, params) => {
|
|
193
|
-
const
|
|
194
|
-
if (
|
|
195
|
-
const
|
|
196
|
-
if (forbidden) return forbidden;
|
|
197
|
-
const parsed = await parseBody<Record<string, unknown>>(req);
|
|
198
|
-
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
199
|
-
const body = parsed.body;
|
|
200
|
-
if (!isRecord(body)) return error("JSON object body required");
|
|
186
|
+
const parsed = await parseTaskMutation(req, params.id);
|
|
187
|
+
if (!parsed.ok) return parsed.response;
|
|
188
|
+
const { id, body } = parsed;
|
|
201
189
|
try {
|
|
202
190
|
const detail = await setTaskStatusControl(id, {
|
|
203
191
|
status: body.status as TaskStatus,
|
|
@@ -213,14 +201,9 @@ export const postTaskEntityStatus: Handler = async (req, params) => {
|
|
|
213
201
|
};
|
|
214
202
|
|
|
215
203
|
export const postTaskEntityStage: Handler = async (req, params) => {
|
|
216
|
-
const
|
|
217
|
-
if (
|
|
218
|
-
const
|
|
219
|
-
if (forbidden) return forbidden;
|
|
220
|
-
const parsed = await parseBody<Record<string, unknown>>(req);
|
|
221
|
-
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
222
|
-
const body = parsed.body;
|
|
223
|
-
if (!isRecord(body)) return error("JSON object body required");
|
|
204
|
+
const parsed = await parseTaskMutation(req, params.id);
|
|
205
|
+
if (!parsed.ok) return parsed.response;
|
|
206
|
+
const { id, body } = parsed;
|
|
224
207
|
try {
|
|
225
208
|
const detail = await setTaskEntityStageAsync(id, {
|
|
226
209
|
deliverableStage: optionalEnum(body.deliverableStage, "deliverableStage", TASK_DELIVERABLE_STAGES) as any,
|
|
@@ -235,14 +218,9 @@ export const postTaskEntityStage: Handler = async (req, params) => {
|
|
|
235
218
|
};
|
|
236
219
|
|
|
237
220
|
export const postTaskEntityGate: Handler = async (req, params) => {
|
|
238
|
-
const
|
|
239
|
-
if (
|
|
240
|
-
const
|
|
241
|
-
if (forbidden) return forbidden;
|
|
242
|
-
const parsed = await parseBody<Record<string, unknown>>(req);
|
|
243
|
-
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
244
|
-
const body = parsed.body;
|
|
245
|
-
if (!isRecord(body)) return error("JSON object body required");
|
|
221
|
+
const parsed = await parseTaskMutation(req, params.id);
|
|
222
|
+
if (!parsed.ok) return parsed.response;
|
|
223
|
+
const { id, body } = parsed;
|
|
246
224
|
try {
|
|
247
225
|
return json(await recordTaskEntityGateAsync(id, {
|
|
248
226
|
gate: cleanString(body.gate, "gate", { required: true, max: 120 })!,
|
|
@@ -345,14 +323,9 @@ export const deleteTaskRelated: Handler = async (req, params) => {
|
|
|
345
323
|
};
|
|
346
324
|
|
|
347
325
|
export const postTaskAssign: Handler = async (req, params) => {
|
|
348
|
-
const
|
|
349
|
-
if (
|
|
350
|
-
const
|
|
351
|
-
if (forbidden) return forbidden;
|
|
352
|
-
const parsed = await parseBody<Record<string, unknown>>(req);
|
|
353
|
-
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
354
|
-
const body = parsed.body;
|
|
355
|
-
if (!isRecord(body)) return error("JSON object body required");
|
|
326
|
+
const parsed = await parseTaskMutation(req, params.id);
|
|
327
|
+
if (!parsed.ok) return parsed.response;
|
|
328
|
+
const { id, body } = parsed;
|
|
356
329
|
try {
|
|
357
330
|
const detail = await assignTaskEntityAgentAsync(id, cleanString(body.agentId, "agentId", { required: true, max: 200 })!, cleanString(body.role, "role", { max: 120 }), actorOf(req));
|
|
358
331
|
return json(detail);
|
|
@@ -444,10 +417,6 @@ export const postWorkspaceWithdrawLand: Handler = async (req) => {
|
|
|
444
417
|
}
|
|
445
418
|
};
|
|
446
419
|
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
420
|
export const postClaimTask: Handler = async (req, params) => {
|
|
452
421
|
const id = parseId(params.id);
|
|
453
422
|
if (id === null) return error("invalid task id");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { authContextFromRequest } from "../services/auth-context";
|
|
2
|
-
import {
|
|
2
|
+
import { deleteTeamTemplateAsync, getTeamTemplate, listTeamTemplates, saveTeamTemplateAsync } from "../services/team-templates";
|
|
3
3
|
import { cleanString } from "../validation";
|
|
4
4
|
import { authorizeRoute, error, json, parseBody, type Handler } from "./_shared";
|
|
5
5
|
|
|
@@ -16,14 +16,14 @@ function slugParam(params: Record<string, string | undefined>): string {
|
|
|
16
16
|
return cleanString(params.slug, "slug", { required: true, max: 120 })!;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
export const getTeamTemplatesRoute: Handler = (req) => {
|
|
20
|
-
const denied = authorizeRoute(req, { scope: "system:admin" });
|
|
19
|
+
export const getTeamTemplatesRoute: Handler = async (req) => {
|
|
20
|
+
const denied = (await authorizeRoute(req, { scope: "system:admin" }));
|
|
21
21
|
if (denied) return denied;
|
|
22
22
|
return json({ templates: listTeamTemplates() });
|
|
23
23
|
};
|
|
24
24
|
|
|
25
|
-
export const getTeamTemplateRoute: Handler = (req, params) => {
|
|
26
|
-
const denied = authorizeRoute(req, { scope: "system:admin" });
|
|
25
|
+
export const getTeamTemplateRoute: Handler = async (req, params) => {
|
|
26
|
+
const denied = (await authorizeRoute(req, { scope: "system:admin" }));
|
|
27
27
|
if (denied) return denied;
|
|
28
28
|
try {
|
|
29
29
|
const template = getTeamTemplate(slugParam(params));
|
|
@@ -34,32 +34,32 @@ export const getTeamTemplateRoute: Handler = (req, params) => {
|
|
|
34
34
|
};
|
|
35
35
|
|
|
36
36
|
export const postTeamTemplateRoute: Handler = async (req) => {
|
|
37
|
-
const denied = authorizeRoute(req, { scope: "system:admin" });
|
|
37
|
+
const denied = (await authorizeRoute(req, { scope: "system:admin" }));
|
|
38
38
|
if (denied) return denied;
|
|
39
39
|
const parsed = await parseBody<Record<string, unknown>>(req);
|
|
40
40
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
41
41
|
try {
|
|
42
|
-
return json(
|
|
42
|
+
return json(await saveTeamTemplateAsync(parsed.body ?? {}, updatedBy(req)), 201);
|
|
43
43
|
} catch (err) {
|
|
44
44
|
return routeError(err);
|
|
45
45
|
}
|
|
46
46
|
};
|
|
47
47
|
|
|
48
48
|
export const putTeamTemplateRoute: Handler = async (req, params) => {
|
|
49
|
-
const denied = authorizeRoute(req, { scope: "system:admin" });
|
|
49
|
+
const denied = (await authorizeRoute(req, { scope: "system:admin" }));
|
|
50
50
|
if (denied) return denied;
|
|
51
51
|
const parsed = await parseBody<Record<string, unknown>>(req);
|
|
52
52
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
53
53
|
try {
|
|
54
|
-
return json(
|
|
54
|
+
return json(await saveTeamTemplateAsync({ ...(parsed.body ?? {}), slug: slugParam(params) }, updatedBy(req)));
|
|
55
55
|
} catch (err) {
|
|
56
56
|
return routeError(err);
|
|
57
57
|
}
|
|
58
58
|
};
|
|
59
59
|
|
|
60
|
-
export const deleteTeamTemplateRoute: Handler = (req, params) => {
|
|
61
|
-
const denied = authorizeRoute(req, { scope: "system:admin" });
|
|
60
|
+
export const deleteTeamTemplateRoute: Handler = async (req, params) => {
|
|
61
|
+
const denied = (await authorizeRoute(req, { scope: "system:admin" }));
|
|
62
62
|
if (denied) return denied;
|
|
63
63
|
const slug = slugParam(params);
|
|
64
|
-
return json({ slug, deleted:
|
|
64
|
+
return json({ slug, deleted: await deleteTeamTemplateAsync(slug, updatedBy(req)) });
|
|
65
65
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getTeamsConfig,
|
|
1
|
+
import { getTeamsConfig, setTeamsConfigAsync } from "../teams-config-store";
|
|
2
2
|
import { cleanString } from "../validation";
|
|
3
3
|
import { error, json, parseBody, type Handler } from "./_shared";
|
|
4
4
|
import { isRecord } from "@humwick/sdk";
|
|
@@ -11,5 +11,5 @@ export const putTeamsConfigRoute: Handler = async (req) => {
|
|
|
11
11
|
const parsed = await parseBody<unknown>(req);
|
|
12
12
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
13
13
|
const updatedBy = isRecord(parsed.body) ? cleanString(parsed.body.updatedBy, "updatedBy", { max: 200 }) : undefined;
|
|
14
|
-
return json(
|
|
14
|
+
return json(await setTeamsConfigAsync(parsed.body, { updatedBy }));
|
|
15
15
|
};
|
package/src/routes/teams.ts
CHANGED
|
@@ -43,9 +43,9 @@ export const getMyTeamRoute: Handler = (req) => {
|
|
|
43
43
|
};
|
|
44
44
|
|
|
45
45
|
// #3725 — a signed-in member lists the teams their agent scope can see; machine callers stay admin-only.
|
|
46
|
-
export const getTeamsRoute: Handler = (req) => {
|
|
46
|
+
export const getTeamsRoute: Handler = async (req) => {
|
|
47
47
|
const viewer = viewerScopeForRequest(req);
|
|
48
|
-
const denied = authorizeRoute(req, { scope: viewer ? "teams:read" : "system:admin" });
|
|
48
|
+
const denied = (await authorizeRoute(req, { scope: viewer ? "teams:read" : "system:admin" }));
|
|
49
49
|
if (denied) return denied;
|
|
50
50
|
try {
|
|
51
51
|
const status = optionalEnum(new URL(req.url).searchParams.get("status") ?? undefined, "status", TEAM_STATUSES) as Team["status"] | undefined;
|
|
@@ -67,7 +67,7 @@ export const getTeamsRoute: Handler = (req) => {
|
|
|
67
67
|
};
|
|
68
68
|
|
|
69
69
|
export const getTeamOutcomesRoute: Handler = async (req) => {
|
|
70
|
-
const denied = authorizeRoute(req, { scope: "system:admin" });
|
|
70
|
+
const denied = (await authorizeRoute(req, { scope: "system:admin" }));
|
|
71
71
|
if (denied) return denied;
|
|
72
72
|
try {
|
|
73
73
|
const recentLimit = parseQueryInt(new URL(req.url).searchParams.get("recentLimit"), { min: 1, max: 50, clamp: true }) ?? undefined;
|
|
@@ -83,11 +83,11 @@ export const putMyTeamBriefRoute: Handler = async (req) => {
|
|
|
83
83
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
84
84
|
try {
|
|
85
85
|
const body = parsed.body ?? {};
|
|
86
|
-
return json(setCallerTeamBrief(authContextFromRequest(req), {
|
|
86
|
+
return json((await setCallerTeamBrief(authContextFromRequest(req), {
|
|
87
87
|
title: cleanString(body.title, "title", { max: 240 }),
|
|
88
88
|
brief: cleanString(body.brief, "brief", { max: 16_000 }),
|
|
89
89
|
definitionOfDone: cleanString(body.definitionOfDone, "definitionOfDone", { max: 4000 }),
|
|
90
|
-
}));
|
|
90
|
+
})));
|
|
91
91
|
} catch (err) {
|
|
92
92
|
return routeError(err);
|
|
93
93
|
}
|
|
@@ -98,28 +98,28 @@ export const postMyTeamDissolveRoute: Handler = async (req) => {
|
|
|
98
98
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
99
99
|
try {
|
|
100
100
|
const body = parsed.body ?? {};
|
|
101
|
-
return json(dissolveCallerTeam(authContextFromRequest(req), cleanDissolveInput(body)));
|
|
101
|
+
return json(await dissolveCallerTeam(authContextFromRequest(req), cleanDissolveInput(body)));
|
|
102
102
|
} catch (err) {
|
|
103
103
|
return routeError(err);
|
|
104
104
|
}
|
|
105
105
|
};
|
|
106
106
|
|
|
107
107
|
export const postTeamDissolveByIdRoute: Handler = async (req, params) => {
|
|
108
|
-
const denied = authorizeRoute(req, { scope: "system:admin" });
|
|
108
|
+
const denied = (await authorizeRoute(req, { scope: "system:admin" }));
|
|
109
109
|
if (denied) return denied;
|
|
110
110
|
const parsed = await parseBody<Record<string, unknown>>(req);
|
|
111
111
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
112
112
|
try {
|
|
113
113
|
const id = params.id!;
|
|
114
114
|
if (!getTeam(id)) return error("team not found", 404);
|
|
115
|
-
return json(dissolveTeamById(id, cleanDissolveInput(parsed.body ?? {})));
|
|
115
|
+
return json(await dissolveTeamById(id, cleanDissolveInput(parsed.body ?? {})));
|
|
116
116
|
} catch (err) {
|
|
117
117
|
return routeError(err);
|
|
118
118
|
}
|
|
119
119
|
};
|
|
120
120
|
|
|
121
121
|
export const patchTeamSpawnDelegationRoute: Handler = async (req, params) => {
|
|
122
|
-
const denied = authorizeRoute(req, { scope: "teams:write" });
|
|
122
|
+
const denied = (await authorizeRoute(req, { scope: "teams:write" }));
|
|
123
123
|
if (denied) return denied;
|
|
124
124
|
const parsed = await parseBody<Record<string, unknown>>(req);
|
|
125
125
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -132,7 +132,7 @@ export const patchTeamSpawnDelegationRoute: Handler = async (req, params) => {
|
|
|
132
132
|
export const getTeamSpawnDelegationRoute: Handler = async (req, params) => {
|
|
133
133
|
// #3725 — the grant names projects and launches across the tree; a member's session may not read it.
|
|
134
134
|
const viewer = viewerScopeForRequest(req);
|
|
135
|
-
const denied = authorizeRoute(req, { scope: viewer && !viewer.seesAll ? "system:admin" : "teams:read" });
|
|
135
|
+
const denied = (await authorizeRoute(req, { scope: viewer && !viewer.seesAll ? "system:admin" : "teams:read" }));
|
|
136
136
|
if (denied) return denied;
|
|
137
137
|
try {
|
|
138
138
|
const state = await getTeamSpawnDelegation(authContextFromRequest(req), params.id!);
|
package/src/routes/tokens.ts
CHANGED
|
@@ -1,18 +1,25 @@
|
|
|
1
|
+
import { upsertIntegrationRegistryAsync, upsertTokenProfileAsync, updateTokenProfileAsync, deleteTokenProfileAsync } from "../db/runtime-tail-async";
|
|
1
2
|
// Auto-split from routes.ts (#299). Domain: tokens.
|
|
2
3
|
import { revokeUserSession, sessionUserIdOf } from "../auth/session";
|
|
3
4
|
import { withSessionCookie } from "../auth/session-cookie";
|
|
4
5
|
import { APPROVAL_MODES, SPAWN_PROVIDERS, isRecord, userSinkId } from "@humwick/sdk";
|
|
5
|
-
import { ValidationError, getOrchestrator
|
|
6
|
+
import { ValidationError, getOrchestrator } from "../db";
|
|
6
7
|
import { auditEvent, authAuditMetadata, authorizeRoute, error, isRootCredentialRequest, json, parseBody, resolveActingUser, type Handler } from "./_shared";
|
|
7
8
|
import { cleanString, cleanStringArray, cleanTokenConstraints, optionalEnum } from "../validation";
|
|
8
|
-
import {
|
|
9
|
-
import { createTokenAsync,
|
|
9
|
+
import { getToken, getTokenProfile, listTokenProfiles, listTokens } from "../token-db";
|
|
10
|
+
import { createTokenAsync, revokeTokenAsync } from "../token-db-write";
|
|
10
11
|
import { getComponentAuth, getIntegrationAuth, isAuthorized } from "../security";
|
|
11
|
-
import { issueIntegrationRuntimeToken, issueInteractiveRunnerRuntimeToken, issueMcpRuntimeToken, reissueRunnerRuntimeToken, remintRunnerRuntimeToken } from "../runtime-tokens";
|
|
12
|
+
import { handoffRunnerTokenAsync, issueIntegrationRuntimeToken, issueInteractiveRunnerRuntimeToken, issueMcpRuntimeToken, reissueRunnerRuntimeToken, remintRunnerRuntimeToken, type RunnerTokenMintRefusal } from "../runtime-tokens";
|
|
12
13
|
import { type SpawnProvider } from "../types";
|
|
13
14
|
|
|
14
15
|
export const getTokens: Handler = () => json(listTokens());
|
|
15
16
|
|
|
17
|
+
// #3775 — a rate-limited runner token mint is a 429 with Retry-After; any other refusal stays 403.
|
|
18
|
+
function mintRefused(refusal: RunnerTokenMintRefusal): Response {
|
|
19
|
+
if (refusal.retryAfterSeconds === undefined) return error(refusal.error, 403);
|
|
20
|
+
return Response.json({ error: refusal.error, retryAfterSeconds: refusal.retryAfterSeconds }, { status: 429, headers: { "Retry-After": String(refusal.retryAfterSeconds) } });
|
|
21
|
+
}
|
|
22
|
+
|
|
16
23
|
export const getTokenMe: Handler = (req) => {
|
|
17
24
|
const component = getComponentAuth(req);
|
|
18
25
|
if (component) {
|
|
@@ -103,11 +110,12 @@ export const postRuntimeTokenRenew: Handler = async (req) => {
|
|
|
103
110
|
const auth = getComponentAuth(req);
|
|
104
111
|
if (!auth?.jti) return error("scoped runtime token required", 403);
|
|
105
112
|
if (auth.role !== "provider") return error("provider runtime token required", 403);
|
|
106
|
-
const renewed = await
|
|
113
|
+
const renewed = await handoffRunnerTokenAsync(auth.sub, {
|
|
107
114
|
jti: auth.jti,
|
|
108
115
|
allowedProfileIds: ["provider-agent", "provider-interactive"],
|
|
109
116
|
createdBy: `renew:${auth.jti}`,
|
|
110
117
|
});
|
|
118
|
+
if (renewed && "retryAfterSeconds" in renewed) return mintRefused({ error: "runtime token mint rate limited", ...renewed });
|
|
111
119
|
if (!renewed) return error("runtime token cannot be renewed", 403);
|
|
112
120
|
await auditEvent({
|
|
113
121
|
// Keyed by the successor, so a replayed handoff (#1245) records one renewal.
|
|
@@ -151,7 +159,7 @@ export const postRuntimeTokenRemint: Handler = async (req) => {
|
|
|
151
159
|
throw e;
|
|
152
160
|
}
|
|
153
161
|
const result = await remintRunnerRuntimeToken(auth, `remint:${auth.jti}`);
|
|
154
|
-
if ("error" in result) return
|
|
162
|
+
if ("error" in result) return mintRefused(result);
|
|
155
163
|
if ("unchanged" in result) return json(result);
|
|
156
164
|
await auditEvent({
|
|
157
165
|
clientId: "server-runtime-token-remint-" + result.record.jti,
|
|
@@ -169,7 +177,7 @@ export const postRuntimeTokenRemint: Handler = async (req) => {
|
|
|
169
177
|
export const postOrchestratorRunnerToken: Handler = async (req, params) => {
|
|
170
178
|
const orch = getOrchestrator(params.id!);
|
|
171
179
|
if (!orch) return error("orchestrator not found", 404);
|
|
172
|
-
const denied = authorizeRoute(req, { scope: "command:write", resource: { orchestratorId: orch.id } });
|
|
180
|
+
const denied = (await authorizeRoute(req, { scope: "command:write", resource: { orchestratorId: orch.id } }));
|
|
173
181
|
if (denied) return denied;
|
|
174
182
|
const parsed = await parseBody<unknown>(req);
|
|
175
183
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
@@ -180,7 +188,7 @@ export const postOrchestratorRunnerToken: Handler = async (req, params) => {
|
|
|
180
188
|
orchestratorId: orch.id,
|
|
181
189
|
createdBy: `orchestrator-remint:${orch.id}`,
|
|
182
190
|
});
|
|
183
|
-
if ("error" in result) return
|
|
191
|
+
if ("error" in result) return mintRefused(result);
|
|
184
192
|
await auditEvent({
|
|
185
193
|
clientId: "server-runner-token-remint-" + result.record.jti,
|
|
186
194
|
kind: "state",
|
|
@@ -212,7 +220,7 @@ export const postInteractiveRunnerRuntimeToken: Handler = async (req) => {
|
|
|
212
220
|
// (`isRootCredentialRequest` above), which can mint any token it likes anyway — the value is
|
|
213
221
|
// pinned into the signature so every LATER, scoped read of it is unforgeable.
|
|
214
222
|
const approvalMode = optionalEnum(parsed.body.approvalMode, "approvalMode", APPROVAL_MODES);
|
|
215
|
-
const runtimeToken = issueInteractiveRunnerRuntimeToken({
|
|
223
|
+
const runtimeToken = (await issueInteractiveRunnerRuntimeToken({
|
|
216
224
|
provider,
|
|
217
225
|
cwd,
|
|
218
226
|
runnerId,
|
|
@@ -221,7 +229,7 @@ export const postInteractiveRunnerRuntimeToken: Handler = async (req) => {
|
|
|
221
229
|
host,
|
|
222
230
|
...(approvalMode ? { approvalMode } : {}),
|
|
223
231
|
createdBy: `interactive:${runnerId}`,
|
|
224
|
-
});
|
|
232
|
+
}));
|
|
225
233
|
await auditEvent({
|
|
226
234
|
clientId: "server-runtime-token-interactive-" + runnerId + "-" + Date.now(),
|
|
227
235
|
kind: "state",
|
|
@@ -256,13 +264,13 @@ export const postMcpRuntimeToken: Handler = async (req) => {
|
|
|
256
264
|
const agentId = cleanString(parsed.body.agentId, "agentId", { max: 240 });
|
|
257
265
|
const targets = cleanStringArray(parsed.body.targets, "targets", { itemMax: 80, maxItems: 50 });
|
|
258
266
|
const channels = cleanStringArray(parsed.body.channels, "channels", { itemMax: 80, maxItems: 50 });
|
|
259
|
-
const runtimeToken = issueMcpRuntimeToken({
|
|
267
|
+
const runtimeToken = (await issueMcpRuntimeToken({
|
|
260
268
|
sessionId,
|
|
261
269
|
agentId,
|
|
262
270
|
targets,
|
|
263
271
|
channels,
|
|
264
272
|
createdBy: `mcp:${sessionId}`,
|
|
265
|
-
});
|
|
273
|
+
}));
|
|
266
274
|
await auditEvent({
|
|
267
275
|
clientId: "server-runtime-token-mcp-" + sessionId + "-" + Date.now(),
|
|
268
276
|
kind: "state",
|
|
@@ -295,19 +303,19 @@ export const postIntegrationRuntimeToken: Handler = async (req) => {
|
|
|
295
303
|
const name = cleanString(parsed.body.name, "name", { required: true, max: 120 })!;
|
|
296
304
|
const targets = cleanStringArray(parsed.body.targets, "targets", { itemMax: 80, maxItems: 50 });
|
|
297
305
|
const channels = cleanStringArray(parsed.body.channels, "channels", { itemMax: 80, maxItems: 50 });
|
|
298
|
-
const runtimeToken = issueIntegrationRuntimeToken({
|
|
306
|
+
const runtimeToken = (await issueIntegrationRuntimeToken({
|
|
299
307
|
name,
|
|
300
308
|
targets,
|
|
301
309
|
channels,
|
|
302
310
|
createdBy: `integration:${name}`,
|
|
303
|
-
});
|
|
304
|
-
|
|
311
|
+
}));
|
|
312
|
+
(await upsertIntegrationRegistryAsync({
|
|
305
313
|
name,
|
|
306
314
|
scopes: runtimeToken.record.scope,
|
|
307
315
|
targets,
|
|
308
316
|
channels,
|
|
309
317
|
source: "api",
|
|
310
|
-
});
|
|
318
|
+
}));
|
|
311
319
|
await auditEvent({
|
|
312
320
|
clientId: "server-runtime-token-integration-" + name + "-" + Date.now(),
|
|
313
321
|
kind: "state",
|
|
@@ -337,7 +345,7 @@ export const postTokenProfile: Handler = async (req) => {
|
|
|
337
345
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
338
346
|
try {
|
|
339
347
|
const input = cleanTokenProfileInput(parsed.body);
|
|
340
|
-
return json(
|
|
348
|
+
return json((await upsertTokenProfileAsync({
|
|
341
349
|
id: input.id,
|
|
342
350
|
name: input.name!,
|
|
343
351
|
description: input.description,
|
|
@@ -346,7 +354,7 @@ export const postTokenProfile: Handler = async (req) => {
|
|
|
346
354
|
constraints: input.constraints,
|
|
347
355
|
ttlSeconds: input.ttlSeconds,
|
|
348
356
|
createdBy: input.createdBy,
|
|
349
|
-
}), 201);
|
|
357
|
+
})), 201);
|
|
350
358
|
} catch (e) {
|
|
351
359
|
if (e instanceof ValidationError) return error(e.message, 400);
|
|
352
360
|
if (e instanceof Error) return error(e.message, 400);
|
|
@@ -359,7 +367,7 @@ export const patchTokenProfile: Handler = async (req, params) => {
|
|
|
359
367
|
if (!parsed.ok) return error(parsed.error, parsed.status);
|
|
360
368
|
try {
|
|
361
369
|
const patch = cleanTokenProfileInput(parsed.body, true);
|
|
362
|
-
const updated =
|
|
370
|
+
const updated = (await updateTokenProfileAsync(params.id!, {
|
|
363
371
|
name: patch.name,
|
|
364
372
|
description: patch.description,
|
|
365
373
|
role: patch.role,
|
|
@@ -367,7 +375,7 @@ export const patchTokenProfile: Handler = async (req, params) => {
|
|
|
367
375
|
constraints: patch.constraints,
|
|
368
376
|
ttlSeconds: patch.ttlSeconds,
|
|
369
377
|
createdBy: patch.createdBy,
|
|
370
|
-
});
|
|
378
|
+
}));
|
|
371
379
|
return updated ? json(updated) : error("token profile not found", 404);
|
|
372
380
|
} catch (e) {
|
|
373
381
|
if (e instanceof ValidationError) return error(e.message, 400);
|
|
@@ -376,8 +384,8 @@ export const patchTokenProfile: Handler = async (req, params) => {
|
|
|
376
384
|
}
|
|
377
385
|
};
|
|
378
386
|
|
|
379
|
-
export const deleteTokenProfileRoute: Handler = (_req, params) => {
|
|
380
|
-
return
|
|
387
|
+
export const deleteTokenProfileRoute: Handler = async (_req, params) => {
|
|
388
|
+
return (await deleteTokenProfileAsync(params.id!)) ? json({ ok: true }) : error("token profile not found or built-in", 404);
|
|
381
389
|
};
|
|
382
390
|
|
|
383
391
|
export const postTokenRevoke: Handler = async (req, params) => {
|