@overdeck/desktop 0.49.1 → 0.50.0
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/drizzle/overdeck/0000_overdeck_init.sql +1 -0
- package/package.json +1 -1
- package/server/{acceptance-criteria-Crw-xSJ3.js → acceptance-criteria-B_maCGZv.js} +2 -2
- package/server/{active-dashboard-bundle-CLwfD-Om.js → active-dashboard-bundle-CCqpFWiz.js} +2 -2
- package/server/activity-logger-B0X2JJwM.js +3 -0
- package/server/{activity-logger-BAVLrkR7.js → activity-logger-SlTXYCVf.js} +22 -4
- package/server/{advancing-selfheal-BQiJ7mIH.js → advancing-selfheal-BJAfiY-C.js} +12 -7
- package/server/{agent-gc-5E0lgxI1.js → agent-gc-bhikjoJ_.js} +11 -11
- package/server/agent-idle-D-UQ7gDv.js +745 -0
- package/server/agent-state-BrUPf_7Z.js +3 -0
- package/server/{agent-state-Bb3UUxQm.js → agent-state-FABw8neJ.js} +682 -454
- package/server/{agent-state-service-keg-x1bT.js → agent-state-service-BAQApt97.js} +1 -1
- package/server/{agent-state-service-BFbttwRA.js → agent-state-service-rDenYSlD.js} +5 -5
- package/server/agents-DixZjXWm.js +3 -0
- package/server/{agents-CqQJW75N.js → agents-DzpQidT8.js} +8 -8
- package/server/{archive-planning-BwEhu9Oq.js → archive-planning-BL1ABtW0.js} +20 -135
- package/server/archive-planning-D3gw32U9.js +2 -0
- package/server/{artifact-index-jobs-C6Lg2rKm.js → artifact-index-jobs-Cjdme0jS.js} +3 -3
- package/server/{assemble-DyTp2gSB.js → assemble-B_JgnCbG.js} +28 -9
- package/server/{auto-spawn-consent-BDfe4qz0.js → auto-spawn-consent-BesWchEi.js} +8 -7
- package/server/{backlog-auto-trigger-DuOGpdDW.js → backlog-auto-trigger-COLq639j.js} +3 -3
- package/server/{behavior-Bitko0mD.js → behavior-DCg8CIWC.js} +3 -3
- package/server/{bridge-pool-patrol-DiHEd13O.js → bridge-pool-patrol-BDohuMRt.js} +2 -2
- package/server/{briefing-freshness-CDJcmHHZ.js → briefing-freshness-ENa_hW_V.js} +2 -2
- package/server/build-info-Dx2qrVhb.js +2 -0
- package/server/{build-info-DTX8JwVP.js → build-info-WuZT6xyi.js} +3 -3
- package/server/{checkpoint-manager-BlOOdzLF.js → checkpoint-manager-CSZ7aVQF.js} +26 -9
- package/server/{checkpoint-manager-CKg1tn34.js → checkpoint-manager-DXhGRvg4.js} +1 -1
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-BGfl0cHM.js → checkpoints-DUkUsPVS.js} +2 -2
- package/server/{checkpoints-DRALkfDS.js → checkpoints-tm_w6Y4V.js} +1 -1
- package/server/{claude-hooks-provision-B_tv3wzE.js → claude-hooks-provision-CTh9zxEi.js} +1 -1
- package/server/{claude-hooks-provision-BlGv6twJ.js → claude-hooks-provision-fRofvhTN.js} +2 -2
- package/server/{claude-permissions-aHgDcZi5.js → claude-permissions-DLrb9ovz.js} +18 -3
- package/server/{claude-settings-overlay-T2LWLteV.js → claude-settings-overlay-BYnXaTVc.js} +2 -2
- package/server/{claude-settings-overlay-CYOvFE3A.js → claude-settings-overlay-CMS5Jab5.js} +1 -1
- package/server/cli-BflmtEFM.js +2 -0
- package/server/{cli-Do8UpLoI.js → cli-CoQou1t_.js} +11 -11
- package/server/{cliproxy-CX6jHRDP.js → cliproxy-DXDQcR3I.js} +52 -17
- package/server/cliproxy-DdhFpcXU.js +3 -0
- package/server/{close-issue-J0_eWYT1.js → close-issue-CpQ0BWg-.js} +5 -5
- package/server/{closed-issue-reaper-bFppuk6F.js → closed-issue-reaper-CdcJRvUx.js} +13 -12
- package/server/{closed-issue-reaper-Cl2h9AfT.js → closed-issue-reaper-TymtZM37.js} +1 -1
- package/server/{codex-icapA4om.js → codex-BValsmtK.js} +1 -1
- package/server/{codex-OOea7lXs.js → codex-DYyZL8JD.js} +16 -10
- package/server/{compaction-continuation-D5voR1ME.js → compaction-continuation-CVjbdGKt.js} +3 -3
- package/server/{config-Cjleh3_U.js → config-CvKH7r7W.js} +1 -1
- package/server/{config-tucKBCCc.js → config-NxI9Yl2f.js} +2 -2
- package/server/{config-DC75T4Mr.js → config-_qaa1UXH.js} +2 -2
- package/server/{config-yaml-BwOEANMr.js → config-yaml-D60AnTIu.js} +55 -15
- package/server/{conflict-gate-DlpWCMd7.js → conflict-gate-0dD1kxjN.js} +1 -1
- package/server/{conflict-gate-D2L1kZeL.js → conflict-gate-hAUCL-un.js} +5 -5
- package/server/{context-layers-CSPGc2Hb.js → context-layers-CdpabJj0.js} +3 -3
- package/server/context-layers-Ds1MnEFI.js +4 -0
- package/server/{continue-U3Af0jUq.js → continue-CnvrUfxw.js} +3 -3
- package/server/{control-settings-5k6ixdFW.js → control-settings-Db0uXgVM.js} +310 -7
- package/server/{conversation-compaction-CSpVpxN6.js → conversation-compaction-B-1KETG9.js} +8 -8
- package/server/{conversation-compaction-Ciit9O6k.js → conversation-compaction-DzMXGRiJ.js} +1 -1
- package/server/{conversation-service-BxrB5lUT.js → conversation-service-BL-asWPX.js} +1 -1
- package/server/{conversation-service-BteE4ELK.js → conversation-service-BxIOd5ay.js} +21 -7
- package/server/conversations-CEMfwMt-.js +3 -0
- package/server/{conversations-DhwxsOru.js → conversations-nS6QgYpD.js} +12 -7
- package/server/cost-3FyqKK56.js +838 -0
- package/server/{cost-Bnf9NUC5.js → cost-Cctc-Q9M.js} +3 -3
- package/server/{cost-CQKI6OCu.js → cost-DTuIRE4y.js} +2 -2
- package/server/{cost-sync-B-ADeXKY.js → cost-sync-DfmvLT9L.js} +3 -3
- package/server/{dag-DI9LaK_q.js → dag-o-dUpw1L.js} +6 -19
- package/server/{dangerous-git-ops-akhA3iyF.js → dangerous-git-ops-BOtXCFkT.js} +1 -1
- package/server/dashboard-db-worker.js +61 -11
- package/server/{deacon-TPYssFYt.js → deacon-CsisLmPt.js} +1735 -172
- package/server/{deacon-canonical-state-DFYymrDw.js → deacon-canonical-state-DkdkQS5p.js} +3 -3
- package/server/deacon-e6py3jkM.js +4 -0
- package/server/{deacon-event-client-Te5v10-b.js → deacon-event-client-BCjHiGAY.js} +1 -1
- package/server/{deacon-event-client-BKOL4AcL.js → deacon-event-client-CMQswEHX.js} +2 -2
- package/server/{deacon-nudge-log-BtlTWgWu.js → deacon-nudge-log-pcliw8Dr.js} +1 -1
- package/server/{deacon-pending-lifecycle-DVHjOLje.js → deacon-pending-lifecycle-BzaE76Xo.js} +3 -3
- package/server/deacon.js +11 -11
- package/server/{dead-end-trip-P0IF1O0E.js → dead-end-trip-Bs3hxIn6.js} +3 -3
- package/server/dead-end-trip-DUbiRMtT.js +2 -0
- package/server/delivery-DhZGRShH.js +3 -0
- package/server/{deploy-patrol-BXjlvoV3.js → deploy-patrol-B8sKkA8h.js} +8 -8
- package/server/deploy-queue--smqHLhe.js +2 -0
- package/server/{deploy-queue-o7shYg1j.js → deploy-queue-CCGWXFkp.js} +2 -2
- package/server/{deploy-window-CNT6fOff.js → deploy-window-YuJewzmC.js} +4 -4
- package/server/{deploy-window-BMk5_oX6.js → deploy-window-hgsvZ3UZ.js} +1 -1
- package/server/{dev-supervisor-SR1CLOAK.js → dev-supervisor-4SBloJHV.js} +2 -2
- package/server/{devcontainer-renderer-enMmNDFa.js → devcontainer-renderer-BiJhwFNi.js} +3 -3
- package/server/{dist-CPTO_zMR.js → dist-CoR2sivG.js} +1 -1
- package/server/dist-FHv1s5ez.js +3 -0
- package/server/{docker-B7qUZptz.js → docker-CWO7dcIP.js} +3 -3
- package/server/{docker-KR3zSFKY.js → docker-DQzyMXkd.js} +1 -1
- package/server/{dod-gK835UMf.js → dod-BAk5arLF.js} +1 -1
- package/server/{done-preflight-CksRvh49.js → done-preflight-CGFA0M1b.js} +1 -1
- package/server/{done-preflight-Bk8aExAL.js → done-preflight-Cx9JGznT.js} +5 -5
- package/server/{driver-CmsY2RLl.js → driver-BtcFz-qu.js} +14 -3
- package/server/durable-review-pipeline-BOEZ0chh.js +3 -0
- package/server/{durable-review-pipeline-DgYHucN2.js → durable-review-pipeline-Djx_lvFd.js} +11 -2
- package/server/{ensure-devcontainer-BQ4YizSH.js → ensure-devcontainer-Dk6ZMOUC.js} +1 -1
- package/server/{ensure-devcontainer-ojerEqQg.js → ensure-devcontainer-DzYBBwnM.js} +4 -4
- package/server/{esm-shims-1htPASWs.js → esm-shims-deFq5Hhl.js} +1 -1
- package/server/{event-store-BgEjNsvk.js → event-store-C50Qt-f1.js} +1 -1
- package/server/{event-store-D7qcJXuZ.js → event-store-DTns2XZP.js} +5 -5
- package/server/{event-store-provider-BKvk2rDj.js → event-store-provider-Bu1Qrg6v.js} +1 -1
- package/server/{events-BIKGJZOT.js → events-B6xW8Cpm.js} +3 -3
- package/server/{dist-src-BM9eudEd.js → factory-CWVKwKFE.js} +714 -2
- package/server/{feature-registry-storage-ewNSIVsQ.js → feature-registry-storage-vaxRN3WO.js} +3 -3
- package/server/{features-CGopJXdU.js → features-DXWwktJB.js} +2 -2
- package/server/{feedback-stuck-retirement-B8-fX7NA.js → feedback-stuck-retirement-CXAYe2rU.js} +2 -2
- package/server/{feedback-target-CkyLYohm.js → feedback-target-DSVpi0gT.js} +1 -1
- package/server/{feedback-target-Ci6N5p4G.js → feedback-target-yPD_wclF.js} +10 -10
- package/server/{feedback-writer-DfuVjvH0.js → feedback-writer-BzN4qvaP.js} +1 -1
- package/server/{feedback-writer-D4ULO4qG.js → feedback-writer-Ds1Wjsz4.js} +5 -5
- package/server/{flywheel-DXI_WITn.js → flywheel-BCZS-FlW.js} +1 -1
- package/server/{flywheel-BwYPDlhK.js → flywheel-CC4gE_rx.js} +15 -15
- package/server/{flywheel-C7yek87O.js → flywheel-DWKd7bMc.js} +79 -29
- package/server/{flywheel-merge-order-C5m5bYBc.js → flywheel-merge-order-DDT3i57u.js} +1 -1
- package/server/{flywheel-merge-order-CXfU4M6l.js → flywheel-merge-order-DJwH2KpL.js} +17 -15
- package/server/forge-4VVCRcF7.js +2 -0
- package/server/{forge-DYX9sKzG.js → forge-CHADjOFs.js} +2 -2
- package/server/{from-DAdMxC29.js → from-C3dzmjSO.js} +1 -1
- package/server/{fs-lock-cw25uO_E.js → fs-lock-DQ_gUxfq.js} +2 -2
- package/server/{fts-operations-D_rzLxX5.js → fts-operations-asZo2fh1.js} +3 -3
- package/server/git-info-DMOSfJ9I.js +148 -0
- package/server/{git-utils-Y0zG25ez.js → git-utils-BAMwn9Nf.js} +1 -1
- package/server/{git-utils-DV4B9TRl.js → git-utils-BdHk8y7g.js} +4 -4
- package/server/{github-app-C33lDk9Z.js → github-app-BWziYCf3.js} +1 -1
- package/server/{github-app-4UX8VIr8.js → github-app-BlMSzSTw.js} +2 -2
- package/server/{github-client-nPj5ckZO.js → github-client-OK24qpol.js} +1 -1
- package/server/{github-client-DkJVR908.js → github-client-w6j5nVlz.js} +3 -3
- package/server/{github-pr-lookup-C9Vokb0W.js → github-pr-lookup-bGcsEvLE.js} +2 -2
- package/server/{harness-binary-BgXYDo2Z.js → harness-binary-DChiynaB.js} +2 -2
- package/server/{harness-resolve-1NZcVx7n.js → harness-resolve-BplBEbwn.js} +4 -4
- package/server/{health-events-jMfxrElt.js → health-events-BTqsmunw.js} +1 -1
- package/server/{health-events-DlX_FVAB.js → health-events-Bk3LjaJ9.js} +2 -2
- package/server/{hooks-NQ19vvlB.js → hooks-DJR1yR9w.js} +2 -2
- package/server/{hooks-W3REcb3h.js → hooks-EndRNrx9.js} +1 -1
- package/server/{hume-BFkid2PO.js → hume-1FJmNDTq.js} +2 -2
- package/server/hume-gXLmRhmN.js +3 -0
- package/server/{identity-Bwh6VGeL.js → identity-C3s8lyp0.js} +3 -3
- package/server/{idle-stack-reaper-CHtCNpvd.js → idle-stack-reaper-CBelVOE3.js} +1 -1
- package/server/{idle-stack-reaper-BeU_KxWx.js → idle-stack-reaper-DtoI4al6.js} +4 -4
- package/server/{in-flight-guard-pcwXKLGz.js → in-flight-guard-B7khcBdQ.js} +1 -1
- package/server/{infra-KTp9KV9u.js → infra-CJRi_5Wu.js} +36 -7
- package/server/{injection-67YyU6SC.js → injection-ADWQ3D0s.js} +8 -8
- package/server/{injection-BxbZKPDh.js → injection-BWsgHvrL.js} +1 -1
- package/server/{inspect-agent-VHSihlb7.js → inspect-agent-CCfNJjKr.js} +12 -12
- package/server/inspect-agent-Dhp3hCGp.js +2 -0
- package/server/{internal-token-B-z-sGBH.js → internal-token-BCTEqUCX.js} +1 -1
- package/server/{internal-token-zY75jrRJ.js → internal-token-BeIWG_kT.js} +2 -2
- package/server/{io-DfvO2xyh.js → io-BCtZoXHo.js} +5 -5
- package/server/{issue-closed-dvEWKO7Q.js → issue-closed-CiYAa6bX.js} +7 -7
- package/server/{issue-lifecycle-3N8XF7lP.js → issue-lifecycle-BETNVVLq.js} +206 -29
- package/server/{issue-lifecycle-BI6jAfp8.js → issue-lifecycle-DaKN57sx.js} +1 -1
- package/server/{issue-service-singleton-CL6hESX2.js → issue-service-singleton-1Q0ER8Yc.js} +1 -1
- package/server/{issue-service-singleton-BN_2MXp4.js → issue-service-singleton-C_sZ0HjP.js} +124 -11
- package/server/issue-title-fallback-B91iD66g.js +120 -0
- package/server/{issues-CkvUoAnq.js → issues-RGHQUKhB.js} +2 -2
- package/server/{jsonl-parser-CrEb2PWr.js → jsonl-parser-Dfs1dlYE.js} +3 -3
- package/server/jsonl-resolver-bFtftCDd.js +324 -0
- package/server/{kimi-code-DoMoGqIu.js → kimi-code-BxkDgaj4.js} +1 -1
- package/server/{kimi-code-C26gmGxM.js → kimi-code-CNYRA8Dd.js} +14 -12
- package/server/{kimi-parser-Dmhy3UlR.js → kimi-parser-OcWwmOqF.js} +2 -2
- package/server/{label-cleanup-X2lWfghH.js → label-cleanup-CefxK9tL.js} +3 -3
- package/server/{lifecycle-B0rL38D3.js → lifecycle-DDZ7w-BY.js} +6 -6
- package/server/{lifecycle-Bg44O-9x.js → lifecycle-DVXyUil2.js} +2 -2
- package/server/{lifecycle-io-DQDU0apV.js → lifecycle-io-D1oBiMce.js} +1 -1
- package/server/{lifecycle-io-CCBpRv5m.js → lifecycle-io-D7N0vQNj.js} +5 -5
- package/server/{linear-client-B0cIkTs4.js → linear-client-DUN7zCeb.js} +3 -3
- package/server/{linear-client-6V2E-DSa.js → linear-client-TL32snOy.js} +1 -1
- package/server/{linear-mcp-auth-LCo9AWUd.js → linear-mcp-auth-CtRKSHy5.js} +1 -1
- package/server/{linear-mcp-auth-Dsu9Io9r.js → linear-mcp-auth-bB0CPyjh.js} +5 -5
- package/server/memory-fts-worker.js +1 -1
- package/server/{memory-governor-A4O6vI9d.js → memory-governor-Cvv_9K0M.js} +88 -22
- package/server/{memory-pressure-patrol-BWlWywmA.js → memory-pressure-patrol-C6DJJQRA.js} +38 -14
- package/server/{merge-BGWcBxku.js → merge-DOCR6pHi.js} +1 -1
- package/server/{merge-vz80RvSE.js → merge-FTk4LsnM.js} +3 -3
- package/server/{merge-agent-GWhmnxFk.js → merge-agent-C-dsN9se.js} +37 -33
- package/server/{merge-agent-BRSz26Oh.js → merge-agent-D-4_iQgy.js} +2 -2
- package/server/{merge-batch-CFMEtTxv.js → merge-batch-BJjzUUL7.js} +1 -1
- package/server/{merge-completeness-CP347umA.js → merge-completeness-BOtBUwTU.js} +4 -4
- package/server/{merge-completeness-7ajHAIR-.js → merge-completeness-CoLJxfUY.js} +1 -1
- package/server/merge-eligibility-C4rTS97F.js +3 -0
- package/server/merge-eligibility-D7wRnJbj.js +51 -0
- package/server/merge-ops-Cf02szJ5.js +2 -0
- package/server/merge-rebase-Bj7eJAG4.js +2 -0
- package/server/{merge-rebase-C5htyEEH.js → merge-rebase-KBw4rdh3.js} +2 -2
- package/server/{merge-set-DsGW8fmc.js → merge-set-CVfEM57p.js} +1 -1
- package/server/{merge-set-eiE2nC6C.js → merge-set-CyW-xSn4.js} +4 -4
- package/server/{merge-sync-CM2-myXu.js → merge-sync-CYGsJy0u.js} +1 -1
- package/server/{merge-sync-Ct0-cxMX.js → merge-sync-YLvOPAry.js} +2 -2
- package/server/{merge-train-BOu3fN7O.js → merge-train-VxLn8Ms4.js} +4 -4
- package/server/{merge-train-deps-LXHGK61n.js → merge-train-deps-D0y4hBB9.js} +4 -4
- package/server/{merge-verification-BRp08IzI.js → merge-verification-BfJRNMiD.js} +6 -6
- package/server/{merged-docker-cleanup-worker-CwldDjHV.js → merged-docker-cleanup-worker-Bh5fKG_b.js} +4 -4
- package/server/{merged-docker-cleanup-worker-C8eGn78a.js → merged-docker-cleanup-worker-Ci9oeFAe.js} +1 -1
- package/server/messaging-Dfbhgjd6.js +3 -0
- package/server/{multipart-parser-OAuW7824.js → multipart-parser-BYwfKOVU.js} +2 -2
- package/server/{no-resume-mode-MWI6pnrK.js → no-resume-mode-DjMQRkId.js} +1 -1
- package/server/node_modules/.package-lock.json +24 -24
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/AGENTS.md +14 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/CLAUDE.md +14 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/README.md +10 -3
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/package.json +2 -2
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/40_sql/10_basics.ts +175 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/40_sql/index.md +6 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/10_basics.ts +3 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/20_testing.ts +100 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/api/Users.ts +30 -14
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/domain/User.ts +15 -6
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/server/Authorization.ts +11 -10
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/server/Users/http.ts +41 -32
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/server/Users.ts +141 -20
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/70_cli/10_basics.ts +31 -5
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.d.ts.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js +10 -9
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.d.ts.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.js +12 -9
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.js.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocket.js +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocket.js.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocketServer.js +4 -4
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocketServer.js.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeStream.d.ts.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeStream.js +10 -4
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeStream.js.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.d.ts +4 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.d.ts.map +1 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.js +10 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.js.map +1 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +7 -7
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeChildProcessSpawner.ts +16 -11
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeClusterSocket.ts +15 -12
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeSocket.ts +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeSocketServer.ts +4 -4
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeStream.ts +10 -4
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/internal/nodeChildProcessSpawner.ts +16 -0
- package/server/node_modules/@types/node/README.md +1 -1
- package/server/node_modules/@types/node/buffer.buffer.d.ts +5 -5
- package/server/node_modules/@types/node/crypto.d.ts +2 -2
- package/server/node_modules/@types/node/http.d.ts +16 -0
- package/server/node_modules/@types/node/http2.d.ts +10 -2
- package/server/node_modules/@types/node/package.json +2 -2
- package/server/node_modules/@types/node/process.d.ts +52 -0
- package/server/node_modules/@types/node/quic.d.ts +210 -28
- package/server/node_modules/@types/node/sqlite.d.ts +6 -2
- package/server/node_modules/@types/node/test.d.ts +36 -0
- package/server/node_modules/ansi-regex/index.js +3 -2
- package/server/node_modules/ansi-regex/package.json +1 -1
- package/server/node_modules/effect/node_modules/uuid/README.md +19 -19
- package/server/node_modules/effect/node_modules/uuid/dist/v1.js +7 -3
- package/server/node_modules/effect/node_modules/uuid/dist/v7.js +5 -2
- package/server/node_modules/effect/node_modules/uuid/dist-node/v1.js +7 -3
- package/server/node_modules/effect/node_modules/uuid/dist-node/v7.js +5 -2
- package/server/node_modules/effect/node_modules/uuid/package.json +4 -3
- package/server/node_modules/gaxios/build/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/server/node_modules/gaxios/build/esm/tsconfig.tsbuildinfo +1 -1
- package/server/node_modules/gaxios/package.json +3 -3
- package/server/node_modules/msgpackr/dist/index-no-eval.cjs +11 -5
- package/server/node_modules/msgpackr/dist/index-no-eval.cjs.map +1 -1
- package/server/node_modules/msgpackr/dist/index-no-eval.min.js +1 -1
- package/server/node_modules/msgpackr/dist/index-no-eval.min.js.map +1 -1
- package/server/node_modules/msgpackr/dist/index.js +11 -5
- package/server/node_modules/msgpackr/dist/index.js.map +1 -1
- package/server/node_modules/msgpackr/dist/index.min.js +1 -1
- package/server/node_modules/msgpackr/dist/index.min.js.map +1 -1
- package/server/node_modules/msgpackr/dist/node.cjs +11 -5
- package/server/node_modules/msgpackr/dist/node.cjs.map +1 -1
- package/server/node_modules/msgpackr/dist/test.js +11 -5
- package/server/node_modules/msgpackr/dist/test.js.map +1 -1
- package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs +11 -5
- package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs.map +1 -1
- package/server/node_modules/msgpackr/package.json +1 -1
- package/server/node_modules/msgpackr/unpack.js +11 -5
- package/server/node_modules/picomatch/lib/parse.js +10 -1
- package/server/node_modules/picomatch/lib/scan.js +30 -18
- package/server/node_modules/picomatch/package.json +1 -1
- package/server/{orphan-proposed-reconciler-BAE5AZ_e.js → orphan-proposed-reconciler-CnP0K2v3.js} +2 -2
- package/server/{orphan-proposed-reconciler-cV3URUqk.js → orphan-proposed-reconciler-nFUlquZt.js} +24 -23
- package/server/package-lock.json +25 -25
- package/server/package.json +1 -1
- package/server/{pan-dir-DDd91kMb.js → pan-dir-B4NfzOf3.js} +5 -5
- package/server/{deacon-merge-BOGFEV8_.js → parked-residue-8WbU0y1z.js} +188 -69
- package/server/{paths-CRLnDgcI.js → paths-rETQhTF2.js} +2 -2
- package/server/{pending-lifecycle-claim-CYgMiDAP.js → pending-lifecycle-claim-yAwDuGS4.js} +2 -2
- package/server/{pickup-BjJsSX12.js → pickup-Dle6k9Xt.js} +1 -1
- package/server/{pipeline-agent-reader-BLc43dVJ.js → pipeline-agent-reader-CeWhQzXC.js} +5 -5
- package/server/{pipeline-membership-BHZp_ShY.js → pipeline-membership-BV4hdkHm.js} +1 -1
- package/server/{pipeline-membership-5qlRz5Qg.js → pipeline-membership-C9ykcjsn.js} +1 -1
- package/server/{pipeline-membership-gather-CGFY1v-y.js → pipeline-membership-gather-Ba0wJNCR.js} +17 -12
- package/server/{pipeline-membership-gather-WhRc1yke.js → pipeline-membership-gather-C9E22B2W.js} +1 -1
- package/server/{pipeline-notifier-C4fZ2ito.js → pipeline-notifier-B5DPXvnr.js} +1 -1
- package/server/{pipeline-notifier-BmsLWM_2.js → pipeline-notifier-p190L97e.js} +2 -2
- package/server/{post-merge-lifecycle-worker-KK1RTKRE.js → post-merge-lifecycle-worker-OQoK8Ckg.js} +3 -3
- package/server/{post-merge-state-_Lj3LDLh.js → post-merge-state-DFaf7OI1.js} +4 -4
- package/server/prd-locations-F2oLSAhy.js +124 -0
- package/server/{project-pipelines-CCkebHOu.js → project-pipelines-CUsa6U59.js} +2 -2
- package/server/project-repos-BVdi9-ch.js +3 -0
- package/server/{project-repos-B4MK48j4.js → project-repos-CsfvLtmr.js} +29 -3
- package/server/project-resource-refresh-queue-BehrH4Ai.js +865 -0
- package/server/project-resource-refresh-queue-D2110Guc.js +2 -0
- package/server/{projects-DvPEAP18.js → projects-BMuEf14J.js} +1 -1
- package/server/{prompts-BiS5I2tZ.js → prompts-CKpDt8Jn.js} +2 -2
- package/server/providers-Buv2wmFU.js +3 -0
- package/server/{providers-DrfK0Ip8.js → providers-CxPKmyif.js} +7 -7
- package/server/public/assets/{chunk-BO2N2NFS-GtVe_o56.js → chunk-BO2N2NFS-DZOQVqV1.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-BvhcYYHc.js → diagram-OG6HWLK6-oKeXcbO1.js} +1 -1
- package/server/public/assets/{dist-CSmUXazd.js → dist-2qPmeRzT.js} +3 -3
- package/server/public/assets/{dist-D0ryefak.js → dist-ClBlE-Nm.js} +1 -1
- package/server/public/assets/{ganttDiagram-6RSMTGT7-BXA51DzM.js → ganttDiagram-6RSMTGT7-BwdG9fQv.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-mlV4EpWt.js → highlighted-body-OFNGDK62-BzGNdskQ.js} +1 -1
- package/server/public/assets/index-CdPveU3M.css +1 -0
- package/server/public/assets/index-Cg6tdZoY.js +860 -0
- package/server/public/assets/{linear-BPE7oswm.js → linear-DpEt1TJb.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-6KBD_3T_.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-BguGGV3S.js → pieDiagram-4H26LBE5-9BpM4oRJ.js} +1 -1
- package/server/public/assets/{prod-aKDYUrXQ.js → prod-CzJiNNEG.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-Bx3i4B6H.js → quadrantDiagram-W4KKPZXB-BXWVAoZx.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-B5vuLjA4.js → sankeyDiagram-5OEKKPKP-5oxodGEw.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-HPlpkqsN.js → xychartDiagram-2RQKCTM6-BChDrHxZ.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/pull-requests-CmlandI7.js +2 -0
- package/server/{pull-requests-BcHIsFJv.js → pull-requests-T0OV0Vn4.js} +3 -3
- package/server/{rally-B1OMtzch.js → rally-CUqj2oIN.js} +3 -3
- package/server/rally-DYIn9R2U.js +3 -0
- package/server/{rally-api-ShZ4kvn0.js → rally-api-BFPb2oSq.js} +2 -2
- package/server/{rally-api-u_vkr5c_.js → rally-api-BoucQG1u.js} +1 -1
- package/server/{rally-client-D6Feq1Ka.js → rally-client-16iObny7.js} +5 -5
- package/server/{rally-client-DgZvUZqX.js → rally-client-CsqLjLLa.js} +1 -1
- package/server/{reap-terminal-sessions-CRfiXLY0.js → reap-terminal-sessions-BaDSNR-k.js} +2 -2
- package/server/{reap-terminal-sessions-D7f3zSE9.js → reap-terminal-sessions-DgEIKMhH.js} +2 -2
- package/server/{rebuild-stack-CCwKHZb6.js → rebuild-stack-BcBVFJp3.js} +2 -2
- package/server/{rebuild-stack-DKxOnkpE.js → rebuild-stack-CyXMrj6K.js} +7 -7
- package/server/reconciler-caYiRnPy.js +657 -0
- package/server/{reconstruct-cache-BP8UIKt7.js → reconstruct-cache-3JzPOune.js} +7 -7
- package/server/{record-By-wp6pg.js → record-DYOg97Iv.js} +1 -1
- package/server/{record-update-D23jPU6b.js → record-update-BPqpBu3O.js} +9 -7
- package/server/{record-update-ByGtIlUK.js → record-update-CDPEX7BH.js} +1 -1
- package/server/{recovery-trip-C4dTl8DO.js → recovery-trip-CpfW6LCJ.js} +43 -10
- package/server/{recovery-trip-qloOYOFz.js → recovery-trip-xqKC07Gy.js} +1 -1
- package/server/{release-engine-Crc0Tjx-.js → release-engine-C_OOhCaK.js} +5 -5
- package/server/{release-set-DDXwbIK7.js → release-set-DOIDz2vw.js} +3 -3
- package/server/{remote-oEMfXlwT.js → remote-BTh-sjpX.js} +3 -3
- package/server/{remote-agents-Bgtc2nOO.js → remote-agents-DbbN7vSm.js} +6 -6
- package/server/{remote-agents-DQVGZVQ9.js → remote-agents-MuXx2gWm.js} +1 -1
- package/server/{remote-completion-DxUJ5HKR.js → remote-completion-LcWCpAm2.js} +13 -13
- package/server/{remote-CBpLi4Yy.js → remote-xY0B43Ho.js} +3 -3
- package/server/{resolver-CuAULbLs.js → resolver-C2QKOf09.js} +2 -2
- package/server/{resolver-C8rooxoz.js → resolver-D4nsxfGo.js} +31 -8
- package/server/resume-ByUrJUNX.js +3 -0
- package/server/{review-agent-7C2w5CzU.js → review-agent-BRBTm1qE.js} +43 -55
- package/server/review-agent-Caodi0PX.js +3 -0
- package/server/{review-artifacts-BJeEfm2r.js → review-artifacts-DgaDlbO4.js} +6 -6
- package/server/{review-convoy-liveness-DfF9eXjI.js → review-convoy-liveness-BBvyuRLC.js} +20 -11
- package/server/{review-run-recovery-ZjuDTNhZ.js → review-run-recovery-DCzWMMvE.js} +1 -1
- package/server/{review-run-recovery-7BKt2Es0.js → review-run-recovery-THHMKlXJ.js} +3 -3
- package/server/{review-status-CUnjjOUu.js → review-status-Bge_3XTR.js} +1 -1
- package/server/{review-status-DBnR5t4z.js → review-status-DpniqzPT.js} +113 -44
- package/server/{review-status-emit-Cg4tOb8U.js → review-status-emit-D7sM720S.js} +3 -3
- package/server/{review-status-enrichment-D-rQshu6.js → review-status-enrichment-PDI4-faj.js} +3 -3
- package/server/{review-status-source-DSn0glLa.js → review-status-source-D2PCWS6E.js} +1 -1
- package/server/{review-status-source-Ct912fv_.js → review-status-source-Jq0BXmn3.js} +1 -1
- package/server/{review-status-sync-B7V_Gg51.js → review-status-sync-C6ZKTI8f.js} +11 -8
- package/server/{review-status-sync-YthpOH_q.js → review-status-sync-CvpHWyvR.js} +1 -1
- package/server/{review-verdict-feedback-C-dBon_-.js → review-verdict-feedback-B2ojHFH5.js} +8 -8
- package/server/{review-verdict-feedback-DqXTuJk8.js → review-verdict-feedback-tyMoLT2L.js} +1 -1
- package/server/{review-verdict-writer-CKaJWp75.js → review-verdict-writer-Cy_1pnIj.js} +7 -7
- package/server/{review-verdict-writer-jldSh3Bm.js → review-verdict-writer-DjrJ64eS.js} +1 -1
- package/server/{rollup-DZwH4CLs.js → rollup-Cp0KEoOu.js} +1 -1
- package/server/{rollup-QCwYcBdP.js → rollup-DU3xBQu2.js} +8 -8
- package/server/{scanner-2aHeLC3W.js → scanner-BFKG3Gxv.js} +8 -8
- package/server/{search-DwHYaj66.js → search-DhtKwbBC.js} +2 -2
- package/server/{secret-redaction-B5G1xZ3k.js → secret-redaction-DLZ-VqHq.js} +1 -1
- package/server/{sequence-io-POKWdusG.js → sequence-io-C-Q19Jez.js} +4 -4
- package/server/{sequencer-agent-DS00KHVm.js → sequencer-agent-eN2P2lDz.js} +6 -6
- package/server/server.js +1499 -1350
- package/server/{service-BLb_CyPL.js → service-CThO0Sar.js} +80 -774
- package/server/{session-fork-DcTzVwex.js → session-fork-ZYTHtpBh.js} +2 -2
- package/server/settings-ByDRfuuE.js +2 -0
- package/server/{settings-Clw8UVNs.js → settings-CTywpFw5.js} +2 -2
- package/server/{settings-B9-H2K_E.js → settings-nAT-eK56.js} +3 -3
- package/server/{shadow-engineering-C6oO_PiR.js → shadow-engineering-BHZKPJhq.js} +3 -3
- package/server/{shadow-state-CEGrrECe.js → shadow-state-BTLi4Axs.js} +2 -2
- package/server/{shadow-state-e7250VUx.js → shadow-state-CZ_LnPsi.js} +1 -1
- package/server/{shadow-utils-xFk2Wusb.js → shadow-utils-CPLlPHdn.js} +2 -2
- package/server/{ship-log-7BnQHuKU.js → ship-log-D-CphNZx.js} +1 -1
- package/server/{ship-record-CwUX6Afo.js → ship-record-BaBla0l_.js} +7 -7
- package/server/{ship-record-BgUPnpT0.js → ship-record-BlvX8-xv.js} +1 -1
- package/server/{ship-status-Ce3_3edi.js → ship-status-rQbPQBsF.js} +2 -2
- package/server/{smart-compaction-BmfIi3oL.js → smart-compaction-CUXn8mfX.js} +1 -1
- package/server/{smart-compaction-Dy0gw1VH.js → smart-compaction-D1CNGdZx.js} +7 -7
- package/server/{spawn-planning-session-nH3b4Drz.js → spawn-planning-session-DCmO6COk.js} +19 -19
- package/server/{spawn-planning-session-CfhxRJoY.js → spawn-planning-session-DfEWyrVV.js} +2 -2
- package/server/{specialist-completion-CC1XJbTx.js → specialist-completion-BMv3K54P.js} +1 -1
- package/server/{specialist-context-cHwpcXSh.js → specialist-context-C1-CfYQb.js} +5 -5
- package/server/{specialist-handoff-logger-GqnGSYoJ.js → specialist-handoff-logger-BDKoz5Z9.js} +2 -2
- package/server/{specialist-logs-5OTnrV91.js → specialist-logs-BJQFkpdG.js} +3 -3
- package/server/specialists-CYt1U3Zm.js +4 -0
- package/server/{specialists-8LcQi9Np.js → specialists-D6MUU31Q.js} +21 -272
- package/server/{specialists-DocAK-7A.js → specialists-DhS79T9v.js} +369 -691
- package/server/{specialists-xXcJHAyg.js → specialists-Dx0zRTxX.js} +1 -1
- package/server/specialists-registry-BRLCi61y.js +3 -0
- package/server/specialists-registry-Bng0OFGH.js +277 -0
- package/server/specs-oRGyfz6C.js +3 -0
- package/server/{src-C2TAxwki.js → src-C7gGe4KU.js} +6 -6
- package/server/{src-DudQNYVw.js → src-CdwN6WY6.js} +344 -7
- package/server/{src-DUVvEA8Q.js → src-DMosbuSJ.js} +3 -3
- package/server/{stack-health-DKT4ySnA.js → stack-health-BKfNaqMm.js} +3 -3
- package/server/{stack-health-CbyiYS9H.js → stack-health-Bz711z1Y.js} +1 -1
- package/server/{stale-task-claims-PzFee70R.js → stale-task-claims-DMRLb5R2.js} +5 -5
- package/server/{staleness-D8UTEXV5.js → staleness-CxZaIhrn.js} +1 -1
- package/server/{staleness-BjOAq9-d.js → staleness-r_dkMyMG.js} +1 -1
- package/server/{stall-sweeper-DOyIfeLR.js → stall-sweeper-CBWqSWV2.js} +8 -8
- package/server/{state-home-DhAZlk5k.js → state-home-DhsMqg8W.js} +2 -2
- package/server/{state-mapping-BVSs84bO.js → state-mapping-D2yC81Vy.js} +1 -1
- package/server/{state-migrate-CJKEwpB0.js → state-migrate-C2Ouyd6e.js} +6 -6
- package/server/{state-mirror-Do7pag7W.js → state-mirror-BPXciz84.js} +3 -3
- package/server/stuck-remediation-DALieAkx.js +2 -0
- package/server/stuck-remediation-kta3KN7c.js +774 -0
- package/server/{substrate-bug-weights-service-BTNjHBnl.js → substrate-bug-weights-service-D_ICP7TI.js} +3 -3
- package/server/{summary-fork-CvB7Oyq9.js → summary-fork-CojrFKb6.js} +2 -2
- package/server/{summary-fork-CZ88rhVx.js → summary-fork-DhhaFhxZ.js} +113 -30
- package/server/supervisor/{pane-composer-BaLLspSj.js → pane-composer-CoiVkGIt.js} +8 -1
- package/server/supervisor/{paths-D6XUcR_g.js → paths-DTGbtcaP.js} +8 -4
- package/server/supervisor/pty-supervisor.js +3 -3
- package/server/supervisor/{pty-token-DjjHxoCq.js → pty-token-GVqnvU3U.js} +2 -2
- package/server/supervisor-DSSWo4M2.js +2 -0
- package/server/{supervisor-D4v0WfiQ.js → supervisor-DqH-laVL.js} +4 -4
- package/server/{swarm-readiness-D8R-LWX5.js → swarm-readiness-LF8ZF_hc.js} +3 -3
- package/server/{synthesis-verdict-N5Z11pg7.js → synthesis-verdict-CGFF8uQI.js} +2 -2
- package/server/{synthesis-verdict-B6wvLGcA.js → synthesis-verdict-DSoOFUIV.js} +1 -1
- package/server/{system-prerequisites-BbGZ_WHF.js → system-prerequisites-Lsx0jUUV.js} +2 -2
- package/server/{teardown-workspace-CYend-KY.js → teardown-workspace-DMwomEG1.js} +16 -16
- package/server/{test-agent-queue-BUtWhNcc.js → test-agent-queue-Cu0D6BYe.js} +6 -6
- package/server/{test-verdict-BWm3hgDj.js → test-verdict-9mvl7pQn.js} +1 -1
- package/server/{test-verdict-BWtRmdiR.js → test-verdict-oNSv1rVr.js} +2 -2
- package/server/{tldr-daemon-CneJ24eL.js → tldr-daemon-CRSAkhBx.js} +1 -1
- package/server/{tldr-daemon-CMVBT4kT.js → tldr-daemon-McqCk2X7.js} +2 -2
- package/server/tmux-CYucGrTl.js +4 -0
- package/server/{tmux-BqXzRuaH.js → tmux-wnT_hg-s.js} +91 -19
- package/server/{token-CO3INKbh.js → token-BdfZLRg1.js} +2 -2
- package/server/{token-util-DyJJyX_B.js → token-util-Crcay9j_.js} +1 -1
- package/server/token-util-DfUS3Lpp.js +3 -0
- package/server/{tracker-config-DVzhaUxO.js → tracker-config-tfAOWgng.js} +2 -2
- package/server/{tracker-utils-xnVJVrrO.js → tracker-utils-Dbg_pVZg.js} +2 -2
- package/server/{traefik-connect-A5k54mCv.js → traefik-connect-DoQvQ6oJ.js} +1 -1
- package/server/{tunnel-DauSR-rs.js → tunnel-B1MNIgkL.js} +1 -1
- package/server/{tunnel-CwOnS-PB.js → tunnel-skW68j9B.js} +3 -3
- package/server/{typed-errors-B-gfU2RB.js → typed-errors-CZ3GFBvo.js} +1 -1
- package/server/{typed-errors-DzC4zXbI.js → typed-errors-DXqf3RnP.js} +1 -1
- package/server/{types-DjpLVpsj.js → types-PW4zkxCM.js} +1 -1
- package/server/{types-DbxY2QB6.js → types-pLpbsNto.js} +1 -1
- package/server/{uat-failure-feedback-BVqsWlrr.js → uat-failure-feedback-ly8ZwtfC.js} +5 -5
- package/server/{uat-promote-verification-DmG097QS.js → uat-promote-verification-BBaMwfdc.js} +5 -5
- package/server/{uat-train-DVUNW03P.js → uat-train-BBEiYSep.js} +0 -0
- package/server/{uat-train-COSy-vEX.js → uat-train-D7Ran2FB.js} +1 -1
- package/server/{validate-Dvv83iBx.js → validate-BYcBcBwg.js} +3 -3
- package/server/{validation-DlHafKzu.js → validation-BfG2jW5C.js} +9 -6
- package/server/{validation-BdCjzWLN.js → validation-nSrYiYvA.js} +1 -1
- package/server/{verification-artifact-CaSbxUVg.js → verification-artifact-Cmhgq4b_.js} +1 -1
- package/server/{verification-artifact-0Zku8N-W.js → verification-artifact-DglwaHke.js} +1 -1
- package/server/{verification-runner-DwP2fUEF.js → verification-runner-BEq5ZF-h.js} +53 -27
- package/server/{verification-runner-C6wdZda2.js → verification-runner-CFjAuv9u.js} +1 -1
- package/server/{vtt-parser-luerJpYT.js → vtt-parser-Va--tv27.js} +1 -1
- package/server/work-agent-prompt-BnhKNAg7.js +3 -0
- package/server/{work-agent-prompt--9AWNYwZ.js → work-agent-prompt-CaD2ue8m.js} +14 -14
- package/server/{work-agent-start-BNQO65W7.js → work-agent-start-0nJ-6UeA.js} +2 -2
- package/server/{work-agent-start-DkzseQFl.js → work-agent-start-D8NEN5KD.js} +1 -1
- package/server/workflows-BtHRlFIm.js +2 -0
- package/server/{workflows-BYwR2aIN.js → workflows-C7mxM1qc.js} +114 -41
- package/server/{workspace-iTnTycOB.js → workspace-BAhMgMaO.js} +3 -3
- package/server/{workspace-B-QJa3Ps.js → workspace-Dbqv9ehn.js} +1 -1
- package/server/{workspace-anchor-drift-CHiGg8iu.js → workspace-anchor-drift-B_3kyyxJ.js} +4 -4
- package/server/{workspace-anchor-drift-DTt6h2Em.js → workspace-anchor-drift-Bpa3xoni.js} +1 -1
- package/server/{workspace-config-D0CavVtz.js → workspace-config-D-bNq2CF.js} +1 -1
- package/server/{workspace-manager-5BKPV6SY.js → workspace-manager-BrbX90Rm.js} +1 -1
- package/server/{workspace-manager-W1OnbvU5.js → workspace-manager-CM8RCrSc.js} +17 -17
- package/server/{workspace-metadata-tbbevEmP.js → workspace-metadata-BEOwJSdK.js} +1 -1
- package/server/{workspace-metadata-dJhXvZGQ.js → workspace-metadata-Cu6yfxBS.js} +2 -2
- package/server/{workspaces-BlpbOPZ7.js → workspaces-C7LAuZfe.js} +140 -709
- package/sync-sources/dev-skills/pan-style-guide/SKILL.md +90 -15
- package/sync-sources/hooks/linear-mcp-auth-hook +6 -1
- package/sync-sources/rules/agent-message-delivery.md +21 -14
- package/sync-sources/rules/handoff-isolate-cwd.md +4 -4
- package/sync-sources/rules/pan-handoff-focus-limit.md +14 -5
- package/sync-sources/rules/ste-writing.md +17 -0
- package/sync-sources/rules/work-agents-via-pan.md +2 -1
- package/sync-sources/rules/writing-style.md +3 -2
- package/sync-sources/skills/{skill-creator → claude-skill-creator}/SKILL.md +1 -1
- package/sync-sources/skills/{skill-creator → claude-skill-creator}/scripts/init_skill.py +1 -1
- package/sync-sources/skills/{skill-creator → claude-skill-creator}/scripts/package_skill.py +1 -1
- package/sync-sources/skills/pan-gauntlet-loop/SKILL.md +230 -0
- package/sync-sources/skills/pan-gauntlet-loop/assets/PROMPT.template.md +92 -0
- package/sync-sources/skills/pan-gauntlet-loop/assets/REFERENCE-BAR.template.md +53 -0
- package/sync-sources/skills/pan-gauntlet-loop/assets/STYLE.template.md +41 -0
- package/sync-sources/skills/pan-gauntlet-loop/assets/gauntlet-index.html +237 -0
- package/sync-sources/skills/pan-gauntlet-loop/references/domains.md +106 -0
- package/sync-sources/skills/pan-handoff/SKILL.md +24 -6
- package/sync-sources/skills/pan-help/SKILL.md +1 -1
- package/sync-sources/skills/pan-peer-review/SKILL.md +3 -3
- package/sync-sources/skills/pan-restart/SKILL.md +6 -3
- package/sync-sources/skills/pan-start/SKILL.md +3 -0
- package/sync-sources/skills/pan-swarm/SKILL.md +32 -44
- package/sync-sources/skills/pan-sync/SKILL.md +1 -1
- package/server/activity-logger-BejO16Am.js +0 -3
- package/server/agent-state-DH_-Jkua.js +0 -3
- package/server/agents-megfmQHM.js +0 -3
- package/server/archive-planning-C-H9cM_J.js +0 -2
- package/server/build-info-PQlh_Rhb.js +0 -2
- package/server/cli-TaZspPHS.js +0 -2
- package/server/cliproxy-36ncAXlu.js +0 -3
- package/server/context-layers-CF6zHws4.js +0 -4
- package/server/conversations-AnGJ5rtX.js +0 -3
- package/server/deacon-BEH-IY0v.js +0 -5
- package/server/deacon-swarm-BHX-kR1b.js +0 -2
- package/server/deacon-swarm-BiLfNm_v.js +0 -1522
- package/server/dead-end-trip-BWpDg1Qd.js +0 -2
- package/server/delivery-cJM6zRjJ.js +0 -3
- package/server/deploy-queue-CmVBZEja.js +0 -2
- package/server/dist-VKBfkdi7.js +0 -3
- package/server/durable-review-pipeline-DgcVCYDL.js +0 -3
- package/server/factory-D4V2wd_V.js +0 -717
- package/server/forge-CrP1L3i6.js +0 -2
- package/server/hume-1ubD_6O7.js +0 -3
- package/server/inspect-agent-CfxERkNt.js +0 -2
- package/server/merge-ops-DtHx17Vd.js +0 -2
- package/server/merge-rebase-BvB4UuNS.js +0 -2
- package/server/project-repos-BJiShUsN.js +0 -3
- package/server/providers-CStNGwze.js +0 -3
- package/server/public/assets/index-BFEwfmqX.js +0 -860
- package/server/public/assets/index-_USwyTAT.css +0 -1
- package/server/public/assets/mermaid-GHXKKRXX-Dsln95SK.js +0 -1
- package/server/pull-requests-C1Cqp2yo.js +0 -2
- package/server/rally-CjayjUIl.js +0 -3
- package/server/resume-D7JuMCRQ.js +0 -3
- package/server/review-agent-BUNTVJK2.js +0 -2
- package/server/settings-DBWB1gsG.js +0 -2
- package/server/specialists-D8gsOCwh.js +0 -3
- package/server/specs-BqkrRnU9.js +0 -3
- package/server/stuck-remediation-Di5JYkoo.js +0 -1164
- package/server/stuck-remediation-TNM1VhZb.js +0 -2
- package/server/supervisor-DX8VsPnb.js +0 -2
- package/server/tmux-CqNapnrr.js +0 -4
- package/server/token-util-Bu8bPF9f.js +0 -3
- package/server/workflows-Cf4LAnhg.js +0 -2
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Testing HttpApi implementations
|
|
3
|
+
*
|
|
4
|
+
* Test handlers through an in-memory typed client with `HttpApiTest`, without
|
|
5
|
+
* starting an HTTP server or touching a real database.
|
|
6
|
+
*/
|
|
7
|
+
import { assert, layer } from "@effect/vitest"
|
|
8
|
+
import { Effect, Layer } from "effect"
|
|
9
|
+
import { HttpClientRequest, HttpServer } from "effect/unstable/http"
|
|
10
|
+
import { HttpApiMiddleware, HttpApiTest } from "effect/unstable/httpapi"
|
|
11
|
+
import { Api } from "./fixtures/api/Api.ts"
|
|
12
|
+
import { Authorization } from "./fixtures/api/Authorization.ts"
|
|
13
|
+
import { UserId } from "./fixtures/domain/User.ts"
|
|
14
|
+
import { AuthorizationLayer } from "./fixtures/server/Authorization.ts"
|
|
15
|
+
import { Users } from "./fixtures/server/Users.ts"
|
|
16
|
+
import { UsersApiHandlersNoDeps } from "./fixtures/server/Users/http.ts"
|
|
17
|
+
|
|
18
|
+
// Provide the handlers with the in-memory `Users` implementation, so the full
|
|
19
|
+
// HTTP pipeline is exercised without any SQL. The Authorization middleware is
|
|
20
|
+
// provided with `Layer.provideMerge`, because the HTTP pipeline also resolves
|
|
21
|
+
// it when the routes are built.
|
|
22
|
+
const HandlersLayer = UsersApiHandlersNoDeps.pipe(
|
|
23
|
+
Layer.provide(Users.layerMemory),
|
|
24
|
+
Layer.provideMerge(AuthorizationLayer)
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
// The client-side Authorization middleware supplies the bearer token.
|
|
28
|
+
// Providing different middleware implementations lets the tests cover both
|
|
29
|
+
// authorized and unauthorized requests.
|
|
30
|
+
const AuthorizationMiddlewareGood = HttpApiMiddleware.layerClient(
|
|
31
|
+
Authorization,
|
|
32
|
+
({ next, request }) => next(HttpClientRequest.bearerToken(request, "dev-token"))
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
const AuthorizationMiddlewareBad = HttpApiMiddleware.layerClient(
|
|
36
|
+
Authorization,
|
|
37
|
+
// Forward the request without attaching a token
|
|
38
|
+
({ next, request }) => next(request)
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
// `HttpApiTest.groups` builds a typed client wired directly to the handlers of
|
|
42
|
+
// the selected groups, using the same request encoding, routing, and response
|
|
43
|
+
// decoding as a real server.
|
|
44
|
+
const makeClient = HttpApiTest.groups(Api, ["users"])
|
|
45
|
+
|
|
46
|
+
// `HttpServer.layerServices` provides the platform services the HTTP pipeline
|
|
47
|
+
// needs in tests.
|
|
48
|
+
layer(Layer.mergeAll(HandlersLayer, HttpServer.layerServices))("UsersApi", (it) => {
|
|
49
|
+
it.effect("lists, fetches, and creates users", () =>
|
|
50
|
+
Effect.gen(function*() {
|
|
51
|
+
const client = yield* makeClient
|
|
52
|
+
|
|
53
|
+
const created = yield* client.users.create({
|
|
54
|
+
payload: { name: "Alice", email: "alice@acme.dev" }
|
|
55
|
+
})
|
|
56
|
+
assert.strictEqual(created.name, "Alice")
|
|
57
|
+
|
|
58
|
+
const fetched = yield* client.users.getById({
|
|
59
|
+
params: { id: created.id }
|
|
60
|
+
})
|
|
61
|
+
assert.deepStrictEqual(fetched, created)
|
|
62
|
+
|
|
63
|
+
const all = yield* client.users.list({ query: {} })
|
|
64
|
+
assert.isTrue(all.some((user) => user.id === created.id))
|
|
65
|
+
}).pipe(Effect.provide(AuthorizationMiddlewareGood)))
|
|
66
|
+
|
|
67
|
+
it.effect("returns a 404 for a missing user", () =>
|
|
68
|
+
Effect.gen(function*() {
|
|
69
|
+
const client = yield* makeClient
|
|
70
|
+
|
|
71
|
+
// Use Effect.flip to assert on the error channel
|
|
72
|
+
const error = yield* client.users.getById({
|
|
73
|
+
params: { id: UserId.make("019845e1-682f-4b02-a706-3b2422d13aec") }
|
|
74
|
+
}).pipe(Effect.flip)
|
|
75
|
+
assert.strictEqual(error._tag, "UserNotFound")
|
|
76
|
+
}).pipe(Effect.provide(AuthorizationMiddlewareGood)))
|
|
77
|
+
|
|
78
|
+
it.effect("rejects requests without a valid bearer token", () =>
|
|
79
|
+
Effect.gen(function*() {
|
|
80
|
+
const client = yield* makeClient
|
|
81
|
+
|
|
82
|
+
const error = yield* client.users.list({ query: {} }).pipe(Effect.flip)
|
|
83
|
+
assert.strictEqual(error._tag, "Unauthorized")
|
|
84
|
+
}).pipe(Effect.provide(AuthorizationMiddlewareBad)))
|
|
85
|
+
|
|
86
|
+
it.effect("rejects requests with an invalid bearer token", () =>
|
|
87
|
+
Effect.gen(function*() {
|
|
88
|
+
const client = yield* makeClient
|
|
89
|
+
|
|
90
|
+
const error = yield* client.users.getById({
|
|
91
|
+
params: { id: UserId.make("019845e1-682f-4b02-a706-3b2422d13aec") }
|
|
92
|
+
}).pipe(Effect.flip)
|
|
93
|
+
assert.strictEqual(error._tag, "Unauthorized")
|
|
94
|
+
}).pipe(
|
|
95
|
+
Effect.provide(HttpApiMiddleware.layerClient(
|
|
96
|
+
Authorization,
|
|
97
|
+
({ next, request }) => next(HttpClientRequest.bearerToken(request, "wrong-token"))
|
|
98
|
+
))
|
|
99
|
+
))
|
|
100
|
+
})
|
|
@@ -10,7 +10,10 @@ export class UsersApiGroup extends HttpApiGroup.make("users")
|
|
|
10
10
|
query: {
|
|
11
11
|
search: Schema.optional(Schema.String)
|
|
12
12
|
},
|
|
13
|
-
|
|
13
|
+
// Use the `json` variant of the model for API responses. It shares the
|
|
14
|
+
// field declarations with the database variants, but can encode values
|
|
15
|
+
// differently where needed.
|
|
16
|
+
success: Schema.Array(User.json)
|
|
14
17
|
}),
|
|
15
18
|
HttpApiEndpoint.get("search", "/search", {
|
|
16
19
|
// For get requests, payload uses the query string
|
|
@@ -18,7 +21,7 @@ export class UsersApiGroup extends HttpApiGroup.make("users")
|
|
|
18
21
|
search: Schema.String
|
|
19
22
|
},
|
|
20
23
|
success: [
|
|
21
|
-
Schema.Array(User),
|
|
24
|
+
Schema.Array(User.json),
|
|
22
25
|
Schema.String.pipe(HttpApiSchema.asText({
|
|
23
26
|
contentType: "text/csv"
|
|
24
27
|
}))
|
|
@@ -39,13 +42,12 @@ export class UsersApiGroup extends HttpApiGroup.make("users")
|
|
|
39
42
|
}),
|
|
40
43
|
HttpApiEndpoint.get("getById", "/:id", {
|
|
41
44
|
params: {
|
|
42
|
-
// Path parameter
|
|
43
|
-
// Schema.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
)
|
|
45
|
+
// Path parameter values are automatically coerced from their string
|
|
46
|
+
// form using `Schema.toCodecStringTree`, so schemas that decode from
|
|
47
|
+
// other types (like numbers) work here as well.
|
|
48
|
+
id: UserId
|
|
47
49
|
},
|
|
48
|
-
success: User,
|
|
50
|
+
success: User.json,
|
|
49
51
|
error: UserNotFound.pipe(
|
|
50
52
|
// If you want an error to return no content, you can use
|
|
51
53
|
// `HttpApiSchema.asNoContent` and provide a decoder that transforms the
|
|
@@ -59,14 +61,28 @@ export class UsersApiGroup extends HttpApiGroup.make("users")
|
|
|
59
61
|
// For post requests, payload uses the request body. It defaults to JSON,
|
|
60
62
|
// but you can specify other content types as well using
|
|
61
63
|
// `HttpApiSchema.asText`, `HttpApiSchema.asMultipart`, etc.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
success: User
|
|
64
|
+
//
|
|
65
|
+
// The `jsonCreate` variant only exposes the fields clients are allowed
|
|
66
|
+
// to provide, so the generated id and timestamps cannot be set here.
|
|
67
|
+
payload: User.jsonCreate,
|
|
68
|
+
success: User.json
|
|
69
|
+
}),
|
|
70
|
+
HttpApiEndpoint.patch("update", "/:id", {
|
|
71
|
+
params: {
|
|
72
|
+
id: UserId
|
|
73
|
+
},
|
|
74
|
+
// The `jsonUpdate` variant similarly excludes the id and the managed
|
|
75
|
+
// timestamps from the update payload.
|
|
76
|
+
payload: User.jsonUpdate,
|
|
77
|
+
success: User.json,
|
|
78
|
+
error: UserNotFound.pipe(
|
|
79
|
+
HttpApiSchema.asNoContent({
|
|
80
|
+
decode: () => new UserNotFound()
|
|
81
|
+
})
|
|
82
|
+
)
|
|
67
83
|
}),
|
|
68
84
|
HttpApiEndpoint.get("me", "/me", {
|
|
69
|
-
success: User,
|
|
85
|
+
success: User.json,
|
|
70
86
|
error: UserNotFound.pipe(HttpApiSchema.status(404))
|
|
71
87
|
})
|
|
72
88
|
)
|
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
import { Schema } from "effect"
|
|
2
|
+
import { Model } from "effect/unstable/schema"
|
|
2
3
|
|
|
3
|
-
export const UserId = Schema.
|
|
4
|
-
Schema.brand("UserId")
|
|
5
|
-
)
|
|
4
|
+
export const UserId = Schema.String.pipe(Schema.brand("UserId"))
|
|
6
5
|
export type UserId = typeof UserId.Type
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
// `Model.Class` derives variants for the database (`User`, `User.insert`,
|
|
8
|
+
// `User.update`) and the JSON API (`User.json`, `User.jsonCreate`,
|
|
9
|
+
// `User.jsonUpdate`) from a single field declaration.
|
|
10
|
+
export class User extends Model.Class<User>("User")({
|
|
11
|
+
// A UUID v4 primary key generated by the application on insert. It is
|
|
12
|
+
// excluded from the `jsonCreate` / `jsonUpdate` variants, so API clients can
|
|
13
|
+
// never set it.
|
|
14
|
+
id: Model.UuidV4Insert(UserId),
|
|
10
15
|
name: Schema.String,
|
|
11
|
-
email: Schema.String
|
|
16
|
+
email: Schema.String,
|
|
17
|
+
// Timestamps are managed by the model: set on insert, refreshed on update,
|
|
18
|
+
// and also excluded from the JSON create / update variants.
|
|
19
|
+
createdAt: Model.DateTimeInsert,
|
|
20
|
+
updatedAt: Model.DateTimeUpdate
|
|
12
21
|
}) {}
|
|
@@ -1,7 +1,16 @@
|
|
|
1
|
-
import { Effect, Layer, Redacted } from "effect"
|
|
1
|
+
import { DateTime, Effect, Layer, Redacted } from "effect"
|
|
2
2
|
import { Authorization, CurrentUser, Unauthorized } from "../api/Authorization.ts"
|
|
3
3
|
import { User, UserId } from "../domain/User.ts"
|
|
4
4
|
|
|
5
|
+
const fixedTimestamp = DateTime.makeUnsafe("2026-01-01T00:00:00Z")
|
|
6
|
+
const devUser = new User({
|
|
7
|
+
id: UserId.make("bf3dbe33-0ad2-4c9c-9c9e-733e57bdcbee"),
|
|
8
|
+
name: "Dev User",
|
|
9
|
+
email: "dev@acme.com",
|
|
10
|
+
createdAt: fixedTimestamp,
|
|
11
|
+
updatedAt: fixedTimestamp
|
|
12
|
+
})
|
|
13
|
+
|
|
5
14
|
// The implementation of the Authorization middleware. It is seperate from the
|
|
6
15
|
// service definition to avoid leaking it into a client.
|
|
7
16
|
export const AuthorizationLayer = Layer.effect(
|
|
@@ -21,15 +30,7 @@ export const AuthorizationLayer = Layer.effect(
|
|
|
21
30
|
|
|
22
31
|
// Provide the current user to the rest of the stack. This will be
|
|
23
32
|
// available in any endpoint or middleware that runs after this one.
|
|
24
|
-
return yield* Effect.provideService(
|
|
25
|
-
httpEffect,
|
|
26
|
-
CurrentUser,
|
|
27
|
-
new User({
|
|
28
|
-
id: UserId.make(1),
|
|
29
|
-
name: "Dev User",
|
|
30
|
-
email: "dev@acme.com"
|
|
31
|
-
})
|
|
32
|
-
)
|
|
33
|
+
return yield* Effect.provideService(httpEffect, CurrentUser, devUser)
|
|
33
34
|
})
|
|
34
35
|
})
|
|
35
36
|
})
|
|
@@ -5,49 +5,48 @@ import { CurrentUser } from "../../api/Authorization.ts"
|
|
|
5
5
|
import { AuthorizationLayer } from "../Authorization.ts"
|
|
6
6
|
import { Users } from "../Users.ts"
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
// The handlers without their dependencies provided, so tests can supply an
|
|
9
|
+
// alternative `Users` implementation.
|
|
10
|
+
export const UsersApiHandlersNoDeps = HttpApiBuilder.group(
|
|
9
11
|
Api,
|
|
10
12
|
"users",
|
|
11
13
|
Effect.fn(function*(handlers) {
|
|
12
14
|
const users = yield* Users
|
|
13
15
|
|
|
14
|
-
return handlers
|
|
15
|
-
|
|
16
|
+
return handlers.handleAll({
|
|
17
|
+
list: ({ query }) =>
|
|
16
18
|
users.list(query.search).pipe(
|
|
17
19
|
// The list endpoint expects no errors, so we convert any potential
|
|
18
20
|
// errors into a 500 Internal Server Error.
|
|
19
21
|
Effect.orDie
|
|
20
|
-
)
|
|
21
|
-
.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
// Internal Server Error.
|
|
37
|
-
Effect.die
|
|
38
|
-
)
|
|
22
|
+
),
|
|
23
|
+
search: Effect.fn(function*({ payload }) {
|
|
24
|
+
if (payload.search === "bad-request") {
|
|
25
|
+
// You can use the built in error types like any other
|
|
26
|
+
// Schema.TaggedError
|
|
27
|
+
return yield* new HttpApiError.RequestTimeout()
|
|
28
|
+
}
|
|
29
|
+
return yield* users.list(payload.search).pipe(
|
|
30
|
+
Effect.catchReason(
|
|
31
|
+
"UsersError",
|
|
32
|
+
"SearchQueryTooShort",
|
|
33
|
+
// Re-fail the "SearchQueryTooShort" reason
|
|
34
|
+
Effect.fail,
|
|
35
|
+
// All other reasons are unexpected, so we convert them into a 500
|
|
36
|
+
// Internal Server Error.
|
|
37
|
+
Effect.die
|
|
39
38
|
)
|
|
40
|
-
|
|
41
|
-
)
|
|
42
|
-
|
|
39
|
+
)
|
|
40
|
+
}),
|
|
41
|
+
getById: ({ params }) =>
|
|
43
42
|
users.getById(params.id).pipe(
|
|
44
43
|
// You can also use Effect.catchReasons to handle multiple error
|
|
45
44
|
// reasons at once
|
|
46
45
|
Effect.catchReasons("UsersError", {
|
|
47
46
|
UserNotFound: (e) => Effect.fail(e)
|
|
48
47
|
}, Effect.die)
|
|
49
|
-
)
|
|
50
|
-
|
|
48
|
+
),
|
|
49
|
+
create: ({ payload }) =>
|
|
51
50
|
users.create(payload).pipe(
|
|
52
51
|
Effect.orDie
|
|
53
52
|
// You could alse use Effect.unwrapReason to moves rror reasons up to
|
|
@@ -59,13 +58,23 @@ export const UsersApiHandlers = HttpApiBuilder.group(
|
|
|
59
58
|
// UserNotFound: Effect.die,
|
|
60
59
|
// SearchQueryTooShort: Effect.die
|
|
61
60
|
// })
|
|
62
|
-
)
|
|
63
|
-
|
|
61
|
+
),
|
|
62
|
+
update: ({ params, payload }) =>
|
|
63
|
+
users.update(params.id, payload).pipe(
|
|
64
|
+
Effect.catchReasons("UsersError", {
|
|
65
|
+
UserNotFound: (e) => Effect.fail(e)
|
|
66
|
+
}, Effect.die)
|
|
67
|
+
),
|
|
68
|
+
me: () =>
|
|
64
69
|
// The Authorization middleware provides the CurrentUser service, so we
|
|
65
70
|
// can access it here.
|
|
66
|
-
CurrentUser
|
|
71
|
+
CurrentUser
|
|
72
|
+
})
|
|
67
73
|
})
|
|
68
|
-
)
|
|
69
|
-
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
// The handlers with all dependencies provided, ready to serve. The SQL-backed
|
|
77
|
+
// `Users.layer` keeps the database wiring out of the server entrypoint.
|
|
78
|
+
export const UsersApiHandlers = UsersApiHandlersNoDeps.pipe(
|
|
70
79
|
Layer.provide([Users.layer, AuthorizationLayer])
|
|
71
80
|
)
|
|
@@ -1,28 +1,142 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { SqliteClient, SqliteMigrator } from "@effect/sql-sqlite-node"
|
|
2
|
+
import { Context, Effect, Layer, Schema } from "effect"
|
|
3
|
+
import { SqlClient, SqlModel, SqlSchema } from "effect/unstable/sql"
|
|
4
|
+
import { User } from "../domain/User.ts"
|
|
5
|
+
import type { UserId } from "../domain/User.ts"
|
|
3
6
|
import { SearchQueryTooShort, UserNotFound, UsersError } from "../domain/UserErrors.ts"
|
|
4
7
|
|
|
8
|
+
// The SqlClient layer determines which database the SQL implementation talks
|
|
9
|
+
// to. Swap it for another driver package to target a different database.
|
|
10
|
+
const SqlLayer = SqliteClient.layer({ filename: ":memory:" })
|
|
11
|
+
|
|
12
|
+
// Migrations are effects keyed by `<id>_<name>` that run once, in id order. A
|
|
13
|
+
// real application would keep each migration in its own file and load them
|
|
14
|
+
// with `SqliteMigrator.fromFileSystem` instead of an inline record.
|
|
15
|
+
const MigratorLayer = SqliteMigrator.layer({
|
|
16
|
+
loader: SqliteMigrator.fromRecord({
|
|
17
|
+
"0001_create_users": Effect.gen(function*() {
|
|
18
|
+
const sql = yield* SqlClient.SqlClient
|
|
19
|
+
yield* sql`
|
|
20
|
+
CREATE TABLE users (
|
|
21
|
+
id TEXT PRIMARY KEY,
|
|
22
|
+
name TEXT NOT NULL,
|
|
23
|
+
email TEXT NOT NULL,
|
|
24
|
+
createdAt TEXT NOT NULL,
|
|
25
|
+
updatedAt TEXT NOT NULL
|
|
26
|
+
)
|
|
27
|
+
`
|
|
28
|
+
})
|
|
29
|
+
})
|
|
30
|
+
})
|
|
31
|
+
|
|
5
32
|
export class Users extends Context.Service<Users, {
|
|
6
33
|
list(search: string | undefined): Effect.Effect<Array<User>, UsersError>
|
|
7
34
|
getById(id: UserId): Effect.Effect<User, UsersError>
|
|
8
|
-
create(input:
|
|
35
|
+
create(input: typeof User.jsonCreate.Type): Effect.Effect<User, UsersError>
|
|
36
|
+
update(id: UserId, input: typeof User.jsonUpdate.Type): Effect.Effect<User, UsersError>
|
|
9
37
|
}>()("acme/Users") {
|
|
10
|
-
|
|
38
|
+
// The SQL implementation only requires a `SqlClient`, so entrypoints and
|
|
39
|
+
// tests decide how the database is provided.
|
|
40
|
+
static readonly layerNoDeps = Layer.effect(
|
|
11
41
|
Users,
|
|
12
42
|
Effect.gen(function*() {
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
43
|
+
const sql = yield* SqlClient.SqlClient
|
|
44
|
+
|
|
45
|
+
// CRUD goes through a repository derived from the `User` model. Each
|
|
46
|
+
// operation uses the matching model variant to encode its input and
|
|
47
|
+
// decodes rows with the full model schema.
|
|
48
|
+
const repo = yield* SqlModel.makeRepository(User, {
|
|
49
|
+
tableName: "users",
|
|
50
|
+
spanPrefix: "Users",
|
|
51
|
+
idColumn: "id"
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
// Queries the repository does not cover are written with the `sql` tag
|
|
55
|
+
// and decoded with the model schema.
|
|
56
|
+
const listAll = SqlSchema.findAll({
|
|
57
|
+
Request: Schema.Void,
|
|
58
|
+
Result: User,
|
|
59
|
+
execute: () => sql`SELECT * FROM users ORDER BY createdAt`
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
const searchUsers = SqlSchema.findAll({
|
|
63
|
+
Request: Schema.String,
|
|
64
|
+
Result: User,
|
|
65
|
+
execute: (search) => {
|
|
66
|
+
const pattern = `%${search}%`
|
|
67
|
+
return sql`SELECT * FROM users WHERE name LIKE ${pattern} OR email LIKE ${pattern}`
|
|
68
|
+
}
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
const list = Effect.fn("Users.list")(function*(search: string | undefined) {
|
|
72
|
+
if (search === undefined || search.length === 0) {
|
|
73
|
+
return yield* Effect.orDie(listAll())
|
|
74
|
+
} else if (search.length < SearchQueryTooShort.minimumLength) {
|
|
75
|
+
return yield* new UsersError({
|
|
76
|
+
reason: new SearchQueryTooShort()
|
|
20
77
|
})
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
78
|
+
}
|
|
79
|
+
yield* Effect.annotateCurrentSpan({ search })
|
|
80
|
+
return yield* Effect.orDie(searchUsers(search))
|
|
81
|
+
})
|
|
24
82
|
|
|
25
|
-
const
|
|
83
|
+
const getById = Effect.fn("Users.getById")((id: UserId) =>
|
|
84
|
+
repo.findById(id).pipe(
|
|
85
|
+
Effect.catchTags({
|
|
86
|
+
NoSuchElementError: () => new UsersError({ reason: new UserNotFound() }),
|
|
87
|
+
// Database and encoding failures are unexpected, so treat them as
|
|
88
|
+
// defects to keep the service interface focused on domain errors.
|
|
89
|
+
SchemaError: Effect.die,
|
|
90
|
+
SqlError: Effect.die
|
|
91
|
+
})
|
|
92
|
+
)
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
const create = Effect.fn("Users.create")((input: typeof User.jsonCreate.Type) =>
|
|
96
|
+
// `User.insert.makeEffect` fills in the generated id and timestamps
|
|
97
|
+
// using the Effect clock, so tests can control them with `TestClock`.
|
|
98
|
+
User.insert.makeEffect(input).pipe(
|
|
99
|
+
Effect.flatMap(repo.insert),
|
|
100
|
+
Effect.orDie
|
|
101
|
+
)
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
const update = Effect.fn("Users.update")(function*(id: UserId, input: typeof User.jsonUpdate.Type) {
|
|
105
|
+
// Ensure the user exists first, so a missing id fails with the domain
|
|
106
|
+
// error instead of a defect.
|
|
107
|
+
yield* getById(id)
|
|
108
|
+
const update = yield* User.update.makeEffect({ id, ...input }).pipe(Effect.orDie)
|
|
109
|
+
return yield* repo.update(update).pipe(Effect.orDie)
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
return Users.of({ list, getById, create, update })
|
|
113
|
+
})
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
// The fully provided SQL implementation: the database client and migrations
|
|
117
|
+
// are implementation details, so this layer requires nothing.
|
|
118
|
+
static readonly layer: Layer.Layer<Users> = this.layerNoDeps.pipe(
|
|
119
|
+
Layer.provide(MigratorLayer.pipe(Layer.provideMerge(SqlLayer))),
|
|
120
|
+
Layer.orDie
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
// An in-memory implementation for tests, so the HTTP stack can be exercised
|
|
124
|
+
// without a database.
|
|
125
|
+
static readonly layerMemory = Layer.effect(
|
|
126
|
+
Users,
|
|
127
|
+
Effect.gen(function*() {
|
|
128
|
+
const users = new Map<UserId, User>()
|
|
129
|
+
|
|
130
|
+
const makeUser = (input: typeof User.jsonCreate.Type) =>
|
|
131
|
+
User.insert.makeEffect(input).pipe(
|
|
132
|
+
Effect.map((user) => new User(user)),
|
|
133
|
+
Effect.orDie
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
const admin = yield* makeUser({ name: "Admin", email: "admin@acme.dev" })
|
|
137
|
+
users.set(admin.id, admin)
|
|
138
|
+
|
|
139
|
+
const list = Effect.fn("Users.list")(function*(search: string | undefined) {
|
|
26
140
|
const allUsers = Array.from(users.values())
|
|
27
141
|
if (search === undefined || search.length === 0) {
|
|
28
142
|
return allUsers
|
|
@@ -38,7 +152,7 @@ export class Users extends Context.Service<Users, {
|
|
|
38
152
|
)
|
|
39
153
|
})
|
|
40
154
|
|
|
41
|
-
const getById = Effect.fn("
|
|
155
|
+
const getById = Effect.fn("Users.getById")(function*(id: UserId) {
|
|
42
156
|
yield* Effect.annotateCurrentSpan({ id })
|
|
43
157
|
const user = users.get(id)
|
|
44
158
|
if (user === undefined) {
|
|
@@ -49,14 +163,21 @@ export class Users extends Context.Service<Users, {
|
|
|
49
163
|
return user
|
|
50
164
|
})
|
|
51
165
|
|
|
52
|
-
const create = Effect.fn("
|
|
53
|
-
const
|
|
54
|
-
const user = new User({ id: UserId.make(id), ...input })
|
|
166
|
+
const create = Effect.fn("Users.create")(function*(input: typeof User.jsonCreate.Type) {
|
|
167
|
+
const user = yield* makeUser(input)
|
|
55
168
|
users.set(user.id, user)
|
|
56
169
|
return user
|
|
57
170
|
})
|
|
58
171
|
|
|
59
|
-
|
|
172
|
+
const update = Effect.fn("Users.update")(function*(id: UserId, input: typeof User.jsonUpdate.Type) {
|
|
173
|
+
const existing = yield* getById(id)
|
|
174
|
+
const update = yield* User.update.makeEffect({ id, ...input }).pipe(Effect.orDie)
|
|
175
|
+
const updated = new User({ ...existing, ...update })
|
|
176
|
+
users.set(id, updated)
|
|
177
|
+
return updated
|
|
178
|
+
})
|
|
179
|
+
|
|
180
|
+
return Users.of({ list, getById, create, update })
|
|
60
181
|
})
|
|
61
182
|
)
|
|
62
183
|
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* handlers into a single executable command.
|
|
6
6
|
*/
|
|
7
7
|
import { NodeRuntime, NodeServices } from "@effect/platform-node"
|
|
8
|
-
import { Console, Effect } from "effect"
|
|
8
|
+
import { Console, Effect, Option, Schema } from "effect"
|
|
9
9
|
import { Argument, Command, Flag } from "effect/unstable/cli"
|
|
10
10
|
|
|
11
11
|
// You can define flags outside of commands and reuse them across multiple
|
|
@@ -23,24 +23,41 @@ const tasks = Command.make("tasks").pipe(
|
|
|
23
23
|
workspace,
|
|
24
24
|
verbose: Flag.boolean("verbose").pipe(
|
|
25
25
|
Flag.withAlias("v"),
|
|
26
|
-
Flag.withDescription("Print diagnostic output")
|
|
26
|
+
Flag.withDescription("Print diagnostic output"),
|
|
27
|
+
Flag.withDefault(false)
|
|
27
28
|
)
|
|
28
29
|
}),
|
|
29
30
|
Command.withDescription("Track and manage tasks")
|
|
30
31
|
)
|
|
31
32
|
|
|
33
|
+
// Arguments and flags parse plain strings; use `withSchema` to validate or
|
|
34
|
+
// transform the parsed value with any schema.
|
|
35
|
+
const Email = Schema.String.pipe(
|
|
36
|
+
Schema.check(Schema.isPattern(/^[^\s@]+@[^\s@]+\.[^\s@]+$/, {
|
|
37
|
+
message: "Expected a valid email address"
|
|
38
|
+
}))
|
|
39
|
+
)
|
|
40
|
+
|
|
32
41
|
const create = Command.make(
|
|
33
42
|
"create",
|
|
34
43
|
{
|
|
35
44
|
title: Argument.string("title").pipe(
|
|
36
|
-
Argument.withDescription("Task title")
|
|
45
|
+
Argument.withDescription("Task title"),
|
|
46
|
+
// Reject empty titles at parse time, so the handler only ever sees
|
|
47
|
+
// valid input
|
|
48
|
+
Argument.withSchema(Schema.NonEmptyString)
|
|
37
49
|
),
|
|
38
50
|
priority: Flag.choice("priority", ["low", "normal", "high"]).pipe(
|
|
39
51
|
Flag.withDescription("Priority for the new task"),
|
|
40
52
|
Flag.withDefault("normal")
|
|
53
|
+
),
|
|
54
|
+
assignee: Flag.string("assignee").pipe(
|
|
55
|
+
Flag.withDescription("Email address of the person to assign"),
|
|
56
|
+
Flag.withSchema(Email),
|
|
57
|
+
Flag.optional
|
|
41
58
|
)
|
|
42
59
|
},
|
|
43
|
-
Effect.fn(function*({
|
|
60
|
+
Effect.fn(function*({ assignee, priority, title }) {
|
|
44
61
|
// Subcommands can read parent command input by yielding the parent command.
|
|
45
62
|
const root = yield* tasks
|
|
46
63
|
|
|
@@ -49,6 +66,10 @@ const create = Command.make(
|
|
|
49
66
|
}
|
|
50
67
|
|
|
51
68
|
yield* Console.log(`Created "${title}" in ${root.workspace} with ${priority} priority`)
|
|
69
|
+
|
|
70
|
+
if (Option.isSome(assignee)) {
|
|
71
|
+
yield* Console.log(`Assigned to ${assignee.value}`)
|
|
72
|
+
}
|
|
52
73
|
})
|
|
53
74
|
).pipe(
|
|
54
75
|
Command.withDescription("Create a task"),
|
|
@@ -56,6 +77,10 @@ const create = Command.make(
|
|
|
56
77
|
{
|
|
57
78
|
command: "tasks create \"Ship 4.0\" --priority high",
|
|
58
79
|
description: "Create a high-priority task"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
command: "tasks create \"Ship 4.0\" --assignee dev@acme.com",
|
|
83
|
+
description: "Create a task assigned to a team member"
|
|
59
84
|
}
|
|
60
85
|
])
|
|
61
86
|
)
|
|
@@ -68,7 +93,8 @@ const list = Command.make(
|
|
|
68
93
|
Flag.withDefault("open")
|
|
69
94
|
),
|
|
70
95
|
json: Flag.boolean("json").pipe(
|
|
71
|
-
Flag.withDescription("Print machine-readable output")
|
|
96
|
+
Flag.withDescription("Print machine-readable output"),
|
|
97
|
+
Flag.withDefault(false)
|
|
72
98
|
)
|
|
73
99
|
},
|
|
74
100
|
Effect.fn(function*({ status, json }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeChildProcessSpawner.d.ts","sourceRoot":"","sources":["../src/NodeChildProcessSpawner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAA;AAIxC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AAMnC,OAAO,KAAK,YAAY,MAAM,sCAAsC,CAAA;AAEpE,OAAO,EACL,mBAAmB,EAKpB,MAAM,6CAA6C,CAAA;
|
|
1
|
+
{"version":3,"file":"NodeChildProcessSpawner.d.ts","sourceRoot":"","sources":["../src/NodeChildProcessSpawner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAA;AAIxC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AAMnC,OAAO,KAAK,YAAY,MAAM,sCAAsC,CAAA;AAEpE,OAAO,EACL,mBAAmB,EAKpB,MAAM,6CAA6C,CAAA;AAymBpD;;;;;GAKG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAC7B,mBAAmB,EACnB,KAAK,EACL,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CACQ,CAAA;AAM3C;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,qBAAqB,CAAC,YAAY,CAAC,eAAe,CAAC,CAAA;IAC1E,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,CAAA;CAC9D;AAED;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,YAChB,YAAY,CAAC,OAAO,KAC5B,iBAoCF,CAAA"}
|