kartman-dev 1.0.0-dev.3 → 1.0.0-dev.5
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.
|
@@ -16,10 +16,10 @@
|
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
18
|
"laminar": {
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
19
|
+
"type": "http",
|
|
20
|
+
"url": "https://api.lmnr.ai/v1/mcp",
|
|
21
|
+
"headers": {
|
|
22
|
+
"Authorization": "Bearer ${LMNR_PROJECT_API_KEY}"
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"nia": {
|
|
@@ -9,6 +9,12 @@
|
|
|
9
9
|
"matcher": "Read",
|
|
10
10
|
"hooks": [{ "type": "command", "command": "${CLAUDE_PLUGIN_ROOT}/scripts/block-secrets.sh" }]
|
|
11
11
|
}
|
|
12
|
+
],
|
|
13
|
+
"PermissionRequest": [
|
|
14
|
+
{
|
|
15
|
+
"matcher": "*",
|
|
16
|
+
"hooks": [{ "type": "command", "command": "${CLAUDE_PLUGIN_ROOT}/scripts/auto-approve-permissions.sh" }]
|
|
17
|
+
}
|
|
12
18
|
]
|
|
13
19
|
}
|
|
14
20
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# PermissionRequest hook: auto-approve all permission requests for autonomous operation
|
|
3
|
+
# This allows the agent to run without manual approval while PreToolUse hooks still validate
|
|
4
|
+
|
|
5
|
+
cat <<'EOF'
|
|
6
|
+
{
|
|
7
|
+
"hookSpecificOutput": {
|
|
8
|
+
"hookEventName": "PermissionRequest",
|
|
9
|
+
"decision": {
|
|
10
|
+
"behavior": "allow"
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
EOF
|
|
15
|
+
exit 0
|
package/dist/index.js
CHANGED
|
@@ -173,8 +173,7 @@ var Agent = class {
|
|
|
173
173
|
process.env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS = "1";
|
|
174
174
|
const sdkOptions = {
|
|
175
175
|
settingSources: ["project"],
|
|
176
|
-
permissionMode: "
|
|
177
|
-
allowDangerouslySkipPermissions: true,
|
|
176
|
+
permissionMode: "default",
|
|
178
177
|
plugins: [{ type: "local", path: getPluginPath(cwd) }],
|
|
179
178
|
systemPrompt: {
|
|
180
179
|
preset: "claude_code",
|
|
@@ -236,6 +235,13 @@ var Agent = class {
|
|
|
236
235
|
this.isRunning = false;
|
|
237
236
|
this.activeQuery = void 0;
|
|
238
237
|
this.clearInterrupt();
|
|
238
|
+
if (process.env.LMNR_PROJECT_API_KEY) {
|
|
239
|
+
try {
|
|
240
|
+
await Laminar.flush();
|
|
241
|
+
} catch (error) {
|
|
242
|
+
console.error("[Agent] Failed to flush Laminar traces:", error);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
239
245
|
}
|
|
240
246
|
}
|
|
241
247
|
/**
|
|
@@ -624,16 +630,25 @@ var initCommand = new Command4("init").description("Install agent plugin (MCP se
|
|
|
624
630
|
// src/commands/update.ts
|
|
625
631
|
import { Command as Command5 } from "commander";
|
|
626
632
|
import { execSync, execFileSync } from "child_process";
|
|
627
|
-
import { readFileSync as readFileSync3 } from "fs";
|
|
628
|
-
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
629
|
-
import { dirname as dirname2, join as join3 } from "path";
|
|
630
633
|
function getCurrentPackageName() {
|
|
631
634
|
try {
|
|
632
|
-
const
|
|
633
|
-
const
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
635
|
+
const result = execSync("npm ls -g --depth=0 --json", { encoding: "utf-8" });
|
|
636
|
+
const data = JSON.parse(result);
|
|
637
|
+
if (data.dependencies?.["kartman-dev"]) {
|
|
638
|
+
return "kartman-dev";
|
|
639
|
+
}
|
|
640
|
+
if (data.dependencies?.["kartman"]) {
|
|
641
|
+
return "kartman";
|
|
642
|
+
}
|
|
643
|
+
try {
|
|
644
|
+
const whichResult = execSync("which kartman", { encoding: "utf-8" }).trim();
|
|
645
|
+
if (whichResult.includes("kartman-dev")) {
|
|
646
|
+
return "kartman-dev";
|
|
647
|
+
}
|
|
648
|
+
} catch {
|
|
649
|
+
}
|
|
650
|
+
console.warn("Could not determine package name, defaulting to kartman");
|
|
651
|
+
return "kartman";
|
|
637
652
|
} catch (error) {
|
|
638
653
|
console.warn("Could not determine package name, defaulting to kartman");
|
|
639
654
|
return "kartman";
|
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/config.ts","../src/factory.ts","../src/callback.ts","../src/commands/stop.ts","../src/commands/resume.ts","../src/commands/init.ts","../src/commands/update.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';\nimport { updateCommand } from './commands/update';\n\nconst program = new Command();\n\nprogram\n .name('kartman')\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);\nprogram.addCommand(updateCommand);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport { createAgent, type Platform } from '@/factory';\nimport { reportResult } from '@/callback';\nimport type { AgentRunResult } from '@/agent';\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 try {\n console.log(`[CLI.start] sessionId=${sessionId} | cwd=${workingDir}`);\n console.log(`[CLI.start] prompt=${prompt.substring(0, 300)}...`);\n\n const agent = createAgent(platform as Platform, sessionId);\n\n const result = await agent.run({\n prompt,\n cwd: workingDir,\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 reportResult(callbackUrl, sessionId, { sessionId: '', error: errorMessage } as AgentRunResult);\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\nexport class LinearAgent extends Agent {\n private linearClient: LinearClient;\n private linearSessionId: string;\n private lastThoughtTime = 0;\n private thoughtDebounceMs = 1000;\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, isSubagent: boolean): 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 await this.sendActivity(LinearActivityType.Thought, content, false);\n }\n\n /** Tools that should show immediately on use (not wait for result) */\n private static SHOW_ON_USE = new Set(['Task', 'Read', 'Grep', 'Glob', 'WebSearch', 'WebFetch']);\n\n protected async onToolUse(block: ToolUseBlock, isSubagent: boolean): Promise<void> {\n if (this.isCompleted) return;\n if (!LinearAgent.SHOW_ON_USE.has(block.name)) return;\n\n if (block.name === 'Task') {\n const subagentType = String((block.input as Record<string, unknown>).subagent_type ?? 'subagent');\n await this.sendActionActivity('Delegating', subagentType, undefined, false);\n return;\n }\n\n const { action, parameter } = this.formatToolAction(block);\n await this.sendActionActivity(action, parameter, undefined, isSubagent);\n }\n\n protected async onToolResult(block: ToolUseBlock, result: string, isSubagent: boolean): Promise<void> {\n if (this.isCompleted) return;\n // Skip tools already shown in onToolUse\n if (LinearAgent.SHOW_ON_USE.has(block.name)) return;\n\n const { action, parameter } = this.formatToolAction(block);\n const truncatedResult = result.length > 1000 ? result.substring(0, 1000) + '...' : result;\n await this.sendActionActivity(action, parameter, truncatedResult || undefined, isSubagent);\n }\n\n protected async onPlanUpdate(steps: PlanStep[], isSubagent: boolean): Promise<void> {\n if (steps.length === 0) return;\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\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 // Request feedback from user\n await this.requestFeedback();\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 requestFeedback(): Promise<void> {\n try {\n await this.linearClient.createAgentActivity({\n agentSessionId: this.linearSessionId,\n content: {\n type: LinearActivityType.Elicitation,\n body: 'How did I do on this task?',\n },\n signal: 'select' as any,\n signalMetadata: {\n options: [\n {\n label: '👍 Good',\n value: 'good',\n },\n {\n label: '👎 Needs improvement',\n value: 'needs_improvement',\n },\n ],\n },\n });\n } catch (error) {\n console.error('Failed to request feedback:', error);\n }\n }\n\n private async sendActionActivity(\n action: string,\n parameter: string,\n result: string | undefined,\n ephemeral: boolean\n ): Promise<void> {\n try {\n const content: Record<string, string> = {\n type: LinearActivityType.Action,\n action,\n parameter,\n };\n if (result) content.result = result;\n\n await this.linearClient.createAgentActivity({\n agentSessionId: this.linearSessionId,\n content,\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 as origQuery,\n type Query,\n type Options,\n type SDKAssistantMessage,\n type SDKUserMessage,\n type SDKResultMessage,\n type SDKSystemMessage,\n} from '@anthropic-ai/claude-agent-sdk';\nimport type { TextBlock, ToolUseBlock, ToolResultBlockParam } from '@anthropic-ai/sdk/resources/messages';\nimport { Laminar } from '@lmnr-ai/lmnr';\nimport { getPluginPath } from './config.js';\n\n// Initialize Laminar\nif (process.env.LMNR_PROJECT_API_KEY) {\n Laminar.initialize({\n projectApiKey: process.env.LMNR_PROJECT_API_KEY,\n });\n}\n\n// Wrap the query function with Laminar instrumentation\nconst query = process.env.LMNR_PROJECT_API_KEY\n ? Laminar.wrapClaudeAgentQuery(origQuery)\n : origQuery;\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 * 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 private pendingToolUses = new Map<string, { block: ToolUseBlock; isSubagent: boolean }>();\n\n constructor(externalSessionId: string) {\n this.externalSessionId = externalSessionId;\n }\n\n // ============================================\n // Interrupt mechanism (private)\n // ============================================\n\n private get interruptPath(): string {\n return path.join('/tmp', `agent-${this.externalSessionId}.interrupt`);\n }\n\n private get isInterrupted(): boolean {\n try {\n if (fs.existsSync(this.interruptPath)) {\n return fs.readFileSync(this.interruptPath, 'utf-8').trim() === 'true';\n }\n return false;\n } catch {\n return false;\n }\n }\n\n private requestInterrupt(): void {\n fs.writeFileSync(this.interruptPath, 'true', 'utf-8');\n }\n\n private clearInterrupt(): void {\n try {\n if (fs.existsSync(this.interruptPath)) {\n fs.unlinkSync(this.interruptPath);\n }\n } catch {\n // Ignore errors\n }\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, isSubagent: boolean): Promise<void> {\n // Override in subclasses\n }\n\n /**\n * Called when agent starts using a tool (before result is available)\n */\n protected async onToolUse(block: ToolUseBlock, isSubagent: boolean): Promise<void> {\n // Override in subclasses\n }\n\n /**\n * Called when a tool completes with its result\n */\n protected async onToolResult(block: ToolUseBlock, result: string, isSubagent: boolean): 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[], isSubagent: boolean): 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 this.clearInterrupt();\n\n try {\n await this.onStart();\n\n // Set env vars before spawning (SDK env option replaces process env)\n process.env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS = '1';\n\n // Build SDK options\n const sdkOptions: Options = {\n settingSources: ['project'],\n permissionMode: 'bypassPermissions',\n allowDangerouslySkipPermissions: true,\n plugins: [{ type: 'local', path: getPluginPath(cwd) }],\n\t systemPrompt: {\n\t\t\t\t\tpreset: 'claude_code',\n\t\t type: 'preset',\n\t },\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 console.log(`[Agent.run] resume=${resumeSession} | sdkResume=${sdkOptions.resume ?? 'none'} | pluginPath=${getPluginPath(cwd)}`);\n console.log(`[Agent.run] prompt=${prompt.substring(0, 300)}...`);\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 (this.isInterrupted) {\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 console.log(`[Agent.run] SDK session initialized: ${sysMsg.session_id}`);\n }\n }\n\n // Process assistant messages (buffers tool uses)\n if (message.type === 'assistant') {\n await this.processAssistantMessage(message as SDKAssistantMessage);\n }\n\n // Process user messages (contains tool results)\n if (message.type === 'user') {\n await this.processUserMessage(message as SDKUserMessage);\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 this.clearInterrupt();\n }\n }\n\n /**\n * Stop the agent session\n * Sets interrupt flag and calls onStop callback\n */\n public async stop(): Promise<void> {\n this.requestInterrupt();\n await this.onStop();\n }\n\n /**\n * Process an assistant message: emit thinking, buffer tool uses for later matching\n */\n private async processAssistantMessage(message: SDKAssistantMessage): Promise<void> {\n const content = message.message.content;\n const isSubagent = message.parent_tool_use_id !== null;\n\n for (const block of content) {\n if (block.type === 'text') {\n await this.onThinking(block, isSubagent);\n }\n\n if (block.type === 'tool_use') {\n if (block.name === 'TodoWrite') {\n const input = block.input as { todos?: PlanStep[] };\n if (input.todos) {\n await this.onPlanUpdate(input.todos, isSubagent);\n }\n } else {\n await this.onToolUse(block, isSubagent);\n // Buffer tool use — result arrives in the next user message\n this.pendingToolUses.set(block.id, { block, isSubagent });\n }\n }\n }\n }\n\n /**\n * Process a user message: match tool results to buffered tool uses\n */\n private async processUserMessage(message: SDKUserMessage): Promise<void> {\n const content = message.message.content;\n if (typeof content === 'string') return;\n\n for (const block of content) {\n if (block.type !== 'tool_result') continue;\n\n const resultBlock = block as ToolResultBlockParam;\n const pending = this.pendingToolUses.get(resultBlock.tool_use_id);\n if (!pending) continue;\n\n this.pendingToolUses.delete(resultBlock.tool_use_id);\n\n // Extract result text\n let result = '';\n if (typeof resultBlock.content === 'string') {\n result = resultBlock.content;\n } else if (Array.isArray(resultBlock.content)) {\n result = resultBlock.content\n .filter((b): b is { type: 'text'; text: string } => b.type === 'text')\n .map(b => b.text)\n .join('\\n');\n }\n\n await this.onToolResult(pending.block, result, pending.isSubagent);\n }\n }\n}\n\nexport { TextBlock, ToolUseBlock }\n","import { appendFileSync, cpSync, existsSync, mkdirSync, readFileSync, renameSync } from 'fs';\nimport { dirname, resolve, join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst PLUGIN_DIRNAME = 'agent-plugin';\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 plugin path relative to a working directory\n */\nexport function getPluginPath(cwd: string = process.cwd()): string {\n return join(cwd, PLUGIN_DIRNAME);\n}\n\n/**\n * Install the bundled kartman plugin to <cwd>/agent-plugin/.\n *\n * The bundled files use underscores instead of dots (npm strips dotfiles).\n * This function copies them and renames back:\n * _claude-plugin/ → .claude-plugin/\n * _mcp.json → .mcp.json\n */\nexport function installClaudeConfig(cwd: string = process.cwd()): void {\n const bundledPath = getBundledConfigPath();\n\n if (!existsSync(bundledPath)) {\n console.warn('Warning: Bundled claude-config not found. Skipping plugin installation.');\n return;\n }\n\n const pluginDir = getPluginPath(cwd);\n\n // Copy entire bundled directory\n mkdirSync(pluginDir, { recursive: true });\n cpSync(bundledPath, pluginDir, { recursive: true, force: true });\n\n // Restore dotfiles: _claude-plugin → .claude-plugin\n const underscorePlugin = join(pluginDir, '_claude-plugin');\n const dotPlugin = join(pluginDir, '.claude-plugin');\n if (existsSync(underscorePlugin)) {\n renameSync(underscorePlugin, dotPlugin);\n }\n\n // Restore dotfiles: _mcp.json → .mcp.json\n const underscoreMcp = join(pluginDir, '_mcp.json');\n const dotMcp = join(pluginDir, '.mcp.json');\n if (existsSync(underscoreMcp)) {\n renameSync(underscoreMcp, dotMcp);\n }\n\n // Ensure agent-plugin/ is gitignored so the agent doesn't commit it\n const gitignorePath = join(cwd, '.gitignore');\n if (existsSync(gitignorePath)) {\n const content = readFileSync(gitignorePath, 'utf-8');\n if (!content.includes(PLUGIN_DIRNAME)) {\n appendFileSync(gitignorePath, `\\n# Kartman agent plugin (installed at runtime)\\n${PLUGIN_DIRNAME}/\\n`);\n }\n }\n\n console.log(`Installed agent plugin to ${pluginDir}`);\n}\n","import { Agent } from './agent';\nimport {createLinearAgent, LinearAgent} from './linear/agent';\n\n/**\n * Supported platforms\n */\nexport enum Platform {\n Linear = 'linear',\n}\n\n/**\n * Create an agent for the specified platform\n */\nexport function createAgent(platform: Platform, sessionId: string): Agent {\n switch (platform) {\n case Platform.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\nimport type { AgentRunResult } from '@/agent';\nimport { Laminar } from '@lmnr-ai/lmnr';\n\nexport enum SessionState {\n Running = 'running',\n Completed = 'completed',\n Error = 'error',\n}\n\nexport interface SessionUpdate {\n externalSessionId: string;\n claudeSessionId?: string;\n state: SessionState;\n error?: string;\n traceId?: 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 reportResult(\n callbackUrl: string | undefined,\n externalSessionId: string,\n result: AgentRunResult\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 sendSessionUpdate(callbackUrl, callbackSecret, {\n externalSessionId,\n claudeSessionId: result.sessionId,\n state: SessionState.Running,\n });\n }\n\n // Get Laminar trace ID if available\n let traceId: string | undefined;\n if (process.env.LMNR_PROJECT_API_KEY) {\n try {\n traceId = Laminar.getCurrentTraceId() ?? undefined;\n } catch (error) {\n console.error('[callback] Failed to get Laminar trace ID:', error);\n }\n }\n\n // Report final status (include traceId if available)\n if (result.error) {\n await sendSessionUpdate(callbackUrl, callbackSecret, {\n externalSessionId,\n state: SessionState.Error,\n error: result.error,\n traceId,\n });\n } else if (!result.interrupted) {\n await sendSessionUpdate(callbackUrl, callbackSecret, {\n externalSessionId,\n claudeSessionId: result.sessionId,\n state: SessionState.Completed,\n traceId,\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 { reportResult } from '@/callback';\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 const agent = createAgent(platform as Platform, sessionId);\n\n try {\n console.log(`[CLI.resume] sessionId=${sessionId} | claudeSessionId=${claudeSessionId} | cwd=${workingDir}`);\n\n const result = await agent.run({\n prompt,\n sessionId: claudeSessionId,\n resumeSession: true,\n forkSession: false,\n cwd: workingDir,\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 agent plugin (MCP servers, skills)')\n .action(() => {\n installClaudeConfig();\n });","import { Command } from 'commander';\nimport { execSync, execFileSync } from 'child_process';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\n\n/**\n * Get the current package name (kartman or kartman-dev)\n * Reads from package.json to determine which package is installed\n */\nfunction getCurrentPackageName(): string {\n try {\n // Get the directory of the current module\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n // Navigate up to find package.json (dist/commands/update.js -> package.json)\n const packageJsonPath = join(__dirname, '../../package.json');\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\n return packageJson.name;\n } catch (error) {\n // Fallback to kartman if we can't read package.json\n console.warn('Could not determine package name, defaulting to kartman');\n return 'kartman';\n }\n}\n\n/**\n * Build the pnpm install arguments for updating the CLI\n *\n * @param cliPackage - Package name (kartman or kartman-dev)\n * @param cliVersion - Optional version to install\n * @returns Array of pnpm arguments [cmd, ...args]\n */\nfunction buildInstallArgs(\n cliPackage: string,\n cliVersion?: string\n): string[] {\n // Validate package name to prevent command injection\n if (!['kartman', 'kartman-dev'].includes(cliPackage)) {\n throw new Error(`Invalid package name: ${cliPackage}. Must be 'kartman' or 'kartman-dev'`);\n }\n\n // Validate version format if provided\n if (cliVersion && !/^[\\w.-]+$/.test(cliVersion)) {\n throw new Error(`Invalid version format: ${cliVersion}`);\n }\n\n if (!cliVersion) {\n // No version specified - always get latest\n // This is important because kartman-dev has different versions than kartman\n return ['pnpm', 'add', '-g', `${cliPackage}@latest`];\n }\n\n // Check if version looks like a full version or just a suffix\n if (cliVersion.match(/^\\d+\\.\\d+\\.\\d+/)) {\n // Full version (e.g., \"0.2.11\")\n return ['pnpm', 'add', '-g', `${cliPackage}@${cliVersion}`];\n }\n\n // Version suffix for dev packages (e.g., \"KAR-14\")\n if (cliPackage === 'kartman-dev') {\n try {\n const currentVersion = execSync('kartman --version', { encoding: 'utf-8' }).trim();\n const baseVersion = currentVersion.replace(/-dev\\..+$/, '');\n return ['pnpm', 'add', '-g', `${cliPackage}@${baseVersion}-dev.${cliVersion}`];\n } catch {\n // If we can't get current version, just use latest\n return ['pnpm', 'add', '-g', `${cliPackage}@latest`];\n }\n }\n\n // For kartman with non-standard version suffix\n return ['pnpm', 'add', '-g', `${cliPackage}@${cliVersion}`];\n}\n\nexport const updateCommand = new Command()\n .name('update')\n .description('Update kartman CLI to the latest version')\n .option('--version <version>', 'Specific version to install (e.g., \"KAR-14\" for kartman-dev@0.2.10-dev.KAR-14)')\n .action(async (options) => {\n const { version } = options;\n\n // Auto-detect the current package name (kartman or kartman-dev)\n const packageName = getCurrentPackageName();\n\n try {\n const installArgs = buildInstallArgs(packageName, version);\n\n console.log(`Updating CLI: ${installArgs.join(' ')}`);\n\n // Use execFileSync to avoid shell interpretation and command injection\n const [cmd, ...args] = installArgs;\n if (!cmd) {\n throw new Error('Invalid install command');\n }\n execFileSync(cmd, args, {\n stdio: 'inherit',\n encoding: 'utf-8'\n });\n\n // Show new version\n const newVersion = execSync('kartman --version', { encoding: 'utf-8' }).trim();\n console.log(`Current version: ${newVersion}`);\n console.log('✓ CLI updated successfully');\n\n } catch (error) {\n console.error('Failed to update CLI:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n"],"mappings":"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","names":["Command","Laminar","Laminar","Command","Command","Command","Command","Command","Command","Command","readFileSync","fileURLToPath","dirname","join","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/start.ts","../src/linear/agent.ts","../src/agent.ts","../src/config.ts","../src/factory.ts","../src/callback.ts","../src/commands/stop.ts","../src/commands/resume.ts","../src/commands/init.ts","../src/commands/update.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';\nimport { updateCommand } from './commands/update';\n\nconst program = new Command();\n\nprogram\n .name('kartman')\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);\nprogram.addCommand(updateCommand);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport { createAgent, type Platform } from '@/factory';\nimport { reportResult } from '@/callback';\nimport type { AgentRunResult } from '@/agent';\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 try {\n console.log(`[CLI.start] sessionId=${sessionId} | cwd=${workingDir}`);\n console.log(`[CLI.start] prompt=${prompt.substring(0, 300)}...`);\n\n const agent = createAgent(platform as Platform, sessionId);\n\n const result = await agent.run({\n prompt,\n cwd: workingDir,\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 reportResult(callbackUrl, sessionId, { sessionId: '', error: errorMessage } as AgentRunResult);\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\nexport class LinearAgent extends Agent {\n private linearClient: LinearClient;\n private linearSessionId: string;\n private lastThoughtTime = 0;\n private thoughtDebounceMs = 1000;\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, isSubagent: boolean): 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 await this.sendActivity(LinearActivityType.Thought, content, false);\n }\n\n /** Tools that should show immediately on use (not wait for result) */\n private static SHOW_ON_USE = new Set(['Task', 'Read', 'Grep', 'Glob', 'WebSearch', 'WebFetch']);\n\n protected async onToolUse(block: ToolUseBlock, isSubagent: boolean): Promise<void> {\n if (this.isCompleted) return;\n if (!LinearAgent.SHOW_ON_USE.has(block.name)) return;\n\n if (block.name === 'Task') {\n const subagentType = String((block.input as Record<string, unknown>).subagent_type ?? 'subagent');\n await this.sendActionActivity('Delegating', subagentType, undefined, false);\n return;\n }\n\n const { action, parameter } = this.formatToolAction(block);\n await this.sendActionActivity(action, parameter, undefined, isSubagent);\n }\n\n protected async onToolResult(block: ToolUseBlock, result: string, isSubagent: boolean): Promise<void> {\n if (this.isCompleted) return;\n // Skip tools already shown in onToolUse\n if (LinearAgent.SHOW_ON_USE.has(block.name)) return;\n\n const { action, parameter } = this.formatToolAction(block);\n const truncatedResult = result.length > 1000 ? result.substring(0, 1000) + '...' : result;\n await this.sendActionActivity(action, parameter, truncatedResult || undefined, isSubagent);\n }\n\n protected async onPlanUpdate(steps: PlanStep[], isSubagent: boolean): Promise<void> {\n if (steps.length === 0) return;\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\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 // Request feedback from user\n await this.requestFeedback();\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 requestFeedback(): Promise<void> {\n try {\n await this.linearClient.createAgentActivity({\n agentSessionId: this.linearSessionId,\n content: {\n type: LinearActivityType.Elicitation,\n body: 'How did I do on this task?',\n },\n signal: 'select' as any,\n signalMetadata: {\n options: [\n {\n label: '👍 Good',\n value: 'good',\n },\n {\n label: '👎 Needs improvement',\n value: 'needs_improvement',\n },\n ],\n },\n });\n } catch (error) {\n console.error('Failed to request feedback:', error);\n }\n }\n\n private async sendActionActivity(\n action: string,\n parameter: string,\n result: string | undefined,\n ephemeral: boolean\n ): Promise<void> {\n try {\n const content: Record<string, string> = {\n type: LinearActivityType.Action,\n action,\n parameter,\n };\n if (result) content.result = result;\n\n await this.linearClient.createAgentActivity({\n agentSessionId: this.linearSessionId,\n content,\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 as origQuery,\n type Query,\n type Options,\n type SDKAssistantMessage,\n type SDKUserMessage,\n type SDKResultMessage,\n type SDKSystemMessage,\n} from '@anthropic-ai/claude-agent-sdk';\nimport type { TextBlock, ToolUseBlock, ToolResultBlockParam } from '@anthropic-ai/sdk/resources/messages';\nimport { Laminar } from '@lmnr-ai/lmnr';\nimport { getPluginPath } from './config.js';\n\n// Initialize Laminar\nif (process.env.LMNR_PROJECT_API_KEY) {\n Laminar.initialize({\n projectApiKey: process.env.LMNR_PROJECT_API_KEY,\n });\n}\n\n// Wrap the query function with Laminar instrumentation\nconst query = process.env.LMNR_PROJECT_API_KEY\n ? Laminar.wrapClaudeAgentQuery(origQuery)\n : origQuery;\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 * 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 private pendingToolUses = new Map<string, { block: ToolUseBlock; isSubagent: boolean }>();\n\n constructor(externalSessionId: string) {\n this.externalSessionId = externalSessionId;\n }\n\n // ============================================\n // Interrupt mechanism (private)\n // ============================================\n\n private get interruptPath(): string {\n return path.join('/tmp', `agent-${this.externalSessionId}.interrupt`);\n }\n\n private get isInterrupted(): boolean {\n try {\n if (fs.existsSync(this.interruptPath)) {\n return fs.readFileSync(this.interruptPath, 'utf-8').trim() === 'true';\n }\n return false;\n } catch {\n return false;\n }\n }\n\n private requestInterrupt(): void {\n fs.writeFileSync(this.interruptPath, 'true', 'utf-8');\n }\n\n private clearInterrupt(): void {\n try {\n if (fs.existsSync(this.interruptPath)) {\n fs.unlinkSync(this.interruptPath);\n }\n } catch {\n // Ignore errors\n }\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, isSubagent: boolean): Promise<void> {\n // Override in subclasses\n }\n\n /**\n * Called when agent starts using a tool (before result is available)\n */\n protected async onToolUse(block: ToolUseBlock, isSubagent: boolean): Promise<void> {\n // Override in subclasses\n }\n\n /**\n * Called when a tool completes with its result\n */\n protected async onToolResult(block: ToolUseBlock, result: string, isSubagent: boolean): 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[], isSubagent: boolean): 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 this.clearInterrupt();\n\n try {\n await this.onStart();\n\n // Set env vars before spawning (SDK env option replaces process env)\n process.env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS = '1';\n\n // Build SDK options\n const sdkOptions: Options = {\n settingSources: ['project'],\n permissionMode: 'default',\n plugins: [{ type: 'local', path: getPluginPath(cwd) }],\n\t systemPrompt: {\n\t\t\t\t\tpreset: 'claude_code',\n\t\t type: 'preset',\n\t },\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 console.log(`[Agent.run] resume=${resumeSession} | sdkResume=${sdkOptions.resume ?? 'none'} | pluginPath=${getPluginPath(cwd)}`);\n console.log(`[Agent.run] prompt=${prompt.substring(0, 300)}...`);\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 (this.isInterrupted) {\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 console.log(`[Agent.run] SDK session initialized: ${sysMsg.session_id}`);\n }\n }\n\n // Process assistant messages (buffers tool uses)\n if (message.type === 'assistant') {\n await this.processAssistantMessage(message as SDKAssistantMessage);\n }\n\n // Process user messages (contains tool results)\n if (message.type === 'user') {\n await this.processUserMessage(message as SDKUserMessage);\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 this.clearInterrupt();\n\n // Flush Laminar traces before process exit\n if (process.env.LMNR_PROJECT_API_KEY) {\n try {\n await Laminar.flush();\n } catch (error) {\n console.error('[Agent] Failed to flush Laminar traces:', error);\n }\n }\n }\n }\n\n /**\n * Stop the agent session\n * Sets interrupt flag and calls onStop callback\n */\n public async stop(): Promise<void> {\n this.requestInterrupt();\n await this.onStop();\n }\n\n /**\n * Process an assistant message: emit thinking, buffer tool uses for later matching\n */\n private async processAssistantMessage(message: SDKAssistantMessage): Promise<void> {\n const content = message.message.content;\n const isSubagent = message.parent_tool_use_id !== null;\n\n for (const block of content) {\n if (block.type === 'text') {\n await this.onThinking(block, isSubagent);\n }\n\n if (block.type === 'tool_use') {\n if (block.name === 'TodoWrite') {\n const input = block.input as { todos?: PlanStep[] };\n if (input.todos) {\n await this.onPlanUpdate(input.todos, isSubagent);\n }\n } else {\n await this.onToolUse(block, isSubagent);\n // Buffer tool use — result arrives in the next user message\n this.pendingToolUses.set(block.id, { block, isSubagent });\n }\n }\n }\n }\n\n /**\n * Process a user message: match tool results to buffered tool uses\n */\n private async processUserMessage(message: SDKUserMessage): Promise<void> {\n const content = message.message.content;\n if (typeof content === 'string') return;\n\n for (const block of content) {\n if (block.type !== 'tool_result') continue;\n\n const resultBlock = block as ToolResultBlockParam;\n const pending = this.pendingToolUses.get(resultBlock.tool_use_id);\n if (!pending) continue;\n\n this.pendingToolUses.delete(resultBlock.tool_use_id);\n\n // Extract result text\n let result = '';\n if (typeof resultBlock.content === 'string') {\n result = resultBlock.content;\n } else if (Array.isArray(resultBlock.content)) {\n result = resultBlock.content\n .filter((b): b is { type: 'text'; text: string } => b.type === 'text')\n .map(b => b.text)\n .join('\\n');\n }\n\n await this.onToolResult(pending.block, result, pending.isSubagent);\n }\n }\n}\n\nexport { TextBlock, ToolUseBlock }\n","import { appendFileSync, cpSync, existsSync, mkdirSync, readFileSync, renameSync } from 'fs';\nimport { dirname, resolve, join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst PLUGIN_DIRNAME = 'agent-plugin';\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 plugin path relative to a working directory\n */\nexport function getPluginPath(cwd: string = process.cwd()): string {\n return join(cwd, PLUGIN_DIRNAME);\n}\n\n/**\n * Install the bundled kartman plugin to <cwd>/agent-plugin/.\n *\n * The bundled files use underscores instead of dots (npm strips dotfiles).\n * This function copies them and renames back:\n * _claude-plugin/ → .claude-plugin/\n * _mcp.json → .mcp.json\n */\nexport function installClaudeConfig(cwd: string = process.cwd()): void {\n const bundledPath = getBundledConfigPath();\n\n if (!existsSync(bundledPath)) {\n console.warn('Warning: Bundled claude-config not found. Skipping plugin installation.');\n return;\n }\n\n const pluginDir = getPluginPath(cwd);\n\n // Copy entire bundled directory\n mkdirSync(pluginDir, { recursive: true });\n cpSync(bundledPath, pluginDir, { recursive: true, force: true });\n\n // Restore dotfiles: _claude-plugin → .claude-plugin\n const underscorePlugin = join(pluginDir, '_claude-plugin');\n const dotPlugin = join(pluginDir, '.claude-plugin');\n if (existsSync(underscorePlugin)) {\n renameSync(underscorePlugin, dotPlugin);\n }\n\n // Restore dotfiles: _mcp.json → .mcp.json\n const underscoreMcp = join(pluginDir, '_mcp.json');\n const dotMcp = join(pluginDir, '.mcp.json');\n if (existsSync(underscoreMcp)) {\n renameSync(underscoreMcp, dotMcp);\n }\n\n // Ensure agent-plugin/ is gitignored so the agent doesn't commit it\n const gitignorePath = join(cwd, '.gitignore');\n if (existsSync(gitignorePath)) {\n const content = readFileSync(gitignorePath, 'utf-8');\n if (!content.includes(PLUGIN_DIRNAME)) {\n appendFileSync(gitignorePath, `\\n# Kartman agent plugin (installed at runtime)\\n${PLUGIN_DIRNAME}/\\n`);\n }\n }\n\n console.log(`Installed agent plugin to ${pluginDir}`);\n}\n","import { Agent } from './agent';\nimport {createLinearAgent, LinearAgent} from './linear/agent';\n\n/**\n * Supported platforms\n */\nexport enum Platform {\n Linear = 'linear',\n}\n\n/**\n * Create an agent for the specified platform\n */\nexport function createAgent(platform: Platform, sessionId: string): Agent {\n switch (platform) {\n case Platform.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\nimport type { AgentRunResult } from '@/agent';\nimport { Laminar } from '@lmnr-ai/lmnr';\n\nexport enum SessionState {\n Running = 'running',\n Completed = 'completed',\n Error = 'error',\n}\n\nexport interface SessionUpdate {\n externalSessionId: string;\n claudeSessionId?: string;\n state: SessionState;\n error?: string;\n traceId?: 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 reportResult(\n callbackUrl: string | undefined,\n externalSessionId: string,\n result: AgentRunResult\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 sendSessionUpdate(callbackUrl, callbackSecret, {\n externalSessionId,\n claudeSessionId: result.sessionId,\n state: SessionState.Running,\n });\n }\n\n // Get Laminar trace ID if available\n let traceId: string | undefined;\n if (process.env.LMNR_PROJECT_API_KEY) {\n try {\n traceId = Laminar.getCurrentTraceId() ?? undefined;\n } catch (error) {\n console.error('[callback] Failed to get Laminar trace ID:', error);\n }\n }\n\n // Report final status (include traceId if available)\n if (result.error) {\n await sendSessionUpdate(callbackUrl, callbackSecret, {\n externalSessionId,\n state: SessionState.Error,\n error: result.error,\n traceId,\n });\n } else if (!result.interrupted) {\n await sendSessionUpdate(callbackUrl, callbackSecret, {\n externalSessionId,\n claudeSessionId: result.sessionId,\n state: SessionState.Completed,\n traceId,\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 { reportResult } from '@/callback';\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 const agent = createAgent(platform as Platform, sessionId);\n\n try {\n console.log(`[CLI.resume] sessionId=${sessionId} | claudeSessionId=${claudeSessionId} | cwd=${workingDir}`);\n\n const result = await agent.run({\n prompt,\n sessionId: claudeSessionId,\n resumeSession: true,\n forkSession: false,\n cwd: workingDir,\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 agent plugin (MCP servers, skills)')\n .action(() => {\n installClaudeConfig();\n });","import { Command } from 'commander';\nimport { execSync, execFileSync } from 'child_process';\n\n/**\n * Get the current package name (kartman or kartman-dev)\n * Uses npm to determine which package provides the current binary\n */\nfunction getCurrentPackageName(): string {\n try {\n // Use npm to determine which package provides the current binary\n const result = execSync('npm ls -g --depth=0 --json', { encoding: 'utf-8' });\n const data = JSON.parse(result);\n\n // Check if kartman-dev is installed\n if (data.dependencies?.['kartman-dev']) {\n return 'kartman-dev';\n }\n\n // Check if kartman is installed\n if (data.dependencies?.['kartman']) {\n return 'kartman';\n }\n\n // Fallback: check which package provides the binary\n try {\n const whichResult = execSync('which kartman', { encoding: 'utf-8' }).trim();\n if (whichResult.includes('kartman-dev')) {\n return 'kartman-dev';\n }\n } catch {\n // which command failed, continue to fallback\n }\n\n // Final fallback to kartman\n console.warn('Could not determine package name, defaulting to kartman');\n return 'kartman';\n } catch (error) {\n console.warn('Could not determine package name, defaulting to kartman');\n return 'kartman';\n }\n}\n\n/**\n * Build the pnpm install arguments for updating the CLI\n *\n * @param cliPackage - Package name (kartman or kartman-dev)\n * @param cliVersion - Optional version to install\n * @returns Array of pnpm arguments [cmd, ...args]\n */\nfunction buildInstallArgs(\n cliPackage: string,\n cliVersion?: string\n): string[] {\n // Validate package name to prevent command injection\n if (!['kartman', 'kartman-dev'].includes(cliPackage)) {\n throw new Error(`Invalid package name: ${cliPackage}. Must be 'kartman' or 'kartman-dev'`);\n }\n\n // Validate version format if provided\n if (cliVersion && !/^[\\w.-]+$/.test(cliVersion)) {\n throw new Error(`Invalid version format: ${cliVersion}`);\n }\n\n if (!cliVersion) {\n // No version specified - always get latest\n // This is important because kartman-dev has different versions than kartman\n return ['pnpm', 'add', '-g', `${cliPackage}@latest`];\n }\n\n // Check if version looks like a full version or just a suffix\n if (cliVersion.match(/^\\d+\\.\\d+\\.\\d+/)) {\n // Full version (e.g., \"0.2.11\")\n return ['pnpm', 'add', '-g', `${cliPackage}@${cliVersion}`];\n }\n\n // Version suffix for dev packages (e.g., \"KAR-14\")\n if (cliPackage === 'kartman-dev') {\n try {\n const currentVersion = execSync('kartman --version', { encoding: 'utf-8' }).trim();\n const baseVersion = currentVersion.replace(/-dev\\..+$/, '');\n return ['pnpm', 'add', '-g', `${cliPackage}@${baseVersion}-dev.${cliVersion}`];\n } catch {\n // If we can't get current version, just use latest\n return ['pnpm', 'add', '-g', `${cliPackage}@latest`];\n }\n }\n\n // For kartman with non-standard version suffix\n return ['pnpm', 'add', '-g', `${cliPackage}@${cliVersion}`];\n}\n\nexport const updateCommand = new Command()\n .name('update')\n .description('Update kartman CLI to the latest version')\n .option('--version <version>', 'Specific version to install (e.g., \"KAR-14\" for kartman-dev@0.2.10-dev.KAR-14)')\n .action(async (options) => {\n const { version } = options;\n\n // Auto-detect the current package name (kartman or kartman-dev)\n const packageName = getCurrentPackageName();\n\n try {\n const installArgs = buildInstallArgs(packageName, version);\n\n console.log(`Updating CLI: ${installArgs.join(' ')}`);\n\n // Use execFileSync to avoid shell interpretation and command injection\n const [cmd, ...args] = installArgs;\n if (!cmd) {\n throw new Error('Invalid install command');\n }\n execFileSync(cmd, args, {\n stdio: 'inherit',\n encoding: 'utf-8'\n });\n\n // Show new version\n const newVersion = execSync('kartman --version', { encoding: 'utf-8' }).trim();\n console.log(`Current version: ${newVersion}`);\n console.log('✓ CLI updated successfully');\n\n } catch (error) {\n console.error('Failed to update CLI:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n"],"mappings":"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","names":["Command","Laminar","Laminar","Command","Command","Command","Command","Command","Command","Command","Command"]}
|