@flowcodex/core 0.3.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 (97) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/dist/index-LbxYtxxS.d.ts +560 -0
  4. package/dist/index.d.ts +995 -0
  5. package/dist/index.js +3840 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/kernel/index.d.ts +1 -0
  8. package/dist/kernel/index.js +551 -0
  9. package/dist/kernel/index.js.map +1 -0
  10. package/package.json +39 -0
  11. package/src/agent/agent-loop.ts +254 -0
  12. package/src/agent/context.ts +99 -0
  13. package/src/agent/conversation-state.ts +44 -0
  14. package/src/agent/provider-runner.ts +241 -0
  15. package/src/agent/system-prompt-builder.ts +193 -0
  16. package/src/execution/compactor.ts +256 -0
  17. package/src/execution/index.ts +7 -0
  18. package/src/execution/output-serializer.ts +90 -0
  19. package/src/execution/schema-validator.ts +124 -0
  20. package/src/execution/tool-executor.ts +276 -0
  21. package/src/execution/tool-registry.ts +104 -0
  22. package/src/index.ts +215 -0
  23. package/src/infrastructure/catalog-parser.ts +218 -0
  24. package/src/infrastructure/index.ts +16 -0
  25. package/src/infrastructure/path-resolver.ts +123 -0
  26. package/src/infrastructure/provider-factory.ts +116 -0
  27. package/src/infrastructure/provider-presets.ts +19 -0
  28. package/src/infrastructure/retry-policy.ts +50 -0
  29. package/src/infrastructure/secret-scrubber.ts +67 -0
  30. package/src/infrastructure/token-counter.ts +156 -0
  31. package/src/infrastructure/tracer.ts +23 -0
  32. package/src/kernel/container.ts +166 -0
  33. package/src/kernel/events.ts +323 -0
  34. package/src/kernel/index.ts +18 -0
  35. package/src/kernel/pipeline.ts +152 -0
  36. package/src/kernel/run-controller.ts +85 -0
  37. package/src/kernel/tokens.ts +21 -0
  38. package/src/security/index.ts +13 -0
  39. package/src/security/permission-policy.ts +273 -0
  40. package/src/session/audit-log.ts +201 -0
  41. package/src/session/auth-service.ts +178 -0
  42. package/src/session/index.ts +26 -0
  43. package/src/session/secret-vault.ts +183 -0
  44. package/src/session/session-store.ts +339 -0
  45. package/src/session/types.ts +100 -0
  46. package/src/types/blocks.ts +56 -0
  47. package/src/types/context.ts +54 -0
  48. package/src/types/errors.ts +359 -0
  49. package/src/types/index.ts +34 -0
  50. package/src/types/provider.ts +58 -0
  51. package/src/types/tool.ts +39 -0
  52. package/src/utils/error.ts +3 -0
  53. package/src/utils/fs.ts +185 -0
  54. package/src/utils/image-resize.ts +76 -0
  55. package/src/utils/ssrf-guard.ts +133 -0
  56. package/src/utils/ulid.ts +72 -0
  57. package/src/utils/version-check.ts +59 -0
  58. package/tests/agent-loop.test.ts +490 -0
  59. package/tests/audit-log.test.ts +199 -0
  60. package/tests/auth-service.test.ts +170 -0
  61. package/tests/blocks.test.ts +79 -0
  62. package/tests/catalog-parser.test.ts +174 -0
  63. package/tests/compactor.test.ts +180 -0
  64. package/tests/container.test.ts +224 -0
  65. package/tests/conversation-state.test.ts +75 -0
  66. package/tests/errors.test.ts +429 -0
  67. package/tests/events-v021.test.ts +60 -0
  68. package/tests/events-v022.test.ts +75 -0
  69. package/tests/events.test.ts +340 -0
  70. package/tests/fixtures/large-image.png +0 -0
  71. package/tests/fixtures/small-image.png +0 -0
  72. package/tests/fs-utils.test.ts +164 -0
  73. package/tests/image-resize.test.ts +51 -0
  74. package/tests/output-serializer.test.ts +79 -0
  75. package/tests/path-resolver.test.ts +91 -0
  76. package/tests/permission-policy.test.ts +174 -0
  77. package/tests/pipeline.test.ts +193 -0
  78. package/tests/provider-factory.test.ts +245 -0
  79. package/tests/provider-runner.test.ts +535 -0
  80. package/tests/retry-policy.test.ts +104 -0
  81. package/tests/run-controller.test.ts +115 -0
  82. package/tests/sanity.test.ts +26 -0
  83. package/tests/schema-validator.test.ts +109 -0
  84. package/tests/secret-scrubber.test.ts +133 -0
  85. package/tests/secret-vault.test.ts +130 -0
  86. package/tests/session-store.test.ts +429 -0
  87. package/tests/ssrf-guard.test.ts +112 -0
  88. package/tests/system-prompt-builder.test.ts +116 -0
  89. package/tests/token-counter.test.ts +163 -0
  90. package/tests/tokens.test.ts +42 -0
  91. package/tests/tool-executor.test.ts +452 -0
  92. package/tests/tool-registry.test.ts +143 -0
  93. package/tests/tracer.test.ts +32 -0
  94. package/tests/ulid.test.ts +53 -0
  95. package/tests/version-check.test.ts +57 -0
  96. package/tsconfig.json +11 -0
  97. package/tsup.config.ts +16 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 FlowCodex contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # @flowcodex/core
2
+
3
+ The FlowCodex core — kernel primitives (Container, Pipeline, EventBus, RunController) and the agent system (Agent, Context, ToolExecutor).
4
+
5
+ ## Usage
6
+
7
+ ```typescript
8
+ import { Container, Pipeline, EventBus, RunController } from '@flowcodex/core';
9
+ ```
@@ -0,0 +1,560 @@
1
+ type Token<T> = symbol & {
2
+ readonly __type?: T;
3
+ };
4
+ type Factory<T> = (c: Container) => T;
5
+ type Decorator<T> = (inner: T, c: Container) => T;
6
+ interface BindOptions {
7
+ singleton?: boolean | undefined;
8
+ owner?: string | undefined;
9
+ }
10
+ declare class Container {
11
+ private readonly entries;
12
+ private readonly resolving;
13
+ bind<T>(token: Token<T>, factory: Factory<T>, opts?: BindOptions): void;
14
+ override<T>(token: Token<T>, factory: Factory<T>, opts?: BindOptions): void;
15
+ decorate<T>(token: Token<T>, decorator: Decorator<T>, owner?: string): void;
16
+ resolve<T>(token: Token<T>): T;
17
+ private describeCycle;
18
+ has<T>(token: Token<T>): boolean;
19
+ safeResolve<T>(token: Token<T>): T | undefined;
20
+ ownerOf<T>(token: Token<T>): string | undefined;
21
+ unbind<T>(token: Token<T>): boolean;
22
+ clear(): void;
23
+ list(): Array<{
24
+ token: symbol;
25
+ owner: string;
26
+ }>;
27
+ inspect<T>(token: Token<T>): {
28
+ owner: string;
29
+ singleton: boolean;
30
+ decoratorCount: number;
31
+ cached: boolean;
32
+ } | null;
33
+ }
34
+ declare function token<T>(description: string): Token<T>;
35
+
36
+ type NextFn<T> = (value: T) => Promise<T>;
37
+ type MiddlewareHandler<T> = (value: T, next: NextFn<T>) => Promise<T>;
38
+ type PipelineErrorPolicy = 'rethrow' | 'swallow';
39
+ interface PipelineErrorEvent {
40
+ middleware: string;
41
+ owner?: string | undefined;
42
+ err: unknown;
43
+ }
44
+ type PipelineErrorHandler = (ev: PipelineErrorEvent) => PipelineErrorPolicy | Promise<PipelineErrorPolicy>;
45
+ interface Middleware<T> {
46
+ name: string;
47
+ handler: MiddlewareHandler<T>;
48
+ owner?: string | undefined;
49
+ }
50
+ interface PipelineOptions {
51
+ optional?: boolean | undefined;
52
+ }
53
+ interface ReadonlyPipeline<T> {
54
+ readonly size: number;
55
+ list(): readonly string[];
56
+ run(input: T): Promise<T>;
57
+ }
58
+ declare class Pipeline<T> {
59
+ private readonly chain;
60
+ private errorHandler?;
61
+ setErrorHandler(handler: PipelineErrorHandler | undefined): this;
62
+ use(mw: Middleware<T> | Middleware<unknown>): this;
63
+ prepend(mw: Middleware<T>): this;
64
+ insertAt(index: number, mw: Middleware<T>): this;
65
+ insertBefore(target: string, mw: Middleware<T>, opts?: PipelineOptions): this;
66
+ insertAfter(target: string, mw: Middleware<T>, opts?: PipelineOptions): this;
67
+ replace(target: string, mw: Middleware<T>, opts?: PipelineOptions): this;
68
+ remove(name: string, opts?: PipelineOptions): this;
69
+ list(): readonly string[];
70
+ size(): number;
71
+ asReadonly(): ReadonlyPipeline<T>;
72
+ run(input: T): Promise<T>;
73
+ private indexOf;
74
+ private ensureUnique;
75
+ }
76
+
77
+ interface RunControllerOptions {
78
+ parentSignal?: AbortSignal | undefined;
79
+ errorSink?: (err: unknown, where: string) => void;
80
+ }
81
+ declare class RunController {
82
+ private readonly ctrl;
83
+ private readonly hooks;
84
+ private disposed;
85
+ private hooksDrained;
86
+ private readonly errorSink;
87
+ constructor(opts?: RunControllerOptions);
88
+ get signal(): AbortSignal;
89
+ get aborted(): boolean;
90
+ abort(reason?: unknown): void;
91
+ onAbort(fn: () => void | Promise<void>): () => void;
92
+ dispose(): Promise<void>;
93
+ private runHooks;
94
+ }
95
+
96
+ declare const TOKENS: {
97
+ readonly Logger: Token<unknown>;
98
+ readonly TokenCounter: Token<unknown>;
99
+ readonly SessionStore: Token<unknown>;
100
+ readonly ConfigStore: Token<unknown>;
101
+ readonly ConfigLoader: Token<unknown>;
102
+ readonly PermissionPolicy: Token<unknown>;
103
+ readonly Compactor: Token<unknown>;
104
+ readonly PathResolver: Token<unknown>;
105
+ readonly Renderer: Token<unknown>;
106
+ readonly InputReader: Token<unknown>;
107
+ readonly ErrorHandler: Token<unknown>;
108
+ readonly RetryPolicy: Token<unknown>;
109
+ readonly SystemPromptBuilder: Token<unknown>;
110
+ readonly SecretScrubber: Token<unknown>;
111
+ readonly ProviderRunner: Token<unknown>;
112
+ };
113
+
114
+ type ImageSource = {
115
+ type: 'base64';
116
+ media_type: string;
117
+ data: string;
118
+ } | {
119
+ type: 'url';
120
+ url: string;
121
+ };
122
+ interface CacheControl {
123
+ type: 'ephemeral';
124
+ ttl?: '5m' | '1h' | undefined;
125
+ }
126
+ interface TextBlock {
127
+ type: 'text';
128
+ text: string;
129
+ cache_control?: CacheControl | undefined;
130
+ }
131
+ type ContentBlock = TextBlock | {
132
+ type: 'thinking';
133
+ text: string;
134
+ signature?: string | undefined;
135
+ } | {
136
+ type: 'tool_use';
137
+ id: string;
138
+ name: string;
139
+ input: unknown;
140
+ } | {
141
+ type: 'tool_result';
142
+ tool_use_id: string;
143
+ content: string | ContentBlock[];
144
+ is_error?: boolean | undefined;
145
+ } | {
146
+ type: 'image';
147
+ source: ImageSource;
148
+ } | {
149
+ type: 'pdf';
150
+ source: {
151
+ type: 'base64';
152
+ media_type: 'application/pdf';
153
+ data: string;
154
+ };
155
+ };
156
+ type Role = 'system' | 'user' | 'assistant';
157
+ interface Message {
158
+ role: Role;
159
+ content: ContentBlock[] | string;
160
+ }
161
+ type ModelId = string;
162
+ type ModelRef = {
163
+ provider: string;
164
+ model: ModelId;
165
+ };
166
+
167
+ interface Usage {
168
+ input: number;
169
+ output: number;
170
+ cache_read?: number | undefined;
171
+ cache_creation?: number | undefined;
172
+ }
173
+ interface ModelPricing {
174
+ input: number;
175
+ output: number;
176
+ cacheRead: number;
177
+ cacheWrite: number;
178
+ }
179
+ interface TokenCounter {
180
+ estimate(text: string, model?: string): number;
181
+ /** Pre-flight estimate of a full request: system + messages + tool schemas.
182
+ * Single source of truth for ctx.lastRequestTokens, ctx.pct, and compaction thresholds. */
183
+ estimateRequestTokens(system: readonly ContentBlock[], messages: readonly Message[], tools?: readonly unknown[], model?: string): number;
184
+ account(usage: Usage, model?: string): void;
185
+ currentRequestTokens(): number;
186
+ total(): number;
187
+ estimateCost(model: string, usage: Usage): number;
188
+ setRequestTokens(n: number): void;
189
+ }
190
+ declare class DefaultTokenCounter implements TokenCounter {
191
+ private cumulativeInput;
192
+ private cumulativeOutput;
193
+ private requestTokens;
194
+ private readonly pricing;
195
+ private readonly calibration;
196
+ setPricing(model: string, pricing: ModelPricing): void;
197
+ estimate(text: string, model?: string): number;
198
+ estimateRequestTokens(system: readonly ContentBlock[], messages: readonly Message[], tools?: readonly unknown[], model?: string): number;
199
+ account(usage: Usage, model?: string): void;
200
+ currentRequestTokens(): number;
201
+ setRequestTokens(n: number): void;
202
+ total(): number;
203
+ estimateCost(model: string, usage: Usage): number;
204
+ private getRatio;
205
+ calibrate(model: string, initialRatio?: number): void;
206
+ }
207
+
208
+ type SessionEvent = {
209
+ type: 'session_start';
210
+ ts: string;
211
+ id: string;
212
+ model: string;
213
+ cwd: string;
214
+ } | {
215
+ type: 'session_resumed';
216
+ ts: string;
217
+ id: string;
218
+ model: string;
219
+ } | {
220
+ type: 'user_input';
221
+ ts: string;
222
+ content: string | ContentBlock[];
223
+ } | {
224
+ type: 'llm_request';
225
+ ts: string;
226
+ model: string;
227
+ messageCount: number;
228
+ estimatedInputTokens?: number | undefined;
229
+ toolCount?: number | undefined;
230
+ } | {
231
+ type: 'llm_response';
232
+ ts: string;
233
+ content: ContentBlock[];
234
+ stopReason: string;
235
+ usage: Usage;
236
+ } | {
237
+ type: 'tool_use';
238
+ ts: string;
239
+ name: string;
240
+ id: string;
241
+ input: unknown;
242
+ } | {
243
+ type: 'tool_result';
244
+ ts: string;
245
+ id: string;
246
+ content: unknown;
247
+ isError: boolean;
248
+ } | {
249
+ type: 'compaction';
250
+ ts: string;
251
+ before: number;
252
+ after: number;
253
+ level: string;
254
+ aggressive: boolean;
255
+ } | {
256
+ type: 'ctx_pct';
257
+ ts: string;
258
+ pct: number;
259
+ } | {
260
+ type: 'in_flight_start';
261
+ ts: string;
262
+ kind: 'tool_batch' | 'llm_call';
263
+ } | {
264
+ type: 'in_flight_end';
265
+ ts: string;
266
+ kind: 'tool_batch' | 'llm_call';
267
+ } | {
268
+ type: 'checkpoint';
269
+ ts: string;
270
+ label?: string | undefined;
271
+ } | {
272
+ type: 'error';
273
+ ts: string;
274
+ error: unknown;
275
+ } | {
276
+ type: 'session_end';
277
+ ts: string;
278
+ reason: 'normal' | 'aborted' | 'error' | 'crashed';
279
+ };
280
+ interface AuditEntry {
281
+ index: number;
282
+ id: string;
283
+ ts: string;
284
+ prevHash: string;
285
+ hash: string;
286
+ toolName: string;
287
+ toolUseId: string;
288
+ input: unknown;
289
+ output: unknown;
290
+ isError: boolean;
291
+ }
292
+ type VerifyResult = {
293
+ ok: true;
294
+ entries: number;
295
+ } | {
296
+ ok: false;
297
+ brokenAt: number;
298
+ reason: string;
299
+ };
300
+ interface SessionSummary {
301
+ id: string;
302
+ title: string;
303
+ model: string;
304
+ provider: string;
305
+ startedAt: string;
306
+ endedAt: string;
307
+ messageCount: number;
308
+ iterationCount: number;
309
+ toolCallCount: number;
310
+ toolErrorCount: number;
311
+ totalTokens: number;
312
+ totalCost: number;
313
+ outcome: 'completed' | 'error' | 'aborted';
314
+ }
315
+ interface SessionStore {
316
+ append(event: SessionEvent): Promise<void>;
317
+ readAll(): Promise<SessionEvent[]>;
318
+ close(reason?: 'normal' | 'aborted' | 'error' | 'crashed'): Promise<void>;
319
+ writeSummary(summary: SessionSummary): Promise<void>;
320
+ readonly sessionId: string;
321
+ readonly filePath: string;
322
+ }
323
+ interface SecretVault {
324
+ isEncrypted(value: string): boolean;
325
+ encrypt(plaintext: string): string;
326
+ decrypt(value: string): string;
327
+ }
328
+ interface AuditLog {
329
+ record(input: {
330
+ sessionId: string;
331
+ toolName: string;
332
+ toolUseId: string;
333
+ input: unknown;
334
+ output: unknown;
335
+ isError: boolean;
336
+ }): Promise<AuditEntry>;
337
+ verify(sessionId: string): Promise<VerifyResult>;
338
+ load(sessionId: string): Promise<AuditEntry[]>;
339
+ flush(sessionId: string): Promise<void>;
340
+ }
341
+
342
+ interface EventMap {
343
+ 'session.started': {
344
+ id: string;
345
+ };
346
+ 'session.ended': {
347
+ id: string;
348
+ usage: unknown;
349
+ };
350
+ 'session.damaged': {
351
+ sessionId: string;
352
+ detail: string;
353
+ };
354
+ 'session.resumed': {
355
+ sessionId: string;
356
+ forkedFrom?: string | undefined;
357
+ };
358
+ 'session.summary_written': {
359
+ sessionId: string;
360
+ summary: SessionSummary;
361
+ };
362
+ 'iteration.started': {
363
+ index: number;
364
+ };
365
+ 'iteration.completed': {
366
+ index: number;
367
+ };
368
+ 'iteration.limit_reached': {
369
+ currentIterations: number;
370
+ currentLimit: number;
371
+ grant: (extraIterations: number) => void;
372
+ deny: () => void;
373
+ };
374
+ 'provider.response': {
375
+ usage: unknown;
376
+ stopReason: string;
377
+ };
378
+ 'provider.text_delta': {
379
+ text: string;
380
+ };
381
+ 'provider.thinking_delta': {
382
+ text: string;
383
+ };
384
+ 'provider.tool_use_start': {
385
+ id: string;
386
+ name: string;
387
+ };
388
+ 'provider.tool_use_input_delta': {
389
+ id: string;
390
+ partialJson: string;
391
+ };
392
+ 'provider.tool_use_stop': {
393
+ id: string;
394
+ name: string;
395
+ };
396
+ 'provider.stream_error': {
397
+ eventType: string;
398
+ msg: string;
399
+ };
400
+ 'provider.retry': {
401
+ providerId: string;
402
+ attempt: number;
403
+ delayMs: number;
404
+ status: number;
405
+ description: string;
406
+ };
407
+ 'provider.error': {
408
+ providerId: string;
409
+ status: number;
410
+ description: string;
411
+ retryable: boolean;
412
+ };
413
+ 'provider.fallback': {
414
+ providerId: string;
415
+ from: string;
416
+ to: string;
417
+ reason: string;
418
+ status: number;
419
+ };
420
+ 'provider.fallback_skipped': {
421
+ providerId: string;
422
+ reason: 'no_api_key' | 'unsupported_family' | 'not_in_catalog';
423
+ };
424
+ 'tool.started': {
425
+ name: string;
426
+ id: string;
427
+ input?: unknown | undefined;
428
+ };
429
+ 'tool.progress': {
430
+ name: string;
431
+ id: string;
432
+ event: unknown;
433
+ };
434
+ 'tool.confirm_needed': {
435
+ tool: unknown;
436
+ input: unknown;
437
+ toolUseId: string;
438
+ suggestedPattern: string;
439
+ resolve: (decision: 'yes' | 'no' | 'always' | 'deny') => void;
440
+ };
441
+ 'tool.executed': {
442
+ id?: string | undefined;
443
+ name: string;
444
+ durationMs: number;
445
+ ok: boolean;
446
+ input?: unknown | undefined;
447
+ output?: string | undefined;
448
+ outputBytes?: number | undefined;
449
+ };
450
+ 'tool.tier_filtered': {
451
+ total: number;
452
+ kept: number;
453
+ };
454
+ 'tool.batch_started': {
455
+ count: number;
456
+ names: string[];
457
+ };
458
+ 'tool.batch_completed': {
459
+ count: number;
460
+ succeeded: number;
461
+ failed: number;
462
+ durationMs: number;
463
+ };
464
+ 'provider.structured_output': {
465
+ name: string;
466
+ valid: boolean;
467
+ };
468
+ 'provider.modality_rejected': {
469
+ provider: string;
470
+ model: string;
471
+ modality: string;
472
+ };
473
+ 'ctx.pct': {
474
+ load: number;
475
+ tokens: number;
476
+ maxContext: number;
477
+ };
478
+ 'ctx.max_context': {
479
+ providerId: string;
480
+ modelId: string;
481
+ maxContext: number;
482
+ };
483
+ 'token.threshold': {
484
+ used: number;
485
+ limit: number;
486
+ };
487
+ 'token.accounted': {
488
+ usage: unknown;
489
+ cost: {
490
+ input: number;
491
+ output: number;
492
+ total: number;
493
+ };
494
+ };
495
+ 'token.cost_estimate_unavailable': {
496
+ model: string;
497
+ };
498
+ 'ssrf.blocked': {
499
+ url: string;
500
+ ip: string;
501
+ reason: string;
502
+ };
503
+ 'permission.persisted': {
504
+ action: 'allow' | 'deny';
505
+ tool: string;
506
+ pattern: string;
507
+ scope: 'session' | 'trust';
508
+ };
509
+ 'compaction.fired': {
510
+ before: number;
511
+ after: number;
512
+ level: 'soft' | 'hard';
513
+ aggressive: boolean;
514
+ };
515
+ 'compaction.failed': {
516
+ reason: string;
517
+ attemptedLevel: 'soft' | 'hard';
518
+ };
519
+ 'error': {
520
+ err: Error;
521
+ phase: string;
522
+ };
523
+ }
524
+ type EventName = keyof EventMap;
525
+ type Listener<E extends EventName> = (payload: EventMap[E]) => void;
526
+ interface EventLogger {
527
+ error(msg: string, ctx?: unknown): void | undefined;
528
+ }
529
+ declare class EventBus {
530
+ private readonly listeners;
531
+ private readonly wildcards;
532
+ private logger?;
533
+ setLogger(logger: EventLogger): void;
534
+ on<E extends EventName>(event: E, fn: Listener<E>): () => void;
535
+ off<E extends EventName>(event: E, fn: Listener<E>): void;
536
+ once<E extends EventName>(event: E, fn: Listener<E>): () => void;
537
+ onAny(fn: (event: string, payload: unknown) => void): () => void;
538
+ onPattern(pattern: string, fn: (event: string, payload: unknown) => void): () => void;
539
+ onRegex(regex: RegExp, fn: (event: string, payload: unknown) => void): () => void;
540
+ emit<E extends EventName>(event: E, payload: EventMap[E]): void;
541
+ emitCustom(event: string, payload: unknown): void;
542
+ clear(): void;
543
+ listenerCount(event?: EventName): number;
544
+ wildcardCount(): number;
545
+ hasListenerFor(event: string): boolean;
546
+ }
547
+ declare class ScopedEventBus extends EventBus {
548
+ private readonly registrations;
549
+ private nextKey;
550
+ on<E extends EventName>(event: E, fn: Listener<E>): () => void;
551
+ once<E extends EventName>(event: E, fn: Listener<E>): () => void;
552
+ onAny(fn: (event: string, payload: unknown) => void): () => void;
553
+ onPattern(pattern: string, fn: (event: string, payload: unknown) => void): () => void;
554
+ onRegex(regex: RegExp, fn: (event: string, payload: unknown) => void): () => void;
555
+ teardown(): void;
556
+ [Symbol.dispose](): void;
557
+ get scopedListenerCount(): number;
558
+ }
559
+
560
+ export { type AuditLog as A, type BindOptions as B, type ContentBlock as C, type Decorator as D, EventBus as E, type Factory as F, token as G, type Listener as L, type Message as M, type NextFn as N, Pipeline as P, type ReadonlyPipeline as R, type SecretVault as S, type TokenCounter as T, type Usage as U, type VerifyResult as V, type ModelRef as a, type SessionStore as b, type SessionEvent as c, type SessionSummary as d, type AuditEntry as e, type CacheControl as f, Container as g, DefaultTokenCounter as h, type EventLogger as i, type EventMap as j, type EventName as k, type Middleware as l, type MiddlewareHandler as m, type ModelId as n, type ModelPricing as o, type PipelineErrorEvent as p, type PipelineErrorHandler as q, type PipelineErrorPolicy as r, type PipelineOptions as s, type Role as t, RunController as u, type RunControllerOptions as v, ScopedEventBus as w, TOKENS as x, type TextBlock as y, type Token as z };