@skelm/pi 0.3.6 → 0.3.8
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/README.md +42 -13
- package/dist/backend.d.ts +3 -0
- package/dist/backend.d.ts.map +1 -1
- package/dist/backend.js +85 -33
- package/dist/backend.js.map +1 -1
- package/dist/factory.d.ts +2 -0
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +4 -1
- package/dist/factory.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/rpc-client.d.ts +19 -0
- package/dist/rpc-client.d.ts.map +1 -1
- package/dist/rpc-client.js +38 -1
- package/dist/rpc-client.js.map +1 -1
- package/dist/sdk-backend.d.ts +5 -0
- package/dist/sdk-backend.d.ts.map +1 -1
- package/dist/sdk-backend.js +126 -41
- package/dist/sdk-backend.js.map +1 -1
- package/dist/sdk-client.d.ts +24 -1
- package/dist/sdk-client.d.ts.map +1 -1
- package/dist/sdk-client.js +67 -4
- package/dist/sdk-client.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -37,29 +37,58 @@ npm install @mariozechner/pi-coding-agent
|
|
|
37
37
|
|
|
38
38
|
## SDK backend (recommended)
|
|
39
39
|
|
|
40
|
+
Register the backend via `instances:` in `skelm.config.ts` and reference it by id on each step:
|
|
41
|
+
|
|
40
42
|
```ts
|
|
41
|
-
|
|
43
|
+
// skelm.config.ts
|
|
44
|
+
import { defineConfig } from 'skelm'
|
|
42
45
|
import { createPiSdkBackend } from '@skelm/pi'
|
|
43
46
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
export default defineConfig({
|
|
48
|
+
backends: { agent: 'pi' },
|
|
49
|
+
instances: [
|
|
50
|
+
createPiSdkBackend({
|
|
51
|
+
id: 'pi',
|
|
52
|
+
// cwd: './workspace', // defaults to process.cwd()
|
|
53
|
+
// timeout: 300_000, // ms; default 5 min
|
|
54
|
+
// maxConcurrent: 4, // queued beyond this; 0 = unlimited
|
|
55
|
+
}),
|
|
56
|
+
],
|
|
57
|
+
registries: {
|
|
58
|
+
skills: { glob: 'skills/**/SKILL.md' },
|
|
59
|
+
},
|
|
49
60
|
})
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
A workflow that reviews a PR using a **skill** that encodes your team's style guide:
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
// workflows/review-pr.workflow.ts
|
|
67
|
+
import { agent, pipeline } from 'skelm'
|
|
68
|
+
import { z } from 'zod'
|
|
50
69
|
|
|
51
70
|
export default pipeline({
|
|
52
|
-
id: '
|
|
71
|
+
id: 'review-pr',
|
|
72
|
+
input: z.object({ diff: z.string() }),
|
|
73
|
+
output: z.object({ verdict: z.string(), notes: z.array(z.string()) }),
|
|
53
74
|
steps: [
|
|
54
75
|
agent({
|
|
55
|
-
id: '
|
|
56
|
-
backend: pi,
|
|
57
|
-
|
|
76
|
+
id: 'reviewer',
|
|
77
|
+
backend: 'pi',
|
|
78
|
+
skills: ['style-guide'], // injected from skills/style-guide/SKILL.md
|
|
79
|
+
prompt: (ctx) =>
|
|
80
|
+
`Review this diff against the style guide and return JSON {verdict, notes}:\n\n${ctx.input.diff}`,
|
|
58
81
|
permissions: {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
82
|
+
allowedTools: [], // read-only — no tools needed
|
|
83
|
+
allowedExecutables: [],
|
|
84
|
+
allowedMcpServers: [],
|
|
85
|
+
allowedSkills: ['style-guide'],
|
|
86
|
+
networkEgress: 'deny',
|
|
87
|
+
fsRead: [],
|
|
88
|
+
fsWrite: [],
|
|
62
89
|
},
|
|
90
|
+
output: z.object({ verdict: z.string(), notes: z.array(z.string()) }),
|
|
91
|
+
maxTurns: 3,
|
|
63
92
|
}),
|
|
64
93
|
],
|
|
65
94
|
})
|
package/dist/backend.d.ts
CHANGED
|
@@ -19,6 +19,9 @@ export declare class PiBackendTimeoutError extends PiBackendError {
|
|
|
19
19
|
* Each backend instance keeps one pi process alive and reuses it across
|
|
20
20
|
* calls (a new session per call, same process). Use maxConcurrent to
|
|
21
21
|
* limit simultaneous requests.
|
|
22
|
+
*
|
|
23
|
+
* @param options Backend configuration
|
|
24
|
+
* @param options.egressProxyUrl Optional egress proxy URL to inject into subprocess
|
|
22
25
|
*/
|
|
23
26
|
export declare function createPiBackend(options?: PiBackendOptions): SkelmBackend;
|
|
24
27
|
//# sourceMappingURL=backend.d.ts.map
|
package/dist/backend.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAMV,YAAY,EACb,MAAM,aAAa,CAAA;AAEpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,gDAAgD;AAChD,qBAAa,cAAe,SAAQ,KAAK;aAInB,KAAK,CAAC,EAAE,OAAO;IAHnC,SAAkB,IAAI,oBAAmB;gBAEvC,OAAO,EAAE,MAAM,EACG,KAAK,CAAC,EAAE,OAAO,YAAA;CAIpC;AAED,qBAAa,4BAA6B,SAAQ,cAAc;CAAG;AACnE,qBAAa,uBAAwB,SAAQ,cAAc;CAAG;AAC9D,qBAAa,qBAAsB,SAAQ,cAAc;CAAG;AAE5D;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,YAAY,CAyG5E"}
|
package/dist/backend.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
//
|
|
7
7
|
// Pi does NOT speak ACP; this backend uses the native pi RPC protocol
|
|
8
8
|
// documented in @mariozechner/pi-coding-agent/docs/rpc.md.
|
|
9
|
-
import {
|
|
9
|
+
import { PermissionDeniedError, createConcurrencySemaphore, loadSkillBodies } from '@skelm/core';
|
|
10
10
|
import { PiRpcClient } from './rpc-client.js';
|
|
11
11
|
/** Custom error types exposed from @skelm/pi */
|
|
12
12
|
export class PiBackendError extends Error {
|
|
@@ -30,46 +30,65 @@ export class PiBackendTimeoutError extends PiBackendError {
|
|
|
30
30
|
* Each backend instance keeps one pi process alive and reuses it across
|
|
31
31
|
* calls (a new session per call, same process). Use maxConcurrent to
|
|
32
32
|
* limit simultaneous requests.
|
|
33
|
+
*
|
|
34
|
+
* @param options Backend configuration
|
|
35
|
+
* @param options.egressProxyUrl Optional egress proxy URL to inject into subprocess
|
|
33
36
|
*/
|
|
34
37
|
export function createPiBackend(options = {}) {
|
|
35
38
|
const capabilities = {
|
|
36
|
-
|
|
39
|
+
// RPC mode runs an agent loop; for single-shot inference (llm() steps)
|
|
40
|
+
// use the pi-sdk backend which can disable tools via noTools: 'all'.
|
|
41
|
+
prompt: false,
|
|
37
42
|
streaming: true,
|
|
38
43
|
sessionLifecycle: true,
|
|
39
44
|
mcp: false, // pi manages its own tools; no external MCP wiring
|
|
40
45
|
skills: true,
|
|
41
46
|
modelSelection: options.model !== undefined,
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
active++;
|
|
51
|
-
return Promise.resolve();
|
|
52
|
-
}
|
|
53
|
-
return new Promise((resolve) => queue.push(resolve));
|
|
54
|
-
};
|
|
55
|
-
const release = () => {
|
|
56
|
-
const next = queue.shift();
|
|
57
|
-
if (next)
|
|
58
|
-
next();
|
|
59
|
-
else
|
|
60
|
-
active--;
|
|
47
|
+
// RPC mode runs pi in a subprocess; skelm cannot intercept tool_call events
|
|
48
|
+
// mid-run, so it cannot enforce allowedTools, allowedExecutables,
|
|
49
|
+
// fsRead/fsWrite, allowedMcpServers, or allowedSkills. The new gateway
|
|
50
|
+
// egress proxy DOES enforce networkEgress out-of-band (HTTP_PROXY +
|
|
51
|
+
// SKELM_EGRESS_TOKEN), but that is orthogonal to *tool* permissions. We
|
|
52
|
+
// therefore keep toolPermissions: 'unsupported' and refuse below when a
|
|
53
|
+
// caller hands us a non-network-only policy (defense-in-depth).
|
|
54
|
+
toolPermissions: 'unsupported',
|
|
61
55
|
};
|
|
56
|
+
const { acquire, release } = createConcurrencySemaphore(options.maxConcurrent ?? 4);
|
|
62
57
|
return {
|
|
63
58
|
id: options.id ?? 'pi',
|
|
64
59
|
label: options.label ?? 'Pi Coding Agent',
|
|
65
60
|
capabilities,
|
|
66
61
|
async run(request, context) {
|
|
62
|
+
const policy = context.permissions ?? request.permissions;
|
|
63
|
+
// Defense-in-depth: Pi RPC cannot enforce tool / executable /
|
|
64
|
+
// filesystem / MCP / skill permissions inside the pi subprocess. We
|
|
65
|
+
// refuse when the workflow *explicitly declared* one of those
|
|
66
|
+
// dimensions. networkEgress alone is fine because the gateway egress
|
|
67
|
+
// proxy enforces it out-of-band, and a fully-defaulted policy
|
|
68
|
+
// (everything intersected to the deny-all empty set, e.g. from
|
|
69
|
+
// project defaults) is policy resolution — not user intent.
|
|
70
|
+
//
|
|
71
|
+
// When `declaredPermissions` is supplied (the canonical runner path)
|
|
72
|
+
// we use it directly; otherwise fall back to inspecting the resolved
|
|
73
|
+
// policy so callers that hand-build a ResolvedPolicy still get the
|
|
74
|
+
// refusal.
|
|
75
|
+
const refuse = context.declaredPermissions !== undefined
|
|
76
|
+
? declaresNonNetworkDimension(context.declaredPermissions)
|
|
77
|
+
: policy !== undefined && resolvedPolicyHasNonNetworkConstraints(policy);
|
|
78
|
+
if (refuse) {
|
|
79
|
+
throw new PermissionDeniedError('pi RPC backend cannot enforce tool, executable, filesystem, MCP, or skill permissions in-subprocess. Use the pi-sdk backend for tool-level enforcement, or remove those dimensions and rely on networkEgress + the gateway egress proxy.');
|
|
80
|
+
}
|
|
67
81
|
await acquire();
|
|
68
82
|
const client = new PiRpcClient({
|
|
69
83
|
command: options.command ?? 'pi',
|
|
70
84
|
...(options.provider !== undefined && { provider: options.provider }),
|
|
71
85
|
...(options.model !== undefined && { model: options.model }),
|
|
72
86
|
...((request.cwd ?? options.cwd) !== undefined && { cwd: request.cwd ?? options.cwd }),
|
|
87
|
+
...(options.egressProxyUrl !== undefined && { egressProxyUrl: options.egressProxyUrl }),
|
|
88
|
+
...(context.egressToken !== undefined && { egressToken: context.egressToken }),
|
|
89
|
+
// Per-step proxy env from the runtime (canonical path; takes precedence
|
|
90
|
+
// over options.egressProxyUrl).
|
|
91
|
+
...(context.proxyEnv !== undefined && { proxyEnv: context.proxyEnv }),
|
|
73
92
|
persistSession: false,
|
|
74
93
|
});
|
|
75
94
|
const onAbort = () => client.abort().catch(() => { });
|
|
@@ -110,23 +129,56 @@ export function createPiBackend(options = {}) {
|
|
|
110
129
|
};
|
|
111
130
|
}
|
|
112
131
|
/**
|
|
113
|
-
*
|
|
114
|
-
*
|
|
132
|
+
* True iff the workflow author explicitly declared at least one non-network
|
|
133
|
+
* dimension on the step. Walks the raw `AgentPermissions` input, NOT the
|
|
134
|
+
* resolved `ResolvedPolicy` (which always has every dimension populated by
|
|
135
|
+
* intersection — so we cannot tell user intent from defaulted deny-all).
|
|
115
136
|
*/
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
137
|
+
/**
|
|
138
|
+
* Fallback for callers that don't populate `BackendContext.declaredPermissions`
|
|
139
|
+
* (older test harnesses, hand-built ResolvedPolicy instances). Mirrors the
|
|
140
|
+
* pre-`declaredPermissions` heuristic: any non-default shape on a non-network
|
|
141
|
+
* dimension counts as a constraint Pi RPC cannot enforce.
|
|
142
|
+
*/
|
|
143
|
+
function resolvedPolicyHasNonNetworkConstraints(policy) {
|
|
144
|
+
const tools = policy.allowedTools;
|
|
145
|
+
if (tools !== undefined && !tools.star)
|
|
146
|
+
return true;
|
|
147
|
+
if (policy.allowedExecutables !== undefined && policy.allowedExecutables.size === 0)
|
|
148
|
+
return true;
|
|
149
|
+
if (policy.allowedMcpServers !== undefined && policy.allowedMcpServers.size === 0)
|
|
150
|
+
return true;
|
|
151
|
+
if (policy.allowedSkills !== undefined && policy.allowedSkills.size === 0)
|
|
152
|
+
return true;
|
|
153
|
+
if (policy.fsRead !== undefined && policy.fsRead.size === 0)
|
|
154
|
+
return true;
|
|
155
|
+
if (policy.fsWrite !== undefined && policy.fsWrite.size === 0)
|
|
156
|
+
return true;
|
|
157
|
+
if (policy.approval !== undefined && policy.approval !== null)
|
|
158
|
+
return true;
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
function declaresNonNetworkDimension(declared) {
|
|
162
|
+
if (declared === undefined)
|
|
163
|
+
return false;
|
|
164
|
+
return (declared.allowedTools !== undefined ||
|
|
165
|
+
declared.deniedTools !== undefined ||
|
|
166
|
+
declared.allowedExecutables !== undefined ||
|
|
167
|
+
declared.allowedMcpServers !== undefined ||
|
|
168
|
+
declared.allowedSkills !== undefined ||
|
|
169
|
+
declared.allowedSecrets !== undefined ||
|
|
170
|
+
declared.fsRead !== undefined ||
|
|
171
|
+
declared.fsWrite !== undefined ||
|
|
172
|
+
declared.approval !== undefined ||
|
|
173
|
+
declared.profile !== undefined);
|
|
126
174
|
}
|
|
127
175
|
function buildPrompt(req, skillBodies = []) {
|
|
128
176
|
const parts = [];
|
|
129
177
|
const systemParts = [];
|
|
178
|
+
if (req.agentDef?.soul !== undefined)
|
|
179
|
+
systemParts.push(req.agentDef.soul);
|
|
180
|
+
if (req.agentDef !== undefined)
|
|
181
|
+
systemParts.push(req.agentDef.instructions);
|
|
130
182
|
if (req.system)
|
|
131
183
|
systemParts.push(req.system);
|
|
132
184
|
for (const body of skillBodies)
|
package/dist/backend.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,EAAE;AACF,wEAAwE;AACxE,iEAAiE;AACjE,+DAA+D;AAC/D,EAAE;AACF,sEAAsE;AACtE,2DAA2D;AAE3D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
|
package/dist/factory.d.ts
CHANGED
|
@@ -26,6 +26,8 @@ export interface PiBackendConfig {
|
|
|
26
26
|
timeout?: number;
|
|
27
27
|
/** Max concurrent pi processes */
|
|
28
28
|
maxConcurrent?: number;
|
|
29
|
+
/** Egress proxy URL to inject into pi subprocess (for network egress enforcement) */
|
|
30
|
+
egressProxyUrl?: string;
|
|
29
31
|
}
|
|
30
32
|
/**
|
|
31
33
|
* Create a pi backend from CLI configuration.
|
package/dist/factory.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAG9C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,iBAAiB;IACjB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAChD,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,kCAAkC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAG9C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,iBAAiB;IACjB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAChD,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,kCAAkC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,qFAAqF;IACrF,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAA;AAC9C,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,eAAe,GAAG;IAAE,eAAe,CAAC,EAAE,SAAS,CAAA;CAAE,GACxD,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA"}
|
package/dist/factory.js
CHANGED
|
@@ -6,6 +6,9 @@ export function createPiBackendFromConfig(config) {
|
|
|
6
6
|
if (config.commandProvider !== undefined) {
|
|
7
7
|
return Promise.resolve(config.commandProvider()).then((cmd) => createPiBackend({ ...config, command: cmd }));
|
|
8
8
|
}
|
|
9
|
-
return createPiBackend(
|
|
9
|
+
return createPiBackend({
|
|
10
|
+
...config,
|
|
11
|
+
...(config.egressProxyUrl !== undefined && { egressProxyUrl: config.egressProxyUrl }),
|
|
12
|
+
});
|
|
10
13
|
}
|
|
11
14
|
//# sourceMappingURL=factory.js.map
|
package/dist/factory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAyC9C,MAAM,UAAU,yBAAyB,CACvC,MAAuB;IAEvB,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5D,eAAe,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAC7C,CAAA;IACH,CAAC;IACD,OAAO,eAAe,CAAC;QACrB,GAAG,MAAM;QACT,GAAG,CAAC,MAAM,CAAC,cAAc,KAAK,SAAS,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC;KACtF,CAAC,CAAA;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export { createPiBackendFromConfig } from './factory.js';
|
|
|
10
10
|
export { PiProvider, createPiProvider } from './provider.js';
|
|
11
11
|
export { PiRpcClient } from './rpc-client.js';
|
|
12
12
|
export { createPiSdkBackend, derivePiToolAllowlist, PiSdkBackendError, PiSdkBackendAuthenticationError, PiSdkBackendTimeoutError, } from './sdk-backend.js';
|
|
13
|
-
export { PiSdkClient } from './sdk-client.js';
|
|
13
|
+
export { PiSdkClient, PiSdkUpstreamError } from './sdk-client.js';
|
|
14
14
|
export type { PiBackendOptions, PiSdkBackendOptions } from './types.js';
|
|
15
15
|
export type { PiBackendConfig } from './factory.js';
|
|
16
16
|
export type { PiRpcClientOptions, PiRpcResponse } from './rpc-client.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,eAAe,EACf,cAAc,EACd,4BAA4B,EAC5B,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,+BAA+B,EAC/B,wBAAwB,GACzB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,eAAe,EACf,cAAc,EACd,4BAA4B,EAC5B,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,+BAA+B,EAC/B,wBAAwB,GACzB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACjE,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACvE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACnD,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACxE,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -10,5 +10,5 @@ export { createPiBackendFromConfig } from './factory.js';
|
|
|
10
10
|
export { PiProvider, createPiProvider } from './provider.js';
|
|
11
11
|
export { PiRpcClient } from './rpc-client.js';
|
|
12
12
|
export { createPiSdkBackend, derivePiToolAllowlist, PiSdkBackendError, PiSdkBackendAuthenticationError, PiSdkBackendTimeoutError, } from './sdk-backend.js';
|
|
13
|
-
export { PiSdkClient } from './sdk-client.js';
|
|
13
|
+
export { PiSdkClient, PiSdkUpstreamError } from './sdk-client.js';
|
|
14
14
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,eAAe,EACf,cAAc,EACd,4BAA4B,EAC5B,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,+BAA+B,EAC/B,wBAAwB,GACzB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,eAAe,EACf,cAAc,EACd,4BAA4B,EAC5B,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,+BAA+B,EAC/B,wBAAwB,GACzB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA"}
|
package/dist/rpc-client.d.ts
CHANGED
|
@@ -11,6 +11,17 @@ export interface PiRpcClientOptions {
|
|
|
11
11
|
args?: readonly string[];
|
|
12
12
|
/** Whether to persist the session (default: false — ephemeral) */
|
|
13
13
|
persistSession?: boolean;
|
|
14
|
+
/** Optional egress proxy URL to inject into subprocess environment */
|
|
15
|
+
egressProxyUrl?: string;
|
|
16
|
+
/** Optional egress token to inject into subprocess environment */
|
|
17
|
+
egressToken?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Optional pre-encoded proxy env (HTTP_PROXY/HTTPS_PROXY/SKELM_EGRESS_TOKEN)
|
|
20
|
+
* supplied by the runtime per-step. When set, overrides the legacy
|
|
21
|
+
* `egressProxyUrl`/`egressToken` fields. The HTTP_PROXY value already has
|
|
22
|
+
* the token embedded as Basic credentials.
|
|
23
|
+
*/
|
|
24
|
+
proxyEnv?: Record<string, string>;
|
|
14
25
|
}
|
|
15
26
|
export interface PiRpcResponse {
|
|
16
27
|
text: string;
|
|
@@ -41,4 +52,12 @@ export declare class PiRpcClient {
|
|
|
41
52
|
private _send;
|
|
42
53
|
private _rejectAll;
|
|
43
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Encode an egress token into the credential field of a proxy URL so that
|
|
57
|
+
* standard HTTP clients automatically send `Proxy-Authorization: Basic
|
|
58
|
+
* <base64(token:<egressToken>)>`.
|
|
59
|
+
*
|
|
60
|
+
* Exported for testing.
|
|
61
|
+
*/
|
|
62
|
+
export declare function encodeProxyUrlWithToken(proxyUrl: string, token: string | undefined): string;
|
|
44
63
|
//# sourceMappingURL=rpc-client.d.ts.map
|
package/dist/rpc-client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-client.d.ts","sourceRoot":"","sources":["../src/rpc-client.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,0BAA0B;IAC1B,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACxB,kEAAkE;IAClE,cAAc,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"rpc-client.d.ts","sourceRoot":"","sources":["../src/rpc-client.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,0BAA0B;IAC1B,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACxB,kEAAkE;IAClE,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;CACtD;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,OAAO,CAGZ;IACH,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,cAAc,CAAsD;IAC5E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;gBAEhC,OAAO,GAAE,kBAAuB;IAI5C,oFAAoF;IAC9E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkF5B,yEAAyE;IACnE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IAoE1E,0CAA0C;IACpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,gCAAgC;IAC1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,UAAU;CASnB;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAU3F"}
|
package/dist/rpc-client.js
CHANGED
|
@@ -28,9 +28,26 @@ export class PiRpcClient {
|
|
|
28
28
|
args.push('--no-session');
|
|
29
29
|
if (this.options.args)
|
|
30
30
|
args.push(...this.options.args);
|
|
31
|
+
// Build environment with optional egress proxy injection
|
|
32
|
+
const env = Object.fromEntries(Object.entries(process.env).filter(([, v]) => v !== undefined));
|
|
33
|
+
// Inject proxy env. Three sources, in priority order:
|
|
34
|
+
// 1. options.proxyEnv (per-step env from BackendContext.proxyEnv when
|
|
35
|
+
// the gateway runtime provides one — this is the canonical path).
|
|
36
|
+
// 2. options.egressProxyUrl + options.egressToken — legacy
|
|
37
|
+
// construction-time fields kept for back-compat.
|
|
38
|
+
if (this.options.proxyEnv !== undefined) {
|
|
39
|
+
Object.assign(env, this.options.proxyEnv);
|
|
40
|
+
}
|
|
41
|
+
else if (this.options.egressProxyUrl !== undefined) {
|
|
42
|
+
env.HTTP_PROXY = encodeProxyUrlWithToken(this.options.egressProxyUrl, this.options.egressToken);
|
|
43
|
+
env.HTTPS_PROXY = env.HTTP_PROXY;
|
|
44
|
+
if (this.options.egressToken !== undefined) {
|
|
45
|
+
env.SKELM_EGRESS_TOKEN = this.options.egressToken;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
31
48
|
const proc = spawn(command, args, {
|
|
32
49
|
cwd: this.options.cwd ?? process.cwd(),
|
|
33
|
-
env
|
|
50
|
+
env,
|
|
34
51
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
35
52
|
});
|
|
36
53
|
this.proc = proc;
|
|
@@ -196,4 +213,24 @@ export class PiRpcClient {
|
|
|
196
213
|
this.eventListeners = [];
|
|
197
214
|
}
|
|
198
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* Encode an egress token into the credential field of a proxy URL so that
|
|
218
|
+
* standard HTTP clients automatically send `Proxy-Authorization: Basic
|
|
219
|
+
* <base64(token:<egressToken>)>`.
|
|
220
|
+
*
|
|
221
|
+
* Exported for testing.
|
|
222
|
+
*/
|
|
223
|
+
export function encodeProxyUrlWithToken(proxyUrl, token) {
|
|
224
|
+
if (token === undefined || token === '')
|
|
225
|
+
return proxyUrl;
|
|
226
|
+
try {
|
|
227
|
+
const url = new URL(proxyUrl);
|
|
228
|
+
url.username = 'token';
|
|
229
|
+
url.password = token;
|
|
230
|
+
return url.toString();
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
return proxyUrl;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
199
236
|
//# sourceMappingURL=rpc-client.js.map
|
package/dist/rpc-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-client.js","sourceRoot":"","sources":["../src/rpc-client.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,oCAAoC;AACpC,EAAE;AACF,qCAAqC;AACrC,iFAAiF;AAEjF,OAAO,EAAqB,KAAK,EAAE,MAAM,oBAAoB,CAAA,CAAC,qDAAqD;AACnH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"rpc-client.js","sourceRoot":"","sources":["../src/rpc-client.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk-backend.d.ts
CHANGED
|
@@ -40,6 +40,11 @@ export declare function createPiSdkBackend(options?: PiSdkBackendOptions): Skelm
|
|
|
40
40
|
*
|
|
41
41
|
* Returns `undefined` when no policy is set (pi uses its defaults).
|
|
42
42
|
* Returns a string[] (possibly empty) when a policy is present.
|
|
43
|
+
*
|
|
44
|
+
* networkEgress: 'deny' suppresses the bash tool entirely — pi has no native
|
|
45
|
+
* fetch tool, so the only way an agent can reach the network is via
|
|
46
|
+
* `curl`/`wget`/etc. spawned through bash. Dropping bash from the allowlist
|
|
47
|
+
* is a coarse but reliable enforcement of network-deny.
|
|
43
48
|
*/
|
|
44
49
|
export declare function derivePiToolAllowlist(policy: ResolvedPolicy | undefined): string[] | undefined;
|
|
45
50
|
//# sourceMappingURL=sdk-backend.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-backend.d.ts","sourceRoot":"","sources":["../src/sdk-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;
|
|
1
|
+
{"version":3,"file":"sdk-backend.d.ts","sourceRoot":"","sources":["../src/sdk-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAOH,OAAO,KAAK,EAOV,cAAc,EACd,YAAY,EACb,MAAM,aAAa,CAAA;AAEpB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAKrD,qBAAa,iBAAkB,SAAQ,KAAK;aAItB,KAAK,CAAC,EAAE,OAAO;IAHnC,SAAkB,IAAI,uBAAsB;gBAE1C,OAAO,EAAE,MAAM,EACG,KAAK,CAAC,EAAE,OAAO,YAAA;CAIpC;AAED,qBAAa,+BAAgC,SAAQ,iBAAiB;CAAG;AACzE,qBAAa,wBAAyB,SAAQ,iBAAiB;CAAG;AAElE;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,YAAY,CAwHlF;AAsBD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,EAAE,GAAG,SAAS,CAwB9F"}
|
package/dist/sdk-backend.js
CHANGED
|
@@ -16,8 +16,9 @@
|
|
|
16
16
|
* fsWrite.size > 0 → 'write', 'edit'
|
|
17
17
|
* undefined policy → no override (pi defaults)
|
|
18
18
|
*/
|
|
19
|
-
import {
|
|
20
|
-
import { PiSdkClient } from './sdk-client.js';
|
|
19
|
+
import { assertEgressEnforceable as assertEgressEnforceableCore, createConcurrencySemaphore, loadSkillBodies, } from '@skelm/core';
|
|
20
|
+
import { PiSdkClient, PiSdkUpstreamError } from './sdk-client.js';
|
|
21
|
+
const assertEgressEnforceable = (policy) => assertEgressEnforceableCore(policy, 'pi-sdk');
|
|
21
22
|
export class PiSdkBackendError extends Error {
|
|
22
23
|
cause;
|
|
23
24
|
name = 'PiSdkBackendError';
|
|
@@ -39,7 +40,7 @@ export class PiSdkBackendTimeoutError extends PiSdkBackendError {
|
|
|
39
40
|
*/
|
|
40
41
|
export function createPiSdkBackend(options = {}) {
|
|
41
42
|
const capabilities = {
|
|
42
|
-
prompt:
|
|
43
|
+
prompt: true,
|
|
43
44
|
streaming: true,
|
|
44
45
|
sessionLifecycle: true,
|
|
45
46
|
mcp: false,
|
|
@@ -47,31 +48,63 @@ export function createPiSdkBackend(options = {}) {
|
|
|
47
48
|
modelSelection: false,
|
|
48
49
|
toolPermissions: 'native',
|
|
49
50
|
};
|
|
50
|
-
const
|
|
51
|
-
let active = 0;
|
|
52
|
-
const queue = [];
|
|
53
|
-
const acquire = () => {
|
|
54
|
-
if (maxConcurrent === 0 || active < maxConcurrent) {
|
|
55
|
-
active++;
|
|
56
|
-
return Promise.resolve();
|
|
57
|
-
}
|
|
58
|
-
return new Promise((resolve) => queue.push(resolve));
|
|
59
|
-
};
|
|
60
|
-
const release = () => {
|
|
61
|
-
const next = queue.shift();
|
|
62
|
-
if (next)
|
|
63
|
-
next();
|
|
64
|
-
else
|
|
65
|
-
active--;
|
|
66
|
-
};
|
|
51
|
+
const { acquire, release } = createConcurrencySemaphore(options.maxConcurrent ?? 4);
|
|
67
52
|
return {
|
|
68
53
|
id: options.id ?? 'pi-sdk',
|
|
69
54
|
label: options.label ?? 'Pi Coding Agent (SDK)',
|
|
70
55
|
capabilities,
|
|
56
|
+
async infer(request, context) {
|
|
57
|
+
// Fail-closed before acquiring the concurrency slot — see comment on
|
|
58
|
+
// assertEgressEnforceable.
|
|
59
|
+
assertEgressEnforceable(context.permissions);
|
|
60
|
+
await acquire();
|
|
61
|
+
try {
|
|
62
|
+
const cwd = options.cwd;
|
|
63
|
+
const promptText = buildInferPrompt(request);
|
|
64
|
+
const client = new PiSdkClient({
|
|
65
|
+
...(cwd !== undefined && { cwd }),
|
|
66
|
+
// Pure inference: disable all built-in tools
|
|
67
|
+
tools: [],
|
|
68
|
+
noTools: 'all',
|
|
69
|
+
...(options.noExtensions !== undefined && { noExtensions: options.noExtensions }),
|
|
70
|
+
...(options.noSkills !== undefined && { noSkills: options.noSkills }),
|
|
71
|
+
...(options.noContextFiles !== undefined && { noContextFiles: options.noContextFiles }),
|
|
72
|
+
...(request.system !== undefined && {
|
|
73
|
+
system: request.system,
|
|
74
|
+
replaceSystemPrompt: false,
|
|
75
|
+
}),
|
|
76
|
+
});
|
|
77
|
+
const result = await client.prompt(promptText, context.signal, options.timeout ?? 300_000, context.onPartial);
|
|
78
|
+
const response = {
|
|
79
|
+
...(result.usage !== undefined && {
|
|
80
|
+
usage: {
|
|
81
|
+
inputTokens: result.usage.inputTokens,
|
|
82
|
+
outputTokens: result.usage.outputTokens,
|
|
83
|
+
},
|
|
84
|
+
}),
|
|
85
|
+
};
|
|
86
|
+
if (request.outputSchema !== undefined) {
|
|
87
|
+
response.structured = parseStructured(result.text);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
response.text = result.text;
|
|
91
|
+
}
|
|
92
|
+
return response;
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
throw classifyPiSdkError(err, 'inference');
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
release();
|
|
99
|
+
}
|
|
100
|
+
},
|
|
71
101
|
async run(request, context) {
|
|
102
|
+
const policy = context.permissions ?? request.permissions;
|
|
103
|
+
// Fail-closed before acquiring the concurrency slot — see comment on
|
|
104
|
+
// assertEgressEnforceable.
|
|
105
|
+
assertEgressEnforceable(policy);
|
|
72
106
|
await acquire();
|
|
73
107
|
try {
|
|
74
|
-
const policy = context.permissions ?? request.permissions;
|
|
75
108
|
const toolAllowlist = derivePiToolAllowlist(policy);
|
|
76
109
|
const skillBodies = await loadSkillBodies(request, context);
|
|
77
110
|
const systemContent = buildSystemContent(options.systemPrompt, request, skillBodies);
|
|
@@ -89,7 +122,7 @@ export function createPiSdkBackend(options = {}) {
|
|
|
89
122
|
replaceSystemPrompt: options.systemPrompt !== undefined,
|
|
90
123
|
}),
|
|
91
124
|
});
|
|
92
|
-
const result = await client.prompt(request.prompt, context.signal, options.timeout ?? 300_000);
|
|
125
|
+
const result = await client.prompt(request.prompt, context.signal, options.timeout ?? 300_000, context.onPartial);
|
|
93
126
|
return {
|
|
94
127
|
text: result.text,
|
|
95
128
|
stopReason: result.stopReason,
|
|
@@ -102,15 +135,7 @@ export function createPiSdkBackend(options = {}) {
|
|
|
102
135
|
};
|
|
103
136
|
}
|
|
104
137
|
catch (err) {
|
|
105
|
-
|
|
106
|
-
if (err.message.includes('ENOENT') || err.message.includes('not installed')) {
|
|
107
|
-
throw new PiSdkBackendAuthenticationError('pi SDK not available. Install it: npm install @mariozechner/pi-coding-agent', err);
|
|
108
|
-
}
|
|
109
|
-
if (err.message.includes('timed out')) {
|
|
110
|
-
throw new PiSdkBackendTimeoutError(err.message, err);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
throw new PiSdkBackendError(`pi SDK agent execution failed: ${err.message}`, err);
|
|
138
|
+
throw classifyPiSdkError(err, 'agent execution');
|
|
114
139
|
}
|
|
115
140
|
finally {
|
|
116
141
|
release();
|
|
@@ -118,18 +143,40 @@ export function createPiSdkBackend(options = {}) {
|
|
|
118
143
|
},
|
|
119
144
|
};
|
|
120
145
|
}
|
|
146
|
+
function classifyPiSdkError(err, action) {
|
|
147
|
+
if (err instanceof PiSdkUpstreamError) {
|
|
148
|
+
// Already carries provider/model + upstream errorMessage; surface it as
|
|
149
|
+
// a backend-level error without obscuring the diagnostic.
|
|
150
|
+
return new PiSdkBackendError(`pi SDK ${action} failed: ${err.message}`, err);
|
|
151
|
+
}
|
|
152
|
+
if (err instanceof Error) {
|
|
153
|
+
if (err.message.includes('ENOENT') || err.message.includes('not installed')) {
|
|
154
|
+
return new PiSdkBackendAuthenticationError('pi SDK not available. Install it: npm install @mariozechner/pi-coding-agent', err);
|
|
155
|
+
}
|
|
156
|
+
if (err.message.includes('timed out')) {
|
|
157
|
+
return new PiSdkBackendTimeoutError(err.message, err);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return new PiSdkBackendError(`pi SDK ${action} failed: ${err.message}`, err);
|
|
161
|
+
}
|
|
121
162
|
/**
|
|
122
163
|
* Derive a pi tool allowlist from a skelm permission policy.
|
|
123
164
|
*
|
|
124
165
|
* Returns `undefined` when no policy is set (pi uses its defaults).
|
|
125
166
|
* Returns a string[] (possibly empty) when a policy is present.
|
|
167
|
+
*
|
|
168
|
+
* networkEgress: 'deny' suppresses the bash tool entirely — pi has no native
|
|
169
|
+
* fetch tool, so the only way an agent can reach the network is via
|
|
170
|
+
* `curl`/`wget`/etc. spawned through bash. Dropping bash from the allowlist
|
|
171
|
+
* is a coarse but reliable enforcement of network-deny.
|
|
126
172
|
*/
|
|
127
173
|
export function derivePiToolAllowlist(policy) {
|
|
128
174
|
if (policy === undefined)
|
|
129
175
|
return undefined;
|
|
176
|
+
const networkDenied = policy.networkEgress === 'deny';
|
|
130
177
|
const allowed = [];
|
|
131
178
|
const execs = policy.allowedExecutables;
|
|
132
|
-
if (execs.has('bash') || execs.has('sh')) {
|
|
179
|
+
if (!networkDenied && (execs.has('bash') || execs.has('sh'))) {
|
|
133
180
|
allowed.push('bash');
|
|
134
181
|
}
|
|
135
182
|
const fsRead = policy.fsRead;
|
|
@@ -154,21 +201,59 @@ function buildSystemContent(systemBase, req, skillBodies) {
|
|
|
154
201
|
const parts = [];
|
|
155
202
|
if (systemBase !== undefined)
|
|
156
203
|
parts.push(systemBase);
|
|
204
|
+
if (req.agentDef?.soul !== undefined)
|
|
205
|
+
parts.push(req.agentDef.soul);
|
|
206
|
+
if (req.agentDef !== undefined)
|
|
207
|
+
parts.push(req.agentDef.instructions);
|
|
157
208
|
if (req.system)
|
|
158
209
|
parts.push(req.system);
|
|
159
210
|
for (const body of skillBodies)
|
|
160
211
|
parts.push(body);
|
|
161
212
|
return parts.length > 0 ? parts.join('\n\n---\n\n') : undefined;
|
|
162
213
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
214
|
+
/**
|
|
215
|
+
* Concatenate InferRequest messages into a single prompt string.
|
|
216
|
+
* Pi runs as a chat agent that takes one user prompt — for multi-turn
|
|
217
|
+
* histories we serialize the conversation into a labeled transcript.
|
|
218
|
+
*/
|
|
219
|
+
function buildInferPrompt(req) {
|
|
220
|
+
if (req.messages.length === 1 && req.messages[0]?.role === 'user') {
|
|
221
|
+
return req.messages[0].content;
|
|
171
222
|
}
|
|
172
|
-
return
|
|
223
|
+
return req.messages
|
|
224
|
+
.map((m) => `${m.role === 'user' ? 'User' : m.role === 'assistant' ? 'Assistant' : m.role}: ${m.content}`)
|
|
225
|
+
.join('\n\n');
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Extract a JSON value from the model's text output. Tolerates ```json
|
|
229
|
+
* fenced blocks and surrounding prose. The runner validates the result
|
|
230
|
+
* against the step's output schema, so we only need to parse here.
|
|
231
|
+
*/
|
|
232
|
+
function parseStructured(text) {
|
|
233
|
+
const candidate = extractJson(text);
|
|
234
|
+
if (candidate === null) {
|
|
235
|
+
throw new PiSdkBackendError(`pi inference returned no parseable JSON. Output (first 200 chars): ${text.slice(0, 200)}`);
|
|
236
|
+
}
|
|
237
|
+
try {
|
|
238
|
+
return JSON.parse(candidate);
|
|
239
|
+
}
|
|
240
|
+
catch (err) {
|
|
241
|
+
throw new PiSdkBackendError(`pi inference output is not valid JSON: ${err.message}. Raw: ${text.slice(0, 200)}`, err);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
function extractJson(text) {
|
|
245
|
+
const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
246
|
+
if (fenced?.[1])
|
|
247
|
+
return fenced[1].trim();
|
|
248
|
+
const start = text.search(/[{[]/);
|
|
249
|
+
if (start === -1)
|
|
250
|
+
return null;
|
|
251
|
+
// Greedy: take from first opener through last matching closer.
|
|
252
|
+
const opener = text[start];
|
|
253
|
+
const closer = opener === '{' ? '}' : ']';
|
|
254
|
+
const end = text.lastIndexOf(closer);
|
|
255
|
+
if (end <= start)
|
|
256
|
+
return null;
|
|
257
|
+
return text.slice(start, end + 1);
|
|
173
258
|
}
|
|
174
259
|
//# sourceMappingURL=sdk-backend.js.map
|
package/dist/sdk-backend.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-backend.js","sourceRoot":"","sources":["../src/sdk-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"sdk-backend.js","sourceRoot":"","sources":["../src/sdk-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EACL,uBAAuB,IAAI,2BAA2B,EACtD,0BAA0B,EAC1B,eAAe,GAChB,MAAM,aAAa,CAAA;AAWpB,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAGjE,MAAM,uBAAuB,GAAG,CAAC,MAAkC,EAAQ,EAAE,CAC3E,2BAA2B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;AAE/C,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAItB;IAHF,IAAI,GAAG,mBAAmB,CAAA;IAC5C,YACE,OAAe,EACG,KAAe;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAA;QAFI,UAAK,GAAL,KAAK,CAAU;IAGnC,CAAC;CACF;AAED,MAAM,OAAO,+BAAgC,SAAQ,iBAAiB;CAAG;AACzE,MAAM,OAAO,wBAAyB,SAAQ,iBAAiB;CAAG;AAElE;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAA+B,EAAE;IAClE,MAAM,YAAY,GAAwB;QACxC,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,IAAI;QACf,gBAAgB,EAAE,IAAI;QACtB,GAAG,EAAE,KAAK;QACV,MAAM,EAAE,IAAI;QACZ,cAAc,EAAE,KAAK;QACrB,eAAe,EAAE,QAAQ;KAC1B,CAAA;IAED,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,0BAA0B,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC,CAAA;IAEnF,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,uBAAuB;QAC/C,YAAY;QAEZ,KAAK,CAAC,KAAK,CAAC,OAAqB,EAAE,OAAuB;YACxD,qEAAqE;YACrE,2BAA2B;YAC3B,uBAAuB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;YAC5C,MAAM,OAAO,EAAE,CAAA;YACf,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAA;gBACvB,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;gBAC5C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;oBAC7B,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,EAAE,GAAG,EAAE,CAAC;oBACjC,6CAA6C;oBAC7C,KAAK,EAAE,EAAE;oBACT,OAAO,EAAE,KAAc;oBACvB,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;oBACjF,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACrE,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;oBACvF,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI;wBAClC,MAAM,EAAE,OAAO,CAAC,MAAM;wBACtB,mBAAmB,EAAE,KAAK;qBAC3B,CAAC;iBACH,CAAC,CAAA;gBAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAChC,UAAU,EACV,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,OAAO,IAAI,OAAO,EAC1B,OAAO,CAAC,SAAS,CAClB,CAAA;gBAED,MAAM,QAAQ,GAAkB;oBAC9B,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI;wBAChC,KAAK,EAAE;4BACL,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW;4BACrC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY;yBACxC;qBACF,CAAC;iBACH,CAAA;gBACD,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;oBACvC,QAAQ,CAAC,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBACpD,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;gBAC7B,CAAC;gBACD,OAAO,QAAQ,CAAA;YACjB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,kBAAkB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;YAC5C,CAAC;oBAAS,CAAC;gBACT,OAAO,EAAE,CAAA;YACX,CAAC;QACH,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,OAAqB,EAAE,OAAuB;YACtD,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAA;YACzD,qEAAqE;YACrE,2BAA2B;YAC3B,uBAAuB,CAAC,MAAM,CAAC,CAAA;YAC/B,MAAM,OAAO,EAAE,CAAA;YAEf,IAAI,CAAC;gBACH,MAAM,aAAa,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAA;gBAEnD,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAC3D,MAAM,aAAa,GAAG,kBAAkB,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,EAAE,WAAW,CAAC,CAAA;gBAEpF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;gBACtC,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;oBAC7B,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,EAAE,GAAG,EAAE,CAAC;oBACjC,GAAG,CAAC,aAAa,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;oBAC5D,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,aAAa,EAAE,MAAM,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAc,EAAE,CAAC;oBACvF,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;oBACjF,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACrE,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;oBACvF,0EAA0E;oBAC1E,GAAG,CAAC,aAAa,KAAK,SAAS,IAAI;wBACjC,MAAM,EAAE,aAAa;wBACrB,mBAAmB,EAAE,OAAO,CAAC,YAAY,KAAK,SAAS;qBACxD,CAAC;iBACH,CAAC,CAAA;gBAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAChC,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,OAAO,IAAI,OAAO,EAC1B,OAAO,CAAC,SAAS,CAClB,CAAA;gBAED,OAAO;oBACL,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI;wBAChC,KAAK,EAAE;4BACL,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW;4BACrC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY;yBACxC;qBACF,CAAC;iBACH,CAAA;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAA;YAClD,CAAC;oBAAS,CAAC;gBACT,OAAO,EAAE,CAAA;YACX,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAY,EAAE,MAAuC;IAC/E,IAAI,GAAG,YAAY,kBAAkB,EAAE,CAAC;QACtC,wEAAwE;QACxE,0DAA0D;QAC1D,OAAO,IAAI,iBAAiB,CAAC,UAAU,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAA;IAC9E,CAAC;IACD,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YAC5E,OAAO,IAAI,+BAA+B,CACxC,6EAA6E,EAC7E,GAAG,CACJ,CAAA;QACH,CAAC;QACD,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,wBAAwB,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,iBAAiB,CAAC,UAAU,MAAM,YAAa,GAAa,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAA;AACzF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAkC;IACtE,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAE1C,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,KAAK,MAAM,CAAA;IAErD,MAAM,OAAO,GAAa,EAAE,CAAA;IAE5B,MAAM,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAA;IACvC,IAAI,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACtB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC5B,IAAI,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzF,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;IAC5C,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;IAC9B,IAAI,OAAO,YAAY,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7F,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;QACzE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC/B,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CACzB,UAA8B,EAC9B,GAAiB,EACjB,WAAqB;IAErB,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,UAAU,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACpD,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACnE,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;IACrE,IAAI,GAAG,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACtC,KAAK,MAAM,IAAI,IAAI,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACjE,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,GAAiB;IACzC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;QAClE,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IAChC,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ;SAChB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAChG;SACA,IAAI,CAAC,MAAM,CAAC,CAAA;AACjB,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IACnC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,iBAAiB,CACzB,sEAAsE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAC3F,CAAA;IACH,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,iBAAiB,CACzB,0CAA2C,GAAa,CAAC,OAAO,UAAU,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAC9F,GAAG,CACJ,CAAA;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAA;IACzD,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACjC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IAC7B,+DAA+D;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;IAC1B,MAAM,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IACpC,IAAI,GAAG,IAAI,KAAK;QAAE,OAAO,IAAI,CAAA;IAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;AACnC,CAAC"}
|
package/dist/sdk-client.d.ts
CHANGED
|
@@ -5,6 +5,11 @@
|
|
|
5
5
|
* pass resource-loader options (system prompt, skill/extension suppression)
|
|
6
6
|
* that createAgentSession does not expose directly.
|
|
7
7
|
*/
|
|
8
|
+
export interface PiSdkPromptOptions {
|
|
9
|
+
signal?: AbortSignal;
|
|
10
|
+
timeoutMs?: number;
|
|
11
|
+
onPartial?: (delta: string) => void;
|
|
12
|
+
}
|
|
8
13
|
export interface PiSdkClientOptions {
|
|
9
14
|
/** Working directory for pi's project-local discovery. Default: process.cwd() */
|
|
10
15
|
cwd?: string;
|
|
@@ -53,10 +58,28 @@ export interface PiSdkResponse {
|
|
|
53
58
|
outputTokens: number;
|
|
54
59
|
};
|
|
55
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Thrown by `PiSdkClient.prompt` when pi terminates with a non-success
|
|
63
|
+
* stopReason ('error' or 'aborted' from the provider side). Carries the
|
|
64
|
+
* upstream `errorMessage` from pi's final assistant message so callers can
|
|
65
|
+
* surface a useful diagnostic (rate limits, 401s, network failures, …).
|
|
66
|
+
*/
|
|
67
|
+
export declare class PiSdkUpstreamError extends Error {
|
|
68
|
+
/** The stopReason pi reported on the final assistant message. */
|
|
69
|
+
readonly stopReason: 'error' | 'aborted';
|
|
70
|
+
/** The raw `errorMessage` field from pi's assistant message, if present. */
|
|
71
|
+
readonly upstreamErrorMessage?: string | undefined;
|
|
72
|
+
readonly name = "PiSdkUpstreamError";
|
|
73
|
+
constructor(message: string,
|
|
74
|
+
/** The stopReason pi reported on the final assistant message. */
|
|
75
|
+
stopReason: 'error' | 'aborted',
|
|
76
|
+
/** The raw `errorMessage` field from pi's assistant message, if present. */
|
|
77
|
+
upstreamErrorMessage?: string | undefined);
|
|
78
|
+
}
|
|
56
79
|
export declare class PiSdkClient {
|
|
57
80
|
private readonly opts;
|
|
58
81
|
constructor(opts?: PiSdkClientOptions);
|
|
59
|
-
prompt(text: string, signal?: AbortSignal, timeoutMs?: number): Promise<PiSdkResponse>;
|
|
82
|
+
prompt(text: string, signal?: AbortSignal, timeoutMs?: number, onPartial?: (delta: string) => void): Promise<PiSdkResponse>;
|
|
60
83
|
private _run;
|
|
61
84
|
}
|
|
62
85
|
//# sourceMappingURL=sdk-client.d.ts.map
|
package/dist/sdk-client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-client.d.ts","sourceRoot":"","sources":["../src/sdk-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,kBAAkB;IACjC,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,KAAK,GAAG,SAAS,CAAA;IAC3B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAA;IAC/D,KAAK,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;CACtD;AAED,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,GAAE,kBAAuB;IAEpD,MAAM,
|
|
1
|
+
{"version":3,"file":"sdk-client.d.ts","sourceRoot":"","sources":["../src/sdk-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,KAAK,GAAG,SAAS,CAAA;IAC3B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAA;IAC/D,KAAK,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;CACtD;AAED;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAIzC,iEAAiE;IACjE,QAAQ,CAAC,UAAU,EAAE,OAAO,GAAG,SAAS;IACxC,4EAA4E;IAC5E,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM;IANxC,SAAkB,IAAI,wBAAuB;gBAE3C,OAAO,EAAE,MAAM;IACf,iEAAiE;IACxD,UAAU,EAAE,OAAO,GAAG,SAAS;IACxC,4EAA4E;IACnE,oBAAoB,CAAC,EAAE,MAAM,YAAA;CAIzC;AAED,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,GAAE,kBAAuB;IAEpD,MAAM,CACV,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,EACpB,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAClC,OAAO,CAAC,aAAa,CAAC;IA4CzB,OAAO,CAAC,IAAI;CAsIb"}
|
package/dist/sdk-client.js
CHANGED
|
@@ -5,12 +5,32 @@
|
|
|
5
5
|
* pass resource-loader options (system prompt, skill/extension suppression)
|
|
6
6
|
* that createAgentSession does not expose directly.
|
|
7
7
|
*/
|
|
8
|
+
/**
|
|
9
|
+
* Thrown by `PiSdkClient.prompt` when pi terminates with a non-success
|
|
10
|
+
* stopReason ('error' or 'aborted' from the provider side). Carries the
|
|
11
|
+
* upstream `errorMessage` from pi's final assistant message so callers can
|
|
12
|
+
* surface a useful diagnostic (rate limits, 401s, network failures, …).
|
|
13
|
+
*/
|
|
14
|
+
export class PiSdkUpstreamError extends Error {
|
|
15
|
+
stopReason;
|
|
16
|
+
upstreamErrorMessage;
|
|
17
|
+
name = 'PiSdkUpstreamError';
|
|
18
|
+
constructor(message,
|
|
19
|
+
/** The stopReason pi reported on the final assistant message. */
|
|
20
|
+
stopReason,
|
|
21
|
+
/** The raw `errorMessage` field from pi's assistant message, if present. */
|
|
22
|
+
upstreamErrorMessage) {
|
|
23
|
+
super(message);
|
|
24
|
+
this.stopReason = stopReason;
|
|
25
|
+
this.upstreamErrorMessage = upstreamErrorMessage;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
8
28
|
export class PiSdkClient {
|
|
9
29
|
opts;
|
|
10
30
|
constructor(opts = {}) {
|
|
11
31
|
this.opts = opts;
|
|
12
32
|
}
|
|
13
|
-
async prompt(text, signal, timeoutMs
|
|
33
|
+
async prompt(text, signal, timeoutMs, onPartial) {
|
|
14
34
|
// Dynamic import keeps @mariozechner/pi-coding-agent optional at runtime
|
|
15
35
|
const pi = await import('@mariozechner/pi-coding-agent').catch(() => {
|
|
16
36
|
throw new Error('pi SDK not installed. Add @mariozechner/pi-coding-agent to your project: npm install @mariozechner/pi-coding-agent');
|
|
@@ -38,13 +58,13 @@ export class PiSdkClient {
|
|
|
38
58
|
...(this.opts.noTools !== undefined && { noTools: this.opts.noTools }),
|
|
39
59
|
});
|
|
40
60
|
try {
|
|
41
|
-
return await this._run(session, text, signal, timeoutMs);
|
|
61
|
+
return await this._run(session, text, signal, timeoutMs ?? 300_000, onPartial);
|
|
42
62
|
}
|
|
43
63
|
finally {
|
|
44
64
|
session.dispose();
|
|
45
65
|
}
|
|
46
66
|
}
|
|
47
|
-
_run(session, text, signal, timeoutMs) {
|
|
67
|
+
_run(session, text, signal, timeoutMs, onPartial) {
|
|
48
68
|
return new Promise((resolve, reject) => {
|
|
49
69
|
let settled = false;
|
|
50
70
|
const settle = (fn) => {
|
|
@@ -73,13 +93,56 @@ export class PiSdkClient {
|
|
|
73
93
|
return;
|
|
74
94
|
}
|
|
75
95
|
signal?.addEventListener('abort', onAbort, { once: true });
|
|
96
|
+
// Track accumulated text per message for delta calculation
|
|
97
|
+
const partialTextByMsg = new Map();
|
|
76
98
|
const unsub = session.subscribe((event) => {
|
|
99
|
+
// Forward partial text deltas if onPartial is provided.
|
|
100
|
+
// pi emits 'message_update' events during streaming with updated content arrays.
|
|
101
|
+
if (onPartial !== undefined && event.type === 'message_update') {
|
|
102
|
+
const msg = event.message;
|
|
103
|
+
if (msg.role === 'assistant' && Array.isArray(msg.content)) {
|
|
104
|
+
const fullText = msg.content
|
|
105
|
+
.filter((c) => c.type === 'text')
|
|
106
|
+
.map((c) => c.text)
|
|
107
|
+
.join('');
|
|
108
|
+
const msgId = event.messageId ?? 'default';
|
|
109
|
+
const prev = partialTextByMsg.get(msgId) ?? '';
|
|
110
|
+
if (fullText.length > prev.length) {
|
|
111
|
+
onPartial(fullText.slice(prev.length));
|
|
112
|
+
partialTextByMsg.set(msgId, fullText);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
77
116
|
if (event.type === 'agent_end') {
|
|
78
117
|
unsub();
|
|
79
118
|
settle(() => {
|
|
80
119
|
const assistantMsg = [...event.messages].reverse().find((m) => m.role === 'assistant');
|
|
81
120
|
if (!assistantMsg || assistantMsg.role !== 'assistant') {
|
|
82
|
-
|
|
121
|
+
// pi terminated without producing an assistant message. This is
|
|
122
|
+
// not a successful "empty stop" — surface it as a real error so
|
|
123
|
+
// the runner can mark the step failed instead of silently
|
|
124
|
+
// recording a completed step with empty text.
|
|
125
|
+
reject(new PiSdkUpstreamError('pi agent terminated without producing an assistant message', 'error'));
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
// pi-coding-agent embeds upstream provider errors (rate limits,
|
|
129
|
+
// 401s, network failures, model-side aborts, …) into the final
|
|
130
|
+
// assistant message with stopReason: 'error' or 'aborted' and an
|
|
131
|
+
// optional `errorMessage` field. Without this guard the SDK would
|
|
132
|
+
// resolve `{ text: '', stopReason: 'error' }` which the runner
|
|
133
|
+
// records as `status: completed` — masquerading as success.
|
|
134
|
+
// Promote those terminal stopReasons to a thrown error.
|
|
135
|
+
if (assistantMsg.stopReason === 'error' || assistantMsg.stopReason === 'aborted') {
|
|
136
|
+
const detail = typeof assistantMsg.errorMessage === 'string'
|
|
137
|
+
? assistantMsg.errorMessage
|
|
138
|
+
: undefined;
|
|
139
|
+
const apiTag = 'provider' in assistantMsg && 'model' in assistantMsg
|
|
140
|
+
? ` (provider=${assistantMsg.provider ?? '?'}, model=${assistantMsg.model ?? '?'})`
|
|
141
|
+
: '';
|
|
142
|
+
const headline = assistantMsg.stopReason === 'aborted'
|
|
143
|
+
? `pi inference aborted${apiTag}`
|
|
144
|
+
: `pi inference failed${apiTag}`;
|
|
145
|
+
reject(new PiSdkUpstreamError(detail !== undefined && detail.length > 0 ? `${headline}: ${detail}` : headline, assistantMsg.stopReason, detail));
|
|
83
146
|
return;
|
|
84
147
|
}
|
|
85
148
|
const text = assistantMsg.content
|
package/dist/sdk-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-client.js","sourceRoot":"","sources":["../src/sdk-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"sdk-client.js","sourceRoot":"","sources":["../src/sdk-client.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -59,5 +59,11 @@ export interface PiBackendOptions {
|
|
|
59
59
|
* Excess calls are queued until a slot opens.
|
|
60
60
|
*/
|
|
61
61
|
maxConcurrent?: number;
|
|
62
|
+
/**
|
|
63
|
+
* Optional egress proxy URL to inject into subprocess environment.
|
|
64
|
+
* When provided along with an egress token from the gateway, the pi process
|
|
65
|
+
* will route outbound connections through the proxy for network policy enforcement.
|
|
66
|
+
*/
|
|
67
|
+
egressProxyUrl?: string;
|
|
62
68
|
}
|
|
63
69
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skelm/pi",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.8",
|
|
4
4
|
"description": "Pi coding-agent backend for skelm with full permission enforcement",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Scott Glover <scottgl@gmail.com>",
|
|
7
|
-
"homepage": "https://
|
|
7
|
+
"homepage": "https://skelm.dev/",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
10
|
"url": "git+https://github.com/scottgl9/skelm.git",
|
|
@@ -42,11 +42,11 @@
|
|
|
42
42
|
"build": "tsc -p tsconfig.json",
|
|
43
43
|
"test": "vitest run",
|
|
44
44
|
"test:watch": "vitest",
|
|
45
|
-
"clean": "rm -rf dist"
|
|
45
|
+
"clean": "rm -rf dist tsconfig.tsbuildinfo"
|
|
46
46
|
},
|
|
47
47
|
"peerDependencies": {
|
|
48
48
|
"@mariozechner/pi-coding-agent": ">=0.73.0",
|
|
49
|
-
"@skelm/core": "^0.3.
|
|
49
|
+
"@skelm/core": "^0.3.8"
|
|
50
50
|
},
|
|
51
51
|
"peerDependenciesMeta": {
|
|
52
52
|
"@mariozechner/pi-coding-agent": {
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
57
|
"@mariozechner/pi-coding-agent": "^0.73.0",
|
|
58
|
-
"@skelm/core": "^0.3.
|
|
58
|
+
"@skelm/core": "^0.3.8",
|
|
59
59
|
"@types/node": "^20.10.0",
|
|
60
60
|
"typescript": "^5.3.0",
|
|
61
61
|
"vitest": "^1.0.0"
|