@powerhousedao/connect 6.2.2-dev.77 → 6.2.2-dev.79

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/dist/{AddDriveModal-DIMewThf.js → AddDriveModal-Q-Ffh5XA.js} +4 -4
  2. package/dist/{AddDriveModal-DIMewThf.js.map → AddDriveModal-Q-Ffh5XA.js.map} +1 -1
  3. package/dist/{ClearStorageModal-DKy2tPYb.js → ClearStorageModal-DKr4-fbt.js} +4 -4
  4. package/dist/{ClearStorageModal-DKy2tPYb.js.map → ClearStorageModal-DKr4-fbt.js.map} +1 -1
  5. package/dist/{ConfirmDocumentUpgradeModal-CcpgpyOB.js → ConfirmDocumentUpgradeModal-FUOhZsk7.js} +4 -4
  6. package/dist/{ConfirmDocumentUpgradeModal-CcpgpyOB.js.map → ConfirmDocumentUpgradeModal-FUOhZsk7.js.map} +1 -1
  7. package/dist/{CookiesPolicyModal-Bns4789o.js → CookiesPolicyModal-BpyPPyxS.js} +3 -3
  8. package/dist/{CookiesPolicyModal-Bns4789o.js.map → CookiesPolicyModal-BpyPPyxS.js.map} +1 -1
  9. package/dist/{CreateDocumentModal-MlA2YRaW.js → CreateDocumentModal-C45W8J0V.js} +3 -3
  10. package/dist/{CreateDocumentModal-MlA2YRaW.js.map → CreateDocumentModal-C45W8J0V.js.map} +1 -1
  11. package/dist/{DebugSettingsModal-890WlVp4.js → DebugSettingsModal-BSOG0IYo.js} +6 -6
  12. package/dist/{DebugSettingsModal-890WlVp4.js.map → DebugSettingsModal-BSOG0IYo.js.map} +1 -1
  13. package/dist/{DeleteDriveModal-gP7j8C0Y.js → DeleteDriveModal-Dug84t1j.js} +4 -4
  14. package/dist/{DeleteDriveModal-gP7j8C0Y.js.map → DeleteDriveModal-Dug84t1j.js.map} +1 -1
  15. package/dist/{DeleteItemModal-CMM-fPsz.js → DeleteItemModal-mMzy3V8o.js} +4 -4
  16. package/dist/{DeleteItemModal-CMM-fPsz.js.map → DeleteItemModal-mMzy3V8o.js.map} +1 -1
  17. package/dist/{DisclaimerModal-meOyQCfU.js → DisclaimerModal-DvpD5dPM.js} +3 -3
  18. package/dist/{DisclaimerModal-meOyQCfU.js.map → DisclaimerModal-DvpD5dPM.js.map} +1 -1
  19. package/dist/{DocumentVersionUnsupportedModal-TlDH1aP5.js → DocumentVersionUnsupportedModal-C3Q0V75l.js} +3 -3
  20. package/dist/{DocumentVersionUnsupportedModal-TlDH1aP5.js.map → DocumentVersionUnsupportedModal-C3Q0V75l.js.map} +1 -1
  21. package/dist/{DownloadDocumentWithErrorsModal-CCdbt2jJ.js → DownloadDocumentWithErrorsModal-IKl0ljQb.js} +3 -3
  22. package/dist/{DownloadDocumentWithErrorsModal-CCdbt2jJ.js.map → DownloadDocumentWithErrorsModal-IKl0ljQb.js.map} +1 -1
  23. package/dist/{DriveAuthRequiredModal-9GsPnOYi.js → DriveAuthRequiredModal-Cw9eCAQ_.js} +4 -4
  24. package/dist/{DriveAuthRequiredModal-9GsPnOYi.js.map → DriveAuthRequiredModal-Cw9eCAQ_.js.map} +1 -1
  25. package/dist/{DriveSettingsModal-Bv0y1BEK.js → DriveSettingsModal-C6-mRQiv.js} +3 -3
  26. package/dist/{DriveSettingsModal-Bv0y1BEK.js.map → DriveSettingsModal-C6-mRQiv.js.map} +1 -1
  27. package/dist/{InspectorModal-C3L5F4Ma.js → InspectorModal-bxhxkGgI.js} +6 -6
  28. package/dist/{InspectorModal-C3L5F4Ma.js.map → InspectorModal-bxhxkGgI.js.map} +1 -1
  29. package/dist/{LoginModal-CxFHjxz8.js → LoginModal-CybbOm3N.js} +4 -4
  30. package/dist/{LoginModal-CxFHjxz8.js.map → LoginModal-CybbOm3N.js.map} +1 -1
  31. package/dist/{MissingPackageModal-C6HO-a7E.js → MissingPackageModal-C7usWVHQ.js} +4 -4
  32. package/dist/{MissingPackageModal-C6HO-a7E.js.map → MissingPackageModal-C7usWVHQ.js.map} +1 -1
  33. package/dist/{OpenFileDocumentsModal-6MK7Ourm.js → OpenFileDocumentsModal-C97XmbUj.js} +4 -4
  34. package/dist/{OpenFileDocumentsModal-6MK7Ourm.js.map → OpenFileDocumentsModal-C97XmbUj.js.map} +1 -1
  35. package/dist/{SettingsModal-DzW3OIrB.js → SettingsModal-Bb7CklKR.js} +134 -8
  36. package/dist/SettingsModal-Bb7CklKR.js.map +1 -0
  37. package/dist/{UpgradeDriveModal-077wPR2N.js → UpgradeDriveModal-_8t9slxQ.js} +3 -3
  38. package/dist/{UpgradeDriveModal-077wPR2N.js.map → UpgradeDriveModal-_8t9slxQ.js.map} +1 -1
  39. package/dist/{app-loader-VArdOK2J.js → app-loader-BckBQ0wA.js} +277 -261
  40. package/dist/app-loader-BckBQ0wA.js.map +1 -0
  41. package/dist/app-loader-DVAtwx1W.js +4 -0
  42. package/dist/build-info-BPiCqius.js +28 -0
  43. package/dist/build-info-BPiCqius.js.map +1 -0
  44. package/dist/components--lshEh0U.js +4 -0
  45. package/dist/{connect.config-XXdN7RFy.js → connect.config-ZWoeCSit.js} +5 -5
  46. package/dist/connect.config-ZWoeCSit.js.map +1 -0
  47. package/dist/{connection-state-DTSv8MDQ.js → connection-state-CedmAXd-.js} +4 -4
  48. package/dist/{connection-state-DTSv8MDQ.js.map → connection-state-CedmAXd-.js.map} +1 -1
  49. package/dist/{cookie-banner-BJrG_u38.js → cookie-banner-CTxjAKt4.js} +5 -5
  50. package/dist/{cookie-banner-BJrG_u38.js.map → cookie-banner-CTxjAKt4.js.map} +1 -1
  51. package/dist/{i18n-CWyz5j1Z.js → i18n-CWO0vYVd.js} +3 -5
  52. package/dist/{i18n-CWyz5j1Z.js.map → i18n-CWO0vYVd.js.map} +1 -1
  53. package/dist/load-BVbjbcJv.js +131 -0
  54. package/dist/load-BVbjbcJv.js.map +1 -0
  55. package/dist/main.js +1 -1
  56. package/dist/{pglite-seed-DQgqjlQu.js → pglite-seed-B7bWZwVg.js} +4 -4
  57. package/dist/{pglite-seed-DQgqjlQu.js.map → pglite-seed-B7bWZwVg.js.map} +1 -1
  58. package/dist/{preferences-store-C-u8PIwU.js → preferences-store-CUBzmf5F.js} +4 -4
  59. package/dist/{preferences-store-C-u8PIwU.js.map → preferences-store-CUBzmf5F.js.map} +1 -1
  60. package/dist/{pwa-manifest-link-CG8UajMz.js → pwa-manifest-link-DIgOSo2Q.js} +3 -3
  61. package/dist/{pwa-manifest-link-CG8UajMz.js.map → pwa-manifest-link-DIgOSo2Q.js.map} +1 -1
  62. package/dist/{reactor-C8E2rx64.js → reactor-DQrNNvEd.js} +8 -8
  63. package/dist/{reactor-C8E2rx64.js.map → reactor-DQrNNvEd.js.map} +1 -1
  64. package/dist/{registerServiceWorker-D98IrUws.js → registerServiceWorker-lSZgPKiH.js} +5 -5
  65. package/dist/{registerServiceWorker-D98IrUws.js.map → registerServiceWorker-lSZgPKiH.js.map} +1 -1
  66. package/dist/sentry-QXKgQmr2.js +15 -0
  67. package/dist/sentry-QXKgQmr2.js.map +1 -0
  68. package/dist/start-connect.js +1 -1
  69. package/dist/{toast-DtfTKZND.js → toast-BXIGd4Eb.js} +3 -3
  70. package/dist/{toast-DtfTKZND.js.map → toast-BXIGd4Eb.js.map} +1 -1
  71. package/dist/{use-renown-login-DtCtMWCo.js → use-renown-login-Cf3va6u_.js} +3 -3
  72. package/dist/{use-renown-login-DtCtMWCo.js.map → use-renown-login-Cf3va6u_.js.map} +1 -1
  73. package/dist/{useRegistryPackages-dCWW6oNq.js → useRegistryPackages-DMhCvTWq.js} +3 -3
  74. package/dist/{useRegistryPackages-dCWW6oNq.js.map → useRegistryPackages-DMhCvTWq.js.map} +1 -1
  75. package/package.json +12 -12
  76. package/dist/SettingsModal-DzW3OIrB.js.map +0 -1
  77. package/dist/app-loader-BLbUg8o4.js +0 -4
  78. package/dist/app-loader-VArdOK2J.js.map +0 -1
  79. package/dist/build-info-1EmBSRGA.js +0 -18
  80. package/dist/build-info-1EmBSRGA.js.map +0 -1
  81. package/dist/components-BmUSYnlz.js +0 -5
  82. package/dist/connect.config-XXdN7RFy.js.map +0 -1
  83. package/dist/load-RSUO_fUw.js +0 -100
  84. package/dist/load-RSUO_fUw.js.map +0 -1
  85. package/dist/package-C3Jxu89p.js +0 -133
  86. package/dist/package-C3Jxu89p.js.map +0 -1
  87. package/dist/reload-connect-toast-BzHqUfbu.js +0 -30
  88. package/dist/reload-connect-toast-BzHqUfbu.js.map +0 -1
@@ -1,29 +1,29 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9484dd22-70cf-5c70-a426-ecd0dd523afb")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="5b2c348d-cfb3-5e0e-8039-a00e21d28c40")}catch(e){}}();
3
3
  import { n as getRuntimeConfig } from "./runtime-config-DL3QjcfM.js";
4
4
  import { c as idbError } from "./pglite-major-B39aOEiE.js";
5
5
  import { n as cloneFileData, r as migrateIdb } from "./pglite-migrate-core-Boxqqx-c.js";
6
- import { a as defaultPHDocumentEditorConfig, i as defaultPHAppConfig, r as connectConfig } from "./connect.config-XXdN7RFy.js";
7
- import { f as PRIMARY_IDB_NAMES, r as subscribeWorkerConnection, s as getCachedMigrationMajor, t as getWorkerConnectionStatus, u as subscribeMigrationMajor } from "./connection-state-DTSv8MDQ.js";
8
- import { n as serviceWorkerManager, r as subscribeServiceWorkerUpdate, t as getServiceWorkerUpdateAvailable } from "./registerServiceWorker-D98IrUws.js";
9
- import { n as setSentryModule } from "./reload-connect-toast-BzHqUfbu.js";
10
- import { n as dismissToast, r as toast, t as ToastContainer } from "./toast-DtfTKZND.js";
11
- import { i as useIsEmbedded, r as getIsEmbedded, t as useAcceptedCookies } from "./preferences-store-C-u8PIwU.js";
12
- import { t as useOpenRenownLogin } from "./use-renown-login-DtCtMWCo.js";
6
+ import { a as defaultPHDocumentEditorConfig, i as defaultPHAppConfig, r as connectConfig } from "./connect.config-ZWoeCSit.js";
7
+ import { f as PRIMARY_IDB_NAMES, r as subscribeWorkerConnection, s as getCachedMigrationMajor, t as getWorkerConnectionStatus, u as subscribeMigrationMajor } from "./connection-state-CedmAXd-.js";
8
+ import { n as serviceWorkerManager, r as subscribeServiceWorkerUpdate, t as getServiceWorkerUpdateAvailable } from "./registerServiceWorker-lSZgPKiH.js";
9
+ import { t as setSentryModule } from "./sentry-QXKgQmr2.js";
10
+ import { i as useIsEmbedded, r as getIsEmbedded, t as useAcceptedCookies } from "./preferences-store-CUBzmf5F.js";
11
+ import { n as dismissToast, r as toast, t as ToastContainer } from "./toast-BXIGd4Eb.js";
12
+ import { t as useOpenRenownLogin } from "./use-renown-login-Cf3va6u_.js";
13
13
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
14
14
  import { useTranslation } from "react-i18next";
15
15
  import React, { StrictMode, Suspense, createElement, lazy, useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
16
16
  import { DriveCollectionId, RenownWalletProvider, addFileWithProgress, getRevisionFromDate, initTheme, logout, setPHAppConfig, setPHDocumentEditorConfig, setRevisionHistoryVisible, setSelectedDrive, setSelectedNode, showPHModal, useAppModuleById, useConnectionStates, useDefaultAppModule, useDocumentById, useDocumentModelModuleById, useDocumentOperations, useDocumentVersionStatus, useDrives, useEditorModuleById, useEditorPreloader, useFallbackEditorModule, useIsAddDriveEnabled, useNodeParentFolderById, usePHModal, usePackageDiscoveryService, useReactorClientModule, useRevisionHistoryVisible, useSelectedDocument, useSelectedDocumentId, useSelectedDriveSafe, useSelectedFolder, useSelectedTimelineItem, useSyncList, useTheme, useUser, useVetraPackageManager, useVetraPackages } from "@powerhousedao/reactor-browser";
17
17
  import { childLogger } from "document-model";
18
18
  import { ConnectSidebar, ConnectTooltipProvider, DefaultEditorLoader, DriveAuthGate, DropZoneWrapper, HomeScreen, HomeScreenAddDriveItem, HomeScreenItem, LogoAnimation, PackageInstallModal, RevisionHistory, SidebarAddDriveItem, SidebarItem, UploadFileListContainer, formatFileSize, mapProgressStageToStatus, useEns } from "@powerhousedao/design-system/connect";
19
- import { z } from "zod";
20
19
  import { Outlet, RouterProvider, createBrowserRouter, createRoutesFromChildren, matchRoutes, useLocation, useNavigationType } from "react-router-dom";
21
20
  import { useHotkeys } from "react-hotkeys-hook";
22
21
  import { Icon, Modal, PowerhouseButton } from "@powerhousedao/design-system";
23
22
  import { ErrorBoundary } from "react-error-boundary";
23
+ import { z } from "zod";
24
24
  import { GenericDriveExplorer } from "@powerhousedao/powerhouse-vetra-packages/editors";
25
25
  import { createReactorMcpProvider } from "@powerhousedao/reactor-mcp/tools";
26
- import { ReactorChatFab } from "@powerhousedao/reactor-browser/ai";
26
+ import { ReactorChatFab, createSwitchboardSchemaTool } from "@powerhousedao/reactor-browser/ai";
27
27
  import { twMerge } from "tailwind-merge";
28
28
  import { mockAdapter } from "@renown/sdk/wallet/mock";
29
29
  import { privyAdapter } from "@renown/sdk/wallet/privy";
@@ -393,230 +393,6 @@ async function migrateAllIfNeeded() {
393
393
  });
394
394
  }
395
395
  //#endregion
396
- //#region src/services/openpanel/buffer.ts
397
- const buffer = [];
398
- let errorHandler;
399
- function defaultOnError(err) {
400
- console.warn("[useOpenPanelAnalytics] track failed:", err);
401
- }
402
- /**
403
- * Forward a single event to the active client, swallowing any throw.
404
- *
405
- * The outer try/catch handles synchronous throws from `client.track`; the
406
- * inner `.catch()` handles rejected promises. Both are needed because
407
- * `Promise.resolve(x).catch()` cannot catch a throw from evaluating `x`.
408
- */
409
- function forward(client, name, props) {
410
- try {
411
- Promise.resolve(client.track(name, props)).catch((err) => (errorHandler ?? defaultOnError)(err));
412
- } catch (err) {
413
- (errorHandler ?? defaultOnError)(err);
414
- }
415
- }
416
- /**
417
- * Drain the pre-init buffer in FIFO order through `client.track`, then forward
418
- * subsequent events directly. Called once from `getOpenPanelClient()`.
419
- */
420
- function drainOpenPanelBuffer(client, onError) {
421
- errorHandler = onError;
422
- const pending = buffer.splice(0, buffer.length);
423
- for (const [name, props] of pending) forward(client, name, props);
424
- }
425
- /**
426
- * Clear the buffer and reset the active client. Buffered pre-consent events
427
- * are discarded so they are not replayed if the user later re-accepts.
428
- */
429
- function clearOpenPanelBuffer() {
430
- buffer.length = 0;
431
- errorHandler = void 0;
432
- }
433
- //#endregion
434
- //#region src/services/openpanel/client.ts
435
- let client;
436
- /**
437
- * Returns the cached `OpenPanel` singleton, building it on first call.
438
- *
439
- * When `config.clientId` is empty it returns `undefined` without importing
440
- * `@openpanel/web`, so the bundler can tree-shake the SDK out of production.
441
- */
442
- async function getOpenPanelClient(config) {
443
- if (!config.clientId) return;
444
- if (client) return client;
445
- const { OpenPanel: OpenPanelClass } = await import("@openpanel/web");
446
- client = new OpenPanelClass({
447
- clientId: config.clientId,
448
- ...config.apiUrl ? { apiUrl: config.apiUrl } : {},
449
- trackScreenViews: true,
450
- trackOutgoingLinks: true
451
- });
452
- client.setGlobalProperties({ app: "connect" });
453
- drainOpenPanelBuffer(client);
454
- return client;
455
- }
456
- /**
457
- * Clears the cached singleton and the pre-init buffer. Call on consent
458
- * revocation or during tests; buffered events are discarded, not replayed.
459
- */
460
- function resetOpenPanelClient() {
461
- client = void 0;
462
- clearOpenPanelBuffer();
463
- }
464
- //#endregion
465
- //#region src/services/openpanel/events.json
466
- var events_default = [
467
- {
468
- "documentType": "powerhouse/document-drive",
469
- "actionTypes": [
470
- "ADD_FOLDER",
471
- "DELETE_NODE",
472
- "ADD_FILE",
473
- "UPDATE_FILE",
474
- "COPY_NODE",
475
- "MOVE_NODE",
476
- "SET_DRIVE_NAME",
477
- "SET_DRIVE_ICON"
478
- ]
479
- },
480
- {
481
- "documentType": "powerhouse/document-model",
482
- "actionTypes": [
483
- "SET_MODEL_NAME",
484
- "SET_MODEL_ID",
485
- "ADD_MODULE",
486
- "DELETE_MODULE",
487
- "ADD_OPERATION",
488
- "DELETE_OPERATION"
489
- ]
490
- },
491
- {
492
- "documentType": "powerhouse/reactor-drive",
493
- "actionTypes": [
494
- "ADD_FOLDER",
495
- "REMOVE_FOLDER",
496
- "UPDATE_FOLDER"
497
- ]
498
- }
499
- ];
500
- //#endregion
501
- //#region src/services/openpanel/events.ts
502
- const EventMappingSchema = z.object({
503
- documentType: z.string().min(1),
504
- actionTypes: z.array(z.string().min(1)).min(1),
505
- alias: z.string().optional()
506
- }).strict();
507
- const EventMappingsSchema = z.array(EventMappingSchema).readonly();
508
- /**
509
- * Parses and validates the event mapping table, returning the validated array
510
- * and an O(1) lookup map. Accepts a `raw` override for tests. Throws on zod
511
- * failures and on duplicate `(documentType, actionType)` pairs.
512
- */
513
- function loadEvents(raw = events_default) {
514
- const result = EventMappingsSchema.safeParse(raw);
515
- if (!result.success) throw new Error(`Invalid OpenPanel events.json: ${result.error.message}`);
516
- const mappings = result.data;
517
- const lookupMap = /* @__PURE__ */ new Map();
518
- for (const mapping of mappings) {
519
- let inner = lookupMap.get(mapping.documentType);
520
- if (!inner) {
521
- inner = /* @__PURE__ */ new Map();
522
- lookupMap.set(mapping.documentType, inner);
523
- }
524
- for (const actionType of mapping.actionTypes) {
525
- if (inner.has(actionType)) throw new Error(`Duplicate OpenPanel event mapping for ${mapping.documentType}/${actionType}`);
526
- inner.set(actionType, mapping);
527
- }
528
- }
529
- return {
530
- mappings,
531
- lookupMap
532
- };
533
- }
534
- const { mappings: defaultMappings, lookupMap: defaultLookupMap } = loadEvents();
535
- /** Validated mapping array from the bundled events.json. */
536
- const eventMappings = defaultMappings;
537
- /** O(1) lookup map: documentType → actionType → mapping. */
538
- const eventLookupMap = defaultLookupMap;
539
- /**
540
- * Normalizes a document type into a safe event-name segment: lowercased, `/`
541
- * replaced with `.`, and any character outside `[a-z0-9._-]` stripped.
542
- * e.g. `powerhouse/document-drive` → `powerhouse.document-drive`.
543
- */
544
- function normalize(documentType) {
545
- return documentType.toLowerCase().replace(/\//g, ".").replace(/[^a-z0-9._-]/g, "");
546
- }
547
- /**
548
- * Derives the OpenPanel event name: `mapping.alias` when present, otherwise
549
- * `${normalize(documentType)}.${actionType.toLowerCase()}`.
550
- */
551
- function deriveEventName(mapping, op) {
552
- if (mapping.alias) return mapping.alias;
553
- return `${normalize(op.context.documentType)}.${op.operation.action.type.toLowerCase()}`;
554
- }
555
- /**
556
- * Builds the default properties attached to every OpenPanel event. The `app`
557
- * property is stamped globally by the client, not here.
558
- */
559
- function buildDefaultProperties(op) {
560
- return {
561
- documentType: op.context.documentType,
562
- actionType: op.operation.action.type,
563
- documentId: op.context.documentId,
564
- scope: op.context.scope,
565
- branch: op.context.branch
566
- };
567
- }
568
- //#endregion
569
- //#region src/services/openpanel/processor.ts
570
- /**
571
- * Read-only reactor `IProcessor` that translates matching document operations
572
- * into OpenPanel analytics events. Operations whose `(documentType, actionType)`
573
- * pair is absent from the lookup map are skipped; per-operation errors are
574
- * routed to `onError` and never thrown back to the manager.
575
- */
576
- var OpenPanelProcessor = class {
577
- constructor(client, lookupMap, onError = (err) => console.warn("[OpenPanelProcessor] Error tracking event:", err)) {
578
- this.client = client;
579
- this.lookupMap = lookupMap;
580
- this.onError = onError;
581
- }
582
- async onOperations(operations) {
583
- for (const op of operations) {
584
- const inner = this.lookupMap.get(op.context.documentType);
585
- if (!inner) continue;
586
- const mapping = inner.get(op.operation.action.type);
587
- if (!mapping) continue;
588
- const name = deriveEventName(mapping, op);
589
- const payload = buildDefaultProperties(op);
590
- try {
591
- await this.client.track(name, payload);
592
- } catch (err) {
593
- this.onError(err, op);
594
- }
595
- }
596
- }
597
- onDisconnect() {
598
- this.client.flush?.();
599
- return Promise.resolve();
600
- }
601
- };
602
- //#endregion
603
- //#region src/services/openpanel/factory.ts
604
- /**
605
- * Returns a `ProcessorFactory` that, for each drive, creates a single
606
- * `OpenPanelProcessor` record whose `filter.documentType` is the union of all
607
- * document types present in the event mapping table.
608
- */
609
- function createOpenPanelProcessorFactory(config) {
610
- return function openPanelProcessorFactory(_driveHeader) {
611
- const documentType = Array.from(config.events.lookupMap.keys());
612
- return [{
613
- processor: new OpenPanelProcessor(config.client, config.events.lookupMap, config.onError),
614
- filter: { documentType },
615
- startFrom: config.startFrom ?? "current"
616
- }];
617
- };
618
- }
619
- //#endregion
620
396
  //#region src/hooks/useFailedInstallations.ts
621
397
  const emptyArray$1 = [];
622
398
  function useFailedInstallations() {
@@ -687,6 +463,44 @@ function useInitSentry() {
687
463
  }, [analytics]);
688
464
  }
689
465
  //#endregion
466
+ //#region src/services/openpanel/buffer.ts
467
+ const buffer = [];
468
+ let errorHandler;
469
+ function defaultOnError(err) {
470
+ console.warn("[useOpenPanelAnalytics] track failed:", err);
471
+ }
472
+ /**
473
+ * Forward a single event to the active client, swallowing any throw.
474
+ *
475
+ * The outer try/catch handles synchronous throws from `client.track`; the
476
+ * inner `.catch()` handles rejected promises. Both are needed because
477
+ * `Promise.resolve(x).catch()` cannot catch a throw from evaluating `x`.
478
+ */
479
+ function forward(client, name, props) {
480
+ try {
481
+ Promise.resolve(client.track(name, props)).catch((err) => (errorHandler ?? defaultOnError)(err));
482
+ } catch (err) {
483
+ (errorHandler ?? defaultOnError)(err);
484
+ }
485
+ }
486
+ /**
487
+ * Drain the pre-init buffer in FIFO order through `client.track`, then forward
488
+ * subsequent events directly. Called once from `getOpenPanelClient()`.
489
+ */
490
+ function drainOpenPanelBuffer(client, onError) {
491
+ errorHandler = onError;
492
+ const pending = buffer.splice(0, buffer.length);
493
+ for (const [name, props] of pending) forward(client, name, props);
494
+ }
495
+ /**
496
+ * Clear the buffer and reset the active client. Buffered pre-consent events
497
+ * are discarded so they are not replayed if the user later re-accepts.
498
+ */
499
+ function clearOpenPanelBuffer() {
500
+ buffer.length = 0;
501
+ errorHandler = void 0;
502
+ }
503
+ //#endregion
690
504
  //#region src/hooks/usePendingInstallations.ts
691
505
  const emptyArray = [];
692
506
  function usePendingInstallations() {
@@ -966,6 +780,192 @@ const Analytics = () => {
966
780
  return null;
967
781
  };
968
782
  //#endregion
783
+ //#region src/services/openpanel/client.ts
784
+ let client;
785
+ /**
786
+ * Returns the cached `OpenPanel` singleton, building it on first call.
787
+ *
788
+ * When `config.clientId` is empty it returns `undefined` without importing
789
+ * `@openpanel/web`, so the bundler can tree-shake the SDK out of production.
790
+ */
791
+ async function getOpenPanelClient(config) {
792
+ if (!config.clientId) return;
793
+ if (client) return client;
794
+ const { OpenPanel: OpenPanelClass } = await import("@openpanel/web");
795
+ client = new OpenPanelClass({
796
+ clientId: config.clientId,
797
+ ...config.apiUrl ? { apiUrl: config.apiUrl } : {},
798
+ trackScreenViews: true,
799
+ trackOutgoingLinks: true
800
+ });
801
+ client.setGlobalProperties({ app: "connect" });
802
+ drainOpenPanelBuffer(client);
803
+ return client;
804
+ }
805
+ /**
806
+ * Clears the cached singleton and the pre-init buffer. Call on consent
807
+ * revocation or during tests; buffered events are discarded, not replayed.
808
+ */
809
+ function resetOpenPanelClient() {
810
+ client = void 0;
811
+ clearOpenPanelBuffer();
812
+ }
813
+ //#endregion
814
+ //#region src/services/openpanel/events.json
815
+ var events_default = [
816
+ {
817
+ "documentType": "powerhouse/document-drive",
818
+ "actionTypes": [
819
+ "ADD_FOLDER",
820
+ "DELETE_NODE",
821
+ "ADD_FILE",
822
+ "UPDATE_FILE",
823
+ "COPY_NODE",
824
+ "MOVE_NODE",
825
+ "SET_DRIVE_NAME",
826
+ "SET_DRIVE_ICON"
827
+ ]
828
+ },
829
+ {
830
+ "documentType": "powerhouse/document-model",
831
+ "actionTypes": [
832
+ "SET_MODEL_NAME",
833
+ "SET_MODEL_ID",
834
+ "ADD_MODULE",
835
+ "DELETE_MODULE",
836
+ "ADD_OPERATION",
837
+ "DELETE_OPERATION"
838
+ ]
839
+ },
840
+ {
841
+ "documentType": "powerhouse/reactor-drive",
842
+ "actionTypes": [
843
+ "ADD_FOLDER",
844
+ "REMOVE_FOLDER",
845
+ "UPDATE_FOLDER"
846
+ ]
847
+ }
848
+ ];
849
+ //#endregion
850
+ //#region src/services/openpanel/events.ts
851
+ const EventMappingSchema = z.object({
852
+ documentType: z.string().min(1),
853
+ actionTypes: z.array(z.string().min(1)).min(1),
854
+ alias: z.string().optional()
855
+ }).strict();
856
+ const EventMappingsSchema = z.array(EventMappingSchema).readonly();
857
+ /**
858
+ * Parses and validates the event mapping table, returning the validated array
859
+ * and an O(1) lookup map. Accepts a `raw` override for tests. Throws on zod
860
+ * failures and on duplicate `(documentType, actionType)` pairs.
861
+ */
862
+ function loadEvents(raw = events_default) {
863
+ const result = EventMappingsSchema.safeParse(raw);
864
+ if (!result.success) throw new Error(`Invalid OpenPanel events.json: ${result.error.message}`);
865
+ const mappings = result.data;
866
+ const lookupMap = /* @__PURE__ */ new Map();
867
+ for (const mapping of mappings) {
868
+ let inner = lookupMap.get(mapping.documentType);
869
+ if (!inner) {
870
+ inner = /* @__PURE__ */ new Map();
871
+ lookupMap.set(mapping.documentType, inner);
872
+ }
873
+ for (const actionType of mapping.actionTypes) {
874
+ if (inner.has(actionType)) throw new Error(`Duplicate OpenPanel event mapping for ${mapping.documentType}/${actionType}`);
875
+ inner.set(actionType, mapping);
876
+ }
877
+ }
878
+ return {
879
+ mappings,
880
+ lookupMap
881
+ };
882
+ }
883
+ const { mappings: defaultMappings, lookupMap: defaultLookupMap } = loadEvents();
884
+ /** Validated mapping array from the bundled events.json. */
885
+ const eventMappings = defaultMappings;
886
+ /** O(1) lookup map: documentType → actionType → mapping. */
887
+ const eventLookupMap = defaultLookupMap;
888
+ /**
889
+ * Normalizes a document type into a safe event-name segment: lowercased, `/`
890
+ * replaced with `.`, and any character outside `[a-z0-9._-]` stripped.
891
+ * e.g. `powerhouse/document-drive` → `powerhouse.document-drive`.
892
+ */
893
+ function normalize(documentType) {
894
+ return documentType.toLowerCase().replace(/\//g, ".").replace(/[^a-z0-9._-]/g, "");
895
+ }
896
+ /**
897
+ * Derives the OpenPanel event name: `mapping.alias` when present, otherwise
898
+ * `${normalize(documentType)}.${actionType.toLowerCase()}`.
899
+ */
900
+ function deriveEventName(mapping, op) {
901
+ if (mapping.alias) return mapping.alias;
902
+ return `${normalize(op.context.documentType)}.${op.operation.action.type.toLowerCase()}`;
903
+ }
904
+ /**
905
+ * Builds the default properties attached to every OpenPanel event. The `app`
906
+ * property is stamped globally by the client, not here.
907
+ */
908
+ function buildDefaultProperties(op) {
909
+ return {
910
+ documentType: op.context.documentType,
911
+ actionType: op.operation.action.type,
912
+ documentId: op.context.documentId,
913
+ scope: op.context.scope,
914
+ branch: op.context.branch
915
+ };
916
+ }
917
+ //#endregion
918
+ //#region src/services/openpanel/processor.ts
919
+ /**
920
+ * Read-only reactor `IProcessor` that translates matching document operations
921
+ * into OpenPanel analytics events. Operations whose `(documentType, actionType)`
922
+ * pair is absent from the lookup map are skipped; per-operation errors are
923
+ * routed to `onError` and never thrown back to the manager.
924
+ */
925
+ var OpenPanelProcessor = class {
926
+ constructor(client, lookupMap, onError = (err) => console.warn("[OpenPanelProcessor] Error tracking event:", err)) {
927
+ this.client = client;
928
+ this.lookupMap = lookupMap;
929
+ this.onError = onError;
930
+ }
931
+ async onOperations(operations) {
932
+ for (const op of operations) {
933
+ const inner = this.lookupMap.get(op.context.documentType);
934
+ if (!inner) continue;
935
+ const mapping = inner.get(op.operation.action.type);
936
+ if (!mapping) continue;
937
+ const name = deriveEventName(mapping, op);
938
+ const payload = buildDefaultProperties(op);
939
+ try {
940
+ await this.client.track(name, payload);
941
+ } catch (err) {
942
+ this.onError(err, op);
943
+ }
944
+ }
945
+ }
946
+ onDisconnect() {
947
+ this.client.flush?.();
948
+ return Promise.resolve();
949
+ }
950
+ };
951
+ //#endregion
952
+ //#region src/services/openpanel/factory.ts
953
+ /**
954
+ * Returns a `ProcessorFactory` that, for each drive, creates a single
955
+ * `OpenPanelProcessor` record whose `filter.documentType` is the union of all
956
+ * document types present in the event mapping table.
957
+ */
958
+ function createOpenPanelProcessorFactory(config) {
959
+ return function openPanelProcessorFactory(_driveHeader) {
960
+ const documentType = Array.from(config.events.lookupMap.keys());
961
+ return [{
962
+ processor: new OpenPanelProcessor(config.client, config.events.lookupMap, config.onError),
963
+ filter: { documentType },
964
+ startFrom: config.startFrom ?? "current"
965
+ }];
966
+ };
967
+ }
968
+ //#endregion
969
969
  //#region src/components/openpanel-traits.ts
970
970
  /**
971
971
  * Builds the OpenPanel identity traits from a renown User.
@@ -1210,10 +1210,26 @@ function getReactorTools() {
1210
1210
  return createReactorMcpProvider({
1211
1211
  client,
1212
1212
  syncManager
1213
- }).then((provider) => Object.values(provider.tools).map((tool) => ({
1214
- ...tool,
1215
- inputSchema: tool.inputSchema ?? {}
1216
- })));
1213
+ }).then((provider) => {
1214
+ const builtInTools = Object.values(provider.tools).map((tool) => ({
1215
+ ...tool,
1216
+ inputSchema: tool.inputSchema ?? {}
1217
+ }));
1218
+ const taken = new Set(builtInTools.map((tool) => tool.name));
1219
+ const packageTools = (ph?.vetraPackageManager?.packages ?? []).flatMap((pkg) => (pkg.aiTools ?? []).filter((tool) => {
1220
+ if (taken.has(tool.name)) {
1221
+ console.warn(`[Connect][AI] Package tool "${tool.name}" shadows an existing tool and was ignored.`);
1222
+ return false;
1223
+ }
1224
+ taken.add(tool.name);
1225
+ return true;
1226
+ }));
1227
+ return [
1228
+ ...builtInTools,
1229
+ createSwitchboardSchemaTool(),
1230
+ ...packageTools
1231
+ ];
1232
+ });
1217
1233
  }
1218
1234
  /** Connect's bottom-right AI chat FAB, bound to the browser reactor. */
1219
1235
  function ConnectReactorChatFab() {
@@ -2040,20 +2056,20 @@ const MigrationBanner = () => {
2040
2056
  };
2041
2057
  //#endregion
2042
2058
  //#region src/components/modal/modals-container.tsx
2043
- const AddDriveModal$1 = lazy(() => import("./AddDriveModal-DIMewThf.js").then((m) => ({ default: m.AddDriveModal })));
2044
- const ClearStorageModal = lazy(() => import("./ClearStorageModal-DKy2tPYb.js").then((m) => ({ default: m.ClearStorageModal })));
2045
- const CookiesPolicyModal = lazy(() => import("./CookiesPolicyModal-Bns4789o.js").then((m) => ({ default: m.CookiesPolicyModal })));
2046
- const CreateDocumentModal$1 = lazy(() => import("./CreateDocumentModal-MlA2YRaW.js").then((m) => ({ default: m.CreateDocumentModal })));
2047
- const DebugSettingsModal = lazy(() => import("./DebugSettingsModal-890WlVp4.js").then((m) => ({ default: m.DebugSettingsModal })));
2048
- const DeleteDriveModal = lazy(() => import("./DeleteDriveModal-gP7j8C0Y.js").then((m) => ({ default: m.DeleteDriveModal })));
2049
- const DeleteItemModal = lazy(() => import("./DeleteItemModal-CMM-fPsz.js").then((m) => ({ default: m.DeleteItemModal })));
2050
- const DisclaimerModal = lazy(() => import("./DisclaimerModal-meOyQCfU.js").then((m) => ({ default: m.DisclaimerModal })));
2051
- const DriveSettingsModal$1 = lazy(() => import("./DriveSettingsModal-Bv0y1BEK.js").then((m) => ({ default: m.DriveSettingsModal })));
2052
- const DownloadDocumentWithErrorsModal = lazy(() => import("./DownloadDocumentWithErrorsModal-CCdbt2jJ.js").then((m) => ({ default: m.DownloadDocumentWithErrorsModal })));
2053
- const DocumentVersionUnsupportedModal = lazy(() => import("./DocumentVersionUnsupportedModal-TlDH1aP5.js").then((m) => ({ default: m.DocumentVersionUnsupportedModal })));
2054
- const ConfirmDocumentUpgradeModal = lazy(() => import("./ConfirmDocumentUpgradeModal-CcpgpyOB.js").then((m) => ({ default: m.ConfirmDocumentUpgradeModal })));
2055
- const SettingsModal$1 = lazy(() => import("./SettingsModal-DzW3OIrB.js").then((m) => ({ default: m.SettingsModal })));
2056
- const UpgradeDriveModal = lazy(() => import("./UpgradeDriveModal-077wPR2N.js").then((m) => ({ default: m.UpgradeDriveModal })));
2059
+ const AddDriveModal$1 = lazy(() => import("./AddDriveModal-Q-Ffh5XA.js").then((m) => ({ default: m.AddDriveModal })));
2060
+ const ClearStorageModal = lazy(() => import("./ClearStorageModal-DKr4-fbt.js").then((m) => ({ default: m.ClearStorageModal })));
2061
+ const CookiesPolicyModal = lazy(() => import("./CookiesPolicyModal-BpyPPyxS.js").then((m) => ({ default: m.CookiesPolicyModal })));
2062
+ const CreateDocumentModal$1 = lazy(() => import("./CreateDocumentModal-C45W8J0V.js").then((m) => ({ default: m.CreateDocumentModal })));
2063
+ const DebugSettingsModal = lazy(() => import("./DebugSettingsModal-BSOG0IYo.js").then((m) => ({ default: m.DebugSettingsModal })));
2064
+ const DeleteDriveModal = lazy(() => import("./DeleteDriveModal-Dug84t1j.js").then((m) => ({ default: m.DeleteDriveModal })));
2065
+ const DeleteItemModal = lazy(() => import("./DeleteItemModal-mMzy3V8o.js").then((m) => ({ default: m.DeleteItemModal })));
2066
+ const DisclaimerModal = lazy(() => import("./DisclaimerModal-DvpD5dPM.js").then((m) => ({ default: m.DisclaimerModal })));
2067
+ const DriveSettingsModal$1 = lazy(() => import("./DriveSettingsModal-C6-mRQiv.js").then((m) => ({ default: m.DriveSettingsModal })));
2068
+ const DownloadDocumentWithErrorsModal = lazy(() => import("./DownloadDocumentWithErrorsModal-IKl0ljQb.js").then((m) => ({ default: m.DownloadDocumentWithErrorsModal })));
2069
+ const DocumentVersionUnsupportedModal = lazy(() => import("./DocumentVersionUnsupportedModal-C3Q0V75l.js").then((m) => ({ default: m.DocumentVersionUnsupportedModal })));
2070
+ const ConfirmDocumentUpgradeModal = lazy(() => import("./ConfirmDocumentUpgradeModal-FUOhZsk7.js").then((m) => ({ default: m.ConfirmDocumentUpgradeModal })));
2071
+ const SettingsModal$1 = lazy(() => import("./SettingsModal-Bb7CklKR.js").then((m) => ({ default: m.SettingsModal })));
2072
+ const UpgradeDriveModal = lazy(() => import("./UpgradeDriveModal-_8t9slxQ.js").then((m) => ({ default: m.UpgradeDriveModal })));
2057
2073
  const modalComponents = {
2058
2074
  addDrive: AddDriveModal$1,
2059
2075
  clearStorage: ClearStorageModal,
@@ -2067,13 +2083,13 @@ const modalComponents = {
2067
2083
  downloadDocumentWithErrors: DownloadDocumentWithErrorsModal,
2068
2084
  documentVersionUnsupported: DocumentVersionUnsupportedModal,
2069
2085
  confirmDocumentUpgrade: ConfirmDocumentUpgradeModal,
2070
- inspector: lazy(() => import("./InspectorModal-C3L5F4Ma.js").then((m) => ({ default: m.InspectorModal }))),
2086
+ inspector: lazy(() => import("./InspectorModal-bxhxkGgI.js").then((m) => ({ default: m.InspectorModal }))),
2071
2087
  settings: SettingsModal$1,
2072
2088
  upgradeDrive: UpgradeDriveModal,
2073
- missingPackage: lazy(() => import("./MissingPackageModal-C6HO-a7E.js").then((m) => ({ default: m.ConnectMissingPackageModal }))),
2074
- driveAuthRequired: lazy(() => import("./DriveAuthRequiredModal-9GsPnOYi.js").then((m) => ({ default: m.DriveAuthRequiredModal }))),
2075
- openFileDocuments: lazy(() => import("./OpenFileDocumentsModal-6MK7Ourm.js").then((m) => ({ default: m.OpenFileDocumentsModal }))),
2076
- login: lazy(() => import("./LoginModal-CxFHjxz8.js").then((m) => ({ default: m.LoginModal })))
2089
+ missingPackage: lazy(() => import("./MissingPackageModal-C7usWVHQ.js").then((m) => ({ default: m.ConnectMissingPackageModal }))),
2090
+ driveAuthRequired: lazy(() => import("./DriveAuthRequiredModal-Cw9eCAQ_.js").then((m) => ({ default: m.DriveAuthRequiredModal }))),
2091
+ openFileDocuments: lazy(() => import("./OpenFileDocumentsModal-C97XmbUj.js").then((m) => ({ default: m.OpenFileDocumentsModal }))),
2092
+ login: lazy(() => import("./LoginModal-CybbOm3N.js").then((m) => ({ default: m.LoginModal })))
2077
2093
  };
2078
2094
  const ModalsContainer = lazy(() => {
2079
2095
  return Promise.resolve({ default: () => {
@@ -2112,9 +2128,9 @@ const ServiceWorkerUpdatePrompt = () => {
2112
2128
  };
2113
2129
  //#endregion
2114
2130
  //#region src/components/app-loader.tsx
2115
- const CookieBanner$1 = lazy(() => import("./cookie-banner-BJrG_u38.js").then((m) => ({ default: m.CookieBanner })));
2131
+ const CookieBanner$1 = lazy(() => import("./cookie-banner-CTxjAKt4.js").then((m) => ({ default: m.CookieBanner })));
2116
2132
  const AppLoader = (props) => {
2117
- const Load = lazy(() => import("./load-RSUO_fUw.js").then((m) => m.loadComponent(props.localPackage)));
2133
+ const Load = lazy(() => import("./load-BVbjbcJv.js").then((m) => m.loadComponent(props.localPackage)));
2118
2134
  return /* @__PURE__ */ jsx(StrictMode, { children: /* @__PURE__ */ jsxs(ErrorBoundary$1, {
2119
2135
  fallbackRender: (props) => /* @__PURE__ */ jsx(AppSkeleton, { children: /* @__PURE__ */ jsx(DetailedFallback, { ...props }) }),
2120
2136
  resetKeys: [props.localPackage],
@@ -2150,5 +2166,5 @@ const AppLoader = (props) => {
2150
2166
  //#endregion
2151
2167
  export { pendingFileKey as _, DocumentEditor as a, AppContainer as c, OpenPanel as d, Analytics as f, getPendingImportFiles as g, clearPendingImportFiles as h, Root as i, EditorLoader as l, runOpenFileImports as m, Sidebar as n, DriveIcon as o, AppSkeleton as p, Router as r, App as s, AppLoader as t, DocumentEditorContainer as u, subscribePendingImportFiles as v };
2152
2168
 
2153
- //# sourceMappingURL=app-loader-VArdOK2J.js.map
2154
- //# debugId=9484dd22-70cf-5c70-a426-ecd0dd523afb
2169
+ //# sourceMappingURL=app-loader-BckBQ0wA.js.map
2170
+ //# debugId=5b2c348d-cfb3-5e0e-8039-a00e21d28c40