perstack 0.0.81 → 0.0.82

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/bin/cli.js CHANGED
@@ -13,7 +13,7 @@ import { createId } from '@paralleldrive/cuid2';
13
13
  // package.json
14
14
  var package_default = {
15
15
  name: "perstack",
16
- version: "0.0.81",
16
+ version: "0.0.82",
17
17
  description: "PerStack CLI"};
18
18
  async function findConfigPath(configPath) {
19
19
  if (configPath) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../package.json","../../src/install.ts","../../src/lib/log/data-fetcher.ts","../../src/lib/log/filter.ts","../../src/lib/log/formatter.ts","../../src/log.ts","../../src/run.ts","../../bin/cli.ts"],"names":["path","Command","latestJob","checkpoint","events","result","perstackRun"],"mappings":"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","file":"cli.js","sourcesContent":["{\n \"name\": \"perstack\",\n \"version\": \"0.0.81\",\n \"description\": \"PerStack CLI\",\n \"author\": \"Wintermute Technologies, Inc.\",\n \"license\": \"Apache-2.0\",\n \"type\": \"module\",\n \"exports\": {\n \"./start\": \"./src/start.ts\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"exports\": {\n \"./start\": \"./dist/src/start.js\"\n },\n \"bin\": {\n \"perstack\": \"dist/bin/cli.js\"\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"clean\": \"rm -rf dist\",\n \"build\": \"pnpm run clean && tsup --config ./tsup.config.ts\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@paralleldrive/cuid2\": \"^3.0.6\",\n \"@perstack/api-client\": \"^0.0.54\",\n \"@perstack/core\": \"workspace:*\",\n \"@perstack/react\": \"workspace:*\",\n \"@perstack/runtime\": \"workspace:*\",\n \"commander\": \"^14.0.2\",\n \"dotenv\": \"^17.2.3\",\n \"ink\": \"^6.6.0\",\n \"react\": \"^19.2.3\",\n \"smol-toml\": \"^1.6.0\",\n \"@perstack/filesystem-storage\": \"workspace:*\"\n },\n \"devDependencies\": {\n \"@perstack/tui-components\": \"workspace:*\",\n \"@tsconfig/node22\": \"^22.0.5\",\n \"@types/node\": \"^25.0.10\",\n \"@types/react\": \"^19.2.9\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.0.18\"\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n }\n}\n","import { readFile, writeFile } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { createApiClient } from \"@perstack/api-client\"\nimport {\n defaultPerstackApiBaseUrl,\n type Expert,\n expertSchema,\n type Lockfile,\n type LockfileExpert,\n type PerstackConfig,\n type RuntimeVersion,\n type Skill,\n} from \"@perstack/core\"\nimport { collectToolDefinitionsForExpert } from \"@perstack/runtime\"\nimport { Command } from \"commander\"\nimport TOML from \"smol-toml\"\nimport { getEnv } from \"./lib/get-env.js\"\nimport { getPerstackConfig } from \"./lib/perstack-toml.js\"\n\nasync function findConfigPath(configPath?: string): Promise<string> {\n if (configPath) {\n return path.resolve(process.cwd(), configPath)\n }\n return await findConfigPathRecursively(process.cwd())\n}\n\nasync function findConfigPathRecursively(cwd: string): Promise<string> {\n const configPath = path.resolve(cwd, \"perstack.toml\")\n try {\n await readFile(configPath)\n return configPath\n } catch {\n if (cwd === path.parse(cwd).root) {\n throw new Error(\"perstack.toml not found. Create one or specify --config path.\")\n }\n return await findConfigPathRecursively(path.dirname(cwd))\n }\n}\n\ntype PublishedExpertData = {\n name: string\n version: string\n description?: string\n instruction: string\n minRuntimeVersion?: RuntimeVersion\n skills?: Record<\n string,\n | {\n type: \"mcpStdioSkill\"\n name: string\n description: string\n rule?: string\n pick?: string[]\n omit?: string[]\n command: \"npx\" | \"uvx\"\n packageName: string\n requiredEnv?: string[]\n }\n | {\n type: \"mcpSseSkill\"\n name: string\n description: string\n rule?: string\n pick?: string[]\n omit?: string[]\n endpoint: string\n }\n | {\n type: \"interactiveSkill\"\n name: string\n description: string\n rule?: string\n tools: Record<string, { description: string; inputJsonSchema: string }>\n }\n >\n delegates?: string[]\n tags?: string[]\n}\n\nfunction toRuntimeExpert(key: string, expert: PublishedExpertData): Expert {\n const skills: Record<string, Skill> = Object.fromEntries(\n Object.entries(expert.skills ?? {}).map(([name, skill]) => {\n switch (skill.type) {\n case \"mcpStdioSkill\":\n return [\n name,\n {\n type: skill.type,\n name,\n description: skill.description,\n rule: skill.rule,\n pick: skill.pick ?? [],\n omit: skill.omit ?? [],\n command: skill.command,\n packageName: skill.packageName,\n requiredEnv: skill.requiredEnv ?? [],\n lazyInit: false,\n },\n ]\n case \"mcpSseSkill\":\n return [\n name,\n {\n type: skill.type,\n name,\n description: skill.description,\n rule: skill.rule,\n pick: skill.pick ?? [],\n omit: skill.omit ?? [],\n endpoint: skill.endpoint,\n lazyInit: false,\n },\n ]\n case \"interactiveSkill\":\n return [\n name,\n {\n type: skill.type,\n name,\n description: skill.description,\n rule: skill.rule,\n tools: Object.fromEntries(\n Object.entries(skill.tools).map(([toolName, tool]) => [\n toolName,\n {\n name: toolName,\n description: tool.description,\n inputSchema: JSON.parse(tool.inputJsonSchema),\n },\n ]),\n ),\n },\n ]\n default: {\n throw new Error(`Unknown skill type: ${(skill as { type: string }).type}`)\n }\n }\n }),\n )\n return {\n key,\n name: expert.name,\n version: expert.version,\n minRuntimeVersion: expert.minRuntimeVersion ?? \"v1.0\",\n description: expert.description ?? \"\",\n instruction: expert.instruction,\n skills,\n delegates: expert.delegates ?? [],\n tags: expert.tags ?? [],\n }\n}\n\nfunction configExpertToExpert(\n key: string,\n configExpert: NonNullable<PerstackConfig[\"experts\"]>[string],\n): Expert {\n return expertSchema.parse({\n key,\n name: key,\n version: configExpert.version ?? \"1.0.0\",\n description: configExpert.description,\n instruction: configExpert.instruction,\n skills: configExpert.skills,\n delegates: configExpert.delegates,\n tags: configExpert.tags,\n providerTools: configExpert.providerTools,\n providerSkills: configExpert.providerSkills,\n providerToolOptions: configExpert.providerToolOptions,\n })\n}\n\nasync function resolveAllExperts(\n config: PerstackConfig,\n env: Record<string, string>,\n): Promise<Record<string, Expert>> {\n const experts: Record<string, Expert> = {}\n for (const [key, configExpert] of Object.entries(config.experts ?? {})) {\n experts[key] = configExpertToExpert(key, configExpert)\n }\n const toResolve = new Set<string>()\n for (const expert of Object.values(experts)) {\n for (const delegateKey of expert.delegates) {\n if (!experts[delegateKey]) {\n toResolve.add(delegateKey)\n }\n }\n }\n if (toResolve.size === 0) {\n return experts\n }\n const apiKey = env.PERSTACK_API_KEY\n if (!apiKey) {\n throw new Error(\"PERSTACK_API_KEY is required to resolve remote delegates\")\n }\n const client = createApiClient({\n baseUrl: config.perstackApiBaseUrl ?? defaultPerstackApiBaseUrl,\n apiKey,\n })\n while (toResolve.size > 0) {\n const delegateKey = toResolve.values().next().value\n if (!delegateKey) break\n toResolve.delete(delegateKey)\n if (experts[delegateKey]) continue\n const result = await client.experts.get(delegateKey)\n if (!result.ok) {\n throw new Error(`Failed to resolve delegate \"${delegateKey}\": ${result.error.message}`)\n }\n const publishedExpert = result.data.data.definition.experts[delegateKey]\n if (!publishedExpert) {\n throw new Error(`Expert \"${delegateKey}\" not found in API response`)\n }\n experts[delegateKey] = toRuntimeExpert(delegateKey, publishedExpert)\n for (const nestedDelegate of publishedExpert.delegates ?? []) {\n if (!experts[nestedDelegate]) {\n toResolve.add(nestedDelegate)\n }\n }\n }\n return experts\n}\n\nfunction expertToLockfileExpert(\n expert: Expert,\n toolDefinitions: {\n skillName: string\n name: string\n description?: string\n inputSchema: Record<string, unknown>\n }[],\n): LockfileExpert {\n return {\n key: expert.key,\n name: expert.name,\n version: expert.version,\n description: expert.description,\n instruction: expert.instruction,\n skills: expert.skills,\n delegates: expert.delegates,\n tags: expert.tags,\n toolDefinitions,\n }\n}\n\nfunction generateLockfileToml(lockfile: Lockfile): string {\n return TOML.stringify(lockfile)\n}\n\nexport const installCommand = new Command()\n .command(\"install\")\n .description(\"Generate perstack.lock with tool definitions for faster startup\")\n .option(\"--config <configPath>\", \"Path to perstack.toml config file\")\n .option(\n \"--env-path <path>\",\n \"Path to the environment file (can be specified multiple times)\",\n (value: string, previous: string[]) => previous.concat(value),\n [] as string[],\n )\n .action(async (options) => {\n try {\n const configPath = await findConfigPath(options.config)\n const config = await getPerstackConfig(options.config)\n const envPath =\n options.envPath && options.envPath.length > 0\n ? options.envPath\n : (config.envPath ?? [\".env\", \".env.local\"])\n const env = getEnv(envPath)\n console.log(\"Resolving experts...\")\n const experts = await resolveAllExperts(config, env)\n console.log(`Found ${Object.keys(experts).length} expert(s)`)\n const lockfileExperts: Record<string, LockfileExpert> = {}\n for (const [key, expert] of Object.entries(experts)) {\n console.log(`Collecting tool definitions for ${key}...`)\n const toolDefinitions = await collectToolDefinitionsForExpert(expert, {\n env,\n perstackBaseSkillCommand: config.perstackBaseSkillCommand,\n })\n console.log(` Found ${toolDefinitions.length} tool(s)`)\n lockfileExperts[key] = expertToLockfileExpert(expert, toolDefinitions)\n }\n const lockfile: Lockfile = {\n version: \"1\",\n generatedAt: Date.now(),\n configPath: path.basename(configPath),\n experts: lockfileExperts,\n }\n const lockfilePath = path.join(path.dirname(configPath), \"perstack.lock\")\n const lockfileContent = generateLockfileToml(lockfile)\n await writeFile(lockfilePath, lockfileContent, \"utf-8\")\n console.log(`Generated ${lockfilePath}`)\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`)\n } else {\n console.error(error)\n }\n process.exit(1)\n }\n })\n","import { existsSync, readdirSync, statSync } from \"node:fs\"\nimport path from \"node:path\"\nimport type { Checkpoint, Job, RunEvent, RunSetting } from \"@perstack/core\"\nimport {\n defaultRetrieveCheckpoint,\n getAllJobs,\n getAllRuns,\n getCheckpointsByJobId,\n getEventContents,\n getRunIdsByJobId,\n retrieveJob,\n} from \"@perstack/filesystem-storage\"\n\nexport interface LogDataFetcher {\n getJob(jobId: string): Promise<Job | undefined>\n getLatestJob(): Promise<Job | undefined>\n getRuns(jobId: string): Promise<RunSetting[]>\n getCheckpoints(jobId: string): Promise<Checkpoint[]>\n getCheckpoint(jobId: string, checkpointId: string): Promise<Checkpoint>\n getEvents(jobId: string, runId: string): Promise<RunEvent[]>\n getAllEventsForJob(jobId: string): Promise<RunEvent[]>\n}\n\nexport interface StorageAdapter {\n getAllJobs(): Promise<Job[]>\n retrieveJob(jobId: string): Promise<Job | undefined>\n getCheckpointsByJobId(jobId: string): Promise<Checkpoint[]>\n retrieveCheckpoint(jobId: string, checkpointId: string): Promise<Checkpoint>\n getEventContents(jobId: string, runId: string, maxStep?: number): Promise<RunEvent[]>\n getAllRuns(): Promise<RunSetting[]>\n getJobIds(): string[]\n getBasePath(): string\n}\n\nexport function createLogDataFetcher(storage: StorageAdapter): LogDataFetcher {\n return {\n async getJob(jobId: string): Promise<Job | undefined> {\n // First try to get from storage\n const job = await storage.retrieveJob(jobId)\n if (job) return job\n // Fallback: construct minimal job from checkpoints\n const checkpoints = await storage.getCheckpointsByJobId(jobId)\n if (checkpoints.length === 0) return undefined\n const firstCheckpoint = checkpoints[0]\n const lastCheckpoint = checkpoints[checkpoints.length - 1]\n return {\n id: jobId,\n coordinatorExpertKey: firstCheckpoint.expert.key,\n runtimeVersion: \"v1.0\",\n totalSteps: lastCheckpoint.stepNumber,\n usage: lastCheckpoint.usage,\n startedAt: getJobDirMtime(storage.getBasePath(), jobId),\n finishedAt: Date.now(),\n status: lastCheckpoint.status === \"completed\" ? \"completed\" : \"running\",\n }\n },\n\n async getLatestJob(): Promise<Job | undefined> {\n // First try standard storage\n const jobs = await storage.getAllJobs()\n if (jobs.length > 0) return jobs[0]\n // Fallback: scan job directories\n const jobIds = storage.getJobIds()\n if (jobIds.length === 0) return undefined\n // Sort by directory modification time (newest first)\n const basePath = storage.getBasePath()\n const sortedJobIds = jobIds\n .map((id) => ({ id, mtime: getJobDirMtime(basePath, id) }))\n .sort((a, b) => b.mtime - a.mtime)\n const latestJobId = sortedJobIds[0].id\n return this.getJob(latestJobId)\n },\n\n async getRuns(jobId: string): Promise<RunSetting[]> {\n const runs = await storage.getAllRuns()\n const jobRuns = runs.filter((r) => r.jobId === jobId)\n if (jobRuns.length > 0) return jobRuns\n // Fallback: extract unique runIds from checkpoints and return minimal run info\n const checkpoints = await storage.getCheckpointsByJobId(jobId)\n const runIds = [...new Set(checkpoints.map((c) => c.runId))]\n // Return minimal objects with just jobId and runId for event retrieval\n return runIds.map((runId) => ({ jobId, runId }) as unknown as RunSetting)\n },\n\n async getCheckpoints(jobId: string): Promise<Checkpoint[]> {\n return storage.getCheckpointsByJobId(jobId)\n },\n\n async getCheckpoint(jobId: string, checkpointId: string): Promise<Checkpoint> {\n return storage.retrieveCheckpoint(jobId, checkpointId)\n },\n\n async getEvents(jobId: string, runId: string): Promise<RunEvent[]> {\n return storage.getEventContents(jobId, runId)\n },\n\n async getAllEventsForJob(jobId: string): Promise<RunEvent[]> {\n const runs = await this.getRuns(jobId)\n const allEvents: RunEvent[] = []\n for (const run of runs) {\n const events = await storage.getEventContents(jobId, run.runId)\n allEvents.push(...events)\n }\n return allEvents.sort((a, b) => a.timestamp - b.timestamp)\n },\n }\n}\n\nfunction getJobDirMtime(basePath: string, jobId: string): number {\n try {\n const jobDir = path.join(basePath, \"jobs\", jobId)\n const stats = statSync(jobDir)\n return stats.mtimeMs\n } catch {\n return Date.now()\n }\n}\n\n/**\n * Create a storage adapter using filesystem helper functions directly.\n */\nexport function createStorageAdapter(basePath: string): StorageAdapter {\n return {\n getAllJobs: async () => getAllJobs(),\n retrieveJob: async (jobId) => retrieveJob(jobId),\n getCheckpointsByJobId: async (jobId) => getCheckpointsByJobId(jobId),\n retrieveCheckpoint: async (jobId, checkpointId) =>\n defaultRetrieveCheckpoint(jobId, checkpointId),\n getEventContents: async (jobId, runId, maxStep) => getEventContents(jobId, runId, maxStep),\n getAllRuns: async () => getAllRuns(),\n getJobIds: () => {\n const jobsDir = path.join(basePath, \"jobs\")\n if (!existsSync(jobsDir)) return []\n return readdirSync(jobsDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n },\n getBasePath: () => basePath,\n }\n}\n","import type { RunEvent } from \"@perstack/core\"\nimport type { FilterCondition, FilterOptions, StepFilter } from \"./types.js\"\n\nexport const ERROR_EVENT_TYPES = new Set([\"stopRunByError\", \"retry\"])\nexport const TOOL_EVENT_TYPES = new Set([\n \"callTools\",\n \"resolveToolResults\",\n \"stopRunByInteractiveTool\",\n])\nexport const DELEGATION_EVENT_TYPES = new Set([\"stopRunByDelegate\"])\n\nexport function parseStepFilter(step: string): StepFilter {\n const trimmed = step.trim()\n const rangeMatch = trimmed.match(/^(\\d+)-(\\d+)$/)\n if (rangeMatch) {\n const min = Number(rangeMatch[1])\n const max = Number(rangeMatch[2])\n if (min > max) {\n throw new Error(`Invalid step range: ${step} (min ${min} > max ${max})`)\n }\n return { type: \"range\", min, max }\n }\n const gteMatch = trimmed.match(/^>=(\\d+)$/)\n if (gteMatch) {\n return { type: \"gte\", value: Number(gteMatch[1]) }\n }\n const gtMatch = trimmed.match(/^>(\\d+)$/)\n if (gtMatch) {\n return { type: \"gt\", value: Number(gtMatch[1]) }\n }\n const lteMatch = trimmed.match(/^<=(\\d+)$/)\n if (lteMatch) {\n return { type: \"lte\", value: Number(lteMatch[1]) }\n }\n const ltMatch = trimmed.match(/^<(\\d+)$/)\n if (ltMatch) {\n return { type: \"lt\", value: Number(ltMatch[1]) }\n }\n const exactMatch = trimmed.match(/^(\\d+)$/)\n if (exactMatch) {\n return { type: \"exact\", value: Number(exactMatch[1]) }\n }\n throw new Error(`Invalid step filter: ${step}`)\n}\n\nexport function parseFilterExpression(expression: string): FilterCondition {\n const trimmed = expression.trim()\n const operatorMatch = trimmed.match(/^\\.([a-zA-Z_][\\w.[\\]]*)\\s*(==|!=|>=|<=|>|<)\\s*(.+)$/)\n if (!operatorMatch) {\n throw new Error(`Invalid filter expression: ${expression}`)\n }\n const [, fieldPath, operator, rawValue] = operatorMatch\n const trimmedValue = rawValue.trim()\n if (trimmedValue === \"\") {\n throw new Error(`Missing value in filter expression: ${expression}`)\n }\n const field = parseFieldPath(fieldPath)\n const value = parseValue(trimmedValue)\n return { field, operator: operator as FilterCondition[\"operator\"], value }\n}\n\nfunction parseFieldPath(path: string): string[] {\n const parts: string[] = []\n let current = \"\"\n let i = 0\n while (i < path.length) {\n if (path[i] === \".\") {\n if (current) {\n parts.push(current)\n current = \"\"\n }\n i++\n } else if (path[i] === \"[\" && path[i + 1] === \"]\") {\n if (current) {\n parts.push(current)\n current = \"\"\n }\n parts.push(\"*\")\n i += 2\n } else {\n current += path[i]\n i++\n }\n }\n if (current) {\n parts.push(current)\n }\n return parts\n}\n\nfunction parseValue(raw: string): string | number | boolean {\n if (raw === \"true\") return true\n if (raw === \"false\") return false\n if (raw.startsWith('\"') && raw.endsWith('\"')) {\n return raw.slice(1, -1)\n }\n if (raw.startsWith(\"'\") && raw.endsWith(\"'\")) {\n return raw.slice(1, -1)\n }\n const num = Number(raw)\n if (!Number.isNaN(num)) {\n return num\n }\n return raw\n}\n\nexport function evaluateCondition(event: RunEvent, condition: FilterCondition): boolean {\n const { field, operator, value } = condition\n const actualValue = getFieldValue(event, field)\n if (actualValue === undefined) {\n return false\n }\n if (Array.isArray(actualValue)) {\n return actualValue.some((v) => compareValues(v, operator, value))\n }\n return compareValues(actualValue, operator, value)\n}\n\nfunction getFieldValue(obj: unknown, path: string[]): unknown {\n let current: unknown = obj\n for (let i = 0; i < path.length; i++) {\n const segment = path[i]\n if (current === null || current === undefined) {\n return undefined\n }\n if (segment === \"*\") {\n if (!Array.isArray(current)) {\n return undefined\n }\n const remainingPath = path.slice(i + 1)\n if (remainingPath.length === 0) {\n return current\n }\n return current\n .map((item) => getFieldValue(item, remainingPath))\n .filter((v) => v !== undefined)\n }\n if (typeof current !== \"object\") {\n return undefined\n }\n current = (current as Record<string, unknown>)[segment]\n }\n return current\n}\n\nfunction compareValues(\n actual: unknown,\n operator: FilterCondition[\"operator\"],\n expected: string | number | boolean,\n): boolean {\n switch (operator) {\n case \"==\":\n return actual === expected\n case \"!=\":\n return actual !== expected\n case \">\":\n return typeof actual === \"number\" && typeof expected === \"number\" && actual > expected\n case \">=\":\n return typeof actual === \"number\" && typeof expected === \"number\" && actual >= expected\n case \"<\":\n return typeof actual === \"number\" && typeof expected === \"number\" && actual < expected\n case \"<=\":\n return typeof actual === \"number\" && typeof expected === \"number\" && actual <= expected\n default:\n return false\n }\n}\n\nfunction matchesStepFilter(stepNumber: number, filter: StepFilter): boolean {\n switch (filter.type) {\n case \"exact\":\n return stepNumber === filter.value\n case \"gt\":\n return filter.value !== undefined && stepNumber > filter.value\n case \"gte\":\n return filter.value !== undefined && stepNumber >= filter.value\n case \"lt\":\n return filter.value !== undefined && stepNumber < filter.value\n case \"lte\":\n return filter.value !== undefined && stepNumber <= filter.value\n case \"range\":\n return (\n filter.min !== undefined &&\n filter.max !== undefined &&\n stepNumber >= filter.min &&\n stepNumber <= filter.max\n )\n default:\n return true\n }\n}\n\nexport type ApplyFiltersResult = {\n events: RunEvent[]\n totalBeforePagination: number\n matchedAfterPagination: number\n}\n\nexport function applyFilters(events: RunEvent[], options: FilterOptions): ApplyFiltersResult {\n let filtered = events\n if (options.step) {\n filtered = filtered.filter((e) => matchesStepFilter(e.stepNumber, options.step as StepFilter))\n }\n if (options.type) {\n filtered = filtered.filter((e) => e.type === options.type)\n }\n if (options.errors) {\n filtered = filtered.filter((e) => ERROR_EVENT_TYPES.has(e.type))\n }\n if (options.tools) {\n filtered = filtered.filter((e) => TOOL_EVENT_TYPES.has(e.type))\n }\n if (options.delegations) {\n filtered = filtered.filter((e) => DELEGATION_EVENT_TYPES.has(e.type))\n }\n if (options.filterExpression) {\n filtered = filtered.filter((e) =>\n evaluateCondition(e, options.filterExpression as FilterCondition),\n )\n }\n // Record total count before pagination\n const totalBeforePagination = filtered.length\n // Apply offset and take (pagination)\n const offset = options.offset ?? 0\n if (offset > 0) {\n filtered = filtered.slice(offset)\n }\n if (options.take !== undefined && options.take > 0) {\n filtered = filtered.slice(0, options.take)\n }\n // Record matched count after pagination (before context is added)\n const matchedAfterPagination = filtered.length\n // Add context events after pagination to preserve matched events\n if (options.context !== undefined && options.context > 0) {\n filtered = addContextEvents(events, filtered, options.context)\n }\n return { events: filtered, totalBeforePagination, matchedAfterPagination }\n}\n\nfunction addContextEvents(\n allEvents: RunEvent[],\n matchedEvents: RunEvent[],\n contextSize: number,\n): RunEvent[] {\n const matchedIds = new Set(matchedEvents.map((e) => e.id))\n const resultIds = new Set<string>()\n for (const event of matchedEvents) {\n const index = allEvents.findIndex((e) => e.id === event.id)\n if (index === -1) continue\n const start = Math.max(0, index - contextSize)\n const end = Math.min(allEvents.length - 1, index + contextSize)\n for (let i = start; i <= end; i++) {\n resultIds.add(allEvents[i].id)\n }\n }\n return allEvents.filter((e) => resultIds.has(e.id) || matchedIds.has(e.id))\n}\n","import type { Checkpoint, Job, RunEvent } from \"@perstack/core\"\nimport { DELEGATION_EVENT_TYPES, ERROR_EVENT_TYPES, TOOL_EVENT_TYPES } from \"./filter.js\"\nimport type { FormatterOptions, LogOutput, LogSummary } from \"./types.js\"\n\nexport function createSummary(events: RunEvent[]): LogSummary {\n if (events.length === 0) {\n return {\n totalEvents: 0,\n errorCount: 0,\n toolCallCount: 0,\n delegationCount: 0,\n }\n }\n const stepNumbers = events.map((e) => e.stepNumber)\n return {\n totalEvents: events.length,\n errorCount: events.filter((e) => ERROR_EVENT_TYPES.has(e.type)).length,\n toolCallCount: events.filter((e) => TOOL_EVENT_TYPES.has(e.type)).length,\n delegationCount: events.filter((e) => DELEGATION_EVENT_TYPES.has(e.type)).length,\n stepRange: { min: Math.min(...stepNumbers), max: Math.max(...stepNumbers) },\n }\n}\n\nexport function formatJson(output: LogOutput, options: FormatterOptions): string {\n const data: Record<string, unknown> = {\n job: output.job,\n events: output.events,\n summary: output.summary,\n }\n // Include optional fields when present\n if (output.checkpoint) {\n data.checkpoint = output.checkpoint\n }\n if (output.checkpoints && output.checkpoints.length > 0) {\n data.checkpoints = output.checkpoints\n }\n if (output.isLatestJob) {\n data.isLatestJob = true\n }\n if (output.storagePath) {\n data.storagePath = output.storagePath\n }\n if (output.totalEventsBeforeLimit !== undefined) {\n data.totalEventsBeforeLimit = output.totalEventsBeforeLimit\n }\n if (output.matchedAfterPagination !== undefined) {\n data.matchedAfterPagination = output.matchedAfterPagination\n }\n if (options.pretty) {\n return JSON.stringify(data, null, 2)\n }\n return JSON.stringify(data)\n}\n\nexport function formatTerminal(output: LogOutput, options: FormatterOptions): string {\n const lines: string[] = []\n // Show context information\n if (output.isLatestJob) {\n lines.push(\"(showing latest job)\")\n lines.push(\"\")\n }\n if (output.storagePath) {\n lines.push(`Storage: ${output.storagePath}`)\n lines.push(\"\")\n }\n if (output.job) {\n lines.push(...formatJobHeader(output.job))\n lines.push(\"\")\n }\n if (output.checkpoint && options.messages) {\n lines.push(...formatCheckpointWithMessages(output.checkpoint))\n lines.push(\"\")\n } else if (output.checkpoint) {\n lines.push(...formatCheckpointHeader(output.checkpoint))\n lines.push(\"\")\n }\n if (options.summary && output.summary) {\n lines.push(...formatSummarySection(output.summary))\n lines.push(\"\")\n }\n if (output.events.length > 0) {\n lines.push(\"Events:\")\n lines.push(\"─\".repeat(50))\n for (const event of output.events) {\n lines.push(...formatEvent(event, options.verbose))\n }\n lines.push(\"─\".repeat(50))\n // Show pagination info if events were truncated\n // Use matchedAfterPagination to compare with totalBeforeLimit, not events.length\n // (events.length may include context events which could exceed matchedAfterPagination)\n if (\n output.totalEventsBeforeLimit !== undefined &&\n output.matchedAfterPagination !== undefined &&\n output.totalEventsBeforeLimit > output.matchedAfterPagination\n ) {\n const contextNote =\n output.events.length > output.matchedAfterPagination\n ? ` (+${output.events.length - output.matchedAfterPagination} context)`\n : \"\"\n lines.push(\n `(showing ${output.matchedAfterPagination} of ${output.totalEventsBeforeLimit} matched events${contextNote})`,\n )\n lines.push(`Use --take and --offset to paginate, or --take 0 for all`)\n }\n } else if (output.totalEventsBeforeLimit !== undefined && output.totalEventsBeforeLimit > 0) {\n lines.push(`(${output.totalEventsBeforeLimit} events available, use --offset to view)`)\n }\n return lines.join(\"\\n\")\n}\n\nfunction formatJobHeader(job: Job): string[] {\n const lines: string[] = []\n lines.push(`Job: ${job.id} (${job.status})`)\n lines.push(`Expert: ${job.coordinatorExpertKey}`)\n lines.push(`Started: ${formatTimestamp(job.startedAt)}`)\n lines.push(`Steps: ${job.totalSteps}`)\n if (job.finishedAt) {\n lines.push(`Finished: ${formatTimestamp(job.finishedAt)}`)\n }\n return lines\n}\n\nfunction formatCheckpointHeader(checkpoint: Checkpoint): string[] {\n const lines: string[] = []\n lines.push(`Checkpoint: ${checkpoint.id}`)\n lines.push(`Status: ${checkpoint.status}`)\n lines.push(`Step: ${checkpoint.stepNumber}`)\n lines.push(`Expert: ${checkpoint.expert.key}`)\n return lines\n}\n\nfunction formatCheckpointWithMessages(checkpoint: Checkpoint): string[] {\n const lines: string[] = []\n lines.push(...formatCheckpointHeader(checkpoint))\n lines.push(\"\")\n lines.push(\"Messages:\")\n for (const msg of checkpoint.messages) {\n const content = extractTextContent(msg.contents)\n const preview = content.length > 100 ? `${content.slice(0, 100)}...` : content\n lines.push(` [${msg.type}] ${preview}`)\n }\n return lines\n}\n\nfunction formatSummarySection(summary: LogSummary): string[] {\n const lines: string[] = []\n lines.push(\"Summary:\")\n lines.push(` Total Events: ${summary.totalEvents}`)\n lines.push(` Errors: ${summary.errorCount}`)\n lines.push(` Tool Calls: ${summary.toolCallCount}`)\n lines.push(` Delegations: ${summary.delegationCount}`)\n if (summary.stepRange) {\n lines.push(` Step Range: ${summary.stepRange.min} - ${summary.stepRange.max}`)\n }\n return lines\n}\n\nfunction formatEvent(event: RunEvent, verbose: boolean): string[] {\n const lines: string[] = []\n const time = formatTime(event.timestamp)\n const header = `[Step ${event.stepNumber}] ${event.type}${\" \".repeat(Math.max(0, 24 - event.type.length))}${time}`\n lines.push(header)\n if (event.type === \"startRun\" && \"inputMessages\" in event) {\n const startEvent = event as { inputMessages: Array<{ type: string; contents: unknown[] }> }\n const userMsg = startEvent.inputMessages.find((m) => m.type === \"userMessage\")\n if (userMsg) {\n const text = extractTextContent(userMsg.contents)\n const preview = text.length > 60 ? `${text.slice(0, 60)}...` : text\n lines.push(` Query: \"${preview}\"`)\n }\n }\n if (event.type === \"callTools\" && \"toolCalls\" in event) {\n const toolEvent = event as {\n toolCalls: Array<{ toolName: string; skillName: string; args: Record<string, unknown> }>\n }\n if (verbose) {\n for (const tc of toolEvent.toolCalls) {\n lines.push(` [${tc.skillName}] ${tc.toolName}`)\n lines.push(` Args: ${JSON.stringify(tc.args)}`)\n }\n } else {\n const toolNames = toolEvent.toolCalls.map((tc) => tc.toolName).join(\", \")\n lines.push(` Tools: ${toolNames}`)\n }\n }\n if (event.type === \"resolveToolResults\" && \"toolResults\" in event) {\n const resultEvent = event as { toolResults: Array<{ toolName: string; result: unknown[] }> }\n for (const tr of resultEvent.toolResults) {\n const text = extractTextContent(tr.result)\n const isError = text.toLowerCase().startsWith(\"error\")\n const symbol = isError ? \"✗\" : \"✓\"\n const preview = text.length > 40 ? `${text.slice(0, 40)}...` : text\n lines.push(` ${symbol} ${tr.toolName}: ${preview}`)\n }\n }\n if (event.type === \"stopRunByError\" && \"error\" in event) {\n const errorEvent = event as { error: { name: string; message: string; isRetryable: boolean } }\n lines.push(` Error: ${errorEvent.error.name}`)\n lines.push(` Message: ${errorEvent.error.message}`)\n lines.push(` Retryable: ${errorEvent.error.isRetryable}`)\n }\n if (event.type === \"stopRunByDelegate\" && \"checkpoint\" in event) {\n const delegateEvent = event as {\n checkpoint: { delegateTo?: Array<{ expert: { key: string }; query: string }> }\n }\n for (const d of delegateEvent.checkpoint.delegateTo ?? []) {\n lines.push(` Delegate to: ${d.expert.key}`)\n }\n }\n if (event.type === \"completeRun\" && \"text\" in event) {\n const completeEvent = event as { text: string }\n const preview =\n completeEvent.text.length > 80 ? `${completeEvent.text.slice(0, 80)}...` : completeEvent.text\n lines.push(` Result: ${preview}`)\n }\n if (event.type === \"retry\" && \"reason\" in event) {\n const retryEvent = event as { reason: string }\n lines.push(` Reason: ${retryEvent.reason}`)\n }\n lines.push(\"\")\n return lines\n}\n\nfunction extractTextContent(contents: unknown[]): string {\n if (!Array.isArray(contents)) return \"\"\n for (const c of contents) {\n if (\n typeof c === \"object\" &&\n c !== null &&\n \"type\" in c &&\n c.type === \"textPart\" &&\n \"text\" in c\n ) {\n return String(c.text)\n }\n }\n return \"\"\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts)\n return date\n .toISOString()\n .replace(\"T\", \" \")\n .replace(/\\.\\d{3}Z$/, \"\")\n}\n\nfunction formatTime(ts: number): string {\n const date = new Date(ts)\n return date.toISOString().slice(11, 19)\n}\n","import { Command } from \"commander\"\nimport {\n applyFilters,\n createLogDataFetcher,\n createStorageAdapter,\n createSummary,\n type FilterOptions,\n type FormatterOptions,\n formatJson,\n formatTerminal,\n type LogCommandOptions,\n type LogOutput,\n parseFilterExpression,\n parseStepFilter,\n} from \"./lib/log/index.js\"\n\nconst DEFAULT_TAKE = 100\nconst DEFAULT_OFFSET = 0\n\nfunction parsePositiveInt(val: string, optionName: string): number {\n const parsed = parseInt(val, 10)\n if (Number.isNaN(parsed)) {\n throw new Error(`Invalid value for ${optionName}: \"${val}\" is not a valid number`)\n }\n if (parsed < 0) {\n throw new Error(`Invalid value for ${optionName}: \"${val}\" must be non-negative`)\n }\n return parsed\n}\n\nexport const logCommand = new Command()\n .command(\"log\")\n .description(\"View execution history and events for debugging\")\n .option(\"--job <jobId>\", \"Show events for a specific job\")\n .option(\"--run <runId>\", \"Show events for a specific run\")\n .option(\"--checkpoint <checkpointId>\", \"Show checkpoint details\")\n .option(\"--step <step>\", \"Filter by step number (e.g., 5, >5, 1-10)\")\n .option(\"--type <type>\", \"Filter by event type\")\n .option(\"--errors\", \"Show error-related events only\")\n .option(\"--tools\", \"Show tool call events only\")\n .option(\"--delegations\", \"Show delegation events only\")\n .option(\"--filter <expression>\", \"Simple filter expression\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--pretty\", \"Pretty-print JSON output\")\n .option(\"--verbose\", \"Show full event details\")\n .option(\n \"--take <n>\",\n `Number of events to display (default: ${DEFAULT_TAKE}, use 0 for all)`,\n (val) => parsePositiveInt(val, \"--take\"),\n )\n .option(\"--offset <n>\", `Number of events to skip (default: ${DEFAULT_OFFSET})`, (val) =>\n parsePositiveInt(val, \"--offset\"),\n )\n .option(\"--context <n>\", \"Include N events before/after matches\", (val) =>\n parsePositiveInt(val, \"--context\"),\n )\n .option(\"--messages\", \"Show message history for checkpoint\")\n .option(\"--summary\", \"Show summarized view\")\n .action(async (options: LogCommandOptions) => {\n try {\n const storagePath = process.env.PERSTACK_STORAGE_PATH ?? `${process.cwd()}/perstack`\n const adapter = createStorageAdapter(storagePath)\n const fetcher = createLogDataFetcher(adapter)\n const filterOptions = buildFilterOptions(options)\n const formatterOptions = buildFormatterOptions(options)\n const output = await buildOutput(fetcher, options, filterOptions, storagePath)\n if (!output) {\n console.log(\"No data found\")\n return\n }\n const formatted = formatterOptions.json\n ? formatJson(output, formatterOptions)\n : formatTerminal(output, formatterOptions)\n console.log(formatted)\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`)\n } else {\n console.error(\"An unexpected error occurred\")\n }\n process.exit(1)\n }\n })\n\nfunction buildFilterOptions(options: LogCommandOptions): FilterOptions {\n const filterOptions: FilterOptions = {}\n if (options.step) {\n filterOptions.step = parseStepFilter(options.step)\n }\n if (options.type) {\n filterOptions.type = options.type\n }\n if (options.errors) {\n filterOptions.errors = true\n }\n if (options.tools) {\n filterOptions.tools = true\n }\n if (options.delegations) {\n filterOptions.delegations = true\n }\n if (options.filter) {\n filterOptions.filterExpression = parseFilterExpression(options.filter)\n }\n // --take 0 means no limit (show all)\n const take = options.take ?? DEFAULT_TAKE\n if (take > 0) {\n filterOptions.take = take\n }\n filterOptions.offset = options.offset ?? DEFAULT_OFFSET\n if (options.context !== undefined) {\n filterOptions.context = options.context\n }\n return filterOptions\n}\n\nfunction buildFormatterOptions(options: LogCommandOptions): FormatterOptions {\n return {\n json: options.json ?? false,\n pretty: options.pretty ?? false,\n verbose: options.verbose ?? false,\n messages: options.messages ?? false,\n summary: options.summary ?? false,\n }\n}\n\nasync function buildOutput(\n fetcher: ReturnType<typeof createLogDataFetcher>,\n options: LogCommandOptions,\n filterOptions: FilterOptions,\n storagePath: string,\n): Promise<LogOutput | null> {\n if (options.checkpoint) {\n const jobId = options.job\n if (!jobId) {\n const latestJob = await fetcher.getLatestJob()\n if (!latestJob) {\n return null\n }\n const checkpoint = await fetcher.getCheckpoint(latestJob.id, options.checkpoint)\n const events = await fetcher.getEvents(latestJob.id, checkpoint.runId)\n const result = applyFilters(events, filterOptions)\n return {\n job: latestJob,\n checkpoint,\n events: result.events,\n summary: createSummary(result.events),\n isLatestJob: true,\n storagePath,\n totalEventsBeforeLimit: result.totalBeforePagination,\n matchedAfterPagination: result.matchedAfterPagination,\n }\n }\n const job = await fetcher.getJob(jobId)\n if (!job) {\n return null\n }\n const checkpoint = await fetcher.getCheckpoint(jobId, options.checkpoint)\n const events = await fetcher.getEvents(jobId, checkpoint.runId)\n const result = applyFilters(events, filterOptions)\n return {\n job,\n checkpoint,\n events: result.events,\n summary: createSummary(result.events),\n storagePath,\n totalEventsBeforeLimit: result.totalBeforePagination,\n matchedAfterPagination: result.matchedAfterPagination,\n }\n }\n if (options.run) {\n const jobId = options.job\n if (!jobId) {\n const latestJob = await fetcher.getLatestJob()\n if (!latestJob) {\n return null\n }\n const events = await fetcher.getEvents(latestJob.id, options.run)\n const result = applyFilters(events, filterOptions)\n return {\n job: latestJob,\n events: result.events,\n summary: createSummary(result.events),\n isLatestJob: true,\n storagePath,\n totalEventsBeforeLimit: result.totalBeforePagination,\n matchedAfterPagination: result.matchedAfterPagination,\n }\n }\n const job = await fetcher.getJob(jobId)\n if (!job) {\n return null\n }\n const events = await fetcher.getEvents(jobId, options.run)\n const result = applyFilters(events, filterOptions)\n return {\n job,\n events: result.events,\n summary: createSummary(result.events),\n storagePath,\n totalEventsBeforeLimit: result.totalBeforePagination,\n matchedAfterPagination: result.matchedAfterPagination,\n }\n }\n if (options.job) {\n const job = await fetcher.getJob(options.job)\n if (!job) {\n return null\n }\n const events = await fetcher.getAllEventsForJob(options.job)\n const result = applyFilters(events, filterOptions)\n const checkpoints = await fetcher.getCheckpoints(options.job)\n return {\n job,\n checkpoints,\n events: result.events,\n summary: createSummary(result.events),\n storagePath,\n totalEventsBeforeLimit: result.totalBeforePagination,\n matchedAfterPagination: result.matchedAfterPagination,\n }\n }\n const latestJob = await fetcher.getLatestJob()\n if (!latestJob) {\n return null\n }\n const events = await fetcher.getAllEventsForJob(latestJob.id)\n const result = applyFilters(events, filterOptions)\n return {\n job: latestJob,\n events: result.events,\n summary: createSummary(result.events),\n isLatestJob: true,\n storagePath,\n totalEventsBeforeLimit: result.totalBeforePagination,\n matchedAfterPagination: result.matchedAfterPagination,\n }\n}\n","import { createId } from \"@paralleldrive/cuid2\"\nimport type { RunEvent, RuntimeEvent } from \"@perstack/core\"\nimport {\n createFilteredEventListener,\n parseWithFriendlyError,\n runCommandInputSchema,\n validateEventFilter,\n} from \"@perstack/core\"\nimport {\n createInitialJob,\n defaultRetrieveCheckpoint,\n defaultStoreCheckpoint,\n defaultStoreEvent,\n retrieveJob,\n storeJob,\n} from \"@perstack/filesystem-storage\"\nimport { findLockfile, loadLockfile, run as perstackRun } from \"@perstack/runtime\"\nimport { Command } from \"commander\"\nimport { resolveRunContext } from \"./lib/context.js\"\nimport {\n parseInteractiveToolCallResult,\n parseInteractiveToolCallResultJson,\n} from \"./lib/interactive.js\"\n\nconst defaultEventListener = (event: RunEvent | RuntimeEvent) => console.log(JSON.stringify(event))\n\nexport const runCommand = new Command()\n .command(\"run\")\n .description(\"Run Perstack with JSON output\")\n .argument(\"<expertKey>\", \"Expert key to run\")\n .argument(\"<query>\", \"Query to run\")\n .option(\"--config <configPath>\", \"Path to perstack.toml config file\")\n .option(\"--provider <provider>\", \"Provider to use\")\n .option(\"--model <model>\", \"Model to use\")\n .option(\n \"--reasoning-budget <budget>\",\n \"Reasoning budget for native LLM reasoning (minimal, low, medium, high, or token count)\",\n )\n .option(\n \"--max-steps <maxSteps>\",\n \"Maximum number of steps to run, default is undefined (no limit)\",\n )\n .option(\"--max-retries <maxRetries>\", \"Maximum number of generation retries, default is 5\")\n .option(\n \"--timeout <timeout>\",\n \"Timeout for each generation in milliseconds, default is 300000 (5 minutes)\",\n )\n .option(\"--job-id <jobId>\", \"Job ID for identifying the job\")\n .option(\n \"--env-path <path>\",\n \"Path to the environment file (can be specified multiple times), default is .env and .env.local\",\n (value: string, previous: string[]) => previous.concat(value),\n [] as string[],\n )\n .option(\"--verbose\", \"Enable verbose logging\")\n .option(\"--continue\", \"Continue the most recent job with new query\")\n .option(\"--continue-job <jobId>\", \"Continue the specified job with new query\")\n .option(\n \"--resume-from <checkpointId>\",\n \"Resume from a specific checkpoint (requires --continue or --continue-job)\",\n )\n .option(\"-i, --interactive-tool-call-result\", \"Query is interactive tool call result\")\n .option(\n \"--filter <types>\",\n \"Filter events by type (comma-separated, e.g., completeRun,stopRunByError)\",\n )\n .action(async (expertKey, query, options) => {\n const input = parseWithFriendlyError(runCommandInputSchema, { expertKey, query, options })\n\n // Validate and apply event filter if specified\n let eventListener = defaultEventListener\n if (input.options.filter && input.options.filter.length > 0) {\n try {\n const validatedTypes = validateEventFilter(input.options.filter)\n const allowedTypes = new Set(validatedTypes)\n eventListener = createFilteredEventListener(defaultEventListener, allowedTypes)\n } catch (error) {\n if (error instanceof Error) {\n console.error(error.message)\n } else {\n console.error(error)\n }\n process.exit(1)\n }\n }\n\n try {\n const { perstackConfig, checkpoint, env, providerConfig, model, experts } =\n await resolveRunContext({\n configPath: input.options.config,\n provider: input.options.provider,\n model: input.options.model,\n envPath: input.options.envPath,\n continue: input.options.continue,\n continueJob: input.options.continueJob,\n resumeFrom: input.options.resumeFrom,\n expertKey: input.expertKey,\n })\n\n // Load lockfile if present\n const lockfilePath = findLockfile()\n const lockfile = lockfilePath ? (loadLockfile(lockfilePath) ?? undefined) : undefined\n\n // Generate job and run IDs\n const jobId = checkpoint?.jobId ?? input.options.jobId ?? createId()\n const runId = createId()\n\n await perstackRun(\n {\n setting: {\n jobId,\n runId,\n expertKey: input.expertKey,\n input: input.options.interactiveToolCallResult\n ? (parseInteractiveToolCallResultJson(input.query) ??\n (checkpoint\n ? parseInteractiveToolCallResult(input.query, checkpoint)\n : { text: input.query }))\n : { text: input.query },\n experts,\n model,\n providerConfig,\n reasoningBudget: input.options.reasoningBudget ?? perstackConfig.reasoningBudget,\n maxSteps: input.options.maxSteps ?? perstackConfig.maxSteps,\n maxRetries: input.options.maxRetries ?? perstackConfig.maxRetries,\n timeout: input.options.timeout ?? perstackConfig.timeout,\n perstackApiBaseUrl: perstackConfig.perstackApiBaseUrl,\n perstackApiKey: env.PERSTACK_API_KEY,\n perstackBaseSkillCommand: perstackConfig.perstackBaseSkillCommand,\n env,\n proxyUrl: process.env.PERSTACK_PROXY_URL,\n verbose: input.options.verbose,\n },\n checkpoint,\n },\n {\n eventListener,\n storeCheckpoint: defaultStoreCheckpoint,\n storeEvent: defaultStoreEvent,\n retrieveCheckpoint: defaultRetrieveCheckpoint,\n storeJob,\n retrieveJob,\n createJob: createInitialJob,\n lockfile,\n },\n )\n } catch (error) {\n if (error instanceof Error) {\n console.error(error.message)\n } else {\n console.error(error)\n }\n process.exit(1)\n }\n })\n","#!/usr/bin/env node\n\nimport { Command } from \"commander\"\nimport packageJson from \"../package.json\" with { type: \"json\" }\nimport { installCommand } from \"../src/install.js\"\nimport { logCommand } from \"../src/log.js\"\nimport { runCommand } from \"../src/run.js\"\nimport { startCommand } from \"../src/start.js\"\n\nconst program = new Command()\n .name(packageJson.name)\n .description(packageJson.description)\n .version(packageJson.version)\n .addCommand(startCommand)\n .addCommand(runCommand)\n .addCommand(logCommand)\n .addCommand(installCommand)\nprogram.parse()\n"]}
1
+ {"version":3,"sources":["../../package.json","../../src/install.ts","../../src/lib/log/data-fetcher.ts","../../src/lib/log/filter.ts","../../src/lib/log/formatter.ts","../../src/log.ts","../../src/run.ts","../../bin/cli.ts"],"names":["path","Command","latestJob","checkpoint","events","result","perstackRun"],"mappings":"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","file":"cli.js","sourcesContent":["{\n \"name\": \"perstack\",\n \"version\": \"0.0.82\",\n \"description\": \"PerStack CLI\",\n \"author\": \"Wintermute Technologies, Inc.\",\n \"license\": \"Apache-2.0\",\n \"type\": \"module\",\n \"exports\": {\n \"./start\": \"./src/start.ts\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"exports\": {\n \"./start\": \"./dist/src/start.js\"\n },\n \"bin\": {\n \"perstack\": \"dist/bin/cli.js\"\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"clean\": \"rm -rf dist\",\n \"build\": \"pnpm run clean && tsup --config ./tsup.config.ts\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@paralleldrive/cuid2\": \"^3.0.6\",\n \"@perstack/api-client\": \"^0.0.54\",\n \"@perstack/core\": \"workspace:*\",\n \"@perstack/react\": \"workspace:*\",\n \"@perstack/runtime\": \"workspace:*\",\n \"commander\": \"^14.0.2\",\n \"dotenv\": \"^17.2.3\",\n \"ink\": \"^6.6.0\",\n \"react\": \"^19.2.3\",\n \"smol-toml\": \"^1.6.0\"\n },\n \"devDependencies\": {\n \"@perstack/filesystem-storage\": \"workspace:*\",\n \"@perstack/tui-components\": \"workspace:*\",\n \"@tsconfig/node22\": \"^22.0.5\",\n \"@types/node\": \"^25.0.10\",\n \"@types/react\": \"^19.2.9\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.0.18\"\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n }\n}\n","import { readFile, writeFile } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { createApiClient } from \"@perstack/api-client\"\nimport {\n defaultPerstackApiBaseUrl,\n type Expert,\n expertSchema,\n type Lockfile,\n type LockfileExpert,\n type PerstackConfig,\n type RuntimeVersion,\n type Skill,\n} from \"@perstack/core\"\nimport { collectToolDefinitionsForExpert } from \"@perstack/runtime\"\nimport { Command } from \"commander\"\nimport TOML from \"smol-toml\"\nimport { getEnv } from \"./lib/get-env.js\"\nimport { getPerstackConfig } from \"./lib/perstack-toml.js\"\n\nasync function findConfigPath(configPath?: string): Promise<string> {\n if (configPath) {\n return path.resolve(process.cwd(), configPath)\n }\n return await findConfigPathRecursively(process.cwd())\n}\n\nasync function findConfigPathRecursively(cwd: string): Promise<string> {\n const configPath = path.resolve(cwd, \"perstack.toml\")\n try {\n await readFile(configPath)\n return configPath\n } catch {\n if (cwd === path.parse(cwd).root) {\n throw new Error(\"perstack.toml not found. Create one or specify --config path.\")\n }\n return await findConfigPathRecursively(path.dirname(cwd))\n }\n}\n\ntype PublishedExpertData = {\n name: string\n version: string\n description?: string\n instruction: string\n minRuntimeVersion?: RuntimeVersion\n skills?: Record<\n string,\n | {\n type: \"mcpStdioSkill\"\n name: string\n description: string\n rule?: string\n pick?: string[]\n omit?: string[]\n command: \"npx\" | \"uvx\"\n packageName: string\n requiredEnv?: string[]\n }\n | {\n type: \"mcpSseSkill\"\n name: string\n description: string\n rule?: string\n pick?: string[]\n omit?: string[]\n endpoint: string\n }\n | {\n type: \"interactiveSkill\"\n name: string\n description: string\n rule?: string\n tools: Record<string, { description: string; inputJsonSchema: string }>\n }\n >\n delegates?: string[]\n tags?: string[]\n}\n\nfunction toRuntimeExpert(key: string, expert: PublishedExpertData): Expert {\n const skills: Record<string, Skill> = Object.fromEntries(\n Object.entries(expert.skills ?? {}).map(([name, skill]) => {\n switch (skill.type) {\n case \"mcpStdioSkill\":\n return [\n name,\n {\n type: skill.type,\n name,\n description: skill.description,\n rule: skill.rule,\n pick: skill.pick ?? [],\n omit: skill.omit ?? [],\n command: skill.command,\n packageName: skill.packageName,\n requiredEnv: skill.requiredEnv ?? [],\n lazyInit: false,\n },\n ]\n case \"mcpSseSkill\":\n return [\n name,\n {\n type: skill.type,\n name,\n description: skill.description,\n rule: skill.rule,\n pick: skill.pick ?? [],\n omit: skill.omit ?? [],\n endpoint: skill.endpoint,\n lazyInit: false,\n },\n ]\n case \"interactiveSkill\":\n return [\n name,\n {\n type: skill.type,\n name,\n description: skill.description,\n rule: skill.rule,\n tools: Object.fromEntries(\n Object.entries(skill.tools).map(([toolName, tool]) => [\n toolName,\n {\n name: toolName,\n description: tool.description,\n inputSchema: JSON.parse(tool.inputJsonSchema),\n },\n ]),\n ),\n },\n ]\n default: {\n throw new Error(`Unknown skill type: ${(skill as { type: string }).type}`)\n }\n }\n }),\n )\n return {\n key,\n name: expert.name,\n version: expert.version,\n minRuntimeVersion: expert.minRuntimeVersion ?? \"v1.0\",\n description: expert.description ?? \"\",\n instruction: expert.instruction,\n skills,\n delegates: expert.delegates ?? [],\n tags: expert.tags ?? [],\n }\n}\n\nfunction configExpertToExpert(\n key: string,\n configExpert: NonNullable<PerstackConfig[\"experts\"]>[string],\n): Expert {\n return expertSchema.parse({\n key,\n name: key,\n version: configExpert.version ?? \"1.0.0\",\n description: configExpert.description,\n instruction: configExpert.instruction,\n skills: configExpert.skills,\n delegates: configExpert.delegates,\n tags: configExpert.tags,\n providerTools: configExpert.providerTools,\n providerSkills: configExpert.providerSkills,\n providerToolOptions: configExpert.providerToolOptions,\n })\n}\n\nasync function resolveAllExperts(\n config: PerstackConfig,\n env: Record<string, string>,\n): Promise<Record<string, Expert>> {\n const experts: Record<string, Expert> = {}\n for (const [key, configExpert] of Object.entries(config.experts ?? {})) {\n experts[key] = configExpertToExpert(key, configExpert)\n }\n const toResolve = new Set<string>()\n for (const expert of Object.values(experts)) {\n for (const delegateKey of expert.delegates) {\n if (!experts[delegateKey]) {\n toResolve.add(delegateKey)\n }\n }\n }\n if (toResolve.size === 0) {\n return experts\n }\n const apiKey = env.PERSTACK_API_KEY\n if (!apiKey) {\n throw new Error(\"PERSTACK_API_KEY is required to resolve remote delegates\")\n }\n const client = createApiClient({\n baseUrl: config.perstackApiBaseUrl ?? defaultPerstackApiBaseUrl,\n apiKey,\n })\n while (toResolve.size > 0) {\n const delegateKey = toResolve.values().next().value\n if (!delegateKey) break\n toResolve.delete(delegateKey)\n if (experts[delegateKey]) continue\n const result = await client.experts.get(delegateKey)\n if (!result.ok) {\n throw new Error(`Failed to resolve delegate \"${delegateKey}\": ${result.error.message}`)\n }\n const publishedExpert = result.data.data.definition.experts[delegateKey]\n if (!publishedExpert) {\n throw new Error(`Expert \"${delegateKey}\" not found in API response`)\n }\n experts[delegateKey] = toRuntimeExpert(delegateKey, publishedExpert)\n for (const nestedDelegate of publishedExpert.delegates ?? []) {\n if (!experts[nestedDelegate]) {\n toResolve.add(nestedDelegate)\n }\n }\n }\n return experts\n}\n\nfunction expertToLockfileExpert(\n expert: Expert,\n toolDefinitions: {\n skillName: string\n name: string\n description?: string\n inputSchema: Record<string, unknown>\n }[],\n): LockfileExpert {\n return {\n key: expert.key,\n name: expert.name,\n version: expert.version,\n description: expert.description,\n instruction: expert.instruction,\n skills: expert.skills,\n delegates: expert.delegates,\n tags: expert.tags,\n toolDefinitions,\n }\n}\n\nfunction generateLockfileToml(lockfile: Lockfile): string {\n return TOML.stringify(lockfile)\n}\n\nexport const installCommand = new Command()\n .command(\"install\")\n .description(\"Generate perstack.lock with tool definitions for faster startup\")\n .option(\"--config <configPath>\", \"Path to perstack.toml config file\")\n .option(\n \"--env-path <path>\",\n \"Path to the environment file (can be specified multiple times)\",\n (value: string, previous: string[]) => previous.concat(value),\n [] as string[],\n )\n .action(async (options) => {\n try {\n const configPath = await findConfigPath(options.config)\n const config = await getPerstackConfig(options.config)\n const envPath =\n options.envPath && options.envPath.length > 0\n ? options.envPath\n : (config.envPath ?? [\".env\", \".env.local\"])\n const env = getEnv(envPath)\n console.log(\"Resolving experts...\")\n const experts = await resolveAllExperts(config, env)\n console.log(`Found ${Object.keys(experts).length} expert(s)`)\n const lockfileExperts: Record<string, LockfileExpert> = {}\n for (const [key, expert] of Object.entries(experts)) {\n console.log(`Collecting tool definitions for ${key}...`)\n const toolDefinitions = await collectToolDefinitionsForExpert(expert, {\n env,\n perstackBaseSkillCommand: config.perstackBaseSkillCommand,\n })\n console.log(` Found ${toolDefinitions.length} tool(s)`)\n lockfileExperts[key] = expertToLockfileExpert(expert, toolDefinitions)\n }\n const lockfile: Lockfile = {\n version: \"1\",\n generatedAt: Date.now(),\n configPath: path.basename(configPath),\n experts: lockfileExperts,\n }\n const lockfilePath = path.join(path.dirname(configPath), \"perstack.lock\")\n const lockfileContent = generateLockfileToml(lockfile)\n await writeFile(lockfilePath, lockfileContent, \"utf-8\")\n console.log(`Generated ${lockfilePath}`)\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`)\n } else {\n console.error(error)\n }\n process.exit(1)\n }\n })\n","import { existsSync, readdirSync, statSync } from \"node:fs\"\nimport path from \"node:path\"\nimport type { Checkpoint, Job, RunEvent, RunSetting } from \"@perstack/core\"\nimport {\n defaultRetrieveCheckpoint,\n getAllJobs,\n getAllRuns,\n getCheckpointsByJobId,\n getEventContents,\n getRunIdsByJobId,\n retrieveJob,\n} from \"@perstack/filesystem-storage\"\n\nexport interface LogDataFetcher {\n getJob(jobId: string): Promise<Job | undefined>\n getLatestJob(): Promise<Job | undefined>\n getRuns(jobId: string): Promise<RunSetting[]>\n getCheckpoints(jobId: string): Promise<Checkpoint[]>\n getCheckpoint(jobId: string, checkpointId: string): Promise<Checkpoint>\n getEvents(jobId: string, runId: string): Promise<RunEvent[]>\n getAllEventsForJob(jobId: string): Promise<RunEvent[]>\n}\n\nexport interface StorageAdapter {\n getAllJobs(): Promise<Job[]>\n retrieveJob(jobId: string): Promise<Job | undefined>\n getCheckpointsByJobId(jobId: string): Promise<Checkpoint[]>\n retrieveCheckpoint(jobId: string, checkpointId: string): Promise<Checkpoint>\n getEventContents(jobId: string, runId: string, maxStep?: number): Promise<RunEvent[]>\n getAllRuns(): Promise<RunSetting[]>\n getJobIds(): string[]\n getBasePath(): string\n}\n\nexport function createLogDataFetcher(storage: StorageAdapter): LogDataFetcher {\n return {\n async getJob(jobId: string): Promise<Job | undefined> {\n // First try to get from storage\n const job = await storage.retrieveJob(jobId)\n if (job) return job\n // Fallback: construct minimal job from checkpoints\n const checkpoints = await storage.getCheckpointsByJobId(jobId)\n if (checkpoints.length === 0) return undefined\n const firstCheckpoint = checkpoints[0]\n const lastCheckpoint = checkpoints[checkpoints.length - 1]\n return {\n id: jobId,\n coordinatorExpertKey: firstCheckpoint.expert.key,\n runtimeVersion: \"v1.0\",\n totalSteps: lastCheckpoint.stepNumber,\n usage: lastCheckpoint.usage,\n startedAt: getJobDirMtime(storage.getBasePath(), jobId),\n finishedAt: Date.now(),\n status: lastCheckpoint.status === \"completed\" ? \"completed\" : \"running\",\n }\n },\n\n async getLatestJob(): Promise<Job | undefined> {\n // First try standard storage\n const jobs = await storage.getAllJobs()\n if (jobs.length > 0) return jobs[0]\n // Fallback: scan job directories\n const jobIds = storage.getJobIds()\n if (jobIds.length === 0) return undefined\n // Sort by directory modification time (newest first)\n const basePath = storage.getBasePath()\n const sortedJobIds = jobIds\n .map((id) => ({ id, mtime: getJobDirMtime(basePath, id) }))\n .sort((a, b) => b.mtime - a.mtime)\n const latestJobId = sortedJobIds[0].id\n return this.getJob(latestJobId)\n },\n\n async getRuns(jobId: string): Promise<RunSetting[]> {\n const runs = await storage.getAllRuns()\n const jobRuns = runs.filter((r) => r.jobId === jobId)\n if (jobRuns.length > 0) return jobRuns\n // Fallback: extract unique runIds from checkpoints and return minimal run info\n const checkpoints = await storage.getCheckpointsByJobId(jobId)\n const runIds = [...new Set(checkpoints.map((c) => c.runId))]\n // Return minimal objects with just jobId and runId for event retrieval\n return runIds.map((runId) => ({ jobId, runId }) as unknown as RunSetting)\n },\n\n async getCheckpoints(jobId: string): Promise<Checkpoint[]> {\n return storage.getCheckpointsByJobId(jobId)\n },\n\n async getCheckpoint(jobId: string, checkpointId: string): Promise<Checkpoint> {\n return storage.retrieveCheckpoint(jobId, checkpointId)\n },\n\n async getEvents(jobId: string, runId: string): Promise<RunEvent[]> {\n return storage.getEventContents(jobId, runId)\n },\n\n async getAllEventsForJob(jobId: string): Promise<RunEvent[]> {\n const runs = await this.getRuns(jobId)\n const allEvents: RunEvent[] = []\n for (const run of runs) {\n const events = await storage.getEventContents(jobId, run.runId)\n allEvents.push(...events)\n }\n return allEvents.sort((a, b) => a.timestamp - b.timestamp)\n },\n }\n}\n\nfunction getJobDirMtime(basePath: string, jobId: string): number {\n try {\n const jobDir = path.join(basePath, \"jobs\", jobId)\n const stats = statSync(jobDir)\n return stats.mtimeMs\n } catch {\n return Date.now()\n }\n}\n\n/**\n * Create a storage adapter using filesystem helper functions directly.\n */\nexport function createStorageAdapter(basePath: string): StorageAdapter {\n return {\n getAllJobs: async () => getAllJobs(),\n retrieveJob: async (jobId) => retrieveJob(jobId),\n getCheckpointsByJobId: async (jobId) => getCheckpointsByJobId(jobId),\n retrieveCheckpoint: async (jobId, checkpointId) =>\n defaultRetrieveCheckpoint(jobId, checkpointId),\n getEventContents: async (jobId, runId, maxStep) => getEventContents(jobId, runId, maxStep),\n getAllRuns: async () => getAllRuns(),\n getJobIds: () => {\n const jobsDir = path.join(basePath, \"jobs\")\n if (!existsSync(jobsDir)) return []\n return readdirSync(jobsDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n },\n getBasePath: () => basePath,\n }\n}\n","import type { RunEvent } from \"@perstack/core\"\nimport type { FilterCondition, FilterOptions, StepFilter } from \"./types.js\"\n\nexport const ERROR_EVENT_TYPES = new Set([\"stopRunByError\", \"retry\"])\nexport const TOOL_EVENT_TYPES = new Set([\n \"callTools\",\n \"resolveToolResults\",\n \"stopRunByInteractiveTool\",\n])\nexport const DELEGATION_EVENT_TYPES = new Set([\"stopRunByDelegate\"])\n\nexport function parseStepFilter(step: string): StepFilter {\n const trimmed = step.trim()\n const rangeMatch = trimmed.match(/^(\\d+)-(\\d+)$/)\n if (rangeMatch) {\n const min = Number(rangeMatch[1])\n const max = Number(rangeMatch[2])\n if (min > max) {\n throw new Error(`Invalid step range: ${step} (min ${min} > max ${max})`)\n }\n return { type: \"range\", min, max }\n }\n const gteMatch = trimmed.match(/^>=(\\d+)$/)\n if (gteMatch) {\n return { type: \"gte\", value: Number(gteMatch[1]) }\n }\n const gtMatch = trimmed.match(/^>(\\d+)$/)\n if (gtMatch) {\n return { type: \"gt\", value: Number(gtMatch[1]) }\n }\n const lteMatch = trimmed.match(/^<=(\\d+)$/)\n if (lteMatch) {\n return { type: \"lte\", value: Number(lteMatch[1]) }\n }\n const ltMatch = trimmed.match(/^<(\\d+)$/)\n if (ltMatch) {\n return { type: \"lt\", value: Number(ltMatch[1]) }\n }\n const exactMatch = trimmed.match(/^(\\d+)$/)\n if (exactMatch) {\n return { type: \"exact\", value: Number(exactMatch[1]) }\n }\n throw new Error(`Invalid step filter: ${step}`)\n}\n\nexport function parseFilterExpression(expression: string): FilterCondition {\n const trimmed = expression.trim()\n const operatorMatch = trimmed.match(/^\\.([a-zA-Z_][\\w.[\\]]*)\\s*(==|!=|>=|<=|>|<)\\s*(.+)$/)\n if (!operatorMatch) {\n throw new Error(`Invalid filter expression: ${expression}`)\n }\n const [, fieldPath, operator, rawValue] = operatorMatch\n const trimmedValue = rawValue.trim()\n if (trimmedValue === \"\") {\n throw new Error(`Missing value in filter expression: ${expression}`)\n }\n const field = parseFieldPath(fieldPath)\n const value = parseValue(trimmedValue)\n return { field, operator: operator as FilterCondition[\"operator\"], value }\n}\n\nfunction parseFieldPath(path: string): string[] {\n const parts: string[] = []\n let current = \"\"\n let i = 0\n while (i < path.length) {\n if (path[i] === \".\") {\n if (current) {\n parts.push(current)\n current = \"\"\n }\n i++\n } else if (path[i] === \"[\" && path[i + 1] === \"]\") {\n if (current) {\n parts.push(current)\n current = \"\"\n }\n parts.push(\"*\")\n i += 2\n } else {\n current += path[i]\n i++\n }\n }\n if (current) {\n parts.push(current)\n }\n return parts\n}\n\nfunction parseValue(raw: string): string | number | boolean {\n if (raw === \"true\") return true\n if (raw === \"false\") return false\n if (raw.startsWith('\"') && raw.endsWith('\"')) {\n return raw.slice(1, -1)\n }\n if (raw.startsWith(\"'\") && raw.endsWith(\"'\")) {\n return raw.slice(1, -1)\n }\n const num = Number(raw)\n if (!Number.isNaN(num)) {\n return num\n }\n return raw\n}\n\nexport function evaluateCondition(event: RunEvent, condition: FilterCondition): boolean {\n const { field, operator, value } = condition\n const actualValue = getFieldValue(event, field)\n if (actualValue === undefined) {\n return false\n }\n if (Array.isArray(actualValue)) {\n return actualValue.some((v) => compareValues(v, operator, value))\n }\n return compareValues(actualValue, operator, value)\n}\n\nfunction getFieldValue(obj: unknown, path: string[]): unknown {\n let current: unknown = obj\n for (let i = 0; i < path.length; i++) {\n const segment = path[i]\n if (current === null || current === undefined) {\n return undefined\n }\n if (segment === \"*\") {\n if (!Array.isArray(current)) {\n return undefined\n }\n const remainingPath = path.slice(i + 1)\n if (remainingPath.length === 0) {\n return current\n }\n return current\n .map((item) => getFieldValue(item, remainingPath))\n .filter((v) => v !== undefined)\n }\n if (typeof current !== \"object\") {\n return undefined\n }\n current = (current as Record<string, unknown>)[segment]\n }\n return current\n}\n\nfunction compareValues(\n actual: unknown,\n operator: FilterCondition[\"operator\"],\n expected: string | number | boolean,\n): boolean {\n switch (operator) {\n case \"==\":\n return actual === expected\n case \"!=\":\n return actual !== expected\n case \">\":\n return typeof actual === \"number\" && typeof expected === \"number\" && actual > expected\n case \">=\":\n return typeof actual === \"number\" && typeof expected === \"number\" && actual >= expected\n case \"<\":\n return typeof actual === \"number\" && typeof expected === \"number\" && actual < expected\n case \"<=\":\n return typeof actual === \"number\" && typeof expected === \"number\" && actual <= expected\n default:\n return false\n }\n}\n\nfunction matchesStepFilter(stepNumber: number, filter: StepFilter): boolean {\n switch (filter.type) {\n case \"exact\":\n return stepNumber === filter.value\n case \"gt\":\n return filter.value !== undefined && stepNumber > filter.value\n case \"gte\":\n return filter.value !== undefined && stepNumber >= filter.value\n case \"lt\":\n return filter.value !== undefined && stepNumber < filter.value\n case \"lte\":\n return filter.value !== undefined && stepNumber <= filter.value\n case \"range\":\n return (\n filter.min !== undefined &&\n filter.max !== undefined &&\n stepNumber >= filter.min &&\n stepNumber <= filter.max\n )\n default:\n return true\n }\n}\n\nexport type ApplyFiltersResult = {\n events: RunEvent[]\n totalBeforePagination: number\n matchedAfterPagination: number\n}\n\nexport function applyFilters(events: RunEvent[], options: FilterOptions): ApplyFiltersResult {\n let filtered = events\n if (options.step) {\n filtered = filtered.filter((e) => matchesStepFilter(e.stepNumber, options.step as StepFilter))\n }\n if (options.type) {\n filtered = filtered.filter((e) => e.type === options.type)\n }\n if (options.errors) {\n filtered = filtered.filter((e) => ERROR_EVENT_TYPES.has(e.type))\n }\n if (options.tools) {\n filtered = filtered.filter((e) => TOOL_EVENT_TYPES.has(e.type))\n }\n if (options.delegations) {\n filtered = filtered.filter((e) => DELEGATION_EVENT_TYPES.has(e.type))\n }\n if (options.filterExpression) {\n filtered = filtered.filter((e) =>\n evaluateCondition(e, options.filterExpression as FilterCondition),\n )\n }\n // Record total count before pagination\n const totalBeforePagination = filtered.length\n // Apply offset and take (pagination)\n const offset = options.offset ?? 0\n if (offset > 0) {\n filtered = filtered.slice(offset)\n }\n if (options.take !== undefined && options.take > 0) {\n filtered = filtered.slice(0, options.take)\n }\n // Record matched count after pagination (before context is added)\n const matchedAfterPagination = filtered.length\n // Add context events after pagination to preserve matched events\n if (options.context !== undefined && options.context > 0) {\n filtered = addContextEvents(events, filtered, options.context)\n }\n return { events: filtered, totalBeforePagination, matchedAfterPagination }\n}\n\nfunction addContextEvents(\n allEvents: RunEvent[],\n matchedEvents: RunEvent[],\n contextSize: number,\n): RunEvent[] {\n const matchedIds = new Set(matchedEvents.map((e) => e.id))\n const resultIds = new Set<string>()\n for (const event of matchedEvents) {\n const index = allEvents.findIndex((e) => e.id === event.id)\n if (index === -1) continue\n const start = Math.max(0, index - contextSize)\n const end = Math.min(allEvents.length - 1, index + contextSize)\n for (let i = start; i <= end; i++) {\n resultIds.add(allEvents[i].id)\n }\n }\n return allEvents.filter((e) => resultIds.has(e.id) || matchedIds.has(e.id))\n}\n","import type { Checkpoint, Job, RunEvent } from \"@perstack/core\"\nimport { DELEGATION_EVENT_TYPES, ERROR_EVENT_TYPES, TOOL_EVENT_TYPES } from \"./filter.js\"\nimport type { FormatterOptions, LogOutput, LogSummary } from \"./types.js\"\n\nexport function createSummary(events: RunEvent[]): LogSummary {\n if (events.length === 0) {\n return {\n totalEvents: 0,\n errorCount: 0,\n toolCallCount: 0,\n delegationCount: 0,\n }\n }\n const stepNumbers = events.map((e) => e.stepNumber)\n return {\n totalEvents: events.length,\n errorCount: events.filter((e) => ERROR_EVENT_TYPES.has(e.type)).length,\n toolCallCount: events.filter((e) => TOOL_EVENT_TYPES.has(e.type)).length,\n delegationCount: events.filter((e) => DELEGATION_EVENT_TYPES.has(e.type)).length,\n stepRange: { min: Math.min(...stepNumbers), max: Math.max(...stepNumbers) },\n }\n}\n\nexport function formatJson(output: LogOutput, options: FormatterOptions): string {\n const data: Record<string, unknown> = {\n job: output.job,\n events: output.events,\n summary: output.summary,\n }\n // Include optional fields when present\n if (output.checkpoint) {\n data.checkpoint = output.checkpoint\n }\n if (output.checkpoints && output.checkpoints.length > 0) {\n data.checkpoints = output.checkpoints\n }\n if (output.isLatestJob) {\n data.isLatestJob = true\n }\n if (output.storagePath) {\n data.storagePath = output.storagePath\n }\n if (output.totalEventsBeforeLimit !== undefined) {\n data.totalEventsBeforeLimit = output.totalEventsBeforeLimit\n }\n if (output.matchedAfterPagination !== undefined) {\n data.matchedAfterPagination = output.matchedAfterPagination\n }\n if (options.pretty) {\n return JSON.stringify(data, null, 2)\n }\n return JSON.stringify(data)\n}\n\nexport function formatTerminal(output: LogOutput, options: FormatterOptions): string {\n const lines: string[] = []\n // Show context information\n if (output.isLatestJob) {\n lines.push(\"(showing latest job)\")\n lines.push(\"\")\n }\n if (output.storagePath) {\n lines.push(`Storage: ${output.storagePath}`)\n lines.push(\"\")\n }\n if (output.job) {\n lines.push(...formatJobHeader(output.job))\n lines.push(\"\")\n }\n if (output.checkpoint && options.messages) {\n lines.push(...formatCheckpointWithMessages(output.checkpoint))\n lines.push(\"\")\n } else if (output.checkpoint) {\n lines.push(...formatCheckpointHeader(output.checkpoint))\n lines.push(\"\")\n }\n if (options.summary && output.summary) {\n lines.push(...formatSummarySection(output.summary))\n lines.push(\"\")\n }\n if (output.events.length > 0) {\n lines.push(\"Events:\")\n lines.push(\"─\".repeat(50))\n for (const event of output.events) {\n lines.push(...formatEvent(event, options.verbose))\n }\n lines.push(\"─\".repeat(50))\n // Show pagination info if events were truncated\n // Use matchedAfterPagination to compare with totalBeforeLimit, not events.length\n // (events.length may include context events which could exceed matchedAfterPagination)\n if (\n output.totalEventsBeforeLimit !== undefined &&\n output.matchedAfterPagination !== undefined &&\n output.totalEventsBeforeLimit > output.matchedAfterPagination\n ) {\n const contextNote =\n output.events.length > output.matchedAfterPagination\n ? ` (+${output.events.length - output.matchedAfterPagination} context)`\n : \"\"\n lines.push(\n `(showing ${output.matchedAfterPagination} of ${output.totalEventsBeforeLimit} matched events${contextNote})`,\n )\n lines.push(`Use --take and --offset to paginate, or --take 0 for all`)\n }\n } else if (output.totalEventsBeforeLimit !== undefined && output.totalEventsBeforeLimit > 0) {\n lines.push(`(${output.totalEventsBeforeLimit} events available, use --offset to view)`)\n }\n return lines.join(\"\\n\")\n}\n\nfunction formatJobHeader(job: Job): string[] {\n const lines: string[] = []\n lines.push(`Job: ${job.id} (${job.status})`)\n lines.push(`Expert: ${job.coordinatorExpertKey}`)\n lines.push(`Started: ${formatTimestamp(job.startedAt)}`)\n lines.push(`Steps: ${job.totalSteps}`)\n if (job.finishedAt) {\n lines.push(`Finished: ${formatTimestamp(job.finishedAt)}`)\n }\n return lines\n}\n\nfunction formatCheckpointHeader(checkpoint: Checkpoint): string[] {\n const lines: string[] = []\n lines.push(`Checkpoint: ${checkpoint.id}`)\n lines.push(`Status: ${checkpoint.status}`)\n lines.push(`Step: ${checkpoint.stepNumber}`)\n lines.push(`Expert: ${checkpoint.expert.key}`)\n return lines\n}\n\nfunction formatCheckpointWithMessages(checkpoint: Checkpoint): string[] {\n const lines: string[] = []\n lines.push(...formatCheckpointHeader(checkpoint))\n lines.push(\"\")\n lines.push(\"Messages:\")\n for (const msg of checkpoint.messages) {\n const content = extractTextContent(msg.contents)\n const preview = content.length > 100 ? `${content.slice(0, 100)}...` : content\n lines.push(` [${msg.type}] ${preview}`)\n }\n return lines\n}\n\nfunction formatSummarySection(summary: LogSummary): string[] {\n const lines: string[] = []\n lines.push(\"Summary:\")\n lines.push(` Total Events: ${summary.totalEvents}`)\n lines.push(` Errors: ${summary.errorCount}`)\n lines.push(` Tool Calls: ${summary.toolCallCount}`)\n lines.push(` Delegations: ${summary.delegationCount}`)\n if (summary.stepRange) {\n lines.push(` Step Range: ${summary.stepRange.min} - ${summary.stepRange.max}`)\n }\n return lines\n}\n\nfunction formatEvent(event: RunEvent, verbose: boolean): string[] {\n const lines: string[] = []\n const time = formatTime(event.timestamp)\n const header = `[Step ${event.stepNumber}] ${event.type}${\" \".repeat(Math.max(0, 24 - event.type.length))}${time}`\n lines.push(header)\n if (event.type === \"startRun\" && \"inputMessages\" in event) {\n const startEvent = event as { inputMessages: Array<{ type: string; contents: unknown[] }> }\n const userMsg = startEvent.inputMessages.find((m) => m.type === \"userMessage\")\n if (userMsg) {\n const text = extractTextContent(userMsg.contents)\n const preview = text.length > 60 ? `${text.slice(0, 60)}...` : text\n lines.push(` Query: \"${preview}\"`)\n }\n }\n if (event.type === \"callTools\" && \"toolCalls\" in event) {\n const toolEvent = event as {\n toolCalls: Array<{ toolName: string; skillName: string; args: Record<string, unknown> }>\n }\n if (verbose) {\n for (const tc of toolEvent.toolCalls) {\n lines.push(` [${tc.skillName}] ${tc.toolName}`)\n lines.push(` Args: ${JSON.stringify(tc.args)}`)\n }\n } else {\n const toolNames = toolEvent.toolCalls.map((tc) => tc.toolName).join(\", \")\n lines.push(` Tools: ${toolNames}`)\n }\n }\n if (event.type === \"resolveToolResults\" && \"toolResults\" in event) {\n const resultEvent = event as { toolResults: Array<{ toolName: string; result: unknown[] }> }\n for (const tr of resultEvent.toolResults) {\n const text = extractTextContent(tr.result)\n const isError = text.toLowerCase().startsWith(\"error\")\n const symbol = isError ? \"✗\" : \"✓\"\n const preview = text.length > 40 ? `${text.slice(0, 40)}...` : text\n lines.push(` ${symbol} ${tr.toolName}: ${preview}`)\n }\n }\n if (event.type === \"stopRunByError\" && \"error\" in event) {\n const errorEvent = event as { error: { name: string; message: string; isRetryable: boolean } }\n lines.push(` Error: ${errorEvent.error.name}`)\n lines.push(` Message: ${errorEvent.error.message}`)\n lines.push(` Retryable: ${errorEvent.error.isRetryable}`)\n }\n if (event.type === \"stopRunByDelegate\" && \"checkpoint\" in event) {\n const delegateEvent = event as {\n checkpoint: { delegateTo?: Array<{ expert: { key: string }; query: string }> }\n }\n for (const d of delegateEvent.checkpoint.delegateTo ?? []) {\n lines.push(` Delegate to: ${d.expert.key}`)\n }\n }\n if (event.type === \"completeRun\" && \"text\" in event) {\n const completeEvent = event as { text: string }\n const preview =\n completeEvent.text.length > 80 ? `${completeEvent.text.slice(0, 80)}...` : completeEvent.text\n lines.push(` Result: ${preview}`)\n }\n if (event.type === \"retry\" && \"reason\" in event) {\n const retryEvent = event as { reason: string }\n lines.push(` Reason: ${retryEvent.reason}`)\n }\n lines.push(\"\")\n return lines\n}\n\nfunction extractTextContent(contents: unknown[]): string {\n if (!Array.isArray(contents)) return \"\"\n for (const c of contents) {\n if (\n typeof c === \"object\" &&\n c !== null &&\n \"type\" in c &&\n c.type === \"textPart\" &&\n \"text\" in c\n ) {\n return String(c.text)\n }\n }\n return \"\"\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts)\n return date\n .toISOString()\n .replace(\"T\", \" \")\n .replace(/\\.\\d{3}Z$/, \"\")\n}\n\nfunction formatTime(ts: number): string {\n const date = new Date(ts)\n return date.toISOString().slice(11, 19)\n}\n","import { Command } from \"commander\"\nimport {\n applyFilters,\n createLogDataFetcher,\n createStorageAdapter,\n createSummary,\n type FilterOptions,\n type FormatterOptions,\n formatJson,\n formatTerminal,\n type LogCommandOptions,\n type LogOutput,\n parseFilterExpression,\n parseStepFilter,\n} from \"./lib/log/index.js\"\n\nconst DEFAULT_TAKE = 100\nconst DEFAULT_OFFSET = 0\n\nfunction parsePositiveInt(val: string, optionName: string): number {\n const parsed = parseInt(val, 10)\n if (Number.isNaN(parsed)) {\n throw new Error(`Invalid value for ${optionName}: \"${val}\" is not a valid number`)\n }\n if (parsed < 0) {\n throw new Error(`Invalid value for ${optionName}: \"${val}\" must be non-negative`)\n }\n return parsed\n}\n\nexport const logCommand = new Command()\n .command(\"log\")\n .description(\"View execution history and events for debugging\")\n .option(\"--job <jobId>\", \"Show events for a specific job\")\n .option(\"--run <runId>\", \"Show events for a specific run\")\n .option(\"--checkpoint <checkpointId>\", \"Show checkpoint details\")\n .option(\"--step <step>\", \"Filter by step number (e.g., 5, >5, 1-10)\")\n .option(\"--type <type>\", \"Filter by event type\")\n .option(\"--errors\", \"Show error-related events only\")\n .option(\"--tools\", \"Show tool call events only\")\n .option(\"--delegations\", \"Show delegation events only\")\n .option(\"--filter <expression>\", \"Simple filter expression\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--pretty\", \"Pretty-print JSON output\")\n .option(\"--verbose\", \"Show full event details\")\n .option(\n \"--take <n>\",\n `Number of events to display (default: ${DEFAULT_TAKE}, use 0 for all)`,\n (val) => parsePositiveInt(val, \"--take\"),\n )\n .option(\"--offset <n>\", `Number of events to skip (default: ${DEFAULT_OFFSET})`, (val) =>\n parsePositiveInt(val, \"--offset\"),\n )\n .option(\"--context <n>\", \"Include N events before/after matches\", (val) =>\n parsePositiveInt(val, \"--context\"),\n )\n .option(\"--messages\", \"Show message history for checkpoint\")\n .option(\"--summary\", \"Show summarized view\")\n .action(async (options: LogCommandOptions) => {\n try {\n const storagePath = process.env.PERSTACK_STORAGE_PATH ?? `${process.cwd()}/perstack`\n const adapter = createStorageAdapter(storagePath)\n const fetcher = createLogDataFetcher(adapter)\n const filterOptions = buildFilterOptions(options)\n const formatterOptions = buildFormatterOptions(options)\n const output = await buildOutput(fetcher, options, filterOptions, storagePath)\n if (!output) {\n console.log(\"No data found\")\n return\n }\n const formatted = formatterOptions.json\n ? formatJson(output, formatterOptions)\n : formatTerminal(output, formatterOptions)\n console.log(formatted)\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`)\n } else {\n console.error(\"An unexpected error occurred\")\n }\n process.exit(1)\n }\n })\n\nfunction buildFilterOptions(options: LogCommandOptions): FilterOptions {\n const filterOptions: FilterOptions = {}\n if (options.step) {\n filterOptions.step = parseStepFilter(options.step)\n }\n if (options.type) {\n filterOptions.type = options.type\n }\n if (options.errors) {\n filterOptions.errors = true\n }\n if (options.tools) {\n filterOptions.tools = true\n }\n if (options.delegations) {\n filterOptions.delegations = true\n }\n if (options.filter) {\n filterOptions.filterExpression = parseFilterExpression(options.filter)\n }\n // --take 0 means no limit (show all)\n const take = options.take ?? DEFAULT_TAKE\n if (take > 0) {\n filterOptions.take = take\n }\n filterOptions.offset = options.offset ?? DEFAULT_OFFSET\n if (options.context !== undefined) {\n filterOptions.context = options.context\n }\n return filterOptions\n}\n\nfunction buildFormatterOptions(options: LogCommandOptions): FormatterOptions {\n return {\n json: options.json ?? false,\n pretty: options.pretty ?? false,\n verbose: options.verbose ?? false,\n messages: options.messages ?? false,\n summary: options.summary ?? false,\n }\n}\n\nasync function buildOutput(\n fetcher: ReturnType<typeof createLogDataFetcher>,\n options: LogCommandOptions,\n filterOptions: FilterOptions,\n storagePath: string,\n): Promise<LogOutput | null> {\n if (options.checkpoint) {\n const jobId = options.job\n if (!jobId) {\n const latestJob = await fetcher.getLatestJob()\n if (!latestJob) {\n return null\n }\n const checkpoint = await fetcher.getCheckpoint(latestJob.id, options.checkpoint)\n const events = await fetcher.getEvents(latestJob.id, checkpoint.runId)\n const result = applyFilters(events, filterOptions)\n return {\n job: latestJob,\n checkpoint,\n events: result.events,\n summary: createSummary(result.events),\n isLatestJob: true,\n storagePath,\n totalEventsBeforeLimit: result.totalBeforePagination,\n matchedAfterPagination: result.matchedAfterPagination,\n }\n }\n const job = await fetcher.getJob(jobId)\n if (!job) {\n return null\n }\n const checkpoint = await fetcher.getCheckpoint(jobId, options.checkpoint)\n const events = await fetcher.getEvents(jobId, checkpoint.runId)\n const result = applyFilters(events, filterOptions)\n return {\n job,\n checkpoint,\n events: result.events,\n summary: createSummary(result.events),\n storagePath,\n totalEventsBeforeLimit: result.totalBeforePagination,\n matchedAfterPagination: result.matchedAfterPagination,\n }\n }\n if (options.run) {\n const jobId = options.job\n if (!jobId) {\n const latestJob = await fetcher.getLatestJob()\n if (!latestJob) {\n return null\n }\n const events = await fetcher.getEvents(latestJob.id, options.run)\n const result = applyFilters(events, filterOptions)\n return {\n job: latestJob,\n events: result.events,\n summary: createSummary(result.events),\n isLatestJob: true,\n storagePath,\n totalEventsBeforeLimit: result.totalBeforePagination,\n matchedAfterPagination: result.matchedAfterPagination,\n }\n }\n const job = await fetcher.getJob(jobId)\n if (!job) {\n return null\n }\n const events = await fetcher.getEvents(jobId, options.run)\n const result = applyFilters(events, filterOptions)\n return {\n job,\n events: result.events,\n summary: createSummary(result.events),\n storagePath,\n totalEventsBeforeLimit: result.totalBeforePagination,\n matchedAfterPagination: result.matchedAfterPagination,\n }\n }\n if (options.job) {\n const job = await fetcher.getJob(options.job)\n if (!job) {\n return null\n }\n const events = await fetcher.getAllEventsForJob(options.job)\n const result = applyFilters(events, filterOptions)\n const checkpoints = await fetcher.getCheckpoints(options.job)\n return {\n job,\n checkpoints,\n events: result.events,\n summary: createSummary(result.events),\n storagePath,\n totalEventsBeforeLimit: result.totalBeforePagination,\n matchedAfterPagination: result.matchedAfterPagination,\n }\n }\n const latestJob = await fetcher.getLatestJob()\n if (!latestJob) {\n return null\n }\n const events = await fetcher.getAllEventsForJob(latestJob.id)\n const result = applyFilters(events, filterOptions)\n return {\n job: latestJob,\n events: result.events,\n summary: createSummary(result.events),\n isLatestJob: true,\n storagePath,\n totalEventsBeforeLimit: result.totalBeforePagination,\n matchedAfterPagination: result.matchedAfterPagination,\n }\n}\n","import { createId } from \"@paralleldrive/cuid2\"\nimport type { RunEvent, RuntimeEvent } from \"@perstack/core\"\nimport {\n createFilteredEventListener,\n parseWithFriendlyError,\n runCommandInputSchema,\n validateEventFilter,\n} from \"@perstack/core\"\nimport {\n createInitialJob,\n defaultRetrieveCheckpoint,\n defaultStoreCheckpoint,\n defaultStoreEvent,\n retrieveJob,\n storeJob,\n} from \"@perstack/filesystem-storage\"\nimport { findLockfile, loadLockfile, run as perstackRun } from \"@perstack/runtime\"\nimport { Command } from \"commander\"\nimport { resolveRunContext } from \"./lib/context.js\"\nimport {\n parseInteractiveToolCallResult,\n parseInteractiveToolCallResultJson,\n} from \"./lib/interactive.js\"\n\nconst defaultEventListener = (event: RunEvent | RuntimeEvent) => console.log(JSON.stringify(event))\n\nexport const runCommand = new Command()\n .command(\"run\")\n .description(\"Run Perstack with JSON output\")\n .argument(\"<expertKey>\", \"Expert key to run\")\n .argument(\"<query>\", \"Query to run\")\n .option(\"--config <configPath>\", \"Path to perstack.toml config file\")\n .option(\"--provider <provider>\", \"Provider to use\")\n .option(\"--model <model>\", \"Model to use\")\n .option(\n \"--reasoning-budget <budget>\",\n \"Reasoning budget for native LLM reasoning (minimal, low, medium, high, or token count)\",\n )\n .option(\n \"--max-steps <maxSteps>\",\n \"Maximum number of steps to run, default is undefined (no limit)\",\n )\n .option(\"--max-retries <maxRetries>\", \"Maximum number of generation retries, default is 5\")\n .option(\n \"--timeout <timeout>\",\n \"Timeout for each generation in milliseconds, default is 300000 (5 minutes)\",\n )\n .option(\"--job-id <jobId>\", \"Job ID for identifying the job\")\n .option(\n \"--env-path <path>\",\n \"Path to the environment file (can be specified multiple times), default is .env and .env.local\",\n (value: string, previous: string[]) => previous.concat(value),\n [] as string[],\n )\n .option(\"--verbose\", \"Enable verbose logging\")\n .option(\"--continue\", \"Continue the most recent job with new query\")\n .option(\"--continue-job <jobId>\", \"Continue the specified job with new query\")\n .option(\n \"--resume-from <checkpointId>\",\n \"Resume from a specific checkpoint (requires --continue or --continue-job)\",\n )\n .option(\"-i, --interactive-tool-call-result\", \"Query is interactive tool call result\")\n .option(\n \"--filter <types>\",\n \"Filter events by type (comma-separated, e.g., completeRun,stopRunByError)\",\n )\n .action(async (expertKey, query, options) => {\n const input = parseWithFriendlyError(runCommandInputSchema, { expertKey, query, options })\n\n // Validate and apply event filter if specified\n let eventListener = defaultEventListener\n if (input.options.filter && input.options.filter.length > 0) {\n try {\n const validatedTypes = validateEventFilter(input.options.filter)\n const allowedTypes = new Set(validatedTypes)\n eventListener = createFilteredEventListener(defaultEventListener, allowedTypes)\n } catch (error) {\n if (error instanceof Error) {\n console.error(error.message)\n } else {\n console.error(error)\n }\n process.exit(1)\n }\n }\n\n try {\n const { perstackConfig, checkpoint, env, providerConfig, model, experts } =\n await resolveRunContext({\n configPath: input.options.config,\n provider: input.options.provider,\n model: input.options.model,\n envPath: input.options.envPath,\n continue: input.options.continue,\n continueJob: input.options.continueJob,\n resumeFrom: input.options.resumeFrom,\n expertKey: input.expertKey,\n })\n\n // Load lockfile if present\n const lockfilePath = findLockfile()\n const lockfile = lockfilePath ? (loadLockfile(lockfilePath) ?? undefined) : undefined\n\n // Generate job and run IDs\n const jobId = checkpoint?.jobId ?? input.options.jobId ?? createId()\n const runId = createId()\n\n await perstackRun(\n {\n setting: {\n jobId,\n runId,\n expertKey: input.expertKey,\n input: input.options.interactiveToolCallResult\n ? (parseInteractiveToolCallResultJson(input.query) ??\n (checkpoint\n ? parseInteractiveToolCallResult(input.query, checkpoint)\n : { text: input.query }))\n : { text: input.query },\n experts,\n model,\n providerConfig,\n reasoningBudget: input.options.reasoningBudget ?? perstackConfig.reasoningBudget,\n maxSteps: input.options.maxSteps ?? perstackConfig.maxSteps,\n maxRetries: input.options.maxRetries ?? perstackConfig.maxRetries,\n timeout: input.options.timeout ?? perstackConfig.timeout,\n perstackApiBaseUrl: perstackConfig.perstackApiBaseUrl,\n perstackApiKey: env.PERSTACK_API_KEY,\n perstackBaseSkillCommand: perstackConfig.perstackBaseSkillCommand,\n env,\n proxyUrl: process.env.PERSTACK_PROXY_URL,\n verbose: input.options.verbose,\n },\n checkpoint,\n },\n {\n eventListener,\n storeCheckpoint: defaultStoreCheckpoint,\n storeEvent: defaultStoreEvent,\n retrieveCheckpoint: defaultRetrieveCheckpoint,\n storeJob,\n retrieveJob,\n createJob: createInitialJob,\n lockfile,\n },\n )\n } catch (error) {\n if (error instanceof Error) {\n console.error(error.message)\n } else {\n console.error(error)\n }\n process.exit(1)\n }\n })\n","#!/usr/bin/env node\n\nimport { Command } from \"commander\"\nimport packageJson from \"../package.json\" with { type: \"json\" }\nimport { installCommand } from \"../src/install.js\"\nimport { logCommand } from \"../src/log.js\"\nimport { runCommand } from \"../src/run.js\"\nimport { startCommand } from \"../src/start.js\"\n\nconst program = new Command()\n .name(packageJson.name)\n .description(packageJson.description)\n .version(packageJson.version)\n .addCommand(startCommand)\n .addCommand(runCommand)\n .addCommand(logCommand)\n .addCommand(installCommand)\nprogram.parse()\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "perstack",
3
- "version": "0.0.81",
3
+ "version": "0.0.82",
4
4
  "description": "PerStack CLI",
5
5
  "author": "Wintermute Technologies, Inc.",
6
6
  "license": "Apache-2.0",
@@ -24,8 +24,7 @@
24
24
  "smol-toml": "^1.6.0",
25
25
  "@perstack/core": "0.0.45",
26
26
  "@perstack/react": "0.0.49",
27
- "@perstack/runtime": "0.0.95",
28
- "@perstack/filesystem-storage": "0.0.15"
27
+ "@perstack/runtime": "0.0.95"
29
28
  },
30
29
  "devDependencies": {
31
30
  "@tsconfig/node22": "^22.0.5",
@@ -34,7 +33,8 @@
34
33
  "tsup": "^8.5.1",
35
34
  "typescript": "^5.9.3",
36
35
  "vitest": "^4.0.18",
37
- "@perstack/tui-components": "0.0.5"
36
+ "@perstack/tui-components": "0.0.5",
37
+ "@perstack/filesystem-storage": "0.0.15"
38
38
  },
39
39
  "engines": {
40
40
  "node": ">=22.0.0"