@caupulican/pi-adaptative 0.80.22 → 0.80.25
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/CHANGELOG.md +38 -1
- package/README.md +16 -2
- package/dist/cli/args.d.ts +2 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +14 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js +28 -1
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +4 -0
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +22 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +4 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +32 -78
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +16 -7
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/exec.d.ts +20 -1
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js +52 -19
- package/dist/core/exec.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +6 -0
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +33 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/types.d.ts +2 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/message-retention.d.ts +26 -0
- package/dist/core/message-retention.d.ts.map +1 -0
- package/dist/core/message-retention.js +95 -0
- package/dist/core/message-retention.js.map +1 -0
- package/dist/core/package-manager.d.ts +3 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +72 -6
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js +3 -1
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +39 -11
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/resource-profile-blocks.d.ts +16 -0
- package/dist/core/resource-profile-blocks.d.ts.map +1 -0
- package/dist/core/resource-profile-blocks.js +120 -0
- package/dist/core/resource-profile-blocks.js.map +1 -0
- package/dist/core/sdk.d.ts +9 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +17 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +3 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +45 -9
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +45 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +218 -10
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +15 -0
- package/dist/core/skills.js.map +1 -1
- package/dist/core/tools/git-filter.d.ts +9 -1
- package/dist/core/tools/git-filter.d.ts.map +1 -1
- package/dist/core/tools/git-filter.js +94 -8
- package/dist/core/tools/git-filter.js.map +1 -1
- package/dist/core/tools/read.d.ts +31 -0
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +164 -33
- package/dist/core/tools/read.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +17 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +37 -4
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +2 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +54 -18
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/rpc/jsonl.d.ts +0 -7
- package/dist/modes/rpc/jsonl.d.ts.map +1 -1
- package/dist/modes/rpc/jsonl.js +17 -0
- package/dist/modes/rpc/jsonl.js.map +1 -1
- package/dist/utils/safe-write-stream.d.ts +10 -0
- package/dist/utils/safe-write-stream.d.ts.map +1 -0
- package/dist/utils/safe-write-stream.js +16 -0
- package/dist/utils/safe-write-stream.js.map +1 -0
- package/dist/utils/sleep.d.ts +3 -1
- package/dist/utils/sleep.d.ts.map +1 -1
- package/dist/utils/sleep.js +10 -4
- package/dist/utils/sleep.js.map +1 -1
- package/docs/extensions.md +18 -1
- package/docs/prompt-templates.md +1 -0
- package/docs/settings.md +43 -1
- package/docs/skills.md +12 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +12 -12
- package/package.json +4 -4
|
@@ -6,12 +6,5 @@ import type { Readable } from "node:stream";
|
|
|
6
6
|
* U+2028 and U+2029. Clients must split records on `\n` only.
|
|
7
7
|
*/
|
|
8
8
|
export declare function serializeJsonLine(value: unknown): string;
|
|
9
|
-
/**
|
|
10
|
-
* Attach an LF-only JSONL reader to a stream.
|
|
11
|
-
*
|
|
12
|
-
* This intentionally does not use Node readline. Readline splits on additional
|
|
13
|
-
* Unicode separators that are valid inside JSON strings and therefore does not
|
|
14
|
-
* implement strict JSONL framing.
|
|
15
|
-
*/
|
|
16
9
|
export declare function attachJsonlLineReader(stream: Readable, onLine: (line: string) => void): () => void;
|
|
17
10
|
//# sourceMappingURL=jsonl.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonl.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/jsonl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAExD;
|
|
1
|
+
{"version":3,"file":"jsonl.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/jsonl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAExD;AAaD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAoDlG","sourcesContent":["import type { Readable } from \"node:stream\";\nimport { StringDecoder } from \"node:string_decoder\";\n\n/**\n * Serialize a single strict JSONL record.\n *\n * Framing is LF-only. Payload strings may contain other Unicode separators such as\n * U+2028 and U+2029. Clients must split records on `\\n` only.\n */\nexport function serializeJsonLine(value: unknown): string {\n\treturn `${JSON.stringify(value)}\\n`;\n}\n\n/**\n * Attach an LF-only JSONL reader to a stream.\n *\n * This intentionally does not use Node readline. Readline splits on additional\n * Unicode separators that are valid inside JSON strings and therefore does not\n * implement strict JSONL framing.\n */\n// A non-compliant peer streaming without newlines would otherwise grow the\n// line buffer without bound; one line can never legitimately exceed this.\nconst MAX_JSONL_LINE_CHARS = 64 * 1024 * 1024;\n\nexport function attachJsonlLineReader(stream: Readable, onLine: (line: string) => void): () => void {\n\tconst decoder = new StringDecoder(\"utf8\");\n\tlet buffer = \"\";\n\tlet discardingOversizedLine = false;\n\n\tconst emitLine = (line: string) => {\n\t\tonLine(line.endsWith(\"\\r\") ? line.slice(0, -1) : line);\n\t};\n\n\tconst onData = (chunk: string | Buffer) => {\n\t\tbuffer += typeof chunk === \"string\" ? chunk : decoder.write(chunk);\n\n\t\tif (discardingOversizedLine) {\n\t\t\tconst resumeIndex = buffer.indexOf(\"\\n\");\n\t\t\tif (resumeIndex === -1) {\n\t\t\t\tbuffer = \"\";\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tbuffer = buffer.slice(resumeIndex + 1);\n\t\t\tdiscardingOversizedLine = false;\n\t\t}\n\n\t\twhile (true) {\n\t\t\tconst newlineIndex = buffer.indexOf(\"\\n\");\n\t\t\tif (newlineIndex === -1) {\n\t\t\t\tif (buffer.length > MAX_JSONL_LINE_CHARS) {\n\t\t\t\t\tdiscardingOversizedLine = true;\n\t\t\t\t\tbuffer = \"\";\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\temitLine(buffer.slice(0, newlineIndex));\n\t\t\tbuffer = buffer.slice(newlineIndex + 1);\n\t\t}\n\t};\n\n\tconst onEnd = () => {\n\t\tbuffer += decoder.end();\n\t\tif (buffer.length > 0) {\n\t\t\temitLine(buffer);\n\t\t\tbuffer = \"\";\n\t\t}\n\t};\n\n\tstream.on(\"data\", onData);\n\tstream.on(\"end\", onEnd);\n\n\treturn () => {\n\t\tstream.off(\"data\", onData);\n\t\tstream.off(\"end\", onEnd);\n\t};\n}\n"]}
|
package/dist/modes/rpc/jsonl.js
CHANGED
|
@@ -15,17 +15,34 @@ export function serializeJsonLine(value) {
|
|
|
15
15
|
* Unicode separators that are valid inside JSON strings and therefore does not
|
|
16
16
|
* implement strict JSONL framing.
|
|
17
17
|
*/
|
|
18
|
+
// A non-compliant peer streaming without newlines would otherwise grow the
|
|
19
|
+
// line buffer without bound; one line can never legitimately exceed this.
|
|
20
|
+
const MAX_JSONL_LINE_CHARS = 64 * 1024 * 1024;
|
|
18
21
|
export function attachJsonlLineReader(stream, onLine) {
|
|
19
22
|
const decoder = new StringDecoder("utf8");
|
|
20
23
|
let buffer = "";
|
|
24
|
+
let discardingOversizedLine = false;
|
|
21
25
|
const emitLine = (line) => {
|
|
22
26
|
onLine(line.endsWith("\r") ? line.slice(0, -1) : line);
|
|
23
27
|
};
|
|
24
28
|
const onData = (chunk) => {
|
|
25
29
|
buffer += typeof chunk === "string" ? chunk : decoder.write(chunk);
|
|
30
|
+
if (discardingOversizedLine) {
|
|
31
|
+
const resumeIndex = buffer.indexOf("\n");
|
|
32
|
+
if (resumeIndex === -1) {
|
|
33
|
+
buffer = "";
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
buffer = buffer.slice(resumeIndex + 1);
|
|
37
|
+
discardingOversizedLine = false;
|
|
38
|
+
}
|
|
26
39
|
while (true) {
|
|
27
40
|
const newlineIndex = buffer.indexOf("\n");
|
|
28
41
|
if (newlineIndex === -1) {
|
|
42
|
+
if (buffer.length > MAX_JSONL_LINE_CHARS) {
|
|
43
|
+
discardingOversizedLine = true;
|
|
44
|
+
buffer = "";
|
|
45
|
+
}
|
|
29
46
|
return;
|
|
30
47
|
}
|
|
31
48
|
emitLine(buffer.slice(0, newlineIndex));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonl.js","sourceRoot":"","sources":["../../../src/modes/rpc/jsonl.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAc,EAAU;IACzD,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;AAAA,CACpC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAgB,EAAE,MAA8B,EAAc;IACnG,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,MAAM,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"jsonl.js","sourceRoot":"","sources":["../../../src/modes/rpc/jsonl.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAc,EAAU;IACzD,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;AAAA,CACpC;AAED;;;;;;GAMG;AACH,2EAA2E;AAC3E,0EAA0E;AAC1E,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C,MAAM,UAAU,qBAAqB,CAAC,MAAgB,EAAE,MAA8B,EAAc;IACnG,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,uBAAuB,GAAG,KAAK,CAAC;IAEpC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAAA,CACvD,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,KAAsB,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEnE,IAAI,uBAAuB,EAAE,CAAC;YAC7B,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;gBACxB,MAAM,GAAG,EAAE,CAAC;gBACZ,OAAO;YACR,CAAC;YACD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;YACvC,uBAAuB,GAAG,KAAK,CAAC;QACjC,CAAC;QAED,OAAO,IAAI,EAAE,CAAC;YACb,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;gBACzB,IAAI,MAAM,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;oBAC1C,uBAAuB,GAAG,IAAI,CAAC;oBAC/B,MAAM,GAAG,EAAE,CAAC;gBACb,CAAC;gBACD,OAAO;YACR,CAAC;YAED,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;YACxC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QACzC,CAAC;IAAA,CACD,CAAC;IAEF,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC;QACnB,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACxB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,MAAM,CAAC,CAAC;YACjB,MAAM,GAAG,EAAE,CAAC;QACb,CAAC;IAAA,CACD,CAAC;IAEF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAExB,OAAO,GAAG,EAAE,CAAC;QACZ,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAAA,CACzB,CAAC;AAAA,CACF","sourcesContent":["import type { Readable } from \"node:stream\";\nimport { StringDecoder } from \"node:string_decoder\";\n\n/**\n * Serialize a single strict JSONL record.\n *\n * Framing is LF-only. Payload strings may contain other Unicode separators such as\n * U+2028 and U+2029. Clients must split records on `\\n` only.\n */\nexport function serializeJsonLine(value: unknown): string {\n\treturn `${JSON.stringify(value)}\\n`;\n}\n\n/**\n * Attach an LF-only JSONL reader to a stream.\n *\n * This intentionally does not use Node readline. Readline splits on additional\n * Unicode separators that are valid inside JSON strings and therefore does not\n * implement strict JSONL framing.\n */\n// A non-compliant peer streaming without newlines would otherwise grow the\n// line buffer without bound; one line can never legitimately exceed this.\nconst MAX_JSONL_LINE_CHARS = 64 * 1024 * 1024;\n\nexport function attachJsonlLineReader(stream: Readable, onLine: (line: string) => void): () => void {\n\tconst decoder = new StringDecoder(\"utf8\");\n\tlet buffer = \"\";\n\tlet discardingOversizedLine = false;\n\n\tconst emitLine = (line: string) => {\n\t\tonLine(line.endsWith(\"\\r\") ? line.slice(0, -1) : line);\n\t};\n\n\tconst onData = (chunk: string | Buffer) => {\n\t\tbuffer += typeof chunk === \"string\" ? chunk : decoder.write(chunk);\n\n\t\tif (discardingOversizedLine) {\n\t\t\tconst resumeIndex = buffer.indexOf(\"\\n\");\n\t\t\tif (resumeIndex === -1) {\n\t\t\t\tbuffer = \"\";\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tbuffer = buffer.slice(resumeIndex + 1);\n\t\t\tdiscardingOversizedLine = false;\n\t\t}\n\n\t\twhile (true) {\n\t\t\tconst newlineIndex = buffer.indexOf(\"\\n\");\n\t\t\tif (newlineIndex === -1) {\n\t\t\t\tif (buffer.length > MAX_JSONL_LINE_CHARS) {\n\t\t\t\t\tdiscardingOversizedLine = true;\n\t\t\t\t\tbuffer = \"\";\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\temitLine(buffer.slice(0, newlineIndex));\n\t\t\tbuffer = buffer.slice(newlineIndex + 1);\n\t\t}\n\t};\n\n\tconst onEnd = () => {\n\t\tbuffer += decoder.end();\n\t\tif (buffer.length > 0) {\n\t\t\temitLine(buffer);\n\t\t\tbuffer = \"\";\n\t\t}\n\t};\n\n\tstream.on(\"data\", onData);\n\tstream.on(\"end\", onEnd);\n\n\treturn () => {\n\t\tstream.off(\"data\", onData);\n\t\tstream.off(\"end\", onEnd);\n\t};\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type WriteStream } from "node:fs";
|
|
2
|
+
/**
|
|
3
|
+
* Create a WriteStream whose "error" event is always handled.
|
|
4
|
+
*
|
|
5
|
+
* Best-effort artifact writes (full-output temp files, overflow spills) must never
|
|
6
|
+
* crash the host process: an fs.WriteStream "error" event with no listener becomes
|
|
7
|
+
* an uncaught exception. Errors are reported through the optional callback instead.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createSafeWriteStream(path: string, onError?: (error: Error) => void): WriteStream;
|
|
10
|
+
//# sourceMappingURL=safe-write-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-write-stream.d.ts","sourceRoot":"","sources":["../../src/utils/safe-write-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAE9D;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,WAAW,CAMjG","sourcesContent":["import { createWriteStream, type WriteStream } from \"node:fs\";\n\n/**\n * Create a WriteStream whose \"error\" event is always handled.\n *\n * Best-effort artifact writes (full-output temp files, overflow spills) must never\n * crash the host process: an fs.WriteStream \"error\" event with no listener becomes\n * an uncaught exception. Errors are reported through the optional callback instead.\n */\nexport function createSafeWriteStream(path: string, onError?: (error: Error) => void): WriteStream {\n\tconst stream = createWriteStream(path);\n\tstream.on(\"error\", (error: Error) => {\n\t\tonError?.(error);\n\t});\n\treturn stream;\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createWriteStream } from "node:fs";
|
|
2
|
+
/**
|
|
3
|
+
* Create a WriteStream whose "error" event is always handled.
|
|
4
|
+
*
|
|
5
|
+
* Best-effort artifact writes (full-output temp files, overflow spills) must never
|
|
6
|
+
* crash the host process: an fs.WriteStream "error" event with no listener becomes
|
|
7
|
+
* an uncaught exception. Errors are reported through the optional callback instead.
|
|
8
|
+
*/
|
|
9
|
+
export function createSafeWriteStream(path, onError) {
|
|
10
|
+
const stream = createWriteStream(path);
|
|
11
|
+
stream.on("error", (error) => {
|
|
12
|
+
onError?.(error);
|
|
13
|
+
});
|
|
14
|
+
return stream;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=safe-write-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-write-stream.js","sourceRoot":"","sources":["../../src/utils/safe-write-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAoB,MAAM,SAAS,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,OAAgC,EAAe;IAClG,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE,CAAC;QACpC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IAAA,CACjB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAAA,CACd","sourcesContent":["import { createWriteStream, type WriteStream } from \"node:fs\";\n\n/**\n * Create a WriteStream whose \"error\" event is always handled.\n *\n * Best-effort artifact writes (full-output temp files, overflow spills) must never\n * crash the host process: an fs.WriteStream \"error\" event with no listener becomes\n * an uncaught exception. Errors are reported through the optional callback instead.\n */\nexport function createSafeWriteStream(path: string, onError?: (error: Error) => void): WriteStream {\n\tconst stream = createWriteStream(path);\n\tstream.on(\"error\", (error: Error) => {\n\t\tonError?.(error);\n\t});\n\treturn stream;\n}\n"]}
|
package/dist/utils/sleep.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Sleep helper that respects abort signal.
|
|
2
|
+
* Sleep helper that respects abort signal. Always detaches its abort listener when
|
|
3
|
+
* settling, so repeated sleeps (e.g. retry backoff) on a long-lived signal do not
|
|
4
|
+
* accumulate listeners for the signal's lifetime.
|
|
3
5
|
*/
|
|
4
6
|
export declare function sleep(ms: number, signal?: AbortSignal): Promise<void>;
|
|
5
7
|
//# sourceMappingURL=sleep.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../src/utils/sleep.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../src/utils/sleep.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBrE","sourcesContent":["/**\n * Sleep helper that respects abort signal. Always detaches its abort listener when\n * settling, so repeated sleeps (e.g. retry backoff) on a long-lived signal do not\n * accumulate listeners for the signal's lifetime.\n */\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(new Error(\"Aborted\"));\n\t\t\treturn;\n\t\t}\n\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\treject(new Error(\"Aborted\"));\n\t\t};\n\n\t\tconst timeout = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n"]}
|
package/dist/utils/sleep.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Sleep helper that respects abort signal.
|
|
2
|
+
* Sleep helper that respects abort signal. Always detaches its abort listener when
|
|
3
|
+
* settling, so repeated sleeps (e.g. retry backoff) on a long-lived signal do not
|
|
4
|
+
* accumulate listeners for the signal's lifetime.
|
|
3
5
|
*/
|
|
4
6
|
export function sleep(ms, signal) {
|
|
5
7
|
return new Promise((resolve, reject) => {
|
|
@@ -7,11 +9,15 @@ export function sleep(ms, signal) {
|
|
|
7
9
|
reject(new Error("Aborted"));
|
|
8
10
|
return;
|
|
9
11
|
}
|
|
10
|
-
const
|
|
11
|
-
signal?.addEventListener("abort", () => {
|
|
12
|
+
const onAbort = () => {
|
|
12
13
|
clearTimeout(timeout);
|
|
13
14
|
reject(new Error("Aborted"));
|
|
14
|
-
}
|
|
15
|
+
};
|
|
16
|
+
const timeout = setTimeout(() => {
|
|
17
|
+
signal?.removeEventListener("abort", onAbort);
|
|
18
|
+
resolve();
|
|
19
|
+
}, ms);
|
|
20
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
15
21
|
});
|
|
16
22
|
}
|
|
17
23
|
//# sourceMappingURL=sleep.js.map
|
package/dist/utils/sleep.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sleep.js","sourceRoot":"","sources":["../../src/utils/sleep.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sleep.js","sourceRoot":"","sources":["../../src/utils/sleep.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,EAAU,EAAE,MAAoB,EAAiB;IACtE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;QACvC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7B,OAAO;QACR,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;YACrB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAAA,CAC7B,CAAC;QAEF,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;YAChC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC;QAAA,CACV,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAAA,CAC3D,CAAC,CAAC;AAAA,CACH","sourcesContent":["/**\n * Sleep helper that respects abort signal. Always detaches its abort listener when\n * settling, so repeated sleeps (e.g. retry backoff) on a long-lived signal do not\n * accumulate listeners for the signal's lifetime.\n */\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(new Error(\"Aborted\"));\n\t\t\treturn;\n\t\t}\n\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\treject(new Error(\"Aborted\"));\n\t\t};\n\n\t\tconst timeout = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n"]}
|
package/docs/extensions.md
CHANGED
|
@@ -133,11 +133,28 @@ Additional paths and filters via `settings.json`:
|
|
|
133
133
|
],
|
|
134
134
|
"disabledResources": {
|
|
135
135
|
"extensions": ["old-extension", "project-only-extension"]
|
|
136
|
+
},
|
|
137
|
+
"activeResourceProfile": "lean",
|
|
138
|
+
"resourceProfiles": {
|
|
139
|
+
"lean": {
|
|
140
|
+
"extensions": { "block": ["old-extension"], "allow": [] },
|
|
141
|
+
"tools": { "allow": ["read", "rg", "python"] }
|
|
142
|
+
}
|
|
136
143
|
}
|
|
137
144
|
}
|
|
138
145
|
```
|
|
139
146
|
|
|
140
|
-
Resource arrays support include/exclude patterns: plain entries include local paths, `!pattern` excludes matching auto-discovered resources, `+path` force-includes an exact path, and `-path` force-excludes an exact path. `disabledResources.extensions`
|
|
147
|
+
Resource arrays support include/exclude patterns: plain entries include local paths, `!pattern` excludes matching auto-discovered resources, `+path` force-includes an exact path, and `-path` force-excludes an exact path. `disabledResources.extensions` remains as the legacy explicit reversible unload form and is merged as a `resourceProfiles` block filter. Prefer `resourceProfiles` when you need focused per-session, per-repo, or subagent-specific loading.
|
|
148
|
+
|
|
149
|
+
Extensions may carry profile blocks inside comments. Pi reads only matching `<resource-profile>` blocks as JSON config before filtering, and ignores the rest of the extension file for profile parsing:
|
|
150
|
+
|
|
151
|
+
```ts
|
|
152
|
+
/*
|
|
153
|
+
<resource-profile name="reviewer">
|
|
154
|
+
{ "tools": { "allow": ["read", "rg"] }, "extensions": { "block": ["heavy-devtools"] } }
|
|
155
|
+
</resource-profile>
|
|
156
|
+
*/
|
|
157
|
+
```
|
|
141
158
|
|
|
142
159
|
To share extensions via npm or git as pi packages, see [packages.md](packages.md).
|
|
143
160
|
|
package/docs/prompt-templates.md
CHANGED
|
@@ -31,6 +31,7 @@ Review the staged changes (`git diff --cached`). Focus on:
|
|
|
31
31
|
- The filename becomes the command name. `review.md` becomes `/review`.
|
|
32
32
|
- `description` is optional. If missing, the first non-empty line is used.
|
|
33
33
|
- `argument-hint` is optional. When set, the hint is displayed before the description in the autocomplete dropdown.
|
|
34
|
+
- Optional `<resource-profile name="...">{...}</resource-profile>` blocks define profile filters as JSON. Pi reads only matching profile blocks as config and strips them from expanded prompt content.
|
|
34
35
|
|
|
35
36
|
### Argument Hints
|
|
36
37
|
|
package/docs/settings.md
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
# Settings
|
|
2
2
|
|
|
3
|
-
Pi uses JSON settings files with project settings overriding global settings.
|
|
3
|
+
Pi uses JSON settings files with project settings overriding global settings. Pi also supports zero-footprint directory resource profiles stored under the user-level agent directory.
|
|
4
4
|
|
|
5
5
|
| Location | Scope |
|
|
6
6
|
|----------|-------|
|
|
7
7
|
| `~/.pi/agent/settings.json` | Global (all projects) |
|
|
8
8
|
| `.pi/settings.json` | Project (current directory) |
|
|
9
|
+
| `~/.pi/agent/resource-profiles/<hash>/settings.json` | User-level per repo/directory overlay; no repo files written |
|
|
9
10
|
|
|
10
11
|
Edit directly or use `/settings` for common options.
|
|
11
12
|
|
|
@@ -281,6 +282,10 @@ Paths in `~/.pi/agent/settings.json` resolve relative to `~/.pi/agent`. Paths in
|
|
|
281
282
|
| `prompts` | string[] | `[]` | Local prompt template paths or directories |
|
|
282
283
|
| `themes` | string[] | `[]` | Local theme file paths or directories |
|
|
283
284
|
| `enableSkillCommands` | boolean | `true` | Register skills as `/skill:name` commands |
|
|
285
|
+
| `resourceProfiles` | object | `{}` | Named resource allow/block filters for `extensions`, `skills`, `prompts`, `themes`, `agents`, and `tools` |
|
|
286
|
+
| `activeResourceProfile` | string/string[] | - | Active profile name(s) |
|
|
287
|
+
| `activeResourceProfiles` | string[] | - | Active profile names; equivalent to array form of `activeResourceProfile` |
|
|
288
|
+
| `disabledResources` | object | `{}` | Legacy block filters; still supported and merged into resource profiles |
|
|
284
289
|
|
|
285
290
|
Arrays support glob patterns and exclusions. Use `!pattern` to exclude. Use `+path` to force-include an exact path and `-path` to force-exclude an exact path.
|
|
286
291
|
|
|
@@ -310,6 +315,43 @@ Object form filters which resources to load:
|
|
|
310
315
|
|
|
311
316
|
See [packages.md](packages.md) for package management details.
|
|
312
317
|
|
|
318
|
+
#### resourceProfiles
|
|
319
|
+
|
|
320
|
+
Resource profiles dynamically filter resources after discovery. Each resource kind supports `allow` and `block` arrays. If `allow` is non-empty, only matching resources load; `block` is applied after allow. Patterns match relative paths, absolute paths, file names, and containing directory names.
|
|
321
|
+
|
|
322
|
+
```json
|
|
323
|
+
{
|
|
324
|
+
"activeResourceProfile": "lean",
|
|
325
|
+
"resourceProfiles": {
|
|
326
|
+
"lean": {
|
|
327
|
+
"extensions": { "block": ["cmux-agent-manager", "heavy-devtools"] },
|
|
328
|
+
"skills": { "allow": ["engineering-principles", "graph-first-code-navigation"] },
|
|
329
|
+
"agents": { "block": ["GEMINI.md"] },
|
|
330
|
+
"tools": { "allow": ["read", "rg", "python"] }
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
Use `--resource-profile lean` to select a profile for one session or subagent launch. Use `--resource-profile-json` for one-shot definitions that never touch disk:
|
|
337
|
+
|
|
338
|
+
```bash
|
|
339
|
+
pi --resource-profile oneoff \
|
|
340
|
+
--resource-profile-json '{"oneoff":{"tools":{"allow":["read","rg"]}}}'
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
Resource files may also carry profile blocks. Pi parses only the matching `<resource-profile>` block as JSON config and strips the block from prompt/agent/skill expansion content:
|
|
344
|
+
|
|
345
|
+
```markdown
|
|
346
|
+
<resource-profile name="lean">
|
|
347
|
+
{ "tools": { "allow": ["read", "rg"] }, "agents": { "block": ["GEMINI.md"] } }
|
|
348
|
+
</resource-profile>
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
Supported carriers: extension files (`.ts`/`.js`, usually inside comments), prompt templates, skill files, and context agent files (`AGENTS.md`, `CLAUDE.md`, `GEMINI.md`). Resource-profile block contents are data, not instructions.
|
|
352
|
+
|
|
353
|
+
Zero-footprint repo/directory overlays live under `~/.pi/agent/resource-profiles/<hash>/settings.json`, where `<hash>` is derived from the nearest VCS root (or current directory when no VCS root exists). These files are user-level settings; Pi does not write `.pi/settings.json` just to remember directory profiles.
|
|
354
|
+
|
|
313
355
|
## Example
|
|
314
356
|
|
|
315
357
|
```json
|
package/docs/skills.md
CHANGED
|
@@ -82,6 +82,18 @@ For project-level Claude Code skills, add to `.pi/settings.json`:
|
|
|
82
82
|
|
|
83
83
|
This is progressive disclosure: names and descriptions are always in context, while full instructions load on-demand.
|
|
84
84
|
|
|
85
|
+
When multiple skills are loaded, descriptions are the routing contract. Write narrow descriptions and prefer the most task-specific skill. Combine skills only when they cover distinct parts of the request. Do not rely on the agent to apply every loaded skill.
|
|
86
|
+
|
|
87
|
+
Skills may carry optional resource profile blocks:
|
|
88
|
+
|
|
89
|
+
```markdown
|
|
90
|
+
<resource-profile name="reviewer">
|
|
91
|
+
{ "tools": { "allow": ["read", "rg"] } }
|
|
92
|
+
</resource-profile>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
These blocks are JSON config, not instructions. Pi parses only matching profile blocks and strips them from `/skill:name` expansion.
|
|
96
|
+
|
|
85
97
|
## Skill Commands
|
|
86
98
|
|
|
87
99
|
Skills register as `/skill:name` commands:
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-extension-custom-provider",
|
|
3
|
-
"version": "0.80.
|
|
3
|
+
"version": "0.80.22",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "pi-extension-custom-provider",
|
|
9
|
-
"version": "0.80.
|
|
9
|
+
"version": "0.80.22",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@anthropic-ai/sdk": "^0.52.0"
|
|
12
12
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-extension-sandbox",
|
|
3
|
-
"version": "0.80.
|
|
3
|
+
"version": "0.80.22",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "pi-extension-sandbox",
|
|
9
|
-
"version": "0.80.
|
|
9
|
+
"version": "0.80.22",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@anthropic-ai/sandbox-runtime": "^0.0.26"
|
|
12
12
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-extension-with-deps",
|
|
3
|
-
"version": "0.80.
|
|
3
|
+
"version": "0.80.22",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "pi-extension-with-deps",
|
|
9
|
-
"version": "0.80.
|
|
9
|
+
"version": "0.80.22",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"ms": "^2.1.3"
|
|
12
12
|
},
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@caupulican/pi-adaptative",
|
|
3
|
-
"version": "0.80.
|
|
3
|
+
"version": "0.80.25",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@caupulican/pi-adaptative",
|
|
9
|
-
"version": "0.80.
|
|
9
|
+
"version": "0.80.25",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@caupulican/pi-agent-core": "^0.80.
|
|
13
|
-
"@caupulican/pi-ai": "^0.80.
|
|
14
|
-
"@caupulican/pi-tui": "^0.80.
|
|
12
|
+
"@caupulican/pi-agent-core": "^0.80.25",
|
|
13
|
+
"@caupulican/pi-ai": "^0.80.25",
|
|
14
|
+
"@caupulican/pi-tui": "^0.80.25",
|
|
15
15
|
"@silvia-odwyer/photon-node": "0.3.4",
|
|
16
16
|
"chalk": "5.6.2",
|
|
17
17
|
"cross-spawn": "7.0.6",
|
|
@@ -474,11 +474,11 @@
|
|
|
474
474
|
}
|
|
475
475
|
},
|
|
476
476
|
"node_modules/@caupulican/pi-agent-core": {
|
|
477
|
-
"version": "0.80.
|
|
478
|
-
"resolved": "https://registry.npmjs.org/@caupulican/pi-agent-core/-/pi-agent-core-0.80.
|
|
477
|
+
"version": "0.80.25",
|
|
478
|
+
"resolved": "https://registry.npmjs.org/@caupulican/pi-agent-core/-/pi-agent-core-0.80.25.tgz",
|
|
479
479
|
"license": "MIT",
|
|
480
480
|
"dependencies": {
|
|
481
|
-
"@caupulican/pi-ai": "^0.80.
|
|
481
|
+
"@caupulican/pi-ai": "^0.80.25",
|
|
482
482
|
"ignore": "7.0.5",
|
|
483
483
|
"typebox": "1.1.38",
|
|
484
484
|
"yaml": "2.9.0"
|
|
@@ -488,8 +488,8 @@
|
|
|
488
488
|
}
|
|
489
489
|
},
|
|
490
490
|
"node_modules/@caupulican/pi-ai": {
|
|
491
|
-
"version": "0.80.
|
|
492
|
-
"resolved": "https://registry.npmjs.org/@caupulican/pi-ai/-/pi-ai-0.80.
|
|
491
|
+
"version": "0.80.25",
|
|
492
|
+
"resolved": "https://registry.npmjs.org/@caupulican/pi-ai/-/pi-ai-0.80.25.tgz",
|
|
493
493
|
"license": "MIT",
|
|
494
494
|
"dependencies": {
|
|
495
495
|
"@anthropic-ai/sdk": "0.91.1",
|
|
@@ -511,8 +511,8 @@
|
|
|
511
511
|
}
|
|
512
512
|
},
|
|
513
513
|
"node_modules/@caupulican/pi-tui": {
|
|
514
|
-
"version": "0.80.
|
|
515
|
-
"resolved": "https://registry.npmjs.org/@caupulican/pi-tui/-/pi-tui-0.80.
|
|
514
|
+
"version": "0.80.25",
|
|
515
|
+
"resolved": "https://registry.npmjs.org/@caupulican/pi-tui/-/pi-tui-0.80.25.tgz",
|
|
516
516
|
"license": "MIT",
|
|
517
517
|
"dependencies": {
|
|
518
518
|
"get-east-asian-width": "1.6.0",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@caupulican/pi-adaptative",
|
|
3
|
-
"version": "0.80.
|
|
3
|
+
"version": "0.80.25",
|
|
4
4
|
"description": "Adaptive fork of Pi coding agent for self-evolving agent harness experiments",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"piConfig": {
|
|
@@ -41,9 +41,9 @@
|
|
|
41
41
|
"prepublishOnly": "npm run clean && npm run build && npm run shrinkwrap"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@caupulican/pi-agent-core": "^0.80.
|
|
45
|
-
"@caupulican/pi-ai": "^0.80.
|
|
46
|
-
"@caupulican/pi-tui": "^0.80.
|
|
44
|
+
"@caupulican/pi-agent-core": "^0.80.25",
|
|
45
|
+
"@caupulican/pi-ai": "^0.80.25",
|
|
46
|
+
"@caupulican/pi-tui": "^0.80.25",
|
|
47
47
|
"@silvia-odwyer/photon-node": "0.3.4",
|
|
48
48
|
"chalk": "5.6.2",
|
|
49
49
|
"cross-spawn": "7.0.6",
|