conversationalist 0.0.9 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -91,7 +91,7 @@ var messageInputSchema = z.object({
91
91
  tokenUsage: tokenUsageSchema.optional(),
92
92
  goalCompleted: z.boolean().optional()
93
93
  });
94
- var messageJSONSchema = z.object({
94
+ var messageSchema = z.object({
95
95
  id: z.string(),
96
96
  role: messageRoleSchema,
97
97
  content: z.union([z.string(), z.array(multiModalContentSchema)]),
@@ -116,7 +116,7 @@ var conversationShape = {
116
116
  status: conversationStatusSchema,
117
117
  metadata: z.record(z.string(), jsonValueSchema),
118
118
  ids: z.array(z.string()),
119
- messages: z.record(z.string(), messageJSONSchema),
119
+ messages: z.record(z.string(), messageSchema),
120
120
  createdAt: z.string(),
121
121
  updatedAt: z.string()
122
122
  };
@@ -775,6 +775,40 @@ function toChatMessages(conversation) {
775
775
  }
776
776
  return result;
777
777
  }
778
+ // src/guards.ts
779
+ function isSchema(schema, value) {
780
+ return schema.safeParse(value).success;
781
+ }
782
+ function isConversation(value) {
783
+ return isSchema(conversationSchema, value);
784
+ }
785
+ function isConversationStatus(value) {
786
+ return isSchema(conversationStatusSchema, value);
787
+ }
788
+ function isJSONValue(value) {
789
+ return isSchema(jsonValueSchema, value);
790
+ }
791
+ function isMessage(value) {
792
+ return isSchema(messageSchema, value);
793
+ }
794
+ function isMessageInput(value) {
795
+ return isSchema(messageInputSchema, value);
796
+ }
797
+ function isMessageRole(value) {
798
+ return isSchema(messageRoleSchema, value);
799
+ }
800
+ function isMultiModalContent(value) {
801
+ return isSchema(multiModalContentSchema, value);
802
+ }
803
+ function isTokenUsage(value) {
804
+ return isSchema(tokenUsageSchema, value);
805
+ }
806
+ function isToolCall(value) {
807
+ return isSchema(toolCallSchema, value);
808
+ }
809
+ function isToolResult(value) {
810
+ return isSchema(toolResultSchema, value);
811
+ }
778
812
  // src/context.ts
779
813
  var cloneMessageWithPosition = (message, position, content) => {
780
814
  const baseMessage = {
@@ -1109,19 +1143,1525 @@ function withConversation(conversation, fn) {
1109
1143
  function pipeConversation(conversation, ...fns) {
1110
1144
  return fns.reduce((current, fn) => fn(current), conversation);
1111
1145
  }
1112
- // src/history.ts
1113
- class ConversationHistoryEvent extends CustomEvent {
1114
- constructor(type, detail) {
1115
- super(type, { detail });
1146
+ // node_modules/event-emission/dist/index.js
1147
+ var SymbolObservable = typeof Symbol === "function" && Symbol.observable || Symbol.for("@@observable");
1148
+ if (typeof Symbol === "function") {
1149
+ Symbol.observable = SymbolObservable;
1150
+ }
1151
+ function getMethod(obj, key) {
1152
+ if (obj === null || obj === undefined)
1153
+ return;
1154
+ const value = obj[key];
1155
+ if (value == null)
1156
+ return;
1157
+ if (typeof value !== "function") {
1158
+ throw new TypeError(value + " is not a function");
1116
1159
  }
1160
+ return value;
1117
1161
  }
1162
+ function hostReportError(e) {
1163
+ if (typeof queueMicrotask === "function") {
1164
+ queueMicrotask(() => {
1165
+ throw e;
1166
+ });
1167
+ } else {
1168
+ setTimeout(() => {
1169
+ throw e;
1170
+ });
1171
+ }
1172
+ }
1173
+ function SubscriptionObserverImpl(subscription) {
1174
+ this._subscription = subscription;
1175
+ }
1176
+ SubscriptionObserverImpl.prototype = Object.create(Object.prototype);
1177
+ Object.defineProperties(SubscriptionObserverImpl.prototype, {
1178
+ constructor: { value: Object, configurable: true, writable: true },
1179
+ closed: {
1180
+ get() {
1181
+ return this._subscription._closed;
1182
+ },
1183
+ configurable: true
1184
+ },
1185
+ next: {
1186
+ value: function next(value) {
1187
+ const subscription = this._subscription;
1188
+ if (subscription._closed)
1189
+ return;
1190
+ const observer = subscription._observer;
1191
+ try {
1192
+ const m = getMethod(observer, "next");
1193
+ if (!m)
1194
+ return;
1195
+ return m.call(observer, value);
1196
+ } catch (e) {
1197
+ try {
1198
+ this.error(e);
1199
+ } catch (err) {
1200
+ hostReportError(err);
1201
+ }
1202
+ }
1203
+ },
1204
+ configurable: true,
1205
+ writable: true
1206
+ },
1207
+ error: {
1208
+ value: function error(errorValue) {
1209
+ const subscription = this._subscription;
1210
+ if (subscription._closed)
1211
+ throw errorValue;
1212
+ subscription._closed = true;
1213
+ const observer = subscription._observer;
1214
+ try {
1215
+ const m = getMethod(observer, "error");
1216
+ if (m) {
1217
+ return m.call(observer, errorValue);
1218
+ }
1219
+ throw errorValue;
1220
+ } finally {
1221
+ subscription._cleanup();
1222
+ }
1223
+ },
1224
+ configurable: true,
1225
+ writable: true
1226
+ },
1227
+ complete: {
1228
+ value: function complete(value) {
1229
+ const subscription = this._subscription;
1230
+ if (subscription._closed)
1231
+ return;
1232
+ subscription._closed = true;
1233
+ const observer = subscription._observer;
1234
+ try {
1235
+ const m = getMethod(observer, "complete");
1236
+ if (m) {
1237
+ return m.call(observer, value);
1238
+ }
1239
+ return;
1240
+ } finally {
1241
+ subscription._cleanup();
1242
+ }
1243
+ },
1244
+ configurable: true,
1245
+ writable: true
1246
+ }
1247
+ });
1248
+ Object.defineProperty(SubscriptionObserverImpl.prototype.next, "length", { value: 1 });
1249
+ Object.defineProperty(SubscriptionObserverImpl.prototype.error, "length", { value: 1 });
1250
+ Object.defineProperty(SubscriptionObserverImpl.prototype.complete, "length", {
1251
+ value: 1
1252
+ });
1253
+ function Subscription(observer, subscriber) {
1254
+ this._observer = observer;
1255
+ this._cleanupFn = undefined;
1256
+ this._closed = false;
1257
+ const subscriptionObserver = new SubscriptionObserverImpl(this);
1258
+ try {
1259
+ const start = getMethod(observer, "start");
1260
+ if (start) {
1261
+ start.call(observer, this);
1262
+ }
1263
+ } catch (e) {
1264
+ hostReportError(e);
1265
+ }
1266
+ if (this._closed)
1267
+ return;
1268
+ try {
1269
+ const cleanup = subscriber(subscriptionObserver);
1270
+ if (cleanup != null) {
1271
+ if (typeof cleanup !== "function" && typeof cleanup.unsubscribe !== "function") {
1272
+ throw new TypeError(cleanup + " is not a function or a subscription");
1273
+ }
1274
+ this._cleanupFn = cleanup;
1275
+ if (this._closed) {
1276
+ this._cleanup();
1277
+ }
1278
+ }
1279
+ } catch (e) {
1280
+ subscriptionObserver.error(e);
1281
+ }
1282
+ }
1283
+ Subscription.prototype = Object.create(Object.prototype);
1284
+ Object.defineProperties(Subscription.prototype, {
1285
+ constructor: { value: Object, configurable: true, writable: true },
1286
+ closed: {
1287
+ get() {
1288
+ return this._closed;
1289
+ },
1290
+ configurable: true
1291
+ },
1292
+ unsubscribe: {
1293
+ value: function unsubscribe() {
1294
+ if (this._closed)
1295
+ return;
1296
+ this._closed = true;
1297
+ this._cleanup();
1298
+ },
1299
+ configurable: true,
1300
+ writable: true
1301
+ },
1302
+ _cleanup: {
1303
+ value: function _cleanup() {
1304
+ const cleanup = this._cleanupFn;
1305
+ if (!cleanup)
1306
+ return;
1307
+ this._cleanupFn = undefined;
1308
+ try {
1309
+ if (typeof cleanup === "function") {
1310
+ cleanup();
1311
+ } else if (cleanup && typeof cleanup.unsubscribe === "function") {
1312
+ cleanup.unsubscribe();
1313
+ }
1314
+ } catch (e) {
1315
+ hostReportError(e);
1316
+ }
1317
+ },
1318
+ configurable: true,
1319
+ writable: true
1320
+ }
1321
+ });
1118
1322
 
1323
+ class Observable {
1324
+ _subscriber;
1325
+ constructor(subscriber) {
1326
+ if (typeof subscriber !== "function") {
1327
+ throw new TypeError("Observable initializer must be a function");
1328
+ }
1329
+ this._subscriber = subscriber;
1330
+ }
1331
+ subscribe(observerOrNext, error2, complete2) {
1332
+ let observer;
1333
+ if (typeof observerOrNext === "function") {
1334
+ observer = {
1335
+ next: observerOrNext,
1336
+ error: error2,
1337
+ complete: complete2
1338
+ };
1339
+ } else if (typeof observerOrNext !== "object" || observerOrNext === null) {
1340
+ throw new TypeError(observerOrNext + " is not an object");
1341
+ } else {
1342
+ observer = observerOrNext;
1343
+ }
1344
+ return new Subscription(observer, this._subscriber);
1345
+ }
1346
+ [SymbolObservable]() {
1347
+ return this;
1348
+ }
1349
+ static of(...items) {
1350
+ const C = typeof this === "function" ? this : Observable;
1351
+ return new C((observer) => {
1352
+ for (let i = 0;i < items.length; ++i) {
1353
+ observer.next(items[i]);
1354
+ if (observer.closed)
1355
+ return;
1356
+ }
1357
+ observer.complete();
1358
+ });
1359
+ }
1360
+ static from(x) {
1361
+ const C = typeof this === "function" ? this : Observable;
1362
+ if (x == null)
1363
+ throw new TypeError(x + " is not an object");
1364
+ const method = x[SymbolObservable];
1365
+ if (method != null) {
1366
+ if (typeof method !== "function") {
1367
+ throw new TypeError(method + " is not a function");
1368
+ }
1369
+ const observable = method.call(x);
1370
+ if (Object(observable) !== observable) {
1371
+ throw new TypeError(observable + " is not an object");
1372
+ }
1373
+ if (observable.constructor === C) {
1374
+ return observable;
1375
+ }
1376
+ return new C((observer) => observable.subscribe(observer));
1377
+ }
1378
+ if (Symbol.iterator in x) {
1379
+ return new C((observer) => {
1380
+ for (const item of x) {
1381
+ observer.next(item);
1382
+ if (observer.closed)
1383
+ return;
1384
+ }
1385
+ observer.complete();
1386
+ });
1387
+ }
1388
+ throw new TypeError(x + " is not observable");
1389
+ }
1390
+ }
1391
+ var PROXY_MARKER = Symbol.for("@lasercat/event-emission/proxy");
1392
+ var ORIGINAL_TARGET = Symbol.for("@lasercat/event-emission/original");
1393
+ var ARRAY_MUTATORS = new Set([
1394
+ "push",
1395
+ "pop",
1396
+ "shift",
1397
+ "unshift",
1398
+ "splice",
1399
+ "sort",
1400
+ "reverse",
1401
+ "fill",
1402
+ "copyWithin"
1403
+ ]);
1404
+ function isProxyable(value) {
1405
+ return value !== null && typeof value === "object" && !isProxied(value) && !(value instanceof Date) && !(value instanceof RegExp) && !(value instanceof Map) && !(value instanceof Set) && !(value instanceof WeakMap) && !(value instanceof WeakSet) && !(value instanceof Promise) && !(value instanceof Error) && !(value instanceof ArrayBuffer) && !ArrayBuffer.isView(value);
1406
+ }
1407
+ function isProxied(value) {
1408
+ return typeof value === "object" && value !== null && value[PROXY_MARKER] === true;
1409
+ }
1410
+ function isArrayMutator(prop) {
1411
+ return typeof prop === "string" && ARRAY_MUTATORS.has(prop);
1412
+ }
1413
+ function cloneAlongPath(obj, path) {
1414
+ const isArray = Array.isArray(obj);
1415
+ const rootClone = isArray ? [...obj] : { ...obj };
1416
+ if (!path || isArray) {
1417
+ return rootClone;
1418
+ }
1419
+ const parts = path.split(".");
1420
+ const result = rootClone;
1421
+ let current = result;
1422
+ for (let i = 0;i < parts.length; i++) {
1423
+ const key = parts[i];
1424
+ const value = current[key];
1425
+ if (value !== null && typeof value === "object") {
1426
+ current[key] = Array.isArray(value) ? [...value] : { ...value };
1427
+ if (i < parts.length - 1) {
1428
+ current = current[key];
1429
+ }
1430
+ } else {
1431
+ break;
1432
+ }
1433
+ }
1434
+ return result;
1435
+ }
1436
+ function cloneForComparison(obj, strategy, changedPath, deepClone) {
1437
+ if (obj === null || typeof obj !== "object")
1438
+ return obj;
1439
+ switch (strategy) {
1440
+ case "shallow":
1441
+ return Array.isArray(obj) ? [...obj] : { ...obj };
1442
+ case "deep":
1443
+ if (deepClone) {
1444
+ return deepClone(obj);
1445
+ }
1446
+ if (typeof structuredClone !== "function") {
1447
+ throw new Error("structuredClone is not available in this runtime; provide observe.deepClone, or use cloneStrategy 'path' or 'shallow'.");
1448
+ }
1449
+ return structuredClone(obj);
1450
+ case "path":
1451
+ return cloneAlongPath(obj, changedPath);
1452
+ default:
1453
+ return obj;
1454
+ }
1455
+ }
1456
+ function computeArrayDiff(method, before, _after, args) {
1457
+ switch (method) {
1458
+ case "push":
1459
+ return { added: args };
1460
+ case "pop":
1461
+ return { removed: before.length > 0 ? [before[before.length - 1]] : [] };
1462
+ case "shift":
1463
+ return { removed: before.length > 0 ? [before[0]] : [] };
1464
+ case "unshift":
1465
+ return { added: args };
1466
+ case "splice": {
1467
+ const [start, deleteCount, ...items] = args;
1468
+ const actualStart = start < 0 ? Math.max(before.length + start, 0) : Math.min(start, before.length);
1469
+ const actualDeleteCount = Math.min(deleteCount ?? before.length - actualStart, before.length - actualStart);
1470
+ return {
1471
+ removed: before.slice(actualStart, actualStart + actualDeleteCount),
1472
+ added: items
1473
+ };
1474
+ }
1475
+ case "sort":
1476
+ case "reverse":
1477
+ case "fill":
1478
+ case "copyWithin":
1479
+ return {};
1480
+ default:
1481
+ return {};
1482
+ }
1483
+ }
1484
+ var proxyRegistry = new WeakMap;
1485
+ function getContextRegistry(target) {
1486
+ let contextMap = proxyRegistry.get(target);
1487
+ if (!contextMap) {
1488
+ contextMap = new WeakMap;
1489
+ proxyRegistry.set(target, contextMap);
1490
+ }
1491
+ return contextMap;
1492
+ }
1493
+ function createArrayMethodInterceptor(array, method, path, context) {
1494
+ const original = array[method];
1495
+ return function(...args) {
1496
+ const previousState = cloneForComparison(context.originalRoot, context.options.cloneStrategy, path, context.options.deepClone);
1497
+ const previousItems = [...array];
1498
+ const result = original.apply(this, args);
1499
+ const { added, removed } = computeArrayDiff(method, previousItems, array, args);
1500
+ const methodEventPath = path ? `update:${path}.${method}` : `update:${method}`;
1501
+ const arrayEventPath = path ? `update:${path}` : "update:";
1502
+ context.eventTarget.dispatchEvent({
1503
+ type: methodEventPath,
1504
+ detail: {
1505
+ method,
1506
+ args,
1507
+ result,
1508
+ added,
1509
+ removed,
1510
+ current: context.originalRoot,
1511
+ previous: previousState
1512
+ }
1513
+ });
1514
+ if (path) {
1515
+ context.eventTarget.dispatchEvent({
1516
+ type: arrayEventPath,
1517
+ detail: {
1518
+ value: array,
1519
+ current: context.originalRoot,
1520
+ previous: previousState
1521
+ }
1522
+ });
1523
+ }
1524
+ context.eventTarget.dispatchEvent({
1525
+ type: "update",
1526
+ detail: {
1527
+ current: context.originalRoot,
1528
+ previous: previousState
1529
+ }
1530
+ });
1531
+ return result;
1532
+ };
1533
+ }
1534
+ function createObservableProxyInternal(target, path, context) {
1535
+ const contextRegistry = getContextRegistry(target);
1536
+ const existing = contextRegistry.get(context);
1537
+ if (existing) {
1538
+ return existing.proxy;
1539
+ }
1540
+ const proxy = new Proxy(target, {
1541
+ get(obj, prop, receiver) {
1542
+ if (prop === PROXY_MARKER)
1543
+ return true;
1544
+ if (prop === ORIGINAL_TARGET)
1545
+ return obj;
1546
+ if (typeof prop === "symbol") {
1547
+ return Reflect.get(obj, prop, receiver);
1548
+ }
1549
+ const value = Reflect.get(obj, prop, receiver);
1550
+ if (Array.isArray(obj) && isArrayMutator(prop)) {
1551
+ return createArrayMethodInterceptor(obj, prop, path, context);
1552
+ }
1553
+ if (context.options.deep && isProxyable(value)) {
1554
+ const nestedPath = path ? `${path}.${prop}` : prop;
1555
+ return createObservableProxyInternal(value, nestedPath, context);
1556
+ }
1557
+ return value;
1558
+ },
1559
+ set(obj, prop, value, receiver) {
1560
+ if (typeof prop === "symbol") {
1561
+ return Reflect.set(obj, prop, value, receiver);
1562
+ }
1563
+ const oldValue = Reflect.get(obj, prop, receiver);
1564
+ if (Object.is(oldValue, value)) {
1565
+ return true;
1566
+ }
1567
+ const propPath = path ? `${path}.${prop}` : prop;
1568
+ const previousState = cloneForComparison(context.originalRoot, context.options.cloneStrategy, propPath, context.options.deepClone);
1569
+ const success = Reflect.set(obj, prop, value, receiver);
1570
+ if (success) {
1571
+ context.eventTarget.dispatchEvent({
1572
+ type: `update:${propPath}`,
1573
+ detail: {
1574
+ value,
1575
+ current: context.originalRoot,
1576
+ previous: previousState
1577
+ }
1578
+ });
1579
+ context.eventTarget.dispatchEvent({
1580
+ type: "update",
1581
+ detail: {
1582
+ current: context.originalRoot,
1583
+ previous: previousState
1584
+ }
1585
+ });
1586
+ }
1587
+ return success;
1588
+ },
1589
+ deleteProperty(obj, prop) {
1590
+ if (typeof prop === "symbol") {
1591
+ return Reflect.deleteProperty(obj, prop);
1592
+ }
1593
+ const propPath = path ? `${path}.${String(prop)}` : String(prop);
1594
+ const previousState = cloneForComparison(context.originalRoot, context.options.cloneStrategy, propPath, context.options.deepClone);
1595
+ const success = Reflect.deleteProperty(obj, prop);
1596
+ if (success) {
1597
+ context.eventTarget.dispatchEvent({
1598
+ type: `update:${propPath}`,
1599
+ detail: {
1600
+ value: undefined,
1601
+ current: context.originalRoot,
1602
+ previous: previousState
1603
+ }
1604
+ });
1605
+ context.eventTarget.dispatchEvent({
1606
+ type: "update",
1607
+ detail: {
1608
+ current: context.originalRoot,
1609
+ previous: previousState
1610
+ }
1611
+ });
1612
+ }
1613
+ return success;
1614
+ }
1615
+ });
1616
+ contextRegistry.set(context, {
1617
+ proxy,
1618
+ path
1619
+ });
1620
+ return proxy;
1621
+ }
1622
+ function isEventTarget(obj) {
1623
+ return typeof obj === "object" && obj !== null && typeof obj.addEventListener === "function" && typeof obj.removeEventListener === "function" && typeof obj.dispatchEvent === "function";
1624
+ }
1625
+ function setupEventForwarding(source, target) {
1626
+ const handlers = new Map;
1627
+ const sourceAddEventListener = source.addEventListener.bind(source);
1628
+ const sourceRemoveEventListener = source.removeEventListener.bind(source);
1629
+ const forwardHandler = (type) => (event) => {
1630
+ const detail = event.detail ?? event;
1631
+ target.dispatchEvent({
1632
+ type,
1633
+ detail
1634
+ });
1635
+ };
1636
+ const originalAddEventListener = target.addEventListener.bind(target);
1637
+ const wrappedAddEventListener = (type, listener, options) => {
1638
+ if (!handlers.has(type) && type !== "update" && !type.startsWith("update:")) {
1639
+ const handler = forwardHandler(type);
1640
+ handlers.set(type, handler);
1641
+ sourceAddEventListener(type, handler);
1642
+ }
1643
+ return originalAddEventListener(type, listener, options);
1644
+ };
1645
+ target.addEventListener = wrappedAddEventListener;
1646
+ return () => {
1647
+ target.addEventListener = originalAddEventListener;
1648
+ for (const [type, handler] of handlers) {
1649
+ sourceRemoveEventListener(type, handler);
1650
+ }
1651
+ handlers.clear();
1652
+ };
1653
+ }
1654
+ function createObservableProxy(target, eventTarget, options) {
1655
+ const resolvedOptions = {
1656
+ deep: options?.deep ?? true,
1657
+ cloneStrategy: options?.cloneStrategy ?? "path",
1658
+ deepClone: options?.deepClone
1659
+ };
1660
+ const context = {
1661
+ eventTarget,
1662
+ originalRoot: target,
1663
+ options: resolvedOptions
1664
+ };
1665
+ const proxy = createObservableProxyInternal(target, "", context);
1666
+ if (isEventTarget(target)) {
1667
+ const cleanupForwarding = setupEventForwarding(target, eventTarget);
1668
+ const maybeComplete = eventTarget.complete;
1669
+ if (typeof maybeComplete === "function") {
1670
+ const originalComplete = maybeComplete.bind(eventTarget);
1671
+ let cleaned = false;
1672
+ eventTarget.complete = () => {
1673
+ if (!cleaned) {
1674
+ cleaned = true;
1675
+ cleanupForwarding();
1676
+ }
1677
+ return originalComplete();
1678
+ };
1679
+ }
1680
+ }
1681
+ return proxy;
1682
+ }
1683
+
1684
+ class BufferOverflowError extends Error {
1685
+ constructor(eventType, bufferSize) {
1686
+ super(`Buffer overflow for event type "${eventType}" (max: ${bufferSize})`);
1687
+ this.name = "BufferOverflowError";
1688
+ }
1689
+ }
1690
+ function matchesWildcard(eventType, pattern) {
1691
+ if (pattern === "*")
1692
+ return true;
1693
+ return pattern.endsWith(":*") && eventType.startsWith(pattern.slice(0, -2) + ":");
1694
+ }
1695
+ var EVENT_STATE = Symbol("event-emission:event-state");
1696
+ function createEventTarget(targetOrOpts, opts) {
1697
+ if (opts?.observe === true && targetOrOpts && typeof targetOrOpts === "object") {
1698
+ const target = targetOrOpts;
1699
+ const eventTarget = createEventTargetInternal({
1700
+ onListenerError: opts.onListenerError
1701
+ });
1702
+ const proxy = createObservableProxy(target, eventTarget, {
1703
+ deep: opts.deep,
1704
+ cloneStrategy: opts.cloneStrategy,
1705
+ deepClone: opts.deepClone
1706
+ });
1707
+ const methodNames = [
1708
+ "addEventListener",
1709
+ "removeEventListener",
1710
+ "dispatchEvent",
1711
+ "clear",
1712
+ "on",
1713
+ "once",
1714
+ "removeAllListeners",
1715
+ "pipe",
1716
+ "addWildcardListener",
1717
+ "removeWildcardListener",
1718
+ "complete",
1719
+ "subscribe",
1720
+ "toObservable",
1721
+ "events"
1722
+ ];
1723
+ for (const name of methodNames) {
1724
+ Object.defineProperty(proxy, name, {
1725
+ value: eventTarget[name],
1726
+ writable: false,
1727
+ enumerable: false,
1728
+ configurable: true
1729
+ });
1730
+ }
1731
+ Object.defineProperty(proxy, "completed", {
1732
+ get: () => eventTarget.completed,
1733
+ enumerable: false,
1734
+ configurable: true
1735
+ });
1736
+ return proxy;
1737
+ }
1738
+ return createEventTargetInternal(targetOrOpts);
1739
+ }
1740
+ function createEventTargetInternal(opts) {
1741
+ const listeners = new Map;
1742
+ const wildcardListeners = new Set;
1743
+ let isCompleted = false;
1744
+ const completionCallbacks = new Set;
1745
+ const now = () => typeof globalThis.performance?.now === "function" ? globalThis.performance.now() : Date.now();
1746
+ const initializeEventState = (state, type, bubbles, cancelable) => {
1747
+ state.initializedFlag = true;
1748
+ state.stopPropagationFlag = false;
1749
+ state.stopImmediatePropagationFlag = false;
1750
+ state.canceledFlag = false;
1751
+ state.isTrusted = false;
1752
+ state.target = null;
1753
+ state.currentTarget = null;
1754
+ state.eventPhase = 0;
1755
+ state.type = type;
1756
+ state.bubbles = bubbles;
1757
+ state.cancelable = cancelable;
1758
+ };
1759
+ const setCanceledFlag = (state) => {
1760
+ if (state.cancelable && !state.inPassiveListenerFlag) {
1761
+ state.canceledFlag = true;
1762
+ }
1763
+ };
1764
+ const createEvent = (type, detail, init) => {
1765
+ const state = {
1766
+ dispatchFlag: false,
1767
+ initializedFlag: true,
1768
+ stopPropagationFlag: false,
1769
+ stopImmediatePropagationFlag: false,
1770
+ canceledFlag: false,
1771
+ inPassiveListenerFlag: false,
1772
+ composedFlag: Boolean(init?.composed),
1773
+ eventPhase: init?.eventPhase ?? 0,
1774
+ currentTarget: init?.currentTarget ?? init?.target ?? null,
1775
+ target: init?.target ?? null,
1776
+ timeStamp: init?.timeStamp ?? now(),
1777
+ path: [],
1778
+ type,
1779
+ bubbles: Boolean(init?.bubbles),
1780
+ cancelable: Boolean(init?.cancelable),
1781
+ isTrusted: false
1782
+ };
1783
+ const event = { detail };
1784
+ Object.defineProperties(event, {
1785
+ type: {
1786
+ get: () => state.type,
1787
+ enumerable: true,
1788
+ configurable: true
1789
+ },
1790
+ bubbles: {
1791
+ get: () => state.bubbles,
1792
+ enumerable: true,
1793
+ configurable: true
1794
+ },
1795
+ cancelable: {
1796
+ get: () => state.cancelable,
1797
+ enumerable: true,
1798
+ configurable: true
1799
+ },
1800
+ cancelBubble: {
1801
+ get: () => state.stopPropagationFlag,
1802
+ set: (value) => {
1803
+ if (value)
1804
+ state.stopPropagationFlag = true;
1805
+ },
1806
+ enumerable: true,
1807
+ configurable: true
1808
+ },
1809
+ composed: {
1810
+ get: () => state.composedFlag,
1811
+ enumerable: true,
1812
+ configurable: true
1813
+ },
1814
+ currentTarget: {
1815
+ get: () => state.currentTarget,
1816
+ enumerable: true,
1817
+ configurable: true
1818
+ },
1819
+ defaultPrevented: {
1820
+ get: () => state.canceledFlag,
1821
+ enumerable: true,
1822
+ configurable: true
1823
+ },
1824
+ eventPhase: {
1825
+ get: () => state.eventPhase,
1826
+ enumerable: true,
1827
+ configurable: true
1828
+ },
1829
+ isTrusted: {
1830
+ get: () => state.isTrusted,
1831
+ enumerable: true,
1832
+ configurable: true
1833
+ },
1834
+ returnValue: {
1835
+ get: () => !state.canceledFlag,
1836
+ set: (value) => {
1837
+ if (value === false)
1838
+ setCanceledFlag(state);
1839
+ },
1840
+ enumerable: true,
1841
+ configurable: true
1842
+ },
1843
+ srcElement: {
1844
+ get: () => state.target,
1845
+ enumerable: true,
1846
+ configurable: true
1847
+ },
1848
+ target: {
1849
+ get: () => state.target,
1850
+ enumerable: true,
1851
+ configurable: true
1852
+ },
1853
+ timeStamp: {
1854
+ get: () => state.timeStamp,
1855
+ enumerable: true,
1856
+ configurable: true
1857
+ },
1858
+ composedPath: {
1859
+ value: () => state.path.map((entry) => entry.invocationTarget),
1860
+ enumerable: true,
1861
+ configurable: true
1862
+ },
1863
+ initEvent: {
1864
+ value: (newType, bubbles = false, cancelable = false) => {
1865
+ if (state.dispatchFlag)
1866
+ return;
1867
+ initializeEventState(state, newType, Boolean(bubbles), Boolean(cancelable));
1868
+ },
1869
+ enumerable: true,
1870
+ configurable: true
1871
+ },
1872
+ preventDefault: {
1873
+ value: () => setCanceledFlag(state),
1874
+ enumerable: true,
1875
+ configurable: true
1876
+ },
1877
+ stopImmediatePropagation: {
1878
+ value: () => {
1879
+ state.stopPropagationFlag = true;
1880
+ state.stopImmediatePropagationFlag = true;
1881
+ },
1882
+ enumerable: true,
1883
+ configurable: true
1884
+ },
1885
+ stopPropagation: {
1886
+ value: () => {
1887
+ state.stopPropagationFlag = true;
1888
+ },
1889
+ enumerable: true,
1890
+ configurable: true
1891
+ },
1892
+ NONE: { value: 0, enumerable: true, configurable: true },
1893
+ CAPTURING_PHASE: { value: 1, enumerable: true, configurable: true },
1894
+ AT_TARGET: { value: 2, enumerable: true, configurable: true },
1895
+ BUBBLING_PHASE: { value: 3, enumerable: true, configurable: true },
1896
+ [EVENT_STATE]: {
1897
+ value: state,
1898
+ enumerable: false,
1899
+ configurable: false
1900
+ }
1901
+ });
1902
+ return event;
1903
+ };
1904
+ const getEventState = (event) => event[EVENT_STATE];
1905
+ const normalizeAddListenerOptions = (options) => {
1906
+ if (typeof options === "boolean") {
1907
+ return {
1908
+ capture: options,
1909
+ passive: false,
1910
+ once: false,
1911
+ signal: null
1912
+ };
1913
+ }
1914
+ return {
1915
+ capture: Boolean(options?.capture),
1916
+ passive: Boolean(options?.passive),
1917
+ once: Boolean(options?.once),
1918
+ signal: options?.signal ?? null
1919
+ };
1920
+ };
1921
+ const normalizeCaptureOption = (options) => {
1922
+ if (typeof options === "boolean")
1923
+ return options;
1924
+ return Boolean(options?.capture);
1925
+ };
1926
+ const removeListenerRecord = (type, record) => {
1927
+ if (record.removed)
1928
+ return;
1929
+ record.removed = true;
1930
+ const list = listeners.get(type);
1931
+ if (list) {
1932
+ const idx = list.indexOf(record);
1933
+ if (idx >= 0)
1934
+ list.splice(idx, 1);
1935
+ if (list.length === 0)
1936
+ listeners.delete(type);
1937
+ }
1938
+ if (record.signal && record.abortHandler) {
1939
+ record.signal.removeEventListener("abort", record.abortHandler);
1940
+ }
1941
+ };
1942
+ const handleListenerError = (eventType, error2) => {
1943
+ if (eventType === "error")
1944
+ return;
1945
+ if (opts?.onListenerError) {
1946
+ opts.onListenerError(eventType, error2);
1947
+ return;
1948
+ }
1949
+ const errorListeners = listeners.get("error");
1950
+ if (errorListeners && errorListeners.length > 0) {
1951
+ dispatchEvent({ type: "error", detail: error2 });
1952
+ } else {
1953
+ throw error2;
1954
+ }
1955
+ };
1956
+ const notifyWildcardListeners = (eventType, event) => {
1957
+ if (wildcardListeners.size === 0)
1958
+ return;
1959
+ for (const rec of Array.from(wildcardListeners)) {
1960
+ if (!matchesWildcard(eventType, rec.pattern))
1961
+ continue;
1962
+ const baseEvent = createEvent(rec.pattern, event.detail, {
1963
+ target,
1964
+ currentTarget: target,
1965
+ eventPhase: 2,
1966
+ bubbles: event.bubbles,
1967
+ cancelable: event.cancelable,
1968
+ composed: event.composed
1969
+ });
1970
+ const wildcardEvent = Object.defineProperties(baseEvent, {
1971
+ originalType: { value: eventType, enumerable: true, configurable: true }
1972
+ });
1973
+ try {
1974
+ const fn = rec.fn;
1975
+ const res = fn(wildcardEvent);
1976
+ if (res && typeof res.then === "function") {
1977
+ res.catch((error2) => {
1978
+ try {
1979
+ handleListenerError(eventType, error2);
1980
+ } catch (rethrown) {
1981
+ queueMicrotask(() => {
1982
+ throw rethrown;
1983
+ });
1984
+ }
1985
+ });
1986
+ }
1987
+ } catch (error2) {
1988
+ handleListenerError(eventType, error2);
1989
+ } finally {
1990
+ if (rec.once)
1991
+ wildcardListeners.delete(rec);
1992
+ }
1993
+ const state = getEventState(wildcardEvent);
1994
+ if (state?.stopImmediatePropagationFlag || state?.stopPropagationFlag) {
1995
+ break;
1996
+ }
1997
+ }
1998
+ };
1999
+ const addEventListener = (type, listener, options) => {
2000
+ if (isCompleted || !listener) {
2001
+ return () => {};
2002
+ }
2003
+ const { capture, passive, once, signal } = normalizeAddListenerOptions(options);
2004
+ let list = listeners.get(type);
2005
+ if (!list) {
2006
+ list = [];
2007
+ listeners.set(type, list);
2008
+ }
2009
+ for (const existing of list) {
2010
+ if (existing.original === listener && existing.capture === capture) {
2011
+ return () => removeEventListener(type, listener, options);
2012
+ }
2013
+ }
2014
+ const original = listener;
2015
+ const callback = typeof listener === "function" ? listener : (event) => listener.handleEvent(event);
2016
+ const record = {
2017
+ type,
2018
+ original,
2019
+ callback,
2020
+ capture,
2021
+ passive,
2022
+ once,
2023
+ signal,
2024
+ removed: false
2025
+ };
2026
+ list.push(record);
2027
+ const unsubscribe2 = () => removeListenerRecord(type, record);
2028
+ if (signal) {
2029
+ const onAbort = () => removeListenerRecord(type, record);
2030
+ record.abortHandler = onAbort;
2031
+ signal.addEventListener("abort", onAbort, { once: true });
2032
+ if (signal.aborted)
2033
+ onAbort();
2034
+ }
2035
+ return unsubscribe2;
2036
+ };
2037
+ const addWildcardListener = (pattern, listener, options) => {
2038
+ if (isCompleted)
2039
+ return () => {};
2040
+ const opts2 = options ?? {};
2041
+ for (const existing of wildcardListeners) {
2042
+ if (existing.pattern === pattern && existing.fn === listener) {
2043
+ return () => removeWildcardListener(pattern, listener);
2044
+ }
2045
+ }
2046
+ const record = {
2047
+ fn: listener,
2048
+ pattern,
2049
+ once: opts2.once,
2050
+ signal: opts2.signal
2051
+ };
2052
+ wildcardListeners.add(record);
2053
+ const unsubscribe2 = () => {
2054
+ wildcardListeners.delete(record);
2055
+ if (record.signal && record.abortHandler) {
2056
+ record.signal.removeEventListener("abort", record.abortHandler);
2057
+ }
2058
+ };
2059
+ if (opts2.signal) {
2060
+ const onAbort = () => unsubscribe2();
2061
+ record.abortHandler = onAbort;
2062
+ opts2.signal.addEventListener("abort", onAbort, { once: true });
2063
+ if (opts2.signal.aborted)
2064
+ onAbort();
2065
+ }
2066
+ return unsubscribe2;
2067
+ };
2068
+ const removeWildcardListener = (pattern, listener) => {
2069
+ for (const record of Array.from(wildcardListeners)) {
2070
+ if (record.pattern === pattern && record.fn === listener) {
2071
+ wildcardListeners.delete(record);
2072
+ if (record.signal && record.abortHandler) {
2073
+ record.signal.removeEventListener("abort", record.abortHandler);
2074
+ }
2075
+ }
2076
+ }
2077
+ };
2078
+ const invokeListeners = (eventType, event, phase, listenersSnapshot) => {
2079
+ const state = getEventState(event);
2080
+ if (!state || state.stopPropagationFlag)
2081
+ return;
2082
+ state.currentTarget = target;
2083
+ state.target = target;
2084
+ state.eventPhase = event.AT_TARGET;
2085
+ for (const rec of listenersSnapshot) {
2086
+ if (rec.removed)
2087
+ continue;
2088
+ if (phase === "capturing" && !rec.capture)
2089
+ continue;
2090
+ if (phase === "bubbling" && rec.capture)
2091
+ continue;
2092
+ if (rec.once)
2093
+ removeListenerRecord(rec.type, rec);
2094
+ if (rec.passive)
2095
+ state.inPassiveListenerFlag = true;
2096
+ try {
2097
+ const res = rec.callback.call(state.currentTarget, event);
2098
+ if (res && typeof res.then === "function") {
2099
+ res.catch((error2) => {
2100
+ try {
2101
+ handleListenerError(eventType, error2);
2102
+ } catch (rethrown) {
2103
+ queueMicrotask(() => {
2104
+ throw rethrown;
2105
+ });
2106
+ }
2107
+ });
2108
+ }
2109
+ } catch (error2) {
2110
+ handleListenerError(eventType, error2);
2111
+ } finally {
2112
+ if (rec.passive)
2113
+ state.inPassiveListenerFlag = false;
2114
+ }
2115
+ if (state.stopImmediatePropagationFlag)
2116
+ break;
2117
+ }
2118
+ };
2119
+ const dispatchEvent = (eventInput) => {
2120
+ if (isCompleted)
2121
+ return false;
2122
+ let event;
2123
+ let state;
2124
+ if (eventInput && typeof eventInput === "object") {
2125
+ state = getEventState(eventInput);
2126
+ if (state) {
2127
+ event = eventInput;
2128
+ } else {
2129
+ const input = eventInput;
2130
+ if (typeof input.type !== "string") {
2131
+ throw new TypeError("Event type must be a string");
2132
+ }
2133
+ event = createEvent(input.type, input.detail, {
2134
+ bubbles: input.bubbles,
2135
+ cancelable: input.cancelable,
2136
+ composed: input.composed,
2137
+ timeStamp: input.timeStamp
2138
+ });
2139
+ state = getEventState(event);
2140
+ }
2141
+ } else {
2142
+ throw new TypeError("dispatchEvent expects an event object");
2143
+ }
2144
+ const dispatchState = state ?? getEventState(event);
2145
+ if (dispatchState.dispatchFlag || !dispatchState.initializedFlag) {
2146
+ const message = "Failed to execute dispatchEvent: event is already being dispatched";
2147
+ if (typeof globalThis.DOMException === "function") {
2148
+ throw new globalThis.DOMException(message, "InvalidStateError");
2149
+ }
2150
+ const err = new Error(message);
2151
+ err.name = "InvalidStateError";
2152
+ throw err;
2153
+ }
2154
+ dispatchState.isTrusted = false;
2155
+ dispatchState.dispatchFlag = true;
2156
+ dispatchState.path = [
2157
+ {
2158
+ invocationTarget: target,
2159
+ invocationTargetInShadowTree: false,
2160
+ shadowAdjustedTarget: target,
2161
+ relatedTarget: null,
2162
+ touchTargets: [],
2163
+ rootOfClosedTree: false,
2164
+ slotInClosedTree: false
2165
+ }
2166
+ ];
2167
+ notifyWildcardListeners(dispatchState.type, event);
2168
+ const list = listeners.get(dispatchState.type);
2169
+ const snapshot = list ? list.slice() : [];
2170
+ invokeListeners(dispatchState.type, event, "capturing", snapshot);
2171
+ invokeListeners(dispatchState.type, event, "bubbling", snapshot);
2172
+ dispatchState.eventPhase = event.NONE;
2173
+ dispatchState.currentTarget = null;
2174
+ dispatchState.path = [];
2175
+ dispatchState.dispatchFlag = false;
2176
+ dispatchState.stopPropagationFlag = false;
2177
+ dispatchState.stopImmediatePropagationFlag = false;
2178
+ return !dispatchState.canceledFlag;
2179
+ };
2180
+ const removeEventListener = (type, listener, options) => {
2181
+ if (!listener)
2182
+ return;
2183
+ const capture = normalizeCaptureOption(options);
2184
+ const list = listeners.get(type);
2185
+ if (!list)
2186
+ return;
2187
+ for (const record of [...list]) {
2188
+ if (record.original === listener && record.capture === capture) {
2189
+ removeListenerRecord(type, record);
2190
+ }
2191
+ }
2192
+ };
2193
+ const clear = () => {
2194
+ for (const [type, list] of Array.from(listeners.entries())) {
2195
+ for (const record of [...list]) {
2196
+ removeListenerRecord(type, record);
2197
+ }
2198
+ }
2199
+ listeners.clear();
2200
+ for (const record of wildcardListeners) {
2201
+ if (record.signal && record.abortHandler) {
2202
+ record.signal.removeEventListener("abort", record.abortHandler);
2203
+ }
2204
+ }
2205
+ wildcardListeners.clear();
2206
+ };
2207
+ const on = (type, options) => {
2208
+ return new Observable((observer) => {
2209
+ let opts2;
2210
+ if (typeof options === "boolean") {
2211
+ opts2 = { capture: options };
2212
+ } else {
2213
+ opts2 = options ?? {};
2214
+ }
2215
+ const handler = opts2.handler;
2216
+ const once = opts2.once;
2217
+ const eventHandler = (e) => {
2218
+ let success = false;
2219
+ try {
2220
+ if (handler) {
2221
+ handler(e);
2222
+ }
2223
+ observer.next(e);
2224
+ success = true;
2225
+ } finally {
2226
+ if (once && success) {
2227
+ observer.complete();
2228
+ }
2229
+ }
2230
+ };
2231
+ const errorHandler = (e) => {
2232
+ observer.error(e.detail);
2233
+ };
2234
+ const unsubscribeEvent = addEventListener(type, eventHandler, opts2);
2235
+ let unsubscribeError;
2236
+ if (opts2.receiveError) {
2237
+ unsubscribeError = addEventListener("error", errorHandler, opts2);
2238
+ }
2239
+ return () => {
2240
+ unsubscribeEvent();
2241
+ if (unsubscribeError) {
2242
+ unsubscribeError();
2243
+ }
2244
+ };
2245
+ });
2246
+ };
2247
+ const onceMethod = (type, listener, options) => {
2248
+ if (typeof options === "boolean") {
2249
+ return addEventListener(type, listener, { capture: options, once: true });
2250
+ }
2251
+ return addEventListener(type, listener, { ...options ?? {}, once: true });
2252
+ };
2253
+ const removeAllListeners = (type) => {
2254
+ if (type !== undefined) {
2255
+ const list = listeners.get(type);
2256
+ if (list) {
2257
+ for (const record of [...list]) {
2258
+ removeListenerRecord(type, record);
2259
+ }
2260
+ listeners.delete(type);
2261
+ }
2262
+ } else {
2263
+ for (const [eventType, list] of Array.from(listeners.entries())) {
2264
+ for (const record of [...list]) {
2265
+ removeListenerRecord(eventType, record);
2266
+ }
2267
+ }
2268
+ listeners.clear();
2269
+ for (const record of wildcardListeners) {
2270
+ if (record.signal && record.abortHandler) {
2271
+ record.signal.removeEventListener("abort", record.abortHandler);
2272
+ }
2273
+ }
2274
+ wildcardListeners.clear();
2275
+ }
2276
+ };
2277
+ const pipe = (target2, mapFn) => {
2278
+ if (isCompleted) {
2279
+ return () => {};
2280
+ }
2281
+ const unsubscribe2 = addWildcardListener("*", (event) => {
2282
+ if (mapFn) {
2283
+ const mapped = mapFn(createEvent(event.originalType, event.detail, {
2284
+ target: target2,
2285
+ currentTarget: target2,
2286
+ eventPhase: 2,
2287
+ bubbles: event.bubbles,
2288
+ cancelable: event.cancelable,
2289
+ composed: event.composed
2290
+ }));
2291
+ if (mapped !== null) {
2292
+ target2.dispatchEvent(mapped);
2293
+ }
2294
+ } else {
2295
+ target2.dispatchEvent({
2296
+ type: event.originalType,
2297
+ detail: event.detail
2298
+ });
2299
+ }
2300
+ });
2301
+ const completionUnsub = () => {
2302
+ unsubscribe2();
2303
+ };
2304
+ completionCallbacks.add(completionUnsub);
2305
+ return () => {
2306
+ completionCallbacks.delete(completionUnsub);
2307
+ unsubscribe2();
2308
+ };
2309
+ };
2310
+ const complete2 = () => {
2311
+ if (isCompleted)
2312
+ return;
2313
+ isCompleted = true;
2314
+ for (const cb of completionCallbacks) {
2315
+ try {
2316
+ cb();
2317
+ } catch (err) {
2318
+ try {
2319
+ handleListenerError("complete", err);
2320
+ } catch {}
2321
+ }
2322
+ }
2323
+ completionCallbacks.clear();
2324
+ for (const [eventType, list] of Array.from(listeners.entries())) {
2325
+ for (const record of [...list]) {
2326
+ removeListenerRecord(eventType, record);
2327
+ }
2328
+ }
2329
+ listeners.clear();
2330
+ for (const record of wildcardListeners) {
2331
+ if (record.signal && record.abortHandler) {
2332
+ record.signal.removeEventListener("abort", record.abortHandler);
2333
+ }
2334
+ }
2335
+ wildcardListeners.clear();
2336
+ };
2337
+ const subscribe = (type, observerOrNext, error2, completeHandler) => {
2338
+ let observer;
2339
+ if (typeof observerOrNext === "function") {
2340
+ observer = {
2341
+ next: observerOrNext,
2342
+ error: error2,
2343
+ complete: completeHandler
2344
+ };
2345
+ } else {
2346
+ observer = observerOrNext ?? {};
2347
+ }
2348
+ let closed = false;
2349
+ if (isCompleted) {
2350
+ if (observer.complete) {
2351
+ try {
2352
+ observer.complete();
2353
+ } catch {}
2354
+ }
2355
+ return {
2356
+ unsubscribe: () => {
2357
+ closed = true;
2358
+ },
2359
+ get closed() {
2360
+ return closed || isCompleted;
2361
+ }
2362
+ };
2363
+ }
2364
+ const unsub = addEventListener(type, (event) => {
2365
+ if (closed)
2366
+ return;
2367
+ if (observer.next) {
2368
+ try {
2369
+ observer.next(event);
2370
+ } catch (err) {
2371
+ if (observer.error) {
2372
+ try {
2373
+ observer.error(err);
2374
+ } catch {}
2375
+ }
2376
+ }
2377
+ }
2378
+ });
2379
+ const onComplete = () => {
2380
+ if (closed)
2381
+ return;
2382
+ closed = true;
2383
+ if (observer.complete) {
2384
+ try {
2385
+ observer.complete();
2386
+ } catch {}
2387
+ }
2388
+ };
2389
+ completionCallbacks.add(onComplete);
2390
+ return {
2391
+ unsubscribe: () => {
2392
+ if (closed)
2393
+ return;
2394
+ closed = true;
2395
+ completionCallbacks.delete(onComplete);
2396
+ unsub();
2397
+ },
2398
+ get closed() {
2399
+ return closed || isCompleted;
2400
+ }
2401
+ };
2402
+ };
2403
+ const toObservable = () => {
2404
+ return new Observable((observer) => {
2405
+ if (isCompleted) {
2406
+ observer.complete();
2407
+ return;
2408
+ }
2409
+ const wildcardListener = (event) => {
2410
+ observer.next(createEvent(event.originalType, event.detail, {
2411
+ target,
2412
+ currentTarget: target,
2413
+ eventPhase: 2,
2414
+ bubbles: event.bubbles,
2415
+ cancelable: event.cancelable,
2416
+ composed: event.composed
2417
+ }));
2418
+ };
2419
+ const unsubscribe2 = addWildcardListener("*", wildcardListener);
2420
+ const onComplete = () => {
2421
+ observer.complete();
2422
+ };
2423
+ completionCallbacks.add(onComplete);
2424
+ return () => {
2425
+ unsubscribe2();
2426
+ completionCallbacks.delete(onComplete);
2427
+ };
2428
+ });
2429
+ };
2430
+ function events(type, options) {
2431
+ if (isCompleted) {
2432
+ return {
2433
+ [Symbol.asyncIterator]() {
2434
+ return this;
2435
+ },
2436
+ next() {
2437
+ return Promise.resolve({
2438
+ value: undefined,
2439
+ done: true
2440
+ });
2441
+ },
2442
+ return() {
2443
+ return Promise.resolve({
2444
+ value: undefined,
2445
+ done: true
2446
+ });
2447
+ }
2448
+ };
2449
+ }
2450
+ const signal = options?.signal;
2451
+ const bufferSize = options?.bufferSize ?? Infinity;
2452
+ const overflowStrategy = options?.overflowStrategy ?? "drop-oldest";
2453
+ const buffer = [];
2454
+ let resolve = null;
2455
+ let done = false;
2456
+ let hasOverflow = false;
2457
+ let onAbort = null;
2458
+ const cleanupAbortListener = () => {
2459
+ if (signal && onAbort) {
2460
+ signal.removeEventListener("abort", onAbort);
2461
+ }
2462
+ };
2463
+ const unsub = addEventListener(type, (event) => {
2464
+ if (done)
2465
+ return;
2466
+ const typedEvent = event;
2467
+ if (resolve) {
2468
+ const r = resolve;
2469
+ resolve = null;
2470
+ r({ value: typedEvent, done: false });
2471
+ } else {
2472
+ if (buffer.length >= bufferSize && bufferSize !== Infinity) {
2473
+ switch (overflowStrategy) {
2474
+ case "drop-oldest":
2475
+ buffer.shift();
2476
+ buffer.push(typedEvent);
2477
+ break;
2478
+ case "drop-latest":
2479
+ break;
2480
+ case "throw":
2481
+ unsub();
2482
+ completionCallbacks.delete(onComplete);
2483
+ done = true;
2484
+ hasOverflow = true;
2485
+ cleanupAbortListener();
2486
+ return;
2487
+ }
2488
+ } else {
2489
+ buffer.push(typedEvent);
2490
+ }
2491
+ }
2492
+ });
2493
+ const onComplete = () => {
2494
+ done = true;
2495
+ cleanupAbortListener();
2496
+ if (resolve) {
2497
+ const r = resolve;
2498
+ resolve = null;
2499
+ r({ value: undefined, done: true });
2500
+ }
2501
+ };
2502
+ completionCallbacks.add(onComplete);
2503
+ if (signal) {
2504
+ onAbort = () => {
2505
+ done = true;
2506
+ completionCallbacks.delete(onComplete);
2507
+ unsub();
2508
+ if (resolve) {
2509
+ const r = resolve;
2510
+ resolve = null;
2511
+ r({ value: undefined, done: true });
2512
+ }
2513
+ };
2514
+ signal.addEventListener("abort", onAbort, { once: true });
2515
+ if (signal.aborted)
2516
+ onAbort();
2517
+ }
2518
+ const iterator = {
2519
+ [Symbol.asyncIterator]() {
2520
+ return this;
2521
+ },
2522
+ async next() {
2523
+ if (buffer.length > 0) {
2524
+ return { value: buffer.shift(), done: false };
2525
+ }
2526
+ if (resolve !== null) {
2527
+ return Promise.reject(new Error("Concurrent calls to next() are not supported on this async iterator"));
2528
+ }
2529
+ return new Promise((_resolve, _reject) => {
2530
+ if (hasOverflow) {
2531
+ hasOverflow = false;
2532
+ _reject(new BufferOverflowError(type, bufferSize));
2533
+ return;
2534
+ }
2535
+ if (done) {
2536
+ _resolve({
2537
+ value: undefined,
2538
+ done: true
2539
+ });
2540
+ return;
2541
+ }
2542
+ resolve = _resolve;
2543
+ });
2544
+ },
2545
+ return() {
2546
+ if (resolve) {
2547
+ const r = resolve;
2548
+ resolve = null;
2549
+ r({ value: undefined, done: true });
2550
+ }
2551
+ done = true;
2552
+ completionCallbacks.delete(onComplete);
2553
+ unsub();
2554
+ cleanupAbortListener();
2555
+ return Promise.resolve({
2556
+ value: undefined,
2557
+ done: true
2558
+ });
2559
+ }
2560
+ };
2561
+ return iterator;
2562
+ }
2563
+ const target = {
2564
+ addEventListener,
2565
+ removeEventListener,
2566
+ dispatchEvent,
2567
+ clear,
2568
+ on,
2569
+ once: onceMethod,
2570
+ removeAllListeners,
2571
+ pipe,
2572
+ addWildcardListener,
2573
+ removeWildcardListener,
2574
+ complete: complete2,
2575
+ get completed() {
2576
+ return isCompleted;
2577
+ },
2578
+ subscribe,
2579
+ toObservable,
2580
+ events
2581
+ };
2582
+ target[SymbolObservable] = () => {
2583
+ return toObservable();
2584
+ };
2585
+ return target;
2586
+ }
2587
+
2588
+ class EventEmission {
2589
+ #target;
2590
+ constructor() {
2591
+ this.#target = createEventTarget();
2592
+ }
2593
+ addEventListener(type, listener, options) {
2594
+ return this.#target.addEventListener(type, listener, options);
2595
+ }
2596
+ removeEventListener(type, listener, options) {
2597
+ this.#target.removeEventListener(type, listener, options);
2598
+ }
2599
+ dispatchEvent(event) {
2600
+ return this.#target.dispatchEvent(event);
2601
+ }
2602
+ on(type, options) {
2603
+ return this.#target.on(type, options);
2604
+ }
2605
+ once(type, listener, options) {
2606
+ return this.#target.once(type, listener, options);
2607
+ }
2608
+ removeAllListeners(type) {
2609
+ this.#target.removeAllListeners(type);
2610
+ }
2611
+ clear() {
2612
+ this.#target.clear();
2613
+ }
2614
+ pipe(target, mapFn) {
2615
+ return this.#target.pipe(target, mapFn);
2616
+ }
2617
+ addWildcardListener(pattern, listener, options) {
2618
+ return this.#target.addWildcardListener(pattern, listener, options);
2619
+ }
2620
+ removeWildcardListener(pattern, listener) {
2621
+ this.#target.removeWildcardListener(pattern, listener);
2622
+ }
2623
+ subscribe(typeOrObserver, observerOrNext, error2, completeHandler) {
2624
+ if (typeof typeOrObserver === "string") {
2625
+ return this.#target.subscribe(typeOrObserver, observerOrNext, error2, completeHandler);
2626
+ }
2627
+ if (typeof typeOrObserver === "function") {
2628
+ return this.#target.toObservable().subscribe(typeOrObserver);
2629
+ }
2630
+ if (typeof typeOrObserver === "object" && typeOrObserver !== null) {
2631
+ const maybeObserver = typeOrObserver;
2632
+ if (typeof maybeObserver.next === "function" || typeof maybeObserver.error === "function" || typeof maybeObserver.complete === "function") {
2633
+ return this.#target.toObservable().subscribe(typeOrObserver);
2634
+ }
2635
+ return this.#target.toObservable().subscribe({});
2636
+ }
2637
+ throw new Error("subscribe() requires a string event type, callback function, or observer object");
2638
+ }
2639
+ toObservable() {
2640
+ return this.#target.toObservable();
2641
+ }
2642
+ [SymbolObservable]() {
2643
+ return this.toObservable();
2644
+ }
2645
+ complete() {
2646
+ this.#target.complete();
2647
+ }
2648
+ get completed() {
2649
+ return this.#target.completed;
2650
+ }
2651
+ events(type, options) {
2652
+ return this.#target.events(type, options);
2653
+ }
2654
+ }
2655
+
2656
+ // src/history.ts
1119
2657
  class ConversationHistory extends EventTarget {
1120
2658
  currentNode;
1121
2659
  environment;
2660
+ events;
1122
2661
  constructor(initial = createConversation(), environment) {
1123
2662
  super();
1124
2663
  this.environment = resolveConversationEnvironment(environment);
2664
+ this.events = createEventTarget();
1125
2665
  this.currentNode = {
1126
2666
  conversation: initial,
1127
2667
  parent: null,
@@ -1133,25 +2673,54 @@ class ConversationHistory extends EventTarget {
1133
2673
  type,
1134
2674
  conversation: this.current
1135
2675
  };
1136
- this.dispatchEvent(new ConversationHistoryEvent("change", detail));
1137
- this.dispatchEvent(new ConversationHistoryEvent(type, detail));
2676
+ this.events.dispatchEvent({ type: "change", detail });
2677
+ this.events.dispatchEvent({ type, detail });
2678
+ }
2679
+ toAddListenerOptions(options) {
2680
+ if (typeof options === "boolean" || options === undefined)
2681
+ return options;
2682
+ const mapped = {};
2683
+ if (options.capture !== undefined)
2684
+ mapped.capture = options.capture;
2685
+ if (options.once !== undefined)
2686
+ mapped.once = options.once;
2687
+ if (options.passive !== undefined)
2688
+ mapped.passive = options.passive;
2689
+ if (options.signal !== undefined) {
2690
+ mapped.signal = options.signal;
2691
+ }
2692
+ return mapped;
2693
+ }
2694
+ toRemoveListenerOptions(options) {
2695
+ if (typeof options === "boolean" || options === undefined)
2696
+ return options;
2697
+ const mapped = {};
2698
+ if (options.capture !== undefined)
2699
+ mapped.capture = options.capture;
2700
+ return mapped;
1138
2701
  }
1139
2702
  addEventListener(type, callback, options) {
1140
2703
  if (!callback)
1141
2704
  return;
1142
- super.addEventListener(type, callback, options);
1143
- const unsubscribe = () => this.removeEventListener(type, callback, options);
1144
- return unsubscribe;
2705
+ return this.events.addEventListener(type, callback, this.toAddListenerOptions(options));
2706
+ }
2707
+ removeEventListener(type, callback, options) {
2708
+ if (!callback)
2709
+ return;
2710
+ this.events.removeEventListener(type, callback, this.toRemoveListenerOptions(options));
2711
+ }
2712
+ dispatchEvent(event) {
2713
+ return this.events.dispatchEvent(event);
1145
2714
  }
1146
2715
  subscribe(run) {
1147
2716
  run(this.current);
1148
2717
  const handler = (event) => {
1149
- if (event instanceof ConversationHistoryEvent) {
2718
+ if (event?.detail?.conversation) {
1150
2719
  run(event.detail.conversation);
1151
2720
  }
1152
2721
  };
1153
- const unsubscribe = this.addEventListener("change", handler);
1154
- return unsubscribe || (() => {});
2722
+ const unsubscribe2 = this.addEventListener("change", handler);
2723
+ return unsubscribe2 || (() => {});
1155
2724
  }
1156
2725
  getSnapshot() {
1157
2726
  return this.current;
@@ -1182,9 +2751,9 @@ class ConversationHistory extends EventTarget {
1182
2751
  get redoCount() {
1183
2752
  return this.currentNode.children.length;
1184
2753
  }
1185
- push(next) {
2754
+ push(next2) {
1186
2755
  const newNode = {
1187
- conversation: next,
2756
+ conversation: next2,
1188
2757
  parent: this.currentNode,
1189
2758
  children: []
1190
2759
  };
@@ -1201,9 +2770,9 @@ class ConversationHistory extends EventTarget {
1201
2770
  return;
1202
2771
  }
1203
2772
  redo(childIndex = 0) {
1204
- const next = this.currentNode.children[childIndex];
1205
- if (next) {
1206
- this.currentNode = next;
2773
+ const next2 = this.currentNode.children[childIndex];
2774
+ if (next2) {
2775
+ this.currentNode = next2;
1207
2776
  this.notifyChange("redo");
1208
2777
  return this.current;
1209
2778
  }
@@ -1368,7 +2937,7 @@ class ConversationHistory extends EventTarget {
1368
2937
  return (...args) => {
1369
2938
  const boundFn = fn;
1370
2939
  const result = boundFn(this.current, ...args, this.env);
1371
- if (isConversation(result)) {
2940
+ if (isConversation2(result)) {
1372
2941
  this.push(result);
1373
2942
  }
1374
2943
  return result;
@@ -1390,9 +2959,10 @@ class ConversationHistory extends EventTarget {
1390
2959
  };
1391
2960
  if (root)
1392
2961
  clearNode(root);
2962
+ this.events.clear();
1393
2963
  }
1394
2964
  }
1395
- function isConversation(value) {
2965
+ function isConversation2(value) {
1396
2966
  return value !== null && typeof value === "object" && typeof value.schemaVersion === "number" && typeof value.id === "string" && typeof value.status === "string" && value.metadata !== null && typeof value.metadata === "object" && Array.isArray(value.ids) && typeof value.messages === "object" && value.messages !== null && !Array.isArray(value.messages) && typeof value.createdAt === "string" && typeof value.updatedAt === "string";
1397
2967
  }
1398
2968
  export {
@@ -1417,12 +2987,22 @@ export {
1417
2987
  pairToolCallsWithResults,
1418
2988
  normalizeContent,
1419
2989
  multiModalContentSchema,
2990
+ messageSchema,
1420
2991
  messageRoleSchema,
1421
- messageJSONSchema,
1422
2992
  messageInputSchema,
1423
2993
  jsonValueSchema,
1424
2994
  isTransientKey,
2995
+ isToolResult,
2996
+ isToolCall,
2997
+ isTokenUsage,
1425
2998
  isStreamingMessage,
2999
+ isMultiModalContent,
3000
+ isMessageRole,
3001
+ isMessageInput,
3002
+ isMessage,
3003
+ isJSONValue,
3004
+ isConversationStatus,
3005
+ isConversation,
1426
3006
  isAssistantMessage,
1427
3007
  hasSystemMessage,
1428
3008
  getSystemMessages,
@@ -1462,4 +3042,4 @@ export {
1462
3042
  ConversationHistory
1463
3043
  };
1464
3044
 
1465
- //# debugId=77EDEC984ED3373C64756E2164756E21
3045
+ //# debugId=684D5332D9139AFC64756E2164756E21