@equinor/fusion-framework-cli-plugin-copilot 2.0.2 → 2.0.4

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 (263) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/esm/commands/app/{session-logger.js → attach-session-logger.js} +16 -2
  3. package/dist/esm/commands/app/attach-session-logger.js.map +1 -0
  4. package/dist/esm/commands/app/{command.js → copilot-command.js} +22 -11
  5. package/dist/esm/commands/app/copilot-command.js.map +1 -0
  6. package/dist/esm/commands/app/{eval.js → create-session.js} +7 -5
  7. package/dist/esm/commands/app/create-session.js.map +1 -0
  8. package/dist/esm/commands/app/format-plan.js +24 -0
  9. package/dist/esm/commands/app/format-plan.js.map +1 -0
  10. package/dist/esm/commands/app/format-step-result.js +14 -0
  11. package/dist/esm/commands/app/format-step-result.js.map +1 -0
  12. package/dist/esm/commands/app/format-verdict.js +38 -0
  13. package/dist/esm/commands/app/format-verdict.js.map +1 -0
  14. package/dist/esm/commands/app/prompts/{system.dev-server.prompt.js → create-dev-server-context.js} +1 -1
  15. package/dist/esm/commands/app/prompts/create-dev-server-context.js.map +1 -0
  16. package/dist/esm/commands/app/prompts/{execute-step.prompt.js → create-execute-step-prompt.js} +1 -1
  17. package/dist/esm/commands/app/prompts/create-execute-step-prompt.js.map +1 -0
  18. package/dist/esm/commands/app/prompts/{judge.prompt.js → create-judge-prompt.js} +5 -1
  19. package/dist/esm/commands/app/prompts/create-judge-prompt.js.map +1 -0
  20. package/dist/esm/commands/app/prompts/{plan.prompt.js → create-plan-prompt.js} +1 -1
  21. package/dist/esm/commands/app/prompts/create-plan-prompt.js.map +1 -0
  22. package/dist/esm/commands/app/prompts/{step.prompt.js → create-step-prompt.js} +3 -2
  23. package/dist/esm/commands/app/prompts/create-step-prompt.js.map +1 -0
  24. package/dist/esm/commands/app/prompts/{system.prompt.js → create-system-prompt.js} +1 -1
  25. package/dist/esm/commands/app/prompts/create-system-prompt.js.map +1 -0
  26. package/dist/esm/commands/app/{login.js → run-login.js} +5 -1
  27. package/dist/esm/commands/app/run-login.js.map +1 -0
  28. package/dist/esm/commands/app/{server.js → start-app-server.js} +7 -1
  29. package/dist/esm/commands/app/start-app-server.js.map +1 -0
  30. package/dist/esm/commands/app/status-icon.js +18 -0
  31. package/dist/esm/commands/app/status-icon.js.map +1 -0
  32. package/dist/esm/commands/app/tools/{registry.js → AgentBrowserToolRegistry.js} +1 -1
  33. package/dist/esm/commands/app/tools/AgentBrowserToolRegistry.js.map +1 -0
  34. package/dist/esm/commands/app/tools/{write-file.js → create-append-file-tool.js} +5 -38
  35. package/dist/esm/commands/app/tools/create-append-file-tool.js.map +1 -0
  36. package/dist/esm/commands/app/tools/{click.js → create-click-tool.js} +1 -1
  37. package/dist/esm/commands/app/tools/create-click-tool.js.map +1 -0
  38. package/dist/esm/commands/app/tools/{errors.js → create-errors-tool.js} +1 -1
  39. package/dist/esm/commands/app/tools/create-errors-tool.js.map +1 -0
  40. package/dist/esm/commands/app/tools/{eval-js.js → create-eval-js-tool.js} +1 -1
  41. package/dist/esm/commands/app/tools/create-eval-js-tool.js.map +1 -0
  42. package/dist/esm/commands/app/tools/{fill.js → create-fill-tool.js} +1 -1
  43. package/dist/esm/commands/app/tools/create-fill-tool.js.map +1 -0
  44. package/dist/esm/commands/app/tools/{find.js → create-find-tool.js} +4 -1
  45. package/dist/esm/commands/app/tools/create-find-tool.js.map +1 -0
  46. package/dist/esm/commands/app/tools/{get-styles.js → create-get-styles-tool.js} +1 -1
  47. package/dist/esm/commands/app/tools/create-get-styles-tool.js.map +1 -0
  48. package/dist/esm/commands/app/tools/{get-url.js → create-get-url-tool.js} +1 -1
  49. package/dist/esm/commands/app/tools/create-get-url-tool.js.map +1 -0
  50. package/dist/esm/commands/app/tools/{go-back.js → create-go-back-tool.js} +1 -1
  51. package/dist/esm/commands/app/tools/create-go-back-tool.js.map +1 -0
  52. package/dist/esm/commands/app/tools/{hover.js → create-hover-tool.js} +1 -1
  53. package/dist/esm/commands/app/tools/create-hover-tool.js.map +1 -0
  54. package/dist/esm/commands/app/tools/{navigate.js → create-navigate-tool.js} +1 -1
  55. package/dist/esm/commands/app/tools/create-navigate-tool.js.map +1 -0
  56. package/dist/esm/commands/app/tools/{press-key.js → create-press-key-tool.js} +1 -1
  57. package/dist/esm/commands/app/tools/create-press-key-tool.js.map +1 -0
  58. package/dist/esm/commands/app/tools/{read-file.js → create-read-file-tool.js} +4 -2
  59. package/dist/esm/commands/app/tools/create-read-file-tool.js.map +1 -0
  60. package/dist/esm/commands/app/tools/{reload.js → create-reload-tool.js} +1 -1
  61. package/dist/esm/commands/app/tools/create-reload-tool.js.map +1 -0
  62. package/dist/esm/commands/app/tools/{screenshot.js → create-screenshot-tool.js} +7 -1
  63. package/dist/esm/commands/app/tools/create-screenshot-tool.js.map +1 -0
  64. package/dist/esm/commands/app/tools/{scroll.js → create-scroll-tool.js} +3 -1
  65. package/dist/esm/commands/app/tools/create-scroll-tool.js.map +1 -0
  66. package/dist/esm/commands/app/tools/{select.js → create-select-tool.js} +1 -1
  67. package/dist/esm/commands/app/tools/create-select-tool.js.map +1 -0
  68. package/dist/esm/commands/app/tools/{snapshot.js → create-snapshot-tool.js} +1 -1
  69. package/dist/esm/commands/app/tools/create-snapshot-tool.js.map +1 -0
  70. package/dist/esm/commands/app/tools/{type-text.js → create-type-text-tool.js} +1 -1
  71. package/dist/esm/commands/app/tools/create-type-text-tool.js.map +1 -0
  72. package/dist/esm/commands/app/tools/{wait.js → create-wait-tool.js} +5 -1
  73. package/dist/esm/commands/app/tools/create-wait-tool.js.map +1 -0
  74. package/dist/esm/commands/app/tools/create-write-file-tool.js +65 -0
  75. package/dist/esm/commands/app/tools/create-write-file-tool.js.map +1 -0
  76. package/dist/esm/commands/app/tools/index.js +19 -19
  77. package/dist/esm/commands/app/tools/index.js.map +1 -1
  78. package/dist/esm/commands/app/truncate.js +11 -0
  79. package/dist/esm/commands/app/truncate.js.map +1 -0
  80. package/dist/esm/commands/app/try-format-message.js +39 -0
  81. package/dist/esm/commands/app/try-format-message.js.map +1 -0
  82. package/dist/esm/exit-with-resolution-error.js +16 -0
  83. package/dist/esm/exit-with-resolution-error.js.map +1 -0
  84. package/dist/esm/index.js +1 -1
  85. package/dist/esm/index.js.map +1 -1
  86. package/dist/esm/resolve-eval-command-input.js +37 -0
  87. package/dist/esm/resolve-eval-command-input.js.map +1 -0
  88. package/dist/esm/resolve-eval-files.js +49 -0
  89. package/dist/esm/resolve-eval-files.js.map +1 -0
  90. package/dist/esm/utils/ab-error-message.js +34 -0
  91. package/dist/esm/utils/ab-error-message.js.map +1 -0
  92. package/dist/esm/utils/{agent-browser.js → ab.js} +3 -32
  93. package/dist/esm/utils/ab.js.map +1 -0
  94. package/dist/esm/utils/create-run-dir.js +24 -0
  95. package/dist/esm/utils/create-run-dir.js.map +1 -0
  96. package/dist/esm/utils/{process.js → helpers.js} +28 -11
  97. package/dist/esm/utils/helpers.js.map +1 -0
  98. package/dist/esm/utils/index.js +8 -5
  99. package/dist/esm/utils/index.js.map +1 -1
  100. package/dist/esm/utils/{browser-poll.js → poll-console.js} +5 -3
  101. package/dist/esm/utils/poll-console.js.map +1 -0
  102. package/dist/esm/utils/{daemon.js → reset-daemon.js} +5 -14
  103. package/dist/esm/utils/reset-daemon.js.map +1 -0
  104. package/dist/esm/utils/resolve-app-key.js +20 -0
  105. package/dist/esm/utils/resolve-app-key.js.map +1 -0
  106. package/dist/esm/utils/wait-for-server.js +26 -0
  107. package/dist/esm/utils/wait-for-server.js.map +1 -0
  108. package/dist/esm/version.js +1 -1
  109. package/dist/tsconfig.tsbuildinfo +1 -1
  110. package/dist/types/commands/app/format-plan.d.ts +8 -0
  111. package/dist/types/commands/app/format-step-result.d.ts +8 -0
  112. package/dist/types/commands/app/format-verdict.d.ts +8 -0
  113. package/dist/types/commands/app/prompts/{step.prompt.d.ts → create-step-prompt.d.ts} +1 -1
  114. package/dist/types/commands/app/status-icon.d.ts +8 -0
  115. package/dist/types/commands/app/tools/create-append-file-tool.d.ts +10 -0
  116. package/dist/types/commands/app/tools/{write-file.d.ts → create-write-file-tool.d.ts} +0 -9
  117. package/dist/types/commands/app/truncate.d.ts +8 -0
  118. package/dist/types/commands/app/try-format-message.d.ts +10 -0
  119. package/dist/types/exit-with-resolution-error.d.ts +8 -0
  120. package/dist/types/{eval-resolve.d.ts → resolve-eval-command-input.d.ts} +0 -8
  121. package/dist/types/resolve-eval-files.d.ts +8 -0
  122. package/dist/types/utils/ab-error-message.d.ts +11 -0
  123. package/dist/types/utils/{agent-browser.d.ts → ab.d.ts} +0 -13
  124. package/dist/types/utils/create-run-dir.d.ts +8 -0
  125. package/dist/types/utils/{process.d.ts → helpers.d.ts} +13 -6
  126. package/dist/types/utils/index.d.ts +8 -5
  127. package/dist/types/utils/{daemon.d.ts → reset-daemon.d.ts} +0 -5
  128. package/dist/types/utils/resolve-app-key.d.ts +9 -0
  129. package/dist/types/utils/wait-for-server.d.ts +9 -0
  130. package/dist/types/version.d.ts +1 -1
  131. package/package.json +5 -5
  132. package/src/commands/app/{session-logger.ts → attach-session-logger.ts} +15 -1
  133. package/src/commands/app/{command.ts → copilot-command.ts} +21 -12
  134. package/src/commands/app/{eval.ts → create-session.ts} +6 -4
  135. package/src/commands/app/format-plan.ts +26 -0
  136. package/src/commands/app/format-step-result.ts +16 -0
  137. package/src/commands/app/format-verdict.ts +43 -0
  138. package/src/commands/app/prompts/{judge.prompt.ts → create-judge-prompt.ts} +4 -0
  139. package/src/commands/app/prompts/{step.prompt.ts → create-step-prompt.ts} +2 -1
  140. package/src/commands/app/{login.ts → run-login.ts} +4 -0
  141. package/src/commands/app/{server.ts → start-app-server.ts} +6 -0
  142. package/src/commands/app/status-icon.ts +16 -0
  143. package/src/commands/app/tools/{write-file.ts → create-append-file-tool.ts} +4 -39
  144. package/src/commands/app/tools/{find.ts → create-find-tool.ts} +3 -0
  145. package/src/commands/app/tools/{read-file.ts → create-read-file-tool.ts} +3 -1
  146. package/src/commands/app/tools/{screenshot.ts → create-screenshot-tool.ts} +6 -0
  147. package/src/commands/app/tools/{scroll.ts → create-scroll-tool.ts} +2 -0
  148. package/src/commands/app/tools/{wait.ts → create-wait-tool.ts} +4 -0
  149. package/src/commands/app/tools/create-write-file-tool.ts +69 -0
  150. package/src/commands/app/tools/index.ts +19 -19
  151. package/src/commands/app/truncate.ts +10 -0
  152. package/src/commands/app/try-format-message.ts +42 -0
  153. package/src/exit-with-resolution-error.ts +15 -0
  154. package/src/index.ts +1 -1
  155. package/src/resolve-eval-command-input.ts +59 -0
  156. package/src/resolve-eval-files.ts +57 -0
  157. package/src/utils/ab-error-message.ts +31 -0
  158. package/src/utils/{agent-browser.ts → ab.ts} +2 -30
  159. package/src/utils/create-run-dir.ts +24 -0
  160. package/src/utils/{process.ts → helpers.ts} +28 -10
  161. package/src/utils/index.ts +8 -5
  162. package/src/utils/{browser-poll.ts → poll-console.ts} +4 -2
  163. package/src/utils/{daemon.ts → reset-daemon.ts} +4 -13
  164. package/src/utils/resolve-app-key.ts +20 -0
  165. package/src/utils/wait-for-server.ts +24 -0
  166. package/src/version.ts +1 -1
  167. package/dist/esm/commands/app/command.js.map +0 -1
  168. package/dist/esm/commands/app/eval.js.map +0 -1
  169. package/dist/esm/commands/app/format.js +0 -93
  170. package/dist/esm/commands/app/format.js.map +0 -1
  171. package/dist/esm/commands/app/login.js.map +0 -1
  172. package/dist/esm/commands/app/prompts/execute-step.prompt.js.map +0 -1
  173. package/dist/esm/commands/app/prompts/judge.prompt.js.map +0 -1
  174. package/dist/esm/commands/app/prompts/plan.prompt.js.map +0 -1
  175. package/dist/esm/commands/app/prompts/step.prompt.js.map +0 -1
  176. package/dist/esm/commands/app/prompts/system.dev-server.prompt.js.map +0 -1
  177. package/dist/esm/commands/app/prompts/system.prompt.js.map +0 -1
  178. package/dist/esm/commands/app/server.js.map +0 -1
  179. package/dist/esm/commands/app/session-logger.js.map +0 -1
  180. package/dist/esm/commands/app/tools/click.js.map +0 -1
  181. package/dist/esm/commands/app/tools/errors.js.map +0 -1
  182. package/dist/esm/commands/app/tools/eval-js.js.map +0 -1
  183. package/dist/esm/commands/app/tools/fill.js.map +0 -1
  184. package/dist/esm/commands/app/tools/find.js.map +0 -1
  185. package/dist/esm/commands/app/tools/get-styles.js.map +0 -1
  186. package/dist/esm/commands/app/tools/get-url.js.map +0 -1
  187. package/dist/esm/commands/app/tools/go-back.js.map +0 -1
  188. package/dist/esm/commands/app/tools/hover.js.map +0 -1
  189. package/dist/esm/commands/app/tools/navigate.js.map +0 -1
  190. package/dist/esm/commands/app/tools/press-key.js.map +0 -1
  191. package/dist/esm/commands/app/tools/read-file.js.map +0 -1
  192. package/dist/esm/commands/app/tools/registry.js.map +0 -1
  193. package/dist/esm/commands/app/tools/reload.js.map +0 -1
  194. package/dist/esm/commands/app/tools/screenshot.js.map +0 -1
  195. package/dist/esm/commands/app/tools/scroll.js.map +0 -1
  196. package/dist/esm/commands/app/tools/select.js.map +0 -1
  197. package/dist/esm/commands/app/tools/snapshot.js.map +0 -1
  198. package/dist/esm/commands/app/tools/type-text.js.map +0 -1
  199. package/dist/esm/commands/app/tools/wait.js.map +0 -1
  200. package/dist/esm/commands/app/tools/write-file.js.map +0 -1
  201. package/dist/esm/eval-resolve.js +0 -83
  202. package/dist/esm/eval-resolve.js.map +0 -1
  203. package/dist/esm/utils/agent-browser.js.map +0 -1
  204. package/dist/esm/utils/browser-poll.js.map +0 -1
  205. package/dist/esm/utils/daemon.js.map +0 -1
  206. package/dist/esm/utils/process.js.map +0 -1
  207. package/dist/esm/utils/server.js +0 -65
  208. package/dist/esm/utils/server.js.map +0 -1
  209. package/dist/types/commands/app/format.d.ts +0 -14
  210. package/dist/types/utils/server.d.ts +0 -26
  211. package/src/commands/app/format.ts +0 -110
  212. package/src/eval-resolve.ts +0 -113
  213. package/src/utils/server.ts +0 -66
  214. /package/dist/types/commands/app/{session-logger.d.ts → attach-session-logger.d.ts} +0 -0
  215. /package/dist/types/commands/app/{command.d.ts → copilot-command.d.ts} +0 -0
  216. /package/dist/types/commands/app/{eval.d.ts → create-session.d.ts} +0 -0
  217. /package/dist/types/commands/app/prompts/{system.dev-server.prompt.d.ts → create-dev-server-context.d.ts} +0 -0
  218. /package/dist/types/commands/app/prompts/{execute-step.prompt.d.ts → create-execute-step-prompt.d.ts} +0 -0
  219. /package/dist/types/commands/app/prompts/{judge.prompt.d.ts → create-judge-prompt.d.ts} +0 -0
  220. /package/dist/types/commands/app/prompts/{plan.prompt.d.ts → create-plan-prompt.d.ts} +0 -0
  221. /package/dist/types/commands/app/prompts/{system.prompt.d.ts → create-system-prompt.d.ts} +0 -0
  222. /package/dist/types/commands/app/{login.d.ts → run-login.d.ts} +0 -0
  223. /package/dist/types/commands/app/{server.d.ts → start-app-server.d.ts} +0 -0
  224. /package/dist/types/commands/app/tools/{registry.d.ts → AgentBrowserToolRegistry.d.ts} +0 -0
  225. /package/dist/types/commands/app/tools/{click.d.ts → create-click-tool.d.ts} +0 -0
  226. /package/dist/types/commands/app/tools/{errors.d.ts → create-errors-tool.d.ts} +0 -0
  227. /package/dist/types/commands/app/tools/{eval-js.d.ts → create-eval-js-tool.d.ts} +0 -0
  228. /package/dist/types/commands/app/tools/{fill.d.ts → create-fill-tool.d.ts} +0 -0
  229. /package/dist/types/commands/app/tools/{find.d.ts → create-find-tool.d.ts} +0 -0
  230. /package/dist/types/commands/app/tools/{get-styles.d.ts → create-get-styles-tool.d.ts} +0 -0
  231. /package/dist/types/commands/app/tools/{get-url.d.ts → create-get-url-tool.d.ts} +0 -0
  232. /package/dist/types/commands/app/tools/{go-back.d.ts → create-go-back-tool.d.ts} +0 -0
  233. /package/dist/types/commands/app/tools/{hover.d.ts → create-hover-tool.d.ts} +0 -0
  234. /package/dist/types/commands/app/tools/{navigate.d.ts → create-navigate-tool.d.ts} +0 -0
  235. /package/dist/types/commands/app/tools/{press-key.d.ts → create-press-key-tool.d.ts} +0 -0
  236. /package/dist/types/commands/app/tools/{read-file.d.ts → create-read-file-tool.d.ts} +0 -0
  237. /package/dist/types/commands/app/tools/{reload.d.ts → create-reload-tool.d.ts} +0 -0
  238. /package/dist/types/commands/app/tools/{screenshot.d.ts → create-screenshot-tool.d.ts} +0 -0
  239. /package/dist/types/commands/app/tools/{scroll.d.ts → create-scroll-tool.d.ts} +0 -0
  240. /package/dist/types/commands/app/tools/{select.d.ts → create-select-tool.d.ts} +0 -0
  241. /package/dist/types/commands/app/tools/{snapshot.d.ts → create-snapshot-tool.d.ts} +0 -0
  242. /package/dist/types/commands/app/tools/{type-text.d.ts → create-type-text-tool.d.ts} +0 -0
  243. /package/dist/types/commands/app/tools/{wait.d.ts → create-wait-tool.d.ts} +0 -0
  244. /package/dist/types/utils/{browser-poll.d.ts → poll-console.d.ts} +0 -0
  245. /package/src/commands/app/prompts/{system.dev-server.prompt.ts → create-dev-server-context.ts} +0 -0
  246. /package/src/commands/app/prompts/{execute-step.prompt.ts → create-execute-step-prompt.ts} +0 -0
  247. /package/src/commands/app/prompts/{plan.prompt.ts → create-plan-prompt.ts} +0 -0
  248. /package/src/commands/app/prompts/{system.prompt.ts → create-system-prompt.ts} +0 -0
  249. /package/src/commands/app/tools/{registry.ts → AgentBrowserToolRegistry.ts} +0 -0
  250. /package/src/commands/app/tools/{click.ts → create-click-tool.ts} +0 -0
  251. /package/src/commands/app/tools/{errors.ts → create-errors-tool.ts} +0 -0
  252. /package/src/commands/app/tools/{eval-js.ts → create-eval-js-tool.ts} +0 -0
  253. /package/src/commands/app/tools/{fill.ts → create-fill-tool.ts} +0 -0
  254. /package/src/commands/app/tools/{get-styles.ts → create-get-styles-tool.ts} +0 -0
  255. /package/src/commands/app/tools/{get-url.ts → create-get-url-tool.ts} +0 -0
  256. /package/src/commands/app/tools/{go-back.ts → create-go-back-tool.ts} +0 -0
  257. /package/src/commands/app/tools/{hover.ts → create-hover-tool.ts} +0 -0
  258. /package/src/commands/app/tools/{navigate.ts → create-navigate-tool.ts} +0 -0
  259. /package/src/commands/app/tools/{press-key.ts → create-press-key-tool.ts} +0 -0
  260. /package/src/commands/app/tools/{reload.ts → create-reload-tool.ts} +0 -0
  261. /package/src/commands/app/tools/{select.ts → create-select-tool.ts} +0 -0
  262. /package/src/commands/app/tools/{snapshot.ts → create-snapshot-tool.ts} +0 -0
  263. /package/src/commands/app/tools/{type-text.ts → create-type-text-tool.ts} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @equinor/fusion-framework-cli-plugin-copilot
2
2
 
3
+ ## 2.0.4
4
+
5
+ ### Patch Changes
6
+
7
+ - 3dcaae6: Internal: bump `chalk` from `5.6.2` to `6.0.0`. No API changes affect this repo's usage; chalk 6 raises its own Node.js requirement to `>=22`, already satisfied by this repo's `>=24` engines requirement.
8
+
9
+ ## 2.0.3
10
+
11
+ ### Patch Changes
12
+
13
+ - 80c3e4a: Internal: Consolidate five single-export utility files under `src/utils/` into `helpers.ts` to reduce file fragmentation. No change to the public API.
14
+ - 80c3e4a: Internal: added a missing intent comment for array-spread logic; no public API changes.
15
+ - 80c3e4a: Internal: add clarifying intent comments and split `eval-resolve.ts`, `utils/agent-browser.ts`, `utils/process.ts`, `utils/server.ts`, `utils/daemon.ts`, and `commands/app/format.ts` into single-export modules re-exported from the existing barrels; no public API or behavior changes.
16
+ - 80c3e4a: Internal: add clarifying intent comments throughout `commands/app/**` and split `tools/write-file.ts`'s `createAppendFileTool` into its own `tools/append-file.ts` module; no public API or behavior changes.
17
+ - 80c3e4a: Internal: renamed 53 source files across `ai-base`, `ai-chat`, `ai-index`, and `copilot` to comply with the `filename-convention` lint rule (e.g. `config.ts` → `load-fusion-ai-config.ts`, `tools/write-file.ts` → `tools/create-write-file-tool.ts`, `prompts/plan.prompt.ts` → `prompts/create-plan-prompt.ts`). No public API changes.
18
+
3
19
  ## 2.0.2
4
20
 
5
21
  ### Patch Changes
@@ -1,6 +1,6 @@
1
1
  import chalk from 'chalk';
2
2
  import ora from 'ora';
3
- import { tryFormatMessage } from './format.js';
3
+ import { tryFormatMessage } from './try-format-message.js';
4
4
  const TOOL_ICONS = {
5
5
  browser_screenshot: '📷',
6
6
  browser_navigate: '🌐',
@@ -22,7 +22,9 @@ export function attachSessionLogger(session, options) {
22
22
  const pendingTools = new Map();
23
23
  let spinner = null;
24
24
  function syncSpinner() {
25
+ // No pending tools means the spinner has nothing left to show
25
26
  if (pendingTools.size === 0) {
27
+ // Stop the spinner only if one was actually running
26
28
  if (spinner) {
27
29
  spinner.stop();
28
30
  spinner = null;
@@ -30,6 +32,7 @@ export function attachSessionLogger(session, options) {
30
32
  return;
31
33
  }
32
34
  const text = [...pendingTools.values()].join(chalk.dim(' | '));
35
+ // Reuse the existing spinner instance rather than starting a second one
33
36
  if (spinner) {
34
37
  spinner.text = text;
35
38
  }
@@ -38,6 +41,7 @@ export function attachSessionLogger(session, options) {
38
41
  }
39
42
  }
40
43
  function pauseSpinner() {
44
+ // Only stop the spinner if one is actually running
41
45
  if (spinner) {
42
46
  spinner.stop();
43
47
  spinner = null;
@@ -50,6 +54,7 @@ export function attachSessionLogger(session, options) {
50
54
  syncSpinner();
51
55
  }
52
56
  session.on((event) => {
57
+ // Dispatch on the Copilot SDK session event type to render the right log line
53
58
  switch (event.type) {
54
59
  case 'tool.execution_start': {
55
60
  const { toolCallId, toolName, arguments: args } = event.data;
@@ -62,6 +67,7 @@ export function attachSessionLogger(session, options) {
62
67
  }
63
68
  case 'tool.execution_complete': {
64
69
  const label = pendingTools.get(event.data.toolCallId);
70
+ // Only log completion for tools we actually tracked the start of
65
71
  if (label) {
66
72
  pendingTools.delete(event.data.toolCallId);
67
73
  logCompletion(label, event.data.success);
@@ -70,6 +76,7 @@ export function attachSessionLogger(session, options) {
70
76
  }
71
77
  case 'external_tool.completed': {
72
78
  const label = pendingTools.get(event.data.requestId);
79
+ // Only log completion for tools we actually tracked the start of
73
80
  if (label) {
74
81
  pendingTools.delete(event.data.requestId);
75
82
  logCompletion(label, true);
@@ -83,9 +90,11 @@ export function attachSessionLogger(session, options) {
83
90
  break;
84
91
  }
85
92
  case 'assistant.message': {
93
+ // Skip empty assistant messages (e.g. tool-only turns)
86
94
  if (event.data.content) {
87
95
  pauseSpinner();
88
96
  const formatted = tryFormatMessage(event.data.content);
97
+ // Prefer the structured plan/verdict/step-result rendering when recognised
89
98
  if (formatted) {
90
99
  console.log(formatted);
91
100
  }
@@ -107,6 +116,7 @@ export function attachSessionLogger(session, options) {
107
116
  }
108
117
  case 'permission.completed': {
109
118
  const label = pendingTools.get(event.data.requestId);
119
+ // Only log completion for permissions we actually tracked the request of
110
120
  if (label) {
111
121
  const approved = event.data.result?.kind === 'approved';
112
122
  pendingTools.delete(event.data.requestId);
@@ -116,8 +126,10 @@ export function attachSessionLogger(session, options) {
116
126
  }
117
127
  case 'session.tools_updated': {
118
128
  const negotiatedModel = event.data.model;
129
+ // Only log tooling info once the server has actually negotiated a model
119
130
  if (negotiatedModel) {
120
131
  console.log(chalk.dim(`💾 ${negotiatedModel}`));
132
+ // Warn the user when the server picked a different model than requested
121
133
  if (options?.requestedModel && negotiatedModel !== options.requestedModel) {
122
134
  console.log(chalk.yellow(`⚠️ Requested model "${options.requestedModel}" but server negotiated "${negotiatedModel}"`));
123
135
  }
@@ -141,6 +153,7 @@ export function attachSessionLogger(session, options) {
141
153
  }
142
154
  case 'session.info': {
143
155
  const { message } = event.data;
156
+ // Skip empty info events
144
157
  if (message) {
145
158
  pauseSpinner();
146
159
  console.log(chalk.dim(`ℹ️ ${message}`));
@@ -150,6 +163,7 @@ export function attachSessionLogger(session, options) {
150
163
  }
151
164
  case 'assistant.intent': {
152
165
  const { intent } = event.data;
166
+ // Skip empty intent events
153
167
  if (intent) {
154
168
  pauseSpinner();
155
169
  console.log(chalk.yellow(`🎯 ${intent}`));
@@ -166,4 +180,4 @@ export function attachSessionLogger(session, options) {
166
180
  stop: () => pauseSpinner(),
167
181
  };
168
182
  }
169
- //# sourceMappingURL=session-logger.js.map
183
+ //# sourceMappingURL=attach-session-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attach-session-logger.js","sourceRoot":"","sources":["../../../../src/commands/app/attach-session-logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAItB,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,UAAU,GAA2B;IACzC,kBAAkB,EAAE,IAAI;IACxB,gBAAgB,EAAE,IAAI;IACtB,aAAa,EAAE,IAAI;IACnB,YAAY,EAAE,GAAG;IACjB,YAAY,EAAE,IAAI;IAClB,cAAc,EAAE,IAAI;IACpB,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAuB,EACvB,OAAqC;IAErC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,IAAI,OAAO,GAAkC,IAAI,CAAC;IAElD,SAAS,WAAW;QAClB,8DAA8D;QAC9D,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC5B,oDAAoD;YACpD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/D,wEAAwE;QACxE,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACjD,CAAC;IACH,CAAC;IAED,SAAS,YAAY;QACnB,mDAAmD;QACnD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,SAAS,aAAa,CAAC,KAAa,EAAE,EAAW;QAC/C,YAAY,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;QAClC,WAAW,EAAE,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE;QACnB,8EAA8E;QAC9E,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,sBAAsB,EAAE,CAAC;gBAC5B,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;gBAC7D,MAAM,MAAM,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,QAAQ,CAAC;gBACvE,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;gBAC1C,MAAM,KAAK,GACT,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,QAAQ,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,QAAQ,EAAE,CAAC;gBACzF,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;gBACpC,WAAW,EAAE,CAAC;gBACd,MAAM;YACR,CAAC;YACD,KAAK,yBAAyB,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACtD,iEAAiE;gBACjE,IAAI,KAAK,EAAE,CAAC;oBACV,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAC3C,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC3C,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,yBAAyB,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrD,iEAAiE;gBACjE,IAAI,KAAK,EAAE,CAAC;oBACV,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC1C,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC7B,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,qBAAqB,EAAE,CAAC;gBAC3B,YAAY,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACnD,WAAW,EAAE,CAAC;gBACd,MAAM;YACR,CAAC;YACD,KAAK,mBAAmB,EAAE,CAAC;gBACzB,uDAAuD;gBACvD,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oBACvB,YAAY,EAAE,CAAC;oBACf,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACvD,2EAA2E;oBAC3E,IAAI,SAAS,EAAE,CAAC;wBACd,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBACzB,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBACvD,CAAC;oBACD,WAAW,EAAE,CAAC;gBAChB,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,sBAAsB,EAAE,CAAC;gBAC5B,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;gBACpD,MAAM,QAAQ,GACZ,iBAAiB,CAAC,IAAI,KAAK,aAAa;oBACtC,CAAC,CAAC,iBAAiB,CAAC,QAAQ;oBAC5B,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC;gBAC7B,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,QAAQ,EAAE,CAAC,CAAC;gBAC9C,WAAW,EAAE,CAAC;gBACd,MAAM;YACR,CAAC;YACD,KAAK,sBAAsB,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrD,yEAAyE;gBACzE,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,UAAU,CAAC;oBACxD,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC1C,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBACjC,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,uBAAuB,EAAE,CAAC;gBAC7B,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,KAA2B,CAAC;gBAC/D,wEAAwE;gBACxE,IAAI,eAAe,EAAE,CAAC;oBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,eAAe,EAAE,CAAC,CAAC,CAAC;oBACjD,wEAAwE;oBACxE,IAAI,OAAO,EAAE,cAAc,IAAI,eAAe,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC;wBAC1E,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,wBAAwB,OAAO,CAAC,cAAc,4BAA4B,eAAe,GAAG,CAC7F,CACF,CAAC;oBACJ,CAAC;gBACH,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,yBAAyB,CAAC;YAC/B,KAAK,cAAc,EAAE,CAAC;gBACpB,MAAM;YACR,CAAC;YACD,KAAK,yBAAyB,CAAC;YAC/B,KAAK,2BAA2B,CAAC;YACjC,KAAK,2BAA2B,CAAC;YACjC,KAAK,sBAAsB,CAAC;YAC5B,KAAK,oBAAoB,CAAC;YAC1B,KAAK,iBAAiB,CAAC;YACvB,KAAK,2BAA2B,CAAC;YACjC,KAAK,cAAc,CAAC;YACpB,KAAK,oBAAoB,EAAE,CAAC;gBAC1B,MAAM;YACR,CAAC;YACD,KAAK,cAAc,EAAE,CAAC;gBACpB,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,IAA4B,CAAC;gBACvD,yBAAyB;gBACzB,IAAI,OAAO,EAAE,CAAC;oBACZ,YAAY,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;oBACzC,WAAW,EAAE,CAAC;gBAChB,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,kBAAkB,EAAE,CAAC;gBACxB,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,IAA2B,CAAC;gBACrD,2BAA2B;gBAC3B,IAAI,MAAM,EAAE,CAAC;oBACX,YAAY,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC;oBAC1C,WAAW,EAAE,CAAC;gBAChB,CAAC;gBACD,MAAM;YACR,CAAC;YACD;gBACE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACnB,MAAM;QACV,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE;KAC3B,CAAC;AACJ,CAAC"}
@@ -1,16 +1,17 @@
1
1
  import { createCommand } from 'commander';
2
2
  import { basename } from 'node:path';
3
3
  import { resetDaemon, cleanup, createRunDir } from '../../utils/index.js';
4
- import { runLogin } from './login.js';
5
- import { resolveEvalCommandInput, resolveEvalFiles } from '../../eval-resolve.js';
6
- import { createSession } from './eval.js';
7
- import { startAppServer } from './server.js';
8
- import { attachSessionLogger } from './session-logger.js';
9
- import { formatVerdict } from './format.js';
4
+ import { runLogin } from './run-login.js';
5
+ import { resolveEvalCommandInput } from '../../resolve-eval-command-input.js';
6
+ import { resolveEvalFiles } from '../../resolve-eval-files.js';
7
+ import { createSession } from './create-session.js';
8
+ import { startAppServer } from './start-app-server.js';
9
+ import { attachSessionLogger } from './attach-session-logger.js';
10
+ import { formatVerdict } from './format-verdict.js';
10
11
  import { existsSync, readFileSync } from 'node:fs';
11
- import { createPlanPrompt } from './prompts/plan.prompt.js';
12
- import { createStepPrompt } from './prompts/step.prompt.js';
13
- import { createJudgePrompt } from './prompts/judge.prompt.js';
12
+ import { createPlanPrompt } from './prompts/create-plan-prompt.js';
13
+ import { createStepPrompt } from './prompts/create-step-prompt.js';
14
+ import { createJudgePrompt } from './prompts/create-judge-prompt.js';
14
15
  import chalk from 'chalk';
15
16
  /**
16
17
  * CLI command: `copilot app eval <path-or-eval>`
@@ -51,6 +52,7 @@ const _appEvalCommand = createCommand('eval')
51
52
  const absAppPath = resolvedInput.appPath;
52
53
  const port = parseInt(options.port, 10);
53
54
  const verbose = options.verbose;
55
+ // Reject ambiguous input that selects an eval two different ways
54
56
  if (resolvedInput.evalFile && options.eval) {
55
57
  console.error('❌ Do not combine a positional eval markdown file with --eval');
56
58
  process.exit(1);
@@ -64,7 +66,9 @@ const _appEvalCommand = createCommand('eval')
64
66
  const evalFiles = resolvedInput.evalFile
65
67
  ? [resolvedInput.evalFile]
66
68
  : resolveEvalFiles(absAppPath, options.eval);
67
- console.log(`📋 Found ${evalFiles.length} eval(s): ${evalFiles.map((f) => basename(f)).join(', ')}`);
69
+ // Summarize which eval files were discovered before the run starts
70
+ const evalFileNames = evalFiles.map((f) => basename(f)).join(', ');
71
+ console.log(`📋 Found ${evalFiles.length} eval(s): ${evalFileNames}`);
68
72
  // Start the app dev server (unless --url provides an already-running URL)
69
73
  const { serverProcess, appUrl } = await startAppServer(absAppPath, {
70
74
  port,
@@ -87,6 +91,7 @@ const _appEvalCommand = createCommand('eval')
87
91
  });
88
92
  let failures = 0;
89
93
  try {
94
+ // Run every resolved eval file sequentially so output stays readable
90
95
  for (const evalFilePath of evalFiles) {
91
96
  const evalName = basename(evalFilePath, '.md');
92
97
  const query = readFileSync(evalFilePath, 'utf-8').trim();
@@ -107,11 +112,13 @@ const _appEvalCommand = createCommand('eval')
107
112
  // ── Phase 1: Plan ──────────────────────────────────────────
108
113
  await session.sendAndWait({ prompt: createPlanPrompt(query, ctx) }, 300_000);
109
114
  const planPath = `${runDir}/plan.json`;
115
+ // Bail out of this eval when the planning phase produced no plan file
110
116
  if (!existsSync(planPath)) {
111
117
  console.error(chalk.red(`❌ Agent did not produce ${planPath}. The planning phase may have failed silently.`));
112
118
  session.disconnect();
113
119
  logger.stop();
114
120
  failures++;
121
+ // Skip execution/judging phases; this eval already failed at planning
115
122
  continue;
116
123
  }
117
124
  const plan = JSON.parse(readFileSync(planPath, 'utf-8'));
@@ -119,6 +126,7 @@ const _appEvalCommand = createCommand('eval')
119
126
  // ── Phase 2: Execute + Evaluate each step ──────────────────
120
127
  for (const step of plan.steps) {
121
128
  console.log(chalk.cyan(`\n── Scenario: ${step.scenario}`));
129
+ // Print each acceptance criterion the agent will be judged against
122
130
  for (const c of step.criteria) {
123
131
  console.log(chalk.dim(` • ${c}`));
124
132
  }
@@ -131,9 +139,11 @@ const _appEvalCommand = createCommand('eval')
131
139
  logger.stop();
132
140
  // Print the verdict
133
141
  const verdictPath = `${runDir}/verdict.json`;
142
+ // Only report a verdict when the judge phase actually produced one
134
143
  if (existsSync(verdictPath)) {
135
144
  const verdict = JSON.parse(readFileSync(verdictPath, 'utf-8'));
136
145
  console.log(formatVerdict(verdict));
146
+ // A failing verdict counts toward the overall exit-code failure total
137
147
  if (!verdict.pass)
138
148
  failures++;
139
149
  }
@@ -146,6 +156,7 @@ const _appEvalCommand = createCommand('eval')
146
156
  logger?.stop();
147
157
  const msg = err instanceof Error ? err.message : String(err);
148
158
  console.error(chalk.red(`\n❌ Eval "${evalName}" failed: ${msg}`));
159
+ // Print the stack trace too when one is available for debugging
149
160
  if (err instanceof Error && err.stack) {
150
161
  console.error(chalk.dim(err.stack));
151
162
  }
@@ -173,4 +184,4 @@ const _appCommand = createCommand('app')
173
184
  export const copilotCommand = createCommand('copilot')
174
185
  .description('GitHub Copilot SDK powered commands')
175
186
  .addCommand(_appCommand);
176
- //# sourceMappingURL=command.js.map
187
+ //# sourceMappingURL=copilot-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-command.js","sourceRoot":"","sources":["../../../../src/commands/app/copilot-command.ts"],"names":[],"mappings":"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"}
@@ -2,10 +2,11 @@ import { mkdirSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  import { ab, abErrorMessage } from '../../utils/index.js';
4
4
  import { createAgentBrowserTools } from './tools/index.js';
5
- import { createWriteFileTool, createAppendFileTool } from './tools/write-file.js';
6
- import { createReadFileTool } from './tools/read-file.js';
7
- import { createSystemPrompt } from './prompts/system.prompt.js';
8
- import { createDevServerContext } from './prompts/system.dev-server.prompt.js';
5
+ import { createWriteFileTool } from './tools/create-write-file-tool.js';
6
+ import { createAppendFileTool } from './tools/create-append-file-tool.js';
7
+ import { createReadFileTool } from './tools/create-read-file-tool.js';
8
+ import { createSystemPrompt } from './prompts/create-system-prompt.js';
9
+ import { createDevServerContext } from './prompts/create-dev-server-context.js';
9
10
  /**
10
11
  * Lazily imports the Copilot SDK to avoid module resolution errors at CLI startup.
11
12
  *
@@ -27,6 +28,7 @@ export const createSession = async (options) => {
27
28
  createWriteFileTool(ctx.outDir, defineTool),
28
29
  createAppendFileTool(ctx.outDir, defineTool),
29
30
  ];
31
+ // Combine built-in browser and file tools with any caller-supplied tools
30
32
  const tools = [
31
33
  ...createBrowserTools(defineTool, {
32
34
  cwd: ctx.outDir,
@@ -89,4 +91,4 @@ function createBrowserTools(defineTool, options) {
89
91
  };
90
92
  return createAgentBrowserTools({ outDir, invoke }, defineTool);
91
93
  }
92
- //# sourceMappingURL=eval.js.map
94
+ //# sourceMappingURL=create-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-session.js","sourceRoot":"","sources":["../../../../src/commands/app/create-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import chalk from 'chalk';
2
+ import { truncate } from './truncate.js';
3
+ /**
4
+ * Renders a structured plan as a human-readable summary.
5
+ *
6
+ * @param plan - The plan to render, containing a summary and ordered steps.
7
+ * @returns A multi-line string suitable for console output.
8
+ */
9
+ export function formatPlan(plan) {
10
+ const lines = [
11
+ '',
12
+ chalk.bold(`📋 ${plan.summary}`),
13
+ '',
14
+ ...plan.steps.flatMap((s, si) => [
15
+ ` ${chalk.dim(`${si + 1}.`)} ${s.scenario}`,
16
+ ...s.criteria
17
+ // Truncate each criterion so long descriptions don't wrap the terminal
18
+ .map((c) => chalk.dim(` • ${truncate(c, 70)}`)),
19
+ ]),
20
+ '',
21
+ ];
22
+ return lines.join('\n');
23
+ }
24
+ //# sourceMappingURL=format-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-plan.js","sourceRoot":"","sources":["../../../../src/commands/app/format-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAU;IACnC,MAAM,KAAK,GAAG;QACZ,EAAE;QACF,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAChC,EAAE;QACF,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;YAC/B,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;YAC5C,GAAG,CAAC,CAAC,QAAQ;gBACX,uEAAuE;iBACtE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;SACtD,CAAC;QACF,EAAE;KACH,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,14 @@
1
+ import chalk from 'chalk';
2
+ import { statusIcon } from './status-icon.js';
3
+ /**
4
+ * Renders a single step execution result.
5
+ *
6
+ * @param result - The step result to render, including its outcome, note, and evidence.
7
+ * @returns A formatted two-line string describing the step outcome.
8
+ */
9
+ export function formatStepResult(result) {
10
+ const icon = statusIcon(result.ok);
11
+ const files = result.evidence.length ? chalk.dim(` [${result.evidence.join(', ')}]`) : '';
12
+ return ` ${icon} ${result.criterion}\n${chalk.dim(` ${result.note}`)}${files}`;
13
+ }
14
+ //# sourceMappingURL=format-step-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-step-result.js","sourceRoot":"","sources":["../../../../src/commands/app/format-step-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAkB;IACjD,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,OAAO,KAAK,IAAI,KAAK,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC;AACvF,CAAC"}
@@ -0,0 +1,38 @@
1
+ import chalk from 'chalk';
2
+ import { statusIcon } from './status-icon.js';
3
+ /**
4
+ * Renders the final verdict as a full-width coloured report.
5
+ *
6
+ * @param verdict - The verdict to render, including per-step results, reasoning, and UX feedback.
7
+ * @returns A multi-line string suitable for console output.
8
+ */
9
+ export function formatVerdict(verdict) {
10
+ const bar = '═'.repeat(60);
11
+ const banner = verdict.pass
12
+ ? chalk.bgGreen.black.bold(' ✅ PASS ')
13
+ : chalk.bgRed.white.bold(' ❌ FAIL ');
14
+ const lines = [
15
+ '',
16
+ bar,
17
+ ` ${banner}`,
18
+ bar,
19
+ '',
20
+ ...verdict.steps
21
+ // Render each step's outcome as a status glyph, criterion, and note
22
+ .map((s) => ` ${statusIcon(s.ok)} ${s.criterion}\n${chalk.dim(` ${s.note}`)}`),
23
+ '',
24
+ chalk.dim(` ${verdict.reasoning}`),
25
+ '',
26
+ ];
27
+ // Append optional UX feedback only when the judge actually provided any
28
+ if (verdict.ux && verdict.ux.length > 0) {
29
+ lines.push(chalk.bold(' 💡 UX Feedback'), '');
30
+ // List every UX hint as its own bullet line
31
+ for (const hint of verdict.ux) {
32
+ lines.push(chalk.yellow(` • ${hint}`));
33
+ }
34
+ lines.push('');
35
+ }
36
+ return lines.join('\n');
37
+ }
38
+ //# sourceMappingURL=format-verdict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-verdict.js","sourceRoot":"","sources":["../../../../src/commands/app/format-verdict.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI;QACzB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;QACtC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEvC,MAAM,KAAK,GAAG;QACZ,EAAE;QACF,GAAG;QACH,KAAK,MAAM,EAAE;QACb,GAAG;QACH,EAAE;QACF,GAAG,OAAO,CAAC,KAAK;YACd,oEAAoE;aACnE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACtF,EAAE;QACF,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;QACnC,EAAE;KACH,CAAC;IAEF,wEAAwE;IACxE,IAAI,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,4CAA4C;QAC5C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -18,4 +18,4 @@ Fusion dev-server DOM:
18
18
  - URL pattern: /apps/{appKey} → ${ctx.url}
19
19
  `.trim();
20
20
  };
21
- //# sourceMappingURL=system.dev-server.prompt.js.map
21
+ //# sourceMappingURL=create-dev-server-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-dev-server-context.js","sourceRoot":"","sources":["../../../../../src/commands/app/prompts/create-dev-server-context.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAA4B,EAAU,EAAE;IAC7E,OAAO;;;;;;kCAMyB,GAAG,CAAC,GAAG;GACtC,CAAC,IAAI,EAAE,CAAC;AACX,CAAC,CAAC"}
@@ -41,4 +41,4 @@ When done, your work will be evaluated against the step's passEvidence and failE
41
41
  Do NOT output markdown or explanations — only use browser tool calls and collect evidence.
42
42
  `.trim();
43
43
  };
44
- //# sourceMappingURL=execute-step.prompt.js.map
44
+ //# sourceMappingURL=create-execute-step-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-execute-step-prompt.js","sourceRoot":"","sources":["../../../../../src/commands/app/prompts/create-execute-step-prompt.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,OAAiB,EACjB,GAA4B,EACpB,EAAE;IACV,OAAO;;;WAGE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;;mBAExB,GAAG,CAAC,GAAG;sBACJ,GAAG,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;GAuB7B,CAAC,IAAI,EAAE,CAAC;AACX,CAAC,CAAC"}
@@ -15,6 +15,7 @@ function collectEvidence(outDir) {
15
15
  const parts = [];
16
16
  // ── executions.jsonl ──
17
17
  const execPath = join(outDir, 'executions.jsonl');
18
+ // Fall back to a placeholder note when the executions log is missing
18
19
  if (existsSync(execPath)) {
19
20
  parts.push('### executions.jsonl', readFileSync(execPath, 'utf-8').trim());
20
21
  }
@@ -23,10 +24,13 @@ function collectEvidence(outDir) {
23
24
  }
24
25
  // ── evidence/ directory ──
25
26
  const evidenceDir = join(outDir, 'evidence');
27
+ // Only scan for evidence files when the directory actually exists
26
28
  if (existsSync(evidenceDir)) {
27
29
  const files = readdirSync(evidenceDir).sort();
30
+ // Inline readable text evidence; list binary evidence by name only
28
31
  for (const file of files) {
29
32
  const ext = extname(file).toLowerCase();
33
+ // Inline the content of readable text extensions; list other files by name only
30
34
  if (TEXT_EXTENSIONS.has(ext)) {
31
35
  const content = readFileSync(join(evidenceDir, file), 'utf-8').trim();
32
36
  parts.push(`### evidence/${file}`, content);
@@ -113,4 +117,4 @@ Only include genuine observations from the evidence. Skip "ux" if nothing stands
113
117
  If evidence for a criterion is missing or ambiguous, fail it.
114
118
  `.trim();
115
119
  };
116
- //# sourceMappingURL=judge.prompt.js.map
120
+ //# sourceMappingURL=create-judge-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-judge-prompt.js","sourceRoot":"","sources":["../../../../../src/commands/app/prompts/create-judge-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG1C,iEAAiE;AACjE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAEtF;;;;;;;;GAQG;AACH,SAAS,eAAe,CAAC,MAAc;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,yBAAyB;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAClD,qEAAqE;IACrE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,CAAC;IACzD,CAAC;IAED,4BAA4B;IAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC7C,kEAAkE;IAClE,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,mEAAmE;QACnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YACxC,gFAAgF;YAChF,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;gBACtE,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,EAAE,kBAAkB,GAAG,cAAc,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAA4B,EAAU,EAAE;IACxE,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAE7C,OAAO;;;;;;EAMP,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDP,CAAC,IAAI,EAAE,CAAC;AACX,CAAC,CAAC"}
@@ -44,4 +44,4 @@ Rules:
44
44
  - Keep criteria directly traceable to the spec. Do NOT invent criteria.
45
45
  `.trim();
46
46
  };
47
- //# sourceMappingURL=plan.prompt.js.map
47
+ //# sourceMappingURL=create-plan-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-plan-prompt.js","sourceRoot":"","sources":["../../../../../src/commands/app/prompts/create-plan-prompt.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAE,GAA4B,EAAU,EAAE;IACtF,OAAO;;;EAGP,KAAK;;mBAEY,GAAG,CAAC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BvB,CAAC,IAAI,EAAE,CAAC;AACX,CAAC,CAAC"}
@@ -8,8 +8,9 @@
8
8
  * @param ctx - Runtime context with output directory and app URL
9
9
  * @returns The fully interpolated prompt string
10
10
  */
11
- export const createStepPrompt = (step, ctx) => {
11
+ export const createStepPrompt = (step, _ctx) => {
12
12
  const slug = slugify(step.scenario);
13
+ // Render each criterion with its expected pass/fail evidence for the prompt
13
14
  const criteriaBlock = step.criteria
14
15
  .map((c, i) => `${i + 1}. ${c}\n Pass: ${step.pass[i] ?? ''}\n Fail: ${step.fail[i] ?? ''}`)
15
16
  .join('\n');
@@ -39,4 +40,4 @@ function slugify(text) {
39
40
  .replace(/^-|-$/g, '')
40
41
  .slice(0, 60);
41
42
  }
42
- //# sourceMappingURL=step.prompt.js.map
43
+ //# sourceMappingURL=create-step-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-step-prompt.js","sourceRoot":"","sources":["../../../../../src/commands/app/prompts/create-step-prompt.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAc,EAAE,IAA6B,EAAU,EAAE;IACxF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpC,4EAA4E;IAC5E,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,cAAc,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;SAC/F,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;YACG,IAAI,CAAC,QAAQ;;;EAGvB,aAAa;;;2CAG4B,IAAI;;;kGAGmD,IAAI;GACnG,CAAC,IAAI,EAAE,CAAC;AACX,CAAC,CAAC;AAEF;;;;;GAKG;AACH,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -74,4 +74,4 @@ and file tools throughout.
74
74
  - Never fabricate evidence. If a tool call fails, report the failure honestly.
75
75
  `.trim();
76
76
  };
77
- //# sourceMappingURL=system.prompt.js.map
77
+ //# sourceMappingURL=create-system-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-system-prompt.js","sourceRoot":"","sources":["../../../../../src/commands/app/prompts/create-system-prompt.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAA4B,EAAU,EAAE;IACzE,OAAO;;;;0BAIiB,GAAG,CAAC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2D9B,CAAC,IAAI,EAAE,CAAC;AACX,CAAC,CAAC"}
@@ -17,11 +17,13 @@ import { ab, resolveAppKey, cleanup, resetDaemon, sleep, stripAnsi, waitForServe
17
17
  */
18
18
  export async function runLogin(absAppPath, port, host) {
19
19
  const pkgJsonPath = join(absAppPath, 'package.json');
20
+ // Login needs a valid Fusion app directory; bail out clearly if this isn't one
20
21
  if (!existsSync(pkgJsonPath)) {
21
22
  console.error(`❌ No package.json found at ${absAppPath}`);
22
23
  process.exit(1);
23
24
  }
24
25
  const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
26
+ // The app name is required to resolve the appKey later
25
27
  if (!pkgJson.name) {
26
28
  console.error(`❌ package.json at ${absAppPath} has no "name" field`);
27
29
  process.exit(1);
@@ -37,6 +39,7 @@ export async function runLogin(absAppPath, port, host) {
37
39
  });
38
40
  const serverUrl = `http://localhost:${port}`;
39
41
  const ready = await waitForServer(serverUrl, 60);
42
+ // Abort login when the dev server never comes up within the timeout
40
43
  if (!ready) {
41
44
  console.error('❌ Server failed to start within 60s');
42
45
  cleanup(serverProcess);
@@ -57,6 +60,7 @@ export async function runLogin(absAppPath, port, host) {
57
60
  // Wait for the Fusion app to initialise (browser console emits "✓ Done" after auth)
58
61
  console.log('⏳ Waiting for app to initialize after login... (Ctrl+C to finish early)');
59
62
  const initialized = await pollConsole((logs) => stripAnsi(logs).includes('Done'), 300_000);
63
+ // Report success or a soft timeout without failing the login flow
60
64
  if (initialized) {
61
65
  await sleep(2000);
62
66
  console.log('✅ Login complete — session saved.');
@@ -68,4 +72,4 @@ export async function runLogin(absAppPath, port, host) {
68
72
  console.log('🌐 Browser still open. Press Ctrl+C to exit.');
69
73
  await new Promise(() => { }); // block until SIGINT
70
74
  }
71
- //# sourceMappingURL=login.js.map
75
+ //# sourceMappingURL=run-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-login.js","sourceRoot":"","sources":["../../../../src/commands/app/run-login.ts"],"names":[],"mappings":"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"}
@@ -12,10 +12,12 @@ import { resolveAppKey, cleanup, waitForServer } from '../../utils/index.js';
12
12
  */
13
13
  function freePort(port) {
14
14
  try {
15
+ // Drop the empty string lsof emits when no matching process was found
15
16
  const pids = execSync(`lsof -ti tcp:${port}`, { encoding: 'utf-8' })
16
17
  .trim()
17
18
  .split('\n')
18
19
  .filter(Boolean);
20
+ // Terminate each stale process bound to the port
19
21
  for (const pid of pids) {
20
22
  try {
21
23
  process.kill(parseInt(pid, 10), 'SIGTERM');
@@ -24,6 +26,7 @@ function freePort(port) {
24
26
  // already dead
25
27
  }
26
28
  }
29
+ // Only log when we actually killed something
27
30
  if (pids.length) {
28
31
  console.log(`🔄 Killed stale process(es) on port ${port}: ${pids.join(', ')}`);
29
32
  }
@@ -50,11 +53,13 @@ export async function startAppServer(absAppPath, options) {
50
53
  return { serverProcess: undefined, appUrl: options.url };
51
54
  }
52
55
  const pkgJsonPath = join(absAppPath, 'package.json');
56
+ // Startup needs a valid Fusion app directory; bail out clearly if this isn't one
53
57
  if (!existsSync(pkgJsonPath)) {
54
58
  console.error(`❌ No package.json found at ${absAppPath}`);
55
59
  process.exit(1);
56
60
  }
57
61
  const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
62
+ // The app name is required to resolve the appKey later
58
63
  if (!pkgJson.name) {
59
64
  console.error(`❌ package.json at ${absAppPath} has no "name" field`);
60
65
  process.exit(1);
@@ -71,6 +76,7 @@ export async function startAppServer(absAppPath, options) {
71
76
  });
72
77
  const serverUrl = `http://localhost:${options.port}`;
73
78
  const ready = await waitForServer(serverUrl, 60);
79
+ // Abort startup when the dev server never comes up within the timeout
74
80
  if (!ready) {
75
81
  console.error('❌ Server failed to start within 60s');
76
82
  cleanup(serverProcess);
@@ -80,4 +86,4 @@ export async function startAppServer(absAppPath, options) {
80
86
  console.log(`✅ Server ready at ${appUrl}`);
81
87
  return { serverProcess, appUrl };
82
88
  }
83
- //# sourceMappingURL=server.js.map
89
+ //# sourceMappingURL=start-app-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-app-server.js","sourceRoot":"","sources":["../../../../src/commands/app/start-app-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import chalk from 'chalk';
2
+ /**
3
+ * Renders a status glyph for a step or verdict outcome.
4
+ *
5
+ * @param ok - Outcome value: `true` (pass), `false` (fail), or a string label
6
+ * such as `'blocked'` or `'flaky'` for anything in between.
7
+ * @returns A single coloured glyph representing the outcome.
8
+ */
9
+ export function statusIcon(ok) {
10
+ // A literal boolean outcome maps directly to pass/fail glyphs
11
+ if (ok === true)
12
+ return chalk.green('✔');
13
+ // An explicit failure gets its own glyph, distinct from unknown/other states
14
+ if (ok === false)
15
+ return chalk.red('✖');
16
+ return chalk.yellow('⚠'); // "blocked", "flaky", etc.
17
+ }
18
+ //# sourceMappingURL=status-icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-icon.js","sourceRoot":"","sources":["../../../../src/commands/app/status-icon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,EAAoB;IAC7C,8DAA8D;IAC9D,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,6EAA6E;IAC7E,IAAI,EAAE,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,2BAA2B;AACvD,CAAC"}