actoviq-agent-sdk 0.4.0 → 0.4.2

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 (91) hide show
  1. package/README-zh.md +15 -2
  2. package/README.md +20 -7
  3. package/dist/src/cli/actoviq-react.js +178 -3
  4. package/dist/src/cli/actoviq-react.js.map +1 -1
  5. package/dist/src/cli/actoviq-tui.js +2 -2
  6. package/dist/src/index.d.ts +17 -0
  7. package/dist/src/index.d.ts.map +1 -1
  8. package/dist/src/index.js +17 -0
  9. package/dist/src/index.js.map +1 -1
  10. package/dist/src/router/modelRouter.d.ts +46 -0
  11. package/dist/src/router/modelRouter.d.ts.map +1 -0
  12. package/dist/src/router/modelRouter.js +227 -0
  13. package/dist/src/router/modelRouter.js.map +1 -0
  14. package/dist/src/runtime/actoviqSkills.d.ts +6 -0
  15. package/dist/src/runtime/actoviqSkills.d.ts.map +1 -1
  16. package/dist/src/runtime/actoviqSkills.js +69 -1
  17. package/dist/src/runtime/actoviqSkills.js.map +1 -1
  18. package/dist/src/runtime/agentClient.d.ts +16 -0
  19. package/dist/src/runtime/agentClient.d.ts.map +1 -1
  20. package/dist/src/runtime/agentClient.js +89 -9
  21. package/dist/src/runtime/agentClient.js.map +1 -1
  22. package/dist/src/runtime/conversationEngine.d.ts +2 -0
  23. package/dist/src/runtime/conversationEngine.d.ts.map +1 -1
  24. package/dist/src/runtime/conversationEngine.js +6 -5
  25. package/dist/src/runtime/conversationEngine.js.map +1 -1
  26. package/dist/src/storage/sessionStore.d.ts.map +1 -1
  27. package/dist/src/storage/sessionStore.js +25 -6
  28. package/dist/src/storage/sessionStore.js.map +1 -1
  29. package/dist/src/team/agentPool.d.ts +26 -0
  30. package/dist/src/team/agentPool.d.ts.map +1 -0
  31. package/dist/src/team/agentPool.js +97 -0
  32. package/dist/src/team/agentPool.js.map +1 -0
  33. package/dist/src/team/modelTeam.d.ts +56 -0
  34. package/dist/src/team/modelTeam.d.ts.map +1 -0
  35. package/dist/src/team/modelTeam.js +542 -0
  36. package/dist/src/team/modelTeam.js.map +1 -0
  37. package/dist/src/team/pricing.d.ts +15 -0
  38. package/dist/src/team/pricing.d.ts.map +1 -0
  39. package/dist/src/team/pricing.js +80 -0
  40. package/dist/src/team/pricing.js.map +1 -0
  41. package/dist/src/team/teamDefinitions.d.ts +28 -0
  42. package/dist/src/team/teamDefinitions.d.ts.map +1 -0
  43. package/dist/src/team/teamDefinitions.js +151 -0
  44. package/dist/src/team/teamDefinitions.js.map +1 -0
  45. package/dist/src/tools/actoviqCoreTools.d.ts.map +1 -1
  46. package/dist/src/tools/actoviqCoreTools.js +6 -1
  47. package/dist/src/tools/actoviqCoreTools.js.map +1 -1
  48. package/dist/src/tools/enterWorktree.d.ts +11 -0
  49. package/dist/src/tools/enterWorktree.d.ts.map +1 -0
  50. package/dist/src/tools/enterWorktree.js +79 -0
  51. package/dist/src/tools/enterWorktree.js.map +1 -0
  52. package/dist/src/tools/exitWorktree.d.ts +4 -0
  53. package/dist/src/tools/exitWorktree.d.ts.map +1 -0
  54. package/dist/src/tools/exitWorktree.js +48 -0
  55. package/dist/src/tools/exitWorktree.js.map +1 -0
  56. package/dist/src/tools/tavilySearch.d.ts +12 -0
  57. package/dist/src/tools/tavilySearch.d.ts.map +1 -0
  58. package/dist/src/tools/tavilySearch.js +139 -0
  59. package/dist/src/tools/tavilySearch.js.map +1 -0
  60. package/dist/src/tui/actoviqTui.d.ts +10 -0
  61. package/dist/src/tui/actoviqTui.d.ts.map +1 -1
  62. package/dist/src/tui/actoviqTui.js +606 -35
  63. package/dist/src/tui/actoviqTui.js.map +1 -1
  64. package/dist/src/tui/editor.d.ts +2 -0
  65. package/dist/src/tui/editor.d.ts.map +1 -1
  66. package/dist/src/tui/editor.js +5 -0
  67. package/dist/src/tui/editor.js.map +1 -1
  68. package/dist/src/types.d.ts +323 -0
  69. package/dist/src/types.d.ts.map +1 -1
  70. package/dist/src/types.js.map +1 -1
  71. package/dist/src/workflow/workflowPersistence.d.ts +34 -0
  72. package/dist/src/workflow/workflowPersistence.d.ts.map +1 -0
  73. package/dist/src/workflow/workflowPersistence.js +144 -0
  74. package/dist/src/workflow/workflowPersistence.js.map +1 -0
  75. package/dist/src/workflow/workflowScriptRuntime.d.ts +22 -0
  76. package/dist/src/workflow/workflowScriptRuntime.d.ts.map +1 -0
  77. package/dist/src/workflow/workflowScriptRuntime.js +655 -0
  78. package/dist/src/workflow/workflowScriptRuntime.js.map +1 -0
  79. package/dist/src/worktree/worktreeHooks.d.ts +38 -0
  80. package/dist/src/worktree/worktreeHooks.d.ts.map +1 -0
  81. package/dist/src/worktree/worktreeHooks.js +82 -0
  82. package/dist/src/worktree/worktreeHooks.js.map +1 -0
  83. package/dist/src/worktree/worktreeInclude.d.ts +11 -0
  84. package/dist/src/worktree/worktreeInclude.d.ts.map +1 -0
  85. package/dist/src/worktree/worktreeInclude.js +65 -0
  86. package/dist/src/worktree/worktreeInclude.js.map +1 -0
  87. package/dist/src/worktree/worktreeService.d.ts +43 -0
  88. package/dist/src/worktree/worktreeService.d.ts.map +1 -0
  89. package/dist/src/worktree/worktreeService.js +356 -0
  90. package/dist/src/worktree/worktreeService.js.map +1 -0
  91. package/package.json +2 -24
@@ -0,0 +1,542 @@
1
+ import { getGlobalAgentPool } from './agentPool.js';
2
+ import { estimateCost, hasFullPricing } from './pricing.js';
3
+ import { resolveRuntimeConfig } from '../config/resolveRuntimeConfig.js';
4
+ import { createActoviqModelApi } from '../runtime/actoviqModelApi.js';
5
+ import { createOpenaiModelApi } from '../provider/openai-model-api.js';
6
+ // ═══════════════════════════════════════════════════════════════════
7
+ // Per-member ModelApi instantiation
8
+ // ═══════════════════════════════════════════════════════════════════
9
+ function resolveApiKey(apiKey) {
10
+ if (!apiKey)
11
+ return undefined;
12
+ if (apiKey.startsWith('$')) {
13
+ const varName = apiKey.slice(1);
14
+ return process.env[varName];
15
+ }
16
+ return apiKey;
17
+ }
18
+ async function createMemberApi(member) {
19
+ const resolved = await resolveRuntimeConfig({
20
+ model: member.model,
21
+ provider: member.provider,
22
+ baseURL: member.baseURL,
23
+ authToken: resolveApiKey(member.apiKey),
24
+ maxTokens: member.maxTokens ?? 32000,
25
+ workDir: process.cwd(),
26
+ });
27
+ const api = resolved.provider === 'openai'
28
+ ? createOpenaiModelApi(resolved)
29
+ : createActoviqModelApi(resolved);
30
+ return { api, model: resolved.model, maxTokens: member.maxTokens ?? 32000 };
31
+ }
32
+ // ═══════════════════════════════════════════════════════════════════
33
+ // Helpers
34
+ // ═══════════════════════════════════════════════════════════════════
35
+ async function singleModelCall(memberApi, prompt, systemPrompt, signal) {
36
+ const startedAt = Date.now();
37
+ const messages = [{ role: 'user', content: prompt }];
38
+ const response = await memberApi.api.createMessage({
39
+ model: memberApi.model,
40
+ messages,
41
+ max_tokens: memberApi.maxTokens,
42
+ system: systemPrompt,
43
+ signal,
44
+ });
45
+ const text = response.content
46
+ .filter((b) => b.type === 'text')
47
+ .map((b) => b.text)
48
+ .join('');
49
+ return {
50
+ content: text,
51
+ inputTokens: response.usage?.input_tokens ?? 0,
52
+ outputTokens: response.usage?.output_tokens ?? 0,
53
+ durationMs: Date.now() - startedAt,
54
+ };
55
+ }
56
+ function computeCost(models, inputTokens, outputTokens, perModelTokens, homeDir) {
57
+ const costWarning = !hasFullPricing(models, homeDir);
58
+ let totalEstimatedCost = 0;
59
+ const breakdown = [];
60
+ for (const [model, tokens] of perModelTokens) {
61
+ const cost = estimateCost(model, tokens.input, tokens.output, homeDir);
62
+ if (cost !== null) {
63
+ breakdown.push({ model, cost });
64
+ totalEstimatedCost = (totalEstimatedCost ?? 0) + cost;
65
+ }
66
+ else {
67
+ totalEstimatedCost = null; // null if any model lacks pricing
68
+ }
69
+ }
70
+ return {
71
+ totalInputTokens: inputTokens,
72
+ totalOutputTokens: outputTokens,
73
+ estimatedCost: totalEstimatedCost,
74
+ breakdown,
75
+ costWarning,
76
+ };
77
+ }
78
+ // ═══════════════════════════════════════════════════════════════════
79
+ // Concurrency + timeout helpers
80
+ // ═══════════════════════════════════════════════════════════════════
81
+ /** Combine the caller's abort signal with a per-call timeout (if set). */
82
+ function memberSignal(signal, timeoutMs) {
83
+ if (!timeoutMs || timeoutMs <= 0)
84
+ return signal;
85
+ const signals = [signal, AbortSignal.timeout(timeoutMs)].filter((s) => s != null);
86
+ return AbortSignal.any(signals);
87
+ }
88
+ /** Run fn over items with at most `limit` in flight; preserves input order. */
89
+ async function mapWithConcurrency(items, limit, fn) {
90
+ const results = new Array(items.length);
91
+ let next = 0;
92
+ const workers = Array.from({ length: Math.max(1, Math.min(limit, items.length)) }, async () => {
93
+ while (true) {
94
+ const i = next++;
95
+ if (i >= items.length)
96
+ return;
97
+ results[i] = await fn(items[i], i);
98
+ }
99
+ });
100
+ await Promise.all(workers);
101
+ return results;
102
+ }
103
+ // ═══════════════════════════════════════════════════════════════════
104
+ // Reviewer Mode — single read-only ReAct reviewer the main agent invokes
105
+ // ═══════════════════════════════════════════════════════════════════
106
+ /** Read-only tool set for expert/reviewer agents (no write/edit/bash/delegation). */
107
+ async function buildReadOnlyExpertTools(cwd) {
108
+ const { createActoviqFileTools } = await import('../tools/actoviqFileTools.js');
109
+ const { createActoviqWebTools } = await import('../tools/actoviqWebTools.js');
110
+ const { createTavilySearchTool } = await import('../tools/tavilySearch.js');
111
+ const READ_ONLY_FILE_TOOLS = new Set(['Read', 'Glob', 'Grep']);
112
+ return [
113
+ ...createActoviqFileTools({ cwd }).filter((t) => READ_ONLY_FILE_TOOLS.has(t.name)),
114
+ ...createActoviqWebTools().filter((t) => t.name === 'WebFetch'),
115
+ createTavilySearchTool(),
116
+ ];
117
+ }
118
+ /**
119
+ * A single read-only ReAct agent (Read/Glob/Grep + TavilySearch/WebFetch) that
120
+ * inspects the project and returns confirmed issues. The main agent (the
121
+ * "executor") invokes it as a tool, decides what `context` to inject — what it
122
+ * did and the results it obtained, placed in the reviewer's system prompt — and
123
+ * keeps final authority over the findings. The reviewer is told to scrutinize
124
+ * hard but confirm ONLY issues it can actually verify: no speculation, no
125
+ * fabricated or padded findings.
126
+ */
127
+ async function runReviewerMode(task, definition, signal, context, workDir) {
128
+ const startedAt = Date.now();
129
+ const reviewer = definition.reviewer;
130
+ // Lazy import avoids a circular dependency (agentClient imports modelTeam).
131
+ const { createAgentSdk } = await import('../runtime/agentClient.js');
132
+ const cwd = workDir ?? process.cwd();
133
+ const reviewerFraming = [
134
+ 'You are a meticulous reviewer on a multi-model team.',
135
+ 'Inspect the project using ONLY your read-only tools (Read/Glob/Grep) and the web',
136
+ '(TavilySearch/WebFetch). You cannot modify files, write code, or run commands.',
137
+ 'Scrutinize as thoroughly as you can and surface every genuine problem — bugs, broken',
138
+ 'logic, security holes, missed edge cases, violated requirements — each with concrete',
139
+ 'file:line evidence. Critically: confirm ONLY issues you can actually verify from the',
140
+ 'code or files. Do not speculate, invent, or pad the list; if something is uncertain,',
141
+ 'say so explicitly instead of asserting it. If you find no real issues, say so plainly.',
142
+ ].join(' ');
143
+ const systemPrompt = [
144
+ reviewerFraming,
145
+ context ? `\n## Context from the requesting agent (what it did and obtained)\n${context}` : '',
146
+ reviewer.systemPrompt ? `\n${reviewer.systemPrompt}` : '',
147
+ ].filter(Boolean).join('\n');
148
+ const perModelTokens = new Map();
149
+ let totalInput = 0;
150
+ let totalOutput = 0;
151
+ let report;
152
+ let toolCalls = 0;
153
+ const pool = getGlobalAgentPool();
154
+ let slot;
155
+ let sdk;
156
+ try {
157
+ slot = await pool.acquire(definition.timeoutMs);
158
+ sdk = await createAgentSdk({
159
+ model: reviewer.model,
160
+ provider: reviewer.provider,
161
+ baseURL: reviewer.baseURL,
162
+ authToken: resolveApiKey(reviewer.apiKey),
163
+ maxTokens: reviewer.maxTokens ?? 32000,
164
+ workDir: cwd,
165
+ tools: await buildReadOnlyExpertTools(cwd),
166
+ permissionMode: 'bypassPermissions',
167
+ maxToolIterations: definition.maxIterations ?? 16,
168
+ systemPrompt,
169
+ });
170
+ const result = await sdk.run(task, { signal: memberSignal(signal, definition.timeoutMs) });
171
+ report = result.text;
172
+ toolCalls = result.toolCalls.length;
173
+ const input = result.requests.reduce((s, r) => s + (r.usage?.input_tokens ?? 0), 0);
174
+ const output = result.requests.reduce((s, r) => s + (r.usage?.output_tokens ?? 0), 0);
175
+ perModelTokens.set(reviewer.model, { input, output });
176
+ totalInput = input;
177
+ totalOutput = output;
178
+ }
179
+ catch (err) {
180
+ const message = err instanceof Error ? err.message : String(err);
181
+ report = `[ERROR: reviewer ${reviewer.model} failed — ${message}]`;
182
+ }
183
+ finally {
184
+ if (sdk)
185
+ await sdk.close();
186
+ slot?.release();
187
+ }
188
+ const cost = computeCost([...perModelTokens.keys()], totalInput, totalOutput, perModelTokens);
189
+ return {
190
+ answer: report,
191
+ mode: 'reviewer',
192
+ report,
193
+ toolCalls,
194
+ cost,
195
+ durationMs: Date.now() - startedAt,
196
+ };
197
+ }
198
+ // ═══════════════════════════════════════════════════════════════════
199
+ // Panel-Analysis Mode — read-only ReAct expert panel + optional convergence
200
+ // ═══════════════════════════════════════════════════════════════════
201
+ /**
202
+ * Unified expert panel. Each member is an independent, read-only ReAct agent
203
+ * (Read/Glob/Grep + TavilySearch/WebFetch — no write/edit/bash/delegation) that
204
+ * investigates the task in parallel and returns a findings report.
205
+ *
206
+ * - No `primary` → single-pass advisory: the caller (the main agent) decides
207
+ * what to do with the concatenated reports (the original `analysis` behavior).
208
+ * - With a `primary` → multi-round convergence: after each round the primary
209
+ * synthesizes the findings and decides FINALIZE or CONTINUE; on CONTINUE the
210
+ * panel re-investigates a refined question with prior findings as context.
211
+ * Harness principle preserved: the primary decides convergence; `maxRounds`
212
+ * (default 100) is only a safety cap.
213
+ *
214
+ * `analysis` and `panel-analysis` both route here; the result `mode` echoes the
215
+ * requested alias.
216
+ */
217
+ async function runPanelAnalysisMode(prompt, definition, signal, workDir) {
218
+ const startedAt = Date.now();
219
+ // Lazy imports avoid a circular dependency (agentClient imports modelTeam).
220
+ const { createAgentSdk } = await import('../runtime/agentClient.js');
221
+ const cwd = workDir ?? process.cwd();
222
+ const readOnlyTools = await buildReadOnlyExpertTools(cwd);
223
+ // Bounded ReAct depth per member so a panel can't run away (configurable).
224
+ const memberMaxIterations = definition.maxIterations ?? 16;
225
+ const pool = getGlobalAgentPool();
226
+ const perModelTokens = new Map();
227
+ let totalInput = 0;
228
+ let totalOutput = 0;
229
+ const analysisFraming = [
230
+ 'You are an analyst on a multi-model expert panel.',
231
+ 'Investigate the task using ONLY your read-only tools: read local files (Read/Glob/Grep)',
232
+ 'and research the web (TavilySearch/WebFetch). You cannot modify files, write code, or run',
233
+ 'commands — you only analyze and advise. Produce a focused findings report: key facts (with',
234
+ 'sources), risks, blind spots, concrete recommendations, and anything the main agent should',
235
+ 'verify. Be specific and decision-useful.',
236
+ ].join(' ');
237
+ // One investigation round: every member investigates `question` in parallel as
238
+ // a read-only ReAct agent. `priorContext` (earlier rounds' findings) lets
239
+ // members build on the deliberation instead of starting cold.
240
+ const investigate = async (round, question, priorContext) => {
241
+ const memberPrompt = priorContext
242
+ ? `${question}\n\n## Prior panel findings (build on these; don't repeat established points)\n${priorContext}`
243
+ : question;
244
+ return mapWithConcurrency(definition.members, definition.maxParallel ?? definition.members.length, async (member) => {
245
+ const start = Date.now();
246
+ let slot;
247
+ let sdk;
248
+ try {
249
+ slot = await pool.acquire();
250
+ sdk = await createAgentSdk({
251
+ model: member.model,
252
+ provider: member.provider,
253
+ baseURL: member.baseURL,
254
+ authToken: resolveApiKey(member.apiKey),
255
+ maxTokens: member.maxTokens ?? 32000,
256
+ workDir: cwd,
257
+ tools: readOnlyTools,
258
+ permissionMode: 'bypassPermissions',
259
+ maxToolIterations: memberMaxIterations,
260
+ systemPrompt: member.systemPrompt
261
+ ? `${analysisFraming}\n\n${member.systemPrompt}`
262
+ : analysisFraming,
263
+ });
264
+ const result = await sdk.run(memberPrompt, {
265
+ signal: memberSignal(signal, definition.timeoutMs),
266
+ });
267
+ const input = result.requests.reduce((s, r) => s + (r.usage?.input_tokens ?? 0), 0);
268
+ const output = result.requests.reduce((s, r) => s + (r.usage?.output_tokens ?? 0), 0);
269
+ const ex = perModelTokens.get(member.model) ?? { input: 0, output: 0 };
270
+ ex.input += input;
271
+ ex.output += output;
272
+ perModelTokens.set(member.model, ex);
273
+ totalInput += input;
274
+ totalOutput += output;
275
+ return {
276
+ model: member.model,
277
+ report: result.text,
278
+ toolCalls: result.toolCalls.length,
279
+ durationMs: Date.now() - start,
280
+ round,
281
+ };
282
+ }
283
+ catch (err) {
284
+ const message = err instanceof Error ? err.message : String(err);
285
+ return {
286
+ model: member.model,
287
+ report: `[ERROR: ${member.model} analysis failed — ${message}]`,
288
+ toolCalls: 0,
289
+ durationMs: Date.now() - start,
290
+ round,
291
+ };
292
+ }
293
+ finally {
294
+ if (sdk)
295
+ await sdk.close();
296
+ slot?.release();
297
+ }
298
+ });
299
+ };
300
+ const resultMode = definition.mode === 'analysis' ? 'analysis' : 'panel-analysis';
301
+ // With a primary, build the decision callback that synthesizes findings and
302
+ // votes FINALIZE/CONTINUE each round; without one, the panel is single-pass.
303
+ let decide;
304
+ if (definition.primary) {
305
+ const primaryApi = await createMemberApi(definition.primary);
306
+ const primaryModel = definition.primary.model;
307
+ const primarySystem = definition.primary.systemPrompt;
308
+ decide = async (deliberationLog) => {
309
+ const decisionPrompt = [
310
+ 'You are the primary synthesizer over a panel of expert analysts; each investigated the task with read-only tools and reported findings.',
311
+ 'Review the full panel findings, then decide whether they are sufficient to answer the task.',
312
+ '',
313
+ 'Original task:',
314
+ prompt,
315
+ '',
316
+ 'Full panel findings so far:',
317
+ deliberationLog,
318
+ '',
319
+ 'Respond in one of these formats:',
320
+ '',
321
+ 'To FINALIZE (findings are sufficient):',
322
+ 'FINALIZE',
323
+ '<your comprehensive synthesized answer, grounded in the findings>',
324
+ '',
325
+ 'To CONTINUE (deeper investigation needed):',
326
+ 'CONTINUE',
327
+ '<a refined question and the specific aspects the panel should investigate next>',
328
+ ].join('\n');
329
+ const decision = await singleModelCall(primaryApi, decisionPrompt, primarySystem, memberSignal(signal, definition.timeoutMs));
330
+ totalInput += decision.inputTokens;
331
+ totalOutput += decision.outputTokens;
332
+ const pex = perModelTokens.get(primaryModel) ?? { input: 0, output: 0 };
333
+ pex.input += decision.inputTokens;
334
+ pex.output += decision.outputTokens;
335
+ perModelTokens.set(primaryModel, pex);
336
+ return decision.content;
337
+ };
338
+ }
339
+ const { answer, rounds, reports } = await orchestratePanel({
340
+ prompt,
341
+ maxRounds: definition.maxRounds ?? 100,
342
+ investigate,
343
+ decide,
344
+ });
345
+ const cost = computeCost([...perModelTokens.keys()], totalInput, totalOutput, perModelTokens);
346
+ return {
347
+ answer,
348
+ mode: resultMode,
349
+ reports,
350
+ rounds,
351
+ cost,
352
+ durationMs: Date.now() - startedAt,
353
+ };
354
+ }
355
+ /**
356
+ * Orchestrate the panel over an injectable `investigate` (one round of member
357
+ * reports) and optional `decide` (the primary's synthesize-or-continue call).
358
+ *
359
+ * - No `decide` → single-pass advisory: round 1 only; answer = labeled reports.
360
+ * - With `decide` → multi-round convergence: after each round the primary votes
361
+ * FINALIZE (synthesize) or CONTINUE (refined question); loops until FINALIZE
362
+ * or `maxRounds` (safety cap). The keyword match is case-insensitive, and any
363
+ * decision that is not a leading CONTINUE finalizes (graceful default).
364
+ *
365
+ * Exported so the convergence logic is unit-testable without real model calls.
366
+ */
367
+ export async function orchestratePanel(opts) {
368
+ const label = (rs) => rs.map((r) => `### ${r.model}\n${r.report}`).join('\n\n---\n\n');
369
+ const allReports = [];
370
+ let rounds = 1;
371
+ let currentReports = await opts.investigate(1, opts.prompt);
372
+ allReports.push(...currentReports);
373
+ // No primary → single-pass advisory (original `analysis` behavior).
374
+ if (!opts.decide) {
375
+ return { answer: label(currentReports), rounds, reports: allReports };
376
+ }
377
+ const deliberationLog = [`## Round 1 — Panel findings\n${label(currentReports)}`];
378
+ while (true) {
379
+ const content = await opts.decide(deliberationLog.join('\n\n---\n\n'), rounds);
380
+ const wantsContinue = content.trim().toUpperCase().startsWith('CONTINUE');
381
+ if (wantsContinue && rounds < opts.maxRounds) {
382
+ const refined = content.replace(/^CONTINUE\s*/i, '').trim() || opts.prompt;
383
+ deliberationLog.push(`## Round ${rounds} — Primary decision\nCONTINUE: ${refined}`);
384
+ rounds++;
385
+ currentReports = await opts.investigate(rounds, refined, label(currentReports));
386
+ allReports.push(...currentReports);
387
+ deliberationLog.push(`## Round ${rounds} — Panel findings\n${label(currentReports)}`);
388
+ }
389
+ else {
390
+ // FINALIZE, or the safety cap was reached mid-deliberation.
391
+ const answer = wantsContinue
392
+ ? label(currentReports) // cap hit: hand back the findings unsynthesized
393
+ : content.replace(/^FINALIZE\s*/i, '').trim() || label(currentReports);
394
+ return { answer, rounds, reports: allReports };
395
+ }
396
+ }
397
+ }
398
+ // ═══════════════════════════════════════════════════════════════════
399
+ // ModelTeam class
400
+ // ═══════════════════════════════════════════════════════════════════
401
+ export class ModelTeam {
402
+ name;
403
+ definition;
404
+ constructor(definition) {
405
+ this.name = definition.name;
406
+ this.definition = definition;
407
+ }
408
+ /**
409
+ * Ask the team. `opts.context` is injected into the reviewer's system prompt
410
+ * (reviewer mode only — what the main agent did and obtained). Returns the
411
+ * mode-specific result.
412
+ */
413
+ async ask(prompt, signal, opts) {
414
+ switch (this.definition.mode) {
415
+ case 'reviewer':
416
+ case 'executor-reviewer': // alias: the retired executor loop now runs the single reviewer
417
+ return runReviewerMode(prompt, this.definition, signal, opts?.context, opts?.workDir);
418
+ case 'panel': // alias: retired pure-text panel now runs the unified engine
419
+ case 'analysis':
420
+ case 'panel-analysis':
421
+ return runPanelAnalysisMode(prompt, this.definition, signal, opts?.workDir);
422
+ default:
423
+ throw new Error(`Unknown team mode: ${this.definition.mode}`);
424
+ }
425
+ }
426
+ }
427
+ /**
428
+ * Create a ModelTeam from a definition or from disk.
429
+ */
430
+ export function createModelTeam(definition) {
431
+ // Validate
432
+ validateTeamDefinition(definition);
433
+ return new ModelTeam(definition);
434
+ }
435
+ function validateTeamDefinition(def) {
436
+ if (!def.name)
437
+ throw new Error('Team definition must have a name.');
438
+ if (!def.mode)
439
+ throw new Error('Team definition must specify a mode.');
440
+ switch (def.mode) {
441
+ case 'reviewer':
442
+ case 'executor-reviewer': // retired alias: needs only a reviewer now
443
+ if (!def.reviewer)
444
+ throw new Error('Reviewer mode requires a reviewer member.');
445
+ break;
446
+ case 'panel': // retired alias of panel-analysis (primary now optional)
447
+ case 'analysis':
448
+ case 'panel-analysis':
449
+ if (!def.members || def.members.length === 0)
450
+ throw new Error('Panel-analysis mode requires at least one panel member.');
451
+ if (def.members.length > 8)
452
+ throw new Error('Panel-analysis mode supports at most 8 members.');
453
+ break;
454
+ }
455
+ }
456
+ /**
457
+ * Create a team tool that agents can invoke.
458
+ * Returns an AgentToolDefinition with interruptBehavior: 'block'.
459
+ */
460
+ export function createTeamTool(definition) {
461
+ const team = createModelTeam(definition);
462
+ const isReviewer = definition.mode === 'reviewer' || definition.mode === 'executor-reviewer';
463
+ const isPanel = definition.mode === 'analysis' || definition.mode === 'panel-analysis';
464
+ return {
465
+ kind: 'local',
466
+ name: definition.name,
467
+ description: definition.description ??
468
+ (isReviewer
469
+ ? 'Reviewer: a single read-only agent inspects the project and reports only genuine, verifiable issues. Pass { task } (what to check) and optional { context } (what you did + the results). It advises; you decide.'
470
+ : isPanel
471
+ ? 'Expert panel: independent read-only multi-model analysis (advisory; optional primary-driven convergence). You decide what to do with the findings.'
472
+ : `Multi-model team (${definition.mode} mode)`),
473
+ inputSchema: {
474
+ parse: (input) => input,
475
+ _type: undefined,
476
+ },
477
+ inputJsonSchema: isReviewer
478
+ ? {
479
+ type: 'object',
480
+ properties: {
481
+ task: { type: 'string', description: 'What the reviewer should scrutinize' },
482
+ context: { type: 'string', description: 'What you did and the results you obtained (injected into the reviewer system prompt)' },
483
+ },
484
+ required: ['task'],
485
+ additionalProperties: true,
486
+ }
487
+ : {
488
+ type: 'object',
489
+ properties: {
490
+ prompt: { type: 'string', description: 'The question or task for the team' },
491
+ },
492
+ required: ['prompt'],
493
+ // Tolerate extra fields the model may add — a strict schema here caused
494
+ // intermittent "schema error" rejections that silently skipped the panel.
495
+ additionalProperties: true,
496
+ },
497
+ async execute(input) {
498
+ // Accept the call however the model phrases it (bare string or any of a few
499
+ // common keys) so a formatting quirk never drops the invocation.
500
+ const obj = (input ?? {});
501
+ if (isReviewer) {
502
+ const taskCandidate = typeof input === 'string' ? input : obj.task ?? obj.prompt ?? obj.question ?? obj.input;
503
+ const task = typeof taskCandidate === 'string' ? taskCandidate.trim() : '';
504
+ if (!task) {
505
+ throw new Error(`Reviewer "${definition.name}" requires a non-empty "task" string.`);
506
+ }
507
+ const context = typeof obj.context === 'string' ? obj.context : undefined;
508
+ const result = await team.ask(task, undefined, { context });
509
+ return JSON.stringify({ answer: result.answer, mode: result.mode, cost: result.cost });
510
+ }
511
+ const candidate = typeof input === 'string'
512
+ ? input
513
+ : obj.prompt ?? obj.query ?? obj.question ?? obj.task ?? obj.input;
514
+ const prompt = typeof candidate === 'string' ? candidate.trim() : '';
515
+ if (!prompt) {
516
+ throw new Error(`Team "${definition.name}" requires a non-empty "prompt" string.`);
517
+ }
518
+ const result = await team.ask(prompt);
519
+ return JSON.stringify({
520
+ answer: result.answer,
521
+ mode: result.mode,
522
+ cost: result.cost,
523
+ });
524
+ },
525
+ interruptBehavior: 'block',
526
+ isConcurrencySafe: () => false,
527
+ prompt: async () => [
528
+ `## ${definition.name} (Model Team: ${definition.mode})`,
529
+ definition.description ?? '',
530
+ '',
531
+ isReviewer
532
+ ? 'Call this tool with { task } (what to scrutinize) and optional { context } (what you did and the results you got). A single read-only agent inspects the code/web and reports only issues it can verify — no speculation. You keep final authority; re-invoke after changes to re-check.'
533
+ : isPanel
534
+ ? 'Call this tool with a { prompt } to have an expert panel of independent read-only agents investigate (read local code + search the web) and each return a findings report. They only analyze and advise — you keep full control and decide what to do with their input. With a configured primary the panel also converges over multiple rounds into a synthesized answer. Use it to assist analysis on large or complex tasks.'
535
+ : 'Call this tool with a { prompt } to get a multi-model synthesized answer.',
536
+ isReviewer
537
+ ? `Reviewer: ${definition.reviewer?.model ?? 'configured via definition'}`
538
+ : `Members: ${definition.members?.map((m) => m.model).join(', ') ?? 'configured via definition'}`,
539
+ ].join('\n'),
540
+ };
541
+ }
542
+ //# sourceMappingURL=modelTeam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelTeam.js","sourceRoot":"","sources":["../../../src/team/modelTeam.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Pricing data for major AI models.
3
+ * Built-in table updated per release. Users can override via
4
+ * ~/.actoviq/pricing.json: { "<model-slug>": { "input": <$/1M>, "output": <$/1M> } }
5
+ */
6
+ import type { ModelPricing } from '../types.js';
7
+ /** Get pricing for a model. Returns null if unavailable. */
8
+ export declare function getModelPricing(model: string, homeDir?: string): ModelPricing | null;
9
+ /** Compute cost from token counts. Returns null if pricing unavailable. */
10
+ export declare function estimateCost(model: string, inputTokens: number, outputTokens: number, homeDir?: string): number | null;
11
+ /** Check if all models in a list have pricing data. */
12
+ export declare function hasFullPricing(models: string[], homeDir?: string): boolean;
13
+ /** Clear cached user pricing (for testing). */
14
+ export declare function clearPricingCache(): void;
15
+ //# sourceMappingURL=pricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../../src/team/pricing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiEhD,4DAA4D;AAC5D,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAIpF;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAIf;AAED,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAE1E;AAED,+CAA+C;AAC/C,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC"}