@korajs/devtools 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/extension/port-router.ts","../../src/extension/background.ts"],"sourcesContent":["export interface ExtensionPort {\n\tname: string\n\tonMessage: {\n\t\taddListener(callback: (message: unknown) => void): void\n\t}\n\tonDisconnect: {\n\t\taddListener(callback: () => void): void\n\t}\n\tpostMessage(message: unknown): void\n\tsender?: { tab?: { id?: number } }\n}\n\ninterface PanelClient {\n\tport: ExtensionPort\n\ttabId: number\n}\n\n/**\n * Routes content-script events to the matching DevTools panel by tab.\n */\nexport class PortRouter {\n\tprivate readonly panelClients = new Map<number, PanelClient>()\n\tprivate readonly contentClients = new Map<number, ExtensionPort>()\n\n\thandleConnection(port: ExtensionPort): void {\n\t\tif (port.name === 'kora-panel') {\n\t\t\tthis.attachPanel(port)\n\t\t\treturn\n\t\t}\n\n\t\tif (port.name === 'kora-content') {\n\t\t\tthis.attachContent(port)\n\t\t}\n\t}\n\n\tprivate attachPanel(port: ExtensionPort): void {\n\t\tport.onMessage.addListener((message) => {\n\t\t\tif (!isPanelInitMessage(message)) return\n\n\t\t\tthis.panelClients.set(message.tabId, { tabId: message.tabId, port })\n\t\t})\n\n\t\tport.onDisconnect.addListener(() => {\n\t\t\tfor (const [tabId, client] of this.panelClients) {\n\t\t\t\tif (client.port === port) {\n\t\t\t\t\tthis.panelClients.delete(tabId)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate attachContent(port: ExtensionPort): void {\n\t\tconst tabId = port.sender?.tab?.id\n\t\tif (typeof tabId !== 'number') {\n\t\t\treturn\n\t\t}\n\n\t\tthis.contentClients.set(tabId, port)\n\n\t\tport.onMessage.addListener((message) => {\n\t\t\tif (!isContentEventMessage(message)) return\n\n\t\t\tconst panel = this.panelClients.get(tabId)\n\t\t\tif (!panel) return\n\n\t\t\tpanel.port.postMessage({ type: 'kora-event', payload: message.payload })\n\t\t})\n\n\t\tport.onDisconnect.addListener(() => {\n\t\t\tthis.contentClients.delete(tabId)\n\t\t})\n\t}\n}\n\nfunction isPanelInitMessage(value: unknown): value is { type: 'panel-init'; tabId: number } {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst record = value as Record<string, unknown>\n\treturn record.type === 'panel-init' && typeof record.tabId === 'number'\n}\n\nfunction isContentEventMessage(value: unknown): value is { type: 'kora-event'; payload: unknown } {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst record = value as Record<string, unknown>\n\treturn record.type === 'kora-event' && 'payload' in record\n}\n","import { PortRouter, type ExtensionPort } from './port-router'\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ndeclare const chrome: any\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\nconst runtime = chrome?.runtime\n\nif (runtime?.onConnect) {\n\tconst router = new PortRouter()\n\truntime.onConnect.addListener((port: ExtensionPort) => {\n\t\trouter.handleConnection(port)\n\t})\n}\n"],"mappings":";;;AAoBO,IAAM,aAAN,MAAiB;AAAA,EACN,eAAe,oBAAI,IAAyB;AAAA,EAC5C,iBAAiB,oBAAI,IAA2B;AAAA,EAEjE,iBAAiB,MAA2B;AAC3C,QAAI,KAAK,SAAS,cAAc;AAC/B,WAAK,YAAY,IAAI;AACrB;AAAA,IACD;AAEA,QAAI,KAAK,SAAS,gBAAgB;AACjC,WAAK,cAAc,IAAI;AAAA,IACxB;AAAA,EACD;AAAA,EAEQ,YAAY,MAA2B;AAC9C,SAAK,UAAU,YAAY,CAAC,YAAY;AACvC,UAAI,CAAC,mBAAmB,OAAO,EAAG;AAElC,WAAK,aAAa,IAAI,QAAQ,OAAO,EAAE,OAAO,QAAQ,OAAO,KAAK,CAAC;AAAA,IACpE,CAAC;AAED,SAAK,aAAa,YAAY,MAAM;AACnC,iBAAW,CAAC,OAAO,MAAM,KAAK,KAAK,cAAc;AAChD,YAAI,OAAO,SAAS,MAAM;AACzB,eAAK,aAAa,OAAO,KAAK;AAAA,QAC/B;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEQ,cAAc,MAA2B;AAChD,UAAM,QAAQ,KAAK,QAAQ,KAAK;AAChC,QAAI,OAAO,UAAU,UAAU;AAC9B;AAAA,IACD;AAEA,SAAK,eAAe,IAAI,OAAO,IAAI;AAEnC,SAAK,UAAU,YAAY,CAAC,YAAY;AACvC,UAAI,CAAC,sBAAsB,OAAO,EAAG;AAErC,YAAM,QAAQ,KAAK,aAAa,IAAI,KAAK;AACzC,UAAI,CAAC,MAAO;AAEZ,YAAM,KAAK,YAAY,EAAE,MAAM,cAAc,SAAS,QAAQ,QAAQ,CAAC;AAAA,IACxE,CAAC;AAED,SAAK,aAAa,YAAY,MAAM;AACnC,WAAK,eAAe,OAAO,KAAK;AAAA,IACjC,CAAC;AAAA,EACF;AACD;AAEA,SAAS,mBAAmB,OAAgE;AAC3F,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,SAAS;AACf,SAAO,OAAO,SAAS,gBAAgB,OAAO,OAAO,UAAU;AAChE;AAEA,SAAS,sBAAsB,OAAmE;AACjG,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,SAAS;AACf,SAAO,OAAO,SAAS,gBAAgB,aAAa;AACrD;;;AC9EA,IAAM,UAAU,QAAQ;AAExB,IAAI,SAAS,WAAW;AACvB,QAAM,SAAS,IAAI,WAAW;AAC9B,UAAQ,UAAU,YAAY,CAAC,SAAwB;AACtD,WAAO,iBAAiB,IAAI;AAAA,EAC7B,CAAC;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/extension/port-router.ts","../../src/extension/background.ts"],"sourcesContent":["export interface ExtensionPort {\n\tname: string\n\tonMessage: {\n\t\taddListener(callback: (message: unknown) => void): void\n\t}\n\tonDisconnect: {\n\t\taddListener(callback: () => void): void\n\t}\n\tpostMessage(message: unknown): void\n\tsender?: { tab?: { id?: number } }\n}\n\ninterface PanelClient {\n\tport: ExtensionPort\n\ttabId: number\n}\n\n/**\n * Routes content-script events to the matching DevTools panel by tab.\n */\nexport class PortRouter {\n\tprivate readonly panelClients = new Map<number, PanelClient>()\n\tprivate readonly contentClients = new Map<number, ExtensionPort>()\n\n\thandleConnection(port: ExtensionPort): void {\n\t\tif (port.name === 'kora-panel') {\n\t\t\tthis.attachPanel(port)\n\t\t\treturn\n\t\t}\n\n\t\tif (port.name === 'kora-content') {\n\t\t\tthis.attachContent(port)\n\t\t}\n\t}\n\n\tprivate attachPanel(port: ExtensionPort): void {\n\t\tport.onMessage.addListener((message) => {\n\t\t\tif (!isPanelInitMessage(message)) return\n\n\t\t\tthis.panelClients.set(message.tabId, { tabId: message.tabId, port })\n\t\t})\n\n\t\tport.onDisconnect.addListener(() => {\n\t\t\tfor (const [tabId, client] of this.panelClients) {\n\t\t\t\tif (client.port === port) {\n\t\t\t\t\tthis.panelClients.delete(tabId)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate attachContent(port: ExtensionPort): void {\n\t\tconst tabId = port.sender?.tab?.id\n\t\tif (typeof tabId !== 'number') {\n\t\t\treturn\n\t\t}\n\n\t\tthis.contentClients.set(tabId, port)\n\n\t\tport.onMessage.addListener((message) => {\n\t\t\tif (!isContentEventMessage(message)) return\n\n\t\t\tconst panel = this.panelClients.get(tabId)\n\t\t\tif (!panel) return\n\n\t\t\tpanel.port.postMessage({ type: 'kora-event', payload: message.payload })\n\t\t})\n\n\t\tport.onDisconnect.addListener(() => {\n\t\t\tthis.contentClients.delete(tabId)\n\t\t})\n\t}\n}\n\nfunction isPanelInitMessage(value: unknown): value is { type: 'panel-init'; tabId: number } {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst record = value as Record<string, unknown>\n\treturn record.type === 'panel-init' && typeof record.tabId === 'number'\n}\n\nfunction isContentEventMessage(value: unknown): value is { type: 'kora-event'; payload: unknown } {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst record = value as Record<string, unknown>\n\treturn record.type === 'kora-event' && 'payload' in record\n}\n","import { type ExtensionPort, PortRouter } from './port-router'\n\n// biome-ignore lint/suspicious/noExplicitAny: Chrome extension API global has no type definitions without @types/chrome\ndeclare const chrome: any\n\nconst runtime = chrome?.runtime\n\nif (runtime?.onConnect) {\n\tconst router = new PortRouter()\n\truntime.onConnect.addListener((port: ExtensionPort) => {\n\t\trouter.handleConnection(port)\n\t})\n}\n"],"mappings":";;;AAoBO,IAAM,aAAN,MAAiB;AAAA,EACN,eAAe,oBAAI,IAAyB;AAAA,EAC5C,iBAAiB,oBAAI,IAA2B;AAAA,EAEjE,iBAAiB,MAA2B;AAC3C,QAAI,KAAK,SAAS,cAAc;AAC/B,WAAK,YAAY,IAAI;AACrB;AAAA,IACD;AAEA,QAAI,KAAK,SAAS,gBAAgB;AACjC,WAAK,cAAc,IAAI;AAAA,IACxB;AAAA,EACD;AAAA,EAEQ,YAAY,MAA2B;AAC9C,SAAK,UAAU,YAAY,CAAC,YAAY;AACvC,UAAI,CAAC,mBAAmB,OAAO,EAAG;AAElC,WAAK,aAAa,IAAI,QAAQ,OAAO,EAAE,OAAO,QAAQ,OAAO,KAAK,CAAC;AAAA,IACpE,CAAC;AAED,SAAK,aAAa,YAAY,MAAM;AACnC,iBAAW,CAAC,OAAO,MAAM,KAAK,KAAK,cAAc;AAChD,YAAI,OAAO,SAAS,MAAM;AACzB,eAAK,aAAa,OAAO,KAAK;AAAA,QAC/B;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEQ,cAAc,MAA2B;AAChD,UAAM,QAAQ,KAAK,QAAQ,KAAK;AAChC,QAAI,OAAO,UAAU,UAAU;AAC9B;AAAA,IACD;AAEA,SAAK,eAAe,IAAI,OAAO,IAAI;AAEnC,SAAK,UAAU,YAAY,CAAC,YAAY;AACvC,UAAI,CAAC,sBAAsB,OAAO,EAAG;AAErC,YAAM,QAAQ,KAAK,aAAa,IAAI,KAAK;AACzC,UAAI,CAAC,MAAO;AAEZ,YAAM,KAAK,YAAY,EAAE,MAAM,cAAc,SAAS,QAAQ,QAAQ,CAAC;AAAA,IACxE,CAAC;AAED,SAAK,aAAa,YAAY,MAAM;AACnC,WAAK,eAAe,OAAO,KAAK;AAAA,IACjC,CAAC;AAAA,EACF;AACD;AAEA,SAAS,mBAAmB,OAAgE;AAC3F,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,SAAS;AACf,SAAO,OAAO,SAAS,gBAAgB,OAAO,OAAO,UAAU;AAChE;AAEA,SAAS,sBAAsB,OAAmE;AACjG,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,SAAS;AACf,SAAO,OAAO,SAAS,gBAAgB,aAAa;AACrD;;;AC/EA,IAAM,UAAU,QAAQ;AAExB,IAAI,SAAS,WAAW;AACvB,QAAM,SAAS,IAAI,WAAW;AAC9B,UAAQ,UAAU,YAAY,CAAC,SAAwB;AACtD,WAAO,iBAAiB,IAAI;AAAA,EAC7B,CAAC;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/extension/port-router.ts","../../src/extension/background.ts"],"sourcesContent":["export interface ExtensionPort {\n\tname: string\n\tonMessage: {\n\t\taddListener(callback: (message: unknown) => void): void\n\t}\n\tonDisconnect: {\n\t\taddListener(callback: () => void): void\n\t}\n\tpostMessage(message: unknown): void\n\tsender?: { tab?: { id?: number } }\n}\n\ninterface PanelClient {\n\tport: ExtensionPort\n\ttabId: number\n}\n\n/**\n * Routes content-script events to the matching DevTools panel by tab.\n */\nexport class PortRouter {\n\tprivate readonly panelClients = new Map<number, PanelClient>()\n\tprivate readonly contentClients = new Map<number, ExtensionPort>()\n\n\thandleConnection(port: ExtensionPort): void {\n\t\tif (port.name === 'kora-panel') {\n\t\t\tthis.attachPanel(port)\n\t\t\treturn\n\t\t}\n\n\t\tif (port.name === 'kora-content') {\n\t\t\tthis.attachContent(port)\n\t\t}\n\t}\n\n\tprivate attachPanel(port: ExtensionPort): void {\n\t\tport.onMessage.addListener((message) => {\n\t\t\tif (!isPanelInitMessage(message)) return\n\n\t\t\tthis.panelClients.set(message.tabId, { tabId: message.tabId, port })\n\t\t})\n\n\t\tport.onDisconnect.addListener(() => {\n\t\t\tfor (const [tabId, client] of this.panelClients) {\n\t\t\t\tif (client.port === port) {\n\t\t\t\t\tthis.panelClients.delete(tabId)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate attachContent(port: ExtensionPort): void {\n\t\tconst tabId = port.sender?.tab?.id\n\t\tif (typeof tabId !== 'number') {\n\t\t\treturn\n\t\t}\n\n\t\tthis.contentClients.set(tabId, port)\n\n\t\tport.onMessage.addListener((message) => {\n\t\t\tif (!isContentEventMessage(message)) return\n\n\t\t\tconst panel = this.panelClients.get(tabId)\n\t\t\tif (!panel) return\n\n\t\t\tpanel.port.postMessage({ type: 'kora-event', payload: message.payload })\n\t\t})\n\n\t\tport.onDisconnect.addListener(() => {\n\t\t\tthis.contentClients.delete(tabId)\n\t\t})\n\t}\n}\n\nfunction isPanelInitMessage(value: unknown): value is { type: 'panel-init'; tabId: number } {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst record = value as Record<string, unknown>\n\treturn record.type === 'panel-init' && typeof record.tabId === 'number'\n}\n\nfunction isContentEventMessage(value: unknown): value is { type: 'kora-event'; payload: unknown } {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst record = value as Record<string, unknown>\n\treturn record.type === 'kora-event' && 'payload' in record\n}\n","import { PortRouter, type ExtensionPort } from './port-router'\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ndeclare const chrome: any\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\nconst runtime = chrome?.runtime\n\nif (runtime?.onConnect) {\n\tconst router = new PortRouter()\n\truntime.onConnect.addListener((port: ExtensionPort) => {\n\t\trouter.handleConnection(port)\n\t})\n}\n"],"mappings":";AAoBO,IAAM,aAAN,MAAiB;AAAA,EACN,eAAe,oBAAI,IAAyB;AAAA,EAC5C,iBAAiB,oBAAI,IAA2B;AAAA,EAEjE,iBAAiB,MAA2B;AAC3C,QAAI,KAAK,SAAS,cAAc;AAC/B,WAAK,YAAY,IAAI;AACrB;AAAA,IACD;AAEA,QAAI,KAAK,SAAS,gBAAgB;AACjC,WAAK,cAAc,IAAI;AAAA,IACxB;AAAA,EACD;AAAA,EAEQ,YAAY,MAA2B;AAC9C,SAAK,UAAU,YAAY,CAAC,YAAY;AACvC,UAAI,CAAC,mBAAmB,OAAO,EAAG;AAElC,WAAK,aAAa,IAAI,QAAQ,OAAO,EAAE,OAAO,QAAQ,OAAO,KAAK,CAAC;AAAA,IACpE,CAAC;AAED,SAAK,aAAa,YAAY,MAAM;AACnC,iBAAW,CAAC,OAAO,MAAM,KAAK,KAAK,cAAc;AAChD,YAAI,OAAO,SAAS,MAAM;AACzB,eAAK,aAAa,OAAO,KAAK;AAAA,QAC/B;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEQ,cAAc,MAA2B;AAChD,UAAM,QAAQ,KAAK,QAAQ,KAAK;AAChC,QAAI,OAAO,UAAU,UAAU;AAC9B;AAAA,IACD;AAEA,SAAK,eAAe,IAAI,OAAO,IAAI;AAEnC,SAAK,UAAU,YAAY,CAAC,YAAY;AACvC,UAAI,CAAC,sBAAsB,OAAO,EAAG;AAErC,YAAM,QAAQ,KAAK,aAAa,IAAI,KAAK;AACzC,UAAI,CAAC,MAAO;AAEZ,YAAM,KAAK,YAAY,EAAE,MAAM,cAAc,SAAS,QAAQ,QAAQ,CAAC;AAAA,IACxE,CAAC;AAED,SAAK,aAAa,YAAY,MAAM;AACnC,WAAK,eAAe,OAAO,KAAK;AAAA,IACjC,CAAC;AAAA,EACF;AACD;AAEA,SAAS,mBAAmB,OAAgE;AAC3F,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,SAAS;AACf,SAAO,OAAO,SAAS,gBAAgB,OAAO,OAAO,UAAU;AAChE;AAEA,SAAS,sBAAsB,OAAmE;AACjG,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,SAAS;AACf,SAAO,OAAO,SAAS,gBAAgB,aAAa;AACrD;;;AC9EA,IAAM,UAAU,QAAQ;AAExB,IAAI,SAAS,WAAW;AACvB,QAAM,SAAS,IAAI,WAAW;AAC9B,UAAQ,UAAU,YAAY,CAAC,SAAwB;AACtD,WAAO,iBAAiB,IAAI;AAAA,EAC7B,CAAC;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/extension/port-router.ts","../../src/extension/background.ts"],"sourcesContent":["export interface ExtensionPort {\n\tname: string\n\tonMessage: {\n\t\taddListener(callback: (message: unknown) => void): void\n\t}\n\tonDisconnect: {\n\t\taddListener(callback: () => void): void\n\t}\n\tpostMessage(message: unknown): void\n\tsender?: { tab?: { id?: number } }\n}\n\ninterface PanelClient {\n\tport: ExtensionPort\n\ttabId: number\n}\n\n/**\n * Routes content-script events to the matching DevTools panel by tab.\n */\nexport class PortRouter {\n\tprivate readonly panelClients = new Map<number, PanelClient>()\n\tprivate readonly contentClients = new Map<number, ExtensionPort>()\n\n\thandleConnection(port: ExtensionPort): void {\n\t\tif (port.name === 'kora-panel') {\n\t\t\tthis.attachPanel(port)\n\t\t\treturn\n\t\t}\n\n\t\tif (port.name === 'kora-content') {\n\t\t\tthis.attachContent(port)\n\t\t}\n\t}\n\n\tprivate attachPanel(port: ExtensionPort): void {\n\t\tport.onMessage.addListener((message) => {\n\t\t\tif (!isPanelInitMessage(message)) return\n\n\t\t\tthis.panelClients.set(message.tabId, { tabId: message.tabId, port })\n\t\t})\n\n\t\tport.onDisconnect.addListener(() => {\n\t\t\tfor (const [tabId, client] of this.panelClients) {\n\t\t\t\tif (client.port === port) {\n\t\t\t\t\tthis.panelClients.delete(tabId)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate attachContent(port: ExtensionPort): void {\n\t\tconst tabId = port.sender?.tab?.id\n\t\tif (typeof tabId !== 'number') {\n\t\t\treturn\n\t\t}\n\n\t\tthis.contentClients.set(tabId, port)\n\n\t\tport.onMessage.addListener((message) => {\n\t\t\tif (!isContentEventMessage(message)) return\n\n\t\t\tconst panel = this.panelClients.get(tabId)\n\t\t\tif (!panel) return\n\n\t\t\tpanel.port.postMessage({ type: 'kora-event', payload: message.payload })\n\t\t})\n\n\t\tport.onDisconnect.addListener(() => {\n\t\t\tthis.contentClients.delete(tabId)\n\t\t})\n\t}\n}\n\nfunction isPanelInitMessage(value: unknown): value is { type: 'panel-init'; tabId: number } {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst record = value as Record<string, unknown>\n\treturn record.type === 'panel-init' && typeof record.tabId === 'number'\n}\n\nfunction isContentEventMessage(value: unknown): value is { type: 'kora-event'; payload: unknown } {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst record = value as Record<string, unknown>\n\treturn record.type === 'kora-event' && 'payload' in record\n}\n","import { type ExtensionPort, PortRouter } from './port-router'\n\n// biome-ignore lint/suspicious/noExplicitAny: Chrome extension API global has no type definitions without @types/chrome\ndeclare const chrome: any\n\nconst runtime = chrome?.runtime\n\nif (runtime?.onConnect) {\n\tconst router = new PortRouter()\n\truntime.onConnect.addListener((port: ExtensionPort) => {\n\t\trouter.handleConnection(port)\n\t})\n}\n"],"mappings":";AAoBO,IAAM,aAAN,MAAiB;AAAA,EACN,eAAe,oBAAI,IAAyB;AAAA,EAC5C,iBAAiB,oBAAI,IAA2B;AAAA,EAEjE,iBAAiB,MAA2B;AAC3C,QAAI,KAAK,SAAS,cAAc;AAC/B,WAAK,YAAY,IAAI;AACrB;AAAA,IACD;AAEA,QAAI,KAAK,SAAS,gBAAgB;AACjC,WAAK,cAAc,IAAI;AAAA,IACxB;AAAA,EACD;AAAA,EAEQ,YAAY,MAA2B;AAC9C,SAAK,UAAU,YAAY,CAAC,YAAY;AACvC,UAAI,CAAC,mBAAmB,OAAO,EAAG;AAElC,WAAK,aAAa,IAAI,QAAQ,OAAO,EAAE,OAAO,QAAQ,OAAO,KAAK,CAAC;AAAA,IACpE,CAAC;AAED,SAAK,aAAa,YAAY,MAAM;AACnC,iBAAW,CAAC,OAAO,MAAM,KAAK,KAAK,cAAc;AAChD,YAAI,OAAO,SAAS,MAAM;AACzB,eAAK,aAAa,OAAO,KAAK;AAAA,QAC/B;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEQ,cAAc,MAA2B;AAChD,UAAM,QAAQ,KAAK,QAAQ,KAAK;AAChC,QAAI,OAAO,UAAU,UAAU;AAC9B;AAAA,IACD;AAEA,SAAK,eAAe,IAAI,OAAO,IAAI;AAEnC,SAAK,UAAU,YAAY,CAAC,YAAY;AACvC,UAAI,CAAC,sBAAsB,OAAO,EAAG;AAErC,YAAM,QAAQ,KAAK,aAAa,IAAI,KAAK;AACzC,UAAI,CAAC,MAAO;AAEZ,YAAM,KAAK,YAAY,EAAE,MAAM,cAAc,SAAS,QAAQ,QAAQ,CAAC;AAAA,IACxE,CAAC;AAED,SAAK,aAAa,YAAY,MAAM;AACnC,WAAK,eAAe,OAAO,KAAK;AAAA,IACjC,CAAC;AAAA,EACF;AACD;AAEA,SAAS,mBAAmB,OAAgE;AAC3F,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,SAAS;AACf,SAAO,OAAO,SAAS,gBAAgB,OAAO,OAAO,UAAU;AAChE;AAEA,SAAS,sBAAsB,OAAmE;AACjG,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,SAAS;AACf,SAAO,OAAO,SAAS,gBAAgB,aAAa;AACrD;;;AC/EA,IAAM,UAAU,QAAQ;AAExB,IAAI,SAAS,WAAW;AACvB,QAAM,SAAS,IAAI,WAAW;AAC9B,UAAQ,UAAU,YAAY,CAAC,SAAwB;AACtD,WAAO,iBAAiB,IAAI;AAAA,EAC7B,CAAC;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/extension/content-script.ts"],"sourcesContent":["import type { TimestampedEvent } from '../types'\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ndeclare const chrome: any\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\nconst runtime = chrome?.runtime\n\nif (runtime) {\n\tconst port = runtime.connect({ name: 'kora-content' })\n\n\twindow.addEventListener('message', (event: MessageEvent) => {\n\t\tconst data = event.data as { source?: string; payload?: TimestampedEvent } | undefined\n\t\tif (!data || data.source !== 'kora-devtools' || !data.payload) {\n\t\t\treturn\n\t\t}\n\n\t\tport.postMessage({\n\t\t\ttype: 'kora-event',\n\t\t\tpayload: data.payload,\n\t\t})\n\t})\n}\n"],"mappings":";;;AAMA,IAAM,UAAU,QAAQ;AAExB,IAAI,SAAS;AACZ,QAAM,OAAO,QAAQ,QAAQ,EAAE,MAAM,eAAe,CAAC;AAErD,SAAO,iBAAiB,WAAW,CAAC,UAAwB;AAC3D,UAAM,OAAO,MAAM;AACnB,QAAI,CAAC,QAAQ,KAAK,WAAW,mBAAmB,CAAC,KAAK,SAAS;AAC9D;AAAA,IACD;AAEA,SAAK,YAAY;AAAA,MAChB,MAAM;AAAA,MACN,SAAS,KAAK;AAAA,IACf,CAAC;AAAA,EACF,CAAC;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/extension/content-script.ts"],"sourcesContent":["import type { TimestampedEvent } from '../types'\n\n// biome-ignore lint/suspicious/noExplicitAny: Chrome extension API global has no type definitions without @types/chrome\ndeclare const chrome: any\n\nconst runtime = chrome?.runtime\n\nif (runtime) {\n\tconst port = runtime.connect({ name: 'kora-content' })\n\n\twindow.addEventListener('message', (event: MessageEvent) => {\n\t\tconst data = event.data as { source?: string; payload?: TimestampedEvent } | undefined\n\t\tif (!data || data.source !== 'kora-devtools' || !data.payload) {\n\t\t\treturn\n\t\t}\n\n\t\tport.postMessage({\n\t\t\ttype: 'kora-event',\n\t\t\tpayload: data.payload,\n\t\t})\n\t})\n}\n"],"mappings":";;;AAKA,IAAM,UAAU,QAAQ;AAExB,IAAI,SAAS;AACZ,QAAM,OAAO,QAAQ,QAAQ,EAAE,MAAM,eAAe,CAAC;AAErD,SAAO,iBAAiB,WAAW,CAAC,UAAwB;AAC3D,UAAM,OAAO,MAAM;AACnB,QAAI,CAAC,QAAQ,KAAK,WAAW,mBAAmB,CAAC,KAAK,SAAS;AAC9D;AAAA,IACD;AAEA,SAAK,YAAY;AAAA,MAChB,MAAM;AAAA,MACN,SAAS,KAAK;AAAA,IACf,CAAC;AAAA,EACF,CAAC;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/extension/content-script.ts"],"sourcesContent":["import type { TimestampedEvent } from '../types'\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ndeclare const chrome: any\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\nconst runtime = chrome?.runtime\n\nif (runtime) {\n\tconst port = runtime.connect({ name: 'kora-content' })\n\n\twindow.addEventListener('message', (event: MessageEvent) => {\n\t\tconst data = event.data as { source?: string; payload?: TimestampedEvent } | undefined\n\t\tif (!data || data.source !== 'kora-devtools' || !data.payload) {\n\t\t\treturn\n\t\t}\n\n\t\tport.postMessage({\n\t\t\ttype: 'kora-event',\n\t\t\tpayload: data.payload,\n\t\t})\n\t})\n}\n"],"mappings":";AAMA,IAAM,UAAU,QAAQ;AAExB,IAAI,SAAS;AACZ,QAAM,OAAO,QAAQ,QAAQ,EAAE,MAAM,eAAe,CAAC;AAErD,SAAO,iBAAiB,WAAW,CAAC,UAAwB;AAC3D,UAAM,OAAO,MAAM;AACnB,QAAI,CAAC,QAAQ,KAAK,WAAW,mBAAmB,CAAC,KAAK,SAAS;AAC9D;AAAA,IACD;AAEA,SAAK,YAAY;AAAA,MAChB,MAAM;AAAA,MACN,SAAS,KAAK;AAAA,IACf,CAAC;AAAA,EACF,CAAC;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/extension/content-script.ts"],"sourcesContent":["import type { TimestampedEvent } from '../types'\n\n// biome-ignore lint/suspicious/noExplicitAny: Chrome extension API global has no type definitions without @types/chrome\ndeclare const chrome: any\n\nconst runtime = chrome?.runtime\n\nif (runtime) {\n\tconst port = runtime.connect({ name: 'kora-content' })\n\n\twindow.addEventListener('message', (event: MessageEvent) => {\n\t\tconst data = event.data as { source?: string; payload?: TimestampedEvent } | undefined\n\t\tif (!data || data.source !== 'kora-devtools' || !data.payload) {\n\t\t\treturn\n\t\t}\n\n\t\tport.postMessage({\n\t\t\ttype: 'kora-event',\n\t\t\tpayload: data.payload,\n\t\t})\n\t})\n}\n"],"mappings":";AAKA,IAAM,UAAU,QAAQ;AAExB,IAAI,SAAS;AACZ,QAAM,OAAO,QAAQ,QAAQ,EAAE,MAAM,eAAe,CAAC;AAErD,SAAO,iBAAiB,WAAW,CAAC,UAAwB;AAC3D,UAAM,OAAO,MAAM;AACnB,QAAI,CAAC,QAAQ,KAAK,WAAW,mBAAmB,CAAC,KAAK,SAAS;AAC9D;AAAA,IACD;AAEA,SAAK,YAAY;AAAA,MAChB,MAAM;AAAA,MACN,SAAS,KAAK;AAAA,IACf,CAAC;AAAA,EACF,CAAC;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/extension/devtools.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\ndeclare const chrome: any\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\nif (chrome?.devtools?.panels) {\n\tchrome.devtools.panels.create('Kora', '', 'devtools-page.html', () => {})\n}\n"],"mappings":";;;AAIA,IAAI,QAAQ,UAAU,QAAQ;AAC7B,SAAO,SAAS,OAAO,OAAO,QAAQ,IAAI,sBAAsB,MAAM;AAAA,EAAC,CAAC;AACzE;","names":[]}
1
+ {"version":3,"sources":["../../src/extension/devtools.ts"],"sourcesContent":["// biome-ignore lint/suspicious/noExplicitAny: Chrome extension API global has no type definitions without @types/chrome\ndeclare const chrome: any\n\nif (chrome?.devtools?.panels) {\n\tchrome.devtools.panels.create('Kora', '', 'devtools-page.html', () => {})\n}\n"],"mappings":";;;AAGA,IAAI,QAAQ,UAAU,QAAQ;AAC7B,SAAO,SAAS,OAAO,OAAO,QAAQ,IAAI,sBAAsB,MAAM;AAAA,EAAC,CAAC;AACzE;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/extension/devtools.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\ndeclare const chrome: any\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\nif (chrome?.devtools?.panels) {\n\tchrome.devtools.panels.create('Kora', '', 'devtools-page.html', () => {})\n}\n"],"mappings":";AAIA,IAAI,QAAQ,UAAU,QAAQ;AAC7B,SAAO,SAAS,OAAO,OAAO,QAAQ,IAAI,sBAAsB,MAAM;AAAA,EAAC,CAAC;AACzE;","names":[]}
1
+ {"version":3,"sources":["../../src/extension/devtools.ts"],"sourcesContent":["// biome-ignore lint/suspicious/noExplicitAny: Chrome extension API global has no type definitions without @types/chrome\ndeclare const chrome: any\n\nif (chrome?.devtools?.panels) {\n\tchrome.devtools.panels.create('Kora', '', 'devtools-page.html', () => {})\n}\n"],"mappings":";AAGA,IAAI,QAAQ,UAAU,QAAQ;AAC7B,SAAO,SAAS,OAAO,OAAO,QAAQ,IAAI,sBAAsB,MAAM;AAAA,EAAC,CAAC;AACzE;","names":[]}
@@ -1,10 +1,34 @@
1
1
  "use strict";
2
2
 
3
+ // ../../node_modules/.pnpm/htm@3.1.1/node_modules/htm/dist/htm.mjs
4
+ var n = function(t4, s3, r3, e3) {
5
+ var u3;
6
+ s3[0] = 0;
7
+ for (var h3 = 1; h3 < s3.length; h3++) {
8
+ var p3 = s3[h3++], a3 = s3[h3] ? (s3[0] |= p3 ? 1 : 2, r3[s3[h3++]]) : s3[++h3];
9
+ 3 === p3 ? e3[0] = a3 : 4 === p3 ? e3[1] = Object.assign(e3[1] || {}, a3) : 5 === p3 ? (e3[1] = e3[1] || {})[s3[++h3]] = a3 : 6 === p3 ? e3[1][s3[++h3]] += a3 + "" : p3 ? (u3 = t4.apply(a3, n(t4, a3, r3, ["", null])), e3.push(u3), a3[0] ? s3[0] |= 2 : (s3[h3 - 2] = 0, s3[h3] = u3)) : e3.push(a3);
10
+ }
11
+ return e3;
12
+ };
13
+ var t = /* @__PURE__ */ new Map();
14
+ function htm_default(s3) {
15
+ var r3 = t.get(this);
16
+ return r3 || (r3 = /* @__PURE__ */ new Map(), t.set(this, r3)), (r3 = n(this, r3.get(s3) || (r3.set(s3, r3 = (function(n3) {
17
+ for (var t4, s4, r4 = 1, e3 = "", u3 = "", h3 = [0], p3 = function(n4) {
18
+ 1 === r4 && (n4 || (e3 = e3.replace(/^\s*\n\s*|\s*\n\s*$/g, ""))) ? h3.push(0, n4, e3) : 3 === r4 && (n4 || e3) ? (h3.push(3, n4, e3), r4 = 2) : 2 === r4 && "..." === e3 && n4 ? h3.push(4, n4, 0) : 2 === r4 && e3 && !n4 ? h3.push(5, 0, true, e3) : r4 >= 5 && ((e3 || !n4 && 5 === r4) && (h3.push(r4, 0, e3, s4), r4 = 6), n4 && (h3.push(r4, n4, 0, s4), r4 = 6)), e3 = "";
19
+ }, a3 = 0; a3 < n3.length; a3++) {
20
+ a3 && (1 === r4 && p3(), p3(a3));
21
+ for (var l3 = 0; l3 < n3[a3].length; l3++) t4 = n3[a3][l3], 1 === r4 ? "<" === t4 ? (p3(), h3 = [h3], r4 = 3) : e3 += t4 : 4 === r4 ? "--" === e3 && ">" === t4 ? (r4 = 1, e3 = "") : e3 = t4 + e3[0] : u3 ? t4 === u3 ? u3 = "" : e3 += t4 : '"' === t4 || "'" === t4 ? u3 = t4 : ">" === t4 ? (p3(), r4 = 1) : r4 && ("=" === t4 ? (r4 = 5, s4 = e3, e3 = "") : "/" === t4 && (r4 < 5 || ">" === n3[a3][l3 + 1]) ? (p3(), 3 === r4 && (h3 = h3[0]), r4 = h3, (h3 = h3[0]).push(2, 0, r4), r4 = 0) : " " === t4 || " " === t4 || "\n" === t4 || "\r" === t4 ? (p3(), r4 = 2) : e3 += t4), 3 === r4 && "!--" === e3 && (r4 = 4, h3 = h3[0]);
22
+ }
23
+ return p3(), h3;
24
+ })(s3)), r3), arguments, [])).length > 1 ? r3 : r3[0];
25
+ }
26
+
3
27
  // ../../node_modules/.pnpm/preact@10.29.1/node_modules/preact/dist/preact.mjs
4
- var n;
28
+ var n2;
5
29
  var l;
6
30
  var u;
7
- var t;
31
+ var t2;
8
32
  var i;
9
33
  var r;
10
34
  var o;
@@ -31,7 +55,7 @@ function b(n3) {
31
55
  function k(l3, u3, t4) {
32
56
  var i3, r3, o3, e3 = {};
33
57
  for (o3 in u3) "key" == o3 ? i3 = u3[o3] : "ref" == o3 ? r3 = u3[o3] : e3[o3] = u3[o3];
34
- if (arguments.length > 2 && (e3.children = arguments.length > 3 ? n.call(arguments, 2) : t4), "function" == typeof l3 && null != l3.defaultProps) for (o3 in l3.defaultProps) void 0 === e3[o3] && (e3[o3] = l3.defaultProps[o3]);
58
+ if (arguments.length > 2 && (e3.children = arguments.length > 3 ? n2.call(arguments, 2) : t4), "function" == typeof l3 && null != l3.defaultProps) for (o3 in l3.defaultProps) void 0 === e3[o3] && (e3[o3] = l3.defaultProps[o3]);
35
59
  return x(l3, e3, i3, r3, null);
36
60
  }
37
61
  function x(n3, t4, i3, r3, o3) {
@@ -200,7 +224,7 @@ function G(u3, t4, i3, r3, o3, e3, f3, c3, s3) {
200
224
  }
201
225
  if (null == x2) m3 === k3 || c3 && u3.data == k3 || (u3.data = k3);
202
226
  else {
203
- if (e3 = e3 && n.call(u3.childNodes), !c3 && null != e3) for (m3 = {}, a3 = 0; a3 < u3.attributes.length; a3++) m3[(y2 = u3.attributes[a3]).name] = y2.value;
227
+ if (e3 = e3 && n2.call(u3.childNodes), !c3 && null != e3) for (m3 = {}, a3 = 0; a3 < u3.attributes.length; a3++) m3[(y2 = u3.attributes[a3]).name] = y2.value;
204
228
  for (a3 in m3) y2 = m3[a3], "dangerouslySetInnerHTML" == a3 ? p3 = y2 : "children" == a3 || a3 in k3 || "value" == a3 && "defaultValue" in k3 || "checked" == a3 && "defaultChecked" in k3 || N(u3, a3, null, y2, o3);
205
229
  for (a3 in k3) y2 = k3[a3], "children" == a3 ? v3 = y2 : "dangerouslySetInnerHTML" == a3 ? h3 = y2 : "value" == a3 ? w3 = y2 : "checked" == a3 ? _2 = y2 : c3 && "function" != typeof y2 || m3[a3] === y2 || N(u3, a3, y2, m3[a3], o3);
206
230
  if (h3) c3 || p3 && (h3.__html == p3.__html || h3.__html == u3.innerHTML) || (u3.innerHTML = h3.__html), t4.__k = [];
@@ -237,16 +261,16 @@ function Q(n3, l3, u3) {
237
261
  }
238
262
  function R(u3, t4, i3) {
239
263
  var r3, o3, e3, f3;
240
- t4 == document && (t4 = document.documentElement), l.__ && l.__(u3, t4), o3 = (r3 = "function" == typeof i3) ? null : i3 && i3.__k || t4.__k, e3 = [], f3 = [], q(t4, u3 = (!r3 && i3 || t4).__k = k(S, null, [u3]), o3 || d, d, t4.namespaceURI, !r3 && i3 ? [i3] : o3 ? null : t4.firstChild ? n.call(t4.childNodes) : null, e3, !r3 && i3 ? i3 : o3 ? o3.__e : t4.firstChild, r3, f3), D(e3, u3, f3);
264
+ t4 == document && (t4 = document.documentElement), l.__ && l.__(u3, t4), o3 = (r3 = "function" == typeof i3) ? null : i3 && i3.__k || t4.__k, e3 = [], f3 = [], q(t4, u3 = (!r3 && i3 || t4).__k = k(S, null, [u3]), o3 || d, d, t4.namespaceURI, !r3 && i3 ? [i3] : o3 ? null : t4.firstChild ? n2.call(t4.childNodes) : null, e3, !r3 && i3 ? i3 : o3 ? o3.__e : t4.firstChild, r3, f3), D(e3, u3, f3);
241
265
  }
242
- n = w.slice, l = { __e: function(n3, l3, u3, t4) {
266
+ n2 = w.slice, l = { __e: function(n3, l3, u3, t4) {
243
267
  for (var i3, r3, o3; l3 = l3.__; ) if ((i3 = l3.__c) && !i3.__) try {
244
268
  if ((r3 = i3.constructor) && null != r3.getDerivedStateFromError && (i3.setState(r3.getDerivedStateFromError(n3)), o3 = i3.__d), null != i3.componentDidCatch && (i3.componentDidCatch(n3, t4 || {}), o3 = i3.__d), o3) return i3.__E = i3;
245
269
  } catch (l4) {
246
270
  n3 = l4;
247
271
  }
248
272
  throw n3;
249
- } }, u = 0, t = function(n3) {
273
+ } }, u = 0, t2 = function(n3) {
250
274
  return null != n3 && void 0 === n3.constructor;
251
275
  }, C.prototype.setState = function(n3, l3) {
252
276
  var u3;
@@ -258,7 +282,7 @@ n = w.slice, l = { __e: function(n3, l3, u3, t4) {
258
282
  }, H.__r = 0, f = Math.random().toString(8), c = "__d" + f, s = "__a" + f, a = /(PointerCapture)$|Capture$/i, h = 0, p = V(false), v = V(true), y = 0;
259
283
 
260
284
  // ../../node_modules/.pnpm/preact@10.29.1/node_modules/preact/hooks/dist/hooks.mjs
261
- var t2;
285
+ var t3;
262
286
  var r2;
263
287
  var u2;
264
288
  var i2;
@@ -280,7 +304,7 @@ function d2(n3) {
280
304
  return o2 = 1, h2(D2, n3);
281
305
  }
282
306
  function h2(n3, u3, i3) {
283
- var o3 = p2(t2++, 2);
307
+ var o3 = p2(t3++, 2);
284
308
  if (o3.t = n3, !o3.__c && (o3.__ = [i3 ? i3(u3) : D2(void 0, u3), function(n4) {
285
309
  var t4 = o3.__N ? o3.__N[0] : o3.__[0], r3 = o3.t(t4, n4);
286
310
  t4 !== r3 && (o3.__N = [r3, o3.__[1]], o3.__c.setState({}));
@@ -314,7 +338,7 @@ function h2(n3, u3, i3) {
314
338
  return o3.__N || o3.__;
315
339
  }
316
340
  function T2(n3, r3) {
317
- var u3 = p2(t2++, 7);
341
+ var u3 = p2(t3++, 7);
318
342
  return C2(u3.__H, r3) && (u3.__ = n3(), u3.__H = r3, u3.__h = n3), u3.__;
319
343
  }
320
344
  function q2(n3, t4) {
@@ -337,11 +361,11 @@ c2.__b = function(n3) {
337
361
  }, c2.__ = function(n3, t4) {
338
362
  n3 && t4.__k && t4.__k.__m && (n3.__m = t4.__k.__m), s2 && s2(n3, t4);
339
363
  }, c2.__r = function(n3) {
340
- a2 && a2(n3), t2 = 0;
364
+ a2 && a2(n3), t3 = 0;
341
365
  var i3 = (r2 = n3.__c).__H;
342
366
  i3 && (u2 === r2 ? (i3.__h = [], r2.__h = [], i3.__.some(function(n4) {
343
367
  n4.__N && (n4.__ = n4.__N), n4.u = n4.__N = void 0;
344
- })) : (i3.__h.some(z2), i3.__h.some(B2), i3.__h = [], t2 = 0)), u2 = r2;
368
+ })) : (i3.__h.some(z2), i3.__h.some(B2), i3.__h = [], t3 = 0)), u2 = r2;
345
369
  }, c2.diffed = function(n3) {
346
370
  v2 && v2(n3);
347
371
  var t4 = n3.__c;
@@ -395,30 +419,6 @@ function D2(n3, t4) {
395
419
  return "function" == typeof t4 ? t4(n3) : t4;
396
420
  }
397
421
 
398
- // ../../node_modules/.pnpm/htm@3.1.1/node_modules/htm/dist/htm.mjs
399
- var n2 = function(t4, s3, r3, e3) {
400
- var u3;
401
- s3[0] = 0;
402
- for (var h3 = 1; h3 < s3.length; h3++) {
403
- var p3 = s3[h3++], a3 = s3[h3] ? (s3[0] |= p3 ? 1 : 2, r3[s3[h3++]]) : s3[++h3];
404
- 3 === p3 ? e3[0] = a3 : 4 === p3 ? e3[1] = Object.assign(e3[1] || {}, a3) : 5 === p3 ? (e3[1] = e3[1] || {})[s3[++h3]] = a3 : 6 === p3 ? e3[1][s3[++h3]] += a3 + "" : p3 ? (u3 = t4.apply(a3, n2(t4, a3, r3, ["", null])), e3.push(u3), a3[0] ? s3[0] |= 2 : (s3[h3 - 2] = 0, s3[h3] = u3)) : e3.push(a3);
405
- }
406
- return e3;
407
- };
408
- var t3 = /* @__PURE__ */ new Map();
409
- function htm_default(s3) {
410
- var r3 = t3.get(this);
411
- return r3 || (r3 = /* @__PURE__ */ new Map(), t3.set(this, r3)), (r3 = n2(this, r3.get(s3) || (r3.set(s3, r3 = (function(n3) {
412
- for (var t4, s4, r4 = 1, e3 = "", u3 = "", h3 = [0], p3 = function(n4) {
413
- 1 === r4 && (n4 || (e3 = e3.replace(/^\s*\n\s*|\s*\n\s*$/g, ""))) ? h3.push(0, n4, e3) : 3 === r4 && (n4 || e3) ? (h3.push(3, n4, e3), r4 = 2) : 2 === r4 && "..." === e3 && n4 ? h3.push(4, n4, 0) : 2 === r4 && e3 && !n4 ? h3.push(5, 0, true, e3) : r4 >= 5 && ((e3 || !n4 && 5 === r4) && (h3.push(r4, 0, e3, s4), r4 = 6), n4 && (h3.push(r4, n4, 0, s4), r4 = 6)), e3 = "";
414
- }, a3 = 0; a3 < n3.length; a3++) {
415
- a3 && (1 === r4 && p3(), p3(a3));
416
- for (var l3 = 0; l3 < n3[a3].length; l3++) t4 = n3[a3][l3], 1 === r4 ? "<" === t4 ? (p3(), h3 = [h3], r4 = 3) : e3 += t4 : 4 === r4 ? "--" === e3 && ">" === t4 ? (r4 = 1, e3 = "") : e3 = t4 + e3[0] : u3 ? t4 === u3 ? u3 = "" : e3 += t4 : '"' === t4 || "'" === t4 ? u3 = t4 : ">" === t4 ? (p3(), r4 = 1) : r4 && ("=" === t4 ? (r4 = 5, s4 = e3, e3 = "") : "/" === t4 && (r4 < 5 || ">" === n3[a3][l3 + 1]) ? (p3(), 3 === r4 && (h3 = h3[0]), r4 = h3, (h3 = h3[0]).push(2, 0, r4), r4 = 0) : " " === t4 || " " === t4 || "\n" === t4 || "\r" === t4 ? (p3(), r4 = 2) : e3 += t4), 3 === r4 && "!--" === e3 && (r4 = 4, h3 = h3[0]);
417
- }
418
- return p3(), h3;
419
- })(s3)), r3), arguments, [])).length > 1 ? r3 : r3[0];
420
- }
421
-
422
422
  // src/types.ts
423
423
  var EVENT_TYPE_CATEGORIES = {
424
424
  "operation:created": "operation",
@@ -436,12 +436,153 @@ var EVENT_TYPE_CATEGORIES = {
436
436
  "query:subscribed": "query",
437
437
  "query:invalidated": "query",
438
438
  "query:executed": "query",
439
- "connection:quality": "connection"
439
+ "connection:quality": "connection",
440
+ "sync:diagnostics": "sync",
441
+ "sync:bandwidth": "sync",
442
+ "sync:initial-sync-progress": "sync",
443
+ "awareness:updated": "sync",
444
+ "state-machine:transition": "operation",
445
+ "state-machine:rejected": "operation"
440
446
  };
441
447
  function eventTypeToCategory(type) {
442
448
  return EVENT_TYPE_CATEGORIES[type];
443
449
  }
444
450
 
451
+ // src/filter/event-filter.ts
452
+ function extractCollection(event) {
453
+ const e3 = event.event;
454
+ switch (e3.type) {
455
+ case "operation:created":
456
+ case "operation:applied":
457
+ return e3.operation.collection;
458
+ case "merge:started":
459
+ return e3.operationA.collection;
460
+ case "merge:completed":
461
+ case "merge:conflict":
462
+ return e3.trace.operationA.collection;
463
+ case "constraint:violated":
464
+ return e3.trace.operationA.collection;
465
+ case "query:subscribed":
466
+ return e3.collection;
467
+ case "query:invalidated":
468
+ return e3.trigger.collection;
469
+ case "sync:sent":
470
+ return e3.operations[0]?.collection ?? null;
471
+ case "sync:received":
472
+ return e3.operations[0]?.collection ?? null;
473
+ default:
474
+ return null;
475
+ }
476
+ }
477
+ function filterEvents(events2, criteria) {
478
+ const { categories, types, timeRange, collection } = criteria;
479
+ if (!categories && !types && !timeRange && !collection) {
480
+ return events2;
481
+ }
482
+ const categorySet = categories ? new Set(categories) : null;
483
+ const typeSet = types ? new Set(types) : null;
484
+ return events2.filter((event) => {
485
+ if (categorySet) {
486
+ const cat = eventTypeToCategory(event.event.type);
487
+ if (!categorySet.has(cat)) return false;
488
+ }
489
+ if (typeSet) {
490
+ if (!typeSet.has(event.event.type)) return false;
491
+ }
492
+ if (timeRange) {
493
+ if (event.receivedAt < timeRange.start || event.receivedAt > timeRange.end) {
494
+ return false;
495
+ }
496
+ }
497
+ if (collection) {
498
+ const eventCollection = extractCollection(event);
499
+ if (eventCollection !== collection) return false;
500
+ }
501
+ return true;
502
+ });
503
+ }
504
+
505
+ // src/stats/event-stats.ts
506
+ function computeStatistics(events2) {
507
+ const eventsByCategory = {
508
+ operation: 0,
509
+ merge: 0,
510
+ sync: 0,
511
+ query: 0,
512
+ connection: 0
513
+ };
514
+ const eventsByType = {};
515
+ let mergeConflicts = 0;
516
+ let constraintViolations = 0;
517
+ let mergeDurationSum = 0;
518
+ let mergeDurationCount = 0;
519
+ let queryDurationSum = 0;
520
+ let queryDurationCount = 0;
521
+ let syncOperationsSent = 0;
522
+ let syncOperationsReceived = 0;
523
+ for (const timestamped of events2) {
524
+ const e3 = timestamped.event;
525
+ const category = eventTypeToCategory(e3.type);
526
+ eventsByCategory[category]++;
527
+ eventsByType[e3.type] = (eventsByType[e3.type] ?? 0) + 1;
528
+ switch (e3.type) {
529
+ case "merge:completed":
530
+ mergeDurationSum += e3.trace.duration;
531
+ mergeDurationCount++;
532
+ break;
533
+ case "merge:conflict":
534
+ mergeConflicts++;
535
+ mergeDurationSum += e3.trace.duration;
536
+ mergeDurationCount++;
537
+ break;
538
+ case "constraint:violated":
539
+ constraintViolations++;
540
+ break;
541
+ case "query:executed":
542
+ queryDurationSum += e3.duration;
543
+ queryDurationCount++;
544
+ break;
545
+ case "sync:sent":
546
+ syncOperationsSent += e3.batchSize;
547
+ break;
548
+ case "sync:received":
549
+ syncOperationsReceived += e3.batchSize;
550
+ break;
551
+ }
552
+ }
553
+ return {
554
+ totalEvents: events2.length,
555
+ eventsByCategory,
556
+ eventsByType,
557
+ mergeConflicts,
558
+ constraintViolations,
559
+ avgMergeDuration: mergeDurationCount > 0 ? mergeDurationSum / mergeDurationCount : null,
560
+ avgQueryDuration: queryDurationCount > 0 ? queryDurationSum / queryDurationCount : null,
561
+ syncOperationsSent,
562
+ syncOperationsReceived
563
+ };
564
+ }
565
+
566
+ // src/ui/components.ts
567
+ function formatTime(timestamp) {
568
+ const d3 = new Date(timestamp);
569
+ const h3 = String(d3.getHours()).padStart(2, "0");
570
+ const m3 = String(d3.getMinutes()).padStart(2, "0");
571
+ const s3 = String(d3.getSeconds()).padStart(2, "0");
572
+ const ms = String(d3.getMilliseconds()).padStart(3, "0");
573
+ return `${h3}:${m3}:${s3}.${ms}`;
574
+ }
575
+ function truncate(str, max) {
576
+ if (str.length <= max) return str;
577
+ return `${str.slice(0, max - 1)}\u2026`;
578
+ }
579
+ function formatValue(value) {
580
+ if (value === null || value === void 0) return "null";
581
+ if (typeof value === "string") return `"${value}"`;
582
+ if (typeof value === "object") return JSON.stringify(value, null, 2);
583
+ return String(value);
584
+ }
585
+
445
586
  // src/ui/panel-state.ts
446
587
  function buildPanelModel(events2) {
447
588
  const timeline = events2.map((entry) => ({
@@ -563,9 +704,9 @@ function timelineLabel(event) {
563
704
  case "sync:connected":
564
705
  return `sync connected ${event.nodeId}`;
565
706
  case "sync:disconnected":
566
- return `sync disconnected`;
707
+ return "sync disconnected";
567
708
  case "sync:auth-failed":
568
- return `sync auth failed`;
709
+ return "sync auth failed";
569
710
  case "sync:sent":
570
711
  return `sync sent ${event.batchSize}`;
571
712
  case "sync:received":
@@ -580,6 +721,18 @@ function timelineLabel(event) {
580
721
  return `query executed ${event.queryId}`;
581
722
  case "connection:quality":
582
723
  return `connection ${event.quality}`;
724
+ case "sync:diagnostics":
725
+ return `sync diagnostics ${event.diagnostics.quality}`;
726
+ case "sync:bandwidth":
727
+ return `bandwidth ${event.direction} ${event.bytesPerSecond}B/s`;
728
+ case "sync:initial-sync-progress":
729
+ return `initial sync ${Math.round(event.progress * 100)}%`;
730
+ case "awareness:updated":
731
+ return `awareness ${event.states.size} peers`;
732
+ case "state-machine:transition":
733
+ return `transition ${event.collection} ${event.from} \u2192 ${event.to}`;
734
+ case "state-machine:rejected":
735
+ return `transition rejected ${event.collection} ${event.from} \u2192 ${event.to}`;
583
736
  }
584
737
  }
585
738
  function timelineColor(type) {
@@ -605,174 +758,31 @@ function extractOperation(event) {
605
758
  }
606
759
  }
607
760
 
608
- // src/stats/event-stats.ts
609
- function computeStatistics(events2) {
610
- const eventsByCategory = {
611
- operation: 0,
612
- merge: 0,
613
- sync: 0,
614
- query: 0,
615
- connection: 0
616
- };
617
- const eventsByType = {};
618
- let mergeConflicts = 0;
619
- let constraintViolations = 0;
620
- let mergeDurationSum = 0;
621
- let mergeDurationCount = 0;
622
- let queryDurationSum = 0;
623
- let queryDurationCount = 0;
624
- let syncOperationsSent = 0;
625
- let syncOperationsReceived = 0;
626
- for (const timestamped of events2) {
627
- const e3 = timestamped.event;
628
- const category = eventTypeToCategory(e3.type);
629
- eventsByCategory[category]++;
630
- eventsByType[e3.type] = (eventsByType[e3.type] ?? 0) + 1;
631
- switch (e3.type) {
632
- case "merge:completed":
633
- mergeDurationSum += e3.trace.duration;
634
- mergeDurationCount++;
635
- break;
636
- case "merge:conflict":
637
- mergeConflicts++;
638
- mergeDurationSum += e3.trace.duration;
639
- mergeDurationCount++;
640
- break;
641
- case "constraint:violated":
642
- constraintViolations++;
643
- break;
644
- case "query:executed":
645
- queryDurationSum += e3.duration;
646
- queryDurationCount++;
647
- break;
648
- case "sync:sent":
649
- syncOperationsSent += e3.batchSize;
650
- break;
651
- case "sync:received":
652
- syncOperationsReceived += e3.batchSize;
653
- break;
654
- }
655
- }
656
- return {
657
- totalEvents: events2.length,
658
- eventsByCategory,
659
- eventsByType,
660
- mergeConflicts,
661
- constraintViolations,
662
- avgMergeDuration: mergeDurationCount > 0 ? mergeDurationSum / mergeDurationCount : null,
663
- avgQueryDuration: queryDurationCount > 0 ? queryDurationSum / queryDurationCount : null,
664
- syncOperationsSent,
665
- syncOperationsReceived
666
- };
667
- }
668
-
669
- // src/filter/event-filter.ts
670
- function extractCollection(event) {
671
- const e3 = event.event;
672
- switch (e3.type) {
673
- case "operation:created":
674
- case "operation:applied":
675
- return e3.operation.collection;
676
- case "merge:started":
677
- return e3.operationA.collection;
678
- case "merge:completed":
679
- case "merge:conflict":
680
- return e3.trace.operationA.collection;
681
- case "constraint:violated":
682
- return e3.trace.operationA.collection;
683
- case "query:subscribed":
684
- return e3.collection;
685
- case "query:invalidated":
686
- return e3.trigger.collection;
687
- case "sync:sent":
688
- return e3.operations[0]?.collection ?? null;
689
- case "sync:received":
690
- return e3.operations[0]?.collection ?? null;
691
- default:
692
- return null;
693
- }
694
- }
695
- function filterEvents(events2, criteria) {
696
- const { categories, types, timeRange, collection } = criteria;
697
- if (!categories && !types && !timeRange && !collection) {
698
- return events2;
699
- }
700
- const categorySet = categories ? new Set(categories) : null;
701
- const typeSet = types ? new Set(types) : null;
702
- return events2.filter((event) => {
703
- if (categorySet) {
704
- const cat = eventTypeToCategory(event.event.type);
705
- if (!categorySet.has(cat)) return false;
706
- }
707
- if (typeSet) {
708
- if (!typeSet.has(event.event.type)) return false;
709
- }
710
- if (timeRange) {
711
- if (event.receivedAt < timeRange.start || event.receivedAt > timeRange.end) {
712
- return false;
713
- }
714
- }
715
- if (collection) {
716
- const eventCollection = extractCollection(event);
717
- if (eventCollection !== collection) return false;
718
- }
719
- return true;
720
- });
721
- }
722
-
723
- // src/ui/components.ts
724
- function formatTime(timestamp) {
725
- const d3 = new Date(timestamp);
726
- const h3 = String(d3.getHours()).padStart(2, "0");
727
- const m3 = String(d3.getMinutes()).padStart(2, "0");
728
- const s3 = String(d3.getSeconds()).padStart(2, "0");
729
- const ms = String(d3.getMilliseconds()).padStart(3, "0");
730
- return `${h3}:${m3}:${s3}.${ms}`;
731
- }
732
- function truncate(str, max) {
733
- if (str.length <= max) return str;
734
- return str.slice(0, max - 1) + "\u2026";
735
- }
736
- function formatValue(value) {
737
- if (value === null || value === void 0) return "null";
738
- if (typeof value === "string") return `"${value}"`;
739
- if (typeof value === "object") return JSON.stringify(value, null, 2);
740
- return String(value);
741
- }
742
-
743
761
  // src/ui/panel.ts
744
762
  var html = htm_default.bind(k);
745
763
  var ALL_CATEGORIES = ["operation", "merge", "sync", "query", "connection"];
746
764
  function DevToolsPanel({ events: events2 }) {
747
765
  const [activeTab, setActiveTab] = d2("timeline");
748
766
  const [search, setSearch] = d2("");
749
- const [categories, setCategories] = d2(
750
- () => new Set(ALL_CATEGORIES)
751
- );
767
+ const [categories, setCategories] = d2(() => new Set(ALL_CATEGORIES));
752
768
  const [expanded, setExpanded] = d2(() => /* @__PURE__ */ new Set());
753
769
  const [paused, setPaused] = d2(false);
754
- const toggleCategory = q2(
755
- (cat) => {
756
- setCategories((prev) => {
757
- const next = new Set(prev);
758
- if (next.has(cat)) next.delete(cat);
759
- else next.add(cat);
760
- return next;
761
- });
762
- },
763
- []
764
- );
765
- const toggleExpand = q2(
766
- (id) => {
767
- setExpanded((prev) => {
768
- const next = new Set(prev);
769
- if (next.has(id)) next.delete(id);
770
- else next.add(id);
771
- return next;
772
- });
773
- },
774
- []
775
- );
770
+ const toggleCategory = q2((cat) => {
771
+ setCategories((prev) => {
772
+ const next = new Set(prev);
773
+ if (next.has(cat)) next.delete(cat);
774
+ else next.add(cat);
775
+ return next;
776
+ });
777
+ }, []);
778
+ const toggleExpand = q2((id) => {
779
+ setExpanded((prev) => {
780
+ const next = new Set(prev);
781
+ if (next.has(id)) next.delete(id);
782
+ else next.add(id);
783
+ return next;
784
+ });
785
+ }, []);
776
786
  const filtered = T2(
777
787
  () => filterEvents(events2, { categories: [...categories] }),
778
788
  [events2, categories]