agent-orcha 0.0.5 → 0.0.7
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/README.md +194 -1277
- package/dist/lib/agents/agent-executor.d.ts +4 -2
- package/dist/lib/agents/agent-executor.d.ts.map +1 -1
- package/dist/lib/agents/agent-executor.js +68 -52
- package/dist/lib/agents/agent-executor.js.map +1 -1
- package/dist/lib/agents/agent-loader.d.ts +3 -0
- package/dist/lib/agents/agent-loader.d.ts.map +1 -1
- package/dist/lib/agents/agent-loader.js +10 -1
- package/dist/lib/agents/agent-loader.js.map +1 -1
- package/dist/lib/agents/react-loop.d.ts.map +1 -1
- package/dist/lib/agents/react-loop.js +180 -142
- package/dist/lib/agents/react-loop.js.map +1 -1
- package/dist/lib/agents/types.d.ts +181 -18
- package/dist/lib/agents/types.d.ts.map +1 -1
- package/dist/lib/agents/types.js +18 -2
- package/dist/lib/agents/types.js.map +1 -1
- package/dist/lib/functions/function-loader.d.ts +2 -0
- package/dist/lib/functions/function-loader.d.ts.map +1 -1
- package/dist/lib/functions/function-loader.js +10 -0
- package/dist/lib/functions/function-loader.js.map +1 -1
- package/dist/lib/integrations/email.d.ts +38 -0
- package/dist/lib/integrations/email.d.ts.map +1 -0
- package/dist/lib/integrations/email.js +249 -0
- package/dist/lib/integrations/email.js.map +1 -0
- package/dist/lib/integrations/integration-manager.d.ts +5 -0
- package/dist/lib/integrations/integration-manager.d.ts.map +1 -1
- package/dist/lib/integrations/integration-manager.js +53 -3
- package/dist/lib/integrations/integration-manager.js.map +1 -1
- package/dist/lib/integrations/types.d.ts +187 -4
- package/dist/lib/integrations/types.d.ts.map +1 -1
- package/dist/lib/integrations/types.js +24 -1
- package/dist/lib/integrations/types.js.map +1 -1
- package/dist/lib/knowledge/knowledge-store.d.ts +6 -0
- package/dist/lib/knowledge/knowledge-store.d.ts.map +1 -1
- package/dist/lib/knowledge/knowledge-store.js +71 -4
- package/dist/lib/knowledge/knowledge-store.js.map +1 -1
- package/dist/lib/knowledge/loaders/file-loaders.d.ts +8 -2
- package/dist/lib/knowledge/loaders/file-loaders.d.ts.map +1 -1
- package/dist/lib/knowledge/loaders/file-loaders.js +89 -60
- package/dist/lib/knowledge/loaders/file-loaders.js.map +1 -1
- package/dist/lib/knowledge/loaders/web-loader.d.ts +12 -3
- package/dist/lib/knowledge/loaders/web-loader.d.ts.map +1 -1
- package/dist/lib/knowledge/loaders/web-loader.js +56 -22
- package/dist/lib/knowledge/loaders/web-loader.js.map +1 -1
- package/dist/lib/knowledge/types.d.ts +56 -20
- package/dist/lib/knowledge/types.d.ts.map +1 -1
- package/dist/lib/knowledge/types.js +18 -3
- package/dist/lib/knowledge/types.js.map +1 -1
- package/dist/lib/llm/llm-call-logger.d.ts +3 -1
- package/dist/lib/llm/llm-call-logger.d.ts.map +1 -1
- package/dist/lib/llm/llm-call-logger.js +31 -26
- package/dist/lib/llm/llm-call-logger.js.map +1 -1
- package/dist/lib/llm/llm-config.d.ts +8 -0
- package/dist/lib/llm/llm-config.d.ts.map +1 -1
- package/dist/lib/llm/llm-config.js +3 -1
- package/dist/lib/llm/llm-config.js.map +1 -1
- package/dist/lib/llm/llm-factory.d.ts.map +1 -1
- package/dist/lib/llm/llm-factory.js +3 -0
- package/dist/lib/llm/llm-factory.js.map +1 -1
- package/dist/lib/llm/providers/anthropic-chat-model.d.ts +5 -1
- package/dist/lib/llm/providers/anthropic-chat-model.d.ts.map +1 -1
- package/dist/lib/llm/providers/anthropic-chat-model.js +118 -42
- package/dist/lib/llm/providers/anthropic-chat-model.js.map +1 -1
- package/dist/lib/llm/providers/gemini-chat-model.d.ts +3 -2
- package/dist/lib/llm/providers/gemini-chat-model.d.ts.map +1 -1
- package/dist/lib/llm/providers/gemini-chat-model.js +83 -24
- package/dist/lib/llm/providers/gemini-chat-model.js.map +1 -1
- package/dist/lib/llm/providers/openai-chat-model.d.ts +10 -1
- package/dist/lib/llm/providers/openai-chat-model.d.ts.map +1 -1
- package/dist/lib/llm/providers/openai-chat-model.js +233 -32
- package/dist/lib/llm/providers/openai-chat-model.js.map +1 -1
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +0 -1
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/mcp/mcp-client.d.ts.map +1 -1
- package/dist/lib/mcp/mcp-client.js +5 -3
- package/dist/lib/mcp/mcp-client.js.map +1 -1
- package/dist/lib/mcp/types.d.ts +0 -9
- package/dist/lib/mcp/types.d.ts.map +1 -1
- package/dist/lib/mcp/types.js +1 -2
- package/dist/lib/mcp/types.js.map +1 -1
- package/dist/lib/memory/memory-manager.d.ts +1 -0
- package/dist/lib/memory/memory-manager.d.ts.map +1 -1
- package/dist/lib/memory/memory-manager.js +9 -0
- package/dist/lib/memory/memory-manager.js.map +1 -1
- package/dist/lib/orchestrator.d.ts +2 -8
- package/dist/lib/orchestrator.d.ts.map +1 -1
- package/dist/lib/orchestrator.js +96 -3
- package/dist/lib/orchestrator.js.map +1 -1
- package/dist/lib/sandbox/cdp-client.d.ts +14 -0
- package/dist/lib/sandbox/cdp-client.d.ts.map +1 -0
- package/dist/lib/sandbox/cdp-client.js +113 -0
- package/dist/lib/sandbox/cdp-client.js.map +1 -0
- package/dist/lib/sandbox/html-to-markdown.d.ts +9 -1
- package/dist/lib/sandbox/html-to-markdown.d.ts.map +1 -1
- package/dist/lib/sandbox/html-to-markdown.js +67 -10
- package/dist/lib/sandbox/html-to-markdown.js.map +1 -1
- package/dist/lib/sandbox/index.d.ts +5 -0
- package/dist/lib/sandbox/index.d.ts.map +1 -1
- package/dist/lib/sandbox/index.js +4 -0
- package/dist/lib/sandbox/index.js.map +1 -1
- package/dist/lib/sandbox/page-readiness.d.ts +37 -0
- package/dist/lib/sandbox/page-readiness.d.ts.map +1 -0
- package/dist/lib/sandbox/page-readiness.js +235 -0
- package/dist/lib/sandbox/page-readiness.js.map +1 -0
- package/dist/lib/sandbox/sandbox-browser.d.ts +4 -0
- package/dist/lib/sandbox/sandbox-browser.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-browser.js +303 -0
- package/dist/lib/sandbox/sandbox-browser.js.map +1 -0
- package/dist/lib/sandbox/sandbox-file.d.ts +4 -0
- package/dist/lib/sandbox/sandbox-file.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-file.js +168 -0
- package/dist/lib/sandbox/sandbox-file.js.map +1 -0
- package/dist/lib/sandbox/sandbox-shell.d.ts +4 -0
- package/dist/lib/sandbox/sandbox-shell.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-shell.js +93 -0
- package/dist/lib/sandbox/sandbox-shell.js.map +1 -0
- package/dist/lib/sandbox/sandbox-web.d.ts.map +1 -1
- package/dist/lib/sandbox/sandbox-web.js +37 -22
- package/dist/lib/sandbox/sandbox-web.js.map +1 -1
- package/dist/lib/sandbox/types.d.ts +9 -0
- package/dist/lib/sandbox/types.d.ts.map +1 -1
- package/dist/lib/sandbox/types.js +1 -0
- package/dist/lib/sandbox/types.js.map +1 -1
- package/dist/lib/sandbox/vision-browser.d.ts +4 -0
- package/dist/lib/sandbox/vision-browser.d.ts.map +1 -0
- package/dist/lib/sandbox/vision-browser.js +289 -0
- package/dist/lib/sandbox/vision-browser.js.map +1 -0
- package/dist/lib/skills/skill-loader.d.ts +2 -0
- package/dist/lib/skills/skill-loader.d.ts.map +1 -1
- package/dist/lib/skills/skill-loader.js +12 -1
- package/dist/lib/skills/skill-loader.js.map +1 -1
- package/dist/lib/tasks/task-manager.d.ts +3 -1
- package/dist/lib/tasks/task-manager.d.ts.map +1 -1
- package/dist/lib/tasks/task-manager.js +11 -0
- package/dist/lib/tasks/task-manager.js.map +1 -1
- package/dist/lib/tasks/task-store.d.ts +1 -1
- package/dist/lib/tasks/task-store.d.ts.map +1 -1
- package/dist/lib/tasks/task-store.js.map +1 -1
- package/dist/lib/tasks/types.d.ts +18 -0
- package/dist/lib/tasks/types.d.ts.map +1 -1
- package/dist/lib/tools/built-in/integration-tools.d.ts +4 -0
- package/dist/lib/tools/built-in/integration-tools.d.ts.map +1 -0
- package/dist/lib/tools/built-in/integration-tools.js +47 -0
- package/dist/lib/tools/built-in/integration-tools.js.map +1 -0
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js +12 -6
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/knowledge-sql.tool.js +4 -3
- package/dist/lib/tools/built-in/knowledge-sql.tool.js.map +1 -1
- package/dist/lib/tools/built-in/query-validators.d.ts.map +1 -1
- package/dist/lib/tools/built-in/query-validators.js +4 -0
- package/dist/lib/tools/built-in/query-validators.js.map +1 -1
- package/dist/lib/tools/workspace/workspace-tools.d.ts +1 -0
- package/dist/lib/tools/workspace/workspace-tools.d.ts.map +1 -1
- package/dist/lib/tools/workspace/workspace-tools.js +39 -0
- package/dist/lib/tools/workspace/workspace-tools.js.map +1 -1
- package/dist/lib/triggers/cron-trigger.d.ts +1 -1
- package/dist/lib/triggers/cron-trigger.d.ts.map +1 -1
- package/dist/lib/triggers/cron-trigger.js.map +1 -1
- package/dist/lib/triggers/trigger-manager.d.ts +1 -0
- package/dist/lib/triggers/trigger-manager.d.ts.map +1 -1
- package/dist/lib/triggers/trigger-manager.js +26 -0
- package/dist/lib/triggers/trigger-manager.js.map +1 -1
- package/dist/lib/triggers/webhook-trigger.d.ts +1 -1
- package/dist/lib/triggers/webhook-trigger.d.ts.map +1 -1
- package/dist/lib/triggers/webhook-trigger.js.map +1 -1
- package/dist/lib/types/llm-types.d.ts +22 -4
- package/dist/lib/types/llm-types.d.ts.map +1 -1
- package/dist/lib/types/llm-types.js +50 -0
- package/dist/lib/types/llm-types.js.map +1 -1
- package/dist/lib/types/tool-factory.d.ts +2 -2
- package/dist/lib/types/tool-factory.d.ts.map +1 -1
- package/dist/lib/types/tool-factory.js.map +1 -1
- package/dist/lib/utils/env-substitution.d.ts +6 -0
- package/dist/lib/utils/env-substitution.d.ts.map +1 -0
- package/dist/lib/utils/env-substitution.js +15 -0
- package/dist/lib/utils/env-substitution.js.map +1 -0
- package/dist/lib/workflows/react-workflow-executor.js +3 -3
- package/dist/lib/workflows/react-workflow-executor.js.map +1 -1
- package/dist/lib/workflows/types.d.ts +10 -10
- package/dist/lib/workflows/workflow-loader.d.ts +3 -0
- package/dist/lib/workflows/workflow-loader.d.ts.map +1 -1
- package/dist/lib/workflows/workflow-loader.js +10 -1
- package/dist/lib/workflows/workflow-loader.js.map +1 -1
- package/dist/public/chat.html +114 -0
- package/dist/public/index.html +157 -0
- package/dist/public/src/components/AgentComposer.js +807 -0
- package/dist/public/src/components/AgentsView.js +740 -317
- package/dist/public/src/components/AppRoot.js +30 -5
- package/dist/public/src/components/GraphView.js +372 -288
- package/dist/public/src/components/IdeView.js +163 -7
- package/dist/public/src/components/MonitorView.js +139 -1
- package/dist/public/src/components/StandaloneChat.js +889 -0
- package/dist/public/src/components/WorkflowsView.js +180 -28
- package/dist/public/src/services/ApiService.js +7 -2
- package/dist/public/src/services/SessionStore.js +83 -0
- package/dist/public/src/store.js +0 -2
- package/dist/public/src/utils/markdown.js +13 -0
- package/dist/src/cli/index.js +7 -4
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/middleware/auth.d.ts.map +1 -1
- package/dist/src/middleware/auth.js +28 -6
- package/dist/src/middleware/auth.js.map +1 -1
- package/dist/src/middleware/rate-limit.d.ts +8 -0
- package/dist/src/middleware/rate-limit.d.ts.map +1 -0
- package/dist/src/middleware/rate-limit.js +21 -0
- package/dist/src/middleware/rate-limit.js.map +1 -0
- package/dist/src/routes/agents.route.d.ts.map +1 -1
- package/dist/src/routes/agents.route.js +136 -10
- package/dist/src/routes/agents.route.js.map +1 -1
- package/dist/src/routes/chat.route.d.ts +3 -0
- package/dist/src/routes/chat.route.d.ts.map +1 -0
- package/dist/src/routes/chat.route.js +155 -0
- package/dist/src/routes/chat.route.js.map +1 -0
- package/dist/src/routes/files.route.d.ts.map +1 -1
- package/dist/src/routes/files.route.js +37 -2
- package/dist/src/routes/files.route.js.map +1 -1
- package/dist/src/routes/llm.route.d.ts.map +1 -1
- package/dist/src/routes/llm.route.js +40 -5
- package/dist/src/routes/llm.route.js.map +1 -1
- package/dist/src/routes/tasks.route.d.ts.map +1 -1
- package/dist/src/routes/tasks.route.js +15 -1
- package/dist/src/routes/tasks.route.js.map +1 -1
- package/dist/src/routes/vnc.route.d.ts +3 -0
- package/dist/src/routes/vnc.route.d.ts.map +1 -0
- package/dist/src/routes/vnc.route.js +49 -0
- package/dist/src/routes/vnc.route.js.map +1 -0
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +5 -1
- package/dist/src/server.js.map +1 -1
- package/dist/templates/Demo.md +152 -0
- package/dist/templates/README.md +12 -3
- package/dist/templates/agents/architect.agent.yaml +20 -12
- package/dist/templates/agents/chatbot.agent.yaml +23 -26
- package/dist/templates/agents/corporate.agent.yaml +65 -0
- package/dist/templates/agents/investment-analyst.agent.yaml +80 -0
- package/dist/templates/agents/music-librarian.agent.yaml +70 -0
- package/dist/templates/agents/network-security.agent.yaml +82 -0
- package/dist/templates/agents/transport-security.agent.yaml +70 -0
- package/dist/templates/agents/web-engineer.agent.yaml +99 -0
- package/dist/templates/agents/web-pilot.agent.yaml +58 -0
- package/dist/templates/knowledge/music-store/LICENSE.md +11 -0
- package/dist/templates/knowledge/music-store/musicstore.sqlite +0 -0
- package/dist/templates/knowledge/music-store/tables.png +0 -0
- package/dist/templates/knowledge/music-store.knowledge.yaml +138 -0
- package/dist/templates/knowledge/org-chart/personnel.csv +21 -21
- package/dist/templates/knowledge/org-chart.knowledge.yaml +4 -0
- package/dist/templates/knowledge/pet-store.knowledge.yaml +3 -0
- package/dist/templates/knowledge/security-incidents/incidents.json +55935 -0
- package/dist/templates/knowledge/security-incidents.knowledge.yaml +46 -0
- package/dist/templates/knowledge/{example.knowledge.yaml → transcripts.knowledge.yaml} +9 -5
- package/dist/templates/knowledge/transport-ot/systems.csv +117 -0
- package/dist/templates/knowledge/transport-ot.knowledge.yaml +55 -0
- package/dist/templates/llm.json +7 -30
- package/dist/templates/mcp.json +7 -4
- package/dist/templates/skills/orcha-builder/SKILL.md +106 -226
- package/dist/templates/skills/pii-guard/SKILL.md +22 -0
- package/dist/templates/skills/sandbox/SKILL.md +25 -48
- package/dist/templates/skills/web-pilot/SKILL.md +51 -0
- package/package.json +8 -3
- package/dist/templates/agents/knowledge-broker.agent.yaml +0 -39
- package/dist/templates/agents/sandbox.agent.yaml +0 -56
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { tool } from "../types/tool-factory.js";
|
|
3
|
+
import { htmlToMarkdown } from "./html-to-markdown.js";
|
|
4
|
+
import { CDPClient } from "./cdp-client.js";
|
|
5
|
+
import { PageReadiness } from "./page-readiness.js";
|
|
6
|
+
/** Hard cap on content() output to prevent 50K+ char dumps blowing up context. */
|
|
7
|
+
const CONTENT_MAX_CHARS = 15_000;
|
|
8
|
+
export function createBrowserTools(config) {
|
|
9
|
+
const cdpUrl = config.browserCdpUrl;
|
|
10
|
+
let client = null;
|
|
11
|
+
let readiness = null;
|
|
12
|
+
async function getReady() {
|
|
13
|
+
if (client?.connected && readiness) {
|
|
14
|
+
return { cdp: client, ready: readiness };
|
|
15
|
+
}
|
|
16
|
+
client = new CDPClient();
|
|
17
|
+
await client.connect(cdpUrl);
|
|
18
|
+
readiness = new PageReadiness(client);
|
|
19
|
+
await readiness.attach();
|
|
20
|
+
return { cdp: client, ready: readiness };
|
|
21
|
+
}
|
|
22
|
+
function errorResult(error) {
|
|
23
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
24
|
+
return JSON.stringify({ error: msg });
|
|
25
|
+
}
|
|
26
|
+
// -- observe: cheap text snapshot of the page (primary verification tool) --
|
|
27
|
+
const observe = tool(async () => {
|
|
28
|
+
try {
|
|
29
|
+
const { ready } = await getReady();
|
|
30
|
+
const snapshot = await ready.observe();
|
|
31
|
+
return JSON.stringify(snapshot);
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
return errorResult(e);
|
|
35
|
+
}
|
|
36
|
+
}, {
|
|
37
|
+
name: 'sandbox_browser_observe',
|
|
38
|
+
description: 'Text snapshot of current page: URL, title, headings, textExcerpt (first 2000 chars of visible text), interactive elements with refs. Check textExcerpt first — it often has what you need.',
|
|
39
|
+
schema: z.object({}),
|
|
40
|
+
});
|
|
41
|
+
// -- navigate: go to URL, wait for readiness, return observe snapshot --
|
|
42
|
+
const navigate = tool(async ({ url }) => {
|
|
43
|
+
try {
|
|
44
|
+
const { cdp, ready } = await getReady();
|
|
45
|
+
ready.resetForNavigation();
|
|
46
|
+
await cdp.send('Page.navigate', { url });
|
|
47
|
+
await ready.waitForReady(config.commandTimeout);
|
|
48
|
+
const snapshot = await ready.observe();
|
|
49
|
+
return JSON.stringify(snapshot);
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
return errorResult(e);
|
|
53
|
+
}
|
|
54
|
+
}, {
|
|
55
|
+
name: 'sandbox_browser_navigate',
|
|
56
|
+
description: 'Navigate to URL. Waits for load+idle. Returns text snapshot with textExcerpt and interactive elements.',
|
|
57
|
+
schema: z.object({
|
|
58
|
+
url: z.string().describe('The URL to navigate to'),
|
|
59
|
+
}),
|
|
60
|
+
});
|
|
61
|
+
// -- screenshot: expensive visual capture, use only when text observation is insufficient --
|
|
62
|
+
const screenshot = tool(async () => {
|
|
63
|
+
try {
|
|
64
|
+
const { cdp } = await getReady();
|
|
65
|
+
const result = await cdp.send('Page.captureScreenshot', { format: 'jpeg', quality: 75 });
|
|
66
|
+
const data = result.data;
|
|
67
|
+
return [
|
|
68
|
+
{ type: 'image', data, mediaType: 'image/jpeg' },
|
|
69
|
+
{ type: 'text', text: 'Screenshot captured.' },
|
|
70
|
+
];
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
return errorResult(e);
|
|
74
|
+
}
|
|
75
|
+
}, {
|
|
76
|
+
name: 'sandbox_browser_screenshot',
|
|
77
|
+
description: 'JPEG screenshot. Expensive — only when observe/content insufficient (CAPTCHAs, charts).',
|
|
78
|
+
schema: z.object({}),
|
|
79
|
+
});
|
|
80
|
+
// -- content: full page or element as markdown --
|
|
81
|
+
const content = tool(async ({ selector }) => {
|
|
82
|
+
try {
|
|
83
|
+
const { cdp } = await getReady();
|
|
84
|
+
const expression = selector
|
|
85
|
+
? `(() => { const el = document.querySelector(${JSON.stringify(selector)}); return el ? el.outerHTML : null; })()`
|
|
86
|
+
: 'document.documentElement.outerHTML';
|
|
87
|
+
const result = await cdp.send('Runtime.evaluate', { expression });
|
|
88
|
+
const html = result.result?.value;
|
|
89
|
+
if (!html) {
|
|
90
|
+
return JSON.stringify({ error: selector ? `Element not found: ${selector}` : 'No content' });
|
|
91
|
+
}
|
|
92
|
+
const markdown = htmlToMarkdown(html, { includeNavigation: !!selector, includeInteractiveElements: true, includeImages: true });
|
|
93
|
+
const maxChars = Math.min(CONTENT_MAX_CHARS, config.maxOutputChars);
|
|
94
|
+
let output = JSON.stringify({ content: markdown, selector: selector ?? null });
|
|
95
|
+
if (output.length > maxChars) {
|
|
96
|
+
const truncated = markdown.substring(0, maxChars);
|
|
97
|
+
output = JSON.stringify({ content: truncated, truncated: true, selector: selector ?? null });
|
|
98
|
+
}
|
|
99
|
+
return output;
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
return errorResult(e);
|
|
103
|
+
}
|
|
104
|
+
}, {
|
|
105
|
+
name: 'sandbox_browser_content',
|
|
106
|
+
description: 'Page content as markdown (capped at 15K chars). Use a CSS selector to target a specific section instead of fetching the full page.',
|
|
107
|
+
schema: z.object({
|
|
108
|
+
selector: z
|
|
109
|
+
.string()
|
|
110
|
+
.optional()
|
|
111
|
+
.describe('CSS selector to extract a specific element (optional, defaults to full page)'),
|
|
112
|
+
}),
|
|
113
|
+
});
|
|
114
|
+
// -- evaluate: run arbitrary JS, report side effects --
|
|
115
|
+
const evaluate = tool(async ({ expression }) => {
|
|
116
|
+
try {
|
|
117
|
+
const { cdp, ready } = await getReady();
|
|
118
|
+
const preUrl = await cdp.send('Runtime.evaluate', {
|
|
119
|
+
expression: 'location.href',
|
|
120
|
+
returnByValue: true,
|
|
121
|
+
});
|
|
122
|
+
const preUrlValue = preUrl.result?.value;
|
|
123
|
+
ready.resetNetworkFlag();
|
|
124
|
+
const result = await cdp.send('Runtime.evaluate', {
|
|
125
|
+
expression,
|
|
126
|
+
returnByValue: true,
|
|
127
|
+
awaitPromise: true,
|
|
128
|
+
});
|
|
129
|
+
const val = result.result;
|
|
130
|
+
if (val?.subtype === 'error' || result.exceptionDetails) {
|
|
131
|
+
const errMsg = result.exceptionDetails?.exception?.description ??
|
|
132
|
+
val?.description ??
|
|
133
|
+
'Evaluation error';
|
|
134
|
+
return JSON.stringify({ error: errMsg });
|
|
135
|
+
}
|
|
136
|
+
await ready.waitForSettle(300);
|
|
137
|
+
const postUrl = await cdp.send('Runtime.evaluate', {
|
|
138
|
+
expression: 'location.href',
|
|
139
|
+
returnByValue: true,
|
|
140
|
+
});
|
|
141
|
+
const postUrlValue = postUrl.result?.value;
|
|
142
|
+
const sideEffects = {};
|
|
143
|
+
if (preUrlValue !== postUrlValue) {
|
|
144
|
+
sideEffects.urlChanged = { from: preUrlValue, to: postUrlValue };
|
|
145
|
+
}
|
|
146
|
+
if (ready.hadNetworkActivity()) {
|
|
147
|
+
sideEffects.networkTriggered = true;
|
|
148
|
+
}
|
|
149
|
+
return JSON.stringify({
|
|
150
|
+
result: val?.value ?? null,
|
|
151
|
+
type: val?.type ?? 'undefined',
|
|
152
|
+
...(Object.keys(sideEffects).length > 0 ? { sideEffects } : {}),
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
catch (e) {
|
|
156
|
+
return errorResult(e);
|
|
157
|
+
}
|
|
158
|
+
}, {
|
|
159
|
+
name: 'sandbox_browser_evaluate',
|
|
160
|
+
description: 'Run JavaScript in browser. Returns result + side effects. Prefer click/type for interactions.',
|
|
161
|
+
schema: z.object({
|
|
162
|
+
expression: z.string().describe('JavaScript expression to evaluate in the page'),
|
|
163
|
+
}),
|
|
164
|
+
});
|
|
165
|
+
// -- click: find element, scroll, click, return lightweight result --
|
|
166
|
+
const click = tool(async ({ ref, text }) => {
|
|
167
|
+
try {
|
|
168
|
+
const { cdp, ready } = await getReady();
|
|
169
|
+
// Resolve ref (e.g. "e3") to CSS selector
|
|
170
|
+
const selector = ref ? ready.resolveRef(ref) : undefined;
|
|
171
|
+
const findExpr = selector
|
|
172
|
+
? `(() => {
|
|
173
|
+
const el = document.querySelector(${JSON.stringify(selector)});
|
|
174
|
+
if (!el) return { error: 'Element not found: ' + ${JSON.stringify(ref)} };
|
|
175
|
+
return { found: true, tag: el.tagName.toLowerCase(), text: (el.textContent||'').trim().substring(0,40) };
|
|
176
|
+
})()`
|
|
177
|
+
: `(() => {
|
|
178
|
+
const searchText = ${JSON.stringify(text ?? '')};
|
|
179
|
+
const clickable = document.querySelectorAll('a, button, [role="button"], input[type="submit"], input[type="button"], [onclick], [tabindex]');
|
|
180
|
+
for (const el of clickable) {
|
|
181
|
+
if (el.offsetParent === null) continue;
|
|
182
|
+
if (el.textContent && el.textContent.trim().toLowerCase().includes(searchText.toLowerCase())) {
|
|
183
|
+
return { found: true, tag: el.tagName.toLowerCase(), text: (el.textContent||'').trim().substring(0,40) };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return { error: 'No clickable element found containing text: ' + searchText };
|
|
187
|
+
})()`;
|
|
188
|
+
const findResult = await cdp.send('Runtime.evaluate', {
|
|
189
|
+
expression: findExpr,
|
|
190
|
+
returnByValue: true,
|
|
191
|
+
});
|
|
192
|
+
const found = findResult.result?.value;
|
|
193
|
+
if (found?.error)
|
|
194
|
+
return JSON.stringify(found);
|
|
195
|
+
const preUrl = await cdp.send('Runtime.evaluate', {
|
|
196
|
+
expression: 'location.href',
|
|
197
|
+
returnByValue: true,
|
|
198
|
+
});
|
|
199
|
+
const clickExpr = selector
|
|
200
|
+
? `(() => {
|
|
201
|
+
const el = document.querySelector(${JSON.stringify(selector)});
|
|
202
|
+
el.scrollIntoView({ block: 'center', behavior: 'instant' });
|
|
203
|
+
el.click();
|
|
204
|
+
return true;
|
|
205
|
+
})()`
|
|
206
|
+
: `(() => {
|
|
207
|
+
const searchText = ${JSON.stringify(text ?? '')};
|
|
208
|
+
const clickable = document.querySelectorAll('a, button, [role="button"], input[type="submit"], input[type="button"], [onclick], [tabindex]');
|
|
209
|
+
for (const el of clickable) {
|
|
210
|
+
if (el.offsetParent === null) continue;
|
|
211
|
+
if (el.textContent && el.textContent.trim().toLowerCase().includes(searchText.toLowerCase())) {
|
|
212
|
+
el.scrollIntoView({ block: 'center', behavior: 'instant' });
|
|
213
|
+
el.click();
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return false;
|
|
218
|
+
})()`;
|
|
219
|
+
ready.resetNetworkFlag();
|
|
220
|
+
await cdp.send('Runtime.evaluate', {
|
|
221
|
+
expression: clickExpr,
|
|
222
|
+
returnByValue: true,
|
|
223
|
+
awaitPromise: true,
|
|
224
|
+
});
|
|
225
|
+
await ready.waitForSettle(500);
|
|
226
|
+
const postUrl = await cdp.send('Runtime.evaluate', {
|
|
227
|
+
expression: 'location.href',
|
|
228
|
+
returnByValue: true,
|
|
229
|
+
});
|
|
230
|
+
const preUrlVal = preUrl.result?.value;
|
|
231
|
+
const postUrlVal = postUrl.result?.value;
|
|
232
|
+
const navigated = preUrlVal !== postUrlVal;
|
|
233
|
+
if (navigated) {
|
|
234
|
+
ready.resetForNavigation();
|
|
235
|
+
await ready.waitForReady(config.commandTimeout);
|
|
236
|
+
}
|
|
237
|
+
const titleResult = await cdp.send('Runtime.evaluate', {
|
|
238
|
+
expression: 'document.title',
|
|
239
|
+
returnByValue: true,
|
|
240
|
+
});
|
|
241
|
+
return JSON.stringify({
|
|
242
|
+
clicked: found,
|
|
243
|
+
navigated,
|
|
244
|
+
url: postUrlVal,
|
|
245
|
+
title: titleResult.result?.value ?? '',
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
catch (e) {
|
|
249
|
+
return errorResult(e);
|
|
250
|
+
}
|
|
251
|
+
}, {
|
|
252
|
+
name: 'sandbox_browser_click',
|
|
253
|
+
description: 'Click an element by ref from observe output (e.g. "e3") or visible text. Scrolls into view, clicks, waits for effects.',
|
|
254
|
+
schema: z.object({
|
|
255
|
+
ref: z.string().optional().describe('Element ref from observe output (e.g. "e3")'),
|
|
256
|
+
text: z.string().optional().describe('Visible text to find and click'),
|
|
257
|
+
}),
|
|
258
|
+
});
|
|
259
|
+
// -- type: fill an input field --
|
|
260
|
+
const type_ = tool(async ({ ref, text, clear }) => {
|
|
261
|
+
try {
|
|
262
|
+
const { cdp, ready } = await getReady();
|
|
263
|
+
const selector = ready.resolveRef(ref);
|
|
264
|
+
const expr = `(() => {
|
|
265
|
+
const el = document.querySelector(${JSON.stringify(selector)});
|
|
266
|
+
if (!el) return { error: 'Element not found: ' + ${JSON.stringify(ref)} };
|
|
267
|
+
if (!('value' in el)) return { error: 'Element is not an input: ' + el.tagName };
|
|
268
|
+
|
|
269
|
+
el.scrollIntoView({ block: 'center', behavior: 'instant' });
|
|
270
|
+
el.focus();
|
|
271
|
+
${clear !== false ? "el.value = '';" : ''}
|
|
272
|
+
el.value = ${JSON.stringify(text)};
|
|
273
|
+
el.dispatchEvent(new Event('input', { bubbles: true }));
|
|
274
|
+
el.dispatchEvent(new Event('change', { bubbles: true }));
|
|
275
|
+
|
|
276
|
+
return { typed: true, value: el.value };
|
|
277
|
+
})()`;
|
|
278
|
+
const result = await cdp.send('Runtime.evaluate', {
|
|
279
|
+
expression: expr,
|
|
280
|
+
returnByValue: true,
|
|
281
|
+
awaitPromise: true,
|
|
282
|
+
});
|
|
283
|
+
const val = result.result?.value;
|
|
284
|
+
if (val?.error)
|
|
285
|
+
return JSON.stringify(val);
|
|
286
|
+
await ready.waitForSettle(300);
|
|
287
|
+
return JSON.stringify(val);
|
|
288
|
+
}
|
|
289
|
+
catch (e) {
|
|
290
|
+
return errorResult(e);
|
|
291
|
+
}
|
|
292
|
+
}, {
|
|
293
|
+
name: 'sandbox_browser_type',
|
|
294
|
+
description: 'Type text into an input/textarea by ref from observe output (e.g. "e5"). Handles focus and input/change events.',
|
|
295
|
+
schema: z.object({
|
|
296
|
+
ref: z.string().describe('Element ref from observe output (e.g. "e5")'),
|
|
297
|
+
text: z.string().describe('Text to type'),
|
|
298
|
+
clear: z.boolean().optional().describe('Clear first (default: true)'),
|
|
299
|
+
}),
|
|
300
|
+
});
|
|
301
|
+
return [observe, navigate, screenshot, content, evaluate, click, type_];
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=sandbox-browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-browser.js","sourceRoot":"","sources":["../../../lib/sandbox/sandbox-browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-file.d.ts","sourceRoot":"","sources":["../../../lib/sandbox/sandbox-file.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA0BhD,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,EAAE,CAyKvE"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, realpathSync } from 'node:fs';
|
|
2
|
+
import { resolve, dirname } from 'node:path';
|
|
3
|
+
import { tool } from "../types/tool-factory.js";
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
const ALLOWED_ROOT = '/tmp';
|
|
6
|
+
// On macOS, /tmp is a symlink to /private/tmp
|
|
7
|
+
const REAL_ALLOWED_ROOT = existsSync(ALLOWED_ROOT) ? realpathSync(ALLOWED_ROOT) : ALLOWED_ROOT;
|
|
8
|
+
function isUnderRoot(p) {
|
|
9
|
+
return (p.startsWith(ALLOWED_ROOT + '/') || p === ALLOWED_ROOT ||
|
|
10
|
+
p.startsWith(REAL_ALLOWED_ROOT + '/') || p === REAL_ALLOWED_ROOT);
|
|
11
|
+
}
|
|
12
|
+
function validatePath(rawPath) {
|
|
13
|
+
const resolved = resolve(ALLOWED_ROOT, rawPath);
|
|
14
|
+
if (!isUnderRoot(resolved)) {
|
|
15
|
+
throw new Error(`Path must be under ${ALLOWED_ROOT}. Got: ${rawPath}`);
|
|
16
|
+
}
|
|
17
|
+
// If the file exists, check the real path to prevent symlink escape
|
|
18
|
+
if (existsSync(resolved)) {
|
|
19
|
+
const real = realpathSync(resolved);
|
|
20
|
+
if (!isUnderRoot(real)) {
|
|
21
|
+
throw new Error(`Symlink escapes ${ALLOWED_ROOT}. Real path: ${real}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return resolved;
|
|
25
|
+
}
|
|
26
|
+
export function createFileTools(config) {
|
|
27
|
+
const readTool = tool(async ({ path }) => {
|
|
28
|
+
try {
|
|
29
|
+
const resolved = validatePath(path);
|
|
30
|
+
const raw = readFileSync(resolved, 'utf-8');
|
|
31
|
+
const lines = raw.split('\n');
|
|
32
|
+
const numbered = lines.map((line, i) => `${i + 1}\t${line}`).join('\n');
|
|
33
|
+
const truncated = numbered.length > config.maxOutputChars;
|
|
34
|
+
return JSON.stringify({
|
|
35
|
+
content: truncated ? numbered.substring(0, config.maxOutputChars) : numbered,
|
|
36
|
+
lines: lines.length,
|
|
37
|
+
size: raw.length,
|
|
38
|
+
...(truncated && { truncated: true }),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
return JSON.stringify({ error: err.message });
|
|
43
|
+
}
|
|
44
|
+
}, {
|
|
45
|
+
name: 'sandbox_file_read',
|
|
46
|
+
description: 'Read a file from the sandbox filesystem. ' +
|
|
47
|
+
'Path must be under /tmp. Returns the file content as a string.',
|
|
48
|
+
schema: z.object({
|
|
49
|
+
path: z.string().describe('Absolute or relative path to the file (resolved under /tmp)'),
|
|
50
|
+
}),
|
|
51
|
+
});
|
|
52
|
+
const writeTool = tool(async ({ path, content }) => {
|
|
53
|
+
try {
|
|
54
|
+
const resolved = validatePath(path);
|
|
55
|
+
const created = !existsSync(resolved);
|
|
56
|
+
mkdirSync(dirname(resolved), { recursive: true });
|
|
57
|
+
writeFileSync(resolved, content, 'utf-8');
|
|
58
|
+
return JSON.stringify({
|
|
59
|
+
path: resolved,
|
|
60
|
+
size: content.length,
|
|
61
|
+
created,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
return JSON.stringify({ error: err.message });
|
|
66
|
+
}
|
|
67
|
+
}, {
|
|
68
|
+
name: 'sandbox_file_write',
|
|
69
|
+
description: 'Create or overwrite a file in the sandbox filesystem. ' +
|
|
70
|
+
'Path must be under /tmp. Parent directories are created automatically.',
|
|
71
|
+
schema: z.object({
|
|
72
|
+
path: z.string().describe('Absolute or relative path to the file (resolved under /tmp)'),
|
|
73
|
+
content: z.string().describe('The full content to write to the file'),
|
|
74
|
+
}),
|
|
75
|
+
});
|
|
76
|
+
const editTool = tool(async ({ path, old_string, new_string }) => {
|
|
77
|
+
try {
|
|
78
|
+
const resolved = validatePath(path);
|
|
79
|
+
const content = readFileSync(resolved, 'utf-8');
|
|
80
|
+
const occurrences = content.split(old_string).length - 1;
|
|
81
|
+
if (occurrences === 0) {
|
|
82
|
+
return JSON.stringify({ error: 'old_string not found in the file' });
|
|
83
|
+
}
|
|
84
|
+
if (occurrences > 1) {
|
|
85
|
+
return JSON.stringify({
|
|
86
|
+
error: `old_string found ${occurrences} times — must be unique. Provide more surrounding context to match exactly once.`,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
const updated = content.replace(old_string, new_string);
|
|
90
|
+
writeFileSync(resolved, updated, 'utf-8');
|
|
91
|
+
return JSON.stringify({ path: resolved, replacements: 1 });
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
return JSON.stringify({ error: err.message });
|
|
95
|
+
}
|
|
96
|
+
}, {
|
|
97
|
+
name: 'sandbox_file_edit',
|
|
98
|
+
description: 'Find and replace a unique string in a file. ' +
|
|
99
|
+
'The old_string must appear exactly once in the file. ' +
|
|
100
|
+
'Use this for precise edits instead of rewriting the whole file.',
|
|
101
|
+
schema: z.object({
|
|
102
|
+
path: z.string().describe('Absolute or relative path to the file (resolved under /tmp)'),
|
|
103
|
+
old_string: z.string().describe('The exact string to find (must appear exactly once)'),
|
|
104
|
+
new_string: z.string().describe('The replacement string'),
|
|
105
|
+
}),
|
|
106
|
+
});
|
|
107
|
+
const insertLinesTool = tool(async ({ path, line, content, position }) => {
|
|
108
|
+
try {
|
|
109
|
+
const resolved = validatePath(path);
|
|
110
|
+
const fileContent = readFileSync(resolved, 'utf-8');
|
|
111
|
+
const lines = fileContent.split('\n');
|
|
112
|
+
if (line < 1 || line > lines.length) {
|
|
113
|
+
return JSON.stringify({ error: `Line ${line} out of range. File has ${lines.length} lines (1-indexed).` });
|
|
114
|
+
}
|
|
115
|
+
const newLines = content.split('\n');
|
|
116
|
+
const idx = position === 'before' ? line - 1 : line;
|
|
117
|
+
lines.splice(idx, 0, ...newLines);
|
|
118
|
+
writeFileSync(resolved, lines.join('\n'), 'utf-8');
|
|
119
|
+
return JSON.stringify({ path: resolved, insertedLines: newLines.length, atLine: idx + 1 });
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
return JSON.stringify({ error: err.message });
|
|
123
|
+
}
|
|
124
|
+
}, {
|
|
125
|
+
name: 'sandbox_file_insert',
|
|
126
|
+
description: 'Insert lines before or after a specific line number in a file. ' +
|
|
127
|
+
'Line numbers are 1-indexed. Use sandbox_file_read first to see the file with line numbers.',
|
|
128
|
+
schema: z.object({
|
|
129
|
+
path: z.string().describe('Absolute or relative path to the file (resolved under /tmp)'),
|
|
130
|
+
line: z.number().int().min(1).describe('The line number to insert before or after (1-indexed)'),
|
|
131
|
+
content: z.string().describe('The content to insert (can be multiple lines)'),
|
|
132
|
+
position: z.enum(['before', 'after']).default('after').describe('Insert before or after the specified line'),
|
|
133
|
+
}),
|
|
134
|
+
});
|
|
135
|
+
const replaceLinesTool = tool(async ({ path, start_line, end_line, content }) => {
|
|
136
|
+
try {
|
|
137
|
+
const resolved = validatePath(path);
|
|
138
|
+
const fileContent = readFileSync(resolved, 'utf-8');
|
|
139
|
+
const lines = fileContent.split('\n');
|
|
140
|
+
if (start_line < 1 || start_line > lines.length) {
|
|
141
|
+
return JSON.stringify({ error: `start_line ${start_line} out of range. File has ${lines.length} lines (1-indexed).` });
|
|
142
|
+
}
|
|
143
|
+
if (end_line < start_line || end_line > lines.length) {
|
|
144
|
+
return JSON.stringify({ error: `end_line ${end_line} out of range. Must be >= start_line (${start_line}) and <= ${lines.length}.` });
|
|
145
|
+
}
|
|
146
|
+
const newLines = content.split('\n');
|
|
147
|
+
const removedCount = end_line - start_line + 1;
|
|
148
|
+
lines.splice(start_line - 1, removedCount, ...newLines);
|
|
149
|
+
writeFileSync(resolved, lines.join('\n'), 'utf-8');
|
|
150
|
+
return JSON.stringify({ path: resolved, removedLines: removedCount, insertedLines: newLines.length });
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
return JSON.stringify({ error: err.message });
|
|
154
|
+
}
|
|
155
|
+
}, {
|
|
156
|
+
name: 'sandbox_file_replace_lines',
|
|
157
|
+
description: 'Replace a range of lines in a file with new content. ' +
|
|
158
|
+
'Line numbers are 1-indexed and inclusive. Use sandbox_file_read first to see the file with line numbers.',
|
|
159
|
+
schema: z.object({
|
|
160
|
+
path: z.string().describe('Absolute or relative path to the file (resolved under /tmp)'),
|
|
161
|
+
start_line: z.number().int().min(1).describe('First line to replace (1-indexed, inclusive)'),
|
|
162
|
+
end_line: z.number().int().min(1).describe('Last line to replace (1-indexed, inclusive)'),
|
|
163
|
+
content: z.string().describe('The replacement content (can be fewer or more lines than the range)'),
|
|
164
|
+
}),
|
|
165
|
+
});
|
|
166
|
+
return [readTool, writeTool, editTool, insertLinesTool, replaceLinesTool];
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=sandbox-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-file.js","sourceRoot":"","sources":["../../../lib/sandbox/sandbox-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-shell.d.ts","sourceRoot":"","sources":["../../../lib/sandbox/sandbox-shell.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,YAAY,CAAC;AAuB7D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CAgD5E"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { tool } from "../types/tool-factory.js";
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
const SANDBOX_UID = 10000;
|
|
6
|
+
const SANDBOX_GID = 10000;
|
|
7
|
+
function isRunningInContainer() {
|
|
8
|
+
// Docker creates this file
|
|
9
|
+
if (existsSync('/.dockerenv'))
|
|
10
|
+
return true;
|
|
11
|
+
// Podman and other OCI runtimes use /run/.containerenv
|
|
12
|
+
if (existsSync('/run/.containerenv'))
|
|
13
|
+
return true;
|
|
14
|
+
// Check cgroup for container markers (docker, containerd, lxc, podman)
|
|
15
|
+
try {
|
|
16
|
+
const cgroup = readFileSync('/proc/1/cgroup', 'utf-8');
|
|
17
|
+
if (/docker|containerd|kubepods|lxc|podman/.test(cgroup))
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// /proc/1/cgroup may not exist (e.g., macOS)
|
|
22
|
+
}
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
export function createSandboxShellTool(config) {
|
|
26
|
+
const inDocker = isRunningInContainer();
|
|
27
|
+
const allowUnsafe = process.env['ALLOW_UNSAFE_HOST_EXECUTION'] === 'true';
|
|
28
|
+
return tool(async ({ command, timeout }) => {
|
|
29
|
+
if (!inDocker && !allowUnsafe) {
|
|
30
|
+
return JSON.stringify({
|
|
31
|
+
stdout: '',
|
|
32
|
+
stderr: '',
|
|
33
|
+
exitCode: -1,
|
|
34
|
+
error: 'Shell execution is disabled outside Docker. Set ALLOW_UNSAFE_HOST_EXECUTION=true to enable.',
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const effectiveTimeout = timeout
|
|
38
|
+
? Math.min(timeout, config.commandTimeout)
|
|
39
|
+
: config.commandTimeout;
|
|
40
|
+
const result = await executeShell(command, effectiveTimeout, inDocker);
|
|
41
|
+
let output = JSON.stringify(result);
|
|
42
|
+
if (output.length > config.maxOutputChars) {
|
|
43
|
+
const truncated = {
|
|
44
|
+
...result,
|
|
45
|
+
stdout: result.stdout.substring(0, config.maxOutputChars),
|
|
46
|
+
_truncated: true,
|
|
47
|
+
};
|
|
48
|
+
output = JSON.stringify(truncated);
|
|
49
|
+
}
|
|
50
|
+
return output;
|
|
51
|
+
}, {
|
|
52
|
+
name: 'sandbox_shell',
|
|
53
|
+
description: 'Execute a shell command on the host system. ' +
|
|
54
|
+
'Commands run in an isolated context with limited permissions. ' +
|
|
55
|
+
'Returns JSON with stdout, stderr, exitCode, and error fields.',
|
|
56
|
+
schema: z.object({
|
|
57
|
+
command: z.string().describe('The shell command to execute'),
|
|
58
|
+
timeout: z
|
|
59
|
+
.number()
|
|
60
|
+
.optional()
|
|
61
|
+
.describe('Execution timeout in milliseconds (capped by sandbox config)'),
|
|
62
|
+
}),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
function executeShell(command, timeout, inDocker) {
|
|
66
|
+
return new Promise((resolve) => {
|
|
67
|
+
const options = {
|
|
68
|
+
timeout,
|
|
69
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
70
|
+
cwd: '/tmp',
|
|
71
|
+
};
|
|
72
|
+
if (inDocker) {
|
|
73
|
+
options.uid = SANDBOX_UID;
|
|
74
|
+
options.gid = SANDBOX_GID;
|
|
75
|
+
}
|
|
76
|
+
execFile('/bin/sh', ['-c', command], options, (error, stdout, stderr) => {
|
|
77
|
+
let exitCode = 0;
|
|
78
|
+
if (error && 'code' in error && typeof error.code === 'number') {
|
|
79
|
+
exitCode = error.code;
|
|
80
|
+
}
|
|
81
|
+
else if (error) {
|
|
82
|
+
exitCode = 1;
|
|
83
|
+
}
|
|
84
|
+
resolve({
|
|
85
|
+
stdout: stdout ?? '',
|
|
86
|
+
stderr: stderr ?? '',
|
|
87
|
+
exitCode,
|
|
88
|
+
...(error && typeof error.code !== 'number' ? { error: error.message } : {}),
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=sandbox-shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-shell.js","sourceRoot":"","sources":["../../../lib/sandbox/sandbox-shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAChD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,WAAW,GAAG,KAAK,CAAC;AAE1B,SAAS,oBAAoB;IAC3B,2BAA2B;IAC3B,IAAI,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3C,uDAAuD;IACvD,IAAI,UAAU,CAAC,oBAAoB,CAAC;QAAE,OAAO,IAAI,CAAC;IAElD,uEAAuE;IACvE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACvD,IAAI,uCAAuC,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAqB;IAC1D,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;IACxC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,KAAK,MAAM,CAAC;IAE1E,OAAO,IAAI,CACT,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;QAC7B,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,SAAS,CAAC;gBACpB,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,EAAE;gBACV,QAAQ,EAAE,CAAC,CAAC;gBACZ,KAAK,EAAE,6FAA6F;aACrG,CAAC,CAAC;QACL,CAAC;QAED,MAAM,gBAAgB,GAAG,OAAO;YAC9B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,cAAc,CAAC;YAC1C,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;QAE1B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC;QAEvE,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG;gBAChB,GAAG,MAAM;gBACT,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;gBACzD,UAAU,EAAE,IAAI;aACjB,CAAC;YACF,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,EACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,8CAA8C;YAC9C,gEAAgE;YAChE,+DAA+D;QACjE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;YAC5D,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,8DAA8D,CAAC;SAC5E,CAAC;KACH,CACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,OAAe,EACf,OAAe,EACf,QAAiB;IAEjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,OAAO,GAA4B;YACvC,OAAO;YACP,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;YAC3B,GAAG,EAAE,MAAM;SACZ,CAAC;QAEF,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;YAC1B,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;QAC5B,CAAC;QAED,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACtE,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC/D,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;YACxB,CAAC;iBAAM,IAAI,KAAK,EAAE,CAAC;gBACjB,QAAQ,GAAG,CAAC,CAAC;YACf,CAAC;YAED,OAAO,CAAC;gBACN,MAAM,EAAE,MAAM,IAAI,EAAE;gBACpB,MAAM,EAAE,MAAM,IAAI,EAAE;gBACpB,QAAQ;gBACR,GAAG,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7E,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-web.d.ts","sourceRoot":"","sources":["../../../lib/sandbox/sandbox-web.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sandbox-web.d.ts","sourceRoot":"","sources":["../../../lib/sandbox/sandbox-web.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAiDhD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CA0F/E;AAED,wBAAgB,0BAA0B,IAAI,cAAc,CAsE3D"}
|