@framers/agentos 0.15.71 → 0.15.73
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/.github/badges/tests.json +1 -1
- package/dist/api/generateText.d.ts.map +1 -1
- package/dist/api/generateText.js +28 -64
- package/dist/api/generateText.js.map +1 -1
- package/dist/api/runtime/responseFormatForProvider.d.ts +2 -3
- package/dist/api/runtime/responseFormatForProvider.d.ts.map +1 -1
- package/dist/api/runtime/responseFormatForProvider.js +2 -3
- package/dist/api/runtime/responseFormatForProvider.js.map +1 -1
- package/dist/api/server/AgentOSServer.d.ts +9 -0
- package/dist/api/server/AgentOSServer.d.ts.map +1 -1
- package/dist/api/server/AgentOSServer.js +92 -6
- package/dist/api/server/AgentOSServer.js.map +1 -1
- package/dist/api/streamText.d.ts.map +1 -1
- package/dist/api/streamText.js +26 -56
- package/dist/api/streamText.js.map +1 -1
- package/dist/core/llm/providers/AIModelProviderManager.d.ts +5 -5
- package/dist/core/llm/providers/AIModelProviderManager.d.ts.map +1 -1
- package/dist/core/llm/providers/AIModelProviderManager.js +11 -14
- package/dist/core/llm/providers/AIModelProviderManager.js.map +1 -1
- package/dist/core/llm/providers/implementations/OpenAIProvider.d.ts +7 -6
- package/dist/core/llm/providers/implementations/OpenAIProvider.d.ts.map +1 -1
- package/dist/core/llm/providers/implementations/OpenAIProvider.js +39 -54
- package/dist/core/llm/providers/implementations/OpenAIProvider.js.map +1 -1
- package/dist/core/llm/providers/implementations/OpenRouterProvider.d.ts.map +1 -1
- package/dist/core/llm/providers/implementations/OpenRouterProvider.js +20 -30
- package/dist/core/llm/providers/implementations/OpenRouterProvider.js.map +1 -1
- package/dist/core/logging/ILogger.d.ts +12 -0
- package/dist/core/logging/ILogger.d.ts.map +1 -1
- package/dist/core/logging/ILogger.js +5 -0
- package/dist/core/logging/ILogger.js.map +1 -1
- package/dist/core/logging/Logger.d.ts +52 -0
- package/dist/core/logging/Logger.d.ts.map +1 -0
- package/dist/core/logging/Logger.js +11 -0
- package/dist/core/logging/Logger.js.map +1 -0
- package/dist/core/logging/PinoLogger.d.ts +24 -2
- package/dist/core/logging/PinoLogger.d.ts.map +1 -1
- package/dist/core/logging/PinoLogger.js +39 -3
- package/dist/core/logging/PinoLogger.js.map +1 -1
- package/dist/core/logging/contentSafeTelemetry.d.ts +1 -1
- package/dist/core/logging/contentSafeTelemetry.d.ts.map +1 -1
- package/dist/core/logging/contentSafeTelemetry.js +1 -1
- package/dist/core/logging/contentSafeTelemetry.js.map +1 -1
- package/dist/core/logging/events.d.ts +349 -0
- package/dist/core/logging/events.d.ts.map +1 -0
- package/dist/core/logging/events.js +164 -0
- package/dist/core/logging/events.js.map +1 -0
- package/dist/core/logging/forward.d.ts +93 -0
- package/dist/core/logging/forward.d.ts.map +1 -0
- package/dist/core/logging/forward.js +167 -0
- package/dist/core/logging/forward.js.map +1 -0
- package/dist/core/logging/index.d.ts +8 -3
- package/dist/core/logging/index.d.ts.map +1 -1
- package/dist/core/logging/index.js +7 -3
- package/dist/core/logging/index.js.map +1 -1
- package/dist/core/logging/kit/allowList.d.ts +68 -0
- package/dist/core/logging/kit/allowList.d.ts.map +1 -0
- package/dist/core/logging/kit/allowList.js +219 -0
- package/dist/core/logging/kit/allowList.js.map +1 -0
- package/dist/core/logging/kit/burst.d.ts +38 -0
- package/dist/core/logging/kit/burst.d.ts.map +1 -0
- package/dist/core/logging/kit/burst.js +91 -0
- package/dist/core/logging/kit/burst.js.map +1 -0
- package/dist/core/logging/kit/consoleCapture.d.ts +47 -0
- package/dist/core/logging/kit/consoleCapture.d.ts.map +1 -0
- package/dist/core/logging/kit/consoleCapture.js +121 -0
- package/dist/core/logging/kit/consoleCapture.js.map +1 -0
- package/dist/core/logging/kit/index.d.ts +12 -0
- package/dist/core/logging/kit/index.d.ts.map +1 -0
- package/dist/core/logging/kit/index.js +12 -0
- package/dist/core/logging/kit/index.js.map +1 -0
- package/dist/core/logging/kit/processHandlers.d.ts +48 -0
- package/dist/core/logging/kit/processHandlers.d.ts.map +1 -0
- package/dist/core/logging/kit/processHandlers.js +77 -0
- package/dist/core/logging/kit/processHandlers.js.map +1 -0
- package/dist/core/logging/level.d.ts +33 -0
- package/dist/core/logging/level.d.ts.map +1 -0
- package/dist/core/logging/level.js +36 -0
- package/dist/core/logging/level.js.map +1 -0
- package/dist/core/logging/loggerFactory.d.ts +74 -15
- package/dist/core/logging/loggerFactory.d.ts.map +1 -1
- package/dist/core/logging/loggerFactory.js +138 -18
- package/dist/core/logging/loggerFactory.js.map +1 -1
- package/dist/core/logging/state.d.ts +77 -0
- package/dist/core/logging/state.d.ts.map +1 -0
- package/dist/core/logging/state.js +25 -0
- package/dist/core/logging/state.js.map +1 -0
- package/dist/core/utils/terminal.d.ts +22 -0
- package/dist/core/utils/terminal.d.ts.map +1 -0
- package/dist/core/utils/terminal.js +27 -0
- package/dist/core/utils/terminal.js.map +1 -0
- package/dist/io/voice-pipeline/providers/OpenAIRealtimeTTS.d.ts +23 -4
- package/dist/io/voice-pipeline/providers/OpenAIRealtimeTTS.d.ts.map +1 -1
- package/dist/io/voice-pipeline/providers/OpenAIRealtimeTTS.js +296 -71
- package/dist/io/voice-pipeline/providers/OpenAIRealtimeTTS.js.map +1 -1
- package/package.json +6 -1
|
@@ -110,9 +110,8 @@ export function responseFormatCarriesSchema(responseFormat) {
|
|
|
110
110
|
return responseFormat.type === 'json_schema' || responseFormat._gemini !== undefined;
|
|
111
111
|
}
|
|
112
112
|
/**
|
|
113
|
-
* Compact label for a structured-output payload shape,
|
|
114
|
-
*
|
|
115
|
-
* verification signal that per-leg rebuild is active.
|
|
113
|
+
* Compact label for a structured-output payload shape, naming which form a
|
|
114
|
+
* per-leg rebuild produced.
|
|
116
115
|
*
|
|
117
116
|
* @returns `'none'` | `'anthropic_json_schema'` | `'anthropic_tool'` |
|
|
118
117
|
* `'gemini_response_schema'` | the payload's `type` string (`'json_schema'`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responseFormatForProvider.js","sourceRoot":"","sources":["../../../src/api/runtime/responseFormatForProvider.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,sBAAsB,EACtB,mCAAmC,GACpC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,mBAAmB,GAEpB,MAAM,oDAAoD,CAAC;AAE5D;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;AAqBrE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,8BAA8B,CAC5C,MAA4C;IAE5C,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAChF,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,sBAAsB,CAAC,UAAU,CAAC;YACvC,CAAC,CAAC,mCAAmC,CAAC,UAAU,EAAE,UAAU,CAAC;YAC7D,CAAC,CAAC,EAAE,IAAI,EAAE,aAAsB,EAAE,CAAC;IACvC,CAAC;IACD,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;QAC/B,0EAA0E;QAC1E,0EAA0E;QAC1E,0EAA0E;QAC1E,uEAAuE;QACvE,qDAAqD;QACrD,MAAM,MAAM,GAAG,mBAAmB,CAAC;YACjC,QAAQ,EAAE,UAAU;YACpB,OAAO;YACP,MAAM,EAAE,eAAe;YACvB,UAAU,EAAE,UAAU,IAAI,UAAU;SACrC,CAA+C,CAAC;QACjD,OAAO,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,MAA6C,CAAC;IAC9F,CAAC;IACD,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,mBAAmB,CAAC;YACzB,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,eAAe;YACvB,UAAU,EAAE,UAAU,IAAI,UAAU;SACrC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;QAChC,yEAAyE;QACzE,yEAAyE;QACzE,uDAAuD;QACvD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;QAChC,OAAO,sBAAsB,CAAC,UAAU,CAAC;YACvC,CAAC,CAAC,mCAAmC,CAAC,UAAU,EAAE,UAAU,CAAC;YAC7D,CAAC,CAAC,EAAE,IAAI,EAAE,aAAsB,EAAE,CAAC;IACvC,CAAC;IACD,IAAI,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QACxC,OAAO,EAAE,IAAI,EAAE,aAAsB,EAAE,CAAC;IAC1C,CAAC;IACD,uEAAuE;IACvE,qEAAqE;IACrE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,cAAuC;IACnE,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC;IACnC,OAAO,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;AAC7E,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,2BAA2B,CACzC,cAAmD;IAEnD,IAAI,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,cAAc,CAAC,kCAAkC,KAAK,IAAI,EAAE,CAAC;QAC/D,OAAO,oBAAoB,CAAC,cAAc,CAAC,KAAK,MAAM,CAAC;IACzD,CAAC;IACD,OAAO,cAAc,CAAC,IAAI,KAAK,aAAa,IAAI,cAAc,CAAC,OAAO,KAAK,SAAS,CAAC;AACvF,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"responseFormatForProvider.js","sourceRoot":"","sources":["../../../src/api/runtime/responseFormatForProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,15 @@ export declare class AgentOSServer {
|
|
|
8
8
|
private readonly config;
|
|
9
9
|
private agentReady;
|
|
10
10
|
constructor(agentOSConfig: AgentOSConfig, serverConfig: AgentOSServerConfig);
|
|
11
|
+
/**
|
|
12
|
+
* Runs one request under a fresh id. The id is returned in `x-request-id`, and every AgentOS event line written
|
|
13
|
+
* while the request runs carries it as `requestId`. When the response closes, one `http.request` line gives the
|
|
14
|
+
* method, the route as the server names it, the status (0 when no status was sent), the milliseconds and the
|
|
15
|
+
* outcome: `error` for a 5xx status or a handler that threw, even when the connection then closed early, otherwise
|
|
16
|
+
* `aborted` when the connection closed before the response finished, otherwise `ok`. It is written at `error`,
|
|
17
|
+
* `warn` or `info` to match. A handler's failure is written once, as `http.handler_failed`.
|
|
18
|
+
*/
|
|
19
|
+
private receive;
|
|
11
20
|
private handleRequest;
|
|
12
21
|
/**
|
|
13
22
|
* Test seam: replace the embedded AgentOS (unit tests only). Silences the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentOSServer.d.ts","sourceRoot":"","sources":["../../../src/api/server/AgentOSServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,MAAM,IAAI,UAAU,EAAkB,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"AgentOSServer.d.ts","sourceRoot":"","sources":["../../../src/api/server/AgentOSServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,MAAM,IAAI,UAAU,EAAkB,MAAM,MAAM,CAAC;AAG3F,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAgD5D,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,UAAU,CAAgB;gBAEtB,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB;IAO3E;;;;;;;OAOG;IACH,OAAO,CAAC,OAAO;YA0BD,aAAa;IAkE3B;;;;OAIG;IACI,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;YAMlC,yBAAyB;YAUzB,iBAAiB;IAmC/B,OAAO,CAAC,QAAQ;IAwBhB,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,QAAQ;IAKH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,SAAS,IAAI,UAAU;CAG/B"}
|
|
@@ -1,17 +1,90 @@
|
|
|
1
1
|
import { createServer } from 'http';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { performance } from 'node:perf_hooks';
|
|
2
4
|
import { AgentOS } from '../AgentOS.js';
|
|
5
|
+
import { moduleLogger } from '../../core/logging/loggerFactory.js';
|
|
6
|
+
import { getLoggingState } from '../../core/logging/state.js';
|
|
7
|
+
import { errorFields } from '../../core/logging/events.js';
|
|
8
|
+
/** The server's events, to the target current when each is written; each line of a request carries its id. */
|
|
9
|
+
const log = moduleLogger('http', 'agentos_server');
|
|
10
|
+
/** The methods an `http.request` line names; any other is written as `OTHER`. */
|
|
11
|
+
const METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS', 'CONNECT', 'TRACE'];
|
|
12
|
+
/**
|
|
13
|
+
* The route a request names before AgentOS is ready, from its method and path alone, so a request given up on while
|
|
14
|
+
* AgentOS starts keeps its route. An extension's request reads `unmatched` until a handler takes it.
|
|
15
|
+
*/
|
|
16
|
+
function routeOf(req) {
|
|
17
|
+
if (req.method === 'OPTIONS')
|
|
18
|
+
return 'preflight';
|
|
19
|
+
let path;
|
|
20
|
+
try {
|
|
21
|
+
path = new URL(req.url ?? '/', 'http://localhost').pathname;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return 'unmatched';
|
|
25
|
+
}
|
|
26
|
+
if (req.method === 'GET' && path === '/health')
|
|
27
|
+
return '/health';
|
|
28
|
+
if (req.method === 'GET' && path === '/api/agentos/personas')
|
|
29
|
+
return '/api/agentos/personas';
|
|
30
|
+
if (req.method === 'POST' && path === '/api/agentos/chat')
|
|
31
|
+
return '/api/agentos/chat';
|
|
32
|
+
return 'unmatched';
|
|
33
|
+
}
|
|
3
34
|
export class AgentOSServer {
|
|
4
35
|
constructor(agentOSConfig, serverConfig) {
|
|
5
36
|
this.config = serverConfig;
|
|
6
37
|
this.agentOS = new AgentOS();
|
|
7
38
|
this.agentReady = this.agentOS.initialize(agentOSConfig);
|
|
8
|
-
this.server = createServer((req, res) => this.
|
|
39
|
+
this.server = createServer((req, res) => this.receive(req, res));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Runs one request under a fresh id. The id is returned in `x-request-id`, and every AgentOS event line written
|
|
43
|
+
* while the request runs carries it as `requestId`. When the response closes, one `http.request` line gives the
|
|
44
|
+
* method, the route as the server names it, the status (0 when no status was sent), the milliseconds and the
|
|
45
|
+
* outcome: `error` for a 5xx status or a handler that threw, even when the connection then closed early, otherwise
|
|
46
|
+
* `aborted` when the connection closed before the response finished, otherwise `ok`. It is written at `error`,
|
|
47
|
+
* `warn` or `info` to match. A handler's failure is written once, as `http.handler_failed`.
|
|
48
|
+
*/
|
|
49
|
+
receive(req, res) {
|
|
50
|
+
const requestId = randomUUID();
|
|
51
|
+
const started = performance.now();
|
|
52
|
+
const record = { route: routeOf(req), failed: false };
|
|
53
|
+
const requests = getLoggingState().requests;
|
|
54
|
+
res.setHeader('x-request-id', requestId);
|
|
55
|
+
// A close that comes from the socket runs outside the request's context, so the line enters it again.
|
|
56
|
+
res.once('close', () => requests.run({ requestId }, () => {
|
|
57
|
+
const status = res.headersSent ? res.statusCode : 0;
|
|
58
|
+
const outcome = record.failed || status >= 500 ? 'error' : !res.writableFinished ? 'aborted' : 'ok';
|
|
59
|
+
const method = METHODS.includes(req.method ?? '') ? req.method : 'OTHER';
|
|
60
|
+
const fields = { method, route: record.route, status, ms: Math.max(0, Math.round(performance.now() - started)), outcome };
|
|
61
|
+
if (outcome === 'ok')
|
|
62
|
+
log.info('http.request', fields);
|
|
63
|
+
else if (outcome === 'error')
|
|
64
|
+
log.error('http.request', fields);
|
|
65
|
+
else
|
|
66
|
+
log.warn('http.request', fields);
|
|
67
|
+
}));
|
|
68
|
+
requests.run({ requestId }, () => {
|
|
69
|
+
void this.handleRequest(req, res, record).catch((error) => {
|
|
70
|
+
// A failure an extension's handler already wrote is not written again.
|
|
71
|
+
if (!record.failed) {
|
|
72
|
+
record.failed = true;
|
|
73
|
+
log.error('http.handler_failed', errorFields(error));
|
|
74
|
+
}
|
|
75
|
+
if (!res.headersSent)
|
|
76
|
+
this.sendJson(res, 500, { error: 'Internal Server Error' });
|
|
77
|
+
else
|
|
78
|
+
res.destroy();
|
|
79
|
+
});
|
|
80
|
+
});
|
|
9
81
|
}
|
|
10
|
-
async handleRequest(req, res) {
|
|
82
|
+
async handleRequest(req, res, record) {
|
|
11
83
|
try {
|
|
12
84
|
await this.agentReady;
|
|
13
85
|
}
|
|
14
86
|
catch (error) {
|
|
87
|
+
record.route = 'unready';
|
|
15
88
|
this.sendJson(res, 500, { error: 'AgentOS failed to initialise', details: error.message });
|
|
16
89
|
return;
|
|
17
90
|
}
|
|
@@ -20,38 +93,51 @@ export class AgentOSServer {
|
|
|
20
93
|
res.setHeader('Access-Control-Allow-Origin', this.config.corsOrigin ?? '*');
|
|
21
94
|
res.setHeader('Access-Control-Allow-Methods', 'GET,POST,OPTIONS');
|
|
22
95
|
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
|
|
96
|
+
res.setHeader('Access-Control-Expose-Headers', 'x-request-id');
|
|
23
97
|
}
|
|
24
98
|
if (req.method === 'OPTIONS') {
|
|
99
|
+
record.route = 'preflight';
|
|
25
100
|
res.writeHead(204);
|
|
26
101
|
res.end();
|
|
27
102
|
return;
|
|
28
103
|
}
|
|
29
104
|
const url = new URL(req.url ?? '/', `http://${req.headers.host || this.config.host || 'localhost'}`);
|
|
30
105
|
if (req.method === 'GET' && url.pathname === '/health') {
|
|
106
|
+
record.route = '/health';
|
|
31
107
|
this.sendJson(res, 200, { status: 'ok', service: 'agentos-server' });
|
|
32
108
|
return;
|
|
33
109
|
}
|
|
34
110
|
if (req.method === 'GET' && url.pathname === '/api/agentos/personas') {
|
|
111
|
+
record.route = '/api/agentos/personas';
|
|
35
112
|
await this.handleListPersonasRequest(url, res);
|
|
36
113
|
return;
|
|
37
114
|
}
|
|
38
115
|
if (req.method === 'POST' && url.pathname === '/api/agentos/chat') {
|
|
116
|
+
record.route = '/api/agentos/chat';
|
|
39
117
|
await this.handleChatRequest(req, res);
|
|
40
118
|
return;
|
|
41
119
|
}
|
|
42
120
|
if (this.config.dispatchExtensionHandlers !== false) {
|
|
43
121
|
for (const handler of this.agentOS.getHttpHandlers()) {
|
|
122
|
+
// Set before the call: a handler that claims the request may answer it before it returns.
|
|
123
|
+
record.route = 'extension';
|
|
44
124
|
try {
|
|
45
125
|
if (await handler(req, res))
|
|
46
126
|
return;
|
|
47
127
|
}
|
|
48
128
|
catch (error) {
|
|
49
|
-
//
|
|
50
|
-
//
|
|
51
|
-
|
|
52
|
-
|
|
129
|
+
// The error is written as its type and code alone; its text, which can carry internal or sensitive strings,
|
|
130
|
+
// reaches neither the line nor the client.
|
|
131
|
+
record.failed = true;
|
|
132
|
+
log.error('http.handler_failed', errorFields(error));
|
|
133
|
+
// A handler that began its response before it threw has its connection closed; a status cannot follow.
|
|
134
|
+
if (!res.headersSent)
|
|
135
|
+
this.sendJson(res, 500, { error: 'Extension HTTP handler error' });
|
|
136
|
+
else
|
|
137
|
+
res.destroy();
|
|
53
138
|
return;
|
|
54
139
|
}
|
|
140
|
+
record.route = 'unmatched';
|
|
55
141
|
}
|
|
56
142
|
}
|
|
57
143
|
this.sendJson(res, 404, { error: 'Not Found' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentOSServer.js","sourceRoot":"","sources":["../../../src/api/server/AgentOSServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyD,MAAM,MAAM,CAAC;AAC3F,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"AgentOSServer.js","sourceRoot":"","sources":["../../../src/api/server/AgentOSServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyD,MAAM,MAAM,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAKxC,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,8GAA8G;AAC9G,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAEnD,iFAAiF;AACjF,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAU,CAAC;AAS1G;;;GAGG;AACH,SAAS,OAAO,CAAC,GAAoB;IACnC,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IACjD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QAAC,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,WAAW,CAAC;IAAC,CAAC;IAClG,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACjE,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,uBAAuB;QAAE,OAAO,uBAAuB,CAAC;IAC7F,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,KAAK,mBAAmB;QAAE,OAAO,mBAAmB,CAAC;IACtF,OAAO,WAAW,CAAC;AACrB,CAAC;AAkBD,MAAM,OAAO,aAAa;IAMxB,YAAY,aAA4B,EAAE,YAAiC;QACzE,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACnE,CAAC;IAED;;;;;;;OAOG;IACK,OAAO,CAAC,GAAoB,EAAE,GAAmB;QACvD,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,MAAM,GAAkB,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACrE,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC,QAAQ,CAAC;QAC5C,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QACzC,sGAAsG;QACtG,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE;YACvD,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;YACpG,MAAM,MAAM,GAAY,OAA6B,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAgB,CAAC,CAAC,CAAC,OAAO,CAAC;YAClH,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,OAAO,EAAW,CAAC;YACnI,IAAI,OAAO,KAAK,IAAI;gBAAE,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;iBAClD,IAAI,OAAO,KAAK,OAAO;gBAAE,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;;gBAC3D,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC,CAAC;QACJ,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE;YAC/B,KAAK,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBACjE,uEAAuE;gBACvE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;oBAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;oBAAC,GAAG,CAAC,KAAK,CAAC,qBAAqB,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;gBAAC,CAAC;gBACnG,IAAI,CAAC,GAAG,CAAC,WAAW;oBAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;;oBAC7E,GAAG,CAAC,OAAO,EAAE,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,GAAoB,EAAE,GAAmB,EAAE,MAAqB;QAC1F,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,UAAU,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;YACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE,OAAO,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YACtG,OAAO;QACT,CAAC;QAED,+CAA+C;QAC/C,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC3B,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;YAC5E,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,kBAAkB,CAAC,CAAC;YAClE,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC;YAC9D,GAAG,CAAC,SAAS,CAAC,+BAA+B,EAAE,cAAc,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC;YAC3B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;QACrG,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACvD,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;YACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,uBAAuB,EAAE,CAAC;YACrE,MAAM,CAAC,KAAK,GAAG,uBAAuB,CAAC;YACvC,MAAM,IAAI,CAAC,yBAAyB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,mBAAmB,EAAE,CAAC;YAClE,MAAM,CAAC,KAAK,GAAG,mBAAmB,CAAC;YACnC,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,yBAAyB,KAAK,KAAK,EAAE,CAAC;YACpD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;gBACrD,0FAA0F;gBAC1F,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC;gBAC3B,IAAI,CAAC;oBACH,IAAI,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;wBAAE,OAAO;gBACtC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,4GAA4G;oBAC5G,2CAA2C;oBAC3C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;oBACrB,GAAG,CAAC,KAAK,CAAC,qBAAqB,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;oBACrD,uGAAuG;oBACvG,IAAI,CAAC,GAAG,CAAC,WAAW;wBAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC,CAAC;;wBACpF,GAAG,CAAC,OAAO,EAAE,CAAC;oBACnB,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IAClD,CAAC;IAED;;;;OAIG;IACI,oBAAoB,CAAC,IAAa;QACvC,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IACtC,CAAC;IAEO,KAAK,CAAC,yBAAyB,CAAC,GAAQ,EAAE,GAAmB;QACnE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC;YAC3D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAClE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE,OAAO,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACnG,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,GAAoB,EAAE,GAAmB;QACvE,IAAI,OAA2B,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACzC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3F,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtD,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC,CAAC;YAC1E,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAiB;YAC/B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,gBAAgB;YAC1C,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,WAAW,IAAI,CAAC,GAAG,EAAE,EAAE;YACvD,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,iBAAiB,EAAE,OAAO,CAAC,SAAS;YACpC,SAAS,EAAE,OAAO,CAAC,IAAI;YACvB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,MAAM,GAAsB,EAAE,CAAC;YACrC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;gBAClE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,2BAA2B,EAAE,OAAO,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACrG,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,GAAoB;QACnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC,CAAC;YAC5E,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,MAAM,MAAM,GAAa,EAAE,CAAC;YAE5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBACvB,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC;gBACzB,IAAI,QAAQ,GAAG,QAAQ,EAAE,CAAC;oBACxB,GAAG,CAAC,OAAO,EAAE,CAAC;oBACd,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;oBAC5C,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,gBAAgB,CAAC,KAAa;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACvE,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,GAAG,IAAI,CAAC,CAAC,cAAc;QAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAC7B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,IAAI;gBACP,OAAO,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;YACnC,KAAK,IAAI;gBACP,OAAO,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;YAC5B,KAAK,IAAI;gBACP,OAAO,IAAI,GAAG,IAAI,CAAC;YACrB;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,GAAmB,EAAE,MAAc,EAAE,IAA6B;QACjF,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC9D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,MAAM,IAAI,CAAC,UAAU,CAAC;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC;QAC3C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACzE,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamText.d.ts","sourceRoot":"","sources":["../../src/api/streamText.ts"],"names":[],"mappings":"AAkBA,OAAO,EAsBL,KAAK,cAAc,EAEnB,KAAK,mBAAmB,EAIxB,KAAK,UAAU,EAEf,KAAK,cAAc,EAEpB,MAAM,mBAAmB,CAAC;AAK3B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"streamText.d.ts","sourceRoot":"","sources":["../../src/api/streamText.ts"],"names":[],"mappings":"AAkBA,OAAO,EAsBL,KAAK,cAAc,EAEnB,KAAK,mBAAmB,EAIxB,KAAK,UAAU,EAEf,KAAK,cAAc,EAEpB,MAAM,mBAAmB,CAAC;AAK3B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAuG3E;;;;;;;;GAQG;AACH,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAEpC;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,OAAO,CAAC;AAE5E;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC7B,kBAAkB,CAiBpB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yFAAyF;IACzF,SAAS,CAAC,EAAE,OAAO,CAAC,OAAO,oCAAoC,EAAE,gBAAgB,GAAG,SAAS,CAAC,CAAC;IAC/F,2FAA2F;IAC3F,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAClC,yEAAyE;IACzE,UAAU,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACtC;;;;;OAKG;IACH,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACtB,2EAA2E;IAC3E,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3B;;;;;;OAMG;IACH,aAAa,EAAE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3C;;;;OAIG;IACH,WAAW,EAAE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,yFAAyF;IACzF,SAAS,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACrC;;;;;;;;;OASG;IACH,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1B,qEAAqE;IACrE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACvB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAC/C;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,YAAY,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC1C;;;;;;;OAOG;IACH,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACnD;;;;;;OAMG;IACH,iBAAiB,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC3C;AAgCD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,mBAAmB,GAAG,gBAAgB,CAutDtE"}
|
package/dist/api/streamText.js
CHANGED
|
@@ -26,17 +26,32 @@ import { resolveDynamicToolCalls } from './runtime/dynamicToolCalling.js';
|
|
|
26
26
|
import { StreamingReconstructor } from '../core/llm/streaming/StreamingReconstructor.js';
|
|
27
27
|
import { globalLLMProviderHealth } from '../core/safety/LLMProviderHealthRegistry.js';
|
|
28
28
|
import { recordAgentOSTurnMetrics, startAgentOSSpan } from '../safety/evaluation/observability/otel.js';
|
|
29
|
-
import {
|
|
29
|
+
import { moduleLogger } from '../core/logging/loggerFactory.js';
|
|
30
|
+
import { errorFields, providerName } from '../core/logging/events.js';
|
|
30
31
|
import { isCallMask } from './runtime/pool/redact.js';
|
|
31
32
|
import { createContentSafeConsole } from '../core/logging/contentSafeConsole.js';
|
|
32
33
|
/** This module's fixed diagnostic origin; no runtime name enters telemetry. */
|
|
33
34
|
const console = createContentSafeConsole('stream_text');
|
|
34
35
|
/**
|
|
35
|
-
* The `fallback` component's
|
|
36
|
-
*
|
|
37
|
-
* was imported still receives every failover
|
|
36
|
+
* The `fallback` component's events, to the target current when each is
|
|
37
|
+
* written: a logger or a factory set with `setLogger` or `setLoggerFactory`
|
|
38
|
+
* after this module was imported still receives every failover event.
|
|
38
39
|
*/
|
|
39
|
-
const fallbackLogger =
|
|
40
|
+
const fallbackLogger = moduleLogger('fallback', 'stream_text');
|
|
41
|
+
// A fallback skip's reason as one of the fixed words `llm.fallback_skipped` takes, never the reason's own text.
|
|
42
|
+
function skipReason(reason) {
|
|
43
|
+
if (reason.includes('duplicate') || reason.includes('primary'))
|
|
44
|
+
return 'duplicate';
|
|
45
|
+
if (reason.includes('exclud'))
|
|
46
|
+
return 'excluded';
|
|
47
|
+
if (reason.includes('capabil'))
|
|
48
|
+
return 'capability';
|
|
49
|
+
if (reason.includes('refus') || reason.includes('claude'))
|
|
50
|
+
return 'refusal';
|
|
51
|
+
if (reason.includes('refill'))
|
|
52
|
+
return 'refill';
|
|
53
|
+
return 'unknown';
|
|
54
|
+
}
|
|
40
55
|
async function recordAgentOSUsageLazy(input) {
|
|
41
56
|
const { recordAgentOSUsage } = await import('./runtime/usageLedger.js');
|
|
42
57
|
return recordAgentOSUsage(input);
|
|
@@ -1383,14 +1398,7 @@ export function streamText(opts) {
|
|
|
1383
1398
|
const chainEntries = opts.fallbackProviders === undefined
|
|
1384
1399
|
? buildPolicyAwareFallbackChain(walkTier, recordedProviderId)
|
|
1385
1400
|
: opts.fallbackProviders;
|
|
1386
|
-
const logLegSkip = (entry, reason) => fallbackLogger.
|
|
1387
|
-
event: 'fallback_leg_skipped',
|
|
1388
|
-
api: 'streamText',
|
|
1389
|
-
reason,
|
|
1390
|
-
primaryProvider: recordedProviderId,
|
|
1391
|
-
fallbackProvider: entry.provider,
|
|
1392
|
-
fallbackModel: entry.model,
|
|
1393
|
-
});
|
|
1401
|
+
const logLegSkip = (entry, reason) => fallbackLogger.warn('llm.fallback_skipped', { api: 'streamText', primaryProvider: providerName(recordedProviderId), fallbackProvider: providerName(entry.provider), reason: skipReason(reason) });
|
|
1394
1402
|
// A stream that already handed text or tool activity to the consumer
|
|
1395
1403
|
// is not restarted on another provider (a refusal after text
|
|
1396
1404
|
// included): the consumer would receive the partial answer followed by
|
|
@@ -1454,14 +1462,7 @@ export function streamText(opts) {
|
|
|
1454
1462
|
const legProvider = fallbackEntrySentAs(fb).provider;
|
|
1455
1463
|
const legOnSharedCredentials = fb.apiKey === undefined && fb.baseUrl === undefined && opts.__strictCredentials !== true;
|
|
1456
1464
|
if (legOnSharedCredentials && globalLLMProviderHealth.isOpen(legProvider)) {
|
|
1457
|
-
fallbackLogger.
|
|
1458
|
-
event: 'fallback_skipped_circuit_open',
|
|
1459
|
-
api: 'streamText',
|
|
1460
|
-
primaryProvider: recordedProviderId,
|
|
1461
|
-
fallbackProvider: legProvider,
|
|
1462
|
-
fallbackModel: fb.model,
|
|
1463
|
-
attempt,
|
|
1464
|
-
});
|
|
1465
|
+
fallbackLogger.warn('llm.fallback_circuit_open', { api: 'streamText', primaryProvider: providerName(recordedProviderId), fallbackProvider: providerName(legProvider), attempt });
|
|
1465
1466
|
// An open breaker is an availability failure: a standing leg is
|
|
1466
1467
|
// owed a refill.
|
|
1467
1468
|
walkState = advanceFallbackWalk(walkState, fb.walkRole, undefined);
|
|
@@ -1474,17 +1475,7 @@ export function streamText(opts) {
|
|
|
1474
1475
|
// The run this leg reports as the one that answered, once it ended.
|
|
1475
1476
|
let legAnswer;
|
|
1476
1477
|
try {
|
|
1477
|
-
fallbackLogger.
|
|
1478
|
-
event: 'fallback_fired',
|
|
1479
|
-
api: 'streamText',
|
|
1480
|
-
primaryProvider: recordedProviderId,
|
|
1481
|
-
fallbackProvider: fb.provider,
|
|
1482
|
-
fallbackModel: fb.model,
|
|
1483
|
-
errorType: lastFallbackError.name,
|
|
1484
|
-
// A seat's mask first: a provider's message can echo the key it was sent.
|
|
1485
|
-
errorMessage: maskToolText(lastFallbackError.message).slice(0, 200),
|
|
1486
|
-
attempt,
|
|
1487
|
-
});
|
|
1478
|
+
fallbackLogger.warn('llm.fallback_fired', { api: 'streamText', primaryProvider: providerName(recordedProviderId), fallbackProvider: providerName(fb.provider), attempt, ...errorFields(lastFallbackError) });
|
|
1488
1479
|
// A seat's callback is handed the error through the seat's mask, as it would leave the seat.
|
|
1489
1480
|
opts.onFallback?.(opts.__maskError ? opts.__maskError(lastFallbackError) : lastFallbackError, fb.provider);
|
|
1490
1481
|
const fallbackResult = streamText({
|
|
@@ -1608,25 +1599,11 @@ export function streamText(opts) {
|
|
|
1608
1599
|
answeredBy = legAnswer ?? answeredBy;
|
|
1609
1600
|
if (fallbackFinishReason === 'error') {
|
|
1610
1601
|
outcome = 'failed-after-output';
|
|
1611
|
-
fallbackLogger.
|
|
1612
|
-
event: 'fallback_failed_after_output',
|
|
1613
|
-
api: 'streamText',
|
|
1614
|
-
primaryProvider: recordedProviderId,
|
|
1615
|
-
fallbackProvider: fb.provider,
|
|
1616
|
-
fallbackModel: fb.model,
|
|
1617
|
-
attempt,
|
|
1618
|
-
});
|
|
1602
|
+
fallbackLogger.error('llm.fallback_failed_after_output', { api: 'streamText', primaryProvider: providerName(recordedProviderId), fallbackProvider: providerName(fb.provider), attempt });
|
|
1619
1603
|
}
|
|
1620
1604
|
else {
|
|
1621
1605
|
outcome = 'served';
|
|
1622
|
-
fallbackLogger.info('
|
|
1623
|
-
event: 'fallback_succeeded',
|
|
1624
|
-
api: 'streamText',
|
|
1625
|
-
primaryProvider: recordedProviderId,
|
|
1626
|
-
fallbackProvider: fb.provider,
|
|
1627
|
-
fallbackModel: fb.model,
|
|
1628
|
-
attempt,
|
|
1629
|
-
});
|
|
1606
|
+
fallbackLogger.info('llm.fallback_succeeded', { api: 'streamText', primaryProvider: providerName(recordedProviderId), fallbackProvider: providerName(fb.provider), attempt });
|
|
1630
1607
|
}
|
|
1631
1608
|
break;
|
|
1632
1609
|
}
|
|
@@ -1679,14 +1656,7 @@ export function streamText(opts) {
|
|
|
1679
1656
|
const walkSignal = opts.abortSignal;
|
|
1680
1657
|
const walkStoppedBy = walkSignal?.aborted ? abortReasonError(walkSignal) : undefined;
|
|
1681
1658
|
if (!walkStoppedBy) {
|
|
1682
|
-
fallbackLogger.
|
|
1683
|
-
event: 'fallback_exhausted',
|
|
1684
|
-
api: 'streamText',
|
|
1685
|
-
primaryProvider: recordedProviderId,
|
|
1686
|
-
attempts: attempt,
|
|
1687
|
-
errorType: lastFallbackError.name,
|
|
1688
|
-
errorMessage: maskToolText(lastFallbackError.message).slice(0, 200),
|
|
1689
|
-
});
|
|
1659
|
+
fallbackLogger.error('llm.fallback_exhausted', { api: 'streamText', primaryProvider: providerName(recordedProviderId), attempts: attempt, ...errorFields(lastFallbackError) });
|
|
1690
1660
|
}
|
|
1691
1661
|
metricStatus = 'error';
|
|
1692
1662
|
// No leg answered: the trail names this attempt's provider.
|