@perstack/runtime 0.0.81 → 0.0.83

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.
@@ -0,0 +1,99 @@
1
+ import { createApiClient } from '@perstack/api-client';
2
+
3
+ // src/helpers/resolve-expert.ts
4
+ async function resolveExpertToRun(expertKey, experts, clientOptions) {
5
+ if (experts[expertKey]) {
6
+ return experts[expertKey];
7
+ }
8
+ if (!clientOptions.perstackApiKey) {
9
+ throw new Error(`PERSTACK_API_KEY is required to resolve published expert "${expertKey}"`);
10
+ }
11
+ const client = createApiClient({
12
+ baseUrl: clientOptions.perstackApiBaseUrl,
13
+ apiKey: clientOptions.perstackApiKey
14
+ });
15
+ const result = await client.experts.get(expertKey);
16
+ if (!result.ok) {
17
+ throw new Error(`Failed to resolve expert "${expertKey}": ${result.error.message}`);
18
+ }
19
+ const publishedExpert = result.data.data.definition.experts[expertKey];
20
+ if (!publishedExpert) {
21
+ throw new Error(`Expert "${expertKey}" not found in API response`);
22
+ }
23
+ return toRuntimeExpert(expertKey, publishedExpert);
24
+ }
25
+ function toRuntimeExpert(key, expert) {
26
+ const skills = Object.fromEntries(
27
+ Object.entries(expert.skills ?? {}).map(([name, skill]) => {
28
+ switch (skill.type) {
29
+ case "mcpStdioSkill":
30
+ return [
31
+ name,
32
+ {
33
+ type: skill.type,
34
+ name,
35
+ description: skill.description,
36
+ rule: skill.rule,
37
+ pick: skill.pick ?? [],
38
+ omit: skill.omit ?? [],
39
+ command: skill.command,
40
+ packageName: skill.packageName,
41
+ requiredEnv: skill.requiredEnv ?? [],
42
+ lazyInit: false
43
+ }
44
+ ];
45
+ case "mcpSseSkill":
46
+ return [
47
+ name,
48
+ {
49
+ type: skill.type,
50
+ name,
51
+ description: skill.description,
52
+ rule: skill.rule,
53
+ pick: skill.pick ?? [],
54
+ omit: skill.omit ?? [],
55
+ endpoint: skill.endpoint,
56
+ lazyInit: false
57
+ }
58
+ ];
59
+ case "interactiveSkill":
60
+ return [
61
+ name,
62
+ {
63
+ type: skill.type,
64
+ name,
65
+ description: skill.description,
66
+ rule: skill.rule,
67
+ tools: Object.fromEntries(
68
+ Object.entries(skill.tools).map(([toolName, tool]) => [
69
+ toolName,
70
+ {
71
+ name: toolName,
72
+ description: tool.description,
73
+ inputSchema: JSON.parse(tool.inputJsonSchema)
74
+ }
75
+ ])
76
+ )
77
+ }
78
+ ];
79
+ default: {
80
+ throw new Error(`Unknown skill type: ${skill.type}`);
81
+ }
82
+ }
83
+ })
84
+ );
85
+ return {
86
+ key,
87
+ name: expert.name,
88
+ version: expert.version,
89
+ description: expert.description ?? "",
90
+ instruction: expert.instruction,
91
+ skills,
92
+ delegates: expert.delegates ?? [],
93
+ tags: expert.tags ?? []
94
+ };
95
+ }
96
+
97
+ export { resolveExpertToRun };
98
+ //# sourceMappingURL=resolve-expert-G6O7UMYS.js.map
99
+ //# sourceMappingURL=resolve-expert-G6O7UMYS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/helpers/resolve-expert.ts"],"names":[],"mappings":"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","file":"resolve-expert-G6O7UMYS.js","sourcesContent":["import { createApiClient } from \"@perstack/api-client\"\nimport type { Expert, Skill } from \"@perstack/core\"\n\nexport async function resolveExpertToRun(\n expertKey: string,\n experts: Record<string, Expert>,\n clientOptions: {\n perstackApiBaseUrl: string\n perstackApiKey?: string\n },\n): Promise<Expert> {\n if (experts[expertKey]) {\n return experts[expertKey]\n }\n if (!clientOptions.perstackApiKey) {\n throw new Error(`PERSTACK_API_KEY is required to resolve published expert \"${expertKey}\"`)\n }\n const client = createApiClient({\n baseUrl: clientOptions.perstackApiBaseUrl,\n apiKey: clientOptions.perstackApiKey,\n })\n const result = await client.experts.get(expertKey)\n if (!result.ok) {\n throw new Error(`Failed to resolve expert \"${expertKey}\": ${result.error.message}`)\n }\n const publishedExpert = result.data.data.definition.experts[expertKey]\n if (!publishedExpert) {\n throw new Error(`Expert \"${expertKey}\" not found in API response`)\n }\n return toRuntimeExpert(expertKey, publishedExpert)\n}\n\nfunction toRuntimeExpert(\n key: string,\n expert: {\n name: string\n version: string\n description?: string\n instruction: string\n skills?: Record<\n string,\n | {\n type: \"mcpStdioSkill\"\n name: string\n description: string\n rule?: string\n pick?: string[]\n omit?: string[]\n command: \"npx\" | \"uvx\"\n packageName: string\n requiredEnv?: string[]\n }\n | {\n type: \"mcpSseSkill\"\n name: string\n description: string\n rule?: string\n pick?: string[]\n omit?: string[]\n endpoint: string\n }\n | {\n type: \"interactiveSkill\"\n name: string\n description: string\n rule?: string\n tools: Record<string, { description: string; inputJsonSchema: string }>\n }\n >\n delegates?: string[]\n tags?: string[]\n },\n): Expert {\n const skills: Record<string, Skill> = Object.fromEntries(\n Object.entries(expert.skills ?? {}).map(([name, skill]) => {\n switch (skill.type) {\n case \"mcpStdioSkill\":\n return [\n name,\n {\n type: skill.type,\n name,\n description: skill.description,\n rule: skill.rule,\n pick: skill.pick ?? [],\n omit: skill.omit ?? [],\n command: skill.command,\n packageName: skill.packageName,\n requiredEnv: skill.requiredEnv ?? [],\n lazyInit: false,\n },\n ]\n case \"mcpSseSkill\":\n return [\n name,\n {\n type: skill.type,\n name,\n description: skill.description,\n rule: skill.rule,\n pick: skill.pick ?? [],\n omit: skill.omit ?? [],\n endpoint: skill.endpoint,\n lazyInit: false,\n },\n ]\n case \"interactiveSkill\":\n return [\n name,\n {\n type: skill.type,\n name,\n description: skill.description,\n rule: skill.rule,\n tools: Object.fromEntries(\n Object.entries(skill.tools).map(([toolName, tool]) => [\n toolName,\n {\n name: toolName,\n description: tool.description,\n inputSchema: JSON.parse(tool.inputJsonSchema),\n },\n ]),\n ),\n },\n ]\n default: {\n throw new Error(`Unknown skill type: ${(skill as { type: string }).type}`)\n }\n }\n }),\n )\n return {\n key,\n name: expert.name,\n version: expert.version,\n description: expert.description ?? \"\",\n instruction: expert.instruction,\n skills,\n delegates: expert.delegates ?? [],\n tags: expert.tags ?? [],\n }\n}\n"]}
package/dist/src/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { package_default, findLockfile, loadLockfile, run } from '../chunk-QYGCPFHL.js';
2
- export { findLockfile, getLockfileExpertToolDefinitions, getModel, loadLockfile, run, runtimeStateMachine } from '../chunk-QYGCPFHL.js';
1
+ import { package_default, findLockfile, loadLockfile, run } from '../chunk-5ECA6SJH.js';
2
+ export { findLockfile, getLockfileExpertToolDefinitions, getModel, loadLockfile, run, runtimeStateMachine } from '../chunk-5ECA6SJH.js';
3
3
  export { collectToolDefinitionsForExpert } from '../chunk-RG4QHAGG.js';
4
4
  import { registerAdapter, getFilteredEnv, checkpointSchema } from '@perstack/core';
5
5
  import { spawn } from 'child_process';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@perstack/runtime",
3
- "version": "0.0.81",
3
+ "version": "0.0.83",
4
4
  "description": "Perstack Runtime",
5
5
  "author": "Wintermute Technologies, Inc.",
6
6
  "license": "Apache-2.0",
@@ -27,6 +27,7 @@
27
27
  "@ai-sdk/openai": "^2.0.0",
28
28
  "@modelcontextprotocol/sdk": "^1.25.1",
29
29
  "@paralleldrive/cuid2": "^3.0.4",
30
+ "@perstack/api-client": "^0.0.51",
30
31
  "ai": "^5.0.115",
31
32
  "ollama-ai-provider-v2": "^1.5.5",
32
33
  "commander": "^14.0.2",
@@ -35,9 +36,8 @@
35
36
  "ts-dedent": "^2.2.0",
36
37
  "undici": "^7.16.0",
37
38
  "xstate": "^5.25.0",
38
- "@perstack/api-client": "0.0.45",
39
- "@perstack/base": "0.0.44",
40
- "@perstack/core": "0.0.35"
39
+ "@perstack/base": "0.0.45",
40
+ "@perstack/core": "0.0.36"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@tsconfig/node22": "^22.0.5",
@@ -46,16 +46,16 @@
46
46
  "tsup": "^8.5.1",
47
47
  "typescript": "^5.9.3",
48
48
  "vitest": "^4.0.16",
49
- "@perstack/adapter-base": "0.0.2",
50
- "@perstack/anthropic-provider": "0.0.5",
51
- "@perstack/bedrock-provider": "0.0.5",
52
- "@perstack/azure-openai-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/vertex-provider": "0.0.5",
58
- "@perstack/provider-core": "0.0.5"
49
+ "@perstack/adapter-base": "0.0.3",
50
+ "@perstack/anthropic-provider": "0.0.6",
51
+ "@perstack/azure-openai-provider": "0.0.6",
52
+ "@perstack/bedrock-provider": "0.0.6",
53
+ "@perstack/deepseek-provider": "0.0.6",
54
+ "@perstack/google-provider": "0.0.6",
55
+ "@perstack/ollama-provider": "0.0.6",
56
+ "@perstack/openai-provider": "0.0.6",
57
+ "@perstack/provider-core": "0.0.6",
58
+ "@perstack/vertex-provider": "0.0.6"
59
59
  },
60
60
  "engines": {
61
61
  "node": ">=22.0.0"