@camstack/addon-export-hap 0.1.2 → 0.1.4

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 (42) hide show
  1. package/dist/export-hap.addon.js +155 -268
  2. package/dist/export-hap.addon.js.map +1 -1
  3. package/dist/export-hap.addon.mjs +155 -268
  4. package/dist/export-hap.addon.mjs.map +1 -1
  5. package/package.json +3 -29
  6. package/dist/@mf-types/compiled-types/page/HomeKitOverviewPage.d.ts +0 -24
  7. package/dist/@mf-types/compiled-types/page/HomeKitOverviewPage.d.ts.map +0 -1
  8. package/dist/@mf-types/compiled-types/page/page.d.ts +0 -12
  9. package/dist/@mf-types/compiled-types/page/page.d.ts.map +0 -1
  10. package/dist/@mf-types/page.d.ts +0 -2
  11. package/dist/@mf-types.d.ts +0 -3
  12. package/dist/@mf-types.zip +0 -0
  13. package/dist/__mfe_internal__addon_export_hap_page__loadShare___mf_0_camstack_mf_1_sdk__loadShare__.mjs-B7qZNHZC.mjs +0 -12
  14. package/dist/__mfe_internal__addon_export_hap_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.mjs-B3wGuKgV.mjs +0 -12
  15. package/dist/__mfe_internal__addon_export_hap_page__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.mjs-D4zYQtXk.mjs +0 -73
  16. package/dist/__mfe_internal__addon_export_hap_page__loadShare___mf_0_trpc_mf_1_client__loadShare__.mjs-DrrRnQpW.mjs +0 -42
  17. package/dist/__mfe_internal__addon_export_hap_page__loadShare___mf_0_trpc_mf_1_react_mf_2_query__loadShare__.mjs-BEeMNLCX.mjs +0 -46
  18. package/dist/__mfe_internal__addon_export_hap_page__loadShare__react__loadShare__.mjs-BPYrKf_3.mjs +0 -56
  19. package/dist/__mfe_internal__addon_export_hap_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.mjs-x684zh94.mjs +0 -18
  20. package/dist/__mfe_internal__addon_export_hap_page__loadShare__react_mf_2_dom__loadShare__.mjs-CHMNar3q.mjs +0 -28
  21. package/dist/__mfe_internal__addon_export_hap_page__loadShare__react_mf_2_dom_mf_1_client__loadShare__.mjs-CM8j15CX.mjs +0 -18
  22. package/dist/_stub.js +0 -3223
  23. package/dist/_virtual_mf-localSharedImportMap___mfe_internal__addon_export_hap_page-DtbdD5CL.mjs +0 -156
  24. package/dist/addon-export-hap.css +0 -3
  25. package/dist/browser-i_dCVxwk.mjs +0 -1227
  26. package/dist/client-COVrSAyU.mjs +0 -7592
  27. package/dist/dist-B4EgL9KT.mjs +0 -12922
  28. package/dist/dist-BLWGlNFD.mjs +0 -2483
  29. package/dist/dist-DOK7aZoj.mjs +0 -662
  30. package/dist/dist-DvB1ylHP.mjs +0 -1275
  31. package/dist/dist-RCwIG6iQ.mjs +0 -2229
  32. package/dist/dist-v8qx0EEt.mjs +0 -17192
  33. package/dist/getErrorShape-BPSzUA7W-m6tLWUI0.mjs +0 -189
  34. package/dist/hostInit-CWjIaYbZ.mjs +0 -144
  35. package/dist/jsx-runtime-C-bO5vlp.mjs +0 -22
  36. package/dist/modern-DN59UY0v.mjs +0 -2184
  37. package/dist/react-Bl6eCS2o.mjs +0 -293
  38. package/dist/react-dom-lYY58-MR.mjs +0 -131
  39. package/dist/remoteEntry.js +0 -83
  40. package/dist/rolldown-runtime-DC4cgjXG.mjs +0 -20
  41. package/dist/schemas-DswVYZsq.mjs +0 -3483
  42. package/dist/virtualExposes-Biq8M5a-.mjs +0 -27
@@ -4659,7 +4659,7 @@ function _instanceof(cls, params = {}) {
4659
4659
  return inst;
4660
4660
  }
4661
4661
  //#endregion
4662
- //#region ../types/dist/index-YnRVILXN.mjs
4662
+ //#region ../types/dist/index-CWhQOnm9.mjs
4663
4663
  var MODEL_FORMATS = [
4664
4664
  "onnx",
4665
4665
  "coreml",
@@ -7331,14 +7331,35 @@ var StatusSchema = object({
7331
7331
  embeddedRunning: boolean()
7332
7332
  });
7333
7333
  method(_void(), array(BrokerInfoSchema)), method(IdInputSchema, BrokerConnectionDetailsSchema), method(AddBrokerInputSchema, AddBrokerResultSchema, { kind: "mutation" }), method(IdInputSchema, _void(), { kind: "mutation" }), method(IdInputSchema, TestResultSchema, { kind: "mutation" }), method(StartEmbeddedInputSchema, StartEmbeddedResultSchema, { kind: "mutation" }), method(IdInputSchema, _void(), { kind: "mutation" }), method(_void(), StatusSchema);
7334
+ var LinkStateSchema = _enum([
7335
+ "unlinked",
7336
+ "linked",
7337
+ "error"
7338
+ ]);
7339
+ var ExportSetupFieldSchema = object({
7340
+ label: string(),
7341
+ value: string(),
7342
+ /** Mask the value by default + render a reveal toggle (client id, secrets). */
7343
+ secret: boolean().optional()
7344
+ });
7345
+ var ExportSetupSchema = object({
7346
+ /** A string to render as a scannable QR — HAP `X-HM://…` URI, a pairing URL, etc. Omitted when there's nothing to scan. */
7347
+ qr: string().optional(),
7348
+ /** Label/value rows shown with a copy button (HAP setup code, OAuth URLs, client id, linked-account count, …). */
7349
+ fields: array(ExportSetupFieldSchema).readonly().optional(),
7350
+ /** Free-form operator instructions rendered above the fields. */
7351
+ note: string().optional()
7352
+ });
7334
7353
  var DeviceExportStatusSchema = object({
7335
- linkState: _enum([
7336
- "unlinked",
7337
- "linked",
7338
- "error"
7339
- ]),
7354
+ linkState: LinkStateSchema,
7340
7355
  exposedDeviceCount: number(),
7341
- error: string().optional()
7356
+ error: string().optional(),
7357
+ /**
7358
+ * Optional pairing/account info the panel renders in a generic
7359
+ * "Setup" section. Addon-agnostic — the addon id identifies the
7360
+ * export target, never an `ecosystem` key here.
7361
+ */
7362
+ setup: ExportSetupSchema.optional()
7342
7363
  });
7343
7364
  var DeviceKindSchema = string();
7344
7365
  var ExposedDeviceSchema = object({
@@ -7413,13 +7434,7 @@ var AddonPageDeclarationSchema = object({
7413
7434
  */
7414
7435
  bundle: string()
7415
7436
  });
7416
- var addonPagesSourceCapability = {
7417
- name: "addon-pages-source",
7418
- scope: "system",
7419
- mode: "collection",
7420
- internal: true,
7421
- methods: { listPages: method(_void(), array(AddonPageDeclarationSchema).readonly()) }
7422
- };
7437
+ method(_void(), array(AddonPageDeclarationSchema).readonly());
7423
7438
  var WidgetHostEnum = _enum([
7424
7439
  "device-tab",
7425
7440
  "dashboard",
@@ -8283,42 +8298,6 @@ method(object({
8283
8298
  username: string(),
8284
8299
  password: string()
8285
8300
  }), AuthResultSchema.nullable(), { kind: "mutation" }), method(object({ state: string() }), string()), method(record(string(), string()), AuthResultSchema, { kind: "mutation" }), method(object({ token: string() }), AuthResultSchema.nullable());
8286
- var AuthProviderInfoSchema = object({
8287
- /** Stable id matching the addon id (used for `getLoginUrl({addonId,…})`). */
8288
- addonId: string(),
8289
- /**
8290
- * Per-instance id when one addon registers multiple "logical"
8291
- * providers (e.g. OIDC with Google + Microsoft + custom). The login
8292
- * URL becomes `/addon/${addonId}/${instanceId}/start` — handler reads
8293
- * `:instanceId` from the route. Empty/unset means the addon is a
8294
- * single-instance provider; the URL is `/addon/${addonId}/start`.
8295
- */
8296
- instanceId: string().optional(),
8297
- /** Display label shown on the login button + admin row. */
8298
- displayName: string(),
8299
- /** Optional iconography hint (lucide-react icon name OR emoji). */
8300
- icon: string().optional(),
8301
- /** When true, the provider exposes a redirect-based login flow
8302
- * (`getLoginUrl` returns a URL the browser navigates to). */
8303
- hasRedirectFlow: boolean(),
8304
- /** When true, the provider exposes a credential-form login flow
8305
- * (`validateCredentials` accepts username + password). */
8306
- hasCredentialFlow: boolean(),
8307
- /** Provider kind, drives admin-UI hint dispatch (oidc / saml / totp / …). */
8308
- kind: string().optional(),
8309
- /** Operator-facing status string (e.g. "Connected to https://login.acme.com"). */
8310
- status: string().optional(),
8311
- /** When false, the provider is registered but disabled by config; the
8312
- * UI surfaces it as inactive without enumerating it for login. */
8313
- enabled: boolean()
8314
- });
8315
- method(_void(), array(AuthProviderInfoSchema).readonly()), method(object({
8316
- addonId: string(),
8317
- enabled: boolean()
8318
- }), object({ success: literal(true) }), {
8319
- kind: "mutation",
8320
- auth: "admin"
8321
- });
8322
8301
  var NetworkEndpointSchema = object({
8323
8302
  url: string(),
8324
8303
  hostname: string(),
@@ -8344,33 +8323,6 @@ var NetworkEndpointEntrySchema = NetworkEndpointSchema.extend({
8344
8323
  sourcePort: number().optional()
8345
8324
  });
8346
8325
  method(_void(), NetworkEndpointSchema, { kind: "mutation" }), method(_void(), _void(), { kind: "mutation" }), method(_void(), NetworkEndpointSchema.nullable()), method(_void(), NetworkAccessStatusSchema), method(_void(), array(NetworkEndpointEntrySchema).readonly());
8347
- var RemoteAccessEndpointSchema = object({
8348
- url: string(),
8349
- hostname: string(),
8350
- port: number(),
8351
- protocol: _enum(["http", "https"])
8352
- });
8353
- var RemoteAccessProviderInfoSchema = object({
8354
- /** Stable id matching the addon id. */
8355
- addonId: string(),
8356
- /** Display label shown on the admin row — sourced from the addon manifest. */
8357
- displayName: string(),
8358
- /** When false, the provider is registered but disabled. */
8359
- enabled: boolean(),
8360
- /** True when the underlying tunnel/connection is up. */
8361
- connected: boolean(),
8362
- /** Public-facing endpoint, when connected. Null otherwise. */
8363
- endpoint: RemoteAccessEndpointSchema.nullable(),
8364
- /** Last error message (when connected=false), if available. */
8365
- error: string().optional()
8366
- });
8367
- method(_void(), array(RemoteAccessProviderInfoSchema).readonly()), method(object({ addonId: string() }), RemoteAccessEndpointSchema, {
8368
- kind: "mutation",
8369
- auth: "admin"
8370
- }), method(object({ addonId: string() }), object({ success: literal(true) }), {
8371
- kind: "mutation",
8372
- auth: "admin"
8373
- });
8374
8326
  var TurnServerSchema = object({
8375
8327
  /** Single URL or list of URLs (e.g. "turn:turn.example.com:3478?transport=udp"). */
8376
8328
  urls: union([string(), array(string())]),
@@ -8378,33 +8330,6 @@ var TurnServerSchema = object({
8378
8330
  credential: string().optional()
8379
8331
  });
8380
8332
  method(_void(), array(TurnServerSchema).readonly());
8381
- var TurnProviderInfoSchema = object({
8382
- /** Stable id matching the addon id. */
8383
- addonId: string(),
8384
- /** Display label shown on the admin row — sourced from the addon manifest. */
8385
- displayName: string(),
8386
- /** When false, the provider is registered but disabled. */
8387
- enabled: boolean(),
8388
- /** Number of servers this provider is currently exposing. */
8389
- serverCount: number(),
8390
- /**
8391
- * Flat list of every TURN/STUN URL this provider currently exposes.
8392
- * One row per URL (multi-URL ICE server entries are flattened). The
8393
- * admin UI shows this in a compact per-provider list so operators
8394
- * can verify what's actually being negotiated without having to dig
8395
- * into the combined `getAllServers` output.
8396
- */
8397
- urls: array(string()).readonly(),
8398
- /** Last fetch error (when serverCount=0 due to API failure), if any. */
8399
- error: string().optional()
8400
- });
8401
- method(_void(), array(TurnProviderInfoSchema).readonly()), method(_void(), array(TurnServerSchema).readonly()), method(object({
8402
- addonId: string(),
8403
- enabled: boolean()
8404
- }), object({ success: literal(true) }), {
8405
- kind: "mutation",
8406
- auth: "admin"
8407
- });
8408
8333
  var SnapshotImageSchema = object({
8409
8334
  base64: string(),
8410
8335
  contentType: string()
@@ -9498,7 +9423,7 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
9498
9423
  * tunnel always emits `https://` regardless. */
9499
9424
  scheme: _enum(["http", "https"]).optional()
9500
9425
  }), GetConnectionEndpointsResultSchema), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" });
9501
- var MeshEndpointSchema$1 = object({
9426
+ var MeshEndpointSchema = object({
9502
9427
  /** Stable identifier within the provider (e.g. `mesh-ipv4`, `magicdns`, `funnel`). */
9503
9428
  id: string(),
9504
9429
  /** Operator-facing label (e.g. "Mesh IPv4", "MagicDNS"). */
@@ -9575,7 +9500,7 @@ var MeshStatusSchema = object({
9575
9500
  /** Number of peers visible to this host (excluding self). */
9576
9501
  peerCount: number(),
9577
9502
  /** Every endpoint this provider exposes for the current host. */
9578
- endpoints: array(MeshEndpointSchema$1).readonly(),
9503
+ endpoints: array(MeshEndpointSchema).readonly(),
9579
9504
  /** Last error from the daemon, when not joined. */
9580
9505
  error: string().optional(),
9581
9506
  /**
@@ -9607,7 +9532,24 @@ var MeshStatusSchema = object({
9607
9532
  * doesn't rotate keys for the bound host. Operator-facing surface
9608
9533
  * for "your access expires on …" banners.
9609
9534
  */
9610
- keyExpiry: number().nullable()
9535
+ keyExpiry: number().nullable(),
9536
+ /**
9537
+ * When the provider runs its OWN mesh daemon (e.g. the Tailscale
9538
+ * client addon in `onboard` mode spawns a private `tailscaled`),
9539
+ * this carries the local control-socket path. Companion addons that
9540
+ * must drive the SAME daemon — chiefly `tailscale-ingress` for
9541
+ * Serve/Funnel — read it to point their CLI at the right socket
9542
+ * instead of the system default. Empty when the provider uses the
9543
+ * host's system daemon (or doesn't have the concept).
9544
+ */
9545
+ daemonSocket: string().optional(),
9546
+ /**
9547
+ * Path to the mesh CLI binary the provider downloaded for onboard
9548
+ * mode. Companion addons reuse it so they don't need a system
9549
+ * install when the operator chose a fully self-contained mesh.
9550
+ * Empty in host mode.
9551
+ */
9552
+ daemonCliPath: string().optional()
9611
9553
  });
9612
9554
  method(_void(), MeshStatusSchema), method(object({
9613
9555
  /** Provider-specific auth key. For Tailscale this is the
@@ -9633,51 +9575,6 @@ authKey: string().optional() }), object({
9633
9575
  /** Human-readable error when `ok: false`. */
9634
9576
  error: string().optional()
9635
9577
  }), { kind: "mutation" });
9636
- var MeshEndpointSchema = object({
9637
- id: string(),
9638
- label: string(),
9639
- scope: _enum(["mesh", "public"]),
9640
- url: string(),
9641
- hostname: string(),
9642
- port: number(),
9643
- protocol: _enum(["http", "https"])
9644
- });
9645
- var MeshProviderInfoSchema = object({
9646
- /** Stable id matching the addon id. */
9647
- addonId: string(),
9648
- /** Display label shown on the admin row — sourced from the addon manifest. */
9649
- displayName: string(),
9650
- /** True when the host is joined to this provider's mesh. */
9651
- joined: boolean(),
9652
- /** Local mesh IP (empty when not joined). */
9653
- meshIp: string(),
9654
- /** MagicDNS / mesh hostname (empty when not configured). */
9655
- magicDnsHostname: string(),
9656
- /** Peer count (excluding self). */
9657
- peerCount: number(),
9658
- /** Active endpoints (mesh IP + MagicDNS + optional public Funnel). */
9659
- endpoints: array(MeshEndpointSchema).readonly(),
9660
- /** Last error reported by the provider. */
9661
- error: string().optional(),
9662
- /** Tenant / tailnet / network display name. Empty pre-join. */
9663
- tenantName: string(),
9664
- /** Mesh DNS suffix (e.g. tailXXXX.ts.net). Empty when not configured. */
9665
- magicDnsSuffix: string(),
9666
- /** Authenticated user / account login. Null for token-only providers. */
9667
- userLogin: string().nullable(),
9668
- /** Provider control-plane URL. */
9669
- controlPlaneUrl: string(),
9670
- /** Machine-key expiry (epoch ms). Null when keys don't rotate. */
9671
- keyExpiry: number().nullable()
9672
- });
9673
- method(_void(), array(MeshProviderInfoSchema).readonly()), method(object({
9674
- addonId: string(),
9675
- authKey: string().min(8),
9676
- hostname: string().optional()
9677
- }), object({ joined: literal(true) }), { kind: "mutation" }), method(object({ addonId: string() }), object({ success: literal(true) }), { kind: "mutation" }), method(object({
9678
- addonId: string(),
9679
- hostname: string().optional()
9680
- }), object({ loginUrl: string() }), { kind: "mutation" }), method(object({ addonId: string() }), object({ loggedOut: literal(true) }), { kind: "mutation" }), method(object({ addonId: string() }), object({ peers: array(MeshPeerSchema).readonly() }));
9681
9578
  var MethodAccessSchema = _enum([
9682
9579
  "view",
9683
9580
  "create",
@@ -10289,6 +10186,21 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
10289
10186
  var RestartAddonResultSchema = unknown();
10290
10187
  var InstallPackageResultSchema = unknown();
10291
10188
  var ReloadPackagesResultSchema = unknown();
10189
+ var UpdateFrameworkPackageResultSchema = object({
10190
+ packageName: string(),
10191
+ fromVersion: string(),
10192
+ toVersion: string(),
10193
+ /** Ms-epoch the server scheduled its self-restart. */
10194
+ restartingAt: number()
10195
+ });
10196
+ var FrameworkPackageStatusSchema = object({
10197
+ packageName: string(),
10198
+ currentVersion: string(),
10199
+ latestVersion: string().nullable(),
10200
+ hasUpdate: boolean(),
10201
+ /** Optional manifest description for the row tooltip. */
10202
+ description: string().optional()
10203
+ });
10292
10204
  var LogStreamEntrySchema = object({
10293
10205
  timestamp: string(),
10294
10206
  level: string(),
@@ -10320,21 +10232,50 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
10320
10232
  }), method(_void(), ReloadPackagesResultSchema, {
10321
10233
  kind: "mutation",
10322
10234
  auth: "admin"
10323
- }), method(object({ query: string().optional() }), array(SearchResultSchema)), method(_void(), array(PackageUpdateSchema).readonly(), { auth: "admin" }), method(object({
10235
+ }), method(object({ query: string().optional() }), array(SearchResultSchema)), method(object({ nodeId: string().optional() }), array(PackageUpdateSchema).readonly(), { auth: "admin" }), method(object({
10324
10236
  name: string().min(1),
10325
- version: string().optional()
10237
+ version: string().optional(),
10238
+ nodeId: string().optional()
10326
10239
  }), unknown(), {
10327
10240
  kind: "mutation",
10328
10241
  auth: "admin"
10329
10242
  }), method(object({ name: string().min(1) }), object({ rolledBackTo: string().nullable() }), {
10330
10243
  kind: "mutation",
10331
10244
  auth: "admin"
10332
- }), method(_void(), unknown(), {
10245
+ }), method(object({ nodeId: string().optional() }), unknown(), {
10333
10246
  kind: "mutation",
10334
10247
  auth: "admin"
10335
10248
  }), method(object({ confirm: literal(true) }), unknown(), {
10336
10249
  kind: "mutation",
10337
10250
  auth: "admin"
10251
+ }), method(_void(), object({
10252
+ kind: _enum([
10253
+ "framework-update",
10254
+ "manual",
10255
+ "system"
10256
+ ]),
10257
+ packageName: string().optional(),
10258
+ fromVersion: string().optional(),
10259
+ toVersion: string().optional(),
10260
+ requestedBy: string().optional(),
10261
+ requestedAt: number()
10262
+ }).nullable(), { auth: "admin" }), method(_void(), array(FrameworkPackageStatusSchema).readonly(), { auth: "admin" }), method(object({ capName: string().min(1) }), array(object({
10263
+ addonId: string(),
10264
+ mode: _enum(["singleton", "collection"]),
10265
+ isActive: boolean()
10266
+ })).readonly()), method(object({
10267
+ capName: string().min(1),
10268
+ addonId: string().min(1),
10269
+ enabled: boolean()
10270
+ }), object({ success: literal(true) }), {
10271
+ kind: "mutation",
10272
+ auth: "admin"
10273
+ }), method(object({
10274
+ packageName: string().min(1),
10275
+ version: string().optional()
10276
+ }), UpdateFrameworkPackageResultSchema, {
10277
+ kind: "mutation",
10278
+ auth: "admin"
10338
10279
  }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
10339
10280
  kind: "mutation",
10340
10281
  auth: "admin"
@@ -10366,6 +10307,7 @@ var EventCategory = /* @__PURE__ */ ((EventCategory2) => {
10366
10307
  EventCategory2["SystemBoot"] = "system.boot";
10367
10308
  EventCategory2["SystemAddonsReady"] = "system.addons-ready";
10368
10309
  EventCategory2["SystemRestarting"] = "system.restarting";
10310
+ EventCategory2["SystemRestartCompleted"] = "system.restart-completed";
10369
10311
  EventCategory2["SystemReadyState"] = "system.ready-state";
10370
10312
  EventCategory2["AddonStarted"] = "addon.started";
10371
10313
  EventCategory2["AddonStopped"] = "addon.stopped";
@@ -10896,6 +10838,12 @@ Object.freeze({
10896
10838
  addonId: null,
10897
10839
  access: "view"
10898
10840
  },
10841
+ "addons.getLastRestart": {
10842
+ capName: "addons",
10843
+ capScope: "system",
10844
+ addonId: null,
10845
+ access: "view"
10846
+ },
10899
10847
  "addons.getLogs": {
10900
10848
  capName: "addons",
10901
10849
  capScope: "system",
@@ -10932,6 +10880,18 @@ Object.freeze({
10932
10880
  addonId: null,
10933
10881
  access: "view"
10934
10882
  },
10883
+ "addons.listCapabilityProviders": {
10884
+ capName: "addons",
10885
+ capScope: "system",
10886
+ addonId: null,
10887
+ access: "view"
10888
+ },
10889
+ "addons.listFrameworkPackages": {
10890
+ capName: "addons",
10891
+ capScope: "system",
10892
+ addonId: null,
10893
+ access: "view"
10894
+ },
10935
10895
  "addons.listPackages": {
10936
10896
  capName: "addons",
10937
10897
  capScope: "system",
@@ -11004,12 +10964,24 @@ Object.freeze({
11004
10964
  addonId: null,
11005
10965
  access: "create"
11006
10966
  },
10967
+ "addons.setCapabilityProviderEnabled": {
10968
+ capName: "addons",
10969
+ capScope: "system",
10970
+ addonId: null,
10971
+ access: "create"
10972
+ },
11007
10973
  "addons.uninstallPackage": {
11008
10974
  capName: "addons",
11009
10975
  capScope: "system",
11010
10976
  addonId: null,
11011
10977
  access: "delete"
11012
10978
  },
10979
+ "addons.updateFrameworkPackage": {
10980
+ capName: "addons",
10981
+ capScope: "system",
10982
+ addonId: null,
10983
+ access: "create"
10984
+ },
11013
10985
  "addons.updatePackage": {
11014
10986
  capName: "addons",
11015
10987
  capScope: "system",
@@ -11250,18 +11222,6 @@ Object.freeze({
11250
11222
  addonId: null,
11251
11223
  access: "view"
11252
11224
  },
11253
- "authentication.listProviders": {
11254
- capName: "authentication",
11255
- capScope: "system",
11256
- addonId: null,
11257
- access: "view"
11258
- },
11259
- "authentication.setProviderEnabled": {
11260
- capName: "authentication",
11261
- capScope: "system",
11262
- addonId: null,
11263
- access: "create"
11264
- },
11265
11225
  "authProvider.getLoginUrl": {
11266
11226
  capName: "auth-provider",
11267
11227
  capScope: "system",
@@ -12108,42 +12068,6 @@ Object.freeze({
12108
12068
  addonId: null,
12109
12069
  access: "create"
12110
12070
  },
12111
- "meshOrchestrator.joinProvider": {
12112
- capName: "mesh-orchestrator",
12113
- capScope: "system",
12114
- addonId: null,
12115
- access: "create"
12116
- },
12117
- "meshOrchestrator.leaveProvider": {
12118
- capName: "mesh-orchestrator",
12119
- capScope: "system",
12120
- addonId: null,
12121
- access: "create"
12122
- },
12123
- "meshOrchestrator.listProviderPeers": {
12124
- capName: "mesh-orchestrator",
12125
- capScope: "system",
12126
- addonId: null,
12127
- access: "view"
12128
- },
12129
- "meshOrchestrator.listProviders": {
12130
- capName: "mesh-orchestrator",
12131
- capScope: "system",
12132
- addonId: null,
12133
- access: "view"
12134
- },
12135
- "meshOrchestrator.logoutProvider": {
12136
- capName: "mesh-orchestrator",
12137
- capScope: "system",
12138
- addonId: null,
12139
- access: "create"
12140
- },
12141
- "meshOrchestrator.startLoginProvider": {
12142
- capName: "mesh-orchestrator",
12143
- capScope: "system",
12144
- addonId: null,
12145
- access: "create"
12146
- },
12147
12071
  "metricsProvider.collectSnapshot": {
12148
12072
  capName: "metrics-provider",
12149
12073
  capScope: "system",
@@ -13170,24 +13094,6 @@ Object.freeze({
13170
13094
  addonId: null,
13171
13095
  access: "create"
13172
13096
  },
13173
- "remoteAccess.listProviders": {
13174
- capName: "remote-access",
13175
- capScope: "system",
13176
- addonId: null,
13177
- access: "view"
13178
- },
13179
- "remoteAccess.startProvider": {
13180
- capName: "remote-access",
13181
- capScope: "system",
13182
- addonId: null,
13183
- access: "create"
13184
- },
13185
- "remoteAccess.stopProvider": {
13186
- capName: "remote-access",
13187
- capScope: "system",
13188
- addonId: null,
13189
- access: "create"
13190
- },
13191
13097
  "restreamer.getExposedResources": {
13192
13098
  capName: "restreamer",
13193
13099
  capScope: "system",
@@ -13746,24 +13652,6 @@ Object.freeze({
13746
13652
  addonId: null,
13747
13653
  access: "view"
13748
13654
  },
13749
- "turnOrchestrator.getAllServers": {
13750
- capName: "turn-orchestrator",
13751
- capScope: "system",
13752
- addonId: null,
13753
- access: "view"
13754
- },
13755
- "turnOrchestrator.listProviders": {
13756
- capName: "turn-orchestrator",
13757
- capScope: "system",
13758
- addonId: null,
13759
- access: "view"
13760
- },
13761
- "turnOrchestrator.setProviderEnabled": {
13762
- capName: "turn-orchestrator",
13763
- capScope: "system",
13764
- addonId: null,
13765
- access: "create"
13766
- },
13767
13655
  "turnProvider.getTurnServers": {
13768
13656
  capName: "turn-provider",
13769
13657
  capScope: "system",
@@ -71366,20 +71254,6 @@ var DEFAULT_CONFIG = {
71366
71254
  },
71367
71255
  exposed: []
71368
71256
  };
71369
- /**
71370
- * Module-federation page declarations — picked up by the
71371
- * `addon-pages-source` aggregator and surfaced on admin-ui's
71372
- * Integrations page (Configure button) once the federation bundle
71373
- * is built. See `src/page/HomeKitOverviewPage.tsx`.
71374
- */
71375
- var HOMEKIT_OVERVIEW_PAGES = [{
71376
- id: "export-hap",
71377
- label: "HomeKit Export",
71378
- icon: "home",
71379
- path: "/addon/export-hap",
71380
- remoteName: "addon_export_hap_page",
71381
- bundle: "remoteEntry.js"
71382
- }];
71383
71257
  var BANNED_PINCODES = new Set([
71384
71258
  "000-00-000",
71385
71259
  "111-11-111",
@@ -71456,10 +71330,13 @@ var ExportHapAddon = class extends BaseAddon {
71456
71330
  provider: {
71457
71331
  getStatus: async () => {
71458
71332
  const state = this.bridge?.getState() ?? null;
71333
+ const linkState = this.lastError ? "error" : state?.paired ? "linked" : "unlinked";
71334
+ const setup = this.buildSetupBlock();
71459
71335
  return {
71460
- linkState: this.lastError ? "error" : state?.paired ? "linked" : "unlinked",
71336
+ linkState,
71461
71337
  exposedDeviceCount: this.exposed.size,
71462
- ...this.lastError ? { error: this.lastError } : {}
71338
+ ...this.lastError ? { error: this.lastError } : {},
71339
+ ...setup ? { setup } : {}
71463
71340
  };
71464
71341
  },
71465
71342
  listSupportedDeviceKinds: async () => [...SUPPORTED_MAPPER_KINDS],
@@ -71477,12 +71354,6 @@ var ExportHapAddon = class extends BaseAddon {
71477
71354
  getDeviceLiveContribution: async () => null,
71478
71355
  applyDeviceSettingsPatch: (input) => this.applyDeviceSettingsPatch(input.deviceId, input.patch)
71479
71356
  }
71480
- }, {
71481
- capability: addonPagesSourceCapability,
71482
- provider: {
71483
- id: "export-hap",
71484
- listPages: () => HOMEKIT_OVERVIEW_PAGES
71485
- }
71486
71357
  }];
71487
71358
  }
71488
71359
  async onConfigChanged() {
@@ -71526,6 +71397,28 @@ var ExportHapAddon = class extends BaseAddon {
71526
71397
  this.ctx.logger.info("export-hap: generated bridge identity on first boot", { meta: { username: fresh.username } });
71527
71398
  return fresh;
71528
71399
  }
71400
+ /**
71401
+ * Build the generic `device-export` `setup` block surfaced via
71402
+ * `getStatus` and rendered by the shared `DeviceExportPanel`: the
71403
+ * `X-HM://…` setup URI as a scannable QR, the 8-digit setup code as
71404
+ * a copyable field, and a short pairing instruction. Returns `null`
71405
+ * until the bridge has booted and produced both values.
71406
+ */
71407
+ buildSetupBlock() {
71408
+ const state = this.bridge?.getState() ?? null;
71409
+ const setupCode = state?.identity.pincode || this.config.identity.pincode;
71410
+ const setupUri = state?.setupURI ?? "";
71411
+ if (!setupCode) return null;
71412
+ const paired = state?.paired === true;
71413
+ return {
71414
+ ...setupUri ? { qr: setupUri } : {},
71415
+ fields: [{
71416
+ label: "Setup code",
71417
+ value: setupCode
71418
+ }],
71419
+ note: paired ? "This bridge is currently paired. To re-pair, scan the QR in the iOS Home app (+ → Add Accessory) or enter the setup code manually." : "Open the iOS Home app, tap + → Add Accessory, then scan this QR — or enter the setup code manually."
71420
+ };
71421
+ }
71529
71422
  async exposeDevice(deviceId, capabilities) {
71530
71423
  if (this.exposed.has(deviceId)) {
71531
71424
  this.ctx.logger.debug("export-hap: device already exposed — refreshing capabilities", { meta: { deviceId } });
@@ -71619,15 +71512,9 @@ var ExportHapAddon = class extends BaseAddon {
71619
71512
  return this.schema({ sections: [{
71620
71513
  id: "export-hap",
71621
71514
  title: "HomeKit Export",
71622
- description: "Publishes a HomeKit bridge. After the addon boots, open the iOS Home app, tap +, then \"Add Accessory\", then scan the QR code in the addon page (or type the setup code shown there). After pairing, mark individual devices as \"Expose to HomeKit\" on each device's settings page.",
71515
+ description: "Publishes a HomeKit bridge. After the addon boots, scan the pairing QR (or enter the setup code) from the Exported devices panel in the iOS Home app. After pairing, mark individual devices as \"Expose to HomeKit\" on each device's settings page.",
71623
71516
  columns: 1,
71624
71517
  fields: [
71625
- {
71626
- type: "info",
71627
- key: "__pair-instructions",
71628
- label: "Pairing",
71629
- content: "Setup code + QR are surfaced via the \"HomeKit Export\" integration page once the bridge has booted. Changing the bridge name or port requires a restart of the addon — handled automatically when you save."
71630
- },
71631
71518
  this.field({
71632
71519
  type: "text",
71633
71520
  key: "bridgeName",