opendevbrowser 0.0.31 → 0.0.33

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 (336) hide show
  1. package/README.md +18 -5
  2. package/dist/{accessibility-snapshot-CQ4ZKWKC.js → accessibility-snapshot-JSPFVWZ6.js} +12 -12
  3. package/dist/{active-window-TD5HYJ72.js → active-window-2OB2MSCR.js} +12 -12
  4. package/dist/{annotate-VTLFS2XV.js → annotate-VDZBZBKZ.js} +11 -11
  5. package/dist/{artifacts-KJ6RNDO2.js → artifacts-JHDUUJGQ.js} +2 -2
  6. package/dist/{attr-BCI5KYCW.js → attr-7XIO4MCH.js} +11 -11
  7. package/dist/browser/canvas-manager.d.ts.map +1 -1
  8. package/dist/canvas/guidance.d.ts +7 -0
  9. package/dist/canvas/guidance.d.ts.map +1 -1
  10. package/dist/canvas/repair-examples.d.ts +45 -0
  11. package/dist/canvas/repair-examples.d.ts.map +1 -0
  12. package/dist/{canvas-5DFEEOKM.js → canvas-N4PAA274.js} +26 -11
  13. package/dist/canvas-N4PAA274.js.map +1 -0
  14. package/dist/{capture-desktop-HFTTWY4Z.js → capture-desktop-T5YO3EBI.js} +12 -12
  15. package/dist/{capture-window-X63XPIFF.js → capture-window-UKEUBWKH.js} +12 -12
  16. package/dist/{check-LWAUY7GC.js → check-PQB6KKMN.js} +11 -11
  17. package/dist/{checked-ZSOUKVYT.js → checked-RNZIMCU6.js} +11 -11
  18. package/dist/{chunk-6B5WAQV7.js → chunk-27W46IKI.js} +42 -11
  19. package/dist/chunk-27W46IKI.js.map +1 -0
  20. package/dist/{chunk-WHQZBUNY.js → chunk-3WLCWHIV.js} +2 -2
  21. package/dist/{chunk-WHQZBUNY.js.map → chunk-3WLCWHIV.js.map} +1 -1
  22. package/dist/{chunk-PPUWQKIC.js → chunk-52ZIOWVU.js} +4 -4
  23. package/dist/{chunk-IPE7TF2P.js → chunk-7BNU6DFI.js} +8 -5
  24. package/dist/chunk-7BNU6DFI.js.map +1 -0
  25. package/dist/{chunk-3ILXPKSJ.js → chunk-BUVYTJZR.js} +2 -1
  26. package/dist/chunk-BUVYTJZR.js.map +1 -0
  27. package/dist/{chunk-QOMWCRE3.js → chunk-EOX6U6Q4.js} +47 -19
  28. package/dist/chunk-EOX6U6Q4.js.map +1 -0
  29. package/dist/{chunk-4BEJVZRK.js → chunk-FBKPDILE.js} +3625 -289
  30. package/dist/chunk-FBKPDILE.js.map +1 -0
  31. package/dist/{chunk-2I3YS3DV.js → chunk-FDBUB7BM.js} +7 -3
  32. package/dist/chunk-FDBUB7BM.js.map +1 -0
  33. package/dist/{chunk-COAOWH3G.js → chunk-HMRANSDX.js} +120 -28
  34. package/dist/chunk-HMRANSDX.js.map +1 -0
  35. package/dist/{chunk-KZ2IXVQT.js → chunk-IBIHDGTZ.js} +40 -5
  36. package/dist/chunk-IBIHDGTZ.js.map +1 -0
  37. package/dist/{chunk-T4GMCW6Z.js → chunk-J3KYGJRQ.js} +3 -3
  38. package/dist/{chunk-AHEWXOKY.js → chunk-JROW6ZNN.js} +4 -4
  39. package/dist/{chunk-6PVZ2ABC.js → chunk-L3YNUGYF.js} +2 -2
  40. package/dist/{chunk-MD655IPO.js → chunk-MJF67OTH.js} +11 -4
  41. package/dist/chunk-MJF67OTH.js.map +1 -0
  42. package/dist/{chunk-JZXD6FWR.js → chunk-NURQB55J.js} +2 -2
  43. package/dist/{chunk-STGGGVYT.js → chunk-QMHKAFYX.js} +2 -2
  44. package/dist/{chunk-RPXWUCQQ.js → chunk-SKFB5ICF.js} +2 -2
  45. package/dist/{chunk-2SIMIPLY.js → chunk-W6YPVNDX.js} +3 -3
  46. package/dist/{chunk-GQJ5S3BL.js → chunk-YRRRUGSQ.js} +3 -3
  47. package/dist/{chunk-37VSRUW4.js → chunk-ZGCTC5YM.js} +39 -7
  48. package/dist/chunk-ZGCTC5YM.js.map +1 -0
  49. package/dist/{chunk-KDSNXS6N.js → chunk-ZMNEWS7A.js} +2 -2
  50. package/dist/cli/args.d.ts.map +1 -1
  51. package/dist/cli/commands/canvas.d.ts +12 -0
  52. package/dist/cli/commands/canvas.d.ts.map +1 -1
  53. package/dist/cli/commands/daemon.d.ts +19 -2
  54. package/dist/cli/commands/daemon.d.ts.map +1 -1
  55. package/dist/cli/commands/inspiredesign.d.ts +6 -1
  56. package/dist/cli/commands/inspiredesign.d.ts.map +1 -1
  57. package/dist/cli/commands/serve.d.ts +12 -3
  58. package/dist/cli/commands/serve.d.ts.map +1 -1
  59. package/dist/cli/commands/status.d.ts.map +1 -1
  60. package/dist/cli/commands/types.d.ts +1 -0
  61. package/dist/cli/commands/types.d.ts.map +1 -1
  62. package/dist/cli/daemon-client.d.ts.map +1 -1
  63. package/dist/cli/daemon-commands.d.ts.map +1 -1
  64. package/dist/cli/daemon-mismatch.d.ts +15 -0
  65. package/dist/cli/daemon-mismatch.d.ts.map +1 -0
  66. package/dist/cli/daemon.d.ts.map +1 -1
  67. package/dist/cli/errors.d.ts +4 -2
  68. package/dist/cli/errors.d.ts.map +1 -1
  69. package/dist/cli/help.d.ts.map +1 -1
  70. package/dist/cli/index.js +91 -90
  71. package/dist/cli/index.js.map +1 -1
  72. package/dist/cli/installers/postinstall-skill-sync.js +2 -2
  73. package/dist/cli/utils/workflow-message.d.ts +1 -1
  74. package/dist/cli/utils/workflow-message.d.ts.map +1 -1
  75. package/dist/{click-2AILSEIZ.js → click-U7ZFKSB4.js} +11 -11
  76. package/dist/{clone-component-TPJS3PEG.js → clone-component-SWYAORTU.js} +10 -10
  77. package/dist/{clone-page-LE74CIFC.js → clone-page-WJ6UJOJG.js} +10 -10
  78. package/dist/{close-HN4YI47K.js → close-NAVIHZ2T.js} +10 -10
  79. package/dist/{close-WFERRHX6.js → close-VKIGIKVT.js} +10 -10
  80. package/dist/{connect-RWBV2UCQ.js → connect-XVG2MOZL.js} +11 -11
  81. package/dist/{console-poll-PP4YYPDF.js → console-poll-XI5BZPL7.js} +11 -11
  82. package/dist/{cookie-import-6IP776FC.js → cookie-import-QELKE7TK.js} +10 -10
  83. package/dist/{cookie-list-O2KG6DPU.js → cookie-list-QDA6KWIY.js} +10 -10
  84. package/dist/{daemon-2BSAZXLT.js → daemon-CA4UIIZQ.js} +26 -13
  85. package/dist/daemon-CA4UIIZQ.js.map +1 -0
  86. package/dist/daemon-fingerprint.json +1 -1
  87. package/dist/{debug-trace-snapshot-F3BDVZXS.js → debug-trace-snapshot-AT4GAO57.js} +11 -11
  88. package/dist/{dialog-6JQYUWMQ.js → dialog-O3V2IBFH.js} +11 -11
  89. package/dist/{disconnect-763TP7GH.js → disconnect-NAX5TPTG.js} +10 -10
  90. package/dist/{enabled-DLYQFNIP.js → enabled-VT4FJXDX.js} +11 -11
  91. package/dist/{goto-S346TJJH.js → goto-GBJG5NC4.js} +11 -11
  92. package/dist/guidance/context.d.ts +44 -0
  93. package/dist/guidance/context.d.ts.map +1 -0
  94. package/dist/guidance/index.d.ts +7 -0
  95. package/dist/guidance/index.d.ts.map +1 -0
  96. package/dist/guidance/readiness.d.ts +7 -0
  97. package/dist/guidance/readiness.d.ts.map +1 -0
  98. package/dist/guidance/recipes/generic.d.ts +3 -0
  99. package/dist/guidance/recipes/generic.d.ts.map +1 -0
  100. package/dist/guidance/recipes/pinterest.d.ts +5 -0
  101. package/dist/guidance/recipes/pinterest.d.ts.map +1 -0
  102. package/dist/guidance/recipes/site-recipe-types.d.ts +2 -0
  103. package/dist/guidance/recipes/site-recipe-types.d.ts.map +1 -0
  104. package/dist/guidance/recipes/site-registry.d.ts +5 -0
  105. package/dist/guidance/recipes/site-registry.d.ts.map +1 -0
  106. package/dist/guidance/renderers.d.ts +22 -0
  107. package/dist/guidance/renderers.d.ts.map +1 -0
  108. package/dist/guidance/router.d.ts +8 -0
  109. package/dist/guidance/router.d.ts.map +1 -0
  110. package/dist/guidance/types.d.ts +139 -0
  111. package/dist/guidance/types.d.ts.map +1 -0
  112. package/dist/{help-U7KBQME6.js → help-SUI4H77K.js} +14 -9
  113. package/dist/help-SUI4H77K.js.map +1 -0
  114. package/dist/{hover-6JVJFGO7.js → hover-476ZNQZE.js} +11 -11
  115. package/dist/{html-EVOSPBIT.js → html-5C4TXOV3.js} +11 -11
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +47 -18
  118. package/dist/index.js.map +1 -1
  119. package/dist/{inspector-H57BVUJP.js → inspector-73ARPCIV.js} +13 -13
  120. package/dist/{inspector-audit-NQBAJWC7.js → inspector-audit-QT6QY7KS.js} +15 -15
  121. package/dist/{inspector-plan-ZDIQVND3.js → inspector-plan-JRNSGN2Z.js} +13 -13
  122. package/dist/inspiredesign/capture.d.ts +4 -0
  123. package/dist/inspiredesign/capture.d.ts.map +1 -1
  124. package/dist/inspiredesign/contract.d.ts +24 -0
  125. package/dist/inspiredesign/contract.d.ts.map +1 -1
  126. package/dist/inspiredesign/handoff.d.ts +9 -3
  127. package/dist/inspiredesign/handoff.d.ts.map +1 -1
  128. package/dist/inspiredesign/meta-prompt.d.ts +9 -0
  129. package/dist/inspiredesign/meta-prompt.d.ts.map +1 -0
  130. package/dist/inspiredesign/reference-discovery.d.ts +29 -0
  131. package/dist/inspiredesign/reference-discovery.d.ts.map +1 -0
  132. package/dist/inspiredesign/reference-pattern-board.d.ts +38 -1
  133. package/dist/inspiredesign/reference-pattern-board.d.ts.map +1 -1
  134. package/dist/inspiredesign/visual-evidence.d.ts +46 -0
  135. package/dist/inspiredesign/visual-evidence.d.ts.map +1 -0
  136. package/dist/inspiredesign/visual-policy.d.ts +17 -0
  137. package/dist/inspiredesign/visual-policy.d.ts.map +1 -0
  138. package/dist/{inspiredesign-IEUL4PX3.js → inspiredesign-IPVZDLSQ.js} +73 -21
  139. package/dist/inspiredesign-IPVZDLSQ.js.map +1 -0
  140. package/dist/{launch-EK66VQPF.js → launch-B35YDRQC.js} +11 -11
  141. package/dist/{list-ADZAQ2IU.js → list-JV55JVGB.js} +10 -10
  142. package/dist/{list-KKUKN467.js → list-YETWKTKY.js} +10 -10
  143. package/dist/{macro-resolve-6DOQJ7CA.js → macro-resolve-DQK4B3W3.js} +12 -12
  144. package/dist/{native-UPLVQ2SG.js → native-J2DFLOLP.js} +3 -3
  145. package/dist/{network-poll-NUL4PDPY.js → network-poll-4GWHCJXI.js} +11 -11
  146. package/dist/{new-5NKYPEFT.js → new-XDCQPIEG.js} +10 -10
  147. package/dist/{open-NR3BPLXV.js → open-GIM3ZCSV.js} +10 -10
  148. package/dist/opendevbrowser.d.ts.map +1 -1
  149. package/dist/opendevbrowser.js +47 -18
  150. package/dist/opendevbrowser.js.map +1 -1
  151. package/dist/{perf-HJ36ZI6H.js → perf-26VBXDPI.js} +11 -11
  152. package/dist/{pointer-down-IYTTQWXZ.js → pointer-down-O3VSNAXW.js} +12 -12
  153. package/dist/{pointer-drag-A2YC5PWI.js → pointer-drag-WQ5QGE6J.js} +12 -12
  154. package/dist/{pointer-move-W5K5FUI4.js → pointer-move-4N4D7JY2.js} +12 -12
  155. package/dist/{pointer-up-6GWVO64Y.js → pointer-up-CQC4NPDX.js} +12 -12
  156. package/dist/{press-A3V5WB3S.js → press-XGJD45CU.js} +11 -11
  157. package/dist/{product-video-52REKWF3.js → product-video-HD4ZOUI7.js} +13 -13
  158. package/dist/providers/browser-native-discovery.d.ts +23 -0
  159. package/dist/providers/browser-native-discovery.d.ts.map +1 -0
  160. package/dist/providers/renderer.d.ts +9 -1
  161. package/dist/providers/renderer.d.ts.map +1 -1
  162. package/dist/providers/workflow-handoff.d.ts +4 -0
  163. package/dist/providers/workflow-handoff.d.ts.map +1 -1
  164. package/dist/providers/workflows.d.ts +45 -3
  165. package/dist/providers/workflows.d.ts.map +1 -1
  166. package/dist/{providers-IMFYMMHQ.js → providers-KKNPJSQK.js} +4 -4
  167. package/dist/public-surface/generated-manifest.d.ts +14 -5
  168. package/dist/public-surface/generated-manifest.d.ts.map +1 -1
  169. package/dist/public-surface/source.d.ts +7 -7
  170. package/dist/public-surface/source.d.ts.map +1 -1
  171. package/dist/{research-WB6BBCDD.js → research-VUWWEQ4R.js} +13 -13
  172. package/dist/{review-BGWVY4RA.js → review-LZ3TA7U7.js} +12 -12
  173. package/dist/{review-desktop-LEORC5VS.js → review-desktop-LAO7U7T3.js} +12 -12
  174. package/dist/{rpc-4TSKSFGC.js → rpc-HKNIVFGC.js} +11 -11
  175. package/dist/{run-3NBLVWXD.js → run-SHCF53FO.js} +9 -9
  176. package/dist/{screencast-start-UZVIT3IN.js → screencast-start-JHMQZVWJ.js} +11 -11
  177. package/dist/{screencast-stop-NOSJSIUO.js → screencast-stop-RWQTWWQS.js} +11 -11
  178. package/dist/{screenshot-LARG4JQG.js → screenshot-QHFYO6PB.js} +11 -11
  179. package/dist/{scroll-VNFMV6TW.js → scroll-L3FTMAV4.js} +11 -11
  180. package/dist/{scroll-into-view-VYRT3JPT.js → scroll-into-view-JVDHX4WU.js} +11 -11
  181. package/dist/{select-KJTUZDVO.js → select-X4BO7GTB.js} +11 -11
  182. package/dist/{serve-EV7K4HKR.js → serve-JIMIBCNO.js} +49 -25
  183. package/dist/serve-JIMIBCNO.js.map +1 -0
  184. package/dist/{shopping-DTXHVQ2X.js → shopping-EGSDP2GL.js} +13 -13
  185. package/dist/{skill-lifecycle-5UAZGKSN.js → skill-lifecycle-OWZYBPFS.js} +3 -3
  186. package/dist/skills/bundled-skill-directories.d.ts.map +1 -1
  187. package/dist/skills/skill-loader.js +2 -2
  188. package/dist/{skills-NSXDX6YM.js → skills-KHMRNOE4.js} +3 -3
  189. package/dist/{snapshot-3XQMCMRJ.js → snapshot-QGJ7RDNV.js} +11 -11
  190. package/dist/{status-YUMDP5KY.js → status-CKGPNYIH.js} +21 -13
  191. package/dist/status-CKGPNYIH.js.map +1 -0
  192. package/dist/{status-OXSYA5XD.js → status-LEBY2X7N.js} +12 -12
  193. package/dist/{status-capabilities-P4KDSE2Y.js → status-capabilities-6QTWNGKM.js} +12 -12
  194. package/dist/{text-V3B7UVIH.js → text-VUZU7D3L.js} +11 -11
  195. package/dist/tools/inspiredesign_run.d.ts.map +1 -1
  196. package/dist/{type-IYBN3ZLR.js → type-N5SURP74.js} +11 -11
  197. package/dist/{uncheck-SG737EGI.js → uncheck-JFMK3SSY.js} +11 -11
  198. package/dist/{uninstall-KYKGJAX7.js → uninstall-FW5ORBIN.js} +3 -3
  199. package/dist/{update-skill-modes-BVX7IVMW.js → update-skill-modes-3ULKJK3Y.js} +3 -3
  200. package/dist/{upload-KH6ZABJA.js → upload-KFUYLL7M.js} +11 -11
  201. package/dist/{use-7YDKO3U4.js → use-CNMPP2ED.js} +10 -10
  202. package/dist/{value-RZBWSKKM.js → value-J335MPZE.js} +11 -11
  203. package/dist/{visible-BSFTAKXR.js → visible-YQZWWPBZ.js} +11 -11
  204. package/dist/{wait-TMTEAYOP.js → wait-IC7YJJPJ.js} +11 -11
  205. package/dist/{windows-HIZ23OHS.js → windows-AGVQ3KX3.js} +12 -12
  206. package/extension/manifest.json +1 -1
  207. package/package.json +1 -1
  208. package/skills/AGENTS.md +2 -1
  209. package/skills/opendevbrowser-best-practices/SKILL.md +16 -3
  210. package/skills/opendevbrowser-best-practices/artifacts/canvas-governance-playbook.md +4 -4
  211. package/skills/opendevbrowser-best-practices/artifacts/skill-runtime-surface-matrix.md +4 -3
  212. package/skills/opendevbrowser-best-practices/assets/templates/mode-flag-matrix.json +7 -0
  213. package/skills/opendevbrowser-best-practices/assets/templates/skill-runtime-pack-matrix.json +49 -3
  214. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +31 -2
  215. package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +7 -0
  216. package/skills/opendevbrowser-design-agent/SKILL.md +11 -6
  217. package/skills/opendevbrowser-design-agent/artifacts/design-workflows.md +4 -3
  218. package/skills/opendevbrowser-design-agent/artifacts/research-harvest-workflow.md +110 -41
  219. package/skills/opendevbrowser-design-agent/artifacts/scroll-reveal-surface-planning.md +2 -0
  220. package/skills/opendevbrowser-design-agent/assets/templates/reference-pattern-board.v1.json +21 -5
  221. package/skills/opendevbrowser-design-agent/scripts/design-workflow.sh +5 -2
  222. package/skills/opendevbrowser-design-agent/scripts/validate-skill-assets.sh +8 -2
  223. package/skills/opendevbrowser-motion-design/SKILL.md +129 -0
  224. package/skills/opendevbrowser-motion-design/artifacts/accessibility-reduced-motion.md +37 -0
  225. package/skills/opendevbrowser-motion-design/artifacts/device-breakpoint-posture.md +40 -0
  226. package/skills/opendevbrowser-motion-design/artifacts/motion-anti-patterns.md +29 -0
  227. package/skills/opendevbrowser-motion-design/artifacts/motion-pattern-catalog.md +430 -0
  228. package/skills/opendevbrowser-motion-design/artifacts/motion-release-gate.md +28 -0
  229. package/skills/opendevbrowser-motion-design/artifacts/motion-terminology.md +46 -0
  230. package/skills/opendevbrowser-motion-design/artifacts/open-dev-browser-motion-evidence.md +48 -0
  231. package/skills/opendevbrowser-motion-design/artifacts/performance-frame-budget.md +38 -0
  232. package/skills/opendevbrowser-motion-design/artifacts/platform-framework-guide.md +166 -0
  233. package/skills/opendevbrowser-motion-design/assets/templates/motion-audit-report.v1.md +70 -0
  234. package/skills/opendevbrowser-motion-design/assets/templates/motion-contract.v1.json +79 -0
  235. package/skills/opendevbrowser-motion-design/assets/templates/motion-release-gate.v1.json +18 -0
  236. package/skills/opendevbrowser-motion-design/assets/templates/motion-viewport-matrix.v1.json +76 -0
  237. package/skills/opendevbrowser-motion-design/scripts/motion-workflow.sh +163 -0
  238. package/skills/opendevbrowser-motion-design/scripts/validate-skill-assets.sh +375 -0
  239. package/dist/canvas-5DFEEOKM.js.map +0 -1
  240. package/dist/chunk-2I3YS3DV.js.map +0 -1
  241. package/dist/chunk-37VSRUW4.js.map +0 -1
  242. package/dist/chunk-3ILXPKSJ.js.map +0 -1
  243. package/dist/chunk-4BEJVZRK.js.map +0 -1
  244. package/dist/chunk-6B5WAQV7.js.map +0 -1
  245. package/dist/chunk-COAOWH3G.js.map +0 -1
  246. package/dist/chunk-IPE7TF2P.js.map +0 -1
  247. package/dist/chunk-KZ2IXVQT.js.map +0 -1
  248. package/dist/chunk-MD655IPO.js.map +0 -1
  249. package/dist/chunk-QOMWCRE3.js.map +0 -1
  250. package/dist/daemon-2BSAZXLT.js.map +0 -1
  251. package/dist/help-U7KBQME6.js.map +0 -1
  252. package/dist/inspiredesign-IEUL4PX3.js.map +0 -1
  253. package/dist/serve-EV7K4HKR.js.map +0 -1
  254. package/dist/status-YUMDP5KY.js.map +0 -1
  255. /package/dist/{accessibility-snapshot-CQ4ZKWKC.js.map → accessibility-snapshot-JSPFVWZ6.js.map} +0 -0
  256. /package/dist/{active-window-TD5HYJ72.js.map → active-window-2OB2MSCR.js.map} +0 -0
  257. /package/dist/{annotate-VTLFS2XV.js.map → annotate-VDZBZBKZ.js.map} +0 -0
  258. /package/dist/{artifacts-KJ6RNDO2.js.map → artifacts-JHDUUJGQ.js.map} +0 -0
  259. /package/dist/{attr-BCI5KYCW.js.map → attr-7XIO4MCH.js.map} +0 -0
  260. /package/dist/{capture-desktop-HFTTWY4Z.js.map → capture-desktop-T5YO3EBI.js.map} +0 -0
  261. /package/dist/{capture-window-X63XPIFF.js.map → capture-window-UKEUBWKH.js.map} +0 -0
  262. /package/dist/{check-LWAUY7GC.js.map → check-PQB6KKMN.js.map} +0 -0
  263. /package/dist/{checked-ZSOUKVYT.js.map → checked-RNZIMCU6.js.map} +0 -0
  264. /package/dist/{chunk-PPUWQKIC.js.map → chunk-52ZIOWVU.js.map} +0 -0
  265. /package/dist/{chunk-T4GMCW6Z.js.map → chunk-J3KYGJRQ.js.map} +0 -0
  266. /package/dist/{chunk-AHEWXOKY.js.map → chunk-JROW6ZNN.js.map} +0 -0
  267. /package/dist/{chunk-6PVZ2ABC.js.map → chunk-L3YNUGYF.js.map} +0 -0
  268. /package/dist/{chunk-JZXD6FWR.js.map → chunk-NURQB55J.js.map} +0 -0
  269. /package/dist/{chunk-STGGGVYT.js.map → chunk-QMHKAFYX.js.map} +0 -0
  270. /package/dist/{chunk-RPXWUCQQ.js.map → chunk-SKFB5ICF.js.map} +0 -0
  271. /package/dist/{chunk-2SIMIPLY.js.map → chunk-W6YPVNDX.js.map} +0 -0
  272. /package/dist/{chunk-GQJ5S3BL.js.map → chunk-YRRRUGSQ.js.map} +0 -0
  273. /package/dist/{chunk-KDSNXS6N.js.map → chunk-ZMNEWS7A.js.map} +0 -0
  274. /package/dist/{click-2AILSEIZ.js.map → click-U7ZFKSB4.js.map} +0 -0
  275. /package/dist/{clone-component-TPJS3PEG.js.map → clone-component-SWYAORTU.js.map} +0 -0
  276. /package/dist/{clone-page-LE74CIFC.js.map → clone-page-WJ6UJOJG.js.map} +0 -0
  277. /package/dist/{close-HN4YI47K.js.map → close-NAVIHZ2T.js.map} +0 -0
  278. /package/dist/{close-WFERRHX6.js.map → close-VKIGIKVT.js.map} +0 -0
  279. /package/dist/{connect-RWBV2UCQ.js.map → connect-XVG2MOZL.js.map} +0 -0
  280. /package/dist/{console-poll-PP4YYPDF.js.map → console-poll-XI5BZPL7.js.map} +0 -0
  281. /package/dist/{cookie-import-6IP776FC.js.map → cookie-import-QELKE7TK.js.map} +0 -0
  282. /package/dist/{cookie-list-O2KG6DPU.js.map → cookie-list-QDA6KWIY.js.map} +0 -0
  283. /package/dist/{debug-trace-snapshot-F3BDVZXS.js.map → debug-trace-snapshot-AT4GAO57.js.map} +0 -0
  284. /package/dist/{dialog-6JQYUWMQ.js.map → dialog-O3V2IBFH.js.map} +0 -0
  285. /package/dist/{disconnect-763TP7GH.js.map → disconnect-NAX5TPTG.js.map} +0 -0
  286. /package/dist/{enabled-DLYQFNIP.js.map → enabled-VT4FJXDX.js.map} +0 -0
  287. /package/dist/{goto-S346TJJH.js.map → goto-GBJG5NC4.js.map} +0 -0
  288. /package/dist/{hover-6JVJFGO7.js.map → hover-476ZNQZE.js.map} +0 -0
  289. /package/dist/{html-EVOSPBIT.js.map → html-5C4TXOV3.js.map} +0 -0
  290. /package/dist/{inspector-H57BVUJP.js.map → inspector-73ARPCIV.js.map} +0 -0
  291. /package/dist/{inspector-audit-NQBAJWC7.js.map → inspector-audit-QT6QY7KS.js.map} +0 -0
  292. /package/dist/{inspector-plan-ZDIQVND3.js.map → inspector-plan-JRNSGN2Z.js.map} +0 -0
  293. /package/dist/{launch-EK66VQPF.js.map → launch-B35YDRQC.js.map} +0 -0
  294. /package/dist/{list-ADZAQ2IU.js.map → list-JV55JVGB.js.map} +0 -0
  295. /package/dist/{list-KKUKN467.js.map → list-YETWKTKY.js.map} +0 -0
  296. /package/dist/{macro-resolve-6DOQJ7CA.js.map → macro-resolve-DQK4B3W3.js.map} +0 -0
  297. /package/dist/{native-UPLVQ2SG.js.map → native-J2DFLOLP.js.map} +0 -0
  298. /package/dist/{network-poll-NUL4PDPY.js.map → network-poll-4GWHCJXI.js.map} +0 -0
  299. /package/dist/{new-5NKYPEFT.js.map → new-XDCQPIEG.js.map} +0 -0
  300. /package/dist/{open-NR3BPLXV.js.map → open-GIM3ZCSV.js.map} +0 -0
  301. /package/dist/{perf-HJ36ZI6H.js.map → perf-26VBXDPI.js.map} +0 -0
  302. /package/dist/{pointer-down-IYTTQWXZ.js.map → pointer-down-O3VSNAXW.js.map} +0 -0
  303. /package/dist/{pointer-drag-A2YC5PWI.js.map → pointer-drag-WQ5QGE6J.js.map} +0 -0
  304. /package/dist/{pointer-move-W5K5FUI4.js.map → pointer-move-4N4D7JY2.js.map} +0 -0
  305. /package/dist/{pointer-up-6GWVO64Y.js.map → pointer-up-CQC4NPDX.js.map} +0 -0
  306. /package/dist/{press-A3V5WB3S.js.map → press-XGJD45CU.js.map} +0 -0
  307. /package/dist/{product-video-52REKWF3.js.map → product-video-HD4ZOUI7.js.map} +0 -0
  308. /package/dist/{providers-IMFYMMHQ.js.map → providers-KKNPJSQK.js.map} +0 -0
  309. /package/dist/{research-WB6BBCDD.js.map → research-VUWWEQ4R.js.map} +0 -0
  310. /package/dist/{review-BGWVY4RA.js.map → review-LZ3TA7U7.js.map} +0 -0
  311. /package/dist/{review-desktop-LEORC5VS.js.map → review-desktop-LAO7U7T3.js.map} +0 -0
  312. /package/dist/{rpc-4TSKSFGC.js.map → rpc-HKNIVFGC.js.map} +0 -0
  313. /package/dist/{run-3NBLVWXD.js.map → run-SHCF53FO.js.map} +0 -0
  314. /package/dist/{screencast-start-UZVIT3IN.js.map → screencast-start-JHMQZVWJ.js.map} +0 -0
  315. /package/dist/{screencast-stop-NOSJSIUO.js.map → screencast-stop-RWQTWWQS.js.map} +0 -0
  316. /package/dist/{screenshot-LARG4JQG.js.map → screenshot-QHFYO6PB.js.map} +0 -0
  317. /package/dist/{scroll-VNFMV6TW.js.map → scroll-L3FTMAV4.js.map} +0 -0
  318. /package/dist/{scroll-into-view-VYRT3JPT.js.map → scroll-into-view-JVDHX4WU.js.map} +0 -0
  319. /package/dist/{select-KJTUZDVO.js.map → select-X4BO7GTB.js.map} +0 -0
  320. /package/dist/{shopping-DTXHVQ2X.js.map → shopping-EGSDP2GL.js.map} +0 -0
  321. /package/dist/{skill-lifecycle-5UAZGKSN.js.map → skill-lifecycle-OWZYBPFS.js.map} +0 -0
  322. /package/dist/{skills-NSXDX6YM.js.map → skills-KHMRNOE4.js.map} +0 -0
  323. /package/dist/{snapshot-3XQMCMRJ.js.map → snapshot-QGJ7RDNV.js.map} +0 -0
  324. /package/dist/{status-OXSYA5XD.js.map → status-LEBY2X7N.js.map} +0 -0
  325. /package/dist/{status-capabilities-P4KDSE2Y.js.map → status-capabilities-6QTWNGKM.js.map} +0 -0
  326. /package/dist/{text-V3B7UVIH.js.map → text-VUZU7D3L.js.map} +0 -0
  327. /package/dist/{type-IYBN3ZLR.js.map → type-N5SURP74.js.map} +0 -0
  328. /package/dist/{uncheck-SG737EGI.js.map → uncheck-JFMK3SSY.js.map} +0 -0
  329. /package/dist/{uninstall-KYKGJAX7.js.map → uninstall-FW5ORBIN.js.map} +0 -0
  330. /package/dist/{update-skill-modes-BVX7IVMW.js.map → update-skill-modes-3ULKJK3Y.js.map} +0 -0
  331. /package/dist/{upload-KH6ZABJA.js.map → upload-KFUYLL7M.js.map} +0 -0
  332. /package/dist/{use-7YDKO3U4.js.map → use-CNMPP2ED.js.map} +0 -0
  333. /package/dist/{value-RZBWSKKM.js.map → value-J335MPZE.js.map} +0 -0
  334. /package/dist/{visible-BSFTAKXR.js.map → visible-YQZWWPBZ.js.map} +0 -0
  335. /package/dist/{wait-TMTEAYOP.js.map → wait-IC7YJJPJ.js.map} +0 -0
  336. /package/dist/{windows-HIZ23OHS.js.map → windows-AGVQ3KX3.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/logging.ts","../src/providers/safety/prompt-guard.ts","../src/providers/blocker.ts","../src/providers/constraint.ts"],"sourcesContent":["import { randomUUID } from \"crypto\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"audit\";\n\nexport type LogEnvelope = {\n ts: string;\n level: LogLevel;\n module: string;\n event: string;\n requestId: string;\n sessionId?: string;\n traceId?: string;\n data?: unknown;\n};\n\ntype LogFields = {\n requestId?: string;\n sessionId?: string;\n traceId?: string;\n data?: unknown;\n};\n\nexport type LogSink = (entry: LogEnvelope) => void;\n\nconst SECRET_KEY_PATTERN = /(token|secret|password|authorization|cookie|api[-_]?key|session)/i;\nconst SECRET_VALUE_PATTERN = /(bearer\\s+[a-z0-9._-]+|sk_[a-z0-9_-]+|pk_[a-z0-9_-]+|eyJ[a-z0-9_-]+\\.[a-z0-9_-]+\\.[a-z0-9_-]+)/gi;\n\nfunction redactString(value: string): string {\n return value.replace(SECRET_VALUE_PATTERN, \"[REDACTED]\");\n}\n\nexport function redactSensitive(value: unknown, seen = new WeakSet<object>()): unknown {\n if (typeof value === \"string\") {\n return redactString(value);\n }\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n\n if (Array.isArray(value)) {\n return value.map((item) => redactSensitive(item, seen));\n }\n\n const output: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n if (SECRET_KEY_PATTERN.test(key)) {\n output[key] = \"[REDACTED]\";\n continue;\n }\n output[key] = redactSensitive(entry, seen);\n }\n return output;\n}\n\nexport function createRequestId(): string {\n return randomUUID();\n}\n\nconst defaultSink: LogSink = (entry) => {\n const payload = JSON.stringify(entry);\n if (entry.level === \"error\") {\n console.error(payload);\n return;\n }\n if (entry.level === \"warn\") {\n console.warn(payload);\n return;\n }\n console.log(payload);\n};\n\nexport const stderrSink: LogSink = (entry) => {\n process.stderr.write(`${JSON.stringify(entry)}\\n`);\n};\n\nlet configuredDefaultSink: LogSink = defaultSink;\n\nexport function setDefaultLogSink(sink?: LogSink | null): void {\n configuredDefaultSink = sink ?? defaultSink;\n}\n\nexport function createLogger(moduleName: string, sink?: LogSink): {\n debug: (event: string, fields?: LogFields) => LogEnvelope;\n info: (event: string, fields?: LogFields) => LogEnvelope;\n warn: (event: string, fields?: LogFields) => LogEnvelope;\n error: (event: string, fields?: LogFields) => LogEnvelope;\n audit: (event: string, fields?: LogFields) => LogEnvelope;\n} {\n const emit = (level: LogLevel, event: string, fields: LogFields = {}): LogEnvelope => {\n const entry: LogEnvelope = {\n ts: new Date().toISOString(),\n level,\n module: moduleName,\n event,\n requestId: fields.requestId ?? createRequestId(),\n ...(fields.sessionId ? { sessionId: fields.sessionId } : {}),\n ...(fields.traceId ? { traceId: fields.traceId } : {}),\n ...(typeof fields.data === \"undefined\" ? {} : { data: redactSensitive(fields.data) })\n };\n (sink ?? configuredDefaultSink)(entry);\n return entry;\n };\n\n return {\n debug: (event, fields) => emit(\"debug\", event, fields),\n info: (event, fields) => emit(\"info\", event, fields),\n warn: (event, fields) => emit(\"warn\", event, fields),\n error: (event, fields) => emit(\"error\", event, fields),\n audit: (event, fields) => emit(\"audit\", event, fields)\n };\n}\n\nexport const __test__ = {\n redactString,\n defaultSink\n};\n","import type { JsonValue, NormalizedRecord } from \"../types\";\n\ntype PromptGuardSeverity = \"low\" | \"medium\" | \"high\";\ntype PromptGuardAction = \"strip\" | \"quarantine\";\ntype PromptGuardField = \"title\" | \"content\";\n\ntype PromptGuardRule = {\n id: string;\n regex: RegExp;\n severity: PromptGuardSeverity;\n action: PromptGuardAction;\n};\n\nexport interface PromptGuardEntry {\n pattern: string;\n action: PromptGuardAction;\n severity: PromptGuardSeverity;\n excerpt: string;\n}\n\nexport interface PromptGuardRecordEntry extends PromptGuardEntry {\n recordId: string;\n field: PromptGuardField;\n}\n\nexport interface PromptGuardTextResult {\n text: string;\n diagnostics: {\n entries: number;\n quarantinedSegments: number;\n };\n entries: PromptGuardEntry[];\n}\n\nexport interface PromptGuardResult {\n records: NormalizedRecord[];\n audit: {\n enabled: boolean;\n quarantinedSegments: number;\n entries: PromptGuardRecordEntry[];\n };\n}\n\nconst MAX_EXCERPT_LENGTH = 120;\n\nconst RULES: PromptGuardRule[] = [\n {\n id: \"reveal_system_prompt\",\n regex: /\\b(reveal|show|print|dump|expose|leak)\\b[^.!?\\n]{0,80}\\b(system prompt|hidden prompt|internal prompt)\\b/gi,\n severity: \"high\",\n action: \"quarantine\"\n },\n {\n id: \"tool_abuse_directive\",\n regex: /\\buse (?:the )?tool(?:ing)?\\b[^.!?\\n]{0,120}\\b(delete|remove|drop|wipe|exfiltrat|override|bypass)\\w*/gi,\n severity: \"high\",\n action: \"quarantine\"\n },\n {\n id: \"ignore_previous_instructions\",\n regex: /\\bignore (?:all )?previous instructions?\\b/gi,\n severity: \"medium\",\n action: \"strip\"\n },\n {\n id: \"reveal_hidden_data\",\n regex: /\\breveal (?:hidden|secret|confidential) (?:data|information)\\b/gi,\n severity: \"high\",\n action: \"quarantine\"\n }\n];\n\nconst sanitizeExcerpt = (value: string): string => {\n const compact = value.replace(/\\s+/g, \" \").trim();\n if (compact.length <= MAX_EXCERPT_LENGTH) return compact;\n return `${compact.slice(0, MAX_EXCERPT_LENGTH - 3)}...`;\n};\n\nconst isJsonObject = (value: JsonValue | undefined): value is Record<string, JsonValue> => {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n};\n\nconst withSecurityAttributes = (\n record: NormalizedRecord,\n enabled: boolean,\n guardEntries: number,\n quarantinedSegments: number\n): Record<string, JsonValue> => {\n const existingSecurity = isJsonObject(record.attributes.security)\n ? record.attributes.security\n : {};\n\n return {\n ...record.attributes,\n security: {\n ...existingSecurity,\n untrustedContent: true,\n dataOnlyContext: true,\n promptGuardEnabled: enabled,\n guardEntries,\n quarantinedSegments\n }\n };\n};\n\nexport function sanitizePromptGuardText(text: string, enabled: boolean): PromptGuardTextResult {\n if (!enabled || !text) {\n return {\n text,\n diagnostics: { entries: 0, quarantinedSegments: 0 },\n entries: []\n };\n }\n\n let output = text;\n const entries: PromptGuardEntry[] = [];\n\n for (const rule of RULES) {\n rule.regex.lastIndex = 0;\n output = output.replace(rule.regex, (match) => {\n entries.push({\n pattern: rule.id,\n action: rule.action,\n severity: rule.severity,\n excerpt: sanitizeExcerpt(match)\n });\n return rule.action === \"quarantine\" ? \"[QUARANTINED]\" : \" \";\n });\n }\n\n const normalized = output.replace(/\\s{2,}/g, \" \").trim();\n const quarantinedSegments = entries.reduce((count, entry) => {\n return entry.action === \"quarantine\" ? count + 1 : count;\n }, 0);\n\n return {\n text: normalized,\n diagnostics: {\n entries: entries.length,\n quarantinedSegments\n },\n entries\n };\n}\n\nexport function applyPromptGuard(records: NormalizedRecord[], enabled: boolean): PromptGuardResult {\n const auditEntries: PromptGuardRecordEntry[] = [];\n let totalQuarantinedSegments = 0;\n\n const guardedRecords = records.map((record) => {\n if (!enabled) {\n return {\n ...record,\n attributes: withSecurityAttributes(record, false, 0, 0)\n };\n }\n\n let title = record.title;\n let content = record.content;\n let recordEntries = 0;\n let recordQuarantinedSegments = 0;\n\n if (typeof record.title === \"string\") {\n const sanitizedTitle = sanitizePromptGuardText(record.title, true);\n title = sanitizedTitle.text;\n recordEntries += sanitizedTitle.diagnostics.entries;\n recordQuarantinedSegments += sanitizedTitle.diagnostics.quarantinedSegments;\n for (const entry of sanitizedTitle.entries) {\n auditEntries.push({\n ...entry,\n recordId: record.id,\n field: \"title\"\n });\n }\n }\n\n if (typeof record.content === \"string\") {\n const sanitizedContent = sanitizePromptGuardText(record.content, true);\n content = sanitizedContent.text;\n recordEntries += sanitizedContent.diagnostics.entries;\n recordQuarantinedSegments += sanitizedContent.diagnostics.quarantinedSegments;\n for (const entry of sanitizedContent.entries) {\n auditEntries.push({\n ...entry,\n recordId: record.id,\n field: \"content\"\n });\n }\n }\n\n totalQuarantinedSegments += recordQuarantinedSegments;\n\n return {\n ...record,\n ...(typeof title === \"string\" ? { title } : {}),\n ...(typeof content === \"string\" ? { content } : {}),\n attributes: withSecurityAttributes(record, true, recordEntries, recordQuarantinedSegments)\n };\n });\n\n return {\n records: guardedRecords,\n audit: {\n enabled,\n quarantinedSegments: enabled ? totalQuarantinedSegments : 0,\n entries: enabled ? auditEntries : []\n }\n };\n}\n","import { redactSensitive } from \"../core/logging\";\nimport { sanitizePromptGuardText } from \"./safety/prompt-guard\";\nimport type {\n BlockerActionHint,\n BlockerArtifactCaps,\n BlockerArtifactsV1,\n BlockerSignalV1,\n BlockerType,\n JsonValue,\n ProviderReasonCode\n} from \"./types\";\n\nconst AUTH_URL_PATTERNS: Array<{ id: string; regex: RegExp; confidence: number }> = [\n { id: \"redirect_login_flow\", regex: /\\/i\\/flow\\/login/i, confidence: 0.97 },\n { id: \"auth_login_path\", regex: /\\/(login|signin|sign-in|auth)(?:[./?]|$)/i, confidence: 0.9 }\n];\n\nconst AUTH_TITLE_PATTERNS: Array<{ id: string; regex: RegExp; confidence: number }> = [\n { id: \"title_login\", regex: /\\b(log ?in|sign ?in|login|signin)\\b/i, confidence: 0.92 },\n { id: \"title_auth_required\", regex: /authentication required/i, confidence: 0.9 }\n];\n\nconst CHALLENGE_PATTERNS: Array<{ id: string; regex: RegExp; confidence: number }> = [\n { id: \"challenge_keyword\", regex: /\\b(?:captcha|interstitial|cf_chl|recaptcha|hcaptcha|security challenge|browser challenge|bot check|bot detection)\\b/i, confidence: 0.88 },\n { id: \"complete_challenge_prompt\", regex: /\\b(?:complete|solve|pass) (?:the )?(?:security )?challenge\\b/i, confidence: 0.9 },\n { id: \"prove_humanity\", regex: /prove your humanity/i, confidence: 0.96 },\n { id: \"verify_humanity\", regex: /verify (?:you(?:'|’)re|you are) human/i, confidence: 0.96 },\n { id: \"robot_or_human\", regex: /robot or human/i, confidence: 0.98 },\n { id: \"confirm_human\", regex: /confirm that you(?:'|’)re human/i, confidence: 0.96 },\n { id: \"confirm_not_bot\", regex: /sign in to confirm (?:you(?:'|’)re|you are) not a bot/i, confidence: 0.96 },\n { id: \"click_and_hold\", regex: /\\b(?:click|press|tap|activate)\\s+(?:and\\s+)?hold\\b/i, confidence: 0.95 },\n { id: \"press_and_hold\", regex: /activate and hold the button/i, confidence: 0.95 },\n { id: \"drag_slider\", regex: /\\b(?:drag|slide|move)(?:\\s+the)?\\s+(?:slider|puzzle(?:\\s+piece)?|piece|button)\\b/i, confidence: 0.95 },\n { id: \"pardon_interruption\", regex: /pardon our interruption/i, confidence: 0.97 },\n { id: \"checking_browser_gate\", regex: /checking your browser before you access/i, confidence: 0.97 }\n];\n\nconst RECAPTCHA_HOST_PATTERNS = [/recaptcha/i, /hcaptcha/i, /challenges\\.cloudflare\\.com/i];\nconst STATIC_BLOCK_HOST_PATTERNS = [/redditstatic\\.com$/i, /abs\\.twimg\\.com$/i, /twimg\\.com$/i];\n\nconst ENV_LIMITED_PATTERNS = [\n /extension not connected/i,\n /connect the extension/i,\n /manual interaction/i,\n /timed out/i,\n /not available in this environment/i\n];\n\nconst RESTRICTED_TARGET_PATTERNS = [/^chrome:\\/\\//i, /^chrome-extension:\\/\\//i, /^about:blank$/i, /^devtools:\\/\\//i];\n\nexport const DEFAULT_BLOCKER_ARTIFACT_CAPS: BlockerArtifactCaps = {\n maxNetworkEvents: 20,\n maxConsoleEvents: 20,\n maxExceptionEvents: 10,\n maxHosts: 10,\n maxTextLength: 512\n};\n\nexport interface BlockerClassificationInput {\n source: BlockerSignalV1[\"source\"];\n url?: string;\n finalUrl?: string;\n title?: string;\n status?: number;\n providerErrorCode?: string;\n message?: string;\n matchedPatterns?: string[];\n networkHosts?: string[];\n traceRequestId?: string;\n retryable?: boolean;\n envLimited?: boolean;\n restrictedTarget?: boolean;\n promptGuardEnabled?: boolean;\n threshold?: number;\n detectedAt?: string;\n}\n\nexport interface BlockerArtifactInput {\n networkEvents?: unknown[];\n consoleEvents?: unknown[];\n exceptionEvents?: unknown[];\n promptGuardEnabled?: boolean;\n caps?: Partial<BlockerArtifactCaps>;\n}\n\nconst toLower = (value: string): string => value.trim().toLowerCase();\n\nconst clampNumber = (value: number, min: number, max: number): number => {\n if (!Number.isFinite(value)) return min;\n if (value < min) return min;\n if (value > max) return max;\n return value;\n};\n\nexport const clampBlockerConfidence = (value: number): number => {\n return clampNumber(value, 0, 1);\n};\n\nconst clampThreshold = (value: number | undefined): number => {\n if (typeof value !== \"number\") return 0.7;\n return clampNumber(value, 0, 1);\n};\n\nexport const clampText = (value: string | undefined, maxLength: number): string | undefined => {\n if (typeof value !== \"string\") return undefined;\n if (maxLength <= 0) return \"\";\n return value.length <= maxLength ? value : `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n};\n\nexport const boundedUniqueList = (\n values: readonly string[] | undefined,\n maxLength: number\n): string[] => {\n if (!values || values.length === 0 || maxLength <= 0) return [];\n const seen = new Set<string>();\n const list: string[] = [];\n for (const value of values) {\n if (typeof value !== \"string\") continue;\n const normalized = value.trim();\n if (!normalized) continue;\n const key = normalized.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n list.push(normalized);\n if (list.length >= maxLength) break;\n }\n return list;\n};\n\nconst extractHost = (value: string | undefined): string | null => {\n if (!value) return null;\n try {\n return toLower(new URL(value).hostname);\n } catch {\n return null;\n }\n};\n\nconst scorePatternMatches = (\n text: string,\n patterns: Array<{ id: string; regex: RegExp; confidence: number }>\n): { matched: string[]; confidence: number } => {\n const matched: string[] = [];\n let confidence = 0;\n for (const pattern of patterns) {\n if (!pattern.regex.test(text)) continue;\n matched.push(pattern.id);\n confidence = Math.max(confidence, pattern.confidence);\n }\n return { matched, confidence };\n};\n\nconst hasAnyPattern = (value: string, patterns: RegExp[]): boolean => {\n return patterns.some((pattern) => pattern.test(value));\n};\n\nconst isLoopbackHost = (value: string): boolean => {\n const normalized = toLower(value).replace(/^\\[|\\]$/g, \"\");\n if (!normalized) return false;\n if (normalized === \"localhost\" || normalized === \"::1\") return true;\n if (normalized === \"127.0.0.1\" || normalized.startsWith(\"127.\")) return true;\n return /^::ffff:127\\.\\d+\\.\\d+\\.\\d+$/.test(normalized);\n};\n\nconst buildHints = (type: BlockerType): BlockerActionHint[] => {\n switch (type) {\n case \"auth_required\":\n return [\n { id: \"manual_login\", reason: \"Authentication flow requires interactive login.\", priority: 1 },\n { id: \"switch_managed_headed\", reason: \"Headed mode can complete login and persist session state.\", priority: 2 },\n { id: \"switch_extension_mode\", reason: \"Extension mode can reuse an already logged-in browser profile.\", priority: 3 }\n ];\n case \"anti_bot_challenge\":\n return [\n { id: \"manual_challenge\", reason: \"Challenge page requires manual completion.\", priority: 1 },\n { id: \"switch_managed_headed\", reason: \"Headed mode improves challenge completion reliability.\", priority: 2 },\n { id: \"collect_debug_trace\", reason: \"Collect trace artifacts to compare challenge indicators before and after manual action.\", priority: 3 }\n ];\n case \"rate_limited\":\n return [\n { id: \"retry_after_backoff\", reason: \"Rate-limited responses should be retried after a bounded delay.\", priority: 1 },\n { id: \"collect_debug_trace\", reason: \"Trace data can confirm cooldown and request pacing behavior.\", priority: 2 }\n ];\n case \"upstream_block\":\n return [\n { id: \"retry_after_backoff\", reason: \"Upstream blocks may clear after network or host recovery.\", priority: 1 },\n { id: \"switch_managed_headed\", reason: \"Browser-assisted retrieval may bypass runtime fetch limitations.\", priority: 2 },\n { id: \"collect_debug_trace\", reason: \"Trace host evidence helps confirm blocked upstream dependencies.\", priority: 3 }\n ];\n case \"restricted_target\":\n return [\n { id: \"switch_managed_headed\", reason: \"Restricted internal targets require navigation to a normal http(s) tab.\", priority: 1 },\n { id: \"collect_debug_trace\", reason: \"Trace confirms blocked scheme or tab restriction source.\", priority: 2 }\n ];\n case \"env_limited\":\n return [\n { id: \"switch_extension_mode\", reason: \"Extension relay availability is required for this operation.\", priority: 1 },\n { id: \"switch_managed_headed\", reason: \"Managed headed mode is a deterministic fallback when extension is unavailable.\", priority: 2 },\n { id: \"collect_debug_trace\", reason: \"Diagnostics can confirm environment capability gaps.\", priority: 3 }\n ];\n case \"unknown\":\n return [{ id: \"collect_debug_trace\", reason: \"Additional trace evidence is required for reliable classification.\", priority: 1 }];\n }\n};\n\nconst classifyFromInputs = (\n input: BlockerClassificationInput,\n normalizedHosts: string[],\n matchedPatterns: string[]\n): { type: BlockerType; reasonCode?: ProviderReasonCode; confidence: number; retryable: boolean; matches: string[] } | null => {\n const status = input.status;\n const code = toLower(input.providerErrorCode ?? \"\");\n const url = input.url ?? \"\";\n const finalUrl = input.finalUrl ?? \"\";\n const title = input.title ?? \"\";\n const message = input.message ?? \"\";\n const challengeText = `${title} ${message}`;\n const urlSignals = `${url} ${finalUrl}`;\n const isUpstreamCode = code === \"upstream\" || code === \"network\" || code === \"unavailable\";\n const hasStaticBlockHost = normalizedHosts.some((host) => hasAnyPattern(host, STATIC_BLOCK_HOST_PATTERNS));\n const isLoopbackContext = [\n extractHost(url),\n extractHost(finalUrl),\n ...normalizedHosts\n ].some((host): host is string => typeof host === \"string\" && isLoopbackHost(host));\n\n const authMatches: string[] = [];\n let authConfidence = 0;\n if (status === 401 || status === 403) {\n authMatches.push(`status:${status}`);\n authConfidence = Math.max(authConfidence, status === 401 ? 0.94 : 0.9);\n }\n if (code === \"auth\") {\n authMatches.push(\"provider_code:auth\");\n authConfidence = Math.max(authConfidence, 0.9);\n }\n const authPathMatches = scorePatternMatches(`${url} ${finalUrl}`, AUTH_URL_PATTERNS);\n authMatches.push(...authPathMatches.matched);\n authConfidence = Math.max(authConfidence, authPathMatches.confidence);\n const authTitleMatches = scorePatternMatches(title, AUTH_TITLE_PATTERNS);\n authMatches.push(...authTitleMatches.matched);\n authConfidence = Math.max(authConfidence, authTitleMatches.confidence);\n if (authConfidence > 0) {\n return {\n type: \"auth_required\",\n reasonCode: \"token_required\",\n confidence: authConfidence,\n retryable: false,\n matches: boundedUniqueList([...matchedPatterns, ...authMatches], 16)\n };\n }\n\n if (!isLoopbackContext) {\n const challengeMatches: string[] = [];\n let challengeConfidence = 0;\n const challengePatternMatches = scorePatternMatches(challengeText, CHALLENGE_PATTERNS);\n challengeMatches.push(...challengePatternMatches.matched);\n challengeConfidence = Math.max(challengeConfidence, challengePatternMatches.confidence);\n if (/(captcha|cf_chl|hcaptcha|recaptcha|interstitial)/i.test(urlSignals)) {\n challengeMatches.push(\"url:challenge_token\");\n challengeConfidence = Math.max(challengeConfidence, 0.9);\n }\n if (hasAnyPattern(title, CHALLENGE_PATTERNS.map((entry) => entry.regex)) && status === 200) {\n challengeMatches.push(\"status:200_challenge_title\");\n challengeConfidence = Math.max(challengeConfidence, 0.92);\n }\n if (normalizedHosts.some((host) => hasAnyPattern(host, RECAPTCHA_HOST_PATTERNS))) {\n challengeMatches.push(\"network:challenge_host\");\n challengeConfidence = Math.max(challengeConfidence, 0.96);\n }\n if (challengeConfidence > 0) {\n return {\n type: \"anti_bot_challenge\",\n reasonCode: \"challenge_detected\",\n confidence: challengeConfidence,\n retryable: false,\n matches: boundedUniqueList([...matchedPatterns, ...challengeMatches], 16)\n };\n }\n }\n\n if (status === 429 || code === \"rate_limited\") {\n return {\n type: \"rate_limited\",\n reasonCode: \"rate_limited\",\n confidence: 0.95,\n retryable: true,\n matches: boundedUniqueList([...matchedPatterns, status === 429 ? \"status:429\" : \"provider_code:rate_limited\"], 16)\n };\n }\n\n if (isUpstreamCode && (hasStaticBlockHost || /retrieval failed/i.test(message) || (typeof status === \"number\" && status >= 500))) {\n return {\n type: \"upstream_block\",\n reasonCode: \"ip_blocked\",\n confidence: hasStaticBlockHost ? 0.9 : 0.8,\n retryable: input.retryable ?? true,\n matches: boundedUniqueList(\n [\n ...matchedPatterns,\n `provider_code:${code}`,\n ...(hasStaticBlockHost ? [\"network:blocked_static_host\"] : [])\n ],\n 16\n )\n };\n }\n\n if (\n input.restrictedTarget\n || RESTRICTED_TARGET_PATTERNS.some((pattern) => pattern.test(url))\n || RESTRICTED_TARGET_PATTERNS.some((pattern) => pattern.test(finalUrl))\n ) {\n return {\n type: \"restricted_target\",\n confidence: 0.92,\n retryable: false,\n matches: boundedUniqueList([...matchedPatterns, \"restricted_target\"], 16)\n };\n }\n\n if (input.envLimited || (code === \"unavailable\" && ENV_LIMITED_PATTERNS.some((pattern) => pattern.test(message)))) {\n return {\n type: \"env_limited\",\n reasonCode: \"env_limited\",\n confidence: input.envLimited ? 0.9 : 0.78,\n retryable: true,\n matches: boundedUniqueList([...matchedPatterns, \"env_limited\"], 16)\n };\n }\n\n if (status || code || title || message || normalizedHosts.length > 0) {\n return {\n type: \"unknown\",\n confidence: 0.5,\n retryable: input.retryable ?? false,\n matches: boundedUniqueList(matchedPatterns, 16)\n };\n }\n\n return null;\n};\n\nconst coerceJsonValue = (\n value: unknown,\n maxTextLength: number,\n promptGuardEnabled: boolean,\n diagnostics: { entries: number; quarantinedSegments: number },\n seen: WeakSet<object>\n): JsonValue => {\n if (value === null || typeof value === \"number\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"string\") {\n const sanitized = sanitizePromptGuardText(value, promptGuardEnabled);\n diagnostics.entries += sanitized.diagnostics.entries;\n diagnostics.quarantinedSegments += sanitized.diagnostics.quarantinedSegments;\n const redacted = redactSensitive(sanitized.text);\n const asString = typeof redacted === \"string\" ? redacted : String(redacted);\n return clampText(asString, maxTextLength) ?? \"\";\n }\n\n if (Array.isArray(value)) {\n return value.slice(0, 20).map((entry) => coerceJsonValue(entry, maxTextLength, promptGuardEnabled, diagnostics, seen));\n }\n\n if (typeof value !== \"object\") {\n return String(value);\n }\n\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n\n const objectValue = value as Record<string, unknown>;\n const entries = Object.entries(objectValue).slice(0, 30);\n const output: Record<string, JsonValue> = {};\n for (const [key, entryValue] of entries) {\n output[key] = coerceJsonValue(entryValue, maxTextLength, promptGuardEnabled, diagnostics, seen);\n }\n return output;\n};\n\nconst coerceEventList = (\n values: unknown[] | undefined,\n maxItems: number,\n maxTextLength: number,\n promptGuardEnabled: boolean,\n diagnostics: { entries: number; quarantinedSegments: number }\n): Array<Record<string, JsonValue>> => {\n if (!Array.isArray(values) || maxItems <= 0) return [];\n return values.slice(-maxItems).map((entry) => {\n const sanitized = coerceJsonValue(\n redactSensitive(entry),\n maxTextLength,\n promptGuardEnabled,\n diagnostics,\n new WeakSet<object>()\n );\n if (!sanitized || typeof sanitized !== \"object\" || Array.isArray(sanitized)) {\n return { value: sanitized };\n }\n return sanitized as Record<string, JsonValue>;\n });\n};\n\nexport const resolveBlockerArtifactCaps = (\n partial: Partial<BlockerArtifactCaps> | undefined\n): BlockerArtifactCaps => {\n return {\n maxNetworkEvents: clampNumber(partial?.maxNetworkEvents ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxNetworkEvents, 1, 500),\n maxConsoleEvents: clampNumber(partial?.maxConsoleEvents ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxConsoleEvents, 1, 500),\n maxExceptionEvents: clampNumber(partial?.maxExceptionEvents ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxExceptionEvents, 1, 200),\n maxHosts: clampNumber(partial?.maxHosts ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxHosts, 1, 200),\n maxTextLength: clampNumber(partial?.maxTextLength ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxTextLength, 32, 4096)\n };\n};\n\nexport const classifyBlockerSignal = (\n input: BlockerClassificationInput\n): BlockerSignalV1 | null => {\n const promptGuardEnabled = input.promptGuardEnabled ?? true;\n const titleSanitized = sanitizePromptGuardText(input.title ?? \"\", promptGuardEnabled);\n const messageSanitized = sanitizePromptGuardText(input.message ?? \"\", promptGuardEnabled);\n const matchedPatterns = boundedUniqueList(input.matchedPatterns, 16);\n const normalizedHosts = boundedUniqueList(input.networkHosts?.map(toLower), 20);\n\n const classification = classifyFromInputs({\n ...input,\n title: titleSanitized.text,\n message: messageSanitized.text\n }, normalizedHosts, matchedPatterns);\n if (!classification) {\n return null;\n }\n\n const threshold = clampThreshold(input.threshold);\n const confidence = clampBlockerConfidence(classification.confidence);\n if (confidence < threshold) {\n return null;\n }\n\n const evidence = {\n ...(input.url ? { url: clampText(input.url, 512) } : {}),\n ...(input.finalUrl ? { finalUrl: clampText(input.finalUrl, 512) } : {}),\n ...(titleSanitized.text ? { title: clampText(titleSanitized.text, 512) } : {}),\n ...(typeof input.status === \"number\" ? { status: input.status } : {}),\n ...(input.providerErrorCode ? { providerErrorCode: input.providerErrorCode } : {}),\n matchedPatterns: boundedUniqueList(classification.matches, 16),\n networkHosts: boundedUniqueList(normalizedHosts, 10),\n ...(input.traceRequestId ? { traceRequestId: input.traceRequestId } : {})\n };\n\n const sanitationEntries = titleSanitized.diagnostics.entries + messageSanitized.diagnostics.entries;\n const sanitationQuarantined = titleSanitized.diagnostics.quarantinedSegments + messageSanitized.diagnostics.quarantinedSegments;\n\n return {\n schemaVersion: \"1.0\",\n type: classification.type,\n source: input.source,\n ...(classification.reasonCode ? { reasonCode: classification.reasonCode } : {}),\n confidence,\n retryable: classification.retryable,\n detectedAt: input.detectedAt ?? new Date().toISOString(),\n evidence,\n actionHints: buildHints(classification.type),\n ...(sanitationEntries > 0 || sanitationQuarantined > 0\n ? {\n sanitation: {\n entries: sanitationEntries,\n quarantinedSegments: sanitationQuarantined\n }\n }\n : {})\n };\n};\n\nexport const buildBlockerArtifacts = (input: BlockerArtifactInput): BlockerArtifactsV1 => {\n const caps = resolveBlockerArtifactCaps(input.caps);\n const promptGuardEnabled = input.promptGuardEnabled ?? true;\n const diagnostics = {\n entries: 0,\n quarantinedSegments: 0\n };\n\n const network = coerceEventList(\n input.networkEvents,\n caps.maxNetworkEvents,\n caps.maxTextLength,\n promptGuardEnabled,\n diagnostics\n );\n const console = coerceEventList(\n input.consoleEvents,\n caps.maxConsoleEvents,\n caps.maxTextLength,\n promptGuardEnabled,\n diagnostics\n );\n const exception = coerceEventList(\n input.exceptionEvents,\n caps.maxExceptionEvents,\n caps.maxTextLength,\n promptGuardEnabled,\n diagnostics\n );\n\n const hosts = boundedUniqueList(\n network\n .map((event) => (typeof event.url === \"string\" ? extractHost(event.url) : null))\n .filter((host): host is string => typeof host === \"string\"),\n caps.maxHosts\n );\n\n return {\n schemaVersion: \"1.0\",\n network,\n console,\n exception,\n hosts,\n sanitation: diagnostics\n };\n};\n\nexport const __test__ = {\n classifyFromInputs,\n extractHost,\n hasAnyPattern,\n clampThreshold,\n isLoopbackHost\n};\n","import { classifyBlockerSignal } from \"./blocker\";\nimport { isProviderReasonCode } from \"./errors\";\nimport type {\n BlockerSignalV1,\n BlockerType,\n JsonValue,\n NormalizedRecord,\n ProviderConstraint,\n ProviderConstraintKind,\n ProviderReasonCode\n} from \"./types\";\n\nexport interface ProviderIssueHint {\n reasonCode: ProviderReasonCode;\n blockerType?: BlockerType;\n constraint?: ProviderConstraint;\n}\n\nexport interface ProviderNextStepGuidance {\n [key: string]: JsonValue;\n reason: string;\n recommendedNextCommands: string[];\n}\n\nexport interface ProviderIssueSummary extends ProviderIssueHint {\n provider?: string;\n summary: string;\n guidance?: ProviderNextStepGuidance;\n}\n\nconst BLOCKER_TYPES = new Set<BlockerType>([\n \"auth_required\",\n \"anti_bot_challenge\",\n \"rate_limited\",\n \"upstream_block\",\n \"restricted_target\",\n \"env_limited\",\n \"unknown\"\n]);\n\nconst CONSTRAINT_KINDS = new Set<ProviderConstraintKind>([\n \"session_required\",\n \"render_required\"\n]);\n\nconst RENDER_REQUIRED_SHELLS = new Set<string>([\n \"bestbuy_international_gate\",\n \"bestbuy_pdp_error_shell\",\n \"duckduckgo_non_js_redirect\",\n \"macys_access_denied_shell\",\n \"social_first_party_help_shell\",\n \"social_js_required_shell\",\n \"social_render_shell\",\n \"target_shell_page\",\n \"temu_empty_shell\"\n]);\n\nconst CHALLENGE_SHELLS = new Set<string>([\"social_verification_wall\", \"temu_challenge_shell\"]);\n\nconst toNonEmptyString = (value: unknown): string | undefined => {\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : undefined;\n};\n\nconst normalizeBlockerType = (value: unknown): BlockerType | undefined => {\n return typeof value === \"string\" && BLOCKER_TYPES.has(value as BlockerType)\n ? value as BlockerType\n : undefined;\n};\n\nconst buildConstraint = (\n kind: ProviderConstraintKind,\n evidenceCode: string,\n providerShell?: string,\n message?: string\n): ProviderConstraint => ({\n kind,\n evidenceCode,\n ...(providerShell ? { providerShell } : {}),\n ...(message ? { message } : {})\n});\n\nexport const isProviderConstraint = (value: unknown): value is ProviderConstraint => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n const candidate = value as Record<string, unknown>;\n return CONSTRAINT_KINDS.has(candidate.kind as ProviderConstraintKind)\n && typeof candidate.evidenceCode === \"string\"\n && candidate.evidenceCode.trim().length > 0\n && (candidate.providerShell === undefined || typeof candidate.providerShell === \"string\")\n && (candidate.message === undefined || typeof candidate.message === \"string\");\n};\n\nexport const classifyProviderIssue = (input: {\n url?: string;\n title?: string;\n message?: string;\n providerShell?: string;\n browserRequired?: boolean;\n status?: number;\n providerErrorCode?: string;\n source?: BlockerSignalV1[\"source\"];\n retryable?: boolean;\n}): ProviderIssueHint | null => {\n const providerShell = toNonEmptyString(input.providerShell);\n const message = toNonEmptyString(input.message);\n\n if (providerShell && CHALLENGE_SHELLS.has(providerShell)) {\n return {\n reasonCode: \"challenge_detected\",\n blockerType: \"anti_bot_challenge\"\n };\n }\n\n if (providerShell && RENDER_REQUIRED_SHELLS.has(providerShell)) {\n return {\n reasonCode: \"env_limited\",\n blockerType: \"env_limited\",\n constraint: buildConstraint(\"render_required\", providerShell, providerShell, message)\n };\n }\n\n const blocker = classifyBlockerSignal({\n source: input.source ?? \"runtime_fetch\",\n ...(input.url ? { url: input.url, finalUrl: input.url } : {}),\n ...(input.title ? { title: input.title } : {}),\n ...(message ? { message } : {}),\n ...(typeof input.status === \"number\" ? { status: input.status } : {}),\n ...(input.providerErrorCode ? { providerErrorCode: input.providerErrorCode } : {}),\n ...(typeof input.retryable === \"boolean\" ? { retryable: input.retryable } : {}),\n envLimited: input.browserRequired === true\n });\n\n if (blocker?.type === \"auth_required\") {\n return {\n /* c8 ignore next -- classifyBlockerSignal always supplies token_required for auth_required blockers */\n reasonCode: blocker.reasonCode ?? \"token_required\",\n blockerType: blocker.type,\n constraint: buildConstraint(\"session_required\", providerShell ?? \"auth_required\", providerShell, message)\n };\n }\n\n if (blocker?.type === \"anti_bot_challenge\") {\n return {\n /* c8 ignore next -- classifyBlockerSignal always supplies challenge_detected for anti-bot blockers */\n reasonCode: blocker.reasonCode ?? \"challenge_detected\",\n blockerType: blocker.type\n };\n }\n\n if (input.browserRequired === true) {\n return {\n /* c8 ignore next -- browserRequired inputs always classify to a blocker payload in the shared classifier */\n reasonCode: blocker?.reasonCode ?? \"env_limited\",\n /* c8 ignore next -- browserRequired fallbacks only normalize unknown blocker types */\n blockerType: blocker?.type === \"unknown\" ? \"env_limited\" : blocker?.type,\n /* c8 ignore next -- providerShell or blocker type always survives before the defensive browser_required fallback */\n constraint: buildConstraint(\"render_required\", providerShell ?? blocker?.type ?? \"browser_required\", providerShell, message)\n };\n }\n\n if (blocker?.type === \"env_limited\") {\n return {\n /* c8 ignore next -- classifyBlockerSignal always supplies env_limited for env_limited blockers */\n reasonCode: blocker.reasonCode ?? \"env_limited\",\n blockerType: blocker.type\n };\n }\n\n return null;\n};\n\nexport const readProviderIssueHint = (args: {\n reasonCode?: unknown;\n blockerType?: unknown;\n code?: unknown;\n message?: unknown;\n details?: Record<string, unknown> | undefined;\n}): ProviderIssueHint | null => {\n const details = args.details;\n const reasonCode = isProviderReasonCode(args.reasonCode)\n ? args.reasonCode\n : (isProviderReasonCode(details?.reasonCode) ? details.reasonCode : undefined);\n const blockerType = normalizeBlockerType(args.blockerType ?? details?.blockerType);\n const constraint = isProviderConstraint(details?.constraint)\n ? details.constraint\n : undefined;\n\n if (reasonCode || blockerType || constraint) {\n return {\n reasonCode: reasonCode\n ?? (constraint?.kind === \"session_required\" ? \"token_required\" : \"env_limited\"),\n ...(blockerType ? { blockerType } : {}),\n ...(constraint ? { constraint } : {})\n };\n }\n\n return classifyProviderIssue({\n url: toNonEmptyString(details?.url),\n title: toNonEmptyString(details?.title),\n message: toNonEmptyString(details?.message ?? args.message),\n providerShell: toNonEmptyString(details?.providerShell),\n browserRequired: details?.browserRequired === true,\n providerErrorCode: toNonEmptyString(args.code),\n source: \"runtime_fetch\"\n });\n};\n\nexport const readProviderIssueHintFromRecord = (\n record: Pick<NormalizedRecord, \"url\" | \"title\" | \"content\" | \"attributes\">\n): ProviderIssueHint | null => {\n const details = record.attributes as Record<string, unknown>;\n return readProviderIssueHint({\n reasonCode: details.reasonCode,\n blockerType: details.blockerType,\n message: record.content,\n details: {\n url: record.url,\n title: record.title,\n message: record.content,\n providerShell: details.providerShell,\n browserRequired: details.browserRequired,\n constraint: details.constraint\n }\n });\n};\n\nexport const applyProviderIssueHint = (\n details: Record<string, JsonValue> | undefined,\n hint: ProviderIssueHint | null\n): Record<string, JsonValue> | undefined => {\n if (!hint) return details;\n const next: Record<string, JsonValue> = {\n ...(details ?? {}),\n reasonCode: hint.reasonCode\n };\n if (hint.blockerType && typeof next.blockerType !== \"string\") {\n next.blockerType = hint.blockerType;\n }\n if (hint.constraint && !isProviderConstraint(next.constraint)) {\n next.constraint = hint.constraint;\n }\n if (typeof next.guidance === \"undefined\") {\n const guidance = buildProviderIssueGuidance({ hint, details: next });\n if (guidance) {\n next.guidance = guidance;\n }\n }\n return next;\n};\n\nconst providerLabel = (provider: string | undefined): string => {\n const normalized = toNonEmptyString(provider);\n if (!normalized) return \"Provider\";\n const separator = normalized.lastIndexOf(\"/\");\n const tail = separator >= 0 ? normalized.slice(separator + 1) : normalized;\n return tail.charAt(0).toUpperCase() + tail.slice(1);\n};\n\nconst hasPreservedBrowserState = (details: Record<string, JsonValue> | undefined): boolean => {\n return typeof details?.preservedSessionId === \"string\" || typeof details?.preservedTargetId === \"string\";\n};\n\nconst buildGuidance = (\n reason: string,\n recommendedNextCommands: string[]\n): ProviderNextStepGuidance => ({\n reason,\n recommendedNextCommands\n});\n\nconst buildAuthGuidance = (\n subject: string,\n preservedBrowserState: boolean\n): ProviderNextStepGuidance => {\n return preservedBrowserState\n ? buildGuidance(\n `${subject} preserved browser state that can finish authentication.`,\n [\n \"Complete the login or account checkpoint in the preserved browser session.\",\n \"Rerun the same provider or workflow after the session is fully authenticated.\"\n ]\n )\n : buildGuidance(\n `${subject} needs an authenticated session before retrying.`,\n [\n \"Reuse an authenticated browser session, import logged-in cookies, or use the provider sign-in flow.\",\n \"Rerun the same provider or workflow once the session is active.\"\n ]\n );\n};\n\nconst buildChallengeGuidance = (\n subject: string,\n preservedBrowserState: boolean\n): ProviderNextStepGuidance => {\n return preservedBrowserState\n ? buildGuidance(\n `${subject} preserved browser state that can complete the current challenge.`,\n [\n \"Finish the login or anti-bot challenge in the preserved browser session.\",\n \"Rerun the same provider or workflow after the page unlocks.\"\n ]\n )\n : buildGuidance(\n `${subject} hit a challenge that still needs browser-assisted follow-up.`,\n [\n \"Retry with browser assistance so the challenge can be completed interactively.\",\n \"Only ask for manual credentials if browser-assisted recovery still cannot unlock the page.\"\n ]\n );\n};\n\nconst buildRenderGuidance = (\n subject: string,\n preservedBrowserState: boolean,\n constraint?: ProviderConstraint\n): ProviderNextStepGuidance => {\n if (constraint?.providerShell === \"bestbuy_international_gate\") {\n return buildGuidance(\n `${subject} needs the Best Buy country-selection interstitial cleared before retrying.`,\n [\n \"Choose the shopping country or region in the preserved browser session.\",\n \"Rerun the same provider or workflow after the Best Buy PDP or search results are visible.\"\n ]\n );\n }\n if (constraint?.providerShell === \"bestbuy_pdp_error_shell\") {\n return buildGuidance(\n `${subject} needs a valid Best Buy product detail page before retrying.`,\n [\n \"Open the Best Buy product URL in the preserved browser session and confirm the PDP is visible.\",\n \"Rerun the workflow after the product title, price, and media are visible instead of the generic error page.\"\n ]\n );\n }\n return preservedBrowserState\n ? buildGuidance(\n `${subject} still needs a live browser-rendered page, but browser state is already preserved.`,\n [\n \"Inspect the preserved browser session until usable content is visible.\",\n \"Rerun the same provider or workflow after the rendered page is ready.\"\n ]\n )\n : buildGuidance(\n `${subject} needs a live browser-rendered page before retrying.`,\n [\n \"Retry with browser assistance or a headed browser session.\",\n \"Rerun the same provider or workflow after the rendered page is ready.\"\n ]\n );\n};\n\nexport const buildProviderIssueGuidance = (args: {\n provider?: string;\n hint: ProviderIssueHint;\n details?: Record<string, JsonValue>;\n}): ProviderNextStepGuidance | undefined => {\n const subject = providerLabel(args.provider);\n const preservedBrowserState = hasPreservedBrowserState(args.details);\n const disposition = toNonEmptyString(args.details?.disposition);\n if (disposition === \"completed\") return undefined;\n if (disposition === \"challenge_preserved\") {\n return buildChallengeGuidance(subject, true);\n }\n if (args.hint.reasonCode === \"token_required\" || args.hint.reasonCode === \"auth_required\") {\n return buildAuthGuidance(subject, preservedBrowserState);\n }\n if (args.hint.reasonCode === \"challenge_detected\") {\n return buildChallengeGuidance(subject, preservedBrowserState);\n }\n if (args.hint.constraint?.kind === \"render_required\" || args.hint.reasonCode === \"env_limited\") {\n return buildRenderGuidance(subject, preservedBrowserState, args.hint.constraint);\n }\n return undefined;\n};\n\nconst summaryPriority = (hint: ProviderIssueHint): number => {\n /* c8 ignore next -- providerLabel always passes a concrete tail string into this helper */\n if (hint.reasonCode === \"token_required\" || hint.reasonCode === \"auth_required\") return 3;\n if (hint.reasonCode === \"challenge_detected\") return 2;\n if (hint.constraint?.kind === \"render_required\") return 1;\n return 0;\n};\n\nconst summarizeRenderConstraint = (\n subject: string,\n constraint?: ProviderConstraint\n): string => {\n if (constraint?.providerShell === \"bestbuy_international_gate\") {\n return `${subject} is blocked by the Best Buy country-selection interstitial.`;\n }\n if (constraint?.providerShell === \"bestbuy_pdp_error_shell\") {\n return `${subject} is blocked by a Best Buy product-detail error shell.`;\n }\n return `${subject} requires a live browser-rendered page.`;\n};\n\nexport const summarizeProviderIssue = (args: {\n provider?: string;\n hint: ProviderIssueHint;\n}): string => {\n const subject = providerLabel(args.provider);\n if (args.hint.reasonCode === \"token_required\" || args.hint.reasonCode === \"auth_required\") {\n return `${subject} requires login or an existing session.`;\n }\n if (args.hint.reasonCode === \"challenge_detected\") {\n return `${subject} hit an anti-bot challenge that requires manual completion.`;\n }\n if (args.hint.constraint?.kind === \"render_required\") {\n return summarizeRenderConstraint(subject, args.hint.constraint);\n }\n return `${subject} requires manual browser follow-up; this run did not determine whether login or page rendering is required.`;\n};\n\nexport const summarizePrimaryProviderIssue = (\n failures: Array<{ provider?: string; error?: { reasonCode?: unknown; code?: unknown; message?: unknown; details?: Record<string, unknown> } }> | undefined\n): ProviderIssueSummary | null => {\n if (!Array.isArray(failures) || failures.length === 0) return null;\n let best: ProviderIssueSummary | null = null;\n\n for (const failure of failures) {\n const hint = readProviderIssueHint({\n reasonCode: failure.error?.reasonCode,\n code: failure.error?.code,\n message: failure.error?.message,\n details: failure.error?.details\n });\n if (!hint) continue;\n const summary = summarizeProviderIssue({ provider: failure.provider, hint });\n const guidance = buildProviderIssueGuidance({\n provider: failure.provider,\n hint,\n details: failure.error?.details as Record<string, JsonValue> | undefined\n });\n const candidate: ProviderIssueSummary = {\n provider: failure.provider,\n summary,\n ...hint,\n ...(guidance ? { guidance } : {})\n };\n if (!best || summaryPriority(candidate) > summaryPriority(best)) {\n best = candidate;\n }\n }\n\n return best;\n};\n"],"mappings":"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","names":["console"]}
1
+ {"version":3,"sources":["../src/core/logging.ts","../src/providers/safety/prompt-guard.ts","../src/providers/blocker.ts","../src/providers/constraint.ts"],"sourcesContent":["import { randomUUID } from \"crypto\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"audit\";\n\nexport type LogEnvelope = {\n ts: string;\n level: LogLevel;\n module: string;\n event: string;\n requestId: string;\n sessionId?: string;\n traceId?: string;\n data?: unknown;\n};\n\ntype LogFields = {\n requestId?: string;\n sessionId?: string;\n traceId?: string;\n data?: unknown;\n};\n\nexport type LogSink = (entry: LogEnvelope) => void;\n\nconst SECRET_KEY_PATTERN = /(token|secret|password|authorization|cookie|api[-_]?key|session)/i;\nconst SECRET_VALUE_PATTERN = /(bearer\\s+[a-z0-9._-]+|sk_[a-z0-9_-]+|pk_[a-z0-9_-]+|eyJ[a-z0-9_-]+\\.[a-z0-9_-]+\\.[a-z0-9_-]+)/gi;\n\nfunction redactString(value: string): string {\n return value.replace(SECRET_VALUE_PATTERN, \"[REDACTED]\");\n}\n\nexport function redactSensitive(value: unknown, seen = new WeakSet<object>()): unknown {\n if (typeof value === \"string\") {\n return redactString(value);\n }\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n\n if (Array.isArray(value)) {\n return value.map((item) => redactSensitive(item, seen));\n }\n\n const output: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n if (SECRET_KEY_PATTERN.test(key)) {\n output[key] = \"[REDACTED]\";\n continue;\n }\n output[key] = redactSensitive(entry, seen);\n }\n return output;\n}\n\nexport function createRequestId(): string {\n return randomUUID();\n}\n\nconst defaultSink: LogSink = (entry) => {\n const payload = JSON.stringify(entry);\n if (entry.level === \"error\") {\n console.error(payload);\n return;\n }\n if (entry.level === \"warn\") {\n console.warn(payload);\n return;\n }\n console.log(payload);\n};\n\nexport const stderrSink: LogSink = (entry) => {\n process.stderr.write(`${JSON.stringify(entry)}\\n`);\n};\n\nlet configuredDefaultSink: LogSink = defaultSink;\n\nexport function setDefaultLogSink(sink?: LogSink | null): void {\n configuredDefaultSink = sink ?? defaultSink;\n}\n\nexport function createLogger(moduleName: string, sink?: LogSink): {\n debug: (event: string, fields?: LogFields) => LogEnvelope;\n info: (event: string, fields?: LogFields) => LogEnvelope;\n warn: (event: string, fields?: LogFields) => LogEnvelope;\n error: (event: string, fields?: LogFields) => LogEnvelope;\n audit: (event: string, fields?: LogFields) => LogEnvelope;\n} {\n const emit = (level: LogLevel, event: string, fields: LogFields = {}): LogEnvelope => {\n const entry: LogEnvelope = {\n ts: new Date().toISOString(),\n level,\n module: moduleName,\n event,\n requestId: fields.requestId ?? createRequestId(),\n ...(fields.sessionId ? { sessionId: fields.sessionId } : {}),\n ...(fields.traceId ? { traceId: fields.traceId } : {}),\n ...(typeof fields.data === \"undefined\" ? {} : { data: redactSensitive(fields.data) })\n };\n (sink ?? configuredDefaultSink)(entry);\n return entry;\n };\n\n return {\n debug: (event, fields) => emit(\"debug\", event, fields),\n info: (event, fields) => emit(\"info\", event, fields),\n warn: (event, fields) => emit(\"warn\", event, fields),\n error: (event, fields) => emit(\"error\", event, fields),\n audit: (event, fields) => emit(\"audit\", event, fields)\n };\n}\n\nexport const __test__ = {\n redactString,\n defaultSink\n};\n","import type { JsonValue, NormalizedRecord } from \"../types\";\n\ntype PromptGuardSeverity = \"low\" | \"medium\" | \"high\";\ntype PromptGuardAction = \"strip\" | \"quarantine\";\ntype PromptGuardField = \"title\" | \"content\";\n\ntype PromptGuardRule = {\n id: string;\n regex: RegExp;\n severity: PromptGuardSeverity;\n action: PromptGuardAction;\n};\n\nexport interface PromptGuardEntry {\n pattern: string;\n action: PromptGuardAction;\n severity: PromptGuardSeverity;\n excerpt: string;\n}\n\nexport interface PromptGuardRecordEntry extends PromptGuardEntry {\n recordId: string;\n field: PromptGuardField;\n}\n\nexport interface PromptGuardTextResult {\n text: string;\n diagnostics: {\n entries: number;\n quarantinedSegments: number;\n };\n entries: PromptGuardEntry[];\n}\n\nexport interface PromptGuardResult {\n records: NormalizedRecord[];\n audit: {\n enabled: boolean;\n quarantinedSegments: number;\n entries: PromptGuardRecordEntry[];\n };\n}\n\nconst MAX_EXCERPT_LENGTH = 120;\n\nconst RULES: PromptGuardRule[] = [\n {\n id: \"reveal_system_prompt\",\n regex: /\\b(reveal|show|print|dump|expose|leak)\\b[^.!?\\n]{0,80}\\b(system prompt|hidden prompt|internal prompt)\\b/gi,\n severity: \"high\",\n action: \"quarantine\"\n },\n {\n id: \"tool_abuse_directive\",\n regex: /\\buse (?:the )?tool(?:ing)?\\b[^.!?\\n]{0,120}\\b(delete|remove|drop|wipe|exfiltrat|override|bypass)\\w*/gi,\n severity: \"high\",\n action: \"quarantine\"\n },\n {\n id: \"ignore_previous_instructions\",\n regex: /\\bignore (?:all )?previous instructions?\\b/gi,\n severity: \"medium\",\n action: \"strip\"\n },\n {\n id: \"reveal_hidden_data\",\n regex: /\\breveal (?:hidden|secret|confidential) (?:data|information)\\b/gi,\n severity: \"high\",\n action: \"quarantine\"\n }\n];\n\nconst sanitizeExcerpt = (value: string): string => {\n const compact = value.replace(/\\s+/g, \" \").trim();\n if (compact.length <= MAX_EXCERPT_LENGTH) return compact;\n return `${compact.slice(0, MAX_EXCERPT_LENGTH - 3)}...`;\n};\n\nconst isJsonObject = (value: JsonValue | undefined): value is Record<string, JsonValue> => {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n};\n\nconst withSecurityAttributes = (\n record: NormalizedRecord,\n enabled: boolean,\n guardEntries: number,\n quarantinedSegments: number\n): Record<string, JsonValue> => {\n const existingSecurity = isJsonObject(record.attributes.security)\n ? record.attributes.security\n : {};\n\n return {\n ...record.attributes,\n security: {\n ...existingSecurity,\n untrustedContent: true,\n dataOnlyContext: true,\n promptGuardEnabled: enabled,\n guardEntries,\n quarantinedSegments\n }\n };\n};\n\nexport function sanitizePromptGuardText(text: string, enabled: boolean): PromptGuardTextResult {\n if (!enabled || !text) {\n return {\n text,\n diagnostics: { entries: 0, quarantinedSegments: 0 },\n entries: []\n };\n }\n\n let output = text;\n const entries: PromptGuardEntry[] = [];\n\n for (const rule of RULES) {\n rule.regex.lastIndex = 0;\n output = output.replace(rule.regex, (match) => {\n entries.push({\n pattern: rule.id,\n action: rule.action,\n severity: rule.severity,\n excerpt: sanitizeExcerpt(match)\n });\n return rule.action === \"quarantine\" ? \"[QUARANTINED]\" : \" \";\n });\n }\n\n const normalized = output.replace(/\\s{2,}/g, \" \").trim();\n const quarantinedSegments = entries.reduce((count, entry) => {\n return entry.action === \"quarantine\" ? count + 1 : count;\n }, 0);\n\n return {\n text: normalized,\n diagnostics: {\n entries: entries.length,\n quarantinedSegments\n },\n entries\n };\n}\n\nexport function applyPromptGuard(records: NormalizedRecord[], enabled: boolean): PromptGuardResult {\n const auditEntries: PromptGuardRecordEntry[] = [];\n let totalQuarantinedSegments = 0;\n\n const guardedRecords = records.map((record) => {\n if (!enabled) {\n return {\n ...record,\n attributes: withSecurityAttributes(record, false, 0, 0)\n };\n }\n\n let title = record.title;\n let content = record.content;\n let recordEntries = 0;\n let recordQuarantinedSegments = 0;\n\n if (typeof record.title === \"string\") {\n const sanitizedTitle = sanitizePromptGuardText(record.title, true);\n title = sanitizedTitle.text;\n recordEntries += sanitizedTitle.diagnostics.entries;\n recordQuarantinedSegments += sanitizedTitle.diagnostics.quarantinedSegments;\n for (const entry of sanitizedTitle.entries) {\n auditEntries.push({\n ...entry,\n recordId: record.id,\n field: \"title\"\n });\n }\n }\n\n if (typeof record.content === \"string\") {\n const sanitizedContent = sanitizePromptGuardText(record.content, true);\n content = sanitizedContent.text;\n recordEntries += sanitizedContent.diagnostics.entries;\n recordQuarantinedSegments += sanitizedContent.diagnostics.quarantinedSegments;\n for (const entry of sanitizedContent.entries) {\n auditEntries.push({\n ...entry,\n recordId: record.id,\n field: \"content\"\n });\n }\n }\n\n totalQuarantinedSegments += recordQuarantinedSegments;\n\n return {\n ...record,\n ...(typeof title === \"string\" ? { title } : {}),\n ...(typeof content === \"string\" ? { content } : {}),\n attributes: withSecurityAttributes(record, true, recordEntries, recordQuarantinedSegments)\n };\n });\n\n return {\n records: guardedRecords,\n audit: {\n enabled,\n quarantinedSegments: enabled ? totalQuarantinedSegments : 0,\n entries: enabled ? auditEntries : []\n }\n };\n}\n","import { redactSensitive } from \"../core/logging\";\nimport { sanitizePromptGuardText } from \"./safety/prompt-guard\";\nimport type {\n BlockerActionHint,\n BlockerArtifactCaps,\n BlockerArtifactsV1,\n BlockerSignalV1,\n BlockerType,\n JsonValue,\n ProviderReasonCode\n} from \"./types\";\n\nconst AUTH_URL_PATTERNS: Array<{ id: string; regex: RegExp; confidence: number }> = [\n { id: \"redirect_login_flow\", regex: /\\/i\\/flow\\/login/i, confidence: 0.97 },\n { id: \"auth_login_path\", regex: /\\/(login|signin|sign-in|auth)(?:[./?]|$)/i, confidence: 0.9 }\n];\n\nconst AUTH_TITLE_PATTERNS: Array<{ id: string; regex: RegExp; confidence: number }> = [\n { id: \"title_login\", regex: /\\b(log ?in|sign ?in|login|signin)\\b/i, confidence: 0.92 },\n { id: \"title_auth_required\", regex: /authentication required/i, confidence: 0.9 }\n];\n\nconst CHALLENGE_PATTERNS: Array<{ id: string; regex: RegExp; confidence: number }> = [\n { id: \"challenge_keyword\", regex: /\\b(?:captcha|interstitial|cf_chl|recaptcha|hcaptcha|security challenge|browser challenge|bot check|bot detection)\\b/i, confidence: 0.88 },\n { id: \"complete_challenge_prompt\", regex: /\\b(?:complete|solve|pass) (?:the )?(?:security )?challenge\\b/i, confidence: 0.9 },\n { id: \"prove_humanity\", regex: /prove your humanity/i, confidence: 0.96 },\n { id: \"verify_humanity\", regex: /verify (?:you(?:'|’)re|you are) human/i, confidence: 0.96 },\n { id: \"robot_or_human\", regex: /robot or human/i, confidence: 0.98 },\n { id: \"confirm_human\", regex: /confirm that you(?:'|’)re human/i, confidence: 0.96 },\n { id: \"confirm_not_bot\", regex: /sign in to confirm (?:you(?:'|’)re|you are) not a bot/i, confidence: 0.96 },\n { id: \"click_and_hold\", regex: /\\b(?:click|press|tap|activate)\\s+(?:and\\s+)?hold\\b/i, confidence: 0.95 },\n { id: \"press_and_hold\", regex: /activate and hold the button/i, confidence: 0.95 },\n { id: \"drag_slider\", regex: /\\b(?:drag|slide|move)(?:\\s+the)?\\s+(?:slider|puzzle(?:\\s+piece)?|piece|button)\\b/i, confidence: 0.95 },\n { id: \"pardon_interruption\", regex: /pardon our interruption/i, confidence: 0.97 },\n { id: \"checking_browser_gate\", regex: /checking your browser before you access/i, confidence: 0.97 }\n];\n\nconst RECAPTCHA_HOST_PATTERNS = [/recaptcha/i, /hcaptcha/i, /challenges\\.cloudflare\\.com/i];\nconst STATIC_BLOCK_HOST_PATTERNS = [/redditstatic\\.com$/i, /abs\\.twimg\\.com$/i, /twimg\\.com$/i];\n\nconst ENV_LIMITED_PATTERNS = [\n /extension not connected/i,\n /connect the extension/i,\n /manual interaction/i,\n /timed out/i,\n /not available in this environment/i\n];\n\nconst RESTRICTED_TARGET_PATTERNS = [/^chrome:\\/\\//i, /^chrome-extension:\\/\\//i, /^about:blank$/i, /^devtools:\\/\\//i];\n\nexport const DEFAULT_BLOCKER_ARTIFACT_CAPS: BlockerArtifactCaps = {\n maxNetworkEvents: 20,\n maxConsoleEvents: 20,\n maxExceptionEvents: 10,\n maxHosts: 10,\n maxTextLength: 512\n};\n\nexport interface BlockerClassificationInput {\n source: BlockerSignalV1[\"source\"];\n url?: string;\n finalUrl?: string;\n title?: string;\n status?: number;\n providerErrorCode?: string;\n message?: string;\n matchedPatterns?: string[];\n networkHosts?: string[];\n traceRequestId?: string;\n retryable?: boolean;\n envLimited?: boolean;\n restrictedTarget?: boolean;\n promptGuardEnabled?: boolean;\n threshold?: number;\n detectedAt?: string;\n}\n\nexport interface BlockerArtifactInput {\n networkEvents?: unknown[];\n consoleEvents?: unknown[];\n exceptionEvents?: unknown[];\n promptGuardEnabled?: boolean;\n caps?: Partial<BlockerArtifactCaps>;\n}\n\nconst toLower = (value: string): string => value.trim().toLowerCase();\n\nconst clampNumber = (value: number, min: number, max: number): number => {\n if (!Number.isFinite(value)) return min;\n if (value < min) return min;\n if (value > max) return max;\n return value;\n};\n\nexport const clampBlockerConfidence = (value: number): number => {\n return clampNumber(value, 0, 1);\n};\n\nconst clampThreshold = (value: number | undefined): number => {\n if (typeof value !== \"number\") return 0.7;\n return clampNumber(value, 0, 1);\n};\n\nexport const clampText = (value: string | undefined, maxLength: number): string | undefined => {\n if (typeof value !== \"string\") return undefined;\n if (maxLength <= 0) return \"\";\n return value.length <= maxLength ? value : `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n};\n\nexport const boundedUniqueList = (\n values: readonly string[] | undefined,\n maxLength: number\n): string[] => {\n if (!values || values.length === 0 || maxLength <= 0) return [];\n const seen = new Set<string>();\n const list: string[] = [];\n for (const value of values) {\n if (typeof value !== \"string\") continue;\n const normalized = value.trim();\n if (!normalized) continue;\n const key = normalized.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n list.push(normalized);\n if (list.length >= maxLength) break;\n }\n return list;\n};\n\nconst extractHost = (value: string | undefined): string | null => {\n if (!value) return null;\n try {\n return toLower(new URL(value).hostname);\n } catch {\n return null;\n }\n};\n\nconst scorePatternMatches = (\n text: string,\n patterns: Array<{ id: string; regex: RegExp; confidence: number }>\n): { matched: string[]; confidence: number } => {\n const matched: string[] = [];\n let confidence = 0;\n for (const pattern of patterns) {\n if (!pattern.regex.test(text)) continue;\n matched.push(pattern.id);\n confidence = Math.max(confidence, pattern.confidence);\n }\n return { matched, confidence };\n};\n\nconst hasAnyPattern = (value: string, patterns: RegExp[]): boolean => {\n return patterns.some((pattern) => pattern.test(value));\n};\n\nconst isLoopbackHost = (value: string): boolean => {\n const normalized = toLower(value).replace(/^\\[|\\]$/g, \"\");\n if (!normalized) return false;\n if (normalized === \"localhost\" || normalized === \"::1\") return true;\n if (normalized === \"127.0.0.1\" || normalized.startsWith(\"127.\")) return true;\n return /^::ffff:127\\.\\d+\\.\\d+\\.\\d+$/.test(normalized);\n};\n\nconst buildHints = (type: BlockerType): BlockerActionHint[] => {\n switch (type) {\n case \"auth_required\":\n return [\n { id: \"manual_login\", reason: \"Authentication flow requires interactive login.\", priority: 1 },\n { id: \"switch_managed_headed\", reason: \"Headed mode can complete login and persist session state.\", priority: 2 },\n { id: \"switch_extension_mode\", reason: \"Extension mode can reuse an already logged-in browser profile.\", priority: 3 }\n ];\n case \"anti_bot_challenge\":\n return [\n { id: \"manual_challenge\", reason: \"Challenge page requires manual completion.\", priority: 1 },\n { id: \"switch_managed_headed\", reason: \"Headed mode improves challenge completion reliability.\", priority: 2 },\n { id: \"collect_debug_trace\", reason: \"Collect trace artifacts to compare challenge indicators before and after manual action.\", priority: 3 }\n ];\n case \"rate_limited\":\n return [\n { id: \"retry_after_backoff\", reason: \"Rate-limited responses should be retried after a bounded delay.\", priority: 1 },\n { id: \"collect_debug_trace\", reason: \"Trace data can confirm cooldown and request pacing behavior.\", priority: 2 }\n ];\n case \"upstream_block\":\n return [\n { id: \"retry_after_backoff\", reason: \"Upstream blocks may clear after network or host recovery.\", priority: 1 },\n { id: \"switch_managed_headed\", reason: \"Browser-assisted retrieval may bypass runtime fetch limitations.\", priority: 2 },\n { id: \"collect_debug_trace\", reason: \"Trace host evidence helps confirm blocked upstream dependencies.\", priority: 3 }\n ];\n case \"restricted_target\":\n return [\n { id: \"switch_managed_headed\", reason: \"Restricted internal targets require navigation to a normal http(s) tab.\", priority: 1 },\n { id: \"collect_debug_trace\", reason: \"Trace confirms blocked scheme or tab restriction source.\", priority: 2 }\n ];\n case \"env_limited\":\n return [\n { id: \"switch_extension_mode\", reason: \"Extension relay availability is required for this operation.\", priority: 1 },\n { id: \"switch_managed_headed\", reason: \"Managed headed mode is a deterministic fallback when extension is unavailable.\", priority: 2 },\n { id: \"collect_debug_trace\", reason: \"Diagnostics can confirm environment capability gaps.\", priority: 3 }\n ];\n case \"unknown\":\n return [{ id: \"collect_debug_trace\", reason: \"Additional trace evidence is required for reliable classification.\", priority: 1 }];\n }\n};\n\nconst classifyFromInputs = (\n input: BlockerClassificationInput,\n normalizedHosts: string[],\n matchedPatterns: string[]\n): { type: BlockerType; reasonCode?: ProviderReasonCode; confidence: number; retryable: boolean; matches: string[] } | null => {\n const status = input.status;\n const code = toLower(input.providerErrorCode ?? \"\");\n const url = input.url ?? \"\";\n const finalUrl = input.finalUrl ?? \"\";\n const title = input.title ?? \"\";\n const message = input.message ?? \"\";\n const challengeText = `${title} ${message}`;\n const urlSignals = `${url} ${finalUrl}`;\n const isUpstreamCode = code === \"upstream\" || code === \"network\" || code === \"unavailable\";\n const hasStaticBlockHost = normalizedHosts.some((host) => hasAnyPattern(host, STATIC_BLOCK_HOST_PATTERNS));\n const isLoopbackContext = [\n extractHost(url),\n extractHost(finalUrl),\n ...normalizedHosts\n ].some((host): host is string => typeof host === \"string\" && isLoopbackHost(host));\n\n const authMatches: string[] = [];\n let authConfidence = 0;\n if (status === 401 || status === 403) {\n authMatches.push(`status:${status}`);\n authConfidence = Math.max(authConfidence, status === 401 ? 0.94 : 0.9);\n }\n if (code === \"auth\") {\n authMatches.push(\"provider_code:auth\");\n authConfidence = Math.max(authConfidence, 0.9);\n }\n const authPathMatches = scorePatternMatches(`${url} ${finalUrl}`, AUTH_URL_PATTERNS);\n authMatches.push(...authPathMatches.matched);\n authConfidence = Math.max(authConfidence, authPathMatches.confidence);\n const authTitleMatches = scorePatternMatches(title, AUTH_TITLE_PATTERNS);\n authMatches.push(...authTitleMatches.matched);\n authConfidence = Math.max(authConfidence, authTitleMatches.confidence);\n if (authConfidence > 0) {\n return {\n type: \"auth_required\",\n reasonCode: \"token_required\",\n confidence: authConfidence,\n retryable: false,\n matches: boundedUniqueList([...matchedPatterns, ...authMatches], 16)\n };\n }\n\n if (!isLoopbackContext) {\n const challengeMatches: string[] = [];\n let challengeConfidence = 0;\n const challengePatternMatches = scorePatternMatches(challengeText, CHALLENGE_PATTERNS);\n challengeMatches.push(...challengePatternMatches.matched);\n challengeConfidence = Math.max(challengeConfidence, challengePatternMatches.confidence);\n if (/(captcha|cf_chl|hcaptcha|recaptcha|interstitial)/i.test(urlSignals)) {\n challengeMatches.push(\"url:challenge_token\");\n challengeConfidence = Math.max(challengeConfidence, 0.9);\n }\n if (hasAnyPattern(title, CHALLENGE_PATTERNS.map((entry) => entry.regex)) && status === 200) {\n challengeMatches.push(\"status:200_challenge_title\");\n challengeConfidence = Math.max(challengeConfidence, 0.92);\n }\n if (normalizedHosts.some((host) => hasAnyPattern(host, RECAPTCHA_HOST_PATTERNS))) {\n challengeMatches.push(\"network:challenge_host\");\n challengeConfidence = Math.max(challengeConfidence, 0.96);\n }\n if (challengeConfidence > 0) {\n return {\n type: \"anti_bot_challenge\",\n reasonCode: \"challenge_detected\",\n confidence: challengeConfidence,\n retryable: false,\n matches: boundedUniqueList([...matchedPatterns, ...challengeMatches], 16)\n };\n }\n }\n\n if (status === 429 || code === \"rate_limited\") {\n return {\n type: \"rate_limited\",\n reasonCode: \"rate_limited\",\n confidence: 0.95,\n retryable: true,\n matches: boundedUniqueList([...matchedPatterns, status === 429 ? \"status:429\" : \"provider_code:rate_limited\"], 16)\n };\n }\n\n if (isUpstreamCode && (hasStaticBlockHost || /retrieval failed/i.test(message) || (typeof status === \"number\" && status >= 500))) {\n return {\n type: \"upstream_block\",\n reasonCode: \"ip_blocked\",\n confidence: hasStaticBlockHost ? 0.9 : 0.8,\n retryable: input.retryable ?? true,\n matches: boundedUniqueList(\n [\n ...matchedPatterns,\n `provider_code:${code}`,\n ...(hasStaticBlockHost ? [\"network:blocked_static_host\"] : [])\n ],\n 16\n )\n };\n }\n\n if (\n input.restrictedTarget\n || RESTRICTED_TARGET_PATTERNS.some((pattern) => pattern.test(url))\n || RESTRICTED_TARGET_PATTERNS.some((pattern) => pattern.test(finalUrl))\n ) {\n return {\n type: \"restricted_target\",\n confidence: 0.92,\n retryable: false,\n matches: boundedUniqueList([...matchedPatterns, \"restricted_target\"], 16)\n };\n }\n\n if (input.envLimited || (code === \"unavailable\" && ENV_LIMITED_PATTERNS.some((pattern) => pattern.test(message)))) {\n return {\n type: \"env_limited\",\n reasonCode: \"env_limited\",\n confidence: input.envLimited ? 0.9 : 0.78,\n retryable: true,\n matches: boundedUniqueList([...matchedPatterns, \"env_limited\"], 16)\n };\n }\n\n if (status || code || title || message || normalizedHosts.length > 0) {\n return {\n type: \"unknown\",\n confidence: 0.5,\n retryable: input.retryable ?? false,\n matches: boundedUniqueList(matchedPatterns, 16)\n };\n }\n\n return null;\n};\n\nconst coerceJsonValue = (\n value: unknown,\n maxTextLength: number,\n promptGuardEnabled: boolean,\n diagnostics: { entries: number; quarantinedSegments: number },\n seen: WeakSet<object>\n): JsonValue => {\n if (value === null || typeof value === \"number\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"string\") {\n const sanitized = sanitizePromptGuardText(value, promptGuardEnabled);\n diagnostics.entries += sanitized.diagnostics.entries;\n diagnostics.quarantinedSegments += sanitized.diagnostics.quarantinedSegments;\n const redacted = redactSensitive(sanitized.text);\n const asString = typeof redacted === \"string\" ? redacted : String(redacted);\n return clampText(asString, maxTextLength) ?? \"\";\n }\n\n if (Array.isArray(value)) {\n return value.slice(0, 20).map((entry) => coerceJsonValue(entry, maxTextLength, promptGuardEnabled, diagnostics, seen));\n }\n\n if (typeof value !== \"object\") {\n return String(value);\n }\n\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n\n const objectValue = value as Record<string, unknown>;\n const entries = Object.entries(objectValue).slice(0, 30);\n const output: Record<string, JsonValue> = {};\n for (const [key, entryValue] of entries) {\n output[key] = coerceJsonValue(entryValue, maxTextLength, promptGuardEnabled, diagnostics, seen);\n }\n return output;\n};\n\nconst coerceEventList = (\n values: unknown[] | undefined,\n maxItems: number,\n maxTextLength: number,\n promptGuardEnabled: boolean,\n diagnostics: { entries: number; quarantinedSegments: number }\n): Array<Record<string, JsonValue>> => {\n if (!Array.isArray(values) || maxItems <= 0) return [];\n return values.slice(-maxItems).map((entry) => {\n const sanitized = coerceJsonValue(\n redactSensitive(entry),\n maxTextLength,\n promptGuardEnabled,\n diagnostics,\n new WeakSet<object>()\n );\n if (!sanitized || typeof sanitized !== \"object\" || Array.isArray(sanitized)) {\n return { value: sanitized };\n }\n return sanitized as Record<string, JsonValue>;\n });\n};\n\nexport const resolveBlockerArtifactCaps = (\n partial: Partial<BlockerArtifactCaps> | undefined\n): BlockerArtifactCaps => {\n return {\n maxNetworkEvents: clampNumber(partial?.maxNetworkEvents ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxNetworkEvents, 1, 500),\n maxConsoleEvents: clampNumber(partial?.maxConsoleEvents ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxConsoleEvents, 1, 500),\n maxExceptionEvents: clampNumber(partial?.maxExceptionEvents ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxExceptionEvents, 1, 200),\n maxHosts: clampNumber(partial?.maxHosts ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxHosts, 1, 200),\n maxTextLength: clampNumber(partial?.maxTextLength ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxTextLength, 32, 4096)\n };\n};\n\nexport const classifyBlockerSignal = (\n input: BlockerClassificationInput\n): BlockerSignalV1 | null => {\n const promptGuardEnabled = input.promptGuardEnabled ?? true;\n const titleSanitized = sanitizePromptGuardText(input.title ?? \"\", promptGuardEnabled);\n const messageSanitized = sanitizePromptGuardText(input.message ?? \"\", promptGuardEnabled);\n const matchedPatterns = boundedUniqueList(input.matchedPatterns, 16);\n const normalizedHosts = boundedUniqueList(input.networkHosts?.map(toLower), 20);\n\n const classification = classifyFromInputs({\n ...input,\n title: titleSanitized.text,\n message: messageSanitized.text\n }, normalizedHosts, matchedPatterns);\n if (!classification) {\n return null;\n }\n\n const threshold = clampThreshold(input.threshold);\n const confidence = clampBlockerConfidence(classification.confidence);\n if (confidence < threshold) {\n return null;\n }\n\n const evidence = {\n ...(input.url ? { url: clampText(input.url, 512) } : {}),\n ...(input.finalUrl ? { finalUrl: clampText(input.finalUrl, 512) } : {}),\n ...(titleSanitized.text ? { title: clampText(titleSanitized.text, 512) } : {}),\n ...(typeof input.status === \"number\" ? { status: input.status } : {}),\n ...(input.providerErrorCode ? { providerErrorCode: input.providerErrorCode } : {}),\n matchedPatterns: boundedUniqueList(classification.matches, 16),\n networkHosts: boundedUniqueList(normalizedHosts, 10),\n ...(input.traceRequestId ? { traceRequestId: input.traceRequestId } : {})\n };\n\n const sanitationEntries = titleSanitized.diagnostics.entries + messageSanitized.diagnostics.entries;\n const sanitationQuarantined = titleSanitized.diagnostics.quarantinedSegments + messageSanitized.diagnostics.quarantinedSegments;\n\n return {\n schemaVersion: \"1.0\",\n type: classification.type,\n source: input.source,\n ...(classification.reasonCode ? { reasonCode: classification.reasonCode } : {}),\n confidence,\n retryable: classification.retryable,\n detectedAt: input.detectedAt ?? new Date().toISOString(),\n evidence,\n actionHints: buildHints(classification.type),\n ...(sanitationEntries > 0 || sanitationQuarantined > 0\n ? {\n sanitation: {\n entries: sanitationEntries,\n quarantinedSegments: sanitationQuarantined\n }\n }\n : {})\n };\n};\n\nexport const buildBlockerArtifacts = (input: BlockerArtifactInput): BlockerArtifactsV1 => {\n const caps = resolveBlockerArtifactCaps(input.caps);\n const promptGuardEnabled = input.promptGuardEnabled ?? true;\n const diagnostics = {\n entries: 0,\n quarantinedSegments: 0\n };\n\n const network = coerceEventList(\n input.networkEvents,\n caps.maxNetworkEvents,\n caps.maxTextLength,\n promptGuardEnabled,\n diagnostics\n );\n const console = coerceEventList(\n input.consoleEvents,\n caps.maxConsoleEvents,\n caps.maxTextLength,\n promptGuardEnabled,\n diagnostics\n );\n const exception = coerceEventList(\n input.exceptionEvents,\n caps.maxExceptionEvents,\n caps.maxTextLength,\n promptGuardEnabled,\n diagnostics\n );\n\n const hosts = boundedUniqueList(\n network\n .map((event) => (typeof event.url === \"string\" ? extractHost(event.url) : null))\n .filter((host): host is string => typeof host === \"string\"),\n caps.maxHosts\n );\n\n return {\n schemaVersion: \"1.0\",\n network,\n console,\n exception,\n hosts,\n sanitation: diagnostics\n };\n};\n\nexport const __test__ = {\n classifyFromInputs,\n extractHost,\n hasAnyPattern,\n clampThreshold,\n isLoopbackHost\n};\n","import { classifyBlockerSignal } from \"./blocker\";\nimport { isProviderReasonCode } from \"./errors\";\nimport type {\n BlockerSignalV1,\n BlockerType,\n JsonValue,\n NormalizedRecord,\n ProviderConstraint,\n ProviderConstraintKind,\n ProviderReasonCode\n} from \"./types\";\n\nexport interface ProviderIssueHint {\n reasonCode: ProviderReasonCode;\n blockerType?: BlockerType;\n constraint?: ProviderConstraint;\n}\n\nexport interface ProviderNextStepGuidance {\n [key: string]: JsonValue;\n reason: string;\n recommendedNextCommands: string[];\n}\n\nexport interface ProviderIssueSummary extends ProviderIssueHint {\n provider?: string;\n summary: string;\n guidance?: ProviderNextStepGuidance;\n}\n\nconst BLOCKER_TYPES = new Set<BlockerType>([\n \"auth_required\",\n \"anti_bot_challenge\",\n \"rate_limited\",\n \"upstream_block\",\n \"restricted_target\",\n \"env_limited\",\n \"unknown\"\n]);\n\nconst CONSTRAINT_KINDS = new Set<ProviderConstraintKind>([\n \"session_required\",\n \"render_required\"\n]);\n\nconst RENDER_REQUIRED_SHELLS = new Set<string>([\n \"bestbuy_international_gate\",\n \"bestbuy_pdp_error_shell\",\n \"duckduckgo_non_js_redirect\",\n \"macys_access_denied_shell\",\n \"social_first_party_help_shell\",\n \"social_js_required_shell\",\n \"social_render_shell\",\n \"target_shell_page\",\n \"temu_empty_shell\"\n]);\n\nconst CHALLENGE_SHELLS = new Set<string>([\"social_verification_wall\", \"temu_challenge_shell\"]);\n\nconst toNonEmptyString = (value: unknown): string | undefined => {\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : undefined;\n};\n\nconst normalizeBlockerType = (value: unknown): BlockerType | undefined => {\n return typeof value === \"string\" && BLOCKER_TYPES.has(value as BlockerType)\n ? value as BlockerType\n : undefined;\n};\n\nconst buildConstraint = (\n kind: ProviderConstraintKind,\n evidenceCode: string,\n providerShell?: string,\n message?: string\n): ProviderConstraint => ({\n kind,\n evidenceCode,\n ...(providerShell ? { providerShell } : {}),\n ...(message ? { message } : {})\n});\n\nexport const isProviderConstraint = (value: unknown): value is ProviderConstraint => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n const candidate = value as Record<string, unknown>;\n return CONSTRAINT_KINDS.has(candidate.kind as ProviderConstraintKind)\n && typeof candidate.evidenceCode === \"string\"\n && candidate.evidenceCode.trim().length > 0\n && (candidate.providerShell === undefined || typeof candidate.providerShell === \"string\")\n && (candidate.message === undefined || typeof candidate.message === \"string\");\n};\n\nexport const classifyProviderIssue = (input: {\n url?: string;\n title?: string;\n message?: string;\n providerShell?: string;\n browserRequired?: boolean;\n status?: number;\n providerErrorCode?: string;\n source?: BlockerSignalV1[\"source\"];\n retryable?: boolean;\n}): ProviderIssueHint | null => {\n const providerShell = toNonEmptyString(input.providerShell);\n const message = toNonEmptyString(input.message);\n\n if (providerShell && CHALLENGE_SHELLS.has(providerShell)) {\n return {\n reasonCode: \"challenge_detected\",\n blockerType: \"anti_bot_challenge\"\n };\n }\n\n if (providerShell && RENDER_REQUIRED_SHELLS.has(providerShell)) {\n return {\n reasonCode: \"env_limited\",\n blockerType: \"env_limited\",\n constraint: buildConstraint(\"render_required\", providerShell, providerShell, message)\n };\n }\n\n const blocker = classifyBlockerSignal({\n source: input.source ?? \"runtime_fetch\",\n ...(input.url ? { url: input.url, finalUrl: input.url } : {}),\n ...(input.title ? { title: input.title } : {}),\n ...(message ? { message } : {}),\n ...(typeof input.status === \"number\" ? { status: input.status } : {}),\n ...(input.providerErrorCode ? { providerErrorCode: input.providerErrorCode } : {}),\n ...(typeof input.retryable === \"boolean\" ? { retryable: input.retryable } : {}),\n envLimited: input.browserRequired === true\n });\n\n if (blocker?.type === \"auth_required\") {\n return {\n /* c8 ignore next -- classifyBlockerSignal always supplies token_required for auth_required blockers */\n reasonCode: blocker.reasonCode ?? \"token_required\",\n blockerType: blocker.type,\n constraint: buildConstraint(\"session_required\", providerShell ?? \"auth_required\", providerShell, message)\n };\n }\n\n if (blocker?.type === \"anti_bot_challenge\") {\n return {\n /* c8 ignore next -- classifyBlockerSignal always supplies challenge_detected for anti-bot blockers */\n reasonCode: blocker.reasonCode ?? \"challenge_detected\",\n blockerType: blocker.type\n };\n }\n\n if (input.browserRequired === true) {\n return {\n /* c8 ignore next -- browserRequired inputs always classify to a blocker payload in the shared classifier */\n reasonCode: blocker?.reasonCode ?? \"env_limited\",\n /* c8 ignore next -- browserRequired fallbacks only normalize unknown blocker types */\n blockerType: blocker?.type === \"unknown\" ? \"env_limited\" : blocker?.type,\n /* c8 ignore next -- providerShell or blocker type always survives before the defensive browser_required fallback */\n constraint: buildConstraint(\"render_required\", providerShell ?? blocker?.type ?? \"browser_required\", providerShell, message)\n };\n }\n\n if (blocker?.type === \"env_limited\") {\n return {\n /* c8 ignore next -- classifyBlockerSignal always supplies env_limited for env_limited blockers */\n reasonCode: blocker.reasonCode ?? \"env_limited\",\n blockerType: blocker.type\n };\n }\n\n return null;\n};\n\nexport const readProviderIssueHint = (args: {\n reasonCode?: unknown;\n blockerType?: unknown;\n code?: unknown;\n message?: unknown;\n details?: Record<string, unknown> | undefined;\n}): ProviderIssueHint | null => {\n const details = args.details;\n const reasonCode = isProviderReasonCode(args.reasonCode)\n ? args.reasonCode\n : (isProviderReasonCode(details?.reasonCode) ? details.reasonCode : undefined);\n const blockerType = normalizeBlockerType(args.blockerType ?? details?.blockerType);\n const constraint = isProviderConstraint(details?.constraint)\n ? details.constraint\n : undefined;\n\n if (reasonCode || blockerType || constraint) {\n return {\n reasonCode: reasonCode\n ?? (constraint?.kind === \"session_required\" ? \"token_required\" : \"env_limited\"),\n ...(blockerType ? { blockerType } : {}),\n ...(constraint ? { constraint } : {})\n };\n }\n\n return classifyProviderIssue({\n url: toNonEmptyString(details?.url),\n title: toNonEmptyString(details?.title),\n message: toNonEmptyString(details?.message ?? args.message),\n providerShell: toNonEmptyString(details?.providerShell),\n browserRequired: details?.browserRequired === true,\n providerErrorCode: toNonEmptyString(args.code),\n source: \"runtime_fetch\"\n });\n};\n\nexport const readProviderIssueHintFromRecord = (\n record: Pick<NormalizedRecord, \"url\" | \"title\" | \"content\" | \"attributes\">\n): ProviderIssueHint | null => {\n const details = record.attributes as Record<string, unknown>;\n return readProviderIssueHint({\n reasonCode: details.reasonCode,\n blockerType: details.blockerType,\n message: record.content,\n details: {\n url: record.url,\n title: record.title,\n message: record.content,\n providerShell: details.providerShell,\n browserRequired: details.browserRequired,\n constraint: details.constraint\n }\n });\n};\n\nexport const applyProviderIssueHint = (\n details: Record<string, JsonValue> | undefined,\n hint: ProviderIssueHint | null\n): Record<string, JsonValue> | undefined => {\n if (!hint) return details;\n const next: Record<string, JsonValue> = {\n ...(details ?? {}),\n reasonCode: hint.reasonCode\n };\n if (hint.blockerType && typeof next.blockerType !== \"string\") {\n next.blockerType = hint.blockerType;\n }\n if (hint.constraint && !isProviderConstraint(next.constraint)) {\n next.constraint = hint.constraint;\n }\n if (typeof next.guidance === \"undefined\") {\n const guidance = buildProviderIssueGuidance({ hint, details: next });\n if (guidance) {\n next.guidance = guidance;\n }\n }\n return next;\n};\n\nconst providerLabel = (provider: string | undefined): string => {\n const normalized = toNonEmptyString(provider);\n if (!normalized) return \"Provider\";\n const separator = normalized.lastIndexOf(\"/\");\n const tail = separator >= 0 ? normalized.slice(separator + 1) : normalized;\n return tail.charAt(0).toUpperCase() + tail.slice(1);\n};\n\nconst hasPreservedBrowserState = (details: Record<string, JsonValue> | undefined): boolean => {\n return typeof details?.preservedSessionId === \"string\" || typeof details?.preservedTargetId === \"string\";\n};\n\nconst buildGuidance = (\n reason: string,\n recommendedNextCommands: string[]\n): ProviderNextStepGuidance => ({\n reason,\n recommendedNextCommands\n});\n\nconst buildAuthGuidance = (\n subject: string,\n preservedBrowserState: boolean\n): ProviderNextStepGuidance => {\n return preservedBrowserState\n ? buildGuidance(\n `${subject} preserved browser state that can finish authentication.`,\n [\n \"Complete the login or account checkpoint in the preserved browser session.\",\n \"Rerun the same provider or workflow after the session is fully authenticated.\"\n ]\n )\n : buildGuidance(\n `${subject} needs an authenticated session before retrying.`,\n [\n \"Reuse a user-authorized signed-in browser session, load cookies only from that authorized session, or use the provider sign-in flow.\",\n \"Rerun the same provider or workflow once the session is active.\"\n ]\n );\n};\n\nconst buildChallengeGuidance = (\n subject: string,\n preservedBrowserState: boolean\n): ProviderNextStepGuidance => {\n return preservedBrowserState\n ? buildGuidance(\n `${subject} preserved browser state that can complete the current challenge.`,\n [\n \"Finish the login or anti-bot challenge in the preserved browser session.\",\n \"Rerun the same provider or workflow after the page unlocks.\"\n ]\n )\n : buildGuidance(\n `${subject} hit a challenge that still needs browser-assisted follow-up.`,\n [\n \"Retry with browser assistance so the challenge can be completed interactively.\",\n \"Only ask for manual credentials if browser-assisted recovery still cannot unlock the page.\"\n ]\n );\n};\n\nconst buildRenderGuidance = (\n subject: string,\n preservedBrowserState: boolean,\n constraint?: ProviderConstraint\n): ProviderNextStepGuidance => {\n if (constraint?.providerShell === \"bestbuy_international_gate\") {\n return buildGuidance(\n `${subject} needs the Best Buy country-selection interstitial cleared before retrying.`,\n [\n \"Choose the shopping country or region in the preserved browser session.\",\n \"Rerun the same provider or workflow after the Best Buy PDP or search results are visible.\"\n ]\n );\n }\n if (constraint?.providerShell === \"bestbuy_pdp_error_shell\") {\n return buildGuidance(\n `${subject} needs a valid Best Buy product detail page before retrying.`,\n [\n \"Open the Best Buy product URL in the preserved browser session and confirm the PDP is visible.\",\n \"Rerun the workflow after the product title, price, and media are visible instead of the generic error page.\"\n ]\n );\n }\n return preservedBrowserState\n ? buildGuidance(\n `${subject} still needs a live browser-rendered page, but browser state is already preserved.`,\n [\n \"Inspect the preserved browser session until usable content is visible.\",\n \"Rerun the same provider or workflow after the rendered page is ready.\"\n ]\n )\n : buildGuidance(\n `${subject} needs a live browser-rendered page before retrying.`,\n [\n \"Retry with browser assistance or a headed browser session.\",\n \"Rerun the same provider or workflow after the rendered page is ready.\"\n ]\n );\n};\n\nexport const buildProviderIssueGuidance = (args: {\n provider?: string;\n hint: ProviderIssueHint;\n details?: Record<string, JsonValue>;\n}): ProviderNextStepGuidance | undefined => {\n const subject = providerLabel(args.provider);\n const preservedBrowserState = hasPreservedBrowserState(args.details);\n const disposition = toNonEmptyString(args.details?.disposition);\n if (disposition === \"completed\") return undefined;\n if (disposition === \"challenge_preserved\") {\n return buildChallengeGuidance(subject, true);\n }\n if (args.hint.reasonCode === \"token_required\" || args.hint.reasonCode === \"auth_required\") {\n return buildAuthGuidance(subject, preservedBrowserState);\n }\n if (args.hint.reasonCode === \"challenge_detected\") {\n return buildChallengeGuidance(subject, preservedBrowserState);\n }\n if (args.hint.constraint?.kind === \"render_required\" || args.hint.reasonCode === \"env_limited\") {\n return buildRenderGuidance(subject, preservedBrowserState, args.hint.constraint);\n }\n return undefined;\n};\n\nconst summaryPriority = (hint: ProviderIssueHint): number => {\n /* c8 ignore next -- providerLabel always passes a concrete tail string into this helper */\n if (hint.reasonCode === \"token_required\" || hint.reasonCode === \"auth_required\") return 3;\n if (hint.reasonCode === \"challenge_detected\") return 2;\n if (hint.constraint?.kind === \"render_required\") return 1;\n return 0;\n};\n\nconst summarizeRenderConstraint = (\n subject: string,\n constraint?: ProviderConstraint\n): string => {\n if (constraint?.providerShell === \"bestbuy_international_gate\") {\n return `${subject} is blocked by the Best Buy country-selection interstitial.`;\n }\n if (constraint?.providerShell === \"bestbuy_pdp_error_shell\") {\n return `${subject} is blocked by a Best Buy product-detail error shell.`;\n }\n return `${subject} requires a live browser-rendered page.`;\n};\n\nexport const summarizeProviderIssue = (args: {\n provider?: string;\n hint: ProviderIssueHint;\n}): string => {\n const subject = providerLabel(args.provider);\n if (args.hint.reasonCode === \"token_required\" || args.hint.reasonCode === \"auth_required\") {\n return `${subject} requires login or an existing session.`;\n }\n if (args.hint.reasonCode === \"challenge_detected\") {\n return `${subject} hit an anti-bot challenge that requires manual completion.`;\n }\n if (args.hint.constraint?.kind === \"render_required\") {\n return summarizeRenderConstraint(subject, args.hint.constraint);\n }\n return `${subject} requires manual browser follow-up; this run did not determine whether login or page rendering is required.`;\n};\n\nexport const summarizePrimaryProviderIssue = (\n failures: Array<{ provider?: string; error?: { reasonCode?: unknown; code?: unknown; message?: unknown; details?: Record<string, unknown> } }> | undefined\n): ProviderIssueSummary | null => {\n if (!Array.isArray(failures) || failures.length === 0) return null;\n let best: ProviderIssueSummary | null = null;\n\n for (const failure of failures) {\n const hint = readProviderIssueHint({\n reasonCode: failure.error?.reasonCode,\n code: failure.error?.code,\n message: failure.error?.message,\n details: failure.error?.details\n });\n if (!hint) continue;\n const summary = summarizeProviderIssue({ provider: failure.provider, hint });\n const guidance = buildProviderIssueGuidance({\n provider: failure.provider,\n hint,\n details: failure.error?.details as Record<string, JsonValue> | undefined\n });\n const candidate: ProviderIssueSummary = {\n provider: failure.provider,\n summary,\n ...hint,\n ...(guidance ? { guidance } : {})\n };\n if (!best || summaryPriority(candidate) > summaryPriority(best)) {\n best = candidate;\n }\n }\n\n return best;\n};\n"],"mappings":"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","names":["console"]}
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  parseOptionalStringFlag
3
- } from "./chunk-RPXWUCQQ.js";
3
+ } from "./chunk-SKFB5ICF.js";
4
4
  import {
5
5
  createUsageError
6
- } from "./chunk-IPE7TF2P.js";
6
+ } from "./chunk-7BNU6DFI.js";
7
7
  import {
8
8
  isChallengeAutomationMode
9
- } from "./chunk-4BEJVZRK.js";
9
+ } from "./chunk-FBKPDILE.js";
10
10
 
11
11
  // src/cli/commands/challenge-automation-mode.ts
12
12
  function parseOptionalChallengeAutomationMode(rawArgs) {
@@ -23,4 +23,4 @@ function parseOptionalChallengeAutomationMode(rawArgs) {
23
23
  export {
24
24
  parseOptionalChallengeAutomationMode
25
25
  };
26
- //# sourceMappingURL=chunk-PPUWQKIC.js.map
26
+ //# sourceMappingURL=chunk-52ZIOWVU.js.map
@@ -5,16 +5,18 @@ var EXIT_EXECUTION = 2;
5
5
  var EXIT_DISCONNECTED = 10;
6
6
  var CliError = class extends Error {
7
7
  exitCode;
8
- constructor(message, exitCode) {
8
+ reason;
9
+ constructor(message, exitCode, reason) {
9
10
  super(message);
10
11
  this.exitCode = exitCode;
12
+ this.reason = reason;
11
13
  }
12
14
  };
13
15
  function createUsageError(message) {
14
16
  return new CliError(message, EXIT_USAGE);
15
17
  }
16
- function createDisconnectedError(message) {
17
- return new CliError(message, EXIT_DISCONNECTED);
18
+ function createDisconnectedError(message, reason) {
19
+ return new CliError(message, EXIT_DISCONNECTED, reason);
18
20
  }
19
21
  function toCliError(error, fallbackExitCode = EXIT_EXECUTION) {
20
22
  if (error instanceof CliError) {
@@ -27,7 +29,8 @@ function formatErrorPayload(error) {
27
29
  return {
28
30
  success: false,
29
31
  error: error.message,
30
- exitCode: error.exitCode
32
+ exitCode: error.exitCode,
33
+ ...error.reason ? { reason: error.reason } : {}
31
34
  };
32
35
  }
33
36
  function resolveExitCode(result) {
@@ -51,4 +54,4 @@ export {
51
54
  formatErrorPayload,
52
55
  resolveExitCode
53
56
  };
54
- //# sourceMappingURL=chunk-IPE7TF2P.js.map
57
+ //# sourceMappingURL=chunk-7BNU6DFI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/errors.ts"],"sourcesContent":["import type { CommandResult } from \"./commands/types\";\n\nexport const EXIT_SUCCESS = 0;\nexport const EXIT_USAGE = 1;\nexport const EXIT_EXECUTION = 2;\nexport const EXIT_DISCONNECTED = 10;\n\nexport class CliError extends Error {\n exitCode: number;\n reason?: string;\n\n constructor(message: string, exitCode: number, reason?: string) {\n super(message);\n this.exitCode = exitCode;\n this.reason = reason;\n }\n}\n\nexport function createUsageError(message: string): CliError {\n return new CliError(message, EXIT_USAGE);\n}\n\nexport function createDisconnectedError(message: string, reason?: string): CliError {\n return new CliError(message, EXIT_DISCONNECTED, reason);\n}\n\nexport function toCliError(error: unknown, fallbackExitCode = EXIT_EXECUTION): CliError {\n if (error instanceof CliError) {\n return error;\n }\n const message = error instanceof Error ? error.message : String(error);\n return new CliError(message, fallbackExitCode);\n}\n\nexport type ErrorPayload = {\n success: false;\n error: string;\n exitCode: number;\n reason?: string;\n};\n\nexport function formatErrorPayload(error: CliError): ErrorPayload {\n return {\n success: false,\n error: error.message,\n exitCode: error.exitCode,\n ...(error.reason ? { reason: error.reason } : {})\n };\n}\n\nexport function resolveExitCode(result: CommandResult): number | null {\n if (result.exitCode === null) {\n return null;\n }\n if (typeof result.exitCode === \"number\") {\n return result.exitCode;\n }\n return result.success ? EXIT_SUCCESS : EXIT_EXECUTION;\n}\n"],"mappings":";AAEO,IAAM,eAAe;AACrB,IAAM,aAAa;AACnB,IAAM,iBAAiB;AACvB,IAAM,oBAAoB;AAE1B,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC;AAAA,EACA;AAAA,EAEA,YAAY,SAAiB,UAAkB,QAAiB;AAC9D,UAAM,OAAO;AACb,SAAK,WAAW;AAChB,SAAK,SAAS;AAAA,EAChB;AACF;AAEO,SAAS,iBAAiB,SAA2B;AAC1D,SAAO,IAAI,SAAS,SAAS,UAAU;AACzC;AAEO,SAAS,wBAAwB,SAAiB,QAA2B;AAClF,SAAO,IAAI,SAAS,SAAS,mBAAmB,MAAM;AACxD;AAEO,SAAS,WAAW,OAAgB,mBAAmB,gBAA0B;AACtF,MAAI,iBAAiB,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,SAAO,IAAI,SAAS,SAAS,gBAAgB;AAC/C;AASO,SAAS,mBAAmB,OAA+B;AAChE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO,MAAM;AAAA,IACb,UAAU,MAAM;AAAA,IAChB,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,EACjD;AACF;AAEO,SAAS,gBAAgB,QAAsC;AACpE,MAAI,OAAO,aAAa,MAAM;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,OAAO,aAAa,UAAU;AACvC,WAAO,OAAO;AAAA,EAChB;AACA,SAAO,OAAO,UAAU,eAAe;AACzC;","names":[]}
@@ -60,6 +60,7 @@ var bundledSkillDirectories = [
60
60
  { name: "opendevbrowser-continuity-ledger" },
61
61
  { name: "opendevbrowser-data-extraction" },
62
62
  { name: "opendevbrowser-design-agent" },
63
+ { name: "opendevbrowser-motion-design" },
63
64
  { name: "opendevbrowser-form-testing" },
64
65
  { name: "opendevbrowser-login-automation" },
65
66
  { name: "opendevbrowser-product-presentation-asset" },
@@ -83,4 +84,4 @@ export {
83
84
  listBundledSkillDirectories,
84
85
  isBundledSkillName
85
86
  };
86
- //# sourceMappingURL=chunk-3ILXPKSJ.js.map
87
+ //# sourceMappingURL=chunk-BUVYTJZR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/package-assets.ts","../src/skills/bundled-skill-directories.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst PACKAGE_NAME = \"opendevbrowser\";\nconst SKILLS_DIR_NAME = \"skills\";\n\nlet cachedPackageRoot: string | null = null;\n\nfunction findPackageRoot(startDir: string): string | null {\n let current = startDir;\n\n while (true) {\n const pkgPath = path.join(current, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n try {\n const parsed = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\")) as { name?: string };\n if (parsed.name === PACKAGE_NAME) {\n return current;\n }\n } catch {\n void 0;\n }\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n return null;\n}\n\nexport function getPackageRoot(): string {\n if (cachedPackageRoot) {\n return cachedPackageRoot;\n }\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const packageRoot = findPackageRoot(moduleDir);\n if (!packageRoot) {\n throw new Error(`Unable to locate ${PACKAGE_NAME} package root.`);\n }\n cachedPackageRoot = packageRoot;\n return cachedPackageRoot;\n}\n\nexport function findBundledSkillsDir(): string | null {\n try {\n const skillsDir = path.join(getPackageRoot(), SKILLS_DIR_NAME);\n return fs.existsSync(skillsDir) ? skillsDir : null;\n } catch {\n return null;\n }\n}\n\nexport function getBundledSkillsDir(): string {\n const skillsDir = findBundledSkillsDir();\n if (!skillsDir) {\n throw new Error(`Bundled skills directory not found in ${PACKAGE_NAME} package.`);\n }\n return skillsDir;\n}\n","export interface BundledSkillDirectory {\n name: string;\n}\n\nexport const bundledSkillDirectories: BundledSkillDirectory[] = [\n { name: \"opendevbrowser-best-practices\" },\n { name: \"opendevbrowser-continuity-ledger\" },\n { name: \"opendevbrowser-data-extraction\" },\n { name: \"opendevbrowser-design-agent\" },\n { name: \"opendevbrowser-motion-design\" },\n { name: \"opendevbrowser-form-testing\" },\n { name: \"opendevbrowser-login-automation\" },\n { name: \"opendevbrowser-product-presentation-asset\" },\n { name: \"opendevbrowser-research\" },\n { name: \"opendevbrowser-shopping\" }\n];\n\nconst bundledSkillDirectoryByName = new Map(\n bundledSkillDirectories.map((entry) => [entry.name, entry] as const)\n);\n\nexport function listBundledSkillDirectories(): BundledSkillDirectory[] {\n return [...bundledSkillDirectories];\n}\n\nexport function getBundledSkillDirectory(name: string): BundledSkillDirectory | null {\n return bundledSkillDirectoryByName.get(name) ?? null;\n}\n\nexport function isBundledSkillName(name: string): boolean {\n return bundledSkillDirectoryByName.has(name);\n}\n"],"mappings":";AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,SAAS,qBAAqB;AAE9B,IAAM,eAAe;AACrB,IAAM,kBAAkB;AAExB,IAAI,oBAAmC;AAEvC,SAAS,gBAAgB,UAAiC;AACxD,MAAI,UAAU;AAEd,SAAO,MAAM;AACX,UAAM,UAAe,UAAK,SAAS,cAAc;AACjD,QAAO,cAAW,OAAO,GAAG;AAC1B,UAAI;AACF,cAAM,SAAS,KAAK,MAAS,gBAAa,SAAS,OAAO,CAAC;AAC3D,YAAI,OAAO,SAAS,cAAc;AAChC,iBAAO;AAAA,QACT;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,UAAM,SAAc,aAAQ,OAAO;AACnC,QAAI,WAAW,SAAS;AACtB;AAAA,IACF;AACA,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAEO,SAAS,iBAAyB;AACvC,MAAI,mBAAmB;AACrB,WAAO;AAAA,EACT;AACA,QAAM,YAAiB,aAAQ,cAAc,YAAY,GAAG,CAAC;AAC7D,QAAM,cAAc,gBAAgB,SAAS;AAC7C,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,oBAAoB,YAAY,gBAAgB;AAAA,EAClE;AACA,sBAAoB;AACpB,SAAO;AACT;AAEO,SAAS,uBAAsC;AACpD,MAAI;AACF,UAAM,YAAiB,UAAK,eAAe,GAAG,eAAe;AAC7D,WAAU,cAAW,SAAS,IAAI,YAAY;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,sBAA8B;AAC5C,QAAM,YAAY,qBAAqB;AACvC,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,yCAAyC,YAAY,WAAW;AAAA,EAClF;AACA,SAAO;AACT;;;AC3DO,IAAM,0BAAmD;AAAA,EAC9D,EAAE,MAAM,gCAAgC;AAAA,EACxC,EAAE,MAAM,mCAAmC;AAAA,EAC3C,EAAE,MAAM,iCAAiC;AAAA,EACzC,EAAE,MAAM,8BAA8B;AAAA,EACtC,EAAE,MAAM,+BAA+B;AAAA,EACvC,EAAE,MAAM,8BAA8B;AAAA,EACtC,EAAE,MAAM,kCAAkC;AAAA,EAC1C,EAAE,MAAM,4CAA4C;AAAA,EACpD,EAAE,MAAM,0BAA0B;AAAA,EAClC,EAAE,MAAM,0BAA0B;AACpC;AAEA,IAAM,8BAA8B,IAAI;AAAA,EACtC,wBAAwB,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,KAAK,CAAU;AACrE;AAEO,SAAS,8BAAuD;AACrE,SAAO,CAAC,GAAG,uBAAuB;AACpC;AAMO,SAAS,mBAAmB,MAAuB;AACxD,SAAO,4BAA4B,IAAI,IAAI;AAC7C;","names":[]}
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-MX3NFLCE.js";
15
15
  import {
16
16
  SkillLoader
17
- } from "./chunk-STGGGVYT.js";
17
+ } from "./chunk-QMHKAFYX.js";
18
18
  import {
19
19
  writeFileAtomic
20
20
  } from "./chunk-TBUCZX4A.js";
@@ -46,6 +46,8 @@ import {
46
46
  CANVAS_VALIDATION_TARGET_BLOCK_ON_CODES,
47
47
  CANVAS_VISUAL_DIRECTION_PROFILES,
48
48
  ChallengeOrchestrator,
49
+ buildCanvasCommandValidationEnvelope,
50
+ buildCanvasRepairEnvelope,
49
51
  canonicalizeUrl,
50
52
  createDefaultRuntime,
51
53
  extractStructuredContent,
@@ -53,13 +55,13 @@ import {
53
55
  resolveChallengeAutomationPolicy,
54
56
  resolveProviderRuntimePolicy,
55
57
  toSnippet
56
- } from "./chunk-4BEJVZRK.js";
58
+ } from "./chunk-FBKPDILE.js";
57
59
  import {
58
60
  buildBlockerArtifacts,
59
61
  classifyBlockerSignal,
60
62
  createLogger,
61
63
  createRequestId
62
- } from "./chunk-WHQZBUNY.js";
64
+ } from "./chunk-3WLCWHIV.js";
63
65
  import {
64
66
  ProviderRuntimeError
65
67
  } from "./chunk-FUSXMW3G.js";
@@ -29432,14 +29434,22 @@ function optionalString4(value) {
29432
29434
  }
29433
29435
 
29434
29436
  // src/canvas/guidance.ts
29435
- var PREPLAN_CANVAS_GUIDANCE = {
29437
+ var withRepairEnvelope = (guidance, envelope) => ({
29438
+ ...guidance,
29439
+ nextStepGuidance: envelope.nextStepGuidance,
29440
+ paramsExamples: envelope.paramsExamples,
29441
+ fieldExamples: envelope.fieldExamples,
29442
+ validationChecks: envelope.validationChecks,
29443
+ doNotProceedIf: envelope.doNotProceedIf
29444
+ });
29445
+ var PREPLAN_CANVAS_GUIDANCE = withRepairEnvelope({
29436
29446
  recommendedNextCommands: ["canvas.plan.set"],
29437
29447
  reason: "Handshake is complete. Submit a complete generationPlan before mutation."
29438
- };
29439
- var INVALID_PLAN_CANVAS_GUIDANCE = {
29448
+ }, buildCanvasRepairEnvelope({ reasonCode: "plan_required" }));
29449
+ var INVALID_PLAN_CANVAS_GUIDANCE = withRepairEnvelope({
29440
29450
  recommendedNextCommands: ["canvas.plan.set"],
29441
29451
  reason: "generationPlan is invalid. Submit a supported plan before mutation."
29442
- };
29452
+ }, buildCanvasRepairEnvelope({ reasonCode: "generation_plan_invalid" }));
29443
29453
  var PLAN_ACCEPTED_CANVAS_GUIDANCE = {
29444
29454
  recommendedNextCommands: ["canvas.document.patch", "canvas.preview.render", "canvas.feedback.poll", "canvas.document.save"],
29445
29455
  reason: "generationPlan is accepted. Patch the document, render the preview, inspect feedback, and save when the iteration is stable."
@@ -29482,7 +29492,12 @@ var CANVAS_REQUIRED_COMMANDS_BY_BLOCKER = {
29482
29492
  };
29483
29493
  var cloneCanvasGuidance = (guidance) => ({
29484
29494
  recommendedNextCommands: [...guidance.recommendedNextCommands],
29485
- reason: guidance.reason
29495
+ reason: guidance.reason,
29496
+ ...guidance.nextStepGuidance ? { nextStepGuidance: structuredClone(guidance.nextStepGuidance) } : {},
29497
+ ...guidance.paramsExamples ? { paramsExamples: structuredClone(guidance.paramsExamples) } : {},
29498
+ ...guidance.fieldExamples ? { fieldExamples: structuredClone(guidance.fieldExamples) } : {},
29499
+ ...guidance.validationChecks ? { validationChecks: structuredClone(guidance.validationChecks) } : {},
29500
+ ...guidance.doNotProceedIf ? { doNotProceedIf: [...guidance.doNotProceedIf] } : {}
29486
29501
  });
29487
29502
  var buildCanvasCommandGuidance = (input) => {
29488
29503
  if (input.planStatus === "invalid") {
@@ -29571,6 +29586,13 @@ var CanvasManager = class {
29571
29586
  });
29572
29587
  }
29573
29588
  async execute(command, params2 = {}) {
29589
+ const validationEnvelope = buildCanvasCommandValidationEnvelope(command, params2);
29590
+ if (validationEnvelope) {
29591
+ throw attachDetails(new Error(validationEnvelope.message), {
29592
+ code: validationEnvelope.code,
29593
+ details: validationEnvelope
29594
+ });
29595
+ }
29574
29596
  switch (command) {
29575
29597
  case "canvas.session.open":
29576
29598
  return await this.openSession(params2);
@@ -29769,10 +29791,9 @@ var CanvasManager = class {
29769
29791
  setPlan(params2) {
29770
29792
  const session = this.requireSession(params2);
29771
29793
  this.assertLease(session, params2);
29772
- const plan = requireRecord(params2.generationPlan, "generationPlan");
29773
29794
  session.planStatus = "submitted";
29774
29795
  session.preflightState = "plan_submitted";
29775
- const validation = validateGenerationPlan(plan);
29796
+ const validation = validateGenerationPlan(params2.generationPlan);
29776
29797
  if (!validation.ok) {
29777
29798
  session.planStatus = "invalid";
29778
29799
  session.preflightState = "plan_invalid";
@@ -31680,7 +31701,14 @@ var CanvasManager = class {
31680
31701
  latestRevision: session.store.getRevision(),
31681
31702
  message: "generationPlan must be accepted before mutation."
31682
31703
  };
31683
- return attachDetails(new Error(blocker.message), { code: blocker.code, blocker, details: { auditId: "CANVAS-01" } });
31704
+ return attachDetails(new Error(blocker.message), {
31705
+ code: blocker.code,
31706
+ blocker,
31707
+ details: {
31708
+ auditId: "CANVAS-01",
31709
+ ...buildCanvasRepairEnvelope({ reasonCode: "plan_required" })
31710
+ }
31711
+ });
31684
31712
  }
31685
31713
  invalidGenerationPlan(session, missingFields, issues, command = "canvas.plan.set") {
31686
31714
  const blocker = {
@@ -31696,7 +31724,13 @@ var CanvasManager = class {
31696
31724
  details: {
31697
31725
  auditId: "CANVAS-03",
31698
31726
  missingFields,
31699
- issues
31727
+ issues,
31728
+ ...buildCanvasRepairEnvelope({
31729
+ reasonCode: "generation_plan_invalid",
31730
+ missingFields,
31731
+ issues,
31732
+ message: blocker.message
31733
+ })
31700
31734
  }
31701
31735
  });
31702
31736
  }
@@ -33111,12 +33145,6 @@ function normalizeOptionalString(value) {
33111
33145
  function normalizeStringArray(value) {
33112
33146
  return Array.isArray(value) ? value.filter((entry) => typeof entry === "string" && entry.trim().length > 0) : [];
33113
33147
  }
33114
- function requireRecord(value, name) {
33115
- if (!isRecord12(value)) {
33116
- throw new Error(`Missing ${name}`);
33117
- }
33118
- return value;
33119
- }
33120
33148
  function requirePatches(value) {
33121
33149
  if (!Array.isArray(value)) {
33122
33150
  throw new Error("Missing patches");
@@ -35407,4 +35435,4 @@ export {
35407
35435
  createOpenDevBrowserCore
35408
35436
  };
35409
35437
  /* v8 ignore next -- @preserve */
35410
- //# sourceMappingURL=chunk-QOMWCRE3.js.map
35438
+ //# sourceMappingURL=chunk-EOX6U6Q4.js.map