gauss-ai 4.0.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 (232) hide show
  1. package/CHANGELOG.md +489 -0
  2. package/LICENSE +21 -0
  3. package/README.md +269 -0
  4. package/dist/a2a/index.cjs +7 -0
  5. package/dist/a2a/index.cjs.map +1 -0
  6. package/dist/a2a/index.d.cts +30 -0
  7. package/dist/a2a/index.d.ts +30 -0
  8. package/dist/a2a/index.js +7 -0
  9. package/dist/a2a/index.js.map +1 -0
  10. package/dist/agent-UIQDSYCE.js +16 -0
  11. package/dist/agent-UIQDSYCE.js.map +1 -0
  12. package/dist/agent-builder-8W3mBR-N.d.ts +1075 -0
  13. package/dist/agent-builder-GEMYdb1p.d.cts +1075 -0
  14. package/dist/agent-graph-AMQYAWNF.js +1422 -0
  15. package/dist/agent-graph-AMQYAWNF.js.map +1 -0
  16. package/dist/ai-sdk-mcp.adapter-SEN6KHNU.js +124 -0
  17. package/dist/ai-sdk-mcp.adapter-SEN6KHNU.js.map +1 -0
  18. package/dist/browser/index.js +10 -0
  19. package/dist/browser/index.js.map +1 -0
  20. package/dist/bun-runtime.adapter-MQDAJLQM.js +8 -0
  21. package/dist/bun-runtime.adapter-MQDAJLQM.js.map +1 -0
  22. package/dist/bun-runtime.adapter-XKOUXVAK.cjs +8 -0
  23. package/dist/bun-runtime.adapter-XKOUXVAK.cjs.map +1 -0
  24. package/dist/chat-A3XMRPJL.js +129 -0
  25. package/dist/chat-A3XMRPJL.js.map +1 -0
  26. package/dist/chunk-2ZRU47NC.js +91 -0
  27. package/dist/chunk-2ZRU47NC.js.map +1 -0
  28. package/dist/chunk-3LD3JTH4.cjs +18 -0
  29. package/dist/chunk-3LD3JTH4.cjs.map +1 -0
  30. package/dist/chunk-5FE5TG2W.cjs +16 -0
  31. package/dist/chunk-5FE5TG2W.cjs.map +1 -0
  32. package/dist/chunk-6XF673YC.cjs +436 -0
  33. package/dist/chunk-6XF673YC.cjs.map +1 -0
  34. package/dist/chunk-7CKWZJNS.js +230 -0
  35. package/dist/chunk-7CKWZJNS.js.map +1 -0
  36. package/dist/chunk-BI2G665F.js +4588 -0
  37. package/dist/chunk-BI2G665F.js.map +1 -0
  38. package/dist/chunk-C5NLWJS2.js +139 -0
  39. package/dist/chunk-C5NLWJS2.js.map +1 -0
  40. package/dist/chunk-CJZ66SU3.cjs +4321 -0
  41. package/dist/chunk-CJZ66SU3.cjs.map +1 -0
  42. package/dist/chunk-DAMT2CXW.cjs +91 -0
  43. package/dist/chunk-DAMT2CXW.cjs.map +1 -0
  44. package/dist/chunk-E7WG3MO5.js +18 -0
  45. package/dist/chunk-E7WG3MO5.js.map +1 -0
  46. package/dist/chunk-EFDM6R4J.js +99 -0
  47. package/dist/chunk-EFDM6R4J.js.map +1 -0
  48. package/dist/chunk-F7WIPPEO.js +256 -0
  49. package/dist/chunk-F7WIPPEO.js.map +1 -0
  50. package/dist/chunk-FAYDE67N.js +6927 -0
  51. package/dist/chunk-FAYDE67N.js.map +1 -0
  52. package/dist/chunk-GAE2KKCM.js +21 -0
  53. package/dist/chunk-GAE2KKCM.js.map +1 -0
  54. package/dist/chunk-INLNGRXM.cjs +130 -0
  55. package/dist/chunk-INLNGRXM.cjs.map +1 -0
  56. package/dist/chunk-JKXKXB5O.js +130 -0
  57. package/dist/chunk-JKXKXB5O.js.map +1 -0
  58. package/dist/chunk-K6SAETGP.js +375 -0
  59. package/dist/chunk-K6SAETGP.js.map +1 -0
  60. package/dist/chunk-KEASLAYR.js +157 -0
  61. package/dist/chunk-KEASLAYR.js.map +1 -0
  62. package/dist/chunk-KKJVNM6O.js +436 -0
  63. package/dist/chunk-KKJVNM6O.js.map +1 -0
  64. package/dist/chunk-KYIMVRIM.js +16 -0
  65. package/dist/chunk-KYIMVRIM.js.map +1 -0
  66. package/dist/chunk-MB7NXIZD.js +4321 -0
  67. package/dist/chunk-MB7NXIZD.js.map +1 -0
  68. package/dist/chunk-MHHDXPGE.js +209 -0
  69. package/dist/chunk-MHHDXPGE.js.map +1 -0
  70. package/dist/chunk-NE6JJA5W.js +401 -0
  71. package/dist/chunk-NE6JJA5W.js.map +1 -0
  72. package/dist/chunk-PF46XZBF.cjs +6927 -0
  73. package/dist/chunk-PF46XZBF.cjs.map +1 -0
  74. package/dist/chunk-PSJIAGDE.cjs +375 -0
  75. package/dist/chunk-PSJIAGDE.cjs.map +1 -0
  76. package/dist/chunk-PWOQDXNQ.js +16 -0
  77. package/dist/chunk-PWOQDXNQ.js.map +1 -0
  78. package/dist/chunk-QYOMQBBZ.cjs +230 -0
  79. package/dist/chunk-QYOMQBBZ.cjs.map +1 -0
  80. package/dist/chunk-UDFXLC4J.cjs +16 -0
  81. package/dist/chunk-UDFXLC4J.cjs.map +1 -0
  82. package/dist/chunk-UO4NGXRT.cjs +259 -0
  83. package/dist/chunk-UO4NGXRT.cjs.map +1 -0
  84. package/dist/chunk-UPFDFLEW.js +40 -0
  85. package/dist/chunk-UPFDFLEW.js.map +1 -0
  86. package/dist/chunk-V55JSQS7.cjs +16 -0
  87. package/dist/chunk-V55JSQS7.cjs.map +1 -0
  88. package/dist/chunk-VJADHXZL.cjs +16 -0
  89. package/dist/chunk-VJADHXZL.cjs.map +1 -0
  90. package/dist/chunk-VRWD7LCI.js +59 -0
  91. package/dist/chunk-VRWD7LCI.js.map +1 -0
  92. package/dist/chunk-WKKQ443C.js +487 -0
  93. package/dist/chunk-WKKQ443C.js.map +1 -0
  94. package/dist/chunk-X2GHUHAF.js +436 -0
  95. package/dist/chunk-X2GHUHAF.js.map +1 -0
  96. package/dist/chunk-XLGW3XNI.cjs +256 -0
  97. package/dist/chunk-XLGW3XNI.cjs.map +1 -0
  98. package/dist/chunk-ZFJKX4DP.js +16 -0
  99. package/dist/chunk-ZFJKX4DP.js.map +1 -0
  100. package/dist/chunk-ZM2OEWM2.js +259 -0
  101. package/dist/chunk-ZM2OEWM2.js.map +1 -0
  102. package/dist/chunk-ZNAIP2XV.js +16 -0
  103. package/dist/chunk-ZNAIP2XV.js.map +1 -0
  104. package/dist/chunk-ZYFAZYSL.js +42 -0
  105. package/dist/chunk-ZYFAZYSL.js.map +1 -0
  106. package/dist/cli/index.js +421 -0
  107. package/dist/cli/index.js.map +1 -0
  108. package/dist/config-4MHT6TQW.js +153 -0
  109. package/dist/config-4MHT6TQW.js.map +1 -0
  110. package/dist/config-REERQFK4.cjs +153 -0
  111. package/dist/config-REERQFK4.cjs.map +1 -0
  112. package/dist/cost-tracker-JLOU7IZJ.js +7 -0
  113. package/dist/cost-tracker-JLOU7IZJ.js.map +1 -0
  114. package/dist/demo-C52GMSYH.js +188 -0
  115. package/dist/demo-C52GMSYH.js.map +1 -0
  116. package/dist/deno/index.js +306 -0
  117. package/dist/deno/index.js.map +1 -0
  118. package/dist/deno-runtime.adapter-F744HY7K.js +8 -0
  119. package/dist/deno-runtime.adapter-F744HY7K.js.map +1 -0
  120. package/dist/deno-runtime.adapter-RFEVNSCV.cjs +8 -0
  121. package/dist/deno-runtime.adapter-RFEVNSCV.cjs.map +1 -0
  122. package/dist/dev-D7DDVDA4.js +218 -0
  123. package/dist/dev-D7DDVDA4.js.map +1 -0
  124. package/dist/edge/index.js +10 -0
  125. package/dist/edge/index.js.map +1 -0
  126. package/dist/edge-runtime.adapter-UQCW2F7X.js +8 -0
  127. package/dist/edge-runtime.adapter-UQCW2F7X.js.map +1 -0
  128. package/dist/edge-runtime.adapter-YED6F3AY.cjs +8 -0
  129. package/dist/edge-runtime.adapter-YED6F3AY.cjs.map +1 -0
  130. package/dist/graph-MGFAQZ5W.js +50 -0
  131. package/dist/graph-MGFAQZ5W.js.map +1 -0
  132. package/dist/graph-visualization-HBSVQXJK.js +9 -0
  133. package/dist/graph-visualization-HBSVQXJK.js.map +1 -0
  134. package/dist/index-BRgqNnh3.d.cts +982 -0
  135. package/dist/index-CZxpYUxZ.d.ts +982 -0
  136. package/dist/index.cjs +14789 -0
  137. package/dist/index.cjs.map +1 -0
  138. package/dist/index.d.cts +10275 -0
  139. package/dist/index.d.ts +10275 -0
  140. package/dist/index.js +14789 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/init-CFWXTQ35.js +133 -0
  143. package/dist/init-CFWXTQ35.js.map +1 -0
  144. package/dist/llm-VWO4MC7J.cjs +17 -0
  145. package/dist/llm-VWO4MC7J.cjs.map +1 -0
  146. package/dist/llm-XLXVSPBI.js +17 -0
  147. package/dist/llm-XLXVSPBI.js.map +1 -0
  148. package/dist/logging-WRAK5ZXT.js +33 -0
  149. package/dist/logging-WRAK5ZXT.js.map +1 -0
  150. package/dist/metrics-FAHZVVD4.js +47 -0
  151. package/dist/metrics-FAHZVVD4.js.map +1 -0
  152. package/dist/node/index.cjs +280 -0
  153. package/dist/node/index.cjs.map +1 -0
  154. package/dist/node/index.d.cts +51 -0
  155. package/dist/node/index.d.ts +51 -0
  156. package/dist/node/index.js +280 -0
  157. package/dist/node/index.js.map +1 -0
  158. package/dist/node-runtime.adapter-5L7PJ6W2.js +8 -0
  159. package/dist/node-runtime.adapter-5L7PJ6W2.js.map +1 -0
  160. package/dist/node-runtime.adapter-CCRZVGHB.cjs +8 -0
  161. package/dist/node-runtime.adapter-CCRZVGHB.cjs.map +1 -0
  162. package/dist/persist-usage-WTBTCWEF.js +7 -0
  163. package/dist/persist-usage-WTBTCWEF.js.map +1 -0
  164. package/dist/plugin-RCPBWUUA.js +207 -0
  165. package/dist/plugin-RCPBWUUA.js.map +1 -0
  166. package/dist/plugins/index.cjs +75 -0
  167. package/dist/plugins/index.cjs.map +1 -0
  168. package/dist/plugins/index.d.cts +8 -0
  169. package/dist/plugins/index.d.ts +8 -0
  170. package/dist/plugins/index.js +75 -0
  171. package/dist/plugins/index.js.map +1 -0
  172. package/dist/plugins-L4ING3CX.js +4625 -0
  173. package/dist/plugins-L4ING3CX.js.map +1 -0
  174. package/dist/providers/index.cjs +189 -0
  175. package/dist/providers/index.cjs.map +1 -0
  176. package/dist/providers/index.d.cts +168 -0
  177. package/dist/providers/index.d.ts +168 -0
  178. package/dist/providers/index.js +189 -0
  179. package/dist/providers/index.js.map +1 -0
  180. package/dist/providers-3RNQ5CKZ.js +59 -0
  181. package/dist/providers-3RNQ5CKZ.js.map +1 -0
  182. package/dist/providers-66GPXUGQ.cjs +59 -0
  183. package/dist/providers-66GPXUGQ.cjs.map +1 -0
  184. package/dist/repl-K6QN4I2S.js +678 -0
  185. package/dist/repl-K6QN4I2S.js.map +1 -0
  186. package/dist/rest/index.cjs +17 -0
  187. package/dist/rest/index.cjs.map +1 -0
  188. package/dist/rest/index.d.cts +102 -0
  189. package/dist/rest/index.d.ts +102 -0
  190. package/dist/rest/index.js +17 -0
  191. package/dist/rest/index.js.map +1 -0
  192. package/dist/runtime-deno.js +15 -0
  193. package/dist/runtime-deno.js.map +1 -0
  194. package/dist/runtime-edge.js +15 -0
  195. package/dist/runtime-edge.js.map +1 -0
  196. package/dist/runtime-node.js +15 -0
  197. package/dist/runtime-node.js.map +1 -0
  198. package/dist/scraping/index.cjs +11 -0
  199. package/dist/scraping/index.cjs.map +1 -0
  200. package/dist/scraping/index.d.cts +17 -0
  201. package/dist/scraping/index.d.ts +17 -0
  202. package/dist/scraping/index.js +11 -0
  203. package/dist/scraping/index.js.map +1 -0
  204. package/dist/semantic-scraping.port-CZWUea88.d.cts +54 -0
  205. package/dist/semantic-scraping.port-CZWUea88.d.ts +54 -0
  206. package/dist/server/index.js +166 -0
  207. package/dist/server/index.js.map +1 -0
  208. package/dist/testing/index.cjs +25 -0
  209. package/dist/testing/index.cjs.map +1 -0
  210. package/dist/testing/index.d.cts +63 -0
  211. package/dist/testing/index.d.ts +63 -0
  212. package/dist/testing/index.js +25 -0
  213. package/dist/testing/index.js.map +1 -0
  214. package/dist/token-counter.port-CRgxZZGe.d.ts +334 -0
  215. package/dist/token-counter.port-D7BHMCRR.d.cts +334 -0
  216. package/dist/tools-BZM33OBZ.js +10 -0
  217. package/dist/tools-BZM33OBZ.js.map +1 -0
  218. package/dist/tracing-XA3TEWP4.js +48 -0
  219. package/dist/tracing-XA3TEWP4.js.map +1 -0
  220. package/dist/types-CVsP7gFI.d.cts +235 -0
  221. package/dist/types-CVsP7gFI.d.ts +235 -0
  222. package/dist/virtual-fs.adapter-BBLS-3AY.d.ts +26 -0
  223. package/dist/virtual-fs.adapter-nb0CTYOj.d.cts +26 -0
  224. package/dist/workflow/index.cjs +9 -0
  225. package/dist/workflow/index.cjs.map +1 -0
  226. package/dist/workflow/index.d.cts +62 -0
  227. package/dist/workflow/index.d.ts +62 -0
  228. package/dist/workflow/index.js +9 -0
  229. package/dist/workflow/index.js.map +1 -0
  230. package/dist/workflow.port-BaCttxrw.d.cts +153 -0
  231. package/dist/workflow.port-BaCttxrw.d.ts +153 -0
  232. package/package.json +230 -0
@@ -0,0 +1,306 @@
1
+ import {
2
+ globToRegex
3
+ } from "../chunk-UPFDFLEW.js";
4
+
5
+ // src/deno/deno-fs.adapter.ts
6
+ function getDeno() {
7
+ const d = globalThis.Deno;
8
+ if (!d) throw new Error("DenoFilesystem requires the Deno runtime");
9
+ return d;
10
+ }
11
+ function join(...parts) {
12
+ return parts.join("/").replace(/\/+/g, "/").replace(/\/$/, "") || "/";
13
+ }
14
+ function resolve(...parts) {
15
+ let resolved = "";
16
+ for (let i = parts.length - 1; i >= 0; i--) {
17
+ const segment = parts[i];
18
+ resolved = segment + (resolved ? "/" + resolved : "");
19
+ if (segment.startsWith("/")) break;
20
+ }
21
+ const segments = resolved.split("/");
22
+ const stack = [];
23
+ for (const seg of segments) {
24
+ if (seg === "..") stack.pop();
25
+ else if (seg !== "." && seg !== "") stack.push(seg);
26
+ }
27
+ return "/" + stack.join("/");
28
+ }
29
+ function relative(from, to) {
30
+ const fromParts = from.split("/").filter(Boolean);
31
+ const toParts = to.split("/").filter(Boolean);
32
+ let common = 0;
33
+ while (common < fromParts.length && common < toParts.length && fromParts[common] === toParts[common]) {
34
+ common++;
35
+ }
36
+ const ups = fromParts.length - common;
37
+ const remaining = toParts.slice(common);
38
+ const result = [...Array(ups).fill(".."), ...remaining].join("/");
39
+ return result || ".";
40
+ }
41
+ var DenoFilesystem = class {
42
+ basePath;
43
+ constructor(basePath) {
44
+ this.basePath = resolve(basePath);
45
+ }
46
+ // -- Core CRUD --------------------------------------------------------------
47
+ async read(path, zone = "transient") {
48
+ return getDeno().readTextFile(this.resolvePath(path, zone));
49
+ }
50
+ async write(path, content, zone = "transient") {
51
+ const fullPath = this.resolvePath(path, zone);
52
+ const parentDir = fullPath.substring(0, fullPath.lastIndexOf("/"));
53
+ await getDeno().mkdir(parentDir, { recursive: true });
54
+ await getDeno().writeTextFile(fullPath, content);
55
+ }
56
+ async exists(path, zone = "transient") {
57
+ try {
58
+ await getDeno().stat(this.resolvePath(path, zone));
59
+ return true;
60
+ } catch {
61
+ return false;
62
+ }
63
+ }
64
+ async delete(path, zone = "transient") {
65
+ try {
66
+ await getDeno().remove(this.resolvePath(path, zone), { recursive: true });
67
+ } catch {
68
+ }
69
+ }
70
+ // -- Listing ----------------------------------------------------------------
71
+ async list(path, options = {}, zone = "transient") {
72
+ const fullPath = this.resolvePath(path, zone);
73
+ return this.readEntries(fullPath, fullPath, options, 1);
74
+ }
75
+ // -- Stat -------------------------------------------------------------------
76
+ async stat(path, zone = "transient") {
77
+ const s = await getDeno().stat(this.resolvePath(path, zone));
78
+ return {
79
+ size: s.size,
80
+ isDirectory: s.isDirectory,
81
+ isFile: s.isFile,
82
+ createdAt: s.birthtime ? s.birthtime.getTime() : 0,
83
+ modifiedAt: s.mtime ? s.mtime.getTime() : 0
84
+ };
85
+ }
86
+ // -- Glob -------------------------------------------------------------------
87
+ async glob(pattern, zone = "transient") {
88
+ const zoneRoot = this.zoneRoot(zone);
89
+ const allFiles = await this.collectFiles(zoneRoot);
90
+ const regex = globToRegex(pattern);
91
+ return allFiles.map((f) => relative(zoneRoot, f)).filter((f) => regex.test(f));
92
+ }
93
+ // -- Search -----------------------------------------------------------------
94
+ async search(pattern, options = {}, zone = "transient") {
95
+ const deno = getDeno();
96
+ const zoneRoot = this.zoneRoot(zone);
97
+ const allFiles = await this.collectFiles(zoneRoot);
98
+ const flags = options.caseSensitive === false ? "gi" : "g";
99
+ const regex = new RegExp(pattern, flags);
100
+ const fileRegex = options.filePattern ? globToRegex(options.filePattern) : null;
101
+ const max = options.maxResults ?? Infinity;
102
+ const results = [];
103
+ for (const absPath of allFiles) {
104
+ const relPath = relative(zoneRoot, absPath);
105
+ if (fileRegex && !fileRegex.test(relPath)) continue;
106
+ const content = await deno.readTextFile(absPath);
107
+ const lines = content.split("\n");
108
+ for (let i = 0; i < lines.length && results.length < max; i++) {
109
+ regex.lastIndex = 0;
110
+ const match = regex.exec(lines[i]);
111
+ if (match) {
112
+ results.push({
113
+ filePath: relPath,
114
+ lineNumber: i + 1,
115
+ lineContent: lines[i],
116
+ matchStart: match.index,
117
+ matchEnd: match.index + match[0].length
118
+ });
119
+ }
120
+ }
121
+ if (results.length >= max) break;
122
+ }
123
+ return results;
124
+ }
125
+ // -- Private helpers --------------------------------------------------------
126
+ zoneRoot(zone) {
127
+ return join(this.basePath, zone);
128
+ }
129
+ resolvePath(path, zone) {
130
+ const zoneRoot = this.zoneRoot(zone);
131
+ const resolved = resolve(zoneRoot, path);
132
+ const rel = relative(zoneRoot, resolved);
133
+ if (rel.startsWith("..")) {
134
+ throw new Error(`Path traversal denied: ${path}`);
135
+ }
136
+ return resolved;
137
+ }
138
+ async readEntries(dir, rootDir, options, depth) {
139
+ const deno = getDeno();
140
+ const maxDepth = options.maxDepth ?? (options.recursive ? Infinity : 1);
141
+ if (depth > maxDepth) return [];
142
+ const results = [];
143
+ try {
144
+ for await (const entry of deno.readDir(dir)) {
145
+ if (!options.includeHidden && entry.name.startsWith(".")) continue;
146
+ const fullPath = join(dir, entry.name);
147
+ const relPath = relative(rootDir, fullPath);
148
+ const s = await deno.stat(fullPath);
149
+ results.push({
150
+ name: entry.name,
151
+ path: relPath,
152
+ isDirectory: entry.isDirectory,
153
+ size: s.size,
154
+ modifiedAt: s.mtime ? s.mtime.getTime() : 0
155
+ });
156
+ if (entry.isDirectory && options.recursive) {
157
+ const children = await this.readEntries(
158
+ fullPath,
159
+ rootDir,
160
+ options,
161
+ depth + 1
162
+ );
163
+ results.push(...children);
164
+ }
165
+ }
166
+ } catch {
167
+ }
168
+ return results;
169
+ }
170
+ async collectFiles(dir) {
171
+ const deno = getDeno();
172
+ const files = [];
173
+ try {
174
+ for await (const entry of deno.readDir(dir)) {
175
+ const fullPath = join(dir, entry.name);
176
+ if (entry.isDirectory) {
177
+ files.push(...await this.collectFiles(fullPath));
178
+ } else {
179
+ files.push(fullPath);
180
+ }
181
+ }
182
+ } catch {
183
+ }
184
+ return files;
185
+ }
186
+ };
187
+
188
+ // src/deno/deno-kv-memory.adapter.ts
189
+ function getDenoKv() {
190
+ const d = globalThis.Deno;
191
+ if (!d || typeof d.openKv !== "function") {
192
+ throw new Error("DenoKvMemoryAdapter requires the Deno runtime with KV support");
193
+ }
194
+ return d;
195
+ }
196
+ var PREFIX = "gauss";
197
+ function todosKey(sessionId) {
198
+ return [PREFIX, sessionId, "todos"];
199
+ }
200
+ function checkpointKey(sessionId, checkpointId) {
201
+ return [PREFIX, sessionId, "checkpoints", checkpointId];
202
+ }
203
+ function checkpointsPrefix(sessionId) {
204
+ return [PREFIX, sessionId, "checkpoints"];
205
+ }
206
+ function conversationKey(sessionId) {
207
+ return [PREFIX, sessionId, "conversation"];
208
+ }
209
+ function metadataKey(sessionId, key) {
210
+ return [PREFIX, sessionId, "metadata", key];
211
+ }
212
+ var DenoKvMemoryAdapter = class {
213
+ kvPromise = null;
214
+ kvPath;
215
+ constructor(kvPath) {
216
+ this.kvPath = kvPath;
217
+ }
218
+ async kv() {
219
+ if (!this.kvPromise) {
220
+ this.kvPromise = getDenoKv().openKv(this.kvPath).catch((err) => {
221
+ this.kvPromise = null;
222
+ throw err;
223
+ });
224
+ }
225
+ return this.kvPromise;
226
+ }
227
+ // -- Todos ------------------------------------------------------------------
228
+ async saveTodos(sessionId, todos) {
229
+ const db = await this.kv();
230
+ await db.set(todosKey(sessionId), todos);
231
+ }
232
+ async loadTodos(sessionId) {
233
+ const db = await this.kv();
234
+ const result = await db.get(todosKey(sessionId));
235
+ return result.value ?? [];
236
+ }
237
+ // -- Checkpoints ------------------------------------------------------------
238
+ async saveCheckpoint(sessionId, checkpoint) {
239
+ const db = await this.kv();
240
+ await db.set(checkpointKey(sessionId, checkpoint.id), checkpoint);
241
+ }
242
+ async loadLatestCheckpoint(sessionId) {
243
+ const all = await this.listCheckpoints(sessionId);
244
+ if (all.length === 0) return null;
245
+ all.sort((a, b) => a.createdAt - b.createdAt);
246
+ return all[all.length - 1] ?? null;
247
+ }
248
+ async listCheckpoints(sessionId) {
249
+ const db = await this.kv();
250
+ const results = [];
251
+ for await (const entry of db.list({
252
+ prefix: checkpointsPrefix(sessionId)
253
+ })) {
254
+ results.push(entry.value);
255
+ }
256
+ return results;
257
+ }
258
+ async deleteOldCheckpoints(sessionId, keepCount) {
259
+ const all = await this.listCheckpoints(sessionId);
260
+ if (all.length <= keepCount) return;
261
+ all.sort((a, b) => a.createdAt - b.createdAt);
262
+ const toDelete = all.slice(0, all.length - keepCount);
263
+ const db = await this.kv();
264
+ for (const cp of toDelete) {
265
+ await db.delete(checkpointKey(sessionId, cp.id));
266
+ }
267
+ }
268
+ // -- Conversation -----------------------------------------------------------
269
+ async saveConversation(sessionId, messages) {
270
+ const db = await this.kv();
271
+ await db.set(conversationKey(sessionId), messages);
272
+ }
273
+ async loadConversation(sessionId) {
274
+ const db = await this.kv();
275
+ const result = await db.get(conversationKey(sessionId));
276
+ return result.value ?? [];
277
+ }
278
+ // -- Metadata ---------------------------------------------------------------
279
+ async saveMetadata(sessionId, key, value) {
280
+ const db = await this.kv();
281
+ await db.set(metadataKey(sessionId, key), value);
282
+ }
283
+ async loadMetadata(sessionId, key) {
284
+ const db = await this.kv();
285
+ const result = await db.get(metadataKey(sessionId, key));
286
+ return result.value ?? null;
287
+ }
288
+ async deleteMetadata(sessionId, key) {
289
+ const db = await this.kv();
290
+ await db.delete(metadataKey(sessionId, key));
291
+ }
292
+ // -- Lifecycle --------------------------------------------------------------
293
+ /** Close the underlying KV connection */
294
+ async close() {
295
+ if (this.kvPromise) {
296
+ const db = await this.kvPromise;
297
+ db.close();
298
+ this.kvPromise = null;
299
+ }
300
+ }
301
+ };
302
+ export {
303
+ DenoFilesystem,
304
+ DenoKvMemoryAdapter
305
+ };
306
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/deno/deno-fs.adapter.ts","../../src/deno/deno-kv-memory.adapter.ts"],"sourcesContent":["// =============================================================================\n// DenoFilesystem — Sandboxed wrapper over Deno filesystem APIs\n// =============================================================================\n\nimport type { FilesystemPort } from \"../ports/filesystem.port.js\";\nimport type {\n FileEntry,\n FileStat,\n FilesystemZone,\n ListOptions,\n SearchOptions,\n SearchResult,\n} from \"../types.js\";\nimport { globToRegex } from \"../adapters/filesystem/glob-utils.js\";\n\n// -----------------------------------------------------------------------------\n// Minimal Deno API type declarations for cross-compilation\n// -----------------------------------------------------------------------------\n\ninterface DenoStatResult {\n isFile: boolean;\n isDirectory: boolean;\n size: number;\n mtime: Date | null;\n birthtime: Date | null;\n}\n\ninterface DenoDirEntry {\n name: string;\n isFile: boolean;\n isDirectory: boolean;\n isSymlink: boolean;\n}\n\ninterface DenoFsApi {\n readTextFile(path: string): Promise<string>;\n writeTextFile(path: string, content: string): Promise<void>;\n stat(path: string): Promise<DenoStatResult>;\n readDir(path: string): AsyncIterable<DenoDirEntry>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n remove(path: string, options?: { recursive?: boolean }): Promise<void>;\n}\n\nfunction getDeno(): DenoFsApi {\n const d = (globalThis as Record<string, unknown>).Deno as\n | DenoFsApi\n | undefined;\n if (!d) throw new Error(\"DenoFilesystem requires the Deno runtime\");\n return d;\n}\n\n// -----------------------------------------------------------------------------\n// Path helpers (posix-only, no node: imports)\n// -----------------------------------------------------------------------------\n\nfunction join(...parts: string[]): string {\n return parts\n .join(\"/\")\n .replace(/\\/+/g, \"/\")\n .replace(/\\/$/, \"\") || \"/\";\n}\n\nfunction resolve(...parts: string[]): string {\n let resolved = \"\";\n for (let i = parts.length - 1; i >= 0; i--) {\n const segment = parts[i]!;\n resolved = segment + (resolved ? \"/\" + resolved : \"\");\n if (segment.startsWith(\"/\")) break;\n }\n // Normalise \".\" and \"..\" segments\n const segments = resolved.split(\"/\");\n const stack: string[] = [];\n for (const seg of segments) {\n if (seg === \"..\") stack.pop();\n else if (seg !== \".\" && seg !== \"\") stack.push(seg);\n }\n return \"/\" + stack.join(\"/\");\n}\n\nfunction relative(from: string, to: string): string {\n const fromParts = from.split(\"/\").filter(Boolean);\n const toParts = to.split(\"/\").filter(Boolean);\n let common = 0;\n while (\n common < fromParts.length &&\n common < toParts.length &&\n fromParts[common] === toParts[common]\n ) {\n common++;\n }\n const ups = fromParts.length - common;\n const remaining = toParts.slice(common);\n const result = [...Array(ups).fill(\"..\"), ...remaining].join(\"/\");\n return result || \".\";\n}\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\n/**\n * Sandboxed filesystem adapter for the Deno runtime.\n * Mirrors LocalFilesystem behaviour using Deno.* namespace APIs.\n */\nexport class DenoFilesystem implements FilesystemPort {\n private readonly basePath: string;\n\n constructor(basePath: string) {\n this.basePath = resolve(basePath);\n }\n\n // -- Core CRUD --------------------------------------------------------------\n\n async read(\n path: string,\n zone: FilesystemZone = \"transient\",\n ): Promise<string> {\n return getDeno().readTextFile(this.resolvePath(path, zone));\n }\n\n async write(\n path: string,\n content: string,\n zone: FilesystemZone = \"transient\",\n ): Promise<void> {\n const fullPath = this.resolvePath(path, zone);\n const parentDir = fullPath.substring(0, fullPath.lastIndexOf(\"/\"));\n await getDeno().mkdir(parentDir, { recursive: true });\n await getDeno().writeTextFile(fullPath, content);\n }\n\n async exists(\n path: string,\n zone: FilesystemZone = \"transient\",\n ): Promise<boolean> {\n try {\n await getDeno().stat(this.resolvePath(path, zone));\n return true;\n } catch {\n return false;\n }\n }\n\n async delete(\n path: string,\n zone: FilesystemZone = \"transient\",\n ): Promise<void> {\n try {\n await getDeno().remove(this.resolvePath(path, zone), { recursive: true });\n } catch {\n // Ignore missing files (match Node rm force behaviour)\n }\n }\n\n // -- Listing ----------------------------------------------------------------\n\n async list(\n path: string,\n options: ListOptions = {},\n zone: FilesystemZone = \"transient\",\n ): Promise<FileEntry[]> {\n const fullPath = this.resolvePath(path, zone);\n return this.readEntries(fullPath, fullPath, options, 1);\n }\n\n // -- Stat -------------------------------------------------------------------\n\n async stat(\n path: string,\n zone: FilesystemZone = \"transient\",\n ): Promise<FileStat> {\n const s = await getDeno().stat(this.resolvePath(path, zone));\n return {\n size: s.size,\n isDirectory: s.isDirectory,\n isFile: s.isFile,\n createdAt: s.birthtime ? s.birthtime.getTime() : 0,\n modifiedAt: s.mtime ? s.mtime.getTime() : 0,\n };\n }\n\n // -- Glob -------------------------------------------------------------------\n\n async glob(\n pattern: string,\n zone: FilesystemZone = \"transient\",\n ): Promise<string[]> {\n const zoneRoot = this.zoneRoot(zone);\n const allFiles = await this.collectFiles(zoneRoot);\n const regex = globToRegex(pattern);\n return allFiles\n .map((f) => relative(zoneRoot, f))\n .filter((f) => regex.test(f));\n }\n\n // -- Search -----------------------------------------------------------------\n\n async search(\n pattern: string,\n options: SearchOptions = {},\n zone: FilesystemZone = \"transient\",\n ): Promise<SearchResult[]> {\n const deno = getDeno();\n const zoneRoot = this.zoneRoot(zone);\n const allFiles = await this.collectFiles(zoneRoot);\n const flags = options.caseSensitive === false ? \"gi\" : \"g\";\n const regex = new RegExp(pattern, flags);\n const fileRegex = options.filePattern\n ? globToRegex(options.filePattern)\n : null;\n const max = options.maxResults ?? Infinity;\n const results: SearchResult[] = [];\n\n for (const absPath of allFiles) {\n const relPath = relative(zoneRoot, absPath);\n if (fileRegex && !fileRegex.test(relPath)) continue;\n const content = await deno.readTextFile(absPath);\n const lines = content.split(\"\\n\");\n for (let i = 0; i < lines.length && results.length < max; i++) {\n regex.lastIndex = 0;\n const match = regex.exec(lines[i]!);\n if (match) {\n results.push({\n filePath: relPath,\n lineNumber: i + 1,\n lineContent: lines[i]!,\n matchStart: match.index,\n matchEnd: match.index + match[0].length,\n });\n }\n }\n if (results.length >= max) break;\n }\n return results;\n }\n\n // -- Private helpers --------------------------------------------------------\n\n private zoneRoot(zone: FilesystemZone): string {\n return join(this.basePath, zone);\n }\n\n private resolvePath(path: string, zone: FilesystemZone): string {\n const zoneRoot = this.zoneRoot(zone);\n const resolved = resolve(zoneRoot, path);\n const rel = relative(zoneRoot, resolved);\n if (rel.startsWith(\"..\")) {\n throw new Error(`Path traversal denied: ${path}`);\n }\n return resolved;\n }\n\n private async readEntries(\n dir: string,\n rootDir: string,\n options: ListOptions,\n depth: number,\n ): Promise<FileEntry[]> {\n const deno = getDeno();\n const maxDepth = options.maxDepth ?? (options.recursive ? Infinity : 1);\n if (depth > maxDepth) return [];\n\n const results: FileEntry[] = [];\n try {\n for await (const entry of deno.readDir(dir)) {\n if (!options.includeHidden && entry.name.startsWith(\".\")) continue;\n const fullPath = join(dir, entry.name);\n const relPath = relative(rootDir, fullPath);\n const s = await deno.stat(fullPath);\n results.push({\n name: entry.name,\n path: relPath,\n isDirectory: entry.isDirectory,\n size: s.size,\n modifiedAt: s.mtime ? s.mtime.getTime() : 0,\n });\n if (entry.isDirectory && options.recursive) {\n const children = await this.readEntries(\n fullPath,\n rootDir,\n options,\n depth + 1,\n );\n results.push(...children);\n }\n }\n } catch {\n // Directory does not exist or is unreadable\n }\n return results;\n }\n\n private async collectFiles(dir: string): Promise<string[]> {\n const deno = getDeno();\n const files: string[] = [];\n try {\n for await (const entry of deno.readDir(dir)) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory) {\n files.push(...(await this.collectFiles(fullPath)));\n } else {\n files.push(fullPath);\n }\n }\n } catch {\n // Directory does not exist or is unreadable\n }\n return files;\n }\n}\n","// =============================================================================\n// DenoKvMemoryAdapter — MemoryPort backed by Deno KV\n// =============================================================================\n\nimport type { MemoryPort } from \"../ports/memory.port.js\";\nimport type { Todo } from \"../domain/todo.schema.js\";\nimport type { Checkpoint } from \"../domain/checkpoint.schema.js\";\nimport type { Message } from \"../types.js\";\n\n// -----------------------------------------------------------------------------\n// Minimal Deno KV type declarations for cross-compilation\n// -----------------------------------------------------------------------------\n\ninterface DenoKvEntry<T> {\n key: string[];\n value: T;\n}\n\ninterface DenoKv {\n get<T>(key: string[]): Promise<{ value: T | null }>;\n set(key: string[], value: unknown): Promise<void>;\n delete(key: string[]): Promise<void>;\n list<T>(options: { prefix: string[] }): AsyncIterable<DenoKvEntry<T>>;\n close(): void;\n}\n\ninterface DenoKvApi {\n openKv(path?: string): Promise<DenoKv>;\n}\n\nfunction getDenoKv(): DenoKvApi {\n const d = (globalThis as Record<string, unknown>).Deno as\n | DenoKvApi\n | undefined;\n if (!d || typeof d.openKv !== \"function\") {\n throw new Error(\"DenoKvMemoryAdapter requires the Deno runtime with KV support\");\n }\n return d;\n}\n\n// -----------------------------------------------------------------------------\n// Key builders\n// -----------------------------------------------------------------------------\n\nconst PREFIX = \"gauss\";\n\nfunction todosKey(sessionId: string): string[] {\n return [PREFIX, sessionId, \"todos\"];\n}\n\nfunction checkpointKey(sessionId: string, checkpointId: string): string[] {\n return [PREFIX, sessionId, \"checkpoints\", checkpointId];\n}\n\nfunction checkpointsPrefix(sessionId: string): string[] {\n return [PREFIX, sessionId, \"checkpoints\"];\n}\n\nfunction conversationKey(sessionId: string): string[] {\n return [PREFIX, sessionId, \"conversation\"];\n}\n\nfunction metadataKey(sessionId: string, key: string): string[] {\n return [PREFIX, sessionId, \"metadata\", key];\n}\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\n/**\n * Persistent state adapter backed by Deno KV.\n * Optionally accepts a file path for the KV store; omit for the default store.\n */\nexport class DenoKvMemoryAdapter implements MemoryPort {\n private kvPromise: Promise<DenoKv> | null = null;\n private readonly kvPath: string | undefined;\n\n constructor(kvPath?: string) {\n this.kvPath = kvPath;\n }\n\n private async kv(): Promise<DenoKv> {\n if (!this.kvPromise) {\n this.kvPromise = getDenoKv().openKv(this.kvPath).catch((err: unknown) => {\n this.kvPromise = null;\n throw err;\n });\n }\n return this.kvPromise;\n }\n\n // -- Todos ------------------------------------------------------------------\n\n async saveTodos(sessionId: string, todos: Todo[]): Promise<void> {\n const db = await this.kv();\n await db.set(todosKey(sessionId), todos);\n }\n\n async loadTodos(sessionId: string): Promise<Todo[]> {\n const db = await this.kv();\n const result = await db.get<Todo[]>(todosKey(sessionId));\n return result.value ?? [];\n }\n\n // -- Checkpoints ------------------------------------------------------------\n\n async saveCheckpoint(\n sessionId: string,\n checkpoint: Checkpoint,\n ): Promise<void> {\n const db = await this.kv();\n await db.set(checkpointKey(sessionId, checkpoint.id), checkpoint);\n }\n\n async loadLatestCheckpoint(\n sessionId: string,\n ): Promise<Checkpoint | null> {\n const all = await this.listCheckpoints(sessionId);\n if (all.length === 0) return null;\n all.sort((a, b) => a.createdAt - b.createdAt);\n return all[all.length - 1] ?? null;\n }\n\n async listCheckpoints(sessionId: string): Promise<Checkpoint[]> {\n const db = await this.kv();\n const results: Checkpoint[] = [];\n for await (const entry of db.list<Checkpoint>({\n prefix: checkpointsPrefix(sessionId),\n })) {\n results.push(entry.value);\n }\n return results;\n }\n\n async deleteOldCheckpoints(\n sessionId: string,\n keepCount: number,\n ): Promise<void> {\n const all = await this.listCheckpoints(sessionId);\n if (all.length <= keepCount) return;\n all.sort((a, b) => a.createdAt - b.createdAt);\n const toDelete = all.slice(0, all.length - keepCount);\n const db = await this.kv();\n for (const cp of toDelete) {\n await db.delete(checkpointKey(sessionId, cp.id));\n }\n }\n\n // -- Conversation -----------------------------------------------------------\n\n async saveConversation(\n sessionId: string,\n messages: Message[],\n ): Promise<void> {\n const db = await this.kv();\n await db.set(conversationKey(sessionId), messages);\n }\n\n async loadConversation(sessionId: string): Promise<Message[]> {\n const db = await this.kv();\n const result = await db.get<Message[]>(conversationKey(sessionId));\n return result.value ?? [];\n }\n\n // -- Metadata ---------------------------------------------------------------\n\n async saveMetadata(\n sessionId: string,\n key: string,\n value: unknown,\n ): Promise<void> {\n const db = await this.kv();\n await db.set(metadataKey(sessionId, key), value);\n }\n\n async loadMetadata<T = unknown>(\n sessionId: string,\n key: string,\n ): Promise<T | null> {\n const db = await this.kv();\n const result = await db.get<T>(metadataKey(sessionId, key));\n return result.value ?? null;\n }\n\n async deleteMetadata(sessionId: string, key: string): Promise<void> {\n const db = await this.kv();\n await db.delete(metadataKey(sessionId, key));\n }\n\n // -- Lifecycle --------------------------------------------------------------\n\n /** Close the underlying KV connection */\n async close(): Promise<void> {\n if (this.kvPromise) {\n const db = await this.kvPromise;\n db.close();\n this.kvPromise = null;\n }\n }\n}\n"],"mappings":";;;;;AA2CA,SAAS,UAAqB;AAC5B,QAAM,IAAK,WAAuC;AAGlD,MAAI,CAAC,EAAG,OAAM,IAAI,MAAM,0CAA0C;AAClE,SAAO;AACT;AAMA,SAAS,QAAQ,OAAyB;AACxC,SAAO,MACJ,KAAK,GAAG,EACR,QAAQ,QAAQ,GAAG,EACnB,QAAQ,OAAO,EAAE,KAAK;AAC3B;AAEA,SAAS,WAAW,OAAyB;AAC3C,MAAI,WAAW;AACf,WAAS,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;AAC1C,UAAM,UAAU,MAAM,CAAC;AACvB,eAAW,WAAW,WAAW,MAAM,WAAW;AAClD,QAAI,QAAQ,WAAW,GAAG,EAAG;AAAA,EAC/B;AAEA,QAAM,WAAW,SAAS,MAAM,GAAG;AACnC,QAAM,QAAkB,CAAC;AACzB,aAAW,OAAO,UAAU;AAC1B,QAAI,QAAQ,KAAM,OAAM,IAAI;AAAA,aACnB,QAAQ,OAAO,QAAQ,GAAI,OAAM,KAAK,GAAG;AAAA,EACpD;AACA,SAAO,MAAM,MAAM,KAAK,GAAG;AAC7B;AAEA,SAAS,SAAS,MAAc,IAAoB;AAClD,QAAM,YAAY,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAChD,QAAM,UAAU,GAAG,MAAM,GAAG,EAAE,OAAO,OAAO;AAC5C,MAAI,SAAS;AACb,SACE,SAAS,UAAU,UACnB,SAAS,QAAQ,UACjB,UAAU,MAAM,MAAM,QAAQ,MAAM,GACpC;AACA;AAAA,EACF;AACA,QAAM,MAAM,UAAU,SAAS;AAC/B,QAAM,YAAY,QAAQ,MAAM,MAAM;AACtC,QAAM,SAAS,CAAC,GAAG,MAAM,GAAG,EAAE,KAAK,IAAI,GAAG,GAAG,SAAS,EAAE,KAAK,GAAG;AAChE,SAAO,UAAU;AACnB;AAUO,IAAM,iBAAN,MAA+C;AAAA,EACnC;AAAA,EAEjB,YAAY,UAAkB;AAC5B,SAAK,WAAW,QAAQ,QAAQ;AAAA,EAClC;AAAA;AAAA,EAIA,MAAM,KACJ,MACA,OAAuB,aACN;AACjB,WAAO,QAAQ,EAAE,aAAa,KAAK,YAAY,MAAM,IAAI,CAAC;AAAA,EAC5D;AAAA,EAEA,MAAM,MACJ,MACA,SACA,OAAuB,aACR;AACf,UAAM,WAAW,KAAK,YAAY,MAAM,IAAI;AAC5C,UAAM,YAAY,SAAS,UAAU,GAAG,SAAS,YAAY,GAAG,CAAC;AACjE,UAAM,QAAQ,EAAE,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AACpD,UAAM,QAAQ,EAAE,cAAc,UAAU,OAAO;AAAA,EACjD;AAAA,EAEA,MAAM,OACJ,MACA,OAAuB,aACL;AAClB,QAAI;AACF,YAAM,QAAQ,EAAE,KAAK,KAAK,YAAY,MAAM,IAAI,CAAC;AACjD,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,OACJ,MACA,OAAuB,aACR;AACf,QAAI;AACF,YAAM,QAAQ,EAAE,OAAO,KAAK,YAAY,MAAM,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAC1E,QAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,KACJ,MACA,UAAuB,CAAC,GACxB,OAAuB,aACD;AACtB,UAAM,WAAW,KAAK,YAAY,MAAM,IAAI;AAC5C,WAAO,KAAK,YAAY,UAAU,UAAU,SAAS,CAAC;AAAA,EACxD;AAAA;AAAA,EAIA,MAAM,KACJ,MACA,OAAuB,aACJ;AACnB,UAAM,IAAI,MAAM,QAAQ,EAAE,KAAK,KAAK,YAAY,MAAM,IAAI,CAAC;AAC3D,WAAO;AAAA,MACL,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,QAAQ,EAAE;AAAA,MACV,WAAW,EAAE,YAAY,EAAE,UAAU,QAAQ,IAAI;AAAA,MACjD,YAAY,EAAE,QAAQ,EAAE,MAAM,QAAQ,IAAI;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,KACJ,SACA,OAAuB,aACJ;AACnB,UAAM,WAAW,KAAK,SAAS,IAAI;AACnC,UAAM,WAAW,MAAM,KAAK,aAAa,QAAQ;AACjD,UAAM,QAAQ,YAAY,OAAO;AACjC,WAAO,SACJ,IAAI,CAAC,MAAM,SAAS,UAAU,CAAC,CAAC,EAChC,OAAO,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC;AAAA,EAChC;AAAA;AAAA,EAIA,MAAM,OACJ,SACA,UAAyB,CAAC,GAC1B,OAAuB,aACE;AACzB,UAAM,OAAO,QAAQ;AACrB,UAAM,WAAW,KAAK,SAAS,IAAI;AACnC,UAAM,WAAW,MAAM,KAAK,aAAa,QAAQ;AACjD,UAAM,QAAQ,QAAQ,kBAAkB,QAAQ,OAAO;AACvD,UAAM,QAAQ,IAAI,OAAO,SAAS,KAAK;AACvC,UAAM,YAAY,QAAQ,cACtB,YAAY,QAAQ,WAAW,IAC/B;AACJ,UAAM,MAAM,QAAQ,cAAc;AAClC,UAAM,UAA0B,CAAC;AAEjC,eAAW,WAAW,UAAU;AAC9B,YAAM,UAAU,SAAS,UAAU,OAAO;AAC1C,UAAI,aAAa,CAAC,UAAU,KAAK,OAAO,EAAG;AAC3C,YAAM,UAAU,MAAM,KAAK,aAAa,OAAO;AAC/C,YAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,eAAS,IAAI,GAAG,IAAI,MAAM,UAAU,QAAQ,SAAS,KAAK,KAAK;AAC7D,cAAM,YAAY;AAClB,cAAM,QAAQ,MAAM,KAAK,MAAM,CAAC,CAAE;AAClC,YAAI,OAAO;AACT,kBAAQ,KAAK;AAAA,YACX,UAAU;AAAA,YACV,YAAY,IAAI;AAAA,YAChB,aAAa,MAAM,CAAC;AAAA,YACpB,YAAY,MAAM;AAAA,YAClB,UAAU,MAAM,QAAQ,MAAM,CAAC,EAAE;AAAA,UACnC,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,QAAQ,UAAU,IAAK;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIQ,SAAS,MAA8B;AAC7C,WAAO,KAAK,KAAK,UAAU,IAAI;AAAA,EACjC;AAAA,EAEQ,YAAY,MAAc,MAA8B;AAC9D,UAAM,WAAW,KAAK,SAAS,IAAI;AACnC,UAAM,WAAW,QAAQ,UAAU,IAAI;AACvC,UAAM,MAAM,SAAS,UAAU,QAAQ;AACvC,QAAI,IAAI,WAAW,IAAI,GAAG;AACxB,YAAM,IAAI,MAAM,0BAA0B,IAAI,EAAE;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,YACZ,KACA,SACA,SACA,OACsB;AACtB,UAAM,OAAO,QAAQ;AACrB,UAAM,WAAW,QAAQ,aAAa,QAAQ,YAAY,WAAW;AACrE,QAAI,QAAQ,SAAU,QAAO,CAAC;AAE9B,UAAM,UAAuB,CAAC;AAC9B,QAAI;AACF,uBAAiB,SAAS,KAAK,QAAQ,GAAG,GAAG;AAC3C,YAAI,CAAC,QAAQ,iBAAiB,MAAM,KAAK,WAAW,GAAG,EAAG;AAC1D,cAAM,WAAW,KAAK,KAAK,MAAM,IAAI;AACrC,cAAM,UAAU,SAAS,SAAS,QAAQ;AAC1C,cAAM,IAAI,MAAM,KAAK,KAAK,QAAQ;AAClC,gBAAQ,KAAK;AAAA,UACX,MAAM,MAAM;AAAA,UACZ,MAAM;AAAA,UACN,aAAa,MAAM;AAAA,UACnB,MAAM,EAAE;AAAA,UACR,YAAY,EAAE,QAAQ,EAAE,MAAM,QAAQ,IAAI;AAAA,QAC5C,CAAC;AACD,YAAI,MAAM,eAAe,QAAQ,WAAW;AAC1C,gBAAM,WAAW,MAAM,KAAK;AAAA,YAC1B;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAQ;AAAA,UACV;AACA,kBAAQ,KAAK,GAAG,QAAQ;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,aAAa,KAAgC;AACzD,UAAM,OAAO,QAAQ;AACrB,UAAM,QAAkB,CAAC;AACzB,QAAI;AACF,uBAAiB,SAAS,KAAK,QAAQ,GAAG,GAAG;AAC3C,cAAM,WAAW,KAAK,KAAK,MAAM,IAAI;AACrC,YAAI,MAAM,aAAa;AACrB,gBAAM,KAAK,GAAI,MAAM,KAAK,aAAa,QAAQ,CAAE;AAAA,QACnD,OAAO;AACL,gBAAM,KAAK,QAAQ;AAAA,QACrB;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AACA,WAAO;AAAA,EACT;AACF;;;ACvRA,SAAS,YAAuB;AAC9B,QAAM,IAAK,WAAuC;AAGlD,MAAI,CAAC,KAAK,OAAO,EAAE,WAAW,YAAY;AACxC,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACjF;AACA,SAAO;AACT;AAMA,IAAM,SAAS;AAEf,SAAS,SAAS,WAA6B;AAC7C,SAAO,CAAC,QAAQ,WAAW,OAAO;AACpC;AAEA,SAAS,cAAc,WAAmB,cAAgC;AACxE,SAAO,CAAC,QAAQ,WAAW,eAAe,YAAY;AACxD;AAEA,SAAS,kBAAkB,WAA6B;AACtD,SAAO,CAAC,QAAQ,WAAW,aAAa;AAC1C;AAEA,SAAS,gBAAgB,WAA6B;AACpD,SAAO,CAAC,QAAQ,WAAW,cAAc;AAC3C;AAEA,SAAS,YAAY,WAAmB,KAAuB;AAC7D,SAAO,CAAC,QAAQ,WAAW,YAAY,GAAG;AAC5C;AAUO,IAAM,sBAAN,MAAgD;AAAA,EAC7C,YAAoC;AAAA,EAC3B;AAAA,EAEjB,YAAY,QAAiB;AAC3B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAc,KAAsB;AAClC,QAAI,CAAC,KAAK,WAAW;AACnB,WAAK,YAAY,UAAU,EAAE,OAAO,KAAK,MAAM,EAAE,MAAM,CAAC,QAAiB;AACvE,aAAK,YAAY;AACjB,cAAM;AAAA,MACR,CAAC;AAAA,IACH;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAIA,MAAM,UAAU,WAAmB,OAA8B;AAC/D,UAAM,KAAK,MAAM,KAAK,GAAG;AACzB,UAAM,GAAG,IAAI,SAAS,SAAS,GAAG,KAAK;AAAA,EACzC;AAAA,EAEA,MAAM,UAAU,WAAoC;AAClD,UAAM,KAAK,MAAM,KAAK,GAAG;AACzB,UAAM,SAAS,MAAM,GAAG,IAAY,SAAS,SAAS,CAAC;AACvD,WAAO,OAAO,SAAS,CAAC;AAAA,EAC1B;AAAA;AAAA,EAIA,MAAM,eACJ,WACA,YACe;AACf,UAAM,KAAK,MAAM,KAAK,GAAG;AACzB,UAAM,GAAG,IAAI,cAAc,WAAW,WAAW,EAAE,GAAG,UAAU;AAAA,EAClE;AAAA,EAEA,MAAM,qBACJ,WAC4B;AAC5B,UAAM,MAAM,MAAM,KAAK,gBAAgB,SAAS;AAChD,QAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,QAAI,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAC5C,WAAO,IAAI,IAAI,SAAS,CAAC,KAAK;AAAA,EAChC;AAAA,EAEA,MAAM,gBAAgB,WAA0C;AAC9D,UAAM,KAAK,MAAM,KAAK,GAAG;AACzB,UAAM,UAAwB,CAAC;AAC/B,qBAAiB,SAAS,GAAG,KAAiB;AAAA,MAC5C,QAAQ,kBAAkB,SAAS;AAAA,IACrC,CAAC,GAAG;AACF,cAAQ,KAAK,MAAM,KAAK;AAAA,IAC1B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,qBACJ,WACA,WACe;AACf,UAAM,MAAM,MAAM,KAAK,gBAAgB,SAAS;AAChD,QAAI,IAAI,UAAU,UAAW;AAC7B,QAAI,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAC5C,UAAM,WAAW,IAAI,MAAM,GAAG,IAAI,SAAS,SAAS;AACpD,UAAM,KAAK,MAAM,KAAK,GAAG;AACzB,eAAW,MAAM,UAAU;AACzB,YAAM,GAAG,OAAO,cAAc,WAAW,GAAG,EAAE,CAAC;AAAA,IACjD;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,iBACJ,WACA,UACe;AACf,UAAM,KAAK,MAAM,KAAK,GAAG;AACzB,UAAM,GAAG,IAAI,gBAAgB,SAAS,GAAG,QAAQ;AAAA,EACnD;AAAA,EAEA,MAAM,iBAAiB,WAAuC;AAC5D,UAAM,KAAK,MAAM,KAAK,GAAG;AACzB,UAAM,SAAS,MAAM,GAAG,IAAe,gBAAgB,SAAS,CAAC;AACjE,WAAO,OAAO,SAAS,CAAC;AAAA,EAC1B;AAAA;AAAA,EAIA,MAAM,aACJ,WACA,KACA,OACe;AACf,UAAM,KAAK,MAAM,KAAK,GAAG;AACzB,UAAM,GAAG,IAAI,YAAY,WAAW,GAAG,GAAG,KAAK;AAAA,EACjD;AAAA,EAEA,MAAM,aACJ,WACA,KACmB;AACnB,UAAM,KAAK,MAAM,KAAK,GAAG;AACzB,UAAM,SAAS,MAAM,GAAG,IAAO,YAAY,WAAW,GAAG,CAAC;AAC1D,WAAO,OAAO,SAAS;AAAA,EACzB;AAAA,EAEA,MAAM,eAAe,WAAmB,KAA4B;AAClE,UAAM,KAAK,MAAM,KAAK,GAAG;AACzB,UAAM,GAAG,OAAO,YAAY,WAAW,GAAG,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,QAAI,KAAK,WAAW;AAClB,YAAM,KAAK,MAAM,KAAK;AACtB,SAAG,MAAM;AACT,WAAK,YAAY;AAAA,IACnB;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,8 @@
1
+ import {
2
+ DenoRuntimeAdapter
3
+ } from "./chunk-ZNAIP2XV.js";
4
+ import "./chunk-E7WG3MO5.js";
5
+ export {
6
+ DenoRuntimeAdapter
7
+ };
8
+ //# sourceMappingURL=deno-runtime.adapter-F744HY7K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,8 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunkV55JSQS7cjs = require('./chunk-V55JSQS7.cjs');
4
+ require('./chunk-3LD3JTH4.cjs');
5
+
6
+
7
+ exports.DenoRuntimeAdapter = _chunkV55JSQS7cjs.DenoRuntimeAdapter;
8
+ //# sourceMappingURL=deno-runtime.adapter-RFEVNSCV.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/giulioleone/Sviluppo/gauss/gauss-flow/dist/deno-runtime.adapter-RFEVNSCV.cjs"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACF,kEAAC","file":"/Users/giulioleone/Sviluppo/gauss/gauss-flow/dist/deno-runtime.adapter-RFEVNSCV.cjs"}
@@ -0,0 +1,218 @@
1
+ import {
2
+ Agent
3
+ } from "./chunk-BI2G665F.js";
4
+ import "./chunk-ZFJKX4DP.js";
5
+ import "./chunk-PWOQDXNQ.js";
6
+ import "./chunk-X2GHUHAF.js";
7
+ import {
8
+ bold,
9
+ color,
10
+ createSpinner,
11
+ formatDuration
12
+ } from "./chunk-VRWD7LCI.js";
13
+ import "./chunk-K6SAETGP.js";
14
+ import "./chunk-KYIMVRIM.js";
15
+ import "./chunk-ZNAIP2XV.js";
16
+ import "./chunk-E7WG3MO5.js";
17
+
18
+ // src/cli/commands/dev.ts
19
+ import { createInterface } from "readline/promises";
20
+ import { stdin, stdout } from "process";
21
+
22
+ // src/agent/agent-config-loader.ts
23
+ import { readFileSync as readFileSync2 } from "fs";
24
+
25
+ // src/adapters/hot-reload/file-watcher.adapter.ts
26
+ import { readFileSync, watch } from "fs";
27
+ var DEFAULT_DEBOUNCE_MS = 300;
28
+ function validateAgentConfig(data) {
29
+ if (typeof data !== "object" || data === null) return false;
30
+ const obj = data;
31
+ if (typeof obj.name !== "string" || obj.name.length === 0) return false;
32
+ if (typeof obj.model !== "string" || obj.model.length === 0) return false;
33
+ if (obj.systemPrompt !== void 0 && typeof obj.systemPrompt !== "string") return false;
34
+ if (obj.maxSteps !== void 0 && typeof obj.maxSteps !== "number") return false;
35
+ return true;
36
+ }
37
+ var FileWatcherAdapter = class {
38
+ watcher = null;
39
+ debounceTimer = null;
40
+ debounceMs;
41
+ constructor(debounceMs = DEFAULT_DEBOUNCE_MS) {
42
+ this.debounceMs = debounceMs;
43
+ }
44
+ watch(configPath, onChange) {
45
+ this.stop();
46
+ try {
47
+ this.watcher = watch(configPath, () => {
48
+ if (this.debounceTimer) clearTimeout(this.debounceTimer);
49
+ this.debounceTimer = setTimeout(() => {
50
+ try {
51
+ const raw = readFileSync(configPath, "utf-8");
52
+ const parsed = JSON.parse(raw);
53
+ if (!validateAgentConfig(parsed)) {
54
+ console.warn(`[hot-reload] Invalid config shape in ${configPath}`);
55
+ return;
56
+ }
57
+ onChange(parsed);
58
+ } catch (err) {
59
+ console.warn(`[hot-reload] Failed to read/parse ${configPath}:`, err);
60
+ }
61
+ }, this.debounceMs);
62
+ });
63
+ } catch (err) {
64
+ console.warn(`[hot-reload] Failed to watch ${configPath}:`, err);
65
+ }
66
+ }
67
+ stop() {
68
+ if (this.debounceTimer) {
69
+ clearTimeout(this.debounceTimer);
70
+ this.debounceTimer = null;
71
+ }
72
+ if (this.watcher) {
73
+ this.watcher.close();
74
+ this.watcher = null;
75
+ }
76
+ }
77
+ };
78
+
79
+ // src/agent/agent-config-loader.ts
80
+ var AgentConfigLoader = class _AgentConfigLoader {
81
+ /**
82
+ * Creates a Agent from an AgentConfig.
83
+ * Requires a modelResolver to convert the model string to a LanguageModel instance.
84
+ */
85
+ static fromConfig(config, modelResolver) {
86
+ const builder = Agent.create({
87
+ name: config.name,
88
+ model: modelResolver(config.model),
89
+ instructions: config.systemPrompt || "You are a helpful assistant.",
90
+ maxSteps: config.maxSteps
91
+ });
92
+ return builder.build();
93
+ }
94
+ /** Reads and parses a JSON config file. */
95
+ static loadFile(path) {
96
+ const raw = readFileSync2(path, "utf-8");
97
+ const parsed = JSON.parse(raw);
98
+ _AgentConfigLoader.assertValidConfig(parsed);
99
+ return parsed;
100
+ }
101
+ /**
102
+ * Watches a config file and calls onReload with a new Agent when config changes.
103
+ * Returns the HotReloadPort so the caller can stop watching.
104
+ */
105
+ static watchAndReload(path, modelResolver, onReload) {
106
+ const watcher = new FileWatcherAdapter();
107
+ watcher.watch(path, (config) => {
108
+ const agent = _AgentConfigLoader.fromConfig(config, modelResolver);
109
+ onReload(agent);
110
+ });
111
+ return watcher;
112
+ }
113
+ static assertValidConfig(data) {
114
+ if (typeof data !== "object" || data === null) {
115
+ throw new Error("Config must be a JSON object");
116
+ }
117
+ const obj = data;
118
+ if (typeof obj.name !== "string" || obj.name.length === 0) {
119
+ throw new Error("Config 'name' is required and must be a non-empty string");
120
+ }
121
+ if (typeof obj.model !== "string" || obj.model.length === 0) {
122
+ throw new Error("Config 'model' is required and must be a non-empty string");
123
+ }
124
+ }
125
+ };
126
+
127
+ // src/cli/commands/dev.ts
128
+ async function devCommand(configPath, provider, apiKey, createModelFn) {
129
+ let config;
130
+ try {
131
+ config = AgentConfigLoader.loadFile(configPath);
132
+ } catch (err) {
133
+ const msg = err instanceof Error ? err.message : String(err);
134
+ console.error(color("red", `\u2717 Failed to load config: ${msg}`));
135
+ process.exitCode = 1;
136
+ return;
137
+ }
138
+ const modelCache = /* @__PURE__ */ new Map();
139
+ const initialModel = await createModelFn(provider, apiKey, config.model);
140
+ modelCache.set(config.model, initialModel);
141
+ const modelResolver = (modelName) => {
142
+ const cached = modelCache.get(modelName);
143
+ if (cached) return cached;
144
+ console.log(color("yellow", ` \u26A0 Model "${modelName}" not pre-cached, using initial model`));
145
+ return initialModel;
146
+ };
147
+ let agent = AgentConfigLoader.fromConfig(config, modelResolver);
148
+ console.log(bold(color("cyan", "\n \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557")));
149
+ console.log(bold(color("cyan", " \u2551 \u{1F504} Gauss Dev Mode \u2551")));
150
+ console.log(bold(color("cyan", " \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D")));
151
+ console.log(color("dim", ` Agent: ${config.name} | Watching: ${configPath}`));
152
+ console.log(color("dim", " Config changes will hot-reload automatically."));
153
+ console.log(color("dim", " Type your prompt or Ctrl+C to exit.\n"));
154
+ let watcher;
155
+ try {
156
+ watcher = AgentConfigLoader.watchAndReload(
157
+ configPath,
158
+ modelResolver,
159
+ (newAgent) => {
160
+ const old = agent;
161
+ agent = newAgent;
162
+ old.dispose().catch((err) => {
163
+ console.warn("[hot-reload] Failed to dispose old agent:", err instanceof Error ? err.message : String(err));
164
+ });
165
+ console.log(color("yellow", `
166
+ [hot-reload] Agent reloaded from ${configPath}
167
+ `));
168
+ }
169
+ );
170
+ } catch (err) {
171
+ const msg = err instanceof Error ? err.message : String(err);
172
+ console.log(color("yellow", ` \u26A0 File watcher unavailable: ${msg}`));
173
+ console.log(color("dim", " Continuing without hot-reload.\n"));
174
+ }
175
+ const rl = createInterface({ input: stdin, output: stdout });
176
+ try {
177
+ while (true) {
178
+ const input = await rl.question(color("green", "dev> "));
179
+ const trimmed = input.trim();
180
+ if (!trimmed) continue;
181
+ const startTime = Date.now();
182
+ const spinner = createSpinner("Thinking");
183
+ try {
184
+ const result = await agent.run(trimmed, {});
185
+ spinner.stop();
186
+ const response = result.text ?? "";
187
+ if (response) {
188
+ process.stdout.write(color("cyan", "\n\u{1F916} "));
189
+ process.stdout.write(response);
190
+ }
191
+ const elapsed = formatDuration(Date.now() - startTime);
192
+ process.stdout.write(color("dim", `
193
+
194
+ \u23F1 ${elapsed}
195
+
196
+ `));
197
+ } catch (err) {
198
+ spinner.stop();
199
+ const msg = err instanceof Error ? err.message : String(err);
200
+ console.error(color("red", `
201
+ \u2717 Error: ${msg}
202
+ `));
203
+ }
204
+ }
205
+ } catch (err) {
206
+ const isEof = err instanceof Error && (err.message.includes("readline was closed") || err.code === "ERR_USE_AFTER_CLOSE");
207
+ if (!isEof) throw err;
208
+ } finally {
209
+ console.log(color("dim", "\nGoodbye! \u{1F44B}\n"));
210
+ watcher?.stop();
211
+ rl.close();
212
+ await agent.dispose();
213
+ }
214
+ }
215
+ export {
216
+ devCommand
217
+ };
218
+ //# sourceMappingURL=dev-D7DDVDA4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/dev.ts","../src/agent/agent-config-loader.ts","../src/adapters/hot-reload/file-watcher.adapter.ts"],"sourcesContent":["// =============================================================================\n// CLI Dev Command — Hot-reload dev mode with interactive REPL\n// =============================================================================\n\nimport { createInterface } from \"node:readline/promises\";\nimport { stdin, stdout } from \"node:process\";\nimport type { LanguageModel } from \"../../core/llm/index.js\";\nimport { color, bold, createSpinner, formatDuration } from \"../format.js\";\nimport { AgentConfigLoader } from \"../../agent/agent-config-loader.js\";\nimport type { Agent } from \"../../agent/agent.js\";\nimport type { HotReloadPort } from \"../../ports/hot-reload.port.js\";\n\nexport async function devCommand(\n configPath: string,\n provider: string,\n apiKey: string,\n createModelFn: (provider: string, apiKey: string, model: string) => Promise<LanguageModel>,\n): Promise<void> {\n // Pre-resolve initial model; cache subsequent resolutions\n let config;\n try {\n config = AgentConfigLoader.loadFile(configPath);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(color(\"red\", `✗ Failed to load config: ${msg}`));\n process.exitCode = 1;\n return;\n }\n\n const modelCache = new Map<string, LanguageModel>();\n const initialModel = await createModelFn(provider, apiKey, config.model);\n modelCache.set(config.model, initialModel);\n\n const modelResolver = (modelName: string): LanguageModel => {\n const cached = modelCache.get(modelName);\n if (cached) return cached;\n // For hot-reload model changes, warn and use initial model\n console.log(color(\"yellow\", ` ⚠ Model \"${modelName}\" not pre-cached, using initial model`));\n return initialModel;\n };\n\n let agent: Agent = AgentConfigLoader.fromConfig(config, modelResolver);\n\n console.log(bold(color(\"cyan\", \"\\n ╔══════════════════════════════════════╗\")));\n console.log(bold(color(\"cyan\", \" ║ 🔄 Gauss Dev Mode ║\")));\n console.log(bold(color(\"cyan\", \" ╚══════════════════════════════════════╝\")));\n console.log(color(\"dim\", ` Agent: ${config.name} | Watching: ${configPath}`));\n console.log(color(\"dim\", \" Config changes will hot-reload automatically.\"));\n console.log(color(\"dim\", \" Type your prompt or Ctrl+C to exit.\\n\"));\n\n let watcher: HotReloadPort | undefined;\n try {\n watcher = AgentConfigLoader.watchAndReload(\n configPath,\n modelResolver,\n (newAgent) => {\n const old = agent;\n agent = newAgent;\n // fire-and-forget: old agent disposal must not block hot-reload\n old.dispose().catch((err: unknown) => {\n console.warn(\"[hot-reload] Failed to dispose old agent:\", err instanceof Error ? err.message : String(err));\n });\n console.log(color(\"yellow\", `\\n[hot-reload] Agent reloaded from ${configPath}\\n`));\n },\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.log(color(\"yellow\", ` ⚠ File watcher unavailable: ${msg}`));\n console.log(color(\"dim\", \" Continuing without hot-reload.\\n\"));\n }\n\n const rl = createInterface({ input: stdin, output: stdout });\n\n try {\n while (true) {\n const input = await rl.question(color(\"green\", \"dev> \"));\n const trimmed = input.trim();\n if (!trimmed) continue;\n\n const startTime = Date.now();\n const spinner = createSpinner(\"Thinking\");\n\n try {\n const result = await agent.run(trimmed, {});\n spinner.stop();\n\n const response = result.text ?? \"\";\n if (response) {\n process.stdout.write(color(\"cyan\", \"\\n🤖 \"));\n process.stdout.write(response);\n }\n\n const elapsed = formatDuration(Date.now() - startTime);\n process.stdout.write(color(\"dim\", `\\n\\n ⏱ ${elapsed}\\n\\n`));\n } catch (err) {\n spinner.stop();\n const msg = err instanceof Error ? err.message : String(err);\n console.error(color(\"red\", `\\n✗ Error: ${msg}\\n`));\n }\n }\n } catch (err: unknown) {\n const isEof =\n err instanceof Error &&\n (err.message.includes(\"readline was closed\") ||\n (err as NodeJS.ErrnoException).code === \"ERR_USE_AFTER_CLOSE\");\n if (!isEof) throw err;\n } finally {\n console.log(color(\"dim\", \"\\nGoodbye! 👋\\n\"));\n watcher?.stop();\n rl.close();\n await agent.dispose();\n }\n}\n","// =============================================================================\n// AgentConfigLoader — Load and hot-reload Agent from config files\n// =============================================================================\n\nimport { readFileSync } from \"node:fs\";\nimport type { LanguageModel } from \"../core/llm/index.js\";\nimport type { HotReloadAgentConfig as AgentConfig, HotReloadPort } from \"../ports/hot-reload.port.js\";\nimport { FileWatcherAdapter } from \"../adapters/hot-reload/file-watcher.adapter.js\";\nimport { Agent } from \"./agent.js\";\n\nexport interface ModelResolver {\n (modelName: string): LanguageModel;\n}\n\nexport class AgentConfigLoader {\n /**\n * Creates a Agent from an AgentConfig.\n * Requires a modelResolver to convert the model string to a LanguageModel instance.\n */\n static fromConfig(config: AgentConfig, modelResolver: ModelResolver): Agent {\n const builder = Agent.create({\n name: config.name,\n model: modelResolver(config.model),\n instructions: config.systemPrompt || \"You are a helpful assistant.\",\n maxSteps: config.maxSteps,\n });\n\n return builder.build();\n }\n\n /** Reads and parses a JSON config file. */\n static loadFile(path: string): AgentConfig {\n const raw = readFileSync(path, \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n AgentConfigLoader.assertValidConfig(parsed);\n return parsed;\n }\n\n /**\n * Watches a config file and calls onReload with a new Agent when config changes.\n * Returns the HotReloadPort so the caller can stop watching.\n */\n static watchAndReload(\n path: string,\n modelResolver: ModelResolver,\n onReload: (agent: Agent) => void,\n ): HotReloadPort {\n const watcher = new FileWatcherAdapter();\n watcher.watch(path, (config) => {\n const agent = AgentConfigLoader.fromConfig(config, modelResolver);\n onReload(agent);\n });\n return watcher;\n }\n\n private static assertValidConfig(data: unknown): asserts data is AgentConfig {\n if (typeof data !== \"object\" || data === null) {\n throw new Error(\"Config must be a JSON object\");\n }\n const obj = data as Record<string, unknown>;\n if (typeof obj.name !== \"string\" || obj.name.length === 0) {\n throw new Error(\"Config 'name' is required and must be a non-empty string\");\n }\n if (typeof obj.model !== \"string\" || obj.model.length === 0) {\n throw new Error(\"Config 'model' is required and must be a non-empty string\");\n }\n }\n}\n","// =============================================================================\n// FileWatcherAdapter — Watches JSON config files for hot-reload\n// =============================================================================\n\nimport { readFileSync, watch, type FSWatcher } from \"node:fs\";\nimport type { HotReloadPort, HotReloadAgentConfig as AgentConfig } from \"../../ports/hot-reload.port.js\";\n\n/** Default debounce interval for file-change events in ms */\nconst DEFAULT_DEBOUNCE_MS = 300;\n\nfunction validateAgentConfig(data: unknown): data is AgentConfig {\n if (typeof data !== \"object\" || data === null) return false;\n const obj = data as Record<string, unknown>;\n if (typeof obj.name !== \"string\" || obj.name.length === 0) return false;\n if (typeof obj.model !== \"string\" || obj.model.length === 0) return false;\n if (obj.systemPrompt !== undefined && typeof obj.systemPrompt !== \"string\") return false;\n if (obj.maxSteps !== undefined && typeof obj.maxSteps !== \"number\") return false;\n return true;\n}\n\nexport class FileWatcherAdapter implements HotReloadPort {\n private watcher: FSWatcher | null = null;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly debounceMs: number;\n\n constructor(debounceMs = DEFAULT_DEBOUNCE_MS) {\n this.debounceMs = debounceMs;\n }\n\n watch(configPath: string, onChange: (config: AgentConfig) => void): void {\n this.stop();\n\n try {\n this.watcher = watch(configPath, () => {\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => {\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n if (!validateAgentConfig(parsed)) {\n console.warn(`[hot-reload] Invalid config shape in ${configPath}`);\n return;\n }\n onChange(parsed);\n } catch (err) {\n console.warn(`[hot-reload] Failed to read/parse ${configPath}:`, err);\n }\n }, this.debounceMs);\n });\n } catch (err) {\n console.warn(`[hot-reload] Failed to watch ${configPath}:`, err);\n }\n }\n\n stop(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n if (this.watcher) {\n this.watcher.close();\n this.watcher = null;\n }\n }\n}\n"],"mappings":"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","names":["readFileSync","readFileSync"]}
@@ -0,0 +1,10 @@
1
+ import {
2
+ IndexedDbMemoryAdapter,
3
+ OpfsFilesystem
4
+ } from "../chunk-NE6JJA5W.js";
5
+ import "../chunk-UPFDFLEW.js";
6
+ export {
7
+ IndexedDbMemoryAdapter,
8
+ OpfsFilesystem
9
+ };
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,8 @@
1
+ import {
2
+ EdgeRuntimeAdapter
3
+ } from "./chunk-PWOQDXNQ.js";
4
+ import "./chunk-E7WG3MO5.js";
5
+ export {
6
+ EdgeRuntimeAdapter
7
+ };
8
+ //# sourceMappingURL=edge-runtime.adapter-UQCW2F7X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}