@perstack/runtime 0.0.69 → 0.0.71
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/LICENSE +202 -0
- package/README.md +0 -1
- package/dist/bin/cli.js +12 -5
- package/dist/bin/cli.js.map +1 -1
- package/dist/{chunk-H65LPOAK.js → chunk-LDJKVMQK.js} +755 -753
- package/dist/chunk-LDJKVMQK.js.map +1 -0
- package/dist/chunk-RG4QHAGG.js +935 -0
- package/dist/chunk-RG4QHAGG.js.map +1 -0
- package/dist/lockfile-skill-manager-LG2E4KAZ.js +3 -0
- package/dist/lockfile-skill-manager-LG2E4KAZ.js.map +1 -0
- package/dist/src/index.d.ts +160 -16
- package/dist/src/index.js +8 -6
- package/dist/src/index.js.map +1 -1
- package/package.json +39 -35
- package/bin/cli.ts +0 -99
- package/dist/chunk-H65LPOAK.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/skill-manager/base.ts","../src/skill-manager/delegate.ts","../src/skill-manager/mcp-converters.ts","../src/skill-manager/transport-factory.ts","../src/skill-manager/in-memory-base.ts","../src/skill-manager/interactive.ts","../src/skill-manager/command-args.ts","../src/skill-manager/ip-validator.ts","../src/skill-manager/mcp.ts","../src/skill-manager/skill-manager-factory.ts","../src/skill-manager/helpers.ts","../src/skill-manager/lockfile-skill-manager.ts"],"names":["tool","McpClient","createRuntimeEvent","McpError","LockfileSkillManager"],"mappings":"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","file":"chunk-RG4QHAGG.js","sourcesContent":["import type {\n Expert,\n FileInlinePart,\n ImageInlinePart,\n InteractiveSkill,\n McpSseSkill,\n McpStdioSkill,\n RunEvent,\n RuntimeEvent,\n SkillType,\n TextPart,\n ToolDefinition,\n} from \"@perstack/core\"\n\nexport abstract class BaseSkillManager {\n protected _toolDefinitions: ToolDefinition[] = []\n protected _initialized = false\n protected _initializing?: Promise<void>\n abstract readonly name: string\n abstract readonly type: SkillType\n abstract readonly lazyInit: boolean\n readonly skill?: McpStdioSkill | McpSseSkill\n readonly interactiveSkill?: InteractiveSkill\n readonly expert?: Expert\n protected _jobId: string\n protected _runId: string\n protected _eventListener?: (event: RunEvent | RuntimeEvent) => void\n\n constructor(\n jobId: string,\n runId: string,\n eventListener?: (event: RunEvent | RuntimeEvent) => void,\n ) {\n this._jobId = jobId\n this._runId = runId\n this._eventListener = eventListener\n }\n\n async init(): Promise<void> {\n if (this._initialized) {\n throw new Error(`Skill ${this.name} is already initialized`)\n }\n if (this._initializing) {\n throw new Error(`Skill ${this.name} is already initializing`)\n }\n const initPromise = this._performInit()\n this._initializing = initPromise\n if (!this.lazyInit) {\n try {\n await initPromise\n } catch (error) {\n this._initialized = false\n this._initializing = undefined\n throw error\n }\n }\n }\n\n isInitialized(): boolean {\n return this._initialized\n }\n\n protected async _performInit(): Promise<void> {\n await this._doInit()\n this._initialized = true\n this._initializing = undefined\n }\n\n protected abstract _doInit(): Promise<void>\n\n abstract close(): Promise<void>\n\n async getToolDefinitions(): Promise<ToolDefinition[]> {\n // If initialization is in progress, wait for it to complete\n if (!this.isInitialized() && this._initializing) {\n await this._initializing\n }\n if (!this.isInitialized()) {\n throw new Error(`Skill ${this.name} is not initialized`)\n }\n return this._filterTools(this._toolDefinitions)\n }\n\n protected _filterTools(tools: ToolDefinition[]): ToolDefinition[] {\n return tools\n }\n\n abstract callTool(\n toolName: string,\n input: Record<string, unknown>,\n ): Promise<Array<TextPart | ImageInlinePart | FileInlinePart>>\n}\n","import type {\n Expert,\n FileInlinePart,\n ImageInlinePart,\n RunEvent,\n RuntimeEvent,\n SkillType,\n TextPart,\n} from \"@perstack/core\"\nimport { BaseSkillManager } from \"./base.js\"\n\nexport class DelegateSkillManager extends BaseSkillManager {\n readonly name: string\n readonly type: SkillType = \"delegate\"\n readonly lazyInit = false\n override readonly expert: Expert\n\n constructor(\n expert: Expert,\n jobId: string,\n runId: string,\n eventListener?: (event: RunEvent | RuntimeEvent) => void,\n ) {\n super(jobId, runId, eventListener)\n this.name = expert.name\n this.expert = expert\n }\n\n protected override async _doInit(): Promise<void> {\n this._toolDefinitions = [\n {\n skillName: this.expert.name,\n name: this.expert.name.split(\"/\").pop() ?? this.expert.name,\n description: this.expert.description,\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\" },\n },\n required: [\"query\"],\n },\n interactive: false,\n },\n ]\n }\n\n override async close(): Promise<void> {}\n\n override async callTool(\n _toolName: string,\n _input: Record<string, unknown>,\n ): Promise<Array<TextPart | ImageInlinePart | FileInlinePart>> {\n return []\n }\n}\n","import type { CallToolResult, McpError } from \"@modelcontextprotocol/sdk/types.js\"\nimport { createId } from \"@paralleldrive/cuid2\"\nimport type {\n CallToolResultContent,\n FileInlinePart,\n ImageInlinePart,\n Resource,\n TextPart,\n} from \"@perstack/core\"\n\n/**\n * Handle MCP tool errors and convert them to TextPart responses.\n * McpError instances are converted to error messages, other errors are re-thrown.\n */\nexport function handleToolError(\n error: unknown,\n toolName: string,\n McpErrorClass: typeof McpError,\n): Array<TextPart> {\n if (error instanceof McpErrorClass) {\n return [\n {\n type: \"textPart\",\n text: `Error calling tool ${toolName}: ${error.message}`,\n id: createId(),\n },\n ]\n }\n throw error\n}\n\n/**\n * Convert MCP CallToolResult to internal part types.\n */\nexport function convertToolResult(\n result: CallToolResult,\n toolName: string,\n input: Record<string, unknown>,\n): Array<TextPart | ImageInlinePart | FileInlinePart> {\n if (!result.content || result.content.length === 0) {\n return [\n {\n type: \"textPart\",\n text: `Tool ${toolName} returned nothing with arguments: ${JSON.stringify(input)}`,\n id: createId(),\n },\n ]\n }\n\n return result.content\n .filter((part) => part.type !== \"audio\" && part.type !== \"resource_link\")\n .map((part) => convertPart(part as CallToolResultContent))\n}\n\n/**\n * Convert a single MCP content part to internal part type.\n */\nexport function convertPart(\n part: CallToolResultContent,\n): TextPart | ImageInlinePart | FileInlinePart {\n switch (part.type) {\n case \"text\":\n if (!part.text || part.text === \"\") {\n return { type: \"textPart\", text: \"Error: No content\", id: createId() }\n }\n return { type: \"textPart\", text: part.text, id: createId() }\n\n case \"image\":\n if (!part.data || !part.mimeType) {\n throw new Error(\"Image part must have both data and mimeType\")\n }\n return {\n type: \"imageInlinePart\",\n encodedData: part.data,\n mimeType: part.mimeType,\n id: createId(),\n }\n\n case \"resource\":\n if (!part.resource) {\n throw new Error(\"Resource part must have resource content\")\n }\n return convertResource(part.resource)\n }\n}\n\n/**\n * Convert MCP resource to internal part type.\n */\nexport function convertResource(resource: Resource): TextPart | FileInlinePart {\n if (!resource.mimeType) {\n throw new Error(`Resource ${JSON.stringify(resource)} has no mimeType`)\n }\n\n if (resource.text && typeof resource.text === \"string\") {\n return { type: \"textPart\", text: resource.text, id: createId() }\n }\n\n if (resource.blob && typeof resource.blob === \"string\") {\n return {\n type: \"fileInlinePart\",\n encodedData: resource.blob,\n mimeType: resource.mimeType,\n id: createId(),\n }\n }\n\n throw new Error(`Unsupported resource type: ${JSON.stringify(resource)}`)\n}\n","import { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\"\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\"\nimport { InMemoryTransport } from \"@modelcontextprotocol/sdk/inMemory.js\"\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\"\n\nexport interface StdioTransportOptions {\n command: string\n args: string[]\n env: Record<string, string>\n stderr?: \"pipe\" | \"inherit\" | \"ignore\"\n}\n\nexport interface SseTransportOptions {\n url: URL\n}\n\n/**\n * Factory interface for creating MCP transports.\n * Allows for dependency injection and easier testing.\n */\nexport interface TransportFactory {\n createStdio(options: StdioTransportOptions): StdioClientTransport\n createSse(options: SseTransportOptions): Transport\n /**\n * Create a linked pair of in-memory transports for in-process MCP communication.\n * Returns [clientTransport, serverTransport].\n */\n createInMemoryPair(): [Transport, Transport]\n}\n\n/**\n * Default implementation of TransportFactory using real MCP SDK transports.\n */\nexport class DefaultTransportFactory implements TransportFactory {\n createStdio(options: StdioTransportOptions): StdioClientTransport {\n return new StdioClientTransport({\n command: options.command,\n args: options.args,\n env: options.env,\n stderr: options.stderr,\n })\n }\n\n createSse(options: SseTransportOptions): Transport {\n return new SSEClientTransport(options.url)\n }\n\n createInMemoryPair(): [Transport, Transport] {\n return InMemoryTransport.createLinkedPair()\n }\n}\n\n/**\n * Default transport factory instance.\n */\nexport const defaultTransportFactory = new DefaultTransportFactory()\n","import { Client as McpClient } from \"@modelcontextprotocol/sdk/client/index.js\"\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { type CallToolResult, McpError } from \"@modelcontextprotocol/sdk/types.js\"\nimport { BASE_SKILL_NAME, BASE_SKILL_VERSION, createBaseServer } from \"@perstack/base\"\nimport {\n createRuntimeEvent,\n type FileInlinePart,\n type ImageInlinePart,\n type McpStdioSkill,\n type RunEvent,\n type RuntimeEvent,\n type SkillType,\n type TextPart,\n type ToolDefinition,\n} from \"@perstack/core\"\nimport { BaseSkillManager } from \"./base.js\"\nimport { convertToolResult, handleToolError } from \"./mcp-converters.js\"\nimport { defaultTransportFactory, type TransportFactory } from \"./transport-factory.js\"\n\nexport interface InMemoryBaseSkillManagerOptions {\n transportFactory?: TransportFactory\n}\n\n/**\n * Skill manager for bundled @perstack/base using InMemoryTransport.\n * Runs the base skill in-process for near-zero initialization latency.\n */\nexport class InMemoryBaseSkillManager extends BaseSkillManager {\n readonly name = BASE_SKILL_NAME\n readonly type: SkillType = \"mcp\"\n readonly lazyInit = false\n override readonly skill: McpStdioSkill\n private _mcpServer?: McpServer\n private _mcpClient?: McpClient\n private _transportFactory: TransportFactory\n\n constructor(\n skill: McpStdioSkill,\n jobId: string,\n runId: string,\n eventListener?: (event: RunEvent | RuntimeEvent) => void,\n options?: InMemoryBaseSkillManagerOptions,\n ) {\n super(jobId, runId, eventListener)\n this.skill = skill\n this._transportFactory = options?.transportFactory ?? defaultTransportFactory\n }\n\n protected override _filterTools(tools: ToolDefinition[]): ToolDefinition[] {\n const omit = this.skill.omit ?? []\n const pick = this.skill.pick ?? []\n return tools\n .filter((tool) => (omit.length > 0 ? !omit.includes(tool.name) : true))\n .filter((tool) => (pick.length > 0 ? pick.includes(tool.name) : true))\n }\n\n protected override async _doInit(): Promise<void> {\n const startTime = Date.now()\n\n // Create linked transport pair\n const [clientTransport, serverTransport] = this._transportFactory.createInMemoryPair()\n\n // Create and connect the base server\n this._mcpServer = createBaseServer()\n await this._mcpServer.connect(serverTransport)\n\n // Create and connect the client\n this._mcpClient = new McpClient({\n name: `${BASE_SKILL_NAME}-in-memory-client`,\n version: \"1.0.0\",\n })\n\n const handshakeStartTime = Date.now()\n await this._mcpClient.connect(clientTransport)\n const handshakeDurationMs = Date.now() - handshakeStartTime\n\n // Discover tools\n const toolDiscoveryStartTime = Date.now()\n const { tools } = await this._mcpClient.listTools()\n const toolDiscoveryDurationMs = Date.now() - toolDiscoveryStartTime\n\n this._toolDefinitions = tools.map((tool) => ({\n skillName: BASE_SKILL_NAME,\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n interactive: false,\n }))\n\n // Emit connected event\n if (this._eventListener) {\n const totalDurationMs = Date.now() - startTime\n const event = createRuntimeEvent(\"skillConnected\", this._jobId, this._runId, {\n skillName: BASE_SKILL_NAME,\n serverInfo: { name: BASE_SKILL_NAME, version: BASE_SKILL_VERSION },\n spawnDurationMs: 0, // No process spawn for in-memory\n handshakeDurationMs,\n toolDiscoveryDurationMs,\n connectDurationMs: handshakeDurationMs,\n totalDurationMs,\n })\n this._eventListener(event)\n }\n }\n\n override async close(): Promise<void> {\n if (this._mcpClient) {\n await this._mcpClient.close()\n }\n if (this._mcpServer) {\n await this._mcpServer.close()\n }\n if (this._eventListener && (this._mcpClient || this._mcpServer)) {\n const event = createRuntimeEvent(\"skillDisconnected\", this._jobId, this._runId, {\n skillName: BASE_SKILL_NAME,\n })\n this._eventListener(event)\n }\n }\n\n override async callTool(\n toolName: string,\n input: Record<string, unknown>,\n ): Promise<Array<TextPart | ImageInlinePart | FileInlinePart>> {\n if (!this.isInitialized() || !this._mcpClient) {\n throw new Error(`${this.name} is not initialized`)\n }\n try {\n const result = (await this._mcpClient.callTool({\n name: toolName,\n arguments: input,\n })) as CallToolResult\n return convertToolResult(result, toolName, input)\n } catch (error) {\n return handleToolError(error, toolName, McpError)\n }\n }\n}\n","import type {\n FileInlinePart,\n ImageInlinePart,\n InteractiveSkill,\n RunEvent,\n RuntimeEvent,\n SkillType,\n TextPart,\n} from \"@perstack/core\"\nimport { BaseSkillManager } from \"./base.js\"\n\nexport class InteractiveSkillManager extends BaseSkillManager {\n readonly name: string\n readonly type: SkillType = \"interactive\"\n readonly lazyInit = false\n override readonly interactiveSkill: InteractiveSkill\n\n constructor(\n interactiveSkill: InteractiveSkill,\n jobId: string,\n runId: string,\n eventListener?: (event: RunEvent | RuntimeEvent) => void,\n ) {\n super(jobId, runId, eventListener)\n this.name = interactiveSkill.name\n this.interactiveSkill = interactiveSkill\n }\n\n protected override async _doInit(): Promise<void> {\n this._toolDefinitions = Object.values(this.interactiveSkill.tools).map((tool) => ({\n skillName: this.interactiveSkill.name,\n name: tool.name,\n description: tool.description,\n inputSchema: JSON.parse(tool.inputJsonSchema),\n interactive: true,\n }))\n }\n\n override async close(): Promise<void> {}\n\n override async callTool(\n _toolName: string,\n _input: Record<string, unknown>,\n ): Promise<Array<TextPart | ImageInlinePart | FileInlinePart>> {\n return []\n }\n}\n","import type { McpStdioSkill } from \"@perstack/core\"\n\nexport interface CommandArgs {\n command: string\n args: string[]\n}\n\n/**\n * Parse and validate command arguments from a McpStdioSkill.\n * Ensures either packageName or args is provided (not both, not neither).\n * Adds -y flag for npx commands if not present.\n */\nexport function getCommandArgs(skill: McpStdioSkill): CommandArgs {\n const { name, command, packageName, args } = skill\n\n if (!packageName && (!args || args.length === 0)) {\n throw new Error(`Skill ${name} has no packageName or args. Please provide one of them.`)\n }\n\n if (packageName && args && args.length > 0) {\n throw new Error(`Skill ${name} has both packageName and args. Please provide only one of them.`)\n }\n\n let newArgs = args && args.length > 0 ? args : [packageName!]\n\n // Add -y flag for npx to auto-confirm package installation\n if (command === \"npx\" && !newArgs.includes(\"-y\")) {\n newArgs = [\"-y\", ...newArgs]\n }\n\n return { command, args: newArgs }\n}\n","/**\n * Check if a hostname is a private or local IP address.\n * Used to validate SSE endpoints - private/local IPs are not allowed.\n */\nexport function isPrivateOrLocalIP(hostname: string): boolean {\n // Check common local hostnames\n if (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"::1\" ||\n hostname === \"0.0.0.0\"\n ) {\n return true\n }\n\n // Check IPv4 private ranges\n const ipv4Match = hostname.match(/^(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)$/)\n if (ipv4Match) {\n const [, a, b] = ipv4Match.map(Number)\n // 10.0.0.0/8\n if (a === 10) return true\n // 172.16.0.0/12\n if (a === 172 && b >= 16 && b <= 31) return true\n // 192.168.0.0/16\n if (a === 192 && b === 168) return true\n // 169.254.0.0/16 (link-local)\n if (a === 169 && b === 254) return true\n // 127.0.0.0/8 (loopback)\n if (a === 127) return true\n }\n\n // Check IPv6 private ranges\n if (hostname.includes(\":\")) {\n // fe80::/10 (link-local)\n if (hostname.startsWith(\"fe80:\")) return true\n // fc00::/7 (unique local)\n if (hostname.startsWith(\"fc\") || hostname.startsWith(\"fd\")) return true\n }\n\n // Check IPv4-mapped IPv6 addresses\n if (hostname.startsWith(\"::ffff:\")) {\n const ipv4Part = hostname.slice(7)\n if (isPrivateOrLocalIP(ipv4Part)) {\n return true\n }\n }\n\n return false\n}\n","import { Client as McpClient } from \"@modelcontextprotocol/sdk/client/index.js\"\nimport type { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\"\nimport { type CallToolResult, McpError } from \"@modelcontextprotocol/sdk/types.js\"\nimport {\n createRuntimeEvent,\n type FileInlinePart,\n getFilteredEnv,\n type ImageInlinePart,\n type McpSseSkill,\n type McpStdioSkill,\n type RunEvent,\n type RuntimeEvent,\n type SkillType,\n type TextPart,\n type ToolDefinition,\n} from \"@perstack/core\"\nimport { BaseSkillManager } from \"./base.js\"\nimport { getCommandArgs } from \"./command-args.js\"\nimport { isPrivateOrLocalIP } from \"./ip-validator.js\"\nimport { convertToolResult, handleToolError } from \"./mcp-converters.js\"\nimport { defaultTransportFactory, type TransportFactory } from \"./transport-factory.js\"\n\ninterface InitTimingInfo {\n startTime: number\n spawnDurationMs: number\n handshakeDurationMs: number\n serverInfo?: { name: string; version: string }\n}\n\nexport interface McpSkillManagerOptions {\n transportFactory?: TransportFactory\n}\n\nexport class McpSkillManager extends BaseSkillManager {\n readonly name: string\n readonly type: SkillType = \"mcp\"\n readonly lazyInit: boolean\n override readonly skill: McpStdioSkill | McpSseSkill\n private _mcpClient?: McpClient\n private _env: Record<string, string>\n private _transportFactory: TransportFactory\n\n constructor(\n skill: McpStdioSkill | McpSseSkill,\n env: Record<string, string>,\n jobId: string,\n runId: string,\n eventListener?: (event: RunEvent | RuntimeEvent) => void,\n options?: McpSkillManagerOptions,\n ) {\n super(jobId, runId, eventListener)\n this.name = skill.name\n this.skill = skill\n this._env = env\n this._transportFactory = options?.transportFactory ?? defaultTransportFactory\n this.lazyInit =\n skill.type === \"mcpStdioSkill\" && skill.lazyInit && skill.name !== \"@perstack/base\"\n }\n\n protected override async _doInit(): Promise<void> {\n this._mcpClient = new McpClient({\n name: `${this.skill.name}-mcp-client`,\n version: \"1.0.0\",\n })\n let timingInfo: InitTimingInfo | undefined\n if (this.skill.type === \"mcpStdioSkill\") {\n timingInfo = await this._initStdio(this.skill)\n } else {\n await this._initSse(this.skill)\n }\n const toolDiscoveryStartTime = Date.now()\n const { tools } = await this._mcpClient.listTools()\n const toolDiscoveryDurationMs = Date.now() - toolDiscoveryStartTime\n this._toolDefinitions = tools.map((tool) => ({\n skillName: this.skill.name,\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n interactive: false,\n }))\n if (this._eventListener && timingInfo) {\n const totalDurationMs = Date.now() - timingInfo.startTime\n const event = createRuntimeEvent(\"skillConnected\", this._jobId, this._runId, {\n skillName: this.skill.name,\n serverInfo: timingInfo.serverInfo,\n spawnDurationMs: timingInfo.spawnDurationMs,\n handshakeDurationMs: timingInfo.handshakeDurationMs,\n toolDiscoveryDurationMs,\n connectDurationMs: timingInfo.spawnDurationMs + timingInfo.handshakeDurationMs,\n totalDurationMs,\n })\n this._eventListener(event)\n }\n }\n\n private async _initStdio(skill: McpStdioSkill): Promise<InitTimingInfo> {\n if (!skill.command) {\n throw new Error(`Skill ${skill.name} has no command`)\n }\n const requiredEnv: Record<string, string> = {}\n for (const envName of skill.requiredEnv) {\n if (!this._env[envName]) {\n throw new Error(`Skill ${skill.name} requires environment variable ${envName}`)\n }\n requiredEnv[envName] = this._env[envName]\n }\n const env = getFilteredEnv(requiredEnv)\n const startTime = Date.now()\n const { command, args } = getCommandArgs(skill)\n if (this._eventListener) {\n const event = createRuntimeEvent(\"skillStarting\", this._jobId, this._runId, {\n skillName: skill.name,\n command,\n args,\n })\n this._eventListener(event)\n }\n const transport = this._transportFactory.createStdio({ command, args, env, stderr: \"pipe\" })\n const spawnDurationMs = Date.now() - startTime\n if ((transport as StdioClientTransport).stderr) {\n ;(transport as StdioClientTransport).stderr!.on(\"data\", (chunk: Buffer) => {\n if (this._eventListener) {\n const event = createRuntimeEvent(\"skillStderr\", this._jobId, this._runId, {\n skillName: skill.name,\n message: chunk.toString().trim(),\n })\n this._eventListener(event)\n }\n })\n }\n const connectStartTime = Date.now()\n await this._mcpClient!.connect(transport)\n const handshakeDurationMs = Date.now() - connectStartTime\n const serverVersion = this._mcpClient!.getServerVersion()\n return {\n startTime,\n spawnDurationMs,\n handshakeDurationMs,\n serverInfo: serverVersion\n ? { name: serverVersion.name, version: serverVersion.version }\n : undefined,\n }\n }\n\n private async _initSse(skill: McpSseSkill): Promise<void> {\n if (!skill.endpoint) {\n throw new Error(`Skill ${skill.name} has no endpoint`)\n }\n const url = new URL(skill.endpoint)\n if (url.protocol !== \"https:\") {\n throw new Error(`Skill ${skill.name} SSE endpoint must use HTTPS: ${skill.endpoint}`)\n }\n if (isPrivateOrLocalIP(url.hostname)) {\n throw new Error(\n `Skill ${skill.name} SSE endpoint cannot use private/local IP: ${skill.endpoint}`,\n )\n }\n const transport = this._transportFactory.createSse({ url })\n await this._mcpClient!.connect(transport)\n }\n\n override async close(): Promise<void> {\n if (this._mcpClient) {\n await this._mcpClient.close()\n if (this._eventListener && this.skill) {\n const event = createRuntimeEvent(\"skillDisconnected\", this._jobId, this._runId, {\n skillName: this.skill.name,\n })\n this._eventListener(event)\n }\n }\n }\n\n protected override _filterTools(tools: ToolDefinition[]): ToolDefinition[] {\n const omit = this.skill.omit ?? []\n const pick = this.skill.pick ?? []\n return tools\n .filter((tool) => (omit.length > 0 ? !omit.includes(tool.name) : true))\n .filter((tool) => (pick.length > 0 ? pick.includes(tool.name) : true))\n }\n\n override async callTool(\n toolName: string,\n input: Record<string, unknown>,\n ): Promise<Array<TextPart | ImageInlinePart | FileInlinePart>> {\n if (!this.isInitialized() || !this._mcpClient) {\n throw new Error(`${this.name} is not initialized`)\n }\n try {\n const result = (await this._mcpClient.callTool({\n name: toolName,\n arguments: input,\n })) as CallToolResult\n return convertToolResult(result, toolName, input)\n } catch (error) {\n return handleToolError(error, toolName, McpError)\n }\n }\n}\n","import type {\n Expert,\n InteractiveSkill,\n McpSseSkill,\n McpStdioSkill,\n RunEvent,\n RuntimeEvent,\n} from \"@perstack/core\"\nimport type { BaseSkillManager } from \"./base.js\"\nimport { DelegateSkillManager } from \"./delegate.js\"\nimport { InMemoryBaseSkillManager } from \"./in-memory-base.js\"\nimport { InteractiveSkillManager } from \"./interactive.js\"\nimport { McpSkillManager, type McpSkillManagerOptions } from \"./mcp.js\"\n\nexport interface SkillManagerFactoryContext {\n env: Record<string, string>\n jobId: string\n runId: string\n eventListener?: (event: RunEvent | RuntimeEvent) => void\n mcpOptions?: McpSkillManagerOptions\n}\n\n/**\n * Factory interface for creating skill managers.\n * Allows for dependency injection and easier testing.\n */\nexport interface SkillManagerFactory {\n createMcp(\n skill: McpStdioSkill | McpSseSkill,\n context: SkillManagerFactoryContext,\n ): BaseSkillManager\n /**\n * Create an in-memory base skill manager using InMemoryTransport.\n * This provides near-zero initialization latency for the bundled base skill.\n */\n createInMemoryBase(skill: McpStdioSkill, context: SkillManagerFactoryContext): BaseSkillManager\n createInteractive(skill: InteractiveSkill, context: SkillManagerFactoryContext): BaseSkillManager\n createDelegate(expert: Expert, context: SkillManagerFactoryContext): BaseSkillManager\n}\n\n/**\n * Default implementation of SkillManagerFactory using real skill manager classes.\n */\nexport class DefaultSkillManagerFactory implements SkillManagerFactory {\n createMcp(\n skill: McpStdioSkill | McpSseSkill,\n context: SkillManagerFactoryContext,\n ): BaseSkillManager {\n return new McpSkillManager(\n skill,\n context.env,\n context.jobId,\n context.runId,\n context.eventListener,\n context.mcpOptions,\n )\n }\n\n createInMemoryBase(skill: McpStdioSkill, context: SkillManagerFactoryContext): BaseSkillManager {\n return new InMemoryBaseSkillManager(skill, context.jobId, context.runId, context.eventListener)\n }\n\n createInteractive(\n skill: InteractiveSkill,\n context: SkillManagerFactoryContext,\n ): BaseSkillManager {\n return new InteractiveSkillManager(skill, context.jobId, context.runId, context.eventListener)\n }\n\n createDelegate(expert: Expert, context: SkillManagerFactoryContext): BaseSkillManager {\n return new DelegateSkillManager(expert, context.jobId, context.runId, context.eventListener)\n }\n}\n\n/**\n * Default skill manager factory instance.\n */\nexport const defaultSkillManagerFactory = new DefaultSkillManagerFactory()\n","import type {\n Expert,\n InteractiveSkill,\n McpSseSkill,\n McpStdioSkill,\n RunEvent,\n RunSetting,\n RuntimeEvent,\n} from \"@perstack/core\"\nimport { jsonSchema, type ToolSet, tool } from \"ai\"\nimport type { BaseSkillManager } from \"./base.js\"\nimport {\n defaultSkillManagerFactory,\n type SkillManagerFactory,\n type SkillManagerFactoryContext,\n} from \"./skill-manager-factory.js\"\n\n/**\n * Initialize skill managers and cleanup on failure.\n * Exported for testing purposes.\n */\nexport async function initSkillManagersWithCleanup(\n managers: BaseSkillManager[],\n allManagers: BaseSkillManager[],\n): Promise<void> {\n const results = await Promise.allSettled(managers.map((m) => m.init()))\n const firstRejected = results.find((r) => r.status === \"rejected\")\n if (firstRejected) {\n await Promise.all(allManagers.map((m) => m.close().catch(() => {})))\n throw (firstRejected as PromiseRejectedResult).reason\n }\n}\n\nexport interface GetSkillManagersOptions {\n isDelegatedRun?: boolean\n factory?: SkillManagerFactory\n}\n\n/**\n * Check if a base skill has an explicit version specified.\n * Examples of versioned packages:\n * - packageName: \"@perstack/base@0.0.34\"\n * - args: [\"@perstack/base@0.0.34\"]\n */\nexport function hasExplicitBaseVersion(skill: McpStdioSkill): boolean {\n // Check packageName for version: @perstack/base@1.2.3\n // The @ symbol appears twice: once at the start of the scope, once before the version\n if (skill.packageName) {\n const atSignIndex = skill.packageName.indexOf(\"@\", 1) // Skip the leading @ in @perstack\n if (atSignIndex > 0) {\n return true\n }\n }\n\n // Check args for versioned package\n if (skill.args) {\n for (const arg of skill.args) {\n if (arg.startsWith(\"@perstack/base@\")) {\n // Check if there's a version after @perstack/base@\n const versionStart = \"@perstack/base@\".length\n if (arg.length > versionStart) {\n return true\n }\n }\n }\n }\n\n return false\n}\n\n/**\n * Check if a skill is the @perstack/base skill (by name or package).\n */\nexport function isBaseSkill(skill: McpStdioSkill | McpSseSkill): boolean {\n if (skill.name === \"@perstack/base\") {\n return true\n }\n if (skill.type === \"mcpStdioSkill\") {\n const stdioSkill = skill as McpStdioSkill\n if (stdioSkill.packageName?.startsWith(\"@perstack/base\")) {\n return true\n }\n if (stdioSkill.args?.some((arg) => arg.startsWith(\"@perstack/base\"))) {\n return true\n }\n }\n return false\n}\n\n/**\n * Determine if the bundled in-memory base should be used.\n * Returns true if:\n * - No perstackBaseSkillCommand override is set\n * - The base skill doesn't have an explicit version pinned\n */\nexport function shouldUseBundledBase(\n baseSkill: McpStdioSkill | McpSseSkill,\n perstackBaseSkillCommand?: string[],\n): boolean {\n // If a custom command is specified, don't use bundled base\n if (perstackBaseSkillCommand && perstackBaseSkillCommand.length > 0) {\n return false\n }\n\n // SSE skills can't use bundled base\n if (baseSkill.type === \"mcpSseSkill\") {\n return false\n }\n\n // If explicit version is specified, use npx instead of bundled\n if (hasExplicitBaseVersion(baseSkill)) {\n return false\n }\n\n return true\n}\n\nexport async function getSkillManagers(\n expert: Expert,\n experts: Record<string, Expert>,\n setting: RunSetting,\n eventListener?: (event: RunEvent | RuntimeEvent) => void,\n options?: GetSkillManagersOptions,\n): Promise<Record<string, BaseSkillManager>> {\n const { perstackBaseSkillCommand, env, jobId, runId } = setting\n const { skills } = expert\n const factory = options?.factory ?? defaultSkillManagerFactory\n\n if (!skills[\"@perstack/base\"]) {\n throw new Error(\"Base skill is not defined\")\n }\n\n const factoryContext: SkillManagerFactoryContext = {\n env,\n jobId,\n runId,\n eventListener,\n }\n\n const allManagers: BaseSkillManager[] = []\n const baseSkill = skills[\"@perstack/base\"]\n\n // Determine if we should use bundled in-memory base\n const useBundledBase =\n (baseSkill.type === \"mcpStdioSkill\" || baseSkill.type === \"mcpSseSkill\") &&\n shouldUseBundledBase(baseSkill, perstackBaseSkillCommand)\n\n // Process base skill first\n if (useBundledBase && baseSkill.type === \"mcpStdioSkill\") {\n // Warn if requiredEnv is set (has no effect with bundled base)\n if (baseSkill.requiredEnv.length > 0) {\n console.warn(\n `[perstack] requiredEnv is ignored for bundled @perstack/base. Pin a version to enable it.`,\n )\n }\n // Use InMemoryTransport for bundled base (near-zero latency)\n const baseManager = factory.createInMemoryBase(baseSkill, factoryContext)\n allManagers.push(baseManager)\n await initSkillManagersWithCleanup([baseManager], allManagers)\n }\n\n // Process MCP skills (excluding base if using bundled)\n const mcpSkills = Object.values(skills)\n .filter(\n (skill): skill is McpStdioSkill | McpSseSkill =>\n skill.type === \"mcpStdioSkill\" || skill.type === \"mcpSseSkill\",\n )\n .filter((skill) => {\n // Skip base skill if we're using bundled base\n if (useBundledBase && isBaseSkill(skill)) {\n return false\n }\n return true\n })\n .map((skill) => {\n if (perstackBaseSkillCommand && skill.type === \"mcpStdioSkill\") {\n const matchesBaseByPackage =\n skill.command === \"npx\" && skill.packageName === \"@perstack/base\"\n const matchesBaseByArgs =\n skill.command === \"npx\" &&\n Array.isArray(skill.args) &&\n skill.args.includes(\"@perstack/base\")\n if (matchesBaseByPackage || matchesBaseByArgs) {\n const [overrideCommand, ...overrideArgs] = perstackBaseSkillCommand\n if (!overrideCommand) {\n throw new Error(\"perstackBaseSkillCommand must have at least one element\")\n }\n return {\n ...skill,\n command: overrideCommand,\n packageName: undefined,\n args: overrideArgs,\n lazyInit: false,\n } as McpStdioSkill\n }\n }\n return skill\n })\n\n const mcpSkillManagers = mcpSkills.map((skill) => {\n const manager = factory.createMcp(skill, factoryContext)\n allManagers.push(manager)\n return manager\n })\n await initSkillManagersWithCleanup(mcpSkillManagers, allManagers)\n\n // Process interactive skills (not for delegated runs)\n if (!options?.isDelegatedRun) {\n const interactiveSkills = Object.values(skills).filter(\n (skill): skill is InteractiveSkill => skill.type === \"interactiveSkill\",\n )\n const interactiveSkillManagers = interactiveSkills.map((interactiveSkill) => {\n const manager = factory.createInteractive(interactiveSkill, factoryContext)\n allManagers.push(manager)\n return manager\n })\n await initSkillManagersWithCleanup(interactiveSkillManagers, allManagers)\n }\n\n // Process delegate experts\n const delegateSkillManagers: BaseSkillManager[] = []\n for (const delegateExpertName of expert.delegates) {\n const delegate = experts[delegateExpertName]\n if (!delegate) {\n await Promise.all(allManagers.map((m) => m.close().catch(() => {})))\n throw new Error(`Delegate expert \"${delegateExpertName}\" not found in experts`)\n }\n const manager = factory.createDelegate(delegate, factoryContext)\n allManagers.push(manager)\n delegateSkillManagers.push(manager)\n }\n await initSkillManagersWithCleanup(delegateSkillManagers, allManagers)\n\n const skillManagers: Record<string, BaseSkillManager> = {}\n for (const manager of allManagers) {\n skillManagers[manager.name] = manager\n }\n return skillManagers\n}\n\nexport async function closeSkillManagers(\n skillManagers: Record<string, BaseSkillManager>,\n): Promise<void> {\n await Promise.all(Object.values(skillManagers).map((m) => m.close().catch(() => {})))\n}\n\nexport async function getSkillManagerByToolName(\n skillManagers: Record<string, BaseSkillManager>,\n toolName: string,\n): Promise<BaseSkillManager> {\n for (const skillManager of Object.values(skillManagers)) {\n const toolDefinitions = await skillManager.getToolDefinitions()\n for (const toolDefinition of toolDefinitions) {\n if (toolDefinition.name === toolName) {\n return skillManager\n }\n }\n }\n throw new Error(`Tool ${toolName} not found`)\n}\n\nexport async function getToolSet(\n skillManagers: Record<string, BaseSkillManager>,\n): Promise<ToolSet> {\n const tools: ToolSet = {}\n for (const skillManager of Object.values(skillManagers)) {\n const toolDefinitions = await skillManager.getToolDefinitions()\n for (const toolDefinition of toolDefinitions) {\n tools[toolDefinition.name] = tool({\n description: toolDefinition.description,\n inputSchema: jsonSchema(toolDefinition.inputSchema),\n })\n }\n }\n return tools\n}\n\nexport interface CollectToolDefinitionsOptions {\n env: Record<string, string>\n perstackBaseSkillCommand?: string[]\n factory?: SkillManagerFactory\n}\n\nexport interface CollectedToolDefinition {\n skillName: string\n name: string\n description?: string\n inputSchema: Record<string, unknown>\n}\n\nexport async function collectToolDefinitionsForExpert(\n expert: Expert,\n options: CollectToolDefinitionsOptions,\n): Promise<CollectedToolDefinition[]> {\n const { env, perstackBaseSkillCommand, factory = defaultSkillManagerFactory } = options\n const { skills } = expert\n if (!skills[\"@perstack/base\"]) {\n throw new Error(\"Base skill is not defined\")\n }\n const factoryContext: SkillManagerFactoryContext = {\n env,\n jobId: \"lockfile-generation\",\n runId: \"lockfile-generation\",\n eventListener: undefined,\n }\n const allManagers: BaseSkillManager[] = []\n const baseSkill = skills[\"@perstack/base\"]\n const useBundledBase =\n (baseSkill.type === \"mcpStdioSkill\" || baseSkill.type === \"mcpSseSkill\") &&\n shouldUseBundledBase(baseSkill, perstackBaseSkillCommand)\n try {\n if (useBundledBase && baseSkill.type === \"mcpStdioSkill\") {\n const baseManager = factory.createInMemoryBase(baseSkill, factoryContext)\n allManagers.push(baseManager)\n await initSkillManagersWithCleanup([baseManager], allManagers)\n }\n const mcpSkills = Object.values(skills)\n .filter(\n (skill): skill is McpStdioSkill | McpSseSkill =>\n skill.type === \"mcpStdioSkill\" || skill.type === \"mcpSseSkill\",\n )\n .filter((skill) => {\n if (useBundledBase && isBaseSkill(skill)) {\n return false\n }\n return true\n })\n .map((skill) => {\n if (perstackBaseSkillCommand && skill.type === \"mcpStdioSkill\") {\n const matchesBaseByPackage =\n skill.command === \"npx\" && skill.packageName === \"@perstack/base\"\n const matchesBaseByArgs =\n skill.command === \"npx\" &&\n Array.isArray(skill.args) &&\n skill.args.includes(\"@perstack/base\")\n if (matchesBaseByPackage || matchesBaseByArgs) {\n const [overrideCommand, ...overrideArgs] = perstackBaseSkillCommand\n if (!overrideCommand) {\n throw new Error(\"perstackBaseSkillCommand must have at least one element\")\n }\n return {\n ...skill,\n command: overrideCommand,\n packageName: undefined,\n args: overrideArgs,\n lazyInit: false,\n } as McpStdioSkill\n }\n }\n return skill\n })\n const mcpSkillManagers = mcpSkills.map((skill) => {\n const manager = factory.createMcp(skill, factoryContext)\n allManagers.push(manager)\n return manager\n })\n await initSkillManagersWithCleanup(mcpSkillManagers, allManagers)\n const interactiveSkills = Object.values(skills).filter(\n (skill): skill is InteractiveSkill => skill.type === \"interactiveSkill\",\n )\n const interactiveSkillManagers = interactiveSkills.map((interactiveSkill) => {\n const manager = factory.createInteractive(interactiveSkill, factoryContext)\n allManagers.push(manager)\n return manager\n })\n await initSkillManagersWithCleanup(interactiveSkillManagers, allManagers)\n const toolDefinitions: CollectedToolDefinition[] = []\n for (const manager of allManagers) {\n const definitions = await manager.getToolDefinitions()\n for (const def of definitions) {\n toolDefinitions.push({\n skillName: def.skillName,\n name: def.name,\n description: def.description,\n inputSchema: def.inputSchema,\n })\n }\n }\n return toolDefinitions\n } finally {\n await Promise.all(allManagers.map((m) => m.close().catch(() => {})))\n }\n}\n\nexport interface GetSkillManagersFromLockfileOptions {\n isDelegatedRun?: boolean\n factory?: SkillManagerFactory\n}\n\nexport async function getSkillManagersFromLockfile(\n expert: Expert,\n experts: Record<string, Expert>,\n setting: RunSetting,\n lockfileToolDefinitions: Record<string, CollectedToolDefinition[]>,\n eventListener?: (event: RunEvent | RuntimeEvent) => void,\n options?: GetSkillManagersFromLockfileOptions,\n): Promise<Record<string, BaseSkillManager>> {\n const { LockfileSkillManager } = await import(\"./lockfile-skill-manager.js\")\n const { perstackBaseSkillCommand, env, jobId, runId } = setting\n const { skills } = expert\n const factory = options?.factory ?? defaultSkillManagerFactory\n if (!skills[\"@perstack/base\"]) {\n throw new Error(\"Base skill is not defined\")\n }\n const factoryContext: SkillManagerFactoryContext = {\n env,\n jobId,\n runId,\n eventListener,\n }\n const allManagers: BaseSkillManager[] = []\n const mcpSkills = Object.values(skills).filter(\n (skill): skill is McpStdioSkill | McpSseSkill =>\n skill.type === \"mcpStdioSkill\" || skill.type === \"mcpSseSkill\",\n )\n for (const skill of mcpSkills) {\n const skillToolDefs = lockfileToolDefinitions[skill.name] ?? []\n const manager = new LockfileSkillManager({\n skill,\n toolDefinitions: skillToolDefs,\n env,\n jobId,\n runId,\n eventListener,\n perstackBaseSkillCommand,\n })\n await manager.init()\n allManagers.push(manager)\n }\n if (!options?.isDelegatedRun) {\n const interactiveSkills = Object.values(skills).filter(\n (skill): skill is InteractiveSkill => skill.type === \"interactiveSkill\",\n )\n const interactiveSkillManagers = interactiveSkills.map((interactiveSkill) => {\n const manager = factory.createInteractive(interactiveSkill, factoryContext)\n allManagers.push(manager)\n return manager\n })\n await initSkillManagersWithCleanup(interactiveSkillManagers, allManagers)\n }\n const delegateSkillManagers: BaseSkillManager[] = []\n for (const delegateExpertName of expert.delegates) {\n const delegate = experts[delegateExpertName]\n if (!delegate) {\n await Promise.all(allManagers.map((m) => m.close().catch(() => {})))\n throw new Error(`Delegate expert \"${delegateExpertName}\" not found in experts`)\n }\n const manager = factory.createDelegate(delegate, factoryContext)\n allManagers.push(manager)\n delegateSkillManagers.push(manager)\n }\n await initSkillManagersWithCleanup(delegateSkillManagers, allManagers)\n const skillManagers: Record<string, BaseSkillManager> = {}\n for (const manager of allManagers) {\n skillManagers[manager.name] = manager\n }\n return skillManagers\n}\n","import type {\n FileInlinePart,\n ImageInlinePart,\n LockfileToolDefinition,\n McpSseSkill,\n McpStdioSkill,\n RunEvent,\n RuntimeEvent,\n SkillType,\n TextPart,\n ToolDefinition,\n} from \"@perstack/core\"\nimport { BaseSkillManager } from \"./base.js\"\nimport { isBaseSkill, shouldUseBundledBase } from \"./helpers.js\"\nimport { InMemoryBaseSkillManager } from \"./in-memory-base.js\"\nimport { McpSkillManager } from \"./mcp.js\"\n\nexport interface LockfileSkillManagerOptions {\n skill: McpStdioSkill | McpSseSkill\n toolDefinitions: LockfileToolDefinition[]\n env: Record<string, string>\n jobId: string\n runId: string\n eventListener?: (event: RunEvent | RuntimeEvent) => void\n perstackBaseSkillCommand?: string[]\n}\n\nexport class LockfileSkillManager extends BaseSkillManager {\n readonly name: string\n readonly type: SkillType = \"mcp\"\n readonly lazyInit = true\n override readonly skill: McpStdioSkill | McpSseSkill\n private _cachedToolDefinitions: ToolDefinition[]\n private _realManager?: BaseSkillManager\n private _pendingInit?: Promise<BaseSkillManager>\n private _env: Record<string, string>\n private _perstackBaseSkillCommand?: string[]\n\n constructor(options: LockfileSkillManagerOptions) {\n super(options.jobId, options.runId, options.eventListener)\n this.name = options.skill.name\n this.skill = options.skill\n this._env = options.env\n this._perstackBaseSkillCommand = options.perstackBaseSkillCommand\n this._cachedToolDefinitions = options.toolDefinitions.map((def) => ({\n skillName: def.skillName,\n name: def.name,\n description: def.description,\n inputSchema: def.inputSchema,\n interactive: false,\n }))\n }\n\n protected override async _doInit(): Promise<void> {\n // No-op: tool definitions are already cached from lockfile\n }\n\n override async getToolDefinitions(): Promise<ToolDefinition[]> {\n return this._filterTools(this._cachedToolDefinitions)\n }\n\n protected override _filterTools(tools: ToolDefinition[]): ToolDefinition[] {\n const omit = this.skill.omit ?? []\n const pick = this.skill.pick ?? []\n return tools\n .filter((tool) => (omit.length > 0 ? !omit.includes(tool.name) : true))\n .filter((tool) => (pick.length > 0 ? pick.includes(tool.name) : true))\n }\n\n private async _ensureRealManager(): Promise<BaseSkillManager> {\n // Return existing manager if already initialized\n if (this._realManager) {\n return this._realManager\n }\n // Wait for pending initialization to avoid race condition\n if (this._pendingInit) {\n return this._pendingInit\n }\n // Start initialization and track the pending promise\n this._pendingInit = this._initRealManager()\n try {\n this._realManager = await this._pendingInit\n return this._realManager\n } finally {\n this._pendingInit = undefined\n }\n }\n\n private async _initRealManager(): Promise<BaseSkillManager> {\n const useBundledBase =\n this.skill.type === \"mcpStdioSkill\" &&\n isBaseSkill(this.skill) &&\n shouldUseBundledBase(this.skill, this._perstackBaseSkillCommand)\n let manager: BaseSkillManager\n if (useBundledBase && this.skill.type === \"mcpStdioSkill\") {\n manager = new InMemoryBaseSkillManager(\n this.skill,\n this._jobId,\n this._runId,\n this._eventListener,\n )\n } else {\n // Apply perstackBaseSkillCommand override if applicable\n const skillToUse = this._applyBaseSkillCommandOverride(this.skill)\n manager = new McpSkillManager(\n skillToUse,\n this._env,\n this._jobId,\n this._runId,\n this._eventListener,\n )\n }\n await manager.init()\n return manager\n }\n\n private _applyBaseSkillCommandOverride(\n skill: McpStdioSkill | McpSseSkill,\n ): McpStdioSkill | McpSseSkill {\n if (!this._perstackBaseSkillCommand || skill.type !== \"mcpStdioSkill\") {\n return skill\n }\n const matchesBaseByPackage = skill.command === \"npx\" && skill.packageName === \"@perstack/base\"\n const matchesBaseByArgs =\n skill.command === \"npx\" && Array.isArray(skill.args) && skill.args.includes(\"@perstack/base\")\n if (matchesBaseByPackage || matchesBaseByArgs) {\n const [overrideCommand, ...overrideArgs] = this._perstackBaseSkillCommand\n if (!overrideCommand) {\n return skill\n }\n return {\n ...skill,\n command: overrideCommand,\n packageName: undefined,\n args: overrideArgs,\n lazyInit: false,\n } as McpStdioSkill\n }\n return skill\n }\n\n override async callTool(\n toolName: string,\n input: Record<string, unknown>,\n ): Promise<Array<TextPart | ImageInlinePart | FileInlinePart>> {\n const realManager = await this._ensureRealManager()\n return realManager.callTool(toolName, input)\n }\n\n override async close(): Promise<void> {\n if (this._realManager) {\n await this._realManager.close()\n }\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"lockfile-skill-manager-LG2E4KAZ.js"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,14 +1,31 @@
|
|
|
1
1
|
import * as _perstack_core from '@perstack/core';
|
|
2
|
-
import { ProviderConfig, BaseAdapter, RuntimeAdapter, PrerequisiteResult,
|
|
3
|
-
import { LanguageModel } from 'ai';
|
|
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';
|
|
3
|
+
import { LanguageModel, ModelMessage, ToolSet, GenerateTextResult } from 'ai';
|
|
4
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
5
|
+
import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
4
6
|
import * as xstate from 'xstate';
|
|
5
7
|
import { ActorRefFrom, SnapshotFrom } from 'xstate';
|
|
8
|
+
import { ProviderToolOptions, ProviderOptionsConfig, ProviderError, ProviderAdapter } from '@perstack/provider-core';
|
|
9
|
+
|
|
10
|
+
declare function loadLockfile(lockfilePath: string): Lockfile | null;
|
|
11
|
+
declare function findLockfile(configPath?: string): string | null;
|
|
12
|
+
declare function getLockfileExpertToolDefinitions(lockfileExpert: LockfileExpert): Record<string, {
|
|
13
|
+
skillName: string;
|
|
14
|
+
name: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
inputSchema: Record<string, unknown>;
|
|
17
|
+
}[]>;
|
|
6
18
|
|
|
7
19
|
interface GetModelOptions {
|
|
8
20
|
proxyUrl?: string;
|
|
9
21
|
}
|
|
10
22
|
declare function getModel(modelId: string, providerConfig: ProviderConfig, options?: GetModelOptions): LanguageModel;
|
|
11
23
|
|
|
24
|
+
type ResolveExpertToRunFn = (expertKey: string, experts: Record<string, Expert>, clientOptions: {
|
|
25
|
+
perstackApiBaseUrl: string;
|
|
26
|
+
perstackApiKey?: string;
|
|
27
|
+
}) => Promise<Expert>;
|
|
28
|
+
|
|
12
29
|
type PerstackAdapterOptions = {
|
|
13
30
|
useDirectExecution?: boolean;
|
|
14
31
|
};
|
|
@@ -27,11 +44,6 @@ declare class PerstackAdapter extends BaseAdapter implements RuntimeAdapter {
|
|
|
27
44
|
private executeWithStreaming;
|
|
28
45
|
}
|
|
29
46
|
|
|
30
|
-
type ResolveExpertToRunFn = (expertKey: string, experts: Record<string, Expert>, clientOptions: {
|
|
31
|
-
perstackApiBaseUrl: string;
|
|
32
|
-
perstackApiKey?: string;
|
|
33
|
-
}) => Promise<Expert>;
|
|
34
|
-
|
|
35
47
|
type RunOptions = {
|
|
36
48
|
shouldContinueRun?: (setting: RunSetting, checkpoint: Checkpoint, step: Step) => Promise<boolean>;
|
|
37
49
|
retrieveCheckpoint?: (jobId: string, checkpointId: string) => Promise<Checkpoint>;
|
|
@@ -43,6 +55,7 @@ type RunOptions = {
|
|
|
43
55
|
eventListener?: (event: RunEvent | RuntimeEvent) => void;
|
|
44
56
|
resolveExpertToRun?: ResolveExpertToRunFn;
|
|
45
57
|
returnOnDelegationComplete?: boolean;
|
|
58
|
+
lockfile?: Lockfile;
|
|
46
59
|
};
|
|
47
60
|
/**
|
|
48
61
|
* Execute a run with the given parameters and options.
|
|
@@ -81,12 +94,136 @@ declare abstract class BaseSkillManager {
|
|
|
81
94
|
abstract callTool(toolName: string, input: Record<string, unknown>): Promise<Array<TextPart | ImageInlinePart | FileInlinePart>>;
|
|
82
95
|
}
|
|
83
96
|
|
|
97
|
+
interface StdioTransportOptions {
|
|
98
|
+
command: string;
|
|
99
|
+
args: string[];
|
|
100
|
+
env: Record<string, string>;
|
|
101
|
+
stderr?: "pipe" | "inherit" | "ignore";
|
|
102
|
+
}
|
|
103
|
+
interface SseTransportOptions {
|
|
104
|
+
url: URL;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Factory interface for creating MCP transports.
|
|
108
|
+
* Allows for dependency injection and easier testing.
|
|
109
|
+
*/
|
|
110
|
+
interface TransportFactory {
|
|
111
|
+
createStdio(options: StdioTransportOptions): StdioClientTransport;
|
|
112
|
+
createSse(options: SseTransportOptions): Transport;
|
|
113
|
+
/**
|
|
114
|
+
* Create a linked pair of in-memory transports for in-process MCP communication.
|
|
115
|
+
* Returns [clientTransport, serverTransport].
|
|
116
|
+
*/
|
|
117
|
+
createInMemoryPair(): [Transport, Transport];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
interface McpSkillManagerOptions {
|
|
121
|
+
transportFactory?: TransportFactory;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
interface SkillManagerFactoryContext {
|
|
125
|
+
env: Record<string, string>;
|
|
126
|
+
jobId: string;
|
|
127
|
+
runId: string;
|
|
128
|
+
eventListener?: (event: RunEvent | RuntimeEvent) => void;
|
|
129
|
+
mcpOptions?: McpSkillManagerOptions;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Factory interface for creating skill managers.
|
|
133
|
+
* Allows for dependency injection and easier testing.
|
|
134
|
+
*/
|
|
135
|
+
interface SkillManagerFactory {
|
|
136
|
+
createMcp(skill: McpStdioSkill | McpSseSkill, context: SkillManagerFactoryContext): BaseSkillManager;
|
|
137
|
+
/**
|
|
138
|
+
* Create an in-memory base skill manager using InMemoryTransport.
|
|
139
|
+
* This provides near-zero initialization latency for the bundled base skill.
|
|
140
|
+
*/
|
|
141
|
+
createInMemoryBase(skill: McpStdioSkill, context: SkillManagerFactoryContext): BaseSkillManager;
|
|
142
|
+
createInteractive(skill: InteractiveSkill, context: SkillManagerFactoryContext): BaseSkillManager;
|
|
143
|
+
createDelegate(expert: Expert, context: SkillManagerFactoryContext): BaseSkillManager;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
interface CollectToolDefinitionsOptions {
|
|
147
|
+
env: Record<string, string>;
|
|
148
|
+
perstackBaseSkillCommand?: string[];
|
|
149
|
+
factory?: SkillManagerFactory;
|
|
150
|
+
}
|
|
151
|
+
interface CollectedToolDefinition {
|
|
152
|
+
skillName: string;
|
|
153
|
+
name: string;
|
|
154
|
+
description?: string;
|
|
155
|
+
inputSchema: Record<string, unknown>;
|
|
156
|
+
}
|
|
157
|
+
declare function collectToolDefinitionsForExpert(expert: Expert, options: CollectToolDefinitionsOptions): Promise<CollectedToolDefinition[]>;
|
|
158
|
+
|
|
159
|
+
interface GenerateTextParams {
|
|
160
|
+
messages: ModelMessage[];
|
|
161
|
+
reasoningBudget?: ReasoningBudget;
|
|
162
|
+
maxRetries: number;
|
|
163
|
+
tools: ToolSet;
|
|
164
|
+
toolChoice?: "auto" | "none" | "required" | {
|
|
165
|
+
type: "tool";
|
|
166
|
+
toolName: string;
|
|
167
|
+
};
|
|
168
|
+
abortSignal?: AbortSignal;
|
|
169
|
+
providerToolNames?: string[];
|
|
170
|
+
providerToolOptions?: ProviderToolOptions;
|
|
171
|
+
providerOptionsConfig?: ProviderOptionsConfig;
|
|
172
|
+
}
|
|
173
|
+
type LLMExecutionResult = {
|
|
174
|
+
success: true;
|
|
175
|
+
result: GenerateTextResult<ToolSet, never>;
|
|
176
|
+
} | {
|
|
177
|
+
success: false;
|
|
178
|
+
error: ProviderError;
|
|
179
|
+
isRetryable: boolean;
|
|
180
|
+
};
|
|
181
|
+
/** Callbacks for streaming text generation */
|
|
182
|
+
interface StreamCallbacks {
|
|
183
|
+
/** Called when reasoning stream starts */
|
|
184
|
+
onReasoningStart?: () => void;
|
|
185
|
+
/** Called for each reasoning delta */
|
|
186
|
+
onReasoningDelta?: (delta: string) => void;
|
|
187
|
+
/** Called when reasoning phase completes (before result phase starts) */
|
|
188
|
+
onReasoningComplete?: (text: string) => void;
|
|
189
|
+
/** Called when result stream starts */
|
|
190
|
+
onResultStart?: () => void;
|
|
191
|
+
/** Called for each result delta */
|
|
192
|
+
onResultDelta?: (delta: string) => void;
|
|
193
|
+
}
|
|
194
|
+
/** Parameters for streaming text generation */
|
|
195
|
+
interface StreamTextParams {
|
|
196
|
+
messages: ModelMessage[];
|
|
197
|
+
reasoningBudget?: ReasoningBudget;
|
|
198
|
+
maxRetries: number;
|
|
199
|
+
tools: ToolSet;
|
|
200
|
+
toolChoice?: "auto" | "none" | "required" | {
|
|
201
|
+
type: "tool";
|
|
202
|
+
toolName: string;
|
|
203
|
+
};
|
|
204
|
+
abortSignal?: AbortSignal;
|
|
205
|
+
providerToolNames?: string[];
|
|
206
|
+
providerToolOptions?: ProviderToolOptions;
|
|
207
|
+
providerOptionsConfig?: ProviderOptionsConfig;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
declare class LLMExecutor {
|
|
211
|
+
private readonly adapter;
|
|
212
|
+
private readonly model;
|
|
213
|
+
constructor(adapter: ProviderAdapter, model: LanguageModel);
|
|
214
|
+
generateText(params: GenerateTextParams): Promise<LLMExecutionResult>;
|
|
215
|
+
private mergeProviderOptions;
|
|
216
|
+
generateTextWithoutTools(params: Omit<GenerateTextParams, "tools" | "toolChoice" | "providerToolNames" | "providerToolOptions">): Promise<LLMExecutionResult>;
|
|
217
|
+
streamText(params: StreamTextParams, callbacks: StreamCallbacks): Promise<LLMExecutionResult>;
|
|
218
|
+
}
|
|
219
|
+
|
|
84
220
|
declare const runtimeStateMachine: xstate.StateMachine<{
|
|
85
221
|
setting: RunSetting;
|
|
86
222
|
step: Step;
|
|
87
223
|
checkpoint: Checkpoint;
|
|
88
|
-
eventListener: (event: RunEvent) => Promise<void>;
|
|
224
|
+
eventListener: (event: RunEvent | RuntimeEvent) => Promise<void>;
|
|
89
225
|
skillManagers: Record<string, BaseSkillManager>;
|
|
226
|
+
llmExecutor: LLMExecutor;
|
|
90
227
|
}, (_perstack_core.BaseEvent & {
|
|
91
228
|
type: "startRun";
|
|
92
229
|
} & {
|
|
@@ -126,10 +263,6 @@ declare const runtimeStateMachine: xstate.StateMachine<{
|
|
|
126
263
|
type: "resolveToolResults";
|
|
127
264
|
} & {
|
|
128
265
|
toolResults: _perstack_core.ToolResult[];
|
|
129
|
-
}) | (_perstack_core.BaseEvent & {
|
|
130
|
-
type: "resolveThought";
|
|
131
|
-
} & {
|
|
132
|
-
toolResult: _perstack_core.ToolResult;
|
|
133
266
|
}) | (_perstack_core.BaseEvent & {
|
|
134
267
|
type: "attemptCompletion";
|
|
135
268
|
} & {
|
|
@@ -168,6 +301,17 @@ declare const runtimeStateMachine: xstate.StateMachine<{
|
|
|
168
301
|
} & {
|
|
169
302
|
checkpoint: Checkpoint;
|
|
170
303
|
step: Step;
|
|
304
|
+
}) | (_perstack_core.BaseEvent & {
|
|
305
|
+
type: "stopRunByError";
|
|
306
|
+
} & {
|
|
307
|
+
checkpoint: Checkpoint;
|
|
308
|
+
step: Step;
|
|
309
|
+
error: {
|
|
310
|
+
name: string;
|
|
311
|
+
message: string;
|
|
312
|
+
statusCode?: number;
|
|
313
|
+
isRetryable: boolean;
|
|
314
|
+
};
|
|
171
315
|
}) | (_perstack_core.BaseEvent & {
|
|
172
316
|
type: "completeRun";
|
|
173
317
|
} & {
|
|
@@ -175,11 +319,12 @@ declare const runtimeStateMachine: xstate.StateMachine<{
|
|
|
175
319
|
step: Step;
|
|
176
320
|
text: string;
|
|
177
321
|
usage: _perstack_core.Usage;
|
|
178
|
-
}), {}, never, never, never, never, "Init" | "PreparingForStep" | "GeneratingToolCall" | "CallingTool" | "FinishingStep" | "
|
|
322
|
+
}), {}, never, never, never, never, "Init" | "PreparingForStep" | "GeneratingToolCall" | "CallingTool" | "FinishingStep" | "Stopped" | "CallingInteractiveTool" | "CallingDelegate" | "ResolvingToolResult" | "GeneratingRunResult", string, {
|
|
179
323
|
setting: RunSetting;
|
|
180
324
|
initialCheckpoint: Checkpoint;
|
|
181
|
-
eventListener: (event: RunEvent) => Promise<void>;
|
|
325
|
+
eventListener: (event: RunEvent | RuntimeEvent) => Promise<void>;
|
|
182
326
|
skillManagers: Record<string, BaseSkillManager>;
|
|
327
|
+
llmExecutor: LLMExecutor;
|
|
183
328
|
}, xstate.NonReducibleUnknown, xstate.EventObject, xstate.MetaObject, {
|
|
184
329
|
id: "Run";
|
|
185
330
|
states: {
|
|
@@ -188,7 +333,6 @@ declare const runtimeStateMachine: xstate.StateMachine<{
|
|
|
188
333
|
readonly GeneratingToolCall: {};
|
|
189
334
|
readonly CallingTool: {};
|
|
190
335
|
readonly ResolvingToolResult: {};
|
|
191
|
-
readonly ResolvingThought: {};
|
|
192
336
|
readonly GeneratingRunResult: {};
|
|
193
337
|
readonly CallingInteractiveTool: {};
|
|
194
338
|
readonly CallingDelegate: {};
|
|
@@ -201,4 +345,4 @@ type RunSnapshot = SnapshotFrom<typeof runtimeStateMachine>;
|
|
|
201
345
|
|
|
202
346
|
declare const runtimeVersion: string;
|
|
203
347
|
|
|
204
|
-
export { PerstackAdapter, type RunActor, type RunOptions, type RunSnapshot, getModel, run, runtimeStateMachine, runtimeVersion };
|
|
348
|
+
export { type CollectToolDefinitionsOptions, type CollectedToolDefinition, PerstackAdapter, type RunActor, type RunOptions, type RunSnapshot, collectToolDefinitionsForExpert, findLockfile, getLockfileExpertToolDefinitions, getModel, loadLockfile, run, runtimeStateMachine, runtimeVersion };
|
package/dist/src/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { package_default, run } from '../chunk-
|
|
2
|
-
export { getModel, run, runtimeStateMachine } from '../chunk-
|
|
1
|
+
import { package_default, findLockfile, loadLockfile, run } from '../chunk-LDJKVMQK.js';
|
|
2
|
+
export { findLockfile, getLockfileExpertToolDefinitions, getModel, loadLockfile, run, runtimeStateMachine } from '../chunk-LDJKVMQK.js';
|
|
3
|
+
export { collectToolDefinitionsForExpert } from '../chunk-RG4QHAGG.js';
|
|
3
4
|
import { registerAdapter, BaseAdapter, getFilteredEnv, checkpointSchema } from '@perstack/core';
|
|
4
5
|
import { spawn } from 'child_process';
|
|
5
6
|
|
|
@@ -53,12 +54,16 @@ var PerstackAdapter = class extends BaseAdapter {
|
|
|
53
54
|
events.push(event);
|
|
54
55
|
params.eventListener?.(event);
|
|
55
56
|
};
|
|
57
|
+
const lockfilePath = findLockfile();
|
|
58
|
+
const lockfile = lockfilePath ? loadLockfile(lockfilePath) ?? void 0 : void 0;
|
|
56
59
|
const checkpoint = await run(
|
|
57
60
|
{ setting: params.setting, checkpoint: params.checkpoint },
|
|
58
61
|
{
|
|
59
62
|
eventListener,
|
|
60
63
|
storeCheckpoint: params.storeCheckpoint,
|
|
61
|
-
|
|
64
|
+
storeEvent: params.storeEvent,
|
|
65
|
+
retrieveCheckpoint: params.retrieveCheckpoint,
|
|
66
|
+
lockfile
|
|
62
67
|
}
|
|
63
68
|
);
|
|
64
69
|
return { checkpoint, events };
|
|
@@ -105,9 +110,6 @@ var PerstackAdapter = class extends BaseAdapter {
|
|
|
105
110
|
if (setting.timeout !== void 0) {
|
|
106
111
|
args.push("--timeout", String(setting.timeout));
|
|
107
112
|
}
|
|
108
|
-
if (setting.temperature !== void 0) {
|
|
109
|
-
args.push("--temperature", String(setting.temperature));
|
|
110
|
-
}
|
|
111
113
|
if (setting.model) {
|
|
112
114
|
args.push("--model", setting.model);
|
|
113
115
|
}
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/perstack-adapter.ts","../../src/index.ts"],"names":[],"mappings":";;;;;AAoBO,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,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,oBAAoB,MAAA,CAAO;AAAA;AAC7B,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,OAAA,CAAQ,gBAAgB,MAAA,EAAW;AACrC,MAAA,IAAA,CAAK,IAAA,CAAK,eAAA,EAAiB,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAC,CAAA;AAAA,IACxD;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;;;AC/MA,eAAA,CAAgB,OAAA,EAAS,MAAM,IAAI,eAAA,EAAiB,CAAA;AAM7C,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 { 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 checkpoint = await perstackRun(\n { setting: params.setting, checkpoint: params.checkpoint },\n {\n eventListener,\n storeCheckpoint: params.storeCheckpoint,\n retrieveCheckpoint: params.retrieveCheckpoint,\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.temperature !== undefined) {\n args.push(\"--temperature\", String(setting.temperature))\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 { getModel } from \"./helpers/model.js\"\nexport { PerstackAdapter } from \"./perstack-adapter.js\"\nexport { type RunOptions, run } from \"./run.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 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"]}
|