@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,253 @@
1
+ // openai-provider.ts — OpenAI LLM provider implementation for realm agent.
2
+ // Requires openai >= 4.0.0 as an optional peer dependency (npm install openai).
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
+ * OpenAI LLM provider for realm agent.
8
+ * Uses the Chat Completions API. Sends `response_format: json_object` on native
9
+ * OpenAI endpoints; falls back to prompt-only JSON enforcement on compat endpoints
10
+ * behind `--base-url`. Retries once if the model returns non-JSON content.
11
+ */
12
+ export class OpenAIProvider extends ToolCapableLlmProvider {
13
+ model;
14
+ baseUrl;
15
+ constructor(model, baseUrl) {
16
+ super();
17
+ this.model = model;
18
+ this.baseUrl = baseUrl;
19
+ }
20
+ /**
21
+ * Native OpenAI endpoints have a well-defined, tested capability surface that includes
22
+ * json_object mode. Custom compat endpoints behind --base-url do not guarantee this feature.
23
+ * Default to prompt-only enforcement for any unknown endpoint.
24
+ */
25
+ capabilities() {
26
+ return { jsonMode: this.baseUrl === undefined };
27
+ }
28
+ async callStep(prompt, inputSchema) {
29
+ // Dynamically import openai to keep it an optional peer dependency.
30
+ // Assigning the module specifier to a typed variable via 'string' makes TS
31
+ // treat it as Promise<any>, bypassing static module resolution at build time.
32
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
+ let mod;
34
+ try {
35
+ const moduleId = 'openai';
36
+ mod = await import(moduleId);
37
+ }
38
+ catch {
39
+ console.error('realm agent requires the openai package. Run: npm install openai');
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['OPENAI_API_KEY'],
45
+ ...(this.baseUrl !== undefined ? { baseURL: this.baseUrl } : {}),
46
+ });
47
+ const systemPrompt = buildSystemPrompt(inputSchema);
48
+ const messages = [
49
+ { role: 'system', content: systemPrompt },
50
+ { role: 'user', content: prompt },
51
+ ];
52
+ const makeRequest = async (msgs) => {
53
+ const opts = {
54
+ model: this.model,
55
+ messages: msgs,
56
+ };
57
+ if (this.capabilities().jsonMode) {
58
+ opts['response_format'] = { type: 'json_object' };
59
+ }
60
+ const response = await // eslint-disable-next-line @typescript-eslint/no-explicit-any
61
+ client.chat.completions.create(opts);
62
+ return response.choices[0]?.message?.content ?? '';
63
+ };
64
+ const content = await makeRequest(messages);
65
+ try {
66
+ return JSON.parse(content);
67
+ }
68
+ catch {
69
+ // Retry once with an explicit reminder to return JSON.
70
+ const retryMessages = [
71
+ ...messages,
72
+ { role: 'assistant', content },
73
+ {
74
+ role: 'user',
75
+ content: 'Your previous response was not valid JSON. Respond with a JSON object only.',
76
+ },
77
+ ];
78
+ const retry = await makeRequest(retryMessages);
79
+ try {
80
+ return JSON.parse(retry);
81
+ }
82
+ catch {
83
+ throw new Error(`OpenAI returned non-JSON content after retry: ${retry.slice(0, 200)}`);
84
+ }
85
+ }
86
+ }
87
+ /**
88
+ * Agentic loop for tool-capable steps. Executes tool calls serially (V1 constraint)
89
+ * until the model returns a final JSON answer or the tool call budget is exhausted.
90
+ */
91
+ async callStepWithTools(prompt, tools, executor, options) {
92
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
93
+ let mod;
94
+ try {
95
+ const moduleId = 'openai';
96
+ mod = await import(moduleId);
97
+ }
98
+ catch {
99
+ console.error('realm agent requires the openai package. Run: npm install openai');
100
+ process.exit(1);
101
+ }
102
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
103
+ const client = new mod.default({
104
+ apiKey: process.env['OPENAI_API_KEY'],
105
+ ...(this.baseUrl !== undefined ? { baseURL: this.baseUrl } : {}),
106
+ });
107
+ const responseFormat = this.capabilities().jsonMode
108
+ ? { type: 'json_object' }
109
+ : undefined;
110
+ // toolIdMap: bareName → namespaced id, used to recover routing key from LLM responses.
111
+ // Collision guard: two MCP servers may not expose the same bare tool name in the same step.
112
+ const toolIdMap = new Map();
113
+ const openaiTools = [];
114
+ for (const tool of tools) {
115
+ if (toolIdMap.has(tool.name)) {
116
+ throw new Error(`invariant: duplicate bare tool name '${tool.name}' in toolIdMap — this should have been caught at toolDefs assembly in run-agent.ts`);
117
+ }
118
+ toolIdMap.set(tool.name, tool.id);
119
+ openaiTools.push({
120
+ type: 'function',
121
+ function: {
122
+ name: tool.name,
123
+ description: tool.description,
124
+ parameters: tool.inputSchema,
125
+ },
126
+ });
127
+ }
128
+ const maxCalls = options.maxToolCalls ?? 20;
129
+ let tool_call_count = 0;
130
+ const tool_call_records = [];
131
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
132
+ const history = [
133
+ { role: 'system', content: buildSystemPrompt(options.inputSchema) },
134
+ { role: 'user', content: prompt },
135
+ ];
136
+ const buildMainCallOpts = () => {
137
+ const opts = { model: this.model, messages: history };
138
+ if (openaiTools.length > 0)
139
+ opts['tools'] = openaiTools;
140
+ if (responseFormat !== undefined)
141
+ opts['response_format'] = responseFormat;
142
+ return opts;
143
+ };
144
+ const buildFinalCallOpts = () => {
145
+ const opts = { model: this.model, messages: history };
146
+ if (responseFormat !== undefined)
147
+ opts['response_format'] = responseFormat;
148
+ return opts;
149
+ };
150
+ // Injects the over-budget message and calls the API without tools to produce a final answer.
151
+ const performFinalExtraction = async () => {
152
+ history.push({
153
+ role: 'user',
154
+ content: '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.',
155
+ });
156
+ const final = await // eslint-disable-next-line @typescript-eslint/no-explicit-any
157
+ client.chat.completions.create(buildFinalCallOpts());
158
+ const text = final.choices[0].message.content ?? '';
159
+ const parsed = tryParseJson(text);
160
+ if (parsed && validateSchema(parsed, options.inputSchema)) {
161
+ return { output: parsed, toolCalls: tool_call_records };
162
+ }
163
+ throw new WorkflowError('max_tool_calls reached; final extraction failed', {
164
+ code: 'ENGINE_STEP_FAILED',
165
+ category: 'ENGINE',
166
+ agentAction: 'stop',
167
+ retryable: false,
168
+ });
169
+ };
170
+ while (true) {
171
+ const response = await // eslint-disable-next-line @typescript-eslint/no-explicit-any
172
+ client.chat.completions.create(buildMainCallOpts());
173
+ const message = response.choices[0].message;
174
+ if (message.tool_calls?.length) {
175
+ const batch = message.tool_calls;
176
+ history.push(message);
177
+ let budget_exhausted_mid_batch = false;
178
+ for (const tool of batch) {
179
+ const llmToolCallId = tool.id; // captured verbatim — API returns 400 if echoed incorrectly
180
+ if (tool_call_count >= maxCalls) {
181
+ // Budget exhausted — must still answer every id in the assistant message.
182
+ history.push({
183
+ role: 'tool',
184
+ tool_call_id: llmToolCallId,
185
+ content: 'Error: tool call budget exhausted',
186
+ });
187
+ budget_exhausted_mid_batch = true;
188
+ continue;
189
+ }
190
+ const originalId = toolIdMap.get(tool.function.name);
191
+ const { serverId, toolName } = parseNamespacedId(originalId);
192
+ const args = JSON.parse(tool.function.arguments || '{}');
193
+ const start = Date.now();
194
+ let resultContent;
195
+ let record;
196
+ try {
197
+ const rawResult = await Promise.race([
198
+ executor(originalId, args),
199
+ rejectAfter(options.toolTimeoutMs ?? 30000),
200
+ ]);
201
+ const serialized = serializeToolResult(rawResult);
202
+ record = {
203
+ server_id: serverId,
204
+ tool: toolName,
205
+ args,
206
+ result: serialized,
207
+ duration_ms: Date.now() - start,
208
+ };
209
+ resultContent = serialized;
210
+ }
211
+ catch (err) {
212
+ const sanitized = sanitizeError(err);
213
+ const content = sanitized.length > 0 ? `Error: ${sanitized}` : 'Error: (redacted)';
214
+ record = {
215
+ server_id: serverId,
216
+ tool: toolName,
217
+ args,
218
+ result: null,
219
+ duration_ms: Date.now() - start,
220
+ error: sanitized,
221
+ };
222
+ resultContent = content;
223
+ }
224
+ tool_call_records.push(record);
225
+ tool_call_count++;
226
+ history.push({ role: 'tool', tool_call_id: llmToolCallId, content: resultContent });
227
+ }
228
+ if (budget_exhausted_mid_batch || tool_call_count >= maxCalls) {
229
+ return performFinalExtraction();
230
+ }
231
+ }
232
+ else {
233
+ // No tool calls — attempt to parse the final answer.
234
+ const text = message.content ?? '';
235
+ const parsed = tryParseJson(text);
236
+ if (parsed && validateSchema(parsed, options.inputSchema)) {
237
+ return { output: parsed, toolCalls: tool_call_records };
238
+ }
239
+ // Schema mismatch — append correction message and continue the loop.
240
+ history.push({ role: 'assistant', content: text });
241
+ history.push({
242
+ role: 'user',
243
+ content: 'Your response did not match the required JSON schema. Try again.',
244
+ });
245
+ tool_call_count++; // schema correction consumes a slot
246
+ if (tool_call_count >= maxCalls) {
247
+ return performFinalExtraction();
248
+ }
249
+ }
250
+ }
251
+ }
252
+ }
253
+ //# sourceMappingURL=openai-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-provider.js","sourceRoot":"","sources":["../../../src/agent/providers/openai-provider.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,gFAAgF;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAA6B,MAAM,mBAAmB,CAAC;AAOtF,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B;;;;;GAKG;AACH,MAAM,OAAO,cAAe,SAAQ,sBAAsB;IACvC,KAAK,CAAS;IACd,OAAO,CAAqB;IAE7C,YAAY,KAAa,EAAE,OAAgB;QACzC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,YAAY;QACV,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,MAAc,EACd,WAAqC;QAErC,oEAAoE;QACpE,2EAA2E;QAC3E,8EAA8E;QAC9E,8DAA8D;QAC9D,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YACH,MAAM,QAAQ,GAAW,QAAQ,CAAC;YAClC,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;YAClF,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,gBAAgB,CAAC;YACrC,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAEpD,MAAM,QAAQ,GAAc;YAC1B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;YACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;SAClC,CAAC;QAEF,MAAM,WAAW,GAAG,KAAK,EAAE,IAAe,EAAmB,EAAE;YAC7D,MAAM,IAAI,GAA4B;gBACpC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE,IAAI;aACf,CAAC;YACF,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,CAAC;gBACjC,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;YACpD,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,8DAA8D;aACpF,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAA0D,CAAC,IAAI,CAAC,CAAC;YAC1F,OAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAA8B,IAAI,EAAE,CAAC;QAC7E,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,uDAAuD;YACvD,MAAM,aAAa,GAAc;gBAC/B,GAAG,QAAQ;gBACX,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE;gBAC9B;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,6EAA6E;iBACvF;aACF,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,CAAC;YAC/C,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAA4B,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,iDAAiD,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;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,QAAQ,CAAC;YAClC,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;YAClF,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,gBAAgB,CAAC;YACrC,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,QAAQ;YACjD,CAAC,CAAE,EAAE,IAAI,EAAE,aAAa,EAAY;YACpC,CAAC,CAAC,SAAS,CAAC;QAEd,uFAAuF;QACvF,4FAA4F;QAC5F,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC5C,MAAM,WAAW,GAGZ,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,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE;oBACR,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,UAAU,EAAE,IAAI,CAAC,WAAW;iBAC7B;aACF,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;QAE/C,8DAA8D;QAC9D,MAAM,OAAO,GAAU;YACrB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;YACnE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;SAClC,CAAC;QAEF,MAAM,iBAAiB,GAAG,GAA4B,EAAE;YACtD,MAAM,IAAI,GAA4B,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;YAC/E,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC;YACxD,IAAI,cAAc,KAAK,SAAS;gBAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,cAAc,CAAC;YAC3E,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,MAAM,kBAAkB,GAAG,GAA4B,EAAE;YACvD,MAAM,IAAI,GAA4B,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;YAC/E,IAAI,cAAc,KAAK,SAAS;gBAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,cAAc,CAAC;YAC3E,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,6FAA6F;QAC7F,MAAM,sBAAsB,GAAG,KAAK,IAAkC,EAAE;YACtE,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM;gBACZ,OAAO,EACL,0KAA0K;aAC7K,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,8DAA8D;aACjF,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAA0D,CACjF,kBAAkB,EAAE,CACrB,CAAC;YACF,MAAM,IAAI,GAAY,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAyB,IAAI,EAAE,CAAC;YAC/E,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,IAAI,CAAC,WAAW,CAAC,MAA0D,CACjF,iBAAiB,EAAE,CACpB,CAAC;YACF,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAGnC,CAAC;YAEF,IAAI,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtB,IAAI,0BAA0B,GAAG,KAAK,CAAC;gBAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,4DAA4D;oBAE3F,IAAI,eAAe,IAAI,QAAQ,EAAE,CAAC;wBAChC,0EAA0E;wBAC1E,OAAO,CAAC,IAAI,CAAC;4BACX,IAAI,EAAE,MAAM;4BACZ,YAAY,EAAE,aAAa;4BAC3B,OAAO,EAAE,mCAAmC;yBAC7C,CAAC,CAAC;wBACH,0BAA0B,GAAG,IAAI,CAAC;wBAClC,SAAS;oBACX,CAAC;oBAED,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAE,CAAC;oBACtD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;oBAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAA4B,CAAC;oBACpF,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,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;gBACtF,CAAC;gBAED,IAAI,0BAA0B,IAAI,eAAe,IAAI,QAAQ,EAAE,CAAC;oBAC9D,OAAO,sBAAsB,EAAE,CAAC;gBAClC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,qDAAqD;gBACrD,MAAM,IAAI,GAAY,OAAO,CAAC,OAAyB,IAAI,EAAE,CAAC;gBAC9D,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,qEAAqE;gBACrE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBACnD,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,19 @@
1
+ import { LlmProvider } from './llm-provider.js';
2
+ /**
3
+ * OpenAI reasoning model provider for realm agent.
4
+ * Handles the o1-series (o1, o1-mini, o1-preview), which differ from standard chat completions:
5
+ * - No `response_format` parameter (JSON enforced via system prompt + retry).
6
+ * - System prompt content is folded into the first user message — the safe
7
+ * universal approach for the full o1 lineage. (o1 originally rejected the
8
+ * system role; later versions accept it as a developer role, but prepending
9
+ * to the user message works uniformly across all revisions.)
10
+ * - Tool calling is not supported — this class extends LlmProvider, not
11
+ * ToolCapableLlmProvider, so `isToolCapable` returns false for these instances.
12
+ * o3 and later support tools and route to OpenAIProvider instead.
13
+ */
14
+ export declare class OpenAIReasoningProvider extends LlmProvider {
15
+ private readonly model;
16
+ constructor(model: string);
17
+ callStep(prompt: string, inputSchema?: Record<string, unknown>): Promise<Record<string, unknown>>;
18
+ }
19
+ //# sourceMappingURL=openai-reasoning-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-reasoning-provider.d.ts","sourceRoot":"","sources":["../../../src/agent/providers/openai-reasoning-provider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAchD;;;;;;;;;;;GAWG;AACH,qBAAa,uBAAwB,SAAQ,WAAW;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,KAAK,EAAE,MAAM;IAKnB,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;CAyDpC"}
@@ -0,0 +1,89 @@
1
+ // openai-reasoning-provider.ts — OpenAI reasoning model provider (o1-series) for realm agent.
2
+ // Extends LlmProvider (not ToolCapableLlmProvider) — o1-series models do not support the tools parameter.
3
+ import { LlmProvider } from './llm-provider.js';
4
+ import { buildSystemPrompt } from './agent-utils.js';
5
+ /**
6
+ * Returns the max_completion_tokens for the given OpenAI reasoning model.
7
+ * For o1-series models this covers both reasoning tokens and visible output.
8
+ * Source: https://platform.openai.com/docs/models
9
+ */
10
+ function resolveMaxCompletionTokens(model) {
11
+ if (/^o1-mini/i.test(model))
12
+ return 65536;
13
+ // o1, o1-preview, and any other o1 variant default to 32768.
14
+ return 32768;
15
+ }
16
+ /**
17
+ * OpenAI reasoning model provider for realm agent.
18
+ * Handles the o1-series (o1, o1-mini, o1-preview), which differ from standard chat completions:
19
+ * - No `response_format` parameter (JSON enforced via system prompt + retry).
20
+ * - System prompt content is folded into the first user message — the safe
21
+ * universal approach for the full o1 lineage. (o1 originally rejected the
22
+ * system role; later versions accept it as a developer role, but prepending
23
+ * to the user message works uniformly across all revisions.)
24
+ * - Tool calling is not supported — this class extends LlmProvider, not
25
+ * ToolCapableLlmProvider, so `isToolCapable` returns false for these instances.
26
+ * o3 and later support tools and route to OpenAIProvider instead.
27
+ */
28
+ export class OpenAIReasoningProvider extends LlmProvider {
29
+ model;
30
+ constructor(model) {
31
+ super();
32
+ this.model = model;
33
+ }
34
+ async callStep(prompt, inputSchema) {
35
+ // Dynamically import openai to keep it an optional peer dependency.
36
+ // Assigning the module specifier to a typed variable via 'string' makes TS
37
+ // treat it as Promise<any>, bypassing static module resolution at build time.
38
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
39
+ let mod;
40
+ try {
41
+ const moduleId = 'openai';
42
+ mod = await import(moduleId);
43
+ }
44
+ catch {
45
+ console.error('realm agent requires the openai package. Run: npm install openai');
46
+ process.exit(1);
47
+ }
48
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
49
+ const client = new mod.default({
50
+ apiKey: process.env['OPENAI_API_KEY'],
51
+ });
52
+ // Fold system prompt into the user message — safe for all o1-series API revisions.
53
+ const systemPrompt = buildSystemPrompt(inputSchema);
54
+ const userContent = `${systemPrompt}\n\n${prompt}`;
55
+ const messages = [{ role: 'user', content: userContent }];
56
+ const makeRequest = async (msgs) => {
57
+ const response = await // eslint-disable-next-line @typescript-eslint/no-explicit-any
58
+ client.chat.completions.create({
59
+ model: this.model,
60
+ max_completion_tokens: resolveMaxCompletionTokens(this.model),
61
+ messages: msgs,
62
+ });
63
+ return response.choices[0]?.message?.content ?? '';
64
+ };
65
+ const content = await makeRequest(messages);
66
+ try {
67
+ return JSON.parse(content);
68
+ }
69
+ catch {
70
+ // Retry once with an explicit reminder to return JSON.
71
+ const retryMessages = [
72
+ ...messages,
73
+ { role: 'assistant', content },
74
+ {
75
+ role: 'user',
76
+ content: 'Your previous response was not valid JSON. Respond with a JSON object only.',
77
+ },
78
+ ];
79
+ const retry = await makeRequest(retryMessages);
80
+ try {
81
+ return JSON.parse(retry);
82
+ }
83
+ catch {
84
+ throw new Error(`OpenAI returned non-JSON content after retry: ${retry.slice(0, 200)}`);
85
+ }
86
+ }
87
+ }
88
+ }
89
+ //# sourceMappingURL=openai-reasoning-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-reasoning-provider.js","sourceRoot":"","sources":["../../../src/agent/providers/openai-reasoning-provider.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,0GAA0G;AAC1G,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;;GAIG;AACH,SAAS,0BAA0B,CAAC,KAAa;IAC/C,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,6DAA6D;IAC7D,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,uBAAwB,SAAQ,WAAW;IACrC,KAAK,CAAS;IAE/B,YAAY,KAAa;QACvB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,MAAc,EACd,WAAqC;QAErC,oEAAoE;QACpE,2EAA2E;QAC3E,8EAA8E;QAC9E,8DAA8D;QAC9D,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YACH,MAAM,QAAQ,GAAW,QAAQ,CAAC;YAClC,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;YAClF,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,gBAAgB,CAAC;SACtC,CAAC,CAAC;QAEH,mFAAmF;QACnF,MAAM,YAAY,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,GAAG,YAAY,OAAO,MAAM,EAAE,CAAC;QAGnD,MAAM,QAAQ,GAAc,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QAErE,MAAM,WAAW,GAAG,KAAK,EAAE,IAAe,EAAmB,EAAE;YAC7D,MAAM,QAAQ,GAAG,MAAM,8DAA8D;aACpF,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAA0D,CAAC;gBAClF,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,qBAAqB,EAAE,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC7D,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YACH,OAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAA8B,IAAI,EAAE,CAAC;QAC7E,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,uDAAuD;YACvD,MAAM,aAAa,GAAc;gBAC/B,GAAG,QAAQ;gBACX,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE;gBAC9B;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,6EAA6E;iBACvF;aACF,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,CAAC;YAC/C,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAA4B,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,iDAAiD,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,50 @@
1
+ import { type RunStore, type WorkflowDefinition, type PendingGate, type ExtensionRegistry, type McpServerConfig } from '@sensigo/realm';
2
+ import type { WorkflowRegistrar } from '@sensigo/realm';
3
+ import type { LlmProvider } from './providers/llm-provider.js';
4
+ import type { McpClient } from './mcp/mcp-extensions.js';
5
+ export type AgentRunResult = 'completed' | 'failed';
6
+ export interface AgentDeps {
7
+ store: RunStore;
8
+ workflowStore: WorkflowRegistrar;
9
+ provider: LlmProvider;
10
+ registry: ExtensionRegistry;
11
+ /**
12
+ * When set, called for every pending gate. The handler is responsible for notifying
13
+ * the relevant channel and blocking until the gate resolves.
14
+ * Omit for terminal-only fallback (choices printed to terminal + store polling).
15
+ */
16
+ gateHandler?: (runId: string, gate: PendingGate) => Promise<void>;
17
+ /**
18
+ * Factory for creating an McpClient instance. Injected by tests for mock isolation.
19
+ * Defaults to constructing a real McpClient when absent.
20
+ */
21
+ mcpClientFactory?: (servers: McpServerConfig[], signal?: AbortSignal) => McpClient;
22
+ }
23
+ export interface AgentRunOptions {
24
+ /** Path to workflow.yaml file. Required when definition is not provided. */
25
+ workflowPath?: string;
26
+ /** Inline workflow definition — bypasses loadWorkflowFromFile when provided. */
27
+ definition?: WorkflowDefinition;
28
+ /**
29
+ * Attach to an existing run instead of creating a new one.
30
+ * When set, runAgent() skips deps.store.create() and uses this ID directly.
31
+ * Mutually exclusive with workflowPath — runAgent() throws if both are set.
32
+ */
33
+ existingRunId?: string;
34
+ params: Record<string, unknown>;
35
+ /** Poll interval in ms for the terminal-only fallback. Defaults to 3000. Lower values are useful in tests. */
36
+ pollIntervalMs?: number;
37
+ /**
38
+ * When true, persist the workflow definition to ~/.realm/workflows/ so that
39
+ * `realm run inspect` and `realm run list` can resolve it by ID.
40
+ * Defaults to false — realm agent does not register workflows as a side effect.
41
+ */
42
+ register?: boolean;
43
+ }
44
+ /**
45
+ * Runs a workflow to completion using the provided dependencies.
46
+ * Returns 'completed' when the run finishes normally; 'failed' otherwise.
47
+ * Throws on setup failures (e.g. workflow file not found, provider error).
48
+ */
49
+ export declare function runAgent(deps: AgentDeps, options: AgentRunOptions): Promise<AgentRunResult>;
50
+ //# sourceMappingURL=run-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-agent.d.ts","sourceRoot":"","sources":["../../src/agent/run-agent.ts"],"names":[],"mappings":"AAIA,OAAO,EAML,KAAK,QAAQ,EACb,KAAK,kBAAkB,EAEvB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EAErB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D,OAAO,KAAK,EAAE,SAAS,EAAgC,MAAM,yBAAyB,CAAC;AAGvF,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEpD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,QAAQ,CAAC;IAChB,aAAa,EAAE,iBAAiB,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC;IACtB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,SAAS,CAAC;CACpF;AAED,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,8GAA8G;IAC9G,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA0ED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAuTjG"}