@perstack/runtime 0.0.80 → 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.
- package/dist/bin/cli.js +1 -1
- package/dist/{chunk-Z3752QO6.js → chunk-HBGKTPEA.js} +8 -40
- package/dist/chunk-HBGKTPEA.js.map +1 -0
- package/dist/resolve-expert-G6O7UMYS.js +99 -0
- package/dist/resolve-expert-G6O7UMYS.js.map +1 -0
- package/dist/src/index.js +2 -2
- package/package.json +5 -5
- package/dist/chunk-Z3752QO6.js.map +0 -1
|
@@ -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":";;;AAGA,eAAsB,kBAAA,CACpB,SAAA,EACA,OAAA,EACA,aAAA,EAIiB;AACjB,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,OAAO,QAAQ,SAAS,CAAA;AAAA,EAC1B;AACA,EAAA,IAAI,CAAC,cAAc,cAAA,EAAgB;AACjC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0DAAA,EAA6D,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3F;AACA,EAAA,MAAM,SAAS,eAAA,CAAgB;AAAA,IAC7B,SAAS,aAAA,CAAc,kBAAA;AAAA,IACvB,QAAQ,aAAA,CAAc;AAAA,GACvB,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAI,SAAS,CAAA;AACjD,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,MAAM,IAAI,MAAM,CAAA,0BAAA,EAA6B,SAAS,MAAM,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,EACpF;AACA,EAAA,MAAM,kBAAkB,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,SAAS,CAAA;AACrE,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,SAAS,CAAA,2BAAA,CAA6B,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,eAAA,CAAgB,WAAW,eAAe,CAAA;AACnD;AAEA,SAAS,eAAA,CACP,KACA,MAAA,EAsCQ;AACR,EAAA,MAAM,SAAgC,MAAA,CAAO,WAAA;AAAA,IAC3C,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,MAAA,IAAU,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,KAAM;AACzD,MAAA,QAAQ,MAAM,IAAA;AAAM,QAClB,KAAK,eAAA;AACH,UAAA,OAAO;AAAA,YACL,IAAA;AAAA,YACA;AAAA,cACE,MAAM,KAAA,CAAM,IAAA;AAAA,cACZ,IAAA;AAAA,cACA,aAAa,KAAA,CAAM,WAAA;AAAA,cACnB,MAAM,KAAA,CAAM,IAAA;AAAA,cACZ,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,cACrB,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,cACrB,SAAS,KAAA,CAAM,OAAA;AAAA,cACf,aAAa,KAAA,CAAM,WAAA;AAAA,cACnB,WAAA,EAAa,KAAA,CAAM,WAAA,IAAe,EAAC;AAAA,cACnC,QAAA,EAAU;AAAA;AACZ,WACF;AAAA,QACF,KAAK,aAAA;AACH,UAAA,OAAO;AAAA,YACL,IAAA;AAAA,YACA;AAAA,cACE,MAAM,KAAA,CAAM,IAAA;AAAA,cACZ,IAAA;AAAA,cACA,aAAa,KAAA,CAAM,WAAA;AAAA,cACnB,MAAM,KAAA,CAAM,IAAA;AAAA,cACZ,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,cACrB,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,cACrB,UAAU,KAAA,CAAM,QAAA;AAAA,cAChB,QAAA,EAAU;AAAA;AACZ,WACF;AAAA,QACF,KAAK,kBAAA;AACH,UAAA,OAAO;AAAA,YACL,IAAA;AAAA,YACA;AAAA,cACE,MAAM,KAAA,CAAM,IAAA;AAAA,cACZ,IAAA;AAAA,cACA,aAAa,KAAA,CAAM,WAAA;AAAA,cACnB,MAAM,KAAA,CAAM,IAAA;AAAA,cACZ,OAAO,MAAA,CAAO,WAAA;AAAA,gBACZ,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,CAAE,IAAI,CAAC,CAAC,QAAA,EAAU,IAAI,CAAA,KAAM;AAAA,kBACpD,QAAA;AAAA,kBACA;AAAA,oBACE,IAAA,EAAM,QAAA;AAAA,oBACN,aAAa,IAAA,CAAK,WAAA;AAAA,oBAClB,WAAA,EAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,eAAe;AAAA;AAC9C,iBACD;AAAA;AACH;AACF,WACF;AAAA,QACF,SAAS;AACP,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAwB,KAAA,CAA2B,IAAI,CAAA,CAAE,CAAA;AAAA,QAC3E;AAAA;AACF,IACF,CAAC;AAAA,GACH;AACA,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,WAAA,EAAa,OAAO,WAAA,IAAe,EAAA;AAAA,IACnC,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,MAAA;AAAA,IACA,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,EAAC;AAAA,IAChC,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ;AAAC,GACxB;AACF","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-
|
|
2
|
-
export { findLockfile, getLockfileExpertToolDefinitions, getModel, loadLockfile, run, runtimeStateMachine } from '../chunk-
|
|
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.
|
|
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.44",
|
|
39
39
|
"@perstack/base": "0.0.44",
|
|
40
40
|
"@perstack/core": "0.0.35"
|
|
41
41
|
},
|
|
@@ -46,13 +46,13 @@
|
|
|
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",
|
|
50
|
+
"@perstack/adapter-base": "0.0.2",
|
|
51
51
|
"@perstack/azure-openai-provider": "0.0.5",
|
|
52
|
-
"@perstack/bedrock-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
57
|
"@perstack/provider-core": "0.0.5",
|
|
58
58
|
"@perstack/vertex-provider": "0.0.5"
|