@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 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/tools/file/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAG/D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAK5C,QAAA,MAAM,WAAW;;;EAGf,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAExD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AASD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,OAAO,WAAW,EAAE,SAAS,CAAC,CA8BjH"}
@@ -0,0 +1,45 @@
1
+ import { mkdir as fsMkdir, writeFile as fsWriteFile } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ import { Type } from "typebox";
4
+ import { withFileMutationQueue } from "../file-mutation-queue.js";
5
+ import { resolveToCwd } from "../path-utils.js";
6
+ const writeSchema = Type.Object({
7
+ path: Type.String({ description: "Path to the file to write (relative or absolute)" }),
8
+ content: Type.String({ description: "Content to write to the file" }),
9
+ });
10
+ const defaultWriteOperations = {
11
+ writeFile: (path, content) => fsWriteFile(path, content, "utf-8"),
12
+ mkdir: async (dir) => {
13
+ await fsMkdir(dir, { recursive: true });
14
+ },
15
+ };
16
+ export function createWriteTool(cwd, options) {
17
+ const ops = options?.operations ?? defaultWriteOperations;
18
+ return {
19
+ name: "write",
20
+ label: "write",
21
+ description: "Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.",
22
+ parameters: writeSchema,
23
+ executionMode: "sequential",
24
+ execute: async (_toolCallId, { path, content }, signal) => {
25
+ const absolutePath = resolveToCwd(path, cwd);
26
+ const dir = dirname(absolutePath);
27
+ return withFileMutationQueue(absolutePath, async () => {
28
+ const throwIfAborted = () => {
29
+ if (signal?.aborted)
30
+ throw new Error("Operation aborted");
31
+ };
32
+ throwIfAborted();
33
+ await ops.mkdir(dir);
34
+ throwIfAborted();
35
+ await ops.writeFile(absolutePath, content);
36
+ throwIfAborted();
37
+ return {
38
+ content: [{ type: "text", text: `Successfully wrote ${content.length} bytes to ${path}` }],
39
+ details: undefined,
40
+ };
41
+ });
42
+ },
43
+ };
44
+ }
45
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../../src/tools/file/write.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;IAC9B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,kDAAkD,EAAE,CAAC;IACtF,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAAC;CACtE,CAAC,CAAC;AASH,MAAM,sBAAsB,GAAoB;IAC9C,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC;IACjE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACnB,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;CACF,CAAC;AAMF,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,OAA0B;IACrE,MAAM,GAAG,GAAG,OAAO,EAAE,UAAU,IAAI,sBAAsB,CAAC;IAC1D,OAAO;QACL,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,OAAO;QACd,WAAW,EACT,iIAAiI;QACnI,UAAU,EAAE,WAAW;QACvB,aAAa,EAAE,YAAY;QAC3B,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE;YACxD,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;YAClC,OAAO,qBAAqB,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;gBACpD,MAAM,cAAc,GAAG,GAAS,EAAE;oBAChC,IAAI,MAAM,EAAE,OAAO;wBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC5D,CAAC,CAAC;gBAEF,cAAc,EAAE,CAAC;gBACjB,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACrB,cAAc,EAAE,CAAC;gBACjB,MAAM,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBAC3C,cAAc,EAAE,CAAC;gBAEjB,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,OAAO,CAAC,MAAM,aAAa,IAAI,EAAE,EAAE,CAAC;oBAC1F,OAAO,EAAE,SAAS;iBACnB,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Serialize file mutation operations targeting the same file. */
2
+ export declare function withFileMutationQueue<T>(filePath: string, fn: () => Promise<T>): Promise<T>;
3
+ //# sourceMappingURL=file-mutation-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-mutation-queue.d.ts","sourceRoot":"","sources":["../../src/tools/file-mutation-queue.ts"],"names":[],"mappings":"AAyBA,kEAAkE;AAClE,wBAAsB,qBAAqB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA2BjG"}
@@ -0,0 +1,47 @@
1
+ import { realpath } from "node:fs/promises";
2
+ import { resolve } from "node:path";
3
+ const fileMutationQueues = new Map();
4
+ let registrationQueue = Promise.resolve();
5
+ function isMissingPathError(error) {
6
+ return (typeof error === "object" &&
7
+ error !== null &&
8
+ "code" in error &&
9
+ (error.code === "ENOENT" || error.code === "ENOTDIR"));
10
+ }
11
+ async function getMutationQueueKey(filePath) {
12
+ const resolvedPath = resolve(filePath);
13
+ try {
14
+ return await realpath(resolvedPath);
15
+ }
16
+ catch (error) {
17
+ if (isMissingPathError(error))
18
+ return resolvedPath;
19
+ throw error;
20
+ }
21
+ }
22
+ /** Serialize file mutation operations targeting the same file. */
23
+ export async function withFileMutationQueue(filePath, fn) {
24
+ const registration = registrationQueue.then(async () => {
25
+ const key = await getMutationQueueKey(filePath);
26
+ const currentQueue = fileMutationQueues.get(key) ?? Promise.resolve();
27
+ let releaseNext;
28
+ const nextQueue = new Promise((resolveQueue) => {
29
+ releaseNext = resolveQueue;
30
+ });
31
+ const chainedQueue = currentQueue.then(() => nextQueue);
32
+ fileMutationQueues.set(key, chainedQueue);
33
+ return { key, currentQueue, chainedQueue, releaseNext };
34
+ });
35
+ registrationQueue = registration.then(() => undefined, () => undefined);
36
+ const { key, currentQueue, chainedQueue, releaseNext } = await registration;
37
+ await currentQueue;
38
+ try {
39
+ return await fn();
40
+ }
41
+ finally {
42
+ releaseNext();
43
+ if (fileMutationQueues.get(key) === chainedQueue)
44
+ fileMutationQueues.delete(key);
45
+ }
46
+ }
47
+ //# sourceMappingURL=file-mutation-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-mutation-queue.js","sourceRoot":"","sources":["../../src/tools/file-mutation-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAyB,CAAC;AAC5D,IAAI,iBAAiB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;AAE1C,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,CAAE,KAA2B,CAAC,IAAI,KAAK,QAAQ,IAAK,KAA2B,CAAC,IAAI,KAAK,SAAS,CAAC,CACpG,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACjD,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,kBAAkB,CAAC,KAAK,CAAC;YAAE,OAAO,YAAY,CAAC;QACnD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAI,QAAgB,EAAE,EAAoB;IACnF,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QACrD,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAEtE,IAAI,WAAwB,CAAC;QAC7B,MAAM,SAAS,GAAG,IAAI,OAAO,CAAO,CAAC,YAAY,EAAE,EAAE;YACnD,WAAW,GAAG,YAAY,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACxD,kBAAkB,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAE1C,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;IACH,iBAAiB,GAAG,YAAY,CAAC,IAAI,CACnC,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;IAEF,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,MAAM,YAAY,CAAC;IAC5E,MAAM,YAAY,CAAC;IACnB,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,WAAW,EAAE,CAAC;QACd,IAAI,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,YAAY;YAAE,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnF,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function pathExists(filePath: string): Promise<boolean>;
2
+ export declare function resolveToCwd(filePath: string, cwd: string): string;
3
+ export declare function resolveReadPathAsync(filePath: string, cwd: string): Promise<string>;
4
+ export declare function resolveReadPath(filePath: string, cwd: string): string;
5
+ //# sourceMappingURL=path-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../../src/tools/path-utils.ts"],"names":[],"mappings":"AAoCA,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGlE;AAED,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBzF;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBrE"}
@@ -0,0 +1,79 @@
1
+ import { accessSync, constants } from "node:fs";
2
+ import { access } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import { isAbsolute, resolve } from "node:path";
5
+ const NARROW_NO_BREAK_SPACE = "\u202F";
6
+ function normalizePathInput(filePath) {
7
+ let value = filePath.trim().replace(/[\u00a0\u202f]/g, " ");
8
+ if (value.startsWith("@"))
9
+ value = value.slice(1);
10
+ if (value === "~")
11
+ return homedir();
12
+ if (value.startsWith("~/") || value.startsWith("~\\"))
13
+ return resolve(homedir(), value.slice(2));
14
+ return value;
15
+ }
16
+ function tryMacOSScreenshotPath(filePath) {
17
+ return filePath.replace(/ (AM|PM)\./gi, `${NARROW_NO_BREAK_SPACE}$1.`);
18
+ }
19
+ function tryNFDVariant(filePath) {
20
+ return filePath.normalize("NFD");
21
+ }
22
+ function tryCurlyQuoteVariant(filePath) {
23
+ return filePath.replace(/'/g, "\u2019");
24
+ }
25
+ function fileExists(filePath) {
26
+ try {
27
+ accessSync(filePath, constants.F_OK);
28
+ return true;
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ export async function pathExists(filePath) {
35
+ try {
36
+ await access(filePath, constants.F_OK);
37
+ return true;
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ }
43
+ export function resolveToCwd(filePath, cwd) {
44
+ const normalized = normalizePathInput(filePath);
45
+ return isAbsolute(normalized) ? resolve(normalized) : resolve(cwd, normalized);
46
+ }
47
+ export async function resolveReadPathAsync(filePath, cwd) {
48
+ const resolved = resolveToCwd(filePath, cwd);
49
+ if (await pathExists(resolved))
50
+ return resolved;
51
+ const variants = [
52
+ tryMacOSScreenshotPath(resolved),
53
+ tryNFDVariant(resolved),
54
+ tryCurlyQuoteVariant(resolved),
55
+ tryCurlyQuoteVariant(tryNFDVariant(resolved)),
56
+ ];
57
+ for (const variant of variants) {
58
+ if (variant !== resolved && (await pathExists(variant)))
59
+ return variant;
60
+ }
61
+ return resolved;
62
+ }
63
+ export function resolveReadPath(filePath, cwd) {
64
+ const resolved = resolveToCwd(filePath, cwd);
65
+ if (fileExists(resolved))
66
+ return resolved;
67
+ const variants = [
68
+ tryMacOSScreenshotPath(resolved),
69
+ tryNFDVariant(resolved),
70
+ tryCurlyQuoteVariant(resolved),
71
+ tryCurlyQuoteVariant(tryNFDVariant(resolved)),
72
+ ];
73
+ for (const variant of variants) {
74
+ if (variant !== resolved && fileExists(variant))
75
+ return variant;
76
+ }
77
+ return resolved;
78
+ }
79
+ //# sourceMappingURL=path-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../src/tools/path-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { createSearchWebTool, DEFAULT_MAX_SOURCES, DEFAULT_SEARCH_ENDPOINT, DEFAULT_SEARCH_MODEL, DEFAULT_SEARCH_TIMEOUT_MS, MAX_ALLOWED_SOURCES, type SearchWebAuth, type SearchWebSource, type SearchWebToolConfig, type SearchWebToolDetails, type SearchWebToolInput, type SearchWebToolOptions, } from "./search.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/web/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createSearchWebTool, DEFAULT_MAX_SOURCES, DEFAULT_SEARCH_ENDPOINT, DEFAULT_SEARCH_MODEL, DEFAULT_SEARCH_TIMEOUT_MS, MAX_ALLOWED_SOURCES, } from "./search.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/web/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,GAOpB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { AgentTool } from "@earendil-works/pi-agent-core";
2
+ import { type Static, Type } from "typebox";
3
+ export declare const DEFAULT_SEARCH_MODEL = "gpt-5.4-mini";
4
+ export declare const DEFAULT_MAX_SOURCES = 5;
5
+ export declare const MAX_ALLOWED_SOURCES = 10;
6
+ export declare const DEFAULT_SEARCH_TIMEOUT_MS = 120000;
7
+ export declare const DEFAULT_SEARCH_ENDPOINT = "https://chatgpt.com/backend-api/codex/responses";
8
+ declare const searchWebSchema: Type.TObject<{
9
+ query: Type.TString;
10
+ maxSources: Type.TOptional<Type.TNumber>;
11
+ freshness: Type.TOptional<Type.TUnion<[Type.TLiteral<"cached">, Type.TLiteral<"live">]>>;
12
+ }>;
13
+ export type SearchWebToolInput = Static<typeof searchWebSchema>;
14
+ export interface SearchWebAuth {
15
+ accessToken: string;
16
+ accountId: string;
17
+ }
18
+ export interface SearchWebSource {
19
+ title: string;
20
+ url: string;
21
+ snippet: string;
22
+ }
23
+ export interface SearchWebToolDetails {
24
+ query: string;
25
+ freshness: "cached" | "live";
26
+ sourceCount: number;
27
+ sources: SearchWebSource[];
28
+ summary: string;
29
+ truncated: boolean;
30
+ }
31
+ export interface SearchWebToolConfig {
32
+ model?: string;
33
+ maxSources?: number;
34
+ timeoutMs?: number;
35
+ endpoint?: string;
36
+ maxAllowedSources?: number;
37
+ }
38
+ export interface SearchWebToolOptions extends SearchWebToolConfig {
39
+ getAuth: () => Promise<SearchWebAuth>;
40
+ fetch?: typeof fetch;
41
+ }
42
+ export declare function createSearchWebTool(options: SearchWebToolOptions): AgentTool<typeof searchWebSchema, SearchWebToolDetails | undefined>;
43
+ export {};
44
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/tools/web/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AACnD,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,yBAAyB,SAAU,CAAC;AACjD,eAAO,MAAM,uBAAuB,oDAAoD,CAAC;AAEzF,QAAA,MAAM,eAAe;;;;EAQnB,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D,OAAO,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AA6BD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,oBAAoB,GAC5B,SAAS,CAAC,OAAO,eAAe,EAAE,oBAAoB,GAAG,SAAS,CAAC,CA8ErE"}
@@ -0,0 +1,209 @@
1
+ import { Type } from "typebox";
2
+ export const DEFAULT_SEARCH_MODEL = "gpt-5.4-mini";
3
+ export const DEFAULT_MAX_SOURCES = 5;
4
+ export const MAX_ALLOWED_SOURCES = 10;
5
+ export const DEFAULT_SEARCH_TIMEOUT_MS = 120_000;
6
+ export const DEFAULT_SEARCH_ENDPOINT = "https://chatgpt.com/backend-api/codex/responses";
7
+ const searchWebSchema = Type.Object({
8
+ query: Type.String({ description: "What to search for on the web" }),
9
+ maxSources: Type.Optional(Type.Number({ description: "Maximum number of sources to return" })),
10
+ freshness: Type.Optional(Type.Union([Type.Literal("cached"), Type.Literal("live")], {
11
+ description: "Use 'cached' for stable topics, 'live' for time-sensitive queries.",
12
+ })),
13
+ });
14
+ const SEARCH_OUTPUT_SCHEMA = {
15
+ type: "object",
16
+ additionalProperties: false,
17
+ properties: {
18
+ summary: { type: "string" },
19
+ sources: {
20
+ type: "array",
21
+ items: {
22
+ type: "object",
23
+ additionalProperties: false,
24
+ properties: {
25
+ title: { type: "string" },
26
+ url: { type: "string" },
27
+ snippet: { type: "string" },
28
+ },
29
+ required: ["title", "url", "snippet"],
30
+ },
31
+ },
32
+ },
33
+ required: ["summary", "sources"],
34
+ };
35
+ export function createSearchWebTool(options) {
36
+ const fetchImpl = options.fetch ?? fetch;
37
+ const configuredMaxSources = normalizePositiveInteger(options.maxSources, DEFAULT_MAX_SOURCES);
38
+ const maxAllowedSources = normalizePositiveInteger(options.maxAllowedSources, MAX_ALLOWED_SOURCES);
39
+ const timeoutMs = normalizePositiveInteger(options.timeoutMs, DEFAULT_SEARCH_TIMEOUT_MS);
40
+ const model = options.model?.trim() || DEFAULT_SEARCH_MODEL;
41
+ const endpoint = options.endpoint?.trim() || DEFAULT_SEARCH_ENDPOINT;
42
+ return {
43
+ name: "search_web",
44
+ label: "search_web",
45
+ description: "Search the public web with OpenAI and return a concise summary with sources. Use cached freshness for stable topics and live freshness for time-sensitive queries.",
46
+ parameters: searchWebSchema,
47
+ execute: async (_toolCallId, input, signal) => {
48
+ const query = input.query.trim();
49
+ if (query.length === 0)
50
+ throw new Error("search_web requires a non-empty query.");
51
+ const requestedSources = normalizePositiveInteger(input.maxSources, configuredMaxSources);
52
+ const maxSources = Math.min(requestedSources, maxAllowedSources);
53
+ const freshness = input.freshness ?? "cached";
54
+ const auth = await options.getAuth();
55
+ const controller = new AbortController();
56
+ const timeout = setTimeout(() => controller.abort(new Error(`search_web timed out after ${timeoutMs}ms`)), timeoutMs);
57
+ const abort = () => controller.abort(signal?.reason);
58
+ signal?.addEventListener("abort", abort, { once: true });
59
+ try {
60
+ if (signal?.aborted)
61
+ throw new Error("Operation aborted");
62
+ const response = await fetchImpl(endpoint, {
63
+ method: "POST",
64
+ headers: {
65
+ "Content-Type": "application/json",
66
+ Authorization: `Bearer ${auth.accessToken}`,
67
+ "ChatGPT-Account-ID": auth.accountId,
68
+ },
69
+ body: JSON.stringify({
70
+ model,
71
+ instructions: buildSearchPrompt(query, maxSources, freshness),
72
+ input: [{ role: "user", content: `Search the web for: ${query}` }],
73
+ tools: [{ type: "web_search" }],
74
+ store: false,
75
+ stream: true,
76
+ }),
77
+ signal: controller.signal,
78
+ });
79
+ if (!response.ok) {
80
+ const error = await response.text().catch(() => "Unknown error");
81
+ if (response.status === 401) {
82
+ throw new Error("OpenAI authentication failed. Run /login openai-codex to refresh credentials.");
83
+ }
84
+ if (response.status === 429)
85
+ throw new Error("OpenAI rate limited the search request. Try again later.");
86
+ throw new Error(`OpenAI search API error (${response.status}): ${error}`);
87
+ }
88
+ const rawOutput = collectOutputText(parseSSE(await response.text()));
89
+ if (rawOutput.length === 0)
90
+ throw new Error("Empty response from OpenAI search API.");
91
+ const parsed = parseSearchResponse(rawOutput);
92
+ const sources = parsed.sources.slice(0, maxSources);
93
+ const summary = parsed.summary.trim();
94
+ if (summary.length === 0)
95
+ throw new Error("Empty summary in OpenAI search response.");
96
+ return {
97
+ content: [{ type: "text", text: formatSearchResult(summary, sources) }],
98
+ details: { query, freshness, sourceCount: sources.length, sources, summary, truncated: false },
99
+ };
100
+ }
101
+ finally {
102
+ clearTimeout(timeout);
103
+ signal?.removeEventListener("abort", abort);
104
+ }
105
+ },
106
+ };
107
+ }
108
+ function buildSearchPrompt(query, maxSources, freshness) {
109
+ return [
110
+ "You are performing web research for a coding agent.",
111
+ "Search the public web and answer the user's query using current online sources.",
112
+ freshness === "live"
113
+ ? "Prioritize the most recent and up-to-date information available."
114
+ : "Cached results are fine; prioritize accuracy over recency.",
115
+ "Return ONLY a JSON object matching this schema:",
116
+ JSON.stringify(SEARCH_OUTPUT_SCHEMA),
117
+ "Do not wrap the JSON in markdown fences or add any extra commentary.",
118
+ `Keep the summary concise and useful. Limit sources to at most ${maxSources} items.`,
119
+ "Prefer primary or official sources when available.",
120
+ "Each source snippet should be short and directly relevant.",
121
+ "",
122
+ `User query: ${query}`,
123
+ ].join("\n");
124
+ }
125
+ function parseSSE(text) {
126
+ const events = [];
127
+ let eventType = "";
128
+ let dataLines = [];
129
+ const flush = () => {
130
+ if (!eventType || dataLines.length === 0)
131
+ return;
132
+ try {
133
+ events.push({ type: eventType, data: JSON.parse(dataLines.join("\n")) });
134
+ }
135
+ catch {
136
+ // Ignore malformed SSE data frames.
137
+ }
138
+ eventType = "";
139
+ dataLines = [];
140
+ };
141
+ for (const line of text.split(/\r?\n/)) {
142
+ if (line === "") {
143
+ flush();
144
+ }
145
+ else if (line.startsWith("event: ")) {
146
+ eventType = line.slice(7);
147
+ }
148
+ else if (line.startsWith("data: ")) {
149
+ dataLines.push(line.slice(6));
150
+ }
151
+ }
152
+ flush();
153
+ return events;
154
+ }
155
+ function collectOutputText(events) {
156
+ let output = "";
157
+ for (const event of events) {
158
+ if (event.type !== "response.output_text.delta")
159
+ continue;
160
+ const delta = event.data.delta;
161
+ if (typeof delta === "string")
162
+ output += delta;
163
+ }
164
+ return output;
165
+ }
166
+ function parseSearchResponse(rawOutput) {
167
+ let parsed;
168
+ try {
169
+ parsed = JSON.parse(rawOutput);
170
+ }
171
+ catch (error) {
172
+ throw new Error(`Invalid JSON from OpenAI search response: ${error instanceof Error ? error.message : String(error)}`);
173
+ }
174
+ if (!parsed || typeof parsed !== "object")
175
+ throw new Error("Invalid OpenAI search response: expected an object.");
176
+ const record = parsed;
177
+ if (typeof record.summary !== "string")
178
+ throw new Error("Invalid OpenAI search response: missing summary.");
179
+ if (!Array.isArray(record.sources))
180
+ throw new Error("Invalid OpenAI search response: missing sources.");
181
+ return {
182
+ summary: record.summary,
183
+ sources: record.sources.flatMap((source) => (isSearchSource(source) ? [source] : [])),
184
+ };
185
+ }
186
+ function isSearchSource(value) {
187
+ if (!value || typeof value !== "object")
188
+ return false;
189
+ const record = value;
190
+ return typeof record.title === "string" && typeof record.url === "string" && typeof record.snippet === "string";
191
+ }
192
+ function formatSearchResult(summary, sources) {
193
+ const lines = [summary];
194
+ if (sources.length > 0) {
195
+ lines.push("", "Sources:");
196
+ sources.forEach((source, index) => {
197
+ lines.push(`${index + 1}. ${source.title}`, ` ${source.url}`);
198
+ if (source.snippet.length > 0)
199
+ lines.push(` ${source.snippet}`);
200
+ });
201
+ }
202
+ return lines.join("\n");
203
+ }
204
+ function normalizePositiveInteger(value, fallback) {
205
+ if (value === undefined || !Number.isFinite(value))
206
+ return fallback;
207
+ return Math.max(1, Math.floor(value));
208
+ }
209
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/tools/web/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface DrawBoxOptions {
2
+ indent?: string;
3
+ paddingX?: number;
4
+ maxWidth?: number;
5
+ preferredContentWidth?: number;
6
+ minContentWidth?: number;
7
+ borderStyle?: (text: string) => string;
8
+ }
9
+ export declare function fitVisible(text: string, width: number): string;
10
+ export declare function drawBox(contents: readonly string[], options?: DrawBoxOptions): string[];
11
+ //# sourceMappingURL=box.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../../src/tui/box.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACxC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM,EAAE,CAwB3F"}
@@ -0,0 +1,24 @@
1
+ import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
2
+ import { style } from "./theme.js";
3
+ export function fitVisible(text, width) {
4
+ const truncated = truncateToWidth(text, width);
5
+ return `${truncated}${" ".repeat(Math.max(0, width - visibleWidth(truncated)))}`;
6
+ }
7
+ export function drawBox(contents, options = {}) {
8
+ const indent = options.indent ?? "";
9
+ const paddingX = Math.max(0, options.paddingX ?? 0);
10
+ const naturalContentWidth = contents.length === 0 ? 0 : Math.max(...contents.map((line) => visibleWidth(line)));
11
+ const preferredContentWidth = Math.max(0, options.preferredContentWidth ?? naturalContentWidth, options.minContentWidth ?? 0);
12
+ const reservedWidth = visibleWidth(indent) + 2 + paddingX * 2;
13
+ const maxContentWidth = options.maxWidth == null ? preferredContentWidth : Math.max(0, options.maxWidth - reservedWidth);
14
+ const contentWidth = Math.min(preferredContentWidth, maxContentWidth);
15
+ const padding = " ".repeat(paddingX);
16
+ const horizontal = "─".repeat(contentWidth + paddingX * 2);
17
+ const border = options.borderStyle ?? style.border;
18
+ return [
19
+ `${indent}${border(`╭${horizontal}╮`)}`,
20
+ ...contents.map((line) => `${indent}${border("│")}${padding}${fitVisible(line, contentWidth)}${padding}${border("│")}`),
21
+ `${indent}${border(`╰${horizontal}╯`)}`,
22
+ ];
23
+ }
24
+ //# sourceMappingURL=box.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"box.js","sourceRoot":"","sources":["../../src/tui/box.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAWnC,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,KAAa;IACpD,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/C,OAAO,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,QAA2B,EAAE,UAA0B,EAAE;IAC/E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;IACpD,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChH,MAAM,qBAAqB,GAAG,IAAI,CAAC,GAAG,CACpC,CAAC,EACD,OAAO,CAAC,qBAAqB,IAAI,mBAAmB,EACpD,OAAO,CAAC,eAAe,IAAI,CAAC,CAC7B,CAAC;IACF,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;IAC9D,MAAM,eAAe,GACnB,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,GAAG,aAAa,CAAC,CAAC;IACnG,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,eAAe,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC;IAEnD,OAAO;QACL,GAAG,MAAM,GAAG,MAAM,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE;QACvC,GAAG,QAAQ,CAAC,GAAG,CACb,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,GAAG,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CACvG;QACD,GAAG,MAAM,GAAG,MAAM,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE;KACxC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { Editor, type Component, type TUI } from "@earendil-works/pi-tui";
2
+ export interface ScreenPanel {
3
+ placement?: "aboveEditor" | "belowEditor";
4
+ render(width: number): string[];
5
+ handleInput(data: string): void;
6
+ invalidate(): void;
7
+ }
8
+ import type { PiSquaredAgentRuntime } from "../runtime/pi-agent.js";
9
+ export interface ChatScreenOptions {
10
+ onSubmit: (text: string) => void;
11
+ }
12
+ export declare class ChatScreen implements Component {
13
+ private readonly tui;
14
+ private readonly runtime;
15
+ readonly editor: Editor;
16
+ private panel;
17
+ private messageRenderCache;
18
+ private errorRenderCache;
19
+ private readonly panelProxy;
20
+ constructor(tui: TUI, runtime: PiSquaredAgentRuntime, options: ChatScreenOptions);
21
+ setPanel(panel: ScreenPanel | null): void;
22
+ render(width: number): string[];
23
+ handleInput(data: string): void;
24
+ invalidate(): void;
25
+ private renderFooter;
26
+ private renderError;
27
+ private renderMessages;
28
+ }
29
+ //# sourceMappingURL=chat-screen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-screen.d.ts","sourceRoot":"","sources":["../../src/tui/chat-screen.ts"],"names":[],"mappings":"AACA,OAAO,EACL,MAAM,EAKN,KAAK,SAAS,EAEd,KAAK,GAAG,EACT,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,aAAa,GAAG,aAAa,CAAC;IAC1C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAChC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,IAAI,IAAI,CAAC;CACpB;AAKD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAKpE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,qBAAa,UAAW,YAAW,SAAS;IAaxC,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAb1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,kBAAkB,CAAsE;IAChG,OAAO,CAAC,gBAAgB,CAA8E;IAEtG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAIzB;gBAGiB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,qBAAqB,EAC/C,OAAO,EAAE,iBAAiB;IAM5B,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAMzC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA6C/B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI/B,UAAU,IAAI,IAAI;IAMlB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,cAAc;CA0BvB"}