@amodalai/runtime 0.1.13 → 0.1.15

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.
@@ -0,0 +1,270 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
7
+ import { mkdtemp, rm, readFile, stat } from 'node:fs/promises';
8
+ import path from 'node:path';
9
+ import { tmpdir } from 'node:os';
10
+ import { isAllowedRepoPath, validateRepoFilePath, executeWriteRepoFile, executeReadRepoFile, executeDeleteRepoFile, } from './agent-runner.js';
11
+ function makeAdminSession(repoOrigin) {
12
+ return {
13
+ id: 'session-1',
14
+ appId: 'admin',
15
+ conversationHistory: [],
16
+ createdAt: Date.now(),
17
+ lastAccessedAt: Date.now(),
18
+ runtime: {
19
+ repo: {
20
+ source: 'local',
21
+ origin: repoOrigin,
22
+ config: {
23
+ name: 'test',
24
+ version: '1.0.0',
25
+ models: { main: { provider: 'anthropic', model: 'claude-sonnet-4-20250514' } },
26
+ },
27
+ connections: new Map(),
28
+ skills: [],
29
+ agents: {},
30
+ automations: [],
31
+ knowledge: [],
32
+ evals: [],
33
+ tools: [],
34
+ stores: [],
35
+ },
36
+ compiledContext: {
37
+ systemPrompt: 'Admin agent.',
38
+ tokenUsage: { total: 100000, used: 100, remaining: 99900, sectionBreakdown: {} },
39
+ sections: [],
40
+ },
41
+ exploreContext: {
42
+ systemPrompt: 'Explore.',
43
+ tokenUsage: { total: 100000, used: 100, remaining: 99900, sectionBreakdown: {} },
44
+ sections: [],
45
+ },
46
+ outputPipeline: { process: (t) => ({ output: t, modified: false, blocked: false, findings: [] }) },
47
+ telemetry: { logGuard: () => { } },
48
+ },
49
+ planModeManager: { isActive: () => false, getStatus: () => ({ active: false }) },
50
+ };
51
+ }
52
+ function makeNonAdminSession(repoOrigin) {
53
+ const session = makeAdminSession(repoOrigin);
54
+ return { ...session, appId: 'app-1' };
55
+ }
56
+ describe('isAllowedRepoPath', () => {
57
+ it('allows skills/ paths', () => {
58
+ expect(isAllowedRepoPath('skills/triage/SKILL.md')).toBe(true);
59
+ expect(isAllowedRepoPath('skills/new-skill/SKILL.md')).toBe(true);
60
+ });
61
+ it('allows knowledge/ paths', () => {
62
+ expect(isAllowedRepoPath('knowledge/formatting-rules.md')).toBe(true);
63
+ expect(isAllowedRepoPath('knowledge/deep/nested/doc.md')).toBe(true);
64
+ });
65
+ it('allows connections/ paths', () => {
66
+ expect(isAllowedRepoPath('connections/slack/rules.md')).toBe(true);
67
+ expect(isAllowedRepoPath('connections/github/surface.md')).toBe(true);
68
+ expect(isAllowedRepoPath('connections/stripe/entities.md')).toBe(true);
69
+ expect(isAllowedRepoPath('connections/slack/spec.json')).toBe(true);
70
+ expect(isAllowedRepoPath('connections/slack/access.json')).toBe(true);
71
+ });
72
+ it('allows pages/ paths', () => {
73
+ expect(isAllowedRepoPath('pages/dashboard.tsx')).toBe(true);
74
+ expect(isAllowedRepoPath('pages/price-tracker.tsx')).toBe(true);
75
+ });
76
+ it('allows automations/ paths', () => {
77
+ expect(isAllowedRepoPath('automations/daily-digest.json')).toBe(true);
78
+ });
79
+ it('allows stores/ paths', () => {
80
+ expect(isAllowedRepoPath('stores/price-data.json')).toBe(true);
81
+ });
82
+ it('allows tools/ paths', () => {
83
+ expect(isAllowedRepoPath('tools/fetch-prices/tool.json')).toBe(true);
84
+ expect(isAllowedRepoPath('tools/fetch-prices/handler.ts')).toBe(true);
85
+ });
86
+ it('allows evals/ paths', () => {
87
+ expect(isAllowedRepoPath('evals/triage-accuracy.md')).toBe(true);
88
+ });
89
+ it('allows agents/ paths', () => {
90
+ expect(isAllowedRepoPath('agents/explore/AGENT.md')).toBe(true);
91
+ });
92
+ it('rejects top-level files', () => {
93
+ expect(isAllowedRepoPath('amodal.json')).toBe(false);
94
+ expect(isAllowedRepoPath('package.json')).toBe(false);
95
+ });
96
+ it('rejects src/ paths', () => {
97
+ expect(isAllowedRepoPath('src/index.ts')).toBe(false);
98
+ });
99
+ it('rejects .env', () => {
100
+ expect(isAllowedRepoPath('.env')).toBe(false);
101
+ });
102
+ it('rejects blocked filenames even inside allowed dirs', () => {
103
+ expect(isAllowedRepoPath('tools/.env')).toBe(false);
104
+ expect(isAllowedRepoPath('pages/amodal.json')).toBe(false);
105
+ expect(isAllowedRepoPath('skills/package.json')).toBe(false);
106
+ });
107
+ });
108
+ describe('validateRepoFilePath', () => {
109
+ it('rejects absolute paths', () => {
110
+ const session = makeAdminSession('/tmp/repo');
111
+ const result = validateRepoFilePath(session, '/etc/passwd');
112
+ expect(result).toHaveProperty('error');
113
+ expect(result.error).toContain('relative');
114
+ });
115
+ it('rejects path traversal', () => {
116
+ const session = makeAdminSession('/tmp/repo');
117
+ const result = validateRepoFilePath(session, '../../etc/passwd');
118
+ expect(result).toHaveProperty('error');
119
+ expect(result.error).toContain('traversal');
120
+ });
121
+ it('rejects non-admin sessions', () => {
122
+ const session = makeNonAdminSession('/tmp/repo');
123
+ const result = validateRepoFilePath(session, 'knowledge/foo.md');
124
+ expect(result).toHaveProperty('error');
125
+ expect(result.error).toContain('admin');
126
+ });
127
+ it('rejects disallowed directories', () => {
128
+ const session = makeAdminSession('/tmp/repo');
129
+ const result = validateRepoFilePath(session, 'src/index.ts');
130
+ expect(result).toHaveProperty('error');
131
+ expect(result.error).toContain('not in an allowed directory');
132
+ });
133
+ it('accepts valid knowledge path', () => {
134
+ const session = makeAdminSession('/tmp/repo');
135
+ const result = validateRepoFilePath(session, 'knowledge/formatting-rules.md');
136
+ expect(result).toHaveProperty('resolved');
137
+ expect(result.resolved).toBe(path.resolve('/tmp/repo', 'knowledge/formatting-rules.md'));
138
+ });
139
+ });
140
+ describe('executeWriteRepoFile', () => {
141
+ let tmpDir;
142
+ beforeEach(async () => {
143
+ tmpDir = await mkdtemp(path.join(tmpdir(), 'amodal-test-'));
144
+ });
145
+ afterEach(async () => {
146
+ await rm(tmpDir, { recursive: true, force: true });
147
+ });
148
+ it('writes a knowledge file', async () => {
149
+ const session = makeAdminSession(tmpDir);
150
+ const result = await executeWriteRepoFile(session, {
151
+ path: 'knowledge/no-em-dashes.md',
152
+ content: '# Formatting Rules\n\nNever use em dashes in output.',
153
+ });
154
+ expect(result.output).toContain('Wrote knowledge/no-em-dashes.md');
155
+ const written = await readFile(path.join(tmpDir, 'knowledge/no-em-dashes.md'), 'utf-8');
156
+ expect(written).toContain('Never use em dashes');
157
+ });
158
+ it('writes a skill file with nested directories', async () => {
159
+ const session = makeAdminSession(tmpDir);
160
+ const result = await executeWriteRepoFile(session, {
161
+ path: 'skills/formatting/SKILL.md',
162
+ content: '# Formatting Skill',
163
+ });
164
+ expect(result.output).toContain('Wrote skills/formatting/SKILL.md');
165
+ });
166
+ it('writes a page file', async () => {
167
+ const session = makeAdminSession(tmpDir);
168
+ const result = await executeWriteRepoFile(session, {
169
+ path: 'pages/price-dashboard.tsx',
170
+ content: 'export default function PriceDashboard() { return <div>Prices</div>; }',
171
+ });
172
+ expect(result.output).toContain('Wrote pages/price-dashboard.tsx');
173
+ });
174
+ it('writes an automation file', async () => {
175
+ const session = makeAdminSession(tmpDir);
176
+ const result = await executeWriteRepoFile(session, {
177
+ path: 'automations/fetch-prices.json',
178
+ content: JSON.stringify({ title: 'Fetch Prices', schedule: '0 * * * *', prompt: 'Fetch latest prices' }),
179
+ });
180
+ expect(result.output).toContain('Wrote automations/fetch-prices.json');
181
+ });
182
+ it('rejects writes to disallowed paths', async () => {
183
+ const session = makeAdminSession(tmpDir);
184
+ const result = await executeWriteRepoFile(session, {
185
+ path: 'src/index.ts',
186
+ content: 'console.log("pwned")',
187
+ });
188
+ expect(result.error).toContain('not in an allowed directory');
189
+ });
190
+ it('rejects empty content', async () => {
191
+ const session = makeAdminSession(tmpDir);
192
+ const result = await executeWriteRepoFile(session, {
193
+ path: 'knowledge/test.md',
194
+ content: '',
195
+ });
196
+ expect(result.error).toContain('empty');
197
+ });
198
+ it('rejects path traversal', async () => {
199
+ const session = makeAdminSession(tmpDir);
200
+ const result = await executeWriteRepoFile(session, {
201
+ path: '../../../etc/passwd',
202
+ content: 'bad',
203
+ });
204
+ expect(result.error).toContain('traversal');
205
+ });
206
+ });
207
+ describe('executeReadRepoFile', () => {
208
+ let tmpDir;
209
+ beforeEach(async () => {
210
+ tmpDir = await mkdtemp(path.join(tmpdir(), 'amodal-test-'));
211
+ });
212
+ afterEach(async () => {
213
+ await rm(tmpDir, { recursive: true, force: true });
214
+ });
215
+ it('reads an existing knowledge file', async () => {
216
+ const session = makeAdminSession(tmpDir);
217
+ // Write a file first
218
+ await executeWriteRepoFile(session, {
219
+ path: 'knowledge/test.md',
220
+ content: 'Test content here.',
221
+ });
222
+ const result = await executeReadRepoFile(session, { path: 'knowledge/test.md' });
223
+ expect(result.output).toBe('Test content here.');
224
+ });
225
+ it('returns error for missing file', async () => {
226
+ const session = makeAdminSession(tmpDir);
227
+ const result = await executeReadRepoFile(session, { path: 'knowledge/missing.md' });
228
+ expect(result.error).toContain('not found');
229
+ });
230
+ it('rejects reads from disallowed paths', async () => {
231
+ const session = makeAdminSession(tmpDir);
232
+ const result = await executeReadRepoFile(session, { path: 'package.json' });
233
+ expect(result.error).toContain('not in an allowed directory');
234
+ });
235
+ });
236
+ describe('executeDeleteRepoFile', () => {
237
+ let tmpDir;
238
+ beforeEach(async () => {
239
+ tmpDir = await mkdtemp(path.join(tmpdir(), 'amodal-test-'));
240
+ });
241
+ afterEach(async () => {
242
+ await rm(tmpDir, { recursive: true, force: true });
243
+ });
244
+ it('deletes an existing file', async () => {
245
+ const session = makeAdminSession(tmpDir);
246
+ await executeWriteRepoFile(session, {
247
+ path: 'evals/old-test.md',
248
+ content: 'old eval',
249
+ });
250
+ const result = await executeDeleteRepoFile(session, { path: 'evals/old-test.md' });
251
+ expect(result.output).toContain('Deleted evals/old-test.md');
252
+ await expect(stat(path.join(tmpDir, 'evals/old-test.md'))).rejects.toThrow();
253
+ });
254
+ it('returns error for missing file', async () => {
255
+ const session = makeAdminSession(tmpDir);
256
+ const result = await executeDeleteRepoFile(session, { path: 'evals/nonexistent.md' });
257
+ expect(result.error).toContain('not found');
258
+ });
259
+ it('rejects deletes from disallowed paths', async () => {
260
+ const session = makeAdminSession(tmpDir);
261
+ const result = await executeDeleteRepoFile(session, { path: 'package.json' });
262
+ expect(result.error).toContain('not in an allowed directory');
263
+ });
264
+ it('rejects path traversal', async () => {
265
+ const session = makeAdminSession(tmpDir);
266
+ const result = await executeDeleteRepoFile(session, { path: '../../etc/passwd' });
267
+ expect(result.error).toContain('traversal');
268
+ });
269
+ });
270
+ //# sourceMappingURL=write-repo-file.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-repo-file.test.js","sourceRoot":"","sources":["../../../src/agent/write-repo-file.test.ts"],"names":[],"mappings":"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"}
@@ -106,6 +106,7 @@ export interface SSEToolCallResultEvent {
106
106
  tool_id: string;
107
107
  status: 'success' | 'error';
108
108
  result?: string;
109
+ parameters?: Record<string, unknown>;
109
110
  duration_ms?: number;
110
111
  error?: string;
111
112
  timestamp: string;