@perstack/runtime 0.0.81 → 0.0.82

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-HBGKTPEA.js';
2
+ export { findLockfile, getLockfileExpertToolDefinitions, getModel, loadLockfile, run, runtimeStateMachine } from '../chunk-HBGKTPEA.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.82",
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,7 +36,6 @@
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
39
  "@perstack/base": "0.0.44",
40
40
  "@perstack/core": "0.0.35"
41
41
  },
@@ -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
49
  "@perstack/anthropic-provider": "0.0.5",
51
- "@perstack/bedrock-provider": "0.0.5",
50
+ "@perstack/adapter-base": "0.0.2",
52
51
  "@perstack/azure-openai-provider": "0.0.5",
53
52
  "@perstack/deepseek-provider": "0.0.5",
54
- "@perstack/google-provider": "0.0.5",
55
53
  "@perstack/ollama-provider": "0.0.5",
54
+ "@perstack/bedrock-provider": "0.0.5",
55
+ "@perstack/google-provider": "0.0.5",
56
56
  "@perstack/openai-provider": "0.0.5",
57
- "@perstack/vertex-provider": "0.0.5",
58
- "@perstack/provider-core": "0.0.5"
57
+ "@perstack/provider-core": "0.0.5",
58
+ "@perstack/vertex-provider": "0.0.5"
59
59
  },
60
60
  "engines": {
61
61
  "node": ">=22.0.0"