@agentxjs/ui 0.0.9 → 0.1.2

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 (63) hide show
  1. package/dist/api/index.d.ts +2 -3
  2. package/dist/browser-Bab_T5G7.js +39 -0
  3. package/dist/browser-Bab_T5G7.js.map +1 -0
  4. package/dist/components/container/AgentList.d.ts +45 -0
  5. package/dist/components/container/Chat.d.ts +47 -0
  6. package/dist/components/container/ChatHeader.d.ts +41 -0
  7. package/dist/components/container/ToolCard.d.ts +69 -0
  8. package/dist/components/container/index.d.ts +24 -19
  9. package/dist/components/{message → container/message}/MessageList.d.ts +1 -1
  10. package/dist/components/{message → container/message}/index.d.ts +0 -1
  11. package/dist/components/{message → container/message}/items/AssistantMessage.d.ts +1 -1
  12. package/dist/components/{message → container/message}/items/ErrorAlert.d.ts +1 -1
  13. package/dist/components/{message → container/message}/items/ToolCallMessage.d.ts +1 -1
  14. package/dist/components/{message → container/message}/items/ToolResultMessage.d.ts +1 -1
  15. package/dist/components/{message → container/message}/items/ToolUseMessage.d.ts +1 -1
  16. package/dist/components/{message → container/message}/items/UserMessage.d.ts +1 -1
  17. package/dist/components/{message → container/message}/items/index.d.ts +0 -1
  18. package/dist/components/{message → container/message}/parts/ToolResultContent.d.ts +1 -1
  19. package/dist/components/element/Badge.d.ts +1 -1
  20. package/dist/components/element/Button.d.ts +2 -2
  21. package/dist/components/element/EmojiPicker.d.ts +64 -0
  22. package/dist/components/element/MessageAvatar.d.ts +1 -1
  23. package/dist/components/element/Toast.d.ts +71 -0
  24. package/dist/components/element/index.d.ts +4 -0
  25. package/dist/components/pane/InputPane.d.ts +74 -0
  26. package/dist/components/pane/InputToolBar.d.ts +74 -0
  27. package/dist/components/pane/ListPane.d.ts +128 -0
  28. package/dist/components/pane/MessagePane.d.ts +111 -0
  29. package/dist/components/pane/NavBar.d.ts +71 -0
  30. package/dist/components/pane/index.d.ts +32 -0
  31. package/dist/components/studio/Studio.d.ts +23 -28
  32. package/dist/components/studio/index.d.ts +13 -6
  33. package/dist/globals.css +1 -200
  34. package/dist/hooks/index.d.ts +27 -13
  35. package/dist/hooks/useAgent.d.ts +44 -13
  36. package/dist/hooks/useAgentX.d.ts +7 -6
  37. package/dist/hooks/useImages.d.ts +84 -0
  38. package/dist/index.js +21508 -61
  39. package/dist/index.js.map +1 -1
  40. package/package.json +6 -5
  41. package/dist/components/container/AgentPane.d.ts +0 -56
  42. package/dist/components/container/ContainerView.d.ts +0 -119
  43. package/dist/components/container/DefinitionPane.d.ts +0 -27
  44. package/dist/components/container/InputPane.d.ts +0 -44
  45. package/dist/components/container/InputToolBar.d.ts +0 -22
  46. package/dist/components/container/MessagePane.d.ts +0 -32
  47. package/dist/components/container/SessionPane.d.ts +0 -35
  48. package/dist/components/container/types.d.ts +0 -67
  49. package/dist/components/input/InputBox.d.ts +0 -43
  50. package/dist/components/input/index.d.ts +0 -1
  51. package/dist/components/message/StatusIndicator.d.ts +0 -28
  52. package/dist/components/message/items/SystemMessage.d.ts +0 -25
  53. package/dist/hooks/useSession.d.ts +0 -79
  54. package/dist/index-B8Ijbzyc.js +0 -27676
  55. package/dist/index-B8Ijbzyc.js.map +0 -1
  56. package/dist/index-BtOS4F-X.js +0 -3013
  57. package/dist/index-BtOS4F-X.js.map +0 -1
  58. /package/dist/components/{message → container/message}/parts/FileContent.d.ts +0 -0
  59. /package/dist/components/{message → container/message}/parts/ImageContent.d.ts +0 -0
  60. /package/dist/components/{message → container/message}/parts/TextContent.d.ts +0 -0
  61. /package/dist/components/{message → container/message}/parts/ThinkingContent.d.ts +0 -0
  62. /package/dist/components/{message → container/message}/parts/ToolCallContent.d.ts +0 -0
  63. /package/dist/components/{message → container/message}/parts/index.d.ts +0 -0
@@ -1,3013 +0,0 @@
1
- import { c as createLogger, i as isStateEvent, L as LogLevel } from "./index-B8Ijbzyc.js";
2
- var extendStatics = function(d, b) {
3
- extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {
4
- d2.__proto__ = b2;
5
- } || function(d2, b2) {
6
- for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];
7
- };
8
- return extendStatics(d, b);
9
- };
10
- function __extends(d, b) {
11
- if (typeof b !== "function" && b !== null)
12
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
13
- extendStatics(d, b);
14
- function __() {
15
- this.constructor = d;
16
- }
17
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
18
- }
19
- function __values(o) {
20
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
21
- if (m) return m.call(o);
22
- if (o && typeof o.length === "number") return {
23
- next: function() {
24
- if (o && i >= o.length) o = void 0;
25
- return { value: o && o[i++], done: !o };
26
- }
27
- };
28
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
29
- }
30
- function __read(o, n) {
31
- var m = typeof Symbol === "function" && o[Symbol.iterator];
32
- if (!m) return o;
33
- var i = m.call(o), r, ar = [], e;
34
- try {
35
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
36
- } catch (error) {
37
- e = { error };
38
- } finally {
39
- try {
40
- if (r && !r.done && (m = i["return"])) m.call(i);
41
- } finally {
42
- if (e) throw e.error;
43
- }
44
- }
45
- return ar;
46
- }
47
- function __spreadArray(to, from, pack) {
48
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
49
- if (ar || !(i in from)) {
50
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
51
- ar[i] = from[i];
52
- }
53
- }
54
- return to.concat(ar || Array.prototype.slice.call(from));
55
- }
56
- typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
57
- var e = new Error(message);
58
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
59
- };
60
- function isFunction(value) {
61
- return typeof value === "function";
62
- }
63
- function createErrorClass(createImpl) {
64
- var _super = function(instance) {
65
- Error.call(instance);
66
- instance.stack = new Error().stack;
67
- };
68
- var ctorFunc = createImpl(_super);
69
- ctorFunc.prototype = Object.create(Error.prototype);
70
- ctorFunc.prototype.constructor = ctorFunc;
71
- return ctorFunc;
72
- }
73
- var UnsubscriptionError = createErrorClass(function(_super) {
74
- return function UnsubscriptionErrorImpl(errors) {
75
- _super(this);
76
- this.message = errors ? errors.length + " errors occurred during unsubscription:\n" + errors.map(function(err, i) {
77
- return i + 1 + ") " + err.toString();
78
- }).join("\n ") : "";
79
- this.name = "UnsubscriptionError";
80
- this.errors = errors;
81
- };
82
- });
83
- function arrRemove(arr, item) {
84
- if (arr) {
85
- var index = arr.indexOf(item);
86
- 0 <= index && arr.splice(index, 1);
87
- }
88
- }
89
- var Subscription = (function() {
90
- function Subscription2(initialTeardown) {
91
- this.initialTeardown = initialTeardown;
92
- this.closed = false;
93
- this._parentage = null;
94
- this._finalizers = null;
95
- }
96
- Subscription2.prototype.unsubscribe = function() {
97
- var e_1, _a, e_2, _b;
98
- var errors;
99
- if (!this.closed) {
100
- this.closed = true;
101
- var _parentage = this._parentage;
102
- if (_parentage) {
103
- this._parentage = null;
104
- if (Array.isArray(_parentage)) {
105
- try {
106
- for (var _parentage_1 = __values(_parentage), _parentage_1_1 = _parentage_1.next(); !_parentage_1_1.done; _parentage_1_1 = _parentage_1.next()) {
107
- var parent_1 = _parentage_1_1.value;
108
- parent_1.remove(this);
109
- }
110
- } catch (e_1_1) {
111
- e_1 = { error: e_1_1 };
112
- } finally {
113
- try {
114
- if (_parentage_1_1 && !_parentage_1_1.done && (_a = _parentage_1.return)) _a.call(_parentage_1);
115
- } finally {
116
- if (e_1) throw e_1.error;
117
- }
118
- }
119
- } else {
120
- _parentage.remove(this);
121
- }
122
- }
123
- var initialFinalizer = this.initialTeardown;
124
- if (isFunction(initialFinalizer)) {
125
- try {
126
- initialFinalizer();
127
- } catch (e) {
128
- errors = e instanceof UnsubscriptionError ? e.errors : [e];
129
- }
130
- }
131
- var _finalizers = this._finalizers;
132
- if (_finalizers) {
133
- this._finalizers = null;
134
- try {
135
- for (var _finalizers_1 = __values(_finalizers), _finalizers_1_1 = _finalizers_1.next(); !_finalizers_1_1.done; _finalizers_1_1 = _finalizers_1.next()) {
136
- var finalizer = _finalizers_1_1.value;
137
- try {
138
- execFinalizer(finalizer);
139
- } catch (err) {
140
- errors = errors !== null && errors !== void 0 ? errors : [];
141
- if (err instanceof UnsubscriptionError) {
142
- errors = __spreadArray(__spreadArray([], __read(errors)), __read(err.errors));
143
- } else {
144
- errors.push(err);
145
- }
146
- }
147
- }
148
- } catch (e_2_1) {
149
- e_2 = { error: e_2_1 };
150
- } finally {
151
- try {
152
- if (_finalizers_1_1 && !_finalizers_1_1.done && (_b = _finalizers_1.return)) _b.call(_finalizers_1);
153
- } finally {
154
- if (e_2) throw e_2.error;
155
- }
156
- }
157
- }
158
- if (errors) {
159
- throw new UnsubscriptionError(errors);
160
- }
161
- }
162
- };
163
- Subscription2.prototype.add = function(teardown) {
164
- var _a;
165
- if (teardown && teardown !== this) {
166
- if (this.closed) {
167
- execFinalizer(teardown);
168
- } else {
169
- if (teardown instanceof Subscription2) {
170
- if (teardown.closed || teardown._hasParent(this)) {
171
- return;
172
- }
173
- teardown._addParent(this);
174
- }
175
- (this._finalizers = (_a = this._finalizers) !== null && _a !== void 0 ? _a : []).push(teardown);
176
- }
177
- }
178
- };
179
- Subscription2.prototype._hasParent = function(parent) {
180
- var _parentage = this._parentage;
181
- return _parentage === parent || Array.isArray(_parentage) && _parentage.includes(parent);
182
- };
183
- Subscription2.prototype._addParent = function(parent) {
184
- var _parentage = this._parentage;
185
- this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;
186
- };
187
- Subscription2.prototype._removeParent = function(parent) {
188
- var _parentage = this._parentage;
189
- if (_parentage === parent) {
190
- this._parentage = null;
191
- } else if (Array.isArray(_parentage)) {
192
- arrRemove(_parentage, parent);
193
- }
194
- };
195
- Subscription2.prototype.remove = function(teardown) {
196
- var _finalizers = this._finalizers;
197
- _finalizers && arrRemove(_finalizers, teardown);
198
- if (teardown instanceof Subscription2) {
199
- teardown._removeParent(this);
200
- }
201
- };
202
- Subscription2.EMPTY = (function() {
203
- var empty = new Subscription2();
204
- empty.closed = true;
205
- return empty;
206
- })();
207
- return Subscription2;
208
- })();
209
- var EMPTY_SUBSCRIPTION = Subscription.EMPTY;
210
- function isSubscription(value) {
211
- return value instanceof Subscription || value && "closed" in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe);
212
- }
213
- function execFinalizer(finalizer) {
214
- if (isFunction(finalizer)) {
215
- finalizer();
216
- } else {
217
- finalizer.unsubscribe();
218
- }
219
- }
220
- var config = {
221
- Promise: void 0
222
- };
223
- var timeoutProvider = {
224
- setTimeout: function(handler, timeout) {
225
- var args = [];
226
- for (var _i = 2; _i < arguments.length; _i++) {
227
- args[_i - 2] = arguments[_i];
228
- }
229
- return setTimeout.apply(void 0, __spreadArray([handler, timeout], __read(args)));
230
- },
231
- clearTimeout: function(handle) {
232
- return clearTimeout(handle);
233
- },
234
- delegate: void 0
235
- };
236
- function reportUnhandledError(err) {
237
- timeoutProvider.setTimeout(function() {
238
- {
239
- throw err;
240
- }
241
- });
242
- }
243
- function noop() {
244
- }
245
- function errorContext(cb) {
246
- {
247
- cb();
248
- }
249
- }
250
- var Subscriber = (function(_super) {
251
- __extends(Subscriber2, _super);
252
- function Subscriber2(destination) {
253
- var _this = _super.call(this) || this;
254
- _this.isStopped = false;
255
- if (destination) {
256
- _this.destination = destination;
257
- if (isSubscription(destination)) {
258
- destination.add(_this);
259
- }
260
- } else {
261
- _this.destination = EMPTY_OBSERVER;
262
- }
263
- return _this;
264
- }
265
- Subscriber2.create = function(next, error, complete) {
266
- return new SafeSubscriber(next, error, complete);
267
- };
268
- Subscriber2.prototype.next = function(value) {
269
- if (this.isStopped) ;
270
- else {
271
- this._next(value);
272
- }
273
- };
274
- Subscriber2.prototype.error = function(err) {
275
- if (this.isStopped) ;
276
- else {
277
- this.isStopped = true;
278
- this._error(err);
279
- }
280
- };
281
- Subscriber2.prototype.complete = function() {
282
- if (this.isStopped) ;
283
- else {
284
- this.isStopped = true;
285
- this._complete();
286
- }
287
- };
288
- Subscriber2.prototype.unsubscribe = function() {
289
- if (!this.closed) {
290
- this.isStopped = true;
291
- _super.prototype.unsubscribe.call(this);
292
- this.destination = null;
293
- }
294
- };
295
- Subscriber2.prototype._next = function(value) {
296
- this.destination.next(value);
297
- };
298
- Subscriber2.prototype._error = function(err) {
299
- try {
300
- this.destination.error(err);
301
- } finally {
302
- this.unsubscribe();
303
- }
304
- };
305
- Subscriber2.prototype._complete = function() {
306
- try {
307
- this.destination.complete();
308
- } finally {
309
- this.unsubscribe();
310
- }
311
- };
312
- return Subscriber2;
313
- })(Subscription);
314
- var ConsumerObserver = (function() {
315
- function ConsumerObserver2(partialObserver) {
316
- this.partialObserver = partialObserver;
317
- }
318
- ConsumerObserver2.prototype.next = function(value) {
319
- var partialObserver = this.partialObserver;
320
- if (partialObserver.next) {
321
- try {
322
- partialObserver.next(value);
323
- } catch (error) {
324
- handleUnhandledError(error);
325
- }
326
- }
327
- };
328
- ConsumerObserver2.prototype.error = function(err) {
329
- var partialObserver = this.partialObserver;
330
- if (partialObserver.error) {
331
- try {
332
- partialObserver.error(err);
333
- } catch (error) {
334
- handleUnhandledError(error);
335
- }
336
- } else {
337
- handleUnhandledError(err);
338
- }
339
- };
340
- ConsumerObserver2.prototype.complete = function() {
341
- var partialObserver = this.partialObserver;
342
- if (partialObserver.complete) {
343
- try {
344
- partialObserver.complete();
345
- } catch (error) {
346
- handleUnhandledError(error);
347
- }
348
- }
349
- };
350
- return ConsumerObserver2;
351
- })();
352
- var SafeSubscriber = (function(_super) {
353
- __extends(SafeSubscriber2, _super);
354
- function SafeSubscriber2(observerOrNext, error, complete) {
355
- var _this = _super.call(this) || this;
356
- var partialObserver;
357
- if (isFunction(observerOrNext) || !observerOrNext) {
358
- partialObserver = {
359
- next: observerOrNext !== null && observerOrNext !== void 0 ? observerOrNext : void 0,
360
- error: error !== null && error !== void 0 ? error : void 0,
361
- complete: complete !== null && complete !== void 0 ? complete : void 0
362
- };
363
- } else {
364
- {
365
- partialObserver = observerOrNext;
366
- }
367
- }
368
- _this.destination = new ConsumerObserver(partialObserver);
369
- return _this;
370
- }
371
- return SafeSubscriber2;
372
- })(Subscriber);
373
- function handleUnhandledError(error) {
374
- {
375
- reportUnhandledError(error);
376
- }
377
- }
378
- function defaultErrorHandler(err) {
379
- throw err;
380
- }
381
- var EMPTY_OBSERVER = {
382
- closed: true,
383
- next: noop,
384
- error: defaultErrorHandler,
385
- complete: noop
386
- };
387
- var observable = (function() {
388
- return typeof Symbol === "function" && Symbol.observable || "@@observable";
389
- })();
390
- function identity(x) {
391
- return x;
392
- }
393
- function pipeFromArray(fns) {
394
- if (fns.length === 0) {
395
- return identity;
396
- }
397
- if (fns.length === 1) {
398
- return fns[0];
399
- }
400
- return function piped(input) {
401
- return fns.reduce(function(prev, fn) {
402
- return fn(prev);
403
- }, input);
404
- };
405
- }
406
- var Observable = (function() {
407
- function Observable2(subscribe) {
408
- if (subscribe) {
409
- this._subscribe = subscribe;
410
- }
411
- }
412
- Observable2.prototype.lift = function(operator) {
413
- var observable2 = new Observable2();
414
- observable2.source = this;
415
- observable2.operator = operator;
416
- return observable2;
417
- };
418
- Observable2.prototype.subscribe = function(observerOrNext, error, complete) {
419
- var _this = this;
420
- var subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);
421
- errorContext(function() {
422
- var _a = _this, operator = _a.operator, source = _a.source;
423
- subscriber.add(operator ? operator.call(subscriber, source) : source ? _this._subscribe(subscriber) : _this._trySubscribe(subscriber));
424
- });
425
- return subscriber;
426
- };
427
- Observable2.prototype._trySubscribe = function(sink) {
428
- try {
429
- return this._subscribe(sink);
430
- } catch (err) {
431
- sink.error(err);
432
- }
433
- };
434
- Observable2.prototype.forEach = function(next, promiseCtor) {
435
- var _this = this;
436
- promiseCtor = getPromiseCtor(promiseCtor);
437
- return new promiseCtor(function(resolve, reject) {
438
- var subscriber = new SafeSubscriber({
439
- next: function(value) {
440
- try {
441
- next(value);
442
- } catch (err) {
443
- reject(err);
444
- subscriber.unsubscribe();
445
- }
446
- },
447
- error: reject,
448
- complete: resolve
449
- });
450
- _this.subscribe(subscriber);
451
- });
452
- };
453
- Observable2.prototype._subscribe = function(subscriber) {
454
- var _a;
455
- return (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber);
456
- };
457
- Observable2.prototype[observable] = function() {
458
- return this;
459
- };
460
- Observable2.prototype.pipe = function() {
461
- var operations = [];
462
- for (var _i = 0; _i < arguments.length; _i++) {
463
- operations[_i] = arguments[_i];
464
- }
465
- return pipeFromArray(operations)(this);
466
- };
467
- Observable2.prototype.toPromise = function(promiseCtor) {
468
- var _this = this;
469
- promiseCtor = getPromiseCtor(promiseCtor);
470
- return new promiseCtor(function(resolve, reject) {
471
- var value;
472
- _this.subscribe(function(x) {
473
- return value = x;
474
- }, function(err) {
475
- return reject(err);
476
- }, function() {
477
- return resolve(value);
478
- });
479
- });
480
- };
481
- Observable2.create = function(subscribe) {
482
- return new Observable2(subscribe);
483
- };
484
- return Observable2;
485
- })();
486
- function getPromiseCtor(promiseCtor) {
487
- var _a;
488
- return (_a = promiseCtor !== null && promiseCtor !== void 0 ? promiseCtor : config.Promise) !== null && _a !== void 0 ? _a : Promise;
489
- }
490
- function isObserver(value) {
491
- return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);
492
- }
493
- function isSubscriber(value) {
494
- return value && value instanceof Subscriber || isObserver(value) && isSubscription(value);
495
- }
496
- function hasLift(source) {
497
- return isFunction(source === null || source === void 0 ? void 0 : source.lift);
498
- }
499
- function operate(init) {
500
- return function(source) {
501
- if (hasLift(source)) {
502
- return source.lift(function(liftedSource) {
503
- try {
504
- return init(liftedSource, this);
505
- } catch (err) {
506
- this.error(err);
507
- }
508
- });
509
- }
510
- throw new TypeError("Unable to lift unknown Observable type");
511
- };
512
- }
513
- function createOperatorSubscriber(destination, onNext, onComplete, onError, onFinalize) {
514
- return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);
515
- }
516
- var OperatorSubscriber = (function(_super) {
517
- __extends(OperatorSubscriber2, _super);
518
- function OperatorSubscriber2(destination, onNext, onComplete, onError, onFinalize, shouldUnsubscribe) {
519
- var _this = _super.call(this, destination) || this;
520
- _this.onFinalize = onFinalize;
521
- _this.shouldUnsubscribe = shouldUnsubscribe;
522
- _this._next = onNext ? function(value) {
523
- try {
524
- onNext(value);
525
- } catch (err) {
526
- destination.error(err);
527
- }
528
- } : _super.prototype._next;
529
- _this._error = onError ? function(err) {
530
- try {
531
- onError(err);
532
- } catch (err2) {
533
- destination.error(err2);
534
- } finally {
535
- this.unsubscribe();
536
- }
537
- } : _super.prototype._error;
538
- _this._complete = onComplete ? function() {
539
- try {
540
- onComplete();
541
- } catch (err) {
542
- destination.error(err);
543
- } finally {
544
- this.unsubscribe();
545
- }
546
- } : _super.prototype._complete;
547
- return _this;
548
- }
549
- OperatorSubscriber2.prototype.unsubscribe = function() {
550
- var _a;
551
- if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {
552
- var closed_1 = this.closed;
553
- _super.prototype.unsubscribe.call(this);
554
- !closed_1 && ((_a = this.onFinalize) === null || _a === void 0 ? void 0 : _a.call(this));
555
- }
556
- };
557
- return OperatorSubscriber2;
558
- })(Subscriber);
559
- var ObjectUnsubscribedError = createErrorClass(function(_super) {
560
- return function ObjectUnsubscribedErrorImpl() {
561
- _super(this);
562
- this.name = "ObjectUnsubscribedError";
563
- this.message = "object unsubscribed";
564
- };
565
- });
566
- var Subject = (function(_super) {
567
- __extends(Subject2, _super);
568
- function Subject2() {
569
- var _this = _super.call(this) || this;
570
- _this.closed = false;
571
- _this.currentObservers = null;
572
- _this.observers = [];
573
- _this.isStopped = false;
574
- _this.hasError = false;
575
- _this.thrownError = null;
576
- return _this;
577
- }
578
- Subject2.prototype.lift = function(operator) {
579
- var subject = new AnonymousSubject(this, this);
580
- subject.operator = operator;
581
- return subject;
582
- };
583
- Subject2.prototype._throwIfClosed = function() {
584
- if (this.closed) {
585
- throw new ObjectUnsubscribedError();
586
- }
587
- };
588
- Subject2.prototype.next = function(value) {
589
- var _this = this;
590
- errorContext(function() {
591
- var e_1, _a;
592
- _this._throwIfClosed();
593
- if (!_this.isStopped) {
594
- if (!_this.currentObservers) {
595
- _this.currentObservers = Array.from(_this.observers);
596
- }
597
- try {
598
- for (var _b = __values(_this.currentObservers), _c = _b.next(); !_c.done; _c = _b.next()) {
599
- var observer = _c.value;
600
- observer.next(value);
601
- }
602
- } catch (e_1_1) {
603
- e_1 = { error: e_1_1 };
604
- } finally {
605
- try {
606
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
607
- } finally {
608
- if (e_1) throw e_1.error;
609
- }
610
- }
611
- }
612
- });
613
- };
614
- Subject2.prototype.error = function(err) {
615
- var _this = this;
616
- errorContext(function() {
617
- _this._throwIfClosed();
618
- if (!_this.isStopped) {
619
- _this.hasError = _this.isStopped = true;
620
- _this.thrownError = err;
621
- var observers = _this.observers;
622
- while (observers.length) {
623
- observers.shift().error(err);
624
- }
625
- }
626
- });
627
- };
628
- Subject2.prototype.complete = function() {
629
- var _this = this;
630
- errorContext(function() {
631
- _this._throwIfClosed();
632
- if (!_this.isStopped) {
633
- _this.isStopped = true;
634
- var observers = _this.observers;
635
- while (observers.length) {
636
- observers.shift().complete();
637
- }
638
- }
639
- });
640
- };
641
- Subject2.prototype.unsubscribe = function() {
642
- this.isStopped = this.closed = true;
643
- this.observers = this.currentObservers = null;
644
- };
645
- Object.defineProperty(Subject2.prototype, "observed", {
646
- get: function() {
647
- var _a;
648
- return ((_a = this.observers) === null || _a === void 0 ? void 0 : _a.length) > 0;
649
- },
650
- enumerable: false,
651
- configurable: true
652
- });
653
- Subject2.prototype._trySubscribe = function(subscriber) {
654
- this._throwIfClosed();
655
- return _super.prototype._trySubscribe.call(this, subscriber);
656
- };
657
- Subject2.prototype._subscribe = function(subscriber) {
658
- this._throwIfClosed();
659
- this._checkFinalizedStatuses(subscriber);
660
- return this._innerSubscribe(subscriber);
661
- };
662
- Subject2.prototype._innerSubscribe = function(subscriber) {
663
- var _this = this;
664
- var _a = this, hasError = _a.hasError, isStopped = _a.isStopped, observers = _a.observers;
665
- if (hasError || isStopped) {
666
- return EMPTY_SUBSCRIPTION;
667
- }
668
- this.currentObservers = null;
669
- observers.push(subscriber);
670
- return new Subscription(function() {
671
- _this.currentObservers = null;
672
- arrRemove(observers, subscriber);
673
- });
674
- };
675
- Subject2.prototype._checkFinalizedStatuses = function(subscriber) {
676
- var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, isStopped = _a.isStopped;
677
- if (hasError) {
678
- subscriber.error(thrownError);
679
- } else if (isStopped) {
680
- subscriber.complete();
681
- }
682
- };
683
- Subject2.prototype.asObservable = function() {
684
- var observable2 = new Observable();
685
- observable2.source = this;
686
- return observable2;
687
- };
688
- Subject2.create = function(destination, source) {
689
- return new AnonymousSubject(destination, source);
690
- };
691
- return Subject2;
692
- })(Observable);
693
- var AnonymousSubject = (function(_super) {
694
- __extends(AnonymousSubject2, _super);
695
- function AnonymousSubject2(destination, source) {
696
- var _this = _super.call(this) || this;
697
- _this.destination = destination;
698
- _this.source = source;
699
- return _this;
700
- }
701
- AnonymousSubject2.prototype.next = function(value) {
702
- var _a, _b;
703
- (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.next) === null || _b === void 0 ? void 0 : _b.call(_a, value);
704
- };
705
- AnonymousSubject2.prototype.error = function(err) {
706
- var _a, _b;
707
- (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.error) === null || _b === void 0 ? void 0 : _b.call(_a, err);
708
- };
709
- AnonymousSubject2.prototype.complete = function() {
710
- var _a, _b;
711
- (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.complete) === null || _b === void 0 ? void 0 : _b.call(_a);
712
- };
713
- AnonymousSubject2.prototype._subscribe = function(subscriber) {
714
- var _a, _b;
715
- return (_b = (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber)) !== null && _b !== void 0 ? _b : EMPTY_SUBSCRIPTION;
716
- };
717
- return AnonymousSubject2;
718
- })(Subject);
719
- var EMPTY = new Observable(function(subscriber) {
720
- return subscriber.complete();
721
- });
722
- function filter(predicate, thisArg) {
723
- return operate(function(source, subscriber) {
724
- var index = 0;
725
- source.subscribe(createOperatorSubscriber(subscriber, function(value) {
726
- return predicate.call(thisArg, value, index++) && subscriber.next(value);
727
- }));
728
- });
729
- }
730
- function take(count) {
731
- return count <= 0 ? function() {
732
- return EMPTY;
733
- } : operate(function(source, subscriber) {
734
- var seen = 0;
735
- source.subscribe(createOperatorSubscriber(subscriber, function(value) {
736
- if (++seen <= count) {
737
- subscriber.next(value);
738
- if (count <= seen) {
739
- subscriber.complete();
740
- }
741
- }
742
- }));
743
- });
744
- }
745
- var __defProp = Object.defineProperty;
746
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
747
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
748
- var logger = createLogger("agentx/DefinitionManager");
749
- function generateMetaImageId(definitionName) {
750
- return `meta_${definitionName}`;
751
- }
752
- function toDefinitionRecord(definition) {
753
- const now = /* @__PURE__ */ new Date();
754
- return {
755
- name: definition.name,
756
- description: definition.description,
757
- systemPrompt: definition.systemPrompt,
758
- definition,
759
- source: "code",
760
- createdAt: now,
761
- updatedAt: now
762
- };
763
- }
764
- var DefinitionManagerImpl = class {
765
- constructor(repository) {
766
- this.repository = repository;
767
- __publicField(this, "cache", /* @__PURE__ */ new Map());
768
- }
769
- register(definition) {
770
- if (this.cache.has(definition.name)) {
771
- throw new Error(`Definition already exists: ${definition.name}`);
772
- }
773
- this.cache.set(definition.name, definition);
774
- const definitionRecord = toDefinitionRecord(definition);
775
- this.repository.saveDefinition(definitionRecord).catch((err) => {
776
- logger.error("Failed to save definition", { name: definition.name, error: err });
777
- });
778
- const metaImageId = generateMetaImageId(definition.name);
779
- const imageRecord = {
780
- imageId: metaImageId,
781
- type: "meta",
782
- definitionName: definition.name,
783
- parentImageId: null,
784
- definition,
785
- config: {},
786
- messages: [],
787
- createdAt: /* @__PURE__ */ new Date()
788
- };
789
- this.repository.saveImage(imageRecord).catch((err) => {
790
- logger.error("Failed to save MetaImage", { definitionName: definition.name, error: err });
791
- });
792
- logger.info("Definition registered", {
793
- name: definition.name,
794
- metaImageId
795
- });
796
- }
797
- get(name) {
798
- return this.cache.get(name);
799
- }
800
- list() {
801
- return Array.from(this.cache.values());
802
- }
803
- has(name) {
804
- return this.cache.has(name);
805
- }
806
- unregister(name) {
807
- const definition = this.cache.get(name);
808
- if (!definition) {
809
- return false;
810
- }
811
- this.cache.delete(name);
812
- this.repository.deleteDefinition(name).catch((err) => {
813
- logger.error("Failed to delete definition", { name, error: err });
814
- });
815
- const metaImageId = generateMetaImageId(name);
816
- this.repository.deleteImage(metaImageId).catch((err) => {
817
- logger.error("Failed to delete MetaImage", { definitionName: name, error: err });
818
- });
819
- logger.info("Definition unregistered", { name });
820
- return true;
821
- }
822
- };
823
- var logger2 = createLogger("agentx/ImageManager");
824
- function generateMetaImageId2(definitionName) {
825
- return `meta_${definitionName}`;
826
- }
827
- function toAgentImage(record) {
828
- const definition = record.definition;
829
- if (record.type === "meta") {
830
- const metaImage = {
831
- type: "meta",
832
- imageId: record.imageId,
833
- definitionName: record.definitionName,
834
- definition,
835
- config: record.config,
836
- messages: [],
837
- createdAt: record.createdAt
838
- };
839
- return metaImage;
840
- } else {
841
- return {
842
- type: "derived",
843
- imageId: record.imageId,
844
- parentImageId: record.parentImageId,
845
- definitionName: record.definitionName,
846
- definition,
847
- config: record.config,
848
- messages: record.messages,
849
- createdAt: record.createdAt
850
- };
851
- }
852
- }
853
- var ImageManagerImpl = class {
854
- constructor(repository, containerManager, defaultContainerId) {
855
- __publicField(this, "repository");
856
- __publicField(this, "containerManager");
857
- __publicField(this, "defaultContainerId");
858
- this.repository = repository;
859
- this.containerManager = containerManager;
860
- this.defaultContainerId = defaultContainerId;
861
- }
862
- async get(imageId) {
863
- const record = await this.repository.findImageById(imageId);
864
- if (!record) {
865
- return void 0;
866
- }
867
- return toAgentImage(record);
868
- }
869
- async getMetaImage(definitionName) {
870
- const metaImageId = generateMetaImageId2(definitionName);
871
- const record = await this.repository.findImageById(metaImageId);
872
- if (!record || record.type !== "meta") {
873
- return void 0;
874
- }
875
- return toAgentImage(record);
876
- }
877
- async list() {
878
- const records = await this.repository.findAllImages();
879
- return records.map(toAgentImage);
880
- }
881
- async listByDefinition(definitionName) {
882
- const allRecords = await this.repository.findAllImages();
883
- const filtered = allRecords.filter((r) => r.definitionName === definitionName);
884
- return filtered.map(toAgentImage);
885
- }
886
- async exists(imageId) {
887
- return this.repository.imageExists(imageId);
888
- }
889
- async delete(imageId) {
890
- const record = await this.repository.findImageById(imageId);
891
- if (!record) {
892
- return false;
893
- }
894
- if (record.type === "meta") {
895
- logger2.warn("Cannot delete MetaImage directly", { imageId });
896
- return false;
897
- }
898
- await this.repository.deleteImage(imageId);
899
- logger2.info("Image deleted", { imageId });
900
- return true;
901
- }
902
- async run(imageId, options) {
903
- logger2.info("Running agent from image", { imageId, containerId: options == null ? void 0 : options.containerId });
904
- const image = await this.get(imageId);
905
- if (!image) {
906
- throw new Error(`Image not found: ${imageId}`);
907
- }
908
- let containerId = (options == null ? void 0 : options.containerId) || this.defaultContainerId;
909
- if (!containerId) {
910
- const container = await this.containerManager.create();
911
- containerId = container.containerId;
912
- this.defaultContainerId = containerId;
913
- logger2.debug("Auto-created default container", { containerId });
914
- }
915
- return this.containerManager.run(image, containerId);
916
- }
917
- };
918
- var logger3 = createLogger("agentx/AgentManager");
919
- var AgentManager = class {
920
- constructor(containerManager) {
921
- this.containerManager = containerManager;
922
- }
923
- /**
924
- * Get an existing agent by ID
925
- */
926
- get(agentId) {
927
- return this.containerManager.getAgent(agentId);
928
- }
929
- /**
930
- * Check if an agent exists
931
- */
932
- has(agentId) {
933
- return this.containerManager.hasAgent(agentId);
934
- }
935
- /**
936
- * List all agents
937
- */
938
- list() {
939
- return this.containerManager.listAgents();
940
- }
941
- /**
942
- * Destroy an agent by ID
943
- */
944
- async destroy(agentId) {
945
- logger3.debug("Destroying agent", { agentId });
946
- await this.containerManager.destroyAgent(agentId);
947
- logger3.info("Agent destroyed", { agentId });
948
- }
949
- /**
950
- * Destroy all agents
951
- */
952
- async destroyAll() {
953
- const agents = this.containerManager.listAgents();
954
- logger3.debug("Destroying all agents", { count: agents.length });
955
- await this.containerManager.destroyAllAgents();
956
- logger3.info("All agents destroyed", { count: agents.length });
957
- }
958
- };
959
- var logger4 = createLogger("agentx/SessionManager");
960
- function generateSessionId() {
961
- const timestamp = Date.now().toString(36);
962
- const random = Math.random().toString(36).substring(2, 8);
963
- return `session_${timestamp}_${random}`;
964
- }
965
- function generateImageId() {
966
- const timestamp = Date.now().toString(36);
967
- const random = Math.random().toString(36).substring(2, 8);
968
- return `image_${timestamp}_${random}`;
969
- }
970
- var SessionImpl = class _SessionImpl {
971
- constructor(record, repository, containerManager, defaultContainerId) {
972
- __publicField(this, "sessionId");
973
- __publicField(this, "userId");
974
- __publicField(this, "imageId");
975
- __publicField(this, "createdAt");
976
- __publicField(this, "_title");
977
- __publicField(this, "_updatedAt");
978
- __publicField(this, "repository");
979
- __publicField(this, "containerManager");
980
- __publicField(this, "defaultContainerId");
981
- this.sessionId = record.sessionId;
982
- this.userId = record.userId;
983
- this.imageId = record.imageId;
984
- this._title = record.title;
985
- this.createdAt = record.createdAt.getTime();
986
- this._updatedAt = record.updatedAt.getTime();
987
- this.repository = repository;
988
- this.containerManager = containerManager;
989
- this.defaultContainerId = defaultContainerId;
990
- }
991
- get title() {
992
- return this._title;
993
- }
994
- get updatedAt() {
995
- return this._updatedAt;
996
- }
997
- async resume(options) {
998
- logger4.info("Resuming agent from session", {
999
- sessionId: this.sessionId,
1000
- imageId: this.imageId,
1001
- containerId: options == null ? void 0 : options.containerId
1002
- });
1003
- let containerId = (options == null ? void 0 : options.containerId) || this.defaultContainerId;
1004
- if (!containerId) {
1005
- const container = await this.containerManager.create();
1006
- containerId = container.containerId;
1007
- logger4.debug("Auto-created default container for session", {
1008
- containerId,
1009
- sessionId: this.sessionId
1010
- });
1011
- }
1012
- const agent = await this.containerManager.resume(this, containerId);
1013
- this.collect(agent);
1014
- return agent;
1015
- }
1016
- collect(agent) {
1017
- logger4.debug("Collecting messages from agent", {
1018
- sessionId: this.sessionId,
1019
- agentId: agent.agentId
1020
- });
1021
- const sessionId = this.sessionId;
1022
- const repository = this.repository;
1023
- const saveMessage = (data, role) => {
1024
- const record = {
1025
- messageId: data.id,
1026
- sessionId,
1027
- role,
1028
- content: data,
1029
- createdAt: new Date(data.timestamp ?? Date.now())
1030
- };
1031
- repository.saveMessage(record).catch((error) => {
1032
- logger4.error("Failed to persist message", {
1033
- sessionId,
1034
- messageId: record.messageId,
1035
- error
1036
- });
1037
- });
1038
- };
1039
- agent.on("user_message", (event) => saveMessage(event.data, "user"));
1040
- agent.on("assistant_message", (event) => saveMessage(event.data, "assistant"));
1041
- agent.on("tool_call_message", (event) => saveMessage(event.data, "tool"));
1042
- agent.on("tool_result_message", (event) => saveMessage(event.data, "tool"));
1043
- }
1044
- async getMessages() {
1045
- logger4.debug("Getting messages for session", { sessionId: this.sessionId });
1046
- const records = await this.repository.findMessagesBySessionId(this.sessionId);
1047
- return records.map((record) => record.content);
1048
- }
1049
- async fork() {
1050
- logger4.info("Forking session", { sessionId: this.sessionId });
1051
- const imageRecord = await this.repository.findImageById(this.imageId);
1052
- if (!imageRecord) {
1053
- throw new Error(`Image not found: ${this.imageId}`);
1054
- }
1055
- const newImageId = generateImageId();
1056
- const newImageRecord = {
1057
- imageId: newImageId,
1058
- type: "derived",
1059
- definitionName: imageRecord.definitionName,
1060
- parentImageId: imageRecord.imageId,
1061
- definition: imageRecord.definition,
1062
- config: imageRecord.config,
1063
- messages: [...imageRecord.messages],
1064
- // Copy messages
1065
- createdAt: /* @__PURE__ */ new Date()
1066
- };
1067
- await this.repository.saveImage(newImageRecord);
1068
- const newSessionId = generateSessionId();
1069
- const now = /* @__PURE__ */ new Date();
1070
- const newSessionRecord = {
1071
- sessionId: newSessionId,
1072
- userId: this.userId,
1073
- imageId: newImageId,
1074
- title: this._title ? `Fork of ${this._title}` : null,
1075
- createdAt: now,
1076
- updatedAt: now
1077
- };
1078
- await this.repository.saveSession(newSessionRecord);
1079
- logger4.info("Session forked", {
1080
- originalSessionId: this.sessionId,
1081
- newSessionId,
1082
- newImageId
1083
- });
1084
- return new _SessionImpl(
1085
- newSessionRecord,
1086
- this.repository,
1087
- this.containerManager,
1088
- this.defaultContainerId
1089
- );
1090
- }
1091
- async setTitle(title) {
1092
- logger4.debug("Setting session title", { sessionId: this.sessionId, title });
1093
- const now = /* @__PURE__ */ new Date();
1094
- await this.repository.saveSession({
1095
- sessionId: this.sessionId,
1096
- userId: this.userId,
1097
- imageId: this.imageId,
1098
- title,
1099
- createdAt: new Date(this.createdAt),
1100
- updatedAt: now
1101
- });
1102
- this._title = title;
1103
- this._updatedAt = now.getTime();
1104
- logger4.info("Session title updated", { sessionId: this.sessionId, title });
1105
- }
1106
- };
1107
- var SessionManagerImpl = class {
1108
- constructor(repository, containerManager, defaultContainerId) {
1109
- __publicField(this, "repository");
1110
- __publicField(this, "containerManager");
1111
- __publicField(this, "defaultContainerId");
1112
- this.repository = repository;
1113
- this.containerManager = containerManager;
1114
- this.defaultContainerId = defaultContainerId;
1115
- }
1116
- async create(imageId, userId) {
1117
- const sessionId = generateSessionId();
1118
- const now = /* @__PURE__ */ new Date();
1119
- const record = {
1120
- sessionId,
1121
- userId,
1122
- imageId,
1123
- title: null,
1124
- createdAt: now,
1125
- updatedAt: now
1126
- };
1127
- await this.repository.saveSession(record);
1128
- logger4.info("Session created", { sessionId, imageId, userId });
1129
- return new SessionImpl(record, this.repository, this.containerManager, this.defaultContainerId);
1130
- }
1131
- async get(sessionId) {
1132
- const record = await this.repository.findSessionById(sessionId);
1133
- if (!record) return void 0;
1134
- return new SessionImpl(record, this.repository, this.containerManager, this.defaultContainerId);
1135
- }
1136
- async has(sessionId) {
1137
- return this.repository.sessionExists(sessionId);
1138
- }
1139
- async list() {
1140
- const records = await this.repository.findAllSessions();
1141
- return records.map(
1142
- (r) => new SessionImpl(r, this.repository, this.containerManager, this.defaultContainerId)
1143
- );
1144
- }
1145
- async listByImage(imageId) {
1146
- const records = await this.repository.findSessionsByImageId(imageId);
1147
- return records.map(
1148
- (r) => new SessionImpl(r, this.repository, this.containerManager, this.defaultContainerId)
1149
- );
1150
- }
1151
- async listByUser(userId) {
1152
- const records = await this.repository.findSessionsByUserId(userId);
1153
- return records.map(
1154
- (r) => new SessionImpl(r, this.repository, this.containerManager, this.defaultContainerId)
1155
- );
1156
- }
1157
- async destroy(sessionId) {
1158
- await this.repository.deleteSession(sessionId);
1159
- logger4.info("Session destroyed", { sessionId });
1160
- }
1161
- async destroyByImage(imageId) {
1162
- await this.repository.deleteSessionsByImageId(imageId);
1163
- logger4.info("Sessions destroyed by image", { imageId });
1164
- }
1165
- async destroyAll() {
1166
- const sessions = await this.repository.findAllSessions();
1167
- for (const session of sessions) {
1168
- await this.repository.deleteSession(session.sessionId);
1169
- }
1170
- logger4.info("All sessions destroyed");
1171
- }
1172
- };
1173
- var logger5 = createLogger("agentx/ErrorManager");
1174
- var ErrorManager = class {
1175
- constructor() {
1176
- __publicField(this, "handlers", /* @__PURE__ */ new Set());
1177
- }
1178
- /**
1179
- * Handle an error from any agent
1180
- *
1181
- * Called internally when an agent emits an error event.
1182
- * 1. Default logging (always)
1183
- * 2. Custom handlers (user-registered)
1184
- */
1185
- handle(agentId, error, event) {
1186
- this.logError(agentId, error);
1187
- for (const handler of this.handlers) {
1188
- try {
1189
- handler.handle(agentId, error, event);
1190
- } catch (e) {
1191
- logger5.error("ErrorHandler failed", { error: e });
1192
- }
1193
- }
1194
- }
1195
- /**
1196
- * Add a custom error handler
1197
- */
1198
- addHandler(handler) {
1199
- this.handlers.add(handler);
1200
- return () => {
1201
- this.handlers.delete(handler);
1202
- };
1203
- }
1204
- /**
1205
- * Remove an error handler
1206
- */
1207
- removeHandler(handler) {
1208
- this.handlers.delete(handler);
1209
- }
1210
- /**
1211
- * Default error logging
1212
- */
1213
- logError(agentId, error) {
1214
- const prefix = `[${agentId}] ${error.category}/${error.code}`;
1215
- if (error.severity === "fatal") {
1216
- logger5.error(`${prefix}: ${error.message}`, { error });
1217
- } else if (error.severity === "error") {
1218
- logger5.error(`${prefix}: ${error.message}`);
1219
- } else {
1220
- logger5.warn(`${prefix}: ${error.message}`);
1221
- }
1222
- }
1223
- };
1224
- var logger6 = createLogger("core/AgentStateMachine");
1225
- var AgentStateMachine = class {
1226
- constructor() {
1227
- __publicField(this, "_state", "idle");
1228
- __publicField(this, "handlers", /* @__PURE__ */ new Set());
1229
- }
1230
- /**
1231
- * Current agent state
1232
- */
1233
- get state() {
1234
- return this._state;
1235
- }
1236
- /**
1237
- * Process a StateEvent and update internal state
1238
- *
1239
- * @param event - StateEvent from Engine layer
1240
- */
1241
- process(event) {
1242
- const prev = this._state;
1243
- const next = this.mapEventToState(event);
1244
- if (next !== null && prev !== next) {
1245
- this._state = next;
1246
- logger6.debug("State transition", {
1247
- eventType: event.type,
1248
- from: prev,
1249
- to: next
1250
- });
1251
- this.notifyHandlers({ prev, current: next });
1252
- }
1253
- }
1254
- /**
1255
- * Subscribe to state changes
1256
- *
1257
- * @param handler - Callback receiving { prev, current } state change
1258
- * @returns Unsubscribe function
1259
- */
1260
- onStateChange(handler) {
1261
- this.handlers.add(handler);
1262
- return () => {
1263
- this.handlers.delete(handler);
1264
- };
1265
- }
1266
- /**
1267
- * Reset state machine (used on destroy)
1268
- */
1269
- reset() {
1270
- this._state;
1271
- this._state = "idle";
1272
- this.handlers.clear();
1273
- }
1274
- /**
1275
- * Map StateEvent type to AgentState
1276
- *
1277
- * @param event - StateEvent from Engine
1278
- * @returns New AgentState or null if no transition needed
1279
- */
1280
- mapEventToState(event) {
1281
- switch (event.type) {
1282
- // Agent lifecycle
1283
- case "agent_initializing":
1284
- return "initializing";
1285
- case "agent_ready":
1286
- return "idle";
1287
- case "agent_destroyed":
1288
- return "idle";
1289
- // Conversation lifecycle
1290
- case "conversation_queued":
1291
- return "queued";
1292
- case "conversation_start":
1293
- return "conversation_active";
1294
- case "conversation_thinking":
1295
- return "thinking";
1296
- case "conversation_responding":
1297
- return "responding";
1298
- case "conversation_end":
1299
- return "idle";
1300
- case "conversation_interrupted":
1301
- return "idle";
1302
- // Return to idle on interrupt
1303
- // Tool lifecycle
1304
- case "tool_planned":
1305
- return "planning_tool";
1306
- case "tool_executing":
1307
- return "awaiting_tool_result";
1308
- case "tool_completed":
1309
- return "responding";
1310
- // Back to responding after tool completes
1311
- case "tool_failed":
1312
- return "responding";
1313
- // Continue responding after tool failure
1314
- // Error
1315
- case "error_occurred":
1316
- return "idle";
1317
- // Reset to idle on error
1318
- default:
1319
- return null;
1320
- }
1321
- }
1322
- /**
1323
- * Notify all registered handlers of state change
1324
- */
1325
- notifyHandlers(change) {
1326
- for (const handler of this.handlers) {
1327
- try {
1328
- handler(change);
1329
- } catch (error) {
1330
- logger6.error("State change handler error", {
1331
- from: change.prev,
1332
- to: change.current,
1333
- error
1334
- });
1335
- }
1336
- }
1337
- }
1338
- };
1339
- var logger22 = createLogger("core/AgentEventBus");
1340
- var AgentEventBus = class {
1341
- constructor() {
1342
- __publicField(this, "subject", new Subject());
1343
- __publicField(this, "typeSubscriptions", /* @__PURE__ */ new Map());
1344
- __publicField(this, "globalSubscriptions", []);
1345
- __publicField(this, "nextId", 0);
1346
- __publicField(this, "isDestroyed", false);
1347
- __publicField(this, "producerView", null);
1348
- __publicField(this, "consumerView", null);
1349
- }
1350
- // ===== Producer Methods =====
1351
- emit(event) {
1352
- if (this.isDestroyed) {
1353
- logger22.warn("Emit called on destroyed EventBus", { eventType: event.type });
1354
- return;
1355
- }
1356
- this.subject.next(event);
1357
- }
1358
- emitBatch(events) {
1359
- for (const event of events) {
1360
- this.emit(event);
1361
- }
1362
- }
1363
- on(typeOrTypes, handler, options = {}) {
1364
- if (this.isDestroyed) {
1365
- logger22.warn("Subscribe called on destroyed EventBus");
1366
- return () => {
1367
- };
1368
- }
1369
- const types = Array.isArray(typeOrTypes) ? typeOrTypes : [typeOrTypes];
1370
- const unsubscribes = [];
1371
- for (const type of types) {
1372
- const unsub = this.subscribeToType(type, handler, options);
1373
- unsubscribes.push(unsub);
1374
- }
1375
- return () => unsubscribes.forEach((u) => u());
1376
- }
1377
- onAny(handler, options = {}) {
1378
- if (this.isDestroyed) {
1379
- logger22.warn("Subscribe called on destroyed EventBus");
1380
- return () => {
1381
- };
1382
- }
1383
- return this.subscribeGlobal(handler, options);
1384
- }
1385
- once(type, handler) {
1386
- return this.on(type, handler, { once: true });
1387
- }
1388
- // ===== View Methods =====
1389
- asConsumer() {
1390
- if (!this.consumerView) {
1391
- this.consumerView = {
1392
- on: this.on.bind(this),
1393
- onAny: this.onAny.bind(this),
1394
- once: this.once.bind(this)
1395
- };
1396
- }
1397
- return this.consumerView;
1398
- }
1399
- asProducer() {
1400
- if (!this.producerView) {
1401
- this.producerView = {
1402
- emit: this.emit.bind(this),
1403
- emitBatch: this.emitBatch.bind(this)
1404
- };
1405
- }
1406
- return this.producerView;
1407
- }
1408
- // ===== Lifecycle =====
1409
- destroy() {
1410
- if (this.isDestroyed) return;
1411
- this.isDestroyed = true;
1412
- for (const records of this.typeSubscriptions.values()) {
1413
- for (const record of records) {
1414
- record.unsubscribe();
1415
- }
1416
- }
1417
- this.typeSubscriptions.clear();
1418
- for (const record of this.globalSubscriptions) {
1419
- record.unsubscribe();
1420
- }
1421
- this.globalSubscriptions.length = 0;
1422
- this.subject.complete();
1423
- logger22.debug("EventBus destroyed");
1424
- }
1425
- // ===== Private Methods =====
1426
- subscribeToType(type, handler, options) {
1427
- const { filter: filter$1, priority = 0, once = false } = options;
1428
- const id = this.nextId++;
1429
- let observable2 = this.subject.pipe(filter((e) => e.type === type));
1430
- if (filter$1) {
1431
- observable2 = observable2.pipe(filter(filter$1));
1432
- }
1433
- if (once) {
1434
- observable2 = observable2.pipe(take(1));
1435
- }
1436
- const subscription = observable2.subscribe({
1437
- next: (event) => {
1438
- this.executeWithPriority(type, event, handler, id);
1439
- }
1440
- });
1441
- const unsubscribe = () => {
1442
- subscription.unsubscribe();
1443
- const records2 = this.typeSubscriptions.get(type);
1444
- if (records2) {
1445
- const idx = records2.findIndex((r) => r.id === id);
1446
- if (idx !== -1) records2.splice(idx, 1);
1447
- }
1448
- };
1449
- if (!this.typeSubscriptions.has(type)) {
1450
- this.typeSubscriptions.set(type, []);
1451
- }
1452
- const record = { id, priority, handler, unsubscribe };
1453
- const records = this.typeSubscriptions.get(type);
1454
- records.push(record);
1455
- records.sort((a, b) => b.priority - a.priority);
1456
- return unsubscribe;
1457
- }
1458
- subscribeGlobal(handler, options) {
1459
- const { filter: filter$1, priority = 0, once = false } = options;
1460
- const id = this.nextId++;
1461
- let observable2 = this.subject.asObservable();
1462
- if (filter$1) {
1463
- observable2 = observable2.pipe(filter(filter$1));
1464
- }
1465
- if (once) {
1466
- observable2 = observable2.pipe(take(1));
1467
- }
1468
- const subscription = observable2.subscribe({
1469
- next: (event) => {
1470
- this.executeGlobalWithPriority(event, handler, id);
1471
- }
1472
- });
1473
- const unsubscribe = () => {
1474
- subscription.unsubscribe();
1475
- const idx = this.globalSubscriptions.findIndex((r) => r.id === id);
1476
- if (idx !== -1) this.globalSubscriptions.splice(idx, 1);
1477
- };
1478
- const record = { id, priority, handler, unsubscribe };
1479
- this.globalSubscriptions.push(record);
1480
- this.globalSubscriptions.sort((a, b) => b.priority - a.priority);
1481
- return unsubscribe;
1482
- }
1483
- /**
1484
- * Execute handler respecting priority order for typed subscriptions
1485
- */
1486
- executeWithPriority(type, event, handler, handlerId) {
1487
- const records = this.typeSubscriptions.get(type) || [];
1488
- const record = records.find((r) => r.id === handlerId);
1489
- if (record) {
1490
- try {
1491
- handler(event);
1492
- } catch (error) {
1493
- logger22.error("Event handler error", { eventType: type, error });
1494
- }
1495
- }
1496
- }
1497
- /**
1498
- * Execute handler respecting priority order for global subscriptions
1499
- */
1500
- executeGlobalWithPriority(event, handler, handlerId) {
1501
- const record = this.globalSubscriptions.find((r) => r.id === handlerId);
1502
- if (record) {
1503
- try {
1504
- handler(event);
1505
- } catch (error) {
1506
- logger22.error("Global event handler error", { eventType: event.type, error });
1507
- }
1508
- }
1509
- }
1510
- };
1511
- var AgentErrorClassifier = class {
1512
- constructor(agentId) {
1513
- this.agentId = agentId;
1514
- }
1515
- /**
1516
- * Classify an unknown error into an AgentError
1517
- */
1518
- classify(error) {
1519
- const err = error instanceof Error ? error : new Error(String(error));
1520
- const message = err.message;
1521
- if (message.includes("rate limit") || message.includes("429")) {
1522
- return this.create("llm", "RATE_LIMITED", message, true, err);
1523
- }
1524
- if (message.includes("api key") || message.includes("401") || message.includes("unauthorized")) {
1525
- return this.create("llm", "INVALID_API_KEY", message, false, err);
1526
- }
1527
- if (message.includes("context") && message.includes("long")) {
1528
- return this.create("llm", "CONTEXT_TOO_LONG", message, true, err);
1529
- }
1530
- if (message.includes("overloaded") || message.includes("503")) {
1531
- return this.create("llm", "OVERLOADED", message, true, err);
1532
- }
1533
- if (message.includes("timeout") || message.includes("ETIMEDOUT")) {
1534
- return this.create("network", "TIMEOUT", message, true, err);
1535
- }
1536
- if (message.includes("ECONNREFUSED") || message.includes("connection")) {
1537
- return this.create("network", "CONNECTION_FAILED", message, true, err);
1538
- }
1539
- if (message.includes("network") || message.includes("fetch")) {
1540
- return this.create("network", "CONNECTION_FAILED", message, true, err);
1541
- }
1542
- if (message.includes("driver")) {
1543
- return this.create("driver", "RECEIVE_FAILED", message, true, err);
1544
- }
1545
- return this.create("system", "UNKNOWN", message, true, err);
1546
- }
1547
- /**
1548
- * Create an AgentError with the specified category and code
1549
- */
1550
- create(category, code, message, recoverable, cause) {
1551
- return {
1552
- category,
1553
- code,
1554
- message,
1555
- severity: recoverable ? "error" : "fatal",
1556
- recoverable,
1557
- cause
1558
- };
1559
- }
1560
- /**
1561
- * Create an ErrorEvent from an AgentError
1562
- *
1563
- * ErrorEvent is independent from Message layer and transportable via SSE.
1564
- */
1565
- createEvent(error) {
1566
- return {
1567
- type: "error",
1568
- uuid: `${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,
1569
- agentId: this.agentId,
1570
- timestamp: Date.now(),
1571
- data: {
1572
- error
1573
- }
1574
- };
1575
- }
1576
- };
1577
- var MiddlewareChain = class {
1578
- constructor() {
1579
- __publicField(this, "middlewares", []);
1580
- }
1581
- /**
1582
- * Add middleware to the chain
1583
- *
1584
- * @param middleware - Middleware function
1585
- * @returns Unsubscribe function to remove the middleware
1586
- */
1587
- use(middleware) {
1588
- this.middlewares.push(middleware);
1589
- return () => {
1590
- const index = this.middlewares.indexOf(middleware);
1591
- if (index !== -1) {
1592
- this.middlewares.splice(index, 1);
1593
- }
1594
- };
1595
- }
1596
- /**
1597
- * Execute the middleware chain
1598
- *
1599
- * @param message - User message to process
1600
- * @param finalHandler - Handler called at the end of the chain
1601
- */
1602
- async execute(message, finalHandler) {
1603
- let index = 0;
1604
- const next = async (msg) => {
1605
- if (index < this.middlewares.length) {
1606
- const middleware = this.middlewares[index++];
1607
- await middleware(msg, next);
1608
- } else {
1609
- await finalHandler(msg);
1610
- }
1611
- };
1612
- await next(message);
1613
- }
1614
- /**
1615
- * Clear all middlewares
1616
- */
1617
- clear() {
1618
- this.middlewares.length = 0;
1619
- }
1620
- /**
1621
- * Get the number of middlewares
1622
- */
1623
- get size() {
1624
- return this.middlewares.length;
1625
- }
1626
- };
1627
- var logger32 = createLogger("core/InterceptorChain");
1628
- var InterceptorChain = class {
1629
- constructor(agentId) {
1630
- __publicField(this, "interceptors", []);
1631
- __publicField(this, "agentId");
1632
- this.agentId = agentId;
1633
- }
1634
- /**
1635
- * Add interceptor to the chain
1636
- *
1637
- * @param interceptor - Interceptor function
1638
- * @returns Unsubscribe function to remove the interceptor
1639
- */
1640
- intercept(interceptor) {
1641
- this.interceptors.push(interceptor);
1642
- return () => {
1643
- const index = this.interceptors.indexOf(interceptor);
1644
- if (index !== -1) {
1645
- this.interceptors.splice(index, 1);
1646
- }
1647
- };
1648
- }
1649
- /**
1650
- * Execute the interceptor chain
1651
- *
1652
- * @param event - Event to process
1653
- * @param finalHandler - Handler called at the end of the chain
1654
- */
1655
- execute(event, finalHandler) {
1656
- let index = 0;
1657
- const next = (e) => {
1658
- if (index < this.interceptors.length) {
1659
- const interceptor = this.interceptors[index++];
1660
- try {
1661
- interceptor(e, next);
1662
- } catch (error) {
1663
- logger32.error("Interceptor error", {
1664
- agentId: this.agentId,
1665
- eventType: e.type,
1666
- interceptorIndex: index - 1,
1667
- error
1668
- });
1669
- next(e);
1670
- }
1671
- } else {
1672
- finalHandler(e);
1673
- }
1674
- };
1675
- next(event);
1676
- }
1677
- /**
1678
- * Clear all interceptors
1679
- */
1680
- clear() {
1681
- this.interceptors.length = 0;
1682
- }
1683
- /**
1684
- * Get the number of interceptors
1685
- */
1686
- get size() {
1687
- return this.interceptors.length;
1688
- }
1689
- };
1690
- var REACT_TO_EVENT_MAP = {
1691
- // Stream Layer Events
1692
- onMessageStart: "message_start",
1693
- onMessageDelta: "message_delta",
1694
- onMessageStop: "message_stop",
1695
- onTextContentBlockStart: "text_content_block_start",
1696
- onTextDelta: "text_delta",
1697
- onTextContentBlockStop: "text_content_block_stop",
1698
- onToolUseContentBlockStart: "tool_use_content_block_start",
1699
- onInputJsonDelta: "input_json_delta",
1700
- onToolUseContentBlockStop: "tool_use_content_block_stop",
1701
- onToolCall: "tool_call",
1702
- onToolResult: "tool_result",
1703
- // Message Layer Events
1704
- onUserMessage: "user_message",
1705
- onAssistantMessage: "assistant_message",
1706
- onToolCallMessage: "tool_call_message",
1707
- onToolResultMessage: "tool_result_message",
1708
- // Error Layer Events (independent, transportable via SSE)
1709
- onError: "error",
1710
- // Turn Layer Events
1711
- onTurnRequest: "turn_request",
1712
- onTurnResponse: "turn_response"
1713
- };
1714
- function mapReactHandlers(reactHandlers) {
1715
- const eventHandlerMap = {};
1716
- for (const [reactKey, eventKey] of Object.entries(REACT_TO_EVENT_MAP)) {
1717
- const handler = reactHandlers[reactKey];
1718
- if (handler) {
1719
- eventHandlerMap[eventKey] = handler;
1720
- }
1721
- }
1722
- return eventHandlerMap;
1723
- }
1724
- var logger42 = createLogger("core/AgentInstance");
1725
- var AgentInstance = class {
1726
- constructor(definition, context, engine, driver, sandbox) {
1727
- __publicField(this, "agentId");
1728
- __publicField(this, "definition");
1729
- __publicField(this, "context");
1730
- __publicField(this, "createdAt");
1731
- __publicField(this, "sandbox");
1732
- __publicField(this, "_lifecycle", "running");
1733
- __publicField(this, "engine");
1734
- __publicField(this, "driver");
1735
- __publicField(this, "stateMachine", new AgentStateMachine());
1736
- __publicField(this, "eventBus", new AgentEventBus());
1737
- __publicField(this, "errorClassifier");
1738
- __publicField(this, "middlewareChain", new MiddlewareChain());
1739
- __publicField(this, "interceptorChain");
1740
- __publicField(this, "readyHandlers", /* @__PURE__ */ new Set());
1741
- __publicField(this, "destroyHandlers", /* @__PURE__ */ new Set());
1742
- this.agentId = context.agentId;
1743
- this.definition = definition;
1744
- this.context = context;
1745
- this.engine = engine;
1746
- this.createdAt = context.createdAt;
1747
- this.sandbox = sandbox;
1748
- this.driver = driver;
1749
- this.errorClassifier = new AgentErrorClassifier(this.agentId);
1750
- this.interceptorChain = new InterceptorChain(this.agentId);
1751
- logger42.debug("AgentInstance created", {
1752
- agentId: this.agentId,
1753
- definitionName: definition.name,
1754
- driverName: this.driver.name
1755
- });
1756
- }
1757
- /**
1758
- * Current lifecycle state
1759
- */
1760
- get lifecycle() {
1761
- return this._lifecycle;
1762
- }
1763
- /**
1764
- * Current conversation state (delegated to StateMachine)
1765
- */
1766
- get state() {
1767
- return this.stateMachine.state;
1768
- }
1769
- /**
1770
- * Receive a message from user
1771
- *
1772
- * Runs through middleware chain before actual processing.
1773
- *
1774
- * Error Handling:
1775
- * - Errors are caught and converted to ErrorMessageEvent
1776
- * - Handlers receive the error event before re-throwing
1777
- * - This ensures UI can display errors
1778
- */
1779
- async receive(message) {
1780
- if (this._lifecycle === "destroyed") {
1781
- logger42.warn("Receive called on destroyed agent", { agentId: this.agentId });
1782
- const error = this.errorClassifier.create(
1783
- "system",
1784
- "AGENT_DESTROYED",
1785
- "Agent has been destroyed",
1786
- false
1787
- );
1788
- const errorEvent = this.errorClassifier.createEvent(error);
1789
- this.notifyHandlers(errorEvent);
1790
- throw new Error("[Agent] Agent has been destroyed");
1791
- }
1792
- if (this.state !== "idle") {
1793
- logger42.warn("Receive called while agent is busy", {
1794
- agentId: this.agentId,
1795
- currentState: this.state
1796
- });
1797
- const error = this.errorClassifier.create(
1798
- "system",
1799
- "AGENT_BUSY",
1800
- `Agent is busy (state: ${this.state}), please wait for current operation to complete`,
1801
- false
1802
- );
1803
- const errorEvent = this.errorClassifier.createEvent(error);
1804
- this.notifyHandlers(errorEvent);
1805
- throw new Error(`[Agent] Agent is busy (state: ${this.state})`);
1806
- }
1807
- const userMessage = typeof message === "string" ? {
1808
- id: `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,
1809
- role: "user",
1810
- subtype: "user",
1811
- content: message,
1812
- timestamp: Date.now()
1813
- } : message;
1814
- logger42.debug("Receiving message", {
1815
- agentId: this.agentId,
1816
- messageId: userMessage.id
1817
- });
1818
- const userMessageEvent = {
1819
- uuid: `evt_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,
1820
- type: "user_message",
1821
- agentId: this.agentId,
1822
- timestamp: Date.now(),
1823
- data: userMessage
1824
- };
1825
- this.presentOutput(userMessageEvent);
1826
- this.notifyHandlers(userMessageEvent);
1827
- await this.executeMiddlewareChain(userMessage);
1828
- }
1829
- /**
1830
- * Execute middleware chain and then process the message
1831
- */
1832
- async executeMiddlewareChain(message) {
1833
- await this.middlewareChain.execute(message, (msg) => this.doReceive(msg));
1834
- }
1835
- /**
1836
- * Process a single stream event through the engine
1837
- *
1838
- * Used by:
1839
- * - doReceive() - normal message flow
1840
- * - AgentInterrupter - interrupt event injection
1841
- *
1842
- * @param streamEvent - Stream event to process
1843
- */
1844
- processStreamEvent(streamEvent) {
1845
- const outputs = this.engine.process(this.agentId, streamEvent);
1846
- for (const output of outputs) {
1847
- this.presentOutput(output);
1848
- }
1849
- for (const output of outputs) {
1850
- this.notifyHandlers(output);
1851
- }
1852
- }
1853
- /**
1854
- * Actual message processing logic
1855
- *
1856
- * Coordinates the flow:
1857
- * 1. Driver receives message → produces StreamEvents
1858
- * 2. Engine processes events → produces outputs
1859
- * 3. Presenters handle outputs
1860
- * 4. Handlers receive outputs
1861
- */
1862
- async doReceive(userMessage) {
1863
- try {
1864
- logger42.debug("Processing message through driver", {
1865
- agentId: this.agentId,
1866
- messageId: userMessage.id
1867
- });
1868
- const queuedEvent = {
1869
- type: "conversation_queued",
1870
- uuid: `${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,
1871
- agentId: this.agentId,
1872
- timestamp: Date.now(),
1873
- data: {
1874
- userMessage
1875
- }
1876
- };
1877
- this.notifyHandlers(queuedEvent);
1878
- const streamEvents = this.driver.receive(userMessage);
1879
- for await (const streamEvent of streamEvents) {
1880
- this.processStreamEvent(streamEvent);
1881
- }
1882
- logger42.debug("Message processing completed", {
1883
- agentId: this.agentId,
1884
- messageId: userMessage.id
1885
- });
1886
- } catch (error) {
1887
- const agentError = this.errorClassifier.classify(error);
1888
- const errorEvent = this.errorClassifier.createEvent(agentError);
1889
- logger42.error("Message processing failed", {
1890
- agentId: this.agentId,
1891
- messageId: userMessage.id,
1892
- errorCategory: agentError.category,
1893
- errorCode: agentError.code,
1894
- error
1895
- });
1896
- this.notifyHandlers(errorEvent);
1897
- throw error;
1898
- }
1899
- }
1900
- /**
1901
- * Send output to all presenters
1902
- *
1903
- * Note: Presenters are no longer part of AgentDefinition.
1904
- * This is a placeholder for future presenter injection via Runtime or middleware.
1905
- */
1906
- presentOutput(_output) {
1907
- }
1908
- on(typeOrHandlerOrMap, handler) {
1909
- if (typeof typeOrHandlerOrMap === "function") {
1910
- return this.eventBus.onAny(typeOrHandlerOrMap);
1911
- }
1912
- if (this.isEventHandlerMap(typeOrHandlerOrMap)) {
1913
- const unsubscribes = [];
1914
- for (const [eventType, eventHandler] of Object.entries(typeOrHandlerOrMap)) {
1915
- if (eventHandler) {
1916
- unsubscribes.push(this.eventBus.on(eventType, eventHandler));
1917
- }
1918
- }
1919
- return () => {
1920
- for (const unsub of unsubscribes) {
1921
- unsub();
1922
- }
1923
- };
1924
- }
1925
- const types = Array.isArray(typeOrHandlerOrMap) ? typeOrHandlerOrMap : [typeOrHandlerOrMap];
1926
- const h = handler;
1927
- return this.eventBus.on(types, h);
1928
- }
1929
- /**
1930
- * Check if the argument is an EventHandlerMap (object with event type keys)
1931
- */
1932
- isEventHandlerMap(arg) {
1933
- if (typeof arg !== "object" || arg === null || Array.isArray(arg)) {
1934
- return false;
1935
- }
1936
- const keys = Object.keys(arg);
1937
- if (keys.length === 0) {
1938
- return false;
1939
- }
1940
- return keys.every((key) => {
1941
- const value = arg[key];
1942
- return value === void 0 || typeof value === "function";
1943
- });
1944
- }
1945
- /**
1946
- * Subscribe to state changes (delegated to StateMachine)
1947
- *
1948
- * @param handler - Callback receiving { prev, current } state change
1949
- * @returns Unsubscribe function
1950
- */
1951
- onStateChange(handler) {
1952
- return this.stateMachine.onStateChange(handler);
1953
- }
1954
- /**
1955
- * React-style fluent event subscription
1956
- *
1957
- * Converts onXxx handlers to event type keys and delegates to on(handlers)
1958
- */
1959
- react(handlers) {
1960
- const eventHandlerMap = mapReactHandlers(handlers);
1961
- return this.on(eventHandlerMap);
1962
- }
1963
- /**
1964
- * Subscribe to agent ready event
1965
- *
1966
- * If already running, handler is called immediately.
1967
- */
1968
- onReady(handler) {
1969
- if (this._lifecycle === "running") {
1970
- try {
1971
- handler();
1972
- } catch (error) {
1973
- logger42.error("onReady handler error", {
1974
- agentId: this.agentId,
1975
- error
1976
- });
1977
- }
1978
- }
1979
- this.readyHandlers.add(handler);
1980
- return () => {
1981
- this.readyHandlers.delete(handler);
1982
- };
1983
- }
1984
- /**
1985
- * Subscribe to agent destroy event
1986
- */
1987
- onDestroy(handler) {
1988
- this.destroyHandlers.add(handler);
1989
- return () => {
1990
- this.destroyHandlers.delete(handler);
1991
- };
1992
- }
1993
- /**
1994
- * Add middleware to intercept incoming messages
1995
- */
1996
- use(middleware) {
1997
- return this.middlewareChain.use(middleware);
1998
- }
1999
- /**
2000
- * Add interceptor to intercept outgoing events
2001
- */
2002
- intercept(interceptor) {
2003
- return this.interceptorChain.intercept(interceptor);
2004
- }
2005
- /**
2006
- * Interrupt - User-initiated stop
2007
- *
2008
- * Stops the current operation gracefully.
2009
- * Flow:
2010
- * 1. Call driver.interrupt() to abort active requests
2011
- * 2. Driver yields InterruptedStreamEvent
2012
- * 3. Event flows through engine pipeline
2013
- * 4. StateEventProcessor generates conversation_interrupted
2014
- * 5. StateMachine transitions to idle state
2015
- * 6. UI receives state change notification
2016
- */
2017
- interrupt() {
2018
- logger42.debug("User interrupt requested", { agentId: this.agentId, currentState: this.state });
2019
- this.driver.interrupt();
2020
- }
2021
- /**
2022
- * Destroy - Clean up resources
2023
- */
2024
- async destroy() {
2025
- logger42.debug("Destroying agent", { agentId: this.agentId });
2026
- for (const handler of this.destroyHandlers) {
2027
- try {
2028
- handler();
2029
- } catch (error) {
2030
- logger42.error("onDestroy handler error", {
2031
- agentId: this.agentId,
2032
- error
2033
- });
2034
- }
2035
- }
2036
- this._lifecycle = "destroyed";
2037
- this.stateMachine.reset();
2038
- this.eventBus.destroy();
2039
- this.readyHandlers.clear();
2040
- this.destroyHandlers.clear();
2041
- this.middlewareChain.clear();
2042
- this.interceptorChain.clear();
2043
- this.engine.clearState(this.agentId);
2044
- logger42.info("Agent destroyed", { agentId: this.agentId });
2045
- }
2046
- /**
2047
- * Notify all registered handlers
2048
- *
2049
- * Flow:
2050
- * 1. StateMachine processes StateEvents (for state transitions)
2051
- * 2. Interceptor chain can modify/filter events
2052
- * 3. EventBus emits to all subscribers
2053
- */
2054
- notifyHandlers(event) {
2055
- if (isStateEvent(event)) {
2056
- this.stateMachine.process(event);
2057
- }
2058
- this.executeInterceptorChain(event);
2059
- }
2060
- /**
2061
- * Execute interceptor chain and then emit to EventBus
2062
- */
2063
- executeInterceptorChain(event) {
2064
- this.interceptorChain.execute(event, (e) => this.eventBus.emit(e));
2065
- }
2066
- /**
2067
- * Get the event consumer for external subscriptions
2068
- *
2069
- * Use this to expose event subscription without emit capability.
2070
- */
2071
- getEventConsumer() {
2072
- return this.eventBus.asConsumer();
2073
- }
2074
- };
2075
- var MemoryStore = class {
2076
- constructor() {
2077
- __publicField(this, "states", /* @__PURE__ */ new Map());
2078
- }
2079
- get(id) {
2080
- return this.states.get(id);
2081
- }
2082
- set(id, state) {
2083
- this.states.set(id, state);
2084
- }
2085
- delete(id) {
2086
- this.states.delete(id);
2087
- }
2088
- has(id) {
2089
- return this.states.has(id);
2090
- }
2091
- /**
2092
- * Clear all stored states
2093
- */
2094
- clear() {
2095
- this.states.clear();
2096
- }
2097
- /**
2098
- * Get the number of stored states
2099
- */
2100
- get size() {
2101
- return this.states.size;
2102
- }
2103
- /**
2104
- * Get all stored IDs
2105
- */
2106
- keys() {
2107
- return this.states.keys();
2108
- }
2109
- };
2110
- createLogger("engine/Mealy");
2111
- function combineProcessors(processors) {
2112
- return (state, event) => {
2113
- const newState = {};
2114
- const allOutputs = [];
2115
- for (const key in processors) {
2116
- const processor = processors[key];
2117
- const subState = state[key];
2118
- const [newSubState, outputs] = processor(subState, event);
2119
- newState[key] = newSubState;
2120
- allOutputs.push(...outputs);
2121
- }
2122
- return [newState, allOutputs];
2123
- };
2124
- }
2125
- function combineInitialStates(initialStates) {
2126
- return () => {
2127
- const state = {};
2128
- for (const key in initialStates) {
2129
- state[key] = initialStates[key]();
2130
- }
2131
- return state;
2132
- };
2133
- }
2134
- function createInitialMessageAssemblerState() {
2135
- return {
2136
- currentMessageId: null,
2137
- messageStartTime: null,
2138
- pendingContents: {},
2139
- pendingToolCalls: {}
2140
- };
2141
- }
2142
- function generateId() {
2143
- return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
2144
- }
2145
- var messageAssemblerProcessor = (state, input) => {
2146
- switch (input.type) {
2147
- case "message_start":
2148
- return handleMessageStart(state, input);
2149
- case "text_delta":
2150
- return handleTextDelta(state, input);
2151
- case "tool_use_content_block_start":
2152
- return handleToolUseContentBlockStart(state, input);
2153
- case "input_json_delta":
2154
- return handleInputJsonDelta(state, input);
2155
- case "tool_use_content_block_stop":
2156
- return handleToolUseContentBlockStop(state, input);
2157
- case "tool_result":
2158
- return handleToolResult(state, input);
2159
- case "message_stop":
2160
- return handleMessageStop(state, input);
2161
- default:
2162
- return [state, []];
2163
- }
2164
- };
2165
- function handleMessageStart(state, event) {
2166
- return [
2167
- {
2168
- ...state,
2169
- currentMessageId: generateId(),
2170
- messageStartTime: event.timestamp,
2171
- pendingContents: {}
2172
- },
2173
- []
2174
- ];
2175
- }
2176
- function handleTextDelta(state, event) {
2177
- const index = 0;
2178
- const existingContent = state.pendingContents[index];
2179
- const pendingContent = (existingContent == null ? void 0 : existingContent.type) === "text" ? {
2180
- ...existingContent,
2181
- textDeltas: [...existingContent.textDeltas || [], event.data.text]
2182
- } : {
2183
- type: "text",
2184
- index,
2185
- textDeltas: [event.data.text]
2186
- };
2187
- return [
2188
- {
2189
- ...state,
2190
- pendingContents: {
2191
- ...state.pendingContents,
2192
- [index]: pendingContent
2193
- }
2194
- },
2195
- []
2196
- ];
2197
- }
2198
- function handleToolUseContentBlockStart(state, event) {
2199
- const index = 1;
2200
- const pendingContent = {
2201
- type: "tool_use",
2202
- index,
2203
- toolId: event.data.id,
2204
- toolName: event.data.name,
2205
- toolInputJson: ""
2206
- };
2207
- return [
2208
- {
2209
- ...state,
2210
- pendingContents: {
2211
- ...state.pendingContents,
2212
- [index]: pendingContent
2213
- }
2214
- },
2215
- []
2216
- ];
2217
- }
2218
- function handleInputJsonDelta(state, event) {
2219
- const index = 1;
2220
- const existingContent = state.pendingContents[index];
2221
- if (!existingContent || existingContent.type !== "tool_use") {
2222
- return [state, []];
2223
- }
2224
- const pendingContent = {
2225
- ...existingContent,
2226
- toolInputJson: (existingContent.toolInputJson || "") + event.data.partialJson
2227
- };
2228
- return [
2229
- {
2230
- ...state,
2231
- pendingContents: {
2232
- ...state.pendingContents,
2233
- [index]: pendingContent
2234
- }
2235
- },
2236
- []
2237
- ];
2238
- }
2239
- function handleToolUseContentBlockStop(state, event) {
2240
- const index = 1;
2241
- const pendingContent = state.pendingContents[index];
2242
- if (!pendingContent || pendingContent.type !== "tool_use") {
2243
- return [state, []];
2244
- }
2245
- let toolInput = {};
2246
- try {
2247
- toolInput = pendingContent.toolInputJson ? JSON.parse(pendingContent.toolInputJson) : {};
2248
- } catch {
2249
- toolInput = {};
2250
- }
2251
- const outputs = [];
2252
- const toolId = pendingContent.toolId;
2253
- const toolName = pendingContent.toolName;
2254
- const toolCallEvent = {
2255
- type: "tool_call",
2256
- uuid: generateId(),
2257
- agentId: event.agentId,
2258
- timestamp: Date.now(),
2259
- data: {
2260
- id: toolId,
2261
- name: toolName,
2262
- input: toolInput
2263
- }
2264
- };
2265
- outputs.push(toolCallEvent);
2266
- const toolCall = {
2267
- type: "tool-call",
2268
- id: toolId,
2269
- name: toolName,
2270
- input: toolInput
2271
- };
2272
- const toolCallMessage = {
2273
- id: generateId(),
2274
- role: "assistant",
2275
- subtype: "tool-call",
2276
- toolCall,
2277
- timestamp: Date.now()
2278
- };
2279
- const toolCallMessageEvent = {
2280
- type: "tool_call_message",
2281
- uuid: generateId(),
2282
- agentId: event.agentId,
2283
- timestamp: Date.now(),
2284
- data: toolCallMessage
2285
- };
2286
- outputs.push(toolCallMessageEvent);
2287
- const { [index]: _, ...remainingContents } = state.pendingContents;
2288
- return [
2289
- {
2290
- ...state,
2291
- pendingContents: remainingContents,
2292
- pendingToolCalls: {
2293
- ...state.pendingToolCalls,
2294
- [toolId]: { id: toolId, name: toolName }
2295
- }
2296
- },
2297
- outputs
2298
- ];
2299
- }
2300
- function handleToolResult(state, event) {
2301
- const { toolId, content, isError } = event.data;
2302
- const pendingToolCall = state.pendingToolCalls[toolId];
2303
- const toolName = (pendingToolCall == null ? void 0 : pendingToolCall.name) || "unknown";
2304
- const toolResult = {
2305
- type: "tool-result",
2306
- id: toolId,
2307
- name: toolName,
2308
- output: {
2309
- type: isError ? "error-text" : "text",
2310
- value: typeof content === "string" ? content : JSON.stringify(content)
2311
- }
2312
- };
2313
- const toolResultMessage = {
2314
- id: generateId(),
2315
- role: "tool",
2316
- subtype: "tool-result",
2317
- toolResult,
2318
- toolCallId: toolId,
2319
- timestamp: Date.now()
2320
- };
2321
- const toolResultMessageEvent = {
2322
- type: "tool_result_message",
2323
- uuid: generateId(),
2324
- agentId: event.agentId,
2325
- timestamp: Date.now(),
2326
- data: toolResultMessage
2327
- };
2328
- const { [toolId]: _, ...remainingToolCalls } = state.pendingToolCalls;
2329
- return [
2330
- {
2331
- ...state,
2332
- pendingToolCalls: remainingToolCalls
2333
- },
2334
- [toolResultMessageEvent]
2335
- ];
2336
- }
2337
- function handleMessageStop(state, event) {
2338
- if (!state.currentMessageId) {
2339
- return [state, []];
2340
- }
2341
- const textParts = [];
2342
- const sortedContents = Object.values(state.pendingContents).sort((a, b) => a.index - b.index);
2343
- for (const pending of sortedContents) {
2344
- if (pending.type === "text" && pending.textDeltas) {
2345
- textParts.push(pending.textDeltas.join(""));
2346
- }
2347
- }
2348
- const content = textParts.join("");
2349
- const stopReason = event.data.stopReason;
2350
- if (!content || content.trim().length === 0) {
2351
- const shouldPreserveToolCalls2 = stopReason === "tool_use";
2352
- return [
2353
- {
2354
- ...createInitialMessageAssemblerState(),
2355
- pendingToolCalls: shouldPreserveToolCalls2 ? state.pendingToolCalls : {}
2356
- },
2357
- []
2358
- ];
2359
- }
2360
- const assistantMessage = {
2361
- id: state.currentMessageId,
2362
- role: "assistant",
2363
- subtype: "assistant",
2364
- content,
2365
- timestamp: state.messageStartTime || Date.now(),
2366
- // Usage data is not available in message_stop event
2367
- // It would need to be tracked separately if needed
2368
- usage: void 0
2369
- };
2370
- const assistantEvent = {
2371
- type: "assistant_message",
2372
- uuid: generateId(),
2373
- agentId: event.agentId,
2374
- timestamp: Date.now(),
2375
- data: assistantMessage
2376
- };
2377
- const shouldPreserveToolCalls = stopReason === "tool_use";
2378
- return [
2379
- {
2380
- ...createInitialMessageAssemblerState(),
2381
- pendingToolCalls: shouldPreserveToolCalls ? state.pendingToolCalls : {}
2382
- },
2383
- [assistantEvent]
2384
- ];
2385
- }
2386
- var logger23 = createLogger("engine/stateEventProcessor");
2387
- function createInitialStateEventProcessorContext() {
2388
- return {};
2389
- }
2390
- function generateId2() {
2391
- return `state_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
2392
- }
2393
- var stateEventProcessor = (context, input) => {
2394
- logger23.debug(`[Stream Event] ${input.type}`, {
2395
- context,
2396
- eventData: "data" in input ? input.data : void 0
2397
- });
2398
- switch (input.type) {
2399
- case "message_start":
2400
- return handleMessageStart2(context, input);
2401
- case "message_delta":
2402
- return handleMessageDelta(context);
2403
- case "message_stop":
2404
- return handleMessageStop2(context, input);
2405
- case "text_content_block_start":
2406
- return handleTextContentBlockStart(context, input);
2407
- case "tool_use_content_block_start":
2408
- return handleToolUseContentBlockStart2(context, input);
2409
- case "tool_use_content_block_stop":
2410
- return handleToolUseContentBlockStop2(context);
2411
- case "tool_call":
2412
- return handleToolCall(context);
2413
- case "interrupted":
2414
- return handleInterrupted(context, input);
2415
- default:
2416
- logger23.debug(`[Stream Event] ${input.type} (unhandled)`);
2417
- return [context, []];
2418
- }
2419
- };
2420
- function handleMessageStart2(context, event) {
2421
- const conversationStartEvent = {
2422
- type: "conversation_start",
2423
- uuid: generateId2(),
2424
- agentId: event.agentId,
2425
- timestamp: event.timestamp,
2426
- transition: {
2427
- reason: "conversation_started",
2428
- trigger: "message_start"
2429
- },
2430
- data: {
2431
- userMessage: {}
2432
- // Will be populated by higher-level component
2433
- }
2434
- };
2435
- return [context, [conversationStartEvent]];
2436
- }
2437
- function handleMessageDelta(context, _event) {
2438
- return [context, []];
2439
- }
2440
- function handleMessageStop2(context, event) {
2441
- const stopReason = event.data.stopReason;
2442
- logger23.debug("message_stop received", { stopReason });
2443
- if (stopReason === "tool_use") {
2444
- logger23.debug("Skipping conversation_end (tool_use in progress)");
2445
- return [context, []];
2446
- }
2447
- const conversationEndEvent = {
2448
- type: "conversation_end",
2449
- uuid: generateId2(),
2450
- agentId: event.agentId,
2451
- timestamp: event.timestamp,
2452
- transition: {
2453
- reason: "conversation_completed",
2454
- trigger: "message_stop"
2455
- },
2456
- data: {
2457
- assistantMessage: {},
2458
- // Will be populated by higher-level component
2459
- durationMs: 0,
2460
- // Will be calculated by StateMachine or TurnTracker
2461
- durationApiMs: 0,
2462
- numTurns: 0,
2463
- result: "completed",
2464
- totalCostUsd: 0,
2465
- usage: {
2466
- input: 0,
2467
- output: 0
2468
- }
2469
- }
2470
- };
2471
- return [context, [conversationEndEvent]];
2472
- }
2473
- function handleTextContentBlockStart(context, event) {
2474
- const respondingEvent = {
2475
- type: "conversation_responding",
2476
- uuid: generateId2(),
2477
- agentId: event.agentId,
2478
- timestamp: Date.now(),
2479
- transition: {
2480
- reason: "assistant_responding",
2481
- trigger: "text_content_block_start"
2482
- },
2483
- data: {}
2484
- };
2485
- return [context, [respondingEvent]];
2486
- }
2487
- function handleToolUseContentBlockStart2(context, event) {
2488
- const outputs = [];
2489
- const toolPlannedEvent = {
2490
- type: "tool_planned",
2491
- uuid: generateId2(),
2492
- agentId: event.agentId,
2493
- timestamp: event.timestamp,
2494
- data: {
2495
- id: event.data.id,
2496
- name: event.data.name,
2497
- input: {}
2498
- }
2499
- };
2500
- outputs.push(toolPlannedEvent);
2501
- const toolExecutingEvent = {
2502
- type: "tool_executing",
2503
- uuid: generateId2(),
2504
- agentId: event.agentId,
2505
- timestamp: event.timestamp,
2506
- transition: {
2507
- reason: "tool_planning_started",
2508
- trigger: "tool_use_content_block_start"
2509
- },
2510
- data: {}
2511
- };
2512
- outputs.push(toolExecutingEvent);
2513
- return [context, outputs];
2514
- }
2515
- function handleToolUseContentBlockStop2(context, _event) {
2516
- return [context, []];
2517
- }
2518
- function handleToolCall(context, _event) {
2519
- return [context, []];
2520
- }
2521
- function handleInterrupted(context, event) {
2522
- logger23.debug("interrupted event received", { reason: event.data.reason });
2523
- const conversationInterruptedEvent = {
2524
- type: "conversation_interrupted",
2525
- uuid: generateId2(),
2526
- agentId: event.agentId,
2527
- timestamp: event.timestamp,
2528
- transition: {
2529
- reason: event.data.reason,
2530
- trigger: "interrupted"
2531
- },
2532
- data: {
2533
- reason: event.data.reason
2534
- }
2535
- };
2536
- return [context, [conversationInterruptedEvent]];
2537
- }
2538
- function createInitialTurnTrackerState() {
2539
- return {
2540
- pendingTurn: null,
2541
- costPerInputToken: 3e-6,
2542
- // $3 per 1M tokens
2543
- costPerOutputToken: 15e-6
2544
- // $15 per 1M tokens
2545
- };
2546
- }
2547
- function generateId3() {
2548
- return `turn_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
2549
- }
2550
- function calculateCost(usage, costPerInputToken, costPerOutputToken) {
2551
- const inputCost = usage.input * costPerInputToken;
2552
- const outputCost = usage.output * costPerOutputToken;
2553
- return inputCost + outputCost;
2554
- }
2555
- var turnTrackerProcessor = (state, input) => {
2556
- switch (input.type) {
2557
- case "user_message":
2558
- return handleUserMessage(state, input);
2559
- case "message_stop":
2560
- return handleMessageStop3(state, input);
2561
- case "assistant_message":
2562
- return [state, []];
2563
- default:
2564
- return [state, []];
2565
- }
2566
- };
2567
- function handleUserMessage(state, event) {
2568
- const turnId = generateId3();
2569
- const pendingTurn = {
2570
- turnId,
2571
- userMessage: event.data,
2572
- requestedAt: event.timestamp
2573
- };
2574
- const turnRequestEvent = {
2575
- type: "turn_request",
2576
- uuid: generateId3(),
2577
- agentId: event.agentId,
2578
- timestamp: Date.now(),
2579
- turnId,
2580
- data: {
2581
- userMessage: event.data,
2582
- requestedAt: event.timestamp
2583
- }
2584
- };
2585
- return [
2586
- {
2587
- ...state,
2588
- pendingTurn
2589
- },
2590
- [turnRequestEvent]
2591
- ];
2592
- }
2593
- function handleMessageStop3(state, event) {
2594
- if (!state.pendingTurn) {
2595
- return [state, []];
2596
- }
2597
- const stopReason = event.data.stopReason;
2598
- if (stopReason === "end_turn" || stopReason === "max_tokens" || stopReason === "stop_sequence") {
2599
- return completeTurn(state, event.agentId, event.timestamp);
2600
- }
2601
- return [state, []];
2602
- }
2603
- function completeTurn(state, agentId, completedAt) {
2604
- if (!state.pendingTurn) {
2605
- return [state, []];
2606
- }
2607
- const { turnId, requestedAt } = state.pendingTurn;
2608
- const duration = completedAt - requestedAt;
2609
- const usage = { input: 0, output: 0 };
2610
- const cost = calculateCost(usage, state.costPerInputToken, state.costPerOutputToken);
2611
- const turnResponseEvent = {
2612
- type: "turn_response",
2613
- uuid: generateId3(),
2614
- agentId,
2615
- timestamp: Date.now(),
2616
- turnId,
2617
- data: {
2618
- assistantMessage: {
2619
- id: generateId3(),
2620
- role: "assistant",
2621
- subtype: "assistant",
2622
- content: "",
2623
- timestamp: completedAt
2624
- },
2625
- respondedAt: completedAt,
2626
- durationMs: duration,
2627
- usage,
2628
- costUsd: cost
2629
- }
2630
- };
2631
- return [
2632
- {
2633
- ...state,
2634
- pendingTurn: null
2635
- },
2636
- [turnResponseEvent]
2637
- ];
2638
- }
2639
- var agentProcessor = combineProcessors({
2640
- messageAssembler: messageAssemblerProcessor,
2641
- stateEventProcessor,
2642
- turnTracker: turnTrackerProcessor
2643
- });
2644
- var createInitialAgentEngineState = combineInitialStates({
2645
- messageAssembler: createInitialMessageAssemblerState,
2646
- stateEventProcessor: createInitialStateEventProcessorContext,
2647
- turnTracker: createInitialTurnTrackerState
2648
- });
2649
- var logger33 = createLogger("engine/AgentEngine");
2650
- var AgentEngine = class {
2651
- constructor() {
2652
- __publicField(this, "store");
2653
- this.store = new MemoryStore();
2654
- logger33.debug("AgentEngine initialized");
2655
- }
2656
- /**
2657
- * Process a single stream event and return output events
2658
- *
2659
- * This is the core Mealy Machine operation:
2660
- * process(agentId, event) → outputs[]
2661
- *
2662
- * @param agentId - The agent identifier (for state isolation)
2663
- * @param event - Stream event to process
2664
- * @returns Array of output events (state, message, turn events)
2665
- */
2666
- process(agentId, event) {
2667
- const eventType = event.type || "unknown";
2668
- logger33.debug("Processing event", { agentId, eventType });
2669
- const isNewState = !this.store.has(agentId);
2670
- let state = this.store.get(agentId) ?? createInitialAgentEngineState();
2671
- if (isNewState) {
2672
- logger33.debug("Created initial state for agent", { agentId });
2673
- }
2674
- const allOutputs = [];
2675
- allOutputs.push(event);
2676
- const [newState, outputs] = agentProcessor(state, event);
2677
- state = newState;
2678
- for (const output of outputs) {
2679
- allOutputs.push(output);
2680
- const [chainedState, chainedOutputs] = this.processChained(state, output);
2681
- state = chainedState;
2682
- allOutputs.push(...chainedOutputs);
2683
- }
2684
- this.store.set(agentId, state);
2685
- if (outputs.length > 0) {
2686
- logger33.debug("Produced outputs", {
2687
- agentId,
2688
- inputEvent: eventType,
2689
- outputCount: allOutputs.length,
2690
- processorOutputs: outputs.length
2691
- });
2692
- }
2693
- return allOutputs;
2694
- }
2695
- /**
2696
- * Process chained events recursively
2697
- *
2698
- * Some processors produce events that trigger other processors:
2699
- * - MessageAssembler produces MessageEvents
2700
- * - TurnTracker consumes MessageEvents to produce TurnEvents
2701
- */
2702
- processChained(state, event) {
2703
- const [newState, outputs] = agentProcessor(state, event);
2704
- if (outputs.length === 0) {
2705
- return [newState, []];
2706
- }
2707
- const allOutputs = [...outputs];
2708
- let currentState = newState;
2709
- for (const output of outputs) {
2710
- const [chainedState, chainedOutputs] = this.processChained(currentState, output);
2711
- currentState = chainedState;
2712
- allOutputs.push(...chainedOutputs);
2713
- }
2714
- return [currentState, allOutputs];
2715
- }
2716
- /**
2717
- * Clear state for an agent
2718
- *
2719
- * Call this when an agent is destroyed to free memory.
2720
- */
2721
- clearState(agentId) {
2722
- logger33.debug("Clearing state", { agentId });
2723
- this.store.delete(agentId);
2724
- }
2725
- /**
2726
- * Check if state exists for an agent
2727
- */
2728
- hasState(agentId) {
2729
- return this.store.has(agentId);
2730
- }
2731
- };
2732
- var logger7 = createLogger("agentx/ContainerManager");
2733
- function generateContainerId() {
2734
- const timestamp = Date.now().toString(36);
2735
- const random = Math.random().toString(36).substring(2, 8);
2736
- return `container_${timestamp}_${random}`;
2737
- }
2738
- function generateAgentId() {
2739
- const timestamp = Date.now().toString(36);
2740
- const random = Math.random().toString(36).substring(2, 8);
2741
- return `agent_${timestamp}_${random}`;
2742
- }
2743
- var ContainerManagerImpl = class {
2744
- constructor(runtime, repository) {
2745
- __publicField(this, "agents", /* @__PURE__ */ new Map());
2746
- __publicField(this, "engine");
2747
- __publicField(this, "runtime");
2748
- __publicField(this, "repository");
2749
- this.runtime = runtime;
2750
- this.repository = repository;
2751
- this.engine = new AgentEngine();
2752
- }
2753
- // ==================== Container Lifecycle ====================
2754
- async create(config2) {
2755
- const containerId = generateContainerId();
2756
- const now = Date.now();
2757
- const record = {
2758
- containerId,
2759
- createdAt: now,
2760
- updatedAt: now,
2761
- config: config2
2762
- };
2763
- await this.repository.saveContainer(record);
2764
- logger7.info("Container created", { containerId });
2765
- return record;
2766
- }
2767
- async get(containerId) {
2768
- return this.repository.findContainerById(containerId);
2769
- }
2770
- async list() {
2771
- return this.repository.findAllContainers();
2772
- }
2773
- async delete(containerId) {
2774
- const exists = await this.repository.containerExists(containerId);
2775
- if (!exists) {
2776
- return false;
2777
- }
2778
- await this.repository.deleteContainer(containerId);
2779
- logger7.info("Container deleted", { containerId });
2780
- return true;
2781
- }
2782
- async exists(containerId) {
2783
- return this.repository.containerExists(containerId);
2784
- }
2785
- // ==================== Agent Runtime ====================
2786
- async run(image, containerId) {
2787
- logger7.info("Running agent from image", {
2788
- imageId: image.imageId,
2789
- containerId
2790
- });
2791
- const container = await this.repository.findContainerById(containerId);
2792
- if (!container) {
2793
- throw new Error(`Container not found: ${containerId}`);
2794
- }
2795
- let agentId;
2796
- if (this.runtime.agentIdResolver) {
2797
- agentId = await this.runtime.agentIdResolver.resolveForRun(image.imageId, containerId);
2798
- } else {
2799
- agentId = generateAgentId();
2800
- }
2801
- const context = {
2802
- agentId,
2803
- createdAt: Date.now()
2804
- };
2805
- const sandbox = this.runtime.createSandbox(containerId);
2806
- const driver = this.runtime.createDriver(image.definition, context, sandbox);
2807
- const agent = new AgentInstance(image.definition, context, this.engine, driver, sandbox);
2808
- this.agents.set(agentId, agent);
2809
- logger7.info("Agent started", {
2810
- agentId,
2811
- imageId: image.imageId,
2812
- containerId,
2813
- definitionName: image.definition.name
2814
- });
2815
- return agent;
2816
- }
2817
- async resume(session, containerId) {
2818
- logger7.info("Resuming agent from session", {
2819
- sessionId: session.sessionId,
2820
- imageId: session.imageId,
2821
- containerId
2822
- });
2823
- const container = await this.repository.findContainerById(containerId);
2824
- if (!container) {
2825
- throw new Error(`Container not found: ${containerId}`);
2826
- }
2827
- const imageRecord = await this.repository.findImageById(session.imageId);
2828
- if (!imageRecord) {
2829
- throw new Error(`Image not found: ${session.imageId}`);
2830
- }
2831
- let agentId;
2832
- if (this.runtime.agentIdResolver) {
2833
- agentId = await this.runtime.agentIdResolver.resolveForResume(session.sessionId, containerId);
2834
- } else {
2835
- agentId = generateAgentId();
2836
- }
2837
- const context = {
2838
- agentId,
2839
- createdAt: Date.now()
2840
- };
2841
- const sandbox = this.runtime.createSandbox(containerId);
2842
- const definition = imageRecord.definition;
2843
- const driver = this.runtime.createDriver(definition, context, sandbox);
2844
- const agent = new AgentInstance(definition, context, this.engine, driver, sandbox);
2845
- this.agents.set(agentId, agent);
2846
- logger7.info("Agent resumed", {
2847
- agentId,
2848
- sessionId: session.sessionId,
2849
- imageId: session.imageId,
2850
- containerId
2851
- });
2852
- return agent;
2853
- }
2854
- async destroyAgent(agentId) {
2855
- const agent = this.agents.get(agentId);
2856
- if (!agent) {
2857
- logger7.warn("Agent not found for destroy", { agentId });
2858
- return;
2859
- }
2860
- logger7.debug("Destroying agent", { agentId });
2861
- await agent.destroy();
2862
- this.agents.delete(agentId);
2863
- logger7.info("Agent destroyed", { agentId });
2864
- }
2865
- getAgent(agentId) {
2866
- return this.agents.get(agentId);
2867
- }
2868
- hasAgent(agentId) {
2869
- return this.agents.has(agentId);
2870
- }
2871
- listAgents() {
2872
- return Array.from(this.agents.values());
2873
- }
2874
- async destroyAllAgents() {
2875
- const agentIds = Array.from(this.agents.keys());
2876
- logger7.debug("Destroying all agents", { count: agentIds.length });
2877
- await Promise.all(agentIds.map((id) => this.destroyAgent(id)));
2878
- logger7.info("All agents destroyed", { count: agentIds.length });
2879
- }
2880
- };
2881
- var logger8 = createLogger("agentx/AgentX");
2882
- function createAgentX(runtime, options) {
2883
- logger8.info("Creating AgentX instance", { runtime: runtime.name });
2884
- if (!runtime.repository) {
2885
- throw new Error("Runtime must have a repository for persistence");
2886
- }
2887
- const repository = runtime.repository;
2888
- const containerManager = new ContainerManagerImpl(runtime, repository);
2889
- const errorManager = new ErrorManager();
2890
- const definitionManager = new DefinitionManagerImpl(repository);
2891
- const agentManager = new AgentManager(containerManager);
2892
- const imageManager = new ImageManagerImpl(repository, containerManager, options == null ? void 0 : options.containerId);
2893
- const sessionManager = new SessionManagerImpl(repository, containerManager, options == null ? void 0 : options.containerId);
2894
- logger8.debug("AgentX instance created", { runtime: runtime.name });
2895
- return {
2896
- mode: "local",
2897
- containers: containerManager,
2898
- definitions: definitionManager,
2899
- images: imageManager,
2900
- agents: agentManager,
2901
- sessions: sessionManager,
2902
- errors: errorManager
2903
- };
2904
- }
2905
- createLogger("agentx/RemoteRepository");
2906
- var _BrowserLogger = class _BrowserLogger2 {
2907
- constructor(name, options = {}) {
2908
- __publicField(this, "name");
2909
- __publicField(this, "level");
2910
- __publicField(this, "collapsed");
2911
- this.name = name;
2912
- this.level = options.level ?? LogLevel.INFO;
2913
- this.collapsed = options.collapsed ?? true;
2914
- }
2915
- debug(message, context) {
2916
- if (this.isDebugEnabled()) {
2917
- this.log("DEBUG", message, context);
2918
- }
2919
- }
2920
- info(message, context) {
2921
- if (this.isInfoEnabled()) {
2922
- this.log("INFO", message, context);
2923
- }
2924
- }
2925
- warn(message, context) {
2926
- if (this.isWarnEnabled()) {
2927
- this.log("WARN", message, context);
2928
- }
2929
- }
2930
- error(message, context) {
2931
- if (this.isErrorEnabled()) {
2932
- if (message instanceof Error) {
2933
- this.log("ERROR", message.message, { ...context, stack: message.stack });
2934
- } else {
2935
- this.log("ERROR", message, context);
2936
- }
2937
- }
2938
- }
2939
- isDebugEnabled() {
2940
- return this.level <= LogLevel.DEBUG;
2941
- }
2942
- isInfoEnabled() {
2943
- return this.level <= LogLevel.INFO;
2944
- }
2945
- isWarnEnabled() {
2946
- return this.level <= LogLevel.WARN;
2947
- }
2948
- isErrorEnabled() {
2949
- return this.level <= LogLevel.ERROR;
2950
- }
2951
- log(level, message, context) {
2952
- const timestamp = (/* @__PURE__ */ new Date()).toLocaleTimeString();
2953
- const consoleMethod = this.getConsoleMethod(level);
2954
- const badgeStyle = _BrowserLogger2.BADGE_STYLES[level];
2955
- const format = `%c${timestamp} %c${level}%c %c[${this.name}]%c ${message}`;
2956
- const styles = [
2957
- _BrowserLogger2.STYLES.TIMESTAMP,
2958
- badgeStyle,
2959
- "",
2960
- // reset after badge
2961
- _BrowserLogger2.STYLES.NAME,
2962
- _BrowserLogger2.STYLES.MESSAGE
2963
- ];
2964
- if (context && Object.keys(context).length > 0) {
2965
- const groupMethod = this.collapsed ? console.groupCollapsed : console.group;
2966
- groupMethod.call(console, format, ...styles);
2967
- console.log("Context:", context);
2968
- console.groupEnd();
2969
- } else {
2970
- consoleMethod(format, ...styles);
2971
- }
2972
- }
2973
- getConsoleMethod(level) {
2974
- switch (level) {
2975
- case "DEBUG":
2976
- return console.debug.bind(console);
2977
- case "INFO":
2978
- return console.info.bind(console);
2979
- case "WARN":
2980
- return console.warn.bind(console);
2981
- case "ERROR":
2982
- return console.error.bind(console);
2983
- default:
2984
- return console.log.bind(console);
2985
- }
2986
- }
2987
- };
2988
- __publicField(_BrowserLogger, "STYLES", {
2989
- DEBUG: "color: #6B7280; font-weight: normal;",
2990
- // gray
2991
- INFO: "color: #10B981; font-weight: normal;",
2992
- // green
2993
- WARN: "color: #F59E0B; font-weight: bold;",
2994
- // amber
2995
- ERROR: "color: #EF4444; font-weight: bold;",
2996
- // red
2997
- TIMESTAMP: "color: #9CA3AF; font-weight: normal;",
2998
- // light gray
2999
- NAME: "color: #8B5CF6; font-weight: normal;",
3000
- // purple
3001
- MESSAGE: "color: inherit; font-weight: normal;"
3002
- });
3003
- __publicField(_BrowserLogger, "BADGE_STYLES", {
3004
- DEBUG: "background: #E5E7EB; color: #374151; padding: 2px 6px; border-radius: 3px; font-size: 11px;",
3005
- INFO: "background: #D1FAE5; color: #065F46; padding: 2px 6px; border-radius: 3px; font-size: 11px;",
3006
- WARN: "background: #FEF3C7; color: #92400E; padding: 2px 6px; border-radius: 3px; font-size: 11px;",
3007
- ERROR: "background: #FEE2E2; color: #991B1B; padding: 2px 6px; border-radius: 3px; font-size: 11px;"
3008
- });
3009
- createLogger("agentx/RemoteAgentIdResolver");
3010
- export {
3011
- createAgentX
3012
- };
3013
- //# sourceMappingURL=index-BtOS4F-X.js.map