agent-orcha 0.0.5 → 0.0.7

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 (264) hide show
  1. package/README.md +194 -1277
  2. package/dist/lib/agents/agent-executor.d.ts +4 -2
  3. package/dist/lib/agents/agent-executor.d.ts.map +1 -1
  4. package/dist/lib/agents/agent-executor.js +68 -52
  5. package/dist/lib/agents/agent-executor.js.map +1 -1
  6. package/dist/lib/agents/agent-loader.d.ts +3 -0
  7. package/dist/lib/agents/agent-loader.d.ts.map +1 -1
  8. package/dist/lib/agents/agent-loader.js +10 -1
  9. package/dist/lib/agents/agent-loader.js.map +1 -1
  10. package/dist/lib/agents/react-loop.d.ts.map +1 -1
  11. package/dist/lib/agents/react-loop.js +180 -142
  12. package/dist/lib/agents/react-loop.js.map +1 -1
  13. package/dist/lib/agents/types.d.ts +181 -18
  14. package/dist/lib/agents/types.d.ts.map +1 -1
  15. package/dist/lib/agents/types.js +18 -2
  16. package/dist/lib/agents/types.js.map +1 -1
  17. package/dist/lib/functions/function-loader.d.ts +2 -0
  18. package/dist/lib/functions/function-loader.d.ts.map +1 -1
  19. package/dist/lib/functions/function-loader.js +10 -0
  20. package/dist/lib/functions/function-loader.js.map +1 -1
  21. package/dist/lib/integrations/email.d.ts +38 -0
  22. package/dist/lib/integrations/email.d.ts.map +1 -0
  23. package/dist/lib/integrations/email.js +249 -0
  24. package/dist/lib/integrations/email.js.map +1 -0
  25. package/dist/lib/integrations/integration-manager.d.ts +5 -0
  26. package/dist/lib/integrations/integration-manager.d.ts.map +1 -1
  27. package/dist/lib/integrations/integration-manager.js +53 -3
  28. package/dist/lib/integrations/integration-manager.js.map +1 -1
  29. package/dist/lib/integrations/types.d.ts +187 -4
  30. package/dist/lib/integrations/types.d.ts.map +1 -1
  31. package/dist/lib/integrations/types.js +24 -1
  32. package/dist/lib/integrations/types.js.map +1 -1
  33. package/dist/lib/knowledge/knowledge-store.d.ts +6 -0
  34. package/dist/lib/knowledge/knowledge-store.d.ts.map +1 -1
  35. package/dist/lib/knowledge/knowledge-store.js +71 -4
  36. package/dist/lib/knowledge/knowledge-store.js.map +1 -1
  37. package/dist/lib/knowledge/loaders/file-loaders.d.ts +8 -2
  38. package/dist/lib/knowledge/loaders/file-loaders.d.ts.map +1 -1
  39. package/dist/lib/knowledge/loaders/file-loaders.js +89 -60
  40. package/dist/lib/knowledge/loaders/file-loaders.js.map +1 -1
  41. package/dist/lib/knowledge/loaders/web-loader.d.ts +12 -3
  42. package/dist/lib/knowledge/loaders/web-loader.d.ts.map +1 -1
  43. package/dist/lib/knowledge/loaders/web-loader.js +56 -22
  44. package/dist/lib/knowledge/loaders/web-loader.js.map +1 -1
  45. package/dist/lib/knowledge/types.d.ts +56 -20
  46. package/dist/lib/knowledge/types.d.ts.map +1 -1
  47. package/dist/lib/knowledge/types.js +18 -3
  48. package/dist/lib/knowledge/types.js.map +1 -1
  49. package/dist/lib/llm/llm-call-logger.d.ts +3 -1
  50. package/dist/lib/llm/llm-call-logger.d.ts.map +1 -1
  51. package/dist/lib/llm/llm-call-logger.js +31 -26
  52. package/dist/lib/llm/llm-call-logger.js.map +1 -1
  53. package/dist/lib/llm/llm-config.d.ts +8 -0
  54. package/dist/lib/llm/llm-config.d.ts.map +1 -1
  55. package/dist/lib/llm/llm-config.js +3 -1
  56. package/dist/lib/llm/llm-config.js.map +1 -1
  57. package/dist/lib/llm/llm-factory.d.ts.map +1 -1
  58. package/dist/lib/llm/llm-factory.js +3 -0
  59. package/dist/lib/llm/llm-factory.js.map +1 -1
  60. package/dist/lib/llm/providers/anthropic-chat-model.d.ts +5 -1
  61. package/dist/lib/llm/providers/anthropic-chat-model.d.ts.map +1 -1
  62. package/dist/lib/llm/providers/anthropic-chat-model.js +118 -42
  63. package/dist/lib/llm/providers/anthropic-chat-model.js.map +1 -1
  64. package/dist/lib/llm/providers/gemini-chat-model.d.ts +3 -2
  65. package/dist/lib/llm/providers/gemini-chat-model.d.ts.map +1 -1
  66. package/dist/lib/llm/providers/gemini-chat-model.js +83 -24
  67. package/dist/lib/llm/providers/gemini-chat-model.js.map +1 -1
  68. package/dist/lib/llm/providers/openai-chat-model.d.ts +10 -1
  69. package/dist/lib/llm/providers/openai-chat-model.d.ts.map +1 -1
  70. package/dist/lib/llm/providers/openai-chat-model.js +233 -32
  71. package/dist/lib/llm/providers/openai-chat-model.js.map +1 -1
  72. package/dist/lib/logger.d.ts.map +1 -1
  73. package/dist/lib/logger.js +0 -1
  74. package/dist/lib/logger.js.map +1 -1
  75. package/dist/lib/mcp/mcp-client.d.ts.map +1 -1
  76. package/dist/lib/mcp/mcp-client.js +5 -3
  77. package/dist/lib/mcp/mcp-client.js.map +1 -1
  78. package/dist/lib/mcp/types.d.ts +0 -9
  79. package/dist/lib/mcp/types.d.ts.map +1 -1
  80. package/dist/lib/mcp/types.js +1 -2
  81. package/dist/lib/mcp/types.js.map +1 -1
  82. package/dist/lib/memory/memory-manager.d.ts +1 -0
  83. package/dist/lib/memory/memory-manager.d.ts.map +1 -1
  84. package/dist/lib/memory/memory-manager.js +9 -0
  85. package/dist/lib/memory/memory-manager.js.map +1 -1
  86. package/dist/lib/orchestrator.d.ts +2 -8
  87. package/dist/lib/orchestrator.d.ts.map +1 -1
  88. package/dist/lib/orchestrator.js +96 -3
  89. package/dist/lib/orchestrator.js.map +1 -1
  90. package/dist/lib/sandbox/cdp-client.d.ts +14 -0
  91. package/dist/lib/sandbox/cdp-client.d.ts.map +1 -0
  92. package/dist/lib/sandbox/cdp-client.js +113 -0
  93. package/dist/lib/sandbox/cdp-client.js.map +1 -0
  94. package/dist/lib/sandbox/html-to-markdown.d.ts +9 -1
  95. package/dist/lib/sandbox/html-to-markdown.d.ts.map +1 -1
  96. package/dist/lib/sandbox/html-to-markdown.js +67 -10
  97. package/dist/lib/sandbox/html-to-markdown.js.map +1 -1
  98. package/dist/lib/sandbox/index.d.ts +5 -0
  99. package/dist/lib/sandbox/index.d.ts.map +1 -1
  100. package/dist/lib/sandbox/index.js +4 -0
  101. package/dist/lib/sandbox/index.js.map +1 -1
  102. package/dist/lib/sandbox/page-readiness.d.ts +37 -0
  103. package/dist/lib/sandbox/page-readiness.d.ts.map +1 -0
  104. package/dist/lib/sandbox/page-readiness.js +235 -0
  105. package/dist/lib/sandbox/page-readiness.js.map +1 -0
  106. package/dist/lib/sandbox/sandbox-browser.d.ts +4 -0
  107. package/dist/lib/sandbox/sandbox-browser.d.ts.map +1 -0
  108. package/dist/lib/sandbox/sandbox-browser.js +303 -0
  109. package/dist/lib/sandbox/sandbox-browser.js.map +1 -0
  110. package/dist/lib/sandbox/sandbox-file.d.ts +4 -0
  111. package/dist/lib/sandbox/sandbox-file.d.ts.map +1 -0
  112. package/dist/lib/sandbox/sandbox-file.js +168 -0
  113. package/dist/lib/sandbox/sandbox-file.js.map +1 -0
  114. package/dist/lib/sandbox/sandbox-shell.d.ts +4 -0
  115. package/dist/lib/sandbox/sandbox-shell.d.ts.map +1 -0
  116. package/dist/lib/sandbox/sandbox-shell.js +93 -0
  117. package/dist/lib/sandbox/sandbox-shell.js.map +1 -0
  118. package/dist/lib/sandbox/sandbox-web.d.ts.map +1 -1
  119. package/dist/lib/sandbox/sandbox-web.js +37 -22
  120. package/dist/lib/sandbox/sandbox-web.js.map +1 -1
  121. package/dist/lib/sandbox/types.d.ts +9 -0
  122. package/dist/lib/sandbox/types.d.ts.map +1 -1
  123. package/dist/lib/sandbox/types.js +1 -0
  124. package/dist/lib/sandbox/types.js.map +1 -1
  125. package/dist/lib/sandbox/vision-browser.d.ts +4 -0
  126. package/dist/lib/sandbox/vision-browser.d.ts.map +1 -0
  127. package/dist/lib/sandbox/vision-browser.js +289 -0
  128. package/dist/lib/sandbox/vision-browser.js.map +1 -0
  129. package/dist/lib/skills/skill-loader.d.ts +2 -0
  130. package/dist/lib/skills/skill-loader.d.ts.map +1 -1
  131. package/dist/lib/skills/skill-loader.js +12 -1
  132. package/dist/lib/skills/skill-loader.js.map +1 -1
  133. package/dist/lib/tasks/task-manager.d.ts +3 -1
  134. package/dist/lib/tasks/task-manager.d.ts.map +1 -1
  135. package/dist/lib/tasks/task-manager.js +11 -0
  136. package/dist/lib/tasks/task-manager.js.map +1 -1
  137. package/dist/lib/tasks/task-store.d.ts +1 -1
  138. package/dist/lib/tasks/task-store.d.ts.map +1 -1
  139. package/dist/lib/tasks/task-store.js.map +1 -1
  140. package/dist/lib/tasks/types.d.ts +18 -0
  141. package/dist/lib/tasks/types.d.ts.map +1 -1
  142. package/dist/lib/tools/built-in/integration-tools.d.ts +4 -0
  143. package/dist/lib/tools/built-in/integration-tools.d.ts.map +1 -0
  144. package/dist/lib/tools/built-in/integration-tools.js +47 -0
  145. package/dist/lib/tools/built-in/integration-tools.js.map +1 -0
  146. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts.map +1 -1
  147. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js +12 -6
  148. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js.map +1 -1
  149. package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts.map +1 -1
  150. package/dist/lib/tools/built-in/knowledge-sql.tool.js +4 -3
  151. package/dist/lib/tools/built-in/knowledge-sql.tool.js.map +1 -1
  152. package/dist/lib/tools/built-in/query-validators.d.ts.map +1 -1
  153. package/dist/lib/tools/built-in/query-validators.js +4 -0
  154. package/dist/lib/tools/built-in/query-validators.js.map +1 -1
  155. package/dist/lib/tools/workspace/workspace-tools.d.ts +1 -0
  156. package/dist/lib/tools/workspace/workspace-tools.d.ts.map +1 -1
  157. package/dist/lib/tools/workspace/workspace-tools.js +39 -0
  158. package/dist/lib/tools/workspace/workspace-tools.js.map +1 -1
  159. package/dist/lib/triggers/cron-trigger.d.ts +1 -1
  160. package/dist/lib/triggers/cron-trigger.d.ts.map +1 -1
  161. package/dist/lib/triggers/cron-trigger.js.map +1 -1
  162. package/dist/lib/triggers/trigger-manager.d.ts +1 -0
  163. package/dist/lib/triggers/trigger-manager.d.ts.map +1 -1
  164. package/dist/lib/triggers/trigger-manager.js +26 -0
  165. package/dist/lib/triggers/trigger-manager.js.map +1 -1
  166. package/dist/lib/triggers/webhook-trigger.d.ts +1 -1
  167. package/dist/lib/triggers/webhook-trigger.d.ts.map +1 -1
  168. package/dist/lib/triggers/webhook-trigger.js.map +1 -1
  169. package/dist/lib/types/llm-types.d.ts +22 -4
  170. package/dist/lib/types/llm-types.d.ts.map +1 -1
  171. package/dist/lib/types/llm-types.js +50 -0
  172. package/dist/lib/types/llm-types.js.map +1 -1
  173. package/dist/lib/types/tool-factory.d.ts +2 -2
  174. package/dist/lib/types/tool-factory.d.ts.map +1 -1
  175. package/dist/lib/types/tool-factory.js.map +1 -1
  176. package/dist/lib/utils/env-substitution.d.ts +6 -0
  177. package/dist/lib/utils/env-substitution.d.ts.map +1 -0
  178. package/dist/lib/utils/env-substitution.js +15 -0
  179. package/dist/lib/utils/env-substitution.js.map +1 -0
  180. package/dist/lib/workflows/react-workflow-executor.js +3 -3
  181. package/dist/lib/workflows/react-workflow-executor.js.map +1 -1
  182. package/dist/lib/workflows/types.d.ts +10 -10
  183. package/dist/lib/workflows/workflow-loader.d.ts +3 -0
  184. package/dist/lib/workflows/workflow-loader.d.ts.map +1 -1
  185. package/dist/lib/workflows/workflow-loader.js +10 -1
  186. package/dist/lib/workflows/workflow-loader.js.map +1 -1
  187. package/dist/public/chat.html +114 -0
  188. package/dist/public/index.html +157 -0
  189. package/dist/public/src/components/AgentComposer.js +807 -0
  190. package/dist/public/src/components/AgentsView.js +740 -317
  191. package/dist/public/src/components/AppRoot.js +30 -5
  192. package/dist/public/src/components/GraphView.js +372 -288
  193. package/dist/public/src/components/IdeView.js +163 -7
  194. package/dist/public/src/components/MonitorView.js +139 -1
  195. package/dist/public/src/components/StandaloneChat.js +889 -0
  196. package/dist/public/src/components/WorkflowsView.js +180 -28
  197. package/dist/public/src/services/ApiService.js +7 -2
  198. package/dist/public/src/services/SessionStore.js +83 -0
  199. package/dist/public/src/store.js +0 -2
  200. package/dist/public/src/utils/markdown.js +13 -0
  201. package/dist/src/cli/index.js +7 -4
  202. package/dist/src/cli/index.js.map +1 -1
  203. package/dist/src/middleware/auth.d.ts.map +1 -1
  204. package/dist/src/middleware/auth.js +28 -6
  205. package/dist/src/middleware/auth.js.map +1 -1
  206. package/dist/src/middleware/rate-limit.d.ts +8 -0
  207. package/dist/src/middleware/rate-limit.d.ts.map +1 -0
  208. package/dist/src/middleware/rate-limit.js +21 -0
  209. package/dist/src/middleware/rate-limit.js.map +1 -0
  210. package/dist/src/routes/agents.route.d.ts.map +1 -1
  211. package/dist/src/routes/agents.route.js +136 -10
  212. package/dist/src/routes/agents.route.js.map +1 -1
  213. package/dist/src/routes/chat.route.d.ts +3 -0
  214. package/dist/src/routes/chat.route.d.ts.map +1 -0
  215. package/dist/src/routes/chat.route.js +155 -0
  216. package/dist/src/routes/chat.route.js.map +1 -0
  217. package/dist/src/routes/files.route.d.ts.map +1 -1
  218. package/dist/src/routes/files.route.js +37 -2
  219. package/dist/src/routes/files.route.js.map +1 -1
  220. package/dist/src/routes/llm.route.d.ts.map +1 -1
  221. package/dist/src/routes/llm.route.js +40 -5
  222. package/dist/src/routes/llm.route.js.map +1 -1
  223. package/dist/src/routes/tasks.route.d.ts.map +1 -1
  224. package/dist/src/routes/tasks.route.js +15 -1
  225. package/dist/src/routes/tasks.route.js.map +1 -1
  226. package/dist/src/routes/vnc.route.d.ts +3 -0
  227. package/dist/src/routes/vnc.route.d.ts.map +1 -0
  228. package/dist/src/routes/vnc.route.js +49 -0
  229. package/dist/src/routes/vnc.route.js.map +1 -0
  230. package/dist/src/server.d.ts.map +1 -1
  231. package/dist/src/server.js +5 -1
  232. package/dist/src/server.js.map +1 -1
  233. package/dist/templates/Demo.md +152 -0
  234. package/dist/templates/README.md +12 -3
  235. package/dist/templates/agents/architect.agent.yaml +20 -12
  236. package/dist/templates/agents/chatbot.agent.yaml +23 -26
  237. package/dist/templates/agents/corporate.agent.yaml +65 -0
  238. package/dist/templates/agents/investment-analyst.agent.yaml +80 -0
  239. package/dist/templates/agents/music-librarian.agent.yaml +70 -0
  240. package/dist/templates/agents/network-security.agent.yaml +82 -0
  241. package/dist/templates/agents/transport-security.agent.yaml +70 -0
  242. package/dist/templates/agents/web-engineer.agent.yaml +99 -0
  243. package/dist/templates/agents/web-pilot.agent.yaml +58 -0
  244. package/dist/templates/knowledge/music-store/LICENSE.md +11 -0
  245. package/dist/templates/knowledge/music-store/musicstore.sqlite +0 -0
  246. package/dist/templates/knowledge/music-store/tables.png +0 -0
  247. package/dist/templates/knowledge/music-store.knowledge.yaml +138 -0
  248. package/dist/templates/knowledge/org-chart/personnel.csv +21 -21
  249. package/dist/templates/knowledge/org-chart.knowledge.yaml +4 -0
  250. package/dist/templates/knowledge/pet-store.knowledge.yaml +3 -0
  251. package/dist/templates/knowledge/security-incidents/incidents.json +55935 -0
  252. package/dist/templates/knowledge/security-incidents.knowledge.yaml +46 -0
  253. package/dist/templates/knowledge/{example.knowledge.yaml → transcripts.knowledge.yaml} +9 -5
  254. package/dist/templates/knowledge/transport-ot/systems.csv +117 -0
  255. package/dist/templates/knowledge/transport-ot.knowledge.yaml +55 -0
  256. package/dist/templates/llm.json +7 -30
  257. package/dist/templates/mcp.json +7 -4
  258. package/dist/templates/skills/orcha-builder/SKILL.md +106 -226
  259. package/dist/templates/skills/pii-guard/SKILL.md +22 -0
  260. package/dist/templates/skills/sandbox/SKILL.md +25 -48
  261. package/dist/templates/skills/web-pilot/SKILL.md +51 -0
  262. package/package.json +8 -3
  263. package/dist/templates/agents/knowledge-broker.agent.yaml +0 -39
  264. package/dist/templates/agents/sandbox.agent.yaml +0 -56
@@ -22,6 +22,8 @@ export class WorkflowsView extends Component {
22
22
  this.workflows = [];
23
23
  this.selectedWorkflow = null;
24
24
  this.chartInterval = null;
25
+ this.activeTaskId = null;
26
+ this.eventSource = null;
25
27
  }
26
28
 
27
29
  async connectedCallback() {
@@ -31,6 +33,14 @@ export class WorkflowsView extends Component {
31
33
 
32
34
  disconnectedCallback() {
33
35
  this.stopChartUpdate();
36
+ this.closeEventSource();
37
+ }
38
+
39
+ closeEventSource() {
40
+ if (this.eventSource) {
41
+ this.eventSource.close();
42
+ this.eventSource = null;
43
+ }
34
44
  }
35
45
 
36
46
  // ── Data ──
@@ -220,16 +230,7 @@ export class WorkflowsView extends Component {
220
230
 
221
231
  // ── Execution ──
222
232
 
223
- async runWorkflow() {
224
- if (!this.selectedWorkflow) return;
225
-
226
- const inputs = {};
227
- this.querySelectorAll('input[id^="wf-"]').forEach(input => {
228
- const key = input.id.replace('wf-', '');
229
- if (input.value) inputs[key] = input.value;
230
- });
231
-
232
- const runBtn = this.querySelector('#runWorkflow');
233
+ resetRunUI() {
233
234
  const logEl = this.querySelector('#statusLog');
234
235
  const outputEl = this.querySelector('#workflowOutput');
235
236
 
@@ -238,34 +239,182 @@ export class WorkflowsView extends Component {
238
239
  outputEl.className = outputEl.className.replace('text-gray-300', 'text-gray-500');
239
240
  this.querySelector('#statusMessage').textContent = 'Starting...';
240
241
  this.querySelector('#statusDot').className = 'inline-block w-2 h-2 rounded-full bg-blue-400 animate-pulse';
241
- if (runBtn) runBtn.disabled = true;
242
+ this.clearInterruptPrompt();
243
+ this.closeEventSource();
244
+ this.activeTaskId = null;
245
+ }
242
246
 
247
+ collectInputs() {
248
+ const inputs = {};
249
+ this.querySelectorAll('input[id^="wf-"]').forEach(input => {
250
+ const key = input.id.replace('wf-', '');
251
+ if (input.value) inputs[key] = input.value;
252
+ });
253
+ return inputs;
254
+ }
255
+
256
+ async runWorkflow() {
257
+ if (!this.selectedWorkflow) return;
258
+
259
+ const inputs = this.collectInputs();
260
+ const runBtn = this.querySelector('#runWorkflow');
261
+ this.resetRunUI();
262
+ if (runBtn) runBtn.disabled = true;
243
263
  this.startChartUpdate();
244
264
 
265
+ const isReact = this.selectedWorkflow.type === 'react';
266
+
245
267
  try {
246
- const res = await api.startWorkflowStream(this.selectedWorkflow.name, inputs);
247
- const reader = res.body.getReader();
248
- const decoder = new TextDecoder();
249
-
250
- while (true) {
251
- const { done, value } = await reader.read();
252
- if (done) break;
253
-
254
- const chunk = decoder.decode(value);
255
- for (const line of chunk.split('\n')) {
256
- if (!line.startsWith('data: ')) continue;
257
- const data = line.slice(6);
258
- if (data === '[DONE]') continue;
259
- try { this.handleStatusUpdate(JSON.parse(data)); } catch (e) { }
260
- }
268
+ if (isReact) {
269
+ await this.runReactWorkflow(inputs);
270
+ } else {
271
+ await this.runStepsWorkflow(inputs);
261
272
  }
262
273
  } catch (e) {
263
274
  this.addLog(`Error: ${e.message}`, 'workflow_error');
264
275
  this.querySelector('#statusMessage').textContent = 'Error';
265
276
  this.querySelector('#statusDot').className = 'inline-block w-2 h-2 rounded-full bg-red-400';
266
277
  } finally {
267
- if (runBtn) runBtn.disabled = false;
268
- this.stopChartUpdate();
278
+ if (!isReact) {
279
+ if (runBtn) runBtn.disabled = false;
280
+ this.stopChartUpdate();
281
+ }
282
+ }
283
+ }
284
+
285
+ async runStepsWorkflow(inputs) {
286
+ const res = await api.startWorkflowStream(this.selectedWorkflow.name, inputs);
287
+ const reader = res.body.getReader();
288
+ const decoder = new TextDecoder();
289
+
290
+ while (true) {
291
+ const { done, value } = await reader.read();
292
+ if (done) break;
293
+
294
+ const chunk = decoder.decode(value);
295
+ for (const line of chunk.split('\n')) {
296
+ if (!line.startsWith('data: ')) continue;
297
+ const data = line.slice(6);
298
+ if (data === '[DONE]') continue;
299
+ try { this.handleStatusUpdate(JSON.parse(data)); } catch (e) { }
300
+ }
301
+ }
302
+ }
303
+
304
+ async runReactWorkflow(inputs) {
305
+ const { id: taskId } = await api.submitWorkflowTask(this.selectedWorkflow.name, inputs);
306
+ this.activeTaskId = taskId;
307
+ this.addLog('Task submitted', 'workflow_start');
308
+
309
+ this.eventSource = api.streamTask(taskId);
310
+
311
+ this.eventSource.onmessage = (event) => {
312
+ try {
313
+ const data = JSON.parse(event.data);
314
+ this.handleTaskSSE(data);
315
+ } catch { /* ignore parse errors */ }
316
+ };
317
+
318
+ this.eventSource.onerror = () => {
319
+ this.closeEventSource();
320
+ this.finishReactRun();
321
+ };
322
+ }
323
+
324
+ handleTaskSSE(data) {
325
+ if (data.type === 'status') {
326
+ const statusMsg = this.querySelector('#statusMessage');
327
+ const statusDot = this.querySelector('#statusDot');
328
+
329
+ if (data.status === 'working') {
330
+ statusMsg.textContent = 'Working...';
331
+ statusDot.className = 'inline-block w-2 h-2 rounded-full bg-blue-400 animate-pulse';
332
+ this.clearInterruptPrompt();
333
+ this.addLog('Workflow running', 'react_iteration');
334
+ } else if (data.status === 'input-required') {
335
+ const question = data.inputRequest?.question || 'Input required';
336
+ statusMsg.textContent = 'Awaiting input';
337
+ statusDot.className = 'inline-block w-2 h-2 rounded-full bg-amber-400';
338
+ this.addLog(`Input required: ${question}`, 'workflow_interrupt');
339
+ this.showInterruptPrompt(question);
340
+ } else if (data.status === 'completed') {
341
+ statusMsg.textContent = 'Completed';
342
+ statusDot.className = 'inline-block w-2 h-2 rounded-full bg-green-400';
343
+ this.addLog('Workflow completed', 'workflow_complete');
344
+ if (data.result) {
345
+ const outputEl = this.querySelector('#workflowOutput');
346
+ outputEl.className = outputEl.className.replace('text-gray-500', 'text-gray-300');
347
+ outputEl.textContent = JSON.stringify(data.result, null, 2);
348
+ }
349
+ } else if (data.status === 'failed') {
350
+ statusMsg.textContent = 'Error';
351
+ statusDot.className = 'inline-block w-2 h-2 rounded-full bg-red-400';
352
+ this.addLog(`Error: ${data.error || 'Unknown error'}`, 'workflow_error');
353
+ } else if (data.status === 'canceled') {
354
+ statusMsg.textContent = 'Canceled';
355
+ statusDot.className = 'inline-block w-2 h-2 rounded-full bg-yellow-400';
356
+ this.addLog('Task canceled', 'workflow_error');
357
+ }
358
+ }
359
+
360
+ if (data.type === 'done') {
361
+ this.closeEventSource();
362
+ this.finishReactRun();
363
+ }
364
+ }
365
+
366
+ finishReactRun() {
367
+ const runBtn = this.querySelector('#runWorkflow');
368
+ if (runBtn) runBtn.disabled = false;
369
+ this.stopChartUpdate();
370
+ this.activeTaskId = null;
371
+ }
372
+
373
+ showInterruptPrompt(question) {
374
+ const container = this.querySelector('#interruptPrompt');
375
+ if (!container) return;
376
+
377
+ container.innerHTML = `
378
+ <div class="bg-amber-500/10 border border-amber-500/30 rounded-lg p-4">
379
+ <div class="flex items-center gap-2 mb-3">
380
+ <i class="fas fa-question-circle text-amber-400"></i>
381
+ <span class="text-sm font-medium text-amber-400">Input Required</span>
382
+ </div>
383
+ <p class="text-sm text-gray-300 mb-3">${this.escapeHtml(question)}</p>
384
+ <div class="flex gap-2">
385
+ <input id="interruptInput" type="text" placeholder="Type your response..."
386
+ class="flex-1 bg-dark-bg border border-dark-border rounded-lg px-3 py-2 text-sm text-gray-200 focus:outline-none focus:border-amber-500" />
387
+ <button id="interruptSendBtn" class="px-4 py-2 bg-amber-500 hover:bg-amber-600 text-white text-sm font-medium rounded-lg transition-colors">
388
+ Send
389
+ </button>
390
+ </div>
391
+ </div>`;
392
+
393
+ this.querySelector('#interruptSendBtn').addEventListener('click', () => this.handleInterruptResponse());
394
+ this.querySelector('#interruptInput').addEventListener('keydown', (e) => {
395
+ if (e.key === 'Enter') this.handleInterruptResponse();
396
+ });
397
+ this.querySelector('#interruptInput').focus();
398
+ }
399
+
400
+ clearInterruptPrompt() {
401
+ const container = this.querySelector('#interruptPrompt');
402
+ if (container) container.innerHTML = '';
403
+ }
404
+
405
+ async handleInterruptResponse() {
406
+ const input = this.querySelector('#interruptInput');
407
+ const response = input?.value?.trim();
408
+ if (!response || !this.activeTaskId) return;
409
+
410
+ try {
411
+ await api.respondToTask(this.activeTaskId, response);
412
+ this.clearInterruptPrompt();
413
+ this.addLog(`Responded: ${response}`, 'tool_result');
414
+ this.querySelector('#statusMessage').textContent = 'Resuming...';
415
+ this.querySelector('#statusDot').className = 'inline-block w-2 h-2 rounded-full bg-blue-400 animate-pulse';
416
+ } catch (e) {
417
+ this.addLog(`Failed to respond: ${e.message}`, 'workflow_error');
269
418
  }
270
419
  }
271
420
 
@@ -398,6 +547,9 @@ export class WorkflowsView extends Component {
398
547
  <div id="statusLog" class="bg-dark-bg rounded-lg p-2.5 h-32 overflow-y-auto space-y-0.5 border border-dark-border custom-scrollbar"></div>
399
548
  </div>
400
549
 
550
+ <!-- Interrupt prompt (shown when HITL input required) -->
551
+ <div id="interruptPrompt"></div>
552
+
401
553
  <!-- Output -->
402
554
  <div>
403
555
  <h3 class="text-xs font-semibold text-gray-400 uppercase tracking-wider mb-1.5 flex items-center gap-1.5">
@@ -24,6 +24,11 @@ export class ApiService {
24
24
  return res.json();
25
25
  }
26
26
 
27
+ async checkSession(sessionId) {
28
+ const res = await this._fetch(`/api/agents/sessions/${sessionId}`);
29
+ return res.ok;
30
+ }
31
+
27
32
  async streamAgent(name, input, sessionId, { signal } = {}) {
28
33
  return this._fetch(`/api/agents/${name}/stream`, {
29
34
  method: 'POST',
@@ -102,11 +107,11 @@ export class ApiService {
102
107
  return res.json();
103
108
  }
104
109
 
105
- async streamLLM(name, message, { signal } = {}) {
110
+ async streamLLM(name, message, sessionId, attachments, { signal } = {}) {
106
111
  return this._fetch(`/api/llm/${name}/stream`, {
107
112
  method: 'POST',
108
113
  headers: { 'Content-Type': 'application/json' },
109
- body: JSON.stringify({ message }),
114
+ body: JSON.stringify({ message, sessionId, ...(attachments ? { attachments } : {}) }),
110
115
  signal
111
116
  });
112
117
  }
@@ -0,0 +1,83 @@
1
+
2
+ const SESSIONS_KEY = 'orcha-sessions';
3
+ const ACTIVE_KEY = 'orcha-active-session-id';
4
+ const MAX_SESSIONS = 50;
5
+
6
+ class SessionStore {
7
+ getAll() {
8
+ const raw = localStorage.getItem(SESSIONS_KEY);
9
+ const sessions = raw ? JSON.parse(raw) : [];
10
+ return sessions.sort((a, b) => b.updatedAt - a.updatedAt);
11
+ }
12
+
13
+ get(id) {
14
+ return this.getAll().find(s => s.id === id) || null;
15
+ }
16
+
17
+ create({ agentName, agentType, llmName }) {
18
+ const sessions = this.getAll();
19
+ const session = {
20
+ id: 'session-' + Date.now() + '-' + Math.random().toString(36).substring(2, 9),
21
+ agentName: agentName || null,
22
+ agentType: agentType || 'agent',
23
+ llmName: llmName || null,
24
+ title: 'New conversation',
25
+ messages: [],
26
+ createdAt: Date.now(),
27
+ updatedAt: Date.now()
28
+ };
29
+
30
+ sessions.unshift(session);
31
+
32
+ // Enforce max sessions — remove oldest
33
+ if (sessions.length > MAX_SESSIONS) {
34
+ sessions.length = MAX_SESSIONS;
35
+ }
36
+
37
+ this._save(sessions);
38
+ this.setActiveId(session.id);
39
+ return session;
40
+ }
41
+
42
+ addMessage(sessionId, role, content) {
43
+ const sessions = this.getAll();
44
+ const session = sessions.find(s => s.id === sessionId);
45
+ if (!session) return;
46
+
47
+ session.messages.push({ role, content });
48
+ session.updatedAt = Date.now();
49
+
50
+ // Set title from first user message
51
+ if (role === 'user' && session.title === 'New conversation') {
52
+ session.title = content.length > 50 ? content.substring(0, 50) + '...' : content;
53
+ }
54
+
55
+ this._save(sessions);
56
+ }
57
+
58
+ delete(sessionId) {
59
+ const sessions = this.getAll().filter(s => s.id !== sessionId);
60
+ this._save(sessions);
61
+ if (this.getActiveId() === sessionId) {
62
+ this.clearActiveId();
63
+ }
64
+ }
65
+
66
+ getActiveId() {
67
+ return localStorage.getItem(ACTIVE_KEY);
68
+ }
69
+
70
+ setActiveId(id) {
71
+ localStorage.setItem(ACTIVE_KEY, id);
72
+ }
73
+
74
+ clearActiveId() {
75
+ localStorage.removeItem(ACTIVE_KEY);
76
+ }
77
+
78
+ _save(sessions) {
79
+ localStorage.setItem(SESSIONS_KEY, JSON.stringify(sessions));
80
+ }
81
+ }
82
+
83
+ export const sessionStore = new SessionStore();
@@ -10,8 +10,6 @@ class Store extends EventTarget {
10
10
  activeTab: initialTab,
11
11
  agents: [],
12
12
  selectedAgent: null,
13
- chatHistory: [],
14
- sessionId: 'session-' + Date.now() + '-' + Math.random().toString(36).substring(2, 9),
15
13
  workflows: [],
16
14
  knowledgeStores: [],
17
15
  llms: [],
@@ -5,17 +5,30 @@ export class MarkdownRenderer {
5
5
  constructor() {
6
6
  // Configure marked for streaming-friendly rendering
7
7
  if (typeof marked !== 'undefined') {
8
+ const renderer = new marked.Renderer();
9
+ renderer.link = ({ href, title, tokens }) => {
10
+ const text = this.#parseInlineTokens(tokens);
11
+ const titleAttr = title ? ` title="${title}"` : '';
12
+ return `<a href="${href}"${titleAttr} target="_blank" rel="noopener noreferrer">${text}</a>`;
13
+ };
14
+
8
15
  marked.setOptions({
9
16
  gfm: true, // GitHub Flavored Markdown
10
17
  breaks: true, // Convert \n to <br>
11
18
  headerIds: false, // Disable header IDs (not needed for chat)
12
19
  mangle: false, // Don't mangle email addresses
13
20
  sanitize: false, // We'll use DOMPurify instead
21
+ renderer,
14
22
  });
15
23
  }
16
24
 
17
25
  }
18
26
 
27
+ #parseInlineTokens(tokens) {
28
+ if (!tokens) return '';
29
+ return tokens.map(t => t.raw || t.text || '').join('');
30
+ }
31
+
19
32
  /**
20
33
  * Render markdown string to sanitized HTML
21
34
  * @param {string} markdown - Raw markdown text
@@ -1,6 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import { initCommand } from "./commands/init.js";
3
- import { startCommand } from "./commands/start.js";
4
2
  const args = process.argv.slice(2);
5
3
  const command = args[0];
6
4
  function showHelp() {
@@ -32,12 +30,16 @@ Documentation: https://github.com/ddalcu/agent-orcha
32
30
  async function main() {
33
31
  try {
34
32
  switch (command) {
35
- case 'init':
33
+ case 'init': {
34
+ const { initCommand } = await import("./commands/init.js");
36
35
  await initCommand(args.slice(1));
37
36
  break;
38
- case 'start':
37
+ }
38
+ case 'start': {
39
+ const { startCommand } = await import("./commands/start.js");
39
40
  await startCommand(args.slice(1));
40
41
  break;
42
+ }
41
43
  case 'help':
42
44
  case '--help':
43
45
  case '-h':
@@ -56,4 +58,5 @@ async function main() {
56
58
  }
57
59
  }
58
60
  main();
61
+ export {};
59
62
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAExB,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuBb,CAAC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,MAAM;gBACT,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjC,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClC,MAAM;YACR,KAAK,MAAM,CAAC;YACZ,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI,CAAC;YACV,KAAK,SAAS;gBACZ,QAAQ,EAAE,CAAC;gBACX,MAAM;YACR;gBACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;gBAC7C,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";AAEA,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAExB,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuBb,CAAC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBAC3D,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjC,MAAM;YACR,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;gBAC7D,MAAM,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClC,MAAM;YACR,CAAC;YACD,KAAK,MAAM,CAAC;YACZ,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI,CAAC;YACV,KAAK,SAAS;gBACZ,QAAQ,EAAE,CAAC;gBACX,MAAM;YACR;gBACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;gBAC7C,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAgC,MAAM,SAAS,CAAC;AAsHhF,eAAO,MAAM,UAAU,oBAAqB,CAAC"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAgC,MAAM,SAAS,CAAC;AA2IhF,eAAO,MAAM,UAAU,oBAAqB,CAAC"}
@@ -1,16 +1,32 @@
1
1
  import fp from 'fastify-plugin';
2
2
  import { randomBytes, timingSafeEqual } from 'crypto';
3
+ import { rateLimitHook } from "./rate-limit.js";
3
4
  const COOKIE_NAME = 'orcha_session';
4
5
  const MAX_AGE = 86400;
5
- // --- Session store ---
6
- const sessions = new Set();
6
+ // --- Session store (token -> expiration timestamp) ---
7
+ const sessions = new Map();
8
+ // Cleanup expired sessions every hour
9
+ setInterval(() => {
10
+ const now = Date.now();
11
+ for (const [token, expiresAt] of sessions) {
12
+ if (now > expiresAt)
13
+ sessions.delete(token);
14
+ }
15
+ }, 60 * 60 * 1000);
7
16
  function createSession() {
8
17
  const token = randomBytes(32).toString('hex');
9
- sessions.add(token);
18
+ sessions.set(token, Date.now() + MAX_AGE * 1000);
10
19
  return token;
11
20
  }
12
21
  function isValidSession(token) {
13
- return sessions.has(token);
22
+ const expiresAt = sessions.get(token);
23
+ if (expiresAt === undefined)
24
+ return false;
25
+ if (Date.now() > expiresAt) {
26
+ sessions.delete(token);
27
+ return false;
28
+ }
29
+ return true;
14
30
  }
15
31
  function destroySession(token) {
16
32
  sessions.delete(token);
@@ -62,9 +78,14 @@ function verifyPassword(input) {
62
78
  }
63
79
  }
64
80
  const PUBLIC_PATHS = new Set(['/api/auth/login', '/api/auth/check', '/api/auth/logout']);
81
+ const PROTECTED_NON_API = ['/vnc', '/websockify'];
65
82
  function isPublicRequest(url) {
66
83
  const path = url.split('?')[0] ?? url;
67
- return path === '/health' || PUBLIC_PATHS.has(path) || !path.startsWith('/api/');
84
+ if (path === '/health' || PUBLIC_PATHS.has(path) || path.startsWith('/api/chat/'))
85
+ return true;
86
+ if (PROTECTED_NON_API.some((p) => path === p || path.startsWith(p + '/')))
87
+ return false;
88
+ return !path.startsWith('/api/');
68
89
  }
69
90
  // --- Plugin (fp breaks encapsulation so the hook applies globally) ---
70
91
  const authPluginImpl = async (fastify) => {
@@ -84,7 +105,8 @@ const authPluginImpl = async (fastify) => {
84
105
  const token = getSessionToken(request);
85
106
  return { authenticated: !!token && isValidSession(token), required: true };
86
107
  });
87
- fastify.post('/api/auth/login', async (request, reply) => {
108
+ const loginRateLimit = rateLimitHook(5, 60_000);
109
+ fastify.post('/api/auth/login', { preHandler: loginRateLimit }, async (request, reply) => {
88
110
  if (!isAuthEnabled())
89
111
  return { authenticated: true, required: false };
90
112
  const { password } = request.body ?? {};
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/middleware/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/middleware/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { FastifyRequest, FastifyReply } from 'fastify';
2
+ /**
3
+ * In-memory sliding-window rate limiter.
4
+ * Tracks request timestamps per IP and rejects with 429 when the limit is exceeded.
5
+ * Each call creates an independent limiter with its own state.
6
+ */
7
+ export declare function rateLimitHook(maxAttempts: number, windowMs: number): (request: FastifyRequest, reply: FastifyReply) => Promise<undefined>;
8
+ //# sourceMappingURL=rate-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5D;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAGnD,SAAS,cAAc,EAAE,OAAO,YAAY,wBAe3D"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * In-memory sliding-window rate limiter.
3
+ * Tracks request timestamps per IP and rejects with 429 when the limit is exceeded.
4
+ * Each call creates an independent limiter with its own state.
5
+ */
6
+ export function rateLimitHook(maxAttempts, windowMs) {
7
+ const buckets = new Map();
8
+ return async (request, reply) => {
9
+ const ip = request.ip;
10
+ const now = Date.now();
11
+ const timestamps = buckets.get(ip) ?? [];
12
+ // Keep only timestamps within the window
13
+ const recent = timestamps.filter((t) => now - t < windowMs);
14
+ if (recent.length >= maxAttempts) {
15
+ return reply.status(429).send({ error: 'Too many attempts. Try again later.' });
16
+ }
17
+ recent.push(now);
18
+ buckets.set(ip, recent);
19
+ };
20
+ }
21
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB,EAAE,QAAgB;IACjE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE5C,OAAO,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QAC5D,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAEzC,yCAAyC;QACzC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;QAE5D,IAAI,MAAM,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"agents.route.d.ts","sourceRoot":"","sources":["../../../src/routes/agents.route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAWlD,eAAO,MAAM,YAAY,EAAE,kBAkJ1B,CAAC"}
1
+ {"version":3,"file":"agents.route.d.ts","sourceRoot":"","sources":["../../../src/routes/agents.route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AA0BlD,eAAO,MAAM,YAAY,EAAE,kBAwP1B,CAAC"}