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,375 @@
1
+ // src/core/llm/tool.ts
2
+ function tool(config) {
3
+ return {
4
+ type: "function",
5
+ description: config.description,
6
+ parameters: config.inputSchema,
7
+ execute: config.execute
8
+ };
9
+ }
10
+
11
+ // src/core/llm/generate-text.ts
12
+ function zodToJsonSchema(schema) {
13
+ if (!schema) return {};
14
+ const s = schema;
15
+ if (s._def?.typeName === "ZodObject" && s.shape) {
16
+ const shape = typeof s.shape === "function" ? s.shape() : s.shape;
17
+ const properties = {};
18
+ const required = [];
19
+ for (const [key, val] of Object.entries(shape)) {
20
+ const zodField = val;
21
+ properties[key] = { type: "string" };
22
+ if (zodField._def?.typeName === "ZodString") properties[key] = { type: "string" };
23
+ else if (zodField._def?.typeName === "ZodNumber") properties[key] = { type: "number" };
24
+ else if (zodField._def?.typeName === "ZodBoolean") properties[key] = { type: "boolean" };
25
+ else if (zodField._def?.typeName === "ZodArray") properties[key] = { type: "array" };
26
+ if (zodField._def?.description) properties[key].description = zodField._def.description;
27
+ if (typeof zodField.isOptional !== "function" || !zodField.isOptional()) {
28
+ required.push(key);
29
+ }
30
+ }
31
+ return { type: "object", properties, ...required.length > 0 ? { required } : {} };
32
+ }
33
+ return { type: "object" };
34
+ }
35
+ function toolsToLanguageModelTools(tools) {
36
+ return Object.entries(tools).map(([name, def]) => ({
37
+ type: "function",
38
+ name,
39
+ description: def.description,
40
+ parameters: zodToJsonSchema(def.parameters)
41
+ }));
42
+ }
43
+ function buildMessages(options) {
44
+ const msgs = [];
45
+ if (options.system) {
46
+ msgs.push({ role: "system", content: options.system });
47
+ }
48
+ if (options.messages) {
49
+ msgs.push(...options.messages);
50
+ }
51
+ if (options.prompt) {
52
+ msgs.push({ role: "user", content: options.prompt });
53
+ }
54
+ return msgs;
55
+ }
56
+ async function executeTools(toolCalls, tools, abortSignal) {
57
+ const results = [];
58
+ for (const call of toolCalls) {
59
+ const toolDef = tools[call.toolName];
60
+ if (!toolDef?.execute) {
61
+ break;
62
+ }
63
+ try {
64
+ const args = typeof call.args === "string" ? JSON.parse(call.args) : call.args;
65
+ const result = await toolDef.execute(args, { abortSignal, toolCallId: call.toolCallId });
66
+ results.push({
67
+ toolCallId: call.toolCallId,
68
+ toolName: call.toolName,
69
+ result
70
+ });
71
+ } catch (err) {
72
+ results.push({
73
+ toolCallId: call.toolCallId,
74
+ toolName: call.toolName,
75
+ result: String(err),
76
+ isError: true
77
+ });
78
+ }
79
+ }
80
+ return results;
81
+ }
82
+ async function generateText(options) {
83
+ const { model, tools, stopWhen, maxSteps, abortSignal, onStepFinish, onFinish } = options;
84
+ const lmTools = tools ? toolsToLanguageModelTools(tools) : void 0;
85
+ const messages = buildMessages(options);
86
+ const steps = [];
87
+ const totalUsage = { inputTokens: 0, outputTokens: 0 };
88
+ const stopConditions = [];
89
+ if (stopWhen) {
90
+ if (Array.isArray(stopWhen)) stopConditions.push(...stopWhen);
91
+ else stopConditions.push(stopWhen);
92
+ }
93
+ if (maxSteps && stopConditions.length === 0) {
94
+ stopConditions.push(({ steps: s }) => s.length >= maxSteps);
95
+ }
96
+ if (stopConditions.length === 0) {
97
+ stopConditions.push(({ steps: s }) => s.length >= 20);
98
+ }
99
+ let lastText = "";
100
+ let lastFinishReason = "stop";
101
+ let lastToolCalls = [];
102
+ let lastToolResults = [];
103
+ let lastResponse;
104
+ while (true) {
105
+ const mode = lmTools && lmTools.length > 0 ? { type: "regular", tools: lmTools, toolChoice: options.toolChoice } : options.output ? { type: "object-json", schema: zodToJsonSchema(options.output.schema) } : { type: "regular" };
106
+ const result = await model.doGenerate({
107
+ inputFormat: "messages",
108
+ mode,
109
+ prompt: messages,
110
+ abortSignal
111
+ });
112
+ totalUsage.inputTokens += result.usage.inputTokens;
113
+ totalUsage.outputTokens += result.usage.outputTokens;
114
+ lastText = result.text ?? "";
115
+ lastFinishReason = result.finishReason;
116
+ lastToolCalls = result.toolCalls ?? [];
117
+ lastResponse = result.response;
118
+ if (lastFinishReason === "tool-calls" && lastToolCalls.length > 0 && tools) {
119
+ lastToolResults = await executeTools(lastToolCalls, tools, abortSignal);
120
+ const toolCallParts = lastToolCalls.map((tc) => ({
121
+ type: "tool-call",
122
+ toolCallType: "function",
123
+ toolCallId: tc.toolCallId,
124
+ toolName: tc.toolName,
125
+ args: tc.args
126
+ }));
127
+ messages.push({ role: "assistant", content: lastText ? [{ type: "text", text: lastText }, ...toolCallParts] : toolCallParts });
128
+ const toolResultParts = lastToolResults.map((tr) => ({
129
+ type: "tool-result",
130
+ toolCallId: tr.toolCallId,
131
+ toolName: tr.toolName,
132
+ result: tr.result,
133
+ isError: tr.isError
134
+ }));
135
+ messages.push({ role: "tool", content: toolResultParts });
136
+ } else {
137
+ lastToolResults = [];
138
+ }
139
+ const step = {
140
+ text: lastText,
141
+ toolCalls: lastToolCalls.map((tc) => ({
142
+ toolCallType: "function",
143
+ toolCallId: tc.toolCallId,
144
+ toolName: tc.toolName,
145
+ args: typeof tc.args === "string" ? JSON.parse(tc.args) : tc.args
146
+ })),
147
+ toolResults: lastToolResults,
148
+ finishReason: lastFinishReason,
149
+ usage: { ...result.usage },
150
+ response: lastResponse
151
+ };
152
+ steps.push(step);
153
+ if (onStepFinish) await onStepFinish(step);
154
+ const shouldStop = await Promise.all(
155
+ stopConditions.map((cond) => cond({ steps }))
156
+ );
157
+ if (shouldStop.some(Boolean)) break;
158
+ if (lastFinishReason !== "tool-calls" || lastToolCalls.length === 0) break;
159
+ const hasUnexecutableTool = lastToolCalls.some((tc) => !tools[tc.toolName]?.execute);
160
+ if (hasUnexecutableTool) break;
161
+ }
162
+ const finalResult = {
163
+ text: lastText,
164
+ toolCalls: lastToolCalls.map((tc) => ({
165
+ toolCallType: "function",
166
+ toolCallId: tc.toolCallId,
167
+ toolName: tc.toolName,
168
+ args: typeof tc.args === "string" ? JSON.parse(tc.args) : tc.args
169
+ })),
170
+ toolResults: lastToolResults,
171
+ finishReason: lastFinishReason,
172
+ usage: totalUsage,
173
+ steps,
174
+ response: lastResponse
175
+ };
176
+ if (onFinish) await onFinish(finalResult);
177
+ return finalResult;
178
+ }
179
+
180
+ // src/core/llm/stream-text.ts
181
+ function zodToJsonSchema2(schema) {
182
+ if (!schema) return {};
183
+ const s = schema;
184
+ if (s._def?.typeName === "ZodObject" && s.shape) {
185
+ const shape = typeof s.shape === "function" ? s.shape() : s.shape;
186
+ const properties = {};
187
+ const required = [];
188
+ for (const [key, val] of Object.entries(shape)) {
189
+ const f = val;
190
+ properties[key] = { type: "string" };
191
+ if (f._def?.typeName === "ZodString") properties[key] = { type: "string" };
192
+ else if (f._def?.typeName === "ZodNumber") properties[key] = { type: "number" };
193
+ else if (f._def?.typeName === "ZodBoolean") properties[key] = { type: "boolean" };
194
+ else if (f._def?.typeName === "ZodArray") properties[key] = { type: "array" };
195
+ if (f._def?.description) properties[key].description = f._def.description;
196
+ if (typeof f.isOptional !== "function" || !f.isOptional()) required.push(key);
197
+ }
198
+ return { type: "object", properties, ...required.length > 0 ? { required } : {} };
199
+ }
200
+ return { type: "object" };
201
+ }
202
+ function toolsToLanguageModelTools2(tools) {
203
+ return Object.entries(tools).map(([name, def]) => ({
204
+ type: "function",
205
+ name,
206
+ description: def.description,
207
+ parameters: zodToJsonSchema2(def.parameters)
208
+ }));
209
+ }
210
+ function buildMessages2(options) {
211
+ const msgs = [];
212
+ if (options.system) msgs.push({ role: "system", content: options.system });
213
+ if (options.messages) msgs.push(...options.messages);
214
+ if (options.prompt) msgs.push({ role: "user", content: options.prompt });
215
+ return msgs;
216
+ }
217
+ function streamText(options) {
218
+ const { model, tools, abortSignal } = options;
219
+ const lmTools = tools ? toolsToLanguageModelTools2(tools) : void 0;
220
+ const messages = buildMessages2(options);
221
+ let resolveText;
222
+ let resolveUsage;
223
+ let resolveFinish;
224
+ let resolveToolCalls;
225
+ let resolveToolResults;
226
+ let resolveSteps;
227
+ const textPromise = new Promise((r) => {
228
+ resolveText = r;
229
+ });
230
+ const usagePromise = new Promise((r) => {
231
+ resolveUsage = r;
232
+ });
233
+ const finishPromise = new Promise((r) => {
234
+ resolveFinish = r;
235
+ });
236
+ const toolCallsPromise = new Promise((r) => {
237
+ resolveToolCalls = r;
238
+ });
239
+ const toolResultsPromise = new Promise((r) => {
240
+ resolveToolResults = r;
241
+ });
242
+ const stepsPromise = new Promise((r) => {
243
+ resolveSteps = r;
244
+ });
245
+ const fullStream = new ReadableStream({
246
+ async start(controller) {
247
+ try {
248
+ const mode = lmTools && lmTools.length > 0 ? { type: "regular", tools: lmTools } : { type: "regular" };
249
+ const result = await model.doStream({
250
+ inputFormat: "messages",
251
+ mode,
252
+ prompt: messages,
253
+ abortSignal
254
+ });
255
+ const reader = result.stream.getReader();
256
+ let fullText = "";
257
+ const allToolCalls = [];
258
+ const totalUsage = { inputTokens: 0, outputTokens: 0 };
259
+ let lastFinish = "stop";
260
+ while (true) {
261
+ const { done, value } = await reader.read();
262
+ if (done) break;
263
+ const part = value;
264
+ controller.enqueue(part);
265
+ if (part.type === "text-delta") {
266
+ fullText += part.textDelta;
267
+ } else if (part.type === "tool-call") {
268
+ allToolCalls.push({
269
+ toolCallType: "function",
270
+ toolCallId: part.toolCallId,
271
+ toolName: part.toolName,
272
+ args: part.args
273
+ });
274
+ } else if (part.type === "finish") {
275
+ lastFinish = part.finishReason;
276
+ totalUsage.inputTokens += part.usage.inputTokens;
277
+ totalUsage.outputTokens += part.usage.outputTokens;
278
+ }
279
+ }
280
+ let toolResults = [];
281
+ if (allToolCalls.length > 0 && tools) {
282
+ for (const call of allToolCalls) {
283
+ const toolDef = tools[call.toolName];
284
+ if (toolDef?.execute) {
285
+ try {
286
+ const args = typeof call.args === "string" ? JSON.parse(call.args) : call.args;
287
+ const result2 = await toolDef.execute(args, { abortSignal, toolCallId: call.toolCallId });
288
+ toolResults.push({ toolCallId: call.toolCallId, toolName: call.toolName, result: result2 });
289
+ } catch (err) {
290
+ toolResults.push({ toolCallId: call.toolCallId, toolName: call.toolName, result: String(err), isError: true });
291
+ }
292
+ }
293
+ }
294
+ }
295
+ const step = {
296
+ text: fullText,
297
+ toolCalls: allToolCalls.map((tc) => ({
298
+ toolCallType: "function",
299
+ toolCallId: tc.toolCallId,
300
+ toolName: tc.toolName,
301
+ args: typeof tc.args === "string" ? JSON.parse(tc.args) : tc.args
302
+ })),
303
+ toolResults,
304
+ finishReason: lastFinish,
305
+ usage: totalUsage
306
+ };
307
+ resolveText(fullText);
308
+ resolveUsage(totalUsage);
309
+ resolveFinish(lastFinish);
310
+ resolveToolCalls(step.toolCalls);
311
+ resolveToolResults(toolResults);
312
+ resolveSteps([step]);
313
+ if (options.onStepFinish) await options.onStepFinish(step);
314
+ if (options.onFinish) await options.onFinish({ text: fullText, usage: totalUsage, finishReason: lastFinish });
315
+ controller.close();
316
+ } catch (err) {
317
+ controller.error(err);
318
+ }
319
+ }
320
+ });
321
+ const textStream = new ReadableStream({
322
+ async start(controller) {
323
+ const reader = fullStream.getReader();
324
+ try {
325
+ while (true) {
326
+ const { done, value } = await reader.read();
327
+ if (done) break;
328
+ if (value.type === "text-delta") {
329
+ controller.enqueue(value.textDelta);
330
+ }
331
+ }
332
+ controller.close();
333
+ } catch (err) {
334
+ controller.error(err);
335
+ }
336
+ }
337
+ });
338
+ return {
339
+ textStream,
340
+ fullStream,
341
+ text: textPromise,
342
+ toolCalls: toolCallsPromise,
343
+ toolResults: toolResultsPromise,
344
+ finishReason: finishPromise,
345
+ usage: usagePromise,
346
+ steps: stepsPromise
347
+ };
348
+ }
349
+
350
+ // src/core/llm/stop-conditions.ts
351
+ function stepCountIs(count) {
352
+ return ({ steps }) => steps.length >= count;
353
+ }
354
+ function hasToolCall(toolName) {
355
+ return ({ steps }) => steps[steps.length - 1]?.toolCalls?.some(
356
+ (tc) => tc.toolName === toolName
357
+ ) ?? false;
358
+ }
359
+
360
+ // src/core/llm/output.ts
361
+ var Output = {
362
+ object(config) {
363
+ return { type: "object", schema: config.schema };
364
+ }
365
+ };
366
+
367
+ export {
368
+ tool,
369
+ generateText,
370
+ streamText,
371
+ stepCountIs,
372
+ hasToolCall,
373
+ Output
374
+ };
375
+ //# sourceMappingURL=chunk-K6SAETGP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/llm/tool.ts","../src/core/llm/generate-text.ts","../src/core/llm/stream-text.ts","../src/core/llm/stop-conditions.ts","../src/core/llm/output.ts"],"sourcesContent":["// =============================================================================\n// Gauss LLM Core — Tool Factory\n// Creates tool definitions with Zod schema validation.\n// =============================================================================\n\nimport { z, type ZodType } from \"zod\";\nimport type { Tool, ToolExecuteOptions } from \"./types.js\";\n\nexport interface ToolConfig<PARAMS extends z.ZodTypeAny = z.ZodTypeAny, RESULT = unknown> {\n description?: string;\n inputSchema: PARAMS;\n execute?: (args: z.infer<PARAMS>, options?: ToolExecuteOptions) => Promise<RESULT>;\n}\n\n/**\n * Creates a typed tool definition from a Zod schema.\n *\n * @example\n * ```ts\n * import { tool } from \"gauss\";\n * import { z } from \"zod\";\n *\n * const weatherTool = tool({\n * description: \"Get weather for a location\",\n * inputSchema: z.object({ city: z.string() }),\n * execute: async ({ city }) => ({ temp: 72, city }),\n * });\n * ```\n */\nexport function tool<PARAMS extends z.ZodTypeAny, RESULT = unknown>(\n config: ToolConfig<PARAMS, RESULT>,\n): Tool<z.infer<PARAMS>, RESULT> {\n return {\n type: \"function\",\n description: config.description,\n parameters: config.inputSchema as unknown as ZodType<z.infer<PARAMS>>,\n execute: config.execute,\n };\n}\n","// =============================================================================\n// Gauss LLM Core — generateText\n// Multi-step tool-loop text generation. Zero external dependencies.\n// =============================================================================\n\nimport type {\n LanguageModel,\n LanguageModelTool,\n ToolSet,\n StepResult,\n ToolCall,\n ToolResult,\n TokenUsage,\n GenerateTextResult,\n FinishReason,\n CoreMessage,\n ToolChoice,\n} from \"./types.js\";\nimport type { StopCondition } from \"./stop-conditions.js\";\nimport type { OutputSpec } from \"./output.js\";\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface GenerateTextOptions<TOOLS extends ToolSet = ToolSet> {\n model: LanguageModel;\n prompt?: string;\n messages?: CoreMessage[];\n system?: string;\n tools?: TOOLS;\n toolChoice?: ToolChoice;\n stopWhen?: StopCondition<TOOLS> | Array<StopCondition<TOOLS>>;\n maxSteps?: number;\n output?: OutputSpec;\n temperature?: number;\n maxTokens?: number;\n abortSignal?: AbortSignal;\n onStepFinish?: (event: StepResult<TOOLS>) => void | Promise<void>;\n onFinish?: (event: GenerateTextResult<TOOLS>) => void | Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction zodToJsonSchema(schema: unknown): Record<string, unknown> {\n if (!schema) return {};\n // Zod v3/v4 interop: try _def.typeName, then JSON serialization\n const s = schema as { _def?: { typeName?: string }; shape?: unknown };\n if (s._def?.typeName === \"ZodObject\" && s.shape) {\n const shape = typeof s.shape === \"function\" ? (s.shape as () => Record<string, unknown>)() : s.shape as Record<string, unknown>;\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [key, val] of Object.entries(shape)) {\n const zodField = val as { _def?: { typeName?: string; description?: string }; isOptional?: () => boolean };\n properties[key] = { type: \"string\" };\n if (zodField._def?.typeName === \"ZodString\") properties[key] = { type: \"string\" };\n else if (zodField._def?.typeName === \"ZodNumber\") properties[key] = { type: \"number\" };\n else if (zodField._def?.typeName === \"ZodBoolean\") properties[key] = { type: \"boolean\" };\n else if (zodField._def?.typeName === \"ZodArray\") properties[key] = { type: \"array\" };\n if (zodField._def?.description) (properties[key] as Record<string, unknown>).description = zodField._def.description;\n if (typeof zodField.isOptional !== \"function\" || !zodField.isOptional()) {\n required.push(key);\n }\n }\n return { type: \"object\", properties, ...(required.length > 0 ? { required } : {}) };\n }\n // Fallback: if Zod exposes a .jsonSchema or similar\n return { type: \"object\" };\n}\n\nfunction toolsToLanguageModelTools(tools: ToolSet): LanguageModelTool[] {\n return Object.entries(tools).map(([name, def]) => ({\n type: \"function\" as const,\n name,\n description: def.description,\n parameters: zodToJsonSchema(def.parameters),\n }));\n}\n\nfunction buildMessages(options: GenerateTextOptions): CoreMessage[] {\n const msgs: CoreMessage[] = [];\n if (options.system) {\n msgs.push({ role: \"system\", content: options.system });\n }\n if (options.messages) {\n msgs.push(...options.messages);\n }\n if (options.prompt) {\n msgs.push({ role: \"user\", content: options.prompt });\n }\n return msgs;\n}\n\nasync function executeTools(\n toolCalls: ToolCall[],\n tools: ToolSet,\n abortSignal?: AbortSignal,\n): Promise<ToolResult[]> {\n const results: ToolResult[] = [];\n for (const call of toolCalls) {\n const toolDef = tools[call.toolName];\n if (!toolDef?.execute) {\n // Tool without execute — requires human approval or external handling\n break;\n }\n try {\n const args = typeof call.args === \"string\" ? JSON.parse(call.args) : call.args;\n const result = await toolDef.execute(args, { abortSignal, toolCallId: call.toolCallId });\n results.push({\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n result,\n });\n } catch (err) {\n results.push({\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n result: String(err),\n isError: true,\n });\n }\n }\n return results;\n}\n\n// ---------------------------------------------------------------------------\n// generateText\n// ---------------------------------------------------------------------------\n\n/**\n * Generate text with optional multi-step tool loop.\n * Calls the model, executes tool calls, feeds results back until done.\n */\nexport async function generateText<TOOLS extends ToolSet = ToolSet>(\n options: GenerateTextOptions<TOOLS>,\n): Promise<GenerateTextResult<TOOLS>> {\n const { model, tools, stopWhen, maxSteps, abortSignal, onStepFinish, onFinish } = options;\n const lmTools = tools ? toolsToLanguageModelTools(tools as ToolSet) : undefined;\n\n const messages = buildMessages(options);\n const steps: StepResult<TOOLS>[] = [];\n const totalUsage: TokenUsage = { inputTokens: 0, outputTokens: 0 };\n\n const stopConditions: Array<StopCondition<ToolSet>> = [];\n if (stopWhen) {\n if (Array.isArray(stopWhen)) stopConditions.push(...(stopWhen as StopCondition<ToolSet>[]));\n else stopConditions.push(stopWhen as StopCondition<ToolSet>);\n }\n if (maxSteps && stopConditions.length === 0) {\n stopConditions.push(({ steps: s }) => s.length >= maxSteps);\n }\n // Default: max 20 steps\n if (stopConditions.length === 0) {\n stopConditions.push(({ steps: s }) => s.length >= 20);\n }\n\n let lastText = \"\";\n let lastFinishReason: FinishReason = \"stop\";\n let lastToolCalls: ToolCall[] = [];\n let lastToolResults: ToolResult[] = [];\n let lastResponse: StepResult<TOOLS>[\"response\"];\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n // Build mode\n const mode = lmTools && lmTools.length > 0\n ? { type: \"regular\" as const, tools: lmTools, toolChoice: options.toolChoice }\n : options.output\n ? { type: \"object-json\" as const, schema: zodToJsonSchema(options.output.schema) }\n : { type: \"regular\" as const };\n\n const result = await model.doGenerate({\n inputFormat: \"messages\",\n mode,\n prompt: messages,\n abortSignal,\n });\n\n totalUsage.inputTokens += result.usage.inputTokens;\n totalUsage.outputTokens += result.usage.outputTokens;\n\n lastText = result.text ?? \"\";\n lastFinishReason = result.finishReason;\n lastToolCalls = result.toolCalls ?? [];\n lastResponse = result.response;\n\n // Execute tool calls\n if (lastFinishReason === \"tool-calls\" && lastToolCalls.length > 0 && tools) {\n lastToolResults = await executeTools(lastToolCalls, tools as ToolSet, abortSignal);\n\n // Add assistant message with tool calls\n const toolCallParts = lastToolCalls.map((tc) => ({\n type: \"tool-call\" as const,\n toolCallType: \"function\" as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: tc.args,\n }));\n messages.push({ role: \"assistant\", content: lastText ? [{ type: \"text\", text: lastText }, ...toolCallParts] : toolCallParts });\n\n // Add tool result messages\n const toolResultParts = lastToolResults.map((tr) => ({\n type: \"tool-result\" as const,\n toolCallId: tr.toolCallId,\n toolName: tr.toolName,\n result: tr.result,\n isError: tr.isError,\n }));\n messages.push({ role: \"tool\", content: toolResultParts });\n } else {\n lastToolResults = [];\n }\n\n const step: StepResult<TOOLS> = {\n text: lastText,\n toolCalls: lastToolCalls.map((tc) => ({\n toolCallType: \"function\" as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: typeof tc.args === \"string\" ? JSON.parse(tc.args) : tc.args,\n })),\n toolResults: lastToolResults,\n finishReason: lastFinishReason,\n usage: { ...result.usage },\n response: lastResponse,\n };\n steps.push(step);\n\n if (onStepFinish) await onStepFinish(step);\n\n // Check stop conditions\n const shouldStop = await Promise.all(\n stopConditions.map((cond) => cond({ steps: steps as StepResult<ToolSet>[] })),\n );\n if (shouldStop.some(Boolean)) break;\n\n // If no tool calls, we're done\n if (lastFinishReason !== \"tool-calls\" || lastToolCalls.length === 0) break;\n\n // If a tool has no execute function, stop (needs human approval)\n const hasUnexecutableTool = lastToolCalls.some((tc) => !(tools as ToolSet)[tc.toolName]?.execute);\n if (hasUnexecutableTool) break;\n }\n\n const finalResult: GenerateTextResult<TOOLS> = {\n text: lastText,\n toolCalls: lastToolCalls.map((tc) => ({\n toolCallType: \"function\" as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: typeof tc.args === \"string\" ? JSON.parse(tc.args) : tc.args,\n })),\n toolResults: lastToolResults,\n finishReason: lastFinishReason,\n usage: totalUsage,\n steps,\n response: lastResponse,\n };\n\n if (onFinish) await onFinish(finalResult);\n\n return finalResult;\n}\n","// =============================================================================\n// Gauss LLM Core — streamText\n// Streaming multi-step tool-loop text generation.\n// =============================================================================\n\nimport type {\n LanguageModel,\n LanguageModelTool,\n ToolSet,\n StepResult,\n ToolCall,\n ToolResult,\n TokenUsage,\n StreamTextResult,\n FinishReason,\n CoreMessage,\n StreamPart,\n ToolChoice,\n} from \"./types.js\";\nimport type { StopCondition } from \"./stop-conditions.js\";\nimport type { OutputSpec } from \"./output.js\";\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface StreamTextOptions<TOOLS extends ToolSet = ToolSet> {\n model: LanguageModel;\n prompt?: string;\n messages?: CoreMessage[];\n system?: string;\n tools?: TOOLS;\n toolChoice?: ToolChoice;\n stopWhen?: StopCondition<TOOLS> | Array<StopCondition<TOOLS>>;\n maxSteps?: number;\n output?: OutputSpec;\n temperature?: number;\n maxTokens?: number;\n abortSignal?: AbortSignal;\n onStepFinish?: (event: StepResult<TOOLS>) => void | Promise<void>;\n onFinish?: (event: { text: string; usage: TokenUsage; finishReason: FinishReason }) => void | Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers (shared with generateText)\n// ---------------------------------------------------------------------------\n\nfunction zodToJsonSchema(schema: unknown): Record<string, unknown> {\n if (!schema) return {};\n const s = schema as { _def?: { typeName?: string }; shape?: unknown };\n if (s._def?.typeName === \"ZodObject\" && s.shape) {\n const shape = typeof s.shape === \"function\" ? (s.shape as () => Record<string, unknown>)() : s.shape as Record<string, unknown>;\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [key, val] of Object.entries(shape)) {\n const f = val as { _def?: { typeName?: string; description?: string }; isOptional?: () => boolean };\n properties[key] = { type: \"string\" };\n if (f._def?.typeName === \"ZodString\") properties[key] = { type: \"string\" };\n else if (f._def?.typeName === \"ZodNumber\") properties[key] = { type: \"number\" };\n else if (f._def?.typeName === \"ZodBoolean\") properties[key] = { type: \"boolean\" };\n else if (f._def?.typeName === \"ZodArray\") properties[key] = { type: \"array\" };\n if (f._def?.description) (properties[key] as Record<string, unknown>).description = f._def.description;\n if (typeof f.isOptional !== \"function\" || !f.isOptional()) required.push(key);\n }\n return { type: \"object\", properties, ...(required.length > 0 ? { required } : {}) };\n }\n return { type: \"object\" };\n}\n\nfunction toolsToLanguageModelTools(tools: ToolSet): LanguageModelTool[] {\n return Object.entries(tools).map(([name, def]) => ({\n type: \"function\" as const,\n name,\n description: def.description,\n parameters: zodToJsonSchema(def.parameters),\n }));\n}\n\nfunction buildMessages(options: StreamTextOptions): CoreMessage[] {\n const msgs: CoreMessage[] = [];\n if (options.system) msgs.push({ role: \"system\", content: options.system });\n if (options.messages) msgs.push(...options.messages);\n if (options.prompt) msgs.push({ role: \"user\", content: options.prompt });\n return msgs;\n}\n\n// ---------------------------------------------------------------------------\n// streamText\n// ---------------------------------------------------------------------------\n\n/**\n * Stream text from a language model with optional multi-step tool loop.\n * Returns a result object with promise-based accessors for the final values.\n */\nexport function streamText<TOOLS extends ToolSet = ToolSet>(\n options: StreamTextOptions<TOOLS>,\n): StreamTextResult<TOOLS> {\n const { model, tools, abortSignal } = options;\n const lmTools = tools ? toolsToLanguageModelTools(tools as ToolSet) : undefined;\n const messages = buildMessages(options);\n\n // Shared mutable state accumulated during streaming\n let resolveText: (v: string) => void;\n let resolveUsage: (v: TokenUsage) => void;\n let resolveFinish: (v: FinishReason) => void;\n let resolveToolCalls: (v: Array<{ toolCallType: \"function\"; toolCallId: string; toolName: string; args: unknown }>) => void;\n let resolveToolResults: (v: ToolResult[]) => void;\n let resolveSteps: (v: StepResult<TOOLS>[]) => void;\n\n const textPromise = new Promise<string>((r) => { resolveText = r; });\n const usagePromise = new Promise<TokenUsage>((r) => { resolveUsage = r; });\n const finishPromise = new Promise<FinishReason>((r) => { resolveFinish = r; });\n const toolCallsPromise = new Promise<Array<{ toolCallType: \"function\"; toolCallId: string; toolName: string; args: unknown }>>((r) => { resolveToolCalls = r; });\n const toolResultsPromise = new Promise<ToolResult[]>((r) => { resolveToolResults = r; });\n const stepsPromise = new Promise<StepResult<TOOLS>[]>((r) => { resolveSteps = r; });\n\n // Create the full stream (piped to both textStream and fullStream)\n const fullStream = new ReadableStream<StreamPart>({\n async start(controller) {\n try {\n const mode = lmTools && lmTools.length > 0\n ? { type: \"regular\" as const, tools: lmTools }\n : { type: \"regular\" as const };\n\n const result = await model.doStream({\n inputFormat: \"messages\",\n mode,\n prompt: messages,\n abortSignal,\n });\n\n const reader = result.stream.getReader();\n let fullText = \"\";\n const allToolCalls: ToolCall[] = [];\n const totalUsage: TokenUsage = { inputTokens: 0, outputTokens: 0 };\n let lastFinish: FinishReason = \"stop\";\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const part = value as StreamPart;\n controller.enqueue(part);\n\n if (part.type === \"text-delta\") {\n fullText += part.textDelta;\n } else if (part.type === \"tool-call\") {\n allToolCalls.push({\n toolCallType: \"function\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args,\n });\n } else if (part.type === \"finish\") {\n lastFinish = part.finishReason;\n totalUsage.inputTokens += part.usage.inputTokens;\n totalUsage.outputTokens += part.usage.outputTokens;\n }\n }\n\n // Execute tool calls if any\n let toolResults: ToolResult[] = [];\n if (allToolCalls.length > 0 && tools) {\n for (const call of allToolCalls) {\n const toolDef = (tools as ToolSet)[call.toolName];\n if (toolDef?.execute) {\n try {\n const args = typeof call.args === \"string\" ? JSON.parse(call.args) : call.args;\n const result = await toolDef.execute(args, { abortSignal, toolCallId: call.toolCallId });\n toolResults.push({ toolCallId: call.toolCallId, toolName: call.toolName, result });\n } catch (err) {\n toolResults.push({ toolCallId: call.toolCallId, toolName: call.toolName, result: String(err), isError: true });\n }\n }\n }\n }\n\n const step: StepResult<TOOLS> = {\n text: fullText,\n toolCalls: allToolCalls.map((tc) => ({\n toolCallType: \"function\" as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: typeof tc.args === \"string\" ? JSON.parse(tc.args) : tc.args,\n })),\n toolResults,\n finishReason: lastFinish,\n usage: totalUsage,\n };\n\n resolveText!(fullText);\n resolveUsage!(totalUsage);\n resolveFinish!(lastFinish);\n resolveToolCalls!(step.toolCalls);\n resolveToolResults!(toolResults);\n resolveSteps!([step]);\n\n if (options.onStepFinish) await options.onStepFinish(step);\n if (options.onFinish) await options.onFinish({ text: fullText, usage: totalUsage, finishReason: lastFinish });\n\n controller.close();\n } catch (err) {\n controller.error(err);\n }\n },\n });\n\n // Text-only stream\n const textStream = new ReadableStream<string>({\n async start(controller) {\n const reader = fullStream.getReader();\n try {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value.type === \"text-delta\") {\n controller.enqueue(value.textDelta);\n }\n }\n controller.close();\n } catch (err) {\n controller.error(err);\n }\n },\n });\n\n return {\n textStream,\n fullStream,\n text: textPromise,\n toolCalls: toolCallsPromise,\n toolResults: toolResultsPromise,\n finishReason: finishPromise,\n usage: usagePromise,\n steps: stepsPromise,\n };\n}\n","// =============================================================================\n// Gauss LLM Core — Stop Conditions\n// Determine when to end multi-step agent loops.\n// =============================================================================\n\nimport type { StepResult, ToolSet } from \"./types.js\";\n\nexport type StopCondition<TOOLS extends ToolSet = ToolSet> = (options: {\n steps: Array<StepResult<TOOLS>>;\n}) => PromiseLike<boolean> | boolean;\n\n/**\n * Stops after exactly `count` steps have been executed.\n */\nexport function stepCountIs(count: number): StopCondition<ToolSet> {\n return ({ steps }) => steps.length >= count;\n}\n\n/**\n * Stops when a specific tool has been called in the latest step.\n */\nexport function hasToolCall(toolName: string): StopCondition<ToolSet> {\n return ({ steps }) =>\n steps[steps.length - 1]?.toolCalls?.some(\n (tc) => tc.toolName === toolName,\n ) ?? false;\n}\n","// =============================================================================\n// Gauss LLM Core — Output Specification\n// Structured output mode for generateText / streamText.\n// =============================================================================\n\nimport type { ZodType } from \"zod\";\n\nexport interface OutputSpec<T = unknown> {\n type: \"object\";\n schema: ZodType<T>;\n}\n\n/**\n * Output specification — instructs the model to produce structured JSON output.\n *\n * @example\n * ```ts\n * const result = await generateText({\n * model,\n * output: Output.object({ schema: z.object({ name: z.string() }) }),\n * prompt: \"Generate a person\",\n * });\n * ```\n */\nexport const Output = {\n object<T>(config: { schema: ZodType<T> }): OutputSpec<T> {\n return { type: \"object\", schema: config.schema };\n },\n};\n"],"mappings":"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","names":["zodToJsonSchema","toolsToLanguageModelTools","buildMessages","result"]}
@@ -0,0 +1,157 @@
1
+ // src/cli/project-context.ts
2
+ import { existsSync, readFileSync, readdirSync } from "fs";
3
+ import { join } from "path";
4
+ var IGNORED_DIRS = /* @__PURE__ */ new Set([
5
+ "node_modules",
6
+ ".git",
7
+ "dist",
8
+ "build",
9
+ "__pycache__",
10
+ "target",
11
+ ".next",
12
+ ".nuxt",
13
+ "coverage",
14
+ ".turbo",
15
+ ".cache",
16
+ "venv",
17
+ ".venv",
18
+ "env",
19
+ ".env"
20
+ ]);
21
+ function readJson(filePath) {
22
+ try {
23
+ return JSON.parse(readFileSync(filePath, "utf-8"));
24
+ } catch {
25
+ return null;
26
+ }
27
+ }
28
+ function listTopLevelDirs(dir) {
29
+ try {
30
+ return readdirSync(dir, { withFileTypes: true }).filter((e) => e.isDirectory() && !e.name.startsWith(".") && !IGNORED_DIRS.has(e.name)).map((e) => e.name + "/").slice(0, 20);
31
+ } catch {
32
+ return [];
33
+ }
34
+ }
35
+ function detectNodeFramework(deps) {
36
+ if ("next" in deps) return "next.js";
37
+ if ("nuxt" in deps || "nuxt3" in deps) return "nuxt";
38
+ if ("@angular/core" in deps) return "angular";
39
+ if ("svelte" in deps || "@sveltejs/kit" in deps) return "svelte";
40
+ if ("vue" in deps) return "vue";
41
+ if ("express" in deps) return "express";
42
+ if ("fastify" in deps) return "fastify";
43
+ if ("hono" in deps) return "hono";
44
+ if ("koa" in deps) return "koa";
45
+ if ("nestjs" in deps || "@nestjs/core" in deps) return "nestjs";
46
+ return void 0;
47
+ }
48
+ function detectNodeLanguage(dir, pkg) {
49
+ const devDeps = pkg.devDependencies ?? {};
50
+ const deps = pkg.dependencies ?? {};
51
+ if ("typescript" in devDeps || "typescript" in deps) return "typescript";
52
+ if (existsSync(join(dir, "tsconfig.json"))) return "typescript";
53
+ return "javascript";
54
+ }
55
+ function detectPackageManager(dir) {
56
+ if (existsSync(join(dir, "bun.lockb")) || existsSync(join(dir, "bun.lock"))) return "bun";
57
+ if (existsSync(join(dir, "pnpm-lock.yaml"))) return "pnpm";
58
+ if (existsSync(join(dir, "yarn.lock"))) return "yarn";
59
+ return "npm";
60
+ }
61
+ function extractTopDeps(pkg, max = 10) {
62
+ const deps = pkg.dependencies ?? {};
63
+ return Object.keys(deps).slice(0, max);
64
+ }
65
+ function detectNodeProject(dir, pkg) {
66
+ const allDeps = {
67
+ ...pkg.dependencies ?? {},
68
+ ...pkg.devDependencies ?? {}
69
+ };
70
+ const scripts = pkg.scripts ?? {};
71
+ const pickedScripts = {};
72
+ for (const key of ["test", "build", "lint", "dev", "start"]) {
73
+ if (scripts[key]) pickedScripts[key] = scripts[key];
74
+ }
75
+ return {
76
+ type: "node",
77
+ framework: detectNodeFramework(allDeps),
78
+ language: detectNodeLanguage(dir, pkg),
79
+ packageManager: detectPackageManager(dir),
80
+ scripts: Object.keys(pickedScripts).length > 0 ? pickedScripts : void 0,
81
+ dependencies: extractTopDeps(pkg),
82
+ structure: listTopLevelDirs(dir).join(", ") || "(empty)"
83
+ };
84
+ }
85
+ function detectPythonFramework(dir) {
86
+ for (const file of ["pyproject.toml", "requirements.txt"]) {
87
+ try {
88
+ const content = readFileSync(join(dir, file), "utf-8");
89
+ if (content.includes("django") || content.includes("Django")) return "django";
90
+ if (content.includes("flask") || content.includes("Flask")) return "flask";
91
+ if (content.includes("fastapi") || content.includes("FastAPI")) return "fastapi";
92
+ } catch {
93
+ }
94
+ }
95
+ return void 0;
96
+ }
97
+ function detectProjectContext(cwd) {
98
+ const dir = cwd || process.cwd();
99
+ const dirs = listTopLevelDirs(dir);
100
+ const structure = dirs.join(", ") || "(empty)";
101
+ const pkgPath = join(dir, "package.json");
102
+ if (existsSync(pkgPath)) {
103
+ const pkg = readJson(pkgPath);
104
+ if (pkg) return detectNodeProject(dir, pkg);
105
+ }
106
+ if (existsSync(join(dir, "pyproject.toml")) || existsSync(join(dir, "requirements.txt"))) {
107
+ return {
108
+ type: "python",
109
+ framework: detectPythonFramework(dir),
110
+ language: "python",
111
+ packageManager: "pip",
112
+ structure
113
+ };
114
+ }
115
+ if (existsSync(join(dir, "Cargo.toml"))) {
116
+ return { type: "rust", language: "rust", packageManager: "cargo", structure };
117
+ }
118
+ if (existsSync(join(dir, "go.mod"))) {
119
+ return { type: "go", language: "go", packageManager: "go", structure };
120
+ }
121
+ if (existsSync(join(dir, "pom.xml"))) {
122
+ return { type: "java", language: "java", packageManager: "maven", structure };
123
+ }
124
+ if (existsSync(join(dir, "build.gradle")) || existsSync(join(dir, "build.gradle.kts"))) {
125
+ return { type: "java", language: "java", packageManager: "gradle", structure };
126
+ }
127
+ return { type: "unknown", language: "unknown", structure };
128
+ }
129
+ function contextToSystemPrompt(ctx) {
130
+ const parts = [];
131
+ if (ctx.type === "unknown") {
132
+ parts.push("Project type could not be detected.");
133
+ } else {
134
+ const frameworkPart = ctx.framework ? ` using ${ctx.framework} framework` : "";
135
+ parts.push(`This is a ${ctx.language}/${ctx.type} project${frameworkPart}.`);
136
+ }
137
+ if (ctx.packageManager) {
138
+ parts.push(`Package manager: ${ctx.packageManager}.`);
139
+ }
140
+ if (ctx.dependencies && ctx.dependencies.length > 0) {
141
+ parts.push(`Key dependencies: ${ctx.dependencies.join(", ")}.`);
142
+ }
143
+ if (ctx.scripts) {
144
+ const scriptEntries = Object.entries(ctx.scripts).map(([k, v]) => `${k}: \`${v}\``).join(", ");
145
+ parts.push(`Scripts: ${scriptEntries}.`);
146
+ }
147
+ if (ctx.structure && ctx.structure !== "(empty)") {
148
+ parts.push(`Project structure: ${ctx.structure}`);
149
+ }
150
+ return parts.join(" ");
151
+ }
152
+
153
+ export {
154
+ detectProjectContext,
155
+ contextToSystemPrompt
156
+ };
157
+ //# sourceMappingURL=chunk-KEASLAYR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/project-context.ts"],"sourcesContent":["// =============================================================================\n// Project Context Detection — Detect project type, framework, and structure\n// =============================================================================\n\nimport { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join, basename } from \"node:path\";\n\nexport interface ProjectContext {\n type: string;\n framework?: string;\n language: string;\n packageManager?: string;\n scripts?: Record<string, string>;\n dependencies?: string[];\n structure: string;\n}\n\nconst IGNORED_DIRS = new Set([\n \"node_modules\", \".git\", \"dist\", \"build\", \"__pycache__\",\n \"target\", \".next\", \".nuxt\", \"coverage\", \".turbo\", \".cache\",\n \"venv\", \".venv\", \"env\", \".env\",\n]);\n\nfunction readJson(filePath: string): Record<string, unknown> | null {\n try {\n return JSON.parse(readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction listTopLevelDirs(dir: string): string[] {\n try {\n return readdirSync(dir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && !e.name.startsWith(\".\") && !IGNORED_DIRS.has(e.name))\n .map((e) => e.name + \"/\")\n .slice(0, 20);\n } catch {\n return [];\n }\n}\n\nfunction detectNodeFramework(deps: Record<string, unknown>): string | undefined {\n if (\"next\" in deps) return \"next.js\";\n if (\"nuxt\" in deps || \"nuxt3\" in deps) return \"nuxt\";\n if (\"@angular/core\" in deps) return \"angular\";\n if (\"svelte\" in deps || \"@sveltejs/kit\" in deps) return \"svelte\";\n if (\"vue\" in deps) return \"vue\";\n if (\"express\" in deps) return \"express\";\n if (\"fastify\" in deps) return \"fastify\";\n if (\"hono\" in deps) return \"hono\";\n if (\"koa\" in deps) return \"koa\";\n if (\"nestjs\" in deps || \"@nestjs/core\" in deps) return \"nestjs\";\n return undefined;\n}\n\nfunction detectNodeLanguage(dir: string, pkg: Record<string, unknown>): string {\n const devDeps = (pkg.devDependencies ?? {}) as Record<string, unknown>;\n const deps = (pkg.dependencies ?? {}) as Record<string, unknown>;\n if (\"typescript\" in devDeps || \"typescript\" in deps) return \"typescript\";\n if (existsSync(join(dir, \"tsconfig.json\"))) return \"typescript\";\n return \"javascript\";\n}\n\nfunction detectPackageManager(dir: string): string {\n if (existsSync(join(dir, \"bun.lockb\")) || existsSync(join(dir, \"bun.lock\"))) return \"bun\";\n if (existsSync(join(dir, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(dir, \"yarn.lock\"))) return \"yarn\";\n return \"npm\";\n}\n\nfunction extractTopDeps(pkg: Record<string, unknown>, max = 10): string[] {\n const deps = (pkg.dependencies ?? {}) as Record<string, unknown>;\n return Object.keys(deps).slice(0, max);\n}\n\nfunction detectNodeProject(dir: string, pkg: Record<string, unknown>): ProjectContext {\n const allDeps = {\n ...((pkg.dependencies ?? {}) as Record<string, unknown>),\n ...((pkg.devDependencies ?? {}) as Record<string, unknown>),\n };\n const scripts = (pkg.scripts ?? {}) as Record<string, string>;\n const pickedScripts: Record<string, string> = {};\n for (const key of [\"test\", \"build\", \"lint\", \"dev\", \"start\"]) {\n if (scripts[key]) pickedScripts[key] = scripts[key];\n }\n\n return {\n type: \"node\",\n framework: detectNodeFramework(allDeps),\n language: detectNodeLanguage(dir, pkg),\n packageManager: detectPackageManager(dir),\n scripts: Object.keys(pickedScripts).length > 0 ? pickedScripts : undefined,\n dependencies: extractTopDeps(pkg),\n structure: listTopLevelDirs(dir).join(\", \") || \"(empty)\",\n };\n}\n\nfunction detectPythonFramework(dir: string): string | undefined {\n // Check pyproject.toml or requirements.txt for common frameworks\n for (const file of [\"pyproject.toml\", \"requirements.txt\"]) {\n try {\n const content = readFileSync(join(dir, file), \"utf-8\");\n if (content.includes(\"django\") || content.includes(\"Django\")) return \"django\";\n if (content.includes(\"flask\") || content.includes(\"Flask\")) return \"flask\";\n if (content.includes(\"fastapi\") || content.includes(\"FastAPI\")) return \"fastapi\";\n } catch { /* skip */ }\n }\n return undefined;\n}\n\nexport function detectProjectContext(cwd?: string): ProjectContext {\n const dir = cwd || process.cwd();\n const dirs = listTopLevelDirs(dir);\n const structure = dirs.join(\", \") || \"(empty)\";\n\n // Node.js\n const pkgPath = join(dir, \"package.json\");\n if (existsSync(pkgPath)) {\n const pkg = readJson(pkgPath);\n if (pkg) return detectNodeProject(dir, pkg);\n }\n\n // Python\n if (existsSync(join(dir, \"pyproject.toml\")) || existsSync(join(dir, \"requirements.txt\"))) {\n return {\n type: \"python\",\n framework: detectPythonFramework(dir),\n language: \"python\",\n packageManager: \"pip\",\n structure,\n };\n }\n\n // Rust\n if (existsSync(join(dir, \"Cargo.toml\"))) {\n return { type: \"rust\", language: \"rust\", packageManager: \"cargo\", structure };\n }\n\n // Go\n if (existsSync(join(dir, \"go.mod\"))) {\n return { type: \"go\", language: \"go\", packageManager: \"go\", structure };\n }\n\n // Java\n if (existsSync(join(dir, \"pom.xml\"))) {\n return { type: \"java\", language: \"java\", packageManager: \"maven\", structure };\n }\n if (existsSync(join(dir, \"build.gradle\")) || existsSync(join(dir, \"build.gradle.kts\"))) {\n return { type: \"java\", language: \"java\", packageManager: \"gradle\", structure };\n }\n\n return { type: \"unknown\", language: \"unknown\", structure };\n}\n\nexport function contextToSystemPrompt(ctx: ProjectContext): string {\n const parts: string[] = [];\n\n if (ctx.type === \"unknown\") {\n parts.push(\"Project type could not be detected.\");\n } else {\n const frameworkPart = ctx.framework ? ` using ${ctx.framework} framework` : \"\";\n parts.push(`This is a ${ctx.language}/${ctx.type} project${frameworkPart}.`);\n }\n\n if (ctx.packageManager) {\n parts.push(`Package manager: ${ctx.packageManager}.`);\n }\n\n if (ctx.dependencies && ctx.dependencies.length > 0) {\n parts.push(`Key dependencies: ${ctx.dependencies.join(\", \")}.`);\n }\n\n if (ctx.scripts) {\n const scriptEntries = Object.entries(ctx.scripts)\n .map(([k, v]) => `${k}: \\`${v}\\``)\n .join(\", \");\n parts.push(`Scripts: ${scriptEntries}.`);\n }\n\n if (ctx.structure && ctx.structure !== \"(empty)\") {\n parts.push(`Project structure: ${ctx.structure}`);\n }\n\n return parts.join(\" \");\n}\n"],"mappings":"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","names":[]}