@auxiora/runtime 1.10.10 → 1.10.12
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/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +118 -1
- package/dist/index.js.map +1 -1
- package/dist/tool-approval-gate.d.ts +46 -0
- package/dist/tool-approval-gate.d.ts.map +1 -0
- package/dist/tool-approval-gate.js +72 -0
- package/dist/tool-approval-gate.js.map +1 -0
- package/package.json +81 -79
package/dist/index.d.ts
CHANGED
|
@@ -41,6 +41,7 @@ export declare class Auxiora {
|
|
|
41
41
|
private jobQueue?;
|
|
42
42
|
private modelRegistry?;
|
|
43
43
|
private modelRefreshTimer?;
|
|
44
|
+
private toolApprovalGate?;
|
|
44
45
|
private auxioraVersion;
|
|
45
46
|
private telemetryTracker?;
|
|
46
47
|
private sessionReflector?;
|
|
@@ -220,6 +221,7 @@ export declare class Auxiora {
|
|
|
220
221
|
private createReactRouter;
|
|
221
222
|
private createA2ARouter;
|
|
222
223
|
private createCanvasRouter;
|
|
224
|
+
private setupCanvasWebSocket;
|
|
223
225
|
private createSandboxRouter;
|
|
224
226
|
}
|
|
225
227
|
export { AgentRouter, AgentInstance, type AgentRoutingConfig, type AgentRoutingRule, type AgentConfig, } from './agent-router.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAkE,MAAM,iBAAiB,CAAC;AAE9G,OAAO,EAA4C,KAAK,MAAM,EAAsB,MAAM,iBAAiB,CAAC;AAwC5G,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Gateway, createModelRegistryRouter } from '@auxiora/gateway';
|
|
1
|
+
import { Gateway, createModelRegistryRouter, mountOpenAICompatRoutes, mountApprovalRoutes } from '@auxiora/gateway';
|
|
2
2
|
import { SessionManager, sanitizeTranscript } from '@auxiora/sessions';
|
|
3
3
|
import { MediaProcessor, detectProviders } from '@auxiora/media';
|
|
4
4
|
import { ProviderFactory, readClaudeCliCredentials, isSetupToken, refreshOAuthToken, refreshPKCEOAuthToken, streamWithModelFallback } from '@auxiora/providers';
|
|
@@ -62,6 +62,7 @@ import { BranchManager } from '@auxiora/conversation-branch';
|
|
|
62
62
|
import { ReActLoop } from '@auxiora/react-loop';
|
|
63
63
|
import { AgentCardBuilder, TaskManager as A2ATaskManager } from '@auxiora/a2a';
|
|
64
64
|
import { CanvasSession } from '@auxiora/canvas';
|
|
65
|
+
import { WebSocketServer as CanvasWSS, WebSocket as CanvasWS } from 'ws';
|
|
65
66
|
import { DocumentStore, ContextBuilder } from '@auxiora/rag';
|
|
66
67
|
import { GraphStore, EntityLinker } from '@auxiora/knowledge-graph';
|
|
67
68
|
import { EvalRunner, EvalStore, exactMatch, containsExpected, lengthRatio, keywordCoverage, sentenceCompleteness, responseRelevance, toxicityScore } from '@auxiora/evaluation';
|
|
@@ -157,6 +158,7 @@ export class Auxiora {
|
|
|
157
158
|
jobQueue;
|
|
158
159
|
modelRegistry;
|
|
159
160
|
modelRefreshTimer;
|
|
161
|
+
toolApprovalGate;
|
|
160
162
|
auxioraVersion = '';
|
|
161
163
|
// Self-improvement telemetry (structural types — no direct @auxiora/telemetry import)
|
|
162
164
|
telemetryTracker;
|
|
@@ -1334,6 +1336,8 @@ export class Auxiora {
|
|
|
1334
1336
|
this.gateway.mountRouter('/api/v1/a2a', this.createA2ARouter());
|
|
1335
1337
|
// Canvas API routes
|
|
1336
1338
|
this.gateway.mountRouter('/api/v1/canvas', this.createCanvasRouter());
|
|
1339
|
+
// Canvas WebSocket upgrade handler
|
|
1340
|
+
this.setupCanvasWebSocket();
|
|
1337
1341
|
// Sandbox API routes
|
|
1338
1342
|
this.gateway.mountRouter('/api/v1/sandbox', this.createSandboxRouter());
|
|
1339
1343
|
// Model registry API routes
|
|
@@ -1398,6 +1402,56 @@ export class Auxiora {
|
|
|
1398
1402
|
});
|
|
1399
1403
|
return jobsRouter;
|
|
1400
1404
|
})());
|
|
1405
|
+
// OpenAI-compatible chat completions endpoint (/v1/chat/completions)
|
|
1406
|
+
if (this.providers) {
|
|
1407
|
+
let openaiCompatToken;
|
|
1408
|
+
try {
|
|
1409
|
+
openaiCompatToken = this.vault.get('OPENAI_COMPAT_TOKEN');
|
|
1410
|
+
}
|
|
1411
|
+
catch { /* vault locked or key missing */ }
|
|
1412
|
+
mountOpenAICompatRoutes(this.gateway.getApp(), {
|
|
1413
|
+
complete: async (messages, options) => {
|
|
1414
|
+
const provider = this.providers.getPrimaryProvider();
|
|
1415
|
+
const result = await provider.complete(messages.map(m => ({ role: m.role, content: m.content })), { maxTokens: options.maxTokens, temperature: options.temperature });
|
|
1416
|
+
return {
|
|
1417
|
+
content: result.content,
|
|
1418
|
+
model: result.model,
|
|
1419
|
+
usage: { promptTokens: result.usage.inputTokens, completionTokens: result.usage.outputTokens },
|
|
1420
|
+
};
|
|
1421
|
+
},
|
|
1422
|
+
stream: (messages, options) => {
|
|
1423
|
+
const provider = this.providers.getPrimaryProvider();
|
|
1424
|
+
const gen = provider.stream(messages.map(m => ({ role: m.role, content: m.content })), { maxTokens: options.maxTokens, temperature: options.temperature });
|
|
1425
|
+
return (async function* () {
|
|
1426
|
+
for await (const chunk of gen) {
|
|
1427
|
+
if (chunk.type === 'text' && chunk.content !== undefined) {
|
|
1428
|
+
yield { type: 'delta', text: chunk.content };
|
|
1429
|
+
}
|
|
1430
|
+
}
|
|
1431
|
+
})();
|
|
1432
|
+
},
|
|
1433
|
+
authToken: openaiCompatToken,
|
|
1434
|
+
});
|
|
1435
|
+
this.logger.info('OpenAI-compatible endpoint mounted at /v1/chat/completions');
|
|
1436
|
+
}
|
|
1437
|
+
// Tool approval gate — interactive approval for sensitive tool invocations
|
|
1438
|
+
{
|
|
1439
|
+
const { ToolApprovalGate } = await import('./tool-approval-gate.js');
|
|
1440
|
+
const approvalTools = this.config.approvalTools;
|
|
1441
|
+
this.toolApprovalGate = new ToolApprovalGate({
|
|
1442
|
+
requireApproval: approvalTools ?? ['exec', 'file_write', 'browser_navigate'],
|
|
1443
|
+
timeoutMs: 5 * 60_000,
|
|
1444
|
+
});
|
|
1445
|
+
const gate = this.toolApprovalGate;
|
|
1446
|
+
mountApprovalRoutes(this.gateway.getApp(), {
|
|
1447
|
+
getPending: () => gate.getPending().map(p => ({ ...p })),
|
|
1448
|
+
resolve: (id, approved, comment) => {
|
|
1449
|
+
const r = gate.resolve(id, approved, comment);
|
|
1450
|
+
return r ? { ...r } : undefined;
|
|
1451
|
+
},
|
|
1452
|
+
});
|
|
1453
|
+
this.logger.info('Tool approval gate mounted with routes at /api/v1/tool-approvals');
|
|
1454
|
+
}
|
|
1401
1455
|
// Initialize plugin system (if enabled)
|
|
1402
1456
|
if (this.config.plugins?.enabled !== false) {
|
|
1403
1457
|
const pluginsDir = this.config.plugins?.dir || undefined;
|
|
@@ -6218,6 +6272,16 @@ export class Auxiora {
|
|
|
6218
6272
|
}
|
|
6219
6273
|
createCanvasRouter() {
|
|
6220
6274
|
const router = Router();
|
|
6275
|
+
// GET /sessions — list all canvas sessions
|
|
6276
|
+
router.get('/sessions', (_req, res) => {
|
|
6277
|
+
const sessions = Array.from(this.canvasSessions.entries()).map(([id, s]) => ({
|
|
6278
|
+
id,
|
|
6279
|
+
objectCount: s.getObjects().length,
|
|
6280
|
+
size: s.getSize(),
|
|
6281
|
+
createdAt: s.createdAt,
|
|
6282
|
+
}));
|
|
6283
|
+
res.json({ sessions });
|
|
6284
|
+
});
|
|
6221
6285
|
// POST /sessions — create a new canvas session
|
|
6222
6286
|
router.post('/sessions', (req, res) => {
|
|
6223
6287
|
const { width, height } = req.body;
|
|
@@ -6281,6 +6345,59 @@ export class Auxiora {
|
|
|
6281
6345
|
});
|
|
6282
6346
|
return router;
|
|
6283
6347
|
}
|
|
6348
|
+
setupCanvasWebSocket() {
|
|
6349
|
+
const canvasWss = new CanvasWSS({ noServer: true });
|
|
6350
|
+
const CANVAS_WS_PATTERN = /^\/api\/v1\/canvas\/sessions\/([^/]+)\/ws/;
|
|
6351
|
+
const BROADCAST_EVENTS = [
|
|
6352
|
+
'object:added',
|
|
6353
|
+
'object:updated',
|
|
6354
|
+
'object:removed',
|
|
6355
|
+
'canvas:cleared',
|
|
6356
|
+
'canvas:resized',
|
|
6357
|
+
];
|
|
6358
|
+
this.gateway.onUpgrade((req, socket, head) => {
|
|
6359
|
+
const url = req.url ?? '';
|
|
6360
|
+
const match = CANVAS_WS_PATTERN.exec(url);
|
|
6361
|
+
if (!match)
|
|
6362
|
+
return false;
|
|
6363
|
+
const sessionId = decodeURIComponent(match[1]);
|
|
6364
|
+
const session = this.canvasSessions.get(sessionId);
|
|
6365
|
+
if (!session) {
|
|
6366
|
+
socket.write('HTTP/1.1 404 Not Found\r\n\r\n');
|
|
6367
|
+
socket.destroy();
|
|
6368
|
+
return true;
|
|
6369
|
+
}
|
|
6370
|
+
canvasWss.handleUpgrade(req, socket, head, (ws) => {
|
|
6371
|
+
// Send initial snapshot
|
|
6372
|
+
const snapshot = session.snapshot();
|
|
6373
|
+
if (ws.readyState === CanvasWS.OPEN) {
|
|
6374
|
+
ws.send(JSON.stringify({ type: 'snapshot', data: snapshot }));
|
|
6375
|
+
}
|
|
6376
|
+
// Subscribe to session events and forward to the WS client
|
|
6377
|
+
const handlers = [];
|
|
6378
|
+
for (const eventType of BROADCAST_EVENTS) {
|
|
6379
|
+
const handler = (evt) => {
|
|
6380
|
+
if (ws.readyState === CanvasWS.OPEN) {
|
|
6381
|
+
ws.send(JSON.stringify(evt));
|
|
6382
|
+
}
|
|
6383
|
+
};
|
|
6384
|
+
session.on(eventType, handler);
|
|
6385
|
+
handlers.push({ event: eventType, handler });
|
|
6386
|
+
}
|
|
6387
|
+
ws.on('close', () => {
|
|
6388
|
+
for (const { event, handler } of handlers) {
|
|
6389
|
+
session.off(event, handler);
|
|
6390
|
+
}
|
|
6391
|
+
});
|
|
6392
|
+
ws.on('error', () => {
|
|
6393
|
+
for (const { event, handler } of handlers) {
|
|
6394
|
+
session.off(event, handler);
|
|
6395
|
+
}
|
|
6396
|
+
});
|
|
6397
|
+
});
|
|
6398
|
+
return true;
|
|
6399
|
+
});
|
|
6400
|
+
}
|
|
6284
6401
|
createSandboxRouter() {
|
|
6285
6402
|
const router = Router();
|
|
6286
6403
|
// POST /sessions — create a sandbox session
|