specrails-desktop 2.36.0 → 2.42.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +94 -247
- package/client/dist/assets/ActivityFeedPage-DoEMumQS.js +1 -0
- package/client/dist/assets/AgentBrowserCapture-DIh4K0gh.js +1 -0
- package/client/dist/assets/AgentModeAnalyticsPane-mbq4WEoO.js +2 -0
- package/client/dist/assets/AgentModeCodePane-CKh7zuA4.js +2 -0
- package/client/dist/assets/AgentModeJobsPane-BDokPiLJ.js +1 -0
- package/client/dist/assets/AgentsPage-BFVAZbBj.js +87 -0
- package/client/dist/assets/AnalyticsPage-3Y9LuWwz.js +1 -0
- package/client/dist/assets/CodePage-C9KyuV_C.js +3 -0
- package/client/dist/assets/DesktopAnalyticsPage-Bhi54bXQ.js +1 -0
- package/client/dist/assets/{DocsDialog-C76VdBJC.js → DocsDialog-Dj6mt4ga.js} +2 -2
- package/client/dist/assets/{DocsPage-ziMlj6B6.js → DocsPage-24yWglNI.js} +1 -1
- package/client/dist/assets/ExportDropdown-ophapHrT.js +1 -0
- package/client/dist/assets/InteractiveJobComposer-C1ucmxQh.js +19 -0
- package/client/dist/assets/JobDetailModal-DNWmgVHD.js +1 -0
- package/client/dist/assets/JobDetailPage-BcajZyuu.js +1 -0
- package/client/dist/assets/JobsPage-B9nTZw6e.js +1 -0
- package/client/dist/assets/LoopBuilderPage-Oc48iOFW.js +7 -0
- package/client/dist/assets/LoopPreviewModal-ae0Fr6SU.js +1 -0
- package/client/dist/assets/LoopsPage-CUEqzUBI.js +1 -0
- package/client/dist/assets/MinimizedChatsContext-Deg39peL.js +1 -0
- package/client/dist/assets/PluginsPage-C1xtARIx.js +2 -0
- package/client/dist/assets/ProjectSettingsDialog-JZzrXFBN.js +1 -0
- package/client/dist/assets/RepositoryDeliveries-CSDsiVUz.js +5 -0
- package/client/dist/assets/RepositoryScopeSelector-D-RCaknl.js +1 -0
- package/client/dist/assets/ReviewPacketPage-x5EfGTiL.js +1 -0
- package/client/dist/assets/TemplatePreviewModal-BSyuZxGq.js +1 -0
- package/client/dist/assets/TicketDetailModalContext-DqyF0so-.js +14 -0
- package/client/dist/assets/Trans-SnMX4MhW.js +1 -0
- package/client/dist/assets/agent-BdT0SB1D.js +1 -0
- package/client/dist/assets/agent-Bh9K7iEt.js +1 -0
- package/client/dist/assets/agent-C4ibdFk9.js +1 -0
- package/client/dist/assets/agent-CSFY22Zo.js +1 -0
- package/client/dist/assets/agent-DAnqxUn8.js +1 -0
- package/client/dist/assets/agent-DTQiu0Mi.js +1 -0
- package/client/dist/assets/agent-T54WuR_Y.js +1 -0
- package/client/dist/assets/agent-i75WDZOA.js +1 -0
- package/client/dist/assets/browser-05vRDg_y.js +1 -0
- package/client/dist/assets/browser-Bulb-cB1.js +1 -0
- package/client/dist/assets/browser-C7f-Jsg1.js +1 -0
- package/client/dist/assets/browser-CG0PE1j_.js +1 -0
- package/client/dist/assets/browser-CMzaqAjo.js +1 -0
- package/client/dist/assets/browser-DMajYdNX.js +1 -0
- package/client/dist/assets/browser-DxcOHrdP.js +1 -0
- package/client/dist/assets/browser-ObE7xVo3.js +1 -0
- package/client/dist/assets/builder-765NeYTp.js +1 -0
- package/client/dist/assets/builder-8MG3V6ea.js +1 -0
- package/client/dist/assets/builder-B-1UBs5K.js +1 -0
- package/client/dist/assets/builder-BTiGnPT0.js +1 -0
- package/client/dist/assets/builder-Cx9Rz-7u.js +1 -0
- package/client/dist/assets/builder-DKFMELBl.js +1 -0
- package/client/dist/assets/builder-OcmKrC0h.js +1 -0
- package/client/dist/assets/builder-P9qVBXFZ.js +1 -0
- package/client/dist/assets/{button-CJqFnUOL.js → button-DCBqEaZl.js} +1 -1
- package/client/dist/assets/{code-CkUuW4m9.js → code-B37GRg9C.js} +1 -1
- package/client/dist/assets/{code-B0O8-p8k.js → code-BBOEZbf9.js} +1 -1
- package/client/dist/assets/{code-B1VLZDhS.js → code-BRm-jcyx.js} +1 -1
- package/client/dist/assets/{code-Bpj4Ddml.js → code-CF7w62CR.js} +1 -1
- package/client/dist/assets/{code-BykBZ5-e.js → code-CLuvJt2r.js} +1 -1
- package/client/dist/assets/{code-B86IMAfz.js → code-D0RCm59f.js} +1 -1
- package/client/dist/assets/code-DaZ-ZwCT.js +1 -0
- package/client/dist/assets/{code-cAqaqMTx.js → code-iIHkGaCL.js} +1 -1
- package/client/dist/assets/commands-0XjAftla.js +1 -0
- package/client/dist/assets/commands-BAWSYHjQ.js +1 -0
- package/client/dist/assets/commands-BBwowgiE.js +1 -0
- package/client/dist/assets/commands-BacjIZLN.js +1 -0
- package/client/dist/assets/commands-Bs62IAZ3.js +1 -0
- package/client/dist/assets/commands-CLPdh-Hh.js +1 -0
- package/client/dist/assets/commands-DlbFzgrp.js +1 -0
- package/client/dist/assets/commands-LjPSsi5F.js +1 -0
- package/client/dist/assets/common-B5AZNYMH.js +1 -0
- package/client/dist/assets/common-BFZ0c_vN.js +1 -0
- package/client/dist/assets/common-BrlwEnL7.js +1 -0
- package/client/dist/assets/common-BttQx3z4.js +1 -0
- package/client/dist/assets/common-CM65k_-e.js +1 -0
- package/client/dist/assets/common-D4mvFFlu.js +1 -0
- package/client/dist/assets/common-TZ9Ny96S.js +1 -0
- package/client/dist/assets/common-nFpSF4GC.js +1 -0
- package/client/dist/assets/dashboard-B14uYXkG.js +1 -0
- package/client/dist/assets/dashboard-BK_mez-z.js +1 -0
- package/client/dist/assets/dashboard-BfBir_6o.js +1 -0
- package/client/dist/assets/dashboard-Bt0cCzeG.js +1 -0
- package/client/dist/assets/dashboard-BwkjxI6H.js +1 -0
- package/client/dist/assets/{dashboard-C8WOEiPu.js → dashboard-C3bDKf7s.js} +1 -1
- package/client/dist/assets/dashboard-CdvjGfog.js +1 -0
- package/client/dist/assets/dashboard-fRrP0Kv0.js +1 -0
- package/client/dist/assets/dialog-SRw01_QU.js +45 -0
- package/client/dist/assets/dist-js-CJ_2XX1Y.js +1 -0
- package/client/dist/assets/formatDistanceToNow-DSj5DprF.js +1 -0
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-YhD8rIEs.js +1 -0
- package/client/dist/assets/index-DwAmL7m5.css +2 -0
- package/client/dist/assets/index-EzrkUb8B.js +76 -0
- package/client/dist/assets/{jira-api-B1-MUehg.js → jira-api-CSCqGr-Q.js} +1 -1
- package/client/dist/assets/{jobs-CN_zv4Gr.js → jobs-B8rrzfyZ.js} +1 -1
- package/client/dist/assets/{jobs-DUlWSYq2.js → jobs-BS6RTurf.js} +1 -1
- package/client/dist/assets/{jobs-Bpks6doU.js → jobs-BTT0Bsks.js} +1 -1
- package/client/dist/assets/{jobs-Bgq-PZkC.js → jobs-CezU69AE.js} +1 -1
- package/client/dist/assets/{jobs-SwYS2M-B.js → jobs-ClFJae0s.js} +1 -1
- package/client/dist/assets/{jobs-BAls3bWq.js → jobs-DJSFIFVy.js} +1 -1
- package/client/dist/assets/{jobs-DhxKgWFq.js → jobs-DhgGr8vm.js} +1 -1
- package/client/dist/assets/{jobs-B_TeSQxb.js → jobs-DzMjUcaN.js} +1 -1
- package/client/dist/assets/mcp-6rMoZfEO.js +1 -0
- package/client/dist/assets/mcp-BD8sL5mP.js +1 -0
- package/client/dist/assets/mcp-BkcA3I5s.js +1 -0
- package/client/dist/assets/mcp-CCpSelOh.js +1 -0
- package/client/dist/assets/mcp-CUAN6ORK.js +1 -0
- package/client/dist/assets/mcp-CqbRxRTE.js +1 -0
- package/client/dist/assets/mcp-DP2YfVhO.js +1 -0
- package/client/dist/assets/mcp-DUVQamDz.js +1 -0
- package/client/dist/assets/narration-B-ynWTpn.js +1 -0
- package/client/dist/assets/narration-Bj_laZwg.js +1 -0
- package/client/dist/assets/narration-BxHpmMv_.js +1 -0
- package/client/dist/assets/narration-C1Px0-0j.js +1 -0
- package/client/dist/assets/narration-CAXhGbzM.js +1 -0
- package/client/dist/assets/narration-DQ1l_Kq6.js +1 -0
- package/client/dist/assets/narration-XISXwqZd.js +1 -0
- package/client/dist/assets/narration-kwzfglQo.js +1 -0
- package/client/dist/assets/nav-1-Hh2kOz.js +1 -0
- package/client/dist/assets/nav-B34QkESm.js +1 -0
- package/client/dist/assets/nav-Bap_UXAq.js +1 -0
- package/client/dist/assets/{nav-pYuXq7sf.js → nav-BwxXIB24.js} +1 -1
- package/client/dist/assets/nav-Ch-zHBG5.js +1 -0
- package/client/dist/assets/nav-CygC_WN-.js +1 -0
- package/client/dist/assets/{nav-iwjCg5FR.js → nav-KnnLQtOQ.js} +1 -1
- package/client/dist/assets/nav-m00uxYUG.js +1 -0
- package/client/dist/assets/packet-BQ2tXfJI.js +1 -0
- package/client/dist/assets/packet-BdpOJ1Cy.js +1 -0
- package/client/dist/assets/packet-C3Ievb9R.js +1 -0
- package/client/dist/assets/packet-C4zJIG0Y.js +1 -0
- package/client/dist/assets/packet-Cx-zRuWn.js +1 -0
- package/client/dist/assets/packet-DUTGX52M.js +1 -0
- package/client/dist/assets/packet-DhsKtUPB.js +1 -0
- package/client/dist/assets/packet-z3LJ8Zyy.js +1 -0
- package/client/dist/assets/project-repositories-DYhTvwQ1.js +1 -0
- package/client/dist/assets/provider-capabilities-B-wOHfLP.js +1 -0
- package/client/dist/assets/settings-BBt2xtDQ.js +1 -0
- package/client/dist/assets/settings-BJB9RKJj.js +1 -0
- package/client/dist/assets/settings-CHwQR2rB.js +1 -0
- package/client/dist/assets/settings-CrMi3kSi.js +1 -0
- package/client/dist/assets/settings-DKyhDGD1.js +1 -0
- package/client/dist/assets/settings-Deupji9c.js +1 -0
- package/client/dist/assets/settings-DqRMmwAM.js +1 -0
- package/client/dist/assets/settings-J4rj6vo-.js +1 -0
- package/client/dist/assets/setup-2xGgu4Sk.js +1 -0
- package/client/dist/assets/setup-Ba11l2JA.js +1 -0
- package/client/dist/assets/setup-BzW4kMok.js +1 -0
- package/client/dist/assets/setup-COzwYhkJ.js +1 -0
- package/client/dist/assets/setup-CRVULhtF.js +1 -0
- package/client/dist/assets/setup-DgvlxwpE.js +1 -0
- package/client/dist/assets/setup-Dw_wYeEY.js +1 -0
- package/client/dist/assets/setup-ZPtEeJPW.js +1 -0
- package/client/dist/assets/spending-BqbdPm_4.js +1 -0
- package/client/dist/assets/square-Ci-PFcFe.js +1 -0
- package/client/dist/assets/{terminal-BFRZnMPP.js → terminal-BAzpHtpY.js} +1 -1
- package/client/dist/assets/{terminal-IahE4LW9.js → terminal-C7dHeR3x.js} +1 -1
- package/client/dist/assets/{terminal-tITa81iz.js → terminal-CMla5Qsz.js} +1 -1
- package/client/dist/assets/{terminal-BZiIu3rf.js → terminal-CdNXH-n9.js} +1 -1
- package/client/dist/assets/{terminal-ScjyXNxQ.js → terminal-Cw5bZsmV.js} +1 -1
- package/client/dist/assets/{terminal-C2NAd7BW.js → terminal-DFUP4eNv.js} +1 -1
- package/client/dist/assets/{terminal-d7GadXbN.js → terminal-DGqljeK_.js} +1 -1
- package/client/dist/assets/{terminal-QpXZU2Bn.js → terminal-cU70NodO.js} +1 -1
- package/client/dist/assets/useDesktop-RSMTyy7V.js +1 -0
- package/client/dist/assets/useSharedWebSocket-BOdS5_Iz.js +2 -0
- package/client/dist/index.html +34 -35
- package/docs/README.md +3 -0
- package/docs/agent-live-steering.md +57 -0
- package/docs/ci-cd.md +57 -0
- package/docs/code-explorer.md +48 -0
- package/docs/codex.md +12 -1
- package/docs/features/detachable-mission-windows.md +59 -0
- package/docs/guide/de/integrations/5-mcp-server.md +13 -9
- package/docs/guide/de/integrations/6-agent-chat.md +1 -0
- package/docs/guide/en/integrations/5-mcp-server.md +13 -9
- package/docs/guide/en/integrations/6-agent-chat.md +1 -0
- package/docs/guide/es/integrations/5-mcp-server.md +13 -9
- package/docs/guide/es/integrations/6-agent-chat.md +1 -0
- package/docs/guide/fr/integrations/5-mcp-server.md +13 -9
- package/docs/guide/fr/integrations/6-agent-chat.md +1 -0
- package/docs/guide/it/integrations/5-mcp-server.md +13 -9
- package/docs/guide/it/integrations/6-agent-chat.md +1 -0
- package/docs/guide/ja/integrations/5-mcp-server.md +13 -9
- package/docs/guide/ja/integrations/6-agent-chat.md +1 -0
- package/docs/guide/pt/integrations/5-mcp-server.md +13 -9
- package/docs/guide/pt/integrations/6-agent-chat.md +1 -0
- package/docs/guide/zh/integrations/5-mcp-server.md +13 -9
- package/docs/guide/zh/integrations/6-agent-chat.md +1 -0
- package/docs/internals/README.md +1 -0
- package/docs/internals/browser-capture-performance.md +55 -3
- package/docs/internals/browser-login-popups.md +45 -0
- package/docs/internals/browser-native-retina-audit.md +39 -0
- package/docs/internals/ci-cd-audit.md +39 -0
- package/docs/internals/core-runtime-updates.md +68 -0
- package/docs/internals/embedded-browser-native-webview-evaluation.md +2 -0
- package/docs/internals/implementation-reliability-audit.md +93 -0
- package/docs/internals/interactive-jobs.md +110 -6
- package/docs/internals/mcp-mission-audit.md +76 -0
- package/docs/internals/project-builder.md +404 -42
- package/docs/internals/safe-pr-review-flow.md +52 -10
- package/docs/internals/startup-recovery-audit.md +58 -0
- package/docs/mcp.md +74 -41
- package/docs/mission-processes.md +59 -0
- package/docs/multi-repo-projects.md +51 -0
- package/docs/platforms/windows-parity.md +70 -0
- package/docs/platforms/windows.md +13 -11
- package/docs/running-pipelines.md +14 -0
- package/mcp-bridge/dist/specrails-mcp.js +7186 -0
- package/package.json +9 -4
- package/server/dist/agent-chat-manager.js +537 -68
- package/server/dist/agent-chat-router.js +87 -6
- package/server/dist/agent-context-resolver.js +129 -25
- package/server/dist/agent-defaults.js +19 -11
- package/server/dist/agent-input-store.js +206 -0
- package/server/dist/agent-mcp-config.js +54 -15
- package/server/dist/agent-operator-prompt.js +255 -65
- package/server/dist/agent-spec-framing.js +202 -0
- package/server/dist/agent-steering.js +218 -0
- package/server/dist/agent-store.js +153 -0
- package/server/dist/api-not-found.js +8 -0
- package/server/dist/background-process-control.js +164 -0
- package/server/dist/background-process-service.js +61 -0
- package/server/dist/background-process-store.js +242 -0
- package/server/dist/background-windows-bootstrap.js +238 -0
- package/server/dist/blueprint-chat-manager.js +476 -62
- package/server/dist/blueprint-commit.js +21 -1
- package/server/dist/blueprint-draft-parser.js +122 -17
- package/server/dist/blueprint-generation.js +238 -0
- package/server/dist/blueprint-operator-prompt.js +91 -63
- package/server/dist/blueprint-router.js +55 -3
- package/server/dist/blueprint-spec-fixtures.js +85 -0
- package/server/dist/blueprint-spec-quality.js +57 -16
- package/server/dist/blueprint-store.js +92 -1
- package/server/dist/browser-capture-manager.js +86 -30
- package/server/dist/browser-playwright.js +168 -45
- package/server/dist/browser-viewport.js +26 -0
- package/server/dist/chat-manager.js +23 -15
- package/server/dist/chromium-archive.cjs +83 -0
- package/server/dist/chromium-resolver.js +72 -64
- package/server/dist/code-activity.js +145 -0
- package/server/dist/code-explorer-router.js +714 -114
- package/server/dist/core-compat.js +28 -1
- package/server/dist/core-execution.js +111 -0
- package/server/dist/core-package.js +4 -16
- package/server/dist/core-runtime.js +202 -0
- package/server/dist/core-update-manager.js +161 -60
- package/server/dist/core-update-state.js +29 -0
- package/server/dist/db.js +66 -35
- package/server/dist/delivery-evidence.js +142 -39
- package/server/dist/desktop-db.js +239 -43
- package/server/dist/desktop-router.js +109 -9
- package/server/dist/dev-ports.js +8 -3
- package/server/dist/file-provenance.js +34 -22
- package/server/dist/file-story-manager.js +62 -64
- package/server/dist/file-story.js +118 -35
- package/server/dist/file-summary-generator.js +46 -5
- package/server/dist/file-summary-manager.js +355 -106
- package/server/dist/framework-manager.js +98 -110
- package/server/dist/framework-reseed.js +76 -10
- package/server/dist/git-diagnostics.js +2 -2
- package/server/dist/headroom-manager.js +38 -3
- package/server/dist/host-control.js +52 -0
- package/server/dist/index.js +43 -2
- package/server/dist/interactive-job-session.js +149 -16
- package/server/dist/internal-api.js +48 -0
- package/server/dist/jira/jira-materializer.js +1 -0
- package/server/dist/json-tolerant.js +174 -0
- package/server/dist/legacy-migration.js +4 -2
- package/server/dist/loop-command-catalog.js +83 -21
- package/server/dist/loop-constants.js +6 -1
- package/server/dist/loop-decider.js +11 -1
- package/server/dist/loop-executors.js +194 -45
- package/server/dist/loop-factory.js +11 -4
- package/server/dist/loop-graph.js +90 -4
- package/server/dist/loop-run-manager.js +301 -69
- package/server/dist/loop-shell-invocation.js +21 -0
- package/server/dist/loop-step-idle.js +55 -0
- package/server/dist/loop-templates.js +31 -7
- package/server/dist/mcp/agent-capability.js +37 -4
- package/server/dist/mcp/guide.js +149 -36
- package/server/dist/mcp/mcp-admin-router.js +20 -4
- package/server/dist/mcp/mcp-server.js +89 -43
- package/server/dist/mcp/mcp-tiers.js +6 -5
- package/server/dist/mcp/mcp-token.js +3 -1
- package/server/dist/mcp/resources.js +5 -4
- package/server/dist/mcp/tools/catalog.js +4 -0
- package/server/dist/mcp/tools/code.js +125 -14
- package/server/dist/mcp/tools/context.js +153 -0
- package/server/dist/mcp/tools/git.js +15 -5
- package/server/dist/mcp/tools/jobs.js +84 -71
- package/server/dist/mcp/tools/loops.js +17 -6
- package/server/dist/mcp/tools/meta.js +74 -27
- package/server/dist/mcp/tools/mission.js +29 -0
- package/server/dist/mcp/tools/projects.js +22 -6
- package/server/dist/mcp/tools/rails.js +48 -11
- package/server/dist/mcp/tools/specs.js +86 -14
- package/server/dist/mcp/tools/support.js +1 -1
- package/server/dist/mcp/tools/types.js +117 -43
- package/server/dist/mcp/tools/watch.js +144 -51
- package/server/dist/milestone-chain-store.js +164 -0
- package/server/dist/milestone-chain.js +487 -0
- package/server/dist/milestone-progress.js +348 -0
- package/server/dist/mobile/mobile-devices.js +10 -7
- package/server/dist/mobile/mobile-gateway.js +2 -0
- package/server/dist/mobile/mobile-missions.js +214 -0
- package/server/dist/mobile/mobile-redact.js +17 -3
- package/server/dist/mobile/mobile-router.js +46 -4
- package/server/dist/mobile/mobile-ws.js +49 -4
- package/server/dist/multi-repo-bases.js +56 -0
- package/server/dist/multi-repo-checkout.js +101 -0
- package/server/dist/multi-repo-delivery.js +100 -0
- package/server/dist/multi-repo-execution-store.js +65 -0
- package/server/dist/multi-repo-execution.js +453 -0
- package/server/dist/offline-assemble.js +10 -8
- package/server/dist/openspec-runtime-plugin-commands.json +18 -0
- package/server/dist/openspec-runtime-plugin.js +120 -0
- package/server/dist/plugins/codex-spawn.js +49 -0
- package/server/dist/plugins/serena/manifest.js +2 -2
- package/server/dist/plugins/serena/templates/instructions.md +16 -0
- package/server/dist/pr-publisher.js +1 -1
- package/server/dist/profiles-router.js +3 -18
- package/server/dist/project-code-discovery.js +142 -0
- package/server/dist/project-git.js +19 -21
- package/server/dist/project-registry.js +272 -20
- package/server/dist/project-repositories.js +157 -0
- package/server/dist/project-repository-provenance.js +31 -0
- package/server/dist/project-router-background-processes.js +105 -0
- package/server/dist/project-router-git.js +75 -16
- package/server/dist/project-router-jobs.js +2 -126
- package/server/dist/project-router-loop-runs.js +72 -2
- package/server/dist/project-router-tickets.js +53 -8
- package/server/dist/project-router.js +239 -38
- package/server/dist/provider-detection.js +18 -6
- package/server/dist/provider-limit.js +64 -0
- package/server/dist/providers/claude-adapter.js +26 -1
- package/server/dist/providers/claude-background-tasks.js +18 -0
- package/server/dist/providers/claude-live-session.js +383 -0
- package/server/dist/providers/codex-adapter.js +19 -0
- package/server/dist/providers/codex-live-session.js +545 -0
- package/server/dist/providers/gemini-adapter.js +1 -0
- package/server/dist/providers/live-session-types.js +12 -0
- package/server/dist/providers/live-session.js +13 -0
- package/server/dist/providers/terminal-result.js +24 -0
- package/server/dist/queue-manager.js +2 -0
- package/server/dist/rail-isolated-launch.js +141 -16
- package/server/dist/rail-pr-decision.js +364 -99
- package/server/dist/rail-pr-store.js +24 -10
- package/server/dist/rail-worktree-release.js +34 -2
- package/server/dist/rail-worktrees-store.js +4 -4
- package/server/dist/rails-router.js +249 -55
- package/server/dist/repo-lock.js +92 -17
- package/server/dist/review-packet.js +23 -13
- package/server/dist/schemas/file-summary.v1.json +59 -59
- package/server/dist/schemas/profile.v1.json +137 -137
- package/server/dist/setup-manager.js +52 -8
- package/server/dist/shell-integration/bash-shim.bash +45 -0
- package/server/dist/shell-integration/fish-shim.fish +36 -0
- package/server/dist/shell-integration/powershell-shim.ps1 +48 -0
- package/server/dist/shell-integration/zsh-shim.zsh +47 -0
- package/server/dist/smash-runner.js +1 -0
- package/server/dist/spawn-lifecycle.js +44 -27
- package/server/dist/spec-contract-prompt.js +143 -0
- package/server/dist/spec-draft-parser.js +6 -1
- package/server/dist/spec-models.js +1 -0
- package/server/dist/stuck-run-detector.js +1 -0
- package/server/dist/terminal-manager.js +21 -1
- package/server/dist/terminal-shell-integration.js +4 -1
- package/server/dist/transient-children.js +619 -230
- package/server/dist/util/cli-prompt.js +78 -5
- package/server/dist/util/sqlite-migrations.js +20 -0
- package/server/dist/util/win-spawn.js +18 -3
- package/server/dist/util/windows-provider-shell.js +29 -0
- package/server/dist/verification-sentinel.js +14 -0
- package/server/dist/vitest-setup.js +2 -0
- package/server/dist/windows-job-supervisor.js +133 -0
- package/server/dist/workspace-manager.js +9 -30
- package/server/dist/worktree-manager.js +17 -2
- package/server/dist/worktree-overlay.js +3 -1
- package/client/dist/assets/ActivityFeedPage-tAQcWs1R.js +0 -1
- package/client/dist/assets/AgentBrowserCapture-BX8BNae5.js +0 -1
- package/client/dist/assets/AgentModeAnalyticsPane-BVAqCL0K.js +0 -2
- package/client/dist/assets/AgentModeCodePane-9XfqQc9c.js +0 -2
- package/client/dist/assets/AgentModeJobsPane-BCjLsPhc.js +0 -1
- package/client/dist/assets/AgentsPage-C8J_42sm.js +0 -87
- package/client/dist/assets/AnalyticsPage-BtQuyfJm.js +0 -1
- package/client/dist/assets/CodePage-BZ2MwdCu.js +0 -2
- package/client/dist/assets/DesktopAnalyticsPage-Bh_29V4g.js +0 -1
- package/client/dist/assets/ExportDropdown-BrtfWzEG.js +0 -1
- package/client/dist/assets/InteractiveJobComposer-BCZiSfzc.js +0 -19
- package/client/dist/assets/JobDetailModal-NAJmuYIT.js +0 -1
- package/client/dist/assets/JobDetailPage-fE0ZycUX.js +0 -1
- package/client/dist/assets/JobsPage-z5M_HVJG.js +0 -1
- package/client/dist/assets/LoopBuilderPage-j1FQS47c.js +0 -7
- package/client/dist/assets/LoopPreviewModal-DhDJjdCe.js +0 -1
- package/client/dist/assets/LoopsPage-Ll7zORZb.js +0 -1
- package/client/dist/assets/MinimizedChatsContext-Bd3OqR_S.js +0 -1
- package/client/dist/assets/PluginsPage-DN4kGvJt.js +0 -2
- package/client/dist/assets/ProjectSettingsDialog-OgsgxjzF.js +0 -1
- package/client/dist/assets/ReviewPacketPage-DFog4sXn.js +0 -1
- package/client/dist/assets/TemplatePreviewModal-L2XxqiOD.js +0 -1
- package/client/dist/assets/TicketDetailModal-CsF-AWZX.js +0 -14
- package/client/dist/assets/Trans-Bsz9_gyq.js +0 -1
- package/client/dist/assets/agent-BQgKv_2F.js +0 -1
- package/client/dist/assets/agent-C1NRDJqL.js +0 -1
- package/client/dist/assets/agent-CLNleiy6.js +0 -1
- package/client/dist/assets/agent-CmceArkQ.js +0 -1
- package/client/dist/assets/agent-D3UxQ3SR.js +0 -1
- package/client/dist/assets/agent-DB1JeE64.js +0 -1
- package/client/dist/assets/agent-DXkHcQ-D.js +0 -1
- package/client/dist/assets/agent-DjJJJ2M8.js +0 -1
- package/client/dist/assets/auth-D_5bQv5W.js +0 -1
- package/client/dist/assets/ban-E4EaZe3a.js +0 -1
- package/client/dist/assets/bot-DzuuuC5R.js +0 -1
- package/client/dist/assets/browser-BgqHDMXP.js +0 -1
- package/client/dist/assets/browser-CsKJtrpv.js +0 -1
- package/client/dist/assets/browser-Cu58EpZU.js +0 -1
- package/client/dist/assets/browser-CvXOJm-j.js +0 -1
- package/client/dist/assets/browser-DOrFh1c7.js +0 -1
- package/client/dist/assets/browser-DQv_Jo7x.js +0 -1
- package/client/dist/assets/browser-LPgxvJu2.js +0 -1
- package/client/dist/assets/browser-eL-3MIEI.js +0 -1
- package/client/dist/assets/builder-0IWtosUm.js +0 -1
- package/client/dist/assets/builder-Bf2N6XWn.js +0 -1
- package/client/dist/assets/builder-BnqaaBkT.js +0 -1
- package/client/dist/assets/builder-BxxfGgAO.js +0 -1
- package/client/dist/assets/builder-C5IIgWsq.js +0 -1
- package/client/dist/assets/builder-CHuahItu.js +0 -1
- package/client/dist/assets/builder-CjWosXL_.js +0 -1
- package/client/dist/assets/builder-CpCIOoKj.js +0 -1
- package/client/dist/assets/code-CHPkOkDS.js +0 -1
- package/client/dist/assets/commands-6tYQih5m.js +0 -1
- package/client/dist/assets/commands-BK2QinXN.js +0 -1
- package/client/dist/assets/commands-C2Nca76h.js +0 -1
- package/client/dist/assets/commands-CKdLihNX.js +0 -1
- package/client/dist/assets/commands-CYIBTAlc.js +0 -1
- package/client/dist/assets/commands-CjUtYJIM.js +0 -1
- package/client/dist/assets/commands-Cq_u_8y9.js +0 -1
- package/client/dist/assets/commands-D_ZHYQug.js +0 -1
- package/client/dist/assets/common-6MLbD-jM.js +0 -1
- package/client/dist/assets/common-BKGEu4rm.js +0 -1
- package/client/dist/assets/common-BNbnv8cE.js +0 -1
- package/client/dist/assets/common-BqGWtDbt.js +0 -1
- package/client/dist/assets/common-DBtTzeYm.js +0 -1
- package/client/dist/assets/common-DEW3Nr8n.js +0 -1
- package/client/dist/assets/common-DHsv9N5d.js +0 -1
- package/client/dist/assets/common-mkrEcW-Y.js +0 -1
- package/client/dist/assets/dashboard-B9GhC5ku.js +0 -1
- package/client/dist/assets/dashboard-CBnv6zOI.js +0 -1
- package/client/dist/assets/dashboard-CaP0fU87.js +0 -1
- package/client/dist/assets/dashboard-D4ZZ4x84.js +0 -1
- package/client/dist/assets/dashboard-DmuTQBX8.js +0 -1
- package/client/dist/assets/dashboard-DynLYj3d.js +0 -1
- package/client/dist/assets/dashboard-zj4gGFJ1.js +0 -1
- package/client/dist/assets/dialog-CdWCb02j.js +0 -45
- package/client/dist/assets/dist-bVqfYmby.js +0 -1
- package/client/dist/assets/dist-js-CWeUdf5Z.js +0 -1
- package/client/dist/assets/formatDistanceToNow-DQCvMgUc.js +0 -1
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-C16cxSe1.js +0 -1
- package/client/dist/assets/git-refresh-wTW0rO0Z.js +0 -1
- package/client/dist/assets/i18n-hnX2DPmo.js +0 -2
- package/client/dist/assets/index-DIhMEAVw.js +0 -66
- package/client/dist/assets/index-DwygcU7s.css +0 -2
- package/client/dist/assets/mcp-B8X8wBLu.js +0 -1
- package/client/dist/assets/mcp-C2AojZZN.js +0 -1
- package/client/dist/assets/mcp-D8BT78_L.js +0 -1
- package/client/dist/assets/mcp-Df5RWBNk.js +0 -1
- package/client/dist/assets/mcp-Dj7BgMQW.js +0 -1
- package/client/dist/assets/mcp-Q7iT7rcz.js +0 -1
- package/client/dist/assets/mcp-YlvNvJbW.js +0 -1
- package/client/dist/assets/mcp-mKFpTSRb.js +0 -1
- package/client/dist/assets/narration-4Z2VUhZw.js +0 -1
- package/client/dist/assets/narration-BGuiEDj3.js +0 -1
- package/client/dist/assets/narration-BuSoqRmv.js +0 -1
- package/client/dist/assets/narration-CB9t29fy.js +0 -1
- package/client/dist/assets/narration-CU3x8FHD.js +0 -1
- package/client/dist/assets/narration-CWeXhfP5.js +0 -1
- package/client/dist/assets/narration-DRaDnhT5.js +0 -1
- package/client/dist/assets/narration-DtEbQgCw.js +0 -1
- package/client/dist/assets/nav-ApJVg3xu.js +0 -1
- package/client/dist/assets/nav-BKNky1Bg.js +0 -1
- package/client/dist/assets/nav-C6vWWKYx.js +0 -1
- package/client/dist/assets/nav-CXJ6Aw89.js +0 -1
- package/client/dist/assets/nav-CsmFBIDf.js +0 -1
- package/client/dist/assets/nav-DjkmQJjd.js +0 -1
- package/client/dist/assets/packet-B1IxaL5f.js +0 -1
- package/client/dist/assets/packet-Bh5kkbiB.js +0 -1
- package/client/dist/assets/packet-By8fqYxW.js +0 -1
- package/client/dist/assets/packet-CZdvA44E.js +0 -1
- package/client/dist/assets/packet-CrjHRQCP.js +0 -1
- package/client/dist/assets/packet-Dwi2pTtx.js +0 -1
- package/client/dist/assets/packet-_-ZIa0IR.js +0 -1
- package/client/dist/assets/packet-n0W6E1Hn.js +0 -1
- package/client/dist/assets/play-DNlrawbS.js +0 -1
- package/client/dist/assets/provider-capabilities-Doej9lfa.js +0 -1
- package/client/dist/assets/settings-Bd0x4TBa.js +0 -1
- package/client/dist/assets/settings-C1-7cXzC.js +0 -1
- package/client/dist/assets/settings-CAFaT38b.js +0 -1
- package/client/dist/assets/settings-Ct3v1nW2.js +0 -1
- package/client/dist/assets/settings-DHh7_IF5.js +0 -1
- package/client/dist/assets/settings-DQXAmdcv.js +0 -1
- package/client/dist/assets/settings-guzlhpup.js +0 -1
- package/client/dist/assets/settings-sZfTPMEH.js +0 -1
- package/client/dist/assets/setup-3jWaoVUO.js +0 -1
- package/client/dist/assets/setup-BjgRneb2.js +0 -1
- package/client/dist/assets/setup-BzFIjv-f.js +0 -1
- package/client/dist/assets/setup-C4VfQsxE.js +0 -1
- package/client/dist/assets/setup-DfUkpDbN.js +0 -1
- package/client/dist/assets/setup-ECe90Pmu.js +0 -1
- package/client/dist/assets/setup-dlqC4Jmm.js +0 -1
- package/client/dist/assets/setup-jwfLMiM2.js +0 -1
- package/client/dist/assets/spending-EC9xqio-.js +0 -1
- package/client/dist/assets/useDesktop-BQVt8lFd.js +0 -1
|
@@ -3,8 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.CONFIDENCE_RAW_CAP = exports.VERIFY_TAIL_CAP = void 0;
|
|
7
|
-
exports.parseVerificationSentinel = parseVerificationSentinel;
|
|
6
|
+
exports.CONFIDENCE_RAW_CAP = exports.VERIFY_TAIL_CAP = exports.parseVerificationSentinel = void 0;
|
|
8
7
|
exports.extractVerifyStepText = extractVerifyStepText;
|
|
9
8
|
exports.parseConfidenceScore = parseConfidenceScore;
|
|
10
9
|
exports.harvestDeliveryEvidence = harvestDeliveryEvidence;
|
|
@@ -15,36 +14,30 @@ exports.readSettleEvidence = readSettleEvidence;
|
|
|
15
14
|
* calls: the `VERIFICATION: PASS/FAIL` sentinel from the run's persisted
|
|
16
15
|
* stream (the rail-merge-orchestrator regex precedent), a bounded tail of the
|
|
17
16
|
* verify step's output, and the reviewer's `confidence-score.json` written
|
|
18
|
-
* into the worktree's `openspec/changes/<name>/`
|
|
19
|
-
*
|
|
17
|
+
* into either the worktree's `openspec/changes/<name>/` or the Codex reviewer
|
|
18
|
+
* agent-memory path. Harvest NEVER throws and never blocks settle: every missing or
|
|
20
19
|
* malformed source degrades to an absent value on the evidence record, so the
|
|
21
20
|
* packet can always state honestly what it does and does not know.
|
|
22
21
|
*/
|
|
23
22
|
const fs_1 = __importDefault(require("fs"));
|
|
24
23
|
const path_1 = __importDefault(require("path"));
|
|
24
|
+
const loop_factory_1 = require("./loop-factory");
|
|
25
|
+
const verification_sentinel_1 = require("./verification-sentinel");
|
|
26
|
+
var verification_sentinel_2 = require("./verification-sentinel");
|
|
27
|
+
Object.defineProperty(exports, "parseVerificationSentinel", { enumerable: true, get: function () { return verification_sentinel_2.parseVerificationSentinel; } });
|
|
25
28
|
/** Bounded tail of the verify step's raw output persisted per unit. */
|
|
26
29
|
exports.VERIFY_TAIL_CAP = 4096;
|
|
27
30
|
/** Raw confidence-score.json payloads are capped before persistence. */
|
|
28
31
|
exports.CONFIDENCE_RAW_CAP = 8192;
|
|
29
|
-
/** Last sentinel wins: the verify prompt itself quotes the format, so earlier
|
|
30
|
-
* mentions in assistant reasoning must not shadow the final verdict line. */
|
|
31
|
-
const SENTINEL_RE = /VERIFICATION:\s*(PASS|FAIL)\b[ \t]*(?:[—:-][ \t]*)?([^\n]*)/gi;
|
|
32
|
-
function parseVerificationSentinel(text) {
|
|
33
|
-
let verdict = 'absent';
|
|
34
|
-
let detail = null;
|
|
35
|
-
for (const match of text.matchAll(SENTINEL_RE)) {
|
|
36
|
-
verdict = match[1].toUpperCase() === 'PASS' ? 'pass' : 'fail';
|
|
37
|
-
const tail = (match[2] ?? '').trim();
|
|
38
|
-
detail = verdict === 'fail' && tail ? tail.slice(0, 512) : null;
|
|
39
|
-
}
|
|
40
|
-
return { verdict, detail };
|
|
41
|
-
}
|
|
42
32
|
function parseLoopStepPayload(payload) {
|
|
43
33
|
try {
|
|
44
34
|
const parsed = JSON.parse(payload);
|
|
45
35
|
return {
|
|
46
36
|
index: typeof parsed.index === 'number' ? parsed.index : null,
|
|
47
37
|
nodeId: typeof parsed.nodeId === 'string' ? parsed.nodeId : null,
|
|
38
|
+
startedAtMs: typeof parsed.startedAtMs === 'number' && Number.isFinite(parsed.startedAtMs)
|
|
39
|
+
? parsed.startedAtMs
|
|
40
|
+
: null,
|
|
48
41
|
};
|
|
49
42
|
}
|
|
50
43
|
catch {
|
|
@@ -55,8 +48,18 @@ function parseLoopStepPayload(payload) {
|
|
|
55
48
|
* hold the raw provider JSONL line; log rows hold plain text. Everything else
|
|
56
49
|
* contributes nothing (structured/loop events are boundaries, not output). */
|
|
57
50
|
function eventText(event) {
|
|
58
|
-
if (event.event_type === 'log')
|
|
51
|
+
if (event.event_type === 'log') {
|
|
52
|
+
// LoopRunManager persists the visible transcript as { line }, including
|
|
53
|
+
// Codex/Gemini output. Decode it before matching line-based verdicts and
|
|
54
|
+
// collecting the review excerpt; legacy plain-text rows still work.
|
|
55
|
+
try {
|
|
56
|
+
const value = JSON.parse(event.payload);
|
|
57
|
+
if (value && typeof value.line === 'string')
|
|
58
|
+
return value.line;
|
|
59
|
+
}
|
|
60
|
+
catch { /* legacy plain-text log */ }
|
|
59
61
|
return event.payload;
|
|
62
|
+
}
|
|
60
63
|
if (event.event_type !== 'assistant')
|
|
61
64
|
return '';
|
|
62
65
|
try {
|
|
@@ -83,6 +86,8 @@ function extractVerifyStepText(events) {
|
|
|
83
86
|
let start = -1;
|
|
84
87
|
let end = events.length;
|
|
85
88
|
let stepIndex = null;
|
|
89
|
+
let startedAtMs = null;
|
|
90
|
+
let status = null;
|
|
86
91
|
for (let i = 0; i < events.length; i++) {
|
|
87
92
|
const event = events[i];
|
|
88
93
|
if (event.event_type === 'loop_step') {
|
|
@@ -91,6 +96,11 @@ function extractVerifyStepText(events) {
|
|
|
91
96
|
start = i;
|
|
92
97
|
stepIndex = step.index;
|
|
93
98
|
end = events.length;
|
|
99
|
+
// Legacy DB timestamps are second-precision SQLite text with no timezone.
|
|
100
|
+
// They cannot prove artifact ordering within that second, so freshness
|
|
101
|
+
// deliberately requires the high-resolution boundary in the payload.
|
|
102
|
+
startedAtMs = step.startedAtMs;
|
|
103
|
+
status = null;
|
|
94
104
|
}
|
|
95
105
|
else if (start >= 0 && i > start) {
|
|
96
106
|
// A later non-verify step closes the previous verify range unless a
|
|
@@ -102,11 +112,17 @@ function extractVerifyStepText(events) {
|
|
|
102
112
|
else if (start >= 0 && end === events.length && event.event_type === 'loop_step_end' &&
|
|
103
113
|
stepIndex !== null && parseLoopStepPayload(event.payload)?.index === stepIndex) {
|
|
104
114
|
end = i;
|
|
115
|
+
try {
|
|
116
|
+
const payload = JSON.parse(event.payload);
|
|
117
|
+
if (payload.status === 'ok' || payload.status === 'failed')
|
|
118
|
+
status = payload.status;
|
|
119
|
+
}
|
|
120
|
+
catch { /* missing/malformed completion is not successful evidence */ }
|
|
105
121
|
}
|
|
106
122
|
}
|
|
107
123
|
const range = start >= 0 ? events.slice(start, end) : events;
|
|
108
124
|
const text = range.map(eventText).filter(Boolean).join('\n');
|
|
109
|
-
return { text, scoped: start >= 0 };
|
|
125
|
+
return { text, scoped: start >= 0, startedAtMs, status };
|
|
110
126
|
}
|
|
111
127
|
function toNumberRecord(value) {
|
|
112
128
|
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
@@ -134,42 +150,120 @@ function parseConfidenceScore(rawJson, changeName) {
|
|
|
134
150
|
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
135
151
|
return null;
|
|
136
152
|
const obj = parsed;
|
|
153
|
+
// The DOCUMENTED schema says `overall`/`flags`; the reviewer Codex actually
|
|
154
|
+
// installs writes `overall_score`/`issues[].note`. Accept both additively
|
|
155
|
+
// rather than pick a winner — an unread score reads as "no reviewer score",
|
|
156
|
+
// which is the one thing the packet must never say when one exists.
|
|
157
|
+
const overall = [obj.overall, obj.overall_score].find((candidate) => typeof candidate === 'number' && Number.isFinite(candidate));
|
|
158
|
+
const explicitFlags = Array.isArray(obj.flags)
|
|
159
|
+
? obj.flags.filter((flag) => typeof flag === 'string')
|
|
160
|
+
: [];
|
|
161
|
+
const issueFlags = Array.isArray(obj.issues)
|
|
162
|
+
? obj.issues.flatMap((issue) => {
|
|
163
|
+
if (!issue || typeof issue !== 'object' || Array.isArray(issue))
|
|
164
|
+
return [];
|
|
165
|
+
const note = issue.note;
|
|
166
|
+
return typeof note === 'string' && note.trim() ? [note.trim().slice(0, 512)] : [];
|
|
167
|
+
})
|
|
168
|
+
: [];
|
|
137
169
|
return {
|
|
138
170
|
changeName,
|
|
139
|
-
overall: typeof
|
|
171
|
+
overall: typeof overall === 'number' ? overall : null,
|
|
140
172
|
aspects: toNumberRecord(obj.aspects ?? obj.scores),
|
|
141
|
-
flags:
|
|
173
|
+
flags: [...new Set([...explicitFlags, ...issueFlags])].slice(0, 20),
|
|
142
174
|
raw: rawJson.length > exports.CONFIDENCE_RAW_CAP ? null : parsed,
|
|
143
175
|
};
|
|
144
176
|
}
|
|
145
|
-
|
|
146
|
-
* A worktree hosts at most a handful of change dirs; when several carry a
|
|
147
|
-
* score (unusual), the lexicographically last dir wins deterministically. */
|
|
148
|
-
function readConfidenceFromWorktree(worktreePath, io) {
|
|
177
|
+
function listOpenSpecScoreCandidates(worktreePath, io) {
|
|
149
178
|
const changesDir = path_1.default.join(worktreePath, 'openspec', 'changes');
|
|
150
179
|
let dirs;
|
|
151
180
|
try {
|
|
152
181
|
dirs = io.listDir(changesDir);
|
|
153
182
|
}
|
|
183
|
+
catch {
|
|
184
|
+
return [];
|
|
185
|
+
}
|
|
186
|
+
return [...dirs].sort().map((dir) => ({
|
|
187
|
+
filePath: path_1.default.join(changesDir, dir, 'confidence-score.json'),
|
|
188
|
+
changeName: dir,
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
/** The reviewer's OTHER landing site. The filename contract is exact on purpose:
|
|
192
|
+
* a looser match would let another ticket's review — or an unrelated memory
|
|
193
|
+
* file — be presented as this delivery's score. */
|
|
194
|
+
function listAgentMemoryScoreCandidates(worktreePath, ticketId, io) {
|
|
195
|
+
const explanationsDir = path_1.default.join(worktreePath, '.specrails', 'agent-memory', 'explanations');
|
|
196
|
+
let files;
|
|
197
|
+
try {
|
|
198
|
+
files = io.listDir(explanationsDir);
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
return [];
|
|
202
|
+
}
|
|
203
|
+
const exactName = new RegExp(`^\\d{4}-\\d{2}-\\d{2}-reviewer-ticket-${ticketId}\\.confidence-score\\.json$`);
|
|
204
|
+
return files
|
|
205
|
+
.filter((file) => exactName.test(file))
|
|
206
|
+
.sort()
|
|
207
|
+
.map((file) => ({ filePath: path_1.default.join(explanationsDir, file), changeName: null }));
|
|
208
|
+
}
|
|
209
|
+
function readCandidate(candidate, io) {
|
|
210
|
+
try {
|
|
211
|
+
if (!io.fileExists(candidate.filePath))
|
|
212
|
+
return null;
|
|
213
|
+
return parseConfidenceScore(io.readFile(candidate.filePath), candidate.changeName);
|
|
214
|
+
}
|
|
154
215
|
catch {
|
|
155
216
|
return null;
|
|
156
217
|
}
|
|
218
|
+
}
|
|
219
|
+
/** Newest confidence-score.json under `<worktree>/openspec/changes/<name>/`.
|
|
220
|
+
* A worktree hosts at most a handful of change dirs; when several carry a
|
|
221
|
+
* score (unusual), the lexicographically last dir wins deterministically.
|
|
222
|
+
*
|
|
223
|
+
* `revision` switches on the strict gate: a Revision's reviewer evidence is
|
|
224
|
+
* accepted ONLY when the artifact was written during the LATEST read-only verify
|
|
225
|
+
* epoch. Without it, a fix followed by a reviewer that failed to write anything
|
|
226
|
+
* would silently re-present the previous candidate's clean score as this one's. */
|
|
227
|
+
function readConfidenceFromWorktree(worktreePath, io, revision) {
|
|
228
|
+
const openSpecCandidates = listOpenSpecScoreCandidates(worktreePath, io);
|
|
229
|
+
if (!revision) {
|
|
230
|
+
let found = null;
|
|
231
|
+
for (const candidate of openSpecCandidates) {
|
|
232
|
+
const parsed = readCandidate(candidate, io);
|
|
233
|
+
if (parsed)
|
|
234
|
+
found = parsed;
|
|
235
|
+
}
|
|
236
|
+
return found;
|
|
237
|
+
}
|
|
238
|
+
// Fail closed: no high-resolution boundary ⇒ freshness is unprovable ⇒ no score.
|
|
239
|
+
if (revision.verifyStartedAtMs === null)
|
|
240
|
+
return null;
|
|
241
|
+
const candidates = [
|
|
242
|
+
...openSpecCandidates,
|
|
243
|
+
...listAgentMemoryScoreCandidates(worktreePath, revision.ticketId, io),
|
|
244
|
+
];
|
|
157
245
|
let found = null;
|
|
158
|
-
for (const
|
|
159
|
-
const scorePath = path_1.default.join(changesDir, dir, 'confidence-score.json');
|
|
246
|
+
for (const candidate of candidates) {
|
|
160
247
|
try {
|
|
161
|
-
if (!io.fileExists(
|
|
248
|
+
if (!io.fileExists(candidate.filePath))
|
|
162
249
|
continue;
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
250
|
+
const mtimeMs = io.fileMtimeMs(candidate.filePath);
|
|
251
|
+
if (!Number.isFinite(mtimeMs) || mtimeMs < revision.verifyStartedAtMs)
|
|
252
|
+
continue;
|
|
253
|
+
const score = parseConfidenceScore(io.readFile(candidate.filePath), candidate.changeName);
|
|
254
|
+
if (!score)
|
|
255
|
+
continue;
|
|
256
|
+
if (found === null ||
|
|
257
|
+
mtimeMs > found.mtimeMs ||
|
|
258
|
+
(mtimeMs === found.mtimeMs && candidate.filePath > found.filePath)) {
|
|
259
|
+
found = { score, mtimeMs, filePath: candidate.filePath };
|
|
260
|
+
}
|
|
167
261
|
}
|
|
168
262
|
catch {
|
|
169
|
-
/* unreadable
|
|
263
|
+
/* unreadable freshness/content = unavailable, never stale */
|
|
170
264
|
}
|
|
171
265
|
}
|
|
172
|
-
return found;
|
|
266
|
+
return found?.score ?? null;
|
|
173
267
|
}
|
|
174
268
|
/**
|
|
175
269
|
* Harvest evidence for every unit of a settling delivery. Never throws; the
|
|
@@ -180,7 +274,8 @@ function harvestDeliveryEvidence(io, units) {
|
|
|
180
274
|
const readFile = io.readFile ?? ((p) => fs_1.default.readFileSync(p, 'utf8'));
|
|
181
275
|
const listDir = io.listDir ?? ((p) => fs_1.default.readdirSync(p));
|
|
182
276
|
const fileExists = io.fileExists ?? ((p) => fs_1.default.existsSync(p));
|
|
183
|
-
const
|
|
277
|
+
const fileMtimeMs = io.fileMtimeMs ?? ((p) => fs_1.default.statSync(p).mtimeMs);
|
|
278
|
+
const fsIo = { readFile, listDir, fileExists, fileMtimeMs };
|
|
184
279
|
let errored = 0;
|
|
185
280
|
const harvested = units.map((unit) => {
|
|
186
281
|
const evidence = {
|
|
@@ -192,13 +287,19 @@ function harvestDeliveryEvidence(io, units) {
|
|
|
192
287
|
confidence: null,
|
|
193
288
|
};
|
|
194
289
|
let unitErrored = false;
|
|
290
|
+
let verifyStartedAtMs = null;
|
|
195
291
|
try {
|
|
196
292
|
if (unit.runId) {
|
|
197
293
|
const events = io.readEvents(unit.runId);
|
|
198
|
-
const { text } = extractVerifyStepText(events);
|
|
294
|
+
const { text, startedAtMs, scoped, status } = extractVerifyStepText(events);
|
|
295
|
+
verifyStartedAtMs = startedAtMs;
|
|
199
296
|
if (text) {
|
|
200
|
-
const sentinel = parseVerificationSentinel(text);
|
|
201
|
-
|
|
297
|
+
const sentinel = (0, verification_sentinel_1.parseVerificationSentinel)(text);
|
|
298
|
+
// A PASS printed before a crash/cancel is not a completed
|
|
299
|
+
// verification. Keep its raw excerpt but never advertise it as green.
|
|
300
|
+
evidence.sentinel = sentinel.verdict === 'pass' && scoped && status !== 'ok'
|
|
301
|
+
? 'absent'
|
|
302
|
+
: sentinel.verdict;
|
|
202
303
|
evidence.sentinelDetail = sentinel.detail;
|
|
203
304
|
evidence.verifyTail = text.slice(-exports.VERIFY_TAIL_CAP);
|
|
204
305
|
}
|
|
@@ -209,7 +310,9 @@ function harvestDeliveryEvidence(io, units) {
|
|
|
209
310
|
}
|
|
210
311
|
try {
|
|
211
312
|
if (unit.worktreePath) {
|
|
212
|
-
evidence.confidence = readConfidenceFromWorktree(unit.worktreePath, fsIo
|
|
313
|
+
evidence.confidence = readConfidenceFromWorktree(unit.worktreePath, fsIo, unit.loopId === loop_factory_1.FACTORY_REVISION_LOOP_ID
|
|
314
|
+
? { ticketId: unit.ticketId, verifyStartedAtMs }
|
|
315
|
+
: undefined);
|
|
213
316
|
}
|
|
214
317
|
}
|
|
215
318
|
catch {
|