@camstack/addon-provider-wyze 0.2.142 → 0.2.143

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 (3) hide show
  1. package/dist/addon.js +165 -102
  2. package/dist/addon.mjs +165 -102
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -5446,7 +5446,7 @@ var ZodIssueCode = {
5446
5446
  var ZodFirstPartyTypeKind;
5447
5447
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5448
5448
  //#endregion
5449
- //#region ../types/dist/sleep-BxjU_fJM.mjs
5449
+ //#region ../types/dist/sleep-yKL5gfrH.mjs
5450
5450
  /**
5451
5451
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5452
5452
  * window to float samples (D455).
@@ -7829,9 +7829,9 @@ function normalizeAddonInitResult(result) {
7829
7829
  return result;
7830
7830
  }
7831
7831
  /**
7832
- * The share-view scope kinds a `csv_*` share token can carry. The hub mints
7833
- * and validates them (`share-token.service.ts` builds its enum from this
7834
- * list); a data plane names the kinds it ACCEPTS in `share`.
7832
+ * The share-view scope kinds a share-link token can carry. The hub mints
7833
+ * and validates them (`ShareViewGrantSchema` builds its
7834
+ * enum from this list); a data plane names the kinds it ACCEPTS in `share`.
7835
7835
  */
7836
7836
  var SHARE_VIEW_KINDS = ["grid-view", "events-view"];
7837
7837
  /** The wire shape of {@link PeerBytesTicket} — see the type for what it is. */
@@ -12555,7 +12555,7 @@ var ConvertResultSchema = object({
12555
12555
  * `super_admin` — collapsed onto the single boolean because every
12556
12556
  * non-admin caller is governed by the same scope-check rules; the
12557
12557
  * distinction was only ever used to route role-specific procedures
12558
- * which we no longer have. CLI / webhook integrations are `cst_*` tokens
12558
+ * which we no longer have. CLI / webhook integrations are tokens (`auth.mintToken`)
12559
12559
  * with `isAdmin: false` + an explicit scope list.
12560
12560
  */
12561
12561
  /** Per-method access flavour. Materialised on every cap method via codegen. */
@@ -12744,10 +12744,12 @@ var AddonRoutesScopeSchema = object({
12744
12744
  type: literal("addon-routes"),
12745
12745
  access: array(MethodAccessSchema).min(1)
12746
12746
  });
12747
+ var PreferencesSelfScopeSchema = object({ type: literal("preferences-self") });
12747
12748
  var CredentialScopeSchema = union([
12748
12749
  literal("*"),
12749
12750
  ShareViewScopeSchema,
12750
12751
  AddonRoutesScopeSchema,
12752
+ PreferencesSelfScopeSchema,
12751
12753
  TokenScopeSchema
12752
12754
  ]);
12753
12755
  object({
@@ -12756,6 +12758,55 @@ object({
12756
12758
  jti: string().min(16),
12757
12759
  scopes: array(CredentialScopeSchema).min(1)
12758
12760
  });
12761
+ var PreferenceNamespaceSchema = string().regex(/^[a-z][a-z0-9.-]{0,63}$/);
12762
+ /** A namespace's value: a JSON object, opaque to the hub. */
12763
+ var PreferenceValueSchema = record(string(), unknown());
12764
+ var PreferenceDeviceIdSchema = string().min(1).max(64);
12765
+ /** A stored row, as the owner reads it. */
12766
+ var PreferenceRowSchema = object({
12767
+ namespace: PreferenceNamespaceSchema,
12768
+ value: PreferenceValueSchema,
12769
+ /** Starts at 1, +1 on every write of this namespace. A delete ends the row and its count. */
12770
+ revision: number().int().positive(),
12771
+ updatedAt: number().int(),
12772
+ /** The client id the last writer sent; `null` when it sent none. */
12773
+ updatedByDevice: PreferenceDeviceIdSchema.nullable()
12774
+ });
12775
+ object({
12776
+ /** Absent: every namespace the caller holds. */
12777
+ namespaces: array(PreferenceNamespaceSchema).max(32).optional() });
12778
+ object({ rows: array(PreferenceRowSchema) });
12779
+ object({
12780
+ namespace: PreferenceNamespaceSchema,
12781
+ value: PreferenceValueSchema,
12782
+ /**
12783
+ * The revision the edit was based on. Absent: last write wins. `0`: the
12784
+ * namespace must not exist yet. Any other value that is not the current
12785
+ * revision answers `conflict` and writes nothing.
12786
+ */
12787
+ baseRevision: number().int().nonnegative().optional(),
12788
+ deviceId: PreferenceDeviceIdSchema.optional()
12789
+ });
12790
+ discriminatedUnion("status", [object({
12791
+ status: literal("saved"),
12792
+ row: PreferenceRowSchema
12793
+ }), object({
12794
+ status: literal("conflict"),
12795
+ current: PreferenceRowSchema.nullable()
12796
+ })]);
12797
+ object({ namespace: PreferenceNamespaceSchema });
12798
+ object({
12799
+ /** `false` when the namespace did not exist. */
12800
+ deleted: boolean() });
12801
+ object({
12802
+ /** The revision the client holds per namespace; a namespace it does not list is new to it. */
12803
+ revisionByNamespace: record(PreferenceNamespaceSchema, number().int().nonnegative()).refine((map) => Object.keys(map).length <= 32, { message: `at most 32 namespaces` }) });
12804
+ object({
12805
+ /** Every row whose revision differs from the client's, and every row it did not list. */
12806
+ rows: array(PreferenceRowSchema),
12807
+ /** Namespaces the client listed that no longer exist. */
12808
+ deleted: array(PreferenceNamespaceSchema)
12809
+ });
12759
12810
  _enum(["new-session", "step-up"]);
12760
12811
  /** The languages the hub's app landing pages are written in (D858). */
12761
12812
  var AppPageLangSchema = _enum(["en", "it"]);
@@ -39949,38 +40000,37 @@ method(LlmRuntimeCompleteInputSchema, LlmGenerateResultSchema, {
39949
40000
  auth: "admin",
39950
40001
  timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
39951
40002
  });
40003
+ var LlmProfileKindSchema = string().regex(/^[a-z0-9][a-z0-9-]{0,63}$/, "a kind id is lower-case letters, digits and dashes");
40004
+ /** What a model (or, by default, every model of a kind) can do. */
40005
+ var LlmModelFeaturesSchema = object({
40006
+ vision: boolean(),
40007
+ tools: boolean(),
40008
+ streaming: boolean()
40009
+ });
40010
+ /** One model a provider offers. `features` overrides the kind's defaults, per field. */
40011
+ var LlmModelInfoSchema = object({
40012
+ id: string(),
40013
+ label: string().optional(),
40014
+ contextLength: number().int().positive().optional(),
40015
+ features: LlmModelFeaturesSchema.partial().optional()
40016
+ });
39952
40017
  /**
39953
- * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
39954
- * methods concat-fan across providers; single-row methods route to ONE
39955
- * provider by the `addonId` in the call input (the notification-output
39956
- * posture, notification-output.cap.ts:215-250). Provided by `addon-ai`
39957
- * (hub-placed); the cap stays open for future providers.
39958
- *
39959
- * Profiles are ROWS (data), not addons: one row = one usable model endpoint.
39960
- * `apiKey` is a password field — providers REDACT it on read and merge on
39961
- * write; a stored key NEVER round-trips to a client.
40018
+ * The provider-specific part of a profile, validated by the provider that owns
40019
+ * the kind (`upsertProfile` refuses what it does not accept). A field its
40020
+ * `connectionSchema` declares `type: 'password'` is a secret: it is held in the
40021
+ * keychain, never in the row, and reads back as the redaction marker.
39962
40022
  */
39963
- var LlmProfileKindSchema = _enum([
39964
- "openai-compatible",
39965
- "openai",
39966
- "anthropic",
39967
- "google",
39968
- "managed-local",
39969
- "apple-foundation"
39970
- ]);
40023
+ var LlmProviderConfigSchema = record(string(), unknown());
39971
40024
  var LlmProfileSchema = object({
39972
40025
  id: string(),
39973
40026
  name: string(),
40027
+ /** The provider-declared kind (`LlmProfileKindDescriptor.kind`). */
39974
40028
  kind: LlmProfileKindSchema,
39975
40029
  /** Stamped by the provider — keeps the fanned catalog routable. */
39976
40030
  addonId: string(),
39977
40031
  enabled: boolean(),
39978
40032
  /** Vendor model id, or the managed runtime's loaded model. */
39979
40033
  model: string(),
39980
- /** Required for openai-compatible; override for cloud kinds. */
39981
- baseUrl: string().optional(),
39982
- /** ConfigUISchema type:'password' — never round-trips (spec §5). */
39983
- apiKey: string().optional(),
39984
40034
  /** Vision on/off. A vision call against a `false` profile is REFUSED, never
39985
40035
  * degraded to text — that shipped once and produced a confident answer to a
39986
40036
  * question about a picture nobody sent. */
@@ -39988,15 +40038,11 @@ var LlmProfileSchema = object({
39988
40038
  temperature: number().min(0).max(2).optional(),
39989
40039
  /** Nucleus sampling. Every wire we speak has it. */
39990
40040
  topP: number().min(0).max(1).optional(),
39991
- /** Top-k sampling. Carried only by the wires that have it — NEITHER OpenAI
39992
- * wire does, and the client drops it there (measured: the request body gets
39993
- * `top_p` and no `top_k`). The profile editor hides the field wherever it
39994
- * would change nothing; `KINDS_WITH_TOP_K` is the single owner of that list. */
40041
+ /** Top-k sampling. Carried only by the wires that have it — a kind offers the
40042
+ * field in its editor only when its descriptor lists it in `profileFields`. */
39995
40043
  topK: number().int().positive().optional(),
39996
40044
  maxTokens: number().int().positive().optional(),
39997
- /** Prompt context window. Advisory for cloud kinds (they enforce their own);
39998
- * for `managed-local` it is the llama.cpp `--ctx-size` the runtime starts
39999
- * the model with, so it is the one field that changes a PROCESS. */
40045
+ /** Prompt context window. Advisory for cloud kinds (they enforce their own). */
40000
40046
  contextLength: number().int().positive().optional(),
40001
40047
  /** Default system prompt. A caller's `system` REPLACES it (never appends —
40002
40048
  * two system prompts fighting is worse than either alone). */
@@ -40022,16 +40068,37 @@ var LlmProfileSchema = object({
40022
40068
  * library; the REGISTRY of callable tools is ours and is empty in v1, so a
40023
40069
  * `true` here buys the wiring, not behaviour, until tools are registered. */
40024
40070
  toolsEnabled: boolean().default(false),
40025
- extraHeaders: record(string(), string()).optional(),
40026
- /** kind === 'managed-local' only (spec §4). */
40027
- runtime: ManagedRuntimeConfigSchema.optional(),
40028
- /**
40029
- * kind === 'apple-foundation' only: WHERE it runs — the only thing there is
40030
- * to configure (no key, no URL, no download; `model` is `apple-system`).
40031
- * `supportsVision` on such a row is stamped by the provider from the node's
40032
- * reported `imageInput`, never taken from the operator (D62).
40033
- */
40034
- appleFoundation: object({ nodeId: string() }).optional()
40071
+ /** Everything the kind's provider owns (endpoint, key, node, runtime…). */
40072
+ providerConfig: LlmProviderConfigSchema.default({})
40073
+ });
40074
+ /**
40075
+ * The common profile fields a kind's editor offers. The editor owns how each
40076
+ * one is drawn; the provider says which of them mean something on its wire.
40077
+ */
40078
+ var LlmProfileFieldSchema = _enum([
40079
+ "temperature",
40080
+ "topP",
40081
+ "topK",
40082
+ "maxTokens",
40083
+ "contextLength",
40084
+ "systemPrompt",
40085
+ "timeoutMs",
40086
+ "connectTimeoutMs",
40087
+ "firstTokenTimeoutMs",
40088
+ "idleTimeoutMs",
40089
+ "retry",
40090
+ "toolsEnabled"
40091
+ ]);
40092
+ /**
40093
+ * A provider-drawn part of the editor, by a generic widget id the admin UI
40094
+ * registers (`ai/apple-node`). `placement: 'model'` replaces the generic model
40095
+ * picker: that widget owns the model choice.
40096
+ */
40097
+ var LlmProviderWidgetSchema = object({
40098
+ id: string(),
40099
+ placement: _enum(["connection", "model"]),
40100
+ /** `providerConfig` keys this widget must fill before the profile can be saved. */
40101
+ requires: array(string()).optional()
40035
40102
  });
40036
40103
  /** ConfigUISchema tree passed through untyped on the wire (the
40037
40104
  * notification-output `ConfigSchemaPassthrough` precedent at
@@ -40040,11 +40107,56 @@ var ConfigSchemaPassthrough$3 = unknown();
40040
40107
  var LlmProfileKindDescriptorSchema = object({
40041
40108
  kind: LlmProfileKindSchema,
40042
40109
  label: string(),
40110
+ /** A generic icon name (`cloud`, `plug`, `cpu`) — never a glyph or a logo. */
40043
40111
  icon: string(),
40044
40112
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
40045
40113
  addonId: string(),
40046
- configSchema: ConfigSchemaPassthrough$3
40114
+ /** The provider's own fields (`providerConfig`); `password` fields are keychain-held. */
40115
+ connectionSchema: ConfigSchemaPassthrough$3,
40116
+ /** Provider fields that belong under "Advanced" (extra headers, runtime tuning). */
40117
+ advancedSchema: ConfigSchemaPassthrough$3.optional(),
40118
+ /** The kind's defaults; a model from `listModels` may override any of them. */
40119
+ features: LlmModelFeaturesSchema,
40120
+ /** `false` = the provider stamps `supportsVision` itself (from what a node reports). */
40121
+ visionEditable: boolean(),
40122
+ /** Where the model list comes from: `listModels`, `staticModels`, or nowhere. */
40123
+ modelCatalog: _enum([
40124
+ "fetch",
40125
+ "static",
40126
+ "none"
40127
+ ]),
40128
+ staticModels: array(LlmModelInfoSchema).optional(),
40129
+ /** The common fields that mean something on this kind's wire. */
40130
+ profileFields: array(LlmProfileFieldSchema),
40131
+ providerWidgets: array(LlmProviderWidgetSchema).optional()
40047
40132
  });
40133
+ /**
40134
+ * `listModels` input. `connection` is an UNSAVED draft of `providerConfig`
40135
+ * (the editor's form); with `profileId` too, a secret the draft leaves
40136
+ * untouched (absent or the redaction marker) is resolved server-side from the
40137
+ * stored profile — the browser never receives it.
40138
+ */
40139
+ var LlmListModelsInputSchema = object({
40140
+ addonId: string(),
40141
+ kind: LlmProfileKindSchema,
40142
+ profileId: string().optional(),
40143
+ connection: LlmProviderConfigSchema.optional()
40144
+ });
40145
+ var LlmListModelsErrorCodeSchema = _enum([
40146
+ "auth",
40147
+ "network",
40148
+ "unsupported",
40149
+ "invalid"
40150
+ ]);
40151
+ /** A RESULT, never a throw: "wrong key" is an answer the editor renders inline. */
40152
+ var LlmListModelsResultSchema = discriminatedUnion("ok", [object({
40153
+ ok: literal(true),
40154
+ models: array(LlmModelInfoSchema)
40155
+ }), object({
40156
+ ok: literal(false),
40157
+ code: LlmListModelsErrorCodeSchema,
40158
+ message: string()
40159
+ })]);
40048
40160
  var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
40049
40161
  var LlmDefaultSchema = object({
40050
40162
  selector: LlmDefaultSelectorSchema,
@@ -40144,7 +40256,10 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
40144
40256
  kind: "mutation",
40145
40257
  auth: "admin",
40146
40258
  timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
40147
- }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
40259
+ }), method(LlmListModelsInputSchema, LlmListModelsResultSchema, {
40260
+ kind: "mutation",
40261
+ auth: "admin"
40262
+ }), method(object({}), array(LlmDefaultSchema)), method(object({
40148
40263
  selector: LlmDefaultSelectorSchema,
40149
40264
  profileId: string().nullable()
40150
40265
  }), _void(), {
@@ -64144,26 +64259,6 @@ var ApiKeySummarySchema = object({
64144
64259
  createdAt: number(),
64145
64260
  lastUsedAt: number().optional()
64146
64261
  });
64147
- var ScopedTokenSummarySchema = object({
64148
- id: string(),
64149
- userId: string(),
64150
- name: string(),
64151
- tokenPrefix: string(),
64152
- scopes: array(TokenScopeSchema),
64153
- expiresAt: number().nullish(),
64154
- lastUsedAt: number().nullish(),
64155
- createdAt: number()
64156
- });
64157
- var CreateScopedTokenInputSchema = object({
64158
- userId: string(),
64159
- name: string(),
64160
- scopes: array(TokenScopeSchema),
64161
- expiresAt: number().optional()
64162
- });
64163
- var CreateScopedTokenResultSchema = object({
64164
- token: string(),
64165
- record: ScopedTokenSummarySchema
64166
- });
64167
64262
  var OauthSessionSummarySchema = object({
64168
64263
  id: string(),
64169
64264
  userId: string(),
@@ -64185,11 +64280,11 @@ var TotpStatusSchema = object({
64185
64280
  confirmedAt: number().nullable()
64186
64281
  });
64187
64282
  /**
64188
- * user-management — singleton capability for user accounts, API keys,
64189
- * and scoped tokens.
64283
+ * user-management — singleton capability for user accounts and the
64284
+ * legacy API-key rows.
64190
64285
  *
64191
64286
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64192
- * — the subset check on `setUserScopes` / `createScopedToken` is moot
64287
+ * — the subset check on `setUserScopes` is moot
64193
64288
  * because non-admins never reach these. If/when we open non-admin
64194
64289
  * delegation, structural caller-scope subset check goes inside the
64195
64290
  * provider.
@@ -64246,15 +64341,7 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64246
64341
  kind: "mutation",
64247
64342
  auth: "admin",
64248
64343
  access: "delete"
64249
- }), method(CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, {
64250
- kind: "mutation",
64251
- auth: "admin",
64252
- access: "create"
64253
- }), method(object({ id: string() }), object({ success: literal(true) }), {
64254
- kind: "mutation",
64255
- auth: "admin",
64256
- access: "delete"
64257
- }), method(object({ token: string() }), ScopedTokenSummarySchema.nullable(), { access: "view" }), method(object({ userId: string() }), array(ScopedTokenSummarySchema), { auth: "admin" }), method(object({ userId: string() }), TotpSetupResultSchema, {
64344
+ }), method(object({ userId: string() }), TotpSetupResultSchema, {
64258
64345
  kind: "mutation",
64259
64346
  auth: "admin",
64260
64347
  access: "create"
@@ -70344,7 +70431,7 @@ Object.freeze({
70344
70431
  capName: "llm",
70345
70432
  capScope: "system",
70346
70433
  addonId: null,
70347
- access: "view"
70434
+ access: "create"
70348
70435
  },
70349
70436
  "llm.listNodeModels": {
70350
70437
  capName: "llm",
@@ -75008,12 +75095,6 @@ Object.freeze({
75008
75095
  addonId: null,
75009
75096
  access: "create"
75010
75097
  },
75011
- "userManagement.createScopedToken": {
75012
- capName: "user-management",
75013
- capScope: "system",
75014
- addonId: null,
75015
- access: "create"
75016
- },
75017
75098
  "userManagement.createUser": {
75018
75099
  capName: "user-management",
75019
75100
  capScope: "system",
@@ -75062,12 +75143,6 @@ Object.freeze({
75062
75143
  addonId: null,
75063
75144
  access: "view"
75064
75145
  },
75065
- "userManagement.listScopedTokens": {
75066
- capName: "user-management",
75067
- capScope: "system",
75068
- addonId: null,
75069
- access: "view"
75070
- },
75071
75146
  "userManagement.listUsers": {
75072
75147
  capName: "user-management",
75073
75148
  capScope: "system",
@@ -75122,12 +75197,6 @@ Object.freeze({
75122
75197
  addonId: null,
75123
75198
  access: "delete"
75124
75199
  },
75125
- "userManagement.revokeScopedToken": {
75126
- capName: "user-management",
75127
- capScope: "system",
75128
- addonId: null,
75129
- access: "delete"
75130
- },
75131
75200
  "userManagement.setupTotp": {
75132
75201
  capName: "user-management",
75133
75202
  capScope: "system",
@@ -75158,12 +75227,6 @@ Object.freeze({
75158
75227
  addonId: null,
75159
75228
  access: "view"
75160
75229
  },
75161
- "userManagement.validateScopedToken": {
75162
- capName: "user-management",
75163
- capScope: "system",
75164
- addonId: null,
75165
- access: "view"
75166
- },
75167
75230
  "userManagement.verifyTotp": {
75168
75231
  capName: "user-management",
75169
75232
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -5425,7 +5425,7 @@ var ZodIssueCode = {
5425
5425
  var ZodFirstPartyTypeKind;
5426
5426
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5427
5427
  //#endregion
5428
- //#region ../types/dist/sleep-BxjU_fJM.mjs
5428
+ //#region ../types/dist/sleep-yKL5gfrH.mjs
5429
5429
  /**
5430
5430
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5431
5431
  * window to float samples (D455).
@@ -7808,9 +7808,9 @@ function normalizeAddonInitResult(result) {
7808
7808
  return result;
7809
7809
  }
7810
7810
  /**
7811
- * The share-view scope kinds a `csv_*` share token can carry. The hub mints
7812
- * and validates them (`share-token.service.ts` builds its enum from this
7813
- * list); a data plane names the kinds it ACCEPTS in `share`.
7811
+ * The share-view scope kinds a share-link token can carry. The hub mints
7812
+ * and validates them (`ShareViewGrantSchema` builds its
7813
+ * enum from this list); a data plane names the kinds it ACCEPTS in `share`.
7814
7814
  */
7815
7815
  var SHARE_VIEW_KINDS = ["grid-view", "events-view"];
7816
7816
  /** The wire shape of {@link PeerBytesTicket} — see the type for what it is. */
@@ -12534,7 +12534,7 @@ var ConvertResultSchema = object({
12534
12534
  * `super_admin` — collapsed onto the single boolean because every
12535
12535
  * non-admin caller is governed by the same scope-check rules; the
12536
12536
  * distinction was only ever used to route role-specific procedures
12537
- * which we no longer have. CLI / webhook integrations are `cst_*` tokens
12537
+ * which we no longer have. CLI / webhook integrations are tokens (`auth.mintToken`)
12538
12538
  * with `isAdmin: false` + an explicit scope list.
12539
12539
  */
12540
12540
  /** Per-method access flavour. Materialised on every cap method via codegen. */
@@ -12723,10 +12723,12 @@ var AddonRoutesScopeSchema = object({
12723
12723
  type: literal("addon-routes"),
12724
12724
  access: array(MethodAccessSchema).min(1)
12725
12725
  });
12726
+ var PreferencesSelfScopeSchema = object({ type: literal("preferences-self") });
12726
12727
  var CredentialScopeSchema = union([
12727
12728
  literal("*"),
12728
12729
  ShareViewScopeSchema,
12729
12730
  AddonRoutesScopeSchema,
12731
+ PreferencesSelfScopeSchema,
12730
12732
  TokenScopeSchema
12731
12733
  ]);
12732
12734
  object({
@@ -12735,6 +12737,55 @@ object({
12735
12737
  jti: string().min(16),
12736
12738
  scopes: array(CredentialScopeSchema).min(1)
12737
12739
  });
12740
+ var PreferenceNamespaceSchema = string().regex(/^[a-z][a-z0-9.-]{0,63}$/);
12741
+ /** A namespace's value: a JSON object, opaque to the hub. */
12742
+ var PreferenceValueSchema = record(string(), unknown());
12743
+ var PreferenceDeviceIdSchema = string().min(1).max(64);
12744
+ /** A stored row, as the owner reads it. */
12745
+ var PreferenceRowSchema = object({
12746
+ namespace: PreferenceNamespaceSchema,
12747
+ value: PreferenceValueSchema,
12748
+ /** Starts at 1, +1 on every write of this namespace. A delete ends the row and its count. */
12749
+ revision: number().int().positive(),
12750
+ updatedAt: number().int(),
12751
+ /** The client id the last writer sent; `null` when it sent none. */
12752
+ updatedByDevice: PreferenceDeviceIdSchema.nullable()
12753
+ });
12754
+ object({
12755
+ /** Absent: every namespace the caller holds. */
12756
+ namespaces: array(PreferenceNamespaceSchema).max(32).optional() });
12757
+ object({ rows: array(PreferenceRowSchema) });
12758
+ object({
12759
+ namespace: PreferenceNamespaceSchema,
12760
+ value: PreferenceValueSchema,
12761
+ /**
12762
+ * The revision the edit was based on. Absent: last write wins. `0`: the
12763
+ * namespace must not exist yet. Any other value that is not the current
12764
+ * revision answers `conflict` and writes nothing.
12765
+ */
12766
+ baseRevision: number().int().nonnegative().optional(),
12767
+ deviceId: PreferenceDeviceIdSchema.optional()
12768
+ });
12769
+ discriminatedUnion("status", [object({
12770
+ status: literal("saved"),
12771
+ row: PreferenceRowSchema
12772
+ }), object({
12773
+ status: literal("conflict"),
12774
+ current: PreferenceRowSchema.nullable()
12775
+ })]);
12776
+ object({ namespace: PreferenceNamespaceSchema });
12777
+ object({
12778
+ /** `false` when the namespace did not exist. */
12779
+ deleted: boolean() });
12780
+ object({
12781
+ /** The revision the client holds per namespace; a namespace it does not list is new to it. */
12782
+ revisionByNamespace: record(PreferenceNamespaceSchema, number().int().nonnegative()).refine((map) => Object.keys(map).length <= 32, { message: `at most 32 namespaces` }) });
12783
+ object({
12784
+ /** Every row whose revision differs from the client's, and every row it did not list. */
12785
+ rows: array(PreferenceRowSchema),
12786
+ /** Namespaces the client listed that no longer exist. */
12787
+ deleted: array(PreferenceNamespaceSchema)
12788
+ });
12738
12789
  _enum(["new-session", "step-up"]);
12739
12790
  /** The languages the hub's app landing pages are written in (D858). */
12740
12791
  var AppPageLangSchema = _enum(["en", "it"]);
@@ -39928,38 +39979,37 @@ method(LlmRuntimeCompleteInputSchema, LlmGenerateResultSchema, {
39928
39979
  auth: "admin",
39929
39980
  timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
39930
39981
  });
39982
+ var LlmProfileKindSchema = string().regex(/^[a-z0-9][a-z0-9-]{0,63}$/, "a kind id is lower-case letters, digits and dashes");
39983
+ /** What a model (or, by default, every model of a kind) can do. */
39984
+ var LlmModelFeaturesSchema = object({
39985
+ vision: boolean(),
39986
+ tools: boolean(),
39987
+ streaming: boolean()
39988
+ });
39989
+ /** One model a provider offers. `features` overrides the kind's defaults, per field. */
39990
+ var LlmModelInfoSchema = object({
39991
+ id: string(),
39992
+ label: string().optional(),
39993
+ contextLength: number().int().positive().optional(),
39994
+ features: LlmModelFeaturesSchema.partial().optional()
39995
+ });
39931
39996
  /**
39932
- * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
39933
- * methods concat-fan across providers; single-row methods route to ONE
39934
- * provider by the `addonId` in the call input (the notification-output
39935
- * posture, notification-output.cap.ts:215-250). Provided by `addon-ai`
39936
- * (hub-placed); the cap stays open for future providers.
39937
- *
39938
- * Profiles are ROWS (data), not addons: one row = one usable model endpoint.
39939
- * `apiKey` is a password field — providers REDACT it on read and merge on
39940
- * write; a stored key NEVER round-trips to a client.
39997
+ * The provider-specific part of a profile, validated by the provider that owns
39998
+ * the kind (`upsertProfile` refuses what it does not accept). A field its
39999
+ * `connectionSchema` declares `type: 'password'` is a secret: it is held in the
40000
+ * keychain, never in the row, and reads back as the redaction marker.
39941
40001
  */
39942
- var LlmProfileKindSchema = _enum([
39943
- "openai-compatible",
39944
- "openai",
39945
- "anthropic",
39946
- "google",
39947
- "managed-local",
39948
- "apple-foundation"
39949
- ]);
40002
+ var LlmProviderConfigSchema = record(string(), unknown());
39950
40003
  var LlmProfileSchema = object({
39951
40004
  id: string(),
39952
40005
  name: string(),
40006
+ /** The provider-declared kind (`LlmProfileKindDescriptor.kind`). */
39953
40007
  kind: LlmProfileKindSchema,
39954
40008
  /** Stamped by the provider — keeps the fanned catalog routable. */
39955
40009
  addonId: string(),
39956
40010
  enabled: boolean(),
39957
40011
  /** Vendor model id, or the managed runtime's loaded model. */
39958
40012
  model: string(),
39959
- /** Required for openai-compatible; override for cloud kinds. */
39960
- baseUrl: string().optional(),
39961
- /** ConfigUISchema type:'password' — never round-trips (spec §5). */
39962
- apiKey: string().optional(),
39963
40013
  /** Vision on/off. A vision call against a `false` profile is REFUSED, never
39964
40014
  * degraded to text — that shipped once and produced a confident answer to a
39965
40015
  * question about a picture nobody sent. */
@@ -39967,15 +40017,11 @@ var LlmProfileSchema = object({
39967
40017
  temperature: number().min(0).max(2).optional(),
39968
40018
  /** Nucleus sampling. Every wire we speak has it. */
39969
40019
  topP: number().min(0).max(1).optional(),
39970
- /** Top-k sampling. Carried only by the wires that have it — NEITHER OpenAI
39971
- * wire does, and the client drops it there (measured: the request body gets
39972
- * `top_p` and no `top_k`). The profile editor hides the field wherever it
39973
- * would change nothing; `KINDS_WITH_TOP_K` is the single owner of that list. */
40020
+ /** Top-k sampling. Carried only by the wires that have it — a kind offers the
40021
+ * field in its editor only when its descriptor lists it in `profileFields`. */
39974
40022
  topK: number().int().positive().optional(),
39975
40023
  maxTokens: number().int().positive().optional(),
39976
- /** Prompt context window. Advisory for cloud kinds (they enforce their own);
39977
- * for `managed-local` it is the llama.cpp `--ctx-size` the runtime starts
39978
- * the model with, so it is the one field that changes a PROCESS. */
40024
+ /** Prompt context window. Advisory for cloud kinds (they enforce their own). */
39979
40025
  contextLength: number().int().positive().optional(),
39980
40026
  /** Default system prompt. A caller's `system` REPLACES it (never appends —
39981
40027
  * two system prompts fighting is worse than either alone). */
@@ -40001,16 +40047,37 @@ var LlmProfileSchema = object({
40001
40047
  * library; the REGISTRY of callable tools is ours and is empty in v1, so a
40002
40048
  * `true` here buys the wiring, not behaviour, until tools are registered. */
40003
40049
  toolsEnabled: boolean().default(false),
40004
- extraHeaders: record(string(), string()).optional(),
40005
- /** kind === 'managed-local' only (spec §4). */
40006
- runtime: ManagedRuntimeConfigSchema.optional(),
40007
- /**
40008
- * kind === 'apple-foundation' only: WHERE it runs — the only thing there is
40009
- * to configure (no key, no URL, no download; `model` is `apple-system`).
40010
- * `supportsVision` on such a row is stamped by the provider from the node's
40011
- * reported `imageInput`, never taken from the operator (D62).
40012
- */
40013
- appleFoundation: object({ nodeId: string() }).optional()
40050
+ /** Everything the kind's provider owns (endpoint, key, node, runtime…). */
40051
+ providerConfig: LlmProviderConfigSchema.default({})
40052
+ });
40053
+ /**
40054
+ * The common profile fields a kind's editor offers. The editor owns how each
40055
+ * one is drawn; the provider says which of them mean something on its wire.
40056
+ */
40057
+ var LlmProfileFieldSchema = _enum([
40058
+ "temperature",
40059
+ "topP",
40060
+ "topK",
40061
+ "maxTokens",
40062
+ "contextLength",
40063
+ "systemPrompt",
40064
+ "timeoutMs",
40065
+ "connectTimeoutMs",
40066
+ "firstTokenTimeoutMs",
40067
+ "idleTimeoutMs",
40068
+ "retry",
40069
+ "toolsEnabled"
40070
+ ]);
40071
+ /**
40072
+ * A provider-drawn part of the editor, by a generic widget id the admin UI
40073
+ * registers (`ai/apple-node`). `placement: 'model'` replaces the generic model
40074
+ * picker: that widget owns the model choice.
40075
+ */
40076
+ var LlmProviderWidgetSchema = object({
40077
+ id: string(),
40078
+ placement: _enum(["connection", "model"]),
40079
+ /** `providerConfig` keys this widget must fill before the profile can be saved. */
40080
+ requires: array(string()).optional()
40014
40081
  });
40015
40082
  /** ConfigUISchema tree passed through untyped on the wire (the
40016
40083
  * notification-output `ConfigSchemaPassthrough` precedent at
@@ -40019,11 +40086,56 @@ var ConfigSchemaPassthrough$3 = unknown();
40019
40086
  var LlmProfileKindDescriptorSchema = object({
40020
40087
  kind: LlmProfileKindSchema,
40021
40088
  label: string(),
40089
+ /** A generic icon name (`cloud`, `plug`, `cpu`) — never a glyph or a logo. */
40022
40090
  icon: string(),
40023
40091
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
40024
40092
  addonId: string(),
40025
- configSchema: ConfigSchemaPassthrough$3
40093
+ /** The provider's own fields (`providerConfig`); `password` fields are keychain-held. */
40094
+ connectionSchema: ConfigSchemaPassthrough$3,
40095
+ /** Provider fields that belong under "Advanced" (extra headers, runtime tuning). */
40096
+ advancedSchema: ConfigSchemaPassthrough$3.optional(),
40097
+ /** The kind's defaults; a model from `listModels` may override any of them. */
40098
+ features: LlmModelFeaturesSchema,
40099
+ /** `false` = the provider stamps `supportsVision` itself (from what a node reports). */
40100
+ visionEditable: boolean(),
40101
+ /** Where the model list comes from: `listModels`, `staticModels`, or nowhere. */
40102
+ modelCatalog: _enum([
40103
+ "fetch",
40104
+ "static",
40105
+ "none"
40106
+ ]),
40107
+ staticModels: array(LlmModelInfoSchema).optional(),
40108
+ /** The common fields that mean something on this kind's wire. */
40109
+ profileFields: array(LlmProfileFieldSchema),
40110
+ providerWidgets: array(LlmProviderWidgetSchema).optional()
40026
40111
  });
40112
+ /**
40113
+ * `listModels` input. `connection` is an UNSAVED draft of `providerConfig`
40114
+ * (the editor's form); with `profileId` too, a secret the draft leaves
40115
+ * untouched (absent or the redaction marker) is resolved server-side from the
40116
+ * stored profile — the browser never receives it.
40117
+ */
40118
+ var LlmListModelsInputSchema = object({
40119
+ addonId: string(),
40120
+ kind: LlmProfileKindSchema,
40121
+ profileId: string().optional(),
40122
+ connection: LlmProviderConfigSchema.optional()
40123
+ });
40124
+ var LlmListModelsErrorCodeSchema = _enum([
40125
+ "auth",
40126
+ "network",
40127
+ "unsupported",
40128
+ "invalid"
40129
+ ]);
40130
+ /** A RESULT, never a throw: "wrong key" is an answer the editor renders inline. */
40131
+ var LlmListModelsResultSchema = discriminatedUnion("ok", [object({
40132
+ ok: literal(true),
40133
+ models: array(LlmModelInfoSchema)
40134
+ }), object({
40135
+ ok: literal(false),
40136
+ code: LlmListModelsErrorCodeSchema,
40137
+ message: string()
40138
+ })]);
40027
40139
  var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
40028
40140
  var LlmDefaultSchema = object({
40029
40141
  selector: LlmDefaultSelectorSchema,
@@ -40123,7 +40235,10 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
40123
40235
  kind: "mutation",
40124
40236
  auth: "admin",
40125
40237
  timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
40126
- }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
40238
+ }), method(LlmListModelsInputSchema, LlmListModelsResultSchema, {
40239
+ kind: "mutation",
40240
+ auth: "admin"
40241
+ }), method(object({}), array(LlmDefaultSchema)), method(object({
40127
40242
  selector: LlmDefaultSelectorSchema,
40128
40243
  profileId: string().nullable()
40129
40244
  }), _void(), {
@@ -64123,26 +64238,6 @@ var ApiKeySummarySchema = object({
64123
64238
  createdAt: number(),
64124
64239
  lastUsedAt: number().optional()
64125
64240
  });
64126
- var ScopedTokenSummarySchema = object({
64127
- id: string(),
64128
- userId: string(),
64129
- name: string(),
64130
- tokenPrefix: string(),
64131
- scopes: array(TokenScopeSchema),
64132
- expiresAt: number().nullish(),
64133
- lastUsedAt: number().nullish(),
64134
- createdAt: number()
64135
- });
64136
- var CreateScopedTokenInputSchema = object({
64137
- userId: string(),
64138
- name: string(),
64139
- scopes: array(TokenScopeSchema),
64140
- expiresAt: number().optional()
64141
- });
64142
- var CreateScopedTokenResultSchema = object({
64143
- token: string(),
64144
- record: ScopedTokenSummarySchema
64145
- });
64146
64241
  var OauthSessionSummarySchema = object({
64147
64242
  id: string(),
64148
64243
  userId: string(),
@@ -64164,11 +64259,11 @@ var TotpStatusSchema = object({
64164
64259
  confirmedAt: number().nullable()
64165
64260
  });
64166
64261
  /**
64167
- * user-management — singleton capability for user accounts, API keys,
64168
- * and scoped tokens.
64262
+ * user-management — singleton capability for user accounts and the
64263
+ * legacy API-key rows.
64169
64264
  *
64170
64265
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64171
- * — the subset check on `setUserScopes` / `createScopedToken` is moot
64266
+ * — the subset check on `setUserScopes` is moot
64172
64267
  * because non-admins never reach these. If/when we open non-admin
64173
64268
  * delegation, structural caller-scope subset check goes inside the
64174
64269
  * provider.
@@ -64225,15 +64320,7 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64225
64320
  kind: "mutation",
64226
64321
  auth: "admin",
64227
64322
  access: "delete"
64228
- }), method(CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, {
64229
- kind: "mutation",
64230
- auth: "admin",
64231
- access: "create"
64232
- }), method(object({ id: string() }), object({ success: literal(true) }), {
64233
- kind: "mutation",
64234
- auth: "admin",
64235
- access: "delete"
64236
- }), method(object({ token: string() }), ScopedTokenSummarySchema.nullable(), { access: "view" }), method(object({ userId: string() }), array(ScopedTokenSummarySchema), { auth: "admin" }), method(object({ userId: string() }), TotpSetupResultSchema, {
64323
+ }), method(object({ userId: string() }), TotpSetupResultSchema, {
64237
64324
  kind: "mutation",
64238
64325
  auth: "admin",
64239
64326
  access: "create"
@@ -70323,7 +70410,7 @@ Object.freeze({
70323
70410
  capName: "llm",
70324
70411
  capScope: "system",
70325
70412
  addonId: null,
70326
- access: "view"
70413
+ access: "create"
70327
70414
  },
70328
70415
  "llm.listNodeModels": {
70329
70416
  capName: "llm",
@@ -74987,12 +75074,6 @@ Object.freeze({
74987
75074
  addonId: null,
74988
75075
  access: "create"
74989
75076
  },
74990
- "userManagement.createScopedToken": {
74991
- capName: "user-management",
74992
- capScope: "system",
74993
- addonId: null,
74994
- access: "create"
74995
- },
74996
75077
  "userManagement.createUser": {
74997
75078
  capName: "user-management",
74998
75079
  capScope: "system",
@@ -75041,12 +75122,6 @@ Object.freeze({
75041
75122
  addonId: null,
75042
75123
  access: "view"
75043
75124
  },
75044
- "userManagement.listScopedTokens": {
75045
- capName: "user-management",
75046
- capScope: "system",
75047
- addonId: null,
75048
- access: "view"
75049
- },
75050
75125
  "userManagement.listUsers": {
75051
75126
  capName: "user-management",
75052
75127
  capScope: "system",
@@ -75101,12 +75176,6 @@ Object.freeze({
75101
75176
  addonId: null,
75102
75177
  access: "delete"
75103
75178
  },
75104
- "userManagement.revokeScopedToken": {
75105
- capName: "user-management",
75106
- capScope: "system",
75107
- addonId: null,
75108
- access: "delete"
75109
- },
75110
75179
  "userManagement.setupTotp": {
75111
75180
  capName: "user-management",
75112
75181
  capScope: "system",
@@ -75137,12 +75206,6 @@ Object.freeze({
75137
75206
  addonId: null,
75138
75207
  access: "view"
75139
75208
  },
75140
- "userManagement.validateScopedToken": {
75141
- capName: "user-management",
75142
- capScope: "system",
75143
- addonId: null,
75144
- access: "view"
75145
- },
75146
75209
  "userManagement.verifyTotp": {
75147
75210
  capName: "user-management",
75148
75211
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-wyze",
3
- "version": "0.2.142",
3
+ "version": "0.2.143",
4
4
  "description": "Wyze camera device-provider addon for CamStack — wraps the @apocaliss92/wyze-bridge-js P2P/DTLS client, feeding the stream-broker via the pull-rfc4571 lazy-publish path (a structural twin of addon-provider-reolink)",
5
5
  "keywords": [
6
6
  "camstack",