@grovina/brian 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/agent.js +57 -13
  2. package/dist/agent.js.map +1 -1
  3. package/dist/channels/slack-tools.js +96 -0
  4. package/dist/channels/slack-tools.js.map +1 -0
  5. package/dist/channels/slack.js +44 -3
  6. package/dist/channels/slack.js.map +1 -1
  7. package/dist/channels/telegram-tools.js +60 -0
  8. package/dist/channels/telegram-tools.js.map +1 -0
  9. package/dist/channels/telegram.js +58 -5
  10. package/dist/channels/telegram.js.map +1 -1
  11. package/dist/client.js +15 -2
  12. package/dist/client.js.map +1 -1
  13. package/dist/downloads/resolve.js +21 -0
  14. package/dist/downloads/resolve.js.map +1 -0
  15. package/dist/downloads/save.js +36 -0
  16. package/dist/downloads/save.js.map +1 -0
  17. package/dist/downloads/ttl.js +39 -0
  18. package/dist/downloads/ttl.js.map +1 -0
  19. package/dist/model.js +73 -10
  20. package/dist/model.js.map +1 -1
  21. package/dist/start.js +63 -23
  22. package/dist/start.js.map +1 -1
  23. package/dist/tools/channel-history-tool.js +38 -0
  24. package/dist/tools/channel-history-tool.js.map +1 -0
  25. package/dist/tools/channel-router.js +2 -0
  26. package/dist/tools/channel-router.js.map +1 -0
  27. package/dist/tools/mcp.js +149 -0
  28. package/dist/tools/mcp.js.map +1 -0
  29. package/dist/tools/read-image.js +50 -0
  30. package/dist/tools/read-image.js.map +1 -0
  31. package/dist/tools/registry.js +23 -0
  32. package/dist/tools/registry.js.map +1 -0
  33. package/dist/tools/wait.js +25 -2
  34. package/dist/tools/wait.js.map +1 -1
  35. package/dist/tools/web.js +237 -0
  36. package/dist/tools/web.js.map +1 -0
  37. package/dist/web/playwright-session.js +59 -0
  38. package/dist/web/playwright-session.js.map +1 -0
  39. package/dist/web/url-policy.js +117 -0
  40. package/dist/web/url-policy.js.map +1 -0
  41. package/package.json +6 -2
  42. package/dist/tools/communication.js +0 -132
  43. package/dist/tools/communication.js.map +0 -1
@@ -0,0 +1,149 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
3
+ import { log, logError } from '../logs.js';
4
+ function safeToolSegment(name) {
5
+ const s = name.replace(/[^a-zA-Z0-9_]+/g, '_').replace(/^_+|_+$/g, '');
6
+ return s.length > 0 ? s : 'tool';
7
+ }
8
+ function jsonSchemaForTool(inputSchema) {
9
+ if (inputSchema && typeof inputSchema === 'object' && !Array.isArray(inputSchema)) {
10
+ return inputSchema;
11
+ }
12
+ return { type: 'object', properties: {} };
13
+ }
14
+ function formatCallToolResult(result) {
15
+ const r = result;
16
+ if (r.isError) {
17
+ return JSON.stringify(r);
18
+ }
19
+ const parts = [];
20
+ for (const block of r.content ?? []) {
21
+ if (block.type === 'text' && typeof block.text === 'string') {
22
+ parts.push(block.text);
23
+ }
24
+ }
25
+ if (r.structuredContent !== undefined) {
26
+ parts.push(JSON.stringify(r.structuredContent));
27
+ }
28
+ const joined = parts.join('\n\n').trim();
29
+ return joined.length > 0 ? joined : JSON.stringify(r);
30
+ }
31
+ async function listToolsWithPagination(client) {
32
+ const tools = [];
33
+ let cursor;
34
+ for (;;) {
35
+ const res = await client.listTools(cursor ? { cursor } : {});
36
+ tools.push(...(res.tools ?? []));
37
+ cursor = res.nextCursor;
38
+ if (!cursor)
39
+ break;
40
+ }
41
+ return tools;
42
+ }
43
+ async function connectMcpClient(module) {
44
+ const urlStr = String(module.config.url ?? '').trim();
45
+ if (!urlStr) {
46
+ throw new Error('MCP module missing url');
47
+ }
48
+ const url = new URL(urlStr);
49
+ const token = String(module.secrets.bearerToken ?? '').trim();
50
+ const requestInit = token
51
+ ? { headers: { Authorization: `Bearer ${token}` } }
52
+ : {};
53
+ const client = new Client({ name: 'brian-runtime', version: '0.2.0' }, { capabilities: {} });
54
+ const transport = new StreamableHTTPClientTransport(url, { requestInit });
55
+ await client.connect(transport);
56
+ return {
57
+ client,
58
+ closeTransport: () => transport.close(),
59
+ };
60
+ }
61
+ export async function createMcpToolsForModule(module) {
62
+ const slugRaw = String(module.config.slug ?? '').trim().toLowerCase();
63
+ const slug = safeToolSegment(slugRaw.length > 0 ? slugRaw : 'mcp');
64
+ const prefix = `mcp_${slug}`;
65
+ let closeTransport = null;
66
+ let client = null;
67
+ try {
68
+ const connected = await connectMcpClient(module);
69
+ client = connected.client;
70
+ closeTransport = connected.closeTransport;
71
+ const caps = client.getServerCapabilities();
72
+ if (!caps?.tools) {
73
+ log(`mcp ${slug}: server does not advertise tools`);
74
+ return {
75
+ tools: [],
76
+ dispose: async () => {
77
+ await closeTransport?.().catch(() => { });
78
+ },
79
+ };
80
+ }
81
+ const listed = await listToolsWithPagination(client);
82
+ const tools = listed.map((t) => {
83
+ const serverName = t.name;
84
+ const localName = `${prefix}_${safeToolSegment(serverName)}`;
85
+ const def = {
86
+ name: localName,
87
+ description: t.description?.trim()
88
+ ? `${t.description.trim()} (MCP · ${slug} · ${serverName})`
89
+ : `MCP tool ${serverName} on ${slug}`,
90
+ parameters: jsonSchemaForTool(t.inputSchema),
91
+ };
92
+ return {
93
+ name: localName,
94
+ definition: def,
95
+ maxResultChars: 80_000,
96
+ async execute(input) {
97
+ const c = client;
98
+ if (!c) {
99
+ return 'MCP client is not available.';
100
+ }
101
+ try {
102
+ const result = await c.callTool({
103
+ name: serverName,
104
+ arguments: input,
105
+ });
106
+ return formatCallToolResult(result);
107
+ }
108
+ catch (err) {
109
+ const msg = err instanceof Error ? err.message : String(err);
110
+ return `MCP tool error (${serverName}): ${msg}`;
111
+ }
112
+ },
113
+ };
114
+ });
115
+ return {
116
+ tools,
117
+ dispose: async () => {
118
+ await closeTransport?.().catch(() => { });
119
+ },
120
+ };
121
+ }
122
+ catch (err) {
123
+ const msg = err instanceof Error ? err.message : String(err);
124
+ logError(`mcp ${slug}: ${msg}`);
125
+ return {
126
+ tools: [],
127
+ dispose: async () => {
128
+ await closeTransport?.().catch(() => { });
129
+ },
130
+ };
131
+ }
132
+ }
133
+ export async function createMcpToolingForAgent(modules) {
134
+ const mcpModules = modules.filter((m) => m.type === 'tooling' && m.kind === 'mcp');
135
+ const disposers = [];
136
+ const tools = [];
137
+ for (const m of mcpModules) {
138
+ const { tools: nextTools, dispose } = await createMcpToolsForModule(m);
139
+ tools.push(...nextTools);
140
+ disposers.push(dispose);
141
+ }
142
+ return {
143
+ tools,
144
+ dispose: async () => {
145
+ await Promise.all(disposers.map((d) => d().catch(() => { })));
146
+ },
147
+ };
148
+ }
149
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/tools/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import fs from 'fs/promises';
2
+ import sharp from 'sharp';
3
+ import { assertDownloadsImagePath } from '../downloads/resolve.js';
4
+ export function createReadImageTool(stateDir) {
5
+ return {
6
+ name: 'read_image',
7
+ concurrencySafe: true,
8
+ maxResultChars: 4_000,
9
+ definition: {
10
+ name: 'read_image',
11
+ description: 'Load an image file and return it as native vision input (unlike bash/file tools, which only see bytes as text). Pass the absolute path from `[image: …]` in channel updates. Use detail high if small text or fine detail is unreadable at default size.',
12
+ parameters: {
13
+ type: 'object',
14
+ properties: {
15
+ path: {
16
+ type: 'string',
17
+ description: 'Absolute path exactly as in the update, under Brian state downloads',
18
+ },
19
+ detail: {
20
+ type: 'string',
21
+ description: 'standard (default, max edge ~1024px) or high (max edge ~2048px)',
22
+ enum: ['standard', 'high'],
23
+ },
24
+ },
25
+ required: ['path'],
26
+ },
27
+ },
28
+ async execute(input) {
29
+ const { path: userPath, detail } = input;
30
+ const maxEdge = detail === 'high' ? 2048 : 1024;
31
+ try {
32
+ const abs = await assertDownloadsImagePath(stateDir, userPath);
33
+ const raw = await fs.readFile(abs);
34
+ const pipeline = sharp(raw).rotate().resize(maxEdge, maxEdge, {
35
+ fit: 'inside',
36
+ withoutEnlargement: true,
37
+ });
38
+ const out = await pipeline.jpeg({ quality: detail === 'high' ? 88 : 82 }).toBuffer();
39
+ return {
40
+ text: `Image loaded (${detail === 'high' ? 'high' : 'standard'} detail, JPEG for model).`,
41
+ images: [{ mimeType: 'image/jpeg', data: out.toString('base64') }],
42
+ };
43
+ }
44
+ catch (e) {
45
+ return e instanceof Error ? e.message : String(e);
46
+ }
47
+ },
48
+ };
49
+ }
50
+ //# sourceMappingURL=read-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-image.js","sourceRoot":"","sources":["../../src/tools/read-image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,eAAe,EAAE,IAAI;QACrB,cAAc,EAAE,KAAK;QACrB,UAAU,EAAE;YACV,IAAI,EAAE,YAAY;YAClB,WAAW,EACT,0PAA0P;YAC5P,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,qEAAqE;qBACnF;oBACD,MAAM,EAAE;wBACN,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,iEAAiE;wBAC9E,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC;qBAC3B;iBACF;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACnB;SACF;QACD,KAAK,CAAC,OAAO,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,KAA0C,CAAC;YAC9E,MAAM,OAAO,GAAG,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAChD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC/D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE;oBAC5D,GAAG,EAAE,QAAQ;oBACb,kBAAkB,EAAE,IAAI;iBACzB,CAAC,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACrF,OAAO;oBACL,IAAI,EAAE,iBAAiB,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,2BAA2B;oBACzF,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;iBACnE,CAAC;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Tool naming (snake_case):
3
+ *
4
+ * - Communication: `<platform>_<verb>` — see `channels/*-tools.ts`; inbound event ids are
5
+ * `source_event_id` (see `channel-router.ts`).
6
+ * - Mind: `mind_<verb>` (list, read, write).
7
+ * - Workspace files: `file_<verb>`.
8
+ * - Shell: `bash`; long-running TTY: `terminal_run`, `terminal_read`.
9
+ * - Idle / wake: `wait`.
10
+ * - MCP (optional): `mcp_<prefix>_<server_tool>` — remote streamable HTTP MCP servers.
11
+ */
12
+ import { SLACK_TOOL_NAMES } from '../channels/slack-tools.js';
13
+ import { TELEGRAM_TOOL_NAMES } from '../channels/telegram-tools.js';
14
+ export const COMMUNICATION_TOOL_NAMES = [
15
+ ...TELEGRAM_TOOL_NAMES,
16
+ ...SLACK_TOOL_NAMES,
17
+ ];
18
+ export const MIND_TOOL_NAMES = ['mind_list', 'mind_read', 'mind_write'];
19
+ export const FILE_TOOL_NAMES = ['file_read', 'file_write', 'file_edit'];
20
+ export const TERMINAL_TOOL_NAMES = ['terminal_run', 'terminal_read'];
21
+ export const CONTROL_TOOL_NAMES = ['wait'];
22
+ export const SHELL_TOOL_NAMES = ['bash'];
23
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,GAAG,mBAAmB;IACtB,GAAG,gBAAgB;CACX,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAU,CAAC;AAEjF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,CAAU,CAAC;AAEjF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,cAAc,EAAE,eAAe,CAAU,CAAC;AAE9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAM,CAAU,CAAC;AAEpD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAM,CAAU,CAAC"}
@@ -28,7 +28,8 @@ function computeEventsCapMs(minutes, datetime) {
28
28
  }
29
29
  return Math.max(1_000, cap);
30
30
  }
31
- export function waitTool(updates) {
31
+ export function waitTool(updates, options) {
32
+ const telemetryEmit = options?.telemetryEmit;
32
33
  return {
33
34
  name: 'wait',
34
35
  definition: {
@@ -59,7 +60,7 @@ export function waitTool(updates) {
59
60
  },
60
61
  },
61
62
  async execute(input) {
62
- const { mode, minutes, datetime } = input;
63
+ const { mode, minutes, datetime, reason } = input;
63
64
  if (mode !== 'duration' && mode !== 'until' && mode !== 'events') {
64
65
  return 'Invalid wait: `mode` must be "duration", "until", or "events".';
65
66
  }
@@ -69,6 +70,10 @@ export function waitTool(updates) {
69
70
  }
70
71
  const ms = clampMinutes(minutes) * 60_000;
71
72
  await sleepMs(ms);
73
+ telemetryEmit?.({
74
+ type: 'wait',
75
+ payload: { mode: 'duration', minutes: clampMinutes(minutes), reason },
76
+ });
72
77
  return `Wait completed (duration). Current time: ${new Date().toISOString()}.`;
73
78
  }
74
79
  if (mode === 'until') {
@@ -77,15 +82,33 @@ export function waitTool(updates) {
77
82
  }
78
83
  const ms = msUntilIso(datetime);
79
84
  if (ms <= 0) {
85
+ telemetryEmit?.({
86
+ type: 'wait',
87
+ payload: { mode: 'until', datetime, reason, outcome: 'already_passed' },
88
+ });
80
89
  return `Wait completed (until — target already passed). Current time: ${new Date().toISOString()}.`;
81
90
  }
82
91
  await sleepMs(ms);
92
+ telemetryEmit?.({
93
+ type: 'wait',
94
+ payload: { mode: 'until', datetime, reason, outcome: 'slept' },
95
+ });
83
96
  return `Wait completed (until). Current time: ${new Date().toISOString()}.`;
84
97
  }
85
98
  // mode === 'events'
86
99
  const capMs = computeEventsCapMs(minutes, datetime);
87
100
  const hasUpdate = await updates.waitForUpdate(capMs);
88
101
  const end = new Date().toISOString();
102
+ telemetryEmit?.({
103
+ type: 'wait',
104
+ payload: {
105
+ mode: 'events',
106
+ minutes: minutes ?? null,
107
+ datetime: datetime ?? null,
108
+ reason,
109
+ outcome: hasUpdate ? 'event' : 'cap',
110
+ },
111
+ });
89
112
  if (hasUpdate) {
90
113
  return `Wait ended — event arrived (mode=events). Current time: ${end}.`;
91
114
  }
@@ -1 +1 @@
1
- {"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/tools/wait.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/tools/wait.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,237 @@
1
+ import { PlaywrightSession } from '../web/playwright-session.js';
2
+ import { assertUrlAllowed, webPolicyFromModuleConfig } from '../web/url-policy.js';
3
+ const SNAPSHOT_MAX_CHARS = 12_000;
4
+ const FETCH_MAX_BYTES = 256_000;
5
+ const FETCH_TIMEOUT_MS = 30_000;
6
+ async function buildAccessibilitySnapshot(page) {
7
+ const lines = await page.evaluate(() => {
8
+ const out = [];
9
+ document.querySelectorAll('[data-brian-ref]').forEach((el) => el.removeAttribute('data-brian-ref'));
10
+ const sel = [
11
+ 'a[href]',
12
+ 'button',
13
+ 'input:not([type="hidden"])',
14
+ 'select',
15
+ 'textarea',
16
+ '[role="button"]',
17
+ '[role="link"]',
18
+ '[role="textbox"]',
19
+ '[role="checkbox"]',
20
+ '[role="radio"]',
21
+ '[role="combobox"]',
22
+ ].join(', ');
23
+ const seen = new Set();
24
+ document.querySelectorAll(sel).forEach((el) => {
25
+ if (!(el instanceof HTMLElement) || seen.has(el))
26
+ return;
27
+ seen.add(el);
28
+ if (el.hasAttribute('disabled'))
29
+ return;
30
+ const style = window.getComputedStyle(el);
31
+ if (style.visibility === 'hidden' || style.display === 'none')
32
+ return;
33
+ const r = el.getBoundingClientRect();
34
+ if (r.width < 1 && r.height < 1 && el.tagName !== 'INPUT' && el.tagName !== 'SELECT')
35
+ return;
36
+ const idx = out.length + 1;
37
+ el.setAttribute('data-brian-ref', String(idx));
38
+ const tag = el.tagName.toLowerCase();
39
+ let label = '';
40
+ if (el instanceof HTMLAnchorElement) {
41
+ label = (el.textContent || el.getAttribute('aria-label') || el.href || '').trim().slice(0, 120);
42
+ }
43
+ else if (el instanceof HTMLInputElement) {
44
+ label =
45
+ el.getAttribute('aria-label') ||
46
+ el.placeholder ||
47
+ el.name ||
48
+ el.type ||
49
+ 'input';
50
+ if (el.value && el.type !== 'password')
51
+ label += ` (current: "${el.value.slice(0, 40)}")`;
52
+ }
53
+ else if (el instanceof HTMLSelectElement) {
54
+ label = el.getAttribute('aria-label') || el.name || 'select';
55
+ }
56
+ else if (el instanceof HTMLTextAreaElement) {
57
+ label = el.getAttribute('aria-label') || el.placeholder || el.name || 'textarea';
58
+ }
59
+ else {
60
+ label = (el.getAttribute('aria-label') || el.textContent || '').trim().slice(0, 120);
61
+ }
62
+ label = label.replace(/\s+/g, ' ');
63
+ out.push(`[${idx}] <${tag}> "${label}"`);
64
+ });
65
+ return out;
66
+ });
67
+ return lines.length > 0 ? lines.join('\n') : '(no interactive elements)';
68
+ }
69
+ export function createWebTools(module) {
70
+ const policy = webPolicyFromModuleConfig(module.config);
71
+ const session = new PlaywrightSession();
72
+ const tools = [
73
+ {
74
+ name: 'web_navigate',
75
+ definition: {
76
+ name: 'web_navigate',
77
+ description: 'Open a URL in the headless browser. Clears snapshot refs; call web_snapshot after. Only HTTPS (or HTTP to localhost if enabled in the Web module). Private IPs blocked.',
78
+ parameters: {
79
+ type: 'object',
80
+ properties: {
81
+ url: { type: 'string', description: 'URL to load' },
82
+ },
83
+ required: ['url'],
84
+ },
85
+ },
86
+ async execute(input) {
87
+ const { url } = input;
88
+ const blocked = assertUrlAllowed(url, policy);
89
+ if (blocked)
90
+ return blocked;
91
+ try {
92
+ await session.goto(url.trim());
93
+ return `Loaded: ${url}`;
94
+ }
95
+ catch (e) {
96
+ return e instanceof Error ? e.message : String(e);
97
+ }
98
+ },
99
+ },
100
+ {
101
+ name: 'web_snapshot',
102
+ maxResultChars: SNAPSHOT_MAX_CHARS,
103
+ definition: {
104
+ name: 'web_snapshot',
105
+ description: 'List interactive elements with numeric refs for web_click / web_fill. Refs are valid until the next web_navigate or web_snapshot.',
106
+ parameters: { type: 'object', properties: {} },
107
+ },
108
+ async execute() {
109
+ try {
110
+ const page = await session.getPage();
111
+ const text = await buildAccessibilitySnapshot(page);
112
+ session.snapshotValid = true;
113
+ return text;
114
+ }
115
+ catch (e) {
116
+ return e instanceof Error ? e.message : String(e);
117
+ }
118
+ },
119
+ },
120
+ {
121
+ name: 'web_click',
122
+ definition: {
123
+ name: 'web_click',
124
+ description: 'Click the element from the latest web_snapshot by ref number.',
125
+ parameters: {
126
+ type: 'object',
127
+ properties: {
128
+ ref: { type: 'number', description: 'Ref from web_snapshot' },
129
+ },
130
+ required: ['ref'],
131
+ },
132
+ },
133
+ async execute(input) {
134
+ const { ref } = input;
135
+ if (!session.snapshotValid)
136
+ return 'Call web_snapshot first (web_navigate clears refs).';
137
+ if (!Number.isFinite(ref) || ref < 1)
138
+ return 'Invalid ref.';
139
+ try {
140
+ const page = await session.getPage();
141
+ const loc = page.locator(`[data-brian-ref="${Math.floor(ref)}"]`);
142
+ const n = await loc.count();
143
+ if (n === 0)
144
+ return `No element for ref ${ref}. Run web_snapshot again.`;
145
+ await loc.first().click({ timeout: 15_000 });
146
+ session.invalidateSnapshot();
147
+ return `Clicked ref ${ref}.`;
148
+ }
149
+ catch (e) {
150
+ return e instanceof Error ? e.message : String(e);
151
+ }
152
+ },
153
+ },
154
+ {
155
+ name: 'web_fill',
156
+ definition: {
157
+ name: 'web_fill',
158
+ description: 'Fill an input, textarea, or select from the latest web_snapshot by ref.',
159
+ parameters: {
160
+ type: 'object',
161
+ properties: {
162
+ ref: { type: 'number', description: 'Ref from web_snapshot' },
163
+ value: { type: 'string', description: 'Text to enter' },
164
+ },
165
+ required: ['ref', 'value'],
166
+ },
167
+ },
168
+ async execute(input) {
169
+ const { ref, value } = input;
170
+ if (!session.snapshotValid)
171
+ return 'Call web_snapshot first (web_navigate clears refs).';
172
+ if (!Number.isFinite(ref) || ref < 1)
173
+ return 'Invalid ref.';
174
+ try {
175
+ const page = await session.getPage();
176
+ const loc = page.locator(`[data-brian-ref="${Math.floor(ref)}"]`);
177
+ const n = await loc.count();
178
+ if (n === 0)
179
+ return `No element for ref ${ref}. Run web_snapshot again.`;
180
+ await loc.first().fill(value, { timeout: 15_000 });
181
+ return `Filled ref ${ref}.`;
182
+ }
183
+ catch (e) {
184
+ return e instanceof Error ? e.message : String(e);
185
+ }
186
+ },
187
+ },
188
+ {
189
+ name: 'web_fetch',
190
+ maxResultChars: SNAPSHOT_MAX_CHARS,
191
+ definition: {
192
+ name: 'web_fetch',
193
+ description: 'HTTP GET a URL and return response body as text (no JavaScript). Same URL rules as web_navigate.',
194
+ parameters: {
195
+ type: 'object',
196
+ properties: {
197
+ url: { type: 'string', description: 'URL to fetch' },
198
+ },
199
+ required: ['url'],
200
+ },
201
+ },
202
+ async execute(input) {
203
+ const { url } = input;
204
+ const blocked = assertUrlAllowed(url, policy);
205
+ if (blocked)
206
+ return blocked;
207
+ const ac = new AbortController();
208
+ const t = setTimeout(() => ac.abort(), FETCH_TIMEOUT_MS);
209
+ try {
210
+ const res = await fetch(url.trim(), {
211
+ redirect: 'follow',
212
+ signal: ac.signal,
213
+ headers: { 'user-agent': 'BrianAgent/1.0' },
214
+ });
215
+ const buf = new Uint8Array(await res.arrayBuffer());
216
+ const slice = buf.slice(0, FETCH_MAX_BYTES);
217
+ let text = new TextDecoder('utf-8', { fatal: false }).decode(slice);
218
+ if (buf.length > FETCH_MAX_BYTES) {
219
+ text += `\n\n(truncated at ${FETCH_MAX_BYTES} bytes)`;
220
+ }
221
+ return `HTTP ${res.status}\n\n${text}`;
222
+ }
223
+ catch (e) {
224
+ return e instanceof Error ? e.message : String(e);
225
+ }
226
+ finally {
227
+ clearTimeout(t);
228
+ }
229
+ },
230
+ },
231
+ ];
232
+ return {
233
+ tools,
234
+ dispose: () => session.close(),
235
+ };
236
+ }
237
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/tools/web.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { chromium } from 'playwright';
2
+ const GOTO_TIMEOUT_MS = 60_000;
3
+ export class PlaywrightSession {
4
+ browser = null;
5
+ context = null;
6
+ page = null;
7
+ snapshotValid = false;
8
+ async getPage() {
9
+ if (!this.browser) {
10
+ this.browser = await chromium.launch({
11
+ headless: true,
12
+ args: ['--no-sandbox', '--disable-setuid-sandbox'],
13
+ });
14
+ }
15
+ if (!this.context) {
16
+ this.context = await this.browser.newContext({
17
+ ignoreHTTPSErrors: false,
18
+ });
19
+ }
20
+ if (!this.page) {
21
+ this.page = await this.context.newPage();
22
+ this.page.setDefaultTimeout(GOTO_TIMEOUT_MS);
23
+ }
24
+ return this.page;
25
+ }
26
+ async goto(url) {
27
+ const page = await this.getPage();
28
+ await page.goto(url, { waitUntil: 'domcontentloaded', timeout: GOTO_TIMEOUT_MS });
29
+ this.snapshotValid = false;
30
+ }
31
+ invalidateSnapshot() {
32
+ this.snapshotValid = false;
33
+ }
34
+ async close() {
35
+ try {
36
+ await this.page?.close();
37
+ }
38
+ catch {
39
+ /* ignore */
40
+ }
41
+ this.page = null;
42
+ try {
43
+ await this.context?.close();
44
+ }
45
+ catch {
46
+ /* ignore */
47
+ }
48
+ this.context = null;
49
+ try {
50
+ await this.browser?.close();
51
+ }
52
+ catch {
53
+ /* ignore */
54
+ }
55
+ this.browser = null;
56
+ this.snapshotValid = false;
57
+ }
58
+ }
59
+ //# sourceMappingURL=playwright-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-session.js","sourceRoot":"","sources":["../../src/web/playwright-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAgD,MAAM,YAAY,CAAC;AAEpF,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,MAAM,OAAO,iBAAiB;IACpB,OAAO,GAAmB,IAAI,CAAC;IAC/B,OAAO,GAA0B,IAAI,CAAC;IACtC,IAAI,GAAgB,IAAI,CAAC;IACjC,aAAa,GAAG,KAAK,CAAC;IAEtB,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;gBACnC,QAAQ,EAAE,IAAI;gBACd,IAAI,EAAE,CAAC,cAAc,EAAE,0BAA0B,CAAC;aACnD,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;gBAC3C,iBAAiB,EAAE,KAAK;aACzB,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;CACF"}