chainlesschain 0.162.161 → 0.162.162

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.
Files changed (178) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-DMn528q-.js → AIOps-ClI2ALgv.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-D9ZcDCJL.js → ActionButton-BDjRcJaK.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-A_K-8PX0.js → Analytics-DikSRsaT.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-D4pFW3X6.js → AppLayout-9mLhMFmz.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-Dz46COAd.js → Artifacts-BSr88BrH.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-cbMjbyg0.js → Audit-CdvyimOF.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-Dtf88GAj.js → BackgroundAgents-D3_hCedh.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-C5KRxn52.js → Backup-Cyvv9RHf.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-Dd2UK3BN.js → BaseInput-BZM14kt8.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-lptKTFdG.js → Chat-DrQSokVz.js} +6 -6
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-C2KLtwHz.js → ChatBubbleRenderer-HwJR-C6B.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-_yspG6rG.js → Checkbox-bFLYeWMV.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-BGq_GAha.js → Codegen-7mN7xJXT.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-CePor71g.js → Col-DAB5ZWm7.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-CLOWhIT7.js → Community-B_1TymaK.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-CivJt2vT.js → Compact-Bq1uSWLJ.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-Btmo1GGE.js → Compliance-CyiE1jEe.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-Ct35OlG4.js → Cowork-Cpk0D7vm.js} +2 -2
  20. package/src/assets/web-panel/assets/{Cron-CTc2GmhB.js → Cron-d_Lv3rdB.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-ZtiBETk1.js → Crosschain-DMqhHjMR.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-BNqMQQXw.js → DID-Br-oPuBw.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-BmzZd-9V.js → Dashboard-CfLW_RaP.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-CMVgvP2M.js → Dropdown-DZnTOExV.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-CcqQFAfT.js → EmailListRenderer-DHIUHDv1.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CTqB1_4V.js → FamilyGuardDashboard-Bw3t3myu.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-CiKOOzlb.js → Federation-D9cpQPAY.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-Wk-OT0gr.js → FormItemContext-Jdczr9Mr.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-DbEQT6ue.js → GenericCardRenderer-BT8ZMpC5.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-0ZvCPSD9.js → Git-DjARip2b.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-CmVuKkPb.js → Governance-BgWbSRcj.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-CTWE3Jwg.js → Inference-CfouJciM.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-CBEIF00L.js → KnowledgeGraph-50l7mrAr.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-DLhxDwVG.js → Logs-rq50H84B.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-DUPIEdQH.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-BgsCBrnc.js → Marketplace-BYgPDmHU.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-ClBUGDS2.js → McpTools-5DVgcFdx.js} +3 -3
  38. package/src/assets/web-panel/assets/{Memory-CnG_ZnYw.js → Memory-B70LPk7f.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-BUOAbR1Z.js → MobileBridge-De8ssA5Y.js} +1 -1
  40. package/src/assets/web-panel/assets/MobileProjects-D10VISps.js +1 -0
  41. package/src/assets/web-panel/assets/{Mtc-CLjt4kCD.js → Mtc-RJsOTsIA.js} +2 -2
  42. package/src/assets/web-panel/assets/{MtcAudit-f24U9Aes.js → MtcAudit-Crh-6BEK.js} +5 -5
  43. package/src/assets/web-panel/assets/{Multisig-GrmGQbSq.js → Multisig-wuoR5l3x.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-DADaWn-n.js → NLProgramming-U2Mji4fZ.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-xtf5RX6C.js → Notes-CdTZAyDH.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-Cd27Rgtx.js → NotificationSettings-C-FucWE7.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-fXRxlDjl.js → OrderTableRenderer-DCYFTeaI.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-joCFlNB0.js → Organization-an3OF85L.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-B1HoURq0.js → Overflow-C-1vmYFe.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-DiwsKbT7.js → P2P-Cwh47xKg.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-Xe-BsW6S.js → PdhVaultBrowser-Dm38GT0k.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-C23qi8kl.js → Permissions-DS2Y8awD.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-BS1syX2f.js → PersonalDataHub-BQNziA0I.js} +3 -3
  54. package/src/assets/web-panel/assets/{Pipeline-DRYwwDyh.js → Pipeline-DF85L1ue.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-BQKaDHPH.js → Privacy-BuLornF-.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-BC6F9xiG.js → ProjectInit-C3Y31IwX.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-ClFPc1Nd.js → ProjectSettings-BCPiI8aD.js} +2 -2
  58. package/src/assets/web-panel/assets/Projects-BZ6s4k6g.js +1 -0
  59. package/src/assets/web-panel/assets/{Providers-CLWuOUNt.js → Providers-D3Wp022X.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-DiqULTxb.js → QrScannerModal-CUJfQkH4.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-9A03P-E_.js → QuickAsk-UAc0EO8l.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-CJZAnbq_.js → Recommend-BaxKupcs.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-C9A1R77h.js → RemoteSession-C75NNnXZ.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-BIZc6Rky.js → Reputation-BVXynZAk.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-DfIPNtuG.js → Row-C5MRZ0bi.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-C5znFcQ1.js → RssFeed-DAKkEYka.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-DSs2z3OX.js → Search-DvWv9YOA.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-CV6LcrLY.js → Security-B5peafW1.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-cmhoX0Xj.js → Services-UQmvPEaG.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-tCsg2po7.js → Skeleton-C3bhWpuF.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-BK1KUDiy.js → Skills-DfkKf9_H.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-yRgyeA82.js → Sla-DqMSjlBM.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-c1mo1mlp.js → SpeechSettings-C-WbxWUX.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-koIAfuT3.js → SyncSettings-CYuHZ4N2.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-DkkreAaB.js → Tasks-CyeAyB9d.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-fy5Ctf9M.js → Templates-BTCeQnpq.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-Bw70Jf6S.js → Tenant-BifQuA9Y.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-BKh6Rx-4.js → Terminal-Bx_9Bocf.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-Dg54WP0c.js → TimelineRenderer-BX0RFCOm.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-BvvD5SxJ.js → Tokens-CGHrCmUS.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-B7Ug9x4e.js → Trigger-DlqaY4SO.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-BjvuMORY.js → Trust-DfOmj-ay.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-CZqhkx8p.js → UkeySign-B72jH5fE.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-ClR50lhX.js → VideoEditing-BT-63fqv.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-DlfppYjx.js → Wallet-Dsul3sHr.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-BirgVr8B.js → WebAuthn-Izkwwdgy.js} +2 -2
  87. package/src/assets/web-panel/assets/{WorkflowEditor-B8DP_bax.js → WorkflowEditor-D3FHSiH1.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-DA8AUZzL.js → chat-CmVz5z3U.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-C38pLGp1.js → colors-CuLgyJBp.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-81rtr98o.js → compact-item-Ml1YkXpw.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-D34ixq8t.js → createContext-BvjJ48bs.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-DhiGrbsh.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-D4bzqTrZ.js → hasIn-DVC0157C.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-D_2VYPr1.js → index-4SBta3d7.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-CoVgZw_b.js → index-4wcgvPoF.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-ZRJRItm0.js → index-B0S8NzO6.js} +1 -1
  97. package/src/assets/web-panel/assets/index-B7a1TrU6.js +1 -0
  98. package/src/assets/web-panel/assets/{index-CuS-UPoj.js → index-BUt8kTIB.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BtGxuQrO.js → index-B_EvG_GW.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-B0QArPQt.js → index-BbPtzB8M.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-Cd3KuNK5.js → index-BbepULSc.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CbhE3j5j.js → index-BfuKP4qe.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BXd2_LmH.js → index-BiC6dQZG.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CP5alL4t.js → index-BjHBpRYZ.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BvL_3J_n.js → index-BpFJHiTv.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DFyWKOBD.js → index-BydjdZnl.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Ddk0e_Pi.js → index-BzG-x9p4.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BS3M5H9V.js → index-Bzr0rB5T.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DkHqMnn3.js → index-C229ABfy.js} +1 -1
  110. package/src/assets/web-panel/assets/index-C2B1KRja.js +1 -0
  111. package/src/assets/web-panel/assets/{index-D6GfvEQG.js → index-CFYVQMvu.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BqIhLAbA.js → index-CXkJH-lK.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-B8mkLM4x.js → index-C_H_S-DY.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-D0Ih7Hwn.js → index-C_XuRgGn.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-COe_cOLJ.js → index-C_vRgTl9.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BIP62a6r.js → index-Ck_52dz_.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BP-zkXK8.js → index-CmFNvNLZ.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-D3zCCZRS.js → index-CudmwNBV.js} +3 -3
  119. package/src/assets/web-panel/assets/{index-DFHa1HIg.js → index-Cw0Rjy87.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BvD7b2IK.js → index-D3lD5qap.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DakfFZ-k.js → index-DC_OI9H2.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DvfCEJG-.js → index-DDGaOWBV.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-E1OJRXs4.js → index-DJyN28Et.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-Dmo3dFHb.js → index-DYXHFr4r.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-tKiC8T-4.js → index-Dt5KMjwJ.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-fI5sXMLg.js → index-DuGszaWY.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DUQLXLQM.js → index-DukDVXCv.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DMgnRwrK.js → index-KMqhcF7l.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-F76w1NiL.js → index-KjgKdZe-.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DBFSo1NF.js → index-QXzlT9KD.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BlxEphl7.js → index-vG4XSJ1d.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-9qoVpPt6.js → index-wvb_FtaV.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-ByyvflIR.js → initDefaultProps-BDgd2YZ8.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-B3FQm2By.js → motion-ErtrXdYe.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-BSfns6Ef.js → move-_GPPNCgs.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-CTG1Ieri.js → mtc-parser-DRLL-8V2.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-DObM_2j6.js → omit-p86sl023.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-DOfelQ1t.js → pickAttrs-BTu7cMLH.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-CHZILds_.js → placementArrow-BEKz6Isr.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-REbucKSx.js → responsiveObserve-Ck42c9MP.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-C6EZzD7o.js → slide-1CEvuPsB.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-BxkWS-g3.js → statusUtils-BDfdx1GJ.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-Chklyoq6.js → styleChecker-B4K46m5w.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-CRVwKrrI.js → useFlexGapSupport-DoIVpJNq.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-DV24ik_J.js → useFs-DdAWi-ln.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-C7vIo4Pg.js → usePersonalDataHub-iUu6k8dx.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-By-v5GlF.js → vnode-DZz4R6Tw.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-B1w9Am3r.js → zoom-DXlf9sA3.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/commands/review.js +6 -1
  151. package/src/data/changelog.json +7 -2
  152. package/src/lib/agents.js +19 -0
  153. package/src/lib/background-agent-supervisor.js +34 -7
  154. package/src/lib/docs-drift.js +166 -0
  155. package/src/lib/doctor-checkup.js +76 -0
  156. package/src/lib/hook-event-bus.cjs +0 -0
  157. package/src/lib/json-schema-output.js +30 -1
  158. package/src/lib/json-schema-validate.js +691 -0
  159. package/src/lib/lsp/__tests__/diagnostics-scheduler.test.js +93 -0
  160. package/src/lib/lsp/diagnostics-scheduler.js +127 -0
  161. package/src/lib/operation-fingerprint.js +95 -0
  162. package/src/lib/plugin-runtime/capabilities.js +371 -0
  163. package/src/lib/plugin-runtime/manifest.js +30 -0
  164. package/src/lib/remote-approval-bridge.js +16 -0
  165. package/src/lib/review-pipeline.js +227 -0
  166. package/src/lib/runtime-checkup.js +318 -0
  167. package/src/lib/session-lifecycle.js +305 -0
  168. package/src/lib/settings-hook-events.cjs +39 -13
  169. package/src/lib/subagent-contract.js +383 -0
  170. package/src/lib/telemetry-ids.js +190 -0
  171. package/src/lib/turn-binding.js +397 -0
  172. package/src/runtime/agent-core.js +13 -6
  173. package/src/assets/web-panel/assets/MarkdownRenderer-DxywvhTU.js +0 -1
  174. package/src/assets/web-panel/assets/MobileProjects-Dnt_9-WB.js +0 -1
  175. package/src/assets/web-panel/assets/Projects-Dn-f5aYe.js +0 -1
  176. package/src/assets/web-panel/assets/devWarning-CHDIEOeN.js +0 -1
  177. package/src/assets/web-panel/assets/index-CY1NURWZ.js +0 -1
  178. package/src/assets/web-panel/assets/index-DokUYqpq.js +0 -1
@@ -26,6 +26,7 @@ import {
26
26
  import { execSync } from "node:child_process";
27
27
  import { join, basename } from "node:path";
28
28
  import { getHomeDir, getConfigPath } from "./paths.js";
29
+ import { checkAgenda, checkInstructionFiles } from "./runtime-checkup.js";
29
30
 
30
31
  export const CHECK_LEVELS = Object.freeze({
31
32
  OK: "ok",
@@ -540,6 +541,80 @@ async function worktreeSection(opts, deps) {
540
541
  return { id: "worktrees", title: "Git worktrees", checks };
541
542
  }
542
543
 
544
+ // ── runtime checkup: agenda expiry + verbose instruction files ──────────────
545
+ // Only the gaps the OTHER sections don't already cover. Stale sessions,
546
+ // worktrees, orphan processes and lost background agents are handled by
547
+ // transcriptSection / worktreeSection / backgroundSection — surfacing them here
548
+ // too would double-report, so this section deliberately covers just the agenda
549
+ // schedule store and the instruction files (cc.md / AGENTS.md / CLAUDE.md).
550
+ const SEVERITY_TO_LEVEL = {
551
+ error: CHECK_LEVELS.ERR,
552
+ warn: CHECK_LEVELS.WARN,
553
+ info: CHECK_LEVELS.INFO,
554
+ };
555
+
556
+ async function runtimeSection(opts, deps) {
557
+ const checks = [];
558
+ const now = deps.now();
559
+
560
+ // Agenda schedule store — overdue/never-fired wakeups, retirable leftovers.
561
+ try {
562
+ const { AgentScheduleStore } = await import("./agent-schedule-store.js");
563
+ const store = new AgentScheduleStore();
564
+ const entries = store.list().map((e) => ({
565
+ id: e.id,
566
+ dueAt: e.kind === "wakeup" ? e.dueAt : e.nextAt,
567
+ recurring: e.kind !== "wakeup",
568
+ }));
569
+ for (const f of checkAgenda(entries, now)) {
570
+ checks.push(
571
+ check(
572
+ f.id,
573
+ `agenda ${f.ref}`,
574
+ SEVERITY_TO_LEVEL[f.severity] || CHECK_LEVELS.INFO,
575
+ `${f.message} — ${f.remediation}`,
576
+ ),
577
+ );
578
+ }
579
+ } catch (err) {
580
+ checks.push(failedCheck("agenda", "agenda schedule store", err));
581
+ }
582
+
583
+ // Instruction files — flag verbose ones (byte size only; a derivability
584
+ // heuristic would need code analysis and isn't computed here).
585
+ try {
586
+ const cwd = opts.cwd || process.cwd();
587
+ const files = [];
588
+ for (const name of ["cc.md", "AGENTS.md", "CLAUDE.md"]) {
589
+ const p = join(cwd, name);
590
+ if (deps.existsSync(p)) {
591
+ try {
592
+ files.push({ path: name, bytes: deps.statSync(p).size });
593
+ } catch {
594
+ // raced/unreadable — skip
595
+ }
596
+ }
597
+ }
598
+ for (const f of checkInstructionFiles(files)) {
599
+ checks.push(
600
+ check(
601
+ f.id,
602
+ f.ref,
603
+ SEVERITY_TO_LEVEL[f.severity] || CHECK_LEVELS.INFO,
604
+ `${f.message} — ${f.remediation}`,
605
+ ),
606
+ );
607
+ }
608
+ } catch (err) {
609
+ checks.push(failedCheck("instructions", "instruction files", err));
610
+ }
611
+
612
+ if (checks.length === 0) {
613
+ checks.push(check("runtime-clean", "runtime hygiene", CHECK_LEVELS.OK, ""));
614
+ }
615
+ return { id: "runtime", title: "Runtime checkup", checks };
616
+ }
617
+
543
618
  /**
544
619
  * Collect all checkup sections. Never throws — a failing subsystem becomes an
545
620
  * `err` check inside its section.
@@ -557,6 +632,7 @@ export async function collectCheckupSections(opts = {}) {
557
632
  transcriptSection,
558
633
  backgroundSection,
559
634
  worktreeSection,
635
+ runtimeSection,
560
636
  ]) {
561
637
  try {
562
638
  sections.push(await build(opts, deps));
Binary file
@@ -13,10 +13,26 @@
13
13
  */
14
14
 
15
15
  import fsDefault from "fs";
16
+ import {
17
+ validateSchema,
18
+ buildStructuredResultEvent,
19
+ computeSchemaDigest,
20
+ } from "./json-schema-validate.js";
16
21
 
17
22
  export const MAX_ATTEMPTS = 3;
18
23
  export const _deps = { fs: fsDefault };
19
24
 
25
+ /**
26
+ * Build the terminal `structured_result` stream event for a value against a
27
+ * schema (P2). Delegates to the richer Draft-2020-12-subset validator so the
28
+ * event carries a schema digest + coded/pointered errors — never free text.
29
+ */
30
+ export function buildStructuredResult(schema, value) {
31
+ return buildStructuredResultEvent({ schema, value });
32
+ }
33
+
34
+ export { computeSchemaDigest };
35
+
20
36
  /** Validate `value` against the schema subset. Returns error strings ([] = valid). */
21
37
  export function validateAgainstSchema(value, schema, path = "$") {
22
38
  const errors = [];
@@ -193,13 +209,26 @@ export function loadSchemaFile(fs, schemaFile) {
193
209
  } catch (e) {
194
210
  throw new Error(`Cannot read schema file "${schemaFile}": ${e.message}`);
195
211
  }
212
+ let parsed;
196
213
  try {
197
- return JSON.parse(raw);
214
+ parsed = JSON.parse(raw);
198
215
  } catch (e) {
199
216
  throw new Error(
200
217
  `Invalid JSON in schema file "${schemaFile}": ${e.message}`,
201
218
  );
202
219
  }
220
+ // Startup schema meta-validation (P2): reject a malformed schema up front
221
+ // (bad type value, non-array required, invalid regex, …) instead of silently
222
+ // mis-validating every reply against a broken contract.
223
+ const meta = validateSchema(parsed);
224
+ if (!meta.valid) {
225
+ const detail = meta.errors
226
+ .slice(0, 5)
227
+ .map((e) => ` - ${e.schemaPath || "/"}: ${e.message}`)
228
+ .join("\n");
229
+ throw new Error(`Invalid JSON Schema in "${schemaFile}":\n${detail}`);
230
+ }
231
+ return parsed;
203
232
  }
204
233
 
205
234
  /**