@agentex/agent 0.0.1 → 0.0.3

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.
Files changed (198) hide show
  1. package/README.md +358 -78
  2. package/dist/index.d.ts +16 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +10 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/providers/claude/execute.d.ts +1 -1
  7. package/dist/providers/claude/execute.d.ts.map +1 -1
  8. package/dist/providers/claude/execute.js +53 -20
  9. package/dist/providers/claude/execute.js.map +1 -1
  10. package/dist/providers/claude/index.d.ts +1 -1
  11. package/dist/providers/claude/index.d.ts.map +1 -1
  12. package/dist/providers/claude/index.js +40 -9
  13. package/dist/providers/claude/index.js.map +1 -1
  14. package/dist/providers/claude/parse.d.ts.map +1 -1
  15. package/dist/providers/claude/parse.js +2 -1
  16. package/dist/providers/claude/parse.js.map +1 -1
  17. package/dist/providers/claude/session.d.ts +10 -0
  18. package/dist/providers/claude/session.d.ts.map +1 -0
  19. package/dist/providers/claude/session.js +549 -0
  20. package/dist/providers/claude/session.js.map +1 -0
  21. package/dist/providers/claude/test.d.ts.map +1 -1
  22. package/dist/providers/claude/test.js +38 -11
  23. package/dist/providers/claude/test.js.map +1 -1
  24. package/dist/providers/codex/execute.d.ts +1 -1
  25. package/dist/providers/codex/execute.d.ts.map +1 -1
  26. package/dist/providers/codex/execute.js +114 -75
  27. package/dist/providers/codex/execute.js.map +1 -1
  28. package/dist/providers/codex/index.d.ts +1 -1
  29. package/dist/providers/codex/index.d.ts.map +1 -1
  30. package/dist/providers/codex/index.js +59 -3
  31. package/dist/providers/codex/index.js.map +1 -1
  32. package/dist/providers/codex/parse.d.ts.map +1 -1
  33. package/dist/providers/codex/parse.js +25 -3
  34. package/dist/providers/codex/parse.js.map +1 -1
  35. package/dist/providers/codex/session.d.ts +3 -0
  36. package/dist/providers/codex/session.d.ts.map +1 -0
  37. package/dist/providers/codex/session.js +553 -0
  38. package/dist/providers/codex/session.js.map +1 -0
  39. package/dist/providers/codex/test.d.ts.map +1 -1
  40. package/dist/providers/codex/test.js +28 -12
  41. package/dist/providers/codex/test.js.map +1 -1
  42. package/dist/providers/codex/usage-scanner.d.ts +18 -0
  43. package/dist/providers/codex/usage-scanner.d.ts.map +1 -0
  44. package/dist/providers/codex/usage-scanner.js +148 -0
  45. package/dist/providers/codex/usage-scanner.js.map +1 -0
  46. package/dist/providers/cursor/codec.d.ts +3 -0
  47. package/dist/providers/cursor/codec.d.ts.map +1 -0
  48. package/dist/providers/cursor/codec.js +43 -0
  49. package/dist/providers/cursor/codec.js.map +1 -0
  50. package/dist/providers/cursor/execute.d.ts +3 -0
  51. package/dist/providers/cursor/execute.d.ts.map +1 -0
  52. package/dist/providers/cursor/execute.js +248 -0
  53. package/dist/providers/cursor/execute.js.map +1 -0
  54. package/dist/providers/cursor/index.d.ts +3 -0
  55. package/dist/providers/cursor/index.d.ts.map +1 -0
  56. package/dist/providers/cursor/index.js +30 -0
  57. package/dist/providers/cursor/index.js.map +1 -0
  58. package/dist/providers/cursor/parse.d.ts +26 -0
  59. package/dist/providers/cursor/parse.d.ts.map +1 -0
  60. package/dist/providers/cursor/parse.js +224 -0
  61. package/dist/providers/cursor/parse.js.map +1 -0
  62. package/dist/providers/cursor/test.d.ts +3 -0
  63. package/dist/providers/cursor/test.d.ts.map +1 -0
  64. package/dist/providers/cursor/test.js +58 -0
  65. package/dist/providers/cursor/test.js.map +1 -0
  66. package/dist/providers/gemini/codec.d.ts +3 -0
  67. package/dist/providers/gemini/codec.d.ts.map +1 -0
  68. package/dist/providers/gemini/codec.js +47 -0
  69. package/dist/providers/gemini/codec.js.map +1 -0
  70. package/dist/providers/gemini/execute.d.ts +3 -0
  71. package/dist/providers/gemini/execute.d.ts.map +1 -0
  72. package/dist/providers/gemini/execute.js +236 -0
  73. package/dist/providers/gemini/execute.js.map +1 -0
  74. package/dist/providers/gemini/index.d.ts +3 -0
  75. package/dist/providers/gemini/index.d.ts.map +1 -0
  76. package/dist/providers/gemini/index.js +64 -0
  77. package/dist/providers/gemini/index.js.map +1 -0
  78. package/dist/providers/gemini/parse.d.ts +20 -0
  79. package/dist/providers/gemini/parse.d.ts.map +1 -0
  80. package/dist/providers/gemini/parse.js +207 -0
  81. package/dist/providers/gemini/parse.js.map +1 -0
  82. package/dist/providers/gemini/test.d.ts +3 -0
  83. package/dist/providers/gemini/test.d.ts.map +1 -0
  84. package/dist/providers/gemini/test.js +67 -0
  85. package/dist/providers/gemini/test.js.map +1 -0
  86. package/dist/providers/openclaw/execute.d.ts +1 -1
  87. package/dist/providers/openclaw/execute.d.ts.map +1 -1
  88. package/dist/providers/openclaw/execute.js +11 -6
  89. package/dist/providers/openclaw/execute.js.map +1 -1
  90. package/dist/providers/openclaw/index.d.ts +1 -1
  91. package/dist/providers/openclaw/index.d.ts.map +1 -1
  92. package/dist/providers/openclaw/index.js +13 -3
  93. package/dist/providers/openclaw/index.js.map +1 -1
  94. package/dist/providers/openclaw/test.d.ts.map +1 -1
  95. package/dist/providers/openclaw/test.js +4 -0
  96. package/dist/providers/openclaw/test.js.map +1 -1
  97. package/dist/providers/opencode/codec.d.ts +3 -0
  98. package/dist/providers/opencode/codec.d.ts.map +1 -0
  99. package/dist/providers/opencode/codec.js +47 -0
  100. package/dist/providers/opencode/codec.js.map +1 -0
  101. package/dist/providers/opencode/execute.d.ts +3 -0
  102. package/dist/providers/opencode/execute.d.ts.map +1 -0
  103. package/dist/providers/opencode/execute.js +225 -0
  104. package/dist/providers/opencode/execute.js.map +1 -0
  105. package/dist/providers/opencode/index.d.ts +3 -0
  106. package/dist/providers/opencode/index.d.ts.map +1 -0
  107. package/dist/providers/opencode/index.js +64 -0
  108. package/dist/providers/opencode/index.js.map +1 -0
  109. package/dist/providers/opencode/parse.d.ts +19 -0
  110. package/dist/providers/opencode/parse.d.ts.map +1 -0
  111. package/dist/providers/opencode/parse.js +145 -0
  112. package/dist/providers/opencode/parse.js.map +1 -0
  113. package/dist/providers/opencode/test.d.ts +3 -0
  114. package/dist/providers/opencode/test.d.ts.map +1 -0
  115. package/dist/providers/opencode/test.js +60 -0
  116. package/dist/providers/opencode/test.js.map +1 -0
  117. package/dist/providers/pi/codec.d.ts +7 -0
  118. package/dist/providers/pi/codec.d.ts.map +1 -0
  119. package/dist/providers/pi/codec.js +45 -0
  120. package/dist/providers/pi/codec.js.map +1 -0
  121. package/dist/providers/pi/execute.d.ts +3 -0
  122. package/dist/providers/pi/execute.d.ts.map +1 -0
  123. package/dist/providers/pi/execute.js +300 -0
  124. package/dist/providers/pi/execute.js.map +1 -0
  125. package/dist/providers/pi/index.d.ts +3 -0
  126. package/dist/providers/pi/index.d.ts.map +1 -0
  127. package/dist/providers/pi/index.js +66 -0
  128. package/dist/providers/pi/index.js.map +1 -0
  129. package/dist/providers/pi/parse.d.ts +18 -0
  130. package/dist/providers/pi/parse.d.ts.map +1 -0
  131. package/dist/providers/pi/parse.js +182 -0
  132. package/dist/providers/pi/parse.js.map +1 -0
  133. package/dist/providers/pi/test.d.ts +3 -0
  134. package/dist/providers/pi/test.d.ts.map +1 -0
  135. package/dist/providers/pi/test.js +60 -0
  136. package/dist/providers/pi/test.js.map +1 -0
  137. package/dist/providers/process/execute.d.ts +1 -1
  138. package/dist/providers/process/execute.d.ts.map +1 -1
  139. package/dist/providers/process/execute.js +46 -8
  140. package/dist/providers/process/execute.js.map +1 -1
  141. package/dist/providers/process/index.d.ts +1 -1
  142. package/dist/providers/process/index.d.ts.map +1 -1
  143. package/dist/providers/process/index.js +18 -4
  144. package/dist/providers/process/index.js.map +1 -1
  145. package/dist/registry.d.ts.map +1 -1
  146. package/dist/registry.js +16 -8
  147. package/dist/registry.js.map +1 -1
  148. package/dist/types.d.ts +325 -8
  149. package/dist/types.d.ts.map +1 -1
  150. package/dist/types.js +23 -1
  151. package/dist/types.js.map +1 -1
  152. package/dist/utils/ask-user-question.d.ts +50 -0
  153. package/dist/utils/ask-user-question.d.ts.map +1 -0
  154. package/dist/utils/ask-user-question.js +32 -0
  155. package/dist/utils/ask-user-question.js.map +1 -0
  156. package/dist/utils/auth.d.ts +29 -0
  157. package/dist/utils/auth.d.ts.map +1 -0
  158. package/dist/utils/auth.js +243 -0
  159. package/dist/utils/auth.js.map +1 -0
  160. package/dist/utils/binary.d.ts.map +1 -1
  161. package/dist/utils/binary.js +29 -6
  162. package/dist/utils/binary.js.map +1 -1
  163. package/dist/utils/env.d.ts.map +1 -1
  164. package/dist/utils/env.js +18 -0
  165. package/dist/utils/env.js.map +1 -1
  166. package/dist/utils/execute-all.d.ts +20 -0
  167. package/dist/utils/execute-all.d.ts.map +1 -0
  168. package/dist/utils/execute-all.js +46 -0
  169. package/dist/utils/execute-all.js.map +1 -0
  170. package/dist/utils/instructions.d.ts +7 -0
  171. package/dist/utils/instructions.d.ts.map +1 -0
  172. package/dist/utils/instructions.js +21 -0
  173. package/dist/utils/instructions.js.map +1 -0
  174. package/dist/utils/model-cache.d.ts +11 -0
  175. package/dist/utils/model-cache.d.ts.map +1 -0
  176. package/dist/utils/model-cache.js +17 -0
  177. package/dist/utils/model-cache.js.map +1 -0
  178. package/dist/utils/process.d.ts +4 -0
  179. package/dist/utils/process.d.ts.map +1 -1
  180. package/dist/utils/process.js +46 -5
  181. package/dist/utils/process.js.map +1 -1
  182. package/dist/utils/runtime-config.d.ts +34 -0
  183. package/dist/utils/runtime-config.d.ts.map +1 -0
  184. package/dist/utils/runtime-config.js +71 -0
  185. package/dist/utils/runtime-config.js.map +1 -0
  186. package/dist/utils/runtime-homes.d.ts +13 -0
  187. package/dist/utils/runtime-homes.d.ts.map +1 -0
  188. package/dist/utils/runtime-homes.js +41 -0
  189. package/dist/utils/runtime-homes.js.map +1 -0
  190. package/dist/utils/skills.d.ts +152 -1
  191. package/dist/utils/skills.d.ts.map +1 -1
  192. package/dist/utils/skills.js +352 -0
  193. package/dist/utils/skills.js.map +1 -1
  194. package/dist/utils/workspace.d.ts +55 -0
  195. package/dist/utils/workspace.d.ts.map +1 -0
  196. package/dist/utils/workspace.js +89 -0
  197. package/dist/utils/workspace.js.map +1 -0
  198. package/package.json +5 -2
@@ -0,0 +1,45 @@
1
+ function readNonEmptyString(value) {
2
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
3
+ }
4
+ function parseAsObject(raw) {
5
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw))
6
+ return null;
7
+ return raw;
8
+ }
9
+ /**
10
+ * Pi uses file-path-based sessions (e.g. ~/.pi/paperclips/2024-01-01T00-00-00-agentId.jsonl).
11
+ * The sessionId stored here is the file path to the session file.
12
+ */
13
+ export const piSessionCodec = {
14
+ deserialize(raw) {
15
+ const obj = parseAsObject(raw);
16
+ if (!obj)
17
+ return null;
18
+ const sessionId = readNonEmptyString(obj["sessionId"]) ?? readNonEmptyString(obj["session_id"]);
19
+ if (!sessionId)
20
+ return null;
21
+ const cwd = readNonEmptyString(obj["cwd"]);
22
+ return {
23
+ sessionId,
24
+ ...(cwd ? { cwd } : {}),
25
+ };
26
+ },
27
+ serialize(params) {
28
+ if (!params)
29
+ return null;
30
+ const sessionId = readNonEmptyString(params["sessionId"]) ?? readNonEmptyString(params["session_id"]);
31
+ if (!sessionId)
32
+ return null;
33
+ const cwd = readNonEmptyString(params["cwd"]);
34
+ return {
35
+ sessionId,
36
+ ...(cwd ? { cwd } : {}),
37
+ };
38
+ },
39
+ getDisplayId(params) {
40
+ if (!params)
41
+ return null;
42
+ return readNonEmptyString(params["sessionId"]) ?? readNonEmptyString(params["session_id"]);
43
+ },
44
+ };
45
+ //# sourceMappingURL=codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../../../src/providers/pi/codec.ts"],"names":[],"mappings":"AAEA,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACpF,CAAC;AAED,SAAS,aAAa,CAAC,GAAY;IACjC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,OAAO,GAA8B,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,WAAW,CAAC,GAAY;QACtB,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QAChG,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5B,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,OAAO;YACL,SAAS;YACT,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,MAAsC;QAC9C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;QACtG,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5B,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,OAAO;YACL,SAAS;YACT,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,MAAsC;QACjD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IAC7F,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ExecutionContext, ExecutionResult } from "../../types.js";
2
+ export declare function executePiProvider(ctx: ExecutionContext): Promise<ExecutionResult>;
3
+ //# sourceMappingURL=execute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/providers/pi/execute.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAgCxE,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAqQvF"}
@@ -0,0 +1,300 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import * as os from "node:os";
4
+ import { findBinary } from "../../utils/binary.js";
5
+ import { buildEnv, ensurePathInEnv } from "../../utils/env.js";
6
+ import { runChildProcess, deriveErrorCode } from "../../utils/process.js";
7
+ import { injectHomeSkills } from "../../utils/skills.js";
8
+ import { resolveInstructions } from "../../utils/instructions.js";
9
+ import { prepareWorkspace } from "../../utils/workspace.js";
10
+ import { uuidv7 } from "../../utils/uuid.js";
11
+ import { parsePiJsonl, parsePiStreamLine, isPiUnknownSessionError } from "./parse.js";
12
+ const PI_SESSIONS_DIR = path.join(os.homedir(), ".pi", "sessions");
13
+ function parseModelProvider(model) {
14
+ if (!model)
15
+ return null;
16
+ const trimmed = model.trim();
17
+ if (!trimmed.includes("/"))
18
+ return null;
19
+ return trimmed.slice(0, trimmed.indexOf("/")).trim() || null;
20
+ }
21
+ function parseModelId(model) {
22
+ if (!model)
23
+ return null;
24
+ const trimmed = model.trim();
25
+ if (!trimmed.includes("/"))
26
+ return trimmed || null;
27
+ return trimmed.slice(trimmed.indexOf("/") + 1).trim() || null;
28
+ }
29
+ function buildSessionPath(runId) {
30
+ const safeTimestamp = new Date().toISOString().replace(/[:.]/g, "-");
31
+ return path.join(PI_SESSIONS_DIR, `${safeTimestamp}-${runId}.jsonl`);
32
+ }
33
+ export async function executePiProvider(ctx) {
34
+ const runId = ctx.runId ?? uuidv7();
35
+ let cwd = ctx.cwd ?? process.cwd();
36
+ const model = ctx.model ?? ctx.config?.model ?? "";
37
+ const config = ctx.config ?? {};
38
+ const startedAt = new Date().toISOString();
39
+ // 1. Resolve binary
40
+ ctx.onLifecycle?.({ phase: "preparing", step: "binary" });
41
+ let resolvedBinary;
42
+ try {
43
+ resolvedBinary = await findBinary("pi", config.command);
44
+ }
45
+ catch (err) {
46
+ const errorMessage = err instanceof Error ? err.message : "Binary not found";
47
+ ctx.onLifecycle?.({ phase: "error", message: errorMessage });
48
+ return {
49
+ runId,
50
+ exitCode: null,
51
+ signal: null,
52
+ status: "failed",
53
+ startedAt,
54
+ completedAt: new Date().toISOString(),
55
+ durationMs: Date.now() - new Date(startedAt).getTime(),
56
+ errorMessage,
57
+ errorCode: "binary_not_found",
58
+ costUsd: null,
59
+ model: null,
60
+ summary: null,
61
+ sessionParams: null,
62
+ sessionDisplayId: null,
63
+ clearSession: false,
64
+ billingType: null,
65
+ };
66
+ }
67
+ // 2. Workspace isolation
68
+ let workspace;
69
+ if (config.workspace) {
70
+ ctx.onLifecycle?.({ phase: "preparing", step: "workspace" });
71
+ workspace = await prepareWorkspace(cwd, config.workspace);
72
+ cwd = workspace.cwd;
73
+ }
74
+ // 3. Build env
75
+ const env = buildEnv(ctx.env);
76
+ ensurePathInEnv(env);
77
+ // 3. Resolve instructions — Pi uses native --append-system-prompt flag,
78
+ // but we still validate the file exists early so failures are clear.
79
+ ctx.onLifecycle?.({ phase: "preparing", step: "instructions" });
80
+ if (config.instructionsFile)
81
+ await resolveInstructions(config.instructionsFile);
82
+ // 4. Inject skills into ~/.pi/agent/skills/
83
+ ctx.onLifecycle?.({ phase: "preparing", step: "skills" });
84
+ let piSkillsDir = null;
85
+ if (config.skillDirs && config.skillDirs.length > 0) {
86
+ try {
87
+ piSkillsDir = await injectHomeSkills(config.skillDirs, "pi");
88
+ }
89
+ catch {
90
+ // Non-fatal
91
+ }
92
+ }
93
+ // 4. Ensure sessions directory exists
94
+ await fs.mkdir(PI_SESSIONS_DIR, { recursive: true });
95
+ // 5. Determine session resume
96
+ const sessionParams = ctx.sessionParams ?? null;
97
+ const existingSessionId = (() => {
98
+ if (!sessionParams)
99
+ return null;
100
+ const id = sessionParams["sessionId"] ??
101
+ sessionParams["session_id"];
102
+ if (!id || typeof id !== "string")
103
+ return null;
104
+ const sessionCwd = sessionParams["cwd"];
105
+ if (sessionCwd && path.resolve(sessionCwd) !== path.resolve(cwd))
106
+ return null;
107
+ return id;
108
+ })();
109
+ const canResume = existingSessionId !== null;
110
+ const sessionPath = canResume ? existingSessionId : buildSessionPath(runId);
111
+ // Create session file if new
112
+ if (!canResume) {
113
+ try {
114
+ await fs.writeFile(sessionPath, "", { flag: "wx" });
115
+ }
116
+ catch (err) {
117
+ if (err.code !== "EEXIST") {
118
+ // Non-fatal, Pi may handle it
119
+ }
120
+ }
121
+ }
122
+ // 6. Parse model into provider/modelId
123
+ const provider = parseModelProvider(model || null);
124
+ const modelId = parseModelId(model || null);
125
+ // 7. Build args
126
+ const buildArgs = (sessionFile) => {
127
+ const args = [...resolvedBinary.prefixArgs, "--mode", "rpc"];
128
+ if (provider)
129
+ args.push("--provider", provider);
130
+ if (modelId)
131
+ args.push("--model", modelId);
132
+ if (config.thinking)
133
+ args.push("--thinking", config.thinking);
134
+ args.push("--tools", "read,bash,edit,write,grep,find,ls");
135
+ args.push("--session", sessionFile);
136
+ if (piSkillsDir)
137
+ args.push("--skill", piSkillsDir);
138
+ if (config.instructionsFile)
139
+ args.push("--append-system-prompt", config.instructionsFile);
140
+ if (config.extraArgs)
141
+ args.push(...config.extraArgs);
142
+ return args;
143
+ };
144
+ // 8. Build RPC stdin
145
+ const rpcStdin = JSON.stringify({ type: "prompt", message: ctx.prompt }) + "\n";
146
+ // 9. Run attempt
147
+ const runAttempt = async (sessionFile) => {
148
+ const args = buildArgs(sessionFile);
149
+ let stdoutBuffer = "";
150
+ ctx.onLifecycle?.({ phase: "spawning" });
151
+ const proc = await runChildProcess({
152
+ runId,
153
+ command: resolvedBinary.bin,
154
+ args,
155
+ cwd,
156
+ env,
157
+ stdin: rpcStdin,
158
+ timeoutSec: config.timeoutSec,
159
+ graceSec: config.graceSec,
160
+ onStart: (pid) => {
161
+ ctx.onLifecycle?.({ phase: "running", pid });
162
+ ctx.onStart?.(pid);
163
+ },
164
+ signal: ctx.signal,
165
+ onOutput: async (stream, chunk) => {
166
+ if (stream === "stderr") {
167
+ if (ctx.onOutput) {
168
+ try {
169
+ await ctx.onOutput(stream, chunk);
170
+ }
171
+ catch { /* swallow */ }
172
+ }
173
+ return;
174
+ }
175
+ // Buffer stdout by lines for JSONL parsing
176
+ stdoutBuffer += chunk;
177
+ const lines = stdoutBuffer.split("\n");
178
+ stdoutBuffer = lines.pop() || "";
179
+ for (const line of lines) {
180
+ if (!line)
181
+ continue;
182
+ if (ctx.onOutput) {
183
+ try {
184
+ await ctx.onOutput(stream, line + "\n");
185
+ }
186
+ catch { /* swallow */ }
187
+ }
188
+ if (ctx.onEvent) {
189
+ const event = parsePiStreamLine(line);
190
+ if (event) {
191
+ try {
192
+ await ctx.onEvent(event);
193
+ }
194
+ catch { /* swallow */ }
195
+ }
196
+ }
197
+ }
198
+ },
199
+ });
200
+ // Flush remaining buffer
201
+ if (stdoutBuffer) {
202
+ if (ctx.onOutput) {
203
+ try {
204
+ await ctx.onOutput("stdout", stdoutBuffer);
205
+ }
206
+ catch { /* swallow */ }
207
+ }
208
+ if (ctx.onEvent) {
209
+ const event = parsePiStreamLine(stdoutBuffer);
210
+ if (event) {
211
+ try {
212
+ await ctx.onEvent(event);
213
+ }
214
+ catch { /* swallow */ }
215
+ }
216
+ }
217
+ }
218
+ return proc;
219
+ };
220
+ // 10. Initial attempt
221
+ let proc = await runAttempt(sessionPath);
222
+ let clearSession = false;
223
+ let finalSessionPath = sessionPath;
224
+ // 11. Check for unknown session — retry once with new session
225
+ if (canResume &&
226
+ !proc.timedOut &&
227
+ (proc.exitCode ?? 0) !== 0 &&
228
+ isPiUnknownSessionError(proc.stdout, proc.stderr)) {
229
+ finalSessionPath = buildSessionPath(runId + "-retry");
230
+ try {
231
+ await fs.writeFile(finalSessionPath, "", { flag: "wx" });
232
+ }
233
+ catch {
234
+ // Non-fatal
235
+ }
236
+ proc = await runAttempt(finalSessionPath);
237
+ clearSession = true;
238
+ }
239
+ // 12. Parse result
240
+ const parsed = parsePiJsonl(proc.stdout);
241
+ const processErrorCode = deriveErrorCode(proc);
242
+ let errorCode = processErrorCode;
243
+ if (!errorCode && parsed.errorMessage) {
244
+ errorCode = "execution_error";
245
+ }
246
+ const errorMessage = (() => {
247
+ if (proc.timedOut)
248
+ return `Timed out after ${config.timeoutSec ?? 0}s`;
249
+ if (parsed.errorMessage)
250
+ return parsed.errorMessage;
251
+ if ((proc.exitCode ?? 0) !== 0 && !parsed.summary) {
252
+ const stderrLine = proc.stderr.split(/\r?\n/).map((l) => l.trim()).find(Boolean);
253
+ return stderrLine ?? `Pi exited with code ${proc.exitCode ?? -1}`;
254
+ }
255
+ return null;
256
+ })();
257
+ // Always return the current session path so callers can continue.
258
+ // clearSession tells callers the OLD session was invalid, but we still
259
+ // provide the NEW session handle from the retry.
260
+ const resultSessionParams = { sessionId: finalSessionPath, cwd };
261
+ const completedAt = new Date().toISOString();
262
+ const resolvedModel = model || null;
263
+ const status = proc.aborted ? "aborted"
264
+ : proc.timedOut ? "timeout"
265
+ : (errorCode || errorMessage) ? "failed"
266
+ : "completed";
267
+ if (status === "completed") {
268
+ ctx.onLifecycle?.({ phase: "completed" });
269
+ }
270
+ else if (status === "aborted") {
271
+ ctx.onLifecycle?.({ phase: "cancelled" });
272
+ }
273
+ else {
274
+ ctx.onLifecycle?.({ phase: "error", message: errorMessage ?? "Unknown error" });
275
+ }
276
+ return {
277
+ runId,
278
+ exitCode: proc.exitCode,
279
+ signal: proc.signal ?? null,
280
+ status,
281
+ startedAt,
282
+ completedAt,
283
+ durationMs: new Date(completedAt).getTime() - new Date(startedAt).getTime(),
284
+ errorMessage,
285
+ errorCode,
286
+ usage: parsed.usage && resolvedModel
287
+ ? { [resolvedModel]: { inputTokens: parsed.usage.inputTokens, outputTokens: parsed.usage.outputTokens, cachedInputTokens: parsed.usage.cachedInputTokens } }
288
+ : undefined,
289
+ costUsd: parsed.usage?.costUsd ?? null,
290
+ model: resolvedModel,
291
+ summary: parsed.summary,
292
+ sessionParams: resultSessionParams,
293
+ sessionDisplayId: finalSessionPath,
294
+ clearSession,
295
+ billingType: "api",
296
+ raw: null,
297
+ workspace,
298
+ };
299
+ }
300
+ //# sourceMappingURL=execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/providers/pi/execute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ProviderModule } from "../../types.js";
2
+ export declare const piProvider: ProviderModule;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/pi/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,gBAAgB,CAAC;AAsDpE,eAAO,MAAM,UAAU,EAAE,cAgBxB,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { executePiProvider } from "./execute.js";
2
+ import { testPiEnvironment } from "./test.js";
3
+ import { piSessionCodec } from "./codec.js";
4
+ import { findBinary } from "../../utils/binary.js";
5
+ import { buildEnv, ensurePathInEnv } from "../../utils/env.js";
6
+ import { resolveAuthForProvider } from "../../utils/auth.js";
7
+ import { ModelCache } from "../../utils/model-cache.js";
8
+ import { runChildProcess } from "../../utils/process.js";
9
+ const FALLBACK_MODELS = [
10
+ { id: "anthropic/claude-sonnet-4-20250514", name: "Claude Sonnet 4", provider: "anthropic" },
11
+ { id: "openai/gpt-4.1", name: "GPT-4.1", provider: "openai" },
12
+ ];
13
+ const cache = new ModelCache();
14
+ async function fetchModels() {
15
+ try {
16
+ const resolved = await findBinary("pi");
17
+ const env = buildEnv();
18
+ ensurePathInEnv(env);
19
+ const proc = await runChildProcess({
20
+ runId: "list-models",
21
+ command: resolved.bin,
22
+ args: [...resolved.prefixArgs, "--list-models"],
23
+ cwd: process.cwd(),
24
+ env,
25
+ timeoutSec: 10,
26
+ });
27
+ if ((proc.exitCode ?? 1) === 0 && proc.stdout.trim()) {
28
+ return proc.stdout
29
+ .trim()
30
+ .split(/\r?\n/)
31
+ .filter((line) => line.trim() && !line.startsWith("---") && !line.startsWith("PROVIDER"))
32
+ .map((line) => {
33
+ const parts = line.trim().split(/\s{2,}/);
34
+ const provider = parts[0]?.trim();
35
+ const model = parts[1]?.trim();
36
+ const id = provider && model ? `${provider}/${model}` : line.trim();
37
+ return { id, name: model ?? id, provider };
38
+ });
39
+ }
40
+ }
41
+ catch {
42
+ // Fallback
43
+ }
44
+ return FALLBACK_MODELS;
45
+ }
46
+ async function listModels(options) {
47
+ return cache.get(options?.cacheTtlMs ?? 0, fetchModels);
48
+ }
49
+ export const piProvider = {
50
+ type: "pi",
51
+ capabilities: {
52
+ sessions: false,
53
+ modelDiscovery: true,
54
+ quotaProbing: false,
55
+ mcp: false,
56
+ skills: true,
57
+ instructions: true,
58
+ workspace: true,
59
+ },
60
+ execute: executePiProvider,
61
+ testEnvironment: testPiEnvironment,
62
+ resolveAuth: (ctx) => resolveAuthForProvider("pi", ctx),
63
+ sessionCodec: piSessionCodec,
64
+ listModels,
65
+ };
66
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/pi/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { StreamEvent } from "../../types.js";
2
+ export interface PiParsedResult {
3
+ sessionId: string | null;
4
+ model: string | null;
5
+ usage: {
6
+ inputTokens: number;
7
+ outputTokens: number;
8
+ cachedInputTokens: number;
9
+ costUsd: number;
10
+ } | null;
11
+ summary: string | null;
12
+ isError: boolean;
13
+ errorMessage: string | null;
14
+ }
15
+ export declare function parsePiJsonl(stdout: string): PiParsedResult;
16
+ export declare function parsePiStreamLine(line: string): StreamEvent | null;
17
+ export declare function isPiUnknownSessionError(stdout: string, stderr: string): boolean;
18
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/providers/pi/parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACxG,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAoCD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CA4G3D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CA+ClE;AAID,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAE/E"}
@@ -0,0 +1,182 @@
1
+ function parseJson(line) {
2
+ try {
3
+ const parsed = JSON.parse(line);
4
+ if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) {
5
+ return parsed;
6
+ }
7
+ }
8
+ catch {
9
+ // Skip malformed lines
10
+ }
11
+ return null;
12
+ }
13
+ function asString(value, fallback) {
14
+ return typeof value === "string" ? value : fallback;
15
+ }
16
+ function asNumber(value, fallback) {
17
+ return typeof value === "number" && Number.isFinite(value) ? value : fallback;
18
+ }
19
+ function asRecord(value) {
20
+ if (typeof value !== "object" || value === null || Array.isArray(value))
21
+ return null;
22
+ return value;
23
+ }
24
+ function extractTextContent(content) {
25
+ if (typeof content === "string")
26
+ return content;
27
+ if (!Array.isArray(content))
28
+ return "";
29
+ return content
30
+ .filter((c) => c["type"] === "text" && c["text"])
31
+ .map((c) => c["text"])
32
+ .join("");
33
+ }
34
+ export function parsePiJsonl(stdout) {
35
+ const messages = [];
36
+ const errors = [];
37
+ const usage = { inputTokens: 0, outputTokens: 0, cachedInputTokens: 0, costUsd: 0 };
38
+ let hasUsage = false;
39
+ let finalMessage = null;
40
+ for (const rawLine of stdout.split(/\r?\n/)) {
41
+ const line = rawLine.trim();
42
+ if (!line)
43
+ continue;
44
+ const event = parseJson(line);
45
+ if (!event)
46
+ continue;
47
+ const eventType = asString(event["type"], "");
48
+ // Skip RPC protocol internals
49
+ if (eventType === "response" || eventType === "extension_ui_request" || eventType === "extension_ui_response" || eventType === "extension_error") {
50
+ continue;
51
+ }
52
+ if (eventType === "agent_end") {
53
+ const agentMessages = event["messages"];
54
+ if (agentMessages && agentMessages.length > 0) {
55
+ const lastMessage = agentMessages[agentMessages.length - 1];
56
+ if (lastMessage?.["role"] === "assistant") {
57
+ finalMessage = extractTextContent(lastMessage["content"]);
58
+ }
59
+ }
60
+ continue;
61
+ }
62
+ if (eventType === "turn_end") {
63
+ const message = asRecord(event["message"]);
64
+ if (message) {
65
+ const text = extractTextContent(message["content"]);
66
+ if (text) {
67
+ finalMessage = text;
68
+ messages.push(text);
69
+ }
70
+ const usageObj = asRecord(message["usage"]);
71
+ if (usageObj) {
72
+ usage.inputTokens += asNumber(usageObj["input"], 0);
73
+ usage.outputTokens += asNumber(usageObj["output"], 0);
74
+ usage.cachedInputTokens += asNumber(usageObj["cacheRead"], 0);
75
+ hasUsage = true;
76
+ const cost = asRecord(usageObj["cost"]);
77
+ if (cost) {
78
+ usage.costUsd += asNumber(cost["total"], 0);
79
+ }
80
+ }
81
+ }
82
+ continue;
83
+ }
84
+ if (eventType === "message_update") {
85
+ const assistantEvent = asRecord(event["assistantMessageEvent"]);
86
+ if (assistantEvent) {
87
+ const msgType = asString(assistantEvent["type"], "");
88
+ if (msgType === "text_delta") {
89
+ const delta = asString(assistantEvent["delta"], "");
90
+ if (delta) {
91
+ if (messages.length === 0) {
92
+ messages.push(delta);
93
+ }
94
+ else {
95
+ messages[messages.length - 1] += delta;
96
+ }
97
+ }
98
+ }
99
+ }
100
+ continue;
101
+ }
102
+ if (eventType === "usage" || event["usage"]) {
103
+ const usageObj = asRecord(event["usage"]);
104
+ if (usageObj) {
105
+ usage.inputTokens += asNumber(usageObj["inputTokens"] ?? usageObj["input"], 0);
106
+ usage.outputTokens += asNumber(usageObj["outputTokens"] ?? usageObj["output"], 0);
107
+ usage.cachedInputTokens += asNumber(usageObj["cachedInputTokens"] ?? usageObj["cacheRead"], 0);
108
+ hasUsage = true;
109
+ const cost = asRecord(usageObj["cost"]);
110
+ if (cost) {
111
+ usage.costUsd += asNumber(cost["total"] ?? usageObj["costUsd"], 0);
112
+ }
113
+ else {
114
+ usage.costUsd += asNumber(usageObj["costUsd"], 0);
115
+ }
116
+ }
117
+ }
118
+ if (eventType === "error") {
119
+ const text = asString(event["message"] ?? event["error"], "").trim();
120
+ if (text)
121
+ errors.push(text);
122
+ }
123
+ }
124
+ const summary = finalMessage ?? (messages.join("\n\n").trim() || null);
125
+ return {
126
+ sessionId: null, // Pi uses file-based sessions, not server-returned IDs
127
+ model: null,
128
+ usage: hasUsage ? usage : null,
129
+ summary,
130
+ isError: errors.length > 0,
131
+ errorMessage: errors.length > 0 ? errors.join("\n") : null,
132
+ };
133
+ }
134
+ export function parsePiStreamLine(line) {
135
+ const event = parseJson(line);
136
+ if (!event)
137
+ return null;
138
+ const eventType = asString(event["type"], "");
139
+ const timestamp = new Date().toISOString();
140
+ if (eventType === "message_update") {
141
+ const assistantEvent = asRecord(event["assistantMessageEvent"]);
142
+ if (assistantEvent && asString(assistantEvent["type"], "") === "text_delta") {
143
+ const delta = asString(assistantEvent["delta"], "");
144
+ if (delta)
145
+ return { type: "assistant", text: delta, timestamp };
146
+ }
147
+ }
148
+ if (eventType === "tool_execution_start") {
149
+ return {
150
+ type: "tool_call",
151
+ callId: asString(event["toolCallId"], "") || undefined,
152
+ name: asString(event["toolName"], ""),
153
+ input: event["args"],
154
+ timestamp,
155
+ };
156
+ }
157
+ if (eventType === "tool_execution_end") {
158
+ const result = event["result"];
159
+ return {
160
+ type: "tool_result",
161
+ toolCallId: asString(event["toolCallId"], ""),
162
+ content: typeof result === "string" ? result : JSON.stringify(result),
163
+ isError: event["isError"] === true,
164
+ timestamp,
165
+ };
166
+ }
167
+ if (eventType === "agent_end") {
168
+ return {
169
+ type: "result",
170
+ text: "",
171
+ cost: null,
172
+ isError: false,
173
+ timestamp,
174
+ };
175
+ }
176
+ return null;
177
+ }
178
+ const PI_UNKNOWN_SESSION_RE = /unknown\s+session|session\s+not\s+found|session\s+.*\s+not\s+found|no\s+session/i;
179
+ export function isPiUnknownSessionError(stdout, stderr) {
180
+ return PI_UNKNOWN_SESSION_RE.test(stdout) || PI_UNKNOWN_SESSION_RE.test(stderr);
181
+ }
182
+ //# sourceMappingURL=parse.js.map