gsd-pi 2.10.12 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (504) hide show
  1. package/dist/bundled-extension-paths.d.ts +2 -0
  2. package/dist/bundled-extension-paths.js +10 -0
  3. package/dist/loader.js +45 -28
  4. package/dist/onboarding.js +100 -0
  5. package/dist/resource-loader.js +12 -3
  6. package/dist/resources/GSD-WORKFLOW.md +661 -0
  7. package/dist/resources/agents/researcher.md +29 -0
  8. package/dist/resources/agents/scout.md +56 -0
  9. package/dist/resources/agents/worker.md +31 -0
  10. package/dist/resources/extensions/ask-user-questions.ts +289 -0
  11. package/dist/resources/extensions/async-jobs/async-bash-tool.ts +211 -0
  12. package/dist/resources/extensions/async-jobs/await-tool.ts +101 -0
  13. package/dist/resources/extensions/async-jobs/cancel-job-tool.ts +34 -0
  14. package/dist/resources/extensions/async-jobs/index.ts +133 -0
  15. package/dist/resources/extensions/async-jobs/job-manager.ts +211 -0
  16. package/dist/resources/extensions/bg-shell/index.ts +3179 -0
  17. package/dist/resources/extensions/browser-tools/BROWSER-TOOLS-V2-PROPOSAL.md +1277 -0
  18. package/dist/resources/extensions/browser-tools/capture.ts +165 -0
  19. package/dist/resources/extensions/browser-tools/core.d.ts +205 -0
  20. package/dist/resources/extensions/browser-tools/core.js +1057 -0
  21. package/dist/resources/extensions/browser-tools/evaluate-helpers.ts +184 -0
  22. package/dist/resources/extensions/browser-tools/index.ts +51 -0
  23. package/dist/resources/extensions/browser-tools/lifecycle.ts +270 -0
  24. package/dist/resources/extensions/browser-tools/package.json +24 -0
  25. package/dist/resources/extensions/browser-tools/refs.ts +264 -0
  26. package/dist/resources/extensions/browser-tools/settle.ts +197 -0
  27. package/dist/resources/extensions/browser-tools/state.ts +408 -0
  28. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +652 -0
  29. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +614 -0
  30. package/dist/resources/extensions/browser-tools/tools/assertions.ts +342 -0
  31. package/dist/resources/extensions/browser-tools/tools/forms.ts +801 -0
  32. package/dist/resources/extensions/browser-tools/tools/inspection.ts +492 -0
  33. package/dist/resources/extensions/browser-tools/tools/intent.ts +614 -0
  34. package/dist/resources/extensions/browser-tools/tools/interaction.ts +865 -0
  35. package/dist/resources/extensions/browser-tools/tools/navigation.ts +232 -0
  36. package/dist/resources/extensions/browser-tools/tools/pages.ts +303 -0
  37. package/dist/resources/extensions/browser-tools/tools/refs.ts +541 -0
  38. package/dist/resources/extensions/browser-tools/tools/screenshot.ts +83 -0
  39. package/dist/resources/extensions/browser-tools/tools/session.ts +400 -0
  40. package/dist/resources/extensions/browser-tools/tools/wait.ts +247 -0
  41. package/dist/resources/extensions/browser-tools/utils.ts +660 -0
  42. package/dist/resources/extensions/context7/index.ts +428 -0
  43. package/dist/resources/extensions/context7/package.json +11 -0
  44. package/dist/resources/extensions/get-secrets-from-user.ts +625 -0
  45. package/dist/resources/extensions/google-search/index.ts +336 -0
  46. package/dist/resources/extensions/google-search/package.json +9 -0
  47. package/dist/resources/extensions/gsd/activity-log.ts +116 -0
  48. package/dist/resources/extensions/gsd/auto.ts +3732 -0
  49. package/dist/resources/extensions/gsd/commands.ts +544 -0
  50. package/dist/resources/extensions/gsd/crash-recovery.ts +105 -0
  51. package/dist/resources/extensions/gsd/dashboard-overlay.ts +564 -0
  52. package/dist/resources/extensions/gsd/dispatch-guard.ts +78 -0
  53. package/dist/resources/extensions/gsd/docs/preferences-reference.md +278 -0
  54. package/dist/resources/extensions/gsd/doctor.ts +766 -0
  55. package/dist/resources/extensions/gsd/exit-command.ts +18 -0
  56. package/dist/resources/extensions/gsd/files.ts +857 -0
  57. package/dist/resources/extensions/gsd/git-service.ts +904 -0
  58. package/dist/resources/extensions/gsd/gitignore.ts +200 -0
  59. package/dist/resources/extensions/gsd/guided-flow.ts +1054 -0
  60. package/dist/resources/extensions/gsd/index.ts +735 -0
  61. package/dist/resources/extensions/gsd/metrics.ts +374 -0
  62. package/dist/resources/extensions/gsd/migrate/command.ts +218 -0
  63. package/dist/resources/extensions/gsd/migrate/index.ts +42 -0
  64. package/dist/resources/extensions/gsd/migrate/parser.ts +323 -0
  65. package/dist/resources/extensions/gsd/migrate/parsers.ts +624 -0
  66. package/dist/resources/extensions/gsd/migrate/preview.ts +48 -0
  67. package/dist/resources/extensions/gsd/migrate/transformer.ts +346 -0
  68. package/dist/resources/extensions/gsd/migrate/types.ts +370 -0
  69. package/dist/resources/extensions/gsd/migrate/validator.ts +55 -0
  70. package/dist/resources/extensions/gsd/migrate/writer.ts +539 -0
  71. package/dist/resources/extensions/gsd/native-git-bridge.ts +181 -0
  72. package/dist/resources/extensions/gsd/native-parser-bridge.ts +135 -0
  73. package/dist/resources/extensions/gsd/observability-validator.ts +408 -0
  74. package/dist/resources/extensions/gsd/package.json +11 -0
  75. package/dist/resources/extensions/gsd/paths.ts +339 -0
  76. package/dist/resources/extensions/gsd/post-unit-hooks.ts +449 -0
  77. package/dist/resources/extensions/gsd/preferences.ts +988 -0
  78. package/dist/resources/extensions/gsd/prompt-loader.ts +92 -0
  79. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +25 -0
  80. package/dist/resources/extensions/gsd/prompts/complete-slice.md +27 -0
  81. package/dist/resources/extensions/gsd/prompts/discuss.md +237 -0
  82. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +29 -0
  83. package/dist/resources/extensions/gsd/prompts/execute-task.md +63 -0
  84. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +3 -0
  85. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -0
  86. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +61 -0
  87. package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +3 -0
  88. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +29 -0
  89. package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +3 -0
  90. package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +13 -0
  91. package/dist/resources/extensions/gsd/prompts/guided-resume-task.md +1 -0
  92. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +78 -0
  93. package/dist/resources/extensions/gsd/prompts/plan-slice.md +55 -0
  94. package/dist/resources/extensions/gsd/prompts/queue.md +100 -0
  95. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +48 -0
  96. package/dist/resources/extensions/gsd/prompts/replan-slice.md +39 -0
  97. package/dist/resources/extensions/gsd/prompts/research-milestone.md +37 -0
  98. package/dist/resources/extensions/gsd/prompts/research-slice.md +28 -0
  99. package/dist/resources/extensions/gsd/prompts/review-migration.md +66 -0
  100. package/dist/resources/extensions/gsd/prompts/run-uat.md +109 -0
  101. package/dist/resources/extensions/gsd/prompts/system.md +190 -0
  102. package/dist/resources/extensions/gsd/prompts/worktree-merge.md +123 -0
  103. package/dist/resources/extensions/gsd/roadmap-slices.ts +50 -0
  104. package/dist/resources/extensions/gsd/session-forensics.ts +500 -0
  105. package/dist/resources/extensions/gsd/skill-discovery.ts +137 -0
  106. package/dist/resources/extensions/gsd/state.ts +569 -0
  107. package/dist/resources/extensions/gsd/templates/context.md +76 -0
  108. package/dist/resources/extensions/gsd/templates/decisions.md +8 -0
  109. package/dist/resources/extensions/gsd/templates/milestone-summary.md +73 -0
  110. package/dist/resources/extensions/gsd/templates/plan.md +131 -0
  111. package/dist/resources/extensions/gsd/templates/preferences.md +23 -0
  112. package/dist/resources/extensions/gsd/templates/project.md +31 -0
  113. package/dist/resources/extensions/gsd/templates/reassessment.md +28 -0
  114. package/dist/resources/extensions/gsd/templates/requirements.md +81 -0
  115. package/dist/resources/extensions/gsd/templates/research.md +46 -0
  116. package/dist/resources/extensions/gsd/templates/roadmap.md +118 -0
  117. package/dist/resources/extensions/gsd/templates/secrets-manifest.md +22 -0
  118. package/dist/resources/extensions/gsd/templates/slice-context.md +58 -0
  119. package/dist/resources/extensions/gsd/templates/slice-summary.md +99 -0
  120. package/dist/resources/extensions/gsd/templates/state.md +19 -0
  121. package/dist/resources/extensions/gsd/templates/task-plan.md +52 -0
  122. package/dist/resources/extensions/gsd/templates/task-summary.md +57 -0
  123. package/dist/resources/extensions/gsd/templates/uat.md +54 -0
  124. package/dist/resources/extensions/gsd/tests/activity-log-prune.test.ts +297 -0
  125. package/dist/resources/extensions/gsd/tests/activity-log-save.test.ts +127 -0
  126. package/dist/resources/extensions/gsd/tests/auto-draft-pause.test.ts +109 -0
  127. package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +45 -0
  128. package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +196 -0
  129. package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +53 -0
  130. package/dist/resources/extensions/gsd/tests/collect-from-manifest.test.ts +469 -0
  131. package/dist/resources/extensions/gsd/tests/complete-milestone.test.ts +200 -0
  132. package/dist/resources/extensions/gsd/tests/cost-projection.test.ts +134 -0
  133. package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +312 -0
  134. package/dist/resources/extensions/gsd/tests/derive-state-draft.test.ts +299 -0
  135. package/dist/resources/extensions/gsd/tests/derive-state.test.ts +660 -0
  136. package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +27 -0
  137. package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +91 -0
  138. package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +170 -0
  139. package/dist/resources/extensions/gsd/tests/doctor.test.ts +594 -0
  140. package/dist/resources/extensions/gsd/tests/draft-promotion.test.ts +169 -0
  141. package/dist/resources/extensions/gsd/tests/exit-command.test.ts +50 -0
  142. package/dist/resources/extensions/gsd/tests/git-service.test.ts +1788 -0
  143. package/dist/resources/extensions/gsd/tests/idle-recovery.test.ts +577 -0
  144. package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +580 -0
  145. package/dist/resources/extensions/gsd/tests/manifest-status.test.ts +283 -0
  146. package/dist/resources/extensions/gsd/tests/metrics-io.test.ts +176 -0
  147. package/dist/resources/extensions/gsd/tests/metrics.test.ts +188 -0
  148. package/dist/resources/extensions/gsd/tests/migrate-command.test.ts +369 -0
  149. package/dist/resources/extensions/gsd/tests/migrate-parser.test.ts +757 -0
  150. package/dist/resources/extensions/gsd/tests/migrate-transformer.test.ts +635 -0
  151. package/dist/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +414 -0
  152. package/dist/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +297 -0
  153. package/dist/resources/extensions/gsd/tests/migrate-writer.test.ts +398 -0
  154. package/dist/resources/extensions/gsd/tests/must-have-parser.test.ts +291 -0
  155. package/dist/resources/extensions/gsd/tests/network-error-fallback.test.ts +54 -0
  156. package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +66 -0
  157. package/dist/resources/extensions/gsd/tests/orphaned-branch.test.ts +353 -0
  158. package/dist/resources/extensions/gsd/tests/parsers.test.ts +1664 -0
  159. package/dist/resources/extensions/gsd/tests/plan-milestone.test.ts +133 -0
  160. package/dist/resources/extensions/gsd/tests/plan-quality-validator.test.ts +363 -0
  161. package/dist/resources/extensions/gsd/tests/post-unit-hooks.test.ts +297 -0
  162. package/dist/resources/extensions/gsd/tests/preferences-hooks.test.ts +226 -0
  163. package/dist/resources/extensions/gsd/tests/queue-draft-detection.test.ts +126 -0
  164. package/dist/resources/extensions/gsd/tests/reassess-prompt.test.ts +142 -0
  165. package/dist/resources/extensions/gsd/tests/regex-hardening.test.ts +281 -0
  166. package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +155 -0
  167. package/dist/resources/extensions/gsd/tests/remote-status.test.ts +99 -0
  168. package/dist/resources/extensions/gsd/tests/replan-slice.test.ts +493 -0
  169. package/dist/resources/extensions/gsd/tests/requirements.test.ts +106 -0
  170. package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +35 -0
  171. package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +11 -0
  172. package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +41 -0
  173. package/dist/resources/extensions/gsd/tests/run-uat.test.ts +316 -0
  174. package/dist/resources/extensions/gsd/tests/secure-env-collect.test.ts +185 -0
  175. package/dist/resources/extensions/gsd/tests/smart-entry-draft.test.ts +123 -0
  176. package/dist/resources/extensions/gsd/tests/test-helpers.ts +61 -0
  177. package/dist/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +219 -0
  178. package/dist/resources/extensions/gsd/tests/unit-runtime.test.ts +234 -0
  179. package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +75 -0
  180. package/dist/resources/extensions/gsd/tests/worktree-integration.test.ts +234 -0
  181. package/dist/resources/extensions/gsd/tests/worktree-manager.test.ts +141 -0
  182. package/dist/resources/extensions/gsd/tests/worktree.test.ts +597 -0
  183. package/dist/resources/extensions/gsd/tests/write-gate.test.ts +122 -0
  184. package/dist/resources/extensions/gsd/types.ts +296 -0
  185. package/dist/resources/extensions/gsd/unit-runtime.ts +184 -0
  186. package/dist/resources/extensions/gsd/workspace-index.ts +189 -0
  187. package/dist/resources/extensions/gsd/worktree-command.ts +845 -0
  188. package/dist/resources/extensions/gsd/worktree-manager.ts +459 -0
  189. package/dist/resources/extensions/gsd/{worktree.js → worktree.ts} +92 -61
  190. package/dist/resources/extensions/mac-tools/index.ts +852 -0
  191. package/dist/resources/extensions/mac-tools/swift-cli/Package.swift +22 -0
  192. package/dist/resources/extensions/mac-tools/swift-cli/Sources/main.swift +1318 -0
  193. package/dist/resources/extensions/mcporter/index.ts +429 -0
  194. package/dist/resources/extensions/remote-questions/config.ts +81 -0
  195. package/dist/resources/extensions/remote-questions/discord-adapter.ts +128 -0
  196. package/dist/resources/extensions/remote-questions/format.ts +163 -0
  197. package/dist/resources/extensions/remote-questions/manager.ts +192 -0
  198. package/dist/resources/extensions/remote-questions/remote-command.ts +361 -0
  199. package/dist/resources/extensions/remote-questions/slack-adapter.ts +92 -0
  200. package/dist/resources/extensions/remote-questions/status.ts +31 -0
  201. package/dist/resources/extensions/remote-questions/store.ts +77 -0
  202. package/dist/resources/extensions/remote-questions/types.ts +75 -0
  203. package/dist/resources/extensions/search-the-web/cache.ts +78 -0
  204. package/dist/resources/extensions/search-the-web/command-search-provider.ts +99 -0
  205. package/dist/resources/extensions/search-the-web/format.ts +258 -0
  206. package/dist/resources/extensions/search-the-web/http.ts +238 -0
  207. package/dist/resources/extensions/search-the-web/index.ts +65 -0
  208. package/dist/resources/extensions/search-the-web/native-search.ts +165 -0
  209. package/dist/resources/extensions/search-the-web/provider.ts +136 -0
  210. package/dist/resources/extensions/search-the-web/tavily.ts +116 -0
  211. package/dist/resources/extensions/search-the-web/tool-fetch-page.ts +581 -0
  212. package/dist/resources/extensions/search-the-web/tool-llm-context.ts +620 -0
  213. package/dist/resources/extensions/search-the-web/tool-search.ts +635 -0
  214. package/dist/resources/extensions/search-the-web/url-utils.ts +91 -0
  215. package/dist/resources/extensions/shared/bundled-extension-paths.ts +11 -0
  216. package/dist/resources/extensions/shared/confirm-ui.ts +126 -0
  217. package/dist/resources/extensions/shared/interview-ui.ts +613 -0
  218. package/dist/resources/extensions/shared/next-action-ui.ts +197 -0
  219. package/dist/resources/extensions/shared/progress-widget.ts +282 -0
  220. package/dist/resources/extensions/shared/terminal.ts +23 -0
  221. package/dist/resources/extensions/shared/thinking-widget.ts +107 -0
  222. package/dist/resources/extensions/shared/ui.ts +400 -0
  223. package/dist/resources/extensions/shared/wizard-ui.ts +551 -0
  224. package/dist/resources/extensions/slash-commands/audit.ts +88 -0
  225. package/dist/resources/extensions/slash-commands/clear.ts +10 -0
  226. package/dist/resources/extensions/slash-commands/create-extension.ts +297 -0
  227. package/dist/resources/extensions/slash-commands/create-slash-command.ts +234 -0
  228. package/dist/resources/extensions/slash-commands/index.ts +12 -0
  229. package/dist/resources/extensions/subagent/agents.ts +126 -0
  230. package/dist/resources/extensions/subagent/index.ts +1072 -0
  231. package/dist/resources/extensions/subagent/isolation.ts +498 -0
  232. package/dist/resources/extensions/ttsr/index.ts +163 -0
  233. package/dist/resources/extensions/ttsr/rule-loader.ts +121 -0
  234. package/dist/resources/extensions/ttsr/ttsr-interrupt.md +6 -0
  235. package/dist/resources/extensions/ttsr/ttsr-manager.ts +430 -0
  236. package/dist/resources/extensions/universal-config/discovery.ts +78 -0
  237. package/dist/resources/extensions/universal-config/format.ts +160 -0
  238. package/dist/resources/extensions/universal-config/index.ts +118 -0
  239. package/dist/resources/extensions/universal-config/package.json +11 -0
  240. package/dist/resources/extensions/universal-config/scanners.ts +579 -0
  241. package/dist/resources/extensions/universal-config/tests/discovery.test.ts +111 -0
  242. package/dist/resources/extensions/universal-config/tests/format.test.ts +111 -0
  243. package/dist/resources/extensions/universal-config/tests/scanners.test.ts +438 -0
  244. package/dist/resources/extensions/universal-config/tools.ts +60 -0
  245. package/dist/resources/extensions/universal-config/types.ts +116 -0
  246. package/dist/resources/extensions/voice/index.ts +271 -0
  247. package/dist/resources/extensions/voice/speech-recognizer.py +504 -0
  248. package/dist/resources/extensions/voice/speech-recognizer.swift +154 -0
  249. package/dist/resources/skills/debug-like-expert/SKILL.md +231 -0
  250. package/dist/resources/skills/debug-like-expert/references/debugging-mindset.md +253 -0
  251. package/dist/resources/skills/debug-like-expert/references/hypothesis-testing.md +373 -0
  252. package/dist/resources/skills/debug-like-expert/references/investigation-techniques.md +337 -0
  253. package/dist/resources/skills/debug-like-expert/references/verification-patterns.md +425 -0
  254. package/dist/resources/skills/debug-like-expert/references/when-to-research.md +361 -0
  255. package/dist/resources/skills/frontend-design/SKILL.md +45 -0
  256. package/dist/resources/skills/github-workflows/SKILL.md +92 -0
  257. package/dist/resources/skills/github-workflows/references/gh/SKILL.md +255 -0
  258. package/dist/resources/skills/github-workflows/references/gh/references/issue-stories.md +204 -0
  259. package/dist/resources/skills/github-workflows/references/gh/references/labels.md +170 -0
  260. package/dist/resources/skills/github-workflows/references/gh/references/milestones.md +158 -0
  261. package/dist/resources/skills/github-workflows/references/gh/references/projects-v2.md +177 -0
  262. package/dist/resources/skills/github-workflows/references/gh/scripts/experiment_cleanup.py +191 -0
  263. package/dist/resources/skills/github-workflows/references/gh/scripts/github_project_setup.py +799 -0
  264. package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
  265. package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +608 -0
  266. package/dist/resources/skills/swiftui/SKILL.md +208 -0
  267. package/dist/resources/skills/swiftui/references/animations.md +921 -0
  268. package/dist/resources/skills/swiftui/references/architecture.md +1561 -0
  269. package/dist/resources/skills/swiftui/references/layout-system.md +1186 -0
  270. package/dist/resources/skills/swiftui/references/navigation.md +1492 -0
  271. package/dist/resources/skills/swiftui/references/networking-async.md +214 -0
  272. package/dist/resources/skills/swiftui/references/performance.md +1706 -0
  273. package/dist/resources/skills/swiftui/references/platform-integration.md +204 -0
  274. package/dist/resources/skills/swiftui/references/state-management.md +1443 -0
  275. package/dist/resources/skills/swiftui/references/swiftdata.md +297 -0
  276. package/dist/resources/skills/swiftui/references/testing-debugging.md +247 -0
  277. package/dist/resources/skills/swiftui/references/uikit-appkit-interop.md +218 -0
  278. package/dist/resources/skills/swiftui/workflows/add-feature.md +191 -0
  279. package/dist/resources/skills/swiftui/workflows/build-new-app.md +311 -0
  280. package/dist/resources/skills/swiftui/workflows/debug-swiftui.md +192 -0
  281. package/dist/resources/skills/swiftui/workflows/optimize-performance.md +197 -0
  282. package/dist/resources/skills/swiftui/workflows/ship-app.md +203 -0
  283. package/dist/resources/skills/swiftui/workflows/write-tests.md +235 -0
  284. package/dist/wizard.js +1 -0
  285. package/package.json +8 -6
  286. package/packages/native/dist/fd/index.d.ts +1 -0
  287. package/packages/native/dist/fd/index.js +1 -0
  288. package/packages/native/dist/grep/index.d.ts +2 -1
  289. package/packages/native/dist/grep/index.js +1 -0
  290. package/packages/native/src/__tests__/fd.test.mjs +35 -0
  291. package/packages/native/src/__tests__/grep.test.mjs +26 -9
  292. package/packages/native/src/fd/index.ts +1 -0
  293. package/packages/native/src/grep/index.ts +3 -2
  294. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  295. package/packages/pi-agent-core/dist/agent-loop.js +169 -55
  296. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  297. package/packages/pi-agent-core/dist/agent.d.ts +13 -1
  298. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  299. package/packages/pi-agent-core/dist/agent.js +16 -0
  300. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  301. package/packages/pi-agent-core/dist/types.d.ts +91 -1
  302. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  303. package/packages/pi-agent-core/dist/types.js.map +1 -1
  304. package/packages/pi-agent-core/src/agent-loop.ts +273 -63
  305. package/packages/pi-agent-core/src/agent.ts +24 -0
  306. package/packages/pi-agent-core/src/types.ts +98 -0
  307. package/packages/pi-ai/dist/env-api-keys.js +2 -0
  308. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  309. package/packages/pi-ai/dist/models.generated.d.ts +314 -0
  310. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  311. package/packages/pi-ai/dist/models.generated.js +236 -0
  312. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  313. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  314. package/packages/pi-ai/dist/providers/google-gemini-cli.js +6 -0
  315. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  316. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  317. package/packages/pi-ai/dist/providers/openai-completions.js +2 -0
  318. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  319. package/packages/pi-ai/dist/types.d.ts +1 -1
  320. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  321. package/packages/pi-ai/dist/types.js.map +1 -1
  322. package/packages/pi-ai/src/env-api-keys.ts +2 -0
  323. package/packages/pi-ai/src/models.generated.ts +236 -0
  324. package/packages/pi-ai/src/providers/google-gemini-cli.ts +8 -0
  325. package/packages/pi-ai/src/providers/openai-completions.ts +3 -0
  326. package/packages/pi-ai/src/types.ts +2 -1
  327. package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
  328. package/packages/pi-coding-agent/dist/cli/args.js +1 -0
  329. package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +26 -0
  331. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  332. package/packages/pi-coding-agent/dist/core/agent-session.js +137 -22
  333. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +20 -0
  335. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/core/auth-storage.js +43 -0
  337. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts +51 -0
  339. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -0
  340. package/packages/pi-coding-agent/dist/core/fallback-resolver.js +119 -0
  341. package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -0
  342. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.d.ts +2 -0
  343. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.d.ts.map +1 -0
  344. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +183 -0
  345. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -0
  346. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
  347. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  348. package/packages/pi-coding-agent/dist/core/index.js +1 -0
  349. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  350. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  352. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +12 -1
  354. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/core/session-manager.js +37 -1
  356. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/core/session-manager.test.d.ts +2 -0
  358. package/packages/pi-coding-agent/dist/core/session-manager.test.d.ts.map +1 -0
  359. package/packages/pi-coding-agent/dist/core/session-manager.test.js +61 -0
  360. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -0
  361. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  362. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/settings-manager.js +47 -0
  364. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  365. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/tools/find.js +1 -0
  367. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  369. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +6 -15
  370. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts +18 -1
  372. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  373. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +46 -4
  374. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
  375. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  376. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -2
  377. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  378. package/packages/pi-coding-agent/src/cli/args.ts +1 -0
  379. package/packages/pi-coding-agent/src/core/agent-session.ts +167 -22
  380. package/packages/pi-coding-agent/src/core/auth-storage.ts +45 -0
  381. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +229 -0
  382. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +165 -0
  383. package/packages/pi-coding-agent/src/core/index.ts +1 -0
  384. package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
  385. package/packages/pi-coding-agent/src/core/session-manager.test.ts +65 -0
  386. package/packages/pi-coding-agent/src/core/session-manager.ts +51 -1
  387. package/packages/pi-coding-agent/src/core/settings-manager.ts +66 -0
  388. package/packages/pi-coding-agent/src/core/tools/find.ts +1 -0
  389. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +6 -16
  390. package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +49 -4
  391. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +28 -2
  392. package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
  393. package/packages/pi-tui/dist/autocomplete.js +3 -4
  394. package/packages/pi-tui/dist/autocomplete.js.map +1 -1
  395. package/packages/pi-tui/dist/components/editor.d.ts +7 -0
  396. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  397. package/packages/pi-tui/dist/components/editor.js +57 -50
  398. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  399. package/packages/pi-tui/src/autocomplete.ts +3 -5
  400. package/packages/pi-tui/src/components/editor.ts +70 -49
  401. package/pkg/dist/core/export-html/ansi-to-html.d.ts +22 -0
  402. package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  403. package/pkg/dist/core/export-html/ansi-to-html.js +249 -0
  404. package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -0
  405. package/pkg/dist/core/export-html/index.d.ts +37 -0
  406. package/pkg/dist/core/export-html/index.d.ts.map +1 -0
  407. package/pkg/dist/core/export-html/index.js +223 -0
  408. package/pkg/dist/core/export-html/index.js.map +1 -0
  409. package/pkg/dist/core/export-html/template.css +971 -0
  410. package/pkg/dist/core/export-html/template.html +54 -0
  411. package/pkg/dist/core/export-html/template.js +1583 -0
  412. package/pkg/dist/core/export-html/tool-renderer.d.ts +38 -0
  413. package/pkg/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  414. package/pkg/dist/core/export-html/tool-renderer.js +70 -0
  415. package/pkg/dist/core/export-html/tool-renderer.js.map +1 -0
  416. package/pkg/dist/core/export-html/vendor/highlight.min.js +1213 -0
  417. package/pkg/dist/core/export-html/vendor/marked.min.js +6 -0
  418. package/scripts/postinstall.js +30 -17
  419. package/src/resources/extensions/bg-shell/index.ts +51 -7
  420. package/src/resources/extensions/gsd/activity-log.ts +61 -14
  421. package/src/resources/extensions/gsd/auto.ts +288 -19
  422. package/src/resources/extensions/gsd/commands.ts +9 -3
  423. package/src/resources/extensions/gsd/dashboard-overlay.ts +55 -12
  424. package/src/resources/extensions/gsd/docs/preferences-reference.md +25 -0
  425. package/src/resources/extensions/gsd/doctor.ts +60 -3
  426. package/src/resources/extensions/gsd/files.ts +45 -1
  427. package/src/resources/extensions/gsd/git-service.ts +46 -41
  428. package/src/resources/extensions/gsd/guided-flow.ts +81 -9
  429. package/src/resources/extensions/gsd/index.ts +62 -1
  430. package/src/resources/extensions/gsd/native-git-bridge.ts +181 -0
  431. package/src/resources/extensions/gsd/paths.ts +35 -4
  432. package/src/resources/extensions/gsd/post-unit-hooks.ts +449 -0
  433. package/src/resources/extensions/gsd/preferences.ts +232 -1
  434. package/src/resources/extensions/gsd/prompt-loader.ts +45 -3
  435. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  436. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -3
  437. package/src/resources/extensions/gsd/prompts/discuss.md +10 -8
  438. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  439. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +3 -1
  440. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +3 -1
  441. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +3 -1
  442. package/src/resources/extensions/gsd/prompts/guided-execute-task.md +3 -1
  443. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +4 -2
  444. package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +3 -1
  445. package/src/resources/extensions/gsd/prompts/guided-research-slice.md +3 -1
  446. package/src/resources/extensions/gsd/prompts/plan-milestone.md +9 -12
  447. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -3
  448. package/src/resources/extensions/gsd/prompts/queue.md +3 -1
  449. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  450. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  451. package/src/resources/extensions/gsd/state.ts +130 -18
  452. package/src/resources/extensions/gsd/templates/context.md +1 -1
  453. package/src/resources/extensions/gsd/templates/state.md +3 -3
  454. package/src/resources/extensions/gsd/tests/activity-log-save.test.ts +127 -0
  455. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +5 -1
  456. package/src/resources/extensions/gsd/tests/doctor.test.ts +115 -1
  457. package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +6 -2
  458. package/src/resources/extensions/gsd/tests/git-service.test.ts +35 -35
  459. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +8 -8
  460. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +4 -1
  461. package/src/resources/extensions/gsd/tests/network-error-fallback.test.ts +54 -0
  462. package/src/resources/extensions/gsd/tests/orphaned-branch.test.ts +5 -5
  463. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +297 -0
  464. package/src/resources/extensions/gsd/tests/preferences-hooks.test.ts +226 -0
  465. package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +12 -0
  466. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +6 -0
  467. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +4 -4
  468. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +4 -4
  469. package/src/resources/extensions/gsd/tests/worktree.test.ts +19 -19
  470. package/src/resources/extensions/gsd/types.ts +109 -0
  471. package/src/resources/extensions/gsd/worktree-manager.ts +72 -13
  472. package/src/resources/extensions/gsd/worktree.ts +5 -4
  473. package/src/resources/extensions/search-the-web/command-search-provider.ts +8 -4
  474. package/src/resources/extensions/search-the-web/native-search.ts +32 -23
  475. package/src/resources/extensions/search-the-web/provider.ts +19 -2
  476. package/src/resources/extensions/search-the-web/tool-fetch-page.ts +62 -0
  477. package/src/resources/extensions/search-the-web/tool-llm-context.ts +62 -3
  478. package/src/resources/extensions/search-the-web/tool-search.ts +62 -3
  479. package/src/resources/extensions/shared/bundled-extension-paths.ts +11 -0
  480. package/src/resources/extensions/subagent/index.ts +2 -1
  481. package/src/resources/skills/github-workflows/SKILL.md +5 -0
  482. package/dist/resources/extensions/gsd/git-service.d.ts +0 -225
  483. package/dist/resources/extensions/gsd/git-service.js +0 -756
  484. package/dist/resources/extensions/gsd/preferences.d.ts +0 -122
  485. package/dist/resources/extensions/gsd/preferences.js +0 -616
  486. package/dist/resources/extensions/gsd/worktree.d.ts +0 -106
  487. package/dist/resources/extensions/remote-questions/config.d.ts +0 -14
  488. package/dist/resources/extensions/remote-questions/config.js +0 -68
  489. package/dist/resources/extensions/remote-questions/discord-adapter.d.ts +0 -17
  490. package/dist/resources/extensions/remote-questions/discord-adapter.js +0 -118
  491. package/dist/resources/extensions/remote-questions/format.d.ts +0 -38
  492. package/dist/resources/extensions/remote-questions/format.js +0 -119
  493. package/dist/resources/extensions/remote-questions/manager.d.ts +0 -23
  494. package/dist/resources/extensions/remote-questions/manager.js +0 -161
  495. package/dist/resources/extensions/remote-questions/remote-command.d.ts +0 -6
  496. package/dist/resources/extensions/remote-questions/remote-command.js +0 -358
  497. package/dist/resources/extensions/remote-questions/slack-adapter.d.ts +0 -15
  498. package/dist/resources/extensions/remote-questions/slack-adapter.js +0 -82
  499. package/dist/resources/extensions/remote-questions/status.d.ts +0 -9
  500. package/dist/resources/extensions/remote-questions/status.js +0 -25
  501. package/dist/resources/extensions/remote-questions/store.d.ts +0 -11
  502. package/dist/resources/extensions/remote-questions/store.js +0 -66
  503. package/dist/resources/extensions/remote-questions/types.d.ts +0 -68
  504. package/dist/resources/extensions/remote-questions/types.js +0 -4
@@ -0,0 +1,614 @@
1
+ /**
2
+ * browser-tools — Node-side unit tests
3
+ *
4
+ * Uses jiti for TypeScript imports (the resolve-ts ESM hook breaks on core.js),
5
+ * node:test for the runner, and node:assert/strict for assertions.
6
+ *
7
+ * Tests pure functions from utils.ts, state.ts accessors, evaluate-helpers.ts
8
+ * syntax, and constrainScreenshot from capture.ts.
9
+ */
10
+
11
+ const { describe, it, beforeEach } = require("node:test");
12
+ const assert = require("node:assert/strict");
13
+ const jiti = require("jiti")(__filename, { interopDefault: true, debug: false });
14
+
15
+ // ---------------------------------------------------------------------------
16
+ // Module imports via jiti
17
+ // ---------------------------------------------------------------------------
18
+
19
+ const {
20
+ parseRef,
21
+ formatVersionedRef,
22
+ staleRefGuidance,
23
+ formatCompactStateSummary,
24
+ verificationFromChecks,
25
+ verificationLine,
26
+ sanitizeArtifactName,
27
+ isCriticalResourceType,
28
+ getUrlHash,
29
+ firstErrorLine,
30
+ formatArtifactTimestamp,
31
+ } = jiti("../utils.ts");
32
+
33
+ const {
34
+ getBrowser,
35
+ setBrowser,
36
+ getContext,
37
+ setContext,
38
+ getActiveFrame,
39
+ setActiveFrame,
40
+ getSessionStartedAt,
41
+ setSessionStartedAt,
42
+ getSessionArtifactDir,
43
+ setSessionArtifactDir,
44
+ getCurrentRefMap,
45
+ setCurrentRefMap,
46
+ getRefVersion,
47
+ setRefVersion,
48
+ getRefMetadata,
49
+ setRefMetadata,
50
+ getLastActionBeforeState,
51
+ setLastActionBeforeState,
52
+ getLastActionAfterState,
53
+ setLastActionAfterState,
54
+ resetAllState,
55
+ } = jiti("../state.ts");
56
+
57
+ const { EVALUATE_HELPERS_SOURCE } = jiti("../evaluate-helpers.ts");
58
+
59
+ const { constrainScreenshot } = jiti("../capture.ts");
60
+
61
+ // ---------------------------------------------------------------------------
62
+ // utils.ts — parseRef
63
+ // ---------------------------------------------------------------------------
64
+
65
+ describe("parseRef", () => {
66
+ it("parses a valid versioned ref", () => {
67
+ const result = parseRef("@v3:e12");
68
+ assert.deepStrictEqual(result, {
69
+ key: "e12",
70
+ version: 3,
71
+ display: "@v3:e12",
72
+ });
73
+ });
74
+
75
+ it("parses a ref without leading @", () => {
76
+ const result = parseRef("v1:e5");
77
+ assert.deepStrictEqual(result, {
78
+ key: "e5",
79
+ version: 1,
80
+ display: "@v1:e5",
81
+ });
82
+ });
83
+
84
+ it("handles legacy (unversioned) format", () => {
85
+ const result = parseRef("@e7");
86
+ assert.deepStrictEqual(result, {
87
+ key: "e7",
88
+ version: null,
89
+ display: "@e7",
90
+ });
91
+ });
92
+
93
+ it("trims whitespace", () => {
94
+ const result = parseRef(" @v2:e1 ");
95
+ assert.equal(result.key, "e1");
96
+ assert.equal(result.version, 2);
97
+ });
98
+
99
+ it("is case-insensitive", () => {
100
+ const result = parseRef("@V10:E3");
101
+ assert.equal(result.key, "e3");
102
+ assert.equal(result.version, 10);
103
+ });
104
+ });
105
+
106
+ // ---------------------------------------------------------------------------
107
+ // utils.ts — formatVersionedRef
108
+ // ---------------------------------------------------------------------------
109
+
110
+ describe("formatVersionedRef", () => {
111
+ it("formats a versioned ref string", () => {
112
+ assert.equal(formatVersionedRef(5, "e3"), "@v5:e3");
113
+ });
114
+
115
+ it("formats version 0", () => {
116
+ assert.equal(formatVersionedRef(0, "e1"), "@v0:e1");
117
+ });
118
+ });
119
+
120
+ // ---------------------------------------------------------------------------
121
+ // utils.ts — staleRefGuidance
122
+ // ---------------------------------------------------------------------------
123
+
124
+ describe("staleRefGuidance", () => {
125
+ it("includes the ref display and reason", () => {
126
+ const result = staleRefGuidance("@v2:e5", "element removed");
127
+ assert.ok(result.includes("@v2:e5"));
128
+ assert.ok(result.includes("element removed"));
129
+ assert.ok(result.includes("browser_snapshot_refs"));
130
+ });
131
+ });
132
+
133
+ // ---------------------------------------------------------------------------
134
+ // utils.ts — formatCompactStateSummary
135
+ // ---------------------------------------------------------------------------
136
+
137
+ describe("formatCompactStateSummary", () => {
138
+ it("formats a compact page state into a readable summary", () => {
139
+ /** @type {import('../state.ts').CompactPageState} */
140
+ const mockState = {
141
+ url: "http://localhost:3000/dashboard",
142
+ title: "Dashboard",
143
+ focus: "input#search",
144
+ headings: ["Welcome", "Recent Activity"],
145
+ bodyText: "",
146
+ counts: {
147
+ landmarks: 3,
148
+ buttons: 5,
149
+ links: 12,
150
+ inputs: 2,
151
+ },
152
+ dialog: { count: 0, title: "" },
153
+ selectorStates: {},
154
+ };
155
+
156
+ const summary = formatCompactStateSummary(mockState);
157
+ assert.ok(summary.includes("Title: Dashboard"));
158
+ assert.ok(summary.includes("URL: http://localhost:3000/dashboard"));
159
+ assert.ok(summary.includes("3 landmarks"));
160
+ assert.ok(summary.includes("5 buttons"));
161
+ assert.ok(summary.includes("12 links"));
162
+ assert.ok(summary.includes("2 inputs"));
163
+ assert.ok(summary.includes("Focused: input#search"));
164
+ assert.ok(summary.includes('H1 "Welcome"'));
165
+ assert.ok(summary.includes('H2 "Recent Activity"'));
166
+ });
167
+
168
+ it("omits focus line when empty", () => {
169
+ const mockState = {
170
+ url: "http://example.com",
171
+ title: "Test",
172
+ focus: "",
173
+ headings: [],
174
+ bodyText: "",
175
+ counts: { landmarks: 0, buttons: 0, links: 0, inputs: 0 },
176
+ dialog: { count: 0, title: "" },
177
+ selectorStates: {},
178
+ };
179
+ const summary = formatCompactStateSummary(mockState);
180
+ assert.ok(!summary.includes("Focused:"));
181
+ });
182
+
183
+ it("includes dialog title when present", () => {
184
+ const mockState = {
185
+ url: "http://example.com",
186
+ title: "Test",
187
+ focus: "",
188
+ headings: [],
189
+ bodyText: "",
190
+ counts: { landmarks: 0, buttons: 0, links: 0, inputs: 0 },
191
+ dialog: { count: 1, title: "Confirm Delete" },
192
+ selectorStates: {},
193
+ };
194
+ const summary = formatCompactStateSummary(mockState);
195
+ assert.ok(summary.includes('Active dialog: "Confirm Delete"'));
196
+ });
197
+ });
198
+
199
+ // ---------------------------------------------------------------------------
200
+ // utils.ts — verificationFromChecks
201
+ // ---------------------------------------------------------------------------
202
+
203
+ describe("verificationFromChecks", () => {
204
+ it("returns verified=true when at least one check passes", () => {
205
+ const checks = [
206
+ { name: "url_changed", passed: true },
207
+ { name: "title_changed", passed: false },
208
+ ];
209
+ const result = verificationFromChecks(checks);
210
+ assert.equal(result.verified, true);
211
+ assert.ok(result.verificationSummary.includes("PASS"));
212
+ assert.ok(result.verificationSummary.includes("url_changed"));
213
+ assert.equal(result.retryHint, undefined);
214
+ });
215
+
216
+ it("returns verified=false when no checks pass", () => {
217
+ const checks = [
218
+ { name: "url_changed", passed: false },
219
+ { name: "title_changed", passed: false },
220
+ ];
221
+ const result = verificationFromChecks(checks, "try clicking again");
222
+ assert.equal(result.verified, false);
223
+ assert.ok(result.verificationSummary.includes("SOFT-FAIL"));
224
+ assert.equal(result.retryHint, "try clicking again");
225
+ });
226
+
227
+ it("lists multiple passing checks", () => {
228
+ const checks = [
229
+ { name: "a", passed: true },
230
+ { name: "b", passed: true },
231
+ ];
232
+ const result = verificationFromChecks(checks);
233
+ assert.ok(result.verificationSummary.includes("a"));
234
+ assert.ok(result.verificationSummary.includes("b"));
235
+ });
236
+ });
237
+
238
+ // ---------------------------------------------------------------------------
239
+ // utils.ts — verificationLine
240
+ // ---------------------------------------------------------------------------
241
+
242
+ describe("verificationLine", () => {
243
+ it("formats a verification result into a single line", () => {
244
+ const result = {
245
+ verified: true,
246
+ checks: [],
247
+ verificationSummary: "PASS (url_changed)",
248
+ };
249
+ const line = verificationLine(result);
250
+ assert.equal(line, "Verification: PASS (url_changed)");
251
+ });
252
+ });
253
+
254
+ // ---------------------------------------------------------------------------
255
+ // utils.ts — sanitizeArtifactName
256
+ // ---------------------------------------------------------------------------
257
+
258
+ describe("sanitizeArtifactName", () => {
259
+ it("passes through valid names", () => {
260
+ assert.equal(sanitizeArtifactName("my-trace", "default"), "my-trace");
261
+ });
262
+
263
+ it("replaces special characters with hyphens", () => {
264
+ assert.equal(sanitizeArtifactName("hello world!@#", "default"), "hello-world");
265
+ });
266
+
267
+ it("strips leading/trailing hyphens", () => {
268
+ assert.equal(sanitizeArtifactName(" --foo-- ", "default"), "foo");
269
+ });
270
+
271
+ it("returns fallback for empty string", () => {
272
+ assert.equal(sanitizeArtifactName("", "fallback"), "fallback");
273
+ });
274
+
275
+ it("returns fallback for whitespace-only string", () => {
276
+ assert.equal(sanitizeArtifactName(" ", "fallback"), "fallback");
277
+ });
278
+
279
+ it("returns fallback for all-special-chars string", () => {
280
+ assert.equal(sanitizeArtifactName("@#$%", "default"), "default");
281
+ });
282
+
283
+ it("preserves dots and underscores", () => {
284
+ assert.equal(sanitizeArtifactName("file_name.ext", "default"), "file_name.ext");
285
+ });
286
+ });
287
+
288
+ // ---------------------------------------------------------------------------
289
+ // utils.ts — isCriticalResourceType
290
+ // ---------------------------------------------------------------------------
291
+
292
+ describe("isCriticalResourceType", () => {
293
+ it("returns true for document", () => {
294
+ assert.equal(isCriticalResourceType("document"), true);
295
+ });
296
+
297
+ it("returns true for fetch", () => {
298
+ assert.equal(isCriticalResourceType("fetch"), true);
299
+ });
300
+
301
+ it("returns true for xhr", () => {
302
+ assert.equal(isCriticalResourceType("xhr"), true);
303
+ });
304
+
305
+ it("returns false for image", () => {
306
+ assert.equal(isCriticalResourceType("image"), false);
307
+ });
308
+
309
+ it("returns false for font", () => {
310
+ assert.equal(isCriticalResourceType("font"), false);
311
+ });
312
+
313
+ it("returns false for stylesheet", () => {
314
+ assert.equal(isCriticalResourceType("stylesheet"), false);
315
+ });
316
+
317
+ it("returns false for script", () => {
318
+ assert.equal(isCriticalResourceType("script"), false);
319
+ });
320
+ });
321
+
322
+ // ---------------------------------------------------------------------------
323
+ // utils.ts — getUrlHash
324
+ // ---------------------------------------------------------------------------
325
+
326
+ describe("getUrlHash", () => {
327
+ it("returns the hash from a URL", () => {
328
+ assert.equal(getUrlHash("http://example.com/page#section"), "#section");
329
+ });
330
+
331
+ it("returns empty string when no hash", () => {
332
+ assert.equal(getUrlHash("http://example.com/page"), "");
333
+ });
334
+
335
+ it("returns empty string for invalid URL", () => {
336
+ assert.equal(getUrlHash("not-a-url"), "");
337
+ });
338
+ });
339
+
340
+ // ---------------------------------------------------------------------------
341
+ // utils.ts — firstErrorLine
342
+ // ---------------------------------------------------------------------------
343
+
344
+ describe("firstErrorLine", () => {
345
+ it("extracts first line from an Error", () => {
346
+ const err = new Error("line1\nline2\nline3");
347
+ assert.equal(firstErrorLine(err), "line1");
348
+ });
349
+
350
+ it("handles string errors", () => {
351
+ assert.equal(firstErrorLine("something broke"), "something broke");
352
+ });
353
+
354
+ it("handles null/undefined", () => {
355
+ assert.equal(firstErrorLine(null), "unknown error");
356
+ assert.equal(firstErrorLine(undefined), "unknown error");
357
+ });
358
+
359
+ it("handles objects without message property", () => {
360
+ // {} has no .message, so falls to String({}) = "[object Object]"
361
+ assert.equal(firstErrorLine({}), "[object Object]");
362
+ });
363
+
364
+ it("handles objects with empty message", () => {
365
+ assert.equal(firstErrorLine({ message: "" }), "unknown error");
366
+ });
367
+ });
368
+
369
+ // ---------------------------------------------------------------------------
370
+ // utils.ts — formatArtifactTimestamp
371
+ // ---------------------------------------------------------------------------
372
+
373
+ describe("formatArtifactTimestamp", () => {
374
+ it("formats a timestamp into an ISO-like string with dashes", () => {
375
+ // 2024-01-15T10:30:45.123Z
376
+ const ts = new Date("2024-01-15T10:30:45.123Z").getTime();
377
+ const result = formatArtifactTimestamp(ts);
378
+ // Should replace colons and dots with dashes
379
+ assert.ok(!result.includes(":"));
380
+ assert.ok(!result.includes("."));
381
+ assert.ok(result.includes("2024-01-15"));
382
+ });
383
+ });
384
+
385
+ // ---------------------------------------------------------------------------
386
+ // evaluate-helpers.ts — EVALUATE_HELPERS_SOURCE
387
+ // ---------------------------------------------------------------------------
388
+
389
+ describe("EVALUATE_HELPERS_SOURCE", () => {
390
+ it("is a parseable string (valid JavaScript)", () => {
391
+ assert.doesNotThrow(() => {
392
+ new Function(EVALUATE_HELPERS_SOURCE);
393
+ });
394
+ });
395
+
396
+ const expectedFunctions = [
397
+ "cssPath",
398
+ "simpleHash",
399
+ "isVisible",
400
+ "isEnabled",
401
+ "inferRole",
402
+ "accessibleName",
403
+ "isInteractiveEl",
404
+ "domPath",
405
+ "selectorHints",
406
+ ];
407
+
408
+ for (const fnName of expectedFunctions) {
409
+ it(`contains assignment for pi.${fnName}`, () => {
410
+ assert.ok(
411
+ EVALUATE_HELPERS_SOURCE.includes(`pi.${fnName} = function`),
412
+ `Expected pi.${fnName} = function assignment in source`,
413
+ );
414
+ });
415
+ }
416
+ });
417
+
418
+ // ---------------------------------------------------------------------------
419
+ // state.ts — accessor round-trips
420
+ // ---------------------------------------------------------------------------
421
+
422
+ describe("state accessors", () => {
423
+ beforeEach(() => {
424
+ resetAllState();
425
+ });
426
+
427
+ it("setBrowser/getBrowser round-trip", () => {
428
+ assert.equal(getBrowser(), null);
429
+ const fakeBrowser = { close: () => {} };
430
+ setBrowser(fakeBrowser);
431
+ assert.equal(getBrowser(), fakeBrowser);
432
+ });
433
+
434
+ it("setContext/getContext round-trip", () => {
435
+ assert.equal(getContext(), null);
436
+ const fakeContext = { newPage: () => {} };
437
+ setContext(fakeContext);
438
+ assert.equal(getContext(), fakeContext);
439
+ });
440
+
441
+ it("setActiveFrame/getActiveFrame round-trip", () => {
442
+ assert.equal(getActiveFrame(), null);
443
+ const fakeFrame = { name: () => "test" };
444
+ setActiveFrame(fakeFrame);
445
+ assert.equal(getActiveFrame(), fakeFrame);
446
+ });
447
+
448
+ it("setSessionStartedAt/getSessionStartedAt round-trip", () => {
449
+ assert.equal(getSessionStartedAt(), null);
450
+ setSessionStartedAt(1234567890);
451
+ assert.equal(getSessionStartedAt(), 1234567890);
452
+ });
453
+
454
+ it("setSessionArtifactDir/getSessionArtifactDir round-trip", () => {
455
+ assert.equal(getSessionArtifactDir(), null);
456
+ setSessionArtifactDir("/tmp/artifacts");
457
+ assert.equal(getSessionArtifactDir(), "/tmp/artifacts");
458
+ });
459
+
460
+ it("setCurrentRefMap/getCurrentRefMap round-trip", () => {
461
+ assert.deepStrictEqual(getCurrentRefMap(), {});
462
+ const refMap = { e1: { ref: "e1", tag: "button" } };
463
+ setCurrentRefMap(refMap);
464
+ assert.deepStrictEqual(getCurrentRefMap(), refMap);
465
+ });
466
+
467
+ it("setRefVersion/getRefVersion round-trip", () => {
468
+ assert.equal(getRefVersion(), 0);
469
+ setRefVersion(5);
470
+ assert.equal(getRefVersion(), 5);
471
+ });
472
+
473
+ it("setRefMetadata/getRefMetadata round-trip", () => {
474
+ assert.equal(getRefMetadata(), null);
475
+ const metadata = { url: "http://test.com", timestamp: 123, interactiveOnly: true, limit: 40, version: 1 };
476
+ setRefMetadata(metadata);
477
+ assert.deepStrictEqual(getRefMetadata(), metadata);
478
+ });
479
+
480
+ it("setLastActionBeforeState/getLastActionBeforeState round-trip", () => {
481
+ assert.equal(getLastActionBeforeState(), null);
482
+ const state = { url: "http://test.com", title: "Test", focus: "", headings: [], bodyText: "", counts: { landmarks: 0, buttons: 0, links: 0, inputs: 0 }, dialog: { count: 0, title: "" }, selectorStates: {} };
483
+ setLastActionBeforeState(state);
484
+ assert.deepStrictEqual(getLastActionBeforeState(), state);
485
+ });
486
+
487
+ it("setLastActionAfterState/getLastActionAfterState round-trip", () => {
488
+ assert.equal(getLastActionAfterState(), null);
489
+ const state = { url: "http://test.com/after", title: "After", focus: "", headings: [], bodyText: "", counts: { landmarks: 0, buttons: 0, links: 0, inputs: 0 }, dialog: { count: 0, title: "" }, selectorStates: {} };
490
+ setLastActionAfterState(state);
491
+ assert.deepStrictEqual(getLastActionAfterState(), state);
492
+ });
493
+ });
494
+
495
+ // ---------------------------------------------------------------------------
496
+ // state.ts — resetAllState
497
+ // ---------------------------------------------------------------------------
498
+
499
+ describe("resetAllState", () => {
500
+ it("clears all state back to defaults", () => {
501
+ // Set various state values
502
+ setBrowser({ close: () => {} });
503
+ setContext({ newPage: () => {} });
504
+ setActiveFrame({ name: () => "frame" });
505
+ setSessionStartedAt(9999);
506
+ setSessionArtifactDir("/tmp/test");
507
+ setCurrentRefMap({ e1: {} });
508
+ setRefVersion(10);
509
+ setRefMetadata({ url: "http://x", timestamp: 1, interactiveOnly: true, limit: 40, version: 1 });
510
+ setLastActionBeforeState({ url: "before" });
511
+ setLastActionAfterState({ url: "after" });
512
+
513
+ // Reset
514
+ resetAllState();
515
+
516
+ // Verify all cleared
517
+ assert.equal(getBrowser(), null);
518
+ assert.equal(getContext(), null);
519
+ assert.equal(getActiveFrame(), null);
520
+ assert.equal(getSessionStartedAt(), null);
521
+ assert.equal(getSessionArtifactDir(), null);
522
+ assert.deepStrictEqual(getCurrentRefMap(), {});
523
+ assert.equal(getRefVersion(), 0);
524
+ assert.equal(getRefMetadata(), null);
525
+ assert.equal(getLastActionBeforeState(), null);
526
+ assert.equal(getLastActionAfterState(), null);
527
+ });
528
+ });
529
+
530
+ // ---------------------------------------------------------------------------
531
+ // capture.ts — constrainScreenshot
532
+ // ---------------------------------------------------------------------------
533
+
534
+ describe("constrainScreenshot", () => {
535
+ // Helper: create a synthetic JPEG buffer via sharp
536
+ async function createTestJpeg(width, height) {
537
+ const sharp = require("sharp");
538
+ return sharp({
539
+ create: {
540
+ width,
541
+ height,
542
+ channels: 3,
543
+ background: { r: 128, g: 128, b: 128 },
544
+ },
545
+ })
546
+ .jpeg({ quality: 80 })
547
+ .toBuffer();
548
+ }
549
+
550
+ // Helper: create a synthetic PNG buffer via sharp
551
+ async function createTestPng(width, height) {
552
+ const sharp = require("sharp");
553
+ return sharp({
554
+ create: {
555
+ width,
556
+ height,
557
+ channels: 4,
558
+ background: { r: 128, g: 128, b: 128, alpha: 1 },
559
+ },
560
+ })
561
+ .png()
562
+ .toBuffer();
563
+ }
564
+
565
+ it("passes through a small JPEG unchanged", async () => {
566
+ const buf = await createTestJpeg(800, 600);
567
+ const result = await constrainScreenshot(null, buf, "image/jpeg", 80);
568
+ // Should return the same buffer (no resize needed)
569
+ assert.equal(Buffer.isBuffer(result), true);
570
+ const sharp = require("sharp");
571
+ const meta = await sharp(result).metadata();
572
+ assert.equal(meta.width, 800);
573
+ assert.equal(meta.height, 600);
574
+ });
575
+
576
+ it("resizes an oversized JPEG within 1568px", async () => {
577
+ const buf = await createTestJpeg(3000, 2000);
578
+ const result = await constrainScreenshot(null, buf, "image/jpeg", 80);
579
+ assert.equal(Buffer.isBuffer(result), true);
580
+
581
+ const sharp = require("sharp");
582
+ const meta = await sharp(result).metadata();
583
+ // Both dimensions should be <= 1568
584
+ assert.ok(meta.width <= 1568, `width ${meta.width} should be <= 1568`);
585
+ assert.ok(meta.height <= 1568, `height ${meta.height} should be <= 1568`);
586
+ // Aspect ratio preserved: 3000/2000 = 1.5, so width = 1568, height ~= 1045
587
+ assert.equal(meta.width, 1568);
588
+ assert.ok(meta.height > 1000 && meta.height < 1100);
589
+ assert.equal(meta.format, "jpeg");
590
+ });
591
+
592
+ it("resizes an oversized PNG and returns PNG", async () => {
593
+ const buf = await createTestPng(2500, 1800);
594
+ const result = await constrainScreenshot(null, buf, "image/png", 80);
595
+ assert.equal(Buffer.isBuffer(result), true);
596
+
597
+ const sharp = require("sharp");
598
+ const meta = await sharp(result).metadata();
599
+ assert.ok(meta.width <= 1568, `width ${meta.width} should be <= 1568`);
600
+ assert.ok(meta.height <= 1568, `height ${meta.height} should be <= 1568`);
601
+ assert.equal(meta.format, "png");
602
+ });
603
+
604
+ it("handles an image where only height exceeds the limit", async () => {
605
+ const buf = await createTestJpeg(1000, 2000);
606
+ const result = await constrainScreenshot(null, buf, "image/jpeg", 80);
607
+ const sharp = require("sharp");
608
+ const meta = await sharp(result).metadata();
609
+ assert.ok(meta.width <= 1568);
610
+ assert.ok(meta.height <= 1568);
611
+ // Height was the constraining dimension
612
+ assert.equal(meta.height, 1568);
613
+ });
614
+ });