@camstack/addon-pipeline 0.1.12 → 0.1.14

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 (46) hide show
  1. package/dist/audio-analyzer/index.js +1 -1
  2. package/dist/audio-analyzer/index.mjs +1 -1
  3. package/dist/audio-codec-nodeav/index.js +1 -1
  4. package/dist/audio-codec-nodeav/index.mjs +1 -1
  5. package/dist/decoder-nodeav/index.js +1 -1
  6. package/dist/decoder-nodeav/index.mjs +1 -1
  7. package/dist/detection-pipeline/index.js +1 -1
  8. package/dist/detection-pipeline/index.mjs +1 -1
  9. package/dist/{index-BhOycEVH.js → index-CFPKrb2Y.js} +197 -236
  10. package/dist/index-CFPKrb2Y.js.map +1 -0
  11. package/dist/{index-FxfFGsiL.mjs → index-DKh0uEve.mjs} +197 -236
  12. package/dist/index-DKh0uEve.mjs.map +1 -0
  13. package/dist/motion-wasm/index.js +1 -1
  14. package/dist/motion-wasm/index.mjs +1 -1
  15. package/dist/pipeline-runner/index.js +1 -1
  16. package/dist/pipeline-runner/index.mjs +1 -1
  17. package/dist/stream-broker/@mf-types.zip +0 -0
  18. package/dist/stream-broker/__mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.mjs-CpCK52pE.mjs +19 -0
  19. package/dist/stream-broker/__mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.mjs-BN3K4dM8.mjs +20 -0
  20. package/dist/stream-broker/_stub.js +1 -1
  21. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-Czwg8GUO.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-CqeKw-Ig.mjs} +6 -6
  22. package/dist/stream-broker/{hostInit-fG6oFw4t.mjs → hostInit-DkjoXTMb.mjs} +6 -6
  23. package/dist/stream-broker/index-BP0-1QYT.mjs +13140 -0
  24. package/dist/stream-broker/{index-l13fl8lu.mjs → index-DKercbDS.mjs} +7065 -5705
  25. package/dist/stream-broker/{index-BOmtakNy.mjs → index-lmXLeXy8.mjs} +1 -1
  26. package/dist/stream-broker/index.js +4 -4
  27. package/dist/stream-broker/index.js.map +1 -1
  28. package/dist/stream-broker/index.mjs +4 -4
  29. package/dist/stream-broker/index.mjs.map +1 -1
  30. package/dist/stream-broker/remoteEntry.js +1 -1
  31. package/dist/stream-broker/schemas-ChN4Ih0h.mjs +3584 -0
  32. package/package.json +1 -1
  33. package/python/postprocessors/__pycache__/__init__.cpython-312.pyc +0 -0
  34. package/python/postprocessors/__pycache__/arcface.cpython-312.pyc +0 -0
  35. package/python/postprocessors/__pycache__/ctc.cpython-312.pyc +0 -0
  36. package/python/postprocessors/__pycache__/saliency.cpython-312.pyc +0 -0
  37. package/python/postprocessors/__pycache__/scrfd.cpython-312.pyc +0 -0
  38. package/python/postprocessors/__pycache__/softmax.cpython-312.pyc +0 -0
  39. package/python/postprocessors/__pycache__/yamnet.cpython-312.pyc +0 -0
  40. package/python/postprocessors/__pycache__/yolo.cpython-312.pyc +0 -0
  41. package/python/postprocessors/__pycache__/yolo_seg.cpython-312.pyc +0 -0
  42. package/dist/index-BhOycEVH.js.map +0 -1
  43. package/dist/index-FxfFGsiL.mjs.map +0 -1
  44. package/dist/stream-broker/__mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.mjs-ChoHjdk6.mjs +0 -17
  45. package/dist/stream-broker/__mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.mjs-BvJPhiY_.mjs +0 -20
  46. package/dist/stream-broker/index-Bpv0NSqI.mjs +0 -16780
@@ -22,7 +22,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
22
22
  mod
23
23
  ));
24
24
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
25
- const index = require("../index-BhOycEVH.js");
25
+ const index = require("../index-CFPKrb2Y.js");
26
26
  const path = require("node:path");
27
27
  const fs = require("node:fs");
28
28
  const core = require("@camstack/core");
@@ -1,4 +1,4 @@
1
- import { e as errMsg, x as HF_BASE_URL, B as BaseAddon, y as DEFAULT_AUDIO_ANALYZER_CONFIG, z as AUDIO_BACKEND_CHOICES, m as hydrateSchema, F as audioAnalyzerCapability, G as audioAnalysisCapability, I as mapAudioLabelToMacro } from "../index-FxfFGsiL.mjs";
1
+ import { e as errMsg, x as HF_BASE_URL, B as BaseAddon, y as DEFAULT_AUDIO_ANALYZER_CONFIG, z as AUDIO_BACKEND_CHOICES, m as hydrateSchema, F as audioAnalyzerCapability, G as audioAnalysisCapability, I as mapAudioLabelToMacro } from "../index-DKh0uEve.mjs";
2
2
  import * as path from "node:path";
3
3
  import * as fs from "node:fs";
4
4
  import { downloadFile } from "@camstack/core";
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
3
  const crypto = require("node:crypto");
4
- const index = require("../index-BhOycEVH.js");
4
+ const index = require("../index-CFPKrb2Y.js");
5
5
  const nodeAv = require("node-av");
6
6
  const CODEC_ID_BY_NAME = {
7
7
  aac: nodeAv.AV_CODEC_ID_AAC,
@@ -1,5 +1,5 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { B as BaseAddon, w as audioCodecCapability, e as errMsg } from "../index-FxfFGsiL.mjs";
2
+ import { B as BaseAddon, w as audioCodecCapability, e as errMsg } from "../index-DKh0uEve.mjs";
3
3
  import { Codec, CodecContext, AV_SAMPLE_FMT_FLT, SoftwareResampleContext, Packet, Frame, AVERROR_EAGAIN, AVERROR_EOF, AV_CODEC_ID_PCM_MULAW, AV_CODEC_ID_PCM_ALAW, AV_CODEC_ID_OPUS, AV_CODEC_ID_AAC_LATM, AV_CODEC_ID_AAC, AV_CH_LAYOUT_MONO, AV_CHANNEL_ORDER_NATIVE, AV_CH_LAYOUT_STEREO, AV_SAMPLE_FMT_S16 } from "node-av";
4
4
  const CODEC_ID_BY_NAME = {
5
5
  aac: AV_CODEC_ID_AAC,
@@ -23,7 +23,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
23
23
  ));
24
24
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
25
25
  const crypto = require("node:crypto");
26
- const index = require("../index-BhOycEVH.js");
26
+ const index = require("../index-CFPKrb2Y.js");
27
27
  function backendToHwDeviceConst(backend, consts) {
28
28
  switch (backend) {
29
29
  case "videotoolbox":
@@ -1,5 +1,5 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { e as errMsg, B as BaseAddon, u as DEFAULT_DECODER_HWACCEL_CONFIG, H as HWACCEL_OPTIONS, v as decoderCapability, R as RingBuffer } from "../index-FxfFGsiL.mjs";
2
+ import { e as errMsg, B as BaseAddon, u as DEFAULT_DECODER_HWACCEL_CONFIG, H as HWACCEL_OPTIONS, v as decoderCapability, R as RingBuffer } from "../index-DKh0uEve.mjs";
3
3
  function backendToHwDeviceConst(backend, consts) {
4
4
  switch (backend) {
5
5
  case "videotoolbox":
@@ -22,7 +22,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
22
22
  mod
23
23
  ));
24
24
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
25
- const index = require("../index-BhOycEVH.js");
25
+ const index = require("../index-CFPKrb2Y.js");
26
26
  const fs = require("node:fs");
27
27
  const path = require("node:path");
28
28
  const os = require("node:os");
@@ -1,4 +1,4 @@
1
- import { h as hfModelUrl, C as COCO_TO_MACRO, g as COCO_80_LABELS, A as AUDIO_MACRO_LABELS, e as errMsg, f as createEvent, E as EventCategory, i as evaluateZoneRules, Y as YAMNET_TO_MACRO, j as APPLE_SA_TO_MACRO, k as parseJsonUnknown, B as BaseAddon, m as hydrateSchema, q as pipelineExecutorCapability, r as detectionPipelineCapability } from "../index-FxfFGsiL.mjs";
1
+ import { h as hfModelUrl, C as COCO_TO_MACRO, g as COCO_80_LABELS, A as AUDIO_MACRO_LABELS, e as errMsg, f as createEvent, E as EventCategory, i as evaluateZoneRules, Y as YAMNET_TO_MACRO, j as APPLE_SA_TO_MACRO, k as parseJsonUnknown, B as BaseAddon, m as hydrateSchema, q as pipelineExecutorCapability, r as detectionPipelineCapability } from "../index-DKh0uEve.mjs";
2
2
  import * as fs from "node:fs";
3
3
  import * as path from "node:path";
4
4
  import * as os from "node:os";
@@ -8550,10 +8550,30 @@ const StatusSchema = object({
8550
8550
  }
8551
8551
  });
8552
8552
  const LinkStateSchema = _enum(["unlinked", "linked", "error"]);
8553
+ const ExportSetupFieldSchema = object({
8554
+ label: string(),
8555
+ value: string(),
8556
+ /** Mask the value by default + render a reveal toggle (client id, secrets). */
8557
+ secret: boolean().optional()
8558
+ });
8559
+ const ExportSetupSchema = object({
8560
+ /** A string to render as a scannable QR — HAP `X-HM://…` URI, a pairing URL, etc. Omitted when there's nothing to scan. */
8561
+ qr: string().optional(),
8562
+ /** Label/value rows shown with a copy button (HAP setup code, OAuth URLs, client id, linked-account count, …). */
8563
+ fields: array(ExportSetupFieldSchema).readonly().optional(),
8564
+ /** Free-form operator instructions rendered above the fields. */
8565
+ note: string().optional()
8566
+ });
8553
8567
  const DeviceExportStatusSchema = object({
8554
8568
  linkState: LinkStateSchema,
8555
8569
  exposedDeviceCount: number(),
8556
- error: string().optional()
8570
+ error: string().optional(),
8571
+ /**
8572
+ * Optional pairing/account info the panel renders in a generic
8573
+ * "Setup" section. Addon-agnostic — the addon id identifies the
8574
+ * export target, never an `ecosystem` key here.
8575
+ */
8576
+ setup: ExportSetupSchema.optional()
8557
8577
  });
8558
8578
  const DeviceKindSchema = string();
8559
8579
  const ExposedDeviceSchema = object({
@@ -10277,51 +10297,6 @@ const AuthResultSchema = object({
10277
10297
  validateToken: method(object({ token: string() }), AuthResultSchema.nullable())
10278
10298
  }
10279
10299
  });
10280
- const AuthProviderInfoSchema = object({
10281
- /** Stable id matching the addon id (used for `getLoginUrl({addonId,…})`). */
10282
- addonId: string(),
10283
- /**
10284
- * Per-instance id when one addon registers multiple "logical"
10285
- * providers (e.g. OIDC with Google + Microsoft + custom). The login
10286
- * URL becomes `/addon/${addonId}/${instanceId}/start` — handler reads
10287
- * `:instanceId` from the route. Empty/unset means the addon is a
10288
- * single-instance provider; the URL is `/addon/${addonId}/start`.
10289
- */
10290
- instanceId: string().optional(),
10291
- /** Display label shown on the login button + admin row. */
10292
- displayName: string(),
10293
- /** Optional iconography hint (lucide-react icon name OR emoji). */
10294
- icon: string().optional(),
10295
- /** When true, the provider exposes a redirect-based login flow
10296
- * (`getLoginUrl` returns a URL the browser navigates to). */
10297
- hasRedirectFlow: boolean(),
10298
- /** When true, the provider exposes a credential-form login flow
10299
- * (`validateCredentials` accepts username + password). */
10300
- hasCredentialFlow: boolean(),
10301
- /** Provider kind, drives admin-UI hint dispatch (oidc / saml / totp / …). */
10302
- kind: string().optional(),
10303
- /** Operator-facing status string (e.g. "Connected to https://login.acme.com"). */
10304
- status: string().optional(),
10305
- /** When false, the provider is registered but disabled by config; the
10306
- * UI surfaces it as inactive without enumerating it for login. */
10307
- enabled: boolean()
10308
- });
10309
- ({
10310
- methods: {
10311
- /** All registered auth providers, both enabled and disabled. */
10312
- listProviders: method(_void(), array(AuthProviderInfoSchema).readonly()),
10313
- /**
10314
- * Toggle a provider's enabled flag. Disabled providers stay
10315
- * registered but aren't surfaced on the login page. The orchestrator
10316
- * persists the state in `addon-settings` so it survives restarts.
10317
- */
10318
- setProviderEnabled: method(
10319
- object({ addonId: string(), enabled: boolean() }),
10320
- object({ success: literal(true) }),
10321
- { kind: "mutation", auth: "admin" }
10322
- )
10323
- }
10324
- });
10325
10300
  const NetworkEndpointSchema = object({
10326
10301
  url: string(),
10327
10302
  hostname: string(),
@@ -10353,55 +10328,13 @@ const NetworkEndpointEntrySchema = NetworkEndpointSchema.extend({
10353
10328
  getEndpoint: method(_void(), NetworkEndpointSchema.nullable()),
10354
10329
  getStatus: method(_void(), NetworkAccessStatusSchema),
10355
10330
  /**
10356
- * Enumerate every active ingress entry. Default implementation (when
10357
- * the provider omits this method) is derived from `getEndpoint()` —
10358
- * see the remote-access orchestrator for the fallback path.
10331
+ * Enumerate every active ingress entry. Providers that expose only a
10332
+ * single endpoint may omit this method; callers fall back to
10333
+ * `getEndpoint()` in that case.
10359
10334
  */
10360
10335
  listEndpoints: method(_void(), array(NetworkEndpointEntrySchema).readonly())
10361
10336
  }
10362
10337
  });
10363
- const RemoteAccessEndpointSchema = object({
10364
- url: string(),
10365
- hostname: string(),
10366
- port: number(),
10367
- protocol: _enum(["http", "https"])
10368
- });
10369
- const RemoteAccessProviderInfoSchema = object({
10370
- /** Stable id matching the addon id. */
10371
- addonId: string(),
10372
- /** Display label shown on the admin row — sourced from the addon manifest. */
10373
- displayName: string(),
10374
- /** When false, the provider is registered but disabled. */
10375
- enabled: boolean(),
10376
- /** True when the underlying tunnel/connection is up. */
10377
- connected: boolean(),
10378
- /** Public-facing endpoint, when connected. Null otherwise. */
10379
- endpoint: RemoteAccessEndpointSchema.nullable(),
10380
- /** Last error message (when connected=false), if available. */
10381
- error: string().optional()
10382
- });
10383
- ({
10384
- methods: {
10385
- /** All registered remote-access providers + their live status. */
10386
- listProviders: method(_void(), array(RemoteAccessProviderInfoSchema).readonly()),
10387
- /**
10388
- * Start a specific provider's tunnel. Per-provider config still
10389
- * lives on the addon's settings panel; this is just the on/off
10390
- * trigger so the admin UI can manage the lifecycle from one place.
10391
- */
10392
- startProvider: method(
10393
- object({ addonId: string() }),
10394
- RemoteAccessEndpointSchema,
10395
- { kind: "mutation", auth: "admin" }
10396
- ),
10397
- /** Stop a specific provider's tunnel (idempotent on already-stopped). */
10398
- stopProvider: method(
10399
- object({ addonId: string() }),
10400
- object({ success: literal(true) }),
10401
- { kind: "mutation", auth: "admin" }
10402
- )
10403
- }
10404
- });
10405
10338
  const TurnServerSchema = object({
10406
10339
  /** Single URL or list of URLs (e.g. "turn:turn.example.com:3478?transport=udp"). */
10407
10340
  urls: union([string(), array(string())]),
@@ -10421,45 +10354,6 @@ const TurnServerSchema = object({
10421
10354
  )
10422
10355
  }
10423
10356
  });
10424
- const TurnProviderInfoSchema = object({
10425
- /** Stable id matching the addon id. */
10426
- addonId: string(),
10427
- /** Display label shown on the admin row — sourced from the addon manifest. */
10428
- displayName: string(),
10429
- /** When false, the provider is registered but disabled. */
10430
- enabled: boolean(),
10431
- /** Number of servers this provider is currently exposing. */
10432
- serverCount: number(),
10433
- /**
10434
- * Flat list of every TURN/STUN URL this provider currently exposes.
10435
- * One row per URL (multi-URL ICE server entries are flattened). The
10436
- * admin UI shows this in a compact per-provider list so operators
10437
- * can verify what's actually being negotiated without having to dig
10438
- * into the combined `getAllServers` output.
10439
- */
10440
- urls: array(string()).readonly(),
10441
- /** Last fetch error (when serverCount=0 due to API failure), if any. */
10442
- error: string().optional()
10443
- });
10444
- ({
10445
- methods: {
10446
- /** All registered TURN providers + per-provider stats. */
10447
- listProviders: method(_void(), array(TurnProviderInfoSchema).readonly()),
10448
- /**
10449
- * Combined list of TURN/STUN servers from all ENABLED providers.
10450
- * Consumed by the WebRTC layer at session-creation time —
10451
- * implementations may fetch fresh short-lived credentials each
10452
- * call (e.g. Cloudflare API), so consumers SHOULD call per-session.
10453
- */
10454
- getAllServers: method(_void(), array(TurnServerSchema).readonly()),
10455
- /** Toggle a provider's enabled flag. */
10456
- setProviderEnabled: method(
10457
- object({ addonId: string(), enabled: boolean() }),
10458
- object({ success: literal(true) }),
10459
- { kind: "mutation", auth: "admin" }
10460
- )
10461
- }
10462
- });
10463
10357
  const SnapshotImageSchema = object({
10464
10358
  base64: string(),
10465
10359
  contentType: string()
@@ -11932,7 +11826,7 @@ const AllowedAddressesSchema = object({
11932
11826
  )
11933
11827
  }
11934
11828
  });
11935
- const MeshEndpointSchema$1 = object({
11829
+ const MeshEndpointSchema = object({
11936
11830
  /** Stable identifier within the provider (e.g. `mesh-ipv4`, `magicdns`, `funnel`). */
11937
11831
  id: string(),
11938
11832
  /** Operator-facing label (e.g. "Mesh IPv4", "MagicDNS"). */
@@ -12005,7 +11899,7 @@ const MeshStatusSchema = object({
12005
11899
  /** Number of peers visible to this host (excluding self). */
12006
11900
  peerCount: number(),
12007
11901
  /** Every endpoint this provider exposes for the current host. */
12008
- endpoints: array(MeshEndpointSchema$1).readonly(),
11902
+ endpoints: array(MeshEndpointSchema).readonly(),
12009
11903
  /** Last error from the daemon, when not joined. */
12010
11904
  error: string().optional(),
12011
11905
  // ── Account / tenant identity (generic across providers) ────────
@@ -12038,7 +11932,25 @@ const MeshStatusSchema = object({
12038
11932
  * doesn't rotate keys for the bound host. Operator-facing surface
12039
11933
  * for "your access expires on …" banners.
12040
11934
  */
12041
- keyExpiry: number().nullable()
11935
+ keyExpiry: number().nullable(),
11936
+ // ── Onboard-daemon handoff (Tailscale, generic slot) ────────────
11937
+ /**
11938
+ * When the provider runs its OWN mesh daemon (e.g. the Tailscale
11939
+ * client addon in `onboard` mode spawns a private `tailscaled`),
11940
+ * this carries the local control-socket path. Companion addons that
11941
+ * must drive the SAME daemon — chiefly `tailscale-ingress` for
11942
+ * Serve/Funnel — read it to point their CLI at the right socket
11943
+ * instead of the system default. Empty when the provider uses the
11944
+ * host's system daemon (or doesn't have the concept).
11945
+ */
11946
+ daemonSocket: string().optional(),
11947
+ /**
11948
+ * Path to the mesh CLI binary the provider downloaded for onboard
11949
+ * mode. Companion addons reuse it so they don't need a system
11950
+ * install when the operator chose a fully self-contained mesh.
11951
+ * Empty in host mode.
11952
+ */
11953
+ daemonCliPath: string().optional()
12042
11954
  });
12043
11955
  ({
12044
11956
  methods: {
@@ -12150,105 +12062,6 @@ const MeshStatusSchema = object({
12150
12062
  // tabs driven by this cap.
12151
12063
  }
12152
12064
  });
12153
- const MeshEndpointSchema = object({
12154
- id: string(),
12155
- label: string(),
12156
- scope: _enum(["mesh", "public"]),
12157
- url: string(),
12158
- hostname: string(),
12159
- port: number(),
12160
- protocol: _enum(["http", "https"])
12161
- });
12162
- const MeshProviderInfoSchema = object({
12163
- /** Stable id matching the addon id. */
12164
- addonId: string(),
12165
- /** Display label shown on the admin row — sourced from the addon manifest. */
12166
- displayName: string(),
12167
- /** True when the host is joined to this provider's mesh. */
12168
- joined: boolean(),
12169
- /** Local mesh IP (empty when not joined). */
12170
- meshIp: string(),
12171
- /** MagicDNS / mesh hostname (empty when not configured). */
12172
- magicDnsHostname: string(),
12173
- /** Peer count (excluding self). */
12174
- peerCount: number(),
12175
- /** Active endpoints (mesh IP + MagicDNS + optional public Funnel). */
12176
- endpoints: array(MeshEndpointSchema).readonly(),
12177
- /** Last error reported by the provider. */
12178
- error: string().optional(),
12179
- // ── Generic identity fields mirrored from MeshStatus ─────────────
12180
- /** Tenant / tailnet / network display name. Empty pre-join. */
12181
- tenantName: string(),
12182
- /** Mesh DNS suffix (e.g. tailXXXX.ts.net). Empty when not configured. */
12183
- magicDnsSuffix: string(),
12184
- /** Authenticated user / account login. Null for token-only providers. */
12185
- userLogin: string().nullable(),
12186
- /** Provider control-plane URL. */
12187
- controlPlaneUrl: string(),
12188
- /** Machine-key expiry (epoch ms). Null when keys don't rotate. */
12189
- keyExpiry: number().nullable()
12190
- });
12191
- ({
12192
- methods: {
12193
- /** All registered mesh-network providers + live status. */
12194
- listProviders: method(_void(), array(MeshProviderInfoSchema).readonly()),
12195
- /**
12196
- * Join the mesh of a specific provider. Per-provider config still
12197
- * lives on its settings panel; the orchestrator forwards.
12198
- */
12199
- joinProvider: method(
12200
- object({
12201
- addonId: string(),
12202
- authKey: string().min(8),
12203
- hostname: string().optional()
12204
- }),
12205
- object({ joined: literal(true) }),
12206
- { kind: "mutation" }
12207
- ),
12208
- leaveProvider: method(
12209
- object({ addonId: string() }),
12210
- object({ success: literal(true) }),
12211
- { kind: "mutation" }
12212
- ),
12213
- /**
12214
- * Browser-redirect login flow. Forwards to the named provider's
12215
- * `mesh-network.startLogin` and returns the URL the daemon
12216
- * prints. UI opens it in a new tab, then polls `listProviders`
12217
- * for `joined: true`.
12218
- */
12219
- startLoginProvider: method(
12220
- object({
12221
- addonId: string(),
12222
- hostname: string().optional()
12223
- }),
12224
- object({ loginUrl: string() }),
12225
- { kind: "mutation" }
12226
- ),
12227
- /**
12228
- * Sign out of the provider's account entirely (`mesh-network.logout`).
12229
- * Distinct from `leaveProvider` which only takes the host off-mesh;
12230
- * `logoutProvider` wipes credentials so the next start requires a
12231
- * fresh login.
12232
- */
12233
- logoutProvider: method(
12234
- object({ addonId: string() }),
12235
- object({ loggedOut: literal(true) }),
12236
- { kind: "mutation" }
12237
- ),
12238
- /**
12239
- * Per-provider peer list. Forwards to `mesh-network.listPeers` on
12240
- * the addressed provider. Separate from `listProviders` because
12241
- * peer payloads can be large on a heavily-populated tailnet —
12242
- * fetch only when the operator opens the Peers tab.
12243
- */
12244
- listProviderPeers: method(
12245
- object({ addonId: string() }),
12246
- object({
12247
- peers: array(MeshPeerSchema).readonly()
12248
- })
12249
- )
12250
- }
12251
- });
12252
12065
  const MethodAccessSchema = _enum(["view", "create", "delete"]);
12253
12066
  const AllowedProviderSchema = union([literal("*"), array(string())]);
12254
12067
  const AllowedDevicesSchema = record(string(), union([literal("*"), array(string())]));
@@ -12924,6 +12737,21 @@ const AddonAutoUpdateSchema = ChannelWithInheritSchema;
12924
12737
  const RestartAddonResultSchema = unknown();
12925
12738
  const InstallPackageResultSchema = unknown();
12926
12739
  const ReloadPackagesResultSchema = unknown();
12740
+ const UpdateFrameworkPackageResultSchema = object({
12741
+ packageName: string(),
12742
+ fromVersion: string(),
12743
+ toVersion: string(),
12744
+ /** Ms-epoch the server scheduled its self-restart. */
12745
+ restartingAt: number()
12746
+ });
12747
+ const FrameworkPackageStatusSchema = object({
12748
+ packageName: string(),
12749
+ currentVersion: string(),
12750
+ latestVersion: string().nullable(),
12751
+ hasUpdate: boolean(),
12752
+ /** Optional manifest description for the row tooltip. */
12753
+ description: string().optional()
12754
+ });
12927
12755
  const LogStreamEntrySchema = object({
12928
12756
  timestamp: string(),
12929
12757
  level: string(),
@@ -12983,13 +12811,29 @@ const CustomActionInputSchema = object({
12983
12811
  object({ query: string().optional() }),
12984
12812
  array(SearchResultSchema)
12985
12813
  ),
12814
+ /**
12815
+ * Available package updates for a node. `nodeId` omitted (or
12816
+ * `'hub'`) checks the hub's own installed packages; an agent
12817
+ * `nodeId` checks that agent's installed roster against npm
12818
+ * (the hub does the npm lookups + diff — agents stay npm-free).
12819
+ */
12986
12820
  listUpdates: method(
12987
- _void(),
12821
+ object({ nodeId: string().optional() }),
12988
12822
  array(PackageUpdateSchema).readonly(),
12989
12823
  { auth: "admin" }
12990
12824
  ),
12825
+ /**
12826
+ * Update one package on a node. `nodeId` omitted (or `'hub'`)
12827
+ * installs on the hub via npm; an agent `nodeId` makes the hub
12828
+ * pack the resolved version and push the tarball to that agent
12829
+ * (`$agent.deploy` + `$agent.reload`) — agents need no npm runtime.
12830
+ */
12991
12831
  updatePackage: method(
12992
- object({ name: string().min(1), version: string().optional() }),
12832
+ object({
12833
+ name: string().min(1),
12834
+ version: string().optional(),
12835
+ nodeId: string().optional()
12836
+ }),
12993
12837
  unknown(),
12994
12838
  { kind: "mutation", auth: "admin" }
12995
12839
  ),
@@ -13010,12 +12854,128 @@ const CustomActionInputSchema = object({
13010
12854
  object({ rolledBackTo: string().nullable() }),
13011
12855
  { kind: "mutation", auth: "admin" }
13012
12856
  ),
13013
- forceRefresh: method(_void(), unknown(), { kind: "mutation", auth: "admin" }),
12857
+ /** Re-check updates for a node, bypassing any cache. `nodeId`
12858
+ * omitted (or `'hub'`) refreshes the hub; an agent `nodeId`
12859
+ * re-checks that agent's roster. */
12860
+ forceRefresh: method(
12861
+ object({ nodeId: string().optional() }),
12862
+ unknown(),
12863
+ { kind: "mutation", auth: "admin" }
12864
+ ),
13014
12865
  restartServer: method(
13015
12866
  object({ confirm: literal(true) }),
13016
12867
  unknown(),
13017
12868
  { kind: "mutation", auth: "admin" }
13018
12869
  ),
12870
+ /**
12871
+ * Most-recent restart marker (kind / packageName / from→to versions
12872
+ * / requestedBy / requestedAt). Returns `null` when this process
12873
+ * didn't boot from a tracked restart, or when the
12874
+ * post-boot retention window (5 min) has elapsed.
12875
+ *
12876
+ * Drives the admin-UI reconnect overlay's success toast — the
12877
+ * `system.restart-completed` event itself is fired before the
12878
+ * client has time to re-subscribe, so the client queries this on
12879
+ * first reconnect instead.
12880
+ */
12881
+ getLastRestart: method(
12882
+ _void(),
12883
+ object({
12884
+ kind: _enum(["framework-update", "manual", "system"]),
12885
+ packageName: string().optional(),
12886
+ fromVersion: string().optional(),
12887
+ toVersion: string().optional(),
12888
+ requestedBy: string().optional(),
12889
+ requestedAt: number()
12890
+ }).nullable(),
12891
+ { auth: "admin" }
12892
+ ),
12893
+ /**
12894
+ * Snapshot of the framework packages installed under the hub's
12895
+ * `<appRoot>/node_modules/`. Each row carries the currently
12896
+ * installed version and (best-effort) the latest version
12897
+ * available on npm. Drives the admin-UI "System packages" panel.
12898
+ *
12899
+ * Spec: docs/superpowers/specs/2026-05-14-framework-live-update-design.md
12900
+ */
12901
+ listFrameworkPackages: method(
12902
+ _void(),
12903
+ array(FrameworkPackageStatusSchema).readonly(),
12904
+ { auth: "admin" }
12905
+ ),
12906
+ /**
12907
+ * Cluster-wide capability-provider discovery. Returns the list of
12908
+ * `{ addonId, mode, isActive }` tuples for whatever addon(s)
12909
+ * currently provide the requested capability across the cluster.
12910
+ *
12911
+ * Why this lives on `addons` (and not on a `capabilities` cap of
12912
+ * its own): the hub's main-process `CapabilityRegistry` already
12913
+ * aggregates registrations from every forked group-runner and
12914
+ * remote agent via Moleculer event propagation — there's no
12915
+ * cross-process registry mirror to build, just an introspection
12916
+ * shim.
12917
+ *
12918
+ * Use this from addon code when you need to know whether another
12919
+ * addon has registered a specific cap (e.g. `tailscale-ingress`
12920
+ * checking `tailscale-client` is up before calling `tailscale
12921
+ * serve`). Don't reach for `ctx.capabilities.getCollectionEntries`
12922
+ * — that reads the LOCAL registry of the calling addon's group
12923
+ * runner and never sees providers in other processes. See
12924
+ * `CLAUDE.md` → Critical rules → ctx.api vs ctx.capabilities.
12925
+ */
12926
+ listCapabilityProviders: method(
12927
+ object({ capName: string().min(1) }),
12928
+ array(object({
12929
+ addonId: string(),
12930
+ mode: _enum(["singleton", "collection"]),
12931
+ isActive: boolean()
12932
+ })).readonly()
12933
+ ),
12934
+ /**
12935
+ * Toggle a single collection-cap provider on/off. Generic write-side
12936
+ * counterpart of `listCapabilityProviders` — drives the per-provider
12937
+ * Enable/Disable affordance in admin pages (TURN servers, etc.)
12938
+ * without needing a bespoke orchestrator cap.
12939
+ *
12940
+ * Reaches the hub's `CapabilityRegistry` directly:
12941
+ * `enableCollectionProvider` / `disableCollectionProvider` flip the
12942
+ * registry-level `disabledProviders` set. `getCollectionEntries`
12943
+ * already filters disabled providers out, so a disabled provider
12944
+ * drops out of every collection aggregate immediately. Only valid
12945
+ * for `mode: 'collection'` caps — the registry no-ops + warns for
12946
+ * singletons.
12947
+ */
12948
+ setCapabilityProviderEnabled: method(
12949
+ object({
12950
+ capName: string().min(1),
12951
+ addonId: string().min(1),
12952
+ enabled: boolean()
12953
+ }),
12954
+ object({ success: literal(true) }),
12955
+ { kind: "mutation", auth: "admin" }
12956
+ ),
12957
+ /**
12958
+ * Live-update one of the framework packages marked
12959
+ * `camstack.system: true` (`@camstack/types|kernel|core|sdk|ui-library`).
12960
+ * Runs `npm install --prefix <appRoot> <name>@<version> --no-save`,
12961
+ * writes a `.restart-pending` marker, emits `system.restarting`
12962
+ * and schedules a graceful process exit. The supervisor (Docker /
12963
+ * Electron / systemd) brings the hub back up; on first boot after
12964
+ * the restart the marker fires `system.restart-completed`.
12965
+ *
12966
+ * `version` defaults to `'latest'`. The allow-list of valid
12967
+ * `packageName` values is enforced server-side.
12968
+ *
12969
+ * Spec: docs/superpowers/specs/2026-05-14-framework-live-update-design.md
12970
+ */
12971
+ updateFrameworkPackage: method(
12972
+ object({
12973
+ packageName: string().min(1),
12974
+ version: string().optional()
12975
+ }),
12976
+ UpdateFrameworkPackageResultSchema,
12977
+ { kind: "mutation", auth: "admin" }
12978
+ ),
13019
12979
  getVersions: method(
13020
12980
  object({ name: string() }),
13021
12981
  array(PackageVersionInfoSchema).readonly()
@@ -13086,6 +13046,7 @@ var EventCategory = /* @__PURE__ */ ((EventCategory2) => {
13086
13046
  EventCategory2["SystemBoot"] = "system.boot";
13087
13047
  EventCategory2["SystemAddonsReady"] = "system.addons-ready";
13088
13048
  EventCategory2["SystemRestarting"] = "system.restarting";
13049
+ EventCategory2["SystemRestartCompleted"] = "system.restart-completed";
13089
13050
  EventCategory2["SystemReadyState"] = "system.ready-state";
13090
13051
  EventCategory2["AddonStarted"] = "addon.started";
13091
13052
  EventCategory2["AddonStopped"] = "addon.stopped";
@@ -13864,4 +13825,4 @@ exports.pipelineRunnerCapability = pipelineRunnerCapability;
13864
13825
  exports.streamBrokerCapability = streamBrokerCapability;
13865
13826
  exports.string = string;
13866
13827
  exports.webrtcSessionCapability = webrtcSessionCapability;
13867
- //# sourceMappingURL=index-BhOycEVH.js.map
13828
+ //# sourceMappingURL=index-CFPKrb2Y.js.map