@perstack/runtime 0.0.77 → 0.0.79

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.
@@ -1,6 +1,7 @@
1
1
  import * as _perstack_core from '@perstack/core';
2
- import { LockfileExpert, Lockfile, ProviderConfig, Expert, BaseAdapter, RuntimeAdapter, PrerequisiteResult, RuntimeExpertConfig, AdapterRunParams, AdapterRunResult, RunSetting, Checkpoint, Step, RunEvent, Job, RuntimeEvent, RunParamsInput, ToolDefinition, SkillType, McpStdioSkill, McpSseSkill, InteractiveSkill, TextPart, ImageInlinePart, FileInlinePart, ReasoningBudget } from '@perstack/core';
2
+ import { LockfileExpert, Lockfile, ProviderConfig, Expert, RuntimeAdapter, PrerequisiteResult, RuntimeExpertConfig, AdapterRunParams, AdapterRunResult, RunSetting, Checkpoint, Step, RunEvent, Job, RuntimeEvent, RunParamsInput, ToolDefinition, SkillType, McpStdioSkill, McpSseSkill, InteractiveSkill, TextPart, ImageInlinePart, FileInlinePart, ReasoningBudget } from '@perstack/core';
3
3
  import { LanguageModel, ModelMessage, ToolSet, GenerateTextResult } from 'ai';
4
+ import { BaseAdapter } from '@perstack/adapter-base';
4
5
  import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
5
6
  import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
6
7
  import * as xstate from 'xstate';
package/dist/src/index.js CHANGED
@@ -1,8 +1,9 @@
1
- import { package_default, findLockfile, loadLockfile, run } from '../chunk-J26GYDJQ.js';
2
- export { findLockfile, getLockfileExpertToolDefinitions, getModel, loadLockfile, run, runtimeStateMachine } from '../chunk-J26GYDJQ.js';
1
+ import { package_default, findLockfile, loadLockfile, run } from '../chunk-QJJAMZV3.js';
2
+ export { findLockfile, getLockfileExpertToolDefinitions, getModel, loadLockfile, run, runtimeStateMachine } from '../chunk-QJJAMZV3.js';
3
3
  export { collectToolDefinitionsForExpert } from '../chunk-RG4QHAGG.js';
4
- import { registerAdapter, BaseAdapter, getFilteredEnv, checkpointSchema } from '@perstack/core';
4
+ import { registerAdapter, getFilteredEnv, checkpointSchema } from '@perstack/core';
5
5
  import { spawn } from 'child_process';
6
+ import { BaseAdapter } from '@perstack/adapter-base';
6
7
 
7
8
  var PerstackAdapter = class extends BaseAdapter {
8
9
  name = "local";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/perstack-adapter.ts","../../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { ChildProcess } from \"node:child_process\"\nimport { spawn } from \"node:child_process\"\nimport type {\n AdapterRunParams,\n AdapterRunResult,\n Checkpoint,\n Expert,\n PrerequisiteResult,\n RunEvent,\n RuntimeAdapter,\n RuntimeEvent,\n RuntimeExpertConfig,\n} from \"@perstack/core\"\nimport { BaseAdapter, checkpointSchema, getFilteredEnv } from \"@perstack/core\"\nimport { findLockfile, loadLockfile } from \"./helpers/index.js\"\nimport { run as perstackRun } from \"./run.js\"\n\nexport type PerstackAdapterOptions = {\n useDirectExecution?: boolean\n}\n\nexport class PerstackAdapter extends BaseAdapter implements RuntimeAdapter {\n readonly name = \"local\"\n protected version = \"unknown\"\n private useDirectExecution: boolean\n\n constructor(options?: PerstackAdapterOptions) {\n super()\n this.useDirectExecution = options?.useDirectExecution ?? true\n }\n\n async checkPrerequisites(): Promise<PrerequisiteResult> {\n if (this.useDirectExecution) {\n return { ok: true }\n }\n try {\n const result = await this.execCommand([\"perstack-runtime\", \"--version\"])\n if (result.exitCode !== 0) {\n return {\n ok: false,\n error: {\n type: \"cli-not-found\",\n message: \"perstack-runtime CLI is not available.\",\n },\n }\n }\n this.version = result.stdout.trim() || \"unknown\"\n } catch {\n return {\n ok: false,\n error: {\n type: \"cli-not-found\",\n message: \"perstack-runtime CLI is not available.\",\n },\n }\n }\n return { ok: true }\n }\n\n convertExpert(expert: Expert): RuntimeExpertConfig {\n return { instruction: expert.instruction }\n }\n\n async run(params: AdapterRunParams): Promise<AdapterRunResult> {\n if (this.useDirectExecution) {\n return this.runDirect(params)\n }\n return this.runViaCli(params)\n }\n\n private async runDirect(params: AdapterRunParams): Promise<AdapterRunResult> {\n const events: (RunEvent | RuntimeEvent)[] = []\n const eventListener = (event: RunEvent | RuntimeEvent) => {\n events.push(event)\n params.eventListener?.(event)\n }\n const lockfilePath = findLockfile()\n const lockfile = lockfilePath ? (loadLockfile(lockfilePath) ?? undefined) : undefined\n const checkpoint = await perstackRun(\n { setting: params.setting, checkpoint: params.checkpoint },\n {\n eventListener,\n storeCheckpoint: params.storeCheckpoint,\n storeEvent: params.storeEvent,\n retrieveCheckpoint: params.retrieveCheckpoint,\n lockfile,\n },\n )\n return { checkpoint, events }\n }\n\n private async runViaCli(params: AdapterRunParams): Promise<AdapterRunResult> {\n const { setting, eventListener } = params\n const events: (RunEvent | RuntimeEvent)[] = []\n const args = this.buildCliArgs(setting)\n const maxSteps = setting.maxSteps ?? 100\n const processTimeout = (setting.timeout ?? 60000) * maxSteps\n const result = await this.executeRuntimeCli(args, processTimeout, (event) => {\n events.push(event)\n eventListener?.(event)\n })\n if (result.exitCode !== 0) {\n throw new Error(`perstack-runtime CLI failed with exit code ${result.exitCode}`)\n }\n const terminalEventTypes = [\n \"completeRun\",\n \"stopRunByInteractiveTool\",\n \"stopRunByDelegate\",\n \"stopRunByExceededMaxSteps\",\n ]\n const terminalEvent = events.find((e) => terminalEventTypes.includes(e.type)) as\n | (RunEvent & { checkpoint: Checkpoint })\n | undefined\n if (!terminalEvent?.checkpoint) {\n throw new Error(\"No terminal event with checkpoint received from CLI\")\n }\n return { checkpoint: terminalEvent.checkpoint, events }\n }\n\n private buildCliArgs(setting: AdapterRunParams[\"setting\"]): string[] {\n const args = [\"run\"]\n if (setting.jobId) {\n args.push(\"--job-id\", setting.jobId)\n }\n if (setting.runId) {\n args.push(\"--run-id\", setting.runId)\n }\n if (setting.maxSteps !== undefined) {\n args.push(\"--max-steps\", String(setting.maxSteps))\n }\n if (setting.maxRetries !== undefined) {\n args.push(\"--max-retries\", String(setting.maxRetries))\n }\n if (setting.timeout !== undefined) {\n args.push(\"--timeout\", String(setting.timeout))\n }\n if (setting.model) {\n args.push(\"--model\", setting.model)\n }\n if (setting.providerConfig?.providerName) {\n args.push(\"--provider\", setting.providerConfig.providerName)\n }\n args.push(setting.expertKey, setting.input.text ?? \"\")\n return args\n }\n\n private executeRuntimeCli(\n args: string[],\n timeout: number,\n eventListener: (event: RunEvent | RuntimeEvent) => void,\n ): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n const proc = spawn(\"perstack-runtime\", args, {\n cwd: process.cwd(),\n env: getFilteredEnv(),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n })\n proc.stdin.end()\n return this.executeWithStreaming(proc, timeout, eventListener)\n }\n\n private executeWithStreaming(\n proc: ChildProcess,\n timeout: number,\n eventListener: (event: RunEvent | RuntimeEvent) => void,\n ): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n return new Promise((resolve, reject) => {\n let stdout = \"\"\n let stderr = \"\"\n let buffer = \"\"\n const timer = setTimeout(() => {\n proc.kill(\"SIGTERM\")\n reject(new Error(`perstack-runtime timed out after ${timeout}ms`))\n }, timeout)\n proc.stdout?.on(\"data\", (data) => {\n const chunk = data.toString()\n stdout += chunk\n buffer += chunk\n const lines = buffer.split(\"\\n\")\n buffer = lines.pop() ?? \"\"\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed) continue\n try {\n const parsed = JSON.parse(trimmed) as RunEvent | RuntimeEvent\n const terminalEventTypes = [\n \"completeRun\",\n \"stopRunByInteractiveTool\",\n \"stopRunByDelegate\",\n \"stopRunByExceededMaxSteps\",\n ]\n if (terminalEventTypes.includes(parsed.type) && \"checkpoint\" in parsed) {\n const checkpointData = parsed.checkpoint\n parsed.checkpoint = checkpointSchema.parse(checkpointData)\n }\n eventListener(parsed)\n } catch {\n // ignore non-JSON lines\n }\n }\n })\n proc.stderr?.on(\"data\", (data) => {\n stderr += data.toString()\n })\n proc.on(\"close\", (code) => {\n clearTimeout(timer)\n resolve({ stdout, stderr, exitCode: code ?? 127 })\n })\n proc.on(\"error\", (err) => {\n clearTimeout(timer)\n reject(err)\n })\n })\n }\n}\n","import { registerAdapter } from \"@perstack/core\"\nimport pkg from \"../package.json\" with { type: \"json\" }\nimport { PerstackAdapter } from \"./perstack-adapter.js\"\n\nregisterAdapter(\"local\", () => new PerstackAdapter())\n\nexport { findLockfile, getLockfileExpertToolDefinitions, loadLockfile } from \"./helpers/index.js\"\nexport { getModel } from \"./helpers/model.js\"\nexport { PerstackAdapter } from \"./perstack-adapter.js\"\nexport { type RunOptions, run } from \"./run.js\"\nexport {\n type CollectedToolDefinition,\n type CollectToolDefinitionsOptions,\n collectToolDefinitionsForExpert,\n} from \"./skill-manager/index.js\"\nexport { type RunActor, type RunSnapshot, runtimeStateMachine } from \"./state-machine/index.js\"\nexport const runtimeVersion = pkg.version\n"]}
1
+ {"version":3,"sources":["../../src/perstack-adapter.ts","../../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { ChildProcess } from \"node:child_process\"\nimport { spawn } from \"node:child_process\"\nimport { BaseAdapter } from \"@perstack/adapter-base\"\nimport type {\n AdapterRunParams,\n AdapterRunResult,\n Checkpoint,\n Expert,\n PrerequisiteResult,\n RunEvent,\n RuntimeAdapter,\n RuntimeEvent,\n RuntimeExpertConfig,\n} from \"@perstack/core\"\nimport { checkpointSchema, getFilteredEnv } from \"@perstack/core\"\nimport { findLockfile, loadLockfile } from \"./helpers/index.js\"\nimport { run as perstackRun } from \"./run.js\"\n\nexport type PerstackAdapterOptions = {\n useDirectExecution?: boolean\n}\n\nexport class PerstackAdapter extends BaseAdapter implements RuntimeAdapter {\n readonly name = \"local\"\n protected version = \"unknown\"\n private useDirectExecution: boolean\n\n constructor(options?: PerstackAdapterOptions) {\n super()\n this.useDirectExecution = options?.useDirectExecution ?? true\n }\n\n async checkPrerequisites(): Promise<PrerequisiteResult> {\n if (this.useDirectExecution) {\n return { ok: true }\n }\n try {\n const result = await this.execCommand([\"perstack-runtime\", \"--version\"])\n if (result.exitCode !== 0) {\n return {\n ok: false,\n error: {\n type: \"cli-not-found\",\n message: \"perstack-runtime CLI is not available.\",\n },\n }\n }\n this.version = result.stdout.trim() || \"unknown\"\n } catch {\n return {\n ok: false,\n error: {\n type: \"cli-not-found\",\n message: \"perstack-runtime CLI is not available.\",\n },\n }\n }\n return { ok: true }\n }\n\n convertExpert(expert: Expert): RuntimeExpertConfig {\n return { instruction: expert.instruction }\n }\n\n async run(params: AdapterRunParams): Promise<AdapterRunResult> {\n if (this.useDirectExecution) {\n return this.runDirect(params)\n }\n return this.runViaCli(params)\n }\n\n private async runDirect(params: AdapterRunParams): Promise<AdapterRunResult> {\n const events: (RunEvent | RuntimeEvent)[] = []\n const eventListener = (event: RunEvent | RuntimeEvent) => {\n events.push(event)\n params.eventListener?.(event)\n }\n const lockfilePath = findLockfile()\n const lockfile = lockfilePath ? (loadLockfile(lockfilePath) ?? undefined) : undefined\n const checkpoint = await perstackRun(\n { setting: params.setting, checkpoint: params.checkpoint },\n {\n eventListener,\n storeCheckpoint: params.storeCheckpoint,\n storeEvent: params.storeEvent,\n retrieveCheckpoint: params.retrieveCheckpoint,\n lockfile,\n },\n )\n return { checkpoint, events }\n }\n\n private async runViaCli(params: AdapterRunParams): Promise<AdapterRunResult> {\n const { setting, eventListener } = params\n const events: (RunEvent | RuntimeEvent)[] = []\n const args = this.buildCliArgs(setting)\n const maxSteps = setting.maxSteps ?? 100\n const processTimeout = (setting.timeout ?? 60000) * maxSteps\n const result = await this.executeRuntimeCli(args, processTimeout, (event) => {\n events.push(event)\n eventListener?.(event)\n })\n if (result.exitCode !== 0) {\n throw new Error(`perstack-runtime CLI failed with exit code ${result.exitCode}`)\n }\n const terminalEventTypes = [\n \"completeRun\",\n \"stopRunByInteractiveTool\",\n \"stopRunByDelegate\",\n \"stopRunByExceededMaxSteps\",\n ]\n const terminalEvent = events.find((e) => terminalEventTypes.includes(e.type)) as\n | (RunEvent & { checkpoint: Checkpoint })\n | undefined\n if (!terminalEvent?.checkpoint) {\n throw new Error(\"No terminal event with checkpoint received from CLI\")\n }\n return { checkpoint: terminalEvent.checkpoint, events }\n }\n\n private buildCliArgs(setting: AdapterRunParams[\"setting\"]): string[] {\n const args = [\"run\"]\n if (setting.jobId) {\n args.push(\"--job-id\", setting.jobId)\n }\n if (setting.runId) {\n args.push(\"--run-id\", setting.runId)\n }\n if (setting.maxSteps !== undefined) {\n args.push(\"--max-steps\", String(setting.maxSteps))\n }\n if (setting.maxRetries !== undefined) {\n args.push(\"--max-retries\", String(setting.maxRetries))\n }\n if (setting.timeout !== undefined) {\n args.push(\"--timeout\", String(setting.timeout))\n }\n if (setting.model) {\n args.push(\"--model\", setting.model)\n }\n if (setting.providerConfig?.providerName) {\n args.push(\"--provider\", setting.providerConfig.providerName)\n }\n args.push(setting.expertKey, setting.input.text ?? \"\")\n return args\n }\n\n private executeRuntimeCli(\n args: string[],\n timeout: number,\n eventListener: (event: RunEvent | RuntimeEvent) => void,\n ): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n const proc = spawn(\"perstack-runtime\", args, {\n cwd: process.cwd(),\n env: getFilteredEnv(),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n })\n proc.stdin.end()\n return this.executeWithStreaming(proc, timeout, eventListener)\n }\n\n private executeWithStreaming(\n proc: ChildProcess,\n timeout: number,\n eventListener: (event: RunEvent | RuntimeEvent) => void,\n ): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n return new Promise((resolve, reject) => {\n let stdout = \"\"\n let stderr = \"\"\n let buffer = \"\"\n const timer = setTimeout(() => {\n proc.kill(\"SIGTERM\")\n reject(new Error(`perstack-runtime timed out after ${timeout}ms`))\n }, timeout)\n proc.stdout?.on(\"data\", (data) => {\n const chunk = data.toString()\n stdout += chunk\n buffer += chunk\n const lines = buffer.split(\"\\n\")\n buffer = lines.pop() ?? \"\"\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed) continue\n try {\n const parsed = JSON.parse(trimmed) as RunEvent | RuntimeEvent\n const terminalEventTypes = [\n \"completeRun\",\n \"stopRunByInteractiveTool\",\n \"stopRunByDelegate\",\n \"stopRunByExceededMaxSteps\",\n ]\n if (terminalEventTypes.includes(parsed.type) && \"checkpoint\" in parsed) {\n const checkpointData = parsed.checkpoint\n parsed.checkpoint = checkpointSchema.parse(checkpointData)\n }\n eventListener(parsed)\n } catch {\n // ignore non-JSON lines\n }\n }\n })\n proc.stderr?.on(\"data\", (data) => {\n stderr += data.toString()\n })\n proc.on(\"close\", (code) => {\n clearTimeout(timer)\n resolve({ stdout, stderr, exitCode: code ?? 127 })\n })\n proc.on(\"error\", (err) => {\n clearTimeout(timer)\n reject(err)\n })\n })\n }\n}\n","import { registerAdapter } from \"@perstack/core\"\nimport pkg from \"../package.json\" with { type: \"json\" }\nimport { PerstackAdapter } from \"./perstack-adapter.js\"\n\nregisterAdapter(\"local\", () => new PerstackAdapter())\n\nexport { findLockfile, getLockfileExpertToolDefinitions, loadLockfile } from \"./helpers/index.js\"\nexport { getModel } from \"./helpers/model.js\"\nexport { PerstackAdapter } from \"./perstack-adapter.js\"\nexport { type RunOptions, run } from \"./run.js\"\nexport {\n type CollectedToolDefinition,\n type CollectToolDefinitionsOptions,\n collectToolDefinitionsForExpert,\n} from \"./skill-manager/index.js\"\nexport { type RunActor, type RunSnapshot, runtimeStateMachine } from \"./state-machine/index.js\"\nexport const runtimeVersion = pkg.version\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@perstack/runtime",
3
- "version": "0.0.77",
3
+ "version": "0.0.79",
4
4
  "description": "Perstack Runtime",
5
5
  "author": "Wintermute Technologies, Inc.",
6
6
  "license": "Apache-2.0",
@@ -35,9 +35,10 @@
35
35
  "ts-dedent": "^2.2.0",
36
36
  "undici": "^7.16.0",
37
37
  "xstate": "^5.25.0",
38
- "@perstack/api-client": "0.0.41",
39
- "@perstack/base": "0.0.41",
40
- "@perstack/core": "0.0.33"
38
+ "@perstack/adapter-base": "0.0.2",
39
+ "@perstack/api-client": "0.0.43",
40
+ "@perstack/base": "0.0.43",
41
+ "@perstack/core": "0.0.35"
41
42
  },
42
43
  "devDependencies": {
43
44
  "@tsconfig/node22": "^22.0.5",
@@ -46,15 +47,15 @@
46
47
  "tsup": "^8.5.1",
47
48
  "typescript": "^5.9.3",
48
49
  "vitest": "^4.0.16",
49
- "@perstack/anthropic-provider": "0.0.2",
50
- "@perstack/azure-openai-provider": "0.0.2",
51
- "@perstack/bedrock-provider": "0.0.2",
52
- "@perstack/deepseek-provider": "0.0.2",
53
- "@perstack/google-provider": "0.0.2",
54
- "@perstack/ollama-provider": "0.0.2",
55
- "@perstack/openai-provider": "0.0.2",
56
- "@perstack/provider-core": "0.0.2",
57
- "@perstack/vertex-provider": "0.0.2"
50
+ "@perstack/anthropic-provider": "0.0.4",
51
+ "@perstack/azure-openai-provider": "0.0.4",
52
+ "@perstack/bedrock-provider": "0.0.4",
53
+ "@perstack/deepseek-provider": "0.0.4",
54
+ "@perstack/google-provider": "0.0.4",
55
+ "@perstack/ollama-provider": "0.0.4",
56
+ "@perstack/openai-provider": "0.0.4",
57
+ "@perstack/provider-core": "0.0.4",
58
+ "@perstack/vertex-provider": "0.0.4"
58
59
  },
59
60
  "engines": {
60
61
  "node": ">=22.0.0"