lua-cli 3.18.0 → 3.20.0

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.
@@ -27,6 +27,10 @@ declare interface AgentInvocationInput {
27
27
  systemPrompt?: string;
28
28
  /** Additional runtime context attached to the request. */
29
29
  runtimeContext?: string;
30
+ /** Client-side context (e.g. the caller's IANA timezone) for this invocation. */
31
+ clientContext?: {
32
+ timezone?: string;
33
+ };
30
34
  /**
31
35
  * Optional thread ID suffix for conversation scoping. When omitted, the
32
36
  * invocation flows into the caller-user's default chat thread with the
@@ -86,11 +90,19 @@ declare interface AgentInvocationOutput {
86
90
  }
87
91
 
88
92
  /**
89
- * Per-agent LLM call settings. Maps directly onto Mastra's
93
+ * Per-agent LLM call settings PLUS normalized reasoning config. The
94
+ * `CallSettings` leafs (`temperature`, `topP`, …) map directly onto Mastra's
90
95
  * `agent.stream({ modelSettings })` / `agent.generate({ modelSettings })`,
91
- * which in turn maps onto the AI SDK's `CallSettings`. Pass-through:
92
- * we don't validate ranges here; the provider will reject invalid combos
93
- * (e.g. topP > 1, presencePenalty out of provider range).
96
+ * which in turn maps onto the AI SDK's `CallSettings` — pass-through, we
97
+ * don't validate ranges here; the provider will reject invalid combos (e.g.
98
+ * topP > 1, presencePenalty out of provider range).
99
+ *
100
+ * `reasoning` is NOT a `CallSettings` key — it's the agent-level tier of the
101
+ * `ModelRequestOptions` precedence chain (request > agent `reasoning` >
102
+ * per-model DB `modelOptions` > code defaults). lua-core splits this bag
103
+ * before calling Mastra: `reasoning` is stripped and merged into the
104
+ * provider-options resolution seam instead of being passed through as a
105
+ * `CallSettings` field.
94
106
  *
95
107
  * Deliberately excludes `abortSignal` (not serializable), `headers`
96
108
  * (security — could exfiltrate credentials), and `maxRetries` (platform
@@ -113,6 +125,17 @@ export declare interface AgentModelSettings {
113
125
  stopSequences?: string[];
114
126
  /** Random seed for deterministic sampling (provider support varies). */
115
127
  seed?: number;
128
+ /**
129
+ * Per-agent reasoning default. Lower precedence than a per-request
130
+ * `options.reasoning` override; higher precedence than the per-model DB
131
+ * `modelOptions.reasoning` override. Verbosity is deliberately NOT
132
+ * available here — it stays request-level only (`ModelRequestOptions.verbosity`).
133
+ */
134
+ reasoning?: {
135
+ effort?: ReasoningEffort;
136
+ /** Whether to surface the reasoning trace to the caller. Default true. */
137
+ show?: boolean;
138
+ };
116
139
  }
117
140
 
118
141
  export declare const Agents: AgentsApi;
@@ -634,6 +657,23 @@ declare interface BatchingConfig {
634
657
  serializeProcessing?: boolean;
635
658
  }
636
659
 
660
+ /**
661
+ * Browser switch config (LuaBrowser). `browser: true` is the zero-code form —
662
+ * the agent gets browser tools injected, like `searchWeb`, routed to the user's
663
+ * local browser (desktop) or the Browser-Use cloud fallback. The object form
664
+ * adds optional policy.
665
+ */
666
+ declare interface BrowserSwitchConfig {
667
+ /** Preferred engine; 'auto' lets the platform pick local (desktop) vs cloud. */
668
+ engine?: 'auto' | 'browser-use' | 'agent-browser';
669
+ /** Egress allowlist — domains the browser may navigate/sub-request. */
670
+ allowedDomains?: string[];
671
+ /** Names of vault credential entries the agent may use (never raw secrets). */
672
+ credentials?: string[];
673
+ /** Hard cap on a single browser session's duration (cost control). */
674
+ maxSessionMinutes?: number;
675
+ }
676
+
637
677
  /**
638
678
  * CDN API
639
679
  * Upload and retrieve files from the Lua CDN
@@ -727,6 +767,13 @@ export declare const Channels: ChannelsApi;
727
767
  * languageCode: 'en',
728
768
  * });
729
769
  *
770
+ * // React to a WhatsApp message
771
+ * await Channels.whatsapp.sendReaction({
772
+ * to: { phoneNumber: '+15551234567' },
773
+ * messageId: 'wamid.HBgL...',
774
+ * emoji: '👍',
775
+ * });
776
+ *
730
777
  * // Send an email
731
778
  * await Channels.email.send({
732
779
  * to: { email: 'customer@example.com' },
@@ -767,6 +814,23 @@ export declare interface ChannelsApi {
767
814
  * ```
768
815
  */
769
816
  sendTemplate(input: WhatsAppTemplateSendInput): Promise<ChannelSendOutput>;
817
+ /**
818
+ * React to a WhatsApp message with a single emoji.
819
+ *
820
+ * `messageId` is the vendor message id (`wamid...`) — e.g. read it off an
821
+ * inbound message from the channel webhook/history — and must be ≤30 days
822
+ * old (Meta limit). Pass `emoji: ''` to remove an existing reaction.
823
+ *
824
+ * @example
825
+ * ```typescript
826
+ * await Channels.whatsapp.sendReaction({
827
+ * to: { phoneNumber: '+447551166594' },
828
+ * messageId: 'wamid.HBgL...',
829
+ * emoji: '👍',
830
+ * });
831
+ * ```
832
+ */
833
+ sendReaction(input: WhatsAppReactionSendInput): Promise<ChannelSendOutput>;
770
834
  };
771
835
  /** Email-specific send operations. */
772
836
  email: {
@@ -859,12 +923,27 @@ export declare interface ChannelSendTarget {
859
923
  /**
860
924
  * One content part of a chat-history message.
861
925
  *
862
- * `text` parts carry plain text. Media parts (`image` / `video` / `audio`
863
- * / `file`) carry a URL or base64 payload in `data` (or `image` / `video`
864
- * for legacy reasons) plus a `mediaType` MIME string.
926
+ * `text` parts carry plain text. `reasoning` parts carry the model's
927
+ * chain-of-thought in the `text` field so a history reload can re-render the
928
+ * reasoning component (PRO-391). `tool` parts carry a persisted tool
929
+ * invocation (`toolName`, `toolCallId`, `input` args, and — on a terminal
930
+ * turn — the `output` result and `toolState`) so a reloaded turn can
931
+ * re-render its tool-call cards. `source` parts carry a web-search citation
932
+ * (`url` + optional `title`/`sourceId`) so a reloaded turn keeps its sources
933
+ * footer — the persisted twin of the live stream's `source-url` parts.
934
+ * Media parts (`image` / `video` / `audio` / `file`) carry a URL or base64
935
+ * payload in `data` (or `image` / `video` for legacy reasons) plus a
936
+ * `mediaType` MIME string.
937
+ * `source-url` / `source-document` parts carry a persisted citation
938
+ * (web-search grounding / document citation, PRO-430): `url` + `title` for
939
+ * URLs; `mediaType` + `title` + `filename` (+ citation offsets inside
940
+ * `providerMetadata`) for documents; both keyed by `sourceId`.
941
+ * `data-lua-*` parts carry a persisted enriched stream part (e.g. a
942
+ * sub-agent delegation card) with its original data object in `payload`
943
+ * (`data` is reserved for media payload strings).
865
944
  */
866
945
  export declare interface ChatHistoryContent {
867
- type: 'text' | 'image' | 'video' | 'audio' | 'file';
946
+ type: 'text' | 'reasoning' | 'tool' | 'image' | 'video' | 'audio' | 'file' | 'source-url' | 'source-document' | `data-lua-${string}`;
868
947
  text?: string;
869
948
  image?: string;
870
949
  video?: string;
@@ -872,6 +951,17 @@ export declare interface ChatHistoryContent {
872
951
  mediaType?: string;
873
952
  latitude?: number;
874
953
  longitude?: number;
954
+ toolName?: string;
955
+ toolCallId?: string;
956
+ input?: unknown;
957
+ output?: unknown;
958
+ toolState?: string;
959
+ sourceId?: string;
960
+ url?: string;
961
+ title?: string;
962
+ filename?: string;
963
+ providerMetadata?: Record<string, unknown>;
964
+ payload?: unknown;
875
965
  }
876
966
 
877
967
  /**
@@ -886,6 +976,24 @@ export declare interface ChatHistoryMessage {
886
976
  /** ISO-8601 timestamp string. */
887
977
  createdAt: string;
888
978
  content: ChatHistoryContent[];
979
+ /**
980
+ * Origin of the message, derived from the `mastra_messages.type` column:
981
+ * `'voice'` for turns mirrored from a finished LiveKit voice call, `'chat'`
982
+ * for everything else. Additive/optional — absent on rows written before this
983
+ * landed and on call sites that don't select the `type` column. Clients use it
984
+ * to render a "Voice call" divider in the thread.
985
+ */
986
+ source?: 'voice' | 'chat';
987
+ /**
988
+ * Permanent recording for a voice-note turn (Lua Desktop). Populated by the
989
+ * admin threads history endpoint from the row's `content.metadata.audio` — a
990
+ * sibling of the model content, so the url is NEVER part of the LLM prompt.
991
+ * Present only on desktop voice-note user turns; clients render an audio
992
+ * player / voice bubble off `audio.url`. Absent on all other messages.
993
+ */
994
+ audio?: {
995
+ url: string;
996
+ };
889
997
  }
890
998
 
891
999
  /**
@@ -1268,6 +1376,37 @@ export declare interface DeviceTriggerConfig {
1268
1376
  }) => Promise<any>;
1269
1377
  }
1270
1378
 
1379
+ /** A matched org member and their shareable channel targets (empty when none shared). */
1380
+ export declare interface DirectoryMatch {
1381
+ userId: string;
1382
+ fullName?: string;
1383
+ primaryEmail?: string;
1384
+ targets: DirectoryTarget[];
1385
+ }
1386
+
1387
+ /** Result of POST /developer/agents/:agentId/directory/resolve. */
1388
+ export declare interface DirectoryResolveResult {
1389
+ query: string;
1390
+ matches: DirectoryMatch[];
1391
+ }
1392
+
1393
+ /**
1394
+ * Wire contracts for the workspace directory resolve endpoint.
1395
+ *
1396
+ * lua-cli `Team.findMember(name)` ↔ lua-api `POST /developer/agents/:agentId/directory/resolve`.
1397
+ * Resolves a teammate by name within the AGENT's organization (the org is derived
1398
+ * server-side from the agent), returning only the channel handles each member opted
1399
+ * to share. Returns a list — the caller disambiguates when more than one matches.
1400
+ */
1401
+ /** A channel the teammate opted to be reachable on within the workspace. */
1402
+ export declare interface DirectoryTarget {
1403
+ channel: 'whatsapp' | 'sms' | 'email';
1404
+ /** E.164 for whatsapp/sms; address for email. */
1405
+ value: string;
1406
+ label?: string;
1407
+ validated: boolean;
1408
+ }
1409
+
1271
1410
  /** A single email attachment, referenced by URL — lua-email fetches the bytes
1272
1411
  * server-side and attaches them, keeping large files off the SDK→API hops. */
1273
1412
  declare interface EmailAttachmentInput {
@@ -1278,16 +1417,38 @@ declare interface EmailAttachmentInput {
1278
1417
 
1279
1418
  /** Body of POST /developer/agents/:agentId/channels/email/send */
1280
1419
  export declare interface EmailSendInput {
1420
+ /** Recipient — `email` (cold) or `userId` (resolved to the user's email
1421
+ * address from their channel history). At least one must be set. */
1281
1422
  to: {
1282
1423
  userId?: string;
1283
1424
  email?: string;
1284
1425
  };
1285
1426
  subject?: string;
1427
+ /** Plain-text body, sent as-is (the MIME text/plain part). */
1286
1428
  text?: string;
1429
+ /** Exact HTML body, sent as-is (the MIME text/html part) — no template wrap. */
1287
1430
  html?: string;
1431
+ /**
1432
+ * Rich body — markdown and `:::` component markers, rendered server-side into
1433
+ * the branded email template (the same rendering the agent's own replies use).
1434
+ * Use this for "send this message as a nice email"; use `html` instead when you
1435
+ * want to control the exact markup. Mutually exclusive with `html`/`text`.
1436
+ */
1437
+ richBody?: string;
1288
1438
  cc?: string[];
1289
1439
  bcc?: string[];
1290
1440
  attachments?: EmailAttachmentInput[];
1441
+ /**
1442
+ * RFC 5322 threading: the `Message-ID` of the email this one replies to. Set
1443
+ * `In-Reply-To` (and append to `References`) so mail clients thread the reply
1444
+ * into the right conversation — e.g. a per-ticket thread. The value is the
1445
+ * inbound email's Message-ID, surfaced to agent code as `webhookPayload.messageId`.
1446
+ * Angle brackets are optional; lua-email wraps bare ids. Honoured on the SES
1447
+ * (branded/`existing`) email channel.
1448
+ */
1449
+ inReplyTo?: string;
1450
+ /** RFC 5322 `References` chain — the accumulated Message-IDs of the thread. */
1451
+ references?: string[];
1291
1452
  options?: ChannelSendOptions;
1292
1453
  }
1293
1454
 
@@ -1361,9 +1522,20 @@ declare interface GovernanceConfig {
1361
1522
  * `rules`/`injection` on top. `'security'` = block dangerous tools + requireLevel(2).
1362
1523
  */
1363
1524
  preset?: 'security';
1364
- /** SDK mode — prompt-injection scan on inputs (maps to the SDK's `createInjectionGuard`). */
1525
+ /**
1526
+ * SDK mode — prompt-injection scan on inputs (maps to the SDK's `createInjectionGuard`).
1527
+ * `ml: true` additionally runs the Governance Cloud ML ensemble (regex+DeBERTa) per
1528
+ * message and adds the SDK's `mlInjectionGuard` rule — a hybrid that blocks when EITHER
1529
+ * the regex score crosses `threshold` OR the ML score crosses `mlThreshold`. The two are
1530
+ * scored independently: `threshold` (~0.8) suits the regex weights, while the ML score is
1531
+ * a calibrated model confidence with its own tuned operating point (`mlThreshold`, default
1532
+ * 0.95 — the ensemble's confirmation gate). Requires GOVERNANCE_ML_URL / GOVERNANCE_ML_API_KEY
1533
+ * on the platform; falls back to regex-only when unset or on error.
1534
+ */
1365
1535
  injection?: {
1366
1536
  threshold: number;
1537
+ ml?: boolean;
1538
+ mlThreshold?: number;
1367
1539
  };
1368
1540
  /** SDK mode — local in-memory policy rules layered on top of any `preset`. */
1369
1541
  rules?: {
@@ -1633,7 +1805,7 @@ declare class JobApi extends HttpClient {
1633
1805
  * @returns Promise resolving to an ApiResponse containing the full updated job
1634
1806
  * @throws Error if the job or version is not found or the publish operation fails
1635
1807
  */
1636
- publishJobVersion(jobId: string, version: string): Promise<ApiResponse<Job>>;
1808
+ publishJobVersion(jobId: string, version: string): Promise<ApiResponse<Job & ScopedPromoteFields>>;
1637
1809
  /**
1638
1810
  * Deletes a job and all its versions, or deactivates it if it has versions
1639
1811
  * @param jobId - The unique identifier of the job to delete
@@ -2055,6 +2227,7 @@ export declare class LuaAgent {
2055
2227
  private readonly voices?;
2056
2228
  private readonly batching?;
2057
2229
  private readonly governance?;
2230
+ private readonly browser?;
2058
2231
  /**
2059
2232
  * Creates a new LuaAgent instance.
2060
2233
  *
@@ -2073,6 +2246,8 @@ export declare class LuaAgent {
2073
2246
  */
2074
2247
  constructor(config: LuaAgentConfig);
2075
2248
  getName(): string;
2249
+ /** Browser switch (LuaBrowser) — `true`/config when the agent can browse. */
2250
+ getBrowser(): LuaAgentConfig['browser'];
2076
2251
  getPersona(): PersonaText;
2077
2252
  getModel(): LuaAgentModel | undefined;
2078
2253
  getModelSettings(): AgentModelSettings | undefined;
@@ -2100,8 +2275,12 @@ export declare interface LuaAgentConfig {
2100
2275
  * Passed straight through to Mastra / AI SDK on every `chat/stream` and
2101
2276
  * `chat/generate`. Undefined leaves provider defaults in place.
2102
2277
  *
2278
+ * `reasoning` is the exception — it's not a sampling setting. It sets this
2279
+ * agent's default reasoning effort/visibility across providers (Claude,
2280
+ * GPT, Gemini, …); a per-request `options.reasoning` override always wins.
2281
+ *
2103
2282
  * @example
2104
- * modelSettings: { temperature: 0.2, maxOutputTokens: 4096 }
2283
+ * modelSettings: { temperature: 0.2, maxOutputTokens: 4096, reasoning: { effort: 'low' } }
2105
2284
  */
2106
2285
  modelSettings?: AgentModelSettings;
2107
2286
  /** Array of skills (each with tools) */
@@ -2133,6 +2312,13 @@ export declare interface LuaAgentConfig {
2133
2312
  batching?: BatchingConfig;
2134
2313
  /** Governance policy configuration. When set, tool calls, preprocessors, and postprocessors are governed. */
2135
2314
  governance?: GovernanceConfig;
2315
+ /**
2316
+ * Browser switch (LuaBrowser). `true` turns on browser tools with platform
2317
+ * defaults; an object adds policy (engine, allowedDomains, credentials,
2318
+ * maxSessionMinutes). Off by default — a browser session costs money and
2319
+ * carries risk, so it's opt-in (unlike always-on searchWeb).
2320
+ */
2321
+ browser?: boolean | BrowserSwitchConfig;
2136
2322
  }
2137
2323
 
2138
2324
  /**
@@ -2863,11 +3049,11 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
2863
3049
  }, "strip", z.ZodTypeAny, {
2864
3050
  options?: Record<string, unknown>;
2865
3051
  kind?: "realtime";
2866
- provider?: "openai" | "google" | "xai";
3052
+ provider?: "google" | "xai" | "openai";
2867
3053
  }, {
2868
3054
  options?: Record<string, unknown>;
2869
3055
  kind?: "realtime";
2870
- provider?: "openai" | "google" | "xai";
3056
+ provider?: "google" | "xai" | "openai";
2871
3057
  }>]>;
2872
3058
  stt: z.ZodOptional<z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{
2873
3059
  kind: z.ZodLiteral<"inference">;
@@ -2929,11 +3115,11 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
2929
3115
  }, "strip", z.ZodTypeAny, {
2930
3116
  options?: Record<string, unknown>;
2931
3117
  kind?: "realtime";
2932
- provider?: "openai" | "google" | "xai";
3118
+ provider?: "google" | "xai" | "openai";
2933
3119
  }, {
2934
3120
  options?: Record<string, unknown>;
2935
3121
  kind?: "realtime";
2936
- provider?: "openai" | "google" | "xai";
3122
+ provider?: "google" | "xai" | "openai";
2937
3123
  }>]>>;
2938
3124
  tts: z.ZodOptional<z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{
2939
3125
  kind: z.ZodLiteral<"inference">;
@@ -2995,11 +3181,11 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
2995
3181
  }, "strip", z.ZodTypeAny, {
2996
3182
  options?: Record<string, unknown>;
2997
3183
  kind?: "realtime";
2998
- provider?: "openai" | "google" | "xai";
3184
+ provider?: "google" | "xai" | "openai";
2999
3185
  }, {
3000
3186
  options?: Record<string, unknown>;
3001
3187
  kind?: "realtime";
3002
- provider?: "openai" | "google" | "xai";
3188
+ provider?: "google" | "xai" | "openai";
3003
3189
  }>]>>;
3004
3190
  vad: z.ZodOptional<z.ZodString>;
3005
3191
  vadOptions: z.ZodOptional<z.ZodObject<{
@@ -3032,28 +3218,28 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3032
3218
  maxDelay: z.ZodOptional<z.ZodNumber>;
3033
3219
  }, "strip", z.ZodTypeAny, {
3034
3220
  enabled?: boolean;
3035
- mode?: "vad" | "adaptive";
3221
+ mode?: "adaptive" | "vad";
3036
3222
  falseInterruptionTimeout?: number;
3037
3223
  resumeFalseInterruption?: boolean;
3038
3224
  minDelay?: number;
3039
3225
  maxDelay?: number;
3040
3226
  }, {
3041
3227
  enabled?: boolean;
3042
- mode?: "vad" | "adaptive";
3228
+ mode?: "adaptive" | "vad";
3043
3229
  falseInterruptionTimeout?: number;
3044
3230
  resumeFalseInterruption?: boolean;
3045
3231
  minDelay?: number;
3046
3232
  maxDelay?: number;
3047
3233
  }>, {
3048
3234
  enabled?: boolean;
3049
- mode?: "vad" | "adaptive";
3235
+ mode?: "adaptive" | "vad";
3050
3236
  falseInterruptionTimeout?: number;
3051
3237
  resumeFalseInterruption?: boolean;
3052
3238
  minDelay?: number;
3053
3239
  maxDelay?: number;
3054
3240
  }, {
3055
3241
  enabled?: boolean;
3056
- mode?: "vad" | "adaptive";
3242
+ mode?: "adaptive" | "vad";
3057
3243
  falseInterruptionTimeout?: number;
3058
3244
  resumeFalseInterruption?: boolean;
3059
3245
  minDelay?: number;
@@ -3157,6 +3343,7 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3157
3343
  onToolFailureSay: z.ZodOptional<z.ZodString>;
3158
3344
  excludeTools: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
3159
3345
  }, "strip", z.ZodTypeAny, {
3346
+ name?: string;
3160
3347
  vad?: string;
3161
3348
  stt?: {
3162
3349
  voice?: string;
@@ -3171,10 +3358,9 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3171
3358
  } | {
3172
3359
  options?: Record<string, unknown>;
3173
3360
  kind?: "realtime";
3174
- provider?: "openai" | "google" | "xai";
3361
+ provider?: "google" | "xai" | "openai";
3175
3362
  };
3176
3363
  volume?: number;
3177
- name?: string;
3178
3364
  llm?: {
3179
3365
  voice?: string;
3180
3366
  options?: Record<string, unknown>;
@@ -3188,7 +3374,7 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3188
3374
  } | {
3189
3375
  options?: Record<string, unknown>;
3190
3376
  kind?: "realtime";
3191
- provider?: "openai" | "google" | "xai";
3377
+ provider?: "google" | "xai" | "openai";
3192
3378
  };
3193
3379
  tts?: {
3194
3380
  voice?: string;
@@ -3203,7 +3389,7 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3203
3389
  } | {
3204
3390
  options?: Record<string, unknown>;
3205
3391
  kind?: "realtime";
3206
- provider?: "openai" | "google" | "xai";
3392
+ provider?: "google" | "xai" | "openai";
3207
3393
  };
3208
3394
  vadOptions?: {
3209
3395
  minSpeechDuration?: number;
@@ -3218,7 +3404,7 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3218
3404
  preemptiveGeneration?: boolean;
3219
3405
  interruption?: {
3220
3406
  enabled?: boolean;
3221
- mode?: "vad" | "adaptive";
3407
+ mode?: "adaptive" | "vad";
3222
3408
  falseInterruptionTimeout?: number;
3223
3409
  resumeFalseInterruption?: boolean;
3224
3410
  minDelay?: number;
@@ -3251,6 +3437,7 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3251
3437
  onToolFailureSay?: string;
3252
3438
  excludeTools?: string[];
3253
3439
  }, {
3440
+ name?: string;
3254
3441
  vad?: string;
3255
3442
  stt?: {
3256
3443
  voice?: string;
@@ -3265,10 +3452,9 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3265
3452
  } | {
3266
3453
  options?: Record<string, unknown>;
3267
3454
  kind?: "realtime";
3268
- provider?: "openai" | "google" | "xai";
3455
+ provider?: "google" | "xai" | "openai";
3269
3456
  };
3270
3457
  volume?: number;
3271
- name?: string;
3272
3458
  llm?: {
3273
3459
  voice?: string;
3274
3460
  options?: Record<string, unknown>;
@@ -3282,7 +3468,7 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3282
3468
  } | {
3283
3469
  options?: Record<string, unknown>;
3284
3470
  kind?: "realtime";
3285
- provider?: "openai" | "google" | "xai";
3471
+ provider?: "google" | "xai" | "openai";
3286
3472
  };
3287
3473
  tts?: {
3288
3474
  voice?: string;
@@ -3297,7 +3483,7 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3297
3483
  } | {
3298
3484
  options?: Record<string, unknown>;
3299
3485
  kind?: "realtime";
3300
- provider?: "openai" | "google" | "xai";
3486
+ provider?: "google" | "xai" | "openai";
3301
3487
  };
3302
3488
  vadOptions?: {
3303
3489
  minSpeechDuration?: number;
@@ -3312,7 +3498,7 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3312
3498
  preemptiveGeneration?: boolean;
3313
3499
  interruption?: {
3314
3500
  enabled?: boolean;
3315
- mode?: "vad" | "adaptive";
3501
+ mode?: "adaptive" | "vad";
3316
3502
  falseInterruptionTimeout?: number;
3317
3503
  resumeFalseInterruption?: boolean;
3318
3504
  minDelay?: number;
@@ -3345,6 +3531,7 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3345
3531
  onToolFailureSay?: string;
3346
3532
  excludeTools?: string[];
3347
3533
  }>, {
3534
+ name?: string;
3348
3535
  vad?: string;
3349
3536
  stt?: {
3350
3537
  voice?: string;
@@ -3359,10 +3546,9 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3359
3546
  } | {
3360
3547
  options?: Record<string, unknown>;
3361
3548
  kind?: "realtime";
3362
- provider?: "openai" | "google" | "xai";
3549
+ provider?: "google" | "xai" | "openai";
3363
3550
  };
3364
3551
  volume?: number;
3365
- name?: string;
3366
3552
  llm?: {
3367
3553
  voice?: string;
3368
3554
  options?: Record<string, unknown>;
@@ -3376,7 +3562,7 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3376
3562
  } | {
3377
3563
  options?: Record<string, unknown>;
3378
3564
  kind?: "realtime";
3379
- provider?: "openai" | "google" | "xai";
3565
+ provider?: "google" | "xai" | "openai";
3380
3566
  };
3381
3567
  tts?: {
3382
3568
  voice?: string;
@@ -3391,7 +3577,7 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3391
3577
  } | {
3392
3578
  options?: Record<string, unknown>;
3393
3579
  kind?: "realtime";
3394
- provider?: "openai" | "google" | "xai";
3580
+ provider?: "google" | "xai" | "openai";
3395
3581
  };
3396
3582
  vadOptions?: {
3397
3583
  minSpeechDuration?: number;
@@ -3406,7 +3592,7 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3406
3592
  preemptiveGeneration?: boolean;
3407
3593
  interruption?: {
3408
3594
  enabled?: boolean;
3409
- mode?: "vad" | "adaptive";
3595
+ mode?: "adaptive" | "vad";
3410
3596
  falseInterruptionTimeout?: number;
3411
3597
  resumeFalseInterruption?: boolean;
3412
3598
  minDelay?: number;
@@ -3439,6 +3625,7 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3439
3625
  onToolFailureSay?: string;
3440
3626
  excludeTools?: string[];
3441
3627
  }, {
3628
+ name?: string;
3442
3629
  vad?: string;
3443
3630
  stt?: {
3444
3631
  voice?: string;
@@ -3453,10 +3640,9 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3453
3640
  } | {
3454
3641
  options?: Record<string, unknown>;
3455
3642
  kind?: "realtime";
3456
- provider?: "openai" | "google" | "xai";
3643
+ provider?: "google" | "xai" | "openai";
3457
3644
  };
3458
3645
  volume?: number;
3459
- name?: string;
3460
3646
  llm?: {
3461
3647
  voice?: string;
3462
3648
  options?: Record<string, unknown>;
@@ -3470,7 +3656,7 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3470
3656
  } | {
3471
3657
  options?: Record<string, unknown>;
3472
3658
  kind?: "realtime";
3473
- provider?: "openai" | "google" | "xai";
3659
+ provider?: "google" | "xai" | "openai";
3474
3660
  };
3475
3661
  tts?: {
3476
3662
  voice?: string;
@@ -3485,7 +3671,7 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3485
3671
  } | {
3486
3672
  options?: Record<string, unknown>;
3487
3673
  kind?: "realtime";
3488
- provider?: "openai" | "google" | "xai";
3674
+ provider?: "google" | "xai" | "openai";
3489
3675
  };
3490
3676
  vadOptions?: {
3491
3677
  minSpeechDuration?: number;
@@ -3500,7 +3686,7 @@ declare const LuaVoiceConfigSchema: z.ZodEffects<z.ZodObject<{
3500
3686
  preemptiveGeneration?: boolean;
3501
3687
  interruption?: {
3502
3688
  enabled?: boolean;
3503
- mode?: "vad" | "adaptive";
3689
+ mode?: "adaptive" | "vad";
3504
3690
  falseInterruptionTimeout?: number;
3505
3691
  resumeFalseInterruption?: boolean;
3506
3692
  minDelay?: number;
@@ -4793,6 +4979,29 @@ declare interface PushJobVersionDTO {
4793
4979
  metadata?: Record<string, any>;
4794
4980
  }
4795
4981
 
4982
+ /**
4983
+ * Normalized, provider-agnostic model request options.
4984
+ *
4985
+ * This is the shape clients (Lua Desktop, lua-cli, admin overrides) use to
4986
+ * ask for a reasoning effort / output verbosity without knowing which
4987
+ * provider dialect (Anthropic `thinking`, OpenAI `reasoningEffort`, Google
4988
+ * `thinkingConfig`, …) the resolved model actually speaks. lua-core's
4989
+ * `buildProviderOptions` translates this into the wire-level
4990
+ * `providerOptions` shape per model.
4991
+ */
4992
+ declare const REASONING_EFFORT_VALUES: readonly ["off", "minimal", "low", "medium", "high", "max"];
4993
+
4994
+ declare type ReasoningEffort = (typeof REASONING_EFFORT_VALUES)[number];
4995
+
4996
+ /**
4997
+ * Additive field on primitive publish responses. When the agent is under
4998
+ * versioning the server performs a scoped promote and returns the newly
4999
+ * minted + promoted agent version here; absent when the agent has no versions.
5000
+ */
5001
+ declare interface ScopedPromoteFields {
5002
+ agentVersion?: number;
5003
+ }
5004
+
4796
5005
  /**
4797
5006
  * Response from product search.
4798
5007
  */
@@ -4843,6 +5052,33 @@ declare type SkillContextText = string | {
4843
5052
  text?: string;
4844
5053
  };
4845
5054
 
5055
+ export declare const Team: TeamApi;
5056
+
5057
+ /**
5058
+ * Team API — resolve a teammate by name within the agent's organization and get
5059
+ * the channel handles they opted to share. Pair with `Channels.send` to message a
5060
+ * colleague without typing their number.
5061
+ *
5062
+ * The org is derived server-side from the agent; you can only resolve members of
5063
+ * your own org. Returns a list — disambiguate when more than one member matches.
5064
+ *
5065
+ * @example
5066
+ * ```typescript
5067
+ * const { matches } = await Team.findMember('Stefan');
5068
+ * const wa = matches[0]?.targets.find((t) => t.channel === 'whatsapp');
5069
+ * if (wa) {
5070
+ * await Channels.send({ channel: 'whatsapp', to: { phoneNumber: wa.value }, text: 'Hi Stefan!' });
5071
+ * }
5072
+ * ```
5073
+ */
5074
+ export declare interface TeamApi {
5075
+ /**
5076
+ * Resolve teammates whose name matches, each with their shareable channel
5077
+ * targets (empty `targets[]` when the member shared nothing).
5078
+ */
5079
+ findMember(name: string): Promise<DirectoryResolveResult>;
5080
+ }
5081
+
4846
5082
  /**
4847
5083
  * Templates API
4848
5084
  *
@@ -5403,6 +5639,20 @@ export declare interface WebhookRequest {
5403
5639
  payload: any;
5404
5640
  }
5405
5641
 
5642
+ /** Body of POST /developer/agents/:agentId/channels/whatsapp/reaction */
5643
+ export declare interface WhatsAppReactionSendInput {
5644
+ to: {
5645
+ userId?: string;
5646
+ phoneNumber?: string;
5647
+ };
5648
+ /** Vendor id (`wamid...`) of the message to react to — e.g. an inbound
5649
+ * message's id from the conversation history, ≤30 days old per Meta. */
5650
+ messageId: string;
5651
+ /** A single emoji. An empty string removes the agent's existing reaction. */
5652
+ emoji: string;
5653
+ options?: ChannelSendOptions;
5654
+ }
5655
+
5406
5656
  export declare interface WhatsAppTemplate {
5407
5657
  id: string;
5408
5658
  name: string;