@vellumai/plugin-api 0.11.6 → 0.11.7-staging.1

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 (2) hide show
  1. package/index.d.ts +187 -37
  2. package/package.json +1 -1
package/index.d.ts CHANGED
@@ -148,14 +148,29 @@ declare const AssistantConfigSchema: z.ZodObject<{
148
148
  stt: z.ZodDefault<z.ZodObject<{
149
149
  provider: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodEnum<{
150
150
  vellum: "vellum";
151
+ "openai-whisper": "openai-whisper";
151
152
  deepgram: "deepgram";
152
- "deepgram-flux": "deepgram-flux";
153
153
  "google-gemini": "google-gemini";
154
- "openai-whisper": "openai-whisper";
155
154
  xai: "xai";
156
155
  }>>;
157
156
  language: z.ZodDefault<z.ZodString>;
158
157
  providers: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>>>;
158
+ roles: z.ZodDefault<z.ZodRecord<z.ZodEnum<{
159
+ watch: "watch";
160
+ liveVoice: "liveVoice";
161
+ telephony: "telephony";
162
+ dictation: "dictation";
163
+ batch: "batch";
164
+ }> & z.core.$partial, z.ZodObject<{
165
+ provider: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodEnum<{
166
+ vellum: "vellum";
167
+ "openai-whisper": "openai-whisper";
168
+ deepgram: "deepgram";
169
+ "google-gemini": "google-gemini";
170
+ xai: "xai";
171
+ }>>;
172
+ model: z.ZodOptional<z.ZodString>;
173
+ }, z.core.$strip>>>;
159
174
  }, z.core.$strip>>;
160
175
  tts: z.ZodDefault<z.ZodObject<{
161
176
  provider: z.ZodDefault<z.ZodEnum<{
@@ -181,9 +196,9 @@ declare const AssistantConfigSchema: z.ZodObject<{
181
196
  referenceId: z.ZodDefault<z.ZodString>;
182
197
  chunkLength: z.ZodDefault<z.ZodNumber>;
183
198
  format: z.ZodDefault<z.ZodEnum<{
199
+ opus: "opus";
184
200
  mp3: "mp3";
185
201
  wav: "wav";
186
- opus: "opus";
187
202
  }>>;
188
203
  latency: z.ZodDefault<z.ZodEnum<{
189
204
  balanced: "balanced";
@@ -194,9 +209,9 @@ declare const AssistantConfigSchema: z.ZodObject<{
194
209
  deepgram: z.ZodDefault<z.ZodObject<{
195
210
  model: z.ZodDefault<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
196
211
  format: z.ZodDefault<z.ZodEnum<{
212
+ opus: "opus";
197
213
  mp3: "mp3";
198
214
  wav: "wav";
199
- opus: "opus";
200
215
  }>>;
201
216
  languageVoices: z.ZodOptional<z.ZodPipe<z.ZodRecord<z.ZodString, z.ZodString>, z.ZodTransform<{
202
217
  [k: string]: string;
@@ -280,6 +295,24 @@ declare const AssistantConfigSchema: z.ZodObject<{
280
295
  "your-own": "your-own";
281
296
  }>>;
282
297
  }, z.core.$strip>>;
298
+ "monday-oauth": z.ZodDefault<z.ZodObject<{
299
+ mode: z.ZodDefault<z.ZodEnum<{
300
+ managed: "managed";
301
+ "your-own": "your-own";
302
+ }>>;
303
+ }, z.core.$strip>>;
304
+ "eventbrite-oauth": z.ZodDefault<z.ZodObject<{
305
+ mode: z.ZodDefault<z.ZodEnum<{
306
+ managed: "managed";
307
+ "your-own": "your-own";
308
+ }>>;
309
+ }, z.core.$strip>>;
310
+ "calendly-oauth": z.ZodDefault<z.ZodObject<{
311
+ mode: z.ZodDefault<z.ZodEnum<{
312
+ managed: "managed";
313
+ "your-own": "your-own";
314
+ }>>;
315
+ }, z.core.$strip>>;
283
316
  }, z.core.$strip>>;
284
317
  memory: z.ZodDefault<z.ZodObject<{
285
318
  enabled: z.ZodDefault<z.ZodBoolean>;
@@ -528,10 +561,6 @@ declare const AssistantConfigSchema: z.ZodObject<{
528
561
  }, z.core.$strip>>;
529
562
  retrospective: z.ZodDefault<z.ZodObject<{
530
563
  enabled: z.ZodDefault<z.ZodBoolean>;
531
- forkStrategy: z.ZodDefault<z.ZodEnum<{
532
- cloning: "cloning";
533
- reference: "reference";
534
- }>>;
535
564
  timeThresholdMs: z.ZodDefault<z.ZodNumber>;
536
565
  messageThreshold: z.ZodDefault<z.ZodNumber>;
537
566
  minCooldownMs: z.ZodDefault<z.ZodNumber>;
@@ -600,10 +629,10 @@ declare const AssistantConfigSchema: z.ZodObject<{
600
629
  model: z.ZodOptional<z.ZodString>;
601
630
  maxTokens: z.ZodOptional<z.ZodNumber>;
602
631
  effort: z.ZodOptional<z.ZodEnum<{
632
+ none: "none";
603
633
  low: "low";
604
634
  medium: "medium";
605
635
  high: "high";
606
- none: "none";
607
636
  xhigh: "xhigh";
608
637
  max: "max";
609
638
  }>>;
@@ -673,6 +702,7 @@ declare const AssistantConfigSchema: z.ZodObject<{
673
702
  profile: z.ZodString;
674
703
  weight: z.ZodNumber;
675
704
  }, z.core.$strip>>>;
705
+ fallbackProfile: z.ZodOptional<z.ZodString>;
676
706
  }, z.core.$strip>>>;
677
707
  profileOrder: z.ZodDefault<z.ZodArray<z.ZodString>>;
678
708
  callSites: z.ZodDefault<z.ZodRecord<z.ZodEnum<{
@@ -723,10 +753,10 @@ declare const AssistantConfigSchema: z.ZodObject<{
723
753
  model: z.ZodOptional<z.ZodString>;
724
754
  maxTokens: z.ZodOptional<z.ZodNumber>;
725
755
  effort: z.ZodOptional<z.ZodEnum<{
756
+ none: "none";
726
757
  low: "low";
727
758
  medium: "medium";
728
759
  high: "high";
729
- none: "none";
730
760
  xhigh: "xhigh";
731
761
  max: "max";
732
762
  }>>;
@@ -1060,7 +1090,7 @@ declare const AssistantConfigSchema: z.ZodObject<{
1060
1090
  turnEnd: z.ZodDefault<z.ZodObject<{
1061
1091
  enabled: z.ZodDefault<z.ZodBoolean>;
1062
1092
  }, z.core.$strip>>;
1063
- model: z.ZodDefault<z.ZodString>;
1093
+ model: z.ZodOptional<z.ZodString>;
1064
1094
  eotThreshold: z.ZodDefault<z.ZodNumber>;
1065
1095
  eagerEotThreshold: z.ZodOptional<z.ZodNumber>;
1066
1096
  eotTimeoutMs: z.ZodDefault<z.ZodNumber>;
@@ -1097,6 +1127,12 @@ declare const AssistantConfigSchema: z.ZodObject<{
1097
1127
  mention_then_thread: "mention_then_thread";
1098
1128
  }>>;
1099
1129
  }, z.core.$strip>>;
1130
+ discord: z.ZodDefault<z.ZodObject<{
1131
+ botUserId: z.ZodDefault<z.ZodString>;
1132
+ botUsername: z.ZodDefault<z.ZodString>;
1133
+ applicationId: z.ZodDefault<z.ZodString>;
1134
+ inviteUrl: z.ZodDefault<z.ZodString>;
1135
+ }, z.core.$strip>>;
1100
1136
  a2a: z.ZodDefault<z.ZodObject<{
1101
1137
  enabled: z.ZodDefault<z.ZodBoolean>;
1102
1138
  }, z.core.$strip>>;
@@ -1435,8 +1471,8 @@ declare const AssistantEventEnvelopeSchema: z.ZodObject<{
1435
1471
  }>;
1436
1472
  source: z.ZodEnum<{
1437
1473
  timeout: "timeout";
1438
- system: "system";
1439
1474
  button: "button";
1475
+ system: "system";
1440
1476
  inline_nl: "inline_nl";
1441
1477
  auto_deny: "auto_deny";
1442
1478
  }>;
@@ -2679,11 +2715,11 @@ declare const AssistantEventPublishOptionsSchema: z.ZodObject<{
2679
2715
  a2a: "a2a";
2680
2716
  discord: "discord";
2681
2717
  plugin: "plugin";
2718
+ web: "web";
2719
+ ios: "ios";
2682
2720
  macos: "macos";
2683
2721
  windows: "windows";
2684
- ios: "ios";
2685
2722
  cli: "cli";
2686
- web: "web";
2687
2723
  "chrome-extension": "chrome-extension";
2688
2724
  route: "route";
2689
2725
  }>>;
@@ -2926,8 +2962,8 @@ declare const AssistantEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
2926
2962
  }>;
2927
2963
  source: z.ZodEnum<{
2928
2964
  timeout: "timeout";
2929
- system: "system";
2930
2965
  button: "button";
2966
+ system: "system";
2931
2967
  inline_nl: "inline_nl";
2932
2968
  auto_deny: "auto_deny";
2933
2969
  }>;
@@ -4157,6 +4193,19 @@ declare interface CliCommandHelp {
4157
4193
  subcommands?: CliSubcommandHelp[];
4158
4194
  }
4159
4195
 
4196
+ /**
4197
+ * Client OS surfaces — the value set for the message-body `clientOs` field.
4198
+ *
4199
+ * This is deliberately SEPARATE from {@link INTERFACE_IDS}: `clientOs`
4200
+ * describes which OS the user's device runs, not which transport the turn
4201
+ * arrived on. `"android"` (and `"ios"` for a mobile browser) are real OS
4202
+ * surfaces but not transports — they must never answer transport questions
4203
+ * (`supportsHostProxy`, `isInteractiveInterface`), so they live here rather
4204
+ * than polluting the interface vocabulary. Drives only the per-turn
4205
+ * `client_os` context line (e.g. app-builder mobile-first for `ios`/`android`).
4206
+ */
4207
+ declare const CLIENT_OS_VALUES: readonly ["web", "ios", "macos", "windows", "android"];
4208
+
4160
4209
  declare interface ClientEntry extends BaseSubscriberEntry {
4161
4210
  type: "client";
4162
4211
  clientId: string;
@@ -4185,6 +4234,8 @@ declare interface ClientEntry extends BaseSubscriberEntry {
4185
4234
  webPresence?: ClientWebPresence;
4186
4235
  }
4187
4236
 
4237
+ declare type ClientOs = (typeof CLIENT_OS_VALUES)[number];
4238
+
4188
4239
  declare interface ClientPresence {
4189
4240
  state: DesktopPresenceState;
4190
4241
  /** When the daemon last heard from the client. Drives staleness. */
@@ -4320,7 +4371,7 @@ export declare interface ConversationRow {
4320
4371
  originInterface: string | null;
4321
4372
  forkParentConversationId: string | null;
4322
4373
  forkParentMessageId: string | null;
4323
- /** `"reference"` on referential forks; `"cloning"` or null on copied ones. */
4374
+ /** `"reference"` on referential forks; null on copied ones. */
4324
4375
  forkStrategy: string | null;
4325
4376
  isAutoTitle: number;
4326
4377
  scheduleJobId: string | null;
@@ -4550,11 +4601,11 @@ export declare function getDocument(documentId: string): Promise<IndexedDocument
4550
4601
  export declare function getMessages(conversationId: string): Promise<MessageRow[]>;
4551
4602
 
4552
4603
  /**
4553
- * List the workspace inference profiles a plugin can route to, in the order the
4554
- * `/model` picker presents them (`llm.profileOrder` first, then the rest
4555
- * alphabetically). Metadata-only entries without a provider, model, or mix are
4556
- * not routing targets, so plugins never see them. Disabled profiles are
4557
- * included and flagged via
4604
+ * List the workspace inference profiles a plugin can route to, in the order a
4605
+ * user-facing model picker presents them (`llm.profileOrder` first, then the
4606
+ * rest alphabetically). Managed backup routes are internal and omitted.
4607
+ * Metadata-only entries without a provider, model, or mix are not routing
4608
+ * targets, so plugins never see them. Disabled profiles are included and flagged via
4558
4609
  * {@link ModelProfileInfo.isDisabled}; weighted "mix" profiles are included and
4559
4610
  * flagged via {@link ModelProfileInfo.isMix}, since a mix is itself a valid
4560
4611
  * routing target (it resolves to one constituent per conversation).
@@ -4943,6 +4994,12 @@ declare interface LiveVoiceAssistantTextDeltaServerFrame extends LiveVoiceServer
4943
4994
  declare interface LiveVoiceBusyServerFrame extends LiveVoiceServerFrameBase {
4944
4995
  readonly type: "busy";
4945
4996
  readonly activeSessionId: string;
4997
+ /**
4998
+ * Absent from daemons that predate it, and from a holder that revealed
4999
+ * neither field, so a client must degrade to the unspecific copy rather
5000
+ * than assume.
5001
+ */
5002
+ readonly holder?: LiveVoiceSessionHolder;
4946
5003
  }
4947
5004
 
4948
5005
  export declare interface LiveVoiceConnection {
@@ -5087,6 +5144,23 @@ declare interface LiveVoiceReadyServerFrame extends LiveVoiceServerFrameBase {
5087
5144
  * (older daemons) means "manual".
5088
5145
  */
5089
5146
  readonly turnDetection?: LiveVoiceTurnDetectionMode;
5147
+ /**
5148
+ * Whether this daemon will accept `text` frames on the session. Absent
5149
+ * (older daemons) means no, which is what lets a client that asked for
5150
+ * `textInput` fall back rather than type into a socket that would answer
5151
+ * every typed turn with an `unknown_type` error.
5152
+ */
5153
+ readonly textInput?: boolean;
5154
+ /**
5155
+ * Whether the session's speech-to-text leg is live. Absent means yes, which
5156
+ * is the only thing an older daemon can have meant: it rejects a session it
5157
+ * cannot transcribe, so every session it readies can hear.
5158
+ *
5159
+ * False is reachable only for a client that declared `textInput`, and tells
5160
+ * it to present the session as typed rather than draw a microphone that
5161
+ * will never hear anything.
5162
+ */
5163
+ readonly audioInput?: boolean;
5090
5164
  }
5091
5165
 
5092
5166
  export declare type LiveVoiceServerFrame = LiveVoiceReadyServerFrame | LiveVoiceBusyServerFrame | LiveVoiceSpeechStartedServerFrame | LiveVoiceUtteranceEndServerFrame | LiveVoiceUtteranceDiscardedServerFrame | LiveVoiceSttPartialServerFrame | LiveVoiceSttFinalServerFrame | LiveVoiceThinkingServerFrame | LiveVoiceActivityServerFrame | LiveVoiceAssistantTextDeltaServerFrame | LiveVoiceTtsAudioServerFrame | LiveVoiceTtsDoneServerFrame | LiveVoiceTurnCancelledServerFrame | LiveVoiceMinimizeRoomServerFrame | LiveVoiceMetricsServerFrame | LiveVoiceArchivedServerFrame | LiveVoiceErrorServerFrame;
@@ -5100,6 +5174,27 @@ declare type LiveVoiceServerFrameType = (typeof _LIVE_VOICE_SERVER_FRAME_TYPES)[
5100
5174
 
5101
5175
  export declare type LiveVoiceSessionCloseReason = "client_end" | "error" | "websocket_close" | "transport_closed" | "client_timeout" | "forced_end" | "manager_shutdown";
5102
5176
 
5177
+ /**
5178
+ * Where the session holding the daemon's single live-voice slot is running,
5179
+ * as much of it as the daemon knows.
5180
+ *
5181
+ * Display only: it is what lets a client refused a session say where the one
5182
+ * that blocked it is. Nothing routes, authorizes, or decides capability on
5183
+ * it, and every field is optional, so a holder that names neither its surface
5184
+ * nor a conversation is simply less specific.
5185
+ */
5186
+ declare interface LiveVoiceSessionHolder {
5187
+ /**
5188
+ * The OS surface the holder is running on, from its `start` frame. A
5189
+ * {@link ClientOs} carries no transport meaning by contract (see
5190
+ * `channels/types.ts`), which is exactly right for a label: it says which
5191
+ * device the user should go looking on, and answers nothing else.
5192
+ */
5193
+ readonly client?: ClientOs;
5194
+ /** The conversation the holder is talking in, once it has one. */
5195
+ readonly conversationId?: string;
5196
+ }
5197
+
5103
5198
  /**
5104
5199
  * Emitted when the server VAD detects user speech. The client MUST
5105
5200
  * immediately stop local TTS playback — this doubles as the flush-tail-audio
@@ -5278,8 +5373,8 @@ declare const messageMetadataSchema: z.ZodObject<{
5278
5373
  discord: "discord";
5279
5374
  plugin: "plugin";
5280
5375
  }>>;
5281
- userMessageInterface: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<"phone" | "telegram" | "whatsapp" | "slack" | "email" | "a2a" | "discord" | "plugin" | "macos" | "windows" | "ios" | "cli" | "web" | "chrome-extension" | "route" | null, string>> & z.ZodType<"phone" | "telegram" | "whatsapp" | "slack" | "email" | "a2a" | "discord" | "plugin" | "macos" | "windows" | "ios" | "cli" | "web" | "chrome-extension" | "route", string, z.core.$ZodTypeInternals<"phone" | "telegram" | "whatsapp" | "slack" | "email" | "a2a" | "discord" | "plugin" | "macos" | "windows" | "ios" | "cli" | "web" | "chrome-extension" | "route", string>>>;
5282
- assistantMessageInterface: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<"phone" | "telegram" | "whatsapp" | "slack" | "email" | "a2a" | "discord" | "plugin" | "macos" | "windows" | "ios" | "cli" | "web" | "chrome-extension" | "route" | null, string>> & z.ZodType<"phone" | "telegram" | "whatsapp" | "slack" | "email" | "a2a" | "discord" | "plugin" | "macos" | "windows" | "ios" | "cli" | "web" | "chrome-extension" | "route", string, z.core.$ZodTypeInternals<"phone" | "telegram" | "whatsapp" | "slack" | "email" | "a2a" | "discord" | "plugin" | "macos" | "windows" | "ios" | "cli" | "web" | "chrome-extension" | "route", string>>>;
5376
+ userMessageInterface: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<"phone" | "telegram" | "whatsapp" | "slack" | "email" | "a2a" | "discord" | "plugin" | "web" | "ios" | "macos" | "windows" | "cli" | "chrome-extension" | "route" | null, string>> & z.ZodType<"phone" | "telegram" | "whatsapp" | "slack" | "email" | "a2a" | "discord" | "plugin" | "web" | "ios" | "macos" | "windows" | "cli" | "chrome-extension" | "route", string, z.core.$ZodTypeInternals<"phone" | "telegram" | "whatsapp" | "slack" | "email" | "a2a" | "discord" | "plugin" | "web" | "ios" | "macos" | "windows" | "cli" | "chrome-extension" | "route", string>>>;
5377
+ assistantMessageInterface: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<"phone" | "telegram" | "whatsapp" | "slack" | "email" | "a2a" | "discord" | "plugin" | "web" | "ios" | "macos" | "windows" | "cli" | "chrome-extension" | "route" | null, string>> & z.ZodType<"phone" | "telegram" | "whatsapp" | "slack" | "email" | "a2a" | "discord" | "plugin" | "web" | "ios" | "macos" | "windows" | "cli" | "chrome-extension" | "route", string, z.core.$ZodTypeInternals<"phone" | "telegram" | "whatsapp" | "slack" | "email" | "a2a" | "discord" | "plugin" | "web" | "ios" | "macos" | "windows" | "cli" | "chrome-extension" | "route", string>>>;
5283
5378
  client: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
5284
5379
  clientOsFromRequest: z.ZodOptional<z.ZodBoolean>;
5285
5380
  subagentNotification: z.ZodOptional<z.ZodObject<{
@@ -5925,6 +6020,15 @@ export declare interface ProviderResponse {
5925
6020
  model: string;
5926
6021
  /** Provider that actually produced this response, which may differ from a wrapper provider name. */
5927
6022
  actualProvider?: string;
6023
+ /**
6024
+ * Inference profile key that actually governed this response when a
6025
+ * wrapper re-routed the request away from the caller's own resolution
6026
+ * (`RetryProvider`'s fallback-route escalation). `UsageTrackingProvider`
6027
+ * prefers this over re-resolving from the original request options, so a
6028
+ * successful fallback serve is attributed to the backup profile rather
6029
+ * than the failed primary's. Absent on the normal (non-rerouted) path.
6030
+ */
6031
+ actualInferenceProfile?: string;
5928
6032
  /**
5929
6033
  * Base URL the provider's HTTP client actually resolved to for this request,
5930
6034
  * read from the live SDK client instance rather than re-derived from config.
@@ -6174,6 +6278,8 @@ export declare interface ResolvedSkillEntry {
6174
6278
  avoidWhen?: string[];
6175
6279
  /** True when the skill is pinned into the memory selector pool every turn. */
6176
6280
  alwaysCandidate?: boolean;
6281
+ /** Host operating systems on which this skill may be used. */
6282
+ platforms?: SkillPlatform[];
6177
6283
  /** True for locally installed skills; false for remote catalog entries. */
6178
6284
  installed: boolean;
6179
6285
  /** Where the installed skill comes from. Unset for remote catalog entries. */
@@ -6445,6 +6551,18 @@ export declare interface SendMessageConfig {
6445
6551
  * request.
6446
6552
  */
6447
6553
  forceOverrideProfile?: boolean;
6554
+ /**
6555
+ * True when the caller appended {@link NATIVE_WEB_SEARCH_TOOL_NAME} purely
6556
+ * to activate the route's provider-native web search, rather than passing an
6557
+ * app-executed search tool of the same name (which is what runs when a
6558
+ * search backend like Brave or the platform search proxy is configured).
6559
+ * Only the caller can tell those apart, and a route change after that
6560
+ * decision has to: `RetryProvider` drops the tool on a backup that runs no
6561
+ * native search, and must not touch it when the daemon executes it itself.
6562
+ * A resolution/routing-time concern only; stripped before any provider wire
6563
+ * request.
6564
+ */
6565
+ nativeWebSearchSentinel?: boolean;
6448
6566
  /**
6449
6567
  * Per-conversation seed for deterministic `mix`-profile expansion. The agent
6450
6568
  * loop sets this to the conversation id so every resolver call this send
@@ -6480,6 +6598,14 @@ export declare interface SendMessageConfig {
6480
6598
  * JSON request bodies.
6481
6599
  */
6482
6600
  usageAttributionHeaders?: Record<string, string>;
6601
+ /**
6602
+ * Per-request HTTP headers merged onto the transport. `RetryProvider`
6603
+ * stamps these for providers that need support-lookup headers (OpenCode
6604
+ * `x-opencode-session` / `x-opencode-request`). Provider clients pass
6605
+ * them through SDK request options only and must never include this
6606
+ * object in provider JSON request bodies.
6607
+ */
6608
+ requestHeaders?: Record<string, string>;
6483
6609
  /**
6484
6610
  * Controls local usage-ledger writes for attributed provider calls.
6485
6611
  * Defaults to `auto`; conversation paths that aggregate usage separately
@@ -6602,6 +6728,8 @@ export declare interface ShutdownContext {
6602
6728
  */
6603
6729
  declare type ShutdownReason = "shutdown" | "uninstall" | "disable" | "reload";
6604
6730
 
6731
+ declare const SKILL_PLATFORM_VALUES: readonly ["macos", "windows", "linux"];
6732
+
6605
6733
  declare interface SkillInstallMeta {
6606
6734
  origin: "vellum" | "clawhub" | "skillssh" | "custom";
6607
6735
  installedAt: string;
@@ -6617,6 +6745,8 @@ declare interface SkillInstallMeta {
6617
6745
  lastUsedAt?: string;
6618
6746
  }
6619
6747
 
6748
+ declare type SkillPlatform = (typeof SKILL_PLATFORM_VALUES)[number];
6749
+
6620
6750
  /**
6621
6751
  * Origin of a skill in the merged catalog.
6622
6752
  *
@@ -6817,28 +6947,33 @@ export declare type SttErrorCategory =
6817
6947
  | "provider-error";
6818
6948
 
6819
6949
  /**
6820
- * Provider-agnostic speech-to-text domain types for daemon transcription.
6950
+ * Catalog identity for a daemon-hosted STT backend.
6821
6951
  *
6822
- * These types define the boundary between callers that need audio transcription
6823
- * and the concrete STT provider implementations. The goal is to let daemon
6824
- * callsites program against a single typed interface so that provider swaps are
6825
- * localized to the adapter layer.
6952
+ * This is the key capability is stored under, NOT the set of values a user may
6953
+ * put in `services.stt.provider`. A provider that offers more than one model
6954
+ * family with genuinely different capabilities gets a row per family, because
6955
+ * the catalog is a capability matrix and those capabilities differ. Users
6956
+ * select the family with `services.stt.providers.<id>.model`, and
6957
+ * {@link resolveSttCatalogKey} maps that pair onto the row.
6826
6958
  *
6827
- * Two execution modes are supported:
6828
- * - **Batch** — a single audio buffer is sent and a final transcript returned.
6829
- * - **Streaming** — audio chunks are sent over a persistent session, and the
6830
- * provider emits partial/final transcript events in real time.
6831
- */
6832
- /**
6833
- * Canonical provider identifiers for daemon-hosted STT backends.
6834
- * Extend this union as new providers are integrated.
6959
+ * Keeping the two apart bounds the user-facing surface: adding a model family
6960
+ * costs a catalog row and nothing else, while adding a provider id costs an
6961
+ * enum entry, a settings-picker row, and a place in every predicate that
6962
+ * classifies providers.
6835
6963
  */
6836
6964
  export declare type SttProviderId = "openai-whisper" | "deepgram"
6837
6965
  /**
6838
6966
  * Deepgram's Flux conversational speech model. Shares the `deepgram`
6839
6967
  * credential and is streaming-only: Flux has no batch endpoint.
6840
6968
  */
6841
- | "deepgram-flux" | "google-gemini" | "xai" | "vellum";
6969
+ | "deepgram-flux" | "google-gemini" | "xai" | "vellum"
6970
+ /**
6971
+ * Managed Flux: the same conversational model as `deepgram-flux`, reached
6972
+ * through the platform's speech relay instead of a Deepgram key. Dials the
6973
+ * relay's STT v2 endpoint asking for native Flux frames, so it keeps the
6974
+ * turn events the relay's default v1-shaped translation drops.
6975
+ */
6976
+ | "vellum-flux";
6842
6977
 
6843
6978
  /** The streaming session has closed (no more events will be emitted). */
6844
6979
  export declare interface SttStreamServerClosedEvent {
@@ -7284,6 +7419,12 @@ export declare interface ToolContext {
7284
7419
  * @legacy
7285
7420
  */
7286
7421
  requesterIdentifier?: string;
7422
+ /**
7423
+ * Contact ID of the requester's member record. Approval resolution looks
7424
+ * up this contact's auto-approve ceiling from the gateway at use time.
7425
+ * @legacy
7426
+ */
7427
+ requesterContactId?: string;
7287
7428
  /**
7288
7429
  * Preferred display name for the requester.
7289
7430
  * @legacy
@@ -7323,6 +7464,8 @@ export declare interface ToolContext {
7323
7464
  * @legacy
7324
7465
  */
7325
7466
  transportInterface?: InterfaceId;
7467
+ /** Operating system reported by the client for the current turn. */
7468
+ clientOs?: ClientOs;
7326
7469
  /**
7327
7470
  * The per-turn inference-profile override the agent loop is currently
7328
7471
  * running under, propagated through tool context so subagent-spawn tools
@@ -7423,6 +7566,13 @@ declare const ToolDefinitionSchema: z.ZodObject<{
7423
7566
  sandbox: "sandbox";
7424
7567
  host: "host";
7425
7568
  }>>;
7569
+ supportedClientOs: z.ZodOptional<z.ZodArray<z.ZodEnum<{
7570
+ web: "web";
7571
+ ios: "ios";
7572
+ macos: "macos";
7573
+ windows: "windows";
7574
+ android: "android";
7575
+ }>>>;
7426
7576
  execute: z.ZodOptional<z.ZodCustom<(input: Record<string, unknown>, context: ToolContext) => Promise<ToolExecutionResult>, (input: Record<string, unknown>, context: ToolContext) => Promise<ToolExecutionResult>>>;
7427
7577
  exclusive: z.ZodOptional<z.ZodBoolean>;
7428
7578
  }, z.core.$strip>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vellumai/plugin-api",
3
- "version": "0.11.6",
3
+ "version": "0.11.7-staging.1",
4
4
  "description": "Public TypeScript authoring contract for Vellum assistant plugins.",
5
5
  "license": "MIT",
6
6
  "type": "module",