@chiwanpark/pi-squared-agent 0.1.0

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 (162) hide show
  1. package/README.md +13 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +144 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/index.d.ts +11 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +11 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/runtime/auth-store.d.ts +36 -0
  11. package/dist/runtime/auth-store.d.ts.map +1 -0
  12. package/dist/runtime/auth-store.js +131 -0
  13. package/dist/runtime/auth-store.js.map +1 -0
  14. package/dist/runtime/config-store.d.ts +44 -0
  15. package/dist/runtime/config-store.d.ts.map +1 -0
  16. package/dist/runtime/config-store.js +138 -0
  17. package/dist/runtime/config-store.js.map +1 -0
  18. package/dist/runtime/messages.d.ts +12 -0
  19. package/dist/runtime/messages.d.ts.map +1 -0
  20. package/dist/runtime/messages.js +101 -0
  21. package/dist/runtime/messages.js.map +1 -0
  22. package/dist/runtime/model-resolver.d.ts +52 -0
  23. package/dist/runtime/model-resolver.d.ts.map +1 -0
  24. package/dist/runtime/model-resolver.js +175 -0
  25. package/dist/runtime/model-resolver.js.map +1 -0
  26. package/dist/runtime/pi-agent.d.ts +83 -0
  27. package/dist/runtime/pi-agent.d.ts.map +1 -0
  28. package/dist/runtime/pi-agent.js +405 -0
  29. package/dist/runtime/pi-agent.js.map +1 -0
  30. package/dist/runtime/status-store.d.ts +50 -0
  31. package/dist/runtime/status-store.d.ts.map +1 -0
  32. package/dist/runtime/status-store.js +65 -0
  33. package/dist/runtime/status-store.js.map +1 -0
  34. package/dist/runtime/system-prompt.d.ts +11 -0
  35. package/dist/runtime/system-prompt.d.ts.map +1 -0
  36. package/dist/runtime/system-prompt.js +43 -0
  37. package/dist/runtime/system-prompt.js.map +1 -0
  38. package/dist/runtime/tools/bash.d.ts +23 -0
  39. package/dist/runtime/tools/bash.d.ts.map +1 -0
  40. package/dist/runtime/tools/bash.js +206 -0
  41. package/dist/runtime/tools/bash.js.map +1 -0
  42. package/dist/runtime/tools/child-process.d.ts +13 -0
  43. package/dist/runtime/tools/child-process.d.ts.map +1 -0
  44. package/dist/runtime/tools/child-process.js +75 -0
  45. package/dist/runtime/tools/child-process.js.map +1 -0
  46. package/dist/runtime/tools/output-accumulator.d.ts +52 -0
  47. package/dist/runtime/tools/output-accumulator.d.ts.map +1 -0
  48. package/dist/runtime/tools/output-accumulator.js +160 -0
  49. package/dist/runtime/tools/output-accumulator.js.map +1 -0
  50. package/dist/runtime/tools/shell.d.ts +26 -0
  51. package/dist/runtime/tools/shell.d.ts.map +1 -0
  52. package/dist/runtime/tools/shell.js +116 -0
  53. package/dist/runtime/tools/shell.js.map +1 -0
  54. package/dist/runtime/tools/truncate.d.ts +38 -0
  55. package/dist/runtime/tools/truncate.d.ts.map +1 -0
  56. package/dist/runtime/tools/truncate.js +98 -0
  57. package/dist/runtime/tools/truncate.js.map +1 -0
  58. package/dist/tools/bash/child-process.d.ts +13 -0
  59. package/dist/tools/bash/child-process.d.ts.map +1 -0
  60. package/dist/tools/bash/child-process.js +79 -0
  61. package/dist/tools/bash/child-process.js.map +1 -0
  62. package/dist/tools/bash/output-accumulator.d.ts +54 -0
  63. package/dist/tools/bash/output-accumulator.d.ts.map +1 -0
  64. package/dist/tools/bash/output-accumulator.js +171 -0
  65. package/dist/tools/bash/output-accumulator.js.map +1 -0
  66. package/dist/tools/bash/shell.d.ts +26 -0
  67. package/dist/tools/bash/shell.d.ts.map +1 -0
  68. package/dist/tools/bash/shell.js +129 -0
  69. package/dist/tools/bash/shell.js.map +1 -0
  70. package/dist/tools/bash/tool.d.ts +23 -0
  71. package/dist/tools/bash/tool.d.ts.map +1 -0
  72. package/dist/tools/bash/tool.js +219 -0
  73. package/dist/tools/bash/tool.js.map +1 -0
  74. package/dist/tools/bash/truncate.d.ts +50 -0
  75. package/dist/tools/bash/truncate.d.ts.map +1 -0
  76. package/dist/tools/bash/truncate.js +184 -0
  77. package/dist/tools/bash/truncate.js.map +1 -0
  78. package/dist/tools/external-tool.d.ts +2 -0
  79. package/dist/tools/external-tool.d.ts.map +1 -0
  80. package/dist/tools/external-tool.js +15 -0
  81. package/dist/tools/external-tool.js.map +1 -0
  82. package/dist/tools/file/edit-diff.d.ts +27 -0
  83. package/dist/tools/file/edit-diff.d.ts.map +1 -0
  84. package/dist/tools/file/edit-diff.js +196 -0
  85. package/dist/tools/file/edit-diff.js.map +1 -0
  86. package/dist/tools/file/edit.d.ts +26 -0
  87. package/dist/tools/file/edit.d.ts.map +1 -0
  88. package/dist/tools/file/edit.js +106 -0
  89. package/dist/tools/file/edit.js.map +1 -0
  90. package/dist/tools/file/find.d.ts +27 -0
  91. package/dist/tools/file/find.d.ts.map +1 -0
  92. package/dist/tools/file/find.js +150 -0
  93. package/dist/tools/file/find.js.map +1 -0
  94. package/dist/tools/file/glob.d.ts +6 -0
  95. package/dist/tools/file/glob.d.ts.map +1 -0
  96. package/dist/tools/file/glob.js +50 -0
  97. package/dist/tools/file/glob.js.map +1 -0
  98. package/dist/tools/file/grep.d.ts +29 -0
  99. package/dist/tools/file/grep.d.ts.map +1 -0
  100. package/dist/tools/file/grep.js +220 -0
  101. package/dist/tools/file/grep.js.map +1 -0
  102. package/dist/tools/file/index.d.ts +7 -0
  103. package/dist/tools/file/index.d.ts.map +1 -0
  104. package/dist/tools/file/index.js +7 -0
  105. package/dist/tools/file/index.js.map +1 -0
  106. package/dist/tools/file/ls.d.ts +27 -0
  107. package/dist/tools/file/ls.d.ts.map +1 -0
  108. package/dist/tools/file/ls.js +82 -0
  109. package/dist/tools/file/ls.js.map +1 -0
  110. package/dist/tools/file/read.d.ts +23 -0
  111. package/dist/tools/file/read.d.ts.map +1 -0
  112. package/dist/tools/file/read.js +98 -0
  113. package/dist/tools/file/read.js.map +1 -0
  114. package/dist/tools/file/write.d.ts +17 -0
  115. package/dist/tools/file/write.d.ts.map +1 -0
  116. package/dist/tools/file/write.js +45 -0
  117. package/dist/tools/file/write.js.map +1 -0
  118. package/dist/tools/file-mutation-queue.d.ts +3 -0
  119. package/dist/tools/file-mutation-queue.d.ts.map +1 -0
  120. package/dist/tools/file-mutation-queue.js +47 -0
  121. package/dist/tools/file-mutation-queue.js.map +1 -0
  122. package/dist/tools/path-utils.d.ts +5 -0
  123. package/dist/tools/path-utils.d.ts.map +1 -0
  124. package/dist/tools/path-utils.js +79 -0
  125. package/dist/tools/path-utils.js.map +1 -0
  126. package/dist/tools/web/index.d.ts +2 -0
  127. package/dist/tools/web/index.d.ts.map +1 -0
  128. package/dist/tools/web/index.js +2 -0
  129. package/dist/tools/web/index.js.map +1 -0
  130. package/dist/tools/web/search.d.ts +44 -0
  131. package/dist/tools/web/search.d.ts.map +1 -0
  132. package/dist/tools/web/search.js +209 -0
  133. package/dist/tools/web/search.js.map +1 -0
  134. package/dist/tui/box.d.ts +11 -0
  135. package/dist/tui/box.d.ts.map +1 -0
  136. package/dist/tui/box.js +24 -0
  137. package/dist/tui/box.js.map +1 -0
  138. package/dist/tui/chat-screen.d.ts +29 -0
  139. package/dist/tui/chat-screen.d.ts.map +1 -0
  140. package/dist/tui/chat-screen.js +475 -0
  141. package/dist/tui/chat-screen.js.map +1 -0
  142. package/dist/tui/commands.d.ts +34 -0
  143. package/dist/tui/commands.d.ts.map +1 -0
  144. package/dist/tui/commands.js +691 -0
  145. package/dist/tui/commands.js.map +1 -0
  146. package/dist/tui/interactive.d.ts +9 -0
  147. package/dist/tui/interactive.d.ts.map +1 -0
  148. package/dist/tui/interactive.js +88 -0
  149. package/dist/tui/interactive.js.map +1 -0
  150. package/dist/tui/overlays.d.ts +39 -0
  151. package/dist/tui/overlays.d.ts.map +1 -0
  152. package/dist/tui/overlays.js +157 -0
  153. package/dist/tui/overlays.js.map +1 -0
  154. package/dist/tui/theme.d.ts +40 -0
  155. package/dist/tui/theme.d.ts.map +1 -0
  156. package/dist/tui/theme.js +120 -0
  157. package/dist/tui/theme.js.map +1 -0
  158. package/dist/tui/welcome.d.ts +3 -0
  159. package/dist/tui/welcome.d.ts.map +1 -0
  160. package/dist/tui/welcome.js +37 -0
  161. package/dist/tui/welcome.js.map +1 -0
  162. package/package.json +54 -0
@@ -0,0 +1,405 @@
1
+ import { Agent, } from "@earendil-works/pi-agent-core";
2
+ import { getEnvApiKey } from "@earendil-works/pi-ai";
3
+ import { getOAuthApiKey, getOAuthProvider } from "@earendil-works/pi-ai/oauth";
4
+ import { createBashTool } from "../tools/bash/tool.js";
5
+ import { createEditTool, createFindTool, createGrepTool, createLsTool, createReadTool, createWriteTool, } from "../tools/file/index.js";
6
+ import { createSearchWebTool } from "../tools/web/index.js";
7
+ import { randomUUID } from "node:crypto";
8
+ import { AuthStore } from "./auth-store.js";
9
+ import { createUserMessage } from "./messages.js";
10
+ import { AgentStatusStore, createInitialStatus, modelToStatus } from "./status-store.js";
11
+ import { buildSystemPrompt } from "./system-prompt.js";
12
+ export class PiSquaredAgentRuntime {
13
+ agent;
14
+ status;
15
+ authStore;
16
+ model;
17
+ apiKey;
18
+ sessionId;
19
+ transportOverride;
20
+ tools;
21
+ webSearchConfig;
22
+ cwd;
23
+ guidelines;
24
+ extraContextFiles;
25
+ systemPromptOverride;
26
+ constructor(options) {
27
+ this.authStore = options.authStore ?? new AuthStore();
28
+ this.model = this.applyOAuthModelTransforms(options.model);
29
+ this.apiKey = options.apiKey;
30
+ this.transportOverride = options.transport;
31
+ this.sessionId = options.sessionId ?? randomUUID();
32
+ this.cwd = options.cwd ?? process.cwd();
33
+ this.webSearchConfig = { ...(options.webSearch ?? {}) };
34
+ this.tools = [
35
+ createBashTool(this.cwd),
36
+ createReadTool(this.cwd),
37
+ createEditTool(this.cwd),
38
+ createFindTool(this.cwd),
39
+ createGrepTool(this.cwd),
40
+ createLsTool(this.cwd),
41
+ createWriteTool(this.cwd),
42
+ this.createSearchWebRuntimeTool(),
43
+ ];
44
+ this.guidelines = options.guidelines;
45
+ this.extraContextFiles = options.extraContextFiles;
46
+ this.systemPromptOverride = options.systemPrompt;
47
+ const thinkingLevel = options.thinkingLevel ?? "off";
48
+ const initialSystemPrompt = this.systemPromptOverride ?? "";
49
+ this.status = new AgentStatusStore(createInitialStatus({
50
+ sessionId: this.sessionId,
51
+ model: this.model,
52
+ thinkingLevel,
53
+ systemPrompt: initialSystemPrompt,
54
+ }));
55
+ this.agent = new Agent({
56
+ initialState: {
57
+ model: this.model,
58
+ thinkingLevel,
59
+ systemPrompt: initialSystemPrompt,
60
+ messages: [],
61
+ tools: [],
62
+ },
63
+ getApiKey: (provider) => this.resolveApiKey(provider),
64
+ sessionId: this.sessionId,
65
+ transport: this.resolveTransportForModel(this.model),
66
+ });
67
+ this.agent.subscribe((event) => {
68
+ this.handleAgentEvent(event);
69
+ });
70
+ }
71
+ get isBusy() {
72
+ return this.agent.state.isStreaming;
73
+ }
74
+ getCwd() {
75
+ return this.cwd;
76
+ }
77
+ get messages() {
78
+ return this.status.getSnapshot().messages;
79
+ }
80
+ async prompt(text) {
81
+ const trimmed = text.trim();
82
+ if (trimmed.length === 0)
83
+ return;
84
+ if (this.isBusy) {
85
+ throw new Error("The agent is already responding. Abort or wait for it to finish before sending another message.");
86
+ }
87
+ await this.applyStatusToAgent();
88
+ this.status.update((draft) => {
89
+ draft.phase = "streaming";
90
+ draft.lastError = undefined;
91
+ draft.currentEvent = "prompt";
92
+ });
93
+ try {
94
+ await this.agent.prompt(createUserMessage(trimmed));
95
+ }
96
+ finally {
97
+ this.syncFromAgent("idle", "settled");
98
+ }
99
+ }
100
+ async continueLast() {
101
+ if (this.isBusy) {
102
+ throw new Error("The agent is already responding. Abort or wait for it to finish before continuing.");
103
+ }
104
+ await this.applyStatusToAgent();
105
+ const messages = [...this.agent.state.messages];
106
+ while (messages.length > 0 && isFailedAssistantMessage(messages[messages.length - 1])) {
107
+ messages.pop();
108
+ }
109
+ const lastMessage = messages[messages.length - 1];
110
+ if (!lastMessage) {
111
+ throw new Error("No cancelled or failed request to continue.");
112
+ }
113
+ if (!isContinuableMessage(lastMessage)) {
114
+ throw new Error("The last request completed successfully. There is nothing to continue.");
115
+ }
116
+ this.agent.state.messages = messages;
117
+ this.status.update((draft) => {
118
+ draft.phase = "streaming";
119
+ draft.messages = [...messages];
120
+ draft.lastError = undefined;
121
+ draft.currentEvent = "continue";
122
+ });
123
+ try {
124
+ await this.agent.continue();
125
+ }
126
+ finally {
127
+ this.syncFromAgent("idle", "settled");
128
+ }
129
+ }
130
+ abort() {
131
+ if (!this.isBusy)
132
+ return;
133
+ this.status.update((draft) => {
134
+ draft.phase = "aborting";
135
+ draft.currentEvent = "abort";
136
+ });
137
+ this.agent.abort();
138
+ }
139
+ waitForIdle() {
140
+ return this.agent.waitForIdle();
141
+ }
142
+ newSession() {
143
+ if (this.isBusy) {
144
+ throw new Error("Cannot start a new session while the agent is responding.");
145
+ }
146
+ this.sessionId = randomUUID();
147
+ const snapshot = this.status.getSnapshot();
148
+ const systemPrompt = this.systemPromptOverride ?? snapshot.systemPrompt;
149
+ this.agent.reset();
150
+ this.agent.sessionId = this.sessionId;
151
+ this.agent.state.model = this.model;
152
+ this.agent.state.thinkingLevel = snapshot.thinkingLevel;
153
+ this.agent.state.systemPrompt = systemPrompt;
154
+ this.status.replace(createInitialStatus({
155
+ sessionId: this.sessionId,
156
+ model: this.model,
157
+ thinkingLevel: snapshot.thinkingLevel,
158
+ systemPrompt,
159
+ }));
160
+ return this.sessionId;
161
+ }
162
+ setMessages(messages) {
163
+ if (this.isBusy) {
164
+ throw new Error("Cannot replace messages while the agent is responding.");
165
+ }
166
+ this.agent.state.messages = messages;
167
+ this.syncFromAgent("idle", "messages_replace");
168
+ }
169
+ setModel(model) {
170
+ if (this.isBusy) {
171
+ throw new Error("Cannot replace the model while the agent is responding.");
172
+ }
173
+ const transformed = this.applyOAuthModelTransforms(model);
174
+ this.model = transformed;
175
+ this.agent.state.model = transformed;
176
+ this.agent.transport = this.resolveTransportForModel(transformed);
177
+ this.status.update((draft) => {
178
+ draft.model = modelToStatus(transformed);
179
+ draft.currentEvent = "model_replace";
180
+ });
181
+ }
182
+ /**
183
+ * Re-apply OAuth model transformations (e.g. github-copilot baseUrl rewrite)
184
+ * after credentials change.
185
+ */
186
+ refreshModelFromAuth() {
187
+ this.setModel(this.model);
188
+ }
189
+ setApiKey(apiKey) {
190
+ this.apiKey = apiKey;
191
+ }
192
+ setThinkingLevel(thinkingLevel) {
193
+ this.agent.state.thinkingLevel = thinkingLevel;
194
+ this.status.update((draft) => {
195
+ draft.thinkingLevel = thinkingLevel;
196
+ draft.currentEvent = "thinking_replace";
197
+ });
198
+ }
199
+ setSystemPrompt(systemPrompt) {
200
+ this.systemPromptOverride = systemPrompt;
201
+ this.agent.state.systemPrompt = systemPrompt;
202
+ this.status.update((draft) => {
203
+ draft.systemPrompt = systemPrompt;
204
+ draft.currentEvent = "system_prompt_replace";
205
+ });
206
+ }
207
+ getWebSearchConfig() {
208
+ return { ...this.webSearchConfig };
209
+ }
210
+ setWebSearchConfig(config) {
211
+ if (this.isBusy) {
212
+ throw new Error("Cannot replace search configuration while the agent is responding.");
213
+ }
214
+ this.webSearchConfig = { ...config };
215
+ const index = this.tools.findIndex((tool) => tool.name === "search_web");
216
+ const tool = this.createSearchWebRuntimeTool();
217
+ if (index >= 0)
218
+ this.tools[index] = tool;
219
+ else
220
+ this.tools.push(tool);
221
+ this.status.update((draft) => {
222
+ draft.currentEvent = "search_config_replace";
223
+ });
224
+ }
225
+ setLastError(error) {
226
+ this.status.update((draft) => {
227
+ draft.phase = error ? "error" : draft.phase;
228
+ draft.lastError = error;
229
+ draft.currentEvent = error ? "error" : draft.currentEvent;
230
+ });
231
+ }
232
+ setNotice(message, level = "info") {
233
+ this.status.update((draft) => {
234
+ draft.lastNotice = { message, level, at: Date.now() };
235
+ draft.currentEvent = `notice_${level}`;
236
+ });
237
+ }
238
+ clearNotice() {
239
+ this.status.update((draft) => {
240
+ draft.lastNotice = undefined;
241
+ });
242
+ }
243
+ /**
244
+ * Resolve an API key for a provider, preferring OAuth credentials from the
245
+ * auth store (refreshing if expired), then the runtime override, then env.
246
+ */
247
+ async resolveApiKey(provider) {
248
+ await this.authStore.load();
249
+ const oauthProvider = getOAuthProvider(provider);
250
+ if (oauthProvider) {
251
+ const credentials = this.authStore.getAllOAuth();
252
+ if (credentials[provider]) {
253
+ try {
254
+ const result = await getOAuthApiKey(provider, credentials);
255
+ if (result) {
256
+ const stored = credentials[provider];
257
+ if (stored && stored.access !== result.newCredentials.access) {
258
+ await this.authStore.setOAuth(provider, result.newCredentials);
259
+ }
260
+ return result.apiKey;
261
+ }
262
+ }
263
+ catch (error) {
264
+ const message = error instanceof Error ? error.message : String(error);
265
+ this.setNotice(`OAuth refresh failed for ${provider}: ${message}`, "error");
266
+ }
267
+ }
268
+ }
269
+ const storedKey = this.authStore.getApiKey(provider);
270
+ if (storedKey)
271
+ return storedKey;
272
+ return this.apiKey ?? getEnvApiKey(provider);
273
+ }
274
+ createSearchWebRuntimeTool() {
275
+ return createSearchWebTool({ ...this.webSearchConfig, getAuth: () => this.resolveSearchWebAuth() });
276
+ }
277
+ /** Resolve ChatGPT/Codex OAuth credentials used by the search_web tool. */
278
+ async resolveSearchWebAuth() {
279
+ const provider = "openai-codex";
280
+ await this.authStore.load();
281
+ const credentials = this.authStore.getAllOAuth();
282
+ if (!credentials[provider]) {
283
+ throw new Error("search_web requires ChatGPT/Codex OAuth credentials. Run /login openai-codex first.");
284
+ }
285
+ const result = await getOAuthApiKey(provider, credentials);
286
+ if (!result) {
287
+ throw new Error("search_web requires ChatGPT/Codex OAuth credentials. Run /login openai-codex first.");
288
+ }
289
+ const stored = credentials[provider];
290
+ if (stored && stored.access !== result.newCredentials.access) {
291
+ await this.authStore.setOAuth(provider, result.newCredentials);
292
+ }
293
+ const accountId = getOpenAICodexAccountId(result.newCredentials) ?? extractOpenAICodexAccountId(result.apiKey);
294
+ if (!accountId) {
295
+ throw new Error("search_web credentials are missing a ChatGPT account id. Run /login openai-codex again.");
296
+ }
297
+ return { accessToken: result.apiKey, accountId };
298
+ }
299
+ resolveTransportForModel(model) {
300
+ return this.transportOverride ?? getDefaultTransportForModel(model);
301
+ }
302
+ /**
303
+ * Apply OAuth-driven model transformations (e.g. github-copilot baseUrl).
304
+ */
305
+ applyOAuthModelTransforms(model) {
306
+ const oauthProvider = getOAuthProvider(model.provider);
307
+ if (!oauthProvider?.modifyModels)
308
+ return model;
309
+ const credentials = this.authStore.getOAuth(model.provider);
310
+ if (!credentials)
311
+ return model;
312
+ const [transformed] = oauthProvider.modifyModels([model], credentials);
313
+ return transformed ?? model;
314
+ }
315
+ /**
316
+ * Copy externally mutable status fields back into the core Agent before a run.
317
+ * A future HTTP server can update the status store, then call this method to
318
+ * make the next turn use the modified transcript and prompt state.
319
+ */
320
+ async applyStatusToAgent() {
321
+ if (!this.systemPromptOverride) {
322
+ const dynamicPrompt = await buildSystemPrompt({
323
+ cwd: this.cwd,
324
+ guidelines: this.guidelines,
325
+ extraContextFiles: this.extraContextFiles,
326
+ });
327
+ this.agent.state.systemPrompt = dynamicPrompt;
328
+ this.status.update((draft) => {
329
+ draft.systemPrompt = dynamicPrompt;
330
+ });
331
+ }
332
+ else {
333
+ this.agent.state.systemPrompt = this.systemPromptOverride;
334
+ }
335
+ const snapshot = this.status.getSnapshot();
336
+ this.agent.state.model = this.model;
337
+ this.agent.state.messages = snapshot.messages;
338
+ this.agent.state.thinkingLevel = snapshot.thinkingLevel;
339
+ this.agent.state.tools = [...this.tools];
340
+ }
341
+ handleAgentEvent(event) {
342
+ const nextPhase = event.type === "agent_end" ? "idle" : this.status.getSnapshot().phase;
343
+ this.syncFromAgent(nextPhase, event.type);
344
+ if (event.type === "turn_end" && event.message.role === "assistant" && event.message.errorMessage) {
345
+ this.setLastError(event.message.errorMessage);
346
+ }
347
+ }
348
+ syncFromAgent(phase, currentEvent) {
349
+ this.status.update((draft) => {
350
+ draft.phase = phase;
351
+ draft.model = modelToStatus(this.agent.state.model);
352
+ draft.thinkingLevel = this.agent.state.thinkingLevel;
353
+ draft.systemPrompt = this.agent.state.systemPrompt;
354
+ draft.messages = [...this.agent.state.messages];
355
+ draft.streamingMessage = this.agent.state.streamingMessage;
356
+ draft.pendingToolCallIds = [...this.agent.state.pendingToolCalls];
357
+ draft.lastError = this.agent.state.errorMessage;
358
+ draft.currentEvent = currentEvent;
359
+ });
360
+ }
361
+ }
362
+ function getDefaultTransportForModel(model) {
363
+ // OpenAI Codex can use WebSocket when transport is "auto"; prefer HTTP SSE
364
+ // by default for OpenAI-family models unless callers explicitly override it.
365
+ return model.provider === "openai" || model.provider === "openai-codex" ? "sse" : "auto";
366
+ }
367
+ function isContinuableMessage(message) {
368
+ const role = getMessageRole(message);
369
+ return role === "user" || role === "toolResult";
370
+ }
371
+ function isFailedAssistantMessage(message) {
372
+ if (!message || !isRecord(message) || message.role !== "assistant")
373
+ return false;
374
+ return message.stopReason === "error" || message.stopReason === "aborted" || typeof message.errorMessage === "string";
375
+ }
376
+ function getMessageRole(message) {
377
+ return isRecord(message) && typeof message.role === "string" ? message.role : undefined;
378
+ }
379
+ function isRecord(value) {
380
+ return typeof value === "object" && value !== null;
381
+ }
382
+ function getOpenAICodexAccountId(credentials) {
383
+ const accountId = credentials.accountId;
384
+ return typeof accountId === "string" && accountId.length > 0 ? accountId : undefined;
385
+ }
386
+ function extractOpenAICodexAccountId(accessToken) {
387
+ const payload = decodeJwtPayload(accessToken);
388
+ const auth = payload?.["https://api.openai.com/auth"];
389
+ if (!auth || typeof auth !== "object")
390
+ return undefined;
391
+ const accountId = auth.chatgpt_account_id;
392
+ return typeof accountId === "string" && accountId.length > 0 ? accountId : undefined;
393
+ }
394
+ function decodeJwtPayload(token) {
395
+ try {
396
+ const payload = token.split(".")[1];
397
+ if (!payload)
398
+ return undefined;
399
+ return JSON.parse(Buffer.from(payload, "base64url").toString("utf8"));
400
+ }
401
+ catch {
402
+ return undefined;
403
+ }
404
+ }
405
+ //# sourceMappingURL=pi-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-agent.js","sourceRoot":"","sources":["../../src/runtime/pi-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { Model } from "@earendil-works/pi-ai";
2
+ import type { AgentMessage, ThinkingLevel } from "@earendil-works/pi-agent-core";
3
+ export type AgentPhase = "idle" | "streaming" | "aborting" | "error";
4
+ export interface ModelStatus {
5
+ provider: string;
6
+ id: string;
7
+ name: string;
8
+ contextWindow: number;
9
+ }
10
+ export type NoticeLevel = "info" | "warn" | "error";
11
+ export interface AgentNotice {
12
+ level: NoticeLevel;
13
+ message: string;
14
+ /** Optional epoch ms at which the notice was raised. */
15
+ at: number;
16
+ }
17
+ export interface AgentStatusSnapshot {
18
+ sessionId: string;
19
+ phase: AgentPhase;
20
+ model: ModelStatus;
21
+ thinkingLevel: ThinkingLevel;
22
+ systemPrompt: string;
23
+ messages: AgentMessage[];
24
+ streamingMessage: AgentMessage | undefined;
25
+ pendingToolCallIds: string[];
26
+ lastError: string | undefined;
27
+ lastNotice: AgentNotice | undefined;
28
+ currentEvent: string | undefined;
29
+ updatedAt: number;
30
+ }
31
+ export type AgentStatusListener = (snapshot: AgentStatusSnapshot) => void;
32
+ export declare function modelToStatus(model: Model<any>): ModelStatus;
33
+ export interface CreateStatusOptions {
34
+ sessionId: string;
35
+ model: Model<any>;
36
+ thinkingLevel: ThinkingLevel;
37
+ systemPrompt: string;
38
+ }
39
+ export declare function createInitialStatus(options: CreateStatusOptions): AgentStatusSnapshot;
40
+ export declare class AgentStatusStore {
41
+ private snapshot;
42
+ private readonly listeners;
43
+ constructor(initialSnapshot: AgentStatusSnapshot);
44
+ getSnapshot(): AgentStatusSnapshot;
45
+ replace(nextSnapshot: AgentStatusSnapshot): void;
46
+ update(mutator: (draft: AgentStatusSnapshot) => void): void;
47
+ subscribe(listener: AgentStatusListener): () => void;
48
+ private emit;
49
+ }
50
+ //# sourceMappingURL=status-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-store.d.ts","sourceRoot":"","sources":["../../src/runtime/status-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEjF,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,WAAW,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,gBAAgB,EAAE,YAAY,GAAG,SAAS,CAAC;IAC3C,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,UAAU,EAAE,WAAW,GAAG,SAAS,CAAC;IACpC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,CAAC;AAE1E,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,WAAW,CAO5D;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,GAAG,mBAAmB,CAerF;AAYD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;gBAEhD,eAAe,EAAE,mBAAmB;IAIhD,WAAW,IAAI,mBAAmB;IAIlC,OAAO,CAAC,YAAY,EAAE,mBAAmB,GAAG,IAAI;IAKhD,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI;IAQ3D,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAKpD,OAAO,CAAC,IAAI;CAMb"}
@@ -0,0 +1,65 @@
1
+ export function modelToStatus(model) {
2
+ return {
3
+ provider: model.provider,
4
+ id: model.id,
5
+ name: model.name,
6
+ contextWindow: model.contextWindow,
7
+ };
8
+ }
9
+ export function createInitialStatus(options) {
10
+ return {
11
+ sessionId: options.sessionId,
12
+ phase: "idle",
13
+ model: modelToStatus(options.model),
14
+ thinkingLevel: options.thinkingLevel,
15
+ systemPrompt: options.systemPrompt,
16
+ messages: [],
17
+ streamingMessage: undefined,
18
+ pendingToolCallIds: [],
19
+ lastError: undefined,
20
+ lastNotice: undefined,
21
+ currentEvent: undefined,
22
+ updatedAt: Date.now(),
23
+ };
24
+ }
25
+ function cloneSnapshot(snapshot) {
26
+ return {
27
+ ...snapshot,
28
+ model: { ...snapshot.model },
29
+ messages: [...snapshot.messages],
30
+ pendingToolCallIds: [...snapshot.pendingToolCallIds],
31
+ lastNotice: snapshot.lastNotice ? { ...snapshot.lastNotice } : undefined,
32
+ };
33
+ }
34
+ export class AgentStatusStore {
35
+ snapshot;
36
+ listeners = new Set();
37
+ constructor(initialSnapshot) {
38
+ this.snapshot = cloneSnapshot(initialSnapshot);
39
+ }
40
+ getSnapshot() {
41
+ return cloneSnapshot(this.snapshot);
42
+ }
43
+ replace(nextSnapshot) {
44
+ this.snapshot = cloneSnapshot({ ...nextSnapshot, updatedAt: Date.now() });
45
+ this.emit();
46
+ }
47
+ update(mutator) {
48
+ const draft = cloneSnapshot(this.snapshot);
49
+ mutator(draft);
50
+ draft.updatedAt = Date.now();
51
+ this.snapshot = draft;
52
+ this.emit();
53
+ }
54
+ subscribe(listener) {
55
+ this.listeners.add(listener);
56
+ return () => this.listeners.delete(listener);
57
+ }
58
+ emit() {
59
+ const snapshot = this.getSnapshot();
60
+ for (const listener of this.listeners) {
61
+ listener(snapshot);
62
+ }
63
+ }
64
+ }
65
+ //# sourceMappingURL=status-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-store.js","sourceRoot":"","sources":["../../src/runtime/status-store.ts"],"names":[],"mappings":"AAsCA,MAAM,UAAU,aAAa,CAAC,KAAiB;IAC7C,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,aAAa,EAAE,KAAK,CAAC,aAAa;KACnC,CAAC;AACJ,CAAC;AASD,MAAM,UAAU,mBAAmB,CAAC,OAA4B;IAC9D,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC;QACnC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,QAAQ,EAAE,EAAE;QACZ,gBAAgB,EAAE,SAAS;QAC3B,kBAAkB,EAAE,EAAE;QACtB,SAAS,EAAE,SAAS;QACpB,UAAU,EAAE,SAAS;QACrB,YAAY,EAAE,SAAS;QACvB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,QAA6B;IAClD,OAAO;QACL,GAAG,QAAQ;QACX,KAAK,EAAE,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE;QAC5B,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAChC,kBAAkB,EAAE,CAAC,GAAG,QAAQ,CAAC,kBAAkB,CAAC;QACpD,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS;KACzE,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,gBAAgB;IACnB,QAAQ,CAAsB;IACrB,SAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE5D,YAAY,eAAoC;QAC9C,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC;IACjD,CAAC;IAED,WAAW;QACT,OAAO,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,YAAiC;QACvC,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC,EAAE,GAAG,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,MAAM,CAAC,OAA6C;QAClD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,SAAS,CAAC,QAA6B;QACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAEO,IAAI;QACV,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ export interface BuildSystemPromptOptions {
2
+ /** Working directory. */
3
+ cwd: string;
4
+ /** Custom guidelines to add as a dedicated section. */
5
+ guidelines?: string[] | undefined;
6
+ /** Extra context file paths (relative to cwd) to include. */
7
+ extraContextFiles?: string[] | undefined;
8
+ }
9
+ export declare const DEFAULT_CONTEXT_FILES: string[];
10
+ export declare function buildSystemPrompt(options: BuildSystemPromptOptions): Promise<string>;
11
+ //# sourceMappingURL=system-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/runtime/system-prompt.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,wBAAwB;IACvC,yBAAyB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAClC,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CAC1C;AAID,eAAO,MAAM,qBAAqB,UAAmE,CAAC;AAEtG,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyB1F"}
@@ -0,0 +1,43 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ const STATIC_SYSTEM_PROMPT = `You are pi-squared, an interactive coding assistant running in a terminal. Be concise, practical, and honest about limitations. You help users by reading files, editing code, writing new files, and executing commands.`;
4
+ export const DEFAULT_CONTEXT_FILES = ["AGENTS.md", "CLAUDE.md", "GEMINI.md", ".pi-squared/AGENTS.md"];
5
+ export async function buildSystemPrompt(options) {
6
+ const parts = [];
7
+ // Static prompt (always included)
8
+ parts.push(STATIC_SYSTEM_PROMPT);
9
+ // Custom guidelines (only when provided)
10
+ if (options.guidelines && options.guidelines.length > 0) {
11
+ parts.push(`\n# Guidelines\n${options.guidelines.join("\n")}`);
12
+ }
13
+ // Context files
14
+ const contextFiles = await loadContextFiles(options.cwd, options.extraContextFiles);
15
+ if (contextFiles.length > 0) {
16
+ parts.push("\nProject-specific instructions and guidelines are as follows:\n");
17
+ for (const { path, content } of contextFiles) {
18
+ parts.push(`<instructions path="${path}">\n${content}\n</instructions>`);
19
+ }
20
+ }
21
+ // Other contexts
22
+ parts.push(`\n# Current Date\n${new Date().toISOString()}`);
23
+ parts.push(`\n# Current Working Directory\n${options.cwd}`);
24
+ return parts.join("\n");
25
+ }
26
+ async function loadContextFiles(cwd, extraFiles) {
27
+ const toCheck = [...DEFAULT_CONTEXT_FILES, ...(extraFiles ?? [])];
28
+ const results = [];
29
+ for (const file of toCheck) {
30
+ try {
31
+ const content = await readFile(join(cwd, file), "utf-8");
32
+ const trimmed = content.trim();
33
+ if (trimmed.length > 0) {
34
+ results.push({ path: file, content: trimmed });
35
+ }
36
+ }
37
+ catch {
38
+ // Ignore missing or unreadable files.
39
+ }
40
+ }
41
+ return results;
42
+ }
43
+ //# sourceMappingURL=system-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/runtime/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAWjC,MAAM,oBAAoB,GAAG,2NAA2N,CAAC;AAEzP,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,uBAAuB,CAAC,CAAC;AAEtG,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAiC;IACvE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,kCAAkC;IAClC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAEjC,yCAAyC;IACzC,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,mBAAmB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,gBAAgB;IAChB,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACpF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QAC/E,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,YAAY,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,uBAAuB,IAAI,OAAO,OAAO,mBAAmB,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,KAAK,CAAC,IAAI,CAAC,qBAAqB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,CAAC,kCAAkC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE5D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,UAAqB;IAChE,MAAM,OAAO,GAAG,CAAC,GAAG,qBAAqB,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;IAClE,MAAM,OAAO,GAA6C,EAAE,CAAC;IAE7D,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;QACxC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Bash tool — executes shell commands and returns stdout+stderr.
3
+ *
4
+ * Ported from @earendil-works/pi-coding-agent. TUI rendering components have
5
+ * been omitted; only the core execute logic is kept.
6
+ */
7
+ import type { AgentTool } from "@earendil-works/pi-agent-core";
8
+ import { Type } from "typebox";
9
+ import { type TruncationResult } from "./truncate.js";
10
+ declare const bashSchema: Type.TObject<{
11
+ command: Type.TString;
12
+ timeout: Type.TOptional<Type.TNumber>;
13
+ }>;
14
+ interface BashToolDetails {
15
+ truncation?: TruncationResult;
16
+ fullOutputPath?: string;
17
+ }
18
+ /**
19
+ * Create a bash AgentTool that executes commands in `cwd`.
20
+ */
21
+ export declare function createBashTool(cwd: string): AgentTool<typeof bashSchema, BashToolDetails | undefined>;
22
+ export {};
23
+ //# sourceMappingURL=bash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/runtime/tools/bash.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAA4C,MAAM,+BAA+B,CAAC;AAIzG,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAW5C,OAAO,EAAoD,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAMxG,QAAA,MAAM,UAAU;;;EAGd,CAAC;AAQH,UAAU,eAAe;IACvB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAYD;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC,CA+MrG"}