@camstack/addon-post-analysis 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 (33) hide show
  1. package/dist/embedding-encoder/index.js +1 -1
  2. package/dist/embedding-encoder/index.mjs +1 -1
  3. package/dist/enrichment-engine/index.js +1 -1
  4. package/dist/enrichment-engine/index.mjs +1 -1
  5. package/dist/{index-BJKSB953.js → index-DNpNyDJi.js} +197 -236
  6. package/dist/index-DNpNyDJi.js.map +1 -0
  7. package/dist/{index-BThK2F-p.mjs → index-tm6O4bWa.mjs} +197 -236
  8. package/dist/index-tm6O4bWa.mjs.map +1 -0
  9. package/dist/pipeline-analytics/@mf-types.zip +0 -0
  10. package/dist/pipeline-analytics/__mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.mjs-CpCK52pE.mjs +19 -0
  11. package/dist/pipeline-analytics/__mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.mjs-DEj77u_A.mjs +15 -0
  12. package/dist/pipeline-analytics/_stub.js +1 -1
  13. package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-Vw8HvV_Q.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-C7e1vVcD.mjs} +6 -6
  14. package/dist/pipeline-analytics/{hostInit-PQYMQJ_C.mjs → hostInit-TFbPssJX.mjs} +6 -6
  15. package/dist/pipeline-analytics/{index-D7qTzYFz.mjs → index-BDPtaPA2.mjs} +7065 -5705
  16. package/dist/pipeline-analytics/index-BP0-1QYT.mjs +13140 -0
  17. package/dist/pipeline-analytics/{index-BSmxqDqD.mjs → index-DHiJ7A5x.mjs} +1 -1
  18. package/dist/pipeline-analytics/index.js +1 -1
  19. package/dist/pipeline-analytics/index.mjs +1 -1
  20. package/dist/pipeline-analytics/remoteEntry.js +1 -1
  21. package/dist/pipeline-analytics/schemas-ChN4Ih0h.mjs +3584 -0
  22. package/dist/recording/index.js +2 -2
  23. package/dist/recording/index.mjs +2 -2
  24. package/dist/{recording-coordinator-CvJtVs3m.mjs → recording-coordinator-BVFZsuQg.mjs} +2 -2
  25. package/dist/{recording-coordinator-CvJtVs3m.mjs.map → recording-coordinator-BVFZsuQg.mjs.map} +1 -1
  26. package/dist/{recording-coordinator-DH1gmm5G.js → recording-coordinator-CL3NPb1p.js} +2 -2
  27. package/dist/{recording-coordinator-DH1gmm5G.js.map → recording-coordinator-CL3NPb1p.js.map} +1 -1
  28. package/package.json +5 -5
  29. package/dist/index-BJKSB953.js.map +0 -1
  30. package/dist/index-BThK2F-p.mjs.map +0 -1
  31. package/dist/pipeline-analytics/__mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.mjs-ChoHjdk6.mjs +0 -17
  32. package/dist/pipeline-analytics/__mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.mjs-B9D0yX32.mjs +0 -15
  33. package/dist/pipeline-analytics/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-BJKSB953.js");
25
+ const index = require("../index-DNpNyDJi.js");
26
26
  const core = require("@camstack/core");
27
27
  const path = require("node:path");
28
28
  const fs = require("node:fs");
@@ -1,4 +1,4 @@
1
- import { R as RUNTIME_TO_FORMAT$1, P as PYTHON_SCRIPT, f as BACKEND_TO_FORMAT$1, B as BaseAddon, g as embeddingEncoderCapability } from "../index-BThK2F-p.mjs";
1
+ import { R as RUNTIME_TO_FORMAT$1, P as PYTHON_SCRIPT, f as BACKEND_TO_FORMAT$1, B as BaseAddon, g as embeddingEncoderCapability } from "../index-tm6O4bWa.mjs";
2
2
  import { ModelDownloadService } from "@camstack/core";
3
3
  import * as path from "node:path";
4
4
  import * as fs from "node:fs";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
- const index = require("../index-BJKSB953.js");
3
+ const index = require("../index-DNpNyDJi.js");
4
4
  const sharp = require("sharp");
5
5
  const DEFAULT_ENRICHMENT_CONFIG = {
6
6
  enabled: false,
@@ -1,4 +1,4 @@
1
- import { E as EventCategory, c as createEvent, o as object, t as tuple, n as number, s as string, b as boolean, a as array, _ as _enum, B as BaseAddon, d as asJsonObject } from "../index-BThK2F-p.mjs";
1
+ import { E as EventCategory, c as createEvent, o as object, t as tuple, n as number, s as string, b as boolean, a as array, _ as _enum, B as BaseAddon, d as asJsonObject } from "../index-tm6O4bWa.mjs";
2
2
  import sharp from "sharp";
3
3
  const DEFAULT_ENRICHMENT_CONFIG = {
4
4
  enabled: false,
@@ -8518,10 +8518,30 @@ const StatusSchema = object({
8518
8518
  }
8519
8519
  });
8520
8520
  const LinkStateSchema = _enum(["unlinked", "linked", "error"]);
8521
+ const ExportSetupFieldSchema = object({
8522
+ label: string(),
8523
+ value: string(),
8524
+ /** Mask the value by default + render a reveal toggle (client id, secrets). */
8525
+ secret: boolean().optional()
8526
+ });
8527
+ const ExportSetupSchema = object({
8528
+ /** A string to render as a scannable QR — HAP `X-HM://…` URI, a pairing URL, etc. Omitted when there's nothing to scan. */
8529
+ qr: string().optional(),
8530
+ /** Label/value rows shown with a copy button (HAP setup code, OAuth URLs, client id, linked-account count, …). */
8531
+ fields: array(ExportSetupFieldSchema).readonly().optional(),
8532
+ /** Free-form operator instructions rendered above the fields. */
8533
+ note: string().optional()
8534
+ });
8521
8535
  const DeviceExportStatusSchema = object({
8522
8536
  linkState: LinkStateSchema,
8523
8537
  exposedDeviceCount: number(),
8524
- error: string().optional()
8538
+ error: string().optional(),
8539
+ /**
8540
+ * Optional pairing/account info the panel renders in a generic
8541
+ * "Setup" section. Addon-agnostic — the addon id identifies the
8542
+ * export target, never an `ecosystem` key here.
8543
+ */
8544
+ setup: ExportSetupSchema.optional()
8525
8545
  });
8526
8546
  const DeviceKindSchema = string();
8527
8547
  const ExposedDeviceSchema = object({
@@ -10199,51 +10219,6 @@ const AuthResultSchema = object({
10199
10219
  validateToken: method(object({ token: string() }), AuthResultSchema.nullable())
10200
10220
  }
10201
10221
  });
10202
- const AuthProviderInfoSchema = object({
10203
- /** Stable id matching the addon id (used for `getLoginUrl({addonId,…})`). */
10204
- addonId: string(),
10205
- /**
10206
- * Per-instance id when one addon registers multiple "logical"
10207
- * providers (e.g. OIDC with Google + Microsoft + custom). The login
10208
- * URL becomes `/addon/${addonId}/${instanceId}/start` — handler reads
10209
- * `:instanceId` from the route. Empty/unset means the addon is a
10210
- * single-instance provider; the URL is `/addon/${addonId}/start`.
10211
- */
10212
- instanceId: string().optional(),
10213
- /** Display label shown on the login button + admin row. */
10214
- displayName: string(),
10215
- /** Optional iconography hint (lucide-react icon name OR emoji). */
10216
- icon: string().optional(),
10217
- /** When true, the provider exposes a redirect-based login flow
10218
- * (`getLoginUrl` returns a URL the browser navigates to). */
10219
- hasRedirectFlow: boolean(),
10220
- /** When true, the provider exposes a credential-form login flow
10221
- * (`validateCredentials` accepts username + password). */
10222
- hasCredentialFlow: boolean(),
10223
- /** Provider kind, drives admin-UI hint dispatch (oidc / saml / totp / …). */
10224
- kind: string().optional(),
10225
- /** Operator-facing status string (e.g. "Connected to https://login.acme.com"). */
10226
- status: string().optional(),
10227
- /** When false, the provider is registered but disabled by config; the
10228
- * UI surfaces it as inactive without enumerating it for login. */
10229
- enabled: boolean()
10230
- });
10231
- ({
10232
- methods: {
10233
- /** All registered auth providers, both enabled and disabled. */
10234
- listProviders: method(_void(), array(AuthProviderInfoSchema).readonly()),
10235
- /**
10236
- * Toggle a provider's enabled flag. Disabled providers stay
10237
- * registered but aren't surfaced on the login page. The orchestrator
10238
- * persists the state in `addon-settings` so it survives restarts.
10239
- */
10240
- setProviderEnabled: method(
10241
- object({ addonId: string(), enabled: boolean() }),
10242
- object({ success: literal(true) }),
10243
- { kind: "mutation", auth: "admin" }
10244
- )
10245
- }
10246
- });
10247
10222
  const NetworkEndpointSchema = object({
10248
10223
  url: string(),
10249
10224
  hostname: string(),
@@ -10275,55 +10250,13 @@ const NetworkEndpointEntrySchema = NetworkEndpointSchema.extend({
10275
10250
  getEndpoint: method(_void(), NetworkEndpointSchema.nullable()),
10276
10251
  getStatus: method(_void(), NetworkAccessStatusSchema),
10277
10252
  /**
10278
- * Enumerate every active ingress entry. Default implementation (when
10279
- * the provider omits this method) is derived from `getEndpoint()` —
10280
- * see the remote-access orchestrator for the fallback path.
10253
+ * Enumerate every active ingress entry. Providers that expose only a
10254
+ * single endpoint may omit this method; callers fall back to
10255
+ * `getEndpoint()` in that case.
10281
10256
  */
10282
10257
  listEndpoints: method(_void(), array(NetworkEndpointEntrySchema).readonly())
10283
10258
  }
10284
10259
  });
10285
- const RemoteAccessEndpointSchema = object({
10286
- url: string(),
10287
- hostname: string(),
10288
- port: number(),
10289
- protocol: _enum(["http", "https"])
10290
- });
10291
- const RemoteAccessProviderInfoSchema = object({
10292
- /** Stable id matching the addon id. */
10293
- addonId: string(),
10294
- /** Display label shown on the admin row — sourced from the addon manifest. */
10295
- displayName: string(),
10296
- /** When false, the provider is registered but disabled. */
10297
- enabled: boolean(),
10298
- /** True when the underlying tunnel/connection is up. */
10299
- connected: boolean(),
10300
- /** Public-facing endpoint, when connected. Null otherwise. */
10301
- endpoint: RemoteAccessEndpointSchema.nullable(),
10302
- /** Last error message (when connected=false), if available. */
10303
- error: string().optional()
10304
- });
10305
- ({
10306
- methods: {
10307
- /** All registered remote-access providers + their live status. */
10308
- listProviders: method(_void(), array(RemoteAccessProviderInfoSchema).readonly()),
10309
- /**
10310
- * Start a specific provider's tunnel. Per-provider config still
10311
- * lives on the addon's settings panel; this is just the on/off
10312
- * trigger so the admin UI can manage the lifecycle from one place.
10313
- */
10314
- startProvider: method(
10315
- object({ addonId: string() }),
10316
- RemoteAccessEndpointSchema,
10317
- { kind: "mutation", auth: "admin" }
10318
- ),
10319
- /** Stop a specific provider's tunnel (idempotent on already-stopped). */
10320
- stopProvider: method(
10321
- object({ addonId: string() }),
10322
- object({ success: literal(true) }),
10323
- { kind: "mutation", auth: "admin" }
10324
- )
10325
- }
10326
- });
10327
10260
  const TurnServerSchema = object({
10328
10261
  /** Single URL or list of URLs (e.g. "turn:turn.example.com:3478?transport=udp"). */
10329
10262
  urls: union([string(), array(string())]),
@@ -10343,45 +10276,6 @@ const TurnServerSchema = object({
10343
10276
  )
10344
10277
  }
10345
10278
  });
10346
- const TurnProviderInfoSchema = object({
10347
- /** Stable id matching the addon id. */
10348
- addonId: string(),
10349
- /** Display label shown on the admin row — sourced from the addon manifest. */
10350
- displayName: string(),
10351
- /** When false, the provider is registered but disabled. */
10352
- enabled: boolean(),
10353
- /** Number of servers this provider is currently exposing. */
10354
- serverCount: number(),
10355
- /**
10356
- * Flat list of every TURN/STUN URL this provider currently exposes.
10357
- * One row per URL (multi-URL ICE server entries are flattened). The
10358
- * admin UI shows this in a compact per-provider list so operators
10359
- * can verify what's actually being negotiated without having to dig
10360
- * into the combined `getAllServers` output.
10361
- */
10362
- urls: array(string()).readonly(),
10363
- /** Last fetch error (when serverCount=0 due to API failure), if any. */
10364
- error: string().optional()
10365
- });
10366
- ({
10367
- methods: {
10368
- /** All registered TURN providers + per-provider stats. */
10369
- listProviders: method(_void(), array(TurnProviderInfoSchema).readonly()),
10370
- /**
10371
- * Combined list of TURN/STUN servers from all ENABLED providers.
10372
- * Consumed by the WebRTC layer at session-creation time —
10373
- * implementations may fetch fresh short-lived credentials each
10374
- * call (e.g. Cloudflare API), so consumers SHOULD call per-session.
10375
- */
10376
- getAllServers: method(_void(), array(TurnServerSchema).readonly()),
10377
- /** Toggle a provider's enabled flag. */
10378
- setProviderEnabled: method(
10379
- object({ addonId: string(), enabled: boolean() }),
10380
- object({ success: literal(true) }),
10381
- { kind: "mutation", auth: "admin" }
10382
- )
10383
- }
10384
- });
10385
10279
  const SnapshotImageSchema = object({
10386
10280
  base64: string(),
10387
10281
  contentType: string()
@@ -11856,7 +11750,7 @@ const AllowedAddressesSchema = object({
11856
11750
  )
11857
11751
  }
11858
11752
  });
11859
- const MeshEndpointSchema$1 = object({
11753
+ const MeshEndpointSchema = object({
11860
11754
  /** Stable identifier within the provider (e.g. `mesh-ipv4`, `magicdns`, `funnel`). */
11861
11755
  id: string(),
11862
11756
  /** Operator-facing label (e.g. "Mesh IPv4", "MagicDNS"). */
@@ -11929,7 +11823,7 @@ const MeshStatusSchema = object({
11929
11823
  /** Number of peers visible to this host (excluding self). */
11930
11824
  peerCount: number(),
11931
11825
  /** Every endpoint this provider exposes for the current host. */
11932
- endpoints: array(MeshEndpointSchema$1).readonly(),
11826
+ endpoints: array(MeshEndpointSchema).readonly(),
11933
11827
  /** Last error from the daemon, when not joined. */
11934
11828
  error: string().optional(),
11935
11829
  // ── Account / tenant identity (generic across providers) ────────
@@ -11962,7 +11856,25 @@ const MeshStatusSchema = object({
11962
11856
  * doesn't rotate keys for the bound host. Operator-facing surface
11963
11857
  * for "your access expires on …" banners.
11964
11858
  */
11965
- keyExpiry: number().nullable()
11859
+ keyExpiry: number().nullable(),
11860
+ // ── Onboard-daemon handoff (Tailscale, generic slot) ────────────
11861
+ /**
11862
+ * When the provider runs its OWN mesh daemon (e.g. the Tailscale
11863
+ * client addon in `onboard` mode spawns a private `tailscaled`),
11864
+ * this carries the local control-socket path. Companion addons that
11865
+ * must drive the SAME daemon — chiefly `tailscale-ingress` for
11866
+ * Serve/Funnel — read it to point their CLI at the right socket
11867
+ * instead of the system default. Empty when the provider uses the
11868
+ * host's system daemon (or doesn't have the concept).
11869
+ */
11870
+ daemonSocket: string().optional(),
11871
+ /**
11872
+ * Path to the mesh CLI binary the provider downloaded for onboard
11873
+ * mode. Companion addons reuse it so they don't need a system
11874
+ * install when the operator chose a fully self-contained mesh.
11875
+ * Empty in host mode.
11876
+ */
11877
+ daemonCliPath: string().optional()
11966
11878
  });
11967
11879
  ({
11968
11880
  methods: {
@@ -12074,105 +11986,6 @@ const MeshStatusSchema = object({
12074
11986
  // tabs driven by this cap.
12075
11987
  }
12076
11988
  });
12077
- const MeshEndpointSchema = object({
12078
- id: string(),
12079
- label: string(),
12080
- scope: _enum(["mesh", "public"]),
12081
- url: string(),
12082
- hostname: string(),
12083
- port: number(),
12084
- protocol: _enum(["http", "https"])
12085
- });
12086
- const MeshProviderInfoSchema = object({
12087
- /** Stable id matching the addon id. */
12088
- addonId: string(),
12089
- /** Display label shown on the admin row — sourced from the addon manifest. */
12090
- displayName: string(),
12091
- /** True when the host is joined to this provider's mesh. */
12092
- joined: boolean(),
12093
- /** Local mesh IP (empty when not joined). */
12094
- meshIp: string(),
12095
- /** MagicDNS / mesh hostname (empty when not configured). */
12096
- magicDnsHostname: string(),
12097
- /** Peer count (excluding self). */
12098
- peerCount: number(),
12099
- /** Active endpoints (mesh IP + MagicDNS + optional public Funnel). */
12100
- endpoints: array(MeshEndpointSchema).readonly(),
12101
- /** Last error reported by the provider. */
12102
- error: string().optional(),
12103
- // ── Generic identity fields mirrored from MeshStatus ─────────────
12104
- /** Tenant / tailnet / network display name. Empty pre-join. */
12105
- tenantName: string(),
12106
- /** Mesh DNS suffix (e.g. tailXXXX.ts.net). Empty when not configured. */
12107
- magicDnsSuffix: string(),
12108
- /** Authenticated user / account login. Null for token-only providers. */
12109
- userLogin: string().nullable(),
12110
- /** Provider control-plane URL. */
12111
- controlPlaneUrl: string(),
12112
- /** Machine-key expiry (epoch ms). Null when keys don't rotate. */
12113
- keyExpiry: number().nullable()
12114
- });
12115
- ({
12116
- methods: {
12117
- /** All registered mesh-network providers + live status. */
12118
- listProviders: method(_void(), array(MeshProviderInfoSchema).readonly()),
12119
- /**
12120
- * Join the mesh of a specific provider. Per-provider config still
12121
- * lives on its settings panel; the orchestrator forwards.
12122
- */
12123
- joinProvider: method(
12124
- object({
12125
- addonId: string(),
12126
- authKey: string().min(8),
12127
- hostname: string().optional()
12128
- }),
12129
- object({ joined: literal(true) }),
12130
- { kind: "mutation" }
12131
- ),
12132
- leaveProvider: method(
12133
- object({ addonId: string() }),
12134
- object({ success: literal(true) }),
12135
- { kind: "mutation" }
12136
- ),
12137
- /**
12138
- * Browser-redirect login flow. Forwards to the named provider's
12139
- * `mesh-network.startLogin` and returns the URL the daemon
12140
- * prints. UI opens it in a new tab, then polls `listProviders`
12141
- * for `joined: true`.
12142
- */
12143
- startLoginProvider: method(
12144
- object({
12145
- addonId: string(),
12146
- hostname: string().optional()
12147
- }),
12148
- object({ loginUrl: string() }),
12149
- { kind: "mutation" }
12150
- ),
12151
- /**
12152
- * Sign out of the provider's account entirely (`mesh-network.logout`).
12153
- * Distinct from `leaveProvider` which only takes the host off-mesh;
12154
- * `logoutProvider` wipes credentials so the next start requires a
12155
- * fresh login.
12156
- */
12157
- logoutProvider: method(
12158
- object({ addonId: string() }),
12159
- object({ loggedOut: literal(true) }),
12160
- { kind: "mutation" }
12161
- ),
12162
- /**
12163
- * Per-provider peer list. Forwards to `mesh-network.listPeers` on
12164
- * the addressed provider. Separate from `listProviders` because
12165
- * peer payloads can be large on a heavily-populated tailnet —
12166
- * fetch only when the operator opens the Peers tab.
12167
- */
12168
- listProviderPeers: method(
12169
- object({ addonId: string() }),
12170
- object({
12171
- peers: array(MeshPeerSchema).readonly()
12172
- })
12173
- )
12174
- }
12175
- });
12176
11989
  const MethodAccessSchema = _enum(["view", "create", "delete"]);
12177
11990
  const AllowedProviderSchema = union([literal("*"), array(string())]);
12178
11991
  const AllowedDevicesSchema = record(string(), union([literal("*"), array(string())]));
@@ -12848,6 +12661,21 @@ const AddonAutoUpdateSchema = ChannelWithInheritSchema;
12848
12661
  const RestartAddonResultSchema = unknown();
12849
12662
  const InstallPackageResultSchema = unknown();
12850
12663
  const ReloadPackagesResultSchema = unknown();
12664
+ const UpdateFrameworkPackageResultSchema = object({
12665
+ packageName: string(),
12666
+ fromVersion: string(),
12667
+ toVersion: string(),
12668
+ /** Ms-epoch the server scheduled its self-restart. */
12669
+ restartingAt: number()
12670
+ });
12671
+ const FrameworkPackageStatusSchema = object({
12672
+ packageName: string(),
12673
+ currentVersion: string(),
12674
+ latestVersion: string().nullable(),
12675
+ hasUpdate: boolean(),
12676
+ /** Optional manifest description for the row tooltip. */
12677
+ description: string().optional()
12678
+ });
12851
12679
  const LogStreamEntrySchema = object({
12852
12680
  timestamp: string(),
12853
12681
  level: string(),
@@ -12907,13 +12735,29 @@ const CustomActionInputSchema = object({
12907
12735
  object({ query: string().optional() }),
12908
12736
  array(SearchResultSchema)
12909
12737
  ),
12738
+ /**
12739
+ * Available package updates for a node. `nodeId` omitted (or
12740
+ * `'hub'`) checks the hub's own installed packages; an agent
12741
+ * `nodeId` checks that agent's installed roster against npm
12742
+ * (the hub does the npm lookups + diff — agents stay npm-free).
12743
+ */
12910
12744
  listUpdates: method(
12911
- _void(),
12745
+ object({ nodeId: string().optional() }),
12912
12746
  array(PackageUpdateSchema).readonly(),
12913
12747
  { auth: "admin" }
12914
12748
  ),
12749
+ /**
12750
+ * Update one package on a node. `nodeId` omitted (or `'hub'`)
12751
+ * installs on the hub via npm; an agent `nodeId` makes the hub
12752
+ * pack the resolved version and push the tarball to that agent
12753
+ * (`$agent.deploy` + `$agent.reload`) — agents need no npm runtime.
12754
+ */
12915
12755
  updatePackage: method(
12916
- object({ name: string().min(1), version: string().optional() }),
12756
+ object({
12757
+ name: string().min(1),
12758
+ version: string().optional(),
12759
+ nodeId: string().optional()
12760
+ }),
12917
12761
  unknown(),
12918
12762
  { kind: "mutation", auth: "admin" }
12919
12763
  ),
@@ -12934,12 +12778,128 @@ const CustomActionInputSchema = object({
12934
12778
  object({ rolledBackTo: string().nullable() }),
12935
12779
  { kind: "mutation", auth: "admin" }
12936
12780
  ),
12937
- forceRefresh: method(_void(), unknown(), { kind: "mutation", auth: "admin" }),
12781
+ /** Re-check updates for a node, bypassing any cache. `nodeId`
12782
+ * omitted (or `'hub'`) refreshes the hub; an agent `nodeId`
12783
+ * re-checks that agent's roster. */
12784
+ forceRefresh: method(
12785
+ object({ nodeId: string().optional() }),
12786
+ unknown(),
12787
+ { kind: "mutation", auth: "admin" }
12788
+ ),
12938
12789
  restartServer: method(
12939
12790
  object({ confirm: literal(true) }),
12940
12791
  unknown(),
12941
12792
  { kind: "mutation", auth: "admin" }
12942
12793
  ),
12794
+ /**
12795
+ * Most-recent restart marker (kind / packageName / from→to versions
12796
+ * / requestedBy / requestedAt). Returns `null` when this process
12797
+ * didn't boot from a tracked restart, or when the
12798
+ * post-boot retention window (5 min) has elapsed.
12799
+ *
12800
+ * Drives the admin-UI reconnect overlay's success toast — the
12801
+ * `system.restart-completed` event itself is fired before the
12802
+ * client has time to re-subscribe, so the client queries this on
12803
+ * first reconnect instead.
12804
+ */
12805
+ getLastRestart: method(
12806
+ _void(),
12807
+ object({
12808
+ kind: _enum(["framework-update", "manual", "system"]),
12809
+ packageName: string().optional(),
12810
+ fromVersion: string().optional(),
12811
+ toVersion: string().optional(),
12812
+ requestedBy: string().optional(),
12813
+ requestedAt: number()
12814
+ }).nullable(),
12815
+ { auth: "admin" }
12816
+ ),
12817
+ /**
12818
+ * Snapshot of the framework packages installed under the hub's
12819
+ * `<appRoot>/node_modules/`. Each row carries the currently
12820
+ * installed version and (best-effort) the latest version
12821
+ * available on npm. Drives the admin-UI "System packages" panel.
12822
+ *
12823
+ * Spec: docs/superpowers/specs/2026-05-14-framework-live-update-design.md
12824
+ */
12825
+ listFrameworkPackages: method(
12826
+ _void(),
12827
+ array(FrameworkPackageStatusSchema).readonly(),
12828
+ { auth: "admin" }
12829
+ ),
12830
+ /**
12831
+ * Cluster-wide capability-provider discovery. Returns the list of
12832
+ * `{ addonId, mode, isActive }` tuples for whatever addon(s)
12833
+ * currently provide the requested capability across the cluster.
12834
+ *
12835
+ * Why this lives on `addons` (and not on a `capabilities` cap of
12836
+ * its own): the hub's main-process `CapabilityRegistry` already
12837
+ * aggregates registrations from every forked group-runner and
12838
+ * remote agent via Moleculer event propagation — there's no
12839
+ * cross-process registry mirror to build, just an introspection
12840
+ * shim.
12841
+ *
12842
+ * Use this from addon code when you need to know whether another
12843
+ * addon has registered a specific cap (e.g. `tailscale-ingress`
12844
+ * checking `tailscale-client` is up before calling `tailscale
12845
+ * serve`). Don't reach for `ctx.capabilities.getCollectionEntries`
12846
+ * — that reads the LOCAL registry of the calling addon's group
12847
+ * runner and never sees providers in other processes. See
12848
+ * `CLAUDE.md` → Critical rules → ctx.api vs ctx.capabilities.
12849
+ */
12850
+ listCapabilityProviders: method(
12851
+ object({ capName: string().min(1) }),
12852
+ array(object({
12853
+ addonId: string(),
12854
+ mode: _enum(["singleton", "collection"]),
12855
+ isActive: boolean()
12856
+ })).readonly()
12857
+ ),
12858
+ /**
12859
+ * Toggle a single collection-cap provider on/off. Generic write-side
12860
+ * counterpart of `listCapabilityProviders` — drives the per-provider
12861
+ * Enable/Disable affordance in admin pages (TURN servers, etc.)
12862
+ * without needing a bespoke orchestrator cap.
12863
+ *
12864
+ * Reaches the hub's `CapabilityRegistry` directly:
12865
+ * `enableCollectionProvider` / `disableCollectionProvider` flip the
12866
+ * registry-level `disabledProviders` set. `getCollectionEntries`
12867
+ * already filters disabled providers out, so a disabled provider
12868
+ * drops out of every collection aggregate immediately. Only valid
12869
+ * for `mode: 'collection'` caps — the registry no-ops + warns for
12870
+ * singletons.
12871
+ */
12872
+ setCapabilityProviderEnabled: method(
12873
+ object({
12874
+ capName: string().min(1),
12875
+ addonId: string().min(1),
12876
+ enabled: boolean()
12877
+ }),
12878
+ object({ success: literal(true) }),
12879
+ { kind: "mutation", auth: "admin" }
12880
+ ),
12881
+ /**
12882
+ * Live-update one of the framework packages marked
12883
+ * `camstack.system: true` (`@camstack/types|kernel|core|sdk|ui-library`).
12884
+ * Runs `npm install --prefix <appRoot> <name>@<version> --no-save`,
12885
+ * writes a `.restart-pending` marker, emits `system.restarting`
12886
+ * and schedules a graceful process exit. The supervisor (Docker /
12887
+ * Electron / systemd) brings the hub back up; on first boot after
12888
+ * the restart the marker fires `system.restart-completed`.
12889
+ *
12890
+ * `version` defaults to `'latest'`. The allow-list of valid
12891
+ * `packageName` values is enforced server-side.
12892
+ *
12893
+ * Spec: docs/superpowers/specs/2026-05-14-framework-live-update-design.md
12894
+ */
12895
+ updateFrameworkPackage: method(
12896
+ object({
12897
+ packageName: string().min(1),
12898
+ version: string().optional()
12899
+ }),
12900
+ UpdateFrameworkPackageResultSchema,
12901
+ { kind: "mutation", auth: "admin" }
12902
+ ),
12943
12903
  getVersions: method(
12944
12904
  object({ name: string() }),
12945
12905
  array(PackageVersionInfoSchema).readonly()
@@ -13010,6 +12970,7 @@ var EventCategory = /* @__PURE__ */ ((EventCategory2) => {
13010
12970
  EventCategory2["SystemBoot"] = "system.boot";
13011
12971
  EventCategory2["SystemAddonsReady"] = "system.addons-ready";
13012
12972
  EventCategory2["SystemRestarting"] = "system.restarting";
12973
+ EventCategory2["SystemRestartCompleted"] = "system.restart-completed";
13013
12974
  EventCategory2["SystemReadyState"] = "system.ready-state";
13014
12975
  EventCategory2["AddonStarted"] = "addon.started";
13015
12976
  EventCategory2["AddonStopped"] = "addon.stopped";
@@ -13562,4 +13523,4 @@ exports.recordingEngineCapability = recordingEngineCapability;
13562
13523
  exports.string = string;
13563
13524
  exports.tuple = tuple;
13564
13525
  exports.zoneAnalyticsCapability = zoneAnalyticsCapability;
13565
- //# sourceMappingURL=index-BJKSB953.js.map
13526
+ //# sourceMappingURL=index-DNpNyDJi.js.map