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.
- package/README.md +194 -1277
- package/dist/lib/agents/agent-executor.d.ts +4 -2
- package/dist/lib/agents/agent-executor.d.ts.map +1 -1
- package/dist/lib/agents/agent-executor.js +68 -52
- package/dist/lib/agents/agent-executor.js.map +1 -1
- package/dist/lib/agents/agent-loader.d.ts +3 -0
- package/dist/lib/agents/agent-loader.d.ts.map +1 -1
- package/dist/lib/agents/agent-loader.js +10 -1
- package/dist/lib/agents/agent-loader.js.map +1 -1
- package/dist/lib/agents/react-loop.d.ts.map +1 -1
- package/dist/lib/agents/react-loop.js +180 -142
- package/dist/lib/agents/react-loop.js.map +1 -1
- package/dist/lib/agents/types.d.ts +181 -18
- package/dist/lib/agents/types.d.ts.map +1 -1
- package/dist/lib/agents/types.js +18 -2
- package/dist/lib/agents/types.js.map +1 -1
- package/dist/lib/functions/function-loader.d.ts +2 -0
- package/dist/lib/functions/function-loader.d.ts.map +1 -1
- package/dist/lib/functions/function-loader.js +10 -0
- package/dist/lib/functions/function-loader.js.map +1 -1
- package/dist/lib/integrations/email.d.ts +38 -0
- package/dist/lib/integrations/email.d.ts.map +1 -0
- package/dist/lib/integrations/email.js +249 -0
- package/dist/lib/integrations/email.js.map +1 -0
- package/dist/lib/integrations/integration-manager.d.ts +5 -0
- package/dist/lib/integrations/integration-manager.d.ts.map +1 -1
- package/dist/lib/integrations/integration-manager.js +53 -3
- package/dist/lib/integrations/integration-manager.js.map +1 -1
- package/dist/lib/integrations/types.d.ts +187 -4
- package/dist/lib/integrations/types.d.ts.map +1 -1
- package/dist/lib/integrations/types.js +24 -1
- package/dist/lib/integrations/types.js.map +1 -1
- package/dist/lib/knowledge/knowledge-store.d.ts +6 -0
- package/dist/lib/knowledge/knowledge-store.d.ts.map +1 -1
- package/dist/lib/knowledge/knowledge-store.js +71 -4
- package/dist/lib/knowledge/knowledge-store.js.map +1 -1
- package/dist/lib/knowledge/loaders/file-loaders.d.ts +8 -2
- package/dist/lib/knowledge/loaders/file-loaders.d.ts.map +1 -1
- package/dist/lib/knowledge/loaders/file-loaders.js +89 -60
- package/dist/lib/knowledge/loaders/file-loaders.js.map +1 -1
- package/dist/lib/knowledge/loaders/web-loader.d.ts +12 -3
- package/dist/lib/knowledge/loaders/web-loader.d.ts.map +1 -1
- package/dist/lib/knowledge/loaders/web-loader.js +56 -22
- package/dist/lib/knowledge/loaders/web-loader.js.map +1 -1
- package/dist/lib/knowledge/types.d.ts +56 -20
- package/dist/lib/knowledge/types.d.ts.map +1 -1
- package/dist/lib/knowledge/types.js +18 -3
- package/dist/lib/knowledge/types.js.map +1 -1
- package/dist/lib/llm/llm-call-logger.d.ts +3 -1
- package/dist/lib/llm/llm-call-logger.d.ts.map +1 -1
- package/dist/lib/llm/llm-call-logger.js +31 -26
- package/dist/lib/llm/llm-call-logger.js.map +1 -1
- package/dist/lib/llm/llm-config.d.ts +8 -0
- package/dist/lib/llm/llm-config.d.ts.map +1 -1
- package/dist/lib/llm/llm-config.js +3 -1
- package/dist/lib/llm/llm-config.js.map +1 -1
- package/dist/lib/llm/llm-factory.d.ts.map +1 -1
- package/dist/lib/llm/llm-factory.js +3 -0
- package/dist/lib/llm/llm-factory.js.map +1 -1
- package/dist/lib/llm/providers/anthropic-chat-model.d.ts +5 -1
- package/dist/lib/llm/providers/anthropic-chat-model.d.ts.map +1 -1
- package/dist/lib/llm/providers/anthropic-chat-model.js +118 -42
- package/dist/lib/llm/providers/anthropic-chat-model.js.map +1 -1
- package/dist/lib/llm/providers/gemini-chat-model.d.ts +3 -2
- package/dist/lib/llm/providers/gemini-chat-model.d.ts.map +1 -1
- package/dist/lib/llm/providers/gemini-chat-model.js +83 -24
- package/dist/lib/llm/providers/gemini-chat-model.js.map +1 -1
- package/dist/lib/llm/providers/openai-chat-model.d.ts +10 -1
- package/dist/lib/llm/providers/openai-chat-model.d.ts.map +1 -1
- package/dist/lib/llm/providers/openai-chat-model.js +233 -32
- package/dist/lib/llm/providers/openai-chat-model.js.map +1 -1
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +0 -1
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/mcp/mcp-client.d.ts.map +1 -1
- package/dist/lib/mcp/mcp-client.js +5 -3
- package/dist/lib/mcp/mcp-client.js.map +1 -1
- package/dist/lib/mcp/types.d.ts +0 -9
- package/dist/lib/mcp/types.d.ts.map +1 -1
- package/dist/lib/mcp/types.js +1 -2
- package/dist/lib/mcp/types.js.map +1 -1
- package/dist/lib/memory/memory-manager.d.ts +1 -0
- package/dist/lib/memory/memory-manager.d.ts.map +1 -1
- package/dist/lib/memory/memory-manager.js +9 -0
- package/dist/lib/memory/memory-manager.js.map +1 -1
- package/dist/lib/orchestrator.d.ts +2 -8
- package/dist/lib/orchestrator.d.ts.map +1 -1
- package/dist/lib/orchestrator.js +96 -3
- package/dist/lib/orchestrator.js.map +1 -1
- package/dist/lib/sandbox/cdp-client.d.ts +14 -0
- package/dist/lib/sandbox/cdp-client.d.ts.map +1 -0
- package/dist/lib/sandbox/cdp-client.js +113 -0
- package/dist/lib/sandbox/cdp-client.js.map +1 -0
- package/dist/lib/sandbox/html-to-markdown.d.ts +9 -1
- package/dist/lib/sandbox/html-to-markdown.d.ts.map +1 -1
- package/dist/lib/sandbox/html-to-markdown.js +67 -10
- package/dist/lib/sandbox/html-to-markdown.js.map +1 -1
- package/dist/lib/sandbox/index.d.ts +5 -0
- package/dist/lib/sandbox/index.d.ts.map +1 -1
- package/dist/lib/sandbox/index.js +4 -0
- package/dist/lib/sandbox/index.js.map +1 -1
- package/dist/lib/sandbox/page-readiness.d.ts +37 -0
- package/dist/lib/sandbox/page-readiness.d.ts.map +1 -0
- package/dist/lib/sandbox/page-readiness.js +235 -0
- package/dist/lib/sandbox/page-readiness.js.map +1 -0
- package/dist/lib/sandbox/sandbox-browser.d.ts +4 -0
- package/dist/lib/sandbox/sandbox-browser.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-browser.js +303 -0
- package/dist/lib/sandbox/sandbox-browser.js.map +1 -0
- package/dist/lib/sandbox/sandbox-file.d.ts +4 -0
- package/dist/lib/sandbox/sandbox-file.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-file.js +168 -0
- package/dist/lib/sandbox/sandbox-file.js.map +1 -0
- package/dist/lib/sandbox/sandbox-shell.d.ts +4 -0
- package/dist/lib/sandbox/sandbox-shell.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-shell.js +93 -0
- package/dist/lib/sandbox/sandbox-shell.js.map +1 -0
- package/dist/lib/sandbox/sandbox-web.d.ts.map +1 -1
- package/dist/lib/sandbox/sandbox-web.js +37 -22
- package/dist/lib/sandbox/sandbox-web.js.map +1 -1
- package/dist/lib/sandbox/types.d.ts +9 -0
- package/dist/lib/sandbox/types.d.ts.map +1 -1
- package/dist/lib/sandbox/types.js +1 -0
- package/dist/lib/sandbox/types.js.map +1 -1
- package/dist/lib/sandbox/vision-browser.d.ts +4 -0
- package/dist/lib/sandbox/vision-browser.d.ts.map +1 -0
- package/dist/lib/sandbox/vision-browser.js +289 -0
- package/dist/lib/sandbox/vision-browser.js.map +1 -0
- package/dist/lib/skills/skill-loader.d.ts +2 -0
- package/dist/lib/skills/skill-loader.d.ts.map +1 -1
- package/dist/lib/skills/skill-loader.js +12 -1
- package/dist/lib/skills/skill-loader.js.map +1 -1
- package/dist/lib/tasks/task-manager.d.ts +3 -1
- package/dist/lib/tasks/task-manager.d.ts.map +1 -1
- package/dist/lib/tasks/task-manager.js +11 -0
- package/dist/lib/tasks/task-manager.js.map +1 -1
- package/dist/lib/tasks/task-store.d.ts +1 -1
- package/dist/lib/tasks/task-store.d.ts.map +1 -1
- package/dist/lib/tasks/task-store.js.map +1 -1
- package/dist/lib/tasks/types.d.ts +18 -0
- package/dist/lib/tasks/types.d.ts.map +1 -1
- package/dist/lib/tools/built-in/integration-tools.d.ts +4 -0
- package/dist/lib/tools/built-in/integration-tools.d.ts.map +1 -0
- package/dist/lib/tools/built-in/integration-tools.js +47 -0
- package/dist/lib/tools/built-in/integration-tools.js.map +1 -0
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js +12 -6
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/knowledge-sql.tool.js +4 -3
- package/dist/lib/tools/built-in/knowledge-sql.tool.js.map +1 -1
- package/dist/lib/tools/built-in/query-validators.d.ts.map +1 -1
- package/dist/lib/tools/built-in/query-validators.js +4 -0
- package/dist/lib/tools/built-in/query-validators.js.map +1 -1
- package/dist/lib/tools/workspace/workspace-tools.d.ts +1 -0
- package/dist/lib/tools/workspace/workspace-tools.d.ts.map +1 -1
- package/dist/lib/tools/workspace/workspace-tools.js +39 -0
- package/dist/lib/tools/workspace/workspace-tools.js.map +1 -1
- package/dist/lib/triggers/cron-trigger.d.ts +1 -1
- package/dist/lib/triggers/cron-trigger.d.ts.map +1 -1
- package/dist/lib/triggers/cron-trigger.js.map +1 -1
- package/dist/lib/triggers/trigger-manager.d.ts +1 -0
- package/dist/lib/triggers/trigger-manager.d.ts.map +1 -1
- package/dist/lib/triggers/trigger-manager.js +26 -0
- package/dist/lib/triggers/trigger-manager.js.map +1 -1
- package/dist/lib/triggers/webhook-trigger.d.ts +1 -1
- package/dist/lib/triggers/webhook-trigger.d.ts.map +1 -1
- package/dist/lib/triggers/webhook-trigger.js.map +1 -1
- package/dist/lib/types/llm-types.d.ts +22 -4
- package/dist/lib/types/llm-types.d.ts.map +1 -1
- package/dist/lib/types/llm-types.js +50 -0
- package/dist/lib/types/llm-types.js.map +1 -1
- package/dist/lib/types/tool-factory.d.ts +2 -2
- package/dist/lib/types/tool-factory.d.ts.map +1 -1
- package/dist/lib/types/tool-factory.js.map +1 -1
- package/dist/lib/utils/env-substitution.d.ts +6 -0
- package/dist/lib/utils/env-substitution.d.ts.map +1 -0
- package/dist/lib/utils/env-substitution.js +15 -0
- package/dist/lib/utils/env-substitution.js.map +1 -0
- package/dist/lib/workflows/react-workflow-executor.js +3 -3
- package/dist/lib/workflows/react-workflow-executor.js.map +1 -1
- package/dist/lib/workflows/types.d.ts +10 -10
- package/dist/lib/workflows/workflow-loader.d.ts +3 -0
- package/dist/lib/workflows/workflow-loader.d.ts.map +1 -1
- package/dist/lib/workflows/workflow-loader.js +10 -1
- package/dist/lib/workflows/workflow-loader.js.map +1 -1
- package/dist/public/chat.html +114 -0
- package/dist/public/index.html +157 -0
- package/dist/public/src/components/AgentComposer.js +807 -0
- package/dist/public/src/components/AgentsView.js +740 -317
- package/dist/public/src/components/AppRoot.js +30 -5
- package/dist/public/src/components/GraphView.js +372 -288
- package/dist/public/src/components/IdeView.js +163 -7
- package/dist/public/src/components/MonitorView.js +139 -1
- package/dist/public/src/components/StandaloneChat.js +889 -0
- package/dist/public/src/components/WorkflowsView.js +180 -28
- package/dist/public/src/services/ApiService.js +7 -2
- package/dist/public/src/services/SessionStore.js +83 -0
- package/dist/public/src/store.js +0 -2
- package/dist/public/src/utils/markdown.js +13 -0
- package/dist/src/cli/index.js +7 -4
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/middleware/auth.d.ts.map +1 -1
- package/dist/src/middleware/auth.js +28 -6
- package/dist/src/middleware/auth.js.map +1 -1
- package/dist/src/middleware/rate-limit.d.ts +8 -0
- package/dist/src/middleware/rate-limit.d.ts.map +1 -0
- package/dist/src/middleware/rate-limit.js +21 -0
- package/dist/src/middleware/rate-limit.js.map +1 -0
- package/dist/src/routes/agents.route.d.ts.map +1 -1
- package/dist/src/routes/agents.route.js +136 -10
- package/dist/src/routes/agents.route.js.map +1 -1
- package/dist/src/routes/chat.route.d.ts +3 -0
- package/dist/src/routes/chat.route.d.ts.map +1 -0
- package/dist/src/routes/chat.route.js +155 -0
- package/dist/src/routes/chat.route.js.map +1 -0
- package/dist/src/routes/files.route.d.ts.map +1 -1
- package/dist/src/routes/files.route.js +37 -2
- package/dist/src/routes/files.route.js.map +1 -1
- package/dist/src/routes/llm.route.d.ts.map +1 -1
- package/dist/src/routes/llm.route.js +40 -5
- package/dist/src/routes/llm.route.js.map +1 -1
- package/dist/src/routes/tasks.route.d.ts.map +1 -1
- package/dist/src/routes/tasks.route.js +15 -1
- package/dist/src/routes/tasks.route.js.map +1 -1
- package/dist/src/routes/vnc.route.d.ts +3 -0
- package/dist/src/routes/vnc.route.d.ts.map +1 -0
- package/dist/src/routes/vnc.route.js +49 -0
- package/dist/src/routes/vnc.route.js.map +1 -0
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +5 -1
- package/dist/src/server.js.map +1 -1
- package/dist/templates/Demo.md +152 -0
- package/dist/templates/README.md +12 -3
- package/dist/templates/agents/architect.agent.yaml +20 -12
- package/dist/templates/agents/chatbot.agent.yaml +23 -26
- package/dist/templates/agents/corporate.agent.yaml +65 -0
- package/dist/templates/agents/investment-analyst.agent.yaml +80 -0
- package/dist/templates/agents/music-librarian.agent.yaml +70 -0
- package/dist/templates/agents/network-security.agent.yaml +82 -0
- package/dist/templates/agents/transport-security.agent.yaml +70 -0
- package/dist/templates/agents/web-engineer.agent.yaml +99 -0
- package/dist/templates/agents/web-pilot.agent.yaml +58 -0
- package/dist/templates/knowledge/music-store/LICENSE.md +11 -0
- package/dist/templates/knowledge/music-store/musicstore.sqlite +0 -0
- package/dist/templates/knowledge/music-store/tables.png +0 -0
- package/dist/templates/knowledge/music-store.knowledge.yaml +138 -0
- package/dist/templates/knowledge/org-chart/personnel.csv +21 -21
- package/dist/templates/knowledge/org-chart.knowledge.yaml +4 -0
- package/dist/templates/knowledge/pet-store.knowledge.yaml +3 -0
- package/dist/templates/knowledge/security-incidents/incidents.json +55935 -0
- package/dist/templates/knowledge/security-incidents.knowledge.yaml +46 -0
- package/dist/templates/knowledge/{example.knowledge.yaml → transcripts.knowledge.yaml} +9 -5
- package/dist/templates/knowledge/transport-ot/systems.csv +117 -0
- package/dist/templates/knowledge/transport-ot.knowledge.yaml +55 -0
- package/dist/templates/llm.json +7 -30
- package/dist/templates/mcp.json +7 -4
- package/dist/templates/skills/orcha-builder/SKILL.md +106 -226
- package/dist/templates/skills/pii-guard/SKILL.md +22 -0
- package/dist/templates/skills/sandbox/SKILL.md +25 -48
- package/dist/templates/skills/web-pilot/SKILL.md +51 -0
- package/package.json +8 -3
- package/dist/templates/agents/knowledge-broker.agent.yaml +0 -39
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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 (
|
|
268
|
-
|
|
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();
|
package/dist/public/src/store.js
CHANGED
|
@@ -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
|
package/dist/src/cli/index.js
CHANGED
|
@@ -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
|
-
|
|
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":";
|
|
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;
|
|
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
|
|
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.
|
|
18
|
+
sessions.set(token, Date.now() + MAX_AGE * 1000);
|
|
10
19
|
return token;
|
|
11
20
|
}
|
|
12
21
|
function isValidSession(token) {
|
|
13
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"AACA,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;
|
|
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;
|
|
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"}
|