@oxgeneral/orch 0.3.2 → 0.3.3
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/App-NN7HR7UE.js +20 -0
- package/dist/chunk-3MQNQ7QW.js +2 -0
- package/dist/{chunk-2UC4SVJB.js → chunk-BGHCY7WY.js} +7 -3
- package/dist/chunk-BGHCY7WY.js.map +1 -0
- package/dist/chunk-IS3YBE2B.js +3 -0
- package/dist/chunk-KPCT44WU.js +2 -0
- package/dist/chunk-NLQAJ7TW.js +147 -0
- package/dist/chunk-NLQAJ7TW.js.map +1 -0
- package/dist/{chunk-ZA5Z33GO.js → chunk-OQKREZUF.js} +1 -1
- package/dist/chunk-QFKVCNKL.js +2 -0
- package/dist/{chunk-MGFMVPRD.js → chunk-S3QYSBW4.js} +11 -4
- package/dist/chunk-S3QYSBW4.js.map +1 -0
- package/dist/{chunk-QEEM67OA.js → chunk-UIJYU3J7.js} +3 -3
- package/dist/{chunk-QEEM67OA.js.map → chunk-UIJYU3J7.js.map} +1 -1
- package/dist/claude-GQZNDJ6L.js +2 -0
- package/dist/{claude-RIB3RQS5.js → claude-INM52PTH.js} +13 -7
- package/dist/claude-INM52PTH.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/{clipboard-service-PDTSZIR5.js → clipboard-service-MYLSWM5E.js} +1 -1
- package/dist/{codex-VBUSA2GJ.js → codex-QGH2GRV6.js} +17 -9
- package/dist/codex-QGH2GRV6.js.map +1 -0
- package/dist/codex-SJV7ZZBY.js +2 -0
- package/dist/container-NEKK5W2B.js +6 -0
- package/dist/cursor-4JQOCP5X.js +2 -0
- package/dist/{cursor-4QIOTDBW.js → cursor-KQJTQ73D.js} +11 -6
- package/dist/cursor-KQJTQ73D.js.map +1 -0
- package/dist/{doctor-KBK5JZBZ.js → doctor-UAII4VWN.js} +1 -1
- package/dist/index.d.ts +53 -41
- package/dist/index.js +13 -11
- package/dist/index.js.map +1 -1
- package/dist/{init-WRDFAFS2.js → init-2D4RAN7B.js} +1 -1
- package/dist/{logs-5QHJWMEG.js → logs-UXFXVYCP.js} +1 -1
- package/dist/orchestrator-KF4UY5GD.js +5 -0
- package/dist/{orchestrator-FGGXK3N3.js.map → orchestrator-KF4UY5GD.js.map} +1 -1
- package/dist/{orchestrator-R7IWZUT6.js → orchestrator-MFL3XK5L.js} +4 -4
- package/dist/shell-F42UUF3U.js +2 -0
- package/dist/{shell-IH2MMTVP.js → shell-UXJNTNBC.js} +7 -4
- package/dist/shell-UXJNTNBC.js.map +1 -0
- package/dist/{task-J6ZN7ALI.js → task-AP2TIOOF.js} +1 -1
- package/dist/{tui-LW7WIDE3.js → tui-PIQT4ZZ2.js} +1 -1
- package/dist/{workspace-manager-KOOYTO7E.js → workspace-manager-DYN3XJ7X.js} +1 -1
- package/dist/{workspace-manager-T6AXG7XL.js → workspace-manager-EVD67GCG.js} +4 -4
- package/dist/{workspace-manager-T6AXG7XL.js.map → workspace-manager-EVD67GCG.js.map} +1 -1
- package/package.json +1 -1
- package/readme.md +1 -1
- package/dist/App-YJM5QGP7.js +0 -19
- package/dist/chunk-2UC4SVJB.js.map +0 -1
- package/dist/chunk-GZ2Q56YZ.js +0 -2
- package/dist/chunk-IQXRQBUK.js +0 -83
- package/dist/chunk-IQXRQBUK.js.map +0 -1
- package/dist/chunk-L3FYR45M.js +0 -2
- package/dist/chunk-MGFMVPRD.js.map +0 -1
- package/dist/chunk-MNXU3KCD.js +0 -2
- package/dist/chunk-UW6GUUE6.js +0 -3
- package/dist/claude-E36EGXUV.js +0 -2
- package/dist/claude-RIB3RQS5.js.map +0 -1
- package/dist/codex-OTZKVESD.js +0 -2
- package/dist/codex-VBUSA2GJ.js.map +0 -1
- package/dist/container-OIXLFSX2.js +0 -6
- package/dist/cursor-3DJA6LWS.js +0 -2
- package/dist/cursor-4QIOTDBW.js.map +0 -1
- package/dist/orchestrator-FGGXK3N3.js +0 -5
- package/dist/shell-EOJBDWTH.js +0 -2
- package/dist/shell-IH2MMTVP.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/infrastructure/storage/fs-utils.ts","../src/infrastructure/storage/paths.ts"],"names":["path","lines"],"mappings":"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","file":"chunk-QEEM67OA.js","sourcesContent":["/**\n * Low-level filesystem utilities.\n *\n * All file persistence goes through these functions.\n * atomicWrite guarantees no partial reads via temp → rename.\n */\n\nimport { randomBytes } from 'node:crypto';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport yaml from 'js-yaml';\n\n/**\n * Write file atomically: write to temp file, then rename.\n * Prevents corrupted reads on concurrent access.\n */\nexport async function atomicWrite(filePath: string, content: string): Promise<void> {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n\n const tmpPath = path.join(dir, `.${path.basename(filePath)}.${randomBytes(4).toString('hex')}.tmp`);\n\n try {\n await fs.writeFile(tmpPath, content, 'utf-8');\n await fs.rename(tmpPath, filePath);\n } catch (err) {\n // Clean up temp file on failure\n await fs.unlink(tmpPath).catch(() => {});\n throw err;\n }\n}\n\n/**\n * Read and parse a YAML file. Returns null if file does not exist.\n */\nexport async function readYaml<T>(filePath: string): Promise<T | null> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n return yaml.load(content) as T;\n } catch (err) {\n if (isENOENT(err)) return null;\n throw err;\n }\n}\n\n/**\n * Write data as YAML atomically.\n */\nexport async function writeYaml<T>(filePath: string, data: T): Promise<void> {\n const content = yaml.dump(data, {\n indent: 2,\n lineWidth: 120,\n noRefs: true,\n sortKeys: false,\n });\n await atomicWrite(filePath, content);\n}\n\n/**\n * Read and parse a JSON file. Returns null if file does not exist.\n */\nexport async function readJson<T>(filePath: string): Promise<T | null> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch (err) {\n if (isENOENT(err)) return null;\n throw err;\n }\n}\n\n/**\n * Write data as JSON atomically.\n */\nexport async function writeJson<T>(filePath: string, data: T): Promise<void> {\n const content = JSON.stringify(data, null, 2) + '\\n';\n await atomicWrite(filePath, content);\n}\n\n/**\n * POSIX PIPE_BUF — writes up to this size are guaranteed atomic with O_APPEND.\n * 4096 on Linux/macOS. We leave some room for encoding overhead.\n */\nconst PIPE_BUF = 4096;\n\n/**\n * Append a JSON record to a .jsonl file (newline-delimited JSON).\n *\n * Uses a file handle opened with 'a' (O_APPEND) to ensure atomic writes.\n * On POSIX, O_APPEND guarantees that each write() call appends atomically\n * when the data fits within PIPE_BUF (typically 4096 bytes), preventing\n * interleaving from concurrent writers.\n *\n * If the serialized line exceeds PIPE_BUF, the record's `data` field is\n * truncated so the entire line fits within the atomic-write limit.\n * This prevents interleaving corruption from concurrent writers.\n */\nexport async function appendJsonl(filePath: string, record: unknown): Promise<void> {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n let line = JSON.stringify(record) + '\\n';\n\n // If the line exceeds PIPE_BUF, truncate the `data` field to fit\n const byteLen = Buffer.byteLength(line, 'utf-8');\n if (byteLen > PIPE_BUF && record !== null && typeof record === 'object') {\n const obj = record as Record<string, unknown>;\n if (typeof obj.data === 'string' && obj.data.length > 0) {\n // Measure overhead without data to know how much room data gets\n const shell = JSON.stringify({ ...obj, data: '' }) + '\\n';\n const overhead = Buffer.byteLength(shell, 'utf-8');\n const budget = PIPE_BUF - overhead - 3; // 3 bytes for the '…' suffix (UTF-8 ellipsis)\n if (budget > 0) {\n // Slice to budget chars — for ASCII (most event data) this equals bytes.\n // For multi-byte chars the result may be slightly over PIPE_BUF,\n // which is acceptable on local filesystems (ext4/APFS hold inode lock).\n const truncated = obj.data.slice(0, budget);\n line = JSON.stringify({ ...obj, data: truncated + '…' }) + '\\n';\n }\n }\n }\n\n const fd = await fs.open(filePath, 'a');\n try {\n await fd.write(line, null, 'utf-8');\n } finally {\n await fd.close();\n }\n}\n\n/** Max file size for full readJsonl (50 MB). Larger files use tail read. */\nconst MAX_JSONL_READ_SIZE = 50 * 1024 * 1024;\n\n/**\n * Read all records from a .jsonl file.\n * Falls back to reading only the last 200 records if the file exceeds MAX_JSONL_READ_SIZE.\n */\nexport async function readJsonl<T>(filePath: string): Promise<T[]> {\n try {\n const stat = await fs.stat(filePath);\n if (stat.size > MAX_JSONL_READ_SIZE) {\n process.stderr.write(\n `[readJsonl] file too large (${(stat.size / 1024 / 1024).toFixed(1)} MB), reading tail only: ${filePath}\\n`,\n );\n return readJsonlTail<T>(filePath, 200);\n }\n return readAndParseJsonl<T>(filePath);\n } catch (err) {\n if (isENOENT(err)) return [];\n throw err;\n }\n}\n\n/**\n * Read the last N records from a .jsonl file.\n *\n * Reads the file in reverse chunks to avoid loading multi-MB files into memory.\n * Falls back to full read for small files (< 32KB).\n */\nexport async function readJsonlTail<T>(filePath: string, count: number): Promise<T[]> {\n try {\n const stat = await fs.stat(filePath);\n // For small files, read directly and slice (avoid mutual recursion with readJsonl)\n if (stat.size < 32768) {\n return (await readAndParseJsonl<T>(filePath)).slice(-count);\n }\n\n // Read from end in chunks to find enough lines\n // Use larger chunks for bigger files (tool_result events can be 8KB+ per line)\n const fd = await fs.open(filePath, 'r');\n try {\n const chunkSize = Math.min(stat.size, stat.size > 1_048_576 ? 131072 : 65536);\n let position = Math.max(0, stat.size - chunkSize);\n let earliestReadPosition = position;\n let tail = '';\n\n // Read up to 4 chunks from the end\n for (let attempt = 0; attempt < 4 && position >= 0; attempt++) {\n earliestReadPosition = position;\n const readSize = Math.min(chunkSize, stat.size - position);\n const buf = Buffer.alloc(readSize);\n await fd.read(buf, 0, readSize, position);\n tail = buf.toString('utf-8') + tail;\n\n const lines = tail.split('\\n').filter((l) => l.trim().length > 0);\n if (lines.length >= count + 1) {\n // +1 because first line might be partial\n return parseJsonlLines<T>(lines.slice(-count));\n }\n if (position === 0) break;\n position = Math.max(0, position - chunkSize);\n }\n\n // Parse whatever we got\n const lines = tail.split('\\n').filter((l) => l.trim().length > 0);\n // Skip first line if we didn't read from start (could be partial)\n const safeLines = earliestReadPosition > 0 ? lines.slice(1) : lines;\n return parseJsonlLines<T>(safeLines.slice(-count));\n } finally {\n await fd.close();\n }\n } catch (err) {\n if (isENOENT(err)) return [];\n throw err;\n }\n}\n\n/** Read a file and parse all JSONL records. */\nasync function readAndParseJsonl<T>(filePath: string): Promise<T[]> {\n const content = await fs.readFile(filePath, 'utf-8');\n const lines = content.split('\\n').filter((l) => l.trim().length > 0);\n return parseJsonlLines<T>(lines);\n}\n\n/**\n * Parse JSONL lines with error tolerance — corrupt lines are logged and skipped.\n */\nfunction parseJsonlLines<T>(lines: string[]): T[] {\n const results: T[] = [];\n for (const raw of lines) {\n const line = raw.trim();\n if (!line) continue;\n try {\n results.push(JSON.parse(line) as T);\n } catch {\n process.stderr.write(`[readJsonl] skipping corrupt line: ${line.slice(0, 200)}\\n`);\n }\n }\n return results;\n}\n\n/**\n * Ensure a directory exists, creating it recursively if needed.\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.mkdir(dirPath, { recursive: true });\n}\n\n/**\n * Check if a path exists.\n */\nexport async function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * List files in a directory matching an optional extension filter.\n */\nexport async function listFiles(dirPath: string, ext?: string): Promise<string[]> {\n try {\n const entries = await fs.readdir(dirPath);\n if (ext) {\n return entries.filter((e) => e.endsWith(ext));\n }\n return entries;\n } catch (err) {\n if (isENOENT(err)) return [];\n throw err;\n }\n}\n\nfunction isENOENT(err: unknown): boolean {\n return err instanceof Error && 'code' in err && (err as NodeJS.ErrnoException).code === 'ENOENT';\n}\n","/**\n * Path resolution for .orchestry/ directory.\n *\n * All path construction goes through this module.\n * Validates initialization state and sanitizes identifiers.\n */\n\nimport path from 'node:path';\nimport { accessSync } from 'node:fs';\nimport { NotInitializedError } from '../../domain/errors.js';\nimport { pathExists } from './fs-utils.js';\n\nconst ORCHESTRY_DIR = '.orchestry';\nconst ID_PATTERN = /^[A-Za-z0-9._-]+$/;\n\nexport class Paths {\n constructor(private readonly projectRoot: string) {}\n\n /** Root .orchestry/ directory */\n get root(): string {\n return path.join(this.projectRoot, ORCHESTRY_DIR);\n }\n\n get configPath(): string {\n return path.join(this.root, 'config.yml');\n }\n\n get statePath(): string {\n return path.join(this.root, 'state.json');\n }\n\n get lockPath(): string {\n return path.join(this.root, 'orchestry.lock');\n }\n\n get tasksDir(): string {\n return path.join(this.root, 'tasks');\n }\n\n get agentsDir(): string {\n return path.join(this.root, 'agents');\n }\n\n get runsDir(): string {\n return path.join(this.root, 'runs');\n }\n\n get templatesDir(): string {\n return path.join(this.root, 'templates');\n }\n\n get logsDir(): string {\n return path.join(this.root, 'logs');\n }\n\n get contextDir(): string {\n return path.join(this.root, 'context');\n }\n\n contextPath(key: string): string {\n return path.join(this.contextDir, `${sanitizeId(key)}.json`);\n }\n\n get messagesDir(): string {\n return path.join(this.root, 'messages');\n }\n\n messagePath(id: string): string {\n return path.join(this.messagesDir, `${sanitizeId(id)}.json`);\n }\n\n get goalsDir(): string {\n return path.join(this.root, 'goals');\n }\n\n goalPath(id: string): string {\n return path.join(this.goalsDir, `${sanitizeId(id)}.yml`);\n }\n\n get teamsDir(): string {\n return path.join(this.root, 'teams');\n }\n\n get attachmentsDir(): string {\n return path.join(this.root, 'attachments');\n }\n\n taskAttachmentsDir(taskId: string): string {\n return path.join(this.attachmentsDir, sanitizeId(taskId));\n }\n\n teamPath(id: string): string {\n return path.join(this.teamsDir, `${sanitizeId(id)}.yml`);\n }\n\n get gitignorePath(): string {\n return path.join(this.root, '.gitignore');\n }\n\n get workspaceExcludePath(): string {\n return path.join(this.root, 'workspace-exclude');\n }\n\n taskPath(id: string): string {\n return path.join(this.tasksDir, `${sanitizeId(id)}.yml`);\n }\n\n agentPath(id: string): string {\n return path.join(this.agentsDir, `${sanitizeId(id)}.yml`);\n }\n\n runPath(id: string): string {\n return path.join(this.runsDir, `${sanitizeId(id)}.json`);\n }\n\n runEventsPath(id: string): string {\n return path.join(this.runsDir, `${sanitizeId(id)}.jsonl`);\n }\n\n defaultTemplatePath(): string {\n return path.join(this.templatesDir, 'default.md');\n }\n\n async isInitialized(): Promise<boolean> {\n return pathExists(this.root);\n }\n\n async requireInit(): Promise<void> {\n if (!(await this.isInitialized())) {\n throw new NotInitializedError();\n }\n }\n}\n\n/**\n * Validate an identifier for use in file paths.\n * Only allows [A-Za-z0-9._-] characters.\n * Rejects identifiers containing forbidden characters (path separators, etc.)\n * to prevent path traversal attacks.\n */\nexport function sanitizeId(id: string): string {\n if (!ID_PATTERN.test(id)) {\n throw new Error(`Invalid identifier: \"${id}\"`);\n }\n return id;\n}\n\n/**\n * Validate that a workspace path is within the project root.\n * Prevents path traversal attacks.\n */\nexport function validateWorkspacePath(workspacePath: string, projectRoot: string): void {\n const resolved = path.resolve(workspacePath);\n const root = path.resolve(projectRoot);\n\n if (!resolved.startsWith(root + path.sep) && resolved !== root) {\n throw new Error(`Workspace path \"${workspacePath}\" is outside project root`);\n }\n}\n\n/**\n * Resolve project root by walking up from cwd looking for .orchestry/.\n * Returns cwd if not found (for init command).\n */\nexport function findProjectRoot(startDir: string = process.cwd()): string {\n let dir = path.resolve(startDir);\n const root = path.parse(dir).root;\n\n while (dir !== root) {\n try {\n accessSync(path.join(dir, '.orchestry'));\n return dir;\n } catch {\n // Not found, go up\n }\n dir = path.dirname(dir);\n }\n\n // Not found — return original dir (for init command)\n return startDir;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/infrastructure/storage/fs-utils.ts","../src/infrastructure/storage/paths.ts"],"names":["path","lines"],"mappings":"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","file":"chunk-UIJYU3J7.js","sourcesContent":["/**\n * Low-level filesystem utilities.\n *\n * All file persistence goes through these functions.\n * atomicWrite guarantees no partial reads via temp → rename.\n */\n\nimport { randomBytes } from 'node:crypto';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport yaml from 'js-yaml';\n\n/**\n * Write file atomically: write to temp file, then rename.\n * Prevents corrupted reads on concurrent access.\n */\nexport async function atomicWrite(filePath: string, content: string): Promise<void> {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n\n const tmpPath = path.join(dir, `.${path.basename(filePath)}.${randomBytes(4).toString('hex')}.tmp`);\n\n try {\n await fs.writeFile(tmpPath, content, 'utf-8');\n await fs.rename(tmpPath, filePath);\n } catch (err) {\n // Clean up temp file on failure\n await fs.unlink(tmpPath).catch(() => {});\n throw err;\n }\n}\n\n/**\n * Read and parse a YAML file. Returns null if file does not exist.\n */\nexport async function readYaml<T>(filePath: string): Promise<T | null> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n return yaml.load(content) as T;\n } catch (err) {\n if (isENOENT(err)) return null;\n throw err;\n }\n}\n\n/**\n * Write data as YAML atomically.\n */\nexport async function writeYaml<T>(filePath: string, data: T): Promise<void> {\n const content = yaml.dump(data, {\n indent: 2,\n lineWidth: 120,\n noRefs: true,\n sortKeys: false,\n });\n await atomicWrite(filePath, content);\n}\n\n/**\n * Read and parse a JSON file. Returns null if file does not exist.\n */\nexport async function readJson<T>(filePath: string): Promise<T | null> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch (err) {\n if (isENOENT(err)) return null;\n throw err;\n }\n}\n\n/**\n * Write data as JSON atomically.\n */\nexport async function writeJson<T>(filePath: string, data: T): Promise<void> {\n const content = JSON.stringify(data, null, 2) + '\\n';\n await atomicWrite(filePath, content);\n}\n\n/**\n * POSIX PIPE_BUF — writes up to this size are guaranteed atomic with O_APPEND.\n * 4096 on Linux/macOS. We leave some room for encoding overhead.\n */\nconst PIPE_BUF = 4096;\n\n/**\n * Append a JSON record to a .jsonl file (newline-delimited JSON).\n *\n * Uses a file handle opened with 'a' (O_APPEND) to ensure atomic writes.\n * On POSIX, O_APPEND guarantees that each write() call appends atomically\n * when the data fits within PIPE_BUF (typically 4096 bytes), preventing\n * interleaving from concurrent writers.\n *\n * If the serialized line exceeds PIPE_BUF, the record's `data` field is\n * truncated so the entire line fits within the atomic-write limit.\n * This prevents interleaving corruption from concurrent writers.\n */\nexport async function appendJsonl(filePath: string, record: unknown): Promise<void> {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n let line = JSON.stringify(record) + '\\n';\n\n // If the line exceeds PIPE_BUF, truncate the `data` field to fit\n const byteLen = Buffer.byteLength(line, 'utf-8');\n if (byteLen > PIPE_BUF && record !== null && typeof record === 'object') {\n const obj = record as Record<string, unknown>;\n if (typeof obj.data === 'string' && obj.data.length > 0) {\n // Measure overhead without data to know how much room data gets\n const shell = JSON.stringify({ ...obj, data: '' }) + '\\n';\n const overhead = Buffer.byteLength(shell, 'utf-8');\n const budget = PIPE_BUF - overhead - 3; // 3 bytes for the '…' suffix (UTF-8 ellipsis)\n if (budget > 0) {\n // Slice to budget chars — for ASCII (most event data) this equals bytes.\n // For multi-byte chars the result may be slightly over PIPE_BUF,\n // which is acceptable on local filesystems (ext4/APFS hold inode lock).\n const truncated = obj.data.slice(0, budget);\n line = JSON.stringify({ ...obj, data: truncated + '…' }) + '\\n';\n }\n }\n }\n\n const fd = await fs.open(filePath, 'a');\n try {\n await fd.write(line, null, 'utf-8');\n } finally {\n await fd.close();\n }\n}\n\n/** Max file size for full readJsonl (50 MB). Larger files use tail read. */\nconst MAX_JSONL_READ_SIZE = 50 * 1024 * 1024;\n\n/**\n * Read all records from a .jsonl file.\n * Falls back to reading only the last 200 records if the file exceeds MAX_JSONL_READ_SIZE.\n */\nexport async function readJsonl<T>(filePath: string): Promise<T[]> {\n try {\n const stat = await fs.stat(filePath);\n if (stat.size > MAX_JSONL_READ_SIZE) {\n process.stderr.write(\n `[readJsonl] file too large (${(stat.size / 1024 / 1024).toFixed(1)} MB), reading tail only: ${filePath}\\n`,\n );\n return readJsonlTail<T>(filePath, 200);\n }\n return readAndParseJsonl<T>(filePath);\n } catch (err) {\n if (isENOENT(err)) return [];\n throw err;\n }\n}\n\n/**\n * Read the last N records from a .jsonl file.\n *\n * Reads the file in reverse chunks to avoid loading multi-MB files into memory.\n * Falls back to full read for small files (< 32KB).\n */\nexport async function readJsonlTail<T>(filePath: string, count: number): Promise<T[]> {\n try {\n const stat = await fs.stat(filePath);\n // For small files, read directly and slice (avoid mutual recursion with readJsonl)\n if (stat.size < 32768) {\n return (await readAndParseJsonl<T>(filePath)).slice(-count);\n }\n\n // Read from end in chunks to find enough lines\n // Use larger chunks for bigger files (tool_result events can be 8KB+ per line)\n const fd = await fs.open(filePath, 'r');\n try {\n const chunkSize = Math.min(stat.size, stat.size > 1_048_576 ? 131072 : 65536);\n let position = Math.max(0, stat.size - chunkSize);\n let earliestReadPosition = position;\n let tail = '';\n\n // Read up to 4 chunks from the end\n for (let attempt = 0; attempt < 4 && position >= 0; attempt++) {\n earliestReadPosition = position;\n const readSize = Math.min(chunkSize, stat.size - position);\n const buf = Buffer.alloc(readSize);\n await fd.read(buf, 0, readSize, position);\n tail = buf.toString('utf-8') + tail;\n\n const lines = tail.split('\\n').filter((l) => l.trim().length > 0);\n if (lines.length >= count + 1) {\n // +1 because first line might be partial\n return parseJsonlLines<T>(lines.slice(-count));\n }\n if (position === 0) break;\n position = Math.max(0, position - chunkSize);\n }\n\n // Parse whatever we got\n const lines = tail.split('\\n').filter((l) => l.trim().length > 0);\n // Skip first line if we didn't read from start (could be partial)\n const safeLines = earliestReadPosition > 0 ? lines.slice(1) : lines;\n return parseJsonlLines<T>(safeLines.slice(-count));\n } finally {\n await fd.close();\n }\n } catch (err) {\n if (isENOENT(err)) return [];\n throw err;\n }\n}\n\n/** Read a file and parse all JSONL records. */\nasync function readAndParseJsonl<T>(filePath: string): Promise<T[]> {\n const content = await fs.readFile(filePath, 'utf-8');\n const lines = content.split('\\n').filter((l) => l.trim().length > 0);\n return parseJsonlLines<T>(lines);\n}\n\n/**\n * Parse JSONL lines with error tolerance — corrupt lines are logged and skipped.\n */\nfunction parseJsonlLines<T>(lines: string[]): T[] {\n const results: T[] = [];\n for (const raw of lines) {\n const line = raw.trim();\n if (!line) continue;\n try {\n results.push(JSON.parse(line) as T);\n } catch {\n process.stderr.write(`[readJsonl] skipping corrupt line: ${line.slice(0, 200)}\\n`);\n }\n }\n return results;\n}\n\n/**\n * Ensure a directory exists, creating it recursively if needed.\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.mkdir(dirPath, { recursive: true });\n}\n\n/**\n * Check if a path exists.\n */\nexport async function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * List files in a directory matching an optional extension filter.\n */\nexport async function listFiles(dirPath: string, ext?: string): Promise<string[]> {\n try {\n const entries = await fs.readdir(dirPath);\n if (ext) {\n return entries.filter((e) => e.endsWith(ext));\n }\n return entries;\n } catch (err) {\n if (isENOENT(err)) return [];\n throw err;\n }\n}\n\nfunction isENOENT(err: unknown): boolean {\n return err instanceof Error && 'code' in err && (err as NodeJS.ErrnoException).code === 'ENOENT';\n}\n","/**\n * Path resolution for .orchestry/ directory.\n *\n * All path construction goes through this module.\n * Validates initialization state and sanitizes identifiers.\n */\n\nimport path from 'node:path';\nimport { accessSync } from 'node:fs';\nimport { NotInitializedError } from '../../domain/errors.js';\nimport { pathExists } from './fs-utils.js';\n\nconst ORCHESTRY_DIR = '.orchestry';\nconst ID_PATTERN = /^[A-Za-z0-9._-]+$/;\n\nexport class Paths {\n constructor(private readonly projectRoot: string) {}\n\n /** Root .orchestry/ directory */\n get root(): string {\n return path.join(this.projectRoot, ORCHESTRY_DIR);\n }\n\n get configPath(): string {\n return path.join(this.root, 'config.yml');\n }\n\n get statePath(): string {\n return path.join(this.root, 'state.json');\n }\n\n get lockPath(): string {\n return path.join(this.root, 'orchestry.lock');\n }\n\n get tasksDir(): string {\n return path.join(this.root, 'tasks');\n }\n\n get agentsDir(): string {\n return path.join(this.root, 'agents');\n }\n\n get runsDir(): string {\n return path.join(this.root, 'runs');\n }\n\n get templatesDir(): string {\n return path.join(this.root, 'templates');\n }\n\n get logsDir(): string {\n return path.join(this.root, 'logs');\n }\n\n get contextDir(): string {\n return path.join(this.root, 'context');\n }\n\n contextPath(key: string): string {\n return path.join(this.contextDir, `${sanitizeId(key)}.json`);\n }\n\n get messagesDir(): string {\n return path.join(this.root, 'messages');\n }\n\n messagePath(id: string): string {\n return path.join(this.messagesDir, `${sanitizeId(id)}.json`);\n }\n\n get goalsDir(): string {\n return path.join(this.root, 'goals');\n }\n\n goalPath(id: string): string {\n return path.join(this.goalsDir, `${sanitizeId(id)}.yml`);\n }\n\n get teamsDir(): string {\n return path.join(this.root, 'teams');\n }\n\n get attachmentsDir(): string {\n return path.join(this.root, 'attachments');\n }\n\n taskAttachmentsDir(taskId: string): string {\n return path.join(this.attachmentsDir, sanitizeId(taskId));\n }\n\n teamPath(id: string): string {\n return path.join(this.teamsDir, `${sanitizeId(id)}.yml`);\n }\n\n get gitignorePath(): string {\n return path.join(this.root, '.gitignore');\n }\n\n get workspaceExcludePath(): string {\n return path.join(this.root, 'workspace-exclude');\n }\n\n taskPath(id: string): string {\n return path.join(this.tasksDir, `${sanitizeId(id)}.yml`);\n }\n\n agentPath(id: string): string {\n return path.join(this.agentsDir, `${sanitizeId(id)}.yml`);\n }\n\n runPath(id: string): string {\n return path.join(this.runsDir, `${sanitizeId(id)}.json`);\n }\n\n runEventsPath(id: string): string {\n return path.join(this.runsDir, `${sanitizeId(id)}.jsonl`);\n }\n\n defaultTemplatePath(): string {\n return path.join(this.templatesDir, 'default.md');\n }\n\n async isInitialized(): Promise<boolean> {\n return pathExists(this.root);\n }\n\n async requireInit(): Promise<void> {\n if (!(await this.isInitialized())) {\n throw new NotInitializedError();\n }\n }\n}\n\n/**\n * Validate an identifier for use in file paths.\n * Only allows [A-Za-z0-9._-] characters.\n * Rejects identifiers containing forbidden characters (path separators, etc.)\n * to prevent path traversal attacks.\n */\nexport function sanitizeId(id: string): string {\n if (!ID_PATTERN.test(id)) {\n throw new Error(`Invalid identifier: \"${id}\"`);\n }\n return id;\n}\n\n/**\n * Validate that a workspace path is within the project root.\n * Prevents path traversal attacks.\n */\nexport function validateWorkspacePath(workspacePath: string, projectRoot: string): void {\n const resolved = path.resolve(workspacePath);\n const root = path.resolve(projectRoot);\n\n if (!resolved.startsWith(root + path.sep) && resolved !== root) {\n throw new Error(`Workspace path \"${workspacePath}\" is outside project root`);\n }\n}\n\n/**\n * Resolve project root by walking up from cwd looking for .orchestry/.\n * Returns cwd if not found (for init command).\n */\nexport function findProjectRoot(startDir: string = process.cwd()): string {\n let dir = path.resolve(startDir);\n const root = path.parse(dir).root;\n\n while (dir !== root) {\n try {\n accessSync(path.join(dir, '.orchestry'));\n return dir;\n } catch {\n // Not found, go up\n }\n dir = path.dirname(dir);\n }\n\n // Not found — return original dir (for init command)\n return startDir;\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { createStreamingEvents, extractTokens } from './chunk-
|
|
1
|
+
import { createStreamingEvents, extractTokens } from './chunk-S3QYSBW4.js';
|
|
2
2
|
import './chunk-XDVMX2FO.js';
|
|
3
|
+
import { classifyAdapterError } from './chunk-NLQAJ7TW.js';
|
|
3
4
|
import './chunk-O2MSGW3V.js';
|
|
4
5
|
import { execFile } from 'child_process';
|
|
5
6
|
import { promisify } from 'util';
|
|
@@ -14,10 +15,12 @@ var ClaudeAdapter = class {
|
|
|
14
15
|
try {
|
|
15
16
|
const { stdout } = await execFileAsync("claude", ["--version"]);
|
|
16
17
|
return { ok: true, version: stdout.trim() };
|
|
17
|
-
} catch {
|
|
18
|
+
} catch (err) {
|
|
19
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
18
20
|
return {
|
|
19
21
|
ok: false,
|
|
20
|
-
error: "Claude Code CLI not found. Install: npm i -g @anthropic-ai/claude-code"
|
|
22
|
+
error: "Claude Code CLI not found. Install: npm i -g @anthropic-ai/claude-code",
|
|
23
|
+
errorKind: classifyAdapterError(msg)
|
|
21
24
|
};
|
|
22
25
|
}
|
|
23
26
|
}
|
|
@@ -63,8 +66,11 @@ function parseClaudeEvent(line) {
|
|
|
63
66
|
return { type: "tool_call", timestamp, data: parsed };
|
|
64
67
|
case "tool_result":
|
|
65
68
|
return { type: "output", timestamp, data: parsed };
|
|
66
|
-
case "error":
|
|
67
|
-
|
|
69
|
+
case "error": {
|
|
70
|
+
const errData = parsed.error ?? parsed;
|
|
71
|
+
const errMsg = typeof errData === "string" ? errData : JSON.stringify(errData);
|
|
72
|
+
return { type: "error", timestamp, data: errData, errorKind: classifyAdapterError(errMsg) };
|
|
73
|
+
}
|
|
68
74
|
case "result": {
|
|
69
75
|
const tokens = extractTokens(parsed, { statsFallback: true });
|
|
70
76
|
return { type: "done", timestamp, data: parsed, tokens };
|
|
@@ -78,5 +84,5 @@ function parseClaudeEvent(line) {
|
|
|
78
84
|
}
|
|
79
85
|
|
|
80
86
|
export { ClaudeAdapter };
|
|
81
|
-
//# sourceMappingURL=claude-
|
|
82
|
-
//# sourceMappingURL=claude-
|
|
87
|
+
//# sourceMappingURL=claude-INM52PTH.js.map
|
|
88
|
+
//# sourceMappingURL=claude-INM52PTH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/infrastructure/adapters/claude.ts"],"names":[],"mappings":"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","file":"claude-INM52PTH.js","sourcesContent":["/**\n * Claude Code adapter.\n *\n * Spawns `claude --print --output-format stream-json` in headless mode.\n * Parses JSON-lines from stdout into AgentEvent stream.\n */\n\nimport type { IAgentAdapter, AdapterTestResult, ExecuteParams, AgentEvent, ExecuteHandle } from './interface.js';\nimport type { IProcessManager } from '../process/process-manager.js';\nimport { extractTokens, createStreamingEvents } from './utils.js';\nimport { classifyAdapterError, AdapterErrorKind } from '../../domain/errors.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport class ClaudeAdapter implements IAgentAdapter {\n readonly kind = 'claude';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n try {\n const { stdout } = await execFileAsync('claude', ['--version']);\n return { ok: true, version: stdout.trim() };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n ok: false,\n error: 'Claude Code CLI not found. Install: npm i -g @anthropic-ai/claude-code',\n errorKind: classifyAdapterError(msg),\n };\n }\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const args = [\n '--print',\n '--output-format', 'stream-json',\n '--max-turns', String(params.config.max_turns ?? 50),\n '--verbose',\n '--dangerously-skip-permissions', // Agents run autonomously; stdin is 'ignore' so prompts would hang\n ];\n\n if (params.config.model) {\n args.push('--model', params.config.model);\n }\n\n if (params.config.system_prompt) {\n args.push('--system-prompt', params.config.system_prompt);\n }\n\n args.push(params.prompt);\n\n const { process: proc, pid } = this.processManager.spawn('claude', args, {\n cwd: params.workspace,\n env: { ...process.env, ...params.env },\n signal: params.signal,\n });\n\n const events = createStreamingEvents(proc, parseClaudeEvent, 'Claude', params.signal);\n\n return { pid, events };\n }\n\n async stop(pid: number): Promise<void> {\n await this.processManager.killWithGrace(pid);\n }\n}\n\nfunction parseClaudeEvent(line: string): AgentEvent | null {\n if (!line.trim()) return null;\n\n try {\n const parsed: Record<string, unknown> = JSON.parse(line);\n const timestamp = new Date().toISOString();\n\n switch (parsed.type) {\n case 'assistant':\n return { type: 'output', timestamp, data: (parsed.message as unknown) ?? parsed };\n case 'tool_use':\n return { type: 'tool_call', timestamp, data: parsed };\n case 'tool_result':\n return { type: 'output', timestamp, data: parsed };\n case 'error': {\n const errData = (parsed.error as unknown) ?? parsed;\n const errMsg = typeof errData === 'string' ? errData : JSON.stringify(errData);\n return { type: 'error', timestamp, data: errData, errorKind: classifyAdapterError(errMsg) };\n }\n case 'result': {\n const tokens = extractTokens(parsed, { statsFallback: true });\n return { type: 'done', timestamp, data: parsed, tokens };\n }\n default:\n return { type: 'output', timestamp, data: parsed };\n }\n } catch {\n return { type: 'output', timestamp: new Date().toISOString(), data: line };\n }\n}\n"]}
|
package/dist/cli.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {a as a$1,b,i}from'./chunk-L26TK7Y5.js';import {o}from'./chunk-
|
|
2
|
+
import {a as a$1,b,i}from'./chunk-L26TK7Y5.js';import {o}from'./chunk-OQKREZUF.js';import {a as a$2,b as b$1}from'./chunk-3MQNQ7QW.js';import {Command}from'commander';function h(o$1){let t=o$1.noColor||"NO_COLOR"in process.env||false,e=o$1.ascii||process.env.TERM==="dumb"||false;return {projectRoot:o(),json:o$1.json??false,quiet:o$1.quiet??false,noColor:t,ascii:e}}var p={task:async(o,t)=>{(await import('./task-AP2TIOOF.js')).registerTaskCommand(o,t);},agent:async(o,t)=>{(await import('./agent-S4DKSX63.js')).registerAgentCommand(o,t);},status:async(o,t)=>{(await import('./status-DLBNWSWM.js')).registerStatusCommand(o,t);},logs:async(o,t)=>{(await import('./logs-UXFXVYCP.js')).registerLogsCommand(o,t);},config:async(o,t)=>{(await import('./config-CCSS2P7R.js')).registerConfigCommand(o,t);},context:async(o,t)=>{(await import('./context-GSMQHQES.js')).registerContextCommand(o,t);},msg:async(o,t)=>{(await import('./msg-4SCLBO4K.js')).registerMsgCommand(o,t);},goal:async(o,t)=>{(await import('./goal-RFKFPR7M.js')).registerGoalCommand(o,t);},team:async(o,t)=>{(await import('./team-MSIBKOQC.js')).registerTeamCommand(o,t);}},c={run:async(o,t)=>{(await import('./run-HSHRELOP.js')).registerRunCommand(o,t);},doctor:async(o,t)=>{(await import('./doctor-UAII4VWN.js')).registerDoctorCommand(o,t);},tui:async(o,t)=>{(await import('./tui-PIQT4ZZ2.js')).registerTuiCommand(o,t);}},a=new Command;a.name("orchestry").description("Agents Organizations \u2014 CLI orchestrator for AI agents").version("0.3.3").option("--json","Output as JSON").option("--quiet","Minimal output (IDs only)").option("--no-color","Disable colors").option("--ascii","ASCII-only output (no Unicode)").hook("preAction",async o=>{let t=o.opts();t.ascii&&a$1(true),t.color===false&&b(true);});var y=[["task","Manage tasks"],["agent","Manage agents"],["status","Show orchestrator status"],["logs","View run logs"],["config","Manage configuration"],["context","Shared context store for inter-agent data exchange"],["msg","Inter-agent messaging"],["goal","Manage goals"],["team","Manage teams"],["run","Run tasks"],["doctor","Check adapters and dependencies"],["tui","Launch TUI dashboard"],["init","Initialize project"],["update","Check for updates"]],j=new Set(y.map(([o])=>o));async function L(){a.parseOptions(process.argv);let o=a.opts(),t=h({json:o.json,quiet:o.quiet,noColor:o.color===false,ascii:o.ascii}),e=process.argv.slice(2).find(n=>!n.startsWith("-")),v=e!==void 0&&j.has(e);if((process.argv.includes("--help")||process.argv.includes("-h")||process.argv.includes("--version")||process.argv.includes("-V"))&&!v){for(let[n,i]of y)a.command(n).description(i);await a.parseAsync(process.argv);return}if(e==="init"){let{registerInitCommand:n}=await import('./init-2D4RAN7B.js');n(a);}else if(e==="update"){let{registerUpdateCommand:n}=await import('./update-PC2ENCKU.js');n(a);}let O=!e||e in c,{buildFullContainer:d,buildLightContainer:b}=await import('./container-NEKK5W2B.js');try{if(O){let n=await d(t),i=e?c[e]:void 0;i?await i(a,n):await Promise.all(Object.values(c).map(x=>x(a,n)));let s=e?p[e]:void 0;s&&await s(a,n);}else {let n=await b(t),i=p[e];i?await i(a,n):await Promise.all(Object.values(p).map(s=>s(a,n)));}}catch(n){if(n instanceof b$1){if(e==="doctor"){let{registerDoctorCommand:i}=await import('./doctor-UAII4VWN.js');i(a);}if(process.argv.length<=2){let{runInit:i}=await import('./init-2D4RAN7B.js');await i();let s=await d(t);await c.tui(a,s),await a.parseAsync([...process.argv,"tui"]);return}if(e==="init"||e==="doctor"||e==="update"){await a.parseAsync(process.argv);return}i(n.message,n.hint),process.exit(n.exitCode);}throw n}process.argv.length<=2&&process.argv.push("tui");let m,g=e==="tui"||e==="update",M=g?Promise.resolve(null):import('./update-check-HGMBDYHL.js').then(n=>(m=n,n.checkForUpdateSWR(a.version()??"0.0.0")));if(await a.parseAsync(process.argv),!g){let n=await M;n&&m&&m.printUpdateNotification(n);}}L().catch(o=>{o instanceof a$2&&(i(o.message,o.hint),process.exit(o.exitCode)),i(o instanceof Error?o.message:String(o)),process.env.ORCHESTRY_DEBUG&&console.error(o),process.exit(1);});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {a}from'./chunk-
|
|
2
|
+
import {a}from'./chunk-3MQNQ7QW.js';import {execFile,execFileSync}from'child_process';import {promisify}from'util';import {mkdtemp,readFile,unlink,rm}from'fs/promises';import {tmpdir}from'os';import {join}from'path';var i=promisify(execFile),r=3e3;function E(){let t=process.platform;if(t==="darwin")return true;if(t==="linux")try{return execFileSync("which",["xclip"],{timeout:r,stdio:"ignore"}),!0}catch{return false}return t==="win32"}async function w(){let t=process.platform;if(t==="darwin")return x();if(t==="linux")return b();if(t==="win32")return P();throw new a(`Unsupported platform for clipboard: ${t}`,1,"Supported: macOS, Linux, Windows")}async function G(){if(await w()!=="image")return null;let e=process.platform;return e==="darwin"?h():e==="linux"?C():e==="win32"?I():null}async function x(){try{let{stdout:t}=await i("osascript",["-e","clipboard info"],{timeout:r});return t.includes("\xABclass PNGf\xBB")||t.includes("\xABclass TIFF\xBB")?"image":t.includes("\xABclass ut16\xBB")||t.includes("\xABclass utf8\xBB")||t.trim().length>0?"text":"empty"}catch{return "empty"}}async function h(){let t=await mkdtemp(join(tmpdir(),"orch-clip-")),e=join(t,"clipboard.png");try{let o=`
|
|
3
3
|
set theFile to POSIX file "${e}"
|
|
4
4
|
try
|
|
5
5
|
set imgData to the clipboard as \xABclass PNGf\xBB
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { createStreamingEvents, extractTokens } from './chunk-
|
|
1
|
+
import { createStreamingEvents, extractTokens } from './chunk-S3QYSBW4.js';
|
|
2
2
|
import './chunk-XDVMX2FO.js';
|
|
3
|
+
import { classifyAdapterError } from './chunk-NLQAJ7TW.js';
|
|
3
4
|
import './chunk-O2MSGW3V.js';
|
|
4
5
|
import { execFile } from 'child_process';
|
|
5
6
|
import { promisify } from 'util';
|
|
@@ -14,10 +15,12 @@ var CodexAdapter = class {
|
|
|
14
15
|
try {
|
|
15
16
|
const { stdout } = await execFileAsync("codex", ["--version"]);
|
|
16
17
|
return { ok: true, version: stdout.trim() };
|
|
17
|
-
} catch {
|
|
18
|
+
} catch (err) {
|
|
19
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
18
20
|
return {
|
|
19
21
|
ok: false,
|
|
20
|
-
error: "Codex CLI not found. Install: npm i -g @openai/codex"
|
|
22
|
+
error: "Codex CLI not found. Install: npm i -g @openai/codex",
|
|
23
|
+
errorKind: classifyAdapterError(msg)
|
|
21
24
|
};
|
|
22
25
|
}
|
|
23
26
|
}
|
|
@@ -70,7 +73,8 @@ function parseCodexEvent(line) {
|
|
|
70
73
|
}
|
|
71
74
|
case "turn.failed": {
|
|
72
75
|
const tokens = extractTokens(parsed);
|
|
73
|
-
|
|
76
|
+
const failMsg = typeof parsed.error === "string" ? parsed.error : JSON.stringify(parsed);
|
|
77
|
+
return { type: "error", timestamp, data: parsed, tokens, errorKind: classifyAdapterError(failMsg) };
|
|
74
78
|
}
|
|
75
79
|
// Item events
|
|
76
80
|
case "item.started":
|
|
@@ -98,12 +102,16 @@ function parseCodexEvent(line) {
|
|
|
98
102
|
return { type: "output", timestamp, data: item };
|
|
99
103
|
}
|
|
100
104
|
if (itemType === "error") {
|
|
101
|
-
|
|
105
|
+
const itemErrMsg = typeof item.message === "string" ? item.message : JSON.stringify(item);
|
|
106
|
+
return { type: "error", timestamp, data: item, errorKind: classifyAdapterError(itemErrMsg) };
|
|
102
107
|
}
|
|
103
108
|
return { type: "output", timestamp, data: item };
|
|
104
109
|
}
|
|
105
|
-
case "error":
|
|
106
|
-
|
|
110
|
+
case "error": {
|
|
111
|
+
const errData = parsed.error ?? parsed;
|
|
112
|
+
const errMsg = typeof errData === "string" ? errData : JSON.stringify(errData);
|
|
113
|
+
return { type: "error", timestamp, data: errData, errorKind: classifyAdapterError(errMsg) };
|
|
114
|
+
}
|
|
107
115
|
default:
|
|
108
116
|
return { type: "output", timestamp, data: parsed };
|
|
109
117
|
}
|
|
@@ -113,5 +121,5 @@ function parseCodexEvent(line) {
|
|
|
113
121
|
}
|
|
114
122
|
|
|
115
123
|
export { CodexAdapter };
|
|
116
|
-
//# sourceMappingURL=codex-
|
|
117
|
-
//# sourceMappingURL=codex-
|
|
124
|
+
//# sourceMappingURL=codex-QGH2GRV6.js.map
|
|
125
|
+
//# sourceMappingURL=codex-QGH2GRV6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/infrastructure/adapters/codex.ts"],"names":[],"mappings":"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","file":"codex-QGH2GRV6.js","sourcesContent":["/**\n * Codex CLI adapter.\n *\n * Spawns `codex exec --json -` in headless mode.\n * Prompt is piped via stdin (avoids CLI arg length limits).\n * Parses JSONL events from stdout into AgentEvent stream.\n */\n\nimport type { IAgentAdapter, AdapterTestResult, ExecuteParams, AgentEvent, ExecuteHandle } from './interface.js';\nimport type { IProcessManager } from '../process/process-manager.js';\nimport { extractTokens, createStreamingEvents } from './utils.js';\nimport { classifyAdapterError, AdapterErrorKind } from '../../domain/errors.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport class CodexAdapter implements IAgentAdapter {\n readonly kind = 'codex';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n try {\n const { stdout } = await execFileAsync('codex', ['--version']);\n return { ok: true, version: stdout.trim() };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n ok: false,\n error: 'Codex CLI not found. Install: npm i -g @openai/codex',\n errorKind: classifyAdapterError(msg),\n };\n }\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const args = [\n 'exec',\n '--json',\n '--sandbox', 'danger-full-access', // autonomous agents can't respond to approval prompts\n ];\n\n if (params.config.model) {\n args.push('--model', params.config.model);\n }\n\n // Read prompt from stdin (avoids ARG_MAX limits on long prompts)\n args.push('-');\n\n const { process: proc, pid } = this.processManager.spawn('codex', args, {\n cwd: params.workspace,\n env: { ...process.env, ...params.env },\n signal: params.signal,\n stdio: ['pipe', 'pipe', 'pipe'], // stdin must be 'pipe' to send prompt\n });\n\n // Pipe prompt via stdin\n if (proc.stdin) {\n proc.stdin.write(params.prompt);\n proc.stdin.end();\n }\n\n const events = createStreamingEvents(proc, parseCodexEvent, 'Codex', params.signal);\n\n return { pid, events };\n }\n\n async stop(pid: number): Promise<void> {\n await this.processManager.killWithGrace(pid);\n }\n}\n\nfunction parseCodexEvent(line: string): AgentEvent | null {\n if (!line.trim()) return null;\n\n try {\n const parsed: Record<string, unknown> = JSON.parse(line);\n const timestamp = new Date().toISOString();\n\n const type = (parsed.type as string) ?? '';\n\n // Codex JSONL event types\n switch (type) {\n // Thread/session started\n case 'thread.started':\n return { type: 'output', timestamp, data: parsed };\n\n // Turn lifecycle\n case 'turn.started':\n return { type: 'output', timestamp, data: parsed };\n\n case 'turn.completed': {\n const tokens = extractTokens(parsed);\n return { type: 'done', timestamp, data: parsed, tokens };\n }\n\n case 'turn.failed': {\n const tokens = extractTokens(parsed);\n const failMsg = typeof parsed.error === 'string' ? parsed.error : JSON.stringify(parsed);\n return { type: 'error', timestamp, data: parsed, tokens, errorKind: classifyAdapterError(failMsg) };\n }\n\n // Item events\n case 'item.started':\n case 'item.completed': {\n const item = (parsed.item as Record<string, unknown>) ?? {};\n const itemType = (item.type as string) ?? '';\n\n if (itemType === 'agent_message') {\n return { type: 'output', timestamp, data: item };\n }\n if (itemType === 'reasoning') {\n return { type: 'output', timestamp, data: item };\n }\n if (itemType === 'command_execution') {\n return { type: 'command', timestamp, data: item };\n }\n if (itemType === 'file_change') {\n const changes = Array.isArray(item.changes) ? item.changes : [];\n const paths = (changes as Record<string, unknown>[])\n .map((c) => typeof c.path === 'string' ? c.path : '')\n .filter(Boolean);\n return { type: 'file_change', timestamp, data: { paths, raw: item } };\n }\n if (itemType === 'tool_use') {\n return { type: 'tool_call', timestamp, data: item };\n }\n if (itemType === 'tool_result') {\n return { type: 'output', timestamp, data: item };\n }\n if (itemType === 'error') {\n const itemErrMsg = typeof item.message === 'string' ? item.message : JSON.stringify(item);\n return { type: 'error', timestamp, data: item, errorKind: classifyAdapterError(itemErrMsg) };\n }\n return { type: 'output', timestamp, data: item };\n }\n\n case 'error': {\n const errData = (parsed.error as unknown) ?? parsed;\n const errMsg = typeof errData === 'string' ? errData : JSON.stringify(errData);\n return { type: 'error', timestamp, data: errData, errorKind: classifyAdapterError(errMsg) };\n }\n\n default:\n return { type: 'output', timestamp, data: parsed };\n }\n } catch {\n return { type: 'output', timestamp: new Date().toISOString(), data: line };\n }\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {b,a}from'./chunk-KPCT44WU.js';import'./chunk-6MJ7V6VY.js';import {m}from'./chunk-3MQNQ7QW.js';import {execFile}from'child_process';import {promisify}from'util';var y=promisify(execFile),u=class{constructor(e){this.processManager=e;}kind="codex";async test(){try{let{stdout:e}=await y("codex",["--version"]);return {ok:!0,version:e.trim()}}catch(e){let r=e instanceof Error?e.message:String(e);return {ok:false,error:"Codex CLI not found. Install: npm i -g @openai/codex",errorKind:m(r)}}}execute(e){let r=["exec","--json","--sandbox","danger-full-access"];e.config.model&&r.push("--model",e.config.model),r.push("-");let{process:s,pid:t}=this.processManager.spawn("codex",r,{cwd:e.workspace,env:{...process.env,...e.env},signal:e.signal,stdio:["pipe","pipe","pipe"]});s.stdin&&(s.stdin.write(e.prompt),s.stdin.end());let n=b(s,f,"Codex",e.signal);return {pid:t,events:n}}async stop(e){await this.processManager.killWithGrace(e);}};function f(a$1){if(!a$1.trim())return null;try{let e=JSON.parse(a$1),r=new Date().toISOString();switch(e.type??""){case "thread.started":return {type:"output",timestamp:r,data:e};case "turn.started":return {type:"output",timestamp:r,data:e};case "turn.completed":{let t=a(e);return {type:"done",timestamp:r,data:e,tokens:t}}case "turn.failed":{let t=a(e),n=typeof e.error=="string"?e.error:JSON.stringify(e);return {type:"error",timestamp:r,data:e,tokens:t,errorKind:m(n)}}case "item.started":case "item.completed":{let t=e.item??{},n=t.type??"";if(n==="agent_message")return {type:"output",timestamp:r,data:t};if(n==="reasoning")return {type:"output",timestamp:r,data:t};if(n==="command_execution")return {type:"command",timestamp:r,data:t};if(n==="file_change"){let g=(Array.isArray(t.changes)?t.changes:[]).map(p=>typeof p.path=="string"?p.path:"").filter(Boolean);return {type:"file_change",timestamp:r,data:{paths:g,raw:t}}}if(n==="tool_use")return {type:"tool_call",timestamp:r,data:t};if(n==="tool_result")return {type:"output",timestamp:r,data:t};if(n==="error"){let c=typeof t.message=="string"?t.message:JSON.stringify(t);return {type:"error",timestamp:r,data:t,errorKind:m(c)}}return {type:"output",timestamp:r,data:t}}case "error":{let t=e.error??e,n=typeof t=="string"?t:JSON.stringify(t);return {type:"error",timestamp:r,data:t,errorKind:m(n)}}default:return {type:"output",timestamp:r,data:e}}}catch{return {type:"output",timestamp:new Date().toISOString(),data:a$1}}}export{u as CodexAdapter};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {a as a$2}from'./chunk-PJ5DKXGR.js';import {b as b$2,c as c$2}from'./chunk-HXOMNULD.js';import {a as a$1,b as b$3}from'./chunk-LXNRCJ22.js';import {a}from'./chunk-CHRW4CLD.js';import {l,b as b$1,c,i as i$1,k as k$1,e,d,f as f$1,g as g$1,h,j as j$2}from'./chunk-OQKREZUF.js';import {c as c$1,k,j as j$1,g,f,i}from'./chunk-3MQNQ7QW.js';import Y,{mkdir}from'fs/promises';import {createReadStream}from'fs';import z from'path';import {homedir}from'os';import {nanoid}from'nanoid';var b=class{constructor(t){this.paths=t;}async list(t){await i$1(this.paths.tasksDir);let e=await k$1(this.paths.tasksDir,".yml");return (await Promise.all(e.map(r=>{let n=r.replace(".yml","");return b$1(this.paths.taskPath(n))}))).filter(r=>r!==null&&(!t?.status||r.status===t.status)&&(!t?.goalId||r.goalId===t.goalId)).sort((r,n)=>{let i=ct(r.status)-ct(n.status);if(i!==0)return i;let o=n.updated_at??"",l=r.updated_at??"";return o<l?-1:o>l?1:0})}async get(t){return b$1(this.paths.taskPath(t))}async save(t){await i$1(this.paths.tasksDir),await c(this.paths.taskPath(t.id),t);}async delete(t){try{await Y.unlink(this.paths.taskPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};function ct(m){return {in_progress:0,retrying:1,review:2,todo:3,done:4,failed:5,cancelled:6}[m]}var A=class{constructor(t){this.paths=t;}async list(){await i$1(this.paths.agentsDir);let t=await k$1(this.paths.agentsDir,".yml");return (await Promise.all(t.map(s=>{let a=s.replace(".yml","");return b$1(this.paths.agentPath(a))}))).filter(s=>s!==null)}async get(t){return b$1(this.paths.agentPath(t))}async getByName(t){return (await this.list()).find(s=>s.name===t)??null}async save(t){await i$1(this.paths.agentsDir),await c(this.paths.agentPath(t.id),t);}async delete(t){try{await Y.unlink(this.paths.agentPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};var E=class{constructor(t){this.paths=t;}async save(t){await i$1(this.paths.runsDir),await e(this.paths.runPath(t.id),t);}async get(t){return d(this.paths.runPath(t))}async listAll(){return this.listFiltered(()=>true)}async listForTask(t){return this.listFiltered(e=>e.task_id===t)}async listForAgent(t){return this.listFiltered(e=>e.agent_id===t)}async appendEvent(t,e){await i$1(this.paths.runsDir),await f$1(this.paths.runEventsPath(t),e);}async readEvents(t){return g$1(this.paths.runEventsPath(t))}async readEventsTail(t,e){return h(this.paths.runEventsPath(t),e)}async*streamEvents(t,e){let s=this.paths.runEventsPath(t),a=Date.now()+3e4;for(;!e?.aborted&&Date.now()<a&&!await j$2(s);)await new Promise(i=>setTimeout(i,100));if(e?.aborted||Date.now()>=a)return;let r=createReadStream(s),{readLines:n}=await import('./process-manager-33H27MQF.js');try{for await(let i of n(r)){if(e?.aborted)break;if(i.trim())try{yield JSON.parse(i);}catch{process.stderr.write(`[RunStore] skipping corrupt JSONL line: ${i.slice(0,200)}
|
|
3
|
+
`);}}}finally{r.destroy();}}async listFiltered(t){await i$1(this.paths.runsDir);let e=await k$1(this.paths.runsDir,".json"),s=64,a=[];for(let r=0;r<e.length;r+=s){let n=e.slice(r,r+s),i=await Promise.all(n.map(o=>{let l=o.endsWith(".json")?o.slice(0,-5):o;return d(this.paths.runPath(l))}));for(let o of i)o!==null&&t(o)&&a.push(o);}return a.sort((r,n)=>new Date(n.started_at).getTime()-new Date(r.started_at).getTime())}};var U={version:1,onboardingCompleted:false,running:{},claimed:new Set,retry_queue:[],stats:{total_runs:0,total_tasks_completed:0,total_tasks_failed:0,total_tokens:{input:0,output:0,total:0},total_runtime_ms:0}};var I=class{constructor(t){this.paths=t;}async read(){let t=await d(this.paths.statePath);if(!t)return structuredClone(U);let e=structuredClone(U);return {version:t.version??e.version,pid:t.pid,started_at:t.started_at,onboardingCompleted:typeof t.onboardingCompleted=="boolean"?t.onboardingCompleted:false,running:t.running&&typeof t.running=="object"?t.running:e.running,claimed:Array.isArray(t.claimed)?new Set(t.claimed):new Set(e.claimed),retry_queue:Array.isArray(t.retry_queue)?t.retry_queue:e.retry_queue,stats:{total_runs:t.stats?.total_runs??e.stats.total_runs,total_tasks_completed:t.stats?.total_tasks_completed??e.stats.total_tasks_completed,total_tasks_failed:t.stats?.total_tasks_failed??e.stats.total_tasks_failed,total_tokens:t.stats?.total_tokens??e.stats.total_tokens,total_runtime_ms:t.stats?.total_runtime_ms??e.stats.total_runtime_ms}}}async write(t){let e$1={...t,claimed:Array.from(t.claimed)};await e(this.paths.statePath,e$1);}};var x=class{constructor(t){this.paths=t;}async read(){let t=await b$1(this.paths.configPath);return lt(a$2,t??{})}async write(t){await c(this.paths.configPath,t);}async get(t){let e=await this.read();return Pt(e,t)}async set(t,e){let s=await this.read();Tt(s,t,e),await this.write(s);}};function Pt(m,t){let e=t.split("."),s=m;for(let a of e){if(s==null||typeof s!="object")return;s=s[a];}return s}function Tt(m,t,e){let s=t.split("."),a=m;for(let n=0;n<s.length-1;n++){let i=s[n];(typeof a[i]!="object"||a[i]===null)&&(a[i]={}),a=a[i];}let r=s[s.length-1];a[r]=e;}function lt(m,t){let e={...m};for(let s of Object.keys(t)){let a=t[s],r=e[s];a!=null&&typeof a=="object"&&!Array.isArray(a)&&typeof r=="object"&&r!==null&&!Array.isArray(r)?e[s]=lt(r,a):e[s]=a;}return e}var q={tui:{activity_filter:"all"}};var ut=z.join(homedir(),".orchestry"),gt=z.join(ut,"global.yml"),C=class{async read(){let t=await b$1(gt);return t?{tui:{activity_filter:t.tui?.activity_filter??q.tui.activity_filter}}:{...q}}async write(t){await mkdir(ut,{recursive:true}),await c(gt,t);}async set(t,e){let s=await this.read();s.tui[t]=e,await this.write(s);}};var j=class m{constructor(t){this.paths=t;}async get(t){let e=await d(this.paths.contextPath(t));return e?pt(e)?(await this.delete(t),null):e:null}static MAX_TTL_MS=720*60*60*1e3;async set(t,e$1,s){if(s!==void 0&&(!Number.isFinite(s)||s<=0||s>m.MAX_TTL_MS))throw new Error(`TTL must be a positive number up to ${m.MAX_TTL_MS}ms (30 days)`);await i$1(this.paths.contextDir);let a=new Date().toISOString(),r=await d(this.paths.contextPath(t)),n={key:t,value:e$1,created_at:r?.created_at??a,updated_at:a,ttl_ms:s,expires_at:s?new Date(Date.now()+s).toISOString():void 0};await e(this.paths.contextPath(t),n);}async delete(t){try{await Y.unlink(this.paths.contextPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}async list(){await i$1(this.paths.contextDir);let t=await k$1(this.paths.contextDir,".json"),e=await Promise.all(t.map(a=>{let r=a.replace(".json","");return d(this.paths.contextPath(r))})),s=[];for(let a of e)if(a){if(pt(a)){await this.delete(a.key);continue}s.push(a);}return s.sort((a,r)=>a.key.localeCompare(r.key))}async getAll(){let t=await this.list(),e={};for(let s of t)e[s.key]=s.value;return e}};function pt(m){return m.expires_at?new Date(m.expires_at).getTime()<Date.now():false}var R=class{constructor(t){this.paths=t;}async save(t){await i$1(this.paths.messagesDir),await e(this.paths.messagePath(t.id),t);}async get(t){return d(this.paths.messagePath(t))}async list(){let t=await k$1(this.paths.messagesDir,".json");return (await Promise.all(t.map(s=>d(this.paths.messagePath(s.replace(".json","")))))).filter(s=>s!==null).sort((s,a)=>s.created_at.localeCompare(a.created_at))}async listPending(t){let e=await this.list(),s=Date.now();return e.filter(a=>a.status!=="pending"||a.expires_at&&new Date(a.expires_at).getTime()<s?false:a.to_agent_id===t)}async markDelivered(t){let e$1=await this.get(t);e$1&&(e$1.status="delivered",e$1.delivered_at=new Date().toISOString(),await e(this.paths.messagePath(t),e$1));}async delete(t){try{await Y.unlink(this.paths.messagePath(t));}catch(e){if(e.code!=="ENOENT")throw e}}async purgeExpired(){let t=await this.list(),e=Date.now(),s=t.filter(a=>{let r=a.expires_at&&new Date(a.expires_at).getTime()<e,n=a.delivered_at&&e-new Date(a.delivered_at).getTime()>36e5;return r||n});return await Promise.all(s.map(a=>this.delete(a.id))),s.length}};var D=class{constructor(t){this.paths=t;}async list(t){let e=await k$1(this.paths.goalsDir,".yml");return (await Promise.all(e.map(r=>{let n=r.replace(".yml","");return b$1(this.paths.goalPath(n))}))).filter(r=>r!==null&&(!t?.status||r.status===t.status)).sort((r,n)=>{let i=c$2[r.status]-c$2[n.status];if(i!==0)return i;let o=n.updated_at??"",l=r.updated_at??"";return o<l?-1:o>l?1:0})}async get(t){return b$1(this.paths.goalPath(t))}async save(t){await c(this.paths.goalPath(t.id),t);}async delete(t){try{await Y.unlink(this.paths.goalPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};var O=class{constructor(t){this.paths=t;}async save(t){await i$1(this.paths.teamsDir),await c(this.paths.teamPath(t.id),t);}async get(t){return b$1(this.paths.teamPath(t))}async getByName(t){return (await this.list()).find(s=>s.name===t)??null}async list(){await i$1(this.paths.teamsDir);let t=await k$1(this.paths.teamsDir,".yml");return (await Promise.all(t.map(s=>b$1(this.paths.teamPath(s.replace(".yml","")))))).filter(s=>s!==null)}async delete(t){try{await Y.unlink(this.paths.teamPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};var M=class{handlers=new Map;wildcardHandlers=new Set;maxListeners=10;warnedTypes=new Set;setMaxListeners(t){this.maxListeners=t;}getMaxListeners(){return this.maxListeners}listenerCount(t){return this.handlers.get(t)?.size??0}on(t,e){this.handlers.has(t)||this.handlers.set(t,new Set);let s=this.handlers.get(t);return s.add(e),this.maxListeners>0&&s.size>this.maxListeners&&!this.warnedTypes.has(t)&&(this.warnedTypes.add(t),console.warn(`EventBus: possible memory leak detected. ${s.size} listeners added for "${t}". Use setMaxListeners() to increase limit if this is intentional.`)),()=>this.off(t,e)}once(t,e){let s=a=>{this.off(t,s),e(a);};return this.on(t,s)}off(t,e){this.handlers.get(t)?.delete(e);}emit(t){let e=this.handlers.get(t.type);e&&this.dispatchToSet(e,t,"handler"),this.dispatchToSet(this.wildcardHandlers,t,"wildcard handler");}dispatchToSet(t,e,s){for(let a of t)try{a(e);}catch(r){console.error(`EventBus ${s} error for "${e.type}":`,r);}}onAny(t){return this.wildcardHandlers.add(t),this.maxListeners>0&&this.wildcardHandlers.size>this.maxListeners&&!this.warnedTypes.has("*")&&(this.warnedTypes.add("*"),console.warn(`EventBus: possible memory leak detected. ${this.wildcardHandlers.size} wildcard listeners added. Use setMaxListeners() to increase limit if this is intentional.`)),()=>{this.wildcardHandlers.delete(t);}}clear(){this.handlers.clear(),this.wildcardHandlers.clear(),this.warnedTypes.clear();}};var G=class{constructor(t,e,s,a){this.taskStore=t;this.eventBus=e;this.config=s;this.paths=a;}async create(t){if(!t.title.trim())throw new c$1("Task title is required");let e=t.priority??this.config.defaults.task.priority;if(!Number.isInteger(e)||e<1||e>4)throw new c$1("Priority must be an integer between 1 and 4");if(t.depends_on?.length){let n=(await Promise.all(t.depends_on.map(async i=>({depId:i,exists:!!await this.taskStore.get(i)})))).filter(i=>!i.exists).map(i=>i.depId);if(n.length>0)throw new c$1(`Unknown depends_on task ID(s): ${n.join(", ")}`)}let s=new Date().toISOString(),a={id:`tsk_${nanoid(7)}`,title:t.title.trim(),description:t.description?.trim()??"",status:"todo",priority:e,assignee:t.assignee,labels:t.labels??[],depends_on:t.depends_on??[],created_at:s,updated_at:s,attempts:0,max_attempts:t.max_attempts??this.config.defaults.task.max_attempts,workspace_mode:t.workspace_mode,review_criteria:t.review_criteria,scope:t.scope,goalId:t.goalId};if(t.attachments?.length&&this.paths){let r=await this.copyAttachments(a.id,t.attachments);a.attachments=r;}return await this.taskStore.save(a),this.eventBus.emit({type:"task:created",task:a}),a}async list(t){return this.taskStore.list(t)}async get(t){let e=await this.taskStore.get(t);if(!e)throw new f(t);return e}async updateStatus(t,e){let s=await this.get(t),a=s.status;if(!a$1(a,e))throw new i(t,a,e);return s.status=e,s.updated_at=new Date().toISOString(),await this.taskStore.save(s),this.eventBus.emit({type:"task:status_changed",taskId:t,from:a,to:e}),s}async assign(t,e){let s=await this.get(t);return s.assignee=e,s.updated_at=new Date().toISOString(),await this.taskStore.save(s),this.eventBus.emit({type:"task:assigned",taskId:t,agentId:e}),s}async cancel(t){let e=await this.get(t);if(b$3(e.status))throw new i(t,e.status,"cancelled");return this.updateStatus(t,"cancelled")}async retry(t){let e=await this.get(t);if(e.status!=="failed"&&e.status!=="cancelled")throw new i(t,e.status,"todo");let s=e.status;return e.status="todo",e.attempts=0,e.updated_at=new Date().toISOString(),await this.taskStore.save(e),this.eventBus.emit({type:"task:status_changed",taskId:t,from:s,to:"todo"}),e}async reject(t,e){let s=await this.get(t);if(s.status!=="review")throw new i(t,s.status,"todo");let a=s.status;return s.status="todo",s.attempts=0,s.feedback=e,s.updated_at=new Date().toISOString(),await this.taskStore.save(s),this.eventBus.emit({type:"task:status_changed",taskId:t,from:a,to:"todo"}),s}async update(t,e){let s=await this.get(t);if(e.title!==void 0){if(!e.title.trim())throw new c$1("Task title cannot be empty");s.title=e.title.trim();}if(e.description!==void 0&&(s.description=e.description.trim()),e.priority!==void 0){if(!Number.isInteger(e.priority)||e.priority<1||e.priority>4)throw new c$1("Priority must be an integer between 1 and 4");s.priority=e.priority;}if(e.labels!==void 0&&(s.labels=e.labels),e.attachments?.length&&this.paths){let a=await this.copyAttachments(t,e.attachments);s.attachments=[...s.attachments??[],...a];}return s.updated_at=new Date().toISOString(),await this.taskStore.save(s),s}async delete(t){if((await this.get(t)).status==="in_progress")throw new c$1("Cannot delete a running task. Cancel it first.");if(await this.taskStore.delete(t),this.paths){let s=this.paths.taskAttachmentsDir(t);await Y.rm(s,{recursive:true,force:true});}}getAttachmentPath(t,e){if(!this.paths)throw new c$1("Paths not configured");return z.join(this.paths.taskAttachmentsDir(t),e)}async copyAttachments(t,e){if(!this.paths)return [];let s=this.paths.taskAttachmentsDir(t);return await i$1(s),await Promise.all(e.map(async r=>{try{await Y.access(r);}catch{throw new c$1(`Attachment file not found: ${r}`)}})),await Promise.all(e.map(async r=>{let n=z.basename(r);return await Y.copyFile(r,z.join(s,n)),n}))}async incrementAttempts(t){let e=await this.get(t);return e.attempts+=1,e.updated_at=new Date().toISOString(),await this.taskStore.save(e),e}};var B=class{constructor(t,e,s,a){this.agentStore=t;this.stateStore=e;this.eventBus=s;this.config=a;}async create(t){if(!t.name.trim())throw new c$1("Agent name is required");if(await this.agentStore.getByName(t.name))throw new c$1(`Agent "${t.name}" already exists`);let s={id:`agt_${nanoid(7)}`,name:t.name.trim(),adapter:t.adapter||this.config.defaults.agent.adapter,role:t.role,config:{command:t.command,model:t.model,approval_policy:t.approval_policy??this.config.defaults.agent.approval_policy,max_turns:t.max_turns??this.config.defaults.agent.max_turns,timeout_ms:t.timeout_ms??this.config.defaults.agent.timeout_ms,stall_timeout_ms:t.stall_timeout_ms??this.config.defaults.agent.stall_timeout_ms,env:t.env,system_prompt:t.system_prompt,workspace_mode:t.workspace_mode,skills:t.skills},status:"idle",stats:{tasks_completed:0,tasks_failed:0,total_runs:0,total_runtime_ms:0}};return await this.agentStore.save(s),s}async list(){return this.agentStore.list()}async get(t){let e=await this.agentStore.get(t);if(!e)throw new g(t);return e}async remove(t){let e=await this.get(t);if(e.status==="running"){let s=await this.stateStore.read();if(Object.values(s.running).some(r=>r.agent_id===t))throw new c$1("Cannot remove a running agent. Stop it first.");e.status="idle",await this.agentStore.save(e);}await this.agentStore.delete(t);}async update(t,e){let s=await this.get(t);if(e.name!==void 0){if(!e.name.trim())throw new c$1("Agent name cannot be empty");let a=await this.agentStore.getByName(e.name.trim());if(a&&a.id!==t)throw new c$1(`Agent "${e.name}" already exists`);s.name=e.name.trim();}return e.role!==void 0&&(s.role=e.role||void 0),e.model!==void 0&&(s.config.model=e.model||void 0),e.approval_policy!==void 0&&(s.config.approval_policy=e.approval_policy),await this.agentStore.save(s),s}async disable(t){return this.setStatus(t,"disabled")}async enable(t){return this.setStatus(t,"idle")}async setAutonomous(t,e){let s=await this.get(t);return s.autonomous=e,await this.agentStore.save(s),this.eventBus.emit({type:"agent:autonomous_toggled",agentId:t,autonomous:e}),s}async setStatus(t,e){let s=await this.get(t);return s.status=e,await this.agentStore.save(s),s}async updateStats(t,e){let s=await this.get(t);return Object.assign(s.stats,e),await this.agentStore.save(s),s}async findBestAgent(t){let e=await this.agentStore.list(),s=e.filter(n=>n.status==="idle");if(s.length===0)return null;if(t.assignee){let n=e.find(i=>i.id===t.assignee);return n&&n.status==="idle"?n:null}let a=t.labels?.length?t.labels.map(n=>n.toLowerCase()):void 0,r=s.map(n=>{let i=0;if(a&&n.config.skills?.length){let l=new Set(n.config.skills.map(g=>g.toLowerCase()));for(let g of a)l.has(g)&&(i+=50);}if(a&&n.role){let l=n.role.toLowerCase();a.some(g=>l.includes(g))&&(i+=30);}n.status==="idle"&&(i+=20);let o=n.stats.tasks_completed+n.stats.tasks_failed;return o>0&&(i+=Math.round(n.stats.tasks_completed/o*10)),{agent:n,score:i}});return r.sort((n,i)=>i.score-n.score),r[0]?.agent??null}};var L=class{constructor(t,e){this.runStore=t;this.eventBus=e;}async create(t){let e={id:`run_${nanoid(7)}`,task_id:t.taskId,agent_id:t.agentId,attempt:t.attempt,status:"preparing",started_at:new Date().toISOString(),workspace_path:t.workspacePath,prompt:t.prompt};return await this.runStore.save(e),e}async get(t){return this.runStore.get(t)}async start(t,e){let s=await this.runStore.get(t);if(!s)throw new Error(`Run not found: ${t}`);return s.status="running",s.pid=e,await this.runStore.save(s),this.eventBus.emit({type:"agent:started",agentId:s.agent_id,taskId:s.task_id,runId:t}),s}async finish(t,e,s,a){let r=await this.runStore.get(t);if(!r)throw new Error(`Run not found: ${t}`);return r.status=e,r.finished_at=new Date().toISOString(),r.tokens=s,r.error=a,await this.runStore.save(r),this.eventBus.emit({type:"agent:completed",runId:t,agentId:r.agent_id,success:e==="succeeded"}),r}async appendEvent(t,e){await this.runStore.appendEvent(t,e);}async listAll(){return this.runStore.listAll()}async listForTask(t){return this.runStore.listForTask(t)}async listForAgent(t){return this.runStore.listForAgent(t)}async readEvents(t){return this.runStore.readEvents(t)}async readEventsTail(t,e){return this.runStore.readEventsTail(t,e)}async getLastFailedRunContext(t,e=50){let a=(await this.runStore.listForTask(t)).filter(i=>i.status==="failed").sort((i,o)=>(o.finished_at??"").localeCompare(i.finished_at??""))[0];if(!a)return null;let r=a.error??"Unknown error",n="";try{n=(await this.runStore.readEventsTail(a.id,e*2)).filter(l=>l.type==="agent_output"||l.type==="error").map(l=>typeof l.data=="string"?l.data:JSON.stringify(l.data)).join(`
|
|
4
|
+
`).split(`
|
|
5
|
+
`).slice(-e).join(`
|
|
6
|
+
`);}catch{}return {error:r,output:n}}};var F=class{constructor(t,e,s,a){this.messageStore=t;this.agentStore=e;this.teamStore=s;this.eventBus=a;}async send(t){if(!t.body.trim())throw new c$1("Message body is required");let e=t.ttl_ms??864e5;if(e<=0||e>6048e5)throw new c$1(`TTL must be between 1ms and ${6048e5}ms`);if(!await this.agentStore.get(t.from_agent_id)&&t.from_agent_id!=="cli")throw new c$1(`Sender agent not found: ${t.from_agent_id}`);let a=new Date,r={channel:t.channel,from_agent_id:t.from_agent_id,subject:(t.subject||"(no subject)").slice(0,200),body:t.body.slice(0,4e3),created_at:a.toISOString(),expires_at:new Date(a.getTime()+e).toISOString(),status:"pending",team_id:t.team_id,reply_to:t.reply_to},n=[];if(t.channel==="broadcast"){let i=await this.agentStore.list();if(t.team_id){let g=await this.teamStore.get(t.team_id);if(g){let v=new Set(g.members.map(p=>p.agent_id));i=i.filter(p=>v.has(p.id));}}let l=i.filter(g=>g.id!==t.from_agent_id&&g.status!=="disabled").map(g=>({...r,id:`msg_${nanoid(7)}`,to_agent_id:g.id}));await Promise.all(l.map(g=>this.messageStore.save(g)));for(let g of l)n.push(g),this.emitSent(g);}else if(t.channel==="lead"){if(!t.team_id)throw new c$1("team_id is required for lead channel");let i=await this.teamStore.get(t.team_id);if(!i)throw new c$1(`Team not found: ${t.team_id}`);let o={...r,id:`msg_${nanoid(7)}`,to_agent_id:i.lead_agent_id};await this.messageStore.save(o),n.push(o),this.emitSent(o);}else {if(!t.to_agent_id)throw new c$1("to_agent_id is required for direct messages");if(!await this.agentStore.get(t.to_agent_id))throw new c$1(`Recipient agent not found: ${t.to_agent_id}`);let o={...r,id:`msg_${nanoid(7)}`,to_agent_id:t.to_agent_id};await this.messageStore.save(o),n.push(o),this.emitSent(o);}return n}async drainMailbox(t,e){let s=await this.messageStore.listPending(t);await Promise.all(s.map(a=>this.messageStore.markDelivered(a.id)));for(let a of s)this.eventBus.emit({type:"message:delivered",messageId:a.id,toAgentId:t,taskId:e});return s}async listAll(){return this.messageStore.list()}async listPendingForAgent(t){return this.messageStore.listPending(t)}async listForAgent(t){return (await this.messageStore.list()).filter(s=>s.to_agent_id===t||s.from_agent_id===t)}async purgeExpired(){return this.messageStore.purgeExpired()}emitSent(t){this.eventBus.emit({type:"message:sent",messageId:t.id,fromAgentId:t.from_agent_id,toAgentId:t.to_agent_id,channel:t.channel});}};var Gt={active:["paused","achieved","abandoned"],paused:["active","abandoned"],achieved:[],abandoned:[]},N=class{constructor(t,e,s,a,r){this.goalStore=t;this.eventBus=e;this.agentService=s;this.taskService=a;this.contextStore=r;}async create(t){if(!t.title.trim())throw new c$1("Goal title is required");let e=new Date().toISOString(),s={id:`goal_${nanoid(7)}`,title:t.title.trim(),description:t.description?.trim()??"",status:"active",assignee:t.assignee,created_at:e,updated_at:e};return await this.goalStore.save(s),this.eventBus.emit({type:"goal:created",goalId:s.id,title:s.title}),s.assignee&&await this.enableAutonomous(s.assignee),s}async list(t){return this.goalStore.list(t)}async get(t){let e=await this.goalStore.get(t);if(!e)throw new j$1(t);return e}async updateStatus(t,e){let s=await this.get(t),a=s.status;if(!Gt[a].includes(e))throw new c$1(`Cannot transition goal from '${a}' to '${e}'`);return s.status=e,s.updated_at=new Date().toISOString(),await this.goalStore.save(s),this.eventBus.emit({type:"goal:status_changed",goalId:t,from:a,to:e}),s.assignee&&(e==="paused"?(await this.maybeDisableAutonomous(s.assignee),await this.cancelPendingAutonomousTasks(s.assignee)):e==="active"&&a==="paused"?await this.enableAutonomous(s.assignee):b$2(e)&&await this.maybeDisableAutonomous(s.assignee)),s}async update(t,e){let s=await this.get(t),a=s.assignee;if(e.title!==void 0){if(!e.title.trim())throw new c$1("Goal title cannot be empty");s.title=e.title.trim();}e.description!==void 0&&(s.description=e.description.trim()),e.assignee!==void 0&&(s.assignee=e.assignee||void 0),s.updated_at=new Date().toISOString(),await this.goalStore.save(s),this.eventBus.emit({type:"goal:updated",goalId:t});let r=s.assignee;if(r!==a){let n=[];r&&n.push(this.enableAutonomous(r)),a&&n.push(this.maybeDisableAutonomous(a)),await Promise.all(n);}return s}async delete(t){let e=await this.get(t),{assignee:s}=e;await this.goalStore.delete(t),this.eventBus.emit({type:"goal:deleted",goalId:t}),s&&await this.maybeDisableAutonomous(s);}async listTasksForGoal(t){return this.taskService?.list({goalId:t})??[]}async getProgressReport(t){return this.contextStore?(await this.contextStore.get(`${t}-progress`))?.value:void 0}async enableAutonomous(t){if(this.agentService)try{await this.agentService.setAutonomous(t,!0);}catch{}}async hasActiveGoalsForAgent(t){return (await this.goalStore.list({status:"active"})).some(s=>s.assignee===t)}async cancelPendingAutonomousTasks(t){if(this.taskService)try{let[e,s]=await Promise.all([this.taskService.list({status:"todo"}),this.taskService.list({status:"retrying"})]),a$1=[...e,...s].filter(r=>r.assignee===t&&r.labels?.includes(a));await Promise.all(a$1.map(r=>this.taskService.cancel(r.id).catch(()=>{})));}catch{}}async maybeDisableAutonomous(t){if(this.agentService)try{await this.hasActiveGoalsForAgent(t)||await this.agentService.setAutonomous(t,!1);}catch{}}};var ft={auto_claim:true,message_ttl_ms:864e5};var $=class{constructor(t,e,s,a){this.teamStore=t;this.agentStore=e;this.taskStore=s;this.eventBus=a;}async create(t){if(!t.name.trim())throw new c$1("Team name is required");if(!await this.agentStore.get(t.lead_agent_id))throw new c$1(`Lead agent not found: ${t.lead_agent_id}`);if(await this.teamStore.getByName(t.name.trim()))throw new c$1(`Team "${t.name}" already exists`);let a=new Date().toISOString(),r={agent_id:t.lead_agent_id,role:"lead",joined_at:a},n=[];for(let o of t.member_agent_ids??[]){if(o===t.lead_agent_id)continue;if(!await this.agentStore.get(o))throw new c$1(`Member agent not found: ${o}`);n.push({agent_id:o,role:"member",joined_at:a});}let i={id:`team_${nanoid(7)}`,name:t.name.trim(),description:t.description,status:"active",members:[r,...n],task_pool:[],lead_agent_id:t.lead_agent_id,created_at:a,updated_at:a,config:{...ft,...t.config??{}}};await this.teamStore.save(i),this.eventBus.emit({type:"team:created",teamId:i.id,name:i.name,leadAgentId:i.lead_agent_id});for(let o of n)this.eventBus.emit({type:"team:member_joined",teamId:i.id,agentId:o.agent_id});return i}async get(t){let e=await this.teamStore.get(t);if(!e)throw new k(t);return e}async list(){return this.teamStore.list()}async join(t,e){let s=await this.get(t);if(s.members.some(r=>r.agent_id===e))throw new c$1(`Agent ${e} is already a member of team ${t}`);if(!await this.agentStore.get(e))throw new c$1(`Agent not found: ${e}`);return s.members.push({agent_id:e,role:"member",joined_at:new Date().toISOString()}),s.updated_at=new Date().toISOString(),await this.teamStore.save(s),this.eventBus.emit({type:"team:member_joined",teamId:t,agentId:e}),s}async leave(t,e){let s=await this.get(t);if(e===s.lead_agent_id)throw new c$1("Lead cannot leave team. Disband the team or transfer lead first.");return s.members=s.members.filter(a=>a.agent_id!==e),s.updated_at=new Date().toISOString(),await this.teamStore.save(s),this.eventBus.emit({type:"team:member_left",teamId:t,agentId:e}),s}async addTask(t,e){let s=await this.get(t);if(!await this.taskStore.get(e))throw new c$1(`Task not found: ${e}`);return s.task_pool.includes(e)||(s.task_pool.push(e),s.updated_at=new Date().toISOString(),await this.teamStore.save(s),this.eventBus.emit({type:"team:task_added",teamId:t,taskId:e})),s}async removeTask(t,e){let s=await this.get(t);return s.task_pool=s.task_pool.filter(a=>a!==e),s.updated_at=new Date().toISOString(),await this.teamStore.save(s),s}async setLead(t,e){let s=await this.get(t),a=s.members.find(n=>n.agent_id===e);if(!a)throw new c$1(`Agent ${e} is not a member of team ${t}`);let r=s.members.find(n=>n.agent_id===s.lead_agent_id);return r&&(r.role="member"),a.role="lead",s.lead_agent_id=e,s.updated_at=new Date().toISOString(),await this.teamStore.save(s),s}async disband(t){let e=await this.get(t);e.status="disbanded",e.updated_at=new Date().toISOString(),await this.teamStore.save(e),this.eventBus.emit({type:"team:disbanded",teamId:t});}async findTeamForAgent(t){return (await this.teamStore.list()).find(s=>s.status==="active"&&s.members.some(a=>a.agent_id===t))??null}};async function Lt(m){let t=new l(m.projectRoot);await t.requireInit();let e=new x(t),s=new C,[a,r]=await Promise.all([e.read(),s.read()]),n=new b(t),i=new A(t),o=new E(t),l$1=new I(t),g=new j(t),v=new R(t),p=new D(t),k=new O(t),y=new M,S=new G(n,y,a,t),T=new B(i,l$1,y,a),J=new L(o,y),wt=new F(v,i,k,y),yt=new N(p,y,T,S,g),St=new $(k,i,n,y);return {context:m,paths:t,config:a,taskStore:n,agentStore:i,runStore:o,stateStore:l$1,configStore:e,globalConfigStore:s,globalConfig:r,contextStore:g,messageStore:v,goalStore:p,teamStore:k,eventBus:y,taskService:S,agentService:T,runService:J,messageService:wt,goalService:yt,teamService:St}}async function Ft(m){let t=await Lt(m),[{ProcessManager:e},{AdapterRegistry:s},{ClaudeAdapter:a},{CodexAdapter:r},{CursorAdapter:n},{ShellAdapter:i},{WorkspaceManager:o},{LiquidTemplateEngine:l},{Orchestrator:g},{DoctorService:v}]=await Promise.all([import('./process-manager-33H27MQF.js'),import('./registry-BO2PPRNG.js'),import('./claude-GQZNDJ6L.js'),import('./codex-SJV7ZZBY.js'),import('./cursor-4JQOCP5X.js'),import('./shell-F42UUF3U.js'),import('./workspace-manager-DYN3XJ7X.js'),import('./template-engine-ONIDVD4F.js'),import('./orchestrator-MFL3XK5L.js'),import('./doctor-service-PB7YBH3F.js')]),p=new e,k=new l,y=new o(m.projectRoot,t.paths.root,p),S=new s;S.register(new a(p)),S.register(new r(p)),S.register(new n(p)),S.register(new i(p));let T=new v(S,p,m.projectRoot),J=new g({taskStore:t.taskStore,agentStore:t.agentStore,runStore:t.runStore,stateStore:t.stateStore,adapterRegistry:S,workspaceManager:y,templateEngine:k,processManager:p,eventBus:t.eventBus,taskService:t.taskService,agentService:t.agentService,runService:t.runService,contextStore:t.contextStore,messageService:t.messageService,goalStore:t.goalStore,config:t.config,projectRoot:m.projectRoot,lockPath:t.paths.lockPath});return {...t,processManager:p,adapterRegistry:S,workspaceManager:y,templateEngine:k,doctorService:T,orchestrator:J}}async function ps(m){return Ft(m)}export{ps as buildContainer,Ft as buildFullContainer,Lt as buildLightContainer};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {b,a}from'./chunk-KPCT44WU.js';import'./chunk-6MJ7V6VY.js';import {m as m$1}from'./chunk-3MQNQ7QW.js';import {execFile}from'child_process';import {promisify}from'util';var m=promisify(execFile);async function l(){for(let n of ["cursor-agent","agent"])try{let{stdout:e}=await m(n,["--version"]);return {command:n,version:e.trim()}}catch{}return null}var c=class{constructor(e){this.processManager=e;}kind="cursor";resolvedCommand="cursor-agent";async test(){let e=await l();return e?(this.resolvedCommand=e.command,{ok:true,version:e.version}):{ok:false,error:"Cursor Agent CLI not found. The headless agent CLI is required (cursor-agent or agent).",errorKind:"adapter_not_found"}}execute(e){let r=["-p","--output-format","stream-json","--workspace",e.workspace,"--yolo"];e.config.model&&r.push("--model",e.config.model);let{process:t,pid:o}=this.processManager.spawn(this.resolvedCommand,r,{cwd:e.workspace,env:{...process.env,...e.env},signal:e.signal,stdio:["pipe","pipe","pipe"]});t.stdin&&(t.stdin.write(e.prompt),t.stdin.end());let u=b(t,g,"Cursor agent",e.signal);return {pid:o,events:u}}async stop(e){await this.processManager.killWithGrace(e);}};function g(n){if(!n.trim())return null;try{let e=JSON.parse(n),r=new Date().toISOString();switch(e.type){case "assistant":return {type:"output",timestamp:r,data:e.message??e};case "tool_use":return {type:"tool_call",timestamp:r,data:e};case "tool_result":return {type:"output",timestamp:r,data:e};case "error":{let t=e.error??e,o=typeof t=="string"?t:JSON.stringify(t);return {type:"error",timestamp:r,data:t,errorKind:m$1(o)}}case "result":{let t=a(e);return {type:"done",timestamp:r,data:e,tokens:t}}default:return {type:"output",timestamp:r,data:e}}}catch{return {type:"output",timestamp:new Date().toISOString(),data:n}}}export{c as CursorAdapter};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { createStreamingEvents, extractTokens } from './chunk-
|
|
1
|
+
import { createStreamingEvents, extractTokens } from './chunk-S3QYSBW4.js';
|
|
2
2
|
import './chunk-XDVMX2FO.js';
|
|
3
|
+
import { classifyAdapterError } from './chunk-NLQAJ7TW.js';
|
|
3
4
|
import './chunk-O2MSGW3V.js';
|
|
4
5
|
import { execFile } from 'child_process';
|
|
5
6
|
import { promisify } from 'util';
|
|
@@ -29,7 +30,8 @@ var CursorAdapter = class {
|
|
|
29
30
|
}
|
|
30
31
|
return {
|
|
31
32
|
ok: false,
|
|
32
|
-
error: "Cursor Agent CLI not found. The headless agent CLI is required (cursor-agent or agent)."
|
|
33
|
+
error: "Cursor Agent CLI not found. The headless agent CLI is required (cursor-agent or agent).",
|
|
34
|
+
errorKind: "adapter_not_found" /* ADAPTER_NOT_FOUND */
|
|
33
35
|
};
|
|
34
36
|
}
|
|
35
37
|
execute(params) {
|
|
@@ -75,8 +77,11 @@ function parseCursorEvent(line) {
|
|
|
75
77
|
return { type: "tool_call", timestamp, data: parsed };
|
|
76
78
|
case "tool_result":
|
|
77
79
|
return { type: "output", timestamp, data: parsed };
|
|
78
|
-
case "error":
|
|
79
|
-
|
|
80
|
+
case "error": {
|
|
81
|
+
const errData = parsed.error ?? parsed;
|
|
82
|
+
const errMsg = typeof errData === "string" ? errData : JSON.stringify(errData);
|
|
83
|
+
return { type: "error", timestamp, data: errData, errorKind: classifyAdapterError(errMsg) };
|
|
84
|
+
}
|
|
80
85
|
case "result": {
|
|
81
86
|
const tokens = extractTokens(parsed);
|
|
82
87
|
return { type: "done", timestamp, data: parsed, tokens };
|
|
@@ -90,5 +95,5 @@ function parseCursorEvent(line) {
|
|
|
90
95
|
}
|
|
91
96
|
|
|
92
97
|
export { CursorAdapter };
|
|
93
|
-
//# sourceMappingURL=cursor-
|
|
94
|
-
//# sourceMappingURL=cursor-
|
|
98
|
+
//# sourceMappingURL=cursor-KQJTQ73D.js.map
|
|
99
|
+
//# sourceMappingURL=cursor-KQJTQ73D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/infrastructure/adapters/cursor.ts"],"names":[],"mappings":"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","file":"cursor-KQJTQ73D.js","sourcesContent":["/**\n * Cursor Agent adapter.\n *\n * Spawns `cursor-agent` (Cursor's headless agent CLI) with `--output-format stream-json`.\n * Falls back to `agent` command if `cursor-agent` is not found.\n * Parses JSON-lines from stdout into AgentEvent stream.\n *\n * Note: This requires Cursor Agent CLI, not the regular `cursor` IDE command.\n * Install via: npm i -g @anthropic-ai/cursor-agent (when available)\n */\n\nimport type { IAgentAdapter, AdapterTestResult, ExecuteParams, AgentEvent, ExecuteHandle } from './interface.js';\nimport type { IProcessManager } from '../process/process-manager.js';\nimport { extractTokens, createStreamingEvents } from './utils.js';\nimport { classifyAdapterError, AdapterErrorKind } from '../../domain/errors.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\n/** Try multiple command names and return the first that works */\nasync function findCommand(): Promise<{ command: string; version: string } | null> {\n for (const cmd of ['cursor-agent', 'agent']) {\n try {\n const { stdout } = await execFileAsync(cmd, ['--version']);\n return { command: cmd, version: stdout.trim() };\n } catch {\n // try next\n }\n }\n return null;\n}\n\nexport class CursorAdapter implements IAgentAdapter {\n readonly kind = 'cursor';\n\n private resolvedCommand: string = 'cursor-agent';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n const found = await findCommand();\n if (found) {\n this.resolvedCommand = found.command;\n return { ok: true, version: found.version };\n }\n return {\n ok: false,\n error: 'Cursor Agent CLI not found. The headless agent CLI is required (cursor-agent or agent).',\n errorKind: AdapterErrorKind.ADAPTER_NOT_FOUND,\n };\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const args = [\n '-p',\n '--output-format', 'stream-json',\n '--workspace', params.workspace,\n '--yolo', // bypass interactive prompts for autonomous agents\n ];\n\n if (params.config.model) {\n args.push('--model', params.config.model);\n }\n\n const { process: proc, pid } = this.processManager.spawn(this.resolvedCommand, args, {\n cwd: params.workspace,\n env: { ...process.env, ...params.env },\n signal: params.signal,\n stdio: ['pipe', 'pipe', 'pipe'], // stdin must be 'pipe' to send prompt\n });\n\n // Pipe prompt via stdin\n if (proc.stdin) {\n proc.stdin.write(params.prompt);\n proc.stdin.end();\n }\n\n const events = createStreamingEvents(proc, parseCursorEvent, 'Cursor agent', params.signal);\n\n return { pid, events };\n }\n\n async stop(pid: number): Promise<void> {\n await this.processManager.killWithGrace(pid);\n }\n}\n\nfunction parseCursorEvent(line: string): AgentEvent | null {\n if (!line.trim()) return null;\n\n try {\n const parsed: Record<string, unknown> = JSON.parse(line);\n const timestamp = new Date().toISOString();\n\n // Cursor stream-json uses the same format as Claude stream-json\n switch (parsed.type) {\n case 'assistant':\n return { type: 'output', timestamp, data: (parsed.message as unknown) ?? parsed };\n case 'tool_use':\n return { type: 'tool_call', timestamp, data: parsed };\n case 'tool_result':\n return { type: 'output', timestamp, data: parsed };\n case 'error': {\n const errData = (parsed.error as unknown) ?? parsed;\n const errMsg = typeof errData === 'string' ? errData : JSON.stringify(errData);\n return { type: 'error', timestamp, data: errData, errorKind: classifyAdapterError(errMsg) };\n }\n case 'result': {\n const tokens = extractTokens(parsed);\n return { type: 'done', timestamp, data: parsed, tokens };\n }\n default:\n return { type: 'output', timestamp, data: parsed };\n }\n } catch {\n return { type: 'output', timestamp: new Date().toISOString(), data: line };\n }\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {a as a$4}from'./chunk-HMMPM7MF.js';import {p,c,q}from'./chunk-L26TK7Y5.js';import {a as a$1}from'./chunk-CDFA4IIQ.js';import {a as a$2}from'./chunk-
|
|
2
|
+
import {a as a$4}from'./chunk-HMMPM7MF.js';import {p,c,q}from'./chunk-L26TK7Y5.js';import {a as a$1}from'./chunk-CDFA4IIQ.js';import {a as a$2}from'./chunk-QFKVCNKL.js';import'./chunk-KPCT44WU.js';import {a as a$3}from'./chunk-IS3YBE2B.js';import {a}from'./chunk-6MJ7V6VY.js';import {l}from'./chunk-OQKREZUF.js';import'./chunk-3MQNQ7QW.js';import i from'chalk';function P(u,t){u.command("doctor").description("Check adapters and dependencies").action(async()=>{let c$1,n,d=false;if(t)c$1=t.doctorService,n=t.paths,d=true;else {let o=new a,e=new a$1;e.register(new a$2(o)),e.register(new a$3(o)),c$1=new a$4(e,o,process.cwd()),n=new l(process.cwd());}console.log(),console.log(` ${p("orch doctor")} \xB7 checking adapters and dependencies`),console.log();let a$5=await c$1.runAll();if(t?.context.json){console.log(JSON.stringify(a$5,null,2));return}for(let o of a$5.checks){let e=o.status==="ok"?i.ansi256(72)(c("done")):o.status==="fail"?i.ansi256(167)(c("failed")):q("\u2014"),l=o.detail?q(` ${o.detail}`):"";console.log(` ${e} ${o.name.padEnd(12)}${l}`);}if(n){let o=await n.isInitialized();if(o&&d){let e=await t.agentService.list(),l=await t.taskService.list();console.log(),console.log(` ${i.ansi256(72)(c("done"))} .orchestry/ ${q(`exists \xB7 ${e.length} agents \xB7 ${l.length} tasks`)}`);}else o||(console.log(),console.log(` ${i.ansi256(167)(c("failed"))} .orchestry/ ${q("not found \u2014 run: orch init")}`));}console.log(),console.log(` ${a$5.adaptersReady} of ${a$5.adaptersTotal} adapters ready`),console.log();});}export{P as registerDoctorCommand};
|