claude-sandbox-agent 0.1.9 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/claude-config/settings.json +2 -1
- package/dist/index.js +29 -83
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -222,57 +222,48 @@ var Agent = class {
|
|
|
222
222
|
};
|
|
223
223
|
|
|
224
224
|
// src/linear/agent.ts
|
|
225
|
+
var EPHEMERAL_TOOLS = /* @__PURE__ */ new Set(["Read", "Grep", "Glob", "WebSearch", "WebFetch", "ToolSearch"]);
|
|
225
226
|
var LinearAgent = class extends Agent {
|
|
226
227
|
linearClient;
|
|
227
228
|
linearSessionId;
|
|
228
229
|
lastThoughtTime = 0;
|
|
229
230
|
thoughtDebounceMs = 1e3;
|
|
230
|
-
|
|
231
|
+
isDelegating = false;
|
|
232
|
+
isCompleted = false;
|
|
231
233
|
constructor(config) {
|
|
232
234
|
super(config.linearSessionId);
|
|
233
235
|
this.linearClient = new LinearClient({ accessToken: config.linearAccessToken });
|
|
234
236
|
this.linearSessionId = config.linearSessionId;
|
|
235
237
|
}
|
|
236
|
-
// ============================================
|
|
237
|
-
// Event method implementations
|
|
238
|
-
// ============================================
|
|
239
|
-
/**
|
|
240
|
-
* Called when agent starts
|
|
241
|
-
*/
|
|
242
238
|
async onStart() {
|
|
243
239
|
await this.sendActivity("thought" /* Thought */, "Starting work...", true);
|
|
244
240
|
}
|
|
245
|
-
/**
|
|
246
|
-
* Called when agent is thinking/reasoning
|
|
247
|
-
* Sends as ephemeral thought activity (debounced)
|
|
248
|
-
*/
|
|
249
241
|
async onThinking(block) {
|
|
242
|
+
if (this.isCompleted) return;
|
|
250
243
|
const now = Date.now();
|
|
251
|
-
if (now - this.lastThoughtTime < this.thoughtDebounceMs)
|
|
252
|
-
return;
|
|
253
|
-
}
|
|
244
|
+
if (now - this.lastThoughtTime < this.thoughtDebounceMs) return;
|
|
254
245
|
this.lastThoughtTime = now;
|
|
255
246
|
const content = block.text;
|
|
256
|
-
if (content.length < 20)
|
|
257
|
-
return;
|
|
258
|
-
}
|
|
247
|
+
if (content.length < 20) return;
|
|
259
248
|
const truncated = content.length > 500 ? content.substring(0, 500) + "..." : content;
|
|
260
249
|
await this.sendActivity("thought" /* Thought */, truncated, true);
|
|
261
250
|
}
|
|
262
|
-
/**
|
|
263
|
-
* Called when agent uses a tool
|
|
264
|
-
* Sends as action activity with action/parameter fields
|
|
265
|
-
*/
|
|
266
251
|
async onToolUse(block) {
|
|
252
|
+
if (this.isCompleted) return;
|
|
253
|
+
const { name } = block;
|
|
254
|
+
if (name === "Task") {
|
|
255
|
+
this.isDelegating = true;
|
|
256
|
+
const subagentType = String(block.input.subagent_type ?? "subagent");
|
|
257
|
+
await this.sendActionActivity("Delegating", subagentType, false);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
const ephemeral = this.isDelegating || EPHEMERAL_TOOLS.has(name);
|
|
267
261
|
const { action, parameter } = this.formatToolAction(block);
|
|
268
|
-
await this.sendActionActivity(action, parameter,
|
|
262
|
+
await this.sendActionActivity(action, parameter, ephemeral);
|
|
269
263
|
}
|
|
270
|
-
/**
|
|
271
|
-
* Called when agent updates its plan
|
|
272
|
-
* Maps to Linear session plan
|
|
273
|
-
*/
|
|
274
264
|
async onPlanUpdate(steps) {
|
|
275
265
|
if (steps.length === 0) return;
|
|
266
|
+
this.isDelegating = false;
|
|
276
267
|
const linearSteps = steps.map((step) => ({
|
|
277
268
|
content: step.content,
|
|
278
269
|
status: this.mapStatusToLinear(step.status)
|
|
@@ -285,30 +276,23 @@ var LinearAgent = class extends Agent {
|
|
|
285
276
|
console.error("Failed to update Linear plan:", error);
|
|
286
277
|
}
|
|
287
278
|
}
|
|
288
|
-
/**
|
|
289
|
-
* Called when agent completes
|
|
290
|
-
* Sends as response activity
|
|
291
|
-
*/
|
|
292
279
|
async onComplete(message) {
|
|
280
|
+
this.isCompleted = true;
|
|
281
|
+
this.isDelegating = false;
|
|
293
282
|
const text = message.subtype === "success" && message.result ? message.result : "Task completed successfully.";
|
|
294
283
|
await this.sendActivity("response" /* Response */, text, false);
|
|
295
284
|
}
|
|
296
|
-
/**
|
|
297
|
-
* Called when agent errors
|
|
298
|
-
* Sends as error activity
|
|
299
|
-
*/
|
|
300
285
|
async onError(error) {
|
|
286
|
+
this.isCompleted = true;
|
|
301
287
|
await this.sendActivity("error" /* Error */, `Error: ${error.message}`, false);
|
|
302
288
|
}
|
|
303
289
|
async onStop() {
|
|
290
|
+
this.isCompleted = true;
|
|
304
291
|
await this.sendActivity("response" /* Response */, "Session stopped", false);
|
|
305
292
|
}
|
|
306
293
|
// ============================================
|
|
307
294
|
// Helper methods
|
|
308
295
|
// ============================================
|
|
309
|
-
/**
|
|
310
|
-
* Send activity to Linear (for non-action types: thought, response, error, elicitation)
|
|
311
|
-
*/
|
|
312
296
|
async sendActivity(type, body, ephemeral) {
|
|
313
297
|
try {
|
|
314
298
|
await this.linearClient.createAgentActivity({
|
|
@@ -320,9 +304,6 @@ var LinearAgent = class extends Agent {
|
|
|
320
304
|
console.error("Failed to send Linear activity:", error);
|
|
321
305
|
}
|
|
322
306
|
}
|
|
323
|
-
/**
|
|
324
|
-
* Send action activity to Linear (requires action + parameter fields)
|
|
325
|
-
*/
|
|
326
307
|
async sendActionActivity(action, parameter, ephemeral) {
|
|
327
308
|
try {
|
|
328
309
|
await this.linearClient.createAgentActivity({
|
|
@@ -334,9 +315,6 @@ var LinearAgent = class extends Agent {
|
|
|
334
315
|
console.error("Failed to send Linear activity:", error);
|
|
335
316
|
}
|
|
336
317
|
}
|
|
337
|
-
/**
|
|
338
|
-
* Format tool use into action/parameter pair for Linear action activities
|
|
339
|
-
*/
|
|
340
318
|
formatToolAction(block) {
|
|
341
319
|
const { name, input } = block;
|
|
342
320
|
const params = input;
|
|
@@ -349,8 +327,7 @@ var LinearAgent = class extends Agent {
|
|
|
349
327
|
return { action: "Reading file", parameter: String(params.file_path ?? "") };
|
|
350
328
|
case "Bash": {
|
|
351
329
|
const cmd = String(params.command ?? "");
|
|
352
|
-
|
|
353
|
-
return { action: "Running command", parameter: desc };
|
|
330
|
+
return { action: "Running command", parameter: cmd.length > 80 ? cmd.substring(0, 80) + "..." : cmd };
|
|
354
331
|
}
|
|
355
332
|
case "Grep":
|
|
356
333
|
return { action: "Searching", parameter: String(params.pattern ?? "") };
|
|
@@ -364,9 +341,6 @@ var LinearAgent = class extends Agent {
|
|
|
364
341
|
return { action: name, parameter: JSON.stringify(params).substring(0, 100) };
|
|
365
342
|
}
|
|
366
343
|
}
|
|
367
|
-
/**
|
|
368
|
-
* Map internal status to Linear plan status
|
|
369
|
-
*/
|
|
370
344
|
mapStatusToLinear(status) {
|
|
371
345
|
switch (status) {
|
|
372
346
|
case "in_progress":
|
|
@@ -386,8 +360,6 @@ var createLinearAgent = (sessionId) => {
|
|
|
386
360
|
if (!linearAccessToken) {
|
|
387
361
|
throw new Error("Linear access token is missing");
|
|
388
362
|
}
|
|
389
|
-
const tokenPreview = linearAccessToken.length > 8 ? `${linearAccessToken.slice(0, 4)}...${linearAccessToken.slice(-4)}` : "[short token]";
|
|
390
|
-
console.error(`[LinearAgent] Creating agent with token: ${tokenPreview}, session: ${sessionId}`);
|
|
391
363
|
return new LinearAgent({ linearAccessToken, linearSessionId: sessionId });
|
|
392
364
|
};
|
|
393
365
|
|
|
@@ -413,10 +385,11 @@ async function sendSessionUpdate(callbackUrl, callbackSecret, update) {
|
|
|
413
385
|
body: JSON.stringify(update)
|
|
414
386
|
});
|
|
415
387
|
if (!response.ok) {
|
|
416
|
-
|
|
388
|
+
const body = await response.text().catch(() => "");
|
|
389
|
+
console.error(`[callback] Failed: ${response.status} ${response.statusText} - ${body}`);
|
|
417
390
|
}
|
|
418
391
|
} catch (error) {
|
|
419
|
-
console.error("Failed to send session update:", error);
|
|
392
|
+
console.error("[callback] Failed to send session update:", error);
|
|
420
393
|
}
|
|
421
394
|
}
|
|
422
395
|
async function reportRunning(callbackUrl, callbackSecret, externalSessionId, claudeSessionId) {
|
|
@@ -458,10 +431,7 @@ async function reportResult(callbackUrl, externalSessionId, result) {
|
|
|
458
431
|
// src/commands/start.ts
|
|
459
432
|
async function sendLinearActivity(sessionId, type, message, ephemeral = true) {
|
|
460
433
|
const token = process.env.LINEAR_ACCESS_TOKEN;
|
|
461
|
-
if (!token)
|
|
462
|
-
console.error(`[CLI:activity] No LINEAR_ACCESS_TOKEN, skipping: ${message}`);
|
|
463
|
-
return;
|
|
464
|
-
}
|
|
434
|
+
if (!token) return;
|
|
465
435
|
try {
|
|
466
436
|
const client = new LinearClient2({ accessToken: token });
|
|
467
437
|
await client.createAgentActivity({
|
|
@@ -469,35 +439,17 @@ async function sendLinearActivity(sessionId, type, message, ephemeral = true) {
|
|
|
469
439
|
content: { type, body: message },
|
|
470
440
|
ephemeral
|
|
471
441
|
});
|
|
472
|
-
|
|
473
|
-
} catch (error) {
|
|
474
|
-
console.error(`[CLI:activity] Failed to send: ${error}`);
|
|
442
|
+
} catch {
|
|
475
443
|
}
|
|
476
444
|
}
|
|
477
445
|
var startCommand = new Command("start").description("Start a new agent session").requiredOption("--platform <platform>", "Platform type (linear)").requiredOption("--session-id <id>", "External session ID (e.g., Linear session ID)").requiredOption("--prompt <prompt>", "Initial prompt for the agent").option("--callback-url <url>", "Server callback URL for session updates").option("--working-dir <dir>", "Working directory", process.cwd()).action(async (options) => {
|
|
478
446
|
const { platform, sessionId, prompt, callbackUrl, workingDir } = options;
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
const hasLinearToken = !!process.env.LINEAR_ACCESS_TOKEN;
|
|
482
|
-
console.error("[CLI:start] Environment check:");
|
|
483
|
-
console.error(` ANTHROPIC_API_KEY: ${hasAnthropicKey ? "set" : "NOT SET"}`);
|
|
484
|
-
console.error(` LINEAR_ACCESS_TOKEN: ${hasLinearToken ? "set" : "NOT SET"}`);
|
|
485
|
-
await sendLinearActivity(
|
|
486
|
-
sessionId,
|
|
487
|
-
"thought",
|
|
488
|
-
`Env: API key ${hasAnthropicKey ? "\u2713" : "\u2717"}, Linear ${hasLinearToken ? "\u2713" : "\u2717"}`
|
|
489
|
-
);
|
|
490
|
-
if (!hasAnthropicKey) {
|
|
491
|
-
const error = "ANTHROPIC_API_KEY environment variable is not set";
|
|
492
|
-
await sendLinearActivity(sessionId, "error", error, false);
|
|
493
|
-
console.error(`[CLI:start] FATAL: ${error}`);
|
|
447
|
+
if (!process.env.ANTHROPIC_API_KEY) {
|
|
448
|
+
await sendLinearActivity(sessionId, "error", "ANTHROPIC_API_KEY not set", false);
|
|
494
449
|
process.exit(1);
|
|
495
450
|
}
|
|
496
451
|
try {
|
|
497
|
-
await sendLinearActivity(sessionId, "thought", "Creating agent...");
|
|
498
452
|
const agent = createAgent(platform, sessionId);
|
|
499
|
-
await sendLinearActivity(sessionId, "thought", "Agent created, starting Claude Code...");
|
|
500
|
-
console.error("[CLI:start] Agent created, running...");
|
|
501
453
|
const result = await agent.run({
|
|
502
454
|
prompt,
|
|
503
455
|
cwd: workingDir,
|
|
@@ -507,7 +459,6 @@ var startCommand = new Command("start").description("Start a new agent session")
|
|
|
507
459
|
allowDangerouslySkipPermissions: true
|
|
508
460
|
}
|
|
509
461
|
});
|
|
510
|
-
console.error(`[CLI:start] Agent finished. Error: ${result.error ?? "none"}`);
|
|
511
462
|
if (result.error) {
|
|
512
463
|
await sendLinearActivity(sessionId, "error", `Agent error: ${result.error}`, false);
|
|
513
464
|
}
|
|
@@ -521,11 +472,6 @@ var startCommand = new Command("start").description("Start a new agent session")
|
|
|
521
472
|
process.exit(result.error ? 1 : 0);
|
|
522
473
|
} catch (error) {
|
|
523
474
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
524
|
-
const errorStack = error instanceof Error ? error.stack : void 0;
|
|
525
|
-
console.error(`[CLI:start] FATAL ERROR: ${errorMessage}`);
|
|
526
|
-
if (errorStack) {
|
|
527
|
-
console.error(`[CLI:start] Stack: ${errorStack}`);
|
|
528
|
-
}
|
|
529
475
|
await sendLinearActivity(sessionId, "error", `CLI fatal error: ${errorMessage}`, false);
|
|
530
476
|
console.error(JSON.stringify({ status: "error", error: errorMessage }));
|
|
531
477
|
process.exit(1);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/start.ts","../src/linear/agent.ts","../src/agent.ts","../src/factory.ts","../src/callback.ts","../src/commands/stop.ts","../src/commands/resume.ts","../src/commands/init.ts","../src/config.ts"],"sourcesContent":["import { Command } from 'commander';\nimport startCommand from './commands/start';\nimport { stopCommand } from './commands/stop';\nimport { resumeCommand } from './commands/resume';\nimport { initCommand } from './commands/init';\n\nconst program = new Command();\n\nprogram\n .name('claude-sandbox-agent')\n .description('CLI for running Claude agents in Vercel sandboxes')\n .version('0.1.0');\n\nprogram.addCommand(initCommand);\nprogram.addCommand(startCommand);\nprogram.addCommand(stopCommand);\nprogram.addCommand(resumeCommand);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport { LinearClient } from '@linear/sdk';\nimport { createAgent, type Platform } from '@/factory';\nimport { reportResult } from '@/callback';\n\n/**\n * Send activity to Linear for logging/debugging\n * This allows us to stream CLI logs to Linear even before the agent starts\n */\nasync function sendLinearActivity(\n sessionId: string,\n type: 'thought' | 'error',\n message: string,\n ephemeral = true\n): Promise<void> {\n const token = process.env.LINEAR_ACCESS_TOKEN;\n if (!token) {\n console.error(`[CLI:activity] No LINEAR_ACCESS_TOKEN, skipping: ${message}`);\n return;\n }\n\n try {\n const client = new LinearClient({ accessToken: token });\n await client.createAgentActivity({\n agentSessionId: sessionId,\n content: { type, body: message },\n ephemeral,\n });\n console.error(`[CLI:activity] Sent ${type}: ${message}`);\n } catch (error) {\n // Don't fail if activity sending fails - just log it\n console.error(`[CLI:activity] Failed to send: ${error}`);\n }\n}\n\nconst startCommand = new Command('start')\n .description('Start a new agent session')\n .requiredOption('--platform <platform>', 'Platform type (linear)')\n .requiredOption('--session-id <id>', 'External session ID (e.g., Linear session ID)')\n .requiredOption('--prompt <prompt>', 'Initial prompt for the agent')\n .option('--callback-url <url>', 'Server callback URL for session updates')\n .option('--working-dir <dir>', 'Working directory', process.cwd())\n .action(async (options) => {\n const { platform, sessionId, prompt, callbackUrl, workingDir } = options;\n\n // Log startup info to Linear\n await sendLinearActivity(sessionId, 'thought', 'CLI starting...');\n\n // Check environment variables\n const hasAnthropicKey = !!process.env.ANTHROPIC_API_KEY;\n const hasLinearToken = !!process.env.LINEAR_ACCESS_TOKEN;\n\n console.error('[CLI:start] Environment check:');\n console.error(` ANTHROPIC_API_KEY: ${hasAnthropicKey ? 'set' : 'NOT SET'}`);\n console.error(` LINEAR_ACCESS_TOKEN: ${hasLinearToken ? 'set' : 'NOT SET'}`);\n\n await sendLinearActivity(\n sessionId,\n 'thought',\n `Env: API key ${hasAnthropicKey ? '✓' : '✗'}, Linear ${hasLinearToken ? '✓' : '✗'}`\n );\n\n if (!hasAnthropicKey) {\n const error = 'ANTHROPIC_API_KEY environment variable is not set';\n await sendLinearActivity(sessionId, 'error', error, false);\n console.error(`[CLI:start] FATAL: ${error}`);\n process.exit(1);\n }\n\n try {\n await sendLinearActivity(sessionId, 'thought', 'Creating agent...');\n const agent = createAgent(platform as Platform, sessionId);\n\n await sendLinearActivity(sessionId, 'thought', 'Agent created, starting Claude Code...');\n console.error('[CLI:start] Agent created, running...');\n\n const result = await agent.run({\n prompt,\n cwd: workingDir,\n options: {\n settingSources: ['user', 'project'],\n permissionMode: 'bypassPermissions',\n allowDangerouslySkipPermissions: true,\n },\n });\n\n console.error(`[CLI:start] Agent finished. Error: ${result.error ?? 'none'}`);\n\n if (result.error) {\n await sendLinearActivity(sessionId, 'error', `Agent error: ${result.error}`, false);\n }\n\n await reportResult(callbackUrl, sessionId, result);\n\n console.log(JSON.stringify({\n status: result.error ? 'error' : (result.interrupted ? 'interrupted' : 'completed'),\n claudeSessionId: result.sessionId,\n result: result.result,\n error: result.error,\n }));\n\n process.exit(result.error ? 1 : 0);\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n console.error(`[CLI:start] FATAL ERROR: ${errorMessage}`);\n if (errorStack) {\n console.error(`[CLI:start] Stack: ${errorStack}`);\n }\n\n // Send error to Linear before exiting\n await sendLinearActivity(sessionId, 'error', `CLI fatal error: ${errorMessage}`, false);\n\n console.error(JSON.stringify({ status: 'error', error: errorMessage }));\n process.exit(1);\n }\n });\n\nexport default startCommand;\n","import { LinearClient } from '@linear/sdk';\nimport type { SDKResultMessage } from '@anthropic-ai/claude-agent-sdk';\nimport {\n Agent,\n type PlanStep,\n type TextBlock,\n type ToolUseBlock\n} from '@/agent';\n\n/**\n * LinearAgent configuration\n */\nexport interface LinearAgentConfig {\n linearAccessToken: string;\n linearSessionId: string;\n}\n\n/**\n * Linear activity types\n * Valid types: action, error, thought, response, elicitation\n */\nenum LinearActivityType {\n\tThought = 'thought',\n\tAction = 'action',\n\tResponse = 'response', // For completion/final messages\n\tError = 'error',\n\tElicitation = 'elicitation', // For awaiting user input\n}\n/**\n * LinearAgent\n *\n * Extends Agent to emit events as Linear activities.\n * Overrides event methods to map to Linear's activity system.\n */\nexport class LinearAgent extends Agent {\n private linearClient: LinearClient;\n private linearSessionId: string;\n private lastThoughtTime = 0;\n private thoughtDebounceMs = 1000; // Debounce thoughts to avoid spam\n\n constructor(config: LinearAgentConfig) {\n super(config.linearSessionId);\n this.linearClient = new LinearClient({ accessToken: config.linearAccessToken });\n this.linearSessionId = config.linearSessionId;\n }\n\n // ============================================\n // Event method implementations\n // ============================================\n\n /**\n * Called when agent starts\n */\n protected async onStart(): Promise<void> {\n await this.sendActivity(LinearActivityType.Thought, 'Starting work...', true);\n }\n\n /**\n * Called when agent is thinking/reasoning\n * Sends as ephemeral thought activity (debounced)\n */\n protected async onThinking(block: TextBlock): Promise<void> {\n const now = Date.now();\n\n // Debounce thoughts to avoid spamming Linear\n if (now - this.lastThoughtTime < this.thoughtDebounceMs) {\n return;\n }\n\n this.lastThoughtTime = now;\n\n const content = block.text;\n\n // Skip very short thoughts\n if (content.length < 20) {\n return;\n }\n\n // Truncate long thoughts\n const truncated = content.length > 500\n ? content.substring(0, 500) + '...'\n : content;\n\n await this.sendActivity(LinearActivityType.Thought, truncated, true);\n }\n\n /**\n * Called when agent uses a tool\n * Sends as action activity with action/parameter fields\n */\n protected async onToolUse(block: ToolUseBlock): Promise<void> {\n const { action, parameter } = this.formatToolAction(block);\n await this.sendActionActivity(action, parameter, false);\n }\n\n /**\n * Called when agent updates its plan\n * Maps to Linear session plan\n */\n protected async onPlanUpdate(steps: PlanStep[]): Promise<void> {\n if (steps.length === 0) return;\n\n // Map to Linear's plan format\n const linearSteps = steps.map(step => ({\n content: step.content,\n status: this.mapStatusToLinear(step.status),\n }));\n\n try {\n await this.linearClient.updateAgentSession(this.linearSessionId, {\n plan: linearSteps,\n });\n } catch (error) {\n console.error('Failed to update Linear plan:', error);\n }\n }\n\n /**\n * Called when agent completes\n * Sends as response activity\n */\n protected async onComplete(message: SDKResultMessage): Promise<void> {\n const text = message.subtype === 'success' && message.result\n ? message.result\n : 'Task completed successfully.';\n await this.sendActivity(LinearActivityType.Response, text, false);\n }\n\n /**\n * Called when agent errors\n * Sends as error activity\n */\n protected async onError(error: Error): Promise<void> {\n await this.sendActivity(LinearActivityType.Error, `Error: ${error.message}`, false);\n }\n\n\tprotected async onStop(): Promise<void> {\n\t\tawait this.sendActivity(LinearActivityType.Response, 'Session stopped', false);\n\t}\n\n // ============================================\n // Helper methods\n // ============================================\n\n /**\n * Send activity to Linear (for non-action types: thought, response, error, elicitation)\n */\n private async sendActivity(\n type: LinearActivityType,\n body: string,\n ephemeral: boolean\n ): Promise<void> {\n try {\n await this.linearClient.createAgentActivity({\n agentSessionId: this.linearSessionId,\n content: { type, body },\n ephemeral,\n });\n } catch (error) {\n console.error('Failed to send Linear activity:', error);\n }\n }\n\n /**\n * Send action activity to Linear (requires action + parameter fields)\n */\n private async sendActionActivity(\n action: string,\n parameter: string,\n ephemeral: boolean\n ): Promise<void> {\n try {\n await this.linearClient.createAgentActivity({\n agentSessionId: this.linearSessionId,\n content: { type: LinearActivityType.Action, action, parameter },\n ephemeral,\n });\n } catch (error) {\n console.error('Failed to send Linear activity:', error);\n }\n }\n\n /**\n * Format tool use into action/parameter pair for Linear action activities\n */\n private formatToolAction(block: ToolUseBlock): { action: string; parameter: string } {\n const { name, input } = block;\n const params = input as Record<string, unknown>;\n\n switch (name) {\n case 'Write':\n return { action: 'Creating file', parameter: String(params.file_path ?? '') };\n\n case 'Edit':\n return { action: 'Editing file', parameter: String(params.file_path ?? '') };\n\n case 'Read':\n return { action: 'Reading file', parameter: String(params.file_path ?? '') };\n\n case 'Bash': {\n const cmd = String(params.command ?? '');\n const desc = String(params.description ?? cmd.substring(0, 80));\n return { action: 'Running command', parameter: desc };\n }\n\n case 'Grep':\n return { action: 'Searching', parameter: String(params.pattern ?? '') };\n\n case 'Glob':\n return { action: 'Finding files', parameter: String(params.pattern ?? '') };\n\n case 'Task':\n return { action: 'Delegating', parameter: String(params.subagent_type ?? 'subagent') };\n\n case 'Skill':\n return { action: 'Using skill', parameter: String(params.skill ?? '') };\n\n default:\n return { action: name, parameter: JSON.stringify(params).substring(0, 100) };\n }\n }\n\n /**\n * Map internal status to Linear plan status\n */\n private mapStatusToLinear(\n status: PlanStep['status']\n ): 'pending' | 'inProgress' | 'completed' | 'canceled' {\n switch (status) {\n case 'in_progress':\n return 'inProgress';\n case 'completed':\n return 'completed';\n case 'canceled':\n return 'canceled';\n case 'pending':\n default:\n return 'pending';\n }\n }\n}\n\n\nexport const createLinearAgent = (sessionId: string) => {\n\tconst linearAccessToken = process.env.LINEAR_ACCESS_TOKEN;\n\tif (!linearAccessToken) {\n\t\tthrow new Error('Linear access token is missing');\n\t}\n\n\t// Debug: log token info (first/last 4 chars only for security)\n\tconst tokenPreview = linearAccessToken.length > 8\n\t\t? `${linearAccessToken.slice(0, 4)}...${linearAccessToken.slice(-4)}`\n\t\t: '[short token]';\n\tconsole.error(`[LinearAgent] Creating agent with token: ${tokenPreview}, session: ${sessionId}`);\n\n\treturn new LinearAgent({ linearAccessToken, linearSessionId: sessionId })\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport {\n query,\n type Query,\n type Options,\n type SDKAssistantMessage,\n type SDKResultMessage,\n type SDKSystemMessage,\n} from '@anthropic-ai/claude-agent-sdk';\nimport type { TextBlock, ToolUseBlock } from '@anthropic-ai/sdk/resources/messages';\n\n/**\n * Plan step for tracking progress\n */\nexport interface PlanStep {\n content: string;\n status: 'pending' | 'in_progress' | 'completed' | 'canceled';\n}\n\n/**\n * Agent run options\n */\nexport interface AgentRunOptions {\n prompt: string;\n sessionId?: string; // SDK session ID for resumption\n resumeSession?: boolean; // Whether to resume existing session\n forkSession?: boolean; // Whether to fork when resuming\n cwd?: string; // Working directory\n options?: Partial<Options>; // Additional SDK options\n}\n\n/**\n * Agent run result\n */\nexport interface AgentRunResult {\n sessionId: string;\n result?: string;\n error?: string;\n interrupted?: boolean;\n}\n\n// ============================================\n// Interrupt file utilities\n// ============================================\n\n/**\n * Get the path to the interrupt flag file for a session\n */\nexport function getInterruptFilePath(externalSessionId: string): string {\n return path.join('/tmp', `agent-${externalSessionId}.interrupt`);\n}\n\n/**\n * Check if the interrupt flag is set\n */\nexport function checkInterruptFlag(externalSessionId: string): boolean {\n const filePath = getInterruptFilePath(externalSessionId);\n try {\n if (fs.existsSync(filePath)) {\n const content = fs.readFileSync(filePath, 'utf-8').trim();\n return content === 'true';\n }\n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * Set the interrupt flag\n */\nexport function setInterruptFlag(externalSessionId: string): void {\n const filePath = getInterruptFilePath(externalSessionId);\n fs.writeFileSync(filePath, 'true', 'utf-8');\n}\n\n/**\n * Clear the interrupt flag\n */\nexport function clearInterruptFlag(externalSessionId: string): void {\n const filePath = getInterruptFilePath(externalSessionId);\n try {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n } catch {\n // Ignore errors\n }\n}\n\n/**\n * Base Agent class\n *\n * Runs Claude Agent SDK and calls event methods for each message type.\n * Extend this class and override the event methods you need to integrate\n * with different platforms (Linear, Slack, etc.)\n */\nexport abstract class Agent {\n protected currentSessionId?: string;\n protected isRunning = false;\n protected externalSessionId: string;\n private activeQuery?: Query;\n\n constructor(externalSessionId: string) {\n this.externalSessionId = externalSessionId;\n }\n\n // ============================================\n // Event methods - Override in subclasses\n // ============================================\n\n /**\n * Called when agent starts processing\n */\n protected async onStart(): Promise<void> {\n // Override in subclasses\n }\n\n /**\n * Called when agent emits a thinking/reasoning text\n */\n protected async onThinking(block: TextBlock): Promise<void> {\n // Override in subclasses\n }\n\n /**\n * Called when agent uses a tool\n */\n protected async onToolUse(block: ToolUseBlock): Promise<void> {\n // Override in subclasses\n }\n\n /**\n * Called when agent updates its plan (via TodoWrite)\n */\n protected async onPlanUpdate(todos: PlanStep[]): Promise<void> {\n // Override in subclasses\n }\n\n /**\n * Called when agent completes successfully\n */\n protected async onComplete(message: SDKResultMessage): Promise<void> {\n // Override in subclasses\n }\n\n /**\n * Called when agent encounters an error\n */\n protected async onError(error: Error): Promise<void> {\n // Override in subclasses\n }\n\n /**\n * Called when agent is stopped via stop command\n */\n protected async onStop(): Promise<void> {\n // Override in subclasses\n }\n\n // ============================================\n // Main execution logic\n // ============================================\n\n /**\n * Run the agent with the given prompt\n */\n public async run(runOptions: AgentRunOptions): Promise<AgentRunResult> {\n const {\n prompt,\n sessionId,\n resumeSession = false,\n forkSession = false,\n cwd = process.cwd(),\n options: additionalOptions = {},\n } = runOptions;\n\n this.isRunning = true;\n let resultSessionId = sessionId ?? '';\n let finalResult: string | undefined;\n let wasInterrupted = false;\n\n // Clear any existing interrupt flag before starting\n clearInterruptFlag(this.externalSessionId);\n\n try {\n await this.onStart();\n\n // Build SDK options\n const sdkOptions: Options = {\n settingSources: ['user', 'project'],\n permissionMode: 'acceptEdits',\n cwd,\n ...additionalOptions,\n };\n\n // Add resume options if resuming\n if (resumeSession && sessionId) {\n sdkOptions.resume = sessionId;\n sdkOptions.forkSession = forkSession;\n }\n\n // Run the agent\n this.activeQuery = query({ prompt, options: sdkOptions });\n for await (const message of this.activeQuery) {\n // Check for interrupt flag\n if (checkInterruptFlag(this.externalSessionId)) {\n console.log('Interrupt flag detected, stopping agent...');\n await this.activeQuery.interrupt();\n wasInterrupted = true;\n break;\n }\n\n // Capture session ID from init message\n if (message.type === 'system') {\n const sysMsg = message as SDKSystemMessage;\n if (sysMsg.subtype === 'init') {\n resultSessionId = sysMsg.session_id;\n this.currentSessionId = sysMsg.session_id;\n }\n }\n\n // Process assistant messages\n if (message.type === 'assistant') {\n await this.processAssistantMessage(message as SDKAssistantMessage);\n }\n\n // Handle result message\n if (message.type === 'result') {\n const resultMsg = message as SDKResultMessage;\n if (resultMsg.subtype === 'success' && resultMsg.result) {\n finalResult = resultMsg.result;\n }\n await this.onComplete(resultMsg);\n }\n }\n\n return {\n sessionId: resultSessionId,\n result: finalResult,\n interrupted: wasInterrupted,\n };\n\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n await this.onError(err);\n\n return {\n sessionId: resultSessionId,\n error: err.message,\n interrupted: wasInterrupted,\n };\n\n } finally {\n this.isRunning = false;\n this.activeQuery = undefined;\n // Clear interrupt flag after we're done\n clearInterruptFlag(this.externalSessionId);\n }\n }\n\n /**\n * Interrupt the currently running agent\n * Returns true if an interrupt was sent, false if no active query\n */\n public async interrupt(): Promise<boolean> {\n if (this.activeQuery) {\n await this.activeQuery.interrupt();\n return true;\n }\n return false;\n }\n\n /**\n * Stop the agent session\n * Sets interrupt flag and calls onStop callback\n */\n public async stop(): Promise<void> {\n setInterruptFlag(this.externalSessionId);\n await this.onStop();\n }\n\n /**\n * Process an assistant message and call appropriate event methods\n */\n private async processAssistantMessage(message: SDKAssistantMessage): Promise<void> {\n const content = message.message.content;\n\n for (const block of content) {\n // Text block -> onThinking\n if (block.type === 'text') {\n await this.onThinking(block);\n }\n\n // Tool use block -> onToolUse or onPlanUpdate\n if (block.type === 'tool_use') {\n // Handle TodoWrite specially - emit as plan update\n if (block.name === 'TodoWrite') {\n const input = block.input as { todos?: PlanStep[] };\n if (input.todos) {\n await this.onPlanUpdate(input.todos);\n }\n } else {\n await this.onToolUse(block);\n }\n }\n }\n }\n\n /**\n * Check if agent is currently running\n */\n public isActive(): boolean {\n return this.isRunning;\n }\n\n /**\n * Get current session ID\n */\n public getSessionId(): string | undefined {\n return this.currentSessionId;\n }\n}\n\nexport { TextBlock, ToolUseBlock }\n","import { Agent } from './agent';\nimport {createLinearAgent, LinearAgent} from './linear/agent';\n\n/**\n * Supported platforms\n */\nexport type Platform = 'linear';\n\n/**\n * Create an agent for the specified platform\n */\nexport function createAgent(platform: Platform, sessionId: string): Agent {\n switch (platform) {\n case 'linear':\n\t\t\treturn createLinearAgent(sessionId)\n default:\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n","/**\n * HTTP callback client for updating session state on the server\n */\n\nexport interface SessionUpdate {\n externalSessionId: string;\n claudeSessionId?: string;\n state: 'running' | 'completed' | 'error';\n error?: string;\n}\n\n/**\n * Send a session update to the server callback endpoint\n */\nexport async function sendSessionUpdate(\n callbackUrl: string,\n callbackSecret: string,\n update: SessionUpdate\n): Promise<void> {\n try {\n const response = await fetch(callbackUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${callbackSecret}`,\n },\n body: JSON.stringify(update),\n });\n\n if (!response.ok) {\n console.error(`Callback failed: ${response.status} ${response.statusText}`);\n }\n } catch (error) {\n console.error('Failed to send session update:', error);\n }\n}\n\n/**\n * Update session as running with Claude session ID\n */\nexport async function reportRunning(\n callbackUrl: string,\n callbackSecret: string,\n externalSessionId: string,\n claudeSessionId: string\n): Promise<void> {\n await sendSessionUpdate(callbackUrl, callbackSecret, {\n externalSessionId,\n claudeSessionId,\n state: 'running',\n });\n}\n\n/**\n * Update session as completed\n */\nexport async function reportCompleted(\n callbackUrl: string,\n callbackSecret: string,\n externalSessionId: string,\n claudeSessionId: string\n): Promise<void> {\n await sendSessionUpdate(callbackUrl, callbackSecret, {\n externalSessionId,\n claudeSessionId,\n state: 'completed',\n });\n}\n\n/**\n * Update session as errored\n */\nexport async function reportError(\n callbackUrl: string,\n callbackSecret: string,\n externalSessionId: string,\n error: string\n): Promise<void> {\n await sendSessionUpdate(callbackUrl, callbackSecret, {\n externalSessionId,\n state: 'error',\n error,\n });\n}\n\n/**\n * Agent run result for reporting\n */\nexport interface AgentResult {\n sessionId: string;\n result?: string;\n error?: string;\n interrupted?: boolean;\n}\n\n/**\n * Report agent result to callback server\n * Handles running, completed, error, and interrupted states\n */\nexport async function reportResult(\n callbackUrl: string | undefined,\n externalSessionId: string,\n result: AgentResult\n): Promise<void> {\n const callbackSecret = process.env.CLAUDE_LINEAR_CALLBACK_SECRET;\n\n if (!callbackUrl || !callbackSecret) {\n return;\n }\n\n // Report running status with session ID\n if (result.sessionId) {\n await reportRunning(callbackUrl, callbackSecret, externalSessionId, result.sessionId);\n }\n\n // Report final status\n if (result.error) {\n await reportError(callbackUrl, callbackSecret, externalSessionId, result.error);\n } else if (!result.interrupted) {\n // Only report completed if not interrupted\n await reportCompleted(callbackUrl, callbackSecret, externalSessionId, result.sessionId);\n }\n // If interrupted, don't report - resume will handle it\n}\n","import { Command } from 'commander';\nimport { createAgent, type Platform } from '@/factory';\n\nexport const stopCommand = new Command('stop')\n .description('Stop an agent session gracefully')\n .requiredOption('--platform <platform>', 'Platform type (linear)')\n .requiredOption('--session-id <id>', 'External session ID (e.g., Linear session ID)')\n .action(async (options) => {\n const { platform, sessionId } = options;\n\n try {\n const agent = createAgent(platform as Platform, sessionId);\n await agent.stop();\n\n console.log(JSON.stringify({\n status: 'stopped',\n sessionId,\n }));\n process.exit(0);\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(JSON.stringify({\n status: 'error',\n error: errorMessage,\n }));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { createAgent, type Platform } from '@/factory';\nimport { setInterruptFlag } from '@/agent';\nimport { reportResult } from '@/callback';\n\nconst INTERRUPT_WAIT_MS = 500;\n\nexport const resumeCommand = new Command('resume')\n .description('Resume an existing agent session')\n .requiredOption('--platform <platform>', 'Platform type (linear)')\n .requiredOption('--session-id <id>', 'External session ID (e.g., Linear session ID)')\n .requiredOption('--claude-session-id <id>', 'Claude SDK session ID to resume')\n .requiredOption('--prompt <prompt>', 'New prompt/user input')\n .option('--callback-url <url>', 'Server callback URL for session updates')\n .option('--working-dir <dir>', 'Working directory', process.cwd())\n .action(async (options) => {\n const { platform, sessionId, claudeSessionId, prompt, callbackUrl, workingDir } = options;\n\n // Set interrupt flag in case another agent is running\n setInterruptFlag(sessionId);\n await new Promise(resolve => setTimeout(resolve, INTERRUPT_WAIT_MS));\n\n try {\n const agent = createAgent(platform as Platform, sessionId);\n\n const result = await agent.run({\n prompt,\n sessionId: claudeSessionId,\n resumeSession: true,\n forkSession: false,\n cwd: workingDir,\n options: {\n settingSources: ['user', 'project'],\n permissionMode: 'bypassPermissions',\n allowDangerouslySkipPermissions: true,\n },\n });\n\n await reportResult(callbackUrl, sessionId, result);\n\n console.log(JSON.stringify({\n status: result.error ? 'error' : (result.interrupted ? 'interrupted' : 'completed'),\n claudeSessionId: result.sessionId,\n result: result.result,\n error: result.error,\n }));\n\n process.exit(result.error ? 1 : 0);\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(JSON.stringify({ status: 'error', error: errorMessage }));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { installClaudeConfig } from '../config';\n\nexport const initCommand = new Command('init')\n .description('Install Claude configs to ~/.claude/ (MCP servers, plugins, skills)')\n .action(() => {\n console.log('Initializing Claude configs...');\n installClaudeConfig();\n console.log('Done. Claude Agent SDK will now use bundled configs.');\n });","import { cpSync, existsSync, mkdirSync } from 'fs';\nimport { dirname, resolve, join } from 'path';\nimport { fileURLToPath } from 'url';\nimport { homedir } from 'os';\n\n/**\n * Get the path to the bundled claude-config directory\n */\nfunction getBundledConfigPath(): string {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n return resolve(__dirname, 'claude-config');\n}\n\n/**\n * Get the user's ~/.claude directory path\n */\nfunction getUserClaudeDir(): string {\n return join(homedir(), '.claude');\n}\n\n/**\n * Install bundled Claude configs to ~/.claude/\n *\n * This copies:\n * - settings.json (plugins, env vars)\n * - .mcp.json (MCP server configurations)\n * - skills/ (custom skills)\n * - agents/ (custom agents, if any)\n *\n * Files are merged/overwritten - existing user configs will be replaced.\n */\nexport function installClaudeConfig(): void {\n const bundledPath = getBundledConfigPath();\n const userClaudeDir = getUserClaudeDir();\n\n if (!existsSync(bundledPath)) {\n console.warn('Warning: Bundled claude-config not found. Skipping config installation.');\n return;\n }\n\n // Ensure ~/.claude exists\n if (!existsSync(userClaudeDir)) {\n mkdirSync(userClaudeDir, { recursive: true });\n }\n\n // Copy bundled configs to user directory\n cpSync(bundledPath, userClaudeDir, { recursive: true, force: true });\n\n console.log(`Installed Claude configs to ${userClaudeDir}`);\n}\n\n/**\n * Check if Claude configs are installed\n */\nexport function isConfigInstalled(): boolean {\n const userClaudeDir = getUserClaudeDir();\n const settingsPath = join(userClaudeDir, 'settings.json');\n return existsSync(settingsPath);\n}"],"mappings":"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","names":["Command","LinearClient","LinearClient","Command","Command","Command","Command","resolve","Command","existsSync","join","Command","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/start.ts","../src/linear/agent.ts","../src/agent.ts","../src/factory.ts","../src/callback.ts","../src/commands/stop.ts","../src/commands/resume.ts","../src/commands/init.ts","../src/config.ts"],"sourcesContent":["import { Command } from 'commander';\nimport startCommand from './commands/start';\nimport { stopCommand } from './commands/stop';\nimport { resumeCommand } from './commands/resume';\nimport { initCommand } from './commands/init';\n\nconst program = new Command();\n\nprogram\n .name('claude-sandbox-agent')\n .description('CLI for running Claude agents in Vercel sandboxes')\n .version('0.1.0');\n\nprogram.addCommand(initCommand);\nprogram.addCommand(startCommand);\nprogram.addCommand(stopCommand);\nprogram.addCommand(resumeCommand);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport { LinearClient } from '@linear/sdk';\nimport { createAgent, type Platform } from '@/factory';\nimport { reportResult } from '@/callback';\n\n/**\n * Send activity to Linear for pre-agent logging\n */\nasync function sendLinearActivity(\n sessionId: string,\n type: 'thought' | 'error',\n message: string,\n ephemeral = true\n): Promise<void> {\n const token = process.env.LINEAR_ACCESS_TOKEN;\n if (!token) return;\n\n try {\n const client = new LinearClient({ accessToken: token });\n await client.createAgentActivity({\n agentSessionId: sessionId,\n content: { type, body: message },\n ephemeral,\n });\n } catch {\n // Don't fail if activity sending fails\n }\n}\n\nconst startCommand = new Command('start')\n .description('Start a new agent session')\n .requiredOption('--platform <platform>', 'Platform type (linear)')\n .requiredOption('--session-id <id>', 'External session ID (e.g., Linear session ID)')\n .requiredOption('--prompt <prompt>', 'Initial prompt for the agent')\n .option('--callback-url <url>', 'Server callback URL for session updates')\n .option('--working-dir <dir>', 'Working directory', process.cwd())\n .action(async (options) => {\n const { platform, sessionId, prompt, callbackUrl, workingDir } = options;\n\n if (!process.env.ANTHROPIC_API_KEY) {\n await sendLinearActivity(sessionId, 'error', 'ANTHROPIC_API_KEY not set', false);\n process.exit(1);\n }\n\n try {\n const agent = createAgent(platform as Platform, sessionId);\n\n const result = await agent.run({\n prompt,\n cwd: workingDir,\n options: {\n settingSources: ['user', 'project'],\n permissionMode: 'bypassPermissions',\n allowDangerouslySkipPermissions: true,\n },\n });\n\n if (result.error) {\n await sendLinearActivity(sessionId, 'error', `Agent error: ${result.error}`, false);\n }\n\n await reportResult(callbackUrl, sessionId, result);\n\n console.log(JSON.stringify({\n status: result.error ? 'error' : (result.interrupted ? 'interrupted' : 'completed'),\n claudeSessionId: result.sessionId,\n result: result.result,\n error: result.error,\n }));\n\n process.exit(result.error ? 1 : 0);\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n await sendLinearActivity(sessionId, 'error', `CLI fatal error: ${errorMessage}`, false);\n console.error(JSON.stringify({ status: 'error', error: errorMessage }));\n process.exit(1);\n }\n });\n\nexport default startCommand;\n","import { LinearClient } from '@linear/sdk';\nimport type { SDKResultMessage } from '@anthropic-ai/claude-agent-sdk';\nimport {\n Agent,\n type PlanStep,\n type TextBlock,\n type ToolUseBlock\n} from '@/agent';\n\nexport interface LinearAgentConfig {\n linearAccessToken: string;\n linearSessionId: string;\n}\n\nenum LinearActivityType {\n\tThought = 'thought',\n\tAction = 'action',\n\tResponse = 'response',\n\tError = 'error',\n\tElicitation = 'elicitation',\n}\n\n/** Tools that indicate exploration/subagent work — always ephemeral */\nconst EPHEMERAL_TOOLS = new Set(['Read', 'Grep', 'Glob', 'WebSearch', 'WebFetch', 'ToolSearch']);\n\nexport class LinearAgent extends Agent {\n private linearClient: LinearClient;\n private linearSessionId: string;\n private lastThoughtTime = 0;\n private thoughtDebounceMs = 1000;\n private isDelegating = false;\n private isCompleted = false;\n\n constructor(config: LinearAgentConfig) {\n super(config.linearSessionId);\n this.linearClient = new LinearClient({ accessToken: config.linearAccessToken });\n this.linearSessionId = config.linearSessionId;\n }\n\n protected async onStart(): Promise<void> {\n await this.sendActivity(LinearActivityType.Thought, 'Starting work...', true);\n }\n\n protected async onThinking(block: TextBlock): Promise<void> {\n if (this.isCompleted) return;\n\n const now = Date.now();\n if (now - this.lastThoughtTime < this.thoughtDebounceMs) return;\n this.lastThoughtTime = now;\n\n const content = block.text;\n if (content.length < 20) return;\n\n const truncated = content.length > 500\n ? content.substring(0, 500) + '...'\n : content;\n\n // Thoughts are always ephemeral\n await this.sendActivity(LinearActivityType.Thought, truncated, true);\n }\n\n protected async onToolUse(block: ToolUseBlock): Promise<void> {\n if (this.isCompleted) return;\n\n const { name } = block;\n\n // Task tool = delegation — mark as delegating\n if (name === 'Task') {\n this.isDelegating = true;\n const subagentType = String((block.input as Record<string, unknown>).subagent_type ?? 'subagent');\n await this.sendActionActivity('Delegating', subagentType, false);\n return;\n }\n\n // Determine if this action should be ephemeral\n const ephemeral = this.isDelegating || EPHEMERAL_TOOLS.has(name);\n\n const { action, parameter } = this.formatToolAction(block);\n await this.sendActionActivity(action, parameter, ephemeral);\n }\n\n protected async onPlanUpdate(steps: PlanStep[]): Promise<void> {\n if (steps.length === 0) return;\n\n // When we get a plan update from the main agent, delegation is over\n this.isDelegating = false;\n\n const linearSteps = steps.map(step => ({\n content: step.content,\n status: this.mapStatusToLinear(step.status),\n }));\n\n try {\n await this.linearClient.updateAgentSession(this.linearSessionId, {\n plan: linearSteps,\n });\n } catch (error) {\n console.error('Failed to update Linear plan:', error);\n }\n }\n\n protected async onComplete(message: SDKResultMessage): Promise<void> {\n this.isCompleted = true;\n this.isDelegating = false;\n\n const text = message.subtype === 'success' && message.result\n ? message.result\n : 'Task completed successfully.';\n await this.sendActivity(LinearActivityType.Response, text, false);\n }\n\n protected async onError(error: Error): Promise<void> {\n this.isCompleted = true;\n await this.sendActivity(LinearActivityType.Error, `Error: ${error.message}`, false);\n }\n\n\tprotected async onStop(): Promise<void> {\n\t\tthis.isCompleted = true;\n\t\tawait this.sendActivity(LinearActivityType.Response, 'Session stopped', false);\n\t}\n\n // ============================================\n // Helper methods\n // ============================================\n\n private async sendActivity(\n type: LinearActivityType,\n body: string,\n ephemeral: boolean\n ): Promise<void> {\n try {\n await this.linearClient.createAgentActivity({\n agentSessionId: this.linearSessionId,\n content: { type, body },\n ephemeral,\n });\n } catch (error) {\n console.error('Failed to send Linear activity:', error);\n }\n }\n\n private async sendActionActivity(\n action: string,\n parameter: string,\n ephemeral: boolean\n ): Promise<void> {\n try {\n await this.linearClient.createAgentActivity({\n agentSessionId: this.linearSessionId,\n content: { type: LinearActivityType.Action, action, parameter },\n ephemeral,\n });\n } catch (error) {\n console.error('Failed to send Linear activity:', error);\n }\n }\n\n private formatToolAction(block: ToolUseBlock): { action: string; parameter: string } {\n const { name, input } = block;\n const params = input as Record<string, unknown>;\n\n switch (name) {\n case 'Write':\n return { action: 'Creating file', parameter: String(params.file_path ?? '') };\n\n case 'Edit':\n return { action: 'Editing file', parameter: String(params.file_path ?? '') };\n\n case 'Read':\n return { action: 'Reading file', parameter: String(params.file_path ?? '') };\n\n case 'Bash': {\n const cmd = String(params.command ?? '');\n return { action: 'Running command', parameter: cmd.length > 80 ? cmd.substring(0, 80) + '...' : cmd };\n }\n\n case 'Grep':\n return { action: 'Searching', parameter: String(params.pattern ?? '') };\n\n case 'Glob':\n return { action: 'Finding files', parameter: String(params.pattern ?? '') };\n\n case 'Task':\n return { action: 'Delegating', parameter: String(params.subagent_type ?? 'subagent') };\n\n case 'Skill':\n return { action: 'Using skill', parameter: String(params.skill ?? '') };\n\n default:\n return { action: name, parameter: JSON.stringify(params).substring(0, 100) };\n }\n }\n\n private mapStatusToLinear(\n status: PlanStep['status']\n ): 'pending' | 'inProgress' | 'completed' | 'canceled' {\n switch (status) {\n case 'in_progress': return 'inProgress';\n case 'completed': return 'completed';\n case 'canceled': return 'canceled';\n case 'pending':\n default: return 'pending';\n }\n }\n}\n\n\nexport const createLinearAgent = (sessionId: string) => {\n\tconst linearAccessToken = process.env.LINEAR_ACCESS_TOKEN;\n\tif (!linearAccessToken) {\n\t\tthrow new Error('Linear access token is missing');\n\t}\n\n\treturn new LinearAgent({ linearAccessToken, linearSessionId: sessionId })\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport {\n query,\n type Query,\n type Options,\n type SDKAssistantMessage,\n type SDKResultMessage,\n type SDKSystemMessage,\n} from '@anthropic-ai/claude-agent-sdk';\nimport type { TextBlock, ToolUseBlock } from '@anthropic-ai/sdk/resources/messages';\n\n/**\n * Plan step for tracking progress\n */\nexport interface PlanStep {\n content: string;\n status: 'pending' | 'in_progress' | 'completed' | 'canceled';\n}\n\n/**\n * Agent run options\n */\nexport interface AgentRunOptions {\n prompt: string;\n sessionId?: string; // SDK session ID for resumption\n resumeSession?: boolean; // Whether to resume existing session\n forkSession?: boolean; // Whether to fork when resuming\n cwd?: string; // Working directory\n options?: Partial<Options>; // Additional SDK options\n}\n\n/**\n * Agent run result\n */\nexport interface AgentRunResult {\n sessionId: string;\n result?: string;\n error?: string;\n interrupted?: boolean;\n}\n\n// ============================================\n// Interrupt file utilities\n// ============================================\n\n/**\n * Get the path to the interrupt flag file for a session\n */\nexport function getInterruptFilePath(externalSessionId: string): string {\n return path.join('/tmp', `agent-${externalSessionId}.interrupt`);\n}\n\n/**\n * Check if the interrupt flag is set\n */\nexport function checkInterruptFlag(externalSessionId: string): boolean {\n const filePath = getInterruptFilePath(externalSessionId);\n try {\n if (fs.existsSync(filePath)) {\n const content = fs.readFileSync(filePath, 'utf-8').trim();\n return content === 'true';\n }\n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * Set the interrupt flag\n */\nexport function setInterruptFlag(externalSessionId: string): void {\n const filePath = getInterruptFilePath(externalSessionId);\n fs.writeFileSync(filePath, 'true', 'utf-8');\n}\n\n/**\n * Clear the interrupt flag\n */\nexport function clearInterruptFlag(externalSessionId: string): void {\n const filePath = getInterruptFilePath(externalSessionId);\n try {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n } catch {\n // Ignore errors\n }\n}\n\n/**\n * Base Agent class\n *\n * Runs Claude Agent SDK and calls event methods for each message type.\n * Extend this class and override the event methods you need to integrate\n * with different platforms (Linear, Slack, etc.)\n */\nexport abstract class Agent {\n protected currentSessionId?: string;\n protected isRunning = false;\n protected externalSessionId: string;\n private activeQuery?: Query;\n\n constructor(externalSessionId: string) {\n this.externalSessionId = externalSessionId;\n }\n\n // ============================================\n // Event methods - Override in subclasses\n // ============================================\n\n /**\n * Called when agent starts processing\n */\n protected async onStart(): Promise<void> {\n // Override in subclasses\n }\n\n /**\n * Called when agent emits a thinking/reasoning text\n */\n protected async onThinking(block: TextBlock): Promise<void> {\n // Override in subclasses\n }\n\n /**\n * Called when agent uses a tool\n */\n protected async onToolUse(block: ToolUseBlock): Promise<void> {\n // Override in subclasses\n }\n\n /**\n * Called when agent updates its plan (via TodoWrite)\n */\n protected async onPlanUpdate(todos: PlanStep[]): Promise<void> {\n // Override in subclasses\n }\n\n /**\n * Called when agent completes successfully\n */\n protected async onComplete(message: SDKResultMessage): Promise<void> {\n // Override in subclasses\n }\n\n /**\n * Called when agent encounters an error\n */\n protected async onError(error: Error): Promise<void> {\n // Override in subclasses\n }\n\n /**\n * Called when agent is stopped via stop command\n */\n protected async onStop(): Promise<void> {\n // Override in subclasses\n }\n\n // ============================================\n // Main execution logic\n // ============================================\n\n /**\n * Run the agent with the given prompt\n */\n public async run(runOptions: AgentRunOptions): Promise<AgentRunResult> {\n const {\n prompt,\n sessionId,\n resumeSession = false,\n forkSession = false,\n cwd = process.cwd(),\n options: additionalOptions = {},\n } = runOptions;\n\n this.isRunning = true;\n let resultSessionId = sessionId ?? '';\n let finalResult: string | undefined;\n let wasInterrupted = false;\n\n // Clear any existing interrupt flag before starting\n clearInterruptFlag(this.externalSessionId);\n\n try {\n await this.onStart();\n\n // Build SDK options\n const sdkOptions: Options = {\n settingSources: ['user', 'project'],\n permissionMode: 'acceptEdits',\n cwd,\n ...additionalOptions,\n };\n\n // Add resume options if resuming\n if (resumeSession && sessionId) {\n sdkOptions.resume = sessionId;\n sdkOptions.forkSession = forkSession;\n }\n\n // Run the agent\n this.activeQuery = query({ prompt, options: sdkOptions });\n for await (const message of this.activeQuery) {\n // Check for interrupt flag\n if (checkInterruptFlag(this.externalSessionId)) {\n console.log('Interrupt flag detected, stopping agent...');\n await this.activeQuery.interrupt();\n wasInterrupted = true;\n break;\n }\n\n // Capture session ID from init message\n if (message.type === 'system') {\n const sysMsg = message as SDKSystemMessage;\n if (sysMsg.subtype === 'init') {\n resultSessionId = sysMsg.session_id;\n this.currentSessionId = sysMsg.session_id;\n }\n }\n\n // Process assistant messages\n if (message.type === 'assistant') {\n await this.processAssistantMessage(message as SDKAssistantMessage);\n }\n\n // Handle result message\n if (message.type === 'result') {\n const resultMsg = message as SDKResultMessage;\n if (resultMsg.subtype === 'success' && resultMsg.result) {\n finalResult = resultMsg.result;\n }\n await this.onComplete(resultMsg);\n }\n }\n\n return {\n sessionId: resultSessionId,\n result: finalResult,\n interrupted: wasInterrupted,\n };\n\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n await this.onError(err);\n\n return {\n sessionId: resultSessionId,\n error: err.message,\n interrupted: wasInterrupted,\n };\n\n } finally {\n this.isRunning = false;\n this.activeQuery = undefined;\n // Clear interrupt flag after we're done\n clearInterruptFlag(this.externalSessionId);\n }\n }\n\n /**\n * Interrupt the currently running agent\n * Returns true if an interrupt was sent, false if no active query\n */\n public async interrupt(): Promise<boolean> {\n if (this.activeQuery) {\n await this.activeQuery.interrupt();\n return true;\n }\n return false;\n }\n\n /**\n * Stop the agent session\n * Sets interrupt flag and calls onStop callback\n */\n public async stop(): Promise<void> {\n setInterruptFlag(this.externalSessionId);\n await this.onStop();\n }\n\n /**\n * Process an assistant message and call appropriate event methods\n */\n private async processAssistantMessage(message: SDKAssistantMessage): Promise<void> {\n const content = message.message.content;\n\n for (const block of content) {\n // Text block -> onThinking\n if (block.type === 'text') {\n await this.onThinking(block);\n }\n\n // Tool use block -> onToolUse or onPlanUpdate\n if (block.type === 'tool_use') {\n // Handle TodoWrite specially - emit as plan update\n if (block.name === 'TodoWrite') {\n const input = block.input as { todos?: PlanStep[] };\n if (input.todos) {\n await this.onPlanUpdate(input.todos);\n }\n } else {\n await this.onToolUse(block);\n }\n }\n }\n }\n\n /**\n * Check if agent is currently running\n */\n public isActive(): boolean {\n return this.isRunning;\n }\n\n /**\n * Get current session ID\n */\n public getSessionId(): string | undefined {\n return this.currentSessionId;\n }\n}\n\nexport { TextBlock, ToolUseBlock }\n","import { Agent } from './agent';\nimport {createLinearAgent, LinearAgent} from './linear/agent';\n\n/**\n * Supported platforms\n */\nexport type Platform = 'linear';\n\n/**\n * Create an agent for the specified platform\n */\nexport function createAgent(platform: Platform, sessionId: string): Agent {\n switch (platform) {\n case 'linear':\n\t\t\treturn createLinearAgent(sessionId)\n default:\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n","/**\n * HTTP callback client for updating session state on the server\n */\n\nexport interface SessionUpdate {\n externalSessionId: string;\n claudeSessionId?: string;\n state: 'running' | 'completed' | 'error';\n error?: string;\n}\n\nexport async function sendSessionUpdate(\n callbackUrl: string,\n callbackSecret: string,\n update: SessionUpdate\n): Promise<void> {\n try {\n const response = await fetch(callbackUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${callbackSecret}`,\n },\n body: JSON.stringify(update),\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => '');\n console.error(`[callback] Failed: ${response.status} ${response.statusText} - ${body}`);\n }\n } catch (error) {\n console.error('[callback] Failed to send session update:', error);\n }\n}\n\nexport async function reportRunning(\n callbackUrl: string,\n callbackSecret: string,\n externalSessionId: string,\n claudeSessionId: string\n): Promise<void> {\n await sendSessionUpdate(callbackUrl, callbackSecret, {\n externalSessionId,\n claudeSessionId,\n state: 'running',\n });\n}\n\nexport async function reportCompleted(\n callbackUrl: string,\n callbackSecret: string,\n externalSessionId: string,\n claudeSessionId: string\n): Promise<void> {\n await sendSessionUpdate(callbackUrl, callbackSecret, {\n externalSessionId,\n claudeSessionId,\n state: 'completed',\n });\n}\n\nexport async function reportError(\n callbackUrl: string,\n callbackSecret: string,\n externalSessionId: string,\n error: string\n): Promise<void> {\n await sendSessionUpdate(callbackUrl, callbackSecret, {\n externalSessionId,\n state: 'error',\n error,\n });\n}\n\nexport interface AgentResult {\n sessionId: string;\n result?: string;\n error?: string;\n interrupted?: boolean;\n}\n\nexport async function reportResult(\n callbackUrl: string | undefined,\n externalSessionId: string,\n result: AgentResult\n): Promise<void> {\n const callbackSecret = process.env.CLAUDE_LINEAR_CALLBACK_SECRET;\n\n if (!callbackUrl || !callbackSecret) {\n return;\n }\n\n // Report running status with session ID\n if (result.sessionId) {\n await reportRunning(callbackUrl, callbackSecret, externalSessionId, result.sessionId);\n }\n\n // Report final status\n if (result.error) {\n await reportError(callbackUrl, callbackSecret, externalSessionId, result.error);\n } else if (!result.interrupted) {\n await reportCompleted(callbackUrl, callbackSecret, externalSessionId, result.sessionId);\n }\n}\n","import { Command } from 'commander';\nimport { createAgent, type Platform } from '@/factory';\n\nexport const stopCommand = new Command('stop')\n .description('Stop an agent session gracefully')\n .requiredOption('--platform <platform>', 'Platform type (linear)')\n .requiredOption('--session-id <id>', 'External session ID (e.g., Linear session ID)')\n .action(async (options) => {\n const { platform, sessionId } = options;\n\n try {\n const agent = createAgent(platform as Platform, sessionId);\n await agent.stop();\n\n console.log(JSON.stringify({\n status: 'stopped',\n sessionId,\n }));\n process.exit(0);\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(JSON.stringify({\n status: 'error',\n error: errorMessage,\n }));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { createAgent, type Platform } from '@/factory';\nimport { setInterruptFlag } from '@/agent';\nimport { reportResult } from '@/callback';\n\nconst INTERRUPT_WAIT_MS = 500;\n\nexport const resumeCommand = new Command('resume')\n .description('Resume an existing agent session')\n .requiredOption('--platform <platform>', 'Platform type (linear)')\n .requiredOption('--session-id <id>', 'External session ID (e.g., Linear session ID)')\n .requiredOption('--claude-session-id <id>', 'Claude SDK session ID to resume')\n .requiredOption('--prompt <prompt>', 'New prompt/user input')\n .option('--callback-url <url>', 'Server callback URL for session updates')\n .option('--working-dir <dir>', 'Working directory', process.cwd())\n .action(async (options) => {\n const { platform, sessionId, claudeSessionId, prompt, callbackUrl, workingDir } = options;\n\n // Set interrupt flag in case another agent is running\n setInterruptFlag(sessionId);\n await new Promise(resolve => setTimeout(resolve, INTERRUPT_WAIT_MS));\n\n try {\n const agent = createAgent(platform as Platform, sessionId);\n\n const result = await agent.run({\n prompt,\n sessionId: claudeSessionId,\n resumeSession: true,\n forkSession: false,\n cwd: workingDir,\n options: {\n settingSources: ['user', 'project'],\n permissionMode: 'bypassPermissions',\n allowDangerouslySkipPermissions: true,\n },\n });\n\n await reportResult(callbackUrl, sessionId, result);\n\n console.log(JSON.stringify({\n status: result.error ? 'error' : (result.interrupted ? 'interrupted' : 'completed'),\n claudeSessionId: result.sessionId,\n result: result.result,\n error: result.error,\n }));\n\n process.exit(result.error ? 1 : 0);\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(JSON.stringify({ status: 'error', error: errorMessage }));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { installClaudeConfig } from '../config';\n\nexport const initCommand = new Command('init')\n .description('Install Claude configs to ~/.claude/ (MCP servers, plugins, skills)')\n .action(() => {\n console.log('Initializing Claude configs...');\n installClaudeConfig();\n console.log('Done. Claude Agent SDK will now use bundled configs.');\n });","import { cpSync, existsSync, mkdirSync } from 'fs';\nimport { dirname, resolve, join } from 'path';\nimport { fileURLToPath } from 'url';\nimport { homedir } from 'os';\n\n/**\n * Get the path to the bundled claude-config directory\n */\nfunction getBundledConfigPath(): string {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n return resolve(__dirname, 'claude-config');\n}\n\n/**\n * Get the user's ~/.claude directory path\n */\nfunction getUserClaudeDir(): string {\n return join(homedir(), '.claude');\n}\n\n/**\n * Install bundled Claude configs to ~/.claude/\n *\n * This copies:\n * - settings.json (plugins, env vars)\n * - .mcp.json (MCP server configurations)\n * - skills/ (custom skills)\n * - agents/ (custom agents, if any)\n *\n * Files are merged/overwritten - existing user configs will be replaced.\n */\nexport function installClaudeConfig(): void {\n const bundledPath = getBundledConfigPath();\n const userClaudeDir = getUserClaudeDir();\n\n if (!existsSync(bundledPath)) {\n console.warn('Warning: Bundled claude-config not found. Skipping config installation.');\n return;\n }\n\n // Ensure ~/.claude exists\n if (!existsSync(userClaudeDir)) {\n mkdirSync(userClaudeDir, { recursive: true });\n }\n\n // Copy bundled configs to user directory\n cpSync(bundledPath, userClaudeDir, { recursive: true, force: true });\n\n console.log(`Installed Claude configs to ${userClaudeDir}`);\n}\n\n/**\n * Check if Claude configs are installed\n */\nexport function isConfigInstalled(): boolean {\n const userClaudeDir = getUserClaudeDir();\n const settingsPath = join(userClaudeDir, 'settings.json');\n return existsSync(settingsPath);\n}"],"mappings":"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","names":["Command","LinearClient","LinearClient","Command","Command","Command","Command","resolve","Command","existsSync","join","Command","Command"]}
|