@upbeat-works/fisgon 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/LICENSE.md +10 -0
  2. package/README.md +150 -0
  3. package/dist/adapters/drizzle.d.ts +17 -0
  4. package/dist/adapters/drizzle.d.ts.map +1 -0
  5. package/dist/adapters/drizzle.js +83 -0
  6. package/dist/adapters/drizzle.js.map +1 -0
  7. package/dist/adapters/prisma.d.ts +16 -0
  8. package/dist/adapters/prisma.d.ts.map +1 -0
  9. package/dist/adapters/prisma.js +69 -0
  10. package/dist/adapters/prisma.js.map +1 -0
  11. package/dist/agent/ai.d.ts +3 -0
  12. package/dist/agent/ai.d.ts.map +1 -0
  13. package/dist/agent/ai.js +19 -0
  14. package/dist/agent/ai.js.map +1 -0
  15. package/dist/agent/browser-bridge.d.ts +42 -0
  16. package/dist/agent/browser-bridge.d.ts.map +1 -0
  17. package/dist/agent/browser-bridge.js +2 -0
  18. package/dist/agent/browser-bridge.js.map +1 -0
  19. package/dist/agent/index.d.ts +66 -0
  20. package/dist/agent/index.d.ts.map +1 -0
  21. package/dist/agent/index.js +572 -0
  22. package/dist/agent/index.js.map +1 -0
  23. package/dist/agent/llm-driver.d.ts +30 -0
  24. package/dist/agent/llm-driver.d.ts.map +1 -0
  25. package/dist/agent/llm-driver.js +239 -0
  26. package/dist/agent/llm-driver.js.map +1 -0
  27. package/dist/agent/session-state.d.ts +28 -0
  28. package/dist/agent/session-state.d.ts.map +1 -0
  29. package/dist/agent/session-state.js +6 -0
  30. package/dist/agent/session-state.js.map +1 -0
  31. package/dist/agent/worker.d.ts +6 -0
  32. package/dist/agent/worker.d.ts.map +1 -0
  33. package/dist/agent/worker.js +12 -0
  34. package/dist/agent/worker.js.map +1 -0
  35. package/dist/cli/browser-handler.d.ts +30 -0
  36. package/dist/cli/browser-handler.d.ts.map +1 -0
  37. package/dist/cli/browser-handler.js +89 -0
  38. package/dist/cli/browser-handler.js.map +1 -0
  39. package/dist/cli/browser-setup.d.ts +11 -0
  40. package/dist/cli/browser-setup.d.ts.map +1 -0
  41. package/dist/cli/browser-setup.js +25 -0
  42. package/dist/cli/browser-setup.js.map +1 -0
  43. package/dist/cli/commands/actions.d.ts +3 -0
  44. package/dist/cli/commands/actions.d.ts.map +1 -0
  45. package/dist/cli/commands/actions.js +28 -0
  46. package/dist/cli/commands/actions.js.map +1 -0
  47. package/dist/cli/commands/do.d.ts +3 -0
  48. package/dist/cli/commands/do.d.ts.map +1 -0
  49. package/dist/cli/commands/do.js +138 -0
  50. package/dist/cli/commands/do.js.map +1 -0
  51. package/dist/cli/commands/events.d.ts +3 -0
  52. package/dist/cli/commands/events.d.ts.map +1 -0
  53. package/dist/cli/commands/events.js +36 -0
  54. package/dist/cli/commands/events.js.map +1 -0
  55. package/dist/cli/commands/interact.d.ts +3 -0
  56. package/dist/cli/commands/interact.d.ts.map +1 -0
  57. package/dist/cli/commands/interact.js +54 -0
  58. package/dist/cli/commands/interact.js.map +1 -0
  59. package/dist/cli/commands/navigate.d.ts +3 -0
  60. package/dist/cli/commands/navigate.d.ts.map +1 -0
  61. package/dist/cli/commands/navigate.js +34 -0
  62. package/dist/cli/commands/navigate.js.map +1 -0
  63. package/dist/cli/commands/open.d.ts +3 -0
  64. package/dist/cli/commands/open.d.ts.map +1 -0
  65. package/dist/cli/commands/open.js +29 -0
  66. package/dist/cli/commands/open.js.map +1 -0
  67. package/dist/cli/commands/run.d.ts +3 -0
  68. package/dist/cli/commands/run.d.ts.map +1 -0
  69. package/dist/cli/commands/run.js +209 -0
  70. package/dist/cli/commands/run.js.map +1 -0
  71. package/dist/cli/commands/start.d.ts +3 -0
  72. package/dist/cli/commands/start.d.ts.map +1 -0
  73. package/dist/cli/commands/start.js +169 -0
  74. package/dist/cli/commands/start.js.map +1 -0
  75. package/dist/cli/commands/stop.d.ts +3 -0
  76. package/dist/cli/commands/stop.d.ts.map +1 -0
  77. package/dist/cli/commands/stop.js +37 -0
  78. package/dist/cli/commands/stop.js.map +1 -0
  79. package/dist/cli/commands/tick.d.ts +3 -0
  80. package/dist/cli/commands/tick.d.ts.map +1 -0
  81. package/dist/cli/commands/tick.js +34 -0
  82. package/dist/cli/commands/tick.js.map +1 -0
  83. package/dist/cli/config.d.ts +3 -0
  84. package/dist/cli/config.d.ts.map +1 -0
  85. package/dist/cli/config.js +20 -0
  86. package/dist/cli/config.js.map +1 -0
  87. package/dist/cli/connection.d.ts +18 -0
  88. package/dist/cli/connection.d.ts.map +1 -0
  89. package/dist/cli/connection.js +79 -0
  90. package/dist/cli/connection.js.map +1 -0
  91. package/dist/cli/index.d.ts +3 -0
  92. package/dist/cli/index.d.ts.map +1 -0
  93. package/dist/cli/index.js +29 -0
  94. package/dist/cli/index.js.map +1 -0
  95. package/dist/cli/session-file.d.ts +9 -0
  96. package/dist/cli/session-file.d.ts.map +1 -0
  97. package/dist/cli/session-file.js +23 -0
  98. package/dist/cli/session-file.js.map +1 -0
  99. package/dist/cli/task-runner.d.ts +20 -0
  100. package/dist/cli/task-runner.d.ts.map +1 -0
  101. package/dist/cli/task-runner.js +318 -0
  102. package/dist/cli/task-runner.js.map +1 -0
  103. package/dist/core/task-file.d.ts +32 -0
  104. package/dist/core/task-file.d.ts.map +1 -0
  105. package/dist/core/task-file.js +51 -0
  106. package/dist/core/task-file.js.map +1 -0
  107. package/dist/core/tick-detector.d.ts +24 -0
  108. package/dist/core/tick-detector.d.ts.map +1 -0
  109. package/dist/core/tick-detector.js +71 -0
  110. package/dist/core/tick-detector.js.map +1 -0
  111. package/dist/core/types.d.ts +74 -0
  112. package/dist/core/types.d.ts.map +1 -0
  113. package/dist/core/types.js +4 -0
  114. package/dist/core/types.js.map +1 -0
  115. package/dist/index.d.ts +4 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +4 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/probes/action-scanner.d.ts +2 -0
  120. package/dist/probes/action-scanner.d.ts.map +1 -0
  121. package/dist/probes/action-scanner.js +9 -0
  122. package/dist/probes/action-scanner.js.map +1 -0
  123. package/dist/probes/fetch-probe.d.ts +2 -0
  124. package/dist/probes/fetch-probe.d.ts.map +1 -0
  125. package/dist/probes/fetch-probe.js +9 -0
  126. package/dist/probes/fetch-probe.js.map +1 -0
  127. package/dist/probes/inject.d.ts +3 -0
  128. package/dist/probes/inject.d.ts.map +1 -0
  129. package/dist/probes/inject.js +24 -0
  130. package/dist/probes/inject.js.map +1 -0
  131. package/dist/probes/navigation-probe.d.ts +2 -0
  132. package/dist/probes/navigation-probe.d.ts.map +1 -0
  133. package/dist/probes/navigation-probe.js +9 -0
  134. package/dist/probes/navigation-probe.js.map +1 -0
  135. package/dist/probes/scripts/action-scanner.js +62 -0
  136. package/dist/probes/scripts/fetch.js +61 -0
  137. package/dist/probes/scripts/navigation.js +55 -0
  138. package/dist/probes/scripts/scripts/action-scanner.js +62 -0
  139. package/dist/probes/scripts/scripts/fetch.js +61 -0
  140. package/dist/probes/scripts/scripts/navigation.js +55 -0
  141. package/dist/probes/scripts/scripts/ws-bootstrap.js +35 -0
  142. package/dist/probes/scripts/ws-bootstrap.js +35 -0
  143. package/dist/server/create-probe.d.ts +8 -0
  144. package/dist/server/create-probe.d.ts.map +1 -0
  145. package/dist/server/create-probe.js +73 -0
  146. package/dist/server/create-probe.js.map +1 -0
  147. package/dist/server/sql-parser.d.ts +6 -0
  148. package/dist/server/sql-parser.d.ts.map +1 -0
  149. package/dist/server/sql-parser.js +40 -0
  150. package/dist/server/sql-parser.js.map +1 -0
  151. package/dist/server.d.ts +3 -0
  152. package/dist/server.d.ts.map +1 -0
  153. package/dist/server.js +2 -0
  154. package/dist/server.js.map +1 -0
  155. package/package.json +64 -0
@@ -0,0 +1,169 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { existsSync, writeFileSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { resolve, join } from 'node:path';
5
+ import { Command } from 'commander';
6
+ import { createBrowserHandler } from '../browser-handler.js';
7
+ import { launchBrowser } from '../browser-setup.js';
8
+ import { loadConfig } from '../config.js';
9
+ import { connectToAgent } from '../connection.js';
10
+ export const startCommand = new Command('start')
11
+ .description('Start a Fisgon test session')
12
+ .option('-p, --port <port>', 'Agent port (local mode)', '9876')
13
+ .option('--agent <url>', 'Remote agent URL (e.g. wss://fisgon.example.workers.dev)')
14
+ .option('--env <name>', 'DO instance name (e.g. staging, pr-123)', 'default')
15
+ .option('--remote', 'Use remote browser (Browser Rendering) instead of local Playwright')
16
+ .option('--no-browser', 'Skip launching browser (browser commands will fail)')
17
+ .option('--identity <entries...>', 'Session identity entries: name:email:password (can specify multiple)')
18
+ .action(async (options) => {
19
+ const port = parseInt(options.port, 10);
20
+ const config = await loadConfig();
21
+ if (!config) {
22
+ console.error('No fisgon.config.ts found in current directory');
23
+ process.exit(1);
24
+ }
25
+ const agentUrl = options.agent ?? config.agent;
26
+ const isRemote = !!agentUrl;
27
+ const effectivePort = config.port ?? port;
28
+ const envName = options.env;
29
+ const browserMode = options.remote ? 'remote' : 'local';
30
+ // Parse --identity entries (format: name:email:password)
31
+ let sessionIdentity;
32
+ if (options.identity) {
33
+ sessionIdentity = {};
34
+ for (const entry of options.identity) {
35
+ const [name, email, ...passwordParts] = entry.split(':');
36
+ const password = passwordParts.join(':');
37
+ if (!name || !email || !password) {
38
+ console.error(`Invalid identity format: ${entry}. Use name:email:password`);
39
+ process.exit(1);
40
+ }
41
+ sessionIdentity[name] = { email, password };
42
+ }
43
+ }
44
+ let wranglerPid;
45
+ // 1. In local mode, spawn wrangler dev for the agent
46
+ if (!isRemote) {
47
+ console.log('Starting Fisgon agent...');
48
+ const fisgonRoot = resolve(import.meta.dirname, '../../..');
49
+ const wranglerConfigPath = resolve(fisgonRoot, 'wrangler.jsonc');
50
+ const devVarsPath = resolve(fisgonRoot, '.dev.vars');
51
+ const wranglerArgs = [
52
+ 'wrangler',
53
+ 'dev',
54
+ '--config',
55
+ wranglerConfigPath,
56
+ '--port',
57
+ String(effectivePort),
58
+ ];
59
+ if (existsSync(devVarsPath)) {
60
+ wranglerArgs.push('--env-file', devVarsPath);
61
+ }
62
+ const wrangler = spawn('npx', wranglerArgs, {
63
+ stdio: ['pipe', 'pipe', 'pipe'],
64
+ env: { ...process.env },
65
+ });
66
+ wranglerPid = wrangler.pid;
67
+ try {
68
+ await new Promise((waitResolve, reject) => {
69
+ const timeout = setTimeout(() => reject(new Error('Wrangler startup timed out')), 30000);
70
+ wrangler.stderr?.on('data', (data) => {
71
+ if (data.toString().includes('Ready on')) {
72
+ clearTimeout(timeout);
73
+ waitResolve();
74
+ }
75
+ });
76
+ wrangler.stdout?.on('data', (data) => {
77
+ if (data.toString().includes('Ready on')) {
78
+ clearTimeout(timeout);
79
+ waitResolve();
80
+ }
81
+ });
82
+ wrangler.on('error', (err) => {
83
+ clearTimeout(timeout);
84
+ reject(err);
85
+ });
86
+ wrangler.on('exit', (code) => {
87
+ clearTimeout(timeout);
88
+ if (code !== 0)
89
+ reject(new Error(`Wrangler exited with code ${code}`));
90
+ });
91
+ });
92
+ }
93
+ catch (err) {
94
+ console.error('Failed to start wrangler:', err);
95
+ process.exit(1);
96
+ }
97
+ console.log(`Agent running on port ${effectivePort}`);
98
+ // Cleanup on exit
99
+ const cleanup = () => {
100
+ wrangler.kill();
101
+ process.exit(0);
102
+ };
103
+ process.on('SIGINT', cleanup);
104
+ process.on('SIGTERM', cleanup);
105
+ }
106
+ else {
107
+ console.log(`Connecting to remote agent: ${agentUrl}`);
108
+ }
109
+ // 2. Connect to the agent
110
+ let conn;
111
+ try {
112
+ if (!isRemote) {
113
+ await new Promise((r) => setTimeout(r, 1000));
114
+ }
115
+ conn = await connectToAgent({
116
+ port: isRemote ? undefined : effectivePort,
117
+ agent: agentUrl,
118
+ env: envName,
119
+ });
120
+ }
121
+ catch (err) {
122
+ console.error('Failed to connect to agent:', err);
123
+ process.exit(1);
124
+ }
125
+ // 3. Start session on the agent via RPC
126
+ const startResult = await conn.call('startSession', [config, browserMode, sessionIdentity]);
127
+ const { sessionId } = startResult;
128
+ console.log(`Session started: ${sessionId}`);
129
+ // Reconnect with sessionId so the agent associates this CLI connection.
130
+ // hasBrowser tells the agent this is the browser-owning connection,
131
+ // so it survives DO hibernation and is preferred during recovery.
132
+ conn.close();
133
+ conn = await connectToAgent({
134
+ port: isRemote ? undefined : effectivePort,
135
+ agent: agentUrl,
136
+ env: envName,
137
+ sessionId,
138
+ hasBrowser: true,
139
+ });
140
+ // 4. Launch local Playwright browser if in local browser mode
141
+ if (browserMode === 'local' && options.browser !== false) {
142
+ try {
143
+ const { page } = await launchBrowser(config, sessionId);
144
+ // Register browser command handler — sends results via AgentClient
145
+ const handleBrowserCommand = createBrowserHandler(conn.client, page);
146
+ conn.onBrowserCommand(handleBrowserCommand);
147
+ console.log(`Browser ready at ${config.url}`);
148
+ }
149
+ catch (err) {
150
+ console.error('Failed to launch browser:', err);
151
+ console.log('Continuing without browser — browser commands will fail');
152
+ }
153
+ }
154
+ else if (browserMode === 'remote') {
155
+ console.log('Using remote browser (Browser Rendering)');
156
+ }
157
+ // Write session info so other commands can find it
158
+ writeFileSync(join(tmpdir(), 'fisgon.json'), JSON.stringify({
159
+ port: effectivePort,
160
+ pid: process.pid,
161
+ sessionId,
162
+ agent: agentUrl,
163
+ env: envName,
164
+ wranglerPid,
165
+ }));
166
+ console.log('Fisgon is running. Use other commands in a separate terminal.');
167
+ console.log('Press Ctrl+C to stop.');
168
+ });
169
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const stopCommand: Command;
3
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,eAAO,MAAM,WAAW,SAgCrB,CAAA"}
@@ -0,0 +1,37 @@
1
+ import { Command } from 'commander';
2
+ import { connectToAgent } from '../connection.js';
3
+ import { getRunningSession } from '../session-file.js';
4
+ export const stopCommand = new Command('stop')
5
+ .description('Stop the current Fisgon session')
6
+ .action(async () => {
7
+ const session = getRunningSession();
8
+ if (!session) {
9
+ console.error('No running Fisgon session found');
10
+ process.exit(1);
11
+ }
12
+ try {
13
+ const conn = await connectToAgent({
14
+ port: session.port,
15
+ agent: session.agent,
16
+ env: session.env,
17
+ sessionId: session.sessionId,
18
+ });
19
+ await conn.call('stopSession', [session.sessionId]);
20
+ console.log('Session stopped');
21
+ conn.close();
22
+ }
23
+ catch (err) {
24
+ console.error('Failed to stop session:', err);
25
+ process.exit(1);
26
+ }
27
+ // Kill the start process (local mode only)
28
+ if (session.pid && !session.agent) {
29
+ try {
30
+ process.kill(session.pid, 'SIGTERM');
31
+ }
32
+ catch {
33
+ // Process may already be dead
34
+ }
35
+ }
36
+ });
37
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAEtD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC5C,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,KAAK,IAAI,EAAE;IAClB,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAA;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAA;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC;YACjC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC5B,CAAC,CAAA;QACF,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAA;QACnD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;QAC9B,IAAI,CAAC,KAAK,EAAE,CAAA;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAA;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,2CAA2C;IAC3C,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC;YACJ,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QACrC,CAAC;QAAC,MAAM,CAAC;YACR,8BAA8B;QAC/B,CAAC;IACF,CAAC;AACF,CAAC,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const tickCommand: Command;
3
+ //# sourceMappingURL=tick.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tick.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/tick.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC,eAAO,MAAM,WAAW,SAyCrB,CAAA"}
@@ -0,0 +1,34 @@
1
+ import { Command } from 'commander';
2
+ import { connectToAgent } from '../connection.js';
3
+ import { getRunningSession } from '../session-file.js';
4
+ export const tickCommand = new Command('tick')
5
+ .description('Wait for the next tick and print its events')
6
+ .option('-t, --timeout <ms>', 'Timeout in milliseconds', '30000')
7
+ .action(async (options) => {
8
+ const session = getRunningSession();
9
+ if (!session) {
10
+ console.error('No running Fisgon session. Run `fisgon start` first.');
11
+ process.exit(1);
12
+ }
13
+ const timeout = parseInt(options.timeout, 10);
14
+ try {
15
+ const conn = await connectToAgent({
16
+ port: session.port,
17
+ agent: session.agent,
18
+ env: session.env,
19
+ sessionId: session.sessionId,
20
+ });
21
+ const result = await conn.call('waitForNextTick', [session.sessionId, timeout], { timeout: timeout + 5000 });
22
+ const tick = result.tick;
23
+ console.log(`Tick #${tick.id} (${tick.duration}ms, ${tick.events.length} events):`);
24
+ for (const event of tick.events) {
25
+ console.log(` ${event.source}:${event.type}`, JSON.stringify(event.data));
26
+ }
27
+ conn.close();
28
+ }
29
+ catch (err) {
30
+ console.error('Tick failed:', err);
31
+ process.exit(1);
32
+ }
33
+ });
34
+ //# sourceMappingURL=tick.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tick.js","sourceRoot":"","sources":["../../../src/cli/commands/tick.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAEtD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC5C,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,oBAAoB,EAAE,yBAAyB,EAAE,OAAO,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,OAA4B,EAAE,EAAE;IAC9C,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAA;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAA;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAE7C,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC;YACjC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC5B,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAC7B,iBAAiB,EACjB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,EAC5B,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,CAC3B,CAAA;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;QACxB,OAAO,CAAC,GAAG,CACV,SAAS,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,WAAW,CACtE,CAAA;QACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CACV,KAAK,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,EACjC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAC1B,CAAA;QACF,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAA;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAA;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;AACF,CAAC,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { type FisgonConfig } from '../core/types.js';
2
+ export declare function loadConfig(cwd?: string): Promise<FisgonConfig | null>;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAGA,OAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAIrD,wBAAsB,UAAU,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAalF"}
@@ -0,0 +1,20 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { pathToFileURL } from 'node:url';
4
+ const CONFIG_FILES = ['fisgon.config.ts', 'fisgon.config.js', 'fisgon.config.mjs'];
5
+ export async function loadConfig(cwd = process.cwd()) {
6
+ for (const file of CONFIG_FILES) {
7
+ const fullPath = resolve(cwd, file);
8
+ if (existsSync(fullPath)) {
9
+ try {
10
+ const mod = await import(pathToFileURL(fullPath).href);
11
+ return mod.default ?? mod;
12
+ }
13
+ catch {
14
+ // Try next
15
+ }
16
+ }
17
+ }
18
+ return null;
19
+ }
20
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAGxC,MAAM,YAAY,GAAG,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,CAAA;AAElF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAClD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QACnC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAA;gBACtD,OAAO,GAAG,CAAC,OAAO,IAAI,GAAG,CAAA;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW;YACb,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { AgentClient } from 'agents/client';
2
+ import { type AgentState } from '../agent/session-state.js';
3
+ type ConnectOptions = {
4
+ port?: number;
5
+ agent?: string;
6
+ env?: string;
7
+ sessionId?: string;
8
+ hasBrowser?: boolean;
9
+ };
10
+ export type AgentConnection = {
11
+ client: AgentClient<AgentState>;
12
+ call: AgentClient<AgentState>['call'];
13
+ onBrowserCommand(handler: (command: unknown) => void): void;
14
+ close(): void;
15
+ };
16
+ export declare function connectToAgent(options: ConnectOptions): Promise<AgentConnection>;
17
+ export {};
18
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/cli/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA2B,MAAM,eAAe,CAAA;AAGpE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAE3D,KAAK,cAAc,GAAG;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC7B,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,CAAA;IAC/B,IAAI,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAA;IACrC,gBAAgB,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAA;IAC3D,KAAK,IAAI,IAAI,CAAA;CACb,CAAA;AAKD,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CA4EhF"}
@@ -0,0 +1,79 @@
1
+ import { AgentClient } from 'agents/client';
2
+ import WebSocket from 'ws';
3
+ const DEFAULT_PORT = 9876;
4
+ const AGENT_NAME = 'fisgon';
5
+ export function connectToAgent(options) {
6
+ return new Promise((resolve, reject) => {
7
+ const env = options.env ?? 'default';
8
+ const host = options.agent
9
+ ? new URL(options.agent).host
10
+ : `localhost:${options.port ?? DEFAULT_PORT}`;
11
+ const protocol = options.agent?.startsWith('wss') ? 'wss' : 'ws';
12
+ const query = { role: 'cli' };
13
+ if (options.sessionId) {
14
+ query.sessionId = options.sessionId;
15
+ }
16
+ if (options.hasBrowser) {
17
+ query.hasBrowser = 'true';
18
+ }
19
+ const clientOptions = {
20
+ agent: AGENT_NAME,
21
+ name: env,
22
+ host,
23
+ protocol: protocol,
24
+ query,
25
+ // Use Node.js ws package as the WebSocket implementation
26
+ WebSocket: WebSocket,
27
+ };
28
+ const client = new AgentClient(clientOptions);
29
+ let browserCommandHandler = null;
30
+ // The underlying PartySocket handles reconnection.
31
+ // We listen for raw messages to intercept browser commands from the agent.
32
+ client.addEventListener('message', (event) => {
33
+ try {
34
+ const msg = JSON.parse(String(event.data));
35
+ if (msg.type?.startsWith('browser-') && msg.commandId) {
36
+ browserCommandHandler?.(msg);
37
+ }
38
+ }
39
+ catch {
40
+ // Ignore malformed messages
41
+ }
42
+ });
43
+ let settled = false;
44
+ // Wait for the agent to send identity (connection is ready).
45
+ // PartySocket retries on transient WebSocket errors, so we don't
46
+ // reject on individual error events — only on ready-rejection or timeout.
47
+ client.ready
48
+ .then(() => {
49
+ if (settled)
50
+ return;
51
+ settled = true;
52
+ const connection = {
53
+ client,
54
+ call: client.call.bind(client),
55
+ onBrowserCommand(handler) {
56
+ browserCommandHandler = handler;
57
+ },
58
+ close() {
59
+ client.close();
60
+ },
61
+ };
62
+ resolve(connection);
63
+ })
64
+ .catch((err) => {
65
+ if (settled)
66
+ return;
67
+ settled = true;
68
+ reject(err);
69
+ });
70
+ setTimeout(() => {
71
+ if (settled)
72
+ return;
73
+ settled = true;
74
+ client.close();
75
+ reject(new Error('Connection to agent timed out'));
76
+ }, 15000);
77
+ });
78
+ }
79
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/cli/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { actionsCommand } from './commands/actions.js';
4
+ import { doCommand } from './commands/do.js';
5
+ import { eventsCommand } from './commands/events.js';
6
+ import { interactCommand } from './commands/interact.js';
7
+ import { navigateCommand } from './commands/navigate.js';
8
+ import { openCommand } from './commands/open.js';
9
+ import { runCommand } from './commands/run.js';
10
+ import { startCommand } from './commands/start.js';
11
+ import { stopCommand } from './commands/stop.js';
12
+ import { tickCommand } from './commands/tick.js';
13
+ const program = new Command();
14
+ program
15
+ .name('fisgon')
16
+ .description('Low-level primitives for LLM-driven application testing')
17
+ .version('0.1.0');
18
+ program.addCommand(startCommand);
19
+ program.addCommand(stopCommand);
20
+ program.addCommand(navigateCommand);
21
+ program.addCommand(actionsCommand);
22
+ program.addCommand(openCommand);
23
+ program.addCommand(interactCommand);
24
+ program.addCommand(tickCommand);
25
+ program.addCommand(eventsCommand);
26
+ program.addCommand(doCommand);
27
+ program.addCommand(runCommand);
28
+ program.parse();
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,yDAAyD,CAAC;KACtE,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;AAC/B,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;AACnC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;AAC/B,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;AACnC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;AAC/B,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA;AACjC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;AAC7B,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;AAE9B,OAAO,CAAC,KAAK,EAAE,CAAA"}
@@ -0,0 +1,9 @@
1
+ export type SessionInfo = {
2
+ port: number;
3
+ pid: number;
4
+ sessionId: string;
5
+ agent?: string;
6
+ env?: string;
7
+ };
8
+ export declare function getRunningSession(): SessionInfo | null;
9
+ //# sourceMappingURL=session-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-file.d.ts","sourceRoot":"","sources":["../../src/cli/session-file.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,wBAAgB,iBAAiB,IAAI,WAAW,GAAG,IAAI,CAetD"}
@@ -0,0 +1,23 @@
1
+ import { readFileSync, existsSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ const SESSION_FILE = join(tmpdir(), 'fisgon.json');
5
+ export function getRunningSession() {
6
+ if (!existsSync(SESSION_FILE))
7
+ return null;
8
+ try {
9
+ const data = JSON.parse(readFileSync(SESSION_FILE, 'utf-8'));
10
+ // Check if the process is still alive
11
+ try {
12
+ process.kill(data.pid, 0);
13
+ return data;
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ }
23
+ //# sourceMappingURL=session-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-file.js","sourceRoot":"","sources":["../../src/cli/session-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAA;AAUlD,MAAM,UAAU,iBAAiB;IAChC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAA;IAE1C,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAA;QAC5D,sCAAsC;QACtC,IAAI,CAAC;YACJ,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YACzB,OAAO,IAAI,CAAA;QACZ,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,IAAI,CAAA;QACZ,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAA;IACZ,CAAC;AACF,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type TaskFile } from '../core/task-file.js';
2
+ import { type PlaywrightPage } from './browser-handler.js';
3
+ import { type AgentConnection } from './connection.js';
4
+ type ReplayOptions = {
5
+ fallback?: boolean;
6
+ verbose?: boolean;
7
+ page?: PlaywrightPage;
8
+ };
9
+ type ReplayResult = {
10
+ success: boolean;
11
+ failedStep?: number;
12
+ error?: string;
13
+ };
14
+ /**
15
+ * Replay a persisted task by executing its steps directly via agent RPC.
16
+ * Falls back to LLM for individual steps if they fail and fallback is enabled.
17
+ */
18
+ export declare function replayTask(conn: AgentConnection, sessionId: string, task: TaskFile, params: Record<string, string>, options?: ReplayOptions): Promise<ReplayResult>;
19
+ export {};
20
+ //# sourceMappingURL=task-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-runner.d.ts","sourceRoot":"","sources":["../../src/cli/task-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,KAAK,aAAa,GAAG;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,cAAc,CAAA;CACrB,CAAA;AAED,KAAK,YAAY,GAAG;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAuOD;;;GAGG;AACH,wBAAsB,UAAU,CAC/B,IAAI,EAAE,eAAe,EACrB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,OAAO,GAAE,aAAkB,GACzB,OAAO,CAAC,YAAY,CAAC,CAkFvB"}