@baanish/hydra-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +122 -0
  3. package/dist/config.d.ts +29 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +338 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/db/client.d.ts +10 -0
  8. package/dist/db/client.d.ts.map +1 -0
  9. package/dist/db/client.js +93 -0
  10. package/dist/db/client.js.map +1 -0
  11. package/dist/db/queries.d.ts +67 -0
  12. package/dist/db/queries.d.ts.map +1 -0
  13. package/dist/db/queries.js +336 -0
  14. package/dist/db/queries.js.map +1 -0
  15. package/dist/engine/concurrency.d.ts +3 -0
  16. package/dist/engine/concurrency.d.ts.map +1 -0
  17. package/dist/engine/concurrency.js +42 -0
  18. package/dist/engine/concurrency.js.map +1 -0
  19. package/dist/engine/eta.d.ts +16 -0
  20. package/dist/engine/eta.d.ts.map +1 -0
  21. package/dist/engine/eta.js +54 -0
  22. package/dist/engine/eta.js.map +1 -0
  23. package/dist/engine/model.d.ts +57 -0
  24. package/dist/engine/model.d.ts.map +1 -0
  25. package/dist/engine/model.js +445 -0
  26. package/dist/engine/model.js.map +1 -0
  27. package/dist/engine/personas.d.ts +30 -0
  28. package/dist/engine/personas.d.ts.map +1 -0
  29. package/dist/engine/personas.js +336 -0
  30. package/dist/engine/personas.js.map +1 -0
  31. package/dist/engine/pipeline.d.ts +61 -0
  32. package/dist/engine/pipeline.d.ts.map +1 -0
  33. package/dist/engine/pipeline.js +638 -0
  34. package/dist/engine/pipeline.js.map +1 -0
  35. package/dist/engine/prompts.d.ts +10 -0
  36. package/dist/engine/prompts.d.ts.map +1 -0
  37. package/dist/engine/prompts.js +49 -0
  38. package/dist/engine/prompts.js.map +1 -0
  39. package/dist/engine/search.d.ts +46 -0
  40. package/dist/engine/search.d.ts.map +1 -0
  41. package/dist/engine/search.js +159 -0
  42. package/dist/engine/search.js.map +1 -0
  43. package/dist/index.d.ts +5 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +648 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/security.d.ts +18 -0
  48. package/dist/security.d.ts.map +1 -0
  49. package/dist/security.js +168 -0
  50. package/dist/security.js.map +1 -0
  51. package/dist/types.d.ts +143 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +2 -0
  54. package/dist/types.js.map +1 -0
  55. package/dist/ui/agent-mode.d.ts +8 -0
  56. package/dist/ui/agent-mode.d.ts.map +1 -0
  57. package/dist/ui/agent-mode.js +138 -0
  58. package/dist/ui/agent-mode.js.map +1 -0
  59. package/dist/ui/animations.d.ts +8 -0
  60. package/dist/ui/animations.d.ts.map +1 -0
  61. package/dist/ui/animations.js +19 -0
  62. package/dist/ui/animations.js.map +1 -0
  63. package/dist/ui/components/agent-list.d.ts +2 -0
  64. package/dist/ui/components/agent-list.d.ts.map +1 -0
  65. package/dist/ui/components/agent-list.js +2 -0
  66. package/dist/ui/components/agent-list.js.map +1 -0
  67. package/dist/ui/components/header.d.ts +2 -0
  68. package/dist/ui/components/header.d.ts.map +1 -0
  69. package/dist/ui/components/header.js +2 -0
  70. package/dist/ui/components/header.js.map +1 -0
  71. package/dist/ui/components/phase-bar.d.ts +2 -0
  72. package/dist/ui/components/phase-bar.d.ts.map +1 -0
  73. package/dist/ui/components/phase-bar.js +2 -0
  74. package/dist/ui/components/phase-bar.js.map +1 -0
  75. package/dist/ui/components/stats-bar.d.ts +2 -0
  76. package/dist/ui/components/stats-bar.d.ts.map +1 -0
  77. package/dist/ui/components/stats-bar.js +2 -0
  78. package/dist/ui/components/stats-bar.js.map +1 -0
  79. package/dist/ui/tui.d.ts +18 -0
  80. package/dist/ui/tui.d.ts.map +1 -0
  81. package/dist/ui/tui.js +464 -0
  82. package/dist/ui/tui.js.map +1 -0
  83. package/dist/web/app.html +1352 -0
  84. package/dist/web/index.d.ts +2 -0
  85. package/dist/web/index.d.ts.map +1 -0
  86. package/dist/web/index.js +2 -0
  87. package/dist/web/index.js.map +1 -0
  88. package/dist/web/server.d.ts +2 -0
  89. package/dist/web/server.d.ts.map +1 -0
  90. package/dist/web/server.js +864 -0
  91. package/dist/web/server.js.map +1 -0
  92. package/package.json +59 -0
@@ -0,0 +1,445 @@
1
+ import OpenAI, { APIConnectionError, APIConnectionTimeoutError, APIError, } from "openai";
2
+ import { wrapUntrustedToolResult } from "../security.js";
3
+ import { SEARCH_TOOLS, runSearchTool } from "./search.js";
4
+ const ALLOWED_ROLES = ["system", "user", "assistant", "tool"];
5
+ const MAX_TOOL_CALLS = 5;
6
+ const MAX_TOOL_RESULT_CHARS = 6000;
7
+ const MAX_FINAL_CALLS = 1;
8
+ const MAX_BACKEND_ATTEMPTS = 5;
9
+ const MODEL_CALL_TIMEOUT_MS = 120_000;
10
+ const RETRY_BASE_BACKOFF_MS = 5_000;
11
+ const RETRY_RATE_LIMIT_BASE_BACKOFF_MS = 30_000;
12
+ const RETRY_BACKOFF_MULTIPLIER = 2;
13
+ const RETRY_BACKOFF_CAP_MS = 60_000;
14
+ const RETRY_JITTER_MAX_MS = 2_000;
15
+ const RETRYABLE_STATUS_CODES = new Set([429, 502, 503, 524]);
16
+ const RETRYABLE_NETWORK_ERROR_CODES = new Set([
17
+ "ECONNRESET",
18
+ "ETIMEDOUT",
19
+ "ENOTFOUND",
20
+ "ECONNREFUSED",
21
+ ]);
22
+ function sleep(ms) {
23
+ return new Promise((resolve) => {
24
+ setTimeout(resolve, ms);
25
+ });
26
+ }
27
+ function createModelCallTimeoutError(timeoutMs) {
28
+ const timeoutSeconds = Math.floor(timeoutMs / 1000);
29
+ const error = new Error(`ETIMEDOUT from backend (model call exceeded ${timeoutSeconds}s timeout)`);
30
+ error.code = "ETIMEDOUT";
31
+ return error;
32
+ }
33
+ async function createCompletionWithTimeout(client, params) {
34
+ const controller = new AbortController();
35
+ let timeoutHandle = null;
36
+ const timeoutPromise = new Promise((_, reject) => {
37
+ timeoutHandle = setTimeout(() => {
38
+ controller.abort();
39
+ reject(createModelCallTimeoutError(MODEL_CALL_TIMEOUT_MS));
40
+ }, MODEL_CALL_TIMEOUT_MS);
41
+ });
42
+ try {
43
+ const completionPromise = client.chat.completions.create(params, {
44
+ signal: controller.signal,
45
+ });
46
+ return await Promise.race([completionPromise, timeoutPromise]);
47
+ }
48
+ finally {
49
+ if (timeoutHandle) {
50
+ clearTimeout(timeoutHandle);
51
+ }
52
+ }
53
+ }
54
+ function resolveNetworkErrorCode(error) {
55
+ if (!error || typeof error !== "object") {
56
+ return null;
57
+ }
58
+ const maybeError = error;
59
+ if (typeof maybeError.code === "string") {
60
+ return maybeError.code.toUpperCase();
61
+ }
62
+ if (!maybeError.cause || typeof maybeError.cause !== "object") {
63
+ return null;
64
+ }
65
+ const cause = maybeError.cause;
66
+ if (typeof cause.code === "string") {
67
+ return cause.code.toUpperCase();
68
+ }
69
+ return null;
70
+ }
71
+ function findRetryableNetworkCode(message) {
72
+ const normalized = message.toUpperCase();
73
+ for (const code of RETRYABLE_NETWORK_ERROR_CODES) {
74
+ if (normalized.includes(code)) {
75
+ return code;
76
+ }
77
+ }
78
+ return null;
79
+ }
80
+ function computeRetryBackoffMs(attempt, baseBackoffMs) {
81
+ const exponent = Math.max(0, attempt - 1);
82
+ const exponentialDelayMs = Math.min(baseBackoffMs * RETRY_BACKOFF_MULTIPLIER ** exponent, RETRY_BACKOFF_CAP_MS);
83
+ const jitterMs = attempt <= 1 ? 0 : Math.floor(Math.random() * (RETRY_JITTER_MAX_MS + 1));
84
+ return exponentialDelayMs + jitterMs;
85
+ }
86
+ function classifyRetryableModelError(error) {
87
+ if (error instanceof APIError &&
88
+ typeof error.status === "number" &&
89
+ RETRYABLE_STATUS_CODES.has(error.status)) {
90
+ return {
91
+ shouldRetry: true,
92
+ reason: `${error.status} from backend`,
93
+ baseBackoffMs: error.status === 429
94
+ ? RETRY_RATE_LIMIT_BASE_BACKOFF_MS
95
+ : RETRY_BASE_BACKOFF_MS,
96
+ };
97
+ }
98
+ const networkCode = resolveNetworkErrorCode(error);
99
+ if (networkCode && RETRYABLE_NETWORK_ERROR_CODES.has(networkCode)) {
100
+ return {
101
+ shouldRetry: true,
102
+ reason: `${networkCode} from backend`,
103
+ baseBackoffMs: RETRY_BASE_BACKOFF_MS,
104
+ };
105
+ }
106
+ if (error instanceof APIConnectionTimeoutError) {
107
+ return {
108
+ shouldRetry: true,
109
+ reason: "ETIMEDOUT from backend",
110
+ baseBackoffMs: RETRY_BASE_BACKOFF_MS,
111
+ };
112
+ }
113
+ if (error instanceof APIConnectionError) {
114
+ const networkCodeFromMessage = findRetryableNetworkCode(error.message);
115
+ if (networkCodeFromMessage) {
116
+ return {
117
+ shouldRetry: true,
118
+ reason: `${networkCodeFromMessage} from backend`,
119
+ baseBackoffMs: RETRY_BASE_BACKOFF_MS,
120
+ };
121
+ }
122
+ if (error.message.toLowerCase().includes("connection error")) {
123
+ return {
124
+ shouldRetry: true,
125
+ reason: "Connection error from backend",
126
+ baseBackoffMs: RETRY_BASE_BACKOFF_MS,
127
+ };
128
+ }
129
+ return {
130
+ shouldRetry: true,
131
+ reason: "APIConnectionError from backend",
132
+ baseBackoffMs: RETRY_BASE_BACKOFF_MS,
133
+ };
134
+ }
135
+ if (error instanceof Error) {
136
+ const networkCodeFromMessage = findRetryableNetworkCode(error.message);
137
+ if (networkCodeFromMessage) {
138
+ return {
139
+ shouldRetry: true,
140
+ reason: `${networkCodeFromMessage} from backend`,
141
+ baseBackoffMs: RETRY_BASE_BACKOFF_MS,
142
+ };
143
+ }
144
+ if (error.message.toLowerCase().includes("connection error")) {
145
+ return {
146
+ shouldRetry: true,
147
+ reason: "Connection error from backend",
148
+ baseBackoffMs: RETRY_BASE_BACKOFF_MS,
149
+ };
150
+ }
151
+ }
152
+ return {
153
+ shouldRetry: false,
154
+ reason: error instanceof Error && error.message.trim()
155
+ ? error.message.trim()
156
+ : "non-retryable error",
157
+ baseBackoffMs: RETRY_BASE_BACKOFF_MS,
158
+ };
159
+ }
160
+ async function createCompletionWithRetry(client, params) {
161
+ for (let attempt = 1; attempt <= MAX_BACKEND_ATTEMPTS; attempt++) {
162
+ try {
163
+ return await createCompletionWithTimeout(client, params);
164
+ }
165
+ catch (error) {
166
+ const retryDecision = classifyRetryableModelError(error);
167
+ const shouldRetry = retryDecision.shouldRetry && attempt < MAX_BACKEND_ATTEMPTS;
168
+ if (!shouldRetry) {
169
+ throw new Error(`API failed after ${attempt} attempt${attempt === 1 ? "" : "s"}: ${retryDecision.reason}`);
170
+ }
171
+ const backoffMs = computeRetryBackoffMs(attempt, retryDecision.baseBackoffMs);
172
+ console.error(`[retry ${attempt}/${MAX_BACKEND_ATTEMPTS}] ${retryDecision.reason}, waiting ${(backoffMs / 1000).toFixed(1)}s...`);
173
+ await sleep(backoffMs);
174
+ }
175
+ }
176
+ throw new Error("retry loop exited unexpectedly");
177
+ }
178
+ function isAllowedRole(value) {
179
+ return (typeof value === "string" && ALLOWED_ROLES.includes(value));
180
+ }
181
+ function normalizeAssistantMessage(rawMessage, messageIndex) {
182
+ if (!rawMessage || typeof rawMessage !== "object") {
183
+ throw new Error(`Invalid OpenAI message at index ${messageIndex}: assistant message must be object.`);
184
+ }
185
+ const message = rawMessage;
186
+ if (message.role !== "assistant") {
187
+ throw new Error(`Invalid OpenAI message at index ${messageIndex}: expected assistant role in model response.`);
188
+ }
189
+ const content = typeof message.content === "string" ? message.content : "";
190
+ if (!Array.isArray(message.tool_calls)) {
191
+ return { content, toolCalls: [] };
192
+ }
193
+ const toolCalls = message.tool_calls.map((toolCall, toolIndex) => {
194
+ if (!toolCall || typeof toolCall !== "object") {
195
+ throw new Error(`Invalid assistant tool call at message ${messageIndex}, index ${toolIndex}: must be object.`);
196
+ }
197
+ const call = toolCall;
198
+ if (typeof call.id !== "string" || !call.id.trim()) {
199
+ throw new Error(`Invalid assistant tool call at message ${messageIndex}, index ${toolIndex}: missing id.`);
200
+ }
201
+ if (call.type !== "function") {
202
+ throw new Error(`Invalid assistant tool call at message ${messageIndex}, index ${toolIndex}: unsupported type ${String(call.type)}.`);
203
+ }
204
+ if (!call.function || typeof call.function !== "object") {
205
+ throw new Error(`Invalid assistant tool call at message ${messageIndex}, index ${toolIndex}: missing function object.`);
206
+ }
207
+ const fn = call.function;
208
+ if (typeof fn.name !== "string" || !fn.name.trim()) {
209
+ throw new Error(`Invalid assistant tool call at message ${messageIndex}, index ${toolIndex}: missing function name.`);
210
+ }
211
+ if (typeof fn.arguments !== "string") {
212
+ throw new Error(`Invalid assistant tool call at message ${messageIndex}, index ${toolIndex}: arguments must be JSON string.`);
213
+ }
214
+ return {
215
+ id: call.id,
216
+ type: "function",
217
+ function: {
218
+ name: fn.name,
219
+ arguments: fn.arguments,
220
+ },
221
+ };
222
+ });
223
+ return { content, toolCalls };
224
+ }
225
+ function normalizeToolMessage(rawMessage, messageIndex) {
226
+ if (!rawMessage || typeof rawMessage !== "object") {
227
+ throw new Error(`Invalid message at index ${messageIndex}: message must be object.`);
228
+ }
229
+ const message = rawMessage;
230
+ if (!isAllowedRole(message.role)) {
231
+ throw new Error(`Invalid role at message index ${messageIndex}.`);
232
+ }
233
+ if (typeof message.content !== "string") {
234
+ throw new Error(`Invalid content at message index ${messageIndex}: must be string.`);
235
+ }
236
+ if (message.role === "tool") {
237
+ if (typeof message.tool_call_id !== "string" ||
238
+ !message.tool_call_id.trim()) {
239
+ throw new Error(`Invalid tool message at index ${messageIndex}: missing tool_call_id.`);
240
+ }
241
+ return {
242
+ role: "tool",
243
+ content: message.content,
244
+ tool_call_id: message.tool_call_id,
245
+ };
246
+ }
247
+ if (message.role === "assistant") {
248
+ const normalized = {
249
+ role: "assistant",
250
+ content: message.content,
251
+ };
252
+ if (Array.isArray(message.tool_calls)) {
253
+ normalized.tool_calls = message.tool_calls;
254
+ }
255
+ return normalized;
256
+ }
257
+ return {
258
+ role: message.role,
259
+ content: message.content,
260
+ };
261
+ }
262
+ function buildToolArguments(rawArgs, messageIndex, toolIndex) {
263
+ let parsed;
264
+ try {
265
+ parsed = JSON.parse(rawArgs);
266
+ }
267
+ catch {
268
+ throw new Error(`Tool arguments at message ${messageIndex}, tool ${toolIndex} are invalid JSON.`);
269
+ }
270
+ if (typeof parsed.query !== "string" || !parsed.query.trim()) {
271
+ throw new Error(`Tool call at message ${messageIndex}, tool ${toolIndex} missing query argument.`);
272
+ }
273
+ return { query: parsed.query };
274
+ }
275
+ function validateMessages(messages) {
276
+ messages.forEach((message, index) => {
277
+ if (!ALLOWED_ROLES.includes(message.role)) {
278
+ throw new Error(`Invalid role in message ${index}.`);
279
+ }
280
+ if (typeof message.content !== "string") {
281
+ throw new Error(`Invalid message content at index ${index}.`);
282
+ }
283
+ if (message.role === "tool") {
284
+ if (typeof message.tool_call_id !== "string" ||
285
+ !message.tool_call_id.trim()) {
286
+ throw new Error(`Invalid tool message at index ${index}: missing tool_call_id.`);
287
+ }
288
+ }
289
+ });
290
+ }
291
+ function toolResultMessage(toolCallId, result) {
292
+ const serializedResult = cleanSearchResultOutput(JSON.stringify(result), MAX_TOOL_RESULT_CHARS);
293
+ return {
294
+ role: "tool",
295
+ tool_call_id: toolCallId,
296
+ content: wrapUntrustedToolResult(serializedResult),
297
+ };
298
+ }
299
+ /** strip tool-call wrapper tags from model output before presentation. */
300
+ export function cleanModelOutput(text) {
301
+ return text
302
+ .replace(/<\|tool_calls_section_begin\|>[\s\S]*?<\|tool_calls_section_end\|>/g, "")
303
+ .replace(/<\|tool_call_begin\|>[\s\S]*?<\|tool_call_end\|>/g, "")
304
+ .replace(/<\|tool_calls_section_begin\|>[\s\S]*/g, "")
305
+ .trim();
306
+ }
307
+ /** run a model turn with optional search/tool calling and return normalized artifacts. */
308
+ export async function runModelWithOptionalTools(input) {
309
+ const client = new OpenAI({
310
+ apiKey: input.apiKey,
311
+ baseURL: input.baseUrl,
312
+ });
313
+ const messages = [
314
+ { role: "system", content: input.systemPrompt },
315
+ { role: "user", content: input.userPrompt },
316
+ ];
317
+ const allowTools = input.allowTools !== false;
318
+ const maxToolCalls = Math.min(Math.max(0, Math.floor(input.maxToolCalls ?? MAX_TOOL_CALLS)), MAX_TOOL_CALLS);
319
+ const tools = allowTools
320
+ ? SEARCH_TOOLS
321
+ : undefined;
322
+ const searchQueries = [];
323
+ let promptTokens = 0;
324
+ let completionTokens = 0;
325
+ const executionStartedAt = Date.now();
326
+ let executionNotified = false;
327
+ const notifyExecutionStart = () => {
328
+ if (executionNotified) {
329
+ return;
330
+ }
331
+ executionNotified = true;
332
+ input.onExecutionStart?.(executionStartedAt);
333
+ };
334
+ let toolCallsUsed = 0;
335
+ const hasBudget = (toolCallsUsed) => toolCallsUsed < maxToolCalls;
336
+ notifyExecutionStart();
337
+ for (let i = 0; i < maxToolCalls; i++) {
338
+ validateMessages(messages);
339
+ const completion = await createCompletionWithRetry(client, {
340
+ model: input.model,
341
+ messages: messages,
342
+ tools,
343
+ tool_choice: allowTools ? "auto" : undefined,
344
+ temperature: input.temperature ?? 0.5,
345
+ });
346
+ promptTokens += completion.usage?.prompt_tokens ?? 0;
347
+ completionTokens += completion.usage?.completion_tokens ?? 0;
348
+ const firstMessage = completion.choices[0]?.message;
349
+ if (!firstMessage) {
350
+ throw new Error("Model returned empty response.");
351
+ }
352
+ const normalized = normalizeAssistantMessage(firstMessage, messages.length);
353
+ messages.push(normalizeToolMessage({
354
+ role: "assistant",
355
+ content: normalized.content,
356
+ ...(normalized.toolCalls.length > 0
357
+ ? { tool_calls: normalized.toolCalls }
358
+ : {}),
359
+ }, messages.length));
360
+ if (!allowTools || normalized.toolCalls.length === 0) {
361
+ return {
362
+ output: cleanModelOutput(normalized.content),
363
+ messages,
364
+ searchQueries,
365
+ promptTokens,
366
+ completionTokens,
367
+ executionStartedAt,
368
+ };
369
+ }
370
+ let budgetExceeded = false;
371
+ for (const [toolIndex, toolCall] of normalized.toolCalls.entries()) {
372
+ if (!hasBudget(toolCallsUsed)) {
373
+ budgetExceeded = true;
374
+ messages.push(normalizeToolMessage(toolResultMessage(toolCall.id, {
375
+ error: "Tool call budget exceeded. No remaining tool calls allowed for this run.",
376
+ }), messages.length));
377
+ continue;
378
+ }
379
+ try {
380
+ const args = buildToolArguments(toolCall.function.arguments, messages.length - 1, toolIndex);
381
+ searchQueries.push(`web_search: ${args.query}`);
382
+ toolCallsUsed += 1;
383
+ const result = await runSearchTool(toolCall.function.name, args, input.searchConfig);
384
+ messages.push(normalizeToolMessage(toolResultMessage(toolCall.id, result), messages.length));
385
+ }
386
+ catch (error) {
387
+ const payload = error instanceof Error
388
+ ? { error: error.message }
389
+ : { error: "Tool execution failed." };
390
+ messages.push(normalizeToolMessage(toolResultMessage(toolCall.id, payload), messages.length));
391
+ }
392
+ }
393
+ if (budgetExceeded || !hasBudget(toolCallsUsed)) {
394
+ break;
395
+ }
396
+ }
397
+ // Force one final text-only pass if tool-call limit is hit.
398
+ for (let attempt = 0; attempt < MAX_FINAL_CALLS; attempt++) {
399
+ validateMessages(messages);
400
+ const completion = await createCompletionWithRetry(client, {
401
+ model: input.model,
402
+ messages: messages,
403
+ temperature: input.temperature ?? 0.5,
404
+ tools: undefined,
405
+ tool_choice: undefined,
406
+ });
407
+ promptTokens += completion.usage?.prompt_tokens ?? 0;
408
+ completionTokens += completion.usage?.completion_tokens ?? 0;
409
+ const finalMessage = completion.choices[0]?.message;
410
+ if (!finalMessage) {
411
+ break;
412
+ }
413
+ const output = cleanModelOutput(typeof finalMessage.content === "string" ? finalMessage.content : "");
414
+ messages.push(normalizeToolMessage({ role: "assistant", content: finalMessage.content ?? "" }, messages.length));
415
+ if (output.length > 0 || attempt >= MAX_FINAL_CALLS - 1) {
416
+ return {
417
+ output,
418
+ messages,
419
+ searchQueries,
420
+ promptTokens,
421
+ completionTokens,
422
+ executionStartedAt,
423
+ };
424
+ }
425
+ }
426
+ return {
427
+ output: "",
428
+ messages,
429
+ searchQueries,
430
+ promptTokens,
431
+ completionTokens,
432
+ executionStartedAt,
433
+ };
434
+ }
435
+ /** run a model turn with tool support explicitly enabled. */
436
+ export async function runModelWithTools(input) {
437
+ return runModelWithOptionalTools({ ...input, allowTools: true });
438
+ }
439
+ /** clip tool-call result text to avoid runaway token usage in context. */
440
+ export function cleanSearchResultOutput(resultText, maxChars = MAX_TOOL_RESULT_CHARS) {
441
+ return resultText.length <= maxChars
442
+ ? resultText
443
+ : `${resultText.slice(0, maxChars)}\n\n[... truncated]`;
444
+ }
445
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/engine/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { PersonaConfig } from "../types.js";
2
+ /** location of custom personas persisted on disk. */
3
+ export declare let PERSONAS_FILE: string;
4
+ /** set custom personas storage path for tests or controlled environments. */
5
+ export declare function setPersonasFile(path: string): void;
6
+ /** return current custom personas storage path. */
7
+ export declare function getPersonasFile(): string;
8
+ /** complete set of built-in personas used by orchestration phases. */
9
+ export declare const PERSONAS: PersonaConfig[];
10
+ /** number of built-in personas. */
11
+ export declare const BUILTIN_PERSONA_COUNT: number;
12
+ /** generate additional personas from the model to fill a custom personas shortfall. */
13
+ export declare function generateEphemeralPersonas(query: string, count: number, runModel: (systemPrompt: string, userPrompt: string) => Promise<string>): Promise<PersonaConfig[]>;
14
+ /** load and normalize all custom personas from config storage. */
15
+ export declare function loadCustomPersonas(): PersonaConfig[];
16
+ /** write custom personas list to disk with restricted file permissions. */
17
+ export declare function saveCustomPersonas(personas: PersonaConfig[]): void;
18
+ /** append a new custom persona after validation and persist it. */
19
+ export declare function addCustomPersona(persona: PersonaConfig): {
20
+ error?: string;
21
+ };
22
+ /** remove a custom persona by id from storage. */
23
+ export declare function removeCustomPersona(id: string): boolean;
24
+ /** return built-in and custom personas with built-ins first. */
25
+ export declare function allPersonas(): PersonaConfig[];
26
+ /** find a persona by exact display name from built-ins. */
27
+ export declare function getPersonaByName(name: string): PersonaConfig | undefined;
28
+ /** select a stable prefix of personas up to requested count. */
29
+ export declare function selectPersonas(count: number): PersonaConfig[];
30
+ //# sourceMappingURL=personas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personas.d.ts","sourceRoot":"","sources":["../../src/engine/personas.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAqDjD,qDAAqD;AACrD,eAAO,IAAI,aAAa,QAAuC,CAAC;AAEhE,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,mDAAmD;AACnD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,sEAAsE;AACtE,eAAO,MAAM,QAAQ,EAAE,aAAa,EAgInC,CAAC;AAIF,mCAAmC;AACnC,eAAO,MAAM,qBAAqB,QAAkB,CAAC;AAgCrD,uFAAuF;AACvF,wBAAsB,yBAAyB,CAC9C,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GACrE,OAAO,CAAC,aAAa,EAAE,CAAC,CAyC1B;AAED,kEAAkE;AAClE,wBAAgB,kBAAkB,IAAI,aAAa,EAAE,CAmBpD;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI,CAOlE;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAkC3E;AAED,kDAAkD;AAClD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAoBvD;AAED,gEAAgE;AAChE,wBAAgB,WAAW,IAAI,aAAa,EAAE,CAE7C;AAED,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAExE;AAED,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAI7D"}