@camstack/addon-mqtt-broker 1.2.129 → 1.2.130

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.
@@ -5594,7 +5594,7 @@ var ZodIssueCode = {
5594
5594
  var ZodFirstPartyTypeKind;
5595
5595
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5596
5596
  //#endregion
5597
- //#region ../types/dist/sleep-BxjU_fJM.mjs
5597
+ //#region ../types/dist/sleep-yKL5gfrH.mjs
5598
5598
  /**
5599
5599
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5600
5600
  * window to float samples (D455).
@@ -7977,9 +7977,9 @@ function normalizeAddonInitResult(result) {
7977
7977
  return result;
7978
7978
  }
7979
7979
  /**
7980
- * The share-view scope kinds a `csv_*` share token can carry. The hub mints
7981
- * and validates them (`share-token.service.ts` builds its enum from this
7982
- * list); a data plane names the kinds it ACCEPTS in `share`.
7980
+ * The share-view scope kinds a share-link token can carry. The hub mints
7981
+ * and validates them (`ShareViewGrantSchema` builds its
7982
+ * enum from this list); a data plane names the kinds it ACCEPTS in `share`.
7983
7983
  */
7984
7984
  var SHARE_VIEW_KINDS = ["grid-view", "events-view"];
7985
7985
  /** The wire shape of {@link PeerBytesTicket} — see the type for what it is. */
@@ -12864,7 +12864,7 @@ var ConvertResultSchema = object({
12864
12864
  * `super_admin` — collapsed onto the single boolean because every
12865
12865
  * non-admin caller is governed by the same scope-check rules; the
12866
12866
  * distinction was only ever used to route role-specific procedures
12867
- * which we no longer have. CLI / webhook integrations are `cst_*` tokens
12867
+ * which we no longer have. CLI / webhook integrations are tokens (`auth.mintToken`)
12868
12868
  * with `isAdmin: false` + an explicit scope list.
12869
12869
  */
12870
12870
  /** Per-method access flavour. Materialised on every cap method via codegen. */
@@ -13053,10 +13053,12 @@ var AddonRoutesScopeSchema = object({
13053
13053
  type: literal("addon-routes"),
13054
13054
  access: array(MethodAccessSchema).min(1)
13055
13055
  });
13056
+ var PreferencesSelfScopeSchema = object({ type: literal("preferences-self") });
13056
13057
  var CredentialScopeSchema = union([
13057
13058
  literal("*"),
13058
13059
  ShareViewScopeSchema,
13059
13060
  AddonRoutesScopeSchema,
13061
+ PreferencesSelfScopeSchema,
13060
13062
  TokenScopeSchema
13061
13063
  ]);
13062
13064
  object({
@@ -13065,6 +13067,55 @@ object({
13065
13067
  jti: string().min(16),
13066
13068
  scopes: array(CredentialScopeSchema).min(1)
13067
13069
  });
13070
+ var PreferenceNamespaceSchema = string().regex(/^[a-z][a-z0-9.-]{0,63}$/);
13071
+ /** A namespace's value: a JSON object, opaque to the hub. */
13072
+ var PreferenceValueSchema = record(string(), unknown());
13073
+ var PreferenceDeviceIdSchema = string().min(1).max(64);
13074
+ /** A stored row, as the owner reads it. */
13075
+ var PreferenceRowSchema = object({
13076
+ namespace: PreferenceNamespaceSchema,
13077
+ value: PreferenceValueSchema,
13078
+ /** Starts at 1, +1 on every write of this namespace. A delete ends the row and its count. */
13079
+ revision: number().int().positive(),
13080
+ updatedAt: number().int(),
13081
+ /** The client id the last writer sent; `null` when it sent none. */
13082
+ updatedByDevice: PreferenceDeviceIdSchema.nullable()
13083
+ });
13084
+ object({
13085
+ /** Absent: every namespace the caller holds. */
13086
+ namespaces: array(PreferenceNamespaceSchema).max(32).optional() });
13087
+ object({ rows: array(PreferenceRowSchema) });
13088
+ object({
13089
+ namespace: PreferenceNamespaceSchema,
13090
+ value: PreferenceValueSchema,
13091
+ /**
13092
+ * The revision the edit was based on. Absent: last write wins. `0`: the
13093
+ * namespace must not exist yet. Any other value that is not the current
13094
+ * revision answers `conflict` and writes nothing.
13095
+ */
13096
+ baseRevision: number().int().nonnegative().optional(),
13097
+ deviceId: PreferenceDeviceIdSchema.optional()
13098
+ });
13099
+ discriminatedUnion("status", [object({
13100
+ status: literal("saved"),
13101
+ row: PreferenceRowSchema
13102
+ }), object({
13103
+ status: literal("conflict"),
13104
+ current: PreferenceRowSchema.nullable()
13105
+ })]);
13106
+ object({ namespace: PreferenceNamespaceSchema });
13107
+ object({
13108
+ /** `false` when the namespace did not exist. */
13109
+ deleted: boolean() });
13110
+ object({
13111
+ /** The revision the client holds per namespace; a namespace it does not list is new to it. */
13112
+ revisionByNamespace: record(PreferenceNamespaceSchema, number().int().nonnegative()).refine((map) => Object.keys(map).length <= 32, { message: `at most 32 namespaces` }) });
13113
+ object({
13114
+ /** Every row whose revision differs from the client's, and every row it did not list. */
13115
+ rows: array(PreferenceRowSchema),
13116
+ /** Namespaces the client listed that no longer exist. */
13117
+ deleted: array(PreferenceNamespaceSchema)
13118
+ });
13068
13119
  _enum(["new-session", "step-up"]);
13069
13120
  /** The languages the hub's app landing pages are written in (D858). */
13070
13121
  var AppPageLangSchema = _enum(["en", "it"]);
@@ -39992,38 +40043,37 @@ method(LlmRuntimeCompleteInputSchema, LlmGenerateResultSchema, {
39992
40043
  auth: "admin",
39993
40044
  timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
39994
40045
  });
40046
+ var LlmProfileKindSchema = string().regex(/^[a-z0-9][a-z0-9-]{0,63}$/, "a kind id is lower-case letters, digits and dashes");
40047
+ /** What a model (or, by default, every model of a kind) can do. */
40048
+ var LlmModelFeaturesSchema = object({
40049
+ vision: boolean(),
40050
+ tools: boolean(),
40051
+ streaming: boolean()
40052
+ });
40053
+ /** One model a provider offers. `features` overrides the kind's defaults, per field. */
40054
+ var LlmModelInfoSchema = object({
40055
+ id: string(),
40056
+ label: string().optional(),
40057
+ contextLength: number().int().positive().optional(),
40058
+ features: LlmModelFeaturesSchema.partial().optional()
40059
+ });
39995
40060
  /**
39996
- * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
39997
- * methods concat-fan across providers; single-row methods route to ONE
39998
- * provider by the `addonId` in the call input (the notification-output
39999
- * posture, notification-output.cap.ts:215-250). Provided by `addon-ai`
40000
- * (hub-placed); the cap stays open for future providers.
40001
- *
40002
- * Profiles are ROWS (data), not addons: one row = one usable model endpoint.
40003
- * `apiKey` is a password field — providers REDACT it on read and merge on
40004
- * write; a stored key NEVER round-trips to a client.
40061
+ * The provider-specific part of a profile, validated by the provider that owns
40062
+ * the kind (`upsertProfile` refuses what it does not accept). A field its
40063
+ * `connectionSchema` declares `type: 'password'` is a secret: it is held in the
40064
+ * keychain, never in the row, and reads back as the redaction marker.
40005
40065
  */
40006
- var LlmProfileKindSchema = _enum([
40007
- "openai-compatible",
40008
- "openai",
40009
- "anthropic",
40010
- "google",
40011
- "managed-local",
40012
- "apple-foundation"
40013
- ]);
40066
+ var LlmProviderConfigSchema = record(string(), unknown());
40014
40067
  var LlmProfileSchema = object({
40015
40068
  id: string(),
40016
40069
  name: string(),
40070
+ /** The provider-declared kind (`LlmProfileKindDescriptor.kind`). */
40017
40071
  kind: LlmProfileKindSchema,
40018
40072
  /** Stamped by the provider — keeps the fanned catalog routable. */
40019
40073
  addonId: string(),
40020
40074
  enabled: boolean(),
40021
40075
  /** Vendor model id, or the managed runtime's loaded model. */
40022
40076
  model: string(),
40023
- /** Required for openai-compatible; override for cloud kinds. */
40024
- baseUrl: string().optional(),
40025
- /** ConfigUISchema type:'password' — never round-trips (spec §5). */
40026
- apiKey: string().optional(),
40027
40077
  /** Vision on/off. A vision call against a `false` profile is REFUSED, never
40028
40078
  * degraded to text — that shipped once and produced a confident answer to a
40029
40079
  * question about a picture nobody sent. */
@@ -40031,15 +40081,11 @@ var LlmProfileSchema = object({
40031
40081
  temperature: number().min(0).max(2).optional(),
40032
40082
  /** Nucleus sampling. Every wire we speak has it. */
40033
40083
  topP: number().min(0).max(1).optional(),
40034
- /** Top-k sampling. Carried only by the wires that have it — NEITHER OpenAI
40035
- * wire does, and the client drops it there (measured: the request body gets
40036
- * `top_p` and no `top_k`). The profile editor hides the field wherever it
40037
- * would change nothing; `KINDS_WITH_TOP_K` is the single owner of that list. */
40084
+ /** Top-k sampling. Carried only by the wires that have it — a kind offers the
40085
+ * field in its editor only when its descriptor lists it in `profileFields`. */
40038
40086
  topK: number().int().positive().optional(),
40039
40087
  maxTokens: number().int().positive().optional(),
40040
- /** Prompt context window. Advisory for cloud kinds (they enforce their own);
40041
- * for `managed-local` it is the llama.cpp `--ctx-size` the runtime starts
40042
- * the model with, so it is the one field that changes a PROCESS. */
40088
+ /** Prompt context window. Advisory for cloud kinds (they enforce their own). */
40043
40089
  contextLength: number().int().positive().optional(),
40044
40090
  /** Default system prompt. A caller's `system` REPLACES it (never appends —
40045
40091
  * two system prompts fighting is worse than either alone). */
@@ -40065,16 +40111,37 @@ var LlmProfileSchema = object({
40065
40111
  * library; the REGISTRY of callable tools is ours and is empty in v1, so a
40066
40112
  * `true` here buys the wiring, not behaviour, until tools are registered. */
40067
40113
  toolsEnabled: boolean().default(false),
40068
- extraHeaders: record(string(), string()).optional(),
40069
- /** kind === 'managed-local' only (spec §4). */
40070
- runtime: ManagedRuntimeConfigSchema.optional(),
40071
- /**
40072
- * kind === 'apple-foundation' only: WHERE it runs — the only thing there is
40073
- * to configure (no key, no URL, no download; `model` is `apple-system`).
40074
- * `supportsVision` on such a row is stamped by the provider from the node's
40075
- * reported `imageInput`, never taken from the operator (D62).
40076
- */
40077
- appleFoundation: object({ nodeId: string() }).optional()
40114
+ /** Everything the kind's provider owns (endpoint, key, node, runtime…). */
40115
+ providerConfig: LlmProviderConfigSchema.default({})
40116
+ });
40117
+ /**
40118
+ * The common profile fields a kind's editor offers. The editor owns how each
40119
+ * one is drawn; the provider says which of them mean something on its wire.
40120
+ */
40121
+ var LlmProfileFieldSchema = _enum([
40122
+ "temperature",
40123
+ "topP",
40124
+ "topK",
40125
+ "maxTokens",
40126
+ "contextLength",
40127
+ "systemPrompt",
40128
+ "timeoutMs",
40129
+ "connectTimeoutMs",
40130
+ "firstTokenTimeoutMs",
40131
+ "idleTimeoutMs",
40132
+ "retry",
40133
+ "toolsEnabled"
40134
+ ]);
40135
+ /**
40136
+ * A provider-drawn part of the editor, by a generic widget id the admin UI
40137
+ * registers (`ai/apple-node`). `placement: 'model'` replaces the generic model
40138
+ * picker: that widget owns the model choice.
40139
+ */
40140
+ var LlmProviderWidgetSchema = object({
40141
+ id: string(),
40142
+ placement: _enum(["connection", "model"]),
40143
+ /** `providerConfig` keys this widget must fill before the profile can be saved. */
40144
+ requires: array(string()).optional()
40078
40145
  });
40079
40146
  /** ConfigUISchema tree passed through untyped on the wire (the
40080
40147
  * notification-output `ConfigSchemaPassthrough` precedent at
@@ -40083,11 +40150,56 @@ var ConfigSchemaPassthrough$3 = unknown();
40083
40150
  var LlmProfileKindDescriptorSchema = object({
40084
40151
  kind: LlmProfileKindSchema,
40085
40152
  label: string(),
40153
+ /** A generic icon name (`cloud`, `plug`, `cpu`) — never a glyph or a logo. */
40086
40154
  icon: string(),
40087
40155
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
40088
40156
  addonId: string(),
40089
- configSchema: ConfigSchemaPassthrough$3
40157
+ /** The provider's own fields (`providerConfig`); `password` fields are keychain-held. */
40158
+ connectionSchema: ConfigSchemaPassthrough$3,
40159
+ /** Provider fields that belong under "Advanced" (extra headers, runtime tuning). */
40160
+ advancedSchema: ConfigSchemaPassthrough$3.optional(),
40161
+ /** The kind's defaults; a model from `listModels` may override any of them. */
40162
+ features: LlmModelFeaturesSchema,
40163
+ /** `false` = the provider stamps `supportsVision` itself (from what a node reports). */
40164
+ visionEditable: boolean(),
40165
+ /** Where the model list comes from: `listModels`, `staticModels`, or nowhere. */
40166
+ modelCatalog: _enum([
40167
+ "fetch",
40168
+ "static",
40169
+ "none"
40170
+ ]),
40171
+ staticModels: array(LlmModelInfoSchema).optional(),
40172
+ /** The common fields that mean something on this kind's wire. */
40173
+ profileFields: array(LlmProfileFieldSchema),
40174
+ providerWidgets: array(LlmProviderWidgetSchema).optional()
40090
40175
  });
40176
+ /**
40177
+ * `listModels` input. `connection` is an UNSAVED draft of `providerConfig`
40178
+ * (the editor's form); with `profileId` too, a secret the draft leaves
40179
+ * untouched (absent or the redaction marker) is resolved server-side from the
40180
+ * stored profile — the browser never receives it.
40181
+ */
40182
+ var LlmListModelsInputSchema = object({
40183
+ addonId: string(),
40184
+ kind: LlmProfileKindSchema,
40185
+ profileId: string().optional(),
40186
+ connection: LlmProviderConfigSchema.optional()
40187
+ });
40188
+ var LlmListModelsErrorCodeSchema = _enum([
40189
+ "auth",
40190
+ "network",
40191
+ "unsupported",
40192
+ "invalid"
40193
+ ]);
40194
+ /** A RESULT, never a throw: "wrong key" is an answer the editor renders inline. */
40195
+ var LlmListModelsResultSchema = discriminatedUnion("ok", [object({
40196
+ ok: literal(true),
40197
+ models: array(LlmModelInfoSchema)
40198
+ }), object({
40199
+ ok: literal(false),
40200
+ code: LlmListModelsErrorCodeSchema,
40201
+ message: string()
40202
+ })]);
40091
40203
  var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
40092
40204
  var LlmDefaultSchema = object({
40093
40205
  selector: LlmDefaultSelectorSchema,
@@ -40187,7 +40299,10 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
40187
40299
  kind: "mutation",
40188
40300
  auth: "admin",
40189
40301
  timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
40190
- }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
40302
+ }), method(LlmListModelsInputSchema, LlmListModelsResultSchema, {
40303
+ kind: "mutation",
40304
+ auth: "admin"
40305
+ }), method(object({}), array(LlmDefaultSchema)), method(object({
40191
40306
  selector: LlmDefaultSelectorSchema,
40192
40307
  profileId: string().nullable()
40193
40308
  }), _void(), {
@@ -61201,26 +61316,6 @@ var ApiKeySummarySchema = object({
61201
61316
  createdAt: number(),
61202
61317
  lastUsedAt: number().optional()
61203
61318
  });
61204
- var ScopedTokenSummarySchema = object({
61205
- id: string(),
61206
- userId: string(),
61207
- name: string(),
61208
- tokenPrefix: string(),
61209
- scopes: array(TokenScopeSchema),
61210
- expiresAt: number().nullish(),
61211
- lastUsedAt: number().nullish(),
61212
- createdAt: number()
61213
- });
61214
- var CreateScopedTokenInputSchema = object({
61215
- userId: string(),
61216
- name: string(),
61217
- scopes: array(TokenScopeSchema),
61218
- expiresAt: number().optional()
61219
- });
61220
- var CreateScopedTokenResultSchema = object({
61221
- token: string(),
61222
- record: ScopedTokenSummarySchema
61223
- });
61224
61319
  var OauthSessionSummarySchema = object({
61225
61320
  id: string(),
61226
61321
  userId: string(),
@@ -61242,11 +61337,11 @@ var TotpStatusSchema = object({
61242
61337
  confirmedAt: number().nullable()
61243
61338
  });
61244
61339
  /**
61245
- * user-management — singleton capability for user accounts, API keys,
61246
- * and scoped tokens.
61340
+ * user-management — singleton capability for user accounts and the
61341
+ * legacy API-key rows.
61247
61342
  *
61248
61343
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
61249
- * — the subset check on `setUserScopes` / `createScopedToken` is moot
61344
+ * — the subset check on `setUserScopes` is moot
61250
61345
  * because non-admins never reach these. If/when we open non-admin
61251
61346
  * delegation, structural caller-scope subset check goes inside the
61252
61347
  * provider.
@@ -61303,15 +61398,7 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
61303
61398
  kind: "mutation",
61304
61399
  auth: "admin",
61305
61400
  access: "delete"
61306
- }), method(CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, {
61307
- kind: "mutation",
61308
- auth: "admin",
61309
- access: "create"
61310
- }), method(object({ id: string() }), object({ success: literal(true) }), {
61311
- kind: "mutation",
61312
- auth: "admin",
61313
- access: "delete"
61314
- }), method(object({ token: string() }), ScopedTokenSummarySchema.nullable(), { access: "view" }), method(object({ userId: string() }), array(ScopedTokenSummarySchema), { auth: "admin" }), method(object({ userId: string() }), TotpSetupResultSchema, {
61401
+ }), method(object({ userId: string() }), TotpSetupResultSchema, {
61315
61402
  kind: "mutation",
61316
61403
  auth: "admin",
61317
61404
  access: "create"
@@ -65467,7 +65554,7 @@ Object.freeze({
65467
65554
  capName: "llm",
65468
65555
  capScope: "system",
65469
65556
  addonId: null,
65470
- access: "view"
65557
+ access: "create"
65471
65558
  },
65472
65559
  "llm.listNodeModels": {
65473
65560
  capName: "llm",
@@ -70131,12 +70218,6 @@ Object.freeze({
70131
70218
  addonId: null,
70132
70219
  access: "create"
70133
70220
  },
70134
- "userManagement.createScopedToken": {
70135
- capName: "user-management",
70136
- capScope: "system",
70137
- addonId: null,
70138
- access: "create"
70139
- },
70140
70221
  "userManagement.createUser": {
70141
70222
  capName: "user-management",
70142
70223
  capScope: "system",
@@ -70185,12 +70266,6 @@ Object.freeze({
70185
70266
  addonId: null,
70186
70267
  access: "view"
70187
70268
  },
70188
- "userManagement.listScopedTokens": {
70189
- capName: "user-management",
70190
- capScope: "system",
70191
- addonId: null,
70192
- access: "view"
70193
- },
70194
70269
  "userManagement.listUsers": {
70195
70270
  capName: "user-management",
70196
70271
  capScope: "system",
@@ -70245,12 +70320,6 @@ Object.freeze({
70245
70320
  addonId: null,
70246
70321
  access: "delete"
70247
70322
  },
70248
- "userManagement.revokeScopedToken": {
70249
- capName: "user-management",
70250
- capScope: "system",
70251
- addonId: null,
70252
- access: "delete"
70253
- },
70254
70323
  "userManagement.setupTotp": {
70255
70324
  capName: "user-management",
70256
70325
  capScope: "system",
@@ -70281,12 +70350,6 @@ Object.freeze({
70281
70350
  addonId: null,
70282
70351
  access: "view"
70283
70352
  },
70284
- "userManagement.validateScopedToken": {
70285
- capName: "user-management",
70286
- capScope: "system",
70287
- addonId: null,
70288
- access: "view"
70289
- },
70290
70353
  "userManagement.verifyTotp": {
70291
70354
  capName: "user-management",
70292
70355
  capScope: "system",
@@ -5587,7 +5587,7 @@ var ZodIssueCode = {
5587
5587
  var ZodFirstPartyTypeKind;
5588
5588
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5589
5589
  //#endregion
5590
- //#region ../types/dist/sleep-BxjU_fJM.mjs
5590
+ //#region ../types/dist/sleep-yKL5gfrH.mjs
5591
5591
  /**
5592
5592
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5593
5593
  * window to float samples (D455).
@@ -7970,9 +7970,9 @@ function normalizeAddonInitResult(result) {
7970
7970
  return result;
7971
7971
  }
7972
7972
  /**
7973
- * The share-view scope kinds a `csv_*` share token can carry. The hub mints
7974
- * and validates them (`share-token.service.ts` builds its enum from this
7975
- * list); a data plane names the kinds it ACCEPTS in `share`.
7973
+ * The share-view scope kinds a share-link token can carry. The hub mints
7974
+ * and validates them (`ShareViewGrantSchema` builds its
7975
+ * enum from this list); a data plane names the kinds it ACCEPTS in `share`.
7976
7976
  */
7977
7977
  var SHARE_VIEW_KINDS = ["grid-view", "events-view"];
7978
7978
  /** The wire shape of {@link PeerBytesTicket} — see the type for what it is. */
@@ -12857,7 +12857,7 @@ var ConvertResultSchema = object({
12857
12857
  * `super_admin` — collapsed onto the single boolean because every
12858
12858
  * non-admin caller is governed by the same scope-check rules; the
12859
12859
  * distinction was only ever used to route role-specific procedures
12860
- * which we no longer have. CLI / webhook integrations are `cst_*` tokens
12860
+ * which we no longer have. CLI / webhook integrations are tokens (`auth.mintToken`)
12861
12861
  * with `isAdmin: false` + an explicit scope list.
12862
12862
  */
12863
12863
  /** Per-method access flavour. Materialised on every cap method via codegen. */
@@ -13046,10 +13046,12 @@ var AddonRoutesScopeSchema = object({
13046
13046
  type: literal("addon-routes"),
13047
13047
  access: array(MethodAccessSchema).min(1)
13048
13048
  });
13049
+ var PreferencesSelfScopeSchema = object({ type: literal("preferences-self") });
13049
13050
  var CredentialScopeSchema = union([
13050
13051
  literal("*"),
13051
13052
  ShareViewScopeSchema,
13052
13053
  AddonRoutesScopeSchema,
13054
+ PreferencesSelfScopeSchema,
13053
13055
  TokenScopeSchema
13054
13056
  ]);
13055
13057
  object({
@@ -13058,6 +13060,55 @@ object({
13058
13060
  jti: string().min(16),
13059
13061
  scopes: array(CredentialScopeSchema).min(1)
13060
13062
  });
13063
+ var PreferenceNamespaceSchema = string().regex(/^[a-z][a-z0-9.-]{0,63}$/);
13064
+ /** A namespace's value: a JSON object, opaque to the hub. */
13065
+ var PreferenceValueSchema = record(string(), unknown());
13066
+ var PreferenceDeviceIdSchema = string().min(1).max(64);
13067
+ /** A stored row, as the owner reads it. */
13068
+ var PreferenceRowSchema = object({
13069
+ namespace: PreferenceNamespaceSchema,
13070
+ value: PreferenceValueSchema,
13071
+ /** Starts at 1, +1 on every write of this namespace. A delete ends the row and its count. */
13072
+ revision: number().int().positive(),
13073
+ updatedAt: number().int(),
13074
+ /** The client id the last writer sent; `null` when it sent none. */
13075
+ updatedByDevice: PreferenceDeviceIdSchema.nullable()
13076
+ });
13077
+ object({
13078
+ /** Absent: every namespace the caller holds. */
13079
+ namespaces: array(PreferenceNamespaceSchema).max(32).optional() });
13080
+ object({ rows: array(PreferenceRowSchema) });
13081
+ object({
13082
+ namespace: PreferenceNamespaceSchema,
13083
+ value: PreferenceValueSchema,
13084
+ /**
13085
+ * The revision the edit was based on. Absent: last write wins. `0`: the
13086
+ * namespace must not exist yet. Any other value that is not the current
13087
+ * revision answers `conflict` and writes nothing.
13088
+ */
13089
+ baseRevision: number().int().nonnegative().optional(),
13090
+ deviceId: PreferenceDeviceIdSchema.optional()
13091
+ });
13092
+ discriminatedUnion("status", [object({
13093
+ status: literal("saved"),
13094
+ row: PreferenceRowSchema
13095
+ }), object({
13096
+ status: literal("conflict"),
13097
+ current: PreferenceRowSchema.nullable()
13098
+ })]);
13099
+ object({ namespace: PreferenceNamespaceSchema });
13100
+ object({
13101
+ /** `false` when the namespace did not exist. */
13102
+ deleted: boolean() });
13103
+ object({
13104
+ /** The revision the client holds per namespace; a namespace it does not list is new to it. */
13105
+ revisionByNamespace: record(PreferenceNamespaceSchema, number().int().nonnegative()).refine((map) => Object.keys(map).length <= 32, { message: `at most 32 namespaces` }) });
13106
+ object({
13107
+ /** Every row whose revision differs from the client's, and every row it did not list. */
13108
+ rows: array(PreferenceRowSchema),
13109
+ /** Namespaces the client listed that no longer exist. */
13110
+ deleted: array(PreferenceNamespaceSchema)
13111
+ });
13061
13112
  _enum(["new-session", "step-up"]);
13062
13113
  /** The languages the hub's app landing pages are written in (D858). */
13063
13114
  var AppPageLangSchema = _enum(["en", "it"]);
@@ -39985,38 +40036,37 @@ method(LlmRuntimeCompleteInputSchema, LlmGenerateResultSchema, {
39985
40036
  auth: "admin",
39986
40037
  timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
39987
40038
  });
40039
+ var LlmProfileKindSchema = string().regex(/^[a-z0-9][a-z0-9-]{0,63}$/, "a kind id is lower-case letters, digits and dashes");
40040
+ /** What a model (or, by default, every model of a kind) can do. */
40041
+ var LlmModelFeaturesSchema = object({
40042
+ vision: boolean(),
40043
+ tools: boolean(),
40044
+ streaming: boolean()
40045
+ });
40046
+ /** One model a provider offers. `features` overrides the kind's defaults, per field. */
40047
+ var LlmModelInfoSchema = object({
40048
+ id: string(),
40049
+ label: string().optional(),
40050
+ contextLength: number().int().positive().optional(),
40051
+ features: LlmModelFeaturesSchema.partial().optional()
40052
+ });
39988
40053
  /**
39989
- * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
39990
- * methods concat-fan across providers; single-row methods route to ONE
39991
- * provider by the `addonId` in the call input (the notification-output
39992
- * posture, notification-output.cap.ts:215-250). Provided by `addon-ai`
39993
- * (hub-placed); the cap stays open for future providers.
39994
- *
39995
- * Profiles are ROWS (data), not addons: one row = one usable model endpoint.
39996
- * `apiKey` is a password field — providers REDACT it on read and merge on
39997
- * write; a stored key NEVER round-trips to a client.
40054
+ * The provider-specific part of a profile, validated by the provider that owns
40055
+ * the kind (`upsertProfile` refuses what it does not accept). A field its
40056
+ * `connectionSchema` declares `type: 'password'` is a secret: it is held in the
40057
+ * keychain, never in the row, and reads back as the redaction marker.
39998
40058
  */
39999
- var LlmProfileKindSchema = _enum([
40000
- "openai-compatible",
40001
- "openai",
40002
- "anthropic",
40003
- "google",
40004
- "managed-local",
40005
- "apple-foundation"
40006
- ]);
40059
+ var LlmProviderConfigSchema = record(string(), unknown());
40007
40060
  var LlmProfileSchema = object({
40008
40061
  id: string(),
40009
40062
  name: string(),
40063
+ /** The provider-declared kind (`LlmProfileKindDescriptor.kind`). */
40010
40064
  kind: LlmProfileKindSchema,
40011
40065
  /** Stamped by the provider — keeps the fanned catalog routable. */
40012
40066
  addonId: string(),
40013
40067
  enabled: boolean(),
40014
40068
  /** Vendor model id, or the managed runtime's loaded model. */
40015
40069
  model: string(),
40016
- /** Required for openai-compatible; override for cloud kinds. */
40017
- baseUrl: string().optional(),
40018
- /** ConfigUISchema type:'password' — never round-trips (spec §5). */
40019
- apiKey: string().optional(),
40020
40070
  /** Vision on/off. A vision call against a `false` profile is REFUSED, never
40021
40071
  * degraded to text — that shipped once and produced a confident answer to a
40022
40072
  * question about a picture nobody sent. */
@@ -40024,15 +40074,11 @@ var LlmProfileSchema = object({
40024
40074
  temperature: number().min(0).max(2).optional(),
40025
40075
  /** Nucleus sampling. Every wire we speak has it. */
40026
40076
  topP: number().min(0).max(1).optional(),
40027
- /** Top-k sampling. Carried only by the wires that have it — NEITHER OpenAI
40028
- * wire does, and the client drops it there (measured: the request body gets
40029
- * `top_p` and no `top_k`). The profile editor hides the field wherever it
40030
- * would change nothing; `KINDS_WITH_TOP_K` is the single owner of that list. */
40077
+ /** Top-k sampling. Carried only by the wires that have it — a kind offers the
40078
+ * field in its editor only when its descriptor lists it in `profileFields`. */
40031
40079
  topK: number().int().positive().optional(),
40032
40080
  maxTokens: number().int().positive().optional(),
40033
- /** Prompt context window. Advisory for cloud kinds (they enforce their own);
40034
- * for `managed-local` it is the llama.cpp `--ctx-size` the runtime starts
40035
- * the model with, so it is the one field that changes a PROCESS. */
40081
+ /** Prompt context window. Advisory for cloud kinds (they enforce their own). */
40036
40082
  contextLength: number().int().positive().optional(),
40037
40083
  /** Default system prompt. A caller's `system` REPLACES it (never appends —
40038
40084
  * two system prompts fighting is worse than either alone). */
@@ -40058,16 +40104,37 @@ var LlmProfileSchema = object({
40058
40104
  * library; the REGISTRY of callable tools is ours and is empty in v1, so a
40059
40105
  * `true` here buys the wiring, not behaviour, until tools are registered. */
40060
40106
  toolsEnabled: boolean().default(false),
40061
- extraHeaders: record(string(), string()).optional(),
40062
- /** kind === 'managed-local' only (spec §4). */
40063
- runtime: ManagedRuntimeConfigSchema.optional(),
40064
- /**
40065
- * kind === 'apple-foundation' only: WHERE it runs — the only thing there is
40066
- * to configure (no key, no URL, no download; `model` is `apple-system`).
40067
- * `supportsVision` on such a row is stamped by the provider from the node's
40068
- * reported `imageInput`, never taken from the operator (D62).
40069
- */
40070
- appleFoundation: object({ nodeId: string() }).optional()
40107
+ /** Everything the kind's provider owns (endpoint, key, node, runtime…). */
40108
+ providerConfig: LlmProviderConfigSchema.default({})
40109
+ });
40110
+ /**
40111
+ * The common profile fields a kind's editor offers. The editor owns how each
40112
+ * one is drawn; the provider says which of them mean something on its wire.
40113
+ */
40114
+ var LlmProfileFieldSchema = _enum([
40115
+ "temperature",
40116
+ "topP",
40117
+ "topK",
40118
+ "maxTokens",
40119
+ "contextLength",
40120
+ "systemPrompt",
40121
+ "timeoutMs",
40122
+ "connectTimeoutMs",
40123
+ "firstTokenTimeoutMs",
40124
+ "idleTimeoutMs",
40125
+ "retry",
40126
+ "toolsEnabled"
40127
+ ]);
40128
+ /**
40129
+ * A provider-drawn part of the editor, by a generic widget id the admin UI
40130
+ * registers (`ai/apple-node`). `placement: 'model'` replaces the generic model
40131
+ * picker: that widget owns the model choice.
40132
+ */
40133
+ var LlmProviderWidgetSchema = object({
40134
+ id: string(),
40135
+ placement: _enum(["connection", "model"]),
40136
+ /** `providerConfig` keys this widget must fill before the profile can be saved. */
40137
+ requires: array(string()).optional()
40071
40138
  });
40072
40139
  /** ConfigUISchema tree passed through untyped on the wire (the
40073
40140
  * notification-output `ConfigSchemaPassthrough` precedent at
@@ -40076,11 +40143,56 @@ var ConfigSchemaPassthrough$3 = unknown();
40076
40143
  var LlmProfileKindDescriptorSchema = object({
40077
40144
  kind: LlmProfileKindSchema,
40078
40145
  label: string(),
40146
+ /** A generic icon name (`cloud`, `plug`, `cpu`) — never a glyph or a logo. */
40079
40147
  icon: string(),
40080
40148
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
40081
40149
  addonId: string(),
40082
- configSchema: ConfigSchemaPassthrough$3
40150
+ /** The provider's own fields (`providerConfig`); `password` fields are keychain-held. */
40151
+ connectionSchema: ConfigSchemaPassthrough$3,
40152
+ /** Provider fields that belong under "Advanced" (extra headers, runtime tuning). */
40153
+ advancedSchema: ConfigSchemaPassthrough$3.optional(),
40154
+ /** The kind's defaults; a model from `listModels` may override any of them. */
40155
+ features: LlmModelFeaturesSchema,
40156
+ /** `false` = the provider stamps `supportsVision` itself (from what a node reports). */
40157
+ visionEditable: boolean(),
40158
+ /** Where the model list comes from: `listModels`, `staticModels`, or nowhere. */
40159
+ modelCatalog: _enum([
40160
+ "fetch",
40161
+ "static",
40162
+ "none"
40163
+ ]),
40164
+ staticModels: array(LlmModelInfoSchema).optional(),
40165
+ /** The common fields that mean something on this kind's wire. */
40166
+ profileFields: array(LlmProfileFieldSchema),
40167
+ providerWidgets: array(LlmProviderWidgetSchema).optional()
40083
40168
  });
40169
+ /**
40170
+ * `listModels` input. `connection` is an UNSAVED draft of `providerConfig`
40171
+ * (the editor's form); with `profileId` too, a secret the draft leaves
40172
+ * untouched (absent or the redaction marker) is resolved server-side from the
40173
+ * stored profile — the browser never receives it.
40174
+ */
40175
+ var LlmListModelsInputSchema = object({
40176
+ addonId: string(),
40177
+ kind: LlmProfileKindSchema,
40178
+ profileId: string().optional(),
40179
+ connection: LlmProviderConfigSchema.optional()
40180
+ });
40181
+ var LlmListModelsErrorCodeSchema = _enum([
40182
+ "auth",
40183
+ "network",
40184
+ "unsupported",
40185
+ "invalid"
40186
+ ]);
40187
+ /** A RESULT, never a throw: "wrong key" is an answer the editor renders inline. */
40188
+ var LlmListModelsResultSchema = discriminatedUnion("ok", [object({
40189
+ ok: literal(true),
40190
+ models: array(LlmModelInfoSchema)
40191
+ }), object({
40192
+ ok: literal(false),
40193
+ code: LlmListModelsErrorCodeSchema,
40194
+ message: string()
40195
+ })]);
40084
40196
  var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
40085
40197
  var LlmDefaultSchema = object({
40086
40198
  selector: LlmDefaultSelectorSchema,
@@ -40180,7 +40292,10 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
40180
40292
  kind: "mutation",
40181
40293
  auth: "admin",
40182
40294
  timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
40183
- }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
40295
+ }), method(LlmListModelsInputSchema, LlmListModelsResultSchema, {
40296
+ kind: "mutation",
40297
+ auth: "admin"
40298
+ }), method(object({}), array(LlmDefaultSchema)), method(object({
40184
40299
  selector: LlmDefaultSelectorSchema,
40185
40300
  profileId: string().nullable()
40186
40301
  }), _void(), {
@@ -61194,26 +61309,6 @@ var ApiKeySummarySchema = object({
61194
61309
  createdAt: number(),
61195
61310
  lastUsedAt: number().optional()
61196
61311
  });
61197
- var ScopedTokenSummarySchema = object({
61198
- id: string(),
61199
- userId: string(),
61200
- name: string(),
61201
- tokenPrefix: string(),
61202
- scopes: array(TokenScopeSchema),
61203
- expiresAt: number().nullish(),
61204
- lastUsedAt: number().nullish(),
61205
- createdAt: number()
61206
- });
61207
- var CreateScopedTokenInputSchema = object({
61208
- userId: string(),
61209
- name: string(),
61210
- scopes: array(TokenScopeSchema),
61211
- expiresAt: number().optional()
61212
- });
61213
- var CreateScopedTokenResultSchema = object({
61214
- token: string(),
61215
- record: ScopedTokenSummarySchema
61216
- });
61217
61312
  var OauthSessionSummarySchema = object({
61218
61313
  id: string(),
61219
61314
  userId: string(),
@@ -61235,11 +61330,11 @@ var TotpStatusSchema = object({
61235
61330
  confirmedAt: number().nullable()
61236
61331
  });
61237
61332
  /**
61238
- * user-management — singleton capability for user accounts, API keys,
61239
- * and scoped tokens.
61333
+ * user-management — singleton capability for user accounts and the
61334
+ * legacy API-key rows.
61240
61335
  *
61241
61336
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
61242
- * — the subset check on `setUserScopes` / `createScopedToken` is moot
61337
+ * — the subset check on `setUserScopes` is moot
61243
61338
  * because non-admins never reach these. If/when we open non-admin
61244
61339
  * delegation, structural caller-scope subset check goes inside the
61245
61340
  * provider.
@@ -61296,15 +61391,7 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
61296
61391
  kind: "mutation",
61297
61392
  auth: "admin",
61298
61393
  access: "delete"
61299
- }), method(CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, {
61300
- kind: "mutation",
61301
- auth: "admin",
61302
- access: "create"
61303
- }), method(object({ id: string() }), object({ success: literal(true) }), {
61304
- kind: "mutation",
61305
- auth: "admin",
61306
- access: "delete"
61307
- }), method(object({ token: string() }), ScopedTokenSummarySchema.nullable(), { access: "view" }), method(object({ userId: string() }), array(ScopedTokenSummarySchema), { auth: "admin" }), method(object({ userId: string() }), TotpSetupResultSchema, {
61394
+ }), method(object({ userId: string() }), TotpSetupResultSchema, {
61308
61395
  kind: "mutation",
61309
61396
  auth: "admin",
61310
61397
  access: "create"
@@ -65460,7 +65547,7 @@ Object.freeze({
65460
65547
  capName: "llm",
65461
65548
  capScope: "system",
65462
65549
  addonId: null,
65463
- access: "view"
65550
+ access: "create"
65464
65551
  },
65465
65552
  "llm.listNodeModels": {
65466
65553
  capName: "llm",
@@ -70124,12 +70211,6 @@ Object.freeze({
70124
70211
  addonId: null,
70125
70212
  access: "create"
70126
70213
  },
70127
- "userManagement.createScopedToken": {
70128
- capName: "user-management",
70129
- capScope: "system",
70130
- addonId: null,
70131
- access: "create"
70132
- },
70133
70214
  "userManagement.createUser": {
70134
70215
  capName: "user-management",
70135
70216
  capScope: "system",
@@ -70178,12 +70259,6 @@ Object.freeze({
70178
70259
  addonId: null,
70179
70260
  access: "view"
70180
70261
  },
70181
- "userManagement.listScopedTokens": {
70182
- capName: "user-management",
70183
- capScope: "system",
70184
- addonId: null,
70185
- access: "view"
70186
- },
70187
70262
  "userManagement.listUsers": {
70188
70263
  capName: "user-management",
70189
70264
  capScope: "system",
@@ -70238,12 +70313,6 @@ Object.freeze({
70238
70313
  addonId: null,
70239
70314
  access: "delete"
70240
70315
  },
70241
- "userManagement.revokeScopedToken": {
70242
- capName: "user-management",
70243
- capScope: "system",
70244
- addonId: null,
70245
- access: "delete"
70246
- },
70247
70316
  "userManagement.setupTotp": {
70248
70317
  capName: "user-management",
70249
70318
  capScope: "system",
@@ -70274,12 +70343,6 @@ Object.freeze({
70274
70343
  addonId: null,
70275
70344
  access: "view"
70276
70345
  },
70277
- "userManagement.validateScopedToken": {
70278
- capName: "user-management",
70279
- capScope: "system",
70280
- addonId: null,
70281
- access: "view"
70282
- },
70283
70346
  "userManagement.verifyTotp": {
70284
70347
  capName: "user-management",
70285
70348
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-mqtt-broker",
3
- "version": "1.2.129",
3
+ "version": "1.2.130",
4
4
  "description": "MQTT broker registry addon for CamStack — manages external broker entries + an optional embedded aedes broker. Consumers spin up their own `mqtt.js` clients via the `mqtt-broker` cap.",
5
5
  "keywords": [
6
6
  "camstack",