wunderland 0.89.1 → 0.91.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/channels/api/types.d.ts +18 -0
  2. package/dist/channels/api/types.d.ts.map +1 -1
  3. package/dist/cli/commands/start/agent-turn.d.ts.map +1 -1
  4. package/dist/cli/commands/start/agent-turn.js +12 -0
  5. package/dist/cli/commands/start/agent-turn.js.map +1 -1
  6. package/dist/cli/commands/start/channel-handler.d.ts +3 -0
  7. package/dist/cli/commands/start/channel-handler.d.ts.map +1 -1
  8. package/dist/cli/commands/start/channel-handler.js +18 -0
  9. package/dist/cli/commands/start/channel-handler.js.map +1 -1
  10. package/dist/cli/commands/start/extension-loader.d.ts.map +1 -1
  11. package/dist/cli/commands/start/extension-loader.js +41 -5
  12. package/dist/cli/commands/start/extension-loader.js.map +1 -1
  13. package/dist/cli/commands/start/hosted-events.d.ts +118 -0
  14. package/dist/cli/commands/start/hosted-events.d.ts.map +1 -0
  15. package/dist/cli/commands/start/hosted-events.js +285 -0
  16. package/dist/cli/commands/start/hosted-events.js.map +1 -0
  17. package/dist/cli/commands/start/http-server.d.ts.map +1 -1
  18. package/dist/cli/commands/start/http-server.js +1 -0
  19. package/dist/cli/commands/start/http-server.js.map +1 -1
  20. package/dist/cli/commands/start/index.d.ts.map +1 -1
  21. package/dist/cli/commands/start/index.js +4 -0
  22. package/dist/cli/commands/start/index.js.map +1 -1
  23. package/dist/cli/commands/start/routes/chat.d.ts.map +1 -1
  24. package/dist/cli/commands/start/routes/chat.js +12 -1
  25. package/dist/cli/commands/start/routes/chat.js.map +1 -1
  26. package/dist/cli/commands/start/routes/types.d.ts +3 -0
  27. package/dist/cli/commands/start/routes/types.d.ts.map +1 -1
  28. package/dist/cli/commands/start/startup-display.d.ts.map +1 -1
  29. package/dist/cli/commands/start/startup-display.js +2 -0
  30. package/dist/cli/commands/start/startup-display.js.map +1 -1
  31. package/dist/cli/index.d.ts.map +1 -1
  32. package/dist/cli/index.js +1 -0
  33. package/dist/cli/index.js.map +1 -1
  34. package/dist/runtime/execution/schema-on-demand.d.ts +8 -0
  35. package/dist/runtime/execution/schema-on-demand.d.ts.map +1 -1
  36. package/dist/runtime/execution/schema-on-demand.js +14 -0
  37. package/dist/runtime/execution/schema-on-demand.js.map +1 -1
  38. package/dist/runtime/tools/tool-allow-list.d.ts +52 -0
  39. package/dist/runtime/tools/tool-allow-list.d.ts.map +1 -0
  40. package/dist/runtime/tools/tool-allow-list.js +96 -0
  41. package/dist/runtime/tools/tool-allow-list.js.map +1 -0
  42. package/dist/runtime/tools/tool-calling.d.ts +16 -0
  43. package/dist/runtime/tools/tool-calling.d.ts.map +1 -1
  44. package/dist/runtime/tools/tool-calling.js +128 -12
  45. package/dist/runtime/tools/tool-calling.js.map +1 -1
  46. package/dist/runtime/tools/tool-helpers.d.ts +24 -0
  47. package/dist/runtime/tools/tool-helpers.d.ts.map +1 -1
  48. package/dist/runtime/tools/tool-helpers.js +64 -4
  49. package/dist/runtime/tools/tool-helpers.js.map +1 -1
  50. package/package.json +1 -1
@@ -0,0 +1,118 @@
1
+ /** The environment variable that names the control plane's agent API root. */
2
+ export declare const EVENTS_URL_ENV = "WUNDERLAND_EVENTS_URL";
3
+ /** The environment variable that holds the agent's bearer token for that API. */
4
+ export declare const EVENTS_TOKEN_ENV = "WUNDERLAND_EVENTS_TOKEN";
5
+ /** How often the reporter posts what waits. */
6
+ export declare const EVENTS_FLUSH_INTERVAL_MS = 5000;
7
+ /** The most events the reporter holds; past this it drops the oldest. */
8
+ export declare const EVENTS_QUEUE_LIMIT = 1000;
9
+ /** The most events one post carries; the events route refuses a larger batch. */
10
+ export declare const EVENTS_BATCH_LIMIT = 200;
11
+ /** The kinds of event the reporter sends. */
12
+ export declare const HOSTED_EVENT_KINDS: readonly ["turn_started", "turn_finished", "tool_called", "approval_requested", "provider_error", "channel_auth_failed", "referral_sent"];
13
+ /** One of {@link HOSTED_EVENT_KINDS}. */
14
+ export type HostedEventKind = (typeof HOSTED_EVENT_KINDS)[number];
15
+ /** The fields a caller may set on an event. */
16
+ export interface HostedEventFields {
17
+ /** A status code or a platform name. */
18
+ code?: string | number;
19
+ /** How many times this happened; the server counts one when absent. */
20
+ count?: number;
21
+ /** Prompt tokens of a finished turn. */
22
+ promptTokens?: number;
23
+ /** Completion tokens of a finished turn. */
24
+ completionTokens?: number;
25
+ /** The name of the tool a `tool_called` event reports. */
26
+ toolName?: string;
27
+ }
28
+ /** An event as it goes out. */
29
+ export interface HostedEvent {
30
+ kind: HostedEventKind;
31
+ /** When it happened, in milliseconds since the epoch. */
32
+ at: number;
33
+ code?: string;
34
+ count?: number;
35
+ promptTokens?: number;
36
+ completionTokens?: number;
37
+ toolName?: string;
38
+ }
39
+ /** Posts events to the control plane in the background. */
40
+ export interface EventsReporter {
41
+ /**
42
+ * Queues one event for the next post. Never throws, never waits. After
43
+ * {@link EventsReporter.stop} it does nothing.
44
+ *
45
+ * @param kind - The event's kind; any other value is ignored.
46
+ * @param fields - Its fields; a field that does not hold what it should is left out.
47
+ * @param operationId - The turn it belongs to, sent in the header
48
+ * `AGENTOS_OPERATION_ID_HEADER` names. Events of different turns go in
49
+ * different posts.
50
+ */
51
+ report(kind: HostedEventKind, fields?: HostedEventFields, operationId?: string): void;
52
+ /** Posts what waits now. Never rejects; a batch the server could not take stays queued. */
53
+ flush(): Promise<void>;
54
+ /** Ends the interval and posts what waits, waiting briefly for the answer. */
55
+ stop(): Promise<void>;
56
+ }
57
+ /**
58
+ * Creates a reporter that posts `{ events: [...] }` to `<url>/events` every
59
+ * {@link EVENTS_FLUSH_INTERVAL_MS}, with `Authorization: Bearer <token>`.
60
+ *
61
+ * A post that gets no answer, a 429 or a 5xx leaves its batch queued for the
62
+ * next try; any other refusal drops the batch. Either way the reason goes to
63
+ * `console.warn`, one line a minute at most and never the token.
64
+ *
65
+ * @param options.url - The API root, without `/events`.
66
+ * @param options.token - The bearer token.
67
+ * @returns The reporter. Its interval does not keep the process alive.
68
+ */
69
+ export declare function createEventsReporter(options: {
70
+ url: string;
71
+ token: string;
72
+ }): EventsReporter;
73
+ /**
74
+ * The reporter the environment asks for: one when `WUNDERLAND_EVENTS_URL` and
75
+ * `WUNDERLAND_EVENTS_TOKEN` both hold a value, none otherwise. A URL that does
76
+ * not parse makes none, with one warning line.
77
+ *
78
+ * @param env - The environment to read; `process.env` by default.
79
+ * @returns The reporter, or `undefined`.
80
+ */
81
+ export declare function createEventsReporterFromEnv(env?: Record<string, string | undefined>): EventsReporter | undefined;
82
+ /** One turn's events, with its counts and its operation id kept in one place. */
83
+ export interface ReportedTurn {
84
+ /** The model called a tool the agent has; this comes before the call's approval. */
85
+ toolCalled(toolName: unknown): void;
86
+ /** One provider response's usage; the turn adds them up. */
87
+ usage(usage: {
88
+ prompt_tokens?: number;
89
+ completion_tokens?: number;
90
+ }): void;
91
+ /** A provider request failed; its status code goes out, never its message. */
92
+ providerError(error: unknown): void;
93
+ /** The turn is waiting on a person: a tool's approval or a checkpoint. */
94
+ approvalRequested(): void;
95
+ /** The turn ended, however it ended. Later calls do nothing. */
96
+ finished(): void;
97
+ }
98
+ /**
99
+ * Starts one turn's reporting: posts `turn_started`, and returns the calls the
100
+ * turn makes as it goes.
101
+ *
102
+ * @param reporter - The reporter, or `undefined`, which makes every call do nothing.
103
+ * @returns The turn's reporting calls, safe to pass as bare callbacks.
104
+ */
105
+ export declare function startReportedTurn(reporter?: EventsReporter): ReportedTurn;
106
+ /** The `code` a channel pack's `error` event carries when the platform rejected its token. */
107
+ export declare const CHANNEL_AUTH_FAILED_CODE = "auth_failed";
108
+ /**
109
+ * Whether a channel event says the platform rejected the channel's token: an
110
+ * `error` event whose data carries `code: 'auth_failed'`.
111
+ *
112
+ * @param event - The channel event.
113
+ */
114
+ export declare function isChannelAuthFailure(event: {
115
+ type?: unknown;
116
+ data?: unknown;
117
+ } | null | undefined): boolean;
118
+ //# sourceMappingURL=hosted-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosted-events.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/start/hosted-events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,285 @@
1
+ /**
2
+ * @fileoverview The hosted events reporter of `wunderland start`.
3
+ *
4
+ * With `WUNDERLAND_EVENTS_URL` and `WUNDERLAND_EVENTS_TOKEN` set, `start` posts
5
+ * the coarse events of what the agent does to `<url>/events`, so the control
6
+ * plane that runs the agent can see it working: names, counts, codes and times.
7
+ * Without them no reporter exists and nothing is posted.
8
+ *
9
+ * Message text never reaches this module's output. {@link createEventsReporter}
10
+ * sends only the known kinds and the known fields, and takes `code`, `toolName`
11
+ * and the operation id only as a single word, so a caller that passes text by
12
+ * mistake loses the field rather than posting the text.
13
+ *
14
+ * @module wunderland/cli/commands/start/hosted-events
15
+ */
16
+ import { randomUUID } from 'node:crypto';
17
+ import { resolveOperationIdHeader } from '../../../platform/config/operation-id.js';
18
+ /** The environment variable that names the control plane's agent API root. */
19
+ export const EVENTS_URL_ENV = 'WUNDERLAND_EVENTS_URL';
20
+ /** The environment variable that holds the agent's bearer token for that API. */
21
+ export const EVENTS_TOKEN_ENV = 'WUNDERLAND_EVENTS_TOKEN';
22
+ /** How often the reporter posts what waits. */
23
+ export const EVENTS_FLUSH_INTERVAL_MS = 5_000;
24
+ /** The most events the reporter holds; past this it drops the oldest. */
25
+ export const EVENTS_QUEUE_LIMIT = 1_000;
26
+ /** The most events one post carries; the events route refuses a larger batch. */
27
+ export const EVENTS_BATCH_LIMIT = 200;
28
+ /** How long one post may take before its batch waits for the next try. */
29
+ const POST_TIMEOUT_MS = 10_000;
30
+ /** How long `stop` waits for the last post. A container's stop grace is short. */
31
+ const STOP_WAIT_MS = 2_000;
32
+ /** At most one warning line per this many milliseconds. */
33
+ const WARN_INTERVAL_MS = 60_000;
34
+ const CODE_MAX_LENGTH = 64;
35
+ const NAME_MAX_LENGTH = 128;
36
+ /** A single word: a status code, a platform, a tool's name, an operation id. */
37
+ const WORD = /^[A-Za-z0-9_.:-]+$/;
38
+ /** The kinds of event the reporter sends. */
39
+ export const HOSTED_EVENT_KINDS = [
40
+ 'turn_started',
41
+ 'turn_finished',
42
+ 'tool_called',
43
+ 'approval_requested',
44
+ 'provider_error',
45
+ 'channel_auth_failed',
46
+ 'referral_sent',
47
+ ];
48
+ const KNOWN_KINDS = new Set(HOSTED_EVENT_KINDS);
49
+ function asWord(value, maxLength) {
50
+ const text = typeof value === 'number' ? String(value) : value;
51
+ return typeof text === 'string' && text.length <= maxLength && WORD.test(text) ? text : undefined;
52
+ }
53
+ function asCount(value) {
54
+ return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 ? value : undefined;
55
+ }
56
+ /** Builds the outgoing event from the known fields, each only if it holds what it should. */
57
+ function buildEvent(kind, fields = {}) {
58
+ const event = { kind, at: Date.now() };
59
+ const code = asWord(fields.code, CODE_MAX_LENGTH);
60
+ if (code !== undefined)
61
+ event.code = code;
62
+ const toolName = asWord(fields.toolName, NAME_MAX_LENGTH);
63
+ if (toolName !== undefined)
64
+ event.toolName = toolName;
65
+ const count = asCount(fields.count);
66
+ if (count !== undefined)
67
+ event.count = count;
68
+ const promptTokens = asCount(fields.promptTokens);
69
+ if (promptTokens !== undefined)
70
+ event.promptTokens = promptTokens;
71
+ const completionTokens = asCount(fields.completionTokens);
72
+ if (completionTokens !== undefined)
73
+ event.completionTokens = completionTokens;
74
+ return event;
75
+ }
76
+ /**
77
+ * Creates a reporter that posts `{ events: [...] }` to `<url>/events` every
78
+ * {@link EVENTS_FLUSH_INTERVAL_MS}, with `Authorization: Bearer <token>`.
79
+ *
80
+ * A post that gets no answer, a 429 or a 5xx leaves its batch queued for the
81
+ * next try; any other refusal drops the batch. Either way the reason goes to
82
+ * `console.warn`, one line a minute at most and never the token.
83
+ *
84
+ * @param options.url - The API root, without `/events`.
85
+ * @param options.token - The bearer token.
86
+ * @returns The reporter. Its interval does not keep the process alive.
87
+ */
88
+ export function createEventsReporter(options) {
89
+ const endpoint = `${options.url.trim().replace(/\/+$/, '')}/events`;
90
+ const token = options.token.trim();
91
+ let lastWarnAt;
92
+ const warn = (line) => {
93
+ const now = Date.now();
94
+ if (lastWarnAt !== undefined && now - lastWarnAt < WARN_INTERVAL_MS)
95
+ return;
96
+ lastWarnAt = now;
97
+ console.warn(`[hosted-events] ${line}`);
98
+ };
99
+ let operationHeader;
100
+ try {
101
+ operationHeader = resolveOperationIdHeader();
102
+ }
103
+ catch (err) {
104
+ warn(`${err instanceof Error ? err.message : String(err)} Posting events without an operation id.`);
105
+ }
106
+ let queue = [];
107
+ let dropped = 0;
108
+ let stopped = false;
109
+ let running = null;
110
+ /** Posts one batch. Returns whether the batch has left the queue's care. */
111
+ const post = async (batch, operationId) => {
112
+ const headers = {
113
+ 'Content-Type': 'application/json',
114
+ Authorization: `Bearer ${token}`,
115
+ };
116
+ if (operationHeader && operationId)
117
+ headers[operationHeader] = operationId;
118
+ let status;
119
+ try {
120
+ const res = await fetch(endpoint, {
121
+ method: 'POST',
122
+ headers,
123
+ body: JSON.stringify({ events: batch.map((item) => item.event) }),
124
+ signal: AbortSignal.timeout(POST_TIMEOUT_MS),
125
+ });
126
+ status = res.status;
127
+ await res.text();
128
+ }
129
+ catch (err) {
130
+ const reason = err instanceof Error ? err.name : 'error';
131
+ warn(`The events server did not answer (${reason}); keeping ${batch.length} events for the next try.`);
132
+ return false;
133
+ }
134
+ if (status >= 200 && status < 300)
135
+ return true;
136
+ if (status === 429 || status >= 500) {
137
+ warn(`The events server answered ${status}; keeping ${batch.length} events for the next try.`);
138
+ return false;
139
+ }
140
+ warn(`The events server refused ${batch.length} events (${status}); dropping them.`);
141
+ return true;
142
+ };
143
+ const drain = async () => {
144
+ while (queue.length > 0) {
145
+ // The next post: the oldest waiting turn's events, up to the batch limit.
146
+ const operationId = queue[0].operationId;
147
+ const batch = [];
148
+ for (const item of queue) {
149
+ if (item.operationId !== operationId)
150
+ continue;
151
+ batch.push(item);
152
+ if (batch.length === EVENTS_BATCH_LIMIT)
153
+ break;
154
+ }
155
+ if (!(await post(batch, operationId)))
156
+ break;
157
+ const sent = new Set(batch);
158
+ queue = queue.filter((item) => !sent.has(item));
159
+ }
160
+ if (dropped > 0) {
161
+ warn(`Dropped ${dropped} events: more than ${EVENTS_QUEUE_LIMIT} were waiting.`);
162
+ dropped = 0;
163
+ }
164
+ };
165
+ const flush = () => {
166
+ if (!running) {
167
+ running = drain().finally(() => {
168
+ running = null;
169
+ });
170
+ }
171
+ return running;
172
+ };
173
+ const timer = setInterval(() => {
174
+ void flush();
175
+ }, EVENTS_FLUSH_INTERVAL_MS);
176
+ timer.unref?.();
177
+ return {
178
+ report(kind, fields, operationId) {
179
+ if (stopped || !KNOWN_KINDS.has(kind))
180
+ return;
181
+ if (queue.length >= EVENTS_QUEUE_LIMIT) {
182
+ queue.shift();
183
+ dropped += 1;
184
+ }
185
+ queue.push({ event: buildEvent(kind, fields), operationId: asWord(operationId, NAME_MAX_LENGTH) });
186
+ },
187
+ flush,
188
+ async stop() {
189
+ if (stopped)
190
+ return;
191
+ stopped = true;
192
+ clearInterval(timer);
193
+ let waited;
194
+ await Promise.race([
195
+ flush(),
196
+ new Promise((resolve) => {
197
+ waited = setTimeout(resolve, STOP_WAIT_MS);
198
+ waited.unref?.();
199
+ }),
200
+ ]);
201
+ if (waited)
202
+ clearTimeout(waited);
203
+ },
204
+ };
205
+ }
206
+ /**
207
+ * The reporter the environment asks for: one when `WUNDERLAND_EVENTS_URL` and
208
+ * `WUNDERLAND_EVENTS_TOKEN` both hold a value, none otherwise. A URL that does
209
+ * not parse makes none, with one warning line.
210
+ *
211
+ * @param env - The environment to read; `process.env` by default.
212
+ * @returns The reporter, or `undefined`.
213
+ */
214
+ export function createEventsReporterFromEnv(env = process.env) {
215
+ const url = env[EVENTS_URL_ENV]?.trim();
216
+ const token = env[EVENTS_TOKEN_ENV]?.trim();
217
+ if (!url || !token)
218
+ return undefined;
219
+ try {
220
+ new URL(url);
221
+ }
222
+ catch {
223
+ console.warn(`[hosted-events] ${EVENTS_URL_ENV} is not a URL; no events are posted.`);
224
+ return undefined;
225
+ }
226
+ return createEventsReporter({ url, token });
227
+ }
228
+ const UNREPORTED_TURN = Object.freeze({
229
+ toolCalled() { },
230
+ usage() { },
231
+ providerError() { },
232
+ approvalRequested() { },
233
+ finished() { },
234
+ });
235
+ /**
236
+ * Starts one turn's reporting: posts `turn_started`, and returns the calls the
237
+ * turn makes as it goes.
238
+ *
239
+ * @param reporter - The reporter, or `undefined`, which makes every call do nothing.
240
+ * @returns The turn's reporting calls, safe to pass as bare callbacks.
241
+ */
242
+ export function startReportedTurn(reporter) {
243
+ if (!reporter)
244
+ return UNREPORTED_TURN;
245
+ const operationId = randomUUID();
246
+ let promptTokens = 0;
247
+ let completionTokens = 0;
248
+ let done = false;
249
+ reporter.report('turn_started', undefined, operationId);
250
+ return {
251
+ toolCalled(toolName) {
252
+ reporter.report('tool_called', { toolName: toolName }, operationId);
253
+ },
254
+ usage(usage) {
255
+ promptTokens += asCount(usage?.prompt_tokens) ?? 0;
256
+ completionTokens += asCount(usage?.completion_tokens) ?? 0;
257
+ },
258
+ providerError(error) {
259
+ const status = error?.status;
260
+ reporter.report('provider_error', typeof status === 'number' ? { code: status } : undefined, operationId);
261
+ },
262
+ approvalRequested() {
263
+ reporter.report('approval_requested', undefined, operationId);
264
+ },
265
+ finished() {
266
+ if (done)
267
+ return;
268
+ done = true;
269
+ reporter.report('turn_finished', { promptTokens, completionTokens }, operationId);
270
+ },
271
+ };
272
+ }
273
+ /** The `code` a channel pack's `error` event carries when the platform rejected its token. */
274
+ export const CHANNEL_AUTH_FAILED_CODE = 'auth_failed';
275
+ /**
276
+ * Whether a channel event says the platform rejected the channel's token: an
277
+ * `error` event whose data carries `code: 'auth_failed'`.
278
+ *
279
+ * @param event - The channel event.
280
+ */
281
+ export function isChannelAuthFailure(event) {
282
+ return event?.type === 'error'
283
+ && event.data?.code === CHANNEL_AUTH_FAILED_CODE;
284
+ }
285
+ //# sourceMappingURL=hosted-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosted-events.js","sourceRoot":"","sources":["../../../../src/cli/commands/start/hosted-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AAEpF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,cAAc,GAAG,uBAAuB,CAAC;AACtD,iFAAiF;AACjF,MAAM,CAAC,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AAE1D,+CAA+C;AAC/C,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAC9C,yEAAyE;AACzE,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACxC,iFAAiF;AACjF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAEtC,0EAA0E;AAC1E,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,kFAAkF;AAClF,MAAM,YAAY,GAAG,KAAK,CAAC;AAC3B,2DAA2D;AAC3D,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,eAAe,GAAG,GAAG,CAAC;AAC5B,gFAAgF;AAChF,MAAM,IAAI,GAAG,oBAAoB,CAAC;AAElC,6CAA6C;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,cAAc;IACd,eAAe;IACf,aAAa;IACb,oBAAoB;IACpB,gBAAgB;IAChB,qBAAqB;IACrB,eAAe;CACP,CAAC;AAKX,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAoDrE,SAAS,MAAM,CAAC,KAAc,EAAE,SAAiB;IAC/C,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/D,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACpG,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACpG,CAAC;AAED,6FAA6F;AAC7F,SAAS,UAAU,CAAC,IAAqB,EAAE,SAA4B,EAAE;IACvE,MAAM,KAAK,GAAgB,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAClD,IAAI,IAAI,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAC1D,IAAI,QAAQ,KAAK,SAAS;QAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACtD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,KAAK,KAAK,SAAS;QAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IAC7C,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAClD,IAAI,YAAY,KAAK,SAAS;QAAE,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;IAClE,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC1D,IAAI,gBAAgB,KAAK,SAAS;QAAE,KAAK,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC9E,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAuC;IAC1E,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC;IACpE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAEnC,IAAI,UAA8B,CAAC;IACnC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAQ,EAAE;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,UAAU,KAAK,SAAS,IAAI,GAAG,GAAG,UAAU,GAAG,gBAAgB;YAAE,OAAO;QAC5E,UAAU,GAAG,GAAG,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC;IAEF,IAAI,eAAmC,CAAC;IACxC,IAAI,CAAC;QACH,eAAe,GAAG,wBAAwB,EAAE,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IACtG,CAAC;IAED,IAAI,KAAK,GAAkB,EAAE,CAAC;IAC9B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,OAAO,GAAyB,IAAI,CAAC;IAEzC,4EAA4E;IAC5E,MAAM,IAAI,GAAG,KAAK,EAAE,KAAoB,EAAE,WAA+B,EAAoB,EAAE;QAC7F,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,KAAK,EAAE;SACjC,CAAC;QACF,IAAI,eAAe,IAAI,WAAW;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,WAAW,CAAC;QAE3E,IAAI,MAAc,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC;aAC7C,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YACpB,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YACzD,IAAI,CAAC,qCAAqC,MAAM,cAAc,KAAK,CAAC,MAAM,2BAA2B,CAAC,CAAC;YACvG,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;YAAE,OAAO,IAAI,CAAC;QAC/C,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;YACpC,IAAI,CAAC,8BAA8B,MAAM,aAAa,KAAK,CAAC,MAAM,2BAA2B,CAAC,CAAC;YAC/F,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,6BAA6B,KAAK,CAAC,MAAM,YAAY,MAAM,mBAAmB,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,KAAK,IAAmB,EAAE;QACtC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,0EAA0E;YAC1E,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,WAAW,CAAC;YAC1C,MAAM,KAAK,GAAkB,EAAE,CAAC;YAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,WAAW,KAAK,WAAW;oBAAE,SAAS;gBAC/C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,IAAI,KAAK,CAAC,MAAM,KAAK,kBAAkB;oBAAE,MAAM;YACjD,CAAC;YACD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;gBAAE,MAAM;YAC7C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;YAC5B,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,IAAI,CAAC,WAAW,OAAO,sBAAsB,kBAAkB,gBAAgB,CAAC,CAAC;YACjF,OAAO,GAAG,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,GAAkB,EAAE;QAChC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC7B,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,KAAK,KAAK,EAAE,CAAC;IACf,CAAC,EAAE,wBAAwB,CAAC,CAAC;IAC7B,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAEhB,OAAO;QACL,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW;YAC9B,IAAI,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO;YAC9C,IAAI,KAAK,CAAC,MAAM,IAAI,kBAAkB,EAAE,CAAC;gBACvC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACd,OAAO,IAAI,CAAC,CAAC;YACf,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;QACrG,CAAC;QACD,KAAK;QACL,KAAK,CAAC,IAAI;YACR,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,IAAI,MAAiD,CAAC;YACtD,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjB,KAAK,EAAE;gBACP,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oBAC5B,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;oBAC3C,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;gBACnB,CAAC,CAAC;aACH,CAAC,CAAC;YACH,IAAI,MAAM;gBAAE,YAAY,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAA0C,OAAO,CAAC,GAAG;IAErD,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,mBAAmB,cAAc,sCAAsC,CAAC,CAAC;QACtF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,oBAAoB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;AAC9C,CAAC;AAgBD,MAAM,eAAe,GAAiB,MAAM,CAAC,MAAM,CAAC;IAClD,UAAU,KAAI,CAAC;IACf,KAAK,KAAI,CAAC;IACV,aAAa,KAAI,CAAC;IAClB,iBAAiB,KAAI,CAAC;IACtB,QAAQ,KAAI,CAAC;CACd,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAyB;IACzD,IAAI,CAAC,QAAQ;QAAE,OAAO,eAAe,CAAC;IACtC,MAAM,WAAW,GAAG,UAAU,EAAE,CAAC;IACjC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACxD,OAAO;QACL,UAAU,CAAC,QAAQ;YACjB,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,QAAkB,EAAE,EAAE,WAAW,CAAC,CAAC;QAChF,CAAC;QACD,KAAK,CAAC,KAAK;YACT,YAAY,IAAI,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;YACnD,gBAAgB,IAAI,OAAO,CAAC,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC;QACD,aAAa,CAAC,KAAK;YACjB,MAAM,MAAM,GAAI,KAAiD,EAAE,MAAM,CAAC;YAC1E,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC5G,CAAC;QACD,iBAAiB;YACf,QAAQ,CAAC,MAAM,CAAC,oBAAoB,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAChE,CAAC;QACD,QAAQ;YACN,IAAI,IAAI;gBAAE,OAAO;YACjB,IAAI,GAAG,IAAI,CAAC;YACZ,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE,EAAE,WAAW,CAAC,CAAC;QACpF,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,MAAM,wBAAwB,GAAG,aAAa,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAA4D;IAC/F,OAAO,KAAK,EAAE,IAAI,KAAK,OAAO;WACxB,KAAK,CAAC,IAA8C,EAAE,IAAI,KAAK,wBAAwB,CAAC;AAChG,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/start/http-server.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAWH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,WAAW,EAAE,MAAM,CA4K1E"}
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/start/http-server.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAWH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,WAAW,EAAE,MAAM,CA6K1E"}
@@ -86,6 +86,7 @@ export function createAgentHttpServer(ctx) {
86
86
  adapterByPlatform,
87
87
  loadedHttpHandlers,
88
88
  sessionTextLogger,
89
+ eventsReporter: ctx.eventsReporter,
89
90
  activePacks: ctx.activePacks ?? [],
90
91
  eventSseClients,
91
92
  broadcastAgentEvent,
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../../../src/cli/commands/start/http-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../../../src/cli/commands/start/http-server.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/start/index.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAgBlD,wBAA8B,QAAQ,CACpC,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EACvC,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAuGf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/start/index.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAiBlD,wBAA8B,QAAQ,CACpC,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EACvC,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CA2Gf"}
@@ -18,6 +18,7 @@ import { createAgentHttpServer } from './http-server.js';
18
18
  import { startServerAndDisplay } from './startup-display.js';
19
19
  import { bootstrapRagKnowledge } from './rag-bootstrap.js';
20
20
  import { resolveListenHost } from '../../../channels/api/listen-host.js';
21
+ import { createEventsReporterFromEnv } from './hosted-events.js';
21
22
  export default async function cmdStart(_args, flags, globals) {
22
23
  // POST /chat answers without a secret unless one is configured, so the
23
24
  // server listens on 127.0.0.1 unless --host names another address. A bad
@@ -89,6 +90,9 @@ export default async function cmdStart(_args, flags, globals) {
89
90
  await phase('runtime', () => initAdaptiveRuntime(ctx));
90
91
  // Phase 7: Pairing manager
91
92
  phase('pairing', () => initPairing(ctx));
93
+ // Phase 7.5: The hosted events reporter, when both of its variables are set.
94
+ // Channels, the HTTP routes and the shutdown path all read it from ctx.
95
+ ctx.eventsReporter = createEventsReporterFromEnv();
92
96
  // Phase 8: Channel runtime (adapter map, Discord extensions, subscriptions)
93
97
  await phase('channels', async () => {
94
98
  initChannelRuntime(ctx);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/start/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/start/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/start/routes/chat.ts"],"names":[],"mappings":"AACA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AA+BjE,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAkBpE;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAwd7B"}
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/start/routes/chat.ts"],"names":[],"mappings":"AACA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAiCjE,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAkBpE;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAke7B"}
@@ -15,6 +15,8 @@ import { buildToolDefs, runToolCallingTurn, safeJsonStringify, } from '../../../
15
15
  import { classifyResearchDepth, buildResearchPrefix, createResearchClassifierLlmCall, shouldInjectResearch, } from '../../../../runtime/agentos-bridge/research-classifier.js';
16
16
  import { buildPersonaSessionKey, createRequestScopedToolMap, extractRequestedPersonaId, resolveRequestScopedPersonaRuntime, } from '../../../../runtime/execution/request-persona.js';
17
17
  import { buildOllamaRuntimeOptions } from '../../../../runtime/tools/ollama-options.js';
18
+ import { allowedToolNamesFor } from '../../../../runtime/tools/tool-allow-list.js';
19
+ import { startReportedTurn } from '../hosted-events.js';
18
20
  import { readBody, sendJson, getHeaderString, isChatAuthorized, isLoopbackRequest, } from './helpers.js';
19
21
  function toAgentosApprovalCategory(tool) {
20
22
  const name = String(tool?.name || '').toLowerCase();
@@ -43,7 +45,7 @@ function toAgentosApprovalCategory(tool) {
43
45
  export async function handleChatRoutes(req, res, url, deps) {
44
46
  if (req.method !== 'POST' || url.pathname !== '/chat')
45
47
  return false;
46
- const { seedId, displayName, activePersonaId, availablePersonas, seed, providerId, model, llmApiKey, llmBaseUrl, canUseLLM, openrouterFallback, oauthGetApiKey, cfg, rawAgentConfig, globalConfig, configDir, policy, toolMap, sessions, systemPrompt, adaptiveRuntime, discoveryManager, strictToolNames, autoApproveToolCalls, llmJudgeHandler, dangerouslySkipPermissions, turnApprovalMode, defaultTenantId, workspaceAgentId, workspaceBaseDir, lazyTools, skillsPrompt, chatSecret, hitlManager, sessionTextLogger, } = deps;
48
+ const { seedId, displayName, activePersonaId, availablePersonas, seed, providerId, model, llmApiKey, llmBaseUrl, canUseLLM, openrouterFallback, oauthGetApiKey, cfg, rawAgentConfig, globalConfig, configDir, policy, toolMap, sessions, systemPrompt, adaptiveRuntime, discoveryManager, strictToolNames, autoApproveToolCalls, llmJudgeHandler, dangerouslySkipPermissions, turnApprovalMode, defaultTenantId, workspaceAgentId, workspaceBaseDir, lazyTools, skillsPrompt, chatSecret, hitlManager, sessionTextLogger, eventsReporter, } = deps;
47
49
  if (!isChatAuthorized(req, url, chatSecret)) {
48
50
  sendJson(res, 401, { error: 'Unauthorized' });
49
51
  return true;
@@ -169,6 +171,7 @@ export async function handleChatRoutes(req, res, url, deps) {
169
171
  * tool_calls entries.
170
172
  */
171
173
  const workingMessages = [...messages];
174
+ const reportedTurn = startReportedTurn(eventsReporter);
172
175
  try {
173
176
  if (canUseLLM) {
174
177
  /* ── Capability discovery — inject tiered context AND build filtered tool set ── */
@@ -258,6 +261,8 @@ export async function handleChatRoutes(req, res, url, deps) {
258
261
  model,
259
262
  messages: workingMessages,
260
263
  toolMap: requestToolMap,
264
+ // tools.allow holds for every persona the request selects.
265
+ allowedToolNames: allowedToolNamesFor(cfg),
261
266
  ...(apiFilteredGetToolDefs && { getToolDefs: apiFilteredGetToolDefs }),
262
267
  toolContext,
263
268
  maxRounds: 8,
@@ -265,8 +270,11 @@ export async function handleChatRoutes(req, res, url, deps) {
265
270
  strictToolNames,
266
271
  toolFailureMode: adaptiveDecision.toolFailureMode,
267
272
  ollamaOptions: buildOllamaRuntimeOptions(cfg?.ollama),
273
+ onUsage: reportedTurn.usage,
274
+ onProviderError: reportedTurn.providerError,
268
275
  onToolCall: (tool, args) => {
269
276
  toolCallCount += 1;
277
+ reportedTurn.toolCalled(tool?.name);
270
278
  deps.broadcastAgentEvent?.({
271
279
  type: 'tool_call',
272
280
  toolName: tool?.name ?? 'unknown',
@@ -295,6 +303,7 @@ export async function handleChatRoutes(req, res, url, deps) {
295
303
  (isLoopbackRequest(req) || (!!chatSecret && isChatAuthorized(req, url, chatSecret)))) {
296
304
  return true;
297
305
  }
306
+ reportedTurn.approvalRequested();
298
307
  const preview = safeJsonStringify(args, 1800);
299
308
  const effectLabel = tool.hasSideEffects === true ? 'side effects' : 'read-only';
300
309
  const actionId = `tool-${seedId}-${randomUUID()}`;
@@ -314,6 +323,7 @@ export async function handleChatRoutes(req, res, url, deps) {
314
323
  askCheckpoint: turnApprovalMode === 'off' ? undefined : async ({ round, toolCalls }) => {
315
324
  if (autoApproveToolCalls)
316
325
  return true;
326
+ reportedTurn.approvalRequested();
317
327
  const checkpointId = `checkpoint-${seedId}-${internalSessionId}-${round}-${randomUUID()}`;
318
328
  const completedWork = toolCalls.map((c) => {
319
329
  const effect = c.hasSideEffects ? 'side effects' : 'read-only';
@@ -397,6 +407,7 @@ export async function handleChatRoutes(req, res, url, deps) {
397
407
  }
398
408
  }
399
409
  finally {
410
+ reportedTurn.finished();
400
411
  try {
401
412
  await adaptiveRuntime.recordTurnOutcome({
402
413
  scope: {