@camstack/addon-provider-bosch 0.1.4 → 0.1.5

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.
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-BsKpHOt8.js");
1
+ const require_dist = require("./dist-CIIror0W.js");
2
2
  //#region src/shared/oauth-callback.ts
3
3
  /** A code on its own: no scheme, no query, no separators. */
4
4
  var BARE_CODE = /^[A-Za-z0-9._~-]+$/;
@@ -1,4 +1,4 @@
1
- import { b as errMsg } from "./dist-LJMt_ZXW.mjs";
1
+ import { b as errMsg } from "./dist-DNznrlG_.mjs";
2
2
  //#region src/shared/oauth-callback.ts
3
3
  /** A code on its own: no scheme, no query, no separators. */
4
4
  var BARE_CODE = /^[A-Za-z0-9._~-]+$/;
@@ -5414,7 +5414,7 @@ var ZodIssueCode = {
5414
5414
  var ZodFirstPartyTypeKind;
5415
5415
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5416
5416
  //#endregion
5417
- //#region ../types/dist/sleep-BxjU_fJM.mjs
5417
+ //#region ../types/dist/sleep-yKL5gfrH.mjs
5418
5418
  /**
5419
5419
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5420
5420
  * window to float samples (D455).
@@ -7801,9 +7801,9 @@ function normalizeAddonInitResult(result) {
7801
7801
  return result;
7802
7802
  }
7803
7803
  /**
7804
- * The share-view scope kinds a `csv_*` share token can carry. The hub mints
7805
- * and validates them (`share-token.service.ts` builds its enum from this
7806
- * list); a data plane names the kinds it ACCEPTS in `share`.
7804
+ * The share-view scope kinds a share-link token can carry. The hub mints
7805
+ * and validates them (`ShareViewGrantSchema` builds its
7806
+ * enum from this list); a data plane names the kinds it ACCEPTS in `share`.
7807
7807
  */
7808
7808
  var SHARE_VIEW_KINDS = ["grid-view", "events-view"];
7809
7809
  /** The wire shape of {@link PeerBytesTicket} — see the type for what it is. */
@@ -12515,7 +12515,7 @@ var ConvertResultSchema = object({
12515
12515
  * `super_admin` — collapsed onto the single boolean because every
12516
12516
  * non-admin caller is governed by the same scope-check rules; the
12517
12517
  * distinction was only ever used to route role-specific procedures
12518
- * which we no longer have. CLI / webhook integrations are `cst_*` tokens
12518
+ * which we no longer have. CLI / webhook integrations are tokens (`auth.mintToken`)
12519
12519
  * with `isAdmin: false` + an explicit scope list.
12520
12520
  */
12521
12521
  /** Per-method access flavour. Materialised on every cap method via codegen. */
@@ -12704,10 +12704,12 @@ var AddonRoutesScopeSchema = object({
12704
12704
  type: literal("addon-routes"),
12705
12705
  access: array(MethodAccessSchema).min(1)
12706
12706
  });
12707
+ var PreferencesSelfScopeSchema = object({ type: literal("preferences-self") });
12707
12708
  var CredentialScopeSchema = union([
12708
12709
  literal("*"),
12709
12710
  ShareViewScopeSchema,
12710
12711
  AddonRoutesScopeSchema,
12712
+ PreferencesSelfScopeSchema,
12711
12713
  TokenScopeSchema
12712
12714
  ]);
12713
12715
  object({
@@ -12716,6 +12718,55 @@ object({
12716
12718
  jti: string().min(16),
12717
12719
  scopes: array(CredentialScopeSchema).min(1)
12718
12720
  });
12721
+ var PreferenceNamespaceSchema = string().regex(/^[a-z][a-z0-9.-]{0,63}$/);
12722
+ /** A namespace's value: a JSON object, opaque to the hub. */
12723
+ var PreferenceValueSchema = record(string(), unknown());
12724
+ var PreferenceDeviceIdSchema = string().min(1).max(64);
12725
+ /** A stored row, as the owner reads it. */
12726
+ var PreferenceRowSchema = object({
12727
+ namespace: PreferenceNamespaceSchema,
12728
+ value: PreferenceValueSchema,
12729
+ /** Starts at 1, +1 on every write of this namespace. A delete ends the row and its count. */
12730
+ revision: number().int().positive(),
12731
+ updatedAt: number().int(),
12732
+ /** The client id the last writer sent; `null` when it sent none. */
12733
+ updatedByDevice: PreferenceDeviceIdSchema.nullable()
12734
+ });
12735
+ object({
12736
+ /** Absent: every namespace the caller holds. */
12737
+ namespaces: array(PreferenceNamespaceSchema).max(32).optional() });
12738
+ object({ rows: array(PreferenceRowSchema) });
12739
+ object({
12740
+ namespace: PreferenceNamespaceSchema,
12741
+ value: PreferenceValueSchema,
12742
+ /**
12743
+ * The revision the edit was based on. Absent: last write wins. `0`: the
12744
+ * namespace must not exist yet. Any other value that is not the current
12745
+ * revision answers `conflict` and writes nothing.
12746
+ */
12747
+ baseRevision: number().int().nonnegative().optional(),
12748
+ deviceId: PreferenceDeviceIdSchema.optional()
12749
+ });
12750
+ discriminatedUnion("status", [object({
12751
+ status: literal("saved"),
12752
+ row: PreferenceRowSchema
12753
+ }), object({
12754
+ status: literal("conflict"),
12755
+ current: PreferenceRowSchema.nullable()
12756
+ })]);
12757
+ object({ namespace: PreferenceNamespaceSchema });
12758
+ object({
12759
+ /** `false` when the namespace did not exist. */
12760
+ deleted: boolean() });
12761
+ object({
12762
+ /** The revision the client holds per namespace; a namespace it does not list is new to it. */
12763
+ revisionByNamespace: record(PreferenceNamespaceSchema, number().int().nonnegative()).refine((map) => Object.keys(map).length <= 32, { message: `at most 32 namespaces` }) });
12764
+ object({
12765
+ /** Every row whose revision differs from the client's, and every row it did not list. */
12766
+ rows: array(PreferenceRowSchema),
12767
+ /** Namespaces the client listed that no longer exist. */
12768
+ deleted: array(PreferenceNamespaceSchema)
12769
+ });
12719
12770
  _enum(["new-session", "step-up"]);
12720
12771
  /** The languages the hub's app landing pages are written in (D858). */
12721
12772
  var AppPageLangSchema = _enum(["en", "it"]);
@@ -39909,38 +39960,37 @@ method(LlmRuntimeCompleteInputSchema, LlmGenerateResultSchema, {
39909
39960
  auth: "admin",
39910
39961
  timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
39911
39962
  });
39963
+ var LlmProfileKindSchema = string().regex(/^[a-z0-9][a-z0-9-]{0,63}$/, "a kind id is lower-case letters, digits and dashes");
39964
+ /** What a model (or, by default, every model of a kind) can do. */
39965
+ var LlmModelFeaturesSchema = object({
39966
+ vision: boolean(),
39967
+ tools: boolean(),
39968
+ streaming: boolean()
39969
+ });
39970
+ /** One model a provider offers. `features` overrides the kind's defaults, per field. */
39971
+ var LlmModelInfoSchema = object({
39972
+ id: string(),
39973
+ label: string().optional(),
39974
+ contextLength: number().int().positive().optional(),
39975
+ features: LlmModelFeaturesSchema.partial().optional()
39976
+ });
39912
39977
  /**
39913
- * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
39914
- * methods concat-fan across providers; single-row methods route to ONE
39915
- * provider by the `addonId` in the call input (the notification-output
39916
- * posture, notification-output.cap.ts:215-250). Provided by `addon-ai`
39917
- * (hub-placed); the cap stays open for future providers.
39918
- *
39919
- * Profiles are ROWS (data), not addons: one row = one usable model endpoint.
39920
- * `apiKey` is a password field — providers REDACT it on read and merge on
39921
- * write; a stored key NEVER round-trips to a client.
39978
+ * The provider-specific part of a profile, validated by the provider that owns
39979
+ * the kind (`upsertProfile` refuses what it does not accept). A field its
39980
+ * `connectionSchema` declares `type: 'password'` is a secret: it is held in the
39981
+ * keychain, never in the row, and reads back as the redaction marker.
39922
39982
  */
39923
- var LlmProfileKindSchema = _enum([
39924
- "openai-compatible",
39925
- "openai",
39926
- "anthropic",
39927
- "google",
39928
- "managed-local",
39929
- "apple-foundation"
39930
- ]);
39983
+ var LlmProviderConfigSchema = record(string(), unknown());
39931
39984
  var LlmProfileSchema = object({
39932
39985
  id: string(),
39933
39986
  name: string(),
39987
+ /** The provider-declared kind (`LlmProfileKindDescriptor.kind`). */
39934
39988
  kind: LlmProfileKindSchema,
39935
39989
  /** Stamped by the provider — keeps the fanned catalog routable. */
39936
39990
  addonId: string(),
39937
39991
  enabled: boolean(),
39938
39992
  /** Vendor model id, or the managed runtime's loaded model. */
39939
39993
  model: string(),
39940
- /** Required for openai-compatible; override for cloud kinds. */
39941
- baseUrl: string().optional(),
39942
- /** ConfigUISchema type:'password' — never round-trips (spec §5). */
39943
- apiKey: string().optional(),
39944
39994
  /** Vision on/off. A vision call against a `false` profile is REFUSED, never
39945
39995
  * degraded to text — that shipped once and produced a confident answer to a
39946
39996
  * question about a picture nobody sent. */
@@ -39948,15 +39998,11 @@ var LlmProfileSchema = object({
39948
39998
  temperature: number().min(0).max(2).optional(),
39949
39999
  /** Nucleus sampling. Every wire we speak has it. */
39950
40000
  topP: number().min(0).max(1).optional(),
39951
- /** Top-k sampling. Carried only by the wires that have it — NEITHER OpenAI
39952
- * wire does, and the client drops it there (measured: the request body gets
39953
- * `top_p` and no `top_k`). The profile editor hides the field wherever it
39954
- * would change nothing; `KINDS_WITH_TOP_K` is the single owner of that list. */
40001
+ /** Top-k sampling. Carried only by the wires that have it — a kind offers the
40002
+ * field in its editor only when its descriptor lists it in `profileFields`. */
39955
40003
  topK: number().int().positive().optional(),
39956
40004
  maxTokens: number().int().positive().optional(),
39957
- /** Prompt context window. Advisory for cloud kinds (they enforce their own);
39958
- * for `managed-local` it is the llama.cpp `--ctx-size` the runtime starts
39959
- * the model with, so it is the one field that changes a PROCESS. */
40005
+ /** Prompt context window. Advisory for cloud kinds (they enforce their own). */
39960
40006
  contextLength: number().int().positive().optional(),
39961
40007
  /** Default system prompt. A caller's `system` REPLACES it (never appends —
39962
40008
  * two system prompts fighting is worse than either alone). */
@@ -39982,16 +40028,37 @@ var LlmProfileSchema = object({
39982
40028
  * library; the REGISTRY of callable tools is ours and is empty in v1, so a
39983
40029
  * `true` here buys the wiring, not behaviour, until tools are registered. */
39984
40030
  toolsEnabled: boolean().default(false),
39985
- extraHeaders: record(string(), string()).optional(),
39986
- /** kind === 'managed-local' only (spec §4). */
39987
- runtime: ManagedRuntimeConfigSchema.optional(),
39988
- /**
39989
- * kind === 'apple-foundation' only: WHERE it runs — the only thing there is
39990
- * to configure (no key, no URL, no download; `model` is `apple-system`).
39991
- * `supportsVision` on such a row is stamped by the provider from the node's
39992
- * reported `imageInput`, never taken from the operator (D62).
39993
- */
39994
- appleFoundation: object({ nodeId: string() }).optional()
40031
+ /** Everything the kind's provider owns (endpoint, key, node, runtime…). */
40032
+ providerConfig: LlmProviderConfigSchema.default({})
40033
+ });
40034
+ /**
40035
+ * The common profile fields a kind's editor offers. The editor owns how each
40036
+ * one is drawn; the provider says which of them mean something on its wire.
40037
+ */
40038
+ var LlmProfileFieldSchema = _enum([
40039
+ "temperature",
40040
+ "topP",
40041
+ "topK",
40042
+ "maxTokens",
40043
+ "contextLength",
40044
+ "systemPrompt",
40045
+ "timeoutMs",
40046
+ "connectTimeoutMs",
40047
+ "firstTokenTimeoutMs",
40048
+ "idleTimeoutMs",
40049
+ "retry",
40050
+ "toolsEnabled"
40051
+ ]);
40052
+ /**
40053
+ * A provider-drawn part of the editor, by a generic widget id the admin UI
40054
+ * registers (`ai/apple-node`). `placement: 'model'` replaces the generic model
40055
+ * picker: that widget owns the model choice.
40056
+ */
40057
+ var LlmProviderWidgetSchema = object({
40058
+ id: string(),
40059
+ placement: _enum(["connection", "model"]),
40060
+ /** `providerConfig` keys this widget must fill before the profile can be saved. */
40061
+ requires: array(string()).optional()
39995
40062
  });
39996
40063
  /** ConfigUISchema tree passed through untyped on the wire (the
39997
40064
  * notification-output `ConfigSchemaPassthrough` precedent at
@@ -40000,11 +40067,56 @@ var ConfigSchemaPassthrough$3 = unknown();
40000
40067
  var LlmProfileKindDescriptorSchema = object({
40001
40068
  kind: LlmProfileKindSchema,
40002
40069
  label: string(),
40070
+ /** A generic icon name (`cloud`, `plug`, `cpu`) — never a glyph or a logo. */
40003
40071
  icon: string(),
40004
40072
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
40005
40073
  addonId: string(),
40006
- configSchema: ConfigSchemaPassthrough$3
40074
+ /** The provider's own fields (`providerConfig`); `password` fields are keychain-held. */
40075
+ connectionSchema: ConfigSchemaPassthrough$3,
40076
+ /** Provider fields that belong under "Advanced" (extra headers, runtime tuning). */
40077
+ advancedSchema: ConfigSchemaPassthrough$3.optional(),
40078
+ /** The kind's defaults; a model from `listModels` may override any of them. */
40079
+ features: LlmModelFeaturesSchema,
40080
+ /** `false` = the provider stamps `supportsVision` itself (from what a node reports). */
40081
+ visionEditable: boolean(),
40082
+ /** Where the model list comes from: `listModels`, `staticModels`, or nowhere. */
40083
+ modelCatalog: _enum([
40084
+ "fetch",
40085
+ "static",
40086
+ "none"
40087
+ ]),
40088
+ staticModels: array(LlmModelInfoSchema).optional(),
40089
+ /** The common fields that mean something on this kind's wire. */
40090
+ profileFields: array(LlmProfileFieldSchema),
40091
+ providerWidgets: array(LlmProviderWidgetSchema).optional()
40007
40092
  });
40093
+ /**
40094
+ * `listModels` input. `connection` is an UNSAVED draft of `providerConfig`
40095
+ * (the editor's form); with `profileId` too, a secret the draft leaves
40096
+ * untouched (absent or the redaction marker) is resolved server-side from the
40097
+ * stored profile — the browser never receives it.
40098
+ */
40099
+ var LlmListModelsInputSchema = object({
40100
+ addonId: string(),
40101
+ kind: LlmProfileKindSchema,
40102
+ profileId: string().optional(),
40103
+ connection: LlmProviderConfigSchema.optional()
40104
+ });
40105
+ var LlmListModelsErrorCodeSchema = _enum([
40106
+ "auth",
40107
+ "network",
40108
+ "unsupported",
40109
+ "invalid"
40110
+ ]);
40111
+ /** A RESULT, never a throw: "wrong key" is an answer the editor renders inline. */
40112
+ var LlmListModelsResultSchema = discriminatedUnion("ok", [object({
40113
+ ok: literal(true),
40114
+ models: array(LlmModelInfoSchema)
40115
+ }), object({
40116
+ ok: literal(false),
40117
+ code: LlmListModelsErrorCodeSchema,
40118
+ message: string()
40119
+ })]);
40008
40120
  var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
40009
40121
  var LlmDefaultSchema = object({
40010
40122
  selector: LlmDefaultSelectorSchema,
@@ -40104,7 +40216,10 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
40104
40216
  kind: "mutation",
40105
40217
  auth: "admin",
40106
40218
  timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
40107
- }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
40219
+ }), method(LlmListModelsInputSchema, LlmListModelsResultSchema, {
40220
+ kind: "mutation",
40221
+ auth: "admin"
40222
+ }), method(object({}), array(LlmDefaultSchema)), method(object({
40108
40223
  selector: LlmDefaultSelectorSchema,
40109
40224
  profileId: string().nullable()
40110
40225
  }), _void(), {
@@ -64000,26 +64115,6 @@ var ApiKeySummarySchema = object({
64000
64115
  createdAt: number(),
64001
64116
  lastUsedAt: number().optional()
64002
64117
  });
64003
- var ScopedTokenSummarySchema = object({
64004
- id: string(),
64005
- userId: string(),
64006
- name: string(),
64007
- tokenPrefix: string(),
64008
- scopes: array(TokenScopeSchema),
64009
- expiresAt: number().nullish(),
64010
- lastUsedAt: number().nullish(),
64011
- createdAt: number()
64012
- });
64013
- var CreateScopedTokenInputSchema = object({
64014
- userId: string(),
64015
- name: string(),
64016
- scopes: array(TokenScopeSchema),
64017
- expiresAt: number().optional()
64018
- });
64019
- var CreateScopedTokenResultSchema = object({
64020
- token: string(),
64021
- record: ScopedTokenSummarySchema
64022
- });
64023
64118
  var OauthSessionSummarySchema = object({
64024
64119
  id: string(),
64025
64120
  userId: string(),
@@ -64041,11 +64136,11 @@ var TotpStatusSchema = object({
64041
64136
  confirmedAt: number().nullable()
64042
64137
  });
64043
64138
  /**
64044
- * user-management — singleton capability for user accounts, API keys,
64045
- * and scoped tokens.
64139
+ * user-management — singleton capability for user accounts and the
64140
+ * legacy API-key rows.
64046
64141
  *
64047
64142
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64048
- * — the subset check on `setUserScopes` / `createScopedToken` is moot
64143
+ * — the subset check on `setUserScopes` is moot
64049
64144
  * because non-admins never reach these. If/when we open non-admin
64050
64145
  * delegation, structural caller-scope subset check goes inside the
64051
64146
  * provider.
@@ -64102,15 +64197,7 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64102
64197
  kind: "mutation",
64103
64198
  auth: "admin",
64104
64199
  access: "delete"
64105
- }), method(CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, {
64106
- kind: "mutation",
64107
- auth: "admin",
64108
- access: "create"
64109
- }), method(object({ id: string() }), object({ success: literal(true) }), {
64110
- kind: "mutation",
64111
- auth: "admin",
64112
- access: "delete"
64113
- }), method(object({ token: string() }), ScopedTokenSummarySchema.nullable(), { access: "view" }), method(object({ userId: string() }), array(ScopedTokenSummarySchema), { auth: "admin" }), method(object({ userId: string() }), TotpSetupResultSchema, {
64200
+ }), method(object({ userId: string() }), TotpSetupResultSchema, {
64114
64201
  kind: "mutation",
64115
64202
  auth: "admin",
64116
64203
  access: "create"
@@ -70200,7 +70287,7 @@ Object.freeze({
70200
70287
  capName: "llm",
70201
70288
  capScope: "system",
70202
70289
  addonId: null,
70203
- access: "view"
70290
+ access: "create"
70204
70291
  },
70205
70292
  "llm.listNodeModels": {
70206
70293
  capName: "llm",
@@ -74864,12 +74951,6 @@ Object.freeze({
74864
74951
  addonId: null,
74865
74952
  access: "create"
74866
74953
  },
74867
- "userManagement.createScopedToken": {
74868
- capName: "user-management",
74869
- capScope: "system",
74870
- addonId: null,
74871
- access: "create"
74872
- },
74873
74954
  "userManagement.createUser": {
74874
74955
  capName: "user-management",
74875
74956
  capScope: "system",
@@ -74918,12 +74999,6 @@ Object.freeze({
74918
74999
  addonId: null,
74919
75000
  access: "view"
74920
75001
  },
74921
- "userManagement.listScopedTokens": {
74922
- capName: "user-management",
74923
- capScope: "system",
74924
- addonId: null,
74925
- access: "view"
74926
- },
74927
75002
  "userManagement.listUsers": {
74928
75003
  capName: "user-management",
74929
75004
  capScope: "system",
@@ -74978,12 +75053,6 @@ Object.freeze({
74978
75053
  addonId: null,
74979
75054
  access: "delete"
74980
75055
  },
74981
- "userManagement.revokeScopedToken": {
74982
- capName: "user-management",
74983
- capScope: "system",
74984
- addonId: null,
74985
- access: "delete"
74986
- },
74987
75056
  "userManagement.setupTotp": {
74988
75057
  capName: "user-management",
74989
75058
  capScope: "system",
@@ -75014,12 +75083,6 @@ Object.freeze({
75014
75083
  addonId: null,
75015
75084
  access: "view"
75016
75085
  },
75017
- "userManagement.validateScopedToken": {
75018
- capName: "user-management",
75019
- capScope: "system",
75020
- addonId: null,
75021
- access: "view"
75022
- },
75023
75086
  "userManagement.verifyTotp": {
75024
75087
  capName: "user-management",
75025
75088
  capScope: "system",
@@ -5414,7 +5414,7 @@ var ZodIssueCode = {
5414
5414
  var ZodFirstPartyTypeKind;
5415
5415
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5416
5416
  //#endregion
5417
- //#region ../types/dist/sleep-BxjU_fJM.mjs
5417
+ //#region ../types/dist/sleep-yKL5gfrH.mjs
5418
5418
  /**
5419
5419
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5420
5420
  * window to float samples (D455).
@@ -7801,9 +7801,9 @@ function normalizeAddonInitResult(result) {
7801
7801
  return result;
7802
7802
  }
7803
7803
  /**
7804
- * The share-view scope kinds a `csv_*` share token can carry. The hub mints
7805
- * and validates them (`share-token.service.ts` builds its enum from this
7806
- * list); a data plane names the kinds it ACCEPTS in `share`.
7804
+ * The share-view scope kinds a share-link token can carry. The hub mints
7805
+ * and validates them (`ShareViewGrantSchema` builds its
7806
+ * enum from this list); a data plane names the kinds it ACCEPTS in `share`.
7807
7807
  */
7808
7808
  var SHARE_VIEW_KINDS = ["grid-view", "events-view"];
7809
7809
  /** The wire shape of {@link PeerBytesTicket} — see the type for what it is. */
@@ -12515,7 +12515,7 @@ var ConvertResultSchema = object({
12515
12515
  * `super_admin` — collapsed onto the single boolean because every
12516
12516
  * non-admin caller is governed by the same scope-check rules; the
12517
12517
  * distinction was only ever used to route role-specific procedures
12518
- * which we no longer have. CLI / webhook integrations are `cst_*` tokens
12518
+ * which we no longer have. CLI / webhook integrations are tokens (`auth.mintToken`)
12519
12519
  * with `isAdmin: false` + an explicit scope list.
12520
12520
  */
12521
12521
  /** Per-method access flavour. Materialised on every cap method via codegen. */
@@ -12704,10 +12704,12 @@ var AddonRoutesScopeSchema = object({
12704
12704
  type: literal("addon-routes"),
12705
12705
  access: array(MethodAccessSchema).min(1)
12706
12706
  });
12707
+ var PreferencesSelfScopeSchema = object({ type: literal("preferences-self") });
12707
12708
  var CredentialScopeSchema = union([
12708
12709
  literal("*"),
12709
12710
  ShareViewScopeSchema,
12710
12711
  AddonRoutesScopeSchema,
12712
+ PreferencesSelfScopeSchema,
12711
12713
  TokenScopeSchema
12712
12714
  ]);
12713
12715
  object({
@@ -12716,6 +12718,55 @@ object({
12716
12718
  jti: string().min(16),
12717
12719
  scopes: array(CredentialScopeSchema).min(1)
12718
12720
  });
12721
+ var PreferenceNamespaceSchema = string().regex(/^[a-z][a-z0-9.-]{0,63}$/);
12722
+ /** A namespace's value: a JSON object, opaque to the hub. */
12723
+ var PreferenceValueSchema = record(string(), unknown());
12724
+ var PreferenceDeviceIdSchema = string().min(1).max(64);
12725
+ /** A stored row, as the owner reads it. */
12726
+ var PreferenceRowSchema = object({
12727
+ namespace: PreferenceNamespaceSchema,
12728
+ value: PreferenceValueSchema,
12729
+ /** Starts at 1, +1 on every write of this namespace. A delete ends the row and its count. */
12730
+ revision: number().int().positive(),
12731
+ updatedAt: number().int(),
12732
+ /** The client id the last writer sent; `null` when it sent none. */
12733
+ updatedByDevice: PreferenceDeviceIdSchema.nullable()
12734
+ });
12735
+ object({
12736
+ /** Absent: every namespace the caller holds. */
12737
+ namespaces: array(PreferenceNamespaceSchema).max(32).optional() });
12738
+ object({ rows: array(PreferenceRowSchema) });
12739
+ object({
12740
+ namespace: PreferenceNamespaceSchema,
12741
+ value: PreferenceValueSchema,
12742
+ /**
12743
+ * The revision the edit was based on. Absent: last write wins. `0`: the
12744
+ * namespace must not exist yet. Any other value that is not the current
12745
+ * revision answers `conflict` and writes nothing.
12746
+ */
12747
+ baseRevision: number().int().nonnegative().optional(),
12748
+ deviceId: PreferenceDeviceIdSchema.optional()
12749
+ });
12750
+ discriminatedUnion("status", [object({
12751
+ status: literal("saved"),
12752
+ row: PreferenceRowSchema
12753
+ }), object({
12754
+ status: literal("conflict"),
12755
+ current: PreferenceRowSchema.nullable()
12756
+ })]);
12757
+ object({ namespace: PreferenceNamespaceSchema });
12758
+ object({
12759
+ /** `false` when the namespace did not exist. */
12760
+ deleted: boolean() });
12761
+ object({
12762
+ /** The revision the client holds per namespace; a namespace it does not list is new to it. */
12763
+ revisionByNamespace: record(PreferenceNamespaceSchema, number().int().nonnegative()).refine((map) => Object.keys(map).length <= 32, { message: `at most 32 namespaces` }) });
12764
+ object({
12765
+ /** Every row whose revision differs from the client's, and every row it did not list. */
12766
+ rows: array(PreferenceRowSchema),
12767
+ /** Namespaces the client listed that no longer exist. */
12768
+ deleted: array(PreferenceNamespaceSchema)
12769
+ });
12719
12770
  _enum(["new-session", "step-up"]);
12720
12771
  /** The languages the hub's app landing pages are written in (D858). */
12721
12772
  var AppPageLangSchema = _enum(["en", "it"]);
@@ -39909,38 +39960,37 @@ method(LlmRuntimeCompleteInputSchema, LlmGenerateResultSchema, {
39909
39960
  auth: "admin",
39910
39961
  timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
39911
39962
  });
39963
+ var LlmProfileKindSchema = string().regex(/^[a-z0-9][a-z0-9-]{0,63}$/, "a kind id is lower-case letters, digits and dashes");
39964
+ /** What a model (or, by default, every model of a kind) can do. */
39965
+ var LlmModelFeaturesSchema = object({
39966
+ vision: boolean(),
39967
+ tools: boolean(),
39968
+ streaming: boolean()
39969
+ });
39970
+ /** One model a provider offers. `features` overrides the kind's defaults, per field. */
39971
+ var LlmModelInfoSchema = object({
39972
+ id: string(),
39973
+ label: string().optional(),
39974
+ contextLength: number().int().positive().optional(),
39975
+ features: LlmModelFeaturesSchema.partial().optional()
39976
+ });
39912
39977
  /**
39913
- * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
39914
- * methods concat-fan across providers; single-row methods route to ONE
39915
- * provider by the `addonId` in the call input (the notification-output
39916
- * posture, notification-output.cap.ts:215-250). Provided by `addon-ai`
39917
- * (hub-placed); the cap stays open for future providers.
39918
- *
39919
- * Profiles are ROWS (data), not addons: one row = one usable model endpoint.
39920
- * `apiKey` is a password field — providers REDACT it on read and merge on
39921
- * write; a stored key NEVER round-trips to a client.
39978
+ * The provider-specific part of a profile, validated by the provider that owns
39979
+ * the kind (`upsertProfile` refuses what it does not accept). A field its
39980
+ * `connectionSchema` declares `type: 'password'` is a secret: it is held in the
39981
+ * keychain, never in the row, and reads back as the redaction marker.
39922
39982
  */
39923
- var LlmProfileKindSchema = _enum([
39924
- "openai-compatible",
39925
- "openai",
39926
- "anthropic",
39927
- "google",
39928
- "managed-local",
39929
- "apple-foundation"
39930
- ]);
39983
+ var LlmProviderConfigSchema = record(string(), unknown());
39931
39984
  var LlmProfileSchema = object({
39932
39985
  id: string(),
39933
39986
  name: string(),
39987
+ /** The provider-declared kind (`LlmProfileKindDescriptor.kind`). */
39934
39988
  kind: LlmProfileKindSchema,
39935
39989
  /** Stamped by the provider — keeps the fanned catalog routable. */
39936
39990
  addonId: string(),
39937
39991
  enabled: boolean(),
39938
39992
  /** Vendor model id, or the managed runtime's loaded model. */
39939
39993
  model: string(),
39940
- /** Required for openai-compatible; override for cloud kinds. */
39941
- baseUrl: string().optional(),
39942
- /** ConfigUISchema type:'password' — never round-trips (spec §5). */
39943
- apiKey: string().optional(),
39944
39994
  /** Vision on/off. A vision call against a `false` profile is REFUSED, never
39945
39995
  * degraded to text — that shipped once and produced a confident answer to a
39946
39996
  * question about a picture nobody sent. */
@@ -39948,15 +39998,11 @@ var LlmProfileSchema = object({
39948
39998
  temperature: number().min(0).max(2).optional(),
39949
39999
  /** Nucleus sampling. Every wire we speak has it. */
39950
40000
  topP: number().min(0).max(1).optional(),
39951
- /** Top-k sampling. Carried only by the wires that have it — NEITHER OpenAI
39952
- * wire does, and the client drops it there (measured: the request body gets
39953
- * `top_p` and no `top_k`). The profile editor hides the field wherever it
39954
- * would change nothing; `KINDS_WITH_TOP_K` is the single owner of that list. */
40001
+ /** Top-k sampling. Carried only by the wires that have it — a kind offers the
40002
+ * field in its editor only when its descriptor lists it in `profileFields`. */
39955
40003
  topK: number().int().positive().optional(),
39956
40004
  maxTokens: number().int().positive().optional(),
39957
- /** Prompt context window. Advisory for cloud kinds (they enforce their own);
39958
- * for `managed-local` it is the llama.cpp `--ctx-size` the runtime starts
39959
- * the model with, so it is the one field that changes a PROCESS. */
40005
+ /** Prompt context window. Advisory for cloud kinds (they enforce their own). */
39960
40006
  contextLength: number().int().positive().optional(),
39961
40007
  /** Default system prompt. A caller's `system` REPLACES it (never appends —
39962
40008
  * two system prompts fighting is worse than either alone). */
@@ -39982,16 +40028,37 @@ var LlmProfileSchema = object({
39982
40028
  * library; the REGISTRY of callable tools is ours and is empty in v1, so a
39983
40029
  * `true` here buys the wiring, not behaviour, until tools are registered. */
39984
40030
  toolsEnabled: boolean().default(false),
39985
- extraHeaders: record(string(), string()).optional(),
39986
- /** kind === 'managed-local' only (spec §4). */
39987
- runtime: ManagedRuntimeConfigSchema.optional(),
39988
- /**
39989
- * kind === 'apple-foundation' only: WHERE it runs — the only thing there is
39990
- * to configure (no key, no URL, no download; `model` is `apple-system`).
39991
- * `supportsVision` on such a row is stamped by the provider from the node's
39992
- * reported `imageInput`, never taken from the operator (D62).
39993
- */
39994
- appleFoundation: object({ nodeId: string() }).optional()
40031
+ /** Everything the kind's provider owns (endpoint, key, node, runtime…). */
40032
+ providerConfig: LlmProviderConfigSchema.default({})
40033
+ });
40034
+ /**
40035
+ * The common profile fields a kind's editor offers. The editor owns how each
40036
+ * one is drawn; the provider says which of them mean something on its wire.
40037
+ */
40038
+ var LlmProfileFieldSchema = _enum([
40039
+ "temperature",
40040
+ "topP",
40041
+ "topK",
40042
+ "maxTokens",
40043
+ "contextLength",
40044
+ "systemPrompt",
40045
+ "timeoutMs",
40046
+ "connectTimeoutMs",
40047
+ "firstTokenTimeoutMs",
40048
+ "idleTimeoutMs",
40049
+ "retry",
40050
+ "toolsEnabled"
40051
+ ]);
40052
+ /**
40053
+ * A provider-drawn part of the editor, by a generic widget id the admin UI
40054
+ * registers (`ai/apple-node`). `placement: 'model'` replaces the generic model
40055
+ * picker: that widget owns the model choice.
40056
+ */
40057
+ var LlmProviderWidgetSchema = object({
40058
+ id: string(),
40059
+ placement: _enum(["connection", "model"]),
40060
+ /** `providerConfig` keys this widget must fill before the profile can be saved. */
40061
+ requires: array(string()).optional()
39995
40062
  });
39996
40063
  /** ConfigUISchema tree passed through untyped on the wire (the
39997
40064
  * notification-output `ConfigSchemaPassthrough` precedent at
@@ -40000,11 +40067,56 @@ var ConfigSchemaPassthrough$3 = unknown();
40000
40067
  var LlmProfileKindDescriptorSchema = object({
40001
40068
  kind: LlmProfileKindSchema,
40002
40069
  label: string(),
40070
+ /** A generic icon name (`cloud`, `plug`, `cpu`) — never a glyph or a logo. */
40003
40071
  icon: string(),
40004
40072
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
40005
40073
  addonId: string(),
40006
- configSchema: ConfigSchemaPassthrough$3
40074
+ /** The provider's own fields (`providerConfig`); `password` fields are keychain-held. */
40075
+ connectionSchema: ConfigSchemaPassthrough$3,
40076
+ /** Provider fields that belong under "Advanced" (extra headers, runtime tuning). */
40077
+ advancedSchema: ConfigSchemaPassthrough$3.optional(),
40078
+ /** The kind's defaults; a model from `listModels` may override any of them. */
40079
+ features: LlmModelFeaturesSchema,
40080
+ /** `false` = the provider stamps `supportsVision` itself (from what a node reports). */
40081
+ visionEditable: boolean(),
40082
+ /** Where the model list comes from: `listModels`, `staticModels`, or nowhere. */
40083
+ modelCatalog: _enum([
40084
+ "fetch",
40085
+ "static",
40086
+ "none"
40087
+ ]),
40088
+ staticModels: array(LlmModelInfoSchema).optional(),
40089
+ /** The common fields that mean something on this kind's wire. */
40090
+ profileFields: array(LlmProfileFieldSchema),
40091
+ providerWidgets: array(LlmProviderWidgetSchema).optional()
40007
40092
  });
40093
+ /**
40094
+ * `listModels` input. `connection` is an UNSAVED draft of `providerConfig`
40095
+ * (the editor's form); with `profileId` too, a secret the draft leaves
40096
+ * untouched (absent or the redaction marker) is resolved server-side from the
40097
+ * stored profile — the browser never receives it.
40098
+ */
40099
+ var LlmListModelsInputSchema = object({
40100
+ addonId: string(),
40101
+ kind: LlmProfileKindSchema,
40102
+ profileId: string().optional(),
40103
+ connection: LlmProviderConfigSchema.optional()
40104
+ });
40105
+ var LlmListModelsErrorCodeSchema = _enum([
40106
+ "auth",
40107
+ "network",
40108
+ "unsupported",
40109
+ "invalid"
40110
+ ]);
40111
+ /** A RESULT, never a throw: "wrong key" is an answer the editor renders inline. */
40112
+ var LlmListModelsResultSchema = discriminatedUnion("ok", [object({
40113
+ ok: literal(true),
40114
+ models: array(LlmModelInfoSchema)
40115
+ }), object({
40116
+ ok: literal(false),
40117
+ code: LlmListModelsErrorCodeSchema,
40118
+ message: string()
40119
+ })]);
40008
40120
  var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
40009
40121
  var LlmDefaultSchema = object({
40010
40122
  selector: LlmDefaultSelectorSchema,
@@ -40104,7 +40216,10 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
40104
40216
  kind: "mutation",
40105
40217
  auth: "admin",
40106
40218
  timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
40107
- }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
40219
+ }), method(LlmListModelsInputSchema, LlmListModelsResultSchema, {
40220
+ kind: "mutation",
40221
+ auth: "admin"
40222
+ }), method(object({}), array(LlmDefaultSchema)), method(object({
40108
40223
  selector: LlmDefaultSelectorSchema,
40109
40224
  profileId: string().nullable()
40110
40225
  }), _void(), {
@@ -64000,26 +64115,6 @@ var ApiKeySummarySchema = object({
64000
64115
  createdAt: number(),
64001
64116
  lastUsedAt: number().optional()
64002
64117
  });
64003
- var ScopedTokenSummarySchema = object({
64004
- id: string(),
64005
- userId: string(),
64006
- name: string(),
64007
- tokenPrefix: string(),
64008
- scopes: array(TokenScopeSchema),
64009
- expiresAt: number().nullish(),
64010
- lastUsedAt: number().nullish(),
64011
- createdAt: number()
64012
- });
64013
- var CreateScopedTokenInputSchema = object({
64014
- userId: string(),
64015
- name: string(),
64016
- scopes: array(TokenScopeSchema),
64017
- expiresAt: number().optional()
64018
- });
64019
- var CreateScopedTokenResultSchema = object({
64020
- token: string(),
64021
- record: ScopedTokenSummarySchema
64022
- });
64023
64118
  var OauthSessionSummarySchema = object({
64024
64119
  id: string(),
64025
64120
  userId: string(),
@@ -64041,11 +64136,11 @@ var TotpStatusSchema = object({
64041
64136
  confirmedAt: number().nullable()
64042
64137
  });
64043
64138
  /**
64044
- * user-management — singleton capability for user accounts, API keys,
64045
- * and scoped tokens.
64139
+ * user-management — singleton capability for user accounts and the
64140
+ * legacy API-key rows.
64046
64141
  *
64047
64142
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64048
- * — the subset check on `setUserScopes` / `createScopedToken` is moot
64143
+ * — the subset check on `setUserScopes` is moot
64049
64144
  * because non-admins never reach these. If/when we open non-admin
64050
64145
  * delegation, structural caller-scope subset check goes inside the
64051
64146
  * provider.
@@ -64102,15 +64197,7 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64102
64197
  kind: "mutation",
64103
64198
  auth: "admin",
64104
64199
  access: "delete"
64105
- }), method(CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, {
64106
- kind: "mutation",
64107
- auth: "admin",
64108
- access: "create"
64109
- }), method(object({ id: string() }), object({ success: literal(true) }), {
64110
- kind: "mutation",
64111
- auth: "admin",
64112
- access: "delete"
64113
- }), method(object({ token: string() }), ScopedTokenSummarySchema.nullable(), { access: "view" }), method(object({ userId: string() }), array(ScopedTokenSummarySchema), { auth: "admin" }), method(object({ userId: string() }), TotpSetupResultSchema, {
64200
+ }), method(object({ userId: string() }), TotpSetupResultSchema, {
64114
64201
  kind: "mutation",
64115
64202
  auth: "admin",
64116
64203
  access: "create"
@@ -70200,7 +70287,7 @@ Object.freeze({
70200
70287
  capName: "llm",
70201
70288
  capScope: "system",
70202
70289
  addonId: null,
70203
- access: "view"
70290
+ access: "create"
70204
70291
  },
70205
70292
  "llm.listNodeModels": {
70206
70293
  capName: "llm",
@@ -74864,12 +74951,6 @@ Object.freeze({
74864
74951
  addonId: null,
74865
74952
  access: "create"
74866
74953
  },
74867
- "userManagement.createScopedToken": {
74868
- capName: "user-management",
74869
- capScope: "system",
74870
- addonId: null,
74871
- access: "create"
74872
- },
74873
74954
  "userManagement.createUser": {
74874
74955
  capName: "user-management",
74875
74956
  capScope: "system",
@@ -74918,12 +74999,6 @@ Object.freeze({
74918
74999
  addonId: null,
74919
75000
  access: "view"
74920
75001
  },
74921
- "userManagement.listScopedTokens": {
74922
- capName: "user-management",
74923
- capScope: "system",
74924
- addonId: null,
74925
- access: "view"
74926
- },
74927
75002
  "userManagement.listUsers": {
74928
75003
  capName: "user-management",
74929
75004
  capScope: "system",
@@ -74978,12 +75053,6 @@ Object.freeze({
74978
75053
  addonId: null,
74979
75054
  access: "delete"
74980
75055
  },
74981
- "userManagement.revokeScopedToken": {
74982
- capName: "user-management",
74983
- capScope: "system",
74984
- addonId: null,
74985
- access: "delete"
74986
- },
74987
75056
  "userManagement.setupTotp": {
74988
75057
  capName: "user-management",
74989
75058
  capScope: "system",
@@ -75014,12 +75083,6 @@ Object.freeze({
75014
75083
  addonId: null,
75015
75084
  access: "view"
75016
75085
  },
75017
- "userManagement.validateScopedToken": {
75018
- capName: "user-management",
75019
- capScope: "system",
75020
- addonId: null,
75021
- access: "view"
75022
- },
75023
75086
  "userManagement.verifyTotp": {
75024
75087
  capName: "user-management",
75025
75088
  capScope: "system",
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("../dist-BsKpHOt8.js");
3
- const require_account_integration_offline = require("../account-integration-offline-C_Tvsemc.js");
2
+ const require_dist = require("../dist-CIIror0W.js");
3
+ const require_account_integration_offline = require("../account-integration-offline-BhjIPfv5.js");
4
4
  let node_crypto = require("node:crypto");
5
5
  let node_tls = require("node:tls");
6
6
  let node_zlib = require("node:zlib");
@@ -1,5 +1,5 @@
1
- import { A as object, C as defineCustomActions, D as array, E as _enum, F as EventCategory, M as string, N as union, O as literal, P as unknown, S as customAction, T as isSecretMarkerLike, a as binaryCapability, b as errMsg, c as deviceAdoptionCapability, d as eventEmitterCapability, j as record, l as dishwasherCapability, m as powerMeterCapability, n as BaseDeviceProvider, p as numericSensorCapability, r as DishwasherOperationStateSchema, s as connectionTestCapability, t as BaseDevice, u as enumSensorCapability, v as DeviceRole, w as isSecretMarker, x as createEvent, y as DeviceType } from "../dist-LJMt_ZXW.mjs";
2
- import { n as cascadeRemoveDevicesForIntegration, r as parseOAuthCallback, t as setIntegrationDevicesOnline } from "../account-integration-offline-DKdrL0V9.mjs";
1
+ import { A as object, C as defineCustomActions, D as array, E as _enum, F as EventCategory, M as string, N as union, O as literal, P as unknown, S as customAction, T as isSecretMarkerLike, a as binaryCapability, b as errMsg, c as deviceAdoptionCapability, d as eventEmitterCapability, j as record, l as dishwasherCapability, m as powerMeterCapability, n as BaseDeviceProvider, p as numericSensorCapability, r as DishwasherOperationStateSchema, s as connectionTestCapability, t as BaseDevice, u as enumSensorCapability, v as DeviceRole, w as isSecretMarker, x as createEvent, y as DeviceType } from "../dist-DNznrlG_.mjs";
2
+ import { n as cascadeRemoveDevicesForIntegration, r as parseOAuthCallback, t as setIntegrationDevicesOnline } from "../account-integration-offline-DW2D0vf8.mjs";
3
3
  import { createHash, randomBytes } from "node:crypto";
4
4
  import { connect } from "node:tls";
5
5
  import { inflateRawSync } from "node:zlib";
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("../dist-BsKpHOt8.js");
3
- const require_account_integration_offline = require("../account-integration-offline-C_Tvsemc.js");
2
+ const require_dist = require("../dist-CIIror0W.js");
3
+ const require_account_integration_offline = require("../account-integration-offline-BhjIPfv5.js");
4
4
  let node_crypto = require("node:crypto");
5
5
  //#region src/homecom/custom-actions.ts
6
6
  var homeComActions = require_dist.defineCustomActions({
@@ -1,5 +1,5 @@
1
- import { A as object, C as defineCustomActions, E as _enum, F as EventCategory, M as string, O as literal, S as customAction, T as isSecretMarkerLike, _ as waterHeaterCapability, b as errMsg, c as deviceAdoptionCapability, n as BaseDeviceProvider, o as climateControlCapability, s as connectionTestCapability, t as BaseDevice, w as isSecretMarker, y as DeviceType } from "../dist-LJMt_ZXW.mjs";
2
- import { n as cascadeRemoveDevicesForIntegration, r as parseOAuthCallback, t as setIntegrationDevicesOnline } from "../account-integration-offline-DKdrL0V9.mjs";
1
+ import { A as object, C as defineCustomActions, E as _enum, F as EventCategory, M as string, O as literal, S as customAction, T as isSecretMarkerLike, _ as waterHeaterCapability, b as errMsg, c as deviceAdoptionCapability, n as BaseDeviceProvider, o as climateControlCapability, s as connectionTestCapability, t as BaseDevice, w as isSecretMarker, y as DeviceType } from "../dist-DNznrlG_.mjs";
2
+ import { n as cascadeRemoveDevicesForIntegration, r as parseOAuthCallback, t as setIntegrationDevicesOnline } from "../account-integration-offline-DW2D0vf8.mjs";
3
3
  import { createHash, randomBytes } from "node:crypto";
4
4
  //#region src/homecom/custom-actions.ts
5
5
  var homeComActions = defineCustomActions({
package/dist/shc/addon.js CHANGED
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  //#region \0rolldown/runtime.js
3
3
  var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
4
4
  //#endregion
5
- const require_dist = require("../dist-BsKpHOt8.js");
5
+ const require_dist = require("../dist-CIIror0W.js");
6
6
  let node_crypto = require("node:crypto");
7
7
  let node_https = require("node:https");
8
8
  let node_child_process = require("node:child_process");
@@ -1,4 +1,4 @@
1
- import { A as object, C as defineCustomActions, D as array, E as _enum, F as EventCategory, M as string, O as literal, S as customAction, b as errMsg, c as deviceAdoptionCapability, f as heatingValveCapability, g as temperatureSensorCapability, h as switchCapability, i as batteryCapability, k as number, n as BaseDeviceProvider, o as climateControlCapability, s as connectionTestCapability, t as BaseDevice, y as DeviceType } from "../dist-LJMt_ZXW.mjs";
1
+ import { A as object, C as defineCustomActions, D as array, E as _enum, F as EventCategory, M as string, O as literal, S as customAction, b as errMsg, c as deviceAdoptionCapability, f as heatingValveCapability, g as temperatureSensorCapability, h as switchCapability, i as batteryCapability, k as number, n as BaseDeviceProvider, o as climateControlCapability, s as connectionTestCapability, t as BaseDevice, y as DeviceType } from "../dist-DNznrlG_.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { request } from "node:https";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-bosch",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "Bosch smart-home device-provider addons for CamStack — SHC, Home Connect, and HomeCom cloud integrations (scaffold)",
5
5
  "keywords": [
6
6
  "camstack",