@perstack/runtime 0.0.78 → 0.0.80

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,9 +1,62 @@
1
- import { package_default, findLockfile, loadLockfile, run } from '../chunk-REYCEAEN.js';
2
- export { findLockfile, getLockfileExpertToolDefinitions, getModel, loadLockfile, run, runtimeStateMachine } from '../chunk-REYCEAEN.js';
1
+ import { package_default, findLockfile, loadLockfile, run } from '../chunk-Z3752QO6.js';
2
+ export { findLockfile, getLockfileExpertToolDefinitions, getModel, loadLockfile, run, runtimeStateMachine } from '../chunk-Z3752QO6.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
6
 
7
+ var BaseAdapter = class {
8
+ convertExpert(expert) {
9
+ return { instruction: expert.instruction };
10
+ }
11
+ execCommand(args) {
12
+ return new Promise((resolve) => {
13
+ const [cmd, ...cmdArgs] = args;
14
+ if (!cmd) {
15
+ resolve({ stdout: "", stderr: "", exitCode: 127 });
16
+ return;
17
+ }
18
+ const proc = spawn(cmd, cmdArgs, { cwd: process.cwd(), stdio: ["pipe", "pipe", "pipe"] });
19
+ let stdout = "";
20
+ let stderr = "";
21
+ proc.stdout.on("data", (data) => {
22
+ stdout += data.toString();
23
+ });
24
+ proc.stderr.on("data", (data) => {
25
+ stderr += data.toString();
26
+ });
27
+ proc.on("close", (code) => {
28
+ resolve({ stdout, stderr, exitCode: code ?? 127 });
29
+ });
30
+ proc.on("error", () => {
31
+ resolve({ stdout: "", stderr: "", exitCode: 127 });
32
+ });
33
+ });
34
+ }
35
+ executeWithTimeout(proc, timeout) {
36
+ return new Promise((resolve, reject) => {
37
+ let stdout = "";
38
+ let stderr = "";
39
+ const timer = setTimeout(() => {
40
+ proc.kill("SIGTERM");
41
+ reject(new Error(`${this.name} timed out after ${timeout}ms`));
42
+ }, timeout);
43
+ proc.stdout?.on("data", (data) => {
44
+ stdout += data.toString();
45
+ });
46
+ proc.stderr?.on("data", (data) => {
47
+ stderr += data.toString();
48
+ });
49
+ proc.on("close", (code) => {
50
+ clearTimeout(timer);
51
+ resolve({ stdout, stderr, exitCode: code ?? 127 });
52
+ });
53
+ proc.on("error", (err) => {
54
+ clearTimeout(timer);
55
+ reject(err);
56
+ });
57
+ });
58
+ }
59
+ };
7
60
  var PerstackAdapter = class extends BaseAdapter {
8
61
  name = "local";
9
62
  version = "unknown";
@@ -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":["../../../../packages/runtimes/adapter-base/src/base-adapter.ts","../../src/perstack-adapter.ts","../../src/index.ts"],"names":["spawn"],"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 Expert,\n PrerequisiteResult,\n RuntimeAdapter,\n RuntimeExpertConfig,\n} from \"@perstack/core\"\n\nexport type ExecResult = {\n stdout: string\n stderr: string\n exitCode: number\n}\n\nexport abstract class BaseAdapter implements RuntimeAdapter {\n abstract readonly name: string\n abstract checkPrerequisites(): Promise<PrerequisiteResult>\n abstract run(params: AdapterRunParams): Promise<AdapterRunResult>\n\n convertExpert(expert: Expert): RuntimeExpertConfig {\n return { instruction: expert.instruction }\n }\n\n protected execCommand(args: string[]): Promise<ExecResult> {\n return new Promise((resolve) => {\n const [cmd, ...cmdArgs] = args\n if (!cmd) {\n resolve({ stdout: \"\", stderr: \"\", exitCode: 127 })\n return\n }\n const proc = spawn(cmd, cmdArgs, { cwd: process.cwd(), stdio: [\"pipe\", \"pipe\", \"pipe\"] })\n let stdout = \"\"\n let stderr = \"\"\n proc.stdout.on(\"data\", (data) => {\n stdout += data.toString()\n })\n proc.stderr.on(\"data\", (data) => {\n stderr += data.toString()\n })\n proc.on(\"close\", (code) => {\n resolve({ stdout, stderr, exitCode: code ?? 127 })\n })\n proc.on(\"error\", () => {\n resolve({ stdout: \"\", stderr: \"\", exitCode: 127 })\n })\n })\n }\n\n protected executeWithTimeout(proc: ChildProcess, timeout: number): Promise<ExecResult> {\n return new Promise((resolve, reject) => {\n let stdout = \"\"\n let stderr = \"\"\n const timer = setTimeout(() => {\n proc.kill(\"SIGTERM\")\n reject(new Error(`${this.name} timed out after ${timeout}ms`))\n }, timeout)\n proc.stdout?.on(\"data\", (data) => {\n stdout += data.toString()\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 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.78",
3
+ "version": "0.0.80",
4
4
  "description": "Perstack Runtime",
5
5
  "author": "Wintermute Technologies, Inc.",
6
6
  "license": "Apache-2.0",
@@ -35,9 +35,9 @@
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.42",
39
- "@perstack/base": "0.0.42",
40
- "@perstack/core": "0.0.34"
38
+ "@perstack/api-client": "0.0.44",
39
+ "@perstack/base": "0.0.44",
40
+ "@perstack/core": "0.0.35"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@tsconfig/node22": "^22.0.5",
@@ -46,15 +46,16 @@
46
46
  "tsup": "^8.5.1",
47
47
  "typescript": "^5.9.3",
48
48
  "vitest": "^4.0.16",
49
- "@perstack/anthropic-provider": "0.0.3",
50
- "@perstack/azure-openai-provider": "0.0.3",
51
- "@perstack/bedrock-provider": "0.0.3",
52
- "@perstack/deepseek-provider": "0.0.3",
53
- "@perstack/google-provider": "0.0.3",
54
- "@perstack/ollama-provider": "0.0.3",
55
- "@perstack/openai-provider": "0.0.3",
56
- "@perstack/provider-core": "0.0.3",
57
- "@perstack/vertex-provider": "0.0.3"
49
+ "@perstack/adapter-base": "0.0.2",
50
+ "@perstack/anthropic-provider": "0.0.5",
51
+ "@perstack/azure-openai-provider": "0.0.5",
52
+ "@perstack/bedrock-provider": "0.0.5",
53
+ "@perstack/deepseek-provider": "0.0.5",
54
+ "@perstack/google-provider": "0.0.5",
55
+ "@perstack/ollama-provider": "0.0.5",
56
+ "@perstack/openai-provider": "0.0.5",
57
+ "@perstack/provider-core": "0.0.5",
58
+ "@perstack/vertex-provider": "0.0.5"
58
59
  },
59
60
  "engines": {
60
61
  "node": ">=22.0.0"