@equinor/fusion-framework-cli-plugin-copilot 2.0.2 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/esm/commands/app/{session-logger.js → attach-session-logger.js} +16 -2
- package/dist/esm/commands/app/attach-session-logger.js.map +1 -0
- package/dist/esm/commands/app/{command.js → copilot-command.js} +22 -11
- package/dist/esm/commands/app/copilot-command.js.map +1 -0
- package/dist/esm/commands/app/{eval.js → create-session.js} +7 -5
- package/dist/esm/commands/app/create-session.js.map +1 -0
- package/dist/esm/commands/app/format-plan.js +24 -0
- package/dist/esm/commands/app/format-plan.js.map +1 -0
- package/dist/esm/commands/app/format-step-result.js +14 -0
- package/dist/esm/commands/app/format-step-result.js.map +1 -0
- package/dist/esm/commands/app/format-verdict.js +38 -0
- package/dist/esm/commands/app/format-verdict.js.map +1 -0
- package/dist/esm/commands/app/prompts/{system.dev-server.prompt.js → create-dev-server-context.js} +1 -1
- package/dist/esm/commands/app/prompts/create-dev-server-context.js.map +1 -0
- package/dist/esm/commands/app/prompts/{execute-step.prompt.js → create-execute-step-prompt.js} +1 -1
- package/dist/esm/commands/app/prompts/create-execute-step-prompt.js.map +1 -0
- package/dist/esm/commands/app/prompts/{judge.prompt.js → create-judge-prompt.js} +5 -1
- package/dist/esm/commands/app/prompts/create-judge-prompt.js.map +1 -0
- package/dist/esm/commands/app/prompts/{plan.prompt.js → create-plan-prompt.js} +1 -1
- package/dist/esm/commands/app/prompts/create-plan-prompt.js.map +1 -0
- package/dist/esm/commands/app/prompts/{step.prompt.js → create-step-prompt.js} +3 -2
- package/dist/esm/commands/app/prompts/create-step-prompt.js.map +1 -0
- package/dist/esm/commands/app/prompts/{system.prompt.js → create-system-prompt.js} +1 -1
- package/dist/esm/commands/app/prompts/create-system-prompt.js.map +1 -0
- package/dist/esm/commands/app/{login.js → run-login.js} +5 -1
- package/dist/esm/commands/app/run-login.js.map +1 -0
- package/dist/esm/commands/app/{server.js → start-app-server.js} +7 -1
- package/dist/esm/commands/app/start-app-server.js.map +1 -0
- package/dist/esm/commands/app/status-icon.js +18 -0
- package/dist/esm/commands/app/status-icon.js.map +1 -0
- package/dist/esm/commands/app/tools/{registry.js → AgentBrowserToolRegistry.js} +1 -1
- package/dist/esm/commands/app/tools/AgentBrowserToolRegistry.js.map +1 -0
- package/dist/esm/commands/app/tools/{write-file.js → create-append-file-tool.js} +5 -38
- package/dist/esm/commands/app/tools/create-append-file-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{click.js → create-click-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-click-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{errors.js → create-errors-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-errors-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{eval-js.js → create-eval-js-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-eval-js-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{fill.js → create-fill-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-fill-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{find.js → create-find-tool.js} +4 -1
- package/dist/esm/commands/app/tools/create-find-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{get-styles.js → create-get-styles-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-get-styles-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{get-url.js → create-get-url-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-get-url-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{go-back.js → create-go-back-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-go-back-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{hover.js → create-hover-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-hover-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{navigate.js → create-navigate-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-navigate-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{press-key.js → create-press-key-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-press-key-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{read-file.js → create-read-file-tool.js} +4 -2
- package/dist/esm/commands/app/tools/create-read-file-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{reload.js → create-reload-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-reload-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{screenshot.js → create-screenshot-tool.js} +7 -1
- package/dist/esm/commands/app/tools/create-screenshot-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{scroll.js → create-scroll-tool.js} +3 -1
- package/dist/esm/commands/app/tools/create-scroll-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{select.js → create-select-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-select-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{snapshot.js → create-snapshot-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-snapshot-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{type-text.js → create-type-text-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-type-text-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{wait.js → create-wait-tool.js} +5 -1
- package/dist/esm/commands/app/tools/create-wait-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/create-write-file-tool.js +65 -0
- package/dist/esm/commands/app/tools/create-write-file-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/index.js +19 -19
- package/dist/esm/commands/app/tools/index.js.map +1 -1
- package/dist/esm/commands/app/truncate.js +11 -0
- package/dist/esm/commands/app/truncate.js.map +1 -0
- package/dist/esm/commands/app/try-format-message.js +39 -0
- package/dist/esm/commands/app/try-format-message.js.map +1 -0
- package/dist/esm/exit-with-resolution-error.js +16 -0
- package/dist/esm/exit-with-resolution-error.js.map +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/resolve-eval-command-input.js +37 -0
- package/dist/esm/resolve-eval-command-input.js.map +1 -0
- package/dist/esm/resolve-eval-files.js +49 -0
- package/dist/esm/resolve-eval-files.js.map +1 -0
- package/dist/esm/utils/ab-error-message.js +34 -0
- package/dist/esm/utils/ab-error-message.js.map +1 -0
- package/dist/esm/utils/{agent-browser.js → ab.js} +3 -32
- package/dist/esm/utils/ab.js.map +1 -0
- package/dist/esm/utils/create-run-dir.js +24 -0
- package/dist/esm/utils/create-run-dir.js.map +1 -0
- package/dist/esm/utils/{process.js → helpers.js} +28 -11
- package/dist/esm/utils/helpers.js.map +1 -0
- package/dist/esm/utils/index.js +8 -5
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/{browser-poll.js → poll-console.js} +5 -3
- package/dist/esm/utils/poll-console.js.map +1 -0
- package/dist/esm/utils/{daemon.js → reset-daemon.js} +5 -14
- package/dist/esm/utils/reset-daemon.js.map +1 -0
- package/dist/esm/utils/resolve-app-key.js +20 -0
- package/dist/esm/utils/resolve-app-key.js.map +1 -0
- package/dist/esm/utils/wait-for-server.js +26 -0
- package/dist/esm/utils/wait-for-server.js.map +1 -0
- package/dist/esm/version.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/commands/app/format-plan.d.ts +8 -0
- package/dist/types/commands/app/format-step-result.d.ts +8 -0
- package/dist/types/commands/app/format-verdict.d.ts +8 -0
- package/dist/types/commands/app/prompts/{step.prompt.d.ts → create-step-prompt.d.ts} +1 -1
- package/dist/types/commands/app/status-icon.d.ts +8 -0
- package/dist/types/commands/app/tools/create-append-file-tool.d.ts +10 -0
- package/dist/types/commands/app/tools/{write-file.d.ts → create-write-file-tool.d.ts} +0 -9
- package/dist/types/commands/app/truncate.d.ts +8 -0
- package/dist/types/commands/app/try-format-message.d.ts +10 -0
- package/dist/types/exit-with-resolution-error.d.ts +8 -0
- package/dist/types/{eval-resolve.d.ts → resolve-eval-command-input.d.ts} +0 -8
- package/dist/types/resolve-eval-files.d.ts +8 -0
- package/dist/types/utils/ab-error-message.d.ts +11 -0
- package/dist/types/utils/{agent-browser.d.ts → ab.d.ts} +0 -13
- package/dist/types/utils/create-run-dir.d.ts +8 -0
- package/dist/types/utils/{process.d.ts → helpers.d.ts} +13 -6
- package/dist/types/utils/index.d.ts +8 -5
- package/dist/types/utils/{daemon.d.ts → reset-daemon.d.ts} +0 -5
- package/dist/types/utils/resolve-app-key.d.ts +9 -0
- package/dist/types/utils/wait-for-server.d.ts +9 -0
- package/dist/types/version.d.ts +1 -1
- package/package.json +4 -4
- package/src/commands/app/{session-logger.ts → attach-session-logger.ts} +15 -1
- package/src/commands/app/{command.ts → copilot-command.ts} +21 -12
- package/src/commands/app/{eval.ts → create-session.ts} +6 -4
- package/src/commands/app/format-plan.ts +26 -0
- package/src/commands/app/format-step-result.ts +16 -0
- package/src/commands/app/format-verdict.ts +43 -0
- package/src/commands/app/prompts/{judge.prompt.ts → create-judge-prompt.ts} +4 -0
- package/src/commands/app/prompts/{step.prompt.ts → create-step-prompt.ts} +2 -1
- package/src/commands/app/{login.ts → run-login.ts} +4 -0
- package/src/commands/app/{server.ts → start-app-server.ts} +6 -0
- package/src/commands/app/status-icon.ts +16 -0
- package/src/commands/app/tools/{write-file.ts → create-append-file-tool.ts} +4 -39
- package/src/commands/app/tools/{find.ts → create-find-tool.ts} +3 -0
- package/src/commands/app/tools/{read-file.ts → create-read-file-tool.ts} +3 -1
- package/src/commands/app/tools/{screenshot.ts → create-screenshot-tool.ts} +6 -0
- package/src/commands/app/tools/{scroll.ts → create-scroll-tool.ts} +2 -0
- package/src/commands/app/tools/{wait.ts → create-wait-tool.ts} +4 -0
- package/src/commands/app/tools/create-write-file-tool.ts +69 -0
- package/src/commands/app/tools/index.ts +19 -19
- package/src/commands/app/truncate.ts +10 -0
- package/src/commands/app/try-format-message.ts +42 -0
- package/src/exit-with-resolution-error.ts +15 -0
- package/src/index.ts +1 -1
- package/src/resolve-eval-command-input.ts +59 -0
- package/src/resolve-eval-files.ts +57 -0
- package/src/utils/ab-error-message.ts +31 -0
- package/src/utils/{agent-browser.ts → ab.ts} +2 -30
- package/src/utils/create-run-dir.ts +24 -0
- package/src/utils/{process.ts → helpers.ts} +28 -10
- package/src/utils/index.ts +8 -5
- package/src/utils/{browser-poll.ts → poll-console.ts} +4 -2
- package/src/utils/{daemon.ts → reset-daemon.ts} +4 -13
- package/src/utils/resolve-app-key.ts +20 -0
- package/src/utils/wait-for-server.ts +24 -0
- package/src/version.ts +1 -1
- package/dist/esm/commands/app/command.js.map +0 -1
- package/dist/esm/commands/app/eval.js.map +0 -1
- package/dist/esm/commands/app/format.js +0 -93
- package/dist/esm/commands/app/format.js.map +0 -1
- package/dist/esm/commands/app/login.js.map +0 -1
- package/dist/esm/commands/app/prompts/execute-step.prompt.js.map +0 -1
- package/dist/esm/commands/app/prompts/judge.prompt.js.map +0 -1
- package/dist/esm/commands/app/prompts/plan.prompt.js.map +0 -1
- package/dist/esm/commands/app/prompts/step.prompt.js.map +0 -1
- package/dist/esm/commands/app/prompts/system.dev-server.prompt.js.map +0 -1
- package/dist/esm/commands/app/prompts/system.prompt.js.map +0 -1
- package/dist/esm/commands/app/server.js.map +0 -1
- package/dist/esm/commands/app/session-logger.js.map +0 -1
- package/dist/esm/commands/app/tools/click.js.map +0 -1
- package/dist/esm/commands/app/tools/errors.js.map +0 -1
- package/dist/esm/commands/app/tools/eval-js.js.map +0 -1
- package/dist/esm/commands/app/tools/fill.js.map +0 -1
- package/dist/esm/commands/app/tools/find.js.map +0 -1
- package/dist/esm/commands/app/tools/get-styles.js.map +0 -1
- package/dist/esm/commands/app/tools/get-url.js.map +0 -1
- package/dist/esm/commands/app/tools/go-back.js.map +0 -1
- package/dist/esm/commands/app/tools/hover.js.map +0 -1
- package/dist/esm/commands/app/tools/navigate.js.map +0 -1
- package/dist/esm/commands/app/tools/press-key.js.map +0 -1
- package/dist/esm/commands/app/tools/read-file.js.map +0 -1
- package/dist/esm/commands/app/tools/registry.js.map +0 -1
- package/dist/esm/commands/app/tools/reload.js.map +0 -1
- package/dist/esm/commands/app/tools/screenshot.js.map +0 -1
- package/dist/esm/commands/app/tools/scroll.js.map +0 -1
- package/dist/esm/commands/app/tools/select.js.map +0 -1
- package/dist/esm/commands/app/tools/snapshot.js.map +0 -1
- package/dist/esm/commands/app/tools/type-text.js.map +0 -1
- package/dist/esm/commands/app/tools/wait.js.map +0 -1
- package/dist/esm/commands/app/tools/write-file.js.map +0 -1
- package/dist/esm/eval-resolve.js +0 -83
- package/dist/esm/eval-resolve.js.map +0 -1
- package/dist/esm/utils/agent-browser.js.map +0 -1
- package/dist/esm/utils/browser-poll.js.map +0 -1
- package/dist/esm/utils/daemon.js.map +0 -1
- package/dist/esm/utils/process.js.map +0 -1
- package/dist/esm/utils/server.js +0 -65
- package/dist/esm/utils/server.js.map +0 -1
- package/dist/types/commands/app/format.d.ts +0 -14
- package/dist/types/utils/server.d.ts +0 -26
- package/src/commands/app/format.ts +0 -110
- package/src/eval-resolve.ts +0 -113
- package/src/utils/server.ts +0 -66
- /package/dist/types/commands/app/{session-logger.d.ts → attach-session-logger.d.ts} +0 -0
- /package/dist/types/commands/app/{command.d.ts → copilot-command.d.ts} +0 -0
- /package/dist/types/commands/app/{eval.d.ts → create-session.d.ts} +0 -0
- /package/dist/types/commands/app/prompts/{system.dev-server.prompt.d.ts → create-dev-server-context.d.ts} +0 -0
- /package/dist/types/commands/app/prompts/{execute-step.prompt.d.ts → create-execute-step-prompt.d.ts} +0 -0
- /package/dist/types/commands/app/prompts/{judge.prompt.d.ts → create-judge-prompt.d.ts} +0 -0
- /package/dist/types/commands/app/prompts/{plan.prompt.d.ts → create-plan-prompt.d.ts} +0 -0
- /package/dist/types/commands/app/prompts/{system.prompt.d.ts → create-system-prompt.d.ts} +0 -0
- /package/dist/types/commands/app/{login.d.ts → run-login.d.ts} +0 -0
- /package/dist/types/commands/app/{server.d.ts → start-app-server.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{registry.d.ts → AgentBrowserToolRegistry.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{click.d.ts → create-click-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{errors.d.ts → create-errors-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{eval-js.d.ts → create-eval-js-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{fill.d.ts → create-fill-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{find.d.ts → create-find-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{get-styles.d.ts → create-get-styles-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{get-url.d.ts → create-get-url-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{go-back.d.ts → create-go-back-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{hover.d.ts → create-hover-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{navigate.d.ts → create-navigate-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{press-key.d.ts → create-press-key-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{read-file.d.ts → create-read-file-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{reload.d.ts → create-reload-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{screenshot.d.ts → create-screenshot-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{scroll.d.ts → create-scroll-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{select.d.ts → create-select-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{snapshot.d.ts → create-snapshot-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{type-text.d.ts → create-type-text-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{wait.d.ts → create-wait-tool.d.ts} +0 -0
- /package/dist/types/utils/{browser-poll.d.ts → poll-console.d.ts} +0 -0
- /package/src/commands/app/prompts/{system.dev-server.prompt.ts → create-dev-server-context.ts} +0 -0
- /package/src/commands/app/prompts/{execute-step.prompt.ts → create-execute-step-prompt.ts} +0 -0
- /package/src/commands/app/prompts/{plan.prompt.ts → create-plan-prompt.ts} +0 -0
- /package/src/commands/app/prompts/{system.prompt.ts → create-system-prompt.ts} +0 -0
- /package/src/commands/app/tools/{registry.ts → AgentBrowserToolRegistry.ts} +0 -0
- /package/src/commands/app/tools/{click.ts → create-click-tool.ts} +0 -0
- /package/src/commands/app/tools/{errors.ts → create-errors-tool.ts} +0 -0
- /package/src/commands/app/tools/{eval-js.ts → create-eval-js-tool.ts} +0 -0
- /package/src/commands/app/tools/{fill.ts → create-fill-tool.ts} +0 -0
- /package/src/commands/app/tools/{get-styles.ts → create-get-styles-tool.ts} +0 -0
- /package/src/commands/app/tools/{get-url.ts → create-get-url-tool.ts} +0 -0
- /package/src/commands/app/tools/{go-back.ts → create-go-back-tool.ts} +0 -0
- /package/src/commands/app/tools/{hover.ts → create-hover-tool.ts} +0 -0
- /package/src/commands/app/tools/{navigate.ts → create-navigate-tool.ts} +0 -0
- /package/src/commands/app/tools/{press-key.ts → create-press-key-tool.ts} +0 -0
- /package/src/commands/app/tools/{reload.ts → create-reload-tool.ts} +0 -0
- /package/src/commands/app/tools/{select.ts → create-select-tool.ts} +0 -0
- /package/src/commands/app/tools/{snapshot.ts → create-snapshot-tool.ts} +0 -0
- /package/src/commands/app/tools/{type-text.ts → create-type-text-tool.ts} +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prints a CLI resolution error and exits the current process.
|
|
3
|
+
*
|
|
4
|
+
* @param message - Primary error message.
|
|
5
|
+
* @param detail - Optional follow-up detail shown on the next line.
|
|
6
|
+
* @returns This function never returns because the process exits.
|
|
7
|
+
*/
|
|
8
|
+
export function exitWithResolutionError(message, detail) {
|
|
9
|
+
console.error(`❌ ${message}`);
|
|
10
|
+
// Only print the detail line when one was provided
|
|
11
|
+
if (detail) {
|
|
12
|
+
console.error(` ${detail}`);
|
|
13
|
+
}
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=exit-with-resolution-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit-with-resolution-error.js","sourceRoot":"","sources":["../../src/exit-with-resolution-error.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,MAAe;IACtE,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;IAC9B,mDAAmD;IACnD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
package/dist/esm/index.js
CHANGED
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEnE;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACrC,CAAC;AAED,eAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { basename, dirname, extname, resolve } from 'node:path';
|
|
2
|
+
import { existsSync, statSync } from 'node:fs';
|
|
3
|
+
import { exitWithResolutionError } from './exit-with-resolution-error.js';
|
|
4
|
+
/**
|
|
5
|
+
* Resolves the positional `copilot app eval` argument.
|
|
6
|
+
*
|
|
7
|
+
* Supports both application directory paths and direct paths to markdown files
|
|
8
|
+
* inside an application's `eval/` directory.
|
|
9
|
+
*
|
|
10
|
+
* @param inputPath - Positional CLI argument passed to the eval command.
|
|
11
|
+
* @returns Normalized application path and optional direct eval file path.
|
|
12
|
+
*/
|
|
13
|
+
export function resolveEvalCommandInput(inputPath) {
|
|
14
|
+
const absInput = resolve(inputPath);
|
|
15
|
+
// A non-markdown path is treated as the application directory itself
|
|
16
|
+
if (extname(absInput) !== '.md') {
|
|
17
|
+
return { appPath: absInput };
|
|
18
|
+
}
|
|
19
|
+
// The direct eval file path must actually exist on disk
|
|
20
|
+
if (!existsSync(absInput)) {
|
|
21
|
+
exitWithResolutionError(`Eval file not found: ${absInput}`);
|
|
22
|
+
}
|
|
23
|
+
// Reject directories passed off as a direct eval file path
|
|
24
|
+
if (!statSync(absInput).isFile()) {
|
|
25
|
+
exitWithResolutionError(`Eval path is not a file: ${absInput}`);
|
|
26
|
+
}
|
|
27
|
+
const evalDir = dirname(absInput);
|
|
28
|
+
// Direct eval files must live inside an `eval/` directory so appPath can be derived
|
|
29
|
+
if (basename(evalDir) !== 'eval') {
|
|
30
|
+
exitWithResolutionError(`Direct eval file path must point to a markdown file inside an eval directory: ${absInput}`);
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
appPath: dirname(evalDir),
|
|
34
|
+
evalFile: absInput,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=resolve-eval-command-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-eval-command-input.js","sourceRoot":"","sources":["../../src/resolve-eval-command-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAgB1E;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAiB;IACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAEpC,qEAAqE;IACrE,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC;QAChC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAED,wDAAwD;IACxD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,uBAAuB,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,2DAA2D;IAC3D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QACjC,uBAAuB,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,oFAAoF;IACpF,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;QACjC,uBAAuB,CACrB,iFAAiF,QAAQ,EAAE,CAC5F,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;QACzB,QAAQ,EAAE,QAAQ;KACnB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { extname, isAbsolute, join, resolve } from 'node:path';
|
|
3
|
+
import { exitWithResolutionError } from './exit-with-resolution-error.js';
|
|
4
|
+
/**
|
|
5
|
+
* Resolves eval markdown files for a Fusion application.
|
|
6
|
+
*
|
|
7
|
+
* @param appPath - Path to the Fusion application directory
|
|
8
|
+
* @param evalOpt - Value of the `--eval` CLI option (name, path, or `undefined`)
|
|
9
|
+
* @returns Array of absolute paths to eval markdown files
|
|
10
|
+
*/
|
|
11
|
+
export function resolveEvalFiles(appPath, evalOpt) {
|
|
12
|
+
const absApp = resolve(appPath);
|
|
13
|
+
// No --eval option: run every eval file found in the app's eval/ directory
|
|
14
|
+
if (!evalOpt) {
|
|
15
|
+
const evalDir = join(absApp, 'eval');
|
|
16
|
+
// Fail fast when the application has no eval directory to scan
|
|
17
|
+
if (!existsSync(evalDir)) {
|
|
18
|
+
exitWithResolutionError(`No eval directory found at ${evalDir}`, 'Create eval/*.md files or use --eval <file>');
|
|
19
|
+
}
|
|
20
|
+
const files = readdirSync(evalDir)
|
|
21
|
+
// Keep only markdown files, sorted for stable ordering, resolved to absolute paths
|
|
22
|
+
.filter((f) => f.endsWith('.md'))
|
|
23
|
+
.sort()
|
|
24
|
+
// Resolve each filename to its absolute path within the eval directory
|
|
25
|
+
.map((f) => join(evalDir, f));
|
|
26
|
+
// Surface a clear error instead of silently running zero eval files
|
|
27
|
+
if (files.length === 0) {
|
|
28
|
+
exitWithResolutionError(`No .md files found in ${evalDir}`);
|
|
29
|
+
}
|
|
30
|
+
return files;
|
|
31
|
+
}
|
|
32
|
+
// A path-like --eval value (absolute or containing separators) is a direct file reference
|
|
33
|
+
if (isAbsolute(evalOpt) || evalOpt.includes('/') || evalOpt.includes('\\')) {
|
|
34
|
+
const absPath = isAbsolute(evalOpt) ? evalOpt : resolve(evalOpt);
|
|
35
|
+
// Validate the direct file path exists before returning it
|
|
36
|
+
if (!existsSync(absPath)) {
|
|
37
|
+
exitWithResolutionError(`Eval file not found: ${absPath}`);
|
|
38
|
+
}
|
|
39
|
+
return [absPath];
|
|
40
|
+
}
|
|
41
|
+
const evalFileName = extname(evalOpt) === '.md' ? evalOpt : `${evalOpt}.md`;
|
|
42
|
+
const evalFile = join(absApp, 'eval', evalFileName);
|
|
43
|
+
// Otherwise treat --eval as a bare name inside the app's eval/ directory
|
|
44
|
+
if (!existsSync(evalFile)) {
|
|
45
|
+
exitWithResolutionError(`Eval file not found: ${evalFile}`);
|
|
46
|
+
}
|
|
47
|
+
return [evalFile];
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=resolve-eval-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-eval-files.js","sourceRoot":"","sources":["../../src/resolve-eval-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAE1E;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,OAAgB;IAChE,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhC,2EAA2E;IAC3E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,+DAA+D;QAC/D,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,uBAAuB,CACrB,8BAA8B,OAAO,EAAE,EACvC,6CAA6C,CAC9C,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC;YAChC,mFAAmF;aAClF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;aAChC,IAAI,EAAE;YACP,uEAAuE;aACtE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAEhC,oEAAoE;QACpE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,uBAAuB,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,0FAA0F;IAC1F,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3E,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACjE,2DAA2D;QAC3D,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,uBAAuB,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC;IAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IACpD,yEAAyE;IACzE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,uBAAuB,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,CAAC,QAAQ,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts the user-facing error message from an agent-browser failure.
|
|
3
|
+
*
|
|
4
|
+
* Strips ANSI escape codes from stderr and returns only the diagnostic
|
|
5
|
+
* lines prefixed with `✗` or `⚠`. Falls back to the first 200 characters
|
|
6
|
+
* of the error message when no diagnostic lines are found.
|
|
7
|
+
*
|
|
8
|
+
* @param err - The caught error (typically from {@link ab})
|
|
9
|
+
* @returns A single-line summary suitable for console output
|
|
10
|
+
*/
|
|
11
|
+
export function abErrorMessage(err) {
|
|
12
|
+
// Non-Error throws have no structured message to extract
|
|
13
|
+
if (!(err instanceof Error))
|
|
14
|
+
return String(err);
|
|
15
|
+
const e = err;
|
|
16
|
+
// Prefer the raw stderr stream when it was captured on the error
|
|
17
|
+
if (e.stderr) {
|
|
18
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: stripping ANSI escape sequences
|
|
19
|
+
const ansiPattern = /\x1B\[[0-9;]*m/g;
|
|
20
|
+
const lines = e.stderr
|
|
21
|
+
.replace(ansiPattern, '')
|
|
22
|
+
.split('\n')
|
|
23
|
+
// Keep only the diagnostic lines agent-browser prefixes with a status glyph
|
|
24
|
+
.map((l) => l.trim())
|
|
25
|
+
// Filter down to lines that look like agent-browser's own status output
|
|
26
|
+
.filter((l) => l.startsWith('✗') || l.startsWith('⚠'));
|
|
27
|
+
// Only report an assembled diagnostic summary when matching lines were found
|
|
28
|
+
if (lines.length)
|
|
29
|
+
return lines.join(' | ');
|
|
30
|
+
}
|
|
31
|
+
const match = e.message.match(/[✗⚠].+/);
|
|
32
|
+
return match ? match[0] : e.message.slice(0, 200);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=ab-error-message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ab-error-message.js","sourceRoot":"","sources":["../../../src/utils/ab-error-message.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,yDAAyD;IACzD,IAAI,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,CAAC,GAAG,GAAkC,CAAC;IAC7C,iEAAiE;IACjE,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QACb,2FAA2F;QAC3F,MAAM,WAAW,GAAG,iBAAiB,CAAC;QACtC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM;aACnB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;aACxB,KAAK,CAAC,IAAI,CAAC;YACZ,4EAA4E;aAC3E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACrB,wEAAwE;aACvE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACzD,6EAA6E;QAC7E,IAAI,KAAK,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { execFileSync } from 'node:child_process';
|
|
2
2
|
import { existsSync, unlinkSync } from 'node:fs';
|
|
3
|
-
import { homedir } from 'node:os';
|
|
4
3
|
import { join } from 'node:path';
|
|
5
|
-
|
|
6
|
-
export const PROFILE_DIR = `${homedir()}/.fusion-smoke-profile`;
|
|
4
|
+
import { PROFILE_DIR } from './helpers.js';
|
|
7
5
|
/**
|
|
8
6
|
* Runs an agent-browser command with the persistent Chrome profile.
|
|
9
7
|
*
|
|
@@ -20,6 +18,7 @@ export function ab(args, timeoutMs = 30_000) {
|
|
|
20
18
|
// Remove stale SingletonLock left by a previous Chrome crash to prevent
|
|
21
19
|
// "Failed to create SingletonLock: File exists" errors.
|
|
22
20
|
const lockPath = join(PROFILE_DIR, 'SingletonLock');
|
|
21
|
+
// Only attempt removal when a stale lock file is actually present
|
|
23
22
|
if (existsSync(lockPath)) {
|
|
24
23
|
try {
|
|
25
24
|
unlinkSync(lockPath);
|
|
@@ -36,32 +35,4 @@ export function ab(args, timeoutMs = 30_000) {
|
|
|
36
35
|
cwd: process.cwd(),
|
|
37
36
|
}).trim();
|
|
38
37
|
}
|
|
39
|
-
|
|
40
|
-
* Extracts the user-facing error message from an agent-browser failure.
|
|
41
|
-
*
|
|
42
|
-
* Strips ANSI escape codes from stderr and returns only the diagnostic
|
|
43
|
-
* lines prefixed with `✗` or `⚠`. Falls back to the first 200 characters
|
|
44
|
-
* of the error message when no diagnostic lines are found.
|
|
45
|
-
*
|
|
46
|
-
* @param err - The caught error (typically from {@link ab})
|
|
47
|
-
* @returns A single-line summary suitable for console output
|
|
48
|
-
*/
|
|
49
|
-
export function abErrorMessage(err) {
|
|
50
|
-
if (!(err instanceof Error))
|
|
51
|
-
return String(err);
|
|
52
|
-
const e = err;
|
|
53
|
-
if (e.stderr) {
|
|
54
|
-
// biome-ignore lint/suspicious/noControlCharactersInRegex: stripping ANSI escape sequences
|
|
55
|
-
const ansiPattern = /\x1B\[[0-9;]*m/g;
|
|
56
|
-
const lines = e.stderr
|
|
57
|
-
.replace(ansiPattern, '')
|
|
58
|
-
.split('\n')
|
|
59
|
-
.map((l) => l.trim())
|
|
60
|
-
.filter((l) => l.startsWith('✗') || l.startsWith('⚠'));
|
|
61
|
-
if (lines.length)
|
|
62
|
-
return lines.join(' | ');
|
|
63
|
-
}
|
|
64
|
-
const match = e.message.match(/[✗⚠].+/);
|
|
65
|
-
return match ? match[0] : e.message.slice(0, 200);
|
|
66
|
-
}
|
|
67
|
-
//# sourceMappingURL=agent-browser.js.map
|
|
38
|
+
//# sourceMappingURL=ab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ab.js","sourceRoot":"","sources":["../../../src/utils/ab.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,EAAE,CAAC,IAAc,EAAE,SAAS,GAAG,MAAM;IACnD,wEAAwE;IACxE,wDAAwD;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IACpD,kEAAkE;IAClE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,oFAAoF;QACtF,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,CAAC;IACrD,OAAO,YAAY,CAAC,eAAe,EAAE,QAAQ,EAAE;QAC7C,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;QACjC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;KACnB,CAAC,CAAC,IAAI,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { mkdirSync } from 'node:fs';
|
|
2
|
+
import { join, relative, resolve } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Creates a timestamped, run-specific output directory for eval artifacts.
|
|
5
|
+
*
|
|
6
|
+
* @param title - Human label used as the directory name prefix (slugified)
|
|
7
|
+
* @param baseDir - Optional parent directory override
|
|
8
|
+
* @returns Absolute path to the newly created directory
|
|
9
|
+
*/
|
|
10
|
+
export function createRunDir(title, baseDir) {
|
|
11
|
+
const now = new Date();
|
|
12
|
+
// Zero-pad each time component so the directory name sorts and reads consistently
|
|
13
|
+
const time = [now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds()]
|
|
14
|
+
.map((n) => String(n).padStart(2, '0'))
|
|
15
|
+
.join('');
|
|
16
|
+
const ms = String(now.getUTCMilliseconds()).padStart(3, '0');
|
|
17
|
+
const slug = title.replace(/[^a-zA-Z0-9_-]/g, '-').replace(/-+/g, '-');
|
|
18
|
+
const parent = baseDir ? resolve(baseDir) : resolve('.tmp', 'copilot');
|
|
19
|
+
const dir = join(parent, `${slug}_${time}${ms}`);
|
|
20
|
+
mkdirSync(dir, { recursive: true });
|
|
21
|
+
console.log(`📁 Run dir: ${relative(process.cwd(), dir)}`);
|
|
22
|
+
return dir;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=create-run-dir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-run-dir.js","sourceRoot":"","sources":["../../../src/utils/create-run-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,OAAgB;IAC1D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,kFAAkF;IAClF,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,aAAa,EAAE,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC;SACvE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SACtC,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvE,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;IACjD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -1,13 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*/
|
|
6
|
-
export function cleanup(proc) {
|
|
7
|
-
if (proc && !proc.killed) {
|
|
8
|
-
proc.kill('SIGTERM');
|
|
9
|
-
}
|
|
10
|
-
}
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { ab } from './ab.js';
|
|
3
|
+
/** Persistent Chrome profile directory used across agent-browser sessions. */
|
|
4
|
+
export const PROFILE_DIR = `${homedir()}/.fusion-smoke-profile`;
|
|
11
5
|
/**
|
|
12
6
|
* Returns a promise that resolves after the given delay.
|
|
13
7
|
*
|
|
@@ -27,4 +21,27 @@ export function stripAnsi(s) {
|
|
|
27
21
|
// biome-ignore lint/suspicious/noControlCharactersInRegex: stripping ANSI escape sequences
|
|
28
22
|
return s.replace(/\x1b\[[0-9;]*m/g, '');
|
|
29
23
|
}
|
|
30
|
-
|
|
24
|
+
/**
|
|
25
|
+
* Sends `SIGTERM` to a child process if it is still running.
|
|
26
|
+
*
|
|
27
|
+
* @param proc - The child process to terminate (no-op when `undefined` or already killed)
|
|
28
|
+
*/
|
|
29
|
+
export function cleanup(proc) {
|
|
30
|
+
// Only signal processes that are still alive; nothing to do otherwise
|
|
31
|
+
if (proc && !proc.killed) {
|
|
32
|
+
proc.kill('SIGTERM');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Clears the MSAL `interaction.status` flag from `sessionStorage` in the
|
|
37
|
+
* running browser via `agent-browser eval`.
|
|
38
|
+
*/
|
|
39
|
+
export function clearMsalInteraction() {
|
|
40
|
+
try {
|
|
41
|
+
ab(['eval', 'sessionStorage.removeItem("msal.interaction.status")'], 5_000);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Browser may not be ready yet — non-fatal
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/utils/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B,8EAA8E;AAC9E,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,OAAO,EAAE,wBAAwB,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,UAAU,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,2FAA2F;IAC3F,OAAO,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,IAAmB;IACzC,sEAAsE;IACtE,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,CAAC;QACH,EAAE,CAAC,CAAC,MAAM,EAAE,sDAAsD,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,2CAA2C;IAC7C,CAAC;AACH,CAAC"}
|
package/dist/esm/utils/index.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
export { ab
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
1
|
+
export { ab } from './ab.js';
|
|
2
|
+
export { abErrorMessage } from './ab-error-message.js';
|
|
3
|
+
export { PROFILE_DIR, sleep, stripAnsi, cleanup, clearMsalInteraction } from './helpers.js';
|
|
4
|
+
export { resetDaemon } from './reset-daemon.js';
|
|
5
|
+
export { createRunDir } from './create-run-dir.js';
|
|
6
|
+
export { resolveAppKey } from './resolve-app-key.js';
|
|
7
|
+
export { waitForServer } from './wait-for-server.js';
|
|
8
|
+
export { pollConsole } from './poll-console.js';
|
|
6
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ab } from './
|
|
2
|
-
import { sleep } from './
|
|
1
|
+
import { ab } from './ab.js';
|
|
2
|
+
import { sleep } from './helpers.js';
|
|
3
3
|
/**
|
|
4
4
|
* Polls the browser's console log output until a predicate returns `true`
|
|
5
5
|
* or the timeout expires.
|
|
@@ -10,9 +10,11 @@ import { sleep } from './process.js';
|
|
|
10
10
|
*/
|
|
11
11
|
export async function pollConsole(predicate, timeoutMs) {
|
|
12
12
|
const deadline = Date.now() + timeoutMs;
|
|
13
|
+
// Keep polling console output until the predicate matches or time runs out
|
|
13
14
|
while (Date.now() < deadline) {
|
|
14
15
|
try {
|
|
15
16
|
const logs = ab(['console']);
|
|
17
|
+
// Stop polling as soon as the caller's condition is satisfied
|
|
16
18
|
if (predicate(logs))
|
|
17
19
|
return true;
|
|
18
20
|
}
|
|
@@ -23,4 +25,4 @@ export async function pollConsole(predicate, timeoutMs) {
|
|
|
23
25
|
}
|
|
24
26
|
return false;
|
|
25
27
|
}
|
|
26
|
-
//# sourceMappingURL=
|
|
28
|
+
//# sourceMappingURL=poll-console.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poll-console.js","sourceRoot":"","sources":["../../../src/utils/poll-console.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAoC,EACpC,SAAiB;IAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,2EAA2E;IAC3E,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7B,8DAA8D;YAC9D,IAAI,SAAS,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,4BAA4B;QAC9B,CAAC;QACD,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { execFileSync, execSync } from 'node:child_process';
|
|
|
2
2
|
import { existsSync, readFileSync, rmSync } from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { homedir } from 'node:os';
|
|
5
|
-
import {
|
|
5
|
+
import { PROFILE_DIR } from './helpers.js';
|
|
6
6
|
/** PID file written by the agent-browser daemon to track its own process. */
|
|
7
7
|
const DAEMON_PID_FILE = join(homedir(), '.agent-browser', 'default.pid');
|
|
8
8
|
/**
|
|
@@ -32,6 +32,7 @@ export function resetDaemon() {
|
|
|
32
32
|
if (existsSync(DAEMON_PID_FILE)) {
|
|
33
33
|
try {
|
|
34
34
|
const pid = parseInt(readFileSync(DAEMON_PID_FILE, 'utf-8').trim(), 10);
|
|
35
|
+
// Only attempt to signal the process when the pid file held a valid number
|
|
35
36
|
if (pid > 0)
|
|
36
37
|
process.kill(pid);
|
|
37
38
|
console.log('🔄 Killed agent-browser daemon (pid %d)', pid);
|
|
@@ -53,6 +54,7 @@ export function resetDaemon() {
|
|
|
53
54
|
}
|
|
54
55
|
// 4. Remove stale SingletonLock left by crashed Chrome
|
|
55
56
|
const lockPath = join(PROFILE_DIR, 'SingletonLock');
|
|
57
|
+
// Only attempt removal when a stale lock file is actually present
|
|
56
58
|
if (existsSync(lockPath)) {
|
|
57
59
|
try {
|
|
58
60
|
rmSync(lockPath, { force: true });
|
|
@@ -63,21 +65,10 @@ export function resetDaemon() {
|
|
|
63
65
|
}
|
|
64
66
|
// 5. Clear Session Storage to remove stuck MSAL interaction.status flags
|
|
65
67
|
const sessionStorage = join(PROFILE_DIR, 'Default', 'Session Storage');
|
|
68
|
+
// Only clear session storage when it exists to avoid unnecessary work
|
|
66
69
|
if (existsSync(sessionStorage)) {
|
|
67
70
|
rmSync(sessionStorage, { recursive: true, force: true });
|
|
68
71
|
console.log('🔄 Cleared Session Storage (MSAL interaction flags)');
|
|
69
72
|
}
|
|
70
73
|
}
|
|
71
|
-
|
|
72
|
-
* Clears the MSAL `interaction.status` flag from `sessionStorage` in the
|
|
73
|
-
* running browser via `agent-browser eval`.
|
|
74
|
-
*/
|
|
75
|
-
export function clearMsalInteraction() {
|
|
76
|
-
try {
|
|
77
|
-
ab(['eval', 'sessionStorage.removeItem("msal.interaction.status")'], 5_000);
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
// Browser may not be ready yet — non-fatal
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=daemon.js.map
|
|
74
|
+
//# sourceMappingURL=reset-daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reset-daemon.js","sourceRoot":"","sources":["../../../src/utils/reset-daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,6EAA6E;AAC7E,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;AAEzE;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW;IACzB,8BAA8B;IAC9B,IAAI,CAAC;QACH,YAAY,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,EAAE;YACvC,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;IACvD,CAAC;IAED,qEAAqE;IACrE,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACxE,2EAA2E;YAC3E,IAAI,GAAG,GAAG,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE,GAAG,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;QACD,MAAM,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,uDAAuD;IACvD,IAAI,CAAC;QACH,QAAQ,CAAC,kDAAkD,EAAE;YAC3D,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,qCAAqC;IACvC,CAAC;IAED,uDAAuD;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IACpD,kEAAkE;IAClE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;IACvE,sEAAsE;IACtE,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves the Fusion `appKey` by running `ffc app manifest --silent`
|
|
4
|
+
* in the given application directory and parsing the JSON output.
|
|
5
|
+
*
|
|
6
|
+
* @param appDir - Absolute path to the Fusion application
|
|
7
|
+
* @returns The `appKey` string from the manifest
|
|
8
|
+
* @throws {Error} When `ffc app manifest` fails or returns invalid JSON
|
|
9
|
+
*/
|
|
10
|
+
export function resolveAppKey(appDir) {
|
|
11
|
+
const output = execFileSync('ffc', ['app', 'manifest', '--silent'], {
|
|
12
|
+
cwd: appDir,
|
|
13
|
+
encoding: 'utf-8',
|
|
14
|
+
timeout: 30_000,
|
|
15
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
16
|
+
});
|
|
17
|
+
const manifest = JSON.parse(output);
|
|
18
|
+
return manifest.appKey;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=resolve-app-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-app-key.js","sourceRoot":"","sources":["../../../src/utils/resolve-app-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE;QAClE,GAAG,EAAE,MAAM;QACX,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;KAClC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAuB,CAAC;IAC1D,OAAO,QAAQ,CAAC,MAAM,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { sleep } from './helpers.js';
|
|
2
|
+
/**
|
|
3
|
+
* Polls a server URL until it responds with a non-5xx status or the
|
|
4
|
+
* timeout is reached.
|
|
5
|
+
*
|
|
6
|
+
* @param url - The URL to poll (e.g. `http://localhost:3000`)
|
|
7
|
+
* @param timeoutSeconds - Maximum number of seconds to wait
|
|
8
|
+
* @returns `true` if the server responded before timeout, `false` otherwise
|
|
9
|
+
*/
|
|
10
|
+
export async function waitForServer(url, timeoutSeconds) {
|
|
11
|
+
// Poll once per second up to the timeout, tolerating connection errors
|
|
12
|
+
for (let i = 0; i < timeoutSeconds; i++) {
|
|
13
|
+
try {
|
|
14
|
+
const res = await fetch(url, { signal: AbortSignal.timeout(2000) });
|
|
15
|
+
// Treat any non-5xx response as evidence the server is up
|
|
16
|
+
if (res.ok || res.status < 500)
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Server not ready yet — retry
|
|
21
|
+
}
|
|
22
|
+
await sleep(1000);
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=wait-for-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait-for-server.js","sourceRoot":"","sources":["../../../src/utils/wait-for-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,cAAsB;IACrE,uEAAuE;IACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpE,0DAA0D;YAC1D,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG;gBAAE,OAAO,IAAI,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;QACD,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/esm/version.js
CHANGED