@inneranimalmedia/agentsam-sdk 1.2.0 → 1.5.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.
@@ -0,0 +1,373 @@
1
+ /**
2
+ * Local-first scaffold — no IAM, no Cloudflare, no OAuth.
3
+ * Connor proves the pattern on localhost; `agentsam deploy` graduates to cloud.
4
+ */
5
+
6
+ const LANE_KEYS = {
7
+ '1': 'fullstack',
8
+ '2': 'cms',
9
+ '3': 'data',
10
+ '4': 'crm',
11
+ '5': 'creative',
12
+ fullstack: 'fullstack',
13
+ cms: 'cms',
14
+ data: 'data',
15
+ crm: 'crm',
16
+ creative: 'creative',
17
+ };
18
+
19
+ const LANE_LABELS = {
20
+ fullstack: 'Full Stack',
21
+ cms: 'CMS',
22
+ data: 'Data Solutions',
23
+ crm: 'Customer Management',
24
+ creative: 'Creative & Design',
25
+ };
26
+
27
+ const AGENT_FOR_LANE = {
28
+ fullstack: 'orchestrator',
29
+ cms: 'cms',
30
+ data: 'data',
31
+ crm: 'crm',
32
+ creative: 'creative',
33
+ };
34
+
35
+ const RUN_TARGETS = {
36
+ '1': 'local',
37
+ '2': 'cloudflare',
38
+ '3': 'gcp',
39
+ local: 'local',
40
+ cloudflare: 'cloudflare',
41
+ gcp: 'gcp',
42
+ };
43
+
44
+ export { LANE_KEYS, LANE_LABELS, RUN_TARGETS };
45
+
46
+ export function normalizeLane(raw) {
47
+ const k = String(raw || 'fullstack').trim().toLowerCase();
48
+ return LANE_KEYS[k] || (LANE_LABELS[k] ? k : 'fullstack');
49
+ }
50
+
51
+ export function normalizeRunTarget(raw) {
52
+ const k = String(raw || 'local').trim().toLowerCase();
53
+ return RUN_TARGETS[k] || 'local';
54
+ }
55
+
56
+ function migrationSql(laneKey) {
57
+ const cmsExtra =
58
+ laneKey === 'cms'
59
+ ? `
60
+ CREATE TABLE IF NOT EXISTS cms_pages (
61
+ id TEXT PRIMARY KEY,
62
+ slug TEXT NOT NULL UNIQUE,
63
+ title TEXT NOT NULL,
64
+ status TEXT NOT NULL DEFAULT 'draft',
65
+ hero_asset_key TEXT,
66
+ content_json TEXT NOT NULL DEFAULT '{}',
67
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
68
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
69
+ );
70
+
71
+ CREATE TABLE IF NOT EXISTS cms_assets (
72
+ id TEXT PRIMARY KEY,
73
+ r2_key TEXT NOT NULL UNIQUE,
74
+ title TEXT,
75
+ alt_text TEXT,
76
+ metadata_json TEXT,
77
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
78
+ );
79
+ `
80
+ : '';
81
+
82
+ return `-- AgentSam local schema (${laneKey})
83
+ CREATE TABLE IF NOT EXISTS agent_sessions (
84
+ id TEXT PRIMARY KEY,
85
+ agent TEXT NOT NULL,
86
+ lane TEXT NOT NULL,
87
+ goal TEXT,
88
+ status TEXT NOT NULL DEFAULT 'created',
89
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
90
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
91
+ );
92
+
93
+ CREATE TABLE IF NOT EXISTS agent_messages (
94
+ id TEXT PRIMARY KEY,
95
+ session_id TEXT NOT NULL,
96
+ role TEXT NOT NULL,
97
+ content TEXT NOT NULL,
98
+ metadata_json TEXT,
99
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
100
+ FOREIGN KEY (session_id) REFERENCES agent_sessions(id)
101
+ );
102
+
103
+ CREATE TABLE IF NOT EXISTS agent_tool_calls (
104
+ id TEXT PRIMARY KEY,
105
+ session_id TEXT NOT NULL,
106
+ tool_name TEXT NOT NULL,
107
+ status TEXT NOT NULL DEFAULT 'queued',
108
+ input_json TEXT,
109
+ output_json TEXT,
110
+ requires_approval INTEGER NOT NULL DEFAULT 0,
111
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
112
+ completed_at TEXT,
113
+ FOREIGN KEY (session_id) REFERENCES agent_sessions(id)
114
+ );
115
+ ${cmsExtra}
116
+ `.trim();
117
+ }
118
+
119
+ /**
120
+ * @param {{ projectName: string, laneKey: string, laneLabel: string, agent: string, runTarget: string, sdkVersion: string }}
121
+ */
122
+ export function buildLocalScaffoldFiles({
123
+ projectName,
124
+ laneKey,
125
+ laneLabel,
126
+ agent,
127
+ runTarget,
128
+ sdkVersion = '1.5.0',
129
+ }) {
130
+ const sdkRange = `^${sdkVersion.split('.').slice(0, 2).join('.')}.0`;
131
+ const migration = migrationSql(laneKey);
132
+
133
+ return [
134
+ {
135
+ path: 'agentsam.config.js',
136
+ content: `export default {
137
+ project: '${projectName}',
138
+ lane: '${laneKey}',
139
+ agent: '${agent}',
140
+ runTarget: '${runTarget}',
141
+ api: { baseUrl: '/api/agentsam' },
142
+ };
143
+ `,
144
+ },
145
+ {
146
+ path: '.agentsam/config.json',
147
+ content: `${JSON.stringify(
148
+ {
149
+ project: projectName,
150
+ lane: laneKey,
151
+ agent,
152
+ run_target: 'local',
153
+ deploy_target: runTarget === 'local' ? null : runTarget,
154
+ pty_port: 3099,
155
+ dev_port: 8787,
156
+ scaffold_version: sdkVersion,
157
+ },
158
+ null,
159
+ 2,
160
+ )}\n`,
161
+ },
162
+ {
163
+ path: '.agentsam/start-local.md',
164
+ content: `# Local terminal (no Cloudflare tunnel)
165
+
166
+ Agent Sam runs a PTY on **your machine** — no accounts, no cloudflared, no IAM login required.
167
+
168
+ \`\`\`bash
169
+ # Terminal 1 — local PTY (Agent Sam shell bridge)
170
+ npx agentsam start-local
171
+
172
+ # Terminal 2 — app dev server
173
+ npm run dev
174
+ npm run db:migrate # first time only
175
+ \`\`\`
176
+
177
+ PTY listens on \`ws://127.0.0.1:3099\`. Health: \`curl http://127.0.0.1:3099/health\`
178
+
179
+ When you're ready to ship to Cloudflare or GCP:
180
+
181
+ \`\`\`bash
182
+ npx agentsam deploy
183
+ \`\`\`
184
+ `,
185
+ },
186
+ {
187
+ path: '.gitignore',
188
+ content: `node_modules/
189
+ .env
190
+ .dev.vars
191
+ dist/
192
+ .wrangler/
193
+ *.db
194
+ `,
195
+ },
196
+ {
197
+ path: 'package.json',
198
+ content: `${JSON.stringify(
199
+ {
200
+ name: projectName,
201
+ version: '0.1.0',
202
+ type: 'module',
203
+ private: true,
204
+ scripts: {
205
+ dev: 'wrangler dev --local',
206
+ 'dev:node': 'node --watch src/dev-server.js',
207
+ deploy: 'wrangler deploy',
208
+ smoke: 'node ./scripts/smoke.mjs',
209
+ 'db:migrate': 'wrangler d1 migrations apply DB --local',
210
+ 'start:pty': 'agentsam start-local',
211
+ },
212
+ dependencies: {
213
+ '@inneranimalmedia/agentsam-sdk': sdkRange,
214
+ },
215
+ devDependencies: {
216
+ wrangler: '^4.0.0',
217
+ },
218
+ },
219
+ null,
220
+ 2,
221
+ )}\n`,
222
+ },
223
+ {
224
+ path: 'wrangler.toml',
225
+ content: `name = "${projectName}"
226
+ main = "src/index.js"
227
+ compatibility_date = "2026-06-27"
228
+
229
+ [[d1_databases]]
230
+ binding = "DB"
231
+ database_name = "${projectName}-db"
232
+ database_id = "local-dev"
233
+
234
+ [dev]
235
+ port = 8787
236
+ local_protocol = "http"
237
+ `,
238
+ },
239
+ {
240
+ path: 'migrations/0001_agentsam_core.sql',
241
+ content: `${migration}\n`,
242
+ },
243
+ {
244
+ path: 'src/index.js',
245
+ content: `import { AgentSam } from '@inneranimalmedia/agentsam-sdk';
246
+
247
+ export default {
248
+ async fetch(request, env, ctx) {
249
+ const agent = new AgentSam({
250
+ env,
251
+ ctx,
252
+ project: '${projectName}',
253
+ lane: '${laneKey}',
254
+ agent: '${agent}',
255
+ });
256
+ return agent.handle(request);
257
+ },
258
+ };
259
+ `,
260
+ },
261
+ {
262
+ path: 'src/dev-server.js',
263
+ content: `/**
264
+ * Plain Node dev server — no Cloudflare account required.
265
+ * Use when wrangler is unavailable: npm run dev:node
266
+ */
267
+ import { createServer } from 'node:http';
268
+ import { AgentSam } from '@inneranimalmedia/agentsam-sdk';
269
+
270
+ const app = new AgentSam({
271
+ project: '${projectName}',
272
+ lane: '${laneKey}',
273
+ agent: '${agent}',
274
+ });
275
+
276
+ const port = Number(process.env.PORT || 8787);
277
+
278
+ createServer(async (req, res) => {
279
+ const url = \`http://127.0.0.1\${req.url || '/'}\`;
280
+ const headers = new Headers();
281
+ for (const [k, v] of Object.entries(req.headers)) {
282
+ if (v != null) headers.set(k, Array.isArray(v) ? v.join(', ') : v);
283
+ }
284
+ let body;
285
+ if (req.method !== 'GET' && req.method !== 'HEAD') {
286
+ const chunks = [];
287
+ for await (const chunk of req) chunks.push(chunk);
288
+ body = Buffer.concat(chunks);
289
+ }
290
+ const response = await app.handle(new Request(url, { method: req.method, headers, body }));
291
+ res.writeHead(response.status, Object.fromEntries(response.headers.entries()));
292
+ res.end(Buffer.from(await response.arrayBuffer()));
293
+ }).listen(port, '127.0.0.1', () => {
294
+ console.log(\`Agent Sam dev server http://127.0.0.1:\${port}\`);
295
+ });
296
+ `,
297
+ },
298
+ {
299
+ path: 'scripts/smoke.mjs',
300
+ content: `import { AgentSam } from '@inneranimalmedia/agentsam-sdk';
301
+
302
+ const app = new AgentSam({ project: '${projectName}', lane: '${laneKey}', agent: '${agent}' });
303
+ const res = await app.handle(new Request('https://example.com/api/health'));
304
+ const data = await res.json();
305
+
306
+ if (!data.ok) {
307
+ console.error(data);
308
+ process.exit(1);
309
+ }
310
+
311
+ console.log('AgentSam smoke test passed:', data);
312
+ `,
313
+ },
314
+ {
315
+ path: 'README.md',
316
+ content: `# ${projectName}
317
+
318
+ Built locally with [Agent Sam SDK](https://inneranimalmedia.com) — **${laneLabel}** lane, \`${agent}\` agent.
319
+
320
+ ## Local-first (default)
321
+
322
+ \`\`\`bash
323
+ npm install
324
+ npm run smoke
325
+ npx agentsam start-local # Terminal 1 — local PTY
326
+ npm run dev # Terminal 2 — http://127.0.0.1:8787
327
+ npm run db:migrate # apply local D1 schema
328
+ \`\`\`
329
+
330
+ Everything works offline. No Cloudflare account required to start.
331
+
332
+ ## Graduate to cloud
333
+
334
+ \`\`\`bash
335
+ npx agentsam deploy
336
+ \`\`\`
337
+
338
+ Cloudflare OAuth is prompted **only** when you deploy — not at init.
339
+
340
+ Run target selected at init: **${runTarget}**
341
+ `,
342
+ },
343
+ ];
344
+ }
345
+
346
+ export function buildLocalScaffoldMeta(body, sdkVersion = '1.5.0') {
347
+ const projectName = String(body.projectName || body.project_name || 'agentsam-project')
348
+ .trim()
349
+ .toLowerCase()
350
+ .replace(/[^a-z0-9-]+/g, '-')
351
+ .replace(/^-+|-+$/g, '') || 'agentsam-project';
352
+ const laneKey = normalizeLane(body.lane);
353
+ const laneLabel = LANE_LABELS[laneKey] || 'Full Stack';
354
+ const agent = AGENT_FOR_LANE[laneKey] || 'orchestrator';
355
+ const runTarget = normalizeRunTarget(body.runTarget || body.run_target || 'local');
356
+
357
+ return {
358
+ projectName,
359
+ laneKey,
360
+ laneLabel,
361
+ agent,
362
+ runTarget,
363
+ files: buildLocalScaffoldFiles({ projectName, laneKey, laneLabel, agent, runTarget, sdkVersion }),
364
+ next_steps: [
365
+ 'npm install',
366
+ 'npm run smoke',
367
+ 'npx agentsam start-local',
368
+ 'npm run dev',
369
+ 'npm run db:migrate',
370
+ 'When ready: npx agentsam deploy',
371
+ ],
372
+ };
373
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Optional BYOK key paste during SDK init → CORE user_api_keys.
3
+ */
4
+ import { getJson, postJson } from './core-client.js';
5
+
6
+ const PROVIDERS = [
7
+ { id: 'openai', label: 'OpenAI' },
8
+ { id: 'anthropic', label: 'Anthropic' },
9
+ ];
10
+
11
+ /**
12
+ * @param {string} token SDK bearer
13
+ * @param {{ ask: (q: string) => Promise<string> } | null} prompt
14
+ */
15
+ export async function promptOptionalByokKeys(token, prompt) {
16
+ if (!token || !prompt) return;
17
+
18
+ let ctx;
19
+ try {
20
+ ctx = await getJson('/api/sdk/context', token);
21
+ } catch {
22
+ console.log('\n ⚠ Could not load BYOK status — skip key paste or add keys in Dashboard → Settings → Keys\n');
23
+ return;
24
+ }
25
+
26
+ const byok = ctx?.byok || {};
27
+ console.log('\n Provider keys (BYOK — optional, stored in YOUR IAM account):\n');
28
+
29
+ for (const p of PROVIDERS) {
30
+ const slot = byok[p.id];
31
+ if (slot?.configured) {
32
+ console.log(` ${p.label.padEnd(12)} ✓ connected ${slot.masked || ''}`);
33
+ continue;
34
+ }
35
+
36
+ const ans = await prompt.ask(` ${p.label} API key (Enter to skip): `);
37
+ const key = ans.trim();
38
+ if (!key) continue;
39
+
40
+ try {
41
+ await postJson(
42
+ '/api/sdk/keys',
43
+ {
44
+ provider: p.id,
45
+ api_key: key,
46
+ label: `${p.label} (SDK init)`,
47
+ validate: true,
48
+ },
49
+ token,
50
+ );
51
+ console.log(` ${p.label.padEnd(12)} ✓ saved to IAM BYOK`);
52
+ } catch (e) {
53
+ console.log(` ${p.label.padEnd(12)} ✗ ${e?.message || 'save failed'}`);
54
+ }
55
+ }
56
+ console.log('');
57
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Persist SDK session token locally for repeat inits (user's machine only).
3
+ */
4
+ import fs from 'fs';
5
+ import path from 'path';
6
+
7
+ export function saveSdkTokenHint(cwd, token) {
8
+ const t = String(token || '').trim();
9
+ if (!t || !t.startsWith('sdk_')) return null;
10
+ const dir = path.join(path.resolve(cwd), '.agentsam');
11
+ fs.mkdirSync(dir, { recursive: true });
12
+ const hintPath = path.join(dir, 'credentials.env.example');
13
+ const content = `# Agent Sam SDK — add to your shell profile (optional)
14
+ export AGENTSAM_SDK_TOKEN=${t}
15
+ export USER_GCP_PROJECT=YOUR_GCP_PROJECT_ID
16
+ `;
17
+ fs.writeFileSync(hintPath, content, 'utf8');
18
+ return hintPath;
19
+ }
@@ -1,260 +1,8 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
-
4
- const LANE_KEYS = {
5
- 'Full Stack': 'fullstack',
6
- CMS: 'cms',
7
- 'Data Solutions': 'data',
8
- 'Customer Management': 'crm',
9
- 'Creative & Design': 'creative',
10
- };
11
-
12
- const AGENT_FOR_LANE = {
13
- fullstack: 'orchestrator',
14
- cms: 'cms',
15
- data: 'data',
16
- crm: 'crm',
17
- creative: 'creative',
18
- };
19
-
20
- function write(file, content) {
21
- fs.mkdirSync(path.dirname(file), { recursive: true });
22
- fs.writeFileSync(file, content.trimStart());
23
- }
24
-
25
- function slugify(value) {
26
- return String(value || 'agentsam-project')
27
- .trim()
28
- .toLowerCase()
29
- .replace(/[^a-z0-9-]+/g, '-')
30
- .replace(/^-+|-+$/g, '') || 'agentsam-project';
31
- }
32
-
33
- function workerTemplate({ projectName, laneKey, agent }) {
34
- return `
35
- import { AgentSam } from '@inneranimalmedia/agentsam-sdk';
36
-
37
- export default {
38
- async fetch(request, env, ctx) {
39
- const agent = new AgentSam({
40
- env,
41
- ctx,
42
- project: '${projectName}',
43
- lane: '${laneKey}',
44
- agent: '${agent}',
45
- });
46
-
47
- return agent.handle(request);
48
- },
49
- };
50
- `;
51
- }
52
-
53
- function migrationTemplate({ projectName, laneKey }) {
54
- return `
55
- -- AgentSam core schema for ${projectName}
56
- CREATE TABLE IF NOT EXISTS agent_sessions (
57
- id TEXT PRIMARY KEY,
58
- agent TEXT NOT NULL,
59
- lane TEXT NOT NULL,
60
- goal TEXT,
61
- status TEXT NOT NULL DEFAULT 'created',
62
- created_at TEXT NOT NULL DEFAULT (datetime('now')),
63
- updated_at TEXT NOT NULL DEFAULT (datetime('now'))
64
- );
65
-
66
- CREATE TABLE IF NOT EXISTS agent_messages (
67
- id TEXT PRIMARY KEY,
68
- session_id TEXT NOT NULL,
69
- role TEXT NOT NULL,
70
- content TEXT NOT NULL,
71
- metadata_json TEXT,
72
- created_at TEXT NOT NULL DEFAULT (datetime('now')),
73
- FOREIGN KEY (session_id) REFERENCES agent_sessions(id)
74
- );
75
-
76
- CREATE TABLE IF NOT EXISTS agent_tool_calls (
77
- id TEXT PRIMARY KEY,
78
- session_id TEXT NOT NULL,
79
- tool_name TEXT NOT NULL,
80
- status TEXT NOT NULL DEFAULT 'queued',
81
- input_json TEXT,
82
- output_json TEXT,
83
- requires_approval INTEGER NOT NULL DEFAULT 0,
84
- created_at TEXT NOT NULL DEFAULT (datetime('now')),
85
- completed_at TEXT,
86
- FOREIGN KEY (session_id) REFERENCES agent_sessions(id)
87
- );
88
-
89
- ${laneKey === 'cms' ? `
90
- CREATE TABLE IF NOT EXISTS cms_pages (
91
- id TEXT PRIMARY KEY,
92
- slug TEXT NOT NULL UNIQUE,
93
- title TEXT NOT NULL,
94
- status TEXT NOT NULL DEFAULT 'draft',
95
- hero_asset_key TEXT,
96
- content_json TEXT NOT NULL DEFAULT '{}',
97
- created_at TEXT NOT NULL DEFAULT (datetime('now')),
98
- updated_at TEXT NOT NULL DEFAULT (datetime('now'))
99
- );
100
-
101
- CREATE TABLE IF NOT EXISTS cms_assets (
102
- id TEXT PRIMARY KEY,
103
- r2_key TEXT NOT NULL UNIQUE,
104
- title TEXT,
105
- alt_text TEXT,
106
- metadata_json TEXT,
107
- created_at TEXT NOT NULL DEFAULT (datetime('now'))
108
- );
109
- ` : ''}
110
- `;
111
- }
112
-
113
- function readmeTemplate({ projectName, lane, provider, agent }) {
114
- return `
115
- # ${projectName}
116
-
117
- Scaffolded with [@inneranimalmedia/agentsam-sdk](https://www.npmjs.com/package/@inneranimalmedia/agentsam-sdk).
118
-
119
- ## Lane
120
-
121
- **${lane}** — ${agent} agent, ${provider}
122
-
123
- ## Setup
124
-
125
- \`\`\`bash
126
- cp .env.example .env
127
- npm install
128
- \`\`\`
129
-
130
- ## Dev
131
-
132
- \`\`\`bash
133
- npm run dev
134
- npm run smoke
135
- \`\`\`
136
-
137
- ## Deploy
138
-
139
- \`\`\`bash
140
- npm run deploy
141
- \`\`\`
142
-
143
- ## Endpoints
144
-
145
- - \`GET /api/health\`
146
- - \`GET /api/agentsam/info\`
147
- - \`POST /api/agentsam/session\`
148
- - \`POST /api/agentsam/message\`
149
- `;
150
- }
151
-
152
- export function scaffoldProject({
153
- projectName,
154
- lane,
155
- provider,
156
- agent,
157
- cfAccountId,
158
- sdkVersion = '1.1.1',
159
- }) {
160
- const safeName = slugify(projectName);
161
- const dir = path.resolve(process.cwd(), safeName);
162
- const laneKey = LANE_KEYS[lane] ?? 'fullstack';
163
- const selectedAgent = agent || AGENT_FOR_LANE[laneKey] || 'orchestrator';
164
- const sdkRange = `^${sdkVersion.split('.').slice(0, 2).join('.')}.0`;
165
-
166
- if (fs.existsSync(dir)) {
167
- throw new Error(`Directory "${safeName}" already exists.`);
168
- }
169
-
170
- fs.mkdirSync(dir, { recursive: true });
171
- fs.mkdirSync(`${dir}/src`, { recursive: true });
172
- fs.mkdirSync(`${dir}/migrations`, { recursive: true });
173
-
174
- write(`${dir}/agentsam.config.js`, `
175
- export default {
176
- project: '${safeName}',
177
- lane: '${laneKey}',
178
- provider: '${provider}',
179
- agent: '${selectedAgent}',
180
- cloudflare: {
181
- accountId: '${cfAccountId || ''}',
182
- },
183
- api: {
184
- baseUrl: '/api/agentsam',
185
- },
186
- };
187
- `);
188
-
189
- write(`${dir}/.env.example`, `
190
- AGENTSAM_API_KEY=
191
- CLOUDFLARE_ACCOUNT_ID=${cfAccountId || ''}
192
- CLOUDFLARE_API_TOKEN=
193
- `);
194
-
195
- write(`${dir}/.gitignore`, `
196
- node_modules/
197
- .env
198
- .dev.vars
199
- dist/
200
- .wrangler/
201
- `);
202
-
203
- write(`${dir}/package.json`, `${JSON.stringify({
204
- name: safeName,
205
- version: '0.1.0',
206
- type: 'module',
207
- private: true,
208
- scripts: {
209
- dev: 'wrangler dev',
210
- deploy: 'wrangler deploy',
211
- smoke: 'node ./scripts/smoke.mjs',
212
- },
213
- dependencies: {
214
- '@inneranimalmedia/agentsam-sdk': sdkRange,
215
- },
216
- devDependencies: {
217
- wrangler: '^4.0.0',
218
- },
219
- }, null, 2)}\n`);
220
-
221
- write(`${dir}/wrangler.toml`, `
222
- name = "${safeName}"
223
- main = "src/index.js"
224
- compatibility_date = "2026-06-27"
225
-
226
- [[d1_databases]]
227
- binding = "DB"
228
- database_name = "${safeName}-db"
229
- database_id = "REPLACE_WITH_D1_DATABASE_ID"
230
-
231
- [[kv_namespaces]]
232
- binding = "KV"
233
- id = "REPLACE_WITH_KV_NAMESPACE_ID"
234
-
235
- [[r2_buckets]]
236
- binding = "R2"
237
- bucket_name = "${safeName}"
238
- `);
239
-
240
- write(`${dir}/migrations/0001_agentsam_core.sql`, migrationTemplate({ projectName: safeName, laneKey }));
241
- write(`${dir}/src/index.js`, workerTemplate({ projectName: safeName, laneKey, agent: selectedAgent }));
242
- write(`${dir}/README.md`, readmeTemplate({ projectName: safeName, lane, provider, agent: selectedAgent }));
243
-
244
- write(`${dir}/scripts/smoke.mjs`, `
245
- import { AgentSam } from '@inneranimalmedia/agentsam-sdk';
246
-
247
- const app = new AgentSam({ project: '${safeName}', lane: '${laneKey}', agent: '${selectedAgent}' });
248
- const res = await app.handle(new Request('https://example.com/api/health'));
249
- const data = await res.json();
250
-
251
- if (!data.ok) {
252
- console.error(data);
253
- process.exit(1);
254
- }
255
-
256
- console.log('AgentSam smoke test passed:', data);
257
- `);
258
-
259
- return dir;
1
+ /**
2
+ * @deprecated Local scaffold replaced by CORE POST /api/sdk/scaffold — use `agentsam init`.
3
+ */
4
+ export function scaffoldProject() {
5
+ throw new Error(
6
+ 'Local scaffold is disabled. Run: npx @inneranimalmedia/agentsam-sdk init — Agent Sam provisions resources in YOUR Cloudflare account via CORE.',
7
+ );
260
8
  }