@overdeck/desktop 0.45.23 → 0.46.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 +34 -0
- package/package.json +1 -1
- package/server/{acceptance-criteria-DOA0KgXx.js → acceptance-criteria-CCwFGICj.js} +2 -2
- package/server/activity-logger-CMthG6Vd.js +3 -0
- package/server/{activity-logger-DDlOIAML.js → activity-logger-CyteR4JO.js} +24 -13
- package/server/{advancing-selfheal-BBu6DSNm.js → advancing-selfheal-De1L-Sb4.js} +6 -6
- package/server/{agent-gc-BV1q_2EV.js → agent-gc-CBULruzm.js} +5 -5
- package/server/agent-state-VQk8fY9F.js +3 -0
- package/server/{agent-state-service-HoK8U4jW.js → agent-state-service-BlnSkRFA.js} +5 -5
- package/server/{agent-state-service-CnzFKSAQ.js → agent-state-service-hZpxIw1E.js} +1 -1
- package/server/agents-BKKkxKgK.js +3 -0
- package/server/{agents-B4Bjbkfv.js → agents-C5rWYhb6.js} +4 -4
- package/server/archive-planning-0FJ6Xd3b.js +2 -0
- package/server/{archive-planning-DYrYojxl.js → archive-planning-C0lAbNB_.js} +16 -24
- package/server/{artifact-index-jobs-C-xy7Z5v.js → artifact-index-jobs-ug6ZxIP5.js} +2 -2
- package/server/assemble-DnffNpOo.js +339 -0
- package/server/{backlog-auto-trigger-GtG71X8H.js → backlog-auto-trigger-Dh-i9PQf.js} +3 -3
- package/server/{behavior-B_-4EKF3.js → behavior-CfIg6pKp.js} +2 -2
- package/server/bridge-pool-patrol-CUFmjVDN.js +136 -0
- package/server/{briefing-freshness-DWdW7vUm.js → briefing-freshness-DHmCSLar.js} +2 -2
- package/server/{build-info-DgTqZkL5.js → build-info-BP160gU7.js} +1 -1
- package/server/{build-info-BT096lEl.js → build-info-CuFfxZxp.js} +5 -3
- package/server/{checkpoint-manager-DDqcGyu8.js → checkpoint-manager-DEWD82qK.js} +2 -2
- package/server/{checkpoint-manager-B7Bt29J0.js → checkpoint-manager-Dxh0FYsv.js} +1 -1
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-C-AXLfYT.js → checkpoints-CZvbtLnr.js} +2 -2
- package/server/{checkpoints-CpgCjAlN.js → checkpoints-DMTgXuLG.js} +1 -1
- package/server/{claude-hooks-provision-C8wdRnN1.js → claude-hooks-provision-CN-xo-do.js} +1 -1
- package/server/{claude-hooks-provision-but-_qGY.js → claude-hooks-provision-fvy4RD2b.js} +13 -2
- package/server/{claude-permissions-H_5wHQZQ.js → claude-permissions-CN0cSCPp.js} +2 -2
- package/server/{claude-settings-overlay-CbSz0Dvb.js → claude-settings-overlay-CJn35FHQ.js} +2 -2
- package/server/{claude-settings-overlay-BTENVmYf.js → claude-settings-overlay-Dabi9slj.js} +1 -1
- package/server/cli-DmXETsw-.js +3 -0
- package/server/{cli-vBeXbPrq.js → cli-oCWYA1pE.js} +9 -9
- package/server/{cliproxy-Bgb2XCqi.js → cliproxy-C8mB3KuB.js} +2 -2
- package/server/{cliproxy-DW0V86F8.js → cliproxy-PGwTX_o8.js} +1 -1
- package/server/{close-issue-Dn_4c4G8.js → close-issue-D5MF5GqF.js} +5 -5
- package/server/{closed-issue-reaper-CWpY2uBw.js → closed-issue-reaper-CJ24u0Zt.js} +1 -1
- package/server/{closed-issue-reaper-hANY_ehE.js → closed-issue-reaper-Cltx86x5.js} +37 -16
- package/server/{codex-Dg7Is5yb.js → codex-BdEsUFWh.js} +1 -1
- package/server/{codex-TmSi-yTv.js → codex-Drlf5Xhf.js} +37 -8
- package/server/{codex-parser-C4gSH-IR.js → codex-parser-DpB89Vqa.js} +2 -2
- package/server/compaction-continuation-K2AxQX4H.js +200 -0
- package/server/{config-DjLOdbgT.js → config-B2IMcBxx.js} +4 -3
- package/server/{config-DUIhMN_T.js → config-DV-grfQc.js} +1 -1
- package/server/{config-CCvjQf27.js → config-Dr3pW6w6.js} +2 -2
- package/server/{config-yaml-DvyMuOle.js → config-yaml-CmOPzmBb.js} +290 -22
- package/server/{conflict-gate-CmrYpa47.js → conflict-gate-B9cN3SBi.js} +4 -4
- package/server/{conflict-gate-BSJkNTdp.js → conflict-gate-Dh754uyA.js} +1 -1
- package/server/context-layers-D6LZo3l1.js +4 -0
- package/server/context-layers-dR5YxHYB.js +37 -0
- package/server/{control-settings-aP1ANIlI.js → control-settings-C7DUehE1.js} +49 -19
- package/server/{conversation-compaction-CNbTLB86.js → conversation-compaction-BoqdDXWF.js} +8 -8
- package/server/{conversation-compaction-DiG5zWQq.js → conversation-compaction-Dj4FAKoZ.js} +1 -1
- package/server/{conversation-service-Du-MTNpJ.js → conversation-service-5aCnq1zR.js} +331 -20
- package/server/conversation-service-BCxl4f8Z.js +3 -0
- package/server/{conversations-DbOs1e9Q.js → conversations-BUpYsOZg.js} +5 -5
- package/server/{conversations-6mPANqvL.js → conversations-C34dyIb9.js} +1 -1
- package/server/{cost-Ca0YTWDw.js → cost-Bgcub5kW.js} +12 -2
- package/server/{cost-CW4WSe72.js → cost-CvxRrucd.js} +3 -3
- package/server/{cost-sync-C0VdGme1.js → cost-sync-Dv3LUaNW.js} +3 -3
- package/server/{dag-CdOjJVDT.js → dag-ombYYt4s.js} +2 -2
- package/server/{dangerous-git-ops-CT-IypG3.js → dangerous-git-ops-BcJPC5Rr.js} +1 -1
- package/server/dashboard-db-worker.js +7 -7
- package/server/deacon-DrXqT9LQ.js +4 -0
- package/server/{deacon-pRnyD5w9.js → deacon-hi9KLPLT.js} +2998 -2659
- package/server/{deacon-nudge-log-Bjg8U4Y9.js → deacon-nudge-log-BNBebzeL.js} +3 -3
- package/server/deacon-pending-lifecycle-Cpk0k7Hi.js +33 -0
- package/server/{deacon-swarm-DftYRDo8.js → deacon-swarm-DBxUaO-A.js} +13 -13
- package/server/deacon-swarm-I2JfX5Tg.js +2 -0
- package/server/deacon.js +14 -19
- package/server/dead-end-trip-CQcP70ND.js +13 -0
- package/server/delivery-Da0zEMY4.js +3 -0
- package/server/{deploy-patrol-Bjsho_ha.js → deploy-patrol-Df-Tmaq0.js} +69 -18
- package/server/deploy-queue-9SrhZR63.js +3 -0
- package/server/deploy-queue-UjKGYsDe.js +169 -0
- package/server/deploy-window-jOiPRHL0.js +3 -0
- package/server/{deploy-window-DeP_OIRk.js → deploy-window-rpqpWqHA.js} +40 -16
- package/server/{dev-supervisor-BpMoHlkR.js → dev-supervisor-CC46Ig8q.js} +2 -2
- package/server/{devcontainer-renderer-CtUgrVKW.js → devcontainer-renderer-68CSCRnu.js} +3 -3
- package/server/{dist-DyRx4cI7.js → dist-CJy72uEg.js} +1 -1
- package/server/dist-DSlxIU1H.js +3 -0
- package/server/{dist-src-BSoS7mkd.js → dist-src-Bik83hFi.js} +1 -1
- package/server/docker-BMVTSFL5.js +3 -0
- package/server/{docker-BK7HIcBj.js → docker-Dam7mbIB.js} +2 -2
- package/server/{dod-BrSfUHm0.js → dod-Dar-yheg.js} +8 -4
- package/server/durable-review-pipeline-CGZ5QBxh.js +17 -0
- package/server/durable-review-pipeline-jpgCJZFp.js +3 -0
- package/server/{ensure-devcontainer-DseivYEy.js → ensure-devcontainer-B057YA81.js} +4 -4
- package/server/{ensure-devcontainer-DRqaAkBR.js → ensure-devcontainer-C98V8yW-.js} +1 -1
- package/server/{esm-shims-CbI3BVkl.js → esm-shims-Br9BPdkR.js} +1 -1
- package/server/{event-store-Cr5PQwFC.js → event-store-ELqkVOn0.js} +1 -1
- package/server/{event-store-tdiY5eDZ.js → event-store-zY5MJHgF.js} +23 -4
- package/server/{events-CvvGK6LT.js → events-D6pyqhzM.js} +1 -1
- package/server/{events-CC1dgUpx.js → events-D9PR1IC0.js} +3 -3
- package/server/{factory-CynerjXO.js → factory-CRoOpGsF.js} +5 -5
- package/server/{feature-registry-population-B0pmAz0a.js → feature-registry-population--YUXU999.js} +4 -4
- package/server/{feature-registry-storage-_wUBRD3J.js → feature-registry-storage-BORBTo0y.js} +2 -2
- package/server/{features-Dhxz-wLc.js → features--nFkJY8v.js} +2 -2
- package/server/{feedback-target-iygZwmMc.js → feedback-target-C0ZzyHvU.js} +1 -1
- package/server/{feedback-target-CPS15Vte.js → feedback-target-Dt9BsapX.js} +8 -8
- package/server/{feedback-writer-C9b6ccN1.js → feedback-writer-BG0RUZiu.js} +5 -5
- package/server/{feedback-writer-qmiMbqTZ.js → feedback-writer-D1fm-5Z8.js} +1 -1
- package/server/flywheel-BekukH4i.js +2 -0
- package/server/flywheel-BiT3odRb.js +1092 -0
- package/server/flywheel-CLVB55Be.js +478 -0
- package/server/flywheel-merge-order-BJv1DZz1.js +462 -0
- package/server/flywheel-merge-order-BKw9o6ku.js +2 -0
- package/server/forge-CZbSg6Ds.js +383 -0
- package/server/forge-DK3blQb_.js +3 -0
- package/server/{from-CJ_aH5jD.js → from-D_4_dk7i.js} +1 -1
- package/server/{fts-db-CKgg0VKg.js → fts-db-BeOomFa-.js} +2 -2
- package/server/{fts-operations-BrL_VTRr.js → fts-operations-BdewJ_g9.js} +2 -2
- package/server/git-utils-CI6cwyyC.js +3 -0
- package/server/{git-utils-BVa07a4a.js → git-utils-ameCgDdy.js} +93 -3
- package/server/{github-app-CMBdIFBQ.js → github-app-CQ1Lo6LA.js} +19 -8
- package/server/{github-app-CPfoFAdV.js → github-app-DtAsvwzK.js} +1 -1
- package/server/{github-client--XVlDpwM.js → github-client-BfyDxuRN.js} +2 -2
- package/server/{github-client-B4QsdE-X.js → github-client-Cj0yl_07.js} +1 -1
- package/server/github-pr-lookup-BDq6Wznz.js +58 -0
- package/server/{harness-binary-CVio2m-u.js → harness-binary-DqkftwTb.js} +32 -6
- package/server/{harness-resolve-qHJBhy3Z.js → harness-resolve-CqMqM1Mb.js} +18 -9
- package/server/{health-events-C9B8y1Hm.js → health-events-CazRxJUS.js} +2 -2
- package/server/{health-events-CpfvuVmm.js → health-events-_xfTaOUs.js} +1 -1
- package/server/{hooks-DUXw8A0-.js → hooks-BO3QT1sn.js} +2 -2
- package/server/{hooks-ltecuFqZ.js → hooks-BnJsxlSq.js} +1 -1
- package/server/{hume-BEq0bUDg.js → hume-CDYJxqx-.js} +2 -2
- package/server/hume-Dq--7rOQ.js +3 -0
- package/server/{idle-stack-reaper-D7w9t3fE.js → idle-stack-reaper-BYqERdkE.js} +1 -1
- package/server/{idle-stack-reaper-w1ISSlhs.js → idle-stack-reaper-CnGx_PO_.js} +99 -6
- package/server/in-flight-guard-Bq3epG58.js +45 -0
- package/server/{infra-CzaSOgul.js → infra-BjuxvjdS.js} +80 -5
- package/server/{injection-oNZeoDhL.js → injection-DZxlV2al.js} +1 -1
- package/server/{injection-DZ0PfYa4.js → injection-UCf8EsjX.js} +191 -183
- package/server/{inspect-agent-DJKLWcVT.js → inspect-agent-6kylZnrm.js} +139 -82
- package/server/inspect-agent-BVwDrVrz.js +2 -0
- package/server/{internal-token-Bb4XeV2x.js → internal-token-DvMTQSOS.js} +2 -2
- package/server/{internal-token-DXdfprGr.js → internal-token-M9omeXM1.js} +1 -1
- package/server/{io-B3_AHDfr.js → io-VHvc0Ssp.js} +43 -26
- package/server/{issue-closed-zhdvQicO.js → issue-closed-B6KJkmHZ.js} +7 -7
- package/server/{issue-lifecycle-Dy4vd0Oa.js → issue-lifecycle-9gk3fnXN.js} +1 -1
- package/server/{issue-lifecycle-CreaCkjW.js → issue-lifecycle-C4Zj0WmE.js} +34 -28
- package/server/{issue-service-singleton-B5ushCvE.js → issue-service-singleton-DmCh7EHj.js} +10 -10
- package/server/{issue-service-singleton-DabvBWUp.js → issue-service-singleton-PMx8F1jr.js} +1 -1
- package/server/{issues-B6ToV6x1.js → issues-CgnQ1OGQ.js} +2 -2
- package/server/{jsonl-parser-Dhflo1SH.js → jsonl-parser-DJOH_O-w.js} +5 -4
- package/server/{label-cleanup-BKPJm4Hv.js → label-cleanup-Dv7AV_R1.js} +3 -3
- package/server/{label-reconciler-DdWbHEBu.js → label-reconciler--F85rufp.js} +4 -4
- package/server/{lifecycle-DfeyBDwA.js → lifecycle-CTdOWYMi.js} +2 -2
- package/server/{lifecycle-sycO16hj.js → lifecycle-DDN8ApVY.js} +6 -7
- package/server/{lifecycle-io-D8iNBcux.js → lifecycle-io-D-lGdzK3.js} +5 -5
- package/server/{lifecycle-io-Bsnr2K4F.js → lifecycle-io-D_zTLvP1.js} +1 -1
- package/server/{linear-client-D4zqMnX7.js → linear-client-BQU36QqE.js} +2 -2
- package/server/{linear-client-DqhDQO9k.js → linear-client-CY4O_Tu3.js} +1 -1
- package/server/linear-mcp-auth-BnU4TYfY.js +280 -0
- package/server/linear-mcp-auth-NYBq_oHZ.js +2 -0
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-C_ZEhbqI.js → merge-Bpx4jjht.js} +13 -11
- package/server/{merge-agent-XrB80vfT.js → merge-agent-DdMVSV2Y.js} +233 -83
- package/server/{merge-agent-BQM3a8z5.js → merge-agent-DrXa1CpW.js} +1 -1
- package/server/{merge-batch-Bwoyr8Je.js → merge-batch-C5q1c1GX.js} +1 -1
- package/server/merge-completeness-BMm8tMyZ.js +277 -0
- package/server/merge-completeness-D0ljXbk3.js +3 -0
- package/server/{merge-DK23JEdS.js → merge-idOG--29.js} +1 -1
- package/server/merge-ops-DdpTiEMt.js +2 -0
- package/server/merge-rebase-DGQpYJU3.js +2 -0
- package/server/{merge-rebase-C1KIVr0s.js → merge-rebase-xLnMlw5h.js} +3 -3
- package/server/merge-set-DH7ot3yz.js +89 -0
- package/server/merge-set-DzsOTBg5.js +3 -0
- package/server/{merge-sync-DZ9dojJn.js → merge-sync-CQ-LgZ1_.js} +406 -153
- package/server/merge-sync-Ca7F5JnQ.js +3 -0
- package/server/{merge-train-DxDfBTjr.js → merge-train-DTEMyIu4.js} +18 -8
- package/server/{merge-train-deps-CyYQUksx.js → merge-train-deps-CNPJzepw.js} +4 -4
- package/server/merge-verification-x3JO8Dtz.js +220 -0
- package/server/merged-docker-cleanup-worker-CTpC27Bs.js +107 -0
- package/server/merged-docker-cleanup-worker-Cdi9apm-.js +3 -0
- package/server/{multipart-parser-Dt8YPN5S.js → multipart-parser-IMSBfePV.js} +2 -2
- package/server/{no-resume-mode-Cx3K0hHi.js → no-resume-mode-C5ULAXwO.js} +1 -1
- package/server/node_modules/.package-lock.json +27 -27
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +3 -3
- package/server/node_modules/@google-cloud/common/package.json +2 -2
- 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 +1 -1
- package/server/node_modules/google-auth-library/build/src/auth/googleauth.js +24 -19
- package/server/node_modules/google-auth-library/package.json +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/auth.proto +2 -1
- package/server/node_modules/google-gax/build/protos/google/api/backend.proto +12 -1
- package/server/node_modules/google-gax/build/protos/google/api/billing.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/client.proto +165 -53
- package/server/node_modules/google-gax/build/protos/google/api/cloudquotas/v1/resources.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/cloudquotas/v1beta/quota_adjuster_settings.proto +7 -3
- package/server/node_modules/google-gax/build/protos/google/api/cloudquotas/v1beta/resources.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/config_change.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/context.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/control.proto +3 -3
- package/server/node_modules/google-gax/build/protos/google/api/distribution.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/documentation.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/endpoint.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/error_reason.proto +186 -1
- package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/checked.proto +31 -3
- package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/eval.proto +8 -9
- package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/explain.proto +1 -2
- package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/syntax.proto +20 -22
- package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/value.proto +2 -3
- package/server/node_modules/google-gax/build/protos/google/api/field_behavior.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/field_info.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/http.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/httpbody.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/label.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/launch_stage.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/log.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/logging.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/metric.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/monitored_resource.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/monitoring.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/policy.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/quota.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/resource.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/routing.proto +8 -4
- package/server/node_modules/google-gax/build/protos/google/api/service.proto +2 -3
- package/server/node_modules/google-gax/build/protos/google/api/source_info.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/system_parameter.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/usage.proto +7 -27
- package/server/node_modules/google-gax/build/protos/google/api/visibility.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/longrunning/operations.proto +20 -1
- package/server/node_modules/google-gax/build/protos/google/protobuf/any.proto +52 -108
- package/server/node_modules/google-gax/build/protos/google/protobuf/compiler/ruby/ruby_generated_code.proto +2 -0
- package/server/node_modules/google-gax/build/protos/google/protobuf/cpp_features.proto +21 -1
- package/server/node_modules/google-gax/build/protos/google/protobuf/cpp_file_options.proto +24 -0
- package/server/node_modules/google-gax/build/protos/google/protobuf/cpp_options.proto +15 -0
- package/server/node_modules/google-gax/build/protos/google/protobuf/descriptor.proto +118 -30
- package/server/node_modules/google-gax/build/protos/google/protobuf/field_mask.proto +16 -18
- package/server/node_modules/google-gax/build/protos/google/protobuf/internal_options.proto +8 -1
- package/server/node_modules/google-gax/build/protos/google/protobuf/json/json_enumval_custom_string.proto +26 -0
- package/server/node_modules/google-gax/build/protos/google/protobuf/json_enumvalue_options.proto +29 -0
- package/server/node_modules/google-gax/build/protos/google/protobuf/json_options.proto +14 -0
- package/server/node_modules/google-gax/build/protos/google/protobuf/struct.proto +38 -22
- package/server/node_modules/google-gax/build/protos/google/protobuf/test_protos/forced_micro_string.proto +3 -0
- package/server/node_modules/google-gax/build/protos/google/protobuf/test_protos/repeated_field_proxy_import_message.proto +14 -0
- package/server/node_modules/google-gax/build/protos/google/protobuf/timestamp.proto +9 -8
- package/server/node_modules/google-gax/build/protos/google/protobuf/util/json_format_proto3.proto +18 -0
- package/server/node_modules/google-gax/build/protos/google/rpc/code.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/rpc/context/attribute_context.proto +7 -2
- package/server/node_modules/google-gax/build/protos/google/rpc/context/audit_context.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/rpc/error_details.proto +5 -5
- package/server/node_modules/google-gax/build/protos/google/rpc/http.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/rpc/status.proto +1 -2
- package/server/node_modules/google-gax/build/protos/google/type/calendar_period.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/type/color.proto +9 -10
- package/server/node_modules/google-gax/build/protos/google/type/date.proto +11 -9
- package/server/node_modules/google-gax/build/protos/google/type/datetime.proto +17 -17
- package/server/node_modules/google-gax/build/protos/google/type/dayofweek.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/type/decimal.proto +11 -13
- package/server/node_modules/google-gax/build/protos/google/type/expr.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/type/fraction.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/type/interval.proto +1 -2
- package/server/node_modules/google-gax/build/protos/google/type/latlng.proto +4 -5
- package/server/node_modules/google-gax/build/protos/google/type/localized_text.proto +3 -3
- package/server/node_modules/google-gax/build/protos/google/type/money.proto +1 -2
- package/server/node_modules/google-gax/build/protos/google/type/month.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/type/phone_number.proto +20 -15
- package/server/node_modules/google-gax/build/protos/google/type/postal_address.proto +39 -39
- package/server/node_modules/google-gax/build/protos/google/type/quaternion.proto +4 -4
- package/server/node_modules/google-gax/build/protos/google/type/timeofday.proto +11 -8
- package/server/node_modules/google-gax/package.json +5 -5
- package/server/node_modules/retry-request/package.json +4 -4
- package/server/node_modules/teeny-request/package.json +5 -5
- package/server/node_modules/undici/README.md +5 -0
- package/server/node_modules/undici/docs/docs/api/Client.md +4 -0
- package/server/node_modules/undici/docs/docs/api/Dispatcher.md +6 -0
- package/server/node_modules/undici/docs/docs/api/Interceptors.md +59 -0
- package/server/node_modules/undici/docs/docs/api/MockAgent.md +27 -0
- package/server/node_modules/undici/docs/docs/api/MockPool.md +28 -1
- package/server/node_modules/undici/docs/docs/index.md +5 -0
- package/server/node_modules/undici/lib/cache/memory-cache-store.js +54 -9
- package/server/node_modules/undici/lib/cache/sqlite-cache-store.js +7 -1
- package/server/node_modules/undici/lib/core/request.js +13 -2
- package/server/node_modules/undici/lib/core/util.js +6 -1
- package/server/node_modules/undici/lib/dispatcher/agent.js +3 -3
- package/server/node_modules/undici/lib/dispatcher/client-h1.js +42 -8
- package/server/node_modules/undici/lib/dispatcher/client-h2.js +34 -43
- package/server/node_modules/undici/lib/global.js +36 -16
- package/server/node_modules/undici/lib/handler/cache-handler.js +269 -61
- package/server/node_modules/undici/lib/handler/cache-revalidation-handler.js +13 -3
- package/server/node_modules/undici/lib/handler/redirect-handler.js +5 -2
- package/server/node_modules/undici/lib/handler/retry-handler.js +30 -4
- package/server/node_modules/undici/lib/interceptor/cache.js +159 -52
- package/server/node_modules/undici/lib/interceptor/decompress.js +9 -2
- package/server/node_modules/undici/lib/mock/mock-interceptor.js +25 -7
- package/server/node_modules/undici/lib/mock/mock-utils.js +39 -10
- package/server/node_modules/undici/lib/util/cache.js +372 -68
- package/server/node_modules/undici/lib/util/date.js +23 -6
- package/server/node_modules/undici/lib/web/cookies/util.js +78 -8
- package/server/node_modules/undici/lib/web/fetch/body.js +2 -1
- package/server/node_modules/undici/lib/web/fetch/response.js +1 -3
- package/server/node_modules/undici/package.json +2 -2
- package/server/node_modules/undici/types/client.d.ts +2 -2
- package/server/node_modules/undici/types/dispatcher.d.ts +3 -3
- package/server/node_modules/undici/types/mock-interceptor.d.ts +5 -1
- package/server/{orphan-proposed-reconciler-BTkDrl4R.js → orphan-proposed-reconciler-CWmOdM9-.js} +1 -1
- package/server/{orphan-proposed-reconciler-neK8dHQk.js → orphan-proposed-reconciler-Dg6U4ADZ.js} +24 -15
- package/server/package-lock.json +28 -28
- package/server/package.json +1 -1
- package/server/{pan-dir-DeVUgwA7.js → pan-dir-ubraCiUg.js} +24 -10
- package/server/{paths-_zEts6wc.js → paths-cXmOwSbh.js} +2 -2
- package/server/pending-lifecycle-claim-DEteYdS9.js +110 -0
- package/server/{pickup-Dd0Znxxy.js → pickup-D8xtG1J2.js} +17 -16
- package/server/pipeline-membership-BGSvkT2M.js +3 -0
- package/server/pipeline-membership-CrAPLYtf.js +57 -0
- package/server/{pipeline-membership-0HaEGDlH.js → pipeline-membership-gather-CET40frr.js} +177 -109
- package/server/pipeline-membership-gather-DTfcgxLl.js +3 -0
- package/server/{pipeline-notifier-D0ykk59O.js → pipeline-notifier-BuQ0e4hF.js} +2 -2
- package/server/{pipeline-notifier-6iCJplFZ.js → pipeline-notifier-ImNXknf0.js} +1 -1
- package/server/post-merge-lifecycle-worker-DbO10pum.js +50 -0
- package/server/{project-pipelines-2sK1apsO.js → project-pipelines-Bim6bThI.js} +2 -2
- package/server/project-repos-C0nuoBGv.js +98 -0
- package/server/project-repos-CRE6Ykow.js +3 -0
- package/server/projects-B03Wr-xc.js +3 -0
- package/server/{prompts-Dp4Tpk39.js → prompts-BEx08AIu.js} +2 -2
- package/server/{providers-DKkBXhxU.js → providers-D7IluJe0.js} +1 -1
- package/server/{providers-DV7ec8l7.js → providers-evXhiQeg.js} +7 -7
- package/server/public/assets/{chunk-BO2N2NFS-CltymLRg.js → chunk-BO2N2NFS-D1s4-Sqp.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-D2f6pjgA.js → diagram-OG6HWLK6-1gdMoSF7.js} +1 -1
- package/server/public/assets/{dist-BWR4qFiV.js → dist-CxAOHbil.js} +1 -1
- package/server/public/assets/{dist-DEmlBBNQ.js → dist-DqDRYW6P.js} +3 -3
- package/server/public/assets/{ganttDiagram-6RSMTGT7-DnfiViPK.js → ganttDiagram-6RSMTGT7-BYex-Ec7.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-B8Wrmj9H.js → highlighted-body-OFNGDK62-DlVkiG0S.js} +1 -1
- package/server/public/assets/index-Cc7cnFC4.css +1 -0
- package/server/public/assets/index-K0hAYCgV.js +807 -0
- package/server/public/assets/{linear-C9zFQpkX.js → linear-B4cuEFmO.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-DyDHFXHV.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-lR8H7Yjd.js → pieDiagram-4H26LBE5-CBHNBIJQ.js} +1 -1
- package/server/public/assets/{prod-B1jCQihw.js → prod-CN2nHBvX.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-CVQ2guem.js → quadrantDiagram-W4KKPZXB-Bom87VOQ.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-eD1RB4gm.js → sankeyDiagram-5OEKKPKP-UrBeyLxk.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-ChEC6dQn.js → xychartDiagram-2RQKCTM6-DhkbrIxR.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/{pull-requests--Ib2jTgy.js → pull-requests-Cv7LxzUN.js} +1 -1
- package/server/{pull-requests-CXIhdCYD.js → pull-requests-DHWiKxo7.js} +19 -10
- package/server/{queries-6d7Cdtm7.js → queries-DHJm7bTd.js} +1134 -203
- package/server/{rally-B708-nZn.js → rally-B71M9f4o.js} +3 -3
- package/server/rally-YDjU513q.js +3 -0
- package/server/{rally-api-yjQ0TfHd.js → rally-api-D5uXN08-.js} +1 -1
- package/server/{rally-api-nY0ZANw3.js → rally-api-Dkqmok65.js} +2 -2
- package/server/{rally-client-B1EJhfV0.js → rally-client-Bfqm6XI4.js} +4 -4
- package/server/{rally-client-CULK2XAY.js → rally-client-CxsA6ExK.js} +1 -1
- package/server/{reap-terminal-sessions-MWnqdLCJ.js → reap-terminal-sessions-BQ23nriz.js} +2 -2
- package/server/{reap-terminal-sessions-N3BTkmX_.js → reap-terminal-sessions-CvmwaqKv.js} +2 -2
- package/server/{rebuild-stack-Dp4eLkt4.js → rebuild-stack-0EEYReVZ.js} +36 -36
- package/server/rebuild-stack-qeRqHZxH.js +4 -0
- package/server/{reconstruct-cache-uWbZfjms.js → reconstruct-cache-BbYFsqLa.js} +7 -6
- package/server/record-CtroO946.js +3 -0
- package/server/record-update-DH6dLJID.js +3 -0
- package/server/{record-update-Dq0t2uBG.js → record-update-Z0QCxmMp.js} +124 -34
- package/server/{recovery-trip-BJtIQuag.js → recovery-trip-eJe26h-f.js} +2 -2
- package/server/{release-engine-DZpmGGzb.js → release-engine-lPUp-MTd.js} +5 -5
- package/server/{release-set-hnXd_kga.js → release-set-BwGeyZKX.js} +3 -3
- package/server/{remote-Br-ZWVIP.js → remote-BCd02Es1.js} +3 -3
- package/server/{remote-4tiENDaI.js → remote-CVGUhXMV.js} +3 -3
- package/server/{remote-agents-CRCg1L4H.js → remote-agents-C1bssi41.js} +2 -2
- package/server/{remote-agents-nmty1mLu.js → remote-agents-C_VxssLU.js} +300 -46
- package/server/{remote-completion-BbWNd10K.js → remote-completion-DAB0P706.js} +12 -12
- package/server/resume-u9byntrq.js +3 -0
- package/server/{review-agent-DJRO8EG8.js → review-agent-CD4RCI0Y.js} +1 -1
- package/server/{review-agent-sKkE1FEL.js → review-agent-CHhI66UP.js} +61 -44
- package/server/{review-artifacts-BLbSC4ke.js → review-artifacts-DSMRIfuJ.js} +7 -6
- package/server/{review-context-BgX3lcCx.js → review-context-oFuBbiEE.js} +69 -25
- package/server/{in-flight-guard-aQ1IxeI3.js → review-convoy-liveness-CpzrcJ5F.js} +3 -44
- package/server/review-status-BZH8h-6W.js +3 -0
- package/server/review-status-emit-CUExtHd5.js +50 -0
- package/server/{review-status-enrichment-tbOn_A_u.js → review-status-enrichment-QV_hQkgS.js} +4 -4
- package/server/{review-status-source-CxuEjLGg.js → review-status-source-CpvJnvnQ.js} +24 -3
- package/server/review-status-source-ylw5QZUR.js +3 -0
- package/server/{review-status-sync-BhSQ0d0l.js → review-status-sync-483sujRo.js} +10 -5
- package/server/{review-status-sync-To3-iS-N.js → review-status-sync-NaWvI9Xf.js} +1 -1
- package/server/review-status-yljtTd-q.js +7521 -0
- package/server/{review-verdict-feedback-C1Kg8n7t.js → review-verdict-feedback-BPDn4li_.js} +1 -1
- package/server/{review-verdict-feedback-CTRNtzXO.js → review-verdict-feedback-CELeUinh.js} +48 -8
- package/server/{rollup-WA0VD-Rr.js → rollup-DTNvelz9.js} +8 -8
- package/server/{rollup-B53Y81xK.js → rollup-DYZfq1c4.js} +1 -1
- package/server/{scanner-D2743cp8.js → scanner-CV35oSn4.js} +42 -14
- package/server/{sequence-io-Cg0zYj_E.js → sequence-io-DF_8iuhV.js} +4 -4
- package/server/{sequencer-agent-BGY8gjg-.js → sequencer-agent-B2WeCtGi.js} +5 -5
- package/server/server.js +3899 -672
- package/server/{service-DCpB_SGd.js → service-Br9rpBNA.js} +83 -65
- package/server/{session-fork-BQ8_6H32.js → session-fork-D0LY152N.js} +2 -2
- package/server/{session-history-CVZDpS3c.js → session-history-BUyK29eq.js} +4 -4
- package/server/{settings-BZ5m1UCl.js → settings-Bse1Pdcj.js} +3 -3
- package/server/settings-CdvIF84R.js +2 -0
- package/server/{settings-ylxwqwQG.js → settings-CvVGqNEs.js} +3 -2
- package/server/{shadow-engineering-BlxG6Xye.js → shadow-engineering-BWLa8ODz.js} +2 -2
- package/server/{shadow-state-Dh-HzF2J.js → shadow-state-B4fpKxOO.js} +2 -2
- package/server/{shadow-state-C2_epgx2.js → shadow-state-FV6PHfEW.js} +1 -1
- package/server/{shadow-utils-4bvjn9b3.js → shadow-utils-D7asqxOZ.js} +2 -2
- package/server/{ship-log-ClSMIzZX.js → ship-log-xplJ8t75.js} +1 -1
- package/server/{smart-compaction-CHIxLr_d.js → smart-compaction-CPp2Ykf6.js} +1 -1
- package/server/{smart-compaction-r4pHQBIr.js → smart-compaction-D3U_79f-.js} +8 -7
- package/server/{spawn-planning-session-KC_UduxD.js → spawn-planning-session-1nFi3gfk.js} +1 -1
- package/server/{spawn-planning-session-DWAorh2B.js → spawn-planning-session-DGfZ5B8D.js} +30 -23
- package/server/{specialist-completion-BXhav38U.js → specialist-completion-Br48eiDP.js} +1 -1
- package/server/{specialist-context-DtrYvGJ-.js → specialist-context-cVbGnTa3.js} +5 -5
- package/server/{specialist-handoff-logger-C45ouoZ6.js → specialist-handoff-logger-DK-GTz4s.js} +2 -2
- package/server/{specialist-logs-DJ3RzKxW.js → specialist-logs-Cl5-hqT8.js} +3 -3
- package/server/{specialists-JVO00bs7.js → specialists-CNfYO3G2.js} +1634 -457
- package/server/{specialists-DyFeedjn.js → specialists-Cicieuzu.js} +21 -19
- package/server/{specialists-D5fRZXmN.js → specialists-JHsdU3pA.js} +1 -1
- package/server/{specialists-DVj0hvaL.js → specialists-Tdezg_6N.js} +1 -1
- package/server/specs-Bt7WJDoC.js +3 -0
- package/server/src-CRmCHlma.js +11408 -0
- package/server/{src-CG9mCkP6.js → src-Ck028hjO.js} +6 -6
- package/server/{src-CMTQGyCK.js → src-UWcGe0Ix.js} +5 -5
- package/server/stack-health-CJLMrLBl.js +3 -0
- package/server/{stack-health-puygdaMd.js → stack-health-DqSqx0zv.js} +68 -12
- package/server/{stale-task-claims-BbFwCTb0.js → stale-task-claims-CYFOUNlT.js} +4 -4
- package/server/{staleness-Cbl_w4Bw.js → staleness-BQ-0gMYK.js} +1 -1
- package/server/{staleness-Bpy41ngS.js → staleness-D47CUJok.js} +1 -1
- package/server/{state-home-CIGjwNfJ.js → state-home-BYV7qZTW.js} +2 -2
- package/server/{state-mapping-BL_-3Yt8.js → state-mapping-BVldLhBf.js} +1 -1
- package/server/{state-migrate-Dkzaxvny.js → state-migrate-CvvBtS0Y.js} +4 -4
- package/server/{stuck-remediation-sY_MHHgQ.js → stuck-remediation-Wt0UVvu1.js} +1 -1
- package/server/{stuck-remediation-CzEov_fq.js → stuck-remediation-mkLC6G_t.js} +360 -26
- package/server/{substrate-bug-weights-service-BH66lhm7.js → substrate-bug-weights-service-XfLAKnmK.js} +3 -3
- package/server/{summary-fork-D8bXjCr7.js → summary-fork-CD7GOts0.js} +2 -2
- package/server/{summary-fork-DHhJIsAL.js → summary-fork-xiXBnWG9.js} +78 -12
- package/server/supervisor/{injection-budget-C1iPirFS.js → injection-budget-B5SbvDx2.js} +2 -41
- package/server/supervisor/{paths-DehGY2Fj.js → paths-K3noE4N_.js} +1 -1
- package/server/supervisor/pty-supervisor.js +49 -2
- package/server/supervisor/pty-token-B7lp0ElT.js +43 -0
- package/server/{supervisor-BO-Zk_h-.js → supervisor-DL788vos.js} +3 -3
- package/server/supervisor-UWiQNK-y.js +2 -0
- package/server/{swarm-readiness-CQ_fwUWF.js → swarm-readiness-BV14DF5N.js} +3 -3
- package/server/{system-prerequisites-Bza0ffAh.js → system-prerequisites-pdWG6ZQs.js} +56 -29
- package/server/{teardown-workspace-CEgauF4U.js → teardown-workspace-l2F4_zim.js} +15 -16
- package/server/{test-agent-queue-DXDt0Xa-.js → test-agent-queue-qakFIIGz.js} +6 -6
- package/server/{test-verdict-CmUBK5cT.js → test-verdict-BJYDggMm.js} +1 -1
- package/server/{test-verdict-DFjjIHR5.js → test-verdict-Gw-btEfb.js} +1 -1
- package/server/{tldr-daemon-DL566HbH.js → tldr-daemon-BKOYB616.js} +1 -1
- package/server/{tldr-daemon-BDtLOIlO.js → tldr-daemon-CBaWkV9k.js} +2 -2
- package/server/{tmux-ftABRAmc.js → tmux-B1Wbxz5o.js} +3 -3
- package/server/{tmux-DoThH6aj.js → tmux-DQ6jB76i.js} +1 -1
- package/server/tmux-dedup-DbN6MGzM.js +892 -0
- package/server/{token-CsOhvw42.js → token-Cxbk023d.js} +2 -2
- package/server/{token-util-CTmczIfW.js → token-util-CLq2MmQt.js} +1 -1
- package/server/token-util-zlz9U0ki.js +3 -0
- package/server/{tracker-config-B4itFzDo.js → tracker-config-DZ8Zn2nQ.js} +2 -2
- package/server/{tracker-utils-tnxxqROg.js → tracker-utils-L0FKtjq2.js} +3 -3
- package/server/{traefik-connect-m73vGebA.js → traefik-connect-bNX6jKkb.js} +1 -1
- package/server/{tunnel-B2vxjx_b.js → tunnel-BAm1XgjG.js} +3 -3
- package/server/{tunnel-Cgj-IGIl.js → tunnel-CjSnHdTc.js} +1 -1
- package/server/{types-BBNjPcqU.js → types-q67TYYg5.js} +1 -1
- package/server/uat-promote-verification-CKB9ZrKC.js +92 -0
- package/server/uat-train-Cu-4nvbf.js +2 -0
- package/server/uat-train-D5UjcyAa.js +0 -0
- package/server/validate-Cxsx5Uz1.js +179 -0
- package/server/{validation-CIi6pnI2.js → validation-DEaTZafj.js} +1 -1
- package/server/{validation-B5JxoPUS.js → validation-VZgJxmqc.js} +4 -4
- package/server/{verification-artifact-C-lIHfUa.js → verification-artifact-C85cRTc_.js} +1 -1
- package/server/{verification-artifact-BcnIbigL.js → verification-artifact-g3yuxQDL.js} +1 -1
- package/server/{verification-runner-CDj4lD4t.js → verification-runner-DlZI8yhw.js} +1 -1
- package/server/{verification-runner-Br0S_Ous.js → verification-runner-KDZIsBj4.js} +114 -107
- package/server/{vtt-parser-DKpNNW5i.js → vtt-parser-Jr94BF3Y.js} +1 -1
- package/server/{work-agent-prompt-Yb2bd3Fq.js → work-agent-prompt-C-vuP3_J.js} +20 -9
- package/server/workflows-CHrx_hcW.js +2 -0
- package/server/{workflows-C9WmILql.js → workflows-D0oip4eV.js} +161 -78
- package/server/{workspace-DuUdndHe.js → workspace-BqFg__wH.js} +1 -1
- package/server/{workspace-BVl4rihN.js → workspace-C0fH3aek.js} +3 -3
- package/server/workspace-anchor-drift-B4gMRHl4.js +3 -0
- package/server/workspace-anchor-drift-CZKofakh.js +224 -0
- package/server/{workspace-config-cEGcO6UT.js → workspace-config-B123aZl-.js} +1 -1
- package/server/workspace-manager-CDTKjjdU.js +3 -0
- package/server/{workspace-manager-hLUv3ADC.js → workspace-manager-CwO-Hek7.js} +206 -116
- package/server/{workspace-metadata-CskwzzhL.js → workspace-metadata-CQv00QwK.js} +2 -2
- package/server/{workspace-metadata-DNpMixRq.js → workspace-metadata-D4M8BM4W.js} +1 -1
- package/server/{workspaces-hWvy9eKs.js → workspaces-j1e_6aAT.js} +736 -290
- package/sync-sources/dev-skills/pan-dashboard-restart/SKILL.md +34 -10
- package/sync-sources/hooks/linear-mcp-auth-hook +97 -0
- package/sync-sources/hooks/record-cost-event.js +6 -4
- package/sync-sources/rules/ask-user-question-self-contained.md +9 -0
- package/sync-sources/skills/okf/README.md +11 -3
- package/sync-sources/skills/okf/SKILL.md +12 -1
- package/sync-sources/skills/okf/docs/USAGE.md +15 -0
- package/sync-sources/skills/okf/references/overdeck.md +28 -0
- package/sync-sources/skills/pan-close/SKILL.md +5 -3
- package/sync-sources/skills/pan-flywheel/SKILL.md +18 -1
- package/sync-sources/skills/pan-knowledge/SKILL.md +10 -0
- package/sync-sources/skills/pan-orders/SKILL.md +33 -0
- package/sync-sources/skills/pan-peer-review/SKILL.md +195 -0
- package/sync-sources/skills/pan-reload/SKILL.md +3 -3
- package/sync-sources/skills/pan-restart/SKILL.md +5 -4
- package/sync-sources/skills/pan-review/SKILL.md +7 -1
- package/sync-sources/skills/pan-start/SKILL.md +4 -0
- package/sync-sources/skills/pan-sync-main/SKILL.md +9 -8
- package/sync-sources/skills/pipeline-status/SKILL.md +10 -1
- package/sync-sources/skills/workspace-add-repo/SKILL.md +16 -1
- package/sync-sources/templates/traefik/dynamic/overdeck.yml.template +10 -0
- package/server/activity-logger-OEUBdfZ8.js +0 -3
- package/server/agent-state-Bg0lhqwj.js +0 -3
- package/server/agents-FlIgQ3ql.js +0 -3
- package/server/archive-planning-zkJb3BeM.js +0 -3
- package/server/cli-BsVIHwzC.js +0 -3
- package/server/context-layers-B3Nt58jl.js +0 -4
- package/server/context-layers-ZYFcWiyc.js +0 -165
- package/server/conversation-service-Up7FEzIC.js +0 -3
- package/server/deacon-DYSEJb48.js +0 -4
- package/server/deacon-swarm-9jRLS5Ke.js +0 -2
- package/server/deploy-window-CM6W1-c6.js +0 -3
- package/server/dist-Bd3vn0Hw.js +0 -3
- package/server/flywheel-DMCUzDWg.js +0 -2
- package/server/flywheel-DSSpWmqF.js +0 -522
- package/server/flywheel-DcBkQvgE.js +0 -207
- package/server/flywheel-merge-order-C-6zRLvM.js +0 -2
- package/server/flywheel-merge-order-DxbQKE1d.js +0 -244
- package/server/forge-B-ZWyTRm.js +0 -2
- package/server/forge-Ch9gCFod.js +0 -270
- package/server/git-utils-Dry_Ka_D.js +0 -3
- package/server/github-pr-lookup-BRbDW-qk.js +0 -44
- package/server/hume-B_DbflNM.js +0 -3
- package/server/inspect-agent-ch-F-5Ci.js +0 -2
- package/server/launcher-generator-CHVm7bGT.js +0 -379
- package/server/layers-DzxSTGNA.js +0 -93
- package/server/merge-blockers-BsFjGrQ8.js +0 -41
- package/server/merge-ops-DlB1IM0Y.js +0 -2
- package/server/merge-set-DLz0MkGT.js +0 -139
- package/server/merge-set-DnSYdBEp.js +0 -3
- package/server/merge-sync-SSv3E-pl.js +0 -3
- package/server/merge-verification-CSizH3HY.js +0 -124
- package/server/projects-9SkRpES9.js +0 -3
- package/server/public/assets/index-CUr1xv8w.css +0 -1
- package/server/public/assets/index-CsSuZQBI.js +0 -802
- package/server/public/assets/mermaid-GHXKKRXX-BUAB8hqt.js +0 -1
- package/server/rally-njs_mJrt.js +0 -3
- package/server/rebuild-stack-kA7XngID.js +0 -3
- package/server/record-t6V-3Dcj.js +0 -3
- package/server/record-update-DACtKh6_.js +0 -3
- package/server/resume-CcKqnTvE.js +0 -3
- package/server/review-status-A7quS5KJ.js +0 -1454
- package/server/review-status-C6n6-9f_.js +0 -3
- package/server/settings-D0OSwos5.js +0 -2
- package/server/specs-nN45DG2X.js +0 -3
- package/server/src-U7_kTPEE.js +0 -4733
- package/server/stack-health-Df0YEZKa.js +0 -3
- package/server/supervisor-BPy-o1A8.js +0 -2
- package/server/token-util-DrHg8abn.js +0 -3
- package/server/tracker-utils-BePq_oj-.js +0 -3
- package/server/uat-train-CuEn0t9M.js +0 -2152
- package/server/uat-train-cKfM-_WW.js +0 -2
- package/server/workflows-D90rMOya.js +0 -2
- package/server/workspace-manager-ZTdJAy9M.js +0 -3
|
@@ -1,1454 +0,0 @@
|
|
|
1
|
-
import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
|
-
import { Et as getIssueWorkspacePath, Nt as readIssueRecordSync, Ot as init_record, Tn as init_projects, fn as findProjectByPathSync, jt as readIssueRecord, nn as init_state_read_home, rn as resolveStateReadHomeSync, yn as getProjectSync, zn as resolveProjectFromIssueSync } from "./config-yaml-DvyMuOle.js";
|
|
3
|
-
import { a as init_activity_logger, n as emitActivityEntrySync, r as emitActivityTtsSync } from "./activity-logger-DDlOIAML.js";
|
|
4
|
-
import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-CzaSOgul.js";
|
|
5
|
-
import { n as updateIssueRecord, t as init_record_update } from "./record-update-Dq0t2uBG.js";
|
|
6
|
-
import { d as init_cost_sync, i as getCostBreakdownByStageAndModelSync, o as getCostForIssueSync } from "./cost-sync-C0VdGme1.js";
|
|
7
|
-
import { r as notifyPipelineSync, t as init_pipeline_notifier } from "./pipeline-notifier-D0ykk59O.js";
|
|
8
|
-
import { c as init_review_status_sync, d as init_review_status_normalize, f as normalizeReviewStatusSync, l as markWorkspaceStuck$1, n as deleteReviewStatus, o as getReviewStatusFromDbSync, r as getAllReviewStatusesFromDb, s as getReviewStatusesFromDb, t as clearWorkspaceStuck$1, u as upsertReviewStatusSync } from "./review-status-sync-BhSQ0d0l.js";
|
|
9
|
-
import { a as registerReviewStatusMapReader, n as init_review_status_source } from "./review-status-source-CxuEjLGg.js";
|
|
10
|
-
import { a as PAN_DIRNAME, p as init_types, r as PAN_CONTINUES_DIRNAME } from "./types-hraoaQIp.js";
|
|
11
|
-
import { i as init_merge_set, r as getMergeSetSync } from "./merge-set-DLz0MkGT.js";
|
|
12
|
-
import { o as init_lifecycle, r as XBRIEF_FILENAME_SUFFIX, t as LEGACY_VBRIEF_FILENAME_SUFFIX } from "./lifecycle-DfeyBDwA.js";
|
|
13
|
-
import { dirname, join } from "node:path";
|
|
14
|
-
import { Data, Effect } from "effect";
|
|
15
|
-
import { join as join$1 } from "path";
|
|
16
|
-
import { homedir } from "os";
|
|
17
|
-
import { hostname } from "node:os";
|
|
18
|
-
import { existsSync, mkdirSync, promises, readFileSync, writeFileSync } from "node:fs";
|
|
19
|
-
//#region ../../lib/overdeck/agent-state-sync.ts
|
|
20
|
-
function isoFromMillis(value) {
|
|
21
|
-
return value == null ? void 0 : new Date(value).toISOString();
|
|
22
|
-
}
|
|
23
|
-
function millisFromIso(value) {
|
|
24
|
-
if (!value) return null;
|
|
25
|
-
const millis = Date.parse(value);
|
|
26
|
-
return Number.isFinite(millis) ? millis : null;
|
|
27
|
-
}
|
|
28
|
-
function boolFromInteger(value) {
|
|
29
|
-
return value == null ? void 0 : Boolean(value);
|
|
30
|
-
}
|
|
31
|
-
function hostOverrideFromRow(value) {
|
|
32
|
-
if (value == null) return void 0;
|
|
33
|
-
return value === "1" || value === "true" || value === "yes";
|
|
34
|
-
}
|
|
35
|
-
function hostOverrideToRow(value) {
|
|
36
|
-
return value === true ? "true" : null;
|
|
37
|
-
}
|
|
38
|
-
function overdeckRowToAgentState(row) {
|
|
39
|
-
const deliveryMethod = row.delivery_method;
|
|
40
|
-
return {
|
|
41
|
-
id: row.id,
|
|
42
|
-
issueId: row.issue_id,
|
|
43
|
-
workspace: row.workspace,
|
|
44
|
-
role: row.role,
|
|
45
|
-
model: row.model ?? "",
|
|
46
|
-
status: row.status,
|
|
47
|
-
startedAt: isoFromMillis(row.started_at) ?? isoFromMillis(row.updated_at) ?? (/* @__PURE__ */ new Date()).toISOString(),
|
|
48
|
-
harness: row.harness ? row.harness : void 0,
|
|
49
|
-
lastResumeAt: isoFromMillis(row.last_resume_at),
|
|
50
|
-
stoppedByUser: boolFromInteger(row.stopped_by_user),
|
|
51
|
-
stoppedByPause: boolFromInteger(row.stopped_by_pause),
|
|
52
|
-
kickoffDelivered: boolFromInteger(row.kickoff_delivered),
|
|
53
|
-
paused: boolFromInteger(row.paused),
|
|
54
|
-
pausedReason: row.paused_reason ?? void 0,
|
|
55
|
-
yieldedByScheduler: boolFromInteger(row.yielded_by_scheduler),
|
|
56
|
-
yieldedAt: isoFromMillis(row.yielded_at),
|
|
57
|
-
lastYieldResumeAt: isoFromMillis(row.last_yield_resume_at),
|
|
58
|
-
troubled: boolFromInteger(row.troubled),
|
|
59
|
-
consecutiveFailures: row.consecutive_failures ?? void 0,
|
|
60
|
-
firstFailureInRunAt: isoFromMillis(row.first_failure_in_run_at),
|
|
61
|
-
lastFailureNextRetryAt: isoFromMillis(row.last_failure_next_retry_at),
|
|
62
|
-
sessionId: row.session_id ?? void 0,
|
|
63
|
-
channelsEnabled: boolFromInteger(row.channels_enabled),
|
|
64
|
-
supervisorEnabled: deliveryMethod === "supervisor" ? true : void 0,
|
|
65
|
-
deliveryMethod: deliveryMethod ?? void 0,
|
|
66
|
-
hostOverride: hostOverrideFromRow(row.host_override),
|
|
67
|
-
stoppedAt: isoFromMillis(row.stopped_at),
|
|
68
|
-
pausedAt: isoFromMillis(row.paused_at),
|
|
69
|
-
troubledAt: isoFromMillis(row.troubled_at),
|
|
70
|
-
lastActivity: isoFromMillis(row.last_activity),
|
|
71
|
-
lastFailureReason: row.last_failure_reason ?? void 0,
|
|
72
|
-
phase: row.phase == null ? void 0 : row.phase,
|
|
73
|
-
roleRunHead: row.role_run_head ?? void 0,
|
|
74
|
-
flywheelRunId: row.flywheel_run_id ?? void 0,
|
|
75
|
-
costSoFar: row.cost_so_far ?? void 0,
|
|
76
|
-
reviewSubRole: row.review_sub_role ?? void 0,
|
|
77
|
-
reviewRunId: row.review_run_id ?? void 0,
|
|
78
|
-
reviewSynthesisAgentId: row.review_synthesis_agent_id ?? void 0,
|
|
79
|
-
reviewOutputPath: row.review_output_path ?? void 0,
|
|
80
|
-
reviewDeadlineAt: isoFromMillis(row.review_deadline_at),
|
|
81
|
-
reviewMonitorSignaled: row.review_monitor_signaled ?? void 0,
|
|
82
|
-
reviewRetryAttempt: row.review_retry_attempt ?? void 0,
|
|
83
|
-
reviewDiscoveryPending: boolFromInteger(row.review_discovery_pending),
|
|
84
|
-
reviewContextManifestPath: row.review_context_manifest_path ?? void 0,
|
|
85
|
-
reviewDiscoveryReadyAt: isoFromMillis(row.review_discovery_ready_at) ?? void 0,
|
|
86
|
-
reviewConvoyForkedAt: isoFromMillis(row.review_convoy_forked_at) ?? void 0,
|
|
87
|
-
reviewForkCacheChecked: boolFromInteger(row.review_fork_cache_checked),
|
|
88
|
-
reviewForkedFromParent: boolFromInteger(row.review_forked_from_parent)
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
/** Exported for agent-projection.ts transactional writes. */
|
|
92
|
-
function stateToOverdeckParamsForDb(state, updatedAt) {
|
|
93
|
-
const deliveryMethod = state.deliveryMethod ?? (state.supervisorEnabled === true ? "supervisor" : null);
|
|
94
|
-
return [
|
|
95
|
-
state.id,
|
|
96
|
-
state.issueId,
|
|
97
|
-
state.role,
|
|
98
|
-
state.status,
|
|
99
|
-
state.workspace,
|
|
100
|
-
state.sessionId ?? null,
|
|
101
|
-
state.harness ?? "",
|
|
102
|
-
state.model ?? "",
|
|
103
|
-
hostOverrideToRow(state.hostOverride),
|
|
104
|
-
deliveryMethod,
|
|
105
|
-
millisFromIso(state.startedAt),
|
|
106
|
-
millisFromIso(state.lastResumeAt),
|
|
107
|
-
state.stoppedByUser == null ? null : state.stoppedByUser ? 1 : 0,
|
|
108
|
-
state.stoppedByPause == null ? null : state.stoppedByPause ? 1 : 0,
|
|
109
|
-
state.kickoffDelivered == null ? null : state.kickoffDelivered ? 1 : 0,
|
|
110
|
-
state.paused == null ? null : state.paused ? 1 : 0,
|
|
111
|
-
state.pausedReason ?? null,
|
|
112
|
-
state.yieldedByScheduler == null ? null : state.yieldedByScheduler ? 1 : 0,
|
|
113
|
-
millisFromIso(state.yieldedAt),
|
|
114
|
-
millisFromIso(state.lastYieldResumeAt),
|
|
115
|
-
state.troubled == null ? null : state.troubled ? 1 : 0,
|
|
116
|
-
state.channelsEnabled == null ? null : state.channelsEnabled ? 1 : 0,
|
|
117
|
-
state.consecutiveFailures ?? null,
|
|
118
|
-
millisFromIso(state.firstFailureInRunAt),
|
|
119
|
-
millisFromIso(state.lastFailureNextRetryAt),
|
|
120
|
-
millisFromIso(state.stoppedAt),
|
|
121
|
-
millisFromIso(state.pausedAt),
|
|
122
|
-
millisFromIso(state.troubledAt),
|
|
123
|
-
millisFromIso(state.lastActivity),
|
|
124
|
-
state.lastFailureReason ?? null,
|
|
125
|
-
state.phase ?? null,
|
|
126
|
-
state.roleRunHead ?? null,
|
|
127
|
-
state.flywheelRunId ?? null,
|
|
128
|
-
state.costSoFar ?? null,
|
|
129
|
-
state.reviewSubRole ?? null,
|
|
130
|
-
state.reviewRunId ?? null,
|
|
131
|
-
state.reviewSynthesisAgentId ?? null,
|
|
132
|
-
state.reviewOutputPath ?? null,
|
|
133
|
-
millisFromIso(state.reviewDeadlineAt),
|
|
134
|
-
state.reviewMonitorSignaled ?? null,
|
|
135
|
-
state.reviewRetryAttempt ?? null,
|
|
136
|
-
state.reviewDiscoveryPending == null ? null : state.reviewDiscoveryPending ? 1 : 0,
|
|
137
|
-
state.reviewContextManifestPath ?? null,
|
|
138
|
-
millisFromIso(state.reviewDiscoveryReadyAt),
|
|
139
|
-
millisFromIso(state.reviewConvoyForkedAt),
|
|
140
|
-
state.reviewForkCacheChecked == null ? null : state.reviewForkCacheChecked ? 1 : 0,
|
|
141
|
-
state.reviewForkedFromParent == null ? null : state.reviewForkedFromParent ? 1 : 0,
|
|
142
|
-
updatedAt
|
|
143
|
-
];
|
|
144
|
-
}
|
|
145
|
-
function getOverdeckAgentStateSync(agentId) {
|
|
146
|
-
const row = getOverdeckDatabaseSync().prepare(`${SELECT_AGENT_SQL} WHERE id = ?`).get(agentId);
|
|
147
|
-
return row ? overdeckRowToAgentState(row) : null;
|
|
148
|
-
}
|
|
149
|
-
function listOverdeckAgentStatesSync() {
|
|
150
|
-
return getOverdeckDatabaseSync().prepare(SELECT_AGENT_SQL).all().map(overdeckRowToAgentState);
|
|
151
|
-
}
|
|
152
|
-
function saveOverdeckAgentStateSync(state) {
|
|
153
|
-
const db = getOverdeckDatabaseSync();
|
|
154
|
-
const updatedAt = Date.now();
|
|
155
|
-
db.prepare(`INSERT OR IGNORE INTO issues (id, stage, updated_at) VALUES (?, 'working', ?)`).run(state.issueId, updatedAt);
|
|
156
|
-
db.prepare(`INSERT OR REPLACE INTO agents (${AGENT_COLUMNS_FOR_DB.join(", ")}) VALUES (${AGENT_COLUMNS_FOR_DB.map(() => "?").join(", ")})`).run(...stateToOverdeckParamsForDb(state, updatedAt));
|
|
157
|
-
}
|
|
158
|
-
var AGENT_COLUMNS_FOR_DB, SELECT_AGENT_SQL;
|
|
159
|
-
var init_agent_state_sync = __esmMin((() => {
|
|
160
|
-
init_infra();
|
|
161
|
-
AGENT_COLUMNS_FOR_DB = [
|
|
162
|
-
"id",
|
|
163
|
-
"issue_id",
|
|
164
|
-
"role",
|
|
165
|
-
"status",
|
|
166
|
-
"workspace",
|
|
167
|
-
"session_id",
|
|
168
|
-
"harness",
|
|
169
|
-
"model",
|
|
170
|
-
"host_override",
|
|
171
|
-
"delivery_method",
|
|
172
|
-
"started_at",
|
|
173
|
-
"last_resume_at",
|
|
174
|
-
"stopped_by_user",
|
|
175
|
-
"stopped_by_pause",
|
|
176
|
-
"kickoff_delivered",
|
|
177
|
-
"paused",
|
|
178
|
-
"paused_reason",
|
|
179
|
-
"yielded_by_scheduler",
|
|
180
|
-
"yielded_at",
|
|
181
|
-
"last_yield_resume_at",
|
|
182
|
-
"troubled",
|
|
183
|
-
"channels_enabled",
|
|
184
|
-
"consecutive_failures",
|
|
185
|
-
"first_failure_in_run_at",
|
|
186
|
-
"last_failure_next_retry_at",
|
|
187
|
-
"stopped_at",
|
|
188
|
-
"paused_at",
|
|
189
|
-
"troubled_at",
|
|
190
|
-
"last_activity",
|
|
191
|
-
"last_failure_reason",
|
|
192
|
-
"phase",
|
|
193
|
-
"role_run_head",
|
|
194
|
-
"flywheel_run_id",
|
|
195
|
-
"cost_so_far",
|
|
196
|
-
"review_sub_role",
|
|
197
|
-
"review_run_id",
|
|
198
|
-
"review_synthesis_agent_id",
|
|
199
|
-
"review_output_path",
|
|
200
|
-
"review_deadline_at",
|
|
201
|
-
"review_monitor_signaled",
|
|
202
|
-
"review_retry_attempt",
|
|
203
|
-
"review_discovery_pending",
|
|
204
|
-
"review_context_manifest_path",
|
|
205
|
-
"review_discovery_ready_at",
|
|
206
|
-
"review_convoy_forked_at",
|
|
207
|
-
"review_fork_cache_checked",
|
|
208
|
-
"review_forked_from_parent",
|
|
209
|
-
"updated_at"
|
|
210
|
-
];
|
|
211
|
-
SELECT_AGENT_SQL = `SELECT ${AGENT_COLUMNS_FOR_DB.join(", ")} FROM agents`;
|
|
212
|
-
}));
|
|
213
|
-
//#endregion
|
|
214
|
-
//#region ../../lib/pan-dir/records.ts
|
|
215
|
-
/**
|
|
216
|
-
* PAN-1908 / PAN-1919: per-issue permanent-record builder.
|
|
217
|
-
*
|
|
218
|
-
* Builds a single JSON record per issue from SQLite (pipeline verdicts, usage,
|
|
219
|
-
* merges) plus the legacy project-side continue file. The actual read/write/path
|
|
220
|
-
* helpers live in `record.ts` (PAN-1919 single-writer module) and write the
|
|
221
|
-
* record onto the feature branch at `<workspace>/.pan/records/<issue>.json`.
|
|
222
|
-
*/
|
|
223
|
-
function projectContinue(raw) {
|
|
224
|
-
return {
|
|
225
|
-
decisions: raw?.decisions,
|
|
226
|
-
hazards: raw?.hazards,
|
|
227
|
-
resumePoint: raw?.resumePoint,
|
|
228
|
-
sessionHistory: raw?.sessionHistory,
|
|
229
|
-
feedback: raw?.feedback ?? [],
|
|
230
|
-
scopeDrift: raw?.scopeDrift
|
|
231
|
-
};
|
|
232
|
-
}
|
|
233
|
-
function projectPipeline(issueId, status, existing) {
|
|
234
|
-
const base = {
|
|
235
|
-
issueId,
|
|
236
|
-
reviewStatus: status?.reviewStatus ?? "pending",
|
|
237
|
-
testStatus: status?.testStatus ?? "pending",
|
|
238
|
-
verificationStatus: status?.verificationStatus,
|
|
239
|
-
inspectStatus: status?.inspectStatus,
|
|
240
|
-
mergeStatus: status?.mergeStatus,
|
|
241
|
-
releaseStatus: status?.releaseStatus ?? "pending",
|
|
242
|
-
readyForMerge: status?.readyForMerge ?? false,
|
|
243
|
-
closedOut: existing?.closedOut,
|
|
244
|
-
closedOutAt: existing?.closedOutAt,
|
|
245
|
-
panDoneRecoveredAt: existing?.panDoneRecoveredAt,
|
|
246
|
-
updatedAt: status?.updatedAt ?? (/* @__PURE__ */ new Date()).toISOString()
|
|
247
|
-
};
|
|
248
|
-
if (!status) return base;
|
|
249
|
-
return {
|
|
250
|
-
...base,
|
|
251
|
-
reviewNotes: status.reviewNotes,
|
|
252
|
-
testNotes: status.testNotes,
|
|
253
|
-
verificationNotes: status.verificationNotes,
|
|
254
|
-
inspectNotes: status.inspectNotes,
|
|
255
|
-
mergeNotes: status.mergeNotes,
|
|
256
|
-
blockerReasons: status.blockerReasons,
|
|
257
|
-
prUrl: status.prUrl,
|
|
258
|
-
prNumber: status.prNumber,
|
|
259
|
-
prHeadSha: status.prHeadSha,
|
|
260
|
-
reviewedAtCommit: status.reviewedAtCommit,
|
|
261
|
-
lastVerifiedCommit: status.lastVerifiedCommit,
|
|
262
|
-
reviewRequestedAt: status.reviewRequestedAt,
|
|
263
|
-
reviewSpawnedAt: typeof status.reviewSpawnedAt === "number" ? new Date(status.reviewSpawnedAt).toISOString() : status.reviewSpawnedAt,
|
|
264
|
-
scopeDrift: status.scopeDrift,
|
|
265
|
-
autoMerge: status.autoMerge,
|
|
266
|
-
deaconIgnored: status.deaconIgnored,
|
|
267
|
-
deaconIgnoredAt: status.deaconIgnoredAt,
|
|
268
|
-
deaconIgnoredReason: status.deaconIgnoredReason,
|
|
269
|
-
reviewerVerdicts: status.reviewerVerdicts,
|
|
270
|
-
strikeReadyHead: status.strikeReadyHead,
|
|
271
|
-
strikeReadyAt: status.strikeReadyAt,
|
|
272
|
-
strikeLandingState: status.strikeLandingState,
|
|
273
|
-
strikeRecoveryCount: status.strikeRecoveryCount,
|
|
274
|
-
strikeLandingAttempts: status.strikeLandingAttempts
|
|
275
|
-
};
|
|
276
|
-
}
|
|
277
|
-
function projectUsage(issueId) {
|
|
278
|
-
const { byStage, totals } = getCostBreakdownByStageAndModelSync(issueId);
|
|
279
|
-
return {
|
|
280
|
-
byStage,
|
|
281
|
-
totals,
|
|
282
|
-
costAtCloseOut: {
|
|
283
|
-
usd: getCostForIssueSync(issueId)?.totalCost ?? 0,
|
|
284
|
-
pricingAsOf: (/* @__PURE__ */ new Date()).toISOString()
|
|
285
|
-
}
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
function projectMerges(issueId) {
|
|
289
|
-
const mergeSet = getMergeSetSync(issueId);
|
|
290
|
-
if (!mergeSet) return [];
|
|
291
|
-
return mergeSet.repos.map((r) => r.artifactUrl).filter((url) => typeof url === "string" && url.length > 0);
|
|
292
|
-
}
|
|
293
|
-
function resolveContinuePath(projectRoot, issueId) {
|
|
294
|
-
const stateHome = resolveStateReadHomeSync(findProjectByPathSync(projectRoot) ?? {
|
|
295
|
-
name: projectRoot,
|
|
296
|
-
path: projectRoot
|
|
297
|
-
});
|
|
298
|
-
const basePath = join(stateHome.migrated ? join(stateHome.root, PAN_CONTINUES_DIRNAME) : join(stateHome.root, PAN_DIRNAME, PAN_CONTINUES_DIRNAME), issueId.toLowerCase());
|
|
299
|
-
const canonicalPath = `${basePath}${XBRIEF_FILENAME_SUFFIX}`;
|
|
300
|
-
const legacyPath = `${basePath}${LEGACY_VBRIEF_FILENAME_SUFFIX}`;
|
|
301
|
-
if (existsSync(canonicalPath)) return canonicalPath;
|
|
302
|
-
if (existsSync(legacyPath)) return legacyPath;
|
|
303
|
-
return canonicalPath;
|
|
304
|
-
}
|
|
305
|
-
async function readLegacyContinueText(projectRoot, issueId) {
|
|
306
|
-
try {
|
|
307
|
-
return await promises.readFile(resolveContinuePath(projectRoot, issueId), "utf-8");
|
|
308
|
-
} catch {
|
|
309
|
-
return null;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
/** Read workspace continue.json and return its statusOverrides (if any). */
|
|
313
|
-
async function readWorkspaceContinueStatusOverrides(issueId) {
|
|
314
|
-
const workspacePath = getIssueWorkspacePath(issueId);
|
|
315
|
-
if (!workspacePath || !existsSync(workspacePath)) return void 0;
|
|
316
|
-
const continuePath = join(workspacePath, ".pan", "continue.json");
|
|
317
|
-
try {
|
|
318
|
-
const text = await promises.readFile(continuePath, "utf-8");
|
|
319
|
-
return JSON.parse(text).statusOverrides ?? void 0;
|
|
320
|
-
} catch {
|
|
321
|
-
return;
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
/** Read harness/model for an issue from the overdeck agents table (most recent work agent). */
|
|
325
|
-
function projectAgentHarnessModel(issueId) {
|
|
326
|
-
try {
|
|
327
|
-
const agents = listOverdeckAgentStatesSync().filter((a) => a.issueId?.toUpperCase() === issueId.toUpperCase());
|
|
328
|
-
const workAgent = agents.filter((a) => a.role === "work").sort((a, b) => (b.startedAt ?? "").localeCompare(a.startedAt ?? ""))[0] ?? agents[agents.length - 1];
|
|
329
|
-
if (workAgent?.model === "pending-work-spawn") return {};
|
|
330
|
-
return {
|
|
331
|
-
harness: workAgent?.harness,
|
|
332
|
-
model: workAgent?.model ?? void 0
|
|
333
|
-
};
|
|
334
|
-
} catch {
|
|
335
|
-
return {};
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
async function buildIssueRecord(project, issueId, opts = {}) {
|
|
339
|
-
const existing = await readIssueRecord(project, issueId);
|
|
340
|
-
const legacyContinueText = await readLegacyContinueText(project.path, issueId);
|
|
341
|
-
const continueSubset = projectContinue(legacyContinueText ? JSON.parse(legacyContinueText) : null);
|
|
342
|
-
const pipelineRecord = projectPipeline(issueId, opts.reviewStatus ?? null, existing?.pipeline);
|
|
343
|
-
const usageRecord = projectUsage(issueId);
|
|
344
|
-
const merges = projectMerges(issueId);
|
|
345
|
-
const workspaceStatusOverrides = await readWorkspaceContinueStatusOverrides(issueId);
|
|
346
|
-
const mergedStatusOverrides = workspaceStatusOverrides ? {
|
|
347
|
-
...existing?.statusOverrides ?? {},
|
|
348
|
-
...workspaceStatusOverrides
|
|
349
|
-
} : existing?.statusOverrides;
|
|
350
|
-
const liveHM = projectAgentHarnessModel(issueId);
|
|
351
|
-
const agentHM = {
|
|
352
|
-
harness: liveHM.harness ?? existing?.harness,
|
|
353
|
-
model: liveHM.model ?? existing?.model
|
|
354
|
-
};
|
|
355
|
-
return {
|
|
356
|
-
issueId: issueId.toUpperCase(),
|
|
357
|
-
schemaVersion: 2,
|
|
358
|
-
...continueSubset,
|
|
359
|
-
...existing,
|
|
360
|
-
harness: agentHM.harness,
|
|
361
|
-
model: agentHM.model,
|
|
362
|
-
statusOverrides: mergedStatusOverrides,
|
|
363
|
-
pipeline: pipelineRecord,
|
|
364
|
-
closeOut: {
|
|
365
|
-
usage: usageRecord,
|
|
366
|
-
merges,
|
|
367
|
-
ranOn: hostname(),
|
|
368
|
-
closedAt: opts.closedAt
|
|
369
|
-
},
|
|
370
|
-
owner: opts.owner ?? existing?.owner
|
|
371
|
-
};
|
|
372
|
-
}
|
|
373
|
-
/**
|
|
374
|
-
* PAN-2587: never regress the pipeline block during a whole-record rebuild. A
|
|
375
|
-
* concurrent writer (e.g. a reviewer's verdict landing between the rebuild's
|
|
376
|
-
* `existing` snapshot and its write) may have put a NEWER pipeline on disk than
|
|
377
|
-
* the status the rebuild projects — observed clobbering PAN-399's passed
|
|
378
|
-
* verdict back to a pre-verdict snapshot. Same newer-wins rule (ISO `updatedAt`
|
|
379
|
-
* comparison) the journal readers use.
|
|
380
|
-
*/
|
|
381
|
-
function pickNewerPipeline(rebuilt, fresh) {
|
|
382
|
-
if (!fresh?.updatedAt || !rebuilt?.updatedAt) return rebuilt;
|
|
383
|
-
return rebuilt.updatedAt < fresh.updatedAt ? fresh : rebuilt;
|
|
384
|
-
}
|
|
385
|
-
/**
|
|
386
|
-
* PAN-1908 / PAN-1919: rebuild and queue the per-issue permanent record for a
|
|
387
|
-
* given issue. Fire-and-forget: failures are logged, never thrown, so
|
|
388
|
-
* review-status writes stay synchronous and fast.
|
|
389
|
-
*
|
|
390
|
-
* PAN-2583: returns whether the durable write actually landed, so the caller
|
|
391
|
-
* can fall back to a sandbox-writable verdict drop when it did not (a sandboxed
|
|
392
|
-
* reviewer cannot write ${OVERDECK_HOME}/state, and swallowing that here was
|
|
393
|
-
* how blocked review verdicts silently vanished).
|
|
394
|
-
*/
|
|
395
|
-
async function updateIssueRecordForIssue(issueId, reviewStatus) {
|
|
396
|
-
try {
|
|
397
|
-
const resolved = resolveProjectFromIssueSync(issueId);
|
|
398
|
-
if (!resolved) return false;
|
|
399
|
-
const project = getProjectSync(resolved.projectKey);
|
|
400
|
-
if (!project) return false;
|
|
401
|
-
const record = await buildIssueRecord(project, issueId, { reviewStatus });
|
|
402
|
-
await updateIssueRecord(project, issueId, (fresh) => {
|
|
403
|
-
if (fresh?.swarm) record.swarm = fresh.swarm;
|
|
404
|
-
if (fresh?.statusOverrides && Object.keys(fresh.statusOverrides).length > 0) record.statusOverrides = {
|
|
405
|
-
...record.statusOverrides,
|
|
406
|
-
...fresh.statusOverrides
|
|
407
|
-
};
|
|
408
|
-
record.pipeline = pickNewerPipeline(record.pipeline, fresh?.pipeline);
|
|
409
|
-
return record;
|
|
410
|
-
});
|
|
411
|
-
return true;
|
|
412
|
-
} catch (err) {
|
|
413
|
-
console.warn(`[pan-dir/records] Failed to update record for ${issueId}: ${err.message}`);
|
|
414
|
-
return false;
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
var init_records = __esmMin((() => {
|
|
418
|
-
init_types();
|
|
419
|
-
init_cost_sync();
|
|
420
|
-
init_merge_set();
|
|
421
|
-
init_projects();
|
|
422
|
-
init_state_read_home();
|
|
423
|
-
init_lifecycle();
|
|
424
|
-
init_agent_state_sync();
|
|
425
|
-
init_record();
|
|
426
|
-
init_record_update();
|
|
427
|
-
}));
|
|
428
|
-
//#endregion
|
|
429
|
-
//#region ../../lib/overdeck/review-status-record-sync.ts
|
|
430
|
-
function updateIssueRecordForReviewStatusSync(issueId, status) {
|
|
431
|
-
const write = Promise.resolve(updateIssueRecordForIssue(issueId, status)).then((landed) => {
|
|
432
|
-
if (landed === false) writeWorkspaceVerdictFallbackSync(issueId, status);
|
|
433
|
-
}).catch(() => writeWorkspaceVerdictFallbackSync(issueId, status));
|
|
434
|
-
pendingJournalWrites.add(write);
|
|
435
|
-
write.finally(() => pendingJournalWrites.delete(write));
|
|
436
|
-
}
|
|
437
|
-
/** Resolve and read the per-issue journal record's pipeline block, or null. Best-effort. */
|
|
438
|
-
function readPipelineSync(issueId) {
|
|
439
|
-
try {
|
|
440
|
-
const resolved = resolveProjectFromIssueSync(issueId);
|
|
441
|
-
if (!resolved) return null;
|
|
442
|
-
const project = getProjectSync(resolved.projectKey);
|
|
443
|
-
if (!project) return null;
|
|
444
|
-
return readIssueRecordSync(project, issueId)?.pipeline ?? null;
|
|
445
|
-
} catch {
|
|
446
|
-
return null;
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
/**
|
|
450
|
-
* PAN-1988: feedback TEXT (review / test / merge / inspect / verification notes) is durable
|
|
451
|
-
* JOURNAL state, not DB-cache state. The SQLite row holds only the queryable status flags;
|
|
452
|
-
* the human-readable notes live in the per-issue git record (`<workspace>/.pan/records/<issue>.json`,
|
|
453
|
-
* PAN-1908). This overlays those notes onto a DB-sourced status so every reader (deacon
|
|
454
|
-
* CI-failure detection, dashboard panels) stays transparent while the DB stops storing them.
|
|
455
|
-
*/
|
|
456
|
-
function enrichReviewNotesFromRecordSync(issueId, status) {
|
|
457
|
-
const pipeline = readPipelineSync(issueId);
|
|
458
|
-
if (!pipeline) return status;
|
|
459
|
-
return {
|
|
460
|
-
...status,
|
|
461
|
-
reviewNotes: pipeline.reviewNotes ?? status.reviewNotes,
|
|
462
|
-
testNotes: pipeline.testNotes ?? status.testNotes,
|
|
463
|
-
mergeNotes: pipeline.mergeNotes ?? status.mergeNotes,
|
|
464
|
-
inspectNotes: pipeline.inspectNotes ?? status.inspectNotes,
|
|
465
|
-
verificationNotes: pipeline.verificationNotes ?? status.verificationNotes,
|
|
466
|
-
scopeDrift: pipeline.scopeDrift ?? status.scopeDrift,
|
|
467
|
-
reviewRequestedAt: pipeline.reviewRequestedAt ?? status.reviewRequestedAt
|
|
468
|
-
};
|
|
469
|
-
}
|
|
470
|
-
/**
|
|
471
|
-
* The durable field subset shared by the journal record's pipeline block and the
|
|
472
|
-
* workspace verdict fallback (PAN-2583). Derived/live columns (readyForMerge,
|
|
473
|
-
* blockerReasons) are intentionally omitted — the reader recomputes them.
|
|
474
|
-
*/
|
|
475
|
-
function durableSubset(p) {
|
|
476
|
-
return {
|
|
477
|
-
reviewStatus: p.reviewStatus,
|
|
478
|
-
testStatus: p.testStatus,
|
|
479
|
-
mergeStatus: p.mergeStatus ?? void 0,
|
|
480
|
-
inspectStatus: p.inspectStatus ?? void 0,
|
|
481
|
-
verificationStatus: p.verificationStatus ?? void 0,
|
|
482
|
-
reviewNotes: p.reviewNotes,
|
|
483
|
-
testNotes: p.testNotes,
|
|
484
|
-
mergeNotes: p.mergeNotes,
|
|
485
|
-
inspectNotes: p.inspectNotes,
|
|
486
|
-
verificationNotes: p.verificationNotes,
|
|
487
|
-
scopeDrift: p.scopeDrift,
|
|
488
|
-
prUrl: p.prUrl,
|
|
489
|
-
prNumber: p.prNumber,
|
|
490
|
-
prHeadSha: p.prHeadSha,
|
|
491
|
-
reviewedAtCommit: p.reviewedAtCommit,
|
|
492
|
-
lastVerifiedCommit: p.lastVerifiedCommit,
|
|
493
|
-
reviewRequestedAt: p.reviewRequestedAt,
|
|
494
|
-
reviewSpawnedAt: p.reviewSpawnedAt,
|
|
495
|
-
reviewerVerdicts: p.reviewerVerdicts,
|
|
496
|
-
autoMerge: p.autoMerge,
|
|
497
|
-
deaconIgnored: p.deaconIgnored,
|
|
498
|
-
deaconIgnoredAt: p.deaconIgnoredAt,
|
|
499
|
-
deaconIgnoredReason: p.deaconIgnoredReason,
|
|
500
|
-
strikeReadyHead: p.strikeReadyHead,
|
|
501
|
-
strikeReadyAt: p.strikeReadyAt,
|
|
502
|
-
strikeLandingState: p.strikeLandingState,
|
|
503
|
-
strikeRecoveryCount: p.strikeRecoveryCount,
|
|
504
|
-
strikeLandingAttempts: p.strikeLandingAttempts,
|
|
505
|
-
closedOut: p.closedOut,
|
|
506
|
-
closedOutAt: p.closedOutAt
|
|
507
|
-
};
|
|
508
|
-
}
|
|
509
|
-
function workspaceVerdictFallbackPath(issueId) {
|
|
510
|
-
try {
|
|
511
|
-
const resolved = resolveProjectFromIssueSync(issueId);
|
|
512
|
-
if (!resolved) return null;
|
|
513
|
-
return join(resolved.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`, ".overdeck", "pipeline-verdict.json");
|
|
514
|
-
} catch {
|
|
515
|
-
return null;
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
function writeWorkspaceVerdictFallbackSync(issueId, status) {
|
|
519
|
-
try {
|
|
520
|
-
const path = workspaceVerdictFallbackPath(issueId);
|
|
521
|
-
if (!path) {
|
|
522
|
-
console.error(`[review-status] PAN-2583: journal write failed for ${issueId} and no workspace could be resolved — the verdict is NOT durable`);
|
|
523
|
-
return;
|
|
524
|
-
}
|
|
525
|
-
mkdirSync(dirname(path), { recursive: true });
|
|
526
|
-
const payload = {
|
|
527
|
-
issueId: issueId.toUpperCase(),
|
|
528
|
-
updatedAt: status.updatedAt ?? (/* @__PURE__ */ new Date()).toISOString(),
|
|
529
|
-
pipeline: durableSubset(status)
|
|
530
|
-
};
|
|
531
|
-
writeFileSync(path, JSON.stringify(payload, null, 2));
|
|
532
|
-
console.warn(`[review-status] journal write failed for ${issueId} — durable verdict written to workspace fallback ${path}; the host sweeps it on the next status read (PAN-2583)`);
|
|
533
|
-
} catch (err) {
|
|
534
|
-
console.error(`[review-status] PAN-2583: could not persist verdict for ${issueId} anywhere durable: ${err.message}`);
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
function readWorkspaceVerdictFallbackSync(issueId) {
|
|
538
|
-
try {
|
|
539
|
-
const path = workspaceVerdictFallbackPath(issueId);
|
|
540
|
-
if (!path || !existsSync(path)) return null;
|
|
541
|
-
const parsed = JSON.parse(readFileSync(path, "utf-8"));
|
|
542
|
-
if (!parsed?.updatedAt || !parsed.pipeline) return null;
|
|
543
|
-
return parsed;
|
|
544
|
-
} catch {
|
|
545
|
-
return null;
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
/**
|
|
549
|
-
* PAN-1988: read the journal record's durable verdict for an issue — the SOURCE OF TRUTH.
|
|
550
|
-
* Returns the record `updatedAt` (used to decide whether the journal is newer than the DB
|
|
551
|
-
* cache) plus the durable status fields (flags + feedback notes). Derived/live columns
|
|
552
|
-
* (readyForMerge, blockerReasons) are intentionally omitted — the reader recomputes them.
|
|
553
|
-
*
|
|
554
|
-
* This is what makes verdict writes host-owned: a sandboxed agent can always write the journal
|
|
555
|
-
* (workspace-local) even when it cannot write `~/.overdeck/overdeck.db`. The host reconciles
|
|
556
|
-
* the cache from this on read, so no agent has to escalate out of its sandbox to record a verdict.
|
|
557
|
-
*
|
|
558
|
-
* PAN-2583: since the records migration (PAN-2541) the journal itself lives in
|
|
559
|
-
* ${OVERDECK_HOME}/state, which a sandboxed reviewer cannot write either. When such a
|
|
560
|
-
* writer dropped its verdict into the workspace fallback instead, overlay it here —
|
|
561
|
-
* a strictly newer fallback wins over the record, and the host's own next journal
|
|
562
|
-
* write folds it back into the canonical record.
|
|
563
|
-
*/
|
|
564
|
-
function readJournalStatusSync(issueId) {
|
|
565
|
-
const p = readPipelineSync(issueId);
|
|
566
|
-
const fallback = readWorkspaceVerdictFallbackSync(issueId);
|
|
567
|
-
const fallbackNewer = !!fallback && (!p || (p.updatedAt ?? "") < fallback.updatedAt);
|
|
568
|
-
if (fallback && fallbackNewer) {
|
|
569
|
-
const base = p ? durableSubset(p) : {};
|
|
570
|
-
const overlay = Object.fromEntries(Object.entries(fallback.pipeline).filter(([, value]) => value !== void 0));
|
|
571
|
-
return {
|
|
572
|
-
updatedAt: fallback.updatedAt,
|
|
573
|
-
durable: {
|
|
574
|
-
...base,
|
|
575
|
-
...overlay
|
|
576
|
-
}
|
|
577
|
-
};
|
|
578
|
-
}
|
|
579
|
-
if (!p) return null;
|
|
580
|
-
return {
|
|
581
|
-
updatedAt: p.updatedAt,
|
|
582
|
-
durable: durableSubset(p)
|
|
583
|
-
};
|
|
584
|
-
}
|
|
585
|
-
var pendingJournalWrites;
|
|
586
|
-
var init_review_status_record_sync = __esmMin((() => {
|
|
587
|
-
init_records();
|
|
588
|
-
init_record();
|
|
589
|
-
init_projects();
|
|
590
|
-
pendingJournalWrites = /* @__PURE__ */ new Set();
|
|
591
|
-
}));
|
|
592
|
-
//#endregion
|
|
593
|
-
//#region ../../lib/review-dispatch-decision.ts
|
|
594
|
-
/**
|
|
595
|
-
* PAN-1988 auto-heal — decide whether a review needs to be (re-)dispatched from the durable
|
|
596
|
-
* journal intent, as a PURE function so it is locked by tests.
|
|
597
|
-
*
|
|
598
|
-
* The work agent's `pan done` writes a durable `reviewRequestedAt` into the journal/record (always
|
|
599
|
-
* writable, even sandboxed) BEFORE it tries to reach the dashboard. If that reactive trigger is
|
|
600
|
-
* dropped — the dashboard was mid-reload, the network blipped, the deacon is frozen — the intent
|
|
601
|
-
* survives in the journal. The host reconciles on read: when a request is newer than the last
|
|
602
|
-
* dispatch and nothing is currently reviewing, it dispatches review. This heals with NO deacon and
|
|
603
|
-
* NO live dashboard event, on the next status read.
|
|
604
|
-
*
|
|
605
|
-
* Returns true when a review dispatch is owed:
|
|
606
|
-
* - a request exists (`reviewRequestedAt` set), AND
|
|
607
|
-
* - it is newer than the last spawn (or there was never a spawn) — i.e. a genuinely un-serviced
|
|
608
|
-
* request, not the request that produced the current review, AND
|
|
609
|
-
* - a review is not already in progress (`reviewing`), AND
|
|
610
|
-
* - the issue is not already merged.
|
|
611
|
-
*/
|
|
612
|
-
function needsReviewDispatch(params) {
|
|
613
|
-
if (!params.reviewRequestedAt) return false;
|
|
614
|
-
if (params.reviewStatus === "reviewing") return false;
|
|
615
|
-
if (params.mergeStatus === "merged") return false;
|
|
616
|
-
return !params.reviewSpawnedAt || Date.parse(params.reviewRequestedAt) > new Date(params.reviewSpawnedAt).getTime();
|
|
617
|
-
}
|
|
618
|
-
var init_review_dispatch_decision = __esmMin((() => {}));
|
|
619
|
-
//#endregion
|
|
620
|
-
//#region ../../lib/review-status.ts
|
|
621
|
-
function emitReactiveLifecycleEvent(type, issueId) {
|
|
622
|
-
try {
|
|
623
|
-
notifyPipelineSync({
|
|
624
|
-
type,
|
|
625
|
-
issueId
|
|
626
|
-
});
|
|
627
|
-
} catch (error) {
|
|
628
|
-
console.warn(`[review-status] Failed to emit ${type} for ${issueId}:`, error);
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
function verificationSatisfied(status) {
|
|
632
|
-
return status.verificationStatus !== "failed";
|
|
633
|
-
}
|
|
634
|
-
/**
|
|
635
|
-
* PAN-1988: the merge-gate predicate (review passed, test passed/skipped, verification not
|
|
636
|
-
* failed, UAT ok, merge not started). Extracted so both setReviewStatusSync and the
|
|
637
|
-
* journal→DB reconcile in getReviewStatusSync derive readyForMerge identically.
|
|
638
|
-
*/
|
|
639
|
-
function reviewGatesPassedSync(s) {
|
|
640
|
-
return (s.reviewStatus === "passed" || s.reviewStatus === "skipped") && (s.testStatus === "passed" || s.testStatus === "skipped") && verificationSatisfied(s) && (s.uatStatus === void 0 || s.uatStatus === "passed") && (s.mergeStatus === "pending" || s.mergeStatus === "queued" || s.mergeStatus === void 0 || s.mergeStatus === null);
|
|
641
|
-
}
|
|
642
|
-
/**
|
|
643
|
-
* Authoritative "allowed to merge" predicate (PAN-1759). The flywheel
|
|
644
|
-
* orchestrator's pipeline verb says it INTENDS to merge an issue; this record
|
|
645
|
-
* says the pipeline ALLOWS it. Both must hold before an issue enters the merge
|
|
646
|
-
* queue or a UAT batch — RUN-20 tagged a mid-review issue with a merge verb
|
|
647
|
-
* and it rode into a promotable batch. Same criteria as the
|
|
648
|
-
* fixStuckReadyForMerge repair sweep: review passed, test passed/skipped,
|
|
649
|
-
* verification not failed, not already merged.
|
|
650
|
-
*/
|
|
651
|
-
function mergeGateEligibility(status) {
|
|
652
|
-
if (!status) return {
|
|
653
|
-
eligible: false,
|
|
654
|
-
reason: "no review record"
|
|
655
|
-
};
|
|
656
|
-
if (status.reviewStatus !== "passed" && status.reviewStatus !== "skipped") return {
|
|
657
|
-
eligible: false,
|
|
658
|
-
reason: `review is ${status.reviewStatus}`
|
|
659
|
-
};
|
|
660
|
-
if (status.testStatus !== "passed" && status.testStatus !== "skipped") return {
|
|
661
|
-
eligible: false,
|
|
662
|
-
reason: `test is ${status.testStatus}`
|
|
663
|
-
};
|
|
664
|
-
if (!verificationSatisfied(status)) return {
|
|
665
|
-
eligible: false,
|
|
666
|
-
reason: "verification failed"
|
|
667
|
-
};
|
|
668
|
-
if (status.mergeStatus === "merged") return {
|
|
669
|
-
eligible: false,
|
|
670
|
-
reason: "already merged"
|
|
671
|
-
};
|
|
672
|
-
return { eligible: true };
|
|
673
|
-
}
|
|
674
|
-
function loadReviewStatuses(filePath = DEFAULT_STATUS_FILE) {
|
|
675
|
-
if (filePath !== DEFAULT_STATUS_FILE) throw new Error("Non-default review-status paths are not supported in review-status.ts. Import from review-status-json.ts for JSON file operations.");
|
|
676
|
-
return getAllReviewStatusesFromDb();
|
|
677
|
-
}
|
|
678
|
-
function loadReviewStatusesForIssues(issueIds) {
|
|
679
|
-
return getReviewStatusesFromDb(issueIds);
|
|
680
|
-
}
|
|
681
|
-
function loadReadyForMergeFlags(issueIds) {
|
|
682
|
-
const normalizedIds = [...new Set(issueIds.map((id) => id.toUpperCase()).filter(Boolean))];
|
|
683
|
-
const dbStatuses = loadReviewStatusesForIssues(normalizedIds);
|
|
684
|
-
const flags = /* @__PURE__ */ new Map();
|
|
685
|
-
for (const issueId of normalizedIds) {
|
|
686
|
-
const dbStatus = dbStatuses[issueId] ?? null;
|
|
687
|
-
const journal = readJournalStatusSync(issueId);
|
|
688
|
-
let status = dbStatus;
|
|
689
|
-
if (journal) {
|
|
690
|
-
if (journal.durable.closedOut === true) {
|
|
691
|
-
flags.set(issueId, false);
|
|
692
|
-
continue;
|
|
693
|
-
}
|
|
694
|
-
if (!dbStatus || (dbStatus.updatedAt ?? "") < journal.updatedAt) {
|
|
695
|
-
const merged = { ...dbStatus ?? {
|
|
696
|
-
issueId,
|
|
697
|
-
reviewStatus: "pending",
|
|
698
|
-
testStatus: "pending",
|
|
699
|
-
updatedAt: journal.updatedAt,
|
|
700
|
-
readyForMerge: false
|
|
701
|
-
} };
|
|
702
|
-
for (const [key, value] of Object.entries(journal.durable)) if (value !== void 0) merged[key] = value;
|
|
703
|
-
merged.issueId = issueId;
|
|
704
|
-
merged.updatedAt = journal.updatedAt;
|
|
705
|
-
merged.readyForMerge = (merged.blockerReasons?.length ?? 0) > 0 ? false : reviewGatesPassedSync(merged);
|
|
706
|
-
status = normalizeReviewStatusSync(merged);
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
|
-
flags.set(issueId, status?.readyForMerge ?? false);
|
|
710
|
-
}
|
|
711
|
-
return flags;
|
|
712
|
-
}
|
|
713
|
-
function setReviewStatusSync(issueId, update, existing) {
|
|
714
|
-
if (/^\d+$/.test(issueId)) {
|
|
715
|
-
console.warn(`[review-status] Rejecting setReviewStatus for bare numeric ID "${issueId}" — issue IDs must include a project prefix (e.g. PAN-${issueId}).`);
|
|
716
|
-
return {
|
|
717
|
-
issueId,
|
|
718
|
-
reviewStatus: "pending",
|
|
719
|
-
testStatus: "pending",
|
|
720
|
-
updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
721
|
-
readyForMerge: false
|
|
722
|
-
};
|
|
723
|
-
}
|
|
724
|
-
issueId = issueId.toUpperCase();
|
|
725
|
-
const status = existing ?? getReviewStatusSync(issueId) ?? {
|
|
726
|
-
issueId,
|
|
727
|
-
reviewStatus: "pending",
|
|
728
|
-
testStatus: "pending",
|
|
729
|
-
updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
730
|
-
readyForMerge: false
|
|
731
|
-
};
|
|
732
|
-
if (update.reviewStatus === "reviewing" && status.reviewStatus === "passed" && update.mergeStatus === void 0) {
|
|
733
|
-
console.warn(`[review-status] Rejecting reviewStatus regression from 'passed' to 'reviewing' for ${issueId} (mergeStatus not being reset)`);
|
|
734
|
-
notifyPipelineSync({
|
|
735
|
-
type: "status_changed",
|
|
736
|
-
issueId,
|
|
737
|
-
status
|
|
738
|
-
});
|
|
739
|
-
return status;
|
|
740
|
-
}
|
|
741
|
-
if (update.reviewStatus === "reviewing" && (status.reviewStatus === "blocked" || status.reviewStatus === "failed") && update.reviewSpawnedAt === void 0) {
|
|
742
|
-
console.warn(`[review-status] Rejecting stale 'reviewing' write for ${issueId} — a terminal '${status.reviewStatus}' verdict is already recorded for this review cycle. Only a new dispatch (carrying reviewSpawnedAt) may re-enter 'reviewing'.`);
|
|
743
|
-
notifyPipelineSync({
|
|
744
|
-
type: "status_changed",
|
|
745
|
-
issueId,
|
|
746
|
-
status
|
|
747
|
-
});
|
|
748
|
-
return status;
|
|
749
|
-
}
|
|
750
|
-
if ((update.testStatus === "dispatch_failed" || update.testStatus === "failed") && status.testStatus === "passed") {
|
|
751
|
-
console.warn(`[review-status] Rejecting testStatus regression from 'passed' to '${update.testStatus}' for ${issueId}`);
|
|
752
|
-
delete update.testStatus;
|
|
753
|
-
delete update.testNotes;
|
|
754
|
-
}
|
|
755
|
-
const merged = {
|
|
756
|
-
...status,
|
|
757
|
-
...update
|
|
758
|
-
};
|
|
759
|
-
if (update.reviewerVerdicts && status.reviewerVerdicts) merged.reviewerVerdicts = {
|
|
760
|
-
...status.reviewerVerdicts,
|
|
761
|
-
...update.reviewerVerdicts
|
|
762
|
-
};
|
|
763
|
-
const history = [...status.history || []];
|
|
764
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
765
|
-
if (update.reviewStatus && update.reviewStatus !== status.reviewStatus) history.push({
|
|
766
|
-
type: "review",
|
|
767
|
-
status: update.reviewStatus,
|
|
768
|
-
timestamp: now,
|
|
769
|
-
notes: update.reviewNotes
|
|
770
|
-
});
|
|
771
|
-
if (update.testStatus && update.testStatus !== status.testStatus) history.push({
|
|
772
|
-
type: "test",
|
|
773
|
-
status: update.testStatus,
|
|
774
|
-
timestamp: now,
|
|
775
|
-
notes: update.testNotes
|
|
776
|
-
});
|
|
777
|
-
if (update.uatStatus && update.uatStatus !== status.uatStatus) history.push({
|
|
778
|
-
type: "uat",
|
|
779
|
-
status: update.uatStatus,
|
|
780
|
-
timestamp: now,
|
|
781
|
-
notes: update.uatNotes
|
|
782
|
-
});
|
|
783
|
-
if (update.mergeStatus && update.mergeStatus !== status.mergeStatus) history.push({
|
|
784
|
-
type: "merge",
|
|
785
|
-
status: update.mergeStatus,
|
|
786
|
-
timestamp: now
|
|
787
|
-
});
|
|
788
|
-
if (update.releaseStatus && update.releaseStatus !== status.releaseStatus) history.push({
|
|
789
|
-
type: "release",
|
|
790
|
-
status: update.releaseStatus,
|
|
791
|
-
timestamp: now,
|
|
792
|
-
notes: update.releaseNotes
|
|
793
|
-
});
|
|
794
|
-
while (history.length > 10) history.shift();
|
|
795
|
-
const readyForMerge = (merged.blockerReasons?.length ?? 0) > 0 ? false : update.readyForMerge !== void 0 ? update.readyForMerge : reviewGatesPassedSync(merged);
|
|
796
|
-
const updated = normalizeReviewStatusSync({
|
|
797
|
-
...merged,
|
|
798
|
-
issueId,
|
|
799
|
-
updatedAt: now,
|
|
800
|
-
readyForMerge,
|
|
801
|
-
history
|
|
802
|
-
});
|
|
803
|
-
if (readyForMerge && !status.readyForMerge && updated.prUrl) (async () => {
|
|
804
|
-
try {
|
|
805
|
-
const { isGitHubAppConfigured, reportCommitStatus } = await import("./github-app-CPfoFAdV.js");
|
|
806
|
-
if (!isGitHubAppConfigured()) return;
|
|
807
|
-
const prMatch = updated.prUrl.match(/github\.com\/([^/]+)\/([^/]+)\/pull/);
|
|
808
|
-
if (!prMatch) return;
|
|
809
|
-
const [, owner, repo] = prMatch;
|
|
810
|
-
const { exec } = await import("child_process");
|
|
811
|
-
const { promisify } = await import("util");
|
|
812
|
-
const { stdout } = await promisify(exec)(`gh pr view ${updated.prUrl.match(/\/pull\/(\d+)/)?.[1]} --json headRefOid --jq .headRefOid`, {
|
|
813
|
-
encoding: "utf-8",
|
|
814
|
-
timeout: 1e4
|
|
815
|
-
});
|
|
816
|
-
const sha = stdout.trim();
|
|
817
|
-
if (sha) {
|
|
818
|
-
await reportCommitStatus(owner, repo, sha, "success", "overdeck/review", "Review passed");
|
|
819
|
-
console.log(`[review-status] Reported overdeck/review for ${issueId} (${sha.slice(0, 8)})`);
|
|
820
|
-
}
|
|
821
|
-
} catch (err) {
|
|
822
|
-
console.warn(`[review-status] Failed to report commit status: ${err.message}`);
|
|
823
|
-
}
|
|
824
|
-
})();
|
|
825
|
-
updateIssueRecordForReviewStatusSync(issueId, updated);
|
|
826
|
-
try {
|
|
827
|
-
upsertReviewStatusSync(updated);
|
|
828
|
-
} catch (err) {
|
|
829
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
830
|
-
console.warn(`[review-status] DB cache write skipped for ${issueId} (${msg}); journal holds the verdict, host will reconcile on read.`);
|
|
831
|
-
}
|
|
832
|
-
notifyPipelineSync({
|
|
833
|
-
type: "status_changed",
|
|
834
|
-
issueId,
|
|
835
|
-
status: updated
|
|
836
|
-
});
|
|
837
|
-
if (update.verificationStatus && update.verificationStatus !== status.verificationStatus) {
|
|
838
|
-
const entry = {
|
|
839
|
-
running: {
|
|
840
|
-
level: "info",
|
|
841
|
-
msg: `${issueId} — verification running`,
|
|
842
|
-
tts: `${issueId} verification running`
|
|
843
|
-
},
|
|
844
|
-
passed: {
|
|
845
|
-
level: "success",
|
|
846
|
-
msg: `${issueId} — verification passed`,
|
|
847
|
-
tts: `${issueId} verification passed`
|
|
848
|
-
},
|
|
849
|
-
failed: {
|
|
850
|
-
level: "error",
|
|
851
|
-
msg: `${issueId} — verification failed`,
|
|
852
|
-
tts: `${issueId} verification failed`
|
|
853
|
-
},
|
|
854
|
-
skipped: {
|
|
855
|
-
level: "info",
|
|
856
|
-
msg: `${issueId} — verification skipped`,
|
|
857
|
-
tts: `${issueId} verification skipped`,
|
|
858
|
-
ttsPriority: 2
|
|
859
|
-
}
|
|
860
|
-
}[update.verificationStatus];
|
|
861
|
-
if (entry) emitActivityEntrySync({
|
|
862
|
-
source: "cloister",
|
|
863
|
-
level: entry.level,
|
|
864
|
-
message: entry.msg,
|
|
865
|
-
details: update.verificationNotes,
|
|
866
|
-
issueId
|
|
867
|
-
});
|
|
868
|
-
if (entry?.tts) emitActivityTtsSync({
|
|
869
|
-
utterance: entry.tts,
|
|
870
|
-
priority: entry.ttsPriority ?? (entry.level === "error" ? 0 : 1),
|
|
871
|
-
issueId,
|
|
872
|
-
source: "cloister",
|
|
873
|
-
eventType: `verificationStatus.${update.verificationStatus}`
|
|
874
|
-
});
|
|
875
|
-
}
|
|
876
|
-
if (update.reviewStatus && update.reviewStatus !== status.reviewStatus) {
|
|
877
|
-
let reviewMsg = `${issueId} — review started`;
|
|
878
|
-
if (update.reviewStatus === "reviewing") {
|
|
879
|
-
const retryCount = updated.reviewRetryCount ?? 0;
|
|
880
|
-
reviewMsg = retryCount > 0 ? `${issueId} — review re-dispatched (retry ${retryCount})` : `${issueId} — review started`;
|
|
881
|
-
}
|
|
882
|
-
const entry = {
|
|
883
|
-
reviewing: {
|
|
884
|
-
level: "info",
|
|
885
|
-
msg: reviewMsg,
|
|
886
|
-
tts: `${issueId} review started`
|
|
887
|
-
},
|
|
888
|
-
passed: {
|
|
889
|
-
level: "success",
|
|
890
|
-
msg: `${issueId} — review passed`,
|
|
891
|
-
tts: `${issueId} review passed`
|
|
892
|
-
},
|
|
893
|
-
failed: {
|
|
894
|
-
level: "error",
|
|
895
|
-
msg: `${issueId} — review failed`,
|
|
896
|
-
tts: `${issueId} review failed`
|
|
897
|
-
},
|
|
898
|
-
blocked: {
|
|
899
|
-
level: "warn",
|
|
900
|
-
msg: `${issueId} — review blocked (changes requested)`,
|
|
901
|
-
tts: `${issueId} review blocked`
|
|
902
|
-
}
|
|
903
|
-
}[update.reviewStatus];
|
|
904
|
-
if (entry) emitActivityEntrySync({
|
|
905
|
-
source: "review",
|
|
906
|
-
level: entry.level,
|
|
907
|
-
message: entry.msg,
|
|
908
|
-
details: update.reviewNotes,
|
|
909
|
-
issueId
|
|
910
|
-
});
|
|
911
|
-
if (entry?.tts) emitActivityTtsSync({
|
|
912
|
-
utterance: entry.tts,
|
|
913
|
-
priority: entry.level === "error" ? 0 : 1,
|
|
914
|
-
issueId,
|
|
915
|
-
source: "review-specialist",
|
|
916
|
-
eventType: `reviewStatus.${update.reviewStatus}`
|
|
917
|
-
});
|
|
918
|
-
}
|
|
919
|
-
if (update.testStatus && update.testStatus !== status.testStatus) {
|
|
920
|
-
const entry = {
|
|
921
|
-
testing: {
|
|
922
|
-
level: "info",
|
|
923
|
-
msg: `${issueId} — tests running`,
|
|
924
|
-
tts: `${issueId} tests running`,
|
|
925
|
-
ttsPriority: 2
|
|
926
|
-
},
|
|
927
|
-
passed: {
|
|
928
|
-
level: "success",
|
|
929
|
-
msg: `${issueId} — tests passed`,
|
|
930
|
-
tts: `${issueId} tests passed`
|
|
931
|
-
},
|
|
932
|
-
failed: {
|
|
933
|
-
level: "error",
|
|
934
|
-
msg: `${issueId} — tests failed`,
|
|
935
|
-
tts: `${issueId} tests failed`
|
|
936
|
-
},
|
|
937
|
-
skipped: {
|
|
938
|
-
level: "info",
|
|
939
|
-
msg: `${issueId} — tests skipped`,
|
|
940
|
-
tts: `${issueId} tests skipped`,
|
|
941
|
-
ttsPriority: 2
|
|
942
|
-
},
|
|
943
|
-
dispatch_failed: {
|
|
944
|
-
level: "warn",
|
|
945
|
-
msg: `${issueId} — test dispatch failed`,
|
|
946
|
-
tts: `${issueId} test dispatch failed`,
|
|
947
|
-
ttsPriority: 1
|
|
948
|
-
}
|
|
949
|
-
}[update.testStatus];
|
|
950
|
-
if (entry) emitActivityEntrySync({
|
|
951
|
-
source: "test",
|
|
952
|
-
level: entry.level,
|
|
953
|
-
message: entry.msg,
|
|
954
|
-
details: update.testNotes,
|
|
955
|
-
issueId
|
|
956
|
-
});
|
|
957
|
-
if (entry?.tts) emitActivityTtsSync({
|
|
958
|
-
utterance: entry.tts,
|
|
959
|
-
priority: entry.ttsPriority ?? (entry.level === "error" ? 0 : 1),
|
|
960
|
-
issueId,
|
|
961
|
-
source: "test-specialist",
|
|
962
|
-
eventType: `testStatus.${update.testStatus}`
|
|
963
|
-
});
|
|
964
|
-
}
|
|
965
|
-
if (update.mergeStatus && update.mergeStatus !== status.mergeStatus) {
|
|
966
|
-
const entry = {
|
|
967
|
-
queued: {
|
|
968
|
-
level: "info",
|
|
969
|
-
msg: `${issueId} — queued for merge`,
|
|
970
|
-
tts: `${issueId} queued for merge`,
|
|
971
|
-
ttsPriority: 2
|
|
972
|
-
},
|
|
973
|
-
merging: {
|
|
974
|
-
level: "info",
|
|
975
|
-
msg: `${issueId} — merge in progress`,
|
|
976
|
-
tts: `${issueId} merge in progress`,
|
|
977
|
-
ttsPriority: 2
|
|
978
|
-
},
|
|
979
|
-
verifying: {
|
|
980
|
-
level: "info",
|
|
981
|
-
msg: `${issueId} — post-merge verification`,
|
|
982
|
-
tts: `${issueId} post-merge verification running`,
|
|
983
|
-
ttsPriority: 2
|
|
984
|
-
},
|
|
985
|
-
merged: {
|
|
986
|
-
level: "success",
|
|
987
|
-
msg: `${issueId} — merged`,
|
|
988
|
-
tts: `${issueId} merged to main`
|
|
989
|
-
},
|
|
990
|
-
failed: {
|
|
991
|
-
level: "error",
|
|
992
|
-
msg: `${issueId} — merge failed`,
|
|
993
|
-
tts: `${issueId} merge failed`
|
|
994
|
-
}
|
|
995
|
-
}[update.mergeStatus];
|
|
996
|
-
if (entry) emitActivityEntrySync({
|
|
997
|
-
source: "ship",
|
|
998
|
-
level: entry.level,
|
|
999
|
-
message: entry.msg,
|
|
1000
|
-
details: update.mergeNotes,
|
|
1001
|
-
issueId
|
|
1002
|
-
});
|
|
1003
|
-
if (entry?.tts) emitActivityTtsSync({
|
|
1004
|
-
utterance: entry.tts,
|
|
1005
|
-
priority: entry.ttsPriority ?? (entry.level === "error" ? 0 : 1),
|
|
1006
|
-
issueId,
|
|
1007
|
-
source: "merge-agent",
|
|
1008
|
-
eventType: `mergeStatus.${update.mergeStatus}`
|
|
1009
|
-
});
|
|
1010
|
-
}
|
|
1011
|
-
if (update.readyForMerge === true && !status.readyForMerge) {
|
|
1012
|
-
emitActivityEntrySync({
|
|
1013
|
-
source: "cloister",
|
|
1014
|
-
level: "success",
|
|
1015
|
-
message: `${issueId} — ready for merge`,
|
|
1016
|
-
issueId
|
|
1017
|
-
});
|
|
1018
|
-
emitActivityTtsSync({
|
|
1019
|
-
utterance: `${issueId} ready for merge`,
|
|
1020
|
-
priority: 1,
|
|
1021
|
-
issueId,
|
|
1022
|
-
source: "cloister",
|
|
1023
|
-
eventType: "readyForMerge"
|
|
1024
|
-
});
|
|
1025
|
-
}
|
|
1026
|
-
if ((update.reviewStatus === "passed" || update.reviewStatus === "skipped") && status.reviewStatus !== "passed" && status.reviewStatus !== "skipped" && updated.testStatus === "pending") if (updated.reviewedAtCommit && updated.lastVerifiedCommit && updated.reviewedAtCommit === updated.lastVerifiedCommit) {
|
|
1027
|
-
console.log(`[review-status] Skipping test role for ${issueId} — no code drift since verification (HEAD=${updated.reviewedAtCommit.slice(0, 8)})`);
|
|
1028
|
-
emitActivityEntrySync({
|
|
1029
|
-
source: "cloister",
|
|
1030
|
-
level: "info",
|
|
1031
|
-
message: `${issueId} — tests skipped (no code change since verification gate)`,
|
|
1032
|
-
issueId
|
|
1033
|
-
});
|
|
1034
|
-
setReviewStatusSync(issueId, {
|
|
1035
|
-
testStatus: "passed",
|
|
1036
|
-
testNotes: "Skipped: no code changed since pre-review verification gate",
|
|
1037
|
-
verificationStatus: "passed",
|
|
1038
|
-
verificationNotes: "Pre-review verification already covered the reviewed commit"
|
|
1039
|
-
});
|
|
1040
|
-
emitReactiveLifecycleEvent("test.passed", issueId);
|
|
1041
|
-
} else emitReactiveLifecycleEvent("review.approved", issueId);
|
|
1042
|
-
if (update.testStatus === "passed" && status.testStatus !== "passed") emitReactiveLifecycleEvent("test.passed", issueId);
|
|
1043
|
-
if ((update.testStatus === "failed" || update.testStatus === "dispatch_failed") && status.testStatus !== "failed" && status.testStatus !== "dispatch_failed") deliverTestFailureToWorkAgentHostSide(issueId, updated);
|
|
1044
|
-
return updated;
|
|
1045
|
-
}
|
|
1046
|
-
function resetPipelineVerdictsForWorkStartSync(issueId, options = {}) {
|
|
1047
|
-
const status = getReviewStatusSync(issueId);
|
|
1048
|
-
if (!status) return null;
|
|
1049
|
-
if (status.reviewStatus === "pending" && status.testStatus === "pending" && (status.mergeStatus === void 0 || status.mergeStatus === "pending") && (status.verificationStatus === void 0 || status.verificationStatus === "pending") && !status.readyForMerge && status.autoRequeueCount === 0 && status.verificationCycleCount === 0 && status.reviewRetryCount === 0 && status.testRetryCount === 0 && status.mergeRetryCount === 0 && status.recoveryStartedAt === void 0 && status.reviewedAtCommit === void 0 && status.lastVerifiedCommit === void 0 && !options.force) return null;
|
|
1050
|
-
return setReviewStatusSync(issueId, {
|
|
1051
|
-
reviewStatus: "pending",
|
|
1052
|
-
testStatus: "pending",
|
|
1053
|
-
mergeStatus: "pending",
|
|
1054
|
-
reviewNotes: void 0,
|
|
1055
|
-
testNotes: void 0,
|
|
1056
|
-
mergeNotes: void 0,
|
|
1057
|
-
readyForMerge: false,
|
|
1058
|
-
autoRequeueCount: 0,
|
|
1059
|
-
verificationStatus: "pending",
|
|
1060
|
-
verificationNotes: void 0,
|
|
1061
|
-
verificationCycleCount: 0,
|
|
1062
|
-
stuck: false,
|
|
1063
|
-
stuckReason: void 0,
|
|
1064
|
-
stuckAt: void 0,
|
|
1065
|
-
stuckDetails: void 0,
|
|
1066
|
-
reviewRetryCount: 0,
|
|
1067
|
-
testRetryCount: 0,
|
|
1068
|
-
mergeRetryCount: 0,
|
|
1069
|
-
recoveryStartedAt: void 0,
|
|
1070
|
-
reviewedAtCommit: void 0,
|
|
1071
|
-
lastVerifiedCommit: void 0,
|
|
1072
|
-
reviewRequestedAt: void 0,
|
|
1073
|
-
reviewSpawnedAt: void 0,
|
|
1074
|
-
conflictResolutionDispatchedAt: void 0,
|
|
1075
|
-
blockerReasons: void 0,
|
|
1076
|
-
reviewerVerdicts: void 0
|
|
1077
|
-
});
|
|
1078
|
-
}
|
|
1079
|
-
/**
|
|
1080
|
-
* PAN-1988 — deliver review feedback to the work agent from the HOST when a blocked/failed
|
|
1081
|
-
* verdict is reconciled from the journal. Dynamic import to avoid a static import cycle
|
|
1082
|
-
* (review-verdict-feedback → review-status). Fully best-effort: in a sandboxed agent process the
|
|
1083
|
-
* delivery fails (host paths blocked) and is swallowed; the host process performs the real
|
|
1084
|
-
* notification. Never throws into the read path.
|
|
1085
|
-
*/
|
|
1086
|
-
async function deliverReviewVerdictFeedbackHostSide(issueId, status) {
|
|
1087
|
-
try {
|
|
1088
|
-
const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-C1Kg8n7t.js");
|
|
1089
|
-
if ((await Effect.runPromise(deliverReviewVerdictFeedback({
|
|
1090
|
-
issueId,
|
|
1091
|
-
verdict: status.reviewStatus === "failed" ? "failed" : "blocked",
|
|
1092
|
-
notes: status.reviewNotes,
|
|
1093
|
-
prUrl: status.prUrl
|
|
1094
|
-
}))).agentMessageSent) console.log(`[review-status] delivered review feedback to the work agent for ${issueId} (host-side)`);
|
|
1095
|
-
} catch (err) {
|
|
1096
|
-
console.warn(`[review-status] host-side review feedback delivery for ${issueId} did not complete (non-fatal): ${err instanceof Error ? err.message : String(err)}`);
|
|
1097
|
-
}
|
|
1098
|
-
}
|
|
1099
|
-
/**
|
|
1100
|
-
* PAN-1988 auto-heal — the host re-dispatches review from the durable journal intent. When the
|
|
1101
|
-
* work agent's `pan done` recorded a `reviewRequestedAt` but the reactive dashboard trigger never
|
|
1102
|
-
* landed (dashboard reloading, dropped event, frozen deacon), the next status read notices the
|
|
1103
|
-
* un-serviced request and dispatches review here. {@link needsReviewDispatch} gates it,
|
|
1104
|
-
* spawnReviewRoleForIssue is idempotent (it skips a live review), and a 30s throttle bounds retries
|
|
1105
|
-
* for a gated issue. Fire-and-forget; in a sandboxed reader the dispatch is a best-effort no-op.
|
|
1106
|
-
*/
|
|
1107
|
-
function maybeAutoDispatchReviewHostSide(issueId, status) {
|
|
1108
|
-
if (!needsReviewDispatch({
|
|
1109
|
-
reviewRequestedAt: status.reviewRequestedAt,
|
|
1110
|
-
reviewSpawnedAt: status.reviewSpawnedAt,
|
|
1111
|
-
reviewStatus: status.reviewStatus,
|
|
1112
|
-
mergeStatus: status.mergeStatus
|
|
1113
|
-
})) return;
|
|
1114
|
-
const last = reviewDispatchAttemptAt.get(issueId) ?? 0;
|
|
1115
|
-
if (Date.now() - last < REVIEW_AUTO_DISPATCH_THROTTLE_MS) return;
|
|
1116
|
-
reviewDispatchAttemptAt.set(issueId, Date.now());
|
|
1117
|
-
dispatchReviewHostSide(issueId, status.prUrl);
|
|
1118
|
-
}
|
|
1119
|
-
async function dispatchReviewHostSide(issueId, prUrl) {
|
|
1120
|
-
try {
|
|
1121
|
-
const { resolveProjectFromIssueSync } = await import("./projects-9SkRpES9.js");
|
|
1122
|
-
const resolved = resolveProjectFromIssueSync(issueId);
|
|
1123
|
-
if (!resolved) return;
|
|
1124
|
-
const { existsSync } = await import("fs");
|
|
1125
|
-
const workspace = join$1(resolved.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
|
|
1126
|
-
if (!existsSync(workspace)) return;
|
|
1127
|
-
let branch = `feature/${issueId.toLowerCase()}`;
|
|
1128
|
-
try {
|
|
1129
|
-
const { promisify } = await import("util");
|
|
1130
|
-
const { exec } = await import("child_process");
|
|
1131
|
-
const { stdout } = await promisify(exec)("git branch --show-current", {
|
|
1132
|
-
cwd: workspace,
|
|
1133
|
-
encoding: "utf-8"
|
|
1134
|
-
});
|
|
1135
|
-
branch = stdout.trim() || branch;
|
|
1136
|
-
} catch {}
|
|
1137
|
-
const { spawnReviewRoleForIssue } = await import("./review-agent-DJRO8EG8.js");
|
|
1138
|
-
const result = await Effect.runPromise(spawnReviewRoleForIssue({
|
|
1139
|
-
issueId,
|
|
1140
|
-
workspace,
|
|
1141
|
-
branch,
|
|
1142
|
-
...prUrl ? { prUrl } : {}
|
|
1143
|
-
}));
|
|
1144
|
-
if (result.success) if (result.message?.startsWith("Review already in progress")) console.log(`[review-status] review dispatch for ${issueId}: already in progress — no-op (host-side)`);
|
|
1145
|
-
else console.log(`[review-status] auto-dispatched review for ${issueId} from durable journal intent (host-side)`);
|
|
1146
|
-
} catch (err) {
|
|
1147
|
-
console.warn(`[review-status] host-side review auto-dispatch for ${issueId} did not complete (non-fatal): ${err instanceof Error ? err.message : String(err)}`);
|
|
1148
|
-
}
|
|
1149
|
-
}
|
|
1150
|
-
function maybeRecoverTestVerdictHostSide(issueId, status) {
|
|
1151
|
-
if (status.reviewStatus !== "passed") return;
|
|
1152
|
-
if (status.mergeStatus === "merged" || status.readyForMerge) return;
|
|
1153
|
-
if (status.testStatus !== "testing" && status.testStatus !== "pending" && status.testStatus !== "dispatch_failed") return;
|
|
1154
|
-
const last = testVerdictRecoveryAt.get(issueId) ?? 0;
|
|
1155
|
-
if (Date.now() - last < TEST_VERDICT_RECOVERY_THROTTLE_MS) return;
|
|
1156
|
-
testVerdictRecoveryAt.set(issueId, Date.now());
|
|
1157
|
-
recoverTestVerdictHostSide(issueId);
|
|
1158
|
-
}
|
|
1159
|
-
async function recoverTestVerdictHostSide(issueId) {
|
|
1160
|
-
try {
|
|
1161
|
-
const { resolveProjectFromIssueSync } = await import("./projects-9SkRpES9.js");
|
|
1162
|
-
const resolved = resolveProjectFromIssueSync(issueId);
|
|
1163
|
-
if (!resolved) return;
|
|
1164
|
-
const { existsSync } = await import("fs");
|
|
1165
|
-
const workspace = join$1(resolved.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
|
|
1166
|
-
if (!existsSync(workspace)) return;
|
|
1167
|
-
const { readTestVerdictArtifact } = await import("./test-verdict-DFjjIHR5.js");
|
|
1168
|
-
const artifact = readTestVerdictArtifact(workspace);
|
|
1169
|
-
if (!artifact) return;
|
|
1170
|
-
setReviewStatusSync(issueId, {
|
|
1171
|
-
testStatus: artifact.status,
|
|
1172
|
-
testNotes: artifact.notes ?? `Recovered from .pan/test/result.json (${artifact.status}) — the test agent wrote the verdict but never signaled`
|
|
1173
|
-
});
|
|
1174
|
-
console.log(`[review-status] recovered unsignaled test verdict for ${issueId}: ${artifact.status} (host-side, from .pan/test/result.json)`);
|
|
1175
|
-
} catch (err) {
|
|
1176
|
-
console.warn(`[review-status] host-side test verdict recovery for ${issueId} did not complete (non-fatal): ${err instanceof Error ? err.message : String(err)}`);
|
|
1177
|
-
}
|
|
1178
|
-
}
|
|
1179
|
-
async function deliverTestFailureToWorkAgentHostSide(issueId, status) {
|
|
1180
|
-
try {
|
|
1181
|
-
const { resolveProjectFromIssueSync } = await import("./projects-9SkRpES9.js");
|
|
1182
|
-
const resolved = resolveProjectFromIssueSync(issueId);
|
|
1183
|
-
const workspace = resolved ? join$1(resolved.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`) : void 0;
|
|
1184
|
-
const notes = status.testNotes;
|
|
1185
|
-
let feedbackPath;
|
|
1186
|
-
try {
|
|
1187
|
-
const { writeFeedbackFile } = await import("./feedback-writer-qmiMbqTZ.js");
|
|
1188
|
-
const r = await Effect.runPromise(writeFeedbackFile({
|
|
1189
|
-
issueId,
|
|
1190
|
-
workspacePath: workspace,
|
|
1191
|
-
specialist: "test-agent",
|
|
1192
|
-
outcome: "failed",
|
|
1193
|
-
summary: `Tests FAILED for ${issueId}`,
|
|
1194
|
-
markdownBody: `# Test failure\n\n${notes ?? "The test gate reported failures. See .pan/test/result.json and re-run the project test suite."}\n\n## Required\nFix the failing tests, commit and push, then re-run \`pan done ${issueId}\`.`
|
|
1195
|
-
}));
|
|
1196
|
-
if (r.success) feedbackPath = r.filePath;
|
|
1197
|
-
} catch {}
|
|
1198
|
-
const message = `SPECIALIST FEEDBACK: test-agent reported FAILED for ${issueId}.\n\n${feedbackPath ? `MUST READ: ${feedbackPath}\n\n` : ""}${notes ? `${notes.slice(0, 400)}\n\n` : ""}Fix the failing tests, commit and push, then re-run pan done ${issueId}. Do NOT stop at the prompt.`;
|
|
1199
|
-
const { resolveIssueFeedbackTarget, surfaceIssueFeedbackNeedsYou } = await import("./feedback-target-iygZwmMc.js");
|
|
1200
|
-
const target = await resolveIssueFeedbackTarget(issueId);
|
|
1201
|
-
if ("agentId" in target) {
|
|
1202
|
-
const { messageAgent } = await import("./agents-FlIgQ3ql.js");
|
|
1203
|
-
await messageAgent(target.agentId, message, "internal", { owesRework: true });
|
|
1204
|
-
console.log(`[review-status] delivered test failure to ${target.agentId} for ${issueId} (host-side)`);
|
|
1205
|
-
} else await surfaceIssueFeedbackNeedsYou(issueId, target.reason, {
|
|
1206
|
-
specialist: "test-agent",
|
|
1207
|
-
feedbackPath
|
|
1208
|
-
});
|
|
1209
|
-
} catch (err) {
|
|
1210
|
-
console.warn(`[review-status] host-side test-failure delivery for ${issueId} did not complete (non-fatal): ${err instanceof Error ? err.message : String(err)}`);
|
|
1211
|
-
}
|
|
1212
|
-
}
|
|
1213
|
-
function getReviewStatusSync(issueId) {
|
|
1214
|
-
const dbStatus = getReviewStatusFromDbSync(issueId);
|
|
1215
|
-
const journal = readJournalStatusSync(issueId);
|
|
1216
|
-
if (!journal) return dbStatus ?? null;
|
|
1217
|
-
if (journal.durable.closedOut === true) {
|
|
1218
|
-
try {
|
|
1219
|
-
deleteReviewStatus(issueId);
|
|
1220
|
-
} catch {}
|
|
1221
|
-
return null;
|
|
1222
|
-
}
|
|
1223
|
-
if (!dbStatus || (dbStatus.updatedAt ?? "") < journal.updatedAt) {
|
|
1224
|
-
const merged = { ...dbStatus ?? {
|
|
1225
|
-
issueId,
|
|
1226
|
-
reviewStatus: "pending",
|
|
1227
|
-
testStatus: "pending",
|
|
1228
|
-
updatedAt: journal.updatedAt,
|
|
1229
|
-
readyForMerge: false
|
|
1230
|
-
} };
|
|
1231
|
-
for (const [key, value] of Object.entries(journal.durable)) if (value !== void 0) merged[key] = value;
|
|
1232
|
-
merged.issueId = issueId;
|
|
1233
|
-
merged.updatedAt = journal.updatedAt;
|
|
1234
|
-
merged.readyForMerge = (merged.blockerReasons?.length ?? 0) > 0 ? false : reviewGatesPassedSync(merged);
|
|
1235
|
-
const reconciled = normalizeReviewStatusSync(merged);
|
|
1236
|
-
try {
|
|
1237
|
-
upsertReviewStatusSync(reconciled);
|
|
1238
|
-
} catch {}
|
|
1239
|
-
const wasBlocked = dbStatus?.reviewStatus === "blocked" || dbStatus?.reviewStatus === "failed";
|
|
1240
|
-
if ((reconciled.reviewStatus === "blocked" || reconciled.reviewStatus === "failed") && !wasBlocked) deliverReviewVerdictFeedbackHostSide(issueId, reconciled);
|
|
1241
|
-
const wasReviewPassed = dbStatus?.reviewStatus === "passed";
|
|
1242
|
-
if (reconciled.reviewStatus === "passed" && !wasReviewPassed && reconciled.testStatus === "pending") {
|
|
1243
|
-
console.log(`[review-status] reconcile: review.approved for ${issueId} (host-owned handoff — sandboxed agent verdict from journal)`);
|
|
1244
|
-
emitReactiveLifecycleEvent("review.approved", issueId);
|
|
1245
|
-
}
|
|
1246
|
-
const wasTestPassed = dbStatus?.testStatus === "passed";
|
|
1247
|
-
if (reconciled.testStatus === "passed" && !wasTestPassed) {
|
|
1248
|
-
console.log(`[review-status] reconcile: test.passed for ${issueId} (host-owned handoff — sandboxed agent verdict from journal)`);
|
|
1249
|
-
emitReactiveLifecycleEvent("test.passed", issueId);
|
|
1250
|
-
}
|
|
1251
|
-
maybeAutoDispatchReviewHostSide(issueId, reconciled);
|
|
1252
|
-
maybeRecoverTestVerdictHostSide(issueId, reconciled);
|
|
1253
|
-
return reconciled;
|
|
1254
|
-
}
|
|
1255
|
-
const enriched = enrichReviewNotesFromRecordSync(issueId, dbStatus);
|
|
1256
|
-
maybeAutoDispatchReviewHostSide(issueId, enriched);
|
|
1257
|
-
maybeRecoverTestVerdictHostSide(issueId, enriched);
|
|
1258
|
-
return enriched;
|
|
1259
|
-
}
|
|
1260
|
-
/**
|
|
1261
|
-
* On server startup, clear any mergeStatus stuck at 'merging'.
|
|
1262
|
-
* Pending merge operations are in-memory only — they don't survive a restart.
|
|
1263
|
-
* Any 'merging' status after boot is definitionally stuck (PAN-490).
|
|
1264
|
-
*/
|
|
1265
|
-
function clearStuckMergeStatuses() {
|
|
1266
|
-
const statuses = loadReviewStatuses();
|
|
1267
|
-
const stuck = Object.values(statuses).filter((s) => s.mergeStatus === "merging" || s.mergeStatus === "verifying");
|
|
1268
|
-
if (stuck.length === 0) return;
|
|
1269
|
-
console.log(`[review-status] Clearing ${stuck.length} stuck merge status(es) on startup (merging/verifying)`);
|
|
1270
|
-
for (const s of stuck) {
|
|
1271
|
-
const shouldBeReady = s.reviewStatus === "passed" && (s.testStatus === "passed" || s.testStatus === "skipped") && verificationSatisfied(s) && (s.uatStatus === void 0 || s.uatStatus === "passed");
|
|
1272
|
-
setReviewStatusSync(s.issueId, {
|
|
1273
|
-
mergeStatus: "pending",
|
|
1274
|
-
...shouldBeReady ? { readyForMerge: true } : {}
|
|
1275
|
-
});
|
|
1276
|
-
}
|
|
1277
|
-
}
|
|
1278
|
-
/**
|
|
1279
|
-
* On server startup, fix any issues where review+test both passed and
|
|
1280
|
-
* verificationStatus is not 'failed', but readyForMerge is stuck at false.
|
|
1281
|
-
*
|
|
1282
|
-
* This happens when:
|
|
1283
|
-
* 1. A merge attempt was made (merging → verifying)
|
|
1284
|
-
* 2. The server restarted while verifying — clearStuckMergeStatuses reset mergeStatus to 'pending'
|
|
1285
|
-
* 3. At restart time, verificationStatus was 'pending' (reset by the request-review cycle)
|
|
1286
|
-
* 4. The old verificationSatisfied check blocked readyForMerge because of 'pending' status
|
|
1287
|
-
*
|
|
1288
|
-
* With verificationSatisfied now only blocking on 'failed', these issues should be
|
|
1289
|
-
* re-evaluated and readyForMerge restored so they reappear on the Awaiting Merge page.
|
|
1290
|
-
*/
|
|
1291
|
-
function fixStuckReadyForMerge() {
|
|
1292
|
-
const statuses = loadReviewStatuses();
|
|
1293
|
-
const stuck = Object.values(statuses).filter((s) => s.readyForMerge === false && s.reviewStatus === "passed" && (s.testStatus === "passed" || s.testStatus === "skipped") && verificationSatisfied(s) && (s.mergeStatus === "pending" || s.mergeStatus === "queued" || s.mergeStatus === void 0 || s.mergeStatus === null) && (s.uatStatus === void 0 || s.uatStatus === "passed"));
|
|
1294
|
-
if (stuck.length === 0) return;
|
|
1295
|
-
console.log(`[review-status] Restoring readyForMerge for ${stuck.length} issue(s) with passed review+test`);
|
|
1296
|
-
for (const s of stuck) {
|
|
1297
|
-
console.log(`[review-status] Restoring readyForMerge=true for ${s.issueId} (verif=${s.verificationStatus}, merge=${s.mergeStatus})`);
|
|
1298
|
-
setReviewStatusSync(s.issueId, { readyForMerge: true });
|
|
1299
|
-
}
|
|
1300
|
-
}
|
|
1301
|
-
/**
|
|
1302
|
-
* PAN-869: On server startup, fix any issues where reviewStatus was incorrectly
|
|
1303
|
-
* set to 'failed' due to the old COMMENTED → 'failed' mapping bug.
|
|
1304
|
-
*
|
|
1305
|
-
* This identifies records where:
|
|
1306
|
-
* - reviewStatus = 'failed'
|
|
1307
|
-
* - testStatus = 'passed' (CI green, so review wasn't genuinely bad)
|
|
1308
|
-
* - mergeStatus is not terminal ('merged', 'failed')
|
|
1309
|
-
* - readyForMerge = false
|
|
1310
|
-
* - The last review history entry is type='review', status='failed'
|
|
1311
|
-
*
|
|
1312
|
-
* The old reviewResultToReviewStatus() mapped COMMENTED (regardless of success)
|
|
1313
|
-
* to 'failed', so the history stores 'failed' for old COMMENTED reviews.
|
|
1314
|
-
* We use testStatus='passed' as the signal that this was a successful review
|
|
1315
|
-
* (CI was green), distinguishing it from genuinely failed reviews.
|
|
1316
|
-
*/
|
|
1317
|
-
function fixStuckCommentedReviews() {
|
|
1318
|
-
const statuses = loadReviewStatuses();
|
|
1319
|
-
const candidates = Object.values(statuses).filter((s) => s.reviewStatus === "failed" && (s.testStatus === "passed" || s.testStatus === "skipped") && s.mergeStatus !== "merged" && s.mergeStatus !== "failed" && s.readyForMerge === false && s.verificationStatus !== "failed");
|
|
1320
|
-
if (candidates.length === 0) return;
|
|
1321
|
-
const toFix = [];
|
|
1322
|
-
for (const s of candidates) if ([...s.history || []].reverse().find((h) => h.type === "review")?.status === "failed") toFix.push(s.issueId);
|
|
1323
|
-
if (toFix.length === 0) return;
|
|
1324
|
-
console.log(`[review-status] Restoring reviewStatus='passed' for ${toFix.length} issue(s) with COMMENTED reviews (PAN-869 backfill)`);
|
|
1325
|
-
for (const issueId of toFix) {
|
|
1326
|
-
console.log(`[review-status] Restoring reviewStatus='passed' for ${issueId}`);
|
|
1327
|
-
setReviewStatusSync(issueId, { reviewStatus: "passed" });
|
|
1328
|
-
}
|
|
1329
|
-
}
|
|
1330
|
-
function clearReviewStatus(issueId) {
|
|
1331
|
-
try {
|
|
1332
|
-
deleteReviewStatus(issueId);
|
|
1333
|
-
} catch (err) {
|
|
1334
|
-
console.error("[review-status] SQLite delete failed:", err);
|
|
1335
|
-
}
|
|
1336
|
-
}
|
|
1337
|
-
/**
|
|
1338
|
-
* Mark a workspace as stuck with a reason and optional JSON details.
|
|
1339
|
-
* Persists across dashboard restarts. Deacon will skip stuck workspaces.
|
|
1340
|
-
*
|
|
1341
|
-
* @param issueId - Issue ID (e.g. "PAN-653")
|
|
1342
|
-
* @param reason - Short reason code (e.g. "main_diverged")
|
|
1343
|
-
* @param details - Optional structured details (e.g. {localSha, remoteSha})
|
|
1344
|
-
*/
|
|
1345
|
-
function markWorkspaceStuck(issueId, reason, details) {
|
|
1346
|
-
try {
|
|
1347
|
-
markWorkspaceStuck$1(issueId, reason, details);
|
|
1348
|
-
console.log(`[review-status] Marked ${issueId} as stuck: ${reason}`);
|
|
1349
|
-
const updated = getReviewStatusSync(issueId);
|
|
1350
|
-
if (updated) notifyPipelineSync({
|
|
1351
|
-
type: "status_changed",
|
|
1352
|
-
issueId,
|
|
1353
|
-
status: updated
|
|
1354
|
-
});
|
|
1355
|
-
} catch (err) {
|
|
1356
|
-
console.error(`[review-status] Failed to mark ${issueId} as stuck:`, err);
|
|
1357
|
-
}
|
|
1358
|
-
}
|
|
1359
|
-
/**
|
|
1360
|
-
* Clear the stuck flag for a workspace.
|
|
1361
|
-
* Called when the human clicks "Unstick" in the dashboard.
|
|
1362
|
-
* Re-enables Deacon patrol for this workspace.
|
|
1363
|
-
*/
|
|
1364
|
-
function clearWorkspaceStuck(issueId) {
|
|
1365
|
-
try {
|
|
1366
|
-
clearWorkspaceStuck$1(issueId);
|
|
1367
|
-
console.log(`[review-status] Cleared stuck state for ${issueId}`);
|
|
1368
|
-
const updated = getReviewStatusSync(issueId);
|
|
1369
|
-
if (updated) notifyPipelineSync({
|
|
1370
|
-
type: "status_changed",
|
|
1371
|
-
issueId,
|
|
1372
|
-
status: updated
|
|
1373
|
-
});
|
|
1374
|
-
} catch (err) {
|
|
1375
|
-
console.error(`[review-status] Failed to clear stuck state for ${issueId}:`, err);
|
|
1376
|
-
}
|
|
1377
|
-
}
|
|
1378
|
-
/**
|
|
1379
|
-
* Set or clear the operator-requested deacon-ignore flag. When set, Deacon
|
|
1380
|
-
* patrol skips the issue entirely on every cycle. Distinct from `stuck`, which
|
|
1381
|
-
* is a system-set failure marker that also suppresses patrol.
|
|
1382
|
-
*/
|
|
1383
|
-
function setDeaconIgnored(issueId, ignored, reason) {
|
|
1384
|
-
try {
|
|
1385
|
-
setReviewStatusSync(issueId, {
|
|
1386
|
-
deaconIgnored: ignored,
|
|
1387
|
-
deaconIgnoredAt: ignored ? (/* @__PURE__ */ new Date()).toISOString() : void 0,
|
|
1388
|
-
deaconIgnoredReason: ignored ? reason : void 0
|
|
1389
|
-
});
|
|
1390
|
-
console.log(`[review-status] deaconIgnored=${ignored} for ${issueId}${reason ? ` (${reason})` : ""}`);
|
|
1391
|
-
} catch (err) {
|
|
1392
|
-
console.error(`[review-status] Failed to set deaconIgnored for ${issueId}:`, err);
|
|
1393
|
-
}
|
|
1394
|
-
}
|
|
1395
|
-
/**
|
|
1396
|
-
* PAN-1691: set the per-issue auto-merge routing key and broadcast the change.
|
|
1397
|
-
* `autoMerge === null` clears it back to the project default. Emits a
|
|
1398
|
-
* status_changed pipeline event so open dashboards reflect the toggle live.
|
|
1399
|
-
*/
|
|
1400
|
-
function setAutoMerge(issueId, autoMerge) {
|
|
1401
|
-
try {
|
|
1402
|
-
setReviewStatusSync(issueId, { autoMerge: autoMerge === null ? void 0 : autoMerge });
|
|
1403
|
-
console.log(`[review-status] autoMerge=${autoMerge === null ? "default" : autoMerge} for ${issueId}`);
|
|
1404
|
-
} catch (err) {
|
|
1405
|
-
console.error(`[review-status] Failed to set autoMerge for ${issueId}:`, err);
|
|
1406
|
-
}
|
|
1407
|
-
}
|
|
1408
|
-
var DEFAULT_STATUS_FILE, reviewDispatchAttemptAt, REVIEW_AUTO_DISPATCH_THROTTLE_MS, testVerdictRecoveryAt, TEST_VERDICT_RECOVERY_THROTTLE_MS, ReviewStatusError, setReviewStatus, getReviewStatus;
|
|
1409
|
-
var init_review_status = __esmMin((() => {
|
|
1410
|
-
init_pipeline_notifier();
|
|
1411
|
-
init_activity_logger();
|
|
1412
|
-
init_review_status_sync();
|
|
1413
|
-
init_review_status_source();
|
|
1414
|
-
init_review_status_normalize();
|
|
1415
|
-
init_review_status_record_sync();
|
|
1416
|
-
init_review_dispatch_decision();
|
|
1417
|
-
registerReviewStatusMapReader(() => getAllReviewStatusesFromDb());
|
|
1418
|
-
DEFAULT_STATUS_FILE = join$1(homedir(), ".overdeck", "review-status.json");
|
|
1419
|
-
reviewDispatchAttemptAt = /* @__PURE__ */ new Map();
|
|
1420
|
-
REVIEW_AUTO_DISPATCH_THROTTLE_MS = 3e4;
|
|
1421
|
-
testVerdictRecoveryAt = /* @__PURE__ */ new Map();
|
|
1422
|
-
TEST_VERDICT_RECOVERY_THROTTLE_MS = 6e4;
|
|
1423
|
-
ReviewStatusError = class extends Data.TaggedError("ReviewStatusError") {};
|
|
1424
|
-
setReviewStatus = (issueId, update, existing) => Effect.tryPromise({
|
|
1425
|
-
try: () => new Promise((resolve, reject) => {
|
|
1426
|
-
setImmediate(() => {
|
|
1427
|
-
try {
|
|
1428
|
-
resolve(setReviewStatusSync(issueId, update, existing));
|
|
1429
|
-
} catch (err) {
|
|
1430
|
-
reject(err);
|
|
1431
|
-
}
|
|
1432
|
-
});
|
|
1433
|
-
}),
|
|
1434
|
-
catch: (cause) => new ReviewStatusError({
|
|
1435
|
-
issueId,
|
|
1436
|
-
operation: "setReviewStatus",
|
|
1437
|
-
message: cause instanceof Error ? cause.message : String(cause),
|
|
1438
|
-
cause
|
|
1439
|
-
})
|
|
1440
|
-
});
|
|
1441
|
-
getReviewStatus = (issueId) => Effect.try({
|
|
1442
|
-
try: () => getReviewStatusFromDbSync(issueId),
|
|
1443
|
-
catch: (cause) => new ReviewStatusError({
|
|
1444
|
-
issueId,
|
|
1445
|
-
operation: "getReviewStatus",
|
|
1446
|
-
message: cause instanceof Error ? cause.message : String(cause),
|
|
1447
|
-
cause
|
|
1448
|
-
})
|
|
1449
|
-
});
|
|
1450
|
-
}));
|
|
1451
|
-
//#endregion
|
|
1452
|
-
export { needsReviewDispatch as C, listOverdeckAgentStatesSync as D, init_agent_state_sync as E, saveOverdeckAgentStateSync as O, init_review_dispatch_decision as S, getOverdeckAgentStateSync as T, setAutoMerge as _, fixStuckCommentedReviews as a, setReviewStatusSync as b, getReviewStatusSync as c, loadReviewStatuses as d, loadReviewStatusesForIssues as f, reviewGatesPassedSync as g, resetPipelineVerdictsForWorkStartSync as h, clearWorkspaceStuck as i, stateToOverdeckParamsForDb as k, init_review_status as l, mergeGateEligibility as m, clearReviewStatus as n, fixStuckReadyForMerge as o, markWorkspaceStuck as p, clearStuckMergeStatuses as r, getReviewStatus as s, ReviewStatusError as t, loadReadyForMergeFlags as u, setDeaconIgnored as v, AGENT_COLUMNS_FOR_DB as w, verificationSatisfied as x, setReviewStatus as y };
|
|
1453
|
-
|
|
1454
|
-
//# sourceMappingURL=review-status-A7quS5KJ.js.map
|