@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.
- package/dist/bin/cli.js +1 -1
- package/dist/{chunk-REYCEAEN.js → chunk-Z3752QO6.js} +4 -3
- package/dist/chunk-Z3752QO6.js.map +1 -0
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.js +56 -3
- package/dist/src/index.js.map +1 -1
- package/package.json +14 -13
- package/dist/chunk-REYCEAEN.js.map +0 -1
package/dist/src/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as _perstack_core from '@perstack/core';
|
|
2
|
-
import { LockfileExpert, Lockfile, ProviderConfig, Expert,
|
|
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-
|
|
2
|
-
export { findLockfile, getLockfileExpertToolDefinitions, getModel, loadLockfile, run, runtimeStateMachine } from '../chunk-
|
|
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,
|
|
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";
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/perstack-adapter.ts","../../src/index.ts"],"names":[],"mappings":";;;;;;AAqBO,IAAM,eAAA,GAAN,cAA8B,WAAA,CAAsC;AAAA,EAChE,IAAA,GAAO,OAAA;AAAA,EACN,OAAA,GAAU,SAAA;AAAA,EACZ,kBAAA;AAAA,EAER,YAAY,OAAA,EAAkC;AAC5C,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,kBAAA,GAAqB,SAAS,kBAAA,IAAsB,IAAA;AAAA,EAC3D;AAAA,EAEA,MAAM,kBAAA,GAAkD;AACtD,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB;AACA,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,YAAY,CAAC,kBAAA,EAAoB,WAAW,CAAC,CAAA;AACvE,MAAA,IAAI,MAAA,CAAO,aAAa,CAAA,EAAG;AACzB,QAAA,OAAO;AAAA,UACL,EAAA,EAAI,KAAA;AAAA,UACJ,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,eAAA;AAAA,YACN,OAAA,EAAS;AAAA;AACX,SACF;AAAA,MACF;AACA,MAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,IAAA,EAAK,IAAK,SAAA;AAAA,IACzC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,eAAA;AAAA,UACN,OAAA,EAAS;AAAA;AACX,OACF;AAAA,IACF;AACA,IAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,EACpB;AAAA,EAEA,cAAc,MAAA,EAAqC;AACjD,IAAA,OAAO,EAAE,WAAA,EAAa,MAAA,CAAO,WAAA,EAAY;AAAA,EAC3C;AAAA,EAEA,MAAM,IAAI,MAAA,EAAqD;AAC7D,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,OAAO,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAc,UAAU,MAAA,EAAqD;AAC3E,IAAA,MAAM,SAAsC,EAAC;AAC7C,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAmC;AACxD,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,MAAA,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAAA,IAC9B,CAAA;AACA,IAAA,MAAM,eAAe,YAAA,EAAa;AAClC,IAAA,MAAM,QAAA,GAAW,YAAA,GAAgB,YAAA,CAAa,YAAY,KAAK,MAAA,GAAa,MAAA;AAC5E,IAAA,MAAM,aAAa,MAAM,GAAA;AAAA,MACvB,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,UAAA,EAAY,OAAO,UAAA,EAAW;AAAA,MACzD;AAAA,QACE,aAAA;AAAA,QACA,iBAAiB,MAAA,CAAO,eAAA;AAAA,QACxB,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,oBAAoB,MAAA,CAAO,kBAAA;AAAA,QAC3B;AAAA;AACF,KACF;AACA,IAAA,OAAO,EAAE,YAAY,MAAA,EAAO;AAAA,EAC9B;AAAA,EAEA,MAAc,UAAU,MAAA,EAAqD;AAC3E,IAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAc,GAAI,MAAA;AACnC,IAAA,MAAM,SAAsC,EAAC;AAC7C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AACtC,IAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,GAAA;AACrC,IAAA,MAAM,cAAA,GAAA,CAAkB,OAAA,CAAQ,OAAA,IAAW,GAAA,IAAS,QAAA;AACpD,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,kBAAkB,IAAA,EAAM,cAAA,EAAgB,CAAC,KAAA,KAAU;AAC3E,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,MAAA,aAAA,GAAgB,KAAK,CAAA;AAAA,IACvB,CAAC,CAAA;AACD,IAAA,IAAI,MAAA,CAAO,aAAa,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2CAAA,EAA8C,MAAA,CAAO,QAAQ,CAAA,CAAE,CAAA;AAAA,IACjF;AACA,IAAA,MAAM,kBAAA,GAAqB;AAAA,MACzB,aAAA;AAAA,MACA,0BAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,CAAK,CAAC,MAAM,kBAAA,CAAmB,QAAA,CAAS,CAAA,CAAE,IAAI,CAAC,CAAA;AAG5E,IAAA,IAAI,CAAC,eAAe,UAAA,EAAY;AAC9B,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,IACvE;AACA,IAAA,OAAO,EAAE,UAAA,EAAY,aAAA,CAAc,UAAA,EAAY,MAAA,EAAO;AAAA,EACxD;AAAA,EAEQ,aAAa,OAAA,EAAgD;AACnE,IAAA,MAAM,IAAA,GAAO,CAAC,KAAK,CAAA;AACnB,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,OAAA,CAAQ,KAAK,CAAA;AAAA,IACrC;AACA,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,OAAA,CAAQ,KAAK,CAAA;AAAA,IACrC;AACA,IAAA,IAAI,OAAA,CAAQ,aAAa,MAAA,EAAW;AAClC,MAAA,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,IACnD;AACA,IAAA,IAAI,OAAA,CAAQ,eAAe,MAAA,EAAW;AACpC,MAAA,IAAA,CAAK,IAAA,CAAK,eAAA,EAAiB,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAC,CAAA;AAAA,IACvD;AACA,IAAA,IAAI,OAAA,CAAQ,YAAY,MAAA,EAAW;AACjC,MAAA,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA,IAChD;AACA,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,OAAA,CAAQ,KAAK,CAAA;AAAA,IACpC;AACA,IAAA,IAAI,OAAA,CAAQ,gBAAgB,YAAA,EAAc;AACxC,MAAA,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,OAAA,CAAQ,cAAA,CAAe,YAAY,CAAA;AAAA,IAC7D;AACA,IAAA,IAAA,CAAK,KAAK,OAAA,CAAQ,SAAA,EAAW,OAAA,CAAQ,KAAA,CAAM,QAAQ,EAAE,CAAA;AACrD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,iBAAA,CACN,IAAA,EACA,OAAA,EACA,aAAA,EAC+D;AAC/D,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,kBAAA,EAAoB,IAAA,EAAM;AAAA,MAC3C,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,MACjB,KAAK,cAAA,EAAe;AAAA,MACpB,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,KAC/B,CAAA;AACD,IAAA,IAAA,CAAK,MAAM,GAAA,EAAI;AACf,IAAA,OAAO,IAAA,CAAK,oBAAA,CAAqB,IAAA,EAAM,OAAA,EAAS,aAAa,CAAA;AAAA,EAC/D;AAAA,EAEQ,oBAAA,CACN,IAAA,EACA,OAAA,EACA,aAAA,EAC+D;AAC/D,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,IAAI,MAAA,GAAS,EAAA;AACb,MAAA,IAAI,MAAA,GAAS,EAAA;AACb,MAAA,IAAI,MAAA,GAAS,EAAA;AACb,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AACnB,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,OAAO,IAAI,CAAC,CAAA;AAAA,MACnE,GAAG,OAAO,CAAA;AACV,MAAA,IAAA,CAAK,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AAChC,QAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,EAAS;AAC5B,QAAA,MAAA,IAAU,KAAA;AACV,QAAA,MAAA,IAAU,KAAA;AACV,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,QAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AACxB,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,UAAA,IAAI,CAAC,OAAA,EAAS;AACd,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjC,YAAA,MAAM,kBAAA,GAAqB;AAAA,cACzB,aAAA;AAAA,cACA,0BAAA;AAAA,cACA,mBAAA;AAAA,cACA;AAAA,aACF;AACA,YAAA,IAAI,mBAAmB,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA,IAAK,gBAAgB,MAAA,EAAQ;AACtE,cAAA,MAAM,iBAAiB,MAAA,CAAO,UAAA;AAC9B,cAAA,MAAA,CAAO,UAAA,GAAa,gBAAA,CAAiB,KAAA,CAAM,cAAc,CAAA;AAAA,YAC3D;AACA,YAAA,aAAA,CAAc,MAAM,CAAA;AAAA,UACtB,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AAChC,QAAA,MAAA,IAAU,KAAK,QAAA,EAAS;AAAA,MAC1B,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AACzB,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,IAAA,IAAQ,KAAK,CAAA;AAAA,MACnD,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACxB,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,MAAA,CAAO,GAAG,CAAA;AAAA,MACZ,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AACF;;;ACjNA,eAAA,CAAgB,OAAA,EAAS,MAAM,IAAI,eAAA,EAAiB,CAAA;AAY7C,IAAM,iBAAiB,eAAA,CAAI","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.
|
|
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.
|
|
39
|
-
"@perstack/base": "0.0.
|
|
40
|
-
"@perstack/core": "0.0.
|
|
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/
|
|
50
|
-
"@perstack/
|
|
51
|
-
"@perstack/
|
|
52
|
-
"@perstack/
|
|
53
|
-
"@perstack/
|
|
54
|
-
"@perstack/
|
|
55
|
-
"@perstack/
|
|
56
|
-
"@perstack/provider
|
|
57
|
-
"@perstack/
|
|
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"
|