@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.
- package/LICENSE.md +10 -0
- package/README.md +150 -0
- package/dist/adapters/drizzle.d.ts +17 -0
- package/dist/adapters/drizzle.d.ts.map +1 -0
- package/dist/adapters/drizzle.js +83 -0
- package/dist/adapters/drizzle.js.map +1 -0
- package/dist/adapters/prisma.d.ts +16 -0
- package/dist/adapters/prisma.d.ts.map +1 -0
- package/dist/adapters/prisma.js +69 -0
- package/dist/adapters/prisma.js.map +1 -0
- package/dist/agent/ai.d.ts +3 -0
- package/dist/agent/ai.d.ts.map +1 -0
- package/dist/agent/ai.js +19 -0
- package/dist/agent/ai.js.map +1 -0
- package/dist/agent/browser-bridge.d.ts +42 -0
- package/dist/agent/browser-bridge.d.ts.map +1 -0
- package/dist/agent/browser-bridge.js +2 -0
- package/dist/agent/browser-bridge.js.map +1 -0
- package/dist/agent/index.d.ts +66 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +572 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/llm-driver.d.ts +30 -0
- package/dist/agent/llm-driver.d.ts.map +1 -0
- package/dist/agent/llm-driver.js +239 -0
- package/dist/agent/llm-driver.js.map +1 -0
- package/dist/agent/session-state.d.ts +28 -0
- package/dist/agent/session-state.d.ts.map +1 -0
- package/dist/agent/session-state.js +6 -0
- package/dist/agent/session-state.js.map +1 -0
- package/dist/agent/worker.d.ts +6 -0
- package/dist/agent/worker.d.ts.map +1 -0
- package/dist/agent/worker.js +12 -0
- package/dist/agent/worker.js.map +1 -0
- package/dist/cli/browser-handler.d.ts +30 -0
- package/dist/cli/browser-handler.d.ts.map +1 -0
- package/dist/cli/browser-handler.js +89 -0
- package/dist/cli/browser-handler.js.map +1 -0
- package/dist/cli/browser-setup.d.ts +11 -0
- package/dist/cli/browser-setup.d.ts.map +1 -0
- package/dist/cli/browser-setup.js +25 -0
- package/dist/cli/browser-setup.js.map +1 -0
- package/dist/cli/commands/actions.d.ts +3 -0
- package/dist/cli/commands/actions.d.ts.map +1 -0
- package/dist/cli/commands/actions.js +28 -0
- package/dist/cli/commands/actions.js.map +1 -0
- package/dist/cli/commands/do.d.ts +3 -0
- package/dist/cli/commands/do.d.ts.map +1 -0
- package/dist/cli/commands/do.js +138 -0
- package/dist/cli/commands/do.js.map +1 -0
- package/dist/cli/commands/events.d.ts +3 -0
- package/dist/cli/commands/events.d.ts.map +1 -0
- package/dist/cli/commands/events.js +36 -0
- package/dist/cli/commands/events.js.map +1 -0
- package/dist/cli/commands/interact.d.ts +3 -0
- package/dist/cli/commands/interact.d.ts.map +1 -0
- package/dist/cli/commands/interact.js +54 -0
- package/dist/cli/commands/interact.js.map +1 -0
- package/dist/cli/commands/navigate.d.ts +3 -0
- package/dist/cli/commands/navigate.d.ts.map +1 -0
- package/dist/cli/commands/navigate.js +34 -0
- package/dist/cli/commands/navigate.js.map +1 -0
- package/dist/cli/commands/open.d.ts +3 -0
- package/dist/cli/commands/open.d.ts.map +1 -0
- package/dist/cli/commands/open.js +29 -0
- package/dist/cli/commands/open.js.map +1 -0
- package/dist/cli/commands/run.d.ts +3 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +209 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/start.d.ts +3 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +169 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +3 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +37 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/tick.d.ts +3 -0
- package/dist/cli/commands/tick.d.ts.map +1 -0
- package/dist/cli/commands/tick.js +34 -0
- package/dist/cli/commands/tick.js.map +1 -0
- package/dist/cli/config.d.ts +3 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +20 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/connection.d.ts +18 -0
- package/dist/cli/connection.d.ts.map +1 -0
- package/dist/cli/connection.js +79 -0
- package/dist/cli/connection.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +29 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/session-file.d.ts +9 -0
- package/dist/cli/session-file.d.ts.map +1 -0
- package/dist/cli/session-file.js +23 -0
- package/dist/cli/session-file.js.map +1 -0
- package/dist/cli/task-runner.d.ts +20 -0
- package/dist/cli/task-runner.d.ts.map +1 -0
- package/dist/cli/task-runner.js +318 -0
- package/dist/cli/task-runner.js.map +1 -0
- package/dist/core/task-file.d.ts +32 -0
- package/dist/core/task-file.d.ts.map +1 -0
- package/dist/core/task-file.js +51 -0
- package/dist/core/task-file.js.map +1 -0
- package/dist/core/tick-detector.d.ts +24 -0
- package/dist/core/tick-detector.d.ts.map +1 -0
- package/dist/core/tick-detector.js +71 -0
- package/dist/core/tick-detector.js.map +1 -0
- package/dist/core/types.d.ts +74 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +4 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/probes/action-scanner.d.ts +2 -0
- package/dist/probes/action-scanner.d.ts.map +1 -0
- package/dist/probes/action-scanner.js +9 -0
- package/dist/probes/action-scanner.js.map +1 -0
- package/dist/probes/fetch-probe.d.ts +2 -0
- package/dist/probes/fetch-probe.d.ts.map +1 -0
- package/dist/probes/fetch-probe.js +9 -0
- package/dist/probes/fetch-probe.js.map +1 -0
- package/dist/probes/inject.d.ts +3 -0
- package/dist/probes/inject.d.ts.map +1 -0
- package/dist/probes/inject.js +24 -0
- package/dist/probes/inject.js.map +1 -0
- package/dist/probes/navigation-probe.d.ts +2 -0
- package/dist/probes/navigation-probe.d.ts.map +1 -0
- package/dist/probes/navigation-probe.js +9 -0
- package/dist/probes/navigation-probe.js.map +1 -0
- package/dist/probes/scripts/action-scanner.js +62 -0
- package/dist/probes/scripts/fetch.js +61 -0
- package/dist/probes/scripts/navigation.js +55 -0
- package/dist/probes/scripts/scripts/action-scanner.js +62 -0
- package/dist/probes/scripts/scripts/fetch.js +61 -0
- package/dist/probes/scripts/scripts/navigation.js +55 -0
- package/dist/probes/scripts/scripts/ws-bootstrap.js +35 -0
- package/dist/probes/scripts/ws-bootstrap.js +35 -0
- package/dist/server/create-probe.d.ts +8 -0
- package/dist/server/create-probe.d.ts.map +1 -0
- package/dist/server/create-probe.js +73 -0
- package/dist/server/create-probe.js.map +1 -0
- package/dist/server/sql-parser.d.ts +6 -0
- package/dist/server/sql-parser.d.ts.map +1 -0
- package/dist/server/sql-parser.js +40 -0
- package/dist/server/sql-parser.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,572 @@
|
|
|
1
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
2
|
+
var useValue = arguments.length > 2;
|
|
3
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
4
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
5
|
+
}
|
|
6
|
+
return useValue ? value : void 0;
|
|
7
|
+
};
|
|
8
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
9
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
10
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
11
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
12
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
13
|
+
var _, done = false;
|
|
14
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
15
|
+
var context = {};
|
|
16
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
17
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
18
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
19
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
20
|
+
if (kind === "accessor") {
|
|
21
|
+
if (result === void 0) continue;
|
|
22
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
23
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
24
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
25
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
26
|
+
}
|
|
27
|
+
else if (_ = accept(result)) {
|
|
28
|
+
if (kind === "field") initializers.unshift(_);
|
|
29
|
+
else descriptor[key] = _;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
33
|
+
done = true;
|
|
34
|
+
};
|
|
35
|
+
import { Agent, callable, getCurrentAgent } from 'agents';
|
|
36
|
+
import { TickDetector } from '../core/tick-detector.js';
|
|
37
|
+
import { runTask, distillSteps, matchTasks } from './llm-driver.js';
|
|
38
|
+
import { initialAgentState } from './session-state.js';
|
|
39
|
+
let FisgonAgent = (() => {
|
|
40
|
+
let _classSuper = Agent;
|
|
41
|
+
let _instanceExtraInitializers = [];
|
|
42
|
+
let _startSession_decorators;
|
|
43
|
+
let _stopSession_decorators;
|
|
44
|
+
let _navigate_decorators;
|
|
45
|
+
let _performTask_decorators;
|
|
46
|
+
let _distillTask_decorators;
|
|
47
|
+
let _matchTasks_decorators;
|
|
48
|
+
let _getActions_decorators;
|
|
49
|
+
let _openAction_decorators;
|
|
50
|
+
let _interact_decorators;
|
|
51
|
+
let _waitForNextTick_decorators;
|
|
52
|
+
let _getEvents_decorators;
|
|
53
|
+
let _listSessions_decorators;
|
|
54
|
+
let _emitEvent_decorators;
|
|
55
|
+
return class FisgonAgent extends _classSuper {
|
|
56
|
+
static {
|
|
57
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
58
|
+
_startSession_decorators = [callable()];
|
|
59
|
+
_stopSession_decorators = [callable()];
|
|
60
|
+
_navigate_decorators = [callable()];
|
|
61
|
+
_performTask_decorators = [callable()];
|
|
62
|
+
_distillTask_decorators = [callable()];
|
|
63
|
+
_matchTasks_decorators = [callable()];
|
|
64
|
+
_getActions_decorators = [callable()];
|
|
65
|
+
_openAction_decorators = [callable()];
|
|
66
|
+
_interact_decorators = [callable()];
|
|
67
|
+
_waitForNextTick_decorators = [callable()];
|
|
68
|
+
_getEvents_decorators = [callable()];
|
|
69
|
+
_listSessions_decorators = [callable()];
|
|
70
|
+
_emitEvent_decorators = [callable()];
|
|
71
|
+
__esDecorate(this, null, _startSession_decorators, { kind: "method", name: "startSession", static: false, private: false, access: { has: obj => "startSession" in obj, get: obj => obj.startSession }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
72
|
+
__esDecorate(this, null, _stopSession_decorators, { kind: "method", name: "stopSession", static: false, private: false, access: { has: obj => "stopSession" in obj, get: obj => obj.stopSession }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
73
|
+
__esDecorate(this, null, _navigate_decorators, { kind: "method", name: "navigate", static: false, private: false, access: { has: obj => "navigate" in obj, get: obj => obj.navigate }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
74
|
+
__esDecorate(this, null, _performTask_decorators, { kind: "method", name: "performTask", static: false, private: false, access: { has: obj => "performTask" in obj, get: obj => obj.performTask }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
75
|
+
__esDecorate(this, null, _distillTask_decorators, { kind: "method", name: "distillTask", static: false, private: false, access: { has: obj => "distillTask" in obj, get: obj => obj.distillTask }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
76
|
+
__esDecorate(this, null, _matchTasks_decorators, { kind: "method", name: "matchTasks", static: false, private: false, access: { has: obj => "matchTasks" in obj, get: obj => obj.matchTasks }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
77
|
+
__esDecorate(this, null, _getActions_decorators, { kind: "method", name: "getActions", static: false, private: false, access: { has: obj => "getActions" in obj, get: obj => obj.getActions }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
78
|
+
__esDecorate(this, null, _openAction_decorators, { kind: "method", name: "openAction", static: false, private: false, access: { has: obj => "openAction" in obj, get: obj => obj.openAction }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
79
|
+
__esDecorate(this, null, _interact_decorators, { kind: "method", name: "interact", static: false, private: false, access: { has: obj => "interact" in obj, get: obj => obj.interact }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
80
|
+
__esDecorate(this, null, _waitForNextTick_decorators, { kind: "method", name: "waitForNextTick", static: false, private: false, access: { has: obj => "waitForNextTick" in obj, get: obj => obj.waitForNextTick }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
81
|
+
__esDecorate(this, null, _getEvents_decorators, { kind: "method", name: "getEvents", static: false, private: false, access: { has: obj => "getEvents" in obj, get: obj => obj.getEvents }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
82
|
+
__esDecorate(this, null, _listSessions_decorators, { kind: "method", name: "listSessions", static: false, private: false, access: { has: obj => "listSessions" in obj, get: obj => obj.listSessions }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
83
|
+
__esDecorate(this, null, _emitEvent_decorators, { kind: "method", name: "emitEvent", static: false, private: false, access: { has: obj => "emitEvent" in obj, get: obj => obj.emitEvent }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
84
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
85
|
+
}
|
|
86
|
+
initialState = (__runInitializers(this, _instanceExtraInitializers), { ...initialAgentState });
|
|
87
|
+
// Per-session in-memory runtime (not persisted — rebuilt on connect)
|
|
88
|
+
sessions = new Map();
|
|
89
|
+
dbInitialized = false;
|
|
90
|
+
// ── Database setup ──────────────────────────────────────────
|
|
91
|
+
initDb() {
|
|
92
|
+
if (this.dbInitialized)
|
|
93
|
+
return;
|
|
94
|
+
this.sql `
|
|
95
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
96
|
+
id TEXT PRIMARY KEY,
|
|
97
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
98
|
+
browser_mode TEXT NOT NULL DEFAULT 'local',
|
|
99
|
+
config TEXT NOT NULL,
|
|
100
|
+
created_at INTEGER NOT NULL,
|
|
101
|
+
updated_at INTEGER NOT NULL
|
|
102
|
+
)
|
|
103
|
+
`;
|
|
104
|
+
this.sql `
|
|
105
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
106
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
107
|
+
session_id TEXT NOT NULL,
|
|
108
|
+
tick_id INTEGER,
|
|
109
|
+
source TEXT NOT NULL,
|
|
110
|
+
type TEXT NOT NULL,
|
|
111
|
+
timestamp INTEGER NOT NULL,
|
|
112
|
+
data TEXT
|
|
113
|
+
)
|
|
114
|
+
`;
|
|
115
|
+
this.sql `
|
|
116
|
+
CREATE TABLE IF NOT EXISTS ticks (
|
|
117
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
118
|
+
session_id TEXT NOT NULL,
|
|
119
|
+
started_at INTEGER NOT NULL,
|
|
120
|
+
duration INTEGER NOT NULL
|
|
121
|
+
)
|
|
122
|
+
`;
|
|
123
|
+
this.sql `CREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id)`;
|
|
124
|
+
this.sql `CREATE INDEX IF NOT EXISTS idx_events_tick ON events(tick_id)`;
|
|
125
|
+
this.sql `CREATE INDEX IF NOT EXISTS idx_ticks_session ON ticks(session_id)`;
|
|
126
|
+
this.dbInitialized = true;
|
|
127
|
+
}
|
|
128
|
+
// ── Connection lifecycle ────────────────────────────────────
|
|
129
|
+
async onConnect(connection) {
|
|
130
|
+
this.initDb();
|
|
131
|
+
const { request } = getCurrentAgent();
|
|
132
|
+
const url = new URL(request.url);
|
|
133
|
+
const role = (url.searchParams.get('role') ?? 'cli');
|
|
134
|
+
const sessionId = url.searchParams.get('sessionId');
|
|
135
|
+
const hasBrowser = url.searchParams.get('hasBrowser') === 'true';
|
|
136
|
+
connection.setState({
|
|
137
|
+
role,
|
|
138
|
+
sessionId,
|
|
139
|
+
connectedAt: Date.now(),
|
|
140
|
+
hasBrowser,
|
|
141
|
+
});
|
|
142
|
+
if (role === 'cli' && sessionId) {
|
|
143
|
+
try {
|
|
144
|
+
const runtime = this.requireRuntime(sessionId);
|
|
145
|
+
if (hasBrowser || !runtime.cliConnection) {
|
|
146
|
+
runtime.cliConnection = connection;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Session may not exist (e.g. first connection before startSession)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async onClose(connection) {
|
|
155
|
+
const connState = connection.state;
|
|
156
|
+
if (connState?.role === 'cli' && connState.sessionId) {
|
|
157
|
+
const runtime = this.sessions.get(connState.sessionId);
|
|
158
|
+
if (runtime?.cliConnection?.id === connection.id) {
|
|
159
|
+
runtime.cliConnection = null;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// onRequest handles HTTP requests (e.g. from server probes via agentFetch)
|
|
164
|
+
async onRequest(request) {
|
|
165
|
+
this.initDb();
|
|
166
|
+
if (request.method === 'POST') {
|
|
167
|
+
try {
|
|
168
|
+
const body = await request.json();
|
|
169
|
+
if (body.type === 'ingest-event' && body.event) {
|
|
170
|
+
this.ingestEvent(body.event);
|
|
171
|
+
return new Response('ok', { status: 200 });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return new Response('bad request', { status: 400 });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return new Response('not found', { status: 404 });
|
|
179
|
+
}
|
|
180
|
+
// onMessage handles raw messages that aren't RPC:
|
|
181
|
+
// - Events from browser probes (PartySocket)
|
|
182
|
+
// - Browser command results from CLI
|
|
183
|
+
// RPC messages (from AgentClient) are routed to @callable methods by the base class.
|
|
184
|
+
async onMessage(connection, message) {
|
|
185
|
+
this.initDb();
|
|
186
|
+
const text = typeof message === 'string' ? message : new TextDecoder().decode(message);
|
|
187
|
+
let msg;
|
|
188
|
+
try {
|
|
189
|
+
msg = JSON.parse(text);
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
// Browser result from CLI (local mode)
|
|
195
|
+
if (msg.type === 'browser-result' && typeof msg.commandId === 'string') {
|
|
196
|
+
this.handleBrowserResult(msg, connection);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
// Event from browser probe
|
|
200
|
+
if (msg.type === 'event' && msg.event) {
|
|
201
|
+
this.ingestEvent(msg.event);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// ── RPC methods (called by AgentClient.call) ────────────────
|
|
206
|
+
startSession(config, browserMode, identity) {
|
|
207
|
+
this.initDb();
|
|
208
|
+
const { connection } = getCurrentAgent();
|
|
209
|
+
const sessionId = crypto.randomUUID();
|
|
210
|
+
const now = Date.now();
|
|
211
|
+
// Insert into SQLite
|
|
212
|
+
this.sql `
|
|
213
|
+
INSERT INTO sessions (id, status, browser_mode, config, created_at, updated_at)
|
|
214
|
+
VALUES (${sessionId}, 'active', ${browserMode}, ${JSON.stringify(config)}, ${now}, ${now})
|
|
215
|
+
`;
|
|
216
|
+
// Create in-memory runtime
|
|
217
|
+
const runtime = {
|
|
218
|
+
tickDetector: new TickDetector({
|
|
219
|
+
silenceMs: config.tick?.silenceMs,
|
|
220
|
+
maxMs: config.tick?.maxMs,
|
|
221
|
+
onTick: (tick) => this.handleTickComplete(sessionId, tick),
|
|
222
|
+
}),
|
|
223
|
+
cliConnection: connection ?? null,
|
|
224
|
+
browserMode,
|
|
225
|
+
identity: identity ?? config.identity ?? null,
|
|
226
|
+
pendingBrowserCallbacks: new Map(),
|
|
227
|
+
browserCommandId: 0,
|
|
228
|
+
pendingTickResolvers: [],
|
|
229
|
+
};
|
|
230
|
+
runtime.tickDetector.setSession(sessionId);
|
|
231
|
+
this.sessions.set(sessionId, runtime);
|
|
232
|
+
// Update connection state with session ID
|
|
233
|
+
if (connection) {
|
|
234
|
+
connection.setState({
|
|
235
|
+
...connection.state,
|
|
236
|
+
sessionId,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
// Broadcast active session IDs to all clients (server probes use onStateUpdate)
|
|
240
|
+
this.broadcastState();
|
|
241
|
+
return { sessionId };
|
|
242
|
+
}
|
|
243
|
+
async stopSession(sessionId) {
|
|
244
|
+
this.initDb();
|
|
245
|
+
const runtime = this.requireRuntime(sessionId);
|
|
246
|
+
// Update DB
|
|
247
|
+
this.sql `
|
|
248
|
+
UPDATE sessions SET status = 'stopped', updated_at = ${Date.now()}
|
|
249
|
+
WHERE id = ${sessionId}
|
|
250
|
+
`;
|
|
251
|
+
// Close browser
|
|
252
|
+
if (runtime.browserMode === 'local' && runtime.cliConnection) {
|
|
253
|
+
try {
|
|
254
|
+
await this.sendBrowserCommand(runtime, { type: 'browser-close' });
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
// Browser might already be closed
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// Cleanup runtime
|
|
261
|
+
runtime.tickDetector.reset();
|
|
262
|
+
this.sessions.delete(sessionId);
|
|
263
|
+
this.broadcastState();
|
|
264
|
+
}
|
|
265
|
+
async navigate(sessionId, url, asIdentity) {
|
|
266
|
+
this.initDb();
|
|
267
|
+
const runtime = this.requireRuntime(sessionId);
|
|
268
|
+
if (asIdentity) {
|
|
269
|
+
const [session] = this.sql `SELECT config FROM sessions WHERE id = ${sessionId}`;
|
|
270
|
+
const config = JSON.parse(session.config);
|
|
271
|
+
const identityMap = runtime.identity ?? config.identity;
|
|
272
|
+
if (!identityMap) {
|
|
273
|
+
throw new Error('No identities configured');
|
|
274
|
+
}
|
|
275
|
+
const creds = identityMap[asIdentity];
|
|
276
|
+
if (!creds) {
|
|
277
|
+
throw new Error(`Unknown identity: ${asIdentity}`);
|
|
278
|
+
}
|
|
279
|
+
if (!config.loginUrl) {
|
|
280
|
+
throw new Error('No loginUrl configured');
|
|
281
|
+
}
|
|
282
|
+
const instruction = [
|
|
283
|
+
`Log in at ${config.loginUrl} using email ${creds.email} and password ${creds.password}.`,
|
|
284
|
+
`Then navigate to ${url}.`,
|
|
285
|
+
'Use server-side events to handle flows that require out-of-band verification',
|
|
286
|
+
'(e.g. magic links — the email content will appear as a probe event).',
|
|
287
|
+
].join(' ');
|
|
288
|
+
const ctx = await this.createTaskContext(runtime, sessionId);
|
|
289
|
+
await runTask(ctx, instruction);
|
|
290
|
+
// Return the last tick after the LLM is done
|
|
291
|
+
const tick = await this.waitForTick(runtime, 10000).catch(() => ({
|
|
292
|
+
id: 0,
|
|
293
|
+
sessionId,
|
|
294
|
+
startedAt: Date.now(),
|
|
295
|
+
duration: 0,
|
|
296
|
+
events: [],
|
|
297
|
+
}));
|
|
298
|
+
return { tick };
|
|
299
|
+
}
|
|
300
|
+
await this.sendBrowserCommand(runtime, { type: 'browser-navigate', url });
|
|
301
|
+
const tick = await this.waitForTick(runtime, 10000);
|
|
302
|
+
return { tick };
|
|
303
|
+
}
|
|
304
|
+
async performTask(sessionId, instruction) {
|
|
305
|
+
this.initDb();
|
|
306
|
+
const runtime = this.requireRuntime(sessionId);
|
|
307
|
+
const ctx = await this.createTaskContext(runtime, sessionId);
|
|
308
|
+
const result = await runTask(ctx, instruction);
|
|
309
|
+
return { result };
|
|
310
|
+
}
|
|
311
|
+
async distillTask(sessionId, stepLogs, instruction, finalUrl) {
|
|
312
|
+
this.initDb();
|
|
313
|
+
// Verify session exists
|
|
314
|
+
this.requireRuntime(sessionId);
|
|
315
|
+
const task = await distillSteps(stepLogs, instruction, finalUrl);
|
|
316
|
+
return { task };
|
|
317
|
+
}
|
|
318
|
+
async matchTasks(instruction, tasks) {
|
|
319
|
+
return matchTasks(instruction, tasks);
|
|
320
|
+
}
|
|
321
|
+
async getActions(sessionId) {
|
|
322
|
+
this.initDb();
|
|
323
|
+
const runtime = this.requireRuntime(sessionId);
|
|
324
|
+
const actions = await this.sendBrowserCommand(runtime, { type: 'browser-actions' });
|
|
325
|
+
return { actions };
|
|
326
|
+
}
|
|
327
|
+
async openAction(sessionId, actionId) {
|
|
328
|
+
this.initDb();
|
|
329
|
+
const runtime = this.requireRuntime(sessionId);
|
|
330
|
+
const html = await this.sendBrowserCommand(runtime, { type: 'browser-open', actionId });
|
|
331
|
+
return { html };
|
|
332
|
+
}
|
|
333
|
+
async interact(sessionId, command) {
|
|
334
|
+
this.initDb();
|
|
335
|
+
const runtime = this.requireRuntime(sessionId);
|
|
336
|
+
await this.sendBrowserCommand(runtime, { type: 'browser-interact', command });
|
|
337
|
+
}
|
|
338
|
+
async waitForNextTick(sessionId, timeout) {
|
|
339
|
+
this.initDb();
|
|
340
|
+
const runtime = this.requireRuntime(sessionId);
|
|
341
|
+
const tick = await this.waitForTick(runtime, timeout ?? 30000);
|
|
342
|
+
return { tick };
|
|
343
|
+
}
|
|
344
|
+
getEvents(sessionId) {
|
|
345
|
+
this.initDb();
|
|
346
|
+
const events = this.sql `
|
|
347
|
+
SELECT source, type, timestamp, data FROM events
|
|
348
|
+
WHERE session_id = ${sessionId}
|
|
349
|
+
ORDER BY timestamp ASC
|
|
350
|
+
`;
|
|
351
|
+
return {
|
|
352
|
+
events: events.map((e) => ({
|
|
353
|
+
sessionId,
|
|
354
|
+
source: e.source,
|
|
355
|
+
type: e.type,
|
|
356
|
+
timestamp: e.timestamp,
|
|
357
|
+
data: JSON.parse(e.data),
|
|
358
|
+
})),
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
listSessions() {
|
|
362
|
+
this.initDb();
|
|
363
|
+
const sessions = this.sql `
|
|
364
|
+
SELECT id, status, browser_mode, created_at FROM sessions
|
|
365
|
+
ORDER BY created_at DESC
|
|
366
|
+
`;
|
|
367
|
+
return {
|
|
368
|
+
sessions: sessions.map((s) => ({
|
|
369
|
+
id: s.id,
|
|
370
|
+
status: s.status,
|
|
371
|
+
browserMode: s.browser_mode,
|
|
372
|
+
createdAt: s.created_at,
|
|
373
|
+
})),
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
emitEvent(event) {
|
|
377
|
+
this.initDb();
|
|
378
|
+
this.ingestEvent(event);
|
|
379
|
+
}
|
|
380
|
+
// ── Event ingestion ─────────────────────────────────────────
|
|
381
|
+
ingestEvent(event) {
|
|
382
|
+
const runtime = this.sessions.get(event.sessionId);
|
|
383
|
+
if (!runtime)
|
|
384
|
+
return;
|
|
385
|
+
// Verify session is active in DB
|
|
386
|
+
const [session] = this.sql `
|
|
387
|
+
SELECT status FROM sessions WHERE id = ${event.sessionId}
|
|
388
|
+
`;
|
|
389
|
+
if (!session || session.status !== 'active')
|
|
390
|
+
return;
|
|
391
|
+
// Store event in SQLite (tick_id null until tick completes)
|
|
392
|
+
this.sql `
|
|
393
|
+
INSERT INTO events (session_id, source, type, timestamp, data)
|
|
394
|
+
VALUES (${event.sessionId}, ${event.source}, ${event.type}, ${event.timestamp}, ${JSON.stringify(event.data)})
|
|
395
|
+
`;
|
|
396
|
+
runtime.tickDetector.ingest(event);
|
|
397
|
+
}
|
|
398
|
+
handleTickComplete(sessionId, tick) {
|
|
399
|
+
// Create tick in DB
|
|
400
|
+
this.sql `
|
|
401
|
+
INSERT INTO ticks (session_id, started_at, duration)
|
|
402
|
+
VALUES (${sessionId}, ${tick.startedAt}, ${tick.duration})
|
|
403
|
+
`;
|
|
404
|
+
// Get the tick ID
|
|
405
|
+
const [tickRow] = this.sql `
|
|
406
|
+
SELECT id FROM ticks WHERE session_id = ${sessionId} ORDER BY id DESC LIMIT 1
|
|
407
|
+
`;
|
|
408
|
+
const tickId = tickRow.id;
|
|
409
|
+
// Update tick ID with the actual DB-assigned ID
|
|
410
|
+
tick.id = tickId;
|
|
411
|
+
// Associate buffered events with this tick
|
|
412
|
+
this.sql `
|
|
413
|
+
UPDATE events SET tick_id = ${tickId}
|
|
414
|
+
WHERE session_id = ${sessionId} AND tick_id IS NULL
|
|
415
|
+
`;
|
|
416
|
+
// Resolve pending tick waiters
|
|
417
|
+
const runtime = this.sessions.get(sessionId);
|
|
418
|
+
if (runtime) {
|
|
419
|
+
for (const resolve of runtime.pendingTickResolvers) {
|
|
420
|
+
resolve(tick);
|
|
421
|
+
}
|
|
422
|
+
runtime.pendingTickResolvers = [];
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
// ── Browser command delegation ──────────────────────────────
|
|
426
|
+
handleBrowserResult(msg, connection) {
|
|
427
|
+
// Find which session this CLI connection belongs to
|
|
428
|
+
const connState = connection.state;
|
|
429
|
+
const sessionId = connState?.sessionId;
|
|
430
|
+
if (!sessionId)
|
|
431
|
+
return;
|
|
432
|
+
const runtime = this.sessions.get(sessionId);
|
|
433
|
+
if (!runtime)
|
|
434
|
+
return;
|
|
435
|
+
const cb = runtime.pendingBrowserCallbacks.get(msg.commandId);
|
|
436
|
+
if (!cb)
|
|
437
|
+
return;
|
|
438
|
+
runtime.pendingBrowserCallbacks.delete(msg.commandId);
|
|
439
|
+
if (msg.success) {
|
|
440
|
+
cb.resolve(msg.data);
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
cb.reject(new Error(msg.error));
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
sendBrowserCommand(runtime, command) {
|
|
447
|
+
if (runtime.browserMode === 'remote') {
|
|
448
|
+
return Promise.reject(new Error('Remote browser mode not yet implemented'));
|
|
449
|
+
}
|
|
450
|
+
// Local mode: forward to CLI connection
|
|
451
|
+
return new Promise((resolve, reject) => {
|
|
452
|
+
if (!runtime.cliConnection) {
|
|
453
|
+
reject(new Error('No CLI connection — browser not available'));
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
456
|
+
const commandId = String(++runtime.browserCommandId);
|
|
457
|
+
runtime.pendingBrowserCallbacks.set(commandId, { resolve, reject });
|
|
458
|
+
runtime.cliConnection.send(JSON.stringify({ ...command, commandId }));
|
|
459
|
+
setTimeout(() => {
|
|
460
|
+
if (runtime.pendingBrowserCallbacks.has(commandId)) {
|
|
461
|
+
runtime.pendingBrowserCallbacks.delete(commandId);
|
|
462
|
+
reject(new Error('Browser command timed out'));
|
|
463
|
+
}
|
|
464
|
+
}, 30000);
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
waitForTick(runtime, timeoutMs) {
|
|
468
|
+
return new Promise((resolve, reject) => {
|
|
469
|
+
const timer = setTimeout(() => {
|
|
470
|
+
const idx = runtime.pendingTickResolvers.indexOf(resolve);
|
|
471
|
+
if (idx !== -1)
|
|
472
|
+
runtime.pendingTickResolvers.splice(idx, 1);
|
|
473
|
+
reject(new Error('Tick timed out'));
|
|
474
|
+
}, timeoutMs);
|
|
475
|
+
runtime.pendingTickResolvers.push((tick) => {
|
|
476
|
+
clearTimeout(timer);
|
|
477
|
+
resolve(tick);
|
|
478
|
+
});
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
// ── Helpers ─────────────────────────────────────────────────
|
|
482
|
+
async createTaskContext(runtime, sessionId) {
|
|
483
|
+
const [session] = this.sql `SELECT config FROM sessions WHERE id = ${sessionId}`;
|
|
484
|
+
const config = JSON.parse(session.config);
|
|
485
|
+
// Get current browser URL so the LLM knows where it already is
|
|
486
|
+
let currentUrl;
|
|
487
|
+
try {
|
|
488
|
+
currentUrl = await this.sendBrowserCommand(runtime, {
|
|
489
|
+
type: 'browser-evaluate',
|
|
490
|
+
script: 'window.location.href',
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
catch {
|
|
494
|
+
// Browser may not be ready yet
|
|
495
|
+
}
|
|
496
|
+
return {
|
|
497
|
+
sendBrowserCommand: (command) => this.sendBrowserCommand(runtime, command),
|
|
498
|
+
waitForTick: (timeoutMs) => this.waitForTick(runtime, timeoutMs),
|
|
499
|
+
getEvents: () => this.getEvents(sessionId).events,
|
|
500
|
+
onStepLog: (log) => {
|
|
501
|
+
const msg = JSON.stringify({ type: 'task-step', sessionId, ...log });
|
|
502
|
+
for (const conn of this.getConnections()) {
|
|
503
|
+
const state = conn.state;
|
|
504
|
+
if (state?.role === 'cli' && state.sessionId === sessionId) {
|
|
505
|
+
conn.send(msg);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
},
|
|
509
|
+
appUrl: config.url,
|
|
510
|
+
loginUrl: config.loginUrl,
|
|
511
|
+
currentUrl,
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
requireRuntime(sessionId) {
|
|
515
|
+
const existing = this.sessions.get(sessionId);
|
|
516
|
+
if (existing)
|
|
517
|
+
return existing;
|
|
518
|
+
// Attempt to recover from SQLite (DO may have lost in-memory state)
|
|
519
|
+
this.initDb();
|
|
520
|
+
const rows = this.sql `
|
|
521
|
+
SELECT * FROM sessions WHERE id = ${sessionId} AND status = 'active'
|
|
522
|
+
`;
|
|
523
|
+
if (rows.length === 0) {
|
|
524
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
525
|
+
}
|
|
526
|
+
const session = rows[0];
|
|
527
|
+
const config = JSON.parse(session.config);
|
|
528
|
+
const runtime = {
|
|
529
|
+
tickDetector: new TickDetector({
|
|
530
|
+
silenceMs: config.tick?.silenceMs,
|
|
531
|
+
maxMs: config.tick?.maxMs,
|
|
532
|
+
onTick: (tick) => this.handleTickComplete(sessionId, tick),
|
|
533
|
+
}),
|
|
534
|
+
cliConnection: null,
|
|
535
|
+
browserMode: session.browser_mode,
|
|
536
|
+
identity: config.identity ?? null,
|
|
537
|
+
pendingBrowserCallbacks: new Map(),
|
|
538
|
+
browserCommandId: 0,
|
|
539
|
+
pendingTickResolvers: [],
|
|
540
|
+
};
|
|
541
|
+
runtime.tickDetector.setSession(sessionId);
|
|
542
|
+
this.sessions.set(sessionId, runtime);
|
|
543
|
+
// Try to find the browser-owning CLI connection for this session.
|
|
544
|
+
// Prefer the connection with hasBrowser (from `fisgon start`).
|
|
545
|
+
let fallbackConn = null;
|
|
546
|
+
for (const conn of this.getConnections()) {
|
|
547
|
+
const state = conn.state;
|
|
548
|
+
if (state?.role === 'cli' && state.sessionId === sessionId) {
|
|
549
|
+
if (state.hasBrowser) {
|
|
550
|
+
runtime.cliConnection = conn;
|
|
551
|
+
fallbackConn = null;
|
|
552
|
+
break;
|
|
553
|
+
}
|
|
554
|
+
if (!fallbackConn) {
|
|
555
|
+
fallbackConn = conn;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
if (!runtime.cliConnection && fallbackConn) {
|
|
560
|
+
runtime.cliConnection = fallbackConn;
|
|
561
|
+
}
|
|
562
|
+
return runtime;
|
|
563
|
+
}
|
|
564
|
+
broadcastState() {
|
|
565
|
+
this.setState({
|
|
566
|
+
activeSessionIds: [...this.sessions.keys()],
|
|
567
|
+
});
|
|
568
|
+
}
|
|
569
|
+
};
|
|
570
|
+
})();
|
|
571
|
+
export { FisgonAgent };
|
|
572
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type TaskFile } from '../core/task-file.js';
|
|
2
|
+
import { type ProbeEvent, type Tick } from '../core/types.js';
|
|
3
|
+
export type StepLog = {
|
|
4
|
+
step: number;
|
|
5
|
+
toolCalls: Array<{
|
|
6
|
+
name: string;
|
|
7
|
+
args: Record<string, unknown>;
|
|
8
|
+
result?: unknown;
|
|
9
|
+
}>;
|
|
10
|
+
text?: string;
|
|
11
|
+
};
|
|
12
|
+
export type TaskContext = {
|
|
13
|
+
sendBrowserCommand: (command: unknown) => Promise<unknown>;
|
|
14
|
+
waitForTick: (timeoutMs: number) => Promise<Tick>;
|
|
15
|
+
getEvents: () => ProbeEvent[];
|
|
16
|
+
onStepLog?: (log: StepLog) => void;
|
|
17
|
+
appUrl: string;
|
|
18
|
+
loginUrl?: string;
|
|
19
|
+
currentUrl?: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function runTask(ctx: TaskContext, instruction: string): Promise<string>;
|
|
22
|
+
export declare function matchTasks(instruction: string, tasks: Array<{
|
|
23
|
+
name: string;
|
|
24
|
+
description: string;
|
|
25
|
+
}>): Promise<{
|
|
26
|
+
tasks: string[] | null;
|
|
27
|
+
remaining: string | null;
|
|
28
|
+
}>;
|
|
29
|
+
export declare function distillSteps(stepLogs: StepLog[], instruction: string, finalUrl: string): Promise<TaskFile>;
|
|
30
|
+
//# sourceMappingURL=llm-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-driver.d.ts","sourceRoot":"","sources":["../../src/agent/llm-driver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAqC,KAAK,UAAU,EAAE,KAAK,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAKhG,MAAM,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC7B,MAAM,CAAC,EAAE,OAAO,CAAA;KAChB,CAAC,CAAA;IACF,IAAI,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACzB,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1D,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,SAAS,EAAE,MAAM,UAAU,EAAE,CAAA;IAC7B,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAiID,wBAAsB,OAAO,CAC5B,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CA2BjB;AAoDD,wBAAsB,UAAU,CAC/B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,GACjD,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CA0B/D;AAED,wBAAsB,YAAY,CACjC,QAAQ,EAAE,OAAO,EAAE,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC,QAAQ,CAAC,CAsBnB"}
|