@sensigo/realm-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 (190) hide show
  1. package/README.md +109 -0
  2. package/dist/agent/agent-utils.d.ts +27 -0
  3. package/dist/agent/agent-utils.d.ts.map +1 -0
  4. package/dist/agent/agent-utils.js +79 -0
  5. package/dist/agent/agent-utils.js.map +1 -0
  6. package/dist/agent/anthropic-provider.d.ts +23 -0
  7. package/dist/agent/anthropic-provider.d.ts.map +1 -0
  8. package/dist/agent/anthropic-provider.js +245 -0
  9. package/dist/agent/anthropic-provider.js.map +1 -0
  10. package/dist/agent/gate/slack-gate-notifier.d.ts +80 -0
  11. package/dist/agent/gate/slack-gate-notifier.d.ts.map +1 -0
  12. package/dist/agent/gate/slack-gate-notifier.js +315 -0
  13. package/dist/agent/gate/slack-gate-notifier.js.map +1 -0
  14. package/dist/agent/gate/slack-gate-server.d.ts +30 -0
  15. package/dist/agent/gate/slack-gate-server.d.ts.map +1 -0
  16. package/dist/agent/gate/slack-gate-server.js +99 -0
  17. package/dist/agent/gate/slack-gate-server.js.map +1 -0
  18. package/dist/agent/gate/slack-socket-client.d.ts +20 -0
  19. package/dist/agent/gate/slack-socket-client.d.ts.map +1 -0
  20. package/dist/agent/gate/slack-socket-client.js +141 -0
  21. package/dist/agent/gate/slack-socket-client.js.map +1 -0
  22. package/dist/agent/gate-intent-interpreter.d.ts +29 -0
  23. package/dist/agent/gate-intent-interpreter.d.ts.map +1 -0
  24. package/dist/agent/gate-intent-interpreter.js +33 -0
  25. package/dist/agent/gate-intent-interpreter.js.map +1 -0
  26. package/dist/agent/index.d.ts +4 -0
  27. package/dist/agent/index.d.ts.map +1 -0
  28. package/dist/agent/index.js +4 -0
  29. package/dist/agent/index.js.map +1 -0
  30. package/dist/agent/llm-provider.d.ts +46 -0
  31. package/dist/agent/llm-provider.d.ts.map +1 -0
  32. package/dist/agent/llm-provider.js +55 -0
  33. package/dist/agent/llm-provider.js.map +1 -0
  34. package/dist/agent/mcp/mcp-client.d.ts +18 -0
  35. package/dist/agent/mcp/mcp-client.d.ts.map +1 -0
  36. package/dist/agent/mcp/mcp-client.js +108 -0
  37. package/dist/agent/mcp/mcp-client.js.map +1 -0
  38. package/dist/agent/mcp/mcp-extensions.d.ts +40 -0
  39. package/dist/agent/mcp/mcp-extensions.d.ts.map +1 -0
  40. package/dist/agent/mcp/mcp-extensions.js +2 -0
  41. package/dist/agent/mcp/mcp-extensions.js.map +1 -0
  42. package/dist/agent/mcp-client.d.ts +18 -0
  43. package/dist/agent/mcp-client.d.ts.map +1 -0
  44. package/dist/agent/mcp-client.js +108 -0
  45. package/dist/agent/mcp-client.js.map +1 -0
  46. package/dist/agent/mcp-types.d.ts +40 -0
  47. package/dist/agent/mcp-types.d.ts.map +1 -0
  48. package/dist/agent/mcp-types.js +2 -0
  49. package/dist/agent/mcp-types.js.map +1 -0
  50. package/dist/agent/openai-provider.d.ts +30 -0
  51. package/dist/agent/openai-provider.d.ts.map +1 -0
  52. package/dist/agent/openai-provider.js +253 -0
  53. package/dist/agent/openai-provider.js.map +1 -0
  54. package/dist/agent/openai-reasoning-provider.d.ts +18 -0
  55. package/dist/agent/openai-reasoning-provider.d.ts.map +1 -0
  56. package/dist/agent/openai-reasoning-provider.js +76 -0
  57. package/dist/agent/openai-reasoning-provider.js.map +1 -0
  58. package/dist/agent/preflight.d.ts +36 -0
  59. package/dist/agent/preflight.d.ts.map +1 -0
  60. package/dist/agent/preflight.js +81 -0
  61. package/dist/agent/preflight.js.map +1 -0
  62. package/dist/agent/providers/agent-utils.d.ts +27 -0
  63. package/dist/agent/providers/agent-utils.d.ts.map +1 -0
  64. package/dist/agent/providers/agent-utils.js +79 -0
  65. package/dist/agent/providers/agent-utils.js.map +1 -0
  66. package/dist/agent/providers/anthropic-provider.d.ts +23 -0
  67. package/dist/agent/providers/anthropic-provider.d.ts.map +1 -0
  68. package/dist/agent/providers/anthropic-provider.js +257 -0
  69. package/dist/agent/providers/anthropic-provider.js.map +1 -0
  70. package/dist/agent/providers/llm-provider.d.ts +46 -0
  71. package/dist/agent/providers/llm-provider.d.ts.map +1 -0
  72. package/dist/agent/providers/llm-provider.js +56 -0
  73. package/dist/agent/providers/llm-provider.js.map +1 -0
  74. package/dist/agent/providers/openai-provider.d.ts +30 -0
  75. package/dist/agent/providers/openai-provider.d.ts.map +1 -0
  76. package/dist/agent/providers/openai-provider.js +253 -0
  77. package/dist/agent/providers/openai-provider.js.map +1 -0
  78. package/dist/agent/providers/openai-reasoning-provider.d.ts +19 -0
  79. package/dist/agent/providers/openai-reasoning-provider.d.ts.map +1 -0
  80. package/dist/agent/providers/openai-reasoning-provider.js +89 -0
  81. package/dist/agent/providers/openai-reasoning-provider.js.map +1 -0
  82. package/dist/agent/run-agent.d.ts +50 -0
  83. package/dist/agent/run-agent.d.ts.map +1 -0
  84. package/dist/agent/run-agent.js +327 -0
  85. package/dist/agent/run-agent.js.map +1 -0
  86. package/dist/agent/slack-gate-notifier.d.ts +80 -0
  87. package/dist/agent/slack-gate-notifier.d.ts.map +1 -0
  88. package/dist/agent/slack-gate-notifier.js +315 -0
  89. package/dist/agent/slack-gate-notifier.js.map +1 -0
  90. package/dist/agent/slack-gate-poller.d.ts +28 -0
  91. package/dist/agent/slack-gate-poller.d.ts.map +1 -0
  92. package/dist/agent/slack-gate-poller.js +66 -0
  93. package/dist/agent/slack-gate-poller.js.map +1 -0
  94. package/dist/agent/slack-gate-server.d.ts +30 -0
  95. package/dist/agent/slack-gate-server.d.ts.map +1 -0
  96. package/dist/agent/slack-gate-server.js +99 -0
  97. package/dist/agent/slack-gate-server.js.map +1 -0
  98. package/dist/agent/slack-socket-client.d.ts +20 -0
  99. package/dist/agent/slack-socket-client.d.ts.map +1 -0
  100. package/dist/agent/slack-socket-client.js +141 -0
  101. package/dist/agent/slack-socket-client.js.map +1 -0
  102. package/dist/commands/agent.d.ts +3 -0
  103. package/dist/commands/agent.d.ts.map +1 -0
  104. package/dist/commands/agent.js +183 -0
  105. package/dist/commands/agent.js.map +1 -0
  106. package/dist/commands/cleanup.d.ts +16 -0
  107. package/dist/commands/cleanup.d.ts.map +1 -0
  108. package/dist/commands/cleanup.js +79 -0
  109. package/dist/commands/cleanup.js.map +1 -0
  110. package/dist/commands/diff.d.ts +41 -0
  111. package/dist/commands/diff.d.ts.map +1 -0
  112. package/dist/commands/diff.js +203 -0
  113. package/dist/commands/diff.js.map +1 -0
  114. package/dist/commands/init.d.ts +10 -0
  115. package/dist/commands/init.d.ts.map +1 -0
  116. package/dist/commands/init.js +97 -0
  117. package/dist/commands/init.js.map +1 -0
  118. package/dist/commands/inspect.d.ts +14 -0
  119. package/dist/commands/inspect.d.ts.map +1 -0
  120. package/dist/commands/inspect.js +224 -0
  121. package/dist/commands/inspect.js.map +1 -0
  122. package/dist/commands/list.d.ts +18 -0
  123. package/dist/commands/list.d.ts.map +1 -0
  124. package/dist/commands/list.js +88 -0
  125. package/dist/commands/list.js.map +1 -0
  126. package/dist/commands/mcp.d.ts +8 -0
  127. package/dist/commands/mcp.d.ts.map +1 -0
  128. package/dist/commands/mcp.js +22 -0
  129. package/dist/commands/mcp.js.map +1 -0
  130. package/dist/commands/migrate.d.ts +3 -0
  131. package/dist/commands/migrate.d.ts.map +1 -0
  132. package/dist/commands/migrate.js +42 -0
  133. package/dist/commands/migrate.js.map +1 -0
  134. package/dist/commands/register.d.ts +6 -0
  135. package/dist/commands/register.d.ts.map +1 -0
  136. package/dist/commands/register.js +51 -0
  137. package/dist/commands/register.js.map +1 -0
  138. package/dist/commands/replay-format.d.ts +3 -0
  139. package/dist/commands/replay-format.d.ts.map +1 -0
  140. package/dist/commands/replay-format.js +10 -0
  141. package/dist/commands/replay-format.js.map +1 -0
  142. package/dist/commands/replay.d.ts +38 -0
  143. package/dist/commands/replay.d.ts.map +1 -0
  144. package/dist/commands/replay.js +173 -0
  145. package/dist/commands/replay.js.map +1 -0
  146. package/dist/commands/respond.d.ts +20 -0
  147. package/dist/commands/respond.d.ts.map +1 -0
  148. package/dist/commands/respond.js +49 -0
  149. package/dist/commands/respond.js.map +1 -0
  150. package/dist/commands/resume.d.ts +15 -0
  151. package/dist/commands/resume.d.ts.map +1 -0
  152. package/dist/commands/resume.js +63 -0
  153. package/dist/commands/resume.js.map +1 -0
  154. package/dist/commands/run.d.ts +3 -0
  155. package/dist/commands/run.d.ts.map +1 -0
  156. package/dist/commands/run.js +127 -0
  157. package/dist/commands/run.js.map +1 -0
  158. package/dist/commands/serve.d.ts +33 -0
  159. package/dist/commands/serve.d.ts.map +1 -0
  160. package/dist/commands/serve.js +144 -0
  161. package/dist/commands/serve.js.map +1 -0
  162. package/dist/commands/test.d.ts +12 -0
  163. package/dist/commands/test.d.ts.map +1 -0
  164. package/dist/commands/test.js +58 -0
  165. package/dist/commands/test.js.map +1 -0
  166. package/dist/commands/validate.d.ts +3 -0
  167. package/dist/commands/validate.d.ts.map +1 -0
  168. package/dist/commands/validate.js +35 -0
  169. package/dist/commands/validate.js.map +1 -0
  170. package/dist/commands/watch.d.ts +18 -0
  171. package/dist/commands/watch.d.ts.map +1 -0
  172. package/dist/commands/watch.js +112 -0
  173. package/dist/commands/watch.js.map +1 -0
  174. package/dist/commands/webhook.d.ts +51 -0
  175. package/dist/commands/webhook.d.ts.map +1 -0
  176. package/dist/commands/webhook.js +227 -0
  177. package/dist/commands/webhook.js.map +1 -0
  178. package/dist/commands-registry.d.ts +7 -0
  179. package/dist/commands-registry.d.ts.map +1 -0
  180. package/dist/commands-registry.js +44 -0
  181. package/dist/commands-registry.js.map +1 -0
  182. package/dist/index.d.ts +3 -0
  183. package/dist/index.d.ts.map +1 -0
  184. package/dist/index.js +21 -0
  185. package/dist/index.js.map +1 -0
  186. package/dist/store/replay-store.d.ts +29 -0
  187. package/dist/store/replay-store.d.ts.map +1 -0
  188. package/dist/store/replay-store.js +31 -0
  189. package/dist/store/replay-store.js.map +1 -0
  190. package/package.json +83 -0
@@ -0,0 +1,257 @@
1
+ // anthropic-provider.ts — Anthropic LLM provider implementation for realm agent.
2
+ // Requires @anthropic-ai/sdk >= 0.20.0 as an optional peer dependency (npm install @anthropic-ai/sdk).
3
+ import { WorkflowError } from '@sensigo/realm';
4
+ import { ToolCapableLlmProvider } from './llm-provider.js';
5
+ import { sanitizeError, serializeToolResult, parseNamespacedId, tryParseJson, validateSchema, rejectAfter, buildSystemPrompt, } from './agent-utils.js';
6
+ /**
7
+ * Returns the maximum output tokens for the given Anthropic model.
8
+ * The Anthropic Messages API requires max_tokens — this must always produce a valid value.
9
+ * Source: https://docs.anthropic.com/en/docs/about-claude/models/all-models
10
+ */
11
+ function resolveMaxTokens(model) {
12
+ // claude-3.5 and claude-4 families support 8192 output tokens.
13
+ // Matches: claude-3-5-*, claude-3.5-*, claude-<name>-4-*, etc.
14
+ if (/claude-(3[-.]5|[a-z]+-4)/i.test(model))
15
+ return 8192;
16
+ return 4096; // safe fallback for claude-3 and any unrecognised model
17
+ }
18
+ /**
19
+ * Anthropic LLM provider for realm agent.
20
+ * Uses the Messages API and extracts JSON from the first text content block.
21
+ * Retries once if the model returns non-JSON content.
22
+ */
23
+ export class AnthropicProvider extends ToolCapableLlmProvider {
24
+ model;
25
+ constructor(model) {
26
+ super();
27
+ this.model = model;
28
+ }
29
+ async callStep(prompt, inputSchema) {
30
+ // Dynamically import @anthropic-ai/sdk to keep it an optional peer dependency.
31
+ // See openai-provider.ts for an explanation of the 'string' cast technique.
32
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
+ let mod;
34
+ try {
35
+ const moduleId = '@anthropic-ai/sdk';
36
+ mod = await import(moduleId);
37
+ }
38
+ catch {
39
+ console.error('realm agent requires the @anthropic-ai/sdk package. Run: npm install @anthropic-ai/sdk');
40
+ process.exit(1);
41
+ }
42
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
43
+ const client = new mod.default({
44
+ apiKey: process.env['ANTHROPIC_API_KEY'],
45
+ });
46
+ const systemPrompt = buildSystemPrompt(inputSchema);
47
+ const makeRequest = async (userContent) => {
48
+ const response = await // eslint-disable-next-line @typescript-eslint/no-explicit-any
49
+ client.messages.create({
50
+ model: this.model,
51
+ max_tokens: resolveMaxTokens(this.model),
52
+ system: systemPrompt,
53
+ messages: [{ role: 'user', content: userContent }],
54
+ });
55
+ const block = response.content.find(
56
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
+ (b) => b.type === 'text');
58
+ return block?.text ?? '';
59
+ };
60
+ const content = await makeRequest(prompt);
61
+ try {
62
+ return JSON.parse(content);
63
+ }
64
+ catch {
65
+ // Retry once with an explicit reminder to return JSON.
66
+ const retryPrompt = `${prompt}\n\nYour previous response was not valid JSON. Respond with a JSON object only.`;
67
+ const retry = await makeRequest(retryPrompt);
68
+ try {
69
+ return JSON.parse(retry);
70
+ }
71
+ catch {
72
+ throw new Error(`Anthropic returned non-JSON content after retry: ${retry.slice(0, 200)}`);
73
+ }
74
+ }
75
+ }
76
+ /**
77
+ * Agentic loop for tool-capable steps. Executes tool calls serially (V1 constraint).
78
+ * All tool results for one turn are accumulated into a single user message with an array
79
+ * of tool_result blocks — the Anthropic API rejects interleaved assistant/user turns.
80
+ */
81
+ async callStepWithTools(prompt, tools, executor, options) {
82
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
+ let mod;
84
+ try {
85
+ const moduleId = '@anthropic-ai/sdk';
86
+ mod = await import(moduleId);
87
+ }
88
+ catch {
89
+ console.error('realm agent requires the @anthropic-ai/sdk package. Run: npm install @anthropic-ai/sdk');
90
+ process.exit(1);
91
+ }
92
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
93
+ const client = new mod.default({
94
+ apiKey: process.env['ANTHROPIC_API_KEY'],
95
+ });
96
+ // toolIdMap: bareName → namespaced id, used to recover routing key from LLM responses.
97
+ // Collision guard: two MCP servers may not expose the same bare tool name in the same step.
98
+ const toolIdMap = new Map();
99
+ const anthropicTools = [];
100
+ for (const tool of tools) {
101
+ if (toolIdMap.has(tool.name)) {
102
+ throw new Error(`invariant: duplicate bare tool name '${tool.name}' in toolIdMap — this should have been caught at toolDefs assembly in run-agent.ts`);
103
+ }
104
+ toolIdMap.set(tool.name, tool.id);
105
+ anthropicTools.push({
106
+ name: tool.name,
107
+ description: tool.description,
108
+ input_schema: tool.inputSchema, // note: input_schema, not parameters
109
+ });
110
+ }
111
+ const maxCalls = options.maxToolCalls ?? 20;
112
+ let tool_call_count = 0;
113
+ const tool_call_records = [];
114
+ const system = buildSystemPrompt(options.inputSchema);
115
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
116
+ const history = [{ role: 'user', content: prompt }];
117
+ const buildMainCallOpts = () => {
118
+ const opts = {
119
+ model: this.model,
120
+ max_tokens: resolveMaxTokens(this.model),
121
+ system,
122
+ messages: history,
123
+ };
124
+ if (anthropicTools.length > 0)
125
+ opts['tools'] = anthropicTools;
126
+ return opts;
127
+ };
128
+ // Calls the API with tool_choice: none and no tools array to force a plain text answer.
129
+ // Does NOT push to history — callers must ensure history ends with a valid user turn.
130
+ const performFinalExtraction = async () => {
131
+ const final = await // eslint-disable-next-line @typescript-eslint/no-explicit-any
132
+ client.messages.create({
133
+ model: this.model,
134
+ max_tokens: resolveMaxTokens(this.model),
135
+ system,
136
+ messages: history,
137
+ tool_choice: { type: 'none' },
138
+ // NO tools array — enforces text-only response
139
+ // NO response_format — not a valid Anthropic parameter
140
+ });
141
+ const textBlock = final.content.find((b) => b.type === 'text');
142
+ const text = textBlock?.text ?? '';
143
+ const parsed = tryParseJson(text);
144
+ if (parsed && validateSchema(parsed, options.inputSchema)) {
145
+ return { output: parsed, toolCalls: tool_call_records };
146
+ }
147
+ throw new WorkflowError('max_tool_calls reached; final extraction failed', {
148
+ code: 'ENGINE_STEP_FAILED',
149
+ category: 'ENGINE',
150
+ agentAction: 'stop',
151
+ retryable: false,
152
+ });
153
+ };
154
+ while (true) {
155
+ const response = await // eslint-disable-next-line @typescript-eslint/no-explicit-any
156
+ client.messages.create(buildMainCallOpts());
157
+ const toolUseBlocks = response.content.filter((b) => b.type === 'tool_use');
158
+ if (toolUseBlocks.length > 0) {
159
+ history.push({ role: 'assistant', content: response.content });
160
+ const anthropic_result_blocks = [];
161
+ let budget_exhausted_mid_batch = false;
162
+ for (const block of toolUseBlocks) {
163
+ const llmToolCallId = block.id; // captured verbatim — "toolu_01abc..."
164
+ if (tool_call_count >= maxCalls) {
165
+ // Budget exhausted — must still answer every id in the assistant message.
166
+ anthropic_result_blocks.push({
167
+ type: 'tool_result',
168
+ tool_use_id: llmToolCallId,
169
+ content: 'Error: tool call budget exhausted',
170
+ });
171
+ budget_exhausted_mid_batch = true;
172
+ continue;
173
+ }
174
+ const originalId = toolIdMap.get(block.name);
175
+ const { serverId, toolName } = parseNamespacedId(originalId);
176
+ const args = (block.input ?? {});
177
+ const start = Date.now();
178
+ let resultContent;
179
+ let record;
180
+ try {
181
+ const rawResult = await Promise.race([
182
+ executor(originalId, args),
183
+ rejectAfter(options.toolTimeoutMs ?? 30000),
184
+ ]);
185
+ const serialized = serializeToolResult(rawResult);
186
+ record = {
187
+ server_id: serverId,
188
+ tool: toolName,
189
+ args,
190
+ result: serialized,
191
+ duration_ms: Date.now() - start,
192
+ };
193
+ resultContent = serialized;
194
+ }
195
+ catch (err) {
196
+ const sanitized = sanitizeError(err);
197
+ const content = sanitized.length > 0 ? `Error: ${sanitized}` : 'Error: (redacted)';
198
+ record = {
199
+ server_id: serverId,
200
+ tool: toolName,
201
+ args,
202
+ result: null,
203
+ duration_ms: Date.now() - start,
204
+ error: sanitized,
205
+ };
206
+ resultContent = content;
207
+ }
208
+ tool_call_records.push(record);
209
+ tool_call_count++;
210
+ anthropic_result_blocks.push({
211
+ type: 'tool_result',
212
+ tool_use_id: llmToolCallId,
213
+ content: resultContent,
214
+ });
215
+ }
216
+ const exhausted = budget_exhausted_mid_batch || tool_call_count >= maxCalls;
217
+ if (exhausted) {
218
+ // Merge tool results and extraction prompt into a single user message to avoid
219
+ // consecutive user messages, which the Anthropic API rejects with 400.
220
+ history.push({
221
+ role: 'user',
222
+ content: [
223
+ ...anthropic_result_blocks,
224
+ {
225
+ type: 'text',
226
+ text: 'You have reached the maximum number of tool calls. Produce your final JSON answer now using only what you have already gathered. No further tool calls will be executed.',
227
+ },
228
+ ],
229
+ });
230
+ return performFinalExtraction();
231
+ }
232
+ // Normal continuation — single user message with all tool_result blocks.
233
+ history.push({ role: 'user', content: anthropic_result_blocks });
234
+ }
235
+ else {
236
+ // No tool calls — attempt to parse the final answer.
237
+ const textBlock = response.content.find((b) => b.type === 'text');
238
+ const text = textBlock?.text ?? '';
239
+ const parsed = tryParseJson(text);
240
+ if (parsed && validateSchema(parsed, options.inputSchema)) {
241
+ return { output: parsed, toolCalls: tool_call_records };
242
+ }
243
+ // Schema mismatch — append correction and keep looping.
244
+ history.push({ role: 'assistant', content: response.content });
245
+ history.push({
246
+ role: 'user',
247
+ content: 'Your response did not match the required JSON schema. Try again.',
248
+ });
249
+ tool_call_count++; // schema correction consumes a slot
250
+ if (tool_call_count >= maxCalls) {
251
+ return performFinalExtraction();
252
+ }
253
+ }
254
+ }
255
+ }
256
+ }
257
+ //# sourceMappingURL=anthropic-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-provider.js","sourceRoot":"","sources":["../../../src/agent/providers/anthropic-provider.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,uGAAuG;AACvG,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAO3D,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,KAAa;IACrC,+DAA+D;IAC/D,+DAA+D;IAC/D,IAAI,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzD,OAAO,IAAI,CAAC,CAAC,wDAAwD;AACvE,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,iBAAkB,SAAQ,sBAAsB;IAC9B;IAA7B,YAA6B,KAAa;QACxC,KAAK,EAAE,CAAC;QADmB,UAAK,GAAL,KAAK,CAAQ;IAE1C,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,MAAc,EACd,WAAqC;QAErC,+EAA+E;QAC/E,4EAA4E;QAC5E,8DAA8D;QAC9D,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YACH,MAAM,QAAQ,GAAW,mBAAmB,CAAC;YAC7C,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CACX,wFAAwF,CACzF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,8DAA8D;QAC9D,MAAM,MAAM,GAAG,IAAK,GAAG,CAAC,OAAsD,CAAC;YAC7E,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;SACzC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAEpD,MAAM,WAAW,GAAG,KAAK,EAAE,WAAmB,EAAmB,EAAE;YACjE,MAAM,QAAQ,GAAG,MAAM,8DAA8D;aACpF,MAAM,CAAC,QAAQ,CAAC,MAA0D,CAAC;gBAC1E,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;gBACxC,MAAM,EAAE,YAAY;gBACpB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;aACnD,CAAC,CAAC;YACH,MAAM,KAAK,GAAI,QAAQ,CAAC,OAAqB,CAAC,IAAI;YAChD,8DAA8D;YAC9D,CAAC,CAAM,EAAE,EAAE,CAAE,CAAuB,CAAC,IAAI,KAAK,MAAM,CACpB,CAAC;YACnC,OAAO,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;QAC3B,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,uDAAuD;YACvD,MAAM,WAAW,GAAG,GAAG,MAAM,iFAAiF,CAAC;YAC/G,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;YAC7C,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAA4B,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,oDAAoD,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,iBAAiB,CACrB,MAAc,EACd,KAAuB,EACvB,QAAsB,EACtB,OAIC;QAED,8DAA8D;QAC9D,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YACH,MAAM,QAAQ,GAAW,mBAAmB,CAAC;YAC7C,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CACX,wFAAwF,CACzF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,8DAA8D;QAC9D,MAAM,MAAM,GAAG,IAAK,GAAG,CAAC,OAAsD,CAAC;YAC7E,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;SACzC,CAAC,CAAC;QAEH,uFAAuF;QACvF,4FAA4F;QAC5F,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC5C,MAAM,cAAc,GAIf,EAAE,CAAC;QACR,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CACb,wCAAwC,IAAI,CAAC,IAAI,oFAAoF,CACtI,CAAC;YACJ,CAAC;YACD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YAClC,cAAc,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,qCAAqC;aACtE,CAAC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;QAC5C,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,MAAM,iBAAiB,GAAqB,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAEtD,8DAA8D;QAC9D,MAAM,OAAO,GAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAE3D,MAAM,iBAAiB,GAAG,GAA4B,EAAE;YACtD,MAAM,IAAI,GAA4B;gBACpC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;gBACxC,MAAM;gBACN,QAAQ,EAAE,OAAO;aAClB,CAAC;YACF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC;YAC9D,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,wFAAwF;QACxF,sFAAsF;QACtF,MAAM,sBAAsB,GAAG,KAAK,IAAkC,EAAE;YACtE,MAAM,KAAK,GAAG,MAAM,8DAA8D;aACjF,MAAM,CAAC,QAAQ,CAAC,MAA0D,CAAC;gBAC1E,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;gBACxC,MAAM;gBACN,QAAQ,EAAE,OAAO;gBACjB,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;gBAC7B,+CAA+C;gBAC/C,uDAAuD;aACxD,CAAC,CAAC;YACH,MAAM,SAAS,GAAI,KAAK,CAAC,OAAkD,CAAC,IAAI,CAC9E,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CACzB,CAAC;YACF,MAAM,IAAI,GAAG,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;YAC1D,CAAC;YACD,MAAM,IAAI,aAAa,CAAC,iDAAiD,EAAE;gBACzE,IAAI,EAAE,oBAAoB;gBAC1B,QAAQ,EAAE,QAAQ;gBAClB,WAAW,EAAE,MAAM;gBACnB,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,QAAQ,GAAG,MAAM,8DAA8D;aACpF,MAAM,CAAC,QAAQ,CAAC,MAA0D,CACzE,iBAAiB,EAAE,CACpB,CAAC;YACF,MAAM,aAAa,GACjB,QAAQ,CAAC,OACV,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;YAEvC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;gBAE/D,MAAM,uBAAuB,GAIxB,EAAE,CAAC;gBACR,IAAI,0BAA0B,GAAG,KAAK,CAAC;gBAEvC,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;oBAClC,MAAM,aAAa,GAAG,KAAK,CAAC,EAAG,CAAC,CAAC,uCAAuC;oBAExE,IAAI,eAAe,IAAI,QAAQ,EAAE,CAAC;wBAChC,0EAA0E;wBAC1E,uBAAuB,CAAC,IAAI,CAAC;4BAC3B,IAAI,EAAE,aAAa;4BACnB,WAAW,EAAE,aAAa;4BAC1B,OAAO,EAAE,mCAAmC;yBAC7C,CAAC,CAAC;wBACH,0BAA0B,GAAG,IAAI,CAAC;wBAClC,SAAS;oBACX,CAAC;oBAED,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAK,CAAE,CAAC;oBAC/C,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;oBAC7D,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAC;oBAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBAEzB,IAAI,aAAqB,CAAC;oBAC1B,IAAI,MAAsB,CAAC;oBAE3B,IAAI,CAAC;wBACH,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;4BACnC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;4BAC1B,WAAW,CAAC,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC;yBAC5C,CAAC,CAAC;wBACH,MAAM,UAAU,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;wBAClD,MAAM,GAAG;4BACP,SAAS,EAAE,QAAQ;4BACnB,IAAI,EAAE,QAAQ;4BACd,IAAI;4BACJ,MAAM,EAAE,UAAU;4BAClB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;yBAChC,CAAC;wBACF,aAAa,GAAG,UAAU,CAAC;oBAC7B,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;wBACrC,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,SAAS,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC;wBACnF,MAAM,GAAG;4BACP,SAAS,EAAE,QAAQ;4BACnB,IAAI,EAAE,QAAQ;4BACd,IAAI;4BACJ,MAAM,EAAE,IAAI;4BACZ,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;4BAC/B,KAAK,EAAE,SAAS;yBACjB,CAAC;wBACF,aAAa,GAAG,OAAO,CAAC;oBAC1B,CAAC;oBAED,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC/B,eAAe,EAAE,CAAC;oBAClB,uBAAuB,CAAC,IAAI,CAAC;wBAC3B,IAAI,EAAE,aAAa;wBACnB,WAAW,EAAE,aAAa;wBAC1B,OAAO,EAAE,aAAa;qBACvB,CAAC,CAAC;gBACL,CAAC;gBAED,MAAM,SAAS,GAAG,0BAA0B,IAAI,eAAe,IAAI,QAAQ,CAAC;gBAE5E,IAAI,SAAS,EAAE,CAAC;oBACd,+EAA+E;oBAC/E,uEAAuE;oBACvE,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE;4BACP,GAAG,uBAAuB;4BAC1B;gCACE,IAAI,EAAE,MAAe;gCACrB,IAAI,EAAE,0KAA0K;6BACjL;yBACF;qBACF,CAAC,CAAC;oBACH,OAAO,sBAAsB,EAAE,CAAC;gBAClC,CAAC;gBAED,yEAAyE;gBACzE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;YACnE,CAAC;iBAAM,CAAC;gBACN,qDAAqD;gBACrD,MAAM,SAAS,GAAI,QAAQ,CAAC,OAAkD,CAAC,IAAI,CACjF,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CACzB,CAAC;gBACF,MAAM,IAAI,GAAG,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;gBAClC,IAAI,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;gBAC1D,CAAC;gBACD,wDAAwD;gBACxD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC/D,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,kEAAkE;iBAC5E,CAAC,CAAC;gBACH,eAAe,EAAE,CAAC,CAAC,oCAAoC;gBACvD,IAAI,eAAe,IAAI,QAAQ,EAAE,CAAC;oBAChC,OAAO,sBAAsB,EAAE,CAAC;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,46 @@
1
+ import type { ToolDefinition, ToolExecutor, StepWithToolsResult } from '../mcp/mcp-extensions.js';
2
+ /**
3
+ * Describes the optional feature set that an LLM provider supports.
4
+ * Custom providers can override {@link LlmProvider.capabilities} to declare
5
+ * features beyond the universal baseline.
6
+ */
7
+ export interface ProviderCapabilities {
8
+ /**
9
+ * Whether this provider sends `response_format: { type: 'json_object' }` in API requests.
10
+ * When false, JSON compliance is enforced through system prompt instruction and retry only.
11
+ * This is the universal baseline — all providers work without json_object mode.
12
+ */
13
+ jsonMode: boolean;
14
+ }
15
+ /**
16
+ * Abstract base class for LLM providers used by realm agent.
17
+ * Extend this class to implement a custom provider.
18
+ */
19
+ export declare abstract class LlmProvider {
20
+ /** Call the LLM with a step prompt and return a JSON object. */
21
+ abstract callStep(prompt: string, inputSchema?: Record<string, unknown>): Promise<Record<string, unknown>>;
22
+ /** Returns the capability set for this provider instance. */
23
+ capabilities(): ProviderCapabilities;
24
+ }
25
+ /**
26
+ * Extended abstract class for providers that support the agentic tool-calling loop.
27
+ * Extend this class if your provider can drive tool-enabled workflow steps.
28
+ */
29
+ export declare abstract class ToolCapableLlmProvider extends LlmProvider {
30
+ abstract callStepWithTools(prompt: string, tools: ToolDefinition[], executor: ToolExecutor, options: {
31
+ inputSchema?: Record<string, unknown>;
32
+ maxToolCalls?: number;
33
+ toolTimeoutMs?: number;
34
+ }): Promise<StepWithToolsResult>;
35
+ }
36
+ /**
37
+ * Returns true if the provider supports the agentic tool-calling loop.
38
+ */
39
+ export declare function isToolCapable(provider: LlmProvider): provider is ToolCapableLlmProvider;
40
+ export type ProviderName = 'openai' | 'anthropic';
41
+ /**
42
+ * Resolves the correct LLM provider from environment and CLI flags.
43
+ * Throws if no API key is found or the specified package is not installed.
44
+ */
45
+ export declare function resolveProvider(providerFlag: ProviderName | undefined, modelFlag: string | undefined, baseUrlFlag?: string): Promise<LlmProvider>;
46
+ //# sourceMappingURL=llm-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-provider.d.ts","sourceRoot":"","sources":["../../../src/agent/providers/llm-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAElG;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,8BAAsB,WAAW;IAC/B,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,CACf,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnC,6DAA6D;IAC7D,YAAY,IAAI,oBAAoB;CAGrC;AAED;;;GAGG;AACH,8BAAsB,sBAAuB,SAAQ,WAAW;IAC9D,QAAQ,CAAC,iBAAiB,CACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,EAAE,EACvB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE;QACP,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACtC,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,GACA,OAAO,CAAC,mBAAmB,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,WAAW,GAAG,QAAQ,IAAI,sBAAsB,CAEvF;AAED,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,WAAW,CAAC;AAElD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,WAAW,CAAC,CAmCtB"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Abstract base class for LLM providers used by realm agent.
3
+ * Extend this class to implement a custom provider.
4
+ */
5
+ export class LlmProvider {
6
+ /** Returns the capability set for this provider instance. */
7
+ capabilities() {
8
+ return { jsonMode: false };
9
+ }
10
+ }
11
+ /**
12
+ * Extended abstract class for providers that support the agentic tool-calling loop.
13
+ * Extend this class if your provider can drive tool-enabled workflow steps.
14
+ */
15
+ export class ToolCapableLlmProvider extends LlmProvider {
16
+ }
17
+ /**
18
+ * Returns true if the provider supports the agentic tool-calling loop.
19
+ */
20
+ export function isToolCapable(provider) {
21
+ return provider instanceof ToolCapableLlmProvider;
22
+ }
23
+ /**
24
+ * Resolves the correct LLM provider from environment and CLI flags.
25
+ * Throws if no API key is found or the specified package is not installed.
26
+ */
27
+ export async function resolveProvider(providerFlag, modelFlag, baseUrlFlag) {
28
+ const hasOpenAI = process.env['OPENAI_API_KEY'] !== undefined;
29
+ const hasAnthropic = process.env['ANTHROPIC_API_KEY'] !== undefined;
30
+ if (!hasOpenAI && !hasAnthropic) {
31
+ throw new Error('realm agent requires an LLM API key. Set OPENAI_API_KEY or ANTHROPIC_API_KEY.');
32
+ }
33
+ const provider = providerFlag ?? (hasOpenAI ? 'openai' : 'anthropic');
34
+ if (baseUrlFlag !== undefined && provider === 'anthropic') {
35
+ throw new Error('--base-url is only supported with --provider openai (or OpenAI-compatible endpoints). ' +
36
+ 'For Anthropic, configure the endpoint via the ANTHROPIC_BASE_URL environment variable.');
37
+ }
38
+ if (provider === 'openai') {
39
+ // Match o1, o1-mini, o1-preview — the o1 generation requires the special-case
40
+ // provider (no tool support, system prompt folded into user message).
41
+ // o3, o3-mini, and o4-mini support the standard Chat Completions API including
42
+ // function calling, so they route to OpenAIProvider.
43
+ const REASONING_MODELS = /^o1(-|$)/i;
44
+ if (modelFlag !== undefined && REASONING_MODELS.test(modelFlag)) {
45
+ const { OpenAIReasoningProvider } = await import('./openai-reasoning-provider.js');
46
+ return new OpenAIReasoningProvider(modelFlag);
47
+ }
48
+ const { OpenAIProvider } = await import('./openai-provider.js');
49
+ return new OpenAIProvider(modelFlag ?? 'gpt-4o', baseUrlFlag);
50
+ }
51
+ else {
52
+ const { AnthropicProvider } = await import('./anthropic-provider.js');
53
+ return new AnthropicProvider(modelFlag ?? 'claude-sonnet-4-5');
54
+ }
55
+ }
56
+ //# sourceMappingURL=llm-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-provider.js","sourceRoot":"","sources":["../../../src/agent/providers/llm-provider.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,MAAM,OAAgB,WAAW;IAO/B,6DAA6D;IAC7D,YAAY;QACV,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAgB,sBAAuB,SAAQ,WAAW;CAW/D;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAqB;IACjD,OAAO,QAAQ,YAAY,sBAAsB,CAAC;AACpD,CAAC;AAID;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,YAAsC,EACtC,SAA6B,EAC7B,WAAoB;IAEpB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,SAAS,CAAC;IAC9D,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,SAAS,CAAC;IAEpE,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAEtE,IAAI,WAAW,KAAK,SAAS,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CACb,wFAAwF;YACtF,wFAAwF,CAC3F,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,8EAA8E;QAC9E,sEAAsE;QACtE,+EAA+E;QAC/E,qDAAqD;QACrD,MAAM,gBAAgB,GAAG,WAAW,CAAC;QACrC,IAAI,SAAS,KAAK,SAAS,IAAI,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAChE,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;YACnF,OAAO,IAAI,uBAAuB,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAChE,OAAO,IAAI,cAAc,CAAC,SAAS,IAAI,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACtE,OAAO,IAAI,iBAAiB,CAAC,SAAS,IAAI,mBAAmB,CAAC,CAAC;IACjE,CAAC;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { ToolCapableLlmProvider, type ProviderCapabilities } from './llm-provider.js';
2
+ import type { ToolDefinition, ToolExecutor, StepWithToolsResult } from '../mcp/mcp-extensions.js';
3
+ /**
4
+ * OpenAI LLM provider for realm agent.
5
+ * Uses the Chat Completions API. Sends `response_format: json_object` on native
6
+ * OpenAI endpoints; falls back to prompt-only JSON enforcement on compat endpoints
7
+ * behind `--base-url`. Retries once if the model returns non-JSON content.
8
+ */
9
+ export declare class OpenAIProvider extends ToolCapableLlmProvider {
10
+ private readonly model;
11
+ private readonly baseUrl;
12
+ constructor(model: string, baseUrl?: string);
13
+ /**
14
+ * Native OpenAI endpoints have a well-defined, tested capability surface that includes
15
+ * json_object mode. Custom compat endpoints behind --base-url do not guarantee this feature.
16
+ * Default to prompt-only enforcement for any unknown endpoint.
17
+ */
18
+ capabilities(): ProviderCapabilities;
19
+ callStep(prompt: string, inputSchema?: Record<string, unknown>): Promise<Record<string, unknown>>;
20
+ /**
21
+ * Agentic loop for tool-capable steps. Executes tool calls serially (V1 constraint)
22
+ * until the model returns a final JSON answer or the tool call budget is exhausted.
23
+ */
24
+ callStepWithTools(prompt: string, tools: ToolDefinition[], executor: ToolExecutor, options: {
25
+ inputSchema?: Record<string, unknown>;
26
+ maxToolCalls?: number;
27
+ toolTimeoutMs?: number;
28
+ }): Promise<StepWithToolsResult>;
29
+ }
30
+ //# sourceMappingURL=openai-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../../../src/agent/providers/openai-provider.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,KAAK,EAEV,cAAc,EACd,YAAY,EACZ,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAWlC;;;;;GAKG;AACH,qBAAa,cAAe,SAAQ,sBAAsB;IACxD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;gBAEjC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAM3C;;;;OAIG;IACH,YAAY,IAAI,oBAAoB;IAI9B,QAAQ,CACZ,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IA8DnC;;;OAGG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,EAAE,EACvB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE;QACP,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACtC,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,GACA,OAAO,CAAC,mBAAmB,CAAC;CAyLhC"}