@trops/dash-core 0.1.598 → 0.1.600

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.
@@ -934,6 +934,20 @@ var onboardingEvents$1 = {
934
934
  ONBOARDING_MARK_COMPLETED: ONBOARDING_MARK_COMPLETED$1,
935
935
  };
936
936
 
937
+ /**
938
+ * Event Constants — Export Events
939
+ *
940
+ * IPC event constants for the Export Everything bundle (Phase 4A).
941
+ * The renderer calls these via `window.mainApi.export.*`; the main
942
+ * process registers a handler against `exportController.exportEverythingForApplication`.
943
+ */
944
+
945
+ const EXPORT_EVERYTHING$1 = "export:everything";
946
+
947
+ var exportEvents$1 = {
948
+ EXPORT_EVERYTHING: EXPORT_EVERYTHING$1,
949
+ };
950
+
937
951
  /**
938
952
  * Events
939
953
  *
@@ -965,6 +979,7 @@ const webSocketEvents = requireWebSocketEvents();
965
979
  const mcpDashServerEvents = mcpDashServerEvents$1;
966
980
  const publisherKeyEvents = publisherKeyEvents$1;
967
981
  const onboardingEvents = onboardingEvents$1;
982
+ const exportEvents = exportEvents$1;
968
983
 
969
984
  const publicEvents = {
970
985
  ...dataEvents,
@@ -990,6 +1005,7 @@ const API_GROUPS = {
990
1005
  providers: Object.values(providerEvents),
991
1006
  "publisher-key": Object.values(publisherKeyEvents),
992
1007
  onboarding: Object.values(onboardingEvents),
1008
+ export: Object.values(exportEvents),
993
1009
  registry: Object.values(registryEvents),
994
1010
  "registry-auth": Object.values(registryAuthEvents),
995
1011
  scheduler: Object.values(schedulerEvents),
@@ -1030,6 +1046,7 @@ var events$8 = {
1030
1046
  ...mcpDashServerEvents,
1031
1047
  ...publisherKeyEvents,
1032
1048
  ...onboardingEvents,
1049
+ ...exportEvents,
1033
1050
  };
1034
1051
 
1035
1052
  /**
@@ -64015,6 +64032,220 @@ var onboardingController$1 = {
64015
64032
  _clearRecord: () => getStore$1().delete("onboarding"),
64016
64033
  };
64017
64034
 
64035
+ /**
64036
+ * exportController.js
64037
+ *
64038
+ * "Export Everything" bundle (Phase 4A of the MVP launch audit).
64039
+ *
64040
+ * Gathers every piece of user-owned config — workspaces, themes,
64041
+ * menu items / folders, and providers (METADATA ONLY, never the
64042
+ * decrypted credentials) — into a single ZIP that the user can save
64043
+ * as a backup or migration aid.
64044
+ *
64045
+ * Hard safety property: the ZIP MUST NOT contain provider credentials.
64046
+ * `providerController.listProviders` returns `provider.credentials` in
64047
+ * the decrypted plaintext form (see providerController.js:188-204), so
64048
+ * a naive `JSON.stringify(providers)` would leak every saved token in
64049
+ * the user's app to an arbitrary path on disk. This module uses an
64050
+ * EXPLICIT FIELD ALLOWLIST (not a blocklist) — only the fields named
64051
+ * in `SAFE_PROVIDER_FIELDS` ever leave the function. Re-import is out
64052
+ * of scope for MVP; the ZIP is read-only backup.
64053
+ *
64054
+ * The bundle layout (rooted at the user-picked ZIP path):
64055
+ * /manifest.json — schemaVersion + exportedAt + counts
64056
+ * /workspaces.json — array of workspaces (as stored on disk)
64057
+ * /themes.json — themes keyed by themeKey
64058
+ * /menu-items.json — folder/menu structure
64059
+ * /providers.json — providers with credentials stripped
64060
+ *
64061
+ * Schema versioning: `BUNDLE_SCHEMA_VERSION` stamps the manifest so a
64062
+ * future importer can refuse incompatible bundles loudly rather than
64063
+ * silently corrupting state.
64064
+ */
64065
+
64066
+ // `electron`, the four controllers, `path`, and `adm-zip` are
64067
+ // lazy-required INSIDE `exportEverythingForApplication` so the pure
64068
+ // helpers (`stripProviderCredentials`, `buildBundleFiles`) can be
64069
+ // loaded under `node:test` without booting the Electron runtime or
64070
+ // the controller chain (which itself requires `electron`).
64071
+
64072
+ const BUNDLE_SCHEMA_VERSION = "1.0.0";
64073
+
64074
+ // Allowlist of provider fields that are safe to include in the
64075
+ // exported bundle. Any field name NOT in this set is dropped — this
64076
+ // is the only line of defense against accidental credential leakage,
64077
+ // and it's tested explicitly in exportController.test.js. Adding a
64078
+ // new field here requires confirming it never carries a secret.
64079
+ const SAFE_PROVIDER_FIELDS = [
64080
+ "name",
64081
+ "type",
64082
+ "providerClass",
64083
+ "dateCreated",
64084
+ "dateUpdated",
64085
+ "isDefaultForType",
64086
+ "mcpConfig", // connection metadata (command, args mapping) — no secrets
64087
+ "allowedTools",
64088
+ "wsConfig", // WebSocket URLs — no secrets
64089
+ ];
64090
+
64091
+ /**
64092
+ * Strip every provider down to the allowlisted fields. Anything else
64093
+ * (most importantly `credentials`) is dropped.
64094
+ *
64095
+ * Exported for direct unit testing — the credential-leak regression
64096
+ * pin asserts this function is the only path provider data takes to
64097
+ * the bundle.
64098
+ *
64099
+ * @param {Array<Object>} providers - raw listProviders() output
64100
+ * @returns {Array<Object>} sanitized copies
64101
+ */
64102
+ function stripProviderCredentials(providers) {
64103
+ if (!Array.isArray(providers)) return [];
64104
+ return providers.map((p) => {
64105
+ const safe = {};
64106
+ for (const field of SAFE_PROVIDER_FIELDS) {
64107
+ if (field in p) safe[field] = p[field];
64108
+ }
64109
+ return safe;
64110
+ });
64111
+ }
64112
+
64113
+ /**
64114
+ * Build the bundle contents (4 JSON blobs + manifest) without
64115
+ * touching the disk. Exported separately so tests can assert on the
64116
+ * structure without mocking electron's dialog/fs surfaces.
64117
+ *
64118
+ * @param {Object} sources - results of the four list calls
64119
+ * @param {Array} sources.workspaces
64120
+ * @param {Object} sources.themes
64121
+ * @param {Array} sources.menuItems
64122
+ * @param {Array} sources.providers - raw, MAY contain credentials
64123
+ * @returns {Object} map of file name → Buffer
64124
+ */
64125
+ function buildBundleFiles(sources) {
64126
+ const safeProviders = stripProviderCredentials(sources.providers || []);
64127
+ const manifest = {
64128
+ schemaVersion: BUNDLE_SCHEMA_VERSION,
64129
+ exportedAt: new Date().toISOString(),
64130
+ counts: {
64131
+ workspaces: Array.isArray(sources.workspaces)
64132
+ ? sources.workspaces.length
64133
+ : 0,
64134
+ themes:
64135
+ sources.themes && typeof sources.themes === "object"
64136
+ ? Object.keys(sources.themes).length
64137
+ : 0,
64138
+ menuItems: Array.isArray(sources.menuItems)
64139
+ ? sources.menuItems.length
64140
+ : 0,
64141
+ providers: safeProviders.length,
64142
+ },
64143
+ };
64144
+ const stringify = (obj) => Buffer.from(JSON.stringify(obj, null, 2), "utf-8");
64145
+ return {
64146
+ "manifest.json": stringify(manifest),
64147
+ "workspaces.json": stringify(sources.workspaces || []),
64148
+ "themes.json": stringify(sources.themes || {}),
64149
+ "menu-items.json": stringify(sources.menuItems || []),
64150
+ "providers.json": stringify(safeProviders),
64151
+ };
64152
+ }
64153
+
64154
+ /**
64155
+ * Export every piece of user-owned config to a single ZIP file the
64156
+ * user picks via the save dialog. Returns `{success, filePath}` on
64157
+ * success, `{success: false, error}` on failure, or
64158
+ * `{success: false, canceled: true}` if the user dismissed the
64159
+ * dialog.
64160
+ *
64161
+ * Provider credentials are NEVER included in the bundle.
64162
+ *
64163
+ * @param {BrowserWindow} win - main window (for dialog)
64164
+ * @param {string} appId - application identifier
64165
+ * @param {Object} [options]
64166
+ * @param {string} [options.defaultPath] - override the default save
64167
+ * path (used by tests to skip the dialog and write directly)
64168
+ * @returns {Promise<Object>}
64169
+ */
64170
+ async function exportEverythingForApplication$1(win, appId, options = {}) {
64171
+ try {
64172
+ const { app, dialog } = require("electron");
64173
+ const path = require("path");
64174
+ const AdmZip = require("adm-zip");
64175
+ const workspaceController = workspaceController_1;
64176
+ const themeController = themeController_1;
64177
+ const menuItemsController = menuItemsController_1;
64178
+ const providerController = requireProviderController();
64179
+
64180
+ const wsResult = workspaceController.listWorkspacesForApplication(
64181
+ win,
64182
+ appId,
64183
+ );
64184
+ const themeResult = themeController.listThemesForApplication(win, appId);
64185
+ const menuResult = menuItemsController.listMenuItemsForApplication(
64186
+ win,
64187
+ appId,
64188
+ );
64189
+ const provResult = providerController.listProviders(win, appId);
64190
+
64191
+ const files = buildBundleFiles({
64192
+ workspaces: wsResult?.workspaces || [],
64193
+ themes: themeResult?.themes || {},
64194
+ menuItems: menuResult?.menuItems || [],
64195
+ providers: provResult?.providers || [],
64196
+ });
64197
+
64198
+ // Allow tests to bypass the save dialog by providing a path. In
64199
+ // production, always go through Electron's native save picker so
64200
+ // the user explicitly chooses where the bundle lands.
64201
+ let filePath = options.defaultPath || null;
64202
+ if (!filePath) {
64203
+ const stamp = new Date()
64204
+ .toISOString()
64205
+ .replace(/[:.]/g, "-")
64206
+ .replace(/T/, "_")
64207
+ .slice(0, 19);
64208
+ const suggested = path.join(
64209
+ app.getPath("desktop"),
64210
+ `dash-backup-${stamp}.zip`,
64211
+ );
64212
+ const dlg = await dialog.showSaveDialog(win, {
64213
+ title: "Export Everything",
64214
+ defaultPath: suggested,
64215
+ filters: [{ name: "ZIP Archive", extensions: ["zip"] }],
64216
+ });
64217
+ if (dlg.canceled || !dlg.filePath) {
64218
+ return { success: false, canceled: true };
64219
+ }
64220
+ filePath = dlg.filePath;
64221
+ }
64222
+
64223
+ const zip = new AdmZip();
64224
+ for (const [name, buf] of Object.entries(files)) {
64225
+ zip.addFile(name, buf);
64226
+ }
64227
+ zip.writeZip(filePath);
64228
+
64229
+ return {
64230
+ success: true,
64231
+ filePath,
64232
+ counts: JSON.parse(files["manifest.json"].toString("utf-8")).counts,
64233
+ };
64234
+ } catch (e) {
64235
+ console.error("[exportController] Export failed:", e);
64236
+ return { success: false, error: e?.message || String(e) };
64237
+ }
64238
+ }
64239
+
64240
+ var exportController$1 = {
64241
+ exportEverythingForApplication: exportEverythingForApplication$1,
64242
+ // exported for tests
64243
+ buildBundleFiles,
64244
+ stripProviderCredentials,
64245
+ SAFE_PROVIDER_FIELDS,
64246
+ BUNDLE_SCHEMA_VERSION,
64247
+ };
64248
+
64018
64249
  /**
64019
64250
  * notificationController.js
64020
64251
  *
@@ -66844,6 +67075,7 @@ const {
66844
67075
  getOnboardingStatus,
66845
67076
  markOnboardingCompleted,
66846
67077
  } = onboardingController$1;
67078
+ const { exportEverythingForApplication } = exportController$1;
66847
67079
  const {
66848
67080
  getRecentDashboards,
66849
67081
  addRecentDashboard,
@@ -66951,6 +67183,7 @@ var controller = {
66951
67183
  describeLocalKey,
66952
67184
  getOnboardingStatus,
66953
67185
  markOnboardingCompleted,
67186
+ exportEverythingForApplication,
66954
67187
  getRecentDashboards,
66955
67188
  addRecentDashboard,
66956
67189
  clearRecentDashboards,
@@ -66972,7 +67205,7 @@ var controller = {
66972
67205
  mcpDashServerController: mcpDashServerController$2,
66973
67206
  };
66974
67207
 
66975
- const { ipcRenderer: ipcRenderer$q } = require$$0$2;
67208
+ const { ipcRenderer: ipcRenderer$r } = require$$0$2;
66976
67209
  const { SECURE_STORE_ENCRYPTION_CHECK } = events$8;
66977
67210
  /**
66978
67211
  * secureStoreApi
@@ -66994,7 +67227,7 @@ const { SECURE_STORE_ENCRYPTION_CHECK } = events$8;
66994
67227
  */
66995
67228
  const secureStoreApi$2 = {
66996
67229
  isEncryptionAvailable: () =>
66997
- ipcRenderer$q.invoke(SECURE_STORE_ENCRYPTION_CHECK, {}),
67230
+ ipcRenderer$r.invoke(SECURE_STORE_ENCRYPTION_CHECK, {}),
66998
67231
  };
66999
67232
 
67000
67233
  var secureStoreApi_1 = secureStoreApi$2;
@@ -67005,7 +67238,7 @@ var secureStoreApi_1 = secureStoreApi$2;
67005
67238
  * Handle the workspace configuration file
67006
67239
  */
67007
67240
 
67008
- const { ipcRenderer: ipcRenderer$p } = require$$0$2;
67241
+ const { ipcRenderer: ipcRenderer$q } = require$$0$2;
67009
67242
  const {
67010
67243
  WORKSPACE_LIST,
67011
67244
  WORKSPACE_SAVE,
@@ -67022,7 +67255,7 @@ const workspaceApi$2 = {
67022
67255
  */
67023
67256
  listWorkspacesForApplication: (appId) => {
67024
67257
  console.log("listWorkspacesForApplication called with appId:", appId);
67025
- return ipcRenderer$p.invoke(WORKSPACE_LIST, { appId });
67258
+ return ipcRenderer$q.invoke(WORKSPACE_LIST, { appId });
67026
67259
  },
67027
67260
 
67028
67261
  /**
@@ -67033,7 +67266,7 @@ const workspaceApi$2 = {
67033
67266
  * @returns
67034
67267
  */
67035
67268
  saveWorkspaceForApplication: (appId, data) =>
67036
- ipcRenderer$p.invoke(WORKSPACE_SAVE, { appId, data }),
67269
+ ipcRenderer$q.invoke(WORKSPACE_SAVE, { appId, data }),
67037
67270
 
67038
67271
  /**
67039
67272
  * deleteWorkspaceForApplication
@@ -67043,7 +67276,7 @@ const workspaceApi$2 = {
67043
67276
  * @returns
67044
67277
  */
67045
67278
  deleteWorkspaceForApplication: (appId, workspaceId) =>
67046
- ipcRenderer$p.invoke(WORKSPACE_DELETE, { appId, workspaceId }),
67279
+ ipcRenderer$q.invoke(WORKSPACE_DELETE, { appId, workspaceId }),
67047
67280
  };
67048
67281
 
67049
67282
  var workspaceApi_1 = workspaceApi$2;
@@ -67055,13 +67288,13 @@ var workspaceApi_1 = workspaceApi$2;
67055
67288
  */
67056
67289
 
67057
67290
  // ipcRenderer that must be used to invoke the events
67058
- const { ipcRenderer: ipcRenderer$o } = require$$0$2;
67291
+ const { ipcRenderer: ipcRenderer$p } = require$$0$2;
67059
67292
 
67060
67293
  const { LAYOUT_LIST } = events$8;
67061
67294
 
67062
67295
  const layoutApi$2 = {
67063
67296
  listLayoutsForApplication: (appId) =>
67064
- ipcRenderer$o.invoke(LAYOUT_LIST, { appId }),
67297
+ ipcRenderer$p.invoke(LAYOUT_LIST, { appId }),
67065
67298
  };
67066
67299
 
67067
67300
  var layoutApi_1 = layoutApi$2;
@@ -67073,7 +67306,7 @@ var layoutApi_1 = layoutApi$2;
67073
67306
  */
67074
67307
 
67075
67308
  // ipcRenderer that must be used to invoke the events
67076
- const { ipcRenderer: ipcRenderer$n } = require$$0$2;
67309
+ const { ipcRenderer: ipcRenderer$o } = require$$0$2;
67077
67310
 
67078
67311
  const {
67079
67312
  DATA_JSON_TO_CSV_FILE,
@@ -67091,7 +67324,7 @@ const {
67091
67324
  const dataApi$2 = {
67092
67325
  // convert a json array of objects to a csv string and save to file
67093
67326
  convertJsonToCsvFile: (appId, jsonObject, filename) =>
67094
- ipcRenderer$n.invoke(DATA_JSON_TO_CSV_FILE, {
67327
+ ipcRenderer$o.invoke(DATA_JSON_TO_CSV_FILE, {
67095
67328
  appId,
67096
67329
  jsonObject,
67097
67330
  filename,
@@ -67099,10 +67332,10 @@ const dataApi$2 = {
67099
67332
 
67100
67333
  // convert a json array of objects to a csv string and return a string
67101
67334
  convertJsonToCsvString: (appId, jsonObject) =>
67102
- ipcRenderer$n.invoke(DATA_JSON_TO_CSV_STRING, { appId, jsonObject }),
67335
+ ipcRenderer$o.invoke(DATA_JSON_TO_CSV_STRING, { appId, jsonObject }),
67103
67336
 
67104
67337
  parseXMLStream: (filepath, outpath, start) =>
67105
- ipcRenderer$n.invoke(PARSE_XML_STREAM, {
67338
+ ipcRenderer$o.invoke(PARSE_XML_STREAM, {
67106
67339
  filepath,
67107
67340
  outpath,
67108
67341
  start,
@@ -67116,7 +67349,7 @@ const dataApi$2 = {
67116
67349
  headers = null,
67117
67350
  limit = null,
67118
67351
  ) => {
67119
- ipcRenderer$n.invoke(PARSE_CSV_STREAM, {
67352
+ ipcRenderer$o.invoke(PARSE_CSV_STREAM, {
67120
67353
  filepath,
67121
67354
  outpath,
67122
67355
  delimiter,
@@ -67127,15 +67360,15 @@ const dataApi$2 = {
67127
67360
  },
67128
67361
 
67129
67362
  readLinesFromFile: (filepath, lineCount) => {
67130
- ipcRenderer$n.invoke(READ_LINES, { filepath, lineCount });
67363
+ ipcRenderer$o.invoke(READ_LINES, { filepath, lineCount });
67131
67364
  },
67132
67365
 
67133
67366
  readJSONFromFile: (filepath, objectCount = null) => {
67134
- ipcRenderer$n.invoke(READ_JSON, { filepath, objectCount });
67367
+ ipcRenderer$o.invoke(READ_JSON, { filepath, objectCount });
67135
67368
  },
67136
67369
 
67137
67370
  readDataFromURL: (url, toFilepath, widgetId = null, token = null) => {
67138
- ipcRenderer$n.invoke(READ_DATA_URL, { url, toFilepath, widgetId, token });
67371
+ ipcRenderer$o.invoke(READ_DATA_URL, { url, toFilepath, widgetId, token });
67139
67372
  },
67140
67373
 
67141
67374
  /*
@@ -67151,7 +67384,7 @@ const dataApi$2 = {
67151
67384
  widgetId = null,
67152
67385
  token = null,
67153
67386
  ) =>
67154
- ipcRenderer$n.invoke(DATA_SAVE_TO_FILE, {
67387
+ ipcRenderer$o.invoke(DATA_SAVE_TO_FILE, {
67155
67388
  data,
67156
67389
  filename,
67157
67390
  append,
@@ -67170,7 +67403,7 @@ const dataApi$2 = {
67170
67403
  * gates the gate itself).
67171
67404
  */
67172
67405
  readData: (filename, returnEmpty = [], widgetId = null, token = null) =>
67173
- ipcRenderer$n.invoke(DATA_READ_FROM_FILE, {
67406
+ ipcRenderer$o.invoke(DATA_READ_FROM_FILE, {
67174
67407
  filename,
67175
67408
  returnEmpty,
67176
67409
  widgetId,
@@ -67182,7 +67415,7 @@ const dataApi$2 = {
67182
67415
  * @returns
67183
67416
  */
67184
67417
  transformFile: (filepath, outFilepath, mappingFunctionBody, args) => {
67185
- ipcRenderer$n.invoke(TRANSFORM_FILE, {
67418
+ ipcRenderer$o.invoke(TRANSFORM_FILE, {
67186
67419
  filepath,
67187
67420
  outFilepath,
67188
67421
  mappingFunctionBody,
@@ -67200,7 +67433,7 @@ var dataApi_1 = dataApi$2;
67200
67433
  */
67201
67434
 
67202
67435
  // ipcRenderer that must be used to invoke the events
67203
- const { ipcRenderer: ipcRenderer$m } = require$$0$2;
67436
+ const { ipcRenderer: ipcRenderer$n } = require$$0$2;
67204
67437
 
67205
67438
  const {
67206
67439
  SETTINGS_GET,
@@ -67211,14 +67444,14 @@ const {
67211
67444
  } = events$8;
67212
67445
 
67213
67446
  const settingsApi$2 = {
67214
- getSettingsForApplication: () => ipcRenderer$m.invoke(SETTINGS_GET, {}),
67447
+ getSettingsForApplication: () => ipcRenderer$n.invoke(SETTINGS_GET, {}),
67215
67448
  saveSettingsForApplication: (data) =>
67216
- ipcRenderer$m.invoke(SETTINGS_SAVE, { data }),
67217
- getDataDirectory: () => ipcRenderer$m.invoke(SETTINGS_GET_DATA_DIR, {}),
67449
+ ipcRenderer$n.invoke(SETTINGS_SAVE, { data }),
67450
+ getDataDirectory: () => ipcRenderer$n.invoke(SETTINGS_GET_DATA_DIR, {}),
67218
67451
  setDataDirectory: (dataDirectory) =>
67219
- ipcRenderer$m.invoke(SETTINGS_SET_DATA_DIR, { dataDirectory }),
67452
+ ipcRenderer$n.invoke(SETTINGS_SET_DATA_DIR, { dataDirectory }),
67220
67453
  migrateDataDirectory: (oldDirectory, newDirectory) =>
67221
- ipcRenderer$m.invoke(SETTINGS_MIGRATE_DATA_DIR, {
67454
+ ipcRenderer$n.invoke(SETTINGS_MIGRATE_DATA_DIR, {
67222
67455
  oldDirectory,
67223
67456
  newDirectory,
67224
67457
  }),
@@ -67233,7 +67466,7 @@ var settingsApi_1 = settingsApi$2;
67233
67466
  * Provides file/folder chooser dialogs.
67234
67467
  */
67235
67468
 
67236
- const { ipcRenderer: ipcRenderer$l } = require$$0$2;
67469
+ const { ipcRenderer: ipcRenderer$m } = require$$0$2;
67237
67470
 
67238
67471
  const { CHOOSE_FILE } = events$8;
67239
67472
 
@@ -67246,7 +67479,7 @@ const dialogApi$2 = {
67246
67479
  * @returns {Promise<string|null>} selected file/folder path, or null if cancelled
67247
67480
  */
67248
67481
  chooseFile: (allowFile = true, extensions = ["*"]) => {
67249
- return ipcRenderer$l.invoke(CHOOSE_FILE, { allowFile, extensions });
67482
+ return ipcRenderer$m.invoke(CHOOSE_FILE, { allowFile, extensions });
67250
67483
  },
67251
67484
 
67252
67485
  /**
@@ -67271,7 +67504,7 @@ const dialogApi$2 = {
67271
67504
  typeof options.allowFile === "boolean" ? options.allowFile : allowFile;
67272
67505
  const resolvedExtensions = options.extensions || extensions;
67273
67506
 
67274
- const filePath = await ipcRenderer$l.invoke(CHOOSE_FILE, {
67507
+ const filePath = await ipcRenderer$m.invoke(CHOOSE_FILE, {
67275
67508
  allowFile: resolvedAllowFile,
67276
67509
  extensions: resolvedExtensions,
67277
67510
  });
@@ -67298,7 +67531,7 @@ var dialogApi_1 = dialogApi$2;
67298
67531
  * mainApi.widgets.uninstall('Weather')
67299
67532
  */
67300
67533
 
67301
- const { ipcRenderer: ipcRenderer$k } = require$$0$2;
67534
+ const { ipcRenderer: ipcRenderer$l } = require$$0$2;
67302
67535
 
67303
67536
  const widgetApi$2 = {
67304
67537
  /**
@@ -67307,7 +67540,7 @@ const widgetApi$2 = {
67307
67540
  */
67308
67541
  list: async () => {
67309
67542
  try {
67310
- return await ipcRenderer$k.invoke("widget:list");
67543
+ return await ipcRenderer$l.invoke("widget:list");
67311
67544
  } catch (error) {
67312
67545
  console.error("[WidgetApi] Error listing widgets:", error);
67313
67546
  throw error;
@@ -67321,7 +67554,7 @@ const widgetApi$2 = {
67321
67554
  */
67322
67555
  get: async (widgetName) => {
67323
67556
  try {
67324
- return await ipcRenderer$k.invoke("widget:get", widgetName);
67557
+ return await ipcRenderer$l.invoke("widget:get", widgetName);
67325
67558
  } catch (error) {
67326
67559
  console.error(`[WidgetApi] Error getting widget ${widgetName}:`, error);
67327
67560
  throw error;
@@ -67352,7 +67585,7 @@ const widgetApi$2 = {
67352
67585
  console.log(
67353
67586
  `[WidgetApi] Installing widget: ${widgetName} from ${downloadUrl}`,
67354
67587
  );
67355
- const config = await ipcRenderer$k.invoke(
67588
+ const config = await ipcRenderer$l.invoke(
67356
67589
  "widget:install",
67357
67590
  widgetName,
67358
67591
  downloadUrl,
@@ -67392,7 +67625,7 @@ const widgetApi$2 = {
67392
67625
  console.log(
67393
67626
  `[WidgetApi] Installing local widget: ${widgetName} from ${localPath}`,
67394
67627
  );
67395
- const config = await ipcRenderer$k.invoke(
67628
+ const config = await ipcRenderer$l.invoke(
67396
67629
  "widget:install-local",
67397
67630
  widgetName,
67398
67631
  localPath,
@@ -67423,7 +67656,7 @@ const widgetApi$2 = {
67423
67656
  loadFolder: async (folderPath) => {
67424
67657
  try {
67425
67658
  console.log(`[WidgetApi] Loading widgets from folder: ${folderPath}`);
67426
- const results = await ipcRenderer$k.invoke(
67659
+ const results = await ipcRenderer$l.invoke(
67427
67660
  "widget:load-folder",
67428
67661
  folderPath,
67429
67662
  );
@@ -67447,7 +67680,7 @@ const widgetApi$2 = {
67447
67680
  uninstall: async (widgetName) => {
67448
67681
  try {
67449
67682
  console.log(`[WidgetApi] Uninstalling widget: ${widgetName}`);
67450
- const success = await ipcRenderer$k.invoke("widget:uninstall", widgetName);
67683
+ const success = await ipcRenderer$l.invoke("widget:uninstall", widgetName);
67451
67684
  if (success) {
67452
67685
  console.log(`[WidgetApi] ✓ Widget ${widgetName} uninstalled`);
67453
67686
  } else {
@@ -67470,7 +67703,7 @@ const widgetApi$2 = {
67470
67703
  */
67471
67704
  getCachePath: async () => {
67472
67705
  try {
67473
- return await ipcRenderer$k.invoke("widget:cache-path");
67706
+ return await ipcRenderer$l.invoke("widget:cache-path");
67474
67707
  } catch (error) {
67475
67708
  console.error("[WidgetApi] Error getting cache path:", error);
67476
67709
  throw error;
@@ -67484,7 +67717,7 @@ const widgetApi$2 = {
67484
67717
  */
67485
67718
  getStoragePath: async () => {
67486
67719
  try {
67487
- return await ipcRenderer$k.invoke("widget:storage-path");
67720
+ return await ipcRenderer$l.invoke("widget:storage-path");
67488
67721
  } catch (error) {
67489
67722
  console.error("[WidgetApi] Error getting storage path:", error);
67490
67723
  throw error;
@@ -67501,7 +67734,7 @@ const widgetApi$2 = {
67501
67734
  setStoragePath: async (customPath) => {
67502
67735
  try {
67503
67736
  console.log(`[WidgetApi] Setting storage path to: ${customPath}`);
67504
- const result = await ipcRenderer$k.invoke(
67737
+ const result = await ipcRenderer$l.invoke(
67505
67738
  "widget:set-storage-path",
67506
67739
  customPath,
67507
67740
  );
@@ -67523,7 +67756,7 @@ const widgetApi$2 = {
67523
67756
  */
67524
67757
  getComponentConfigs: async () => {
67525
67758
  try {
67526
- return await ipcRenderer$k.invoke("widget:get-component-configs");
67759
+ return await ipcRenderer$l.invoke("widget:get-component-configs");
67527
67760
  } catch (error) {
67528
67761
  console.error("[WidgetApi] Error getting component configs:", error);
67529
67762
  return [];
@@ -67538,7 +67771,7 @@ const widgetApi$2 = {
67538
67771
  */
67539
67772
  readBundle: async (widgetName) => {
67540
67773
  try {
67541
- return await ipcRenderer$k.invoke("widget:read-bundle", widgetName);
67774
+ return await ipcRenderer$l.invoke("widget:read-bundle", widgetName);
67542
67775
  } catch (error) {
67543
67776
  console.error(
67544
67777
  `[WidgetApi] Error reading bundle for ${widgetName}:`,
@@ -67557,7 +67790,7 @@ const widgetApi$2 = {
67557
67790
  */
67558
67791
  readSources: async (widgetName, componentName) => {
67559
67792
  try {
67560
- return await ipcRenderer$k.invoke("widget:read-sources", {
67793
+ return await ipcRenderer$l.invoke("widget:read-sources", {
67561
67794
  widgetName,
67562
67795
  componentName,
67563
67796
  });
@@ -67577,7 +67810,7 @@ const widgetApi$2 = {
67577
67810
  */
67578
67811
  readAllBundles: async () => {
67579
67812
  try {
67580
- return await ipcRenderer$k.invoke("widget:read-all-bundles");
67813
+ return await ipcRenderer$l.invoke("widget:read-all-bundles");
67581
67814
  } catch (error) {
67582
67815
  console.error("[WidgetApi] Error reading all bundles:", error);
67583
67816
  return [];
@@ -67597,7 +67830,7 @@ const widgetApi$2 = {
67597
67830
  * });
67598
67831
  */
67599
67832
  onInstalled: (callback) => {
67600
- ipcRenderer$k.on("widget:installed", (event, data) => {
67833
+ ipcRenderer$l.on("widget:installed", (event, data) => {
67601
67834
  callback(data);
67602
67835
  });
67603
67836
  },
@@ -67614,7 +67847,7 @@ const widgetApi$2 = {
67614
67847
  * });
67615
67848
  */
67616
67849
  onUninstalled: (callback) => {
67617
- ipcRenderer$k.on("widget:uninstalled", (event, data) => {
67850
+ ipcRenderer$l.on("widget:uninstalled", (event, data) => {
67618
67851
  callback(data);
67619
67852
  });
67620
67853
  },
@@ -67632,7 +67865,7 @@ const widgetApi$2 = {
67632
67865
  * });
67633
67866
  */
67634
67867
  onLoaded: (callback) => {
67635
- ipcRenderer$k.on("widgets:loaded", (event, data) => {
67868
+ ipcRenderer$l.on("widgets:loaded", (event, data) => {
67636
67869
  callback(data);
67637
67870
  });
67638
67871
  },
@@ -67643,7 +67876,7 @@ const widgetApi$2 = {
67643
67876
  * @param {Function} callback - The callback to remove
67644
67877
  */
67645
67878
  removeInstalledListener: (callback) => {
67646
- ipcRenderer$k.removeListener("widget:installed", callback);
67879
+ ipcRenderer$l.removeListener("widget:installed", callback);
67647
67880
  },
67648
67881
 
67649
67882
  /**
@@ -67652,7 +67885,7 @@ const widgetApi$2 = {
67652
67885
  * @param {Function} callback - The callback to remove
67653
67886
  */
67654
67887
  removeUninstalledListener: (callback) => {
67655
- ipcRenderer$k.removeListener("widget:uninstalled", callback);
67888
+ ipcRenderer$l.removeListener("widget:uninstalled", callback);
67656
67889
  },
67657
67890
 
67658
67891
  /**
@@ -67661,7 +67894,7 @@ const widgetApi$2 = {
67661
67894
  * @param {Function} callback - The callback to remove
67662
67895
  */
67663
67896
  removeLoadedListener: (callback) => {
67664
- ipcRenderer$k.removeListener("widgets:loaded", callback);
67897
+ ipcRenderer$l.removeListener("widgets:loaded", callback);
67665
67898
  },
67666
67899
  };
67667
67900
 
@@ -67674,7 +67907,7 @@ var widgetApi_1 = widgetApi$2;
67674
67907
  * Communicates with main process via IPC to handle encryption and file storage
67675
67908
  */
67676
67909
 
67677
- const { ipcRenderer: ipcRenderer$j } = require$$0$2;
67910
+ const { ipcRenderer: ipcRenderer$k } = require$$0$2;
67678
67911
  const {
67679
67912
  PROVIDER_SAVE,
67680
67913
  PROVIDER_LIST,
@@ -67712,7 +67945,7 @@ const providerApi$2 = {
67712
67945
  // value, preserve what's on disk" from "caller explicitly unset it".
67713
67946
  isDefaultForType = undefined,
67714
67947
  ) =>
67715
- ipcRenderer$j.invoke(PROVIDER_SAVE, {
67948
+ ipcRenderer$k.invoke(PROVIDER_SAVE, {
67716
67949
  appId,
67717
67950
  providerName,
67718
67951
  providerType,
@@ -67732,7 +67965,7 @@ const providerApi$2 = {
67732
67965
  * @param {String} appId - the appId specified in the dash initialization
67733
67966
  * @returns {Promise<Array>} Array of provider objects with name, type, credentials
67734
67967
  */
67735
- listProviders: (appId) => ipcRenderer$j.invoke(PROVIDER_LIST, { appId }),
67968
+ listProviders: (appId) => ipcRenderer$k.invoke(PROVIDER_LIST, { appId }),
67736
67969
 
67737
67970
  /**
67738
67971
  * getProvider
@@ -67744,7 +67977,7 @@ const providerApi$2 = {
67744
67977
  * @returns {Promise<Object>} Provider object with name, type, credentials
67745
67978
  */
67746
67979
  getProvider: (appId, providerName) =>
67747
- ipcRenderer$j.invoke(PROVIDER_GET, { appId, providerName }),
67980
+ ipcRenderer$k.invoke(PROVIDER_GET, { appId, providerName }),
67748
67981
 
67749
67982
  /**
67750
67983
  * deleteProvider
@@ -67756,7 +67989,7 @@ const providerApi$2 = {
67756
67989
  * @returns {Promise}
67757
67990
  */
67758
67991
  deleteProvider: (appId, providerName) =>
67759
- ipcRenderer$j.invoke(PROVIDER_DELETE, { appId, providerName }),
67992
+ ipcRenderer$k.invoke(PROVIDER_DELETE, { appId, providerName }),
67760
67993
 
67761
67994
  /**
67762
67995
  * listProvidersForApplication
@@ -67766,14 +67999,14 @@ const providerApi$2 = {
67766
67999
  * @param {String} appId - the appId specified in the dash initialization
67767
68000
  */
67768
68001
  listProvidersForApplication: (appId) => {
67769
- ipcRenderer$j
68002
+ ipcRenderer$k
67770
68003
  .invoke(PROVIDER_LIST, { appId })
67771
68004
  .then((result) => {
67772
68005
  // Emit the event for ElectronDashboardApi to listen to
67773
- ipcRenderer$j.send("PROVIDER_LIST_COMPLETE", result);
68006
+ ipcRenderer$k.send("PROVIDER_LIST_COMPLETE", result);
67774
68007
  })
67775
68008
  .catch((error) => {
67776
- ipcRenderer$j.send("PROVIDER_LIST_ERROR", {
68009
+ ipcRenderer$k.send("PROVIDER_LIST_ERROR", {
67777
68010
  error: error.message,
67778
68011
  });
67779
68012
  });
@@ -67790,7 +68023,7 @@ const providerApi$2 = {
67790
68023
  providerType,
67791
68024
  credentials,
67792
68025
  ) => {
67793
- ipcRenderer$j
68026
+ ipcRenderer$k
67794
68027
  .invoke(PROVIDER_SAVE, {
67795
68028
  appId,
67796
68029
  providerName,
@@ -67798,10 +68031,10 @@ const providerApi$2 = {
67798
68031
  credentials,
67799
68032
  })
67800
68033
  .then((result) => {
67801
- ipcRenderer$j.send("PROVIDER_SAVE_COMPLETE", result);
68034
+ ipcRenderer$k.send("PROVIDER_SAVE_COMPLETE", result);
67802
68035
  })
67803
68036
  .catch((error) => {
67804
- ipcRenderer$j.send("PROVIDER_SAVE_ERROR", {
68037
+ ipcRenderer$k.send("PROVIDER_SAVE_ERROR", {
67805
68038
  error: error.message,
67806
68039
  });
67807
68040
  });
@@ -67813,13 +68046,13 @@ const providerApi$2 = {
67813
68046
  * Event-listener-based version for use with ElectronDashboardApi
67814
68047
  */
67815
68048
  getProviderForApplication: (appId, providerName) => {
67816
- ipcRenderer$j
68049
+ ipcRenderer$k
67817
68050
  .invoke(PROVIDER_GET, { appId, providerName })
67818
68051
  .then((result) => {
67819
- ipcRenderer$j.send("PROVIDER_GET_COMPLETE", result);
68052
+ ipcRenderer$k.send("PROVIDER_GET_COMPLETE", result);
67820
68053
  })
67821
68054
  .catch((error) => {
67822
- ipcRenderer$j.send("PROVIDER_GET_ERROR", {
68055
+ ipcRenderer$k.send("PROVIDER_GET_ERROR", {
67823
68056
  error: error.message,
67824
68057
  });
67825
68058
  });
@@ -67831,13 +68064,13 @@ const providerApi$2 = {
67831
68064
  * Event-listener-based version for use with ElectronDashboardApi
67832
68065
  */
67833
68066
  deleteProviderForApplication: (appId, providerName) => {
67834
- ipcRenderer$j
68067
+ ipcRenderer$k
67835
68068
  .invoke(PROVIDER_DELETE, { appId, providerName })
67836
68069
  .then((result) => {
67837
- ipcRenderer$j.send("PROVIDER_DELETE_COMPLETE", result);
68070
+ ipcRenderer$k.send("PROVIDER_DELETE_COMPLETE", result);
67838
68071
  })
67839
68072
  .catch((error) => {
67840
- ipcRenderer$j.send("PROVIDER_DELETE_ERROR", {
68073
+ ipcRenderer$k.send("PROVIDER_DELETE_ERROR", {
67841
68074
  error: error.message,
67842
68075
  });
67843
68076
  });
@@ -67853,7 +68086,7 @@ var providerApi_1 = providerApi$2;
67853
68086
  * Communicates with main process via IPC to manage MCP server lifecycle.
67854
68087
  */
67855
68088
 
67856
- const { ipcRenderer: ipcRenderer$i } = require$$0$2;
68089
+ const { ipcRenderer: ipcRenderer$j } = require$$0$2;
67857
68090
  const {
67858
68091
  MCP_START_SERVER,
67859
68092
  MCP_STOP_SERVER,
@@ -67892,7 +68125,7 @@ const mcpApi$2 = {
67892
68125
  workspaceId = null,
67893
68126
  pathScope = null,
67894
68127
  ) =>
67895
- ipcRenderer$i.invoke(MCP_START_SERVER, {
68128
+ ipcRenderer$j.invoke(MCP_START_SERVER, {
67896
68129
  serverName,
67897
68130
  mcpConfig,
67898
68131
  credentials,
@@ -67909,7 +68142,7 @@ const mcpApi$2 = {
67909
68142
  * @returns {Promise<{ success, serverName } | { error, message }>}
67910
68143
  */
67911
68144
  stopServer: (serverName, workspaceId = null) =>
67912
- ipcRenderer$i.invoke(MCP_STOP_SERVER, { serverName, workspaceId }),
68145
+ ipcRenderer$j.invoke(MCP_STOP_SERVER, { serverName, workspaceId }),
67913
68146
 
67914
68147
  /**
67915
68148
  * listTools
@@ -67920,7 +68153,7 @@ const mcpApi$2 = {
67920
68153
  * @returns {Promise<{ tools } | { error, message }>}
67921
68154
  */
67922
68155
  listTools: (serverName, workspaceId = null) =>
67923
- ipcRenderer$i.invoke(MCP_LIST_TOOLS, { serverName, workspaceId }),
68156
+ ipcRenderer$j.invoke(MCP_LIST_TOOLS, { serverName, workspaceId }),
67924
68157
 
67925
68158
  /**
67926
68159
  * callTool
@@ -67949,7 +68182,7 @@ const mcpApi$2 = {
67949
68182
  workspaceId = null,
67950
68183
  token = null,
67951
68184
  ) =>
67952
- ipcRenderer$i.invoke(MCP_CALL_TOOL, {
68185
+ ipcRenderer$j.invoke(MCP_CALL_TOOL, {
67953
68186
  serverName,
67954
68187
  toolName,
67955
68188
  args,
@@ -67968,7 +68201,7 @@ const mcpApi$2 = {
67968
68201
  * @returns {Promise<{ resources } | { error, message }>}
67969
68202
  */
67970
68203
  listResources: (serverName, workspaceId = null) =>
67971
- ipcRenderer$i.invoke(MCP_LIST_RESOURCES, { serverName, workspaceId }),
68204
+ ipcRenderer$j.invoke(MCP_LIST_RESOURCES, { serverName, workspaceId }),
67972
68205
 
67973
68206
  /**
67974
68207
  * readResource
@@ -67980,7 +68213,7 @@ const mcpApi$2 = {
67980
68213
  * @returns {Promise<{ resource } | { error, message }>}
67981
68214
  */
67982
68215
  readResource: (serverName, uri, workspaceId = null) =>
67983
- ipcRenderer$i.invoke(MCP_READ_RESOURCE, { serverName, uri, workspaceId }),
68216
+ ipcRenderer$j.invoke(MCP_READ_RESOURCE, { serverName, uri, workspaceId }),
67984
68217
 
67985
68218
  /**
67986
68219
  * getServerStatus
@@ -67991,7 +68224,7 @@ const mcpApi$2 = {
67991
68224
  * @returns {Promise<{ status, tools, error }>}
67992
68225
  */
67993
68226
  getServerStatus: (serverName, workspaceId = null) =>
67994
- ipcRenderer$i.invoke(MCP_SERVER_STATUS, { serverName, workspaceId }),
68227
+ ipcRenderer$j.invoke(MCP_SERVER_STATUS, { serverName, workspaceId }),
67995
68228
 
67996
68229
  /**
67997
68230
  * getCatalog
@@ -67999,7 +68232,7 @@ const mcpApi$2 = {
67999
68232
  *
68000
68233
  * @returns {Promise<{ catalog } | { error, message }>}
68001
68234
  */
68002
- getCatalog: () => ipcRenderer$i.invoke(MCP_GET_CATALOG),
68235
+ getCatalog: () => ipcRenderer$j.invoke(MCP_GET_CATALOG),
68003
68236
 
68004
68237
  /**
68005
68238
  * getKnownExternalCatalog
@@ -68011,7 +68244,7 @@ const mcpApi$2 = {
68011
68244
  *
68012
68245
  * @returns {Promise<{ success, servers } | { error, message, servers }>}
68013
68246
  */
68014
- getKnownExternalCatalog: () => ipcRenderer$i.invoke(MCP_GET_KNOWN_EXTERNAL),
68247
+ getKnownExternalCatalog: () => ipcRenderer$j.invoke(MCP_GET_KNOWN_EXTERNAL),
68015
68248
 
68016
68249
  /**
68017
68250
  * onInstallKnownExternalConfirm
@@ -68025,9 +68258,9 @@ const mcpApi$2 = {
68025
68258
  */
68026
68259
  onInstallKnownExternalConfirm: (callback) => {
68027
68260
  const handler = (_e, data) => callback(data);
68028
- ipcRenderer$i.on(MCP_INSTALL_KNOWN_EXTERNAL_CONFIRM$1, handler);
68261
+ ipcRenderer$j.on(MCP_INSTALL_KNOWN_EXTERNAL_CONFIRM$1, handler);
68029
68262
  return () =>
68030
- ipcRenderer$i.removeListener(MCP_INSTALL_KNOWN_EXTERNAL_CONFIRM$1, handler);
68263
+ ipcRenderer$j.removeListener(MCP_INSTALL_KNOWN_EXTERNAL_CONFIRM$1, handler);
68031
68264
  },
68032
68265
 
68033
68266
  /**
@@ -68038,7 +68271,7 @@ const mcpApi$2 = {
68038
68271
  * @param {{ confirmed: boolean, credentials?: object, error?: string }} result
68039
68272
  */
68040
68273
  sendInstallKnownExternalResult: (requestId, result) =>
68041
- ipcRenderer$i.send(MCP_INSTALL_KNOWN_EXTERNAL_RESULT$1, { requestId, result }),
68274
+ ipcRenderer$j.send(MCP_INSTALL_KNOWN_EXTERNAL_RESULT$1, { requestId, result }),
68042
68275
 
68043
68276
  /**
68044
68277
  * runAuth
@@ -68050,7 +68283,7 @@ const mcpApi$2 = {
68050
68283
  * @returns {Promise<{ success } | { error, message }>}
68051
68284
  */
68052
68285
  runAuth: (mcpConfig, credentials, authCommand) =>
68053
- ipcRenderer$i.invoke(MCP_RUN_AUTH, { mcpConfig, credentials, authCommand }),
68286
+ ipcRenderer$j.invoke(MCP_RUN_AUTH, { mcpConfig, credentials, authCommand }),
68054
68287
  };
68055
68288
 
68056
68289
  var mcpApi_1 = mcpApi$2;
@@ -68068,7 +68301,7 @@ var mcpApi_1 = mcpApi$2;
68068
68301
  * mainApi.registry.checkUpdates([{ name: "weather-widgets", version: "1.0.0" }])
68069
68302
  */
68070
68303
 
68071
- const { ipcRenderer: ipcRenderer$h } = require$$0$2;
68304
+ const { ipcRenderer: ipcRenderer$i } = require$$0$2;
68072
68305
 
68073
68306
  const registryApi$2 = {
68074
68307
  /**
@@ -68078,7 +68311,7 @@ const registryApi$2 = {
68078
68311
  */
68079
68312
  fetchIndex: async (forceRefresh = false) => {
68080
68313
  try {
68081
- return await ipcRenderer$h.invoke("registry:fetch-index", forceRefresh);
68314
+ return await ipcRenderer$i.invoke("registry:fetch-index", forceRefresh);
68082
68315
  } catch (error) {
68083
68316
  console.error("[RegistryApi] Error fetching index:", error);
68084
68317
  throw error;
@@ -68093,7 +68326,7 @@ const registryApi$2 = {
68093
68326
  */
68094
68327
  search: async (query = "", filters = {}) => {
68095
68328
  try {
68096
- return await ipcRenderer$h.invoke("registry:search", query, filters);
68329
+ return await ipcRenderer$i.invoke("registry:search", query, filters);
68097
68330
  } catch (error) {
68098
68331
  console.error("[RegistryApi] Error searching registry:", error);
68099
68332
  throw error;
@@ -68107,7 +68340,7 @@ const registryApi$2 = {
68107
68340
  */
68108
68341
  getPackage: async (packageName) => {
68109
68342
  try {
68110
- return await ipcRenderer$h.invoke("registry:get-package", packageName);
68343
+ return await ipcRenderer$i.invoke("registry:get-package", packageName);
68111
68344
  } catch (error) {
68112
68345
  console.error(
68113
68346
  `[RegistryApi] Error getting package ${packageName}:`,
@@ -68124,7 +68357,7 @@ const registryApi$2 = {
68124
68357
  */
68125
68358
  checkUpdates: async (installedWidgets = []) => {
68126
68359
  try {
68127
- return await ipcRenderer$h.invoke(
68360
+ return await ipcRenderer$i.invoke(
68128
68361
  "registry:check-updates",
68129
68362
  installedWidgets,
68130
68363
  );
@@ -68142,7 +68375,7 @@ const registryApi$2 = {
68142
68375
  */
68143
68376
  searchDashboards: async (query = "", filters = {}) => {
68144
68377
  try {
68145
- return await ipcRenderer$h.invoke(
68378
+ return await ipcRenderer$i.invoke(
68146
68379
  "registry:search-dashboards",
68147
68380
  query,
68148
68381
  filters,
@@ -68161,7 +68394,7 @@ const registryApi$2 = {
68161
68394
  */
68162
68395
  searchThemes: async (query = "", filters = {}) => {
68163
68396
  try {
68164
- return await ipcRenderer$h.invoke("registry:search-themes", query, filters);
68397
+ return await ipcRenderer$i.invoke("registry:search-themes", query, filters);
68165
68398
  } catch (error) {
68166
68399
  console.error("[RegistryApi] Error searching themes:", error);
68167
68400
  throw error;
@@ -68183,7 +68416,7 @@ const registryApi$2 = {
68183
68416
  */
68184
68417
  publishWidget: async (appId, packageId, options = {}) => {
68185
68418
  try {
68186
- return await ipcRenderer$h.invoke("registry:publish-widget", {
68419
+ return await ipcRenderer$i.invoke("registry:publish-widget", {
68187
68420
  appId,
68188
68421
  packageId,
68189
68422
  options,
@@ -68204,7 +68437,7 @@ const registryApi$2 = {
68204
68437
  */
68205
68438
  inspectWidgetPackage: async (packageId) => {
68206
68439
  try {
68207
- return await ipcRenderer$h.invoke("registry:inspect-widget-package", {
68440
+ return await ipcRenderer$i.invoke("registry:inspect-widget-package", {
68208
68441
  packageId,
68209
68442
  });
68210
68443
  } catch (error) {
@@ -68225,7 +68458,7 @@ const registryApi$2 = {
68225
68458
  */
68226
68459
  scanWidgetDefaults: async (packageId) => {
68227
68460
  try {
68228
- return await ipcRenderer$h.invoke("registry:scan-widget-defaults", {
68461
+ return await ipcRenderer$i.invoke("registry:scan-widget-defaults", {
68229
68462
  packageId,
68230
68463
  });
68231
68464
  } catch (error) {
@@ -68248,7 +68481,7 @@ const registryApi$2 = {
68248
68481
  */
68249
68482
  previewFetch: async (packageName, componentName = null) => {
68250
68483
  try {
68251
- return await ipcRenderer$h.invoke(
68484
+ return await ipcRenderer$i.invoke(
68252
68485
  "registry:preview-fetch",
68253
68486
  packageName,
68254
68487
  componentName,
@@ -68274,7 +68507,7 @@ const registryApi$2 = {
68274
68507
  */
68275
68508
  fetchPackageManifest: async (packageName) => {
68276
68509
  try {
68277
- return await ipcRenderer$h.invoke(
68510
+ return await ipcRenderer$i.invoke(
68278
68511
  "registry:fetch-package-manifest",
68279
68512
  packageName,
68280
68513
  );
@@ -68296,7 +68529,7 @@ var registryApi_1 = registryApi$2;
68296
68529
  * Handle the theme configuration file
68297
68530
  */
68298
68531
 
68299
- const { ipcRenderer: ipcRenderer$g } = require$$0$2;
68532
+ const { ipcRenderer: ipcRenderer$h } = require$$0$2;
68300
68533
 
68301
68534
  const {
68302
68535
  THEME_LIST,
@@ -68309,17 +68542,17 @@ const {
68309
68542
 
68310
68543
  const themeApi$2 = {
68311
68544
  listThemesForApplication: (appId) =>
68312
- ipcRenderer$g.invoke(THEME_LIST, { appId }),
68545
+ ipcRenderer$h.invoke(THEME_LIST, { appId }),
68313
68546
  saveThemeForApplication: (appId, themeName, themeObject) =>
68314
- ipcRenderer$g.invoke(THEME_SAVE, { appId, themeName, themeObject }),
68547
+ ipcRenderer$h.invoke(THEME_SAVE, { appId, themeName, themeObject }),
68315
68548
  deleteThemeForApplication: (appId, themeKey) =>
68316
- ipcRenderer$g.invoke(THEME_DELETE, { appId, themeKey }),
68549
+ ipcRenderer$h.invoke(THEME_DELETE, { appId, themeKey }),
68317
68550
  publishTheme: (appId, themeKey, options) =>
68318
- ipcRenderer$g.invoke(THEME_PUBLISH, { appId, themeKey, options }),
68551
+ ipcRenderer$h.invoke(THEME_PUBLISH, { appId, themeKey, options }),
68319
68552
  installThemeFromRegistry: (appId, packageName) =>
68320
- ipcRenderer$g.invoke(THEME_INSTALL_FROM_REGISTRY, { appId, packageName }),
68553
+ ipcRenderer$h.invoke(THEME_INSTALL_FROM_REGISTRY, { appId, packageName }),
68321
68554
  getThemePublishPreview: (appId, themeKey) =>
68322
- ipcRenderer$g.invoke(THEME_PUBLISH_PREVIEW, { appId, themeKey }),
68555
+ ipcRenderer$h.invoke(THEME_PUBLISH_PREVIEW, { appId, themeKey }),
68323
68556
  };
68324
68557
 
68325
68558
  var themeApi_1 = themeApi$2;
@@ -68331,7 +68564,7 @@ var themeApi_1 = themeApi$2;
68331
68564
  */
68332
68565
 
68333
68566
  // ipcRenderer that must be used to invoke the events
68334
- const { ipcRenderer: ipcRenderer$f } = require$$0$2;
68567
+ const { ipcRenderer: ipcRenderer$g } = require$$0$2;
68335
68568
 
68336
68569
  const {
68337
68570
  ALGOLIA_LIST_INDICES,
@@ -68344,10 +68577,10 @@ const {
68344
68577
 
68345
68578
  const algoliaApi$2 = {
68346
68579
  listIndices: (application) =>
68347
- ipcRenderer$f.invoke(ALGOLIA_LIST_INDICES, application),
68580
+ ipcRenderer$g.invoke(ALGOLIA_LIST_INDICES, application),
68348
68581
 
68349
68582
  browseObjects: (appId, apiKey, indexName) => {
68350
- ipcRenderer$f.invoke(ALGOLIA_BROWSE_OBJECTS, {
68583
+ ipcRenderer$g.invoke(ALGOLIA_BROWSE_OBJECTS, {
68351
68584
  appId,
68352
68585
  apiKey,
68353
68586
  indexName,
@@ -68356,7 +68589,7 @@ const algoliaApi$2 = {
68356
68589
  },
68357
68590
 
68358
68591
  getAnalyticsForQuery: (application, indexName, query) =>
68359
- ipcRenderer$f.invoke(ALGOLIA_ANALYTICS_FOR_QUERY, {
68592
+ ipcRenderer$g.invoke(ALGOLIA_ANALYTICS_FOR_QUERY, {
68360
68593
  application,
68361
68594
  indexName,
68362
68595
  query,
@@ -68369,7 +68602,7 @@ const algoliaApi$2 = {
68369
68602
  dir,
68370
68603
  createIfNotExists = false,
68371
68604
  ) =>
68372
- ipcRenderer$f.invoke(ALGOLIA_PARTIAL_UPDATE_OBJECTS, {
68605
+ ipcRenderer$g.invoke(ALGOLIA_PARTIAL_UPDATE_OBJECTS, {
68373
68606
  appId,
68374
68607
  apiKey,
68375
68608
  indexName,
@@ -68378,7 +68611,7 @@ const algoliaApi$2 = {
68378
68611
  }),
68379
68612
 
68380
68613
  createBatchesFromFile: (filepath, batchFilepath, batchSize) => {
68381
- ipcRenderer$f.invoke(ALGOLIA_CREATE_BATCH, {
68614
+ ipcRenderer$g.invoke(ALGOLIA_CREATE_BATCH, {
68382
68615
  filepath,
68383
68616
  batchFilepath,
68384
68617
  batchSize,
@@ -68386,7 +68619,7 @@ const algoliaApi$2 = {
68386
68619
  },
68387
68620
 
68388
68621
  browseObjectsToFile: (appId, apiKey, indexName, toFilename, query = "") => {
68389
- ipcRenderer$f.invoke(ALGOLIA_BROWSE_OBJECTS, {
68622
+ ipcRenderer$g.invoke(ALGOLIA_BROWSE_OBJECTS, {
68390
68623
  appId,
68391
68624
  apiKey,
68392
68625
  indexName,
@@ -68396,7 +68629,7 @@ const algoliaApi$2 = {
68396
68629
  },
68397
68630
 
68398
68631
  search: (appId, apiKey, indexName, query = "", options = {}) =>
68399
- ipcRenderer$f.invoke(ALGOLIA_SEARCH, {
68632
+ ipcRenderer$g.invoke(ALGOLIA_SEARCH, {
68400
68633
  appId,
68401
68634
  apiKey,
68402
68635
  indexName,
@@ -68411,14 +68644,14 @@ var algoliaApi_1 = algoliaApi$2;
68411
68644
  * openAI
68412
68645
  */
68413
68646
 
68414
- const { ipcRenderer: ipcRenderer$e } = require$$0$2;
68647
+ const { ipcRenderer: ipcRenderer$f } = require$$0$2;
68415
68648
 
68416
68649
  const { OPENAI_DESCRIBE_IMAGE } = openaiEvents$1;
68417
68650
 
68418
68651
  const openaiApi$2 = {
68419
68652
  // convert a json array of objects to a csv string and save to file
68420
68653
  describeImage: (imageUrl, apiKey, prompt = "What's in this image?") =>
68421
- ipcRenderer$e.invoke(OPENAI_DESCRIBE_IMAGE, { imageUrl, apiKey, prompt }),
68654
+ ipcRenderer$f.invoke(OPENAI_DESCRIBE_IMAGE, { imageUrl, apiKey, prompt }),
68422
68655
  };
68423
68656
 
68424
68657
  var openaiApi_1 = openaiApi$2;
@@ -68429,14 +68662,14 @@ var openaiApi_1 = openaiApi$2;
68429
68662
  */
68430
68663
 
68431
68664
  // ipcRenderer that must be used to invoke the events
68432
- const { ipcRenderer: ipcRenderer$d } = require$$0$2;
68665
+ const { ipcRenderer: ipcRenderer$e } = require$$0$2;
68433
68666
 
68434
68667
  const { MENU_ITEMS_SAVE, MENU_ITEMS_LIST } = events$8;
68435
68668
 
68436
68669
  const menuItemsApi$2 = {
68437
68670
  saveMenuItem: (appId, menuItem) =>
68438
- ipcRenderer$d.invoke(MENU_ITEMS_SAVE, { appId, menuItem }),
68439
- listMenuItems: (appId) => ipcRenderer$d.invoke(MENU_ITEMS_LIST, { appId }),
68671
+ ipcRenderer$e.invoke(MENU_ITEMS_SAVE, { appId, menuItem }),
68672
+ listMenuItems: (appId) => ipcRenderer$e.invoke(MENU_ITEMS_LIST, { appId }),
68440
68673
  };
68441
68674
 
68442
68675
  var menuItemsApi_1 = menuItemsApi$2;
@@ -68449,7 +68682,7 @@ var menuItemsApi_1 = menuItemsApi$2;
68449
68682
  * tool-use events, and request cancellation.
68450
68683
  */
68451
68684
 
68452
- const { ipcRenderer: ipcRenderer$c } = require$$0$2;
68685
+ const { ipcRenderer: ipcRenderer$d } = require$$0$2;
68453
68686
  const {
68454
68687
  LLM_SEND_MESSAGE,
68455
68688
  LLM_ABORT_REQUEST,
@@ -68471,7 +68704,7 @@ const _listenerMap = new Map();
68471
68704
  function _addListener(channel, callback) {
68472
68705
  const id = String(++_nextListenerId);
68473
68706
  const wrapped = (_event, data) => callback(data);
68474
- ipcRenderer$c.on(channel, wrapped);
68707
+ ipcRenderer$d.on(channel, wrapped);
68475
68708
  _listenerMap.set(id, { channel, wrapped });
68476
68709
  return id;
68477
68710
  }
@@ -68486,7 +68719,7 @@ const llmApi$2 = {
68486
68719
  * @returns {Promise<void>}
68487
68720
  */
68488
68721
  sendMessage: (requestId, params) =>
68489
- ipcRenderer$c.invoke(LLM_SEND_MESSAGE, { requestId, ...params }),
68722
+ ipcRenderer$d.invoke(LLM_SEND_MESSAGE, { requestId, ...params }),
68490
68723
 
68491
68724
  /**
68492
68725
  * abortRequest
@@ -68496,7 +68729,7 @@ const llmApi$2 = {
68496
68729
  * @returns {Promise<{ success: boolean }>}
68497
68730
  */
68498
68731
  abortRequest: (requestId) =>
68499
- ipcRenderer$c.invoke(LLM_ABORT_REQUEST, { requestId }),
68732
+ ipcRenderer$d.invoke(LLM_ABORT_REQUEST, { requestId }),
68500
68733
 
68501
68734
  /**
68502
68735
  * listConnectedTools
@@ -68504,7 +68737,7 @@ const llmApi$2 = {
68504
68737
  *
68505
68738
  * @returns {Promise<Array<{ serverName, tools, resources, status }>>}
68506
68739
  */
68507
- listConnectedTools: () => ipcRenderer$c.invoke(LLM_LIST_CONNECTED_TOOLS),
68740
+ listConnectedTools: () => ipcRenderer$d.invoke(LLM_LIST_CONNECTED_TOOLS),
68508
68741
 
68509
68742
  /**
68510
68743
  * checkCliAvailable
@@ -68512,7 +68745,7 @@ const llmApi$2 = {
68512
68745
  *
68513
68746
  * @returns {Promise<{ available: boolean, path?: string }>}
68514
68747
  */
68515
- checkCliAvailable: () => ipcRenderer$c.invoke(LLM_CHECK_CLI_AVAILABLE),
68748
+ checkCliAvailable: () => ipcRenderer$d.invoke(LLM_CHECK_CLI_AVAILABLE),
68516
68749
 
68517
68750
  /**
68518
68751
  * clearCliSession
@@ -68522,7 +68755,7 @@ const llmApi$2 = {
68522
68755
  * @returns {Promise<{ success: boolean }>}
68523
68756
  */
68524
68757
  clearCliSession: (widgetUuid) =>
68525
- ipcRenderer$c.invoke(LLM_CLEAR_CLI_SESSION, { widgetUuid }),
68758
+ ipcRenderer$d.invoke(LLM_CLEAR_CLI_SESSION, { widgetUuid }),
68526
68759
 
68527
68760
  /**
68528
68761
  * getCliSessionStatus
@@ -68532,7 +68765,7 @@ const llmApi$2 = {
68532
68765
  * @returns {Promise<{ hasSession: boolean, sessionId?: string, isProcessActive: boolean }>}
68533
68766
  */
68534
68767
  getCliSessionStatus: (widgetUuid) =>
68535
- ipcRenderer$c.invoke(LLM_CLI_SESSION_STATUS, { widgetUuid }),
68768
+ ipcRenderer$d.invoke(LLM_CLI_SESSION_STATUS, { widgetUuid }),
68536
68769
 
68537
68770
  /**
68538
68771
  * endCliSession
@@ -68542,7 +68775,7 @@ const llmApi$2 = {
68542
68775
  * @returns {Promise<{ success: boolean }>}
68543
68776
  */
68544
68777
  endCliSession: (widgetUuid) =>
68545
- ipcRenderer$c.invoke(LLM_CLI_END_SESSION, { widgetUuid }),
68778
+ ipcRenderer$d.invoke(LLM_CLI_END_SESSION, { widgetUuid }),
68546
68779
 
68547
68780
  // --- Stream event listeners ---
68548
68781
  // Each on* method returns an opaque string ID. Strings cross the
@@ -68576,7 +68809,7 @@ const llmApi$2 = {
68576
68809
  const listenerId = id !== undefined ? String(id) : String(idOrChannel);
68577
68810
  const entry = _listenerMap.get(listenerId);
68578
68811
  if (entry) {
68579
- ipcRenderer$c.removeListener(entry.channel, entry.wrapped);
68812
+ ipcRenderer$d.removeListener(entry.channel, entry.wrapped);
68580
68813
  _listenerMap.delete(listenerId);
68581
68814
  }
68582
68815
  },
@@ -68588,14 +68821,14 @@ const llmApi$2 = {
68588
68821
  */
68589
68822
  removeAllStreamListeners: () => {
68590
68823
  for (const [, entry] of _listenerMap) {
68591
- ipcRenderer$c.removeListener(entry.channel, entry.wrapped);
68824
+ ipcRenderer$d.removeListener(entry.channel, entry.wrapped);
68592
68825
  }
68593
68826
  _listenerMap.clear();
68594
- ipcRenderer$c.removeAllListeners(LLM_STREAM_DELTA);
68595
- ipcRenderer$c.removeAllListeners(LLM_STREAM_TOOL_CALL);
68596
- ipcRenderer$c.removeAllListeners(LLM_STREAM_TOOL_RESULT);
68597
- ipcRenderer$c.removeAllListeners(LLM_STREAM_COMPLETE);
68598
- ipcRenderer$c.removeAllListeners(LLM_STREAM_ERROR);
68827
+ ipcRenderer$d.removeAllListeners(LLM_STREAM_DELTA);
68828
+ ipcRenderer$d.removeAllListeners(LLM_STREAM_TOOL_CALL);
68829
+ ipcRenderer$d.removeAllListeners(LLM_STREAM_TOOL_RESULT);
68830
+ ipcRenderer$d.removeAllListeners(LLM_STREAM_COMPLETE);
68831
+ ipcRenderer$d.removeAllListeners(LLM_STREAM_ERROR);
68599
68832
  },
68600
68833
  };
68601
68834
 
@@ -68608,7 +68841,7 @@ var llmApi_1 = llmApi$2;
68608
68841
  * Exposed via contextBridge through mainApi.
68609
68842
  */
68610
68843
 
68611
- const { ipcRenderer: ipcRenderer$b } = require$$0$2;
68844
+ const { ipcRenderer: ipcRenderer$c } = require$$0$2;
68612
68845
  const {
68613
68846
  DASHBOARD_CONFIG_EXPORT,
68614
68847
  DASHBOARD_CONFIG_SELECT_FILE,
@@ -68635,7 +68868,7 @@ const dashboardConfigApi$2 = {
68635
68868
  * @returns {Promise<Object>} Result with success, filePath, and config
68636
68869
  */
68637
68870
  exportDashboardConfig: (appId, workspaceId, options = {}) =>
68638
- ipcRenderer$b.invoke(DASHBOARD_CONFIG_EXPORT, {
68871
+ ipcRenderer$c.invoke(DASHBOARD_CONFIG_EXPORT, {
68639
68872
  appId,
68640
68873
  workspaceId,
68641
68874
  options,
@@ -68648,7 +68881,7 @@ const dashboardConfigApi$2 = {
68648
68881
  *
68649
68882
  * @returns {Promise<Object>} Result with success, filePath, and dashboardConfig preview
68650
68883
  */
68651
- selectDashboardFile: () => ipcRenderer$b.invoke(DASHBOARD_CONFIG_SELECT_FILE),
68884
+ selectDashboardFile: () => ipcRenderer$c.invoke(DASHBOARD_CONFIG_SELECT_FILE),
68652
68885
 
68653
68886
  /**
68654
68887
  * Import a dashboard config from a ZIP file.
@@ -68660,7 +68893,7 @@ const dashboardConfigApi$2 = {
68660
68893
  * @returns {Promise<Object>} Result with success, workspace, and summary
68661
68894
  */
68662
68895
  importDashboardConfig: (appId, options = {}) =>
68663
- ipcRenderer$b.invoke(DASHBOARD_CONFIG_IMPORT, { appId, ...options }),
68896
+ ipcRenderer$c.invoke(DASHBOARD_CONFIG_IMPORT, { appId, ...options }),
68664
68897
 
68665
68898
  /**
68666
68899
  * Install a dashboard from the registry by package name.
@@ -68678,7 +68911,7 @@ const dashboardConfigApi$2 = {
68678
68911
  * @returns {Promise<Object>} Result with success, workspace, and summary
68679
68912
  */
68680
68913
  installDashboardFromRegistry: (appId, packageName, options = {}) =>
68681
- ipcRenderer$b.invoke(DASHBOARD_CONFIG_INSTALL, {
68914
+ ipcRenderer$c.invoke(DASHBOARD_CONFIG_INSTALL, {
68682
68915
  appId,
68683
68916
  packageName,
68684
68917
  options,
@@ -68692,7 +68925,7 @@ const dashboardConfigApi$2 = {
68692
68925
  * @returns {Promise<Object>} Compatibility report with per-widget status
68693
68926
  */
68694
68927
  checkDashboardCompatibility: (appId, dashboardWidgets) =>
68695
- ipcRenderer$b.invoke(DASHBOARD_CONFIG_COMPATIBILITY, {
68928
+ ipcRenderer$c.invoke(DASHBOARD_CONFIG_COMPATIBILITY, {
68696
68929
  appId,
68697
68930
  dashboardWidgets,
68698
68931
  }),
@@ -68708,7 +68941,7 @@ const dashboardConfigApi$2 = {
68708
68941
  * @returns {Promise<Object>} Result with success, manifest, filePath
68709
68942
  */
68710
68943
  prepareDashboardForPublish: (appId, workspaceId, options = {}) =>
68711
- ipcRenderer$b.invoke(DASHBOARD_CONFIG_PUBLISH, {
68944
+ ipcRenderer$c.invoke(DASHBOARD_CONFIG_PUBLISH, {
68712
68945
  appId,
68713
68946
  workspaceId,
68714
68947
  options,
@@ -68727,7 +68960,7 @@ const dashboardConfigApi$2 = {
68727
68960
  * @returns {Promise<Object>} { success, widgets, theme }
68728
68961
  */
68729
68962
  collectDashboardDependencies: (appId, workspaceId, options = {}) =>
68730
- ipcRenderer$b.invoke(DASHBOARD_CONFIG_COLLECT_DEPENDENCIES, {
68963
+ ipcRenderer$c.invoke(DASHBOARD_CONFIG_COLLECT_DEPENDENCIES, {
68731
68964
  appId,
68732
68965
  workspaceId,
68733
68966
  options,
@@ -68744,7 +68977,7 @@ const dashboardConfigApi$2 = {
68744
68977
  * @returns {Promise<Object>} { success, widgets, theme, registryError? }
68745
68978
  */
68746
68979
  getDashboardPublishPlan: (appId, workspaceId, options = {}) =>
68747
- ipcRenderer$b.invoke(DASHBOARD_CONFIG_PUBLISH_PLAN, {
68980
+ ipcRenderer$c.invoke(DASHBOARD_CONFIG_PUBLISH_PLAN, {
68748
68981
  appId,
68749
68982
  workspaceId,
68750
68983
  options,
@@ -68758,7 +68991,7 @@ const dashboardConfigApi$2 = {
68758
68991
  * @returns {Promise<Object>} Preview with metadata, widgets, wiring, compatibility
68759
68992
  */
68760
68993
  getDashboardPreview: (packageName) =>
68761
- ipcRenderer$b.invoke(DASHBOARD_CONFIG_PREVIEW, { packageName }),
68994
+ ipcRenderer$c.invoke(DASHBOARD_CONFIG_PREVIEW, { packageName }),
68762
68995
 
68763
68996
  /**
68764
68997
  * Check installed dashboards for available updates.
@@ -68767,7 +69000,7 @@ const dashboardConfigApi$2 = {
68767
69000
  * @returns {Promise<Object>} Result with updates array
68768
69001
  */
68769
69002
  checkDashboardUpdates: (appId) =>
68770
- ipcRenderer$b.invoke(DASHBOARD_CONFIG_CHECK_UPDATES, { appId }),
69003
+ ipcRenderer$c.invoke(DASHBOARD_CONFIG_CHECK_UPDATES, { appId }),
68771
69004
 
68772
69005
  /**
68773
69006
  * Get provider setup manifest for a dashboard's requirements.
@@ -68777,7 +69010,7 @@ const dashboardConfigApi$2 = {
68777
69010
  * @returns {Promise<Object>} Setup manifest with per-provider status
68778
69011
  */
68779
69012
  getProviderSetupManifest: (appId, requiredProviders) =>
68780
- ipcRenderer$b.invoke(DASHBOARD_CONFIG_PROVIDER_SETUP, {
69013
+ ipcRenderer$c.invoke(DASHBOARD_CONFIG_PROVIDER_SETUP, {
68781
69014
  appId,
68782
69015
  requiredProviders,
68783
69016
  }),
@@ -68791,7 +69024,7 @@ const dashboardConfigApi$2 = {
68791
69024
  * @returns {Promise<Object>} Preview with dashboardName, widgetCount, widgets, componentNames
68792
69025
  */
68793
69026
  getPublishPreview: (appId, workspaceId) =>
68794
- ipcRenderer$b.invoke(DASHBOARD_CONFIG_PUBLISH_PREVIEW, {
69027
+ ipcRenderer$c.invoke(DASHBOARD_CONFIG_PUBLISH_PREVIEW, {
68795
69028
  appId,
68796
69029
  workspaceId,
68797
69030
  }),
@@ -68805,9 +69038,9 @@ const dashboardConfigApi$2 = {
68805
69038
  */
68806
69039
  onInstallProgress: (callback) => {
68807
69040
  const handler = (_event, data) => callback(data);
68808
- ipcRenderer$b.on(DASHBOARD_CONFIG_INSTALL_PROGRESS, handler);
69041
+ ipcRenderer$c.on(DASHBOARD_CONFIG_INSTALL_PROGRESS, handler);
68809
69042
  return () =>
68810
- ipcRenderer$b.removeListener(DASHBOARD_CONFIG_INSTALL_PROGRESS, handler);
69043
+ ipcRenderer$c.removeListener(DASHBOARD_CONFIG_INSTALL_PROGRESS, handler);
68811
69044
  },
68812
69045
  };
68813
69046
 
@@ -68820,7 +69053,7 @@ var dashboardConfigApi_1 = dashboardConfigApi$2;
68820
69053
  * Exposed via contextBridge through mainApi.
68821
69054
  */
68822
69055
 
68823
- const { ipcRenderer: ipcRenderer$a } = require$$0$2;
69056
+ const { ipcRenderer: ipcRenderer$b } = require$$0$2;
68824
69057
  const {
68825
69058
  REGISTRY_AUTH_INITIATE_LOGIN,
68826
69059
  REGISTRY_AUTH_POLL_TOKEN,
@@ -68841,7 +69074,7 @@ const registryAuthApi$2 = {
68841
69074
  *
68842
69075
  * @returns {Promise<Object>} { deviceCode, userCode, verificationUrl, verificationUrlComplete, expiresIn, interval }
68843
69076
  */
68844
- initiateLogin: () => ipcRenderer$a.invoke(REGISTRY_AUTH_INITIATE_LOGIN),
69077
+ initiateLogin: () => ipcRenderer$b.invoke(REGISTRY_AUTH_INITIATE_LOGIN),
68845
69078
 
68846
69079
  /**
68847
69080
  * Poll for token after user completes browser auth.
@@ -68850,26 +69083,26 @@ const registryAuthApi$2 = {
68850
69083
  * @returns {Promise<Object>} { status: 'pending' | 'authorized' | 'expired', token?, userId? }
68851
69084
  */
68852
69085
  pollToken: (deviceCode) =>
68853
- ipcRenderer$a.invoke(REGISTRY_AUTH_POLL_TOKEN, { deviceCode }),
69086
+ ipcRenderer$b.invoke(REGISTRY_AUTH_POLL_TOKEN, { deviceCode }),
68854
69087
 
68855
69088
  /**
68856
69089
  * Get current auth status.
68857
69090
  *
68858
69091
  * @returns {Promise<Object>} { authenticated: boolean, userId?: string }
68859
69092
  */
68860
- getStatus: () => ipcRenderer$a.invoke(REGISTRY_AUTH_GET_STATUS),
69093
+ getStatus: () => ipcRenderer$b.invoke(REGISTRY_AUTH_GET_STATUS),
68861
69094
 
68862
69095
  /**
68863
69096
  * Get the authenticated user's registry profile.
68864
69097
  *
68865
69098
  * @returns {Promise<Object|null>} User profile or null
68866
69099
  */
68867
- getProfile: () => ipcRenderer$a.invoke(REGISTRY_AUTH_GET_PROFILE),
69100
+ getProfile: () => ipcRenderer$b.invoke(REGISTRY_AUTH_GET_PROFILE),
68868
69101
 
68869
69102
  /**
68870
69103
  * Logout from registry.
68871
69104
  */
68872
- logout: () => ipcRenderer$a.invoke(REGISTRY_AUTH_LOGOUT),
69105
+ logout: () => ipcRenderer$b.invoke(REGISTRY_AUTH_LOGOUT),
68873
69106
 
68874
69107
  /**
68875
69108
  * Publish a ZIP to the registry.
@@ -68879,7 +69112,7 @@ const registryAuthApi$2 = {
68879
69112
  * @returns {Promise<Object>} { success, registryUrl, packageId, version, error? }
68880
69113
  */
68881
69114
  publish: (zipPath, manifest) =>
68882
- ipcRenderer$a.invoke(REGISTRY_AUTH_PUBLISH, { zipPath, manifest }),
69115
+ ipcRenderer$b.invoke(REGISTRY_AUTH_PUBLISH, { zipPath, manifest }),
68883
69116
 
68884
69117
  /**
68885
69118
  * Update the authenticated user's profile.
@@ -68888,14 +69121,14 @@ const registryAuthApi$2 = {
68888
69121
  * @returns {Promise<Object|null>} Updated user or null
68889
69122
  */
68890
69123
  updateProfile: (updates) =>
68891
- ipcRenderer$a.invoke(REGISTRY_AUTH_UPDATE_PROFILE, updates),
69124
+ ipcRenderer$b.invoke(REGISTRY_AUTH_UPDATE_PROFILE, updates),
68892
69125
 
68893
69126
  /**
68894
69127
  * Get the authenticated user's published packages.
68895
69128
  *
68896
69129
  * @returns {Promise<Object|null>} { packages: [...] } or null
68897
69130
  */
68898
- getPackages: () => ipcRenderer$a.invoke(REGISTRY_AUTH_GET_PACKAGES),
69131
+ getPackages: () => ipcRenderer$b.invoke(REGISTRY_AUTH_GET_PACKAGES),
68899
69132
 
68900
69133
  /**
68901
69134
  * Update a published package's metadata.
@@ -68906,7 +69139,7 @@ const registryAuthApi$2 = {
68906
69139
  * @returns {Promise<Object|null>} Updated package or null
68907
69140
  */
68908
69141
  updatePackage: (scope, name, updates) =>
68909
- ipcRenderer$a.invoke(REGISTRY_AUTH_UPDATE_PACKAGE, {
69142
+ ipcRenderer$b.invoke(REGISTRY_AUTH_UPDATE_PACKAGE, {
68910
69143
  scope,
68911
69144
  name,
68912
69145
  updates,
@@ -68920,7 +69153,7 @@ const registryAuthApi$2 = {
68920
69153
  * @returns {Promise<Object|null>} Response or null
68921
69154
  */
68922
69155
  deletePackage: (scope, name) =>
68923
- ipcRenderer$a.invoke(REGISTRY_AUTH_DELETE_PACKAGE, { scope, name }),
69156
+ ipcRenderer$b.invoke(REGISTRY_AUTH_DELETE_PACKAGE, { scope, name }),
68924
69157
  };
68925
69158
 
68926
69159
  var registryAuthApi_1 = registryAuthApi$2;
@@ -68932,7 +69165,7 @@ var registryAuthApi_1 = registryAuthApi$2;
68932
69165
  * Exposed via contextBridge through `window.mainApi.publisherKey`.
68933
69166
  */
68934
69167
 
68935
- const { ipcRenderer: ipcRenderer$9 } = require$$0$2;
69168
+ const { ipcRenderer: ipcRenderer$a } = require$$0$2;
68936
69169
  const {
68937
69170
  PUBLISHER_KEY_GET_OR_CREATE,
68938
69171
  PUBLISHER_KEY_DESCRIBE,
@@ -68952,19 +69185,19 @@ const publisherKeyApi$2 = {
68952
69185
  * Rejects with `{ authRequired: true }` if not signed in to the
68953
69186
  * registry; with a generic error otherwise.
68954
69187
  */
68955
- getOrCreate: () => ipcRenderer$9.invoke(PUBLISHER_KEY_GET_OR_CREATE),
69188
+ getOrCreate: () => ipcRenderer$a.invoke(PUBLISHER_KEY_GET_OR_CREATE),
68956
69189
 
68957
69190
  /**
68958
69191
  * Summary of the current local key (or null). Does not trigger
68959
69192
  * registration — purely read-only.
68960
69193
  */
68961
- describe: () => ipcRenderer$9.invoke(PUBLISHER_KEY_DESCRIBE),
69194
+ describe: () => ipcRenderer$a.invoke(PUBLISHER_KEY_DESCRIBE),
68962
69195
 
68963
69196
  /**
68964
69197
  * Revoke the local key on the registry and clear it from disk.
68965
69198
  * Next publish will auto-generate a fresh keypair.
68966
69199
  */
68967
- revoke: () => ipcRenderer$9.invoke(PUBLISHER_KEY_REVOKE),
69200
+ revoke: () => ipcRenderer$a.invoke(PUBLISHER_KEY_REVOKE),
68968
69201
  };
68969
69202
 
68970
69203
  var publisherKeyApi_1 = publisherKeyApi$2;
@@ -68976,7 +69209,7 @@ var publisherKeyApi_1 = publisherKeyApi$2;
68976
69209
  * Exposed via contextBridge through `window.mainApi.onboarding`.
68977
69210
  */
68978
69211
 
68979
- const { ipcRenderer: ipcRenderer$8 } = require$$0$2;
69212
+ const { ipcRenderer: ipcRenderer$9 } = require$$0$2;
68980
69213
  const {
68981
69214
  ONBOARDING_GET_STATUS,
68982
69215
  ONBOARDING_MARK_COMPLETED,
@@ -68989,7 +69222,7 @@ const onboardingApi$2 = {
68989
69222
  * the "never seen" state — the renderer can treat that as the gate
68990
69223
  * to show the OnboardingModal.
68991
69224
  */
68992
- getStatus: () => ipcRenderer$8.invoke(ONBOARDING_GET_STATUS),
69225
+ getStatus: () => ipcRenderer$9.invoke(ONBOARDING_GET_STATUS),
68993
69226
 
68994
69227
  /**
68995
69228
  * Pin onboarding as completed. Idempotent — safe to call multiple
@@ -69000,11 +69233,40 @@ const onboardingApi$2 = {
69000
69233
  * @returns {Promise<{ completed: true, completedAt: string, source: string|null }>}
69001
69234
  */
69002
69235
  markCompleted: (opts = {}) =>
69003
- ipcRenderer$8.invoke(ONBOARDING_MARK_COMPLETED, opts),
69236
+ ipcRenderer$9.invoke(ONBOARDING_MARK_COMPLETED, opts),
69004
69237
  };
69005
69238
 
69006
69239
  var onboardingApi_1 = onboardingApi$2;
69007
69240
 
69241
+ /**
69242
+ * exportApi.js
69243
+ *
69244
+ * IPC bridge for the Export Everything bundle (renderer side).
69245
+ * Exposed via contextBridge as `window.mainApi.export`.
69246
+ */
69247
+
69248
+ const { ipcRenderer: ipcRenderer$8 } = require$$0$2;
69249
+ const { EXPORT_EVERYTHING } = events$8;
69250
+
69251
+ const exportApi$2 = {
69252
+ /**
69253
+ * Export workspaces + themes + menu items + providers (sans
69254
+ * credentials) as a single ZIP. Opens a native save dialog so the
69255
+ * user picks the destination.
69256
+ *
69257
+ * Resolves with:
69258
+ * { success: true, filePath, counts: {...} } on success
69259
+ * { success: false, canceled: true } user dismissed the dialog
69260
+ * { success: false, error: "..." } anything else
69261
+ *
69262
+ * @param {string} appId
69263
+ * @returns {Promise<Object>}
69264
+ */
69265
+ exportEverything: (appId) => ipcRenderer$8.invoke(EXPORT_EVERYTHING, { appId }),
69266
+ };
69267
+
69268
+ var exportApi_1 = exportApi$2;
69269
+
69008
69270
  /**
69009
69271
  * notificationApi.js
69010
69272
  *
@@ -70625,6 +70887,7 @@ const webSocketApi$1 = webSocketApi_1;
70625
70887
  const mcpDashServerApi$1 = mcpDashServerApi_1;
70626
70888
  const publisherKeyApi$1 = publisherKeyApi_1;
70627
70889
  const onboardingApi$1 = onboardingApi_1;
70890
+ const exportApi$1 = exportApi_1;
70628
70891
 
70629
70892
  // Events constants
70630
70893
  const events$1 = events$8;
@@ -70699,6 +70962,7 @@ function createMainApi$1(extensions = {}) {
70699
70962
  registryAuth: registryAuthApi$1,
70700
70963
  publisherKey: publisherKeyApi$1,
70701
70964
  onboarding: onboardingApi$1,
70965
+ export: exportApi$1,
70702
70966
  session: sessionApi,
70703
70967
  notifications: notificationApi$1,
70704
70968
  scheduler: schedulerApi$1,
@@ -70755,6 +71019,7 @@ const registryAuthController = registryAuthController$2;
70755
71019
  const registryApiController = registryApiController$3;
70756
71020
  const publisherKeyController = publisherKeyController$1;
70757
71021
  const onboardingController = onboardingController$1;
71022
+ const exportController = exportController$1;
70758
71023
  const notificationController = notificationController_1;
70759
71024
  const schedulerController = schedulerController_1;
70760
71025
  const themeRegistryController = themeRegistryController$1;
@@ -70798,6 +71063,7 @@ const dashboardConfigApi = dashboardConfigApi_1;
70798
71063
  const registryAuthApi = registryAuthApi_1;
70799
71064
  const publisherKeyApi = publisherKeyApi_1;
70800
71065
  const onboardingApi = onboardingApi_1;
71066
+ const exportApi = exportApi_1;
70801
71067
  const notificationApi = notificationApi_1;
70802
71068
  const schedulerApi = schedulerApi_1;
70803
71069
  const themeFromUrlApi = themeFromUrlApi_1;
@@ -70863,6 +71129,7 @@ var electron = {
70863
71129
  registryApiController,
70864
71130
  publisherKeyController,
70865
71131
  onboardingController,
71132
+ exportController,
70866
71133
  notificationController,
70867
71134
  schedulerController,
70868
71135
  themeRegistryController,
@@ -70898,6 +71165,7 @@ var electron = {
70898
71165
  registryAuthApi,
70899
71166
  publisherKeyApi,
70900
71167
  onboardingApi,
71168
+ exportApi,
70901
71169
  notificationApi,
70902
71170
  schedulerApi,
70903
71171
  themeFromUrlApi,