@vellumai/plugin-api 0.12.2-dev.202609211713.ad8242b → 0.12.2-dev.202609211913.b0ee78c

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/index.d.ts +108 -58
  2. package/index.js +3 -0
  3. package/package.json +1 -1
package/index.d.ts CHANGED
@@ -12342,6 +12342,13 @@ declare type InterfaceId = (typeof INTERFACE_IDS)[number];
12342
12342
  */
12343
12343
  export declare const INTERNAL_NUDGE_OUTPUT_SUPPRESSION = " This notice is internal: do not repeat, quote, describe, or acknowledge it, and do not narrate whether you will continue or whether the turn is done. Reply with only the content the user should see.";
12344
12344
 
12345
+ /**
12346
+ * Failed-parse tool result for executors that validate their own input (the
12347
+ * pre-execution gate in `ToolApprovalHandler` produces the same message, so
12348
+ * the error reads identically whichever layer catches it first).
12349
+ */
12350
+ export declare function invalidToolInputResult(toolName: string, error: z.ZodError): ToolExecutionResult;
12351
+
12345
12352
  /** Whether the conversation currently has a turn in flight. */
12346
12353
  export declare function isConversationProcessing(id: string): Promise<boolean>;
12347
12354
 
@@ -18105,6 +18112,16 @@ generated: undefined;
18105
18112
  dialect: "sqlite";
18106
18113
  }>;
18107
18114
 
18115
+ /**
18116
+ * Wrap an optional field's schema so an explicit `null` parses as "omitted"
18117
+ * (`undefined`). Models routinely send `null` for optional fields they mean
18118
+ * to skip, and executors read such fields via `input.x ?? fallback`, where
18119
+ * null and absent are equivalent — validation must not reject null there.
18120
+ * The derived JSON Schema is the inner schema's (the null-tolerance is
18121
+ * runtime slack, not advertised contract).
18122
+ */
18123
+ export declare function nullAsOmitted<T extends z.ZodType>(schema: T): z.ZodPipe<z.ZodTransform<{} | undefined, unknown>, z.ZodOptional<T>>;
18124
+
18108
18125
  declare const oauthApps: SQLiteTableWithColumns< {
18109
18126
  name: "oauth_apps";
18110
18127
  schema: undefined;
@@ -23524,11 +23541,59 @@ export declare interface ThinkingContent {
23524
23541
  */
23525
23542
  export declare function throwIfCancelled(context: CancellableToolContext): void;
23526
23543
 
23527
- /** Discriminated container so future tools can add their own metadata. */
23528
- declare interface ToolActivityMetadata {
23529
- webSearch?: WebSearchMetadata;
23530
- webFetch?: WebFetchMetadata;
23531
- }
23544
+ declare type ToolActivityMetadata = z.infer<typeof ToolActivityMetadataSchema>;
23545
+
23546
+ declare const ToolActivityMetadataSchema: z.ZodObject<{
23547
+ webSearch: z.ZodOptional<z.ZodObject<{
23548
+ query: z.ZodString;
23549
+ provider: z.ZodEnum<{
23550
+ "anthropic-native": "anthropic-native";
23551
+ brave: "brave";
23552
+ perplexity: "perplexity";
23553
+ tavily: "tavily";
23554
+ keenable: "keenable";
23555
+ firecrawl: "firecrawl";
23556
+ fastcrw: "fastcrw";
23557
+ searxng: "searxng";
23558
+ tinyfish: "tinyfish";
23559
+ }>;
23560
+ resultCount: z.ZodNumber;
23561
+ durationMs: z.ZodNumber;
23562
+ results: z.ZodArray<z.ZodObject<{
23563
+ rank: z.ZodNumber;
23564
+ title: z.ZodString;
23565
+ url: z.ZodString;
23566
+ domain: z.ZodString;
23567
+ faviconUrl: z.ZodOptional<z.ZodString>;
23568
+ snippet: z.ZodOptional<z.ZodString>;
23569
+ age: z.ZodOptional<z.ZodString>;
23570
+ score: z.ZodOptional<z.ZodNumber>;
23571
+ }, z.core.$strip>>;
23572
+ errorMessage: z.ZodOptional<z.ZodString>;
23573
+ }, z.core.$strip>>;
23574
+ webFetch: z.ZodOptional<z.ZodObject<{
23575
+ url: z.ZodString;
23576
+ finalUrl: z.ZodString;
23577
+ provider: z.ZodOptional<z.ZodEnum<{
23578
+ default: "default";
23579
+ firecrawl: "firecrawl";
23580
+ fastcrw: "fastcrw";
23581
+ tinyfish: "tinyfish";
23582
+ }>>;
23583
+ status: z.ZodNumber;
23584
+ contentType: z.ZodOptional<z.ZodString>;
23585
+ byteCount: z.ZodNumber;
23586
+ charCount: z.ZodNumber;
23587
+ truncated: z.ZodBoolean;
23588
+ title: z.ZodOptional<z.ZodString>;
23589
+ domain: z.ZodString;
23590
+ faviconUrl: z.ZodOptional<z.ZodString>;
23591
+ redirectCount: z.ZodNumber;
23592
+ durationMs: z.ZodNumber;
23593
+ errorMessage: z.ZodOptional<z.ZodString>;
23594
+ mayRequireJavaScript: z.ZodOptional<z.ZodBoolean>;
23595
+ }, z.core.$strip>>;
23596
+ }, z.core.$strip>;
23532
23597
 
23533
23598
  /**
23534
23599
  * Runtime context passed as the second argument to every tool's `execute`.
@@ -24321,14 +24386,45 @@ export declare interface ToolUseContent {
24321
24386
  };
24322
24387
  }
24323
24388
 
24324
- declare type TrustClass = z.infer<typeof trustClassSchema>;
24389
+ /**
24390
+ * Derive a tool's LLM-facing `input_schema` from its Zod input schema, so the
24391
+ * schema the model sees and the validation the executor runs share one source
24392
+ * and cannot drift (`TOOL_INPUT_SCHEMAS` in `../tool-input-schemas.ts` holds
24393
+ * the executor-side half).
24394
+ *
24395
+ * Conversion uses Zod 4's native `z.toJSONSchema` (mirroring
24396
+ * `workflows/leaf-runner.ts`), then adjusts the output for the tool-definition
24397
+ * context:
24398
+ *
24399
+ * - The `$schema` marker is dropped — tool definitions don't carry one.
24400
+ * - `additionalProperties` values of `false` / `{}` are dropped. They are
24401
+ * authoring artifacts of `z.object` / `z.looseObject`, not intentional
24402
+ * contract: runtime validation never rejects unknown keys (registry schemas
24403
+ * must tolerate injected fields like `activity`, see
24404
+ * `schema-transforms.ts`), so advertising `additionalProperties: false`
24405
+ * would claim a strictness the runtime doesn't enforce.
24406
+ *
24407
+ * `advertiseRequired` names fields to mark required in the advertised schema
24408
+ * even though the Zod schema treats them as optional. This is the one
24409
+ * sanctioned divergence, and only in the tolerant direction: the model is told
24410
+ * to always send the field (e.g. `activity`, which drives status UX), but a
24411
+ * call that omits it still executes rather than failing on a field the tool
24412
+ * doesn't need. Naming `activity` there also records the schema as carrying
24413
+ * the daemon's own status field (`declareDaemonActivityField`), so a surface
24414
+ * that renders no activity text can drop it from the advertised copy.
24415
+ */
24416
+ export declare function toToolInputSchema(schema: z.ZodType, opts?: {
24417
+ advertiseRequired?: readonly string[];
24418
+ }): Record<string, unknown>;
24325
24419
 
24326
- declare const trustClassSchema: z.ZodEnum<{
24327
- unknown: "unknown";
24328
- guardian: "guardian";
24329
- trusted_contact: "trusted_contact";
24330
- unverified_contact: "unverified_contact";
24331
- }>;
24420
+ /**
24421
+ * Trust classification of an inbound actor, ordered most- to least-trusted.
24422
+ * The one declaration of the vocabulary: the gateway classifies with it and
24423
+ * the daemon derives capabilities from it.
24424
+ */
24425
+ declare const TRUST_CLASS_VALUES: readonly ["guardian", "trusted_contact", "unverified_contact", "unknown"];
24426
+
24427
+ declare type TrustClass = (typeof TRUST_CLASS_VALUES)[number];
24332
24428
 
24333
24429
  export declare class TtsSynthesisError extends Error {
24334
24430
  readonly code: TtsSynthesisErrorCode;
@@ -25248,29 +25344,6 @@ generated: undefined;
25248
25344
  dialect: "sqlite";
25249
25345
  }>;
25250
25346
 
25251
- declare interface WebFetchMetadata {
25252
- url: string;
25253
- finalUrl: string;
25254
- /** Provider that served the fetch. Defaults to the built-in fetcher. */
25255
- provider?: WebFetchProviderId;
25256
- status: number;
25257
- contentType?: string;
25258
- byteCount: number;
25259
- charCount: number;
25260
- truncated: boolean;
25261
- title?: string;
25262
- domain: string;
25263
- faviconUrl?: string;
25264
- redirectCount: number;
25265
- durationMs: number;
25266
- errorMessage?: string;
25267
- /** Set when extracted text is dramatically smaller than raw HTML — likely a JS-rendered SPA whose meaningful content the static fetcher missed. */
25268
- mayRequireJavaScript?: boolean;
25269
- }
25270
-
25271
- /** Provider that backed a `web_fetch` call. `default` is the built-in fetcher. */
25272
- declare type WebFetchProviderId = "default" | "firecrawl" | "fastcrw" | "tinyfish";
25273
-
25274
25347
  /**
25275
25348
  * Public URL resolution for a plugin's own ingress route.
25276
25349
  *
@@ -25316,29 +25389,6 @@ declare interface WebPresenceReport {
25316
25389
  focusedConversationId: string | null;
25317
25390
  }
25318
25391
 
25319
- declare interface WebSearchMetadata {
25320
- query: string;
25321
- provider: WebSearchProviderId;
25322
- resultCount: number;
25323
- durationMs: number;
25324
- results: WebSearchResultItem[];
25325
- /** Present when search itself failed; results[] will be empty. */
25326
- errorMessage?: string;
25327
- }
25328
-
25329
- declare type WebSearchProviderId = "anthropic-native" | "brave" | "perplexity" | "tavily" | "keenable" | "firecrawl" | "fastcrw" | "searxng" | "tinyfish";
25330
-
25331
- declare interface WebSearchResultItem {
25332
- rank: number;
25333
- title: string;
25334
- url: string;
25335
- domain: string;
25336
- faviconUrl?: string;
25337
- snippet?: string;
25338
- age?: string;
25339
- score?: number;
25340
- }
25341
-
25342
25392
  export declare interface WebSearchToolResultContent {
25343
25393
  type: "web_search_tool_result";
25344
25394
  tool_use_id: string;
package/index.js CHANGED
@@ -35,6 +35,7 @@ export const getRecordedConversationToolSurface = api.getRecordedConversationToo
35
35
  export const getWorkspaceDir = api.getWorkspaceDir;
36
36
  export const hasLexicalTokens = api.hasLexicalTokens;
37
37
  export const indexDocument = api.indexDocument;
38
+ export const invalidToolInputResult = api.invalidToolInputResult;
38
39
  export const isConversationProcessing = api.isConversationProcessing;
39
40
  export const isMaxTokensStopReason = api.isMaxTokensStopReason;
40
41
  export const isToolResultMessage = api.isToolResultMessage;
@@ -44,6 +45,7 @@ export const listCatalogSkills = api.listCatalogSkills;
44
45
  export const listConversations = api.listConversations;
45
46
  export const listInstalledSkills = api.listInstalledSkills;
46
47
  export const mediaBlockAttachmentId = api.mediaBlockAttachmentId;
48
+ export const nullAsOmitted = api.nullAsOmitted;
47
49
  export const openTranscriptionSession = api.openTranscriptionSession;
48
50
  export const parseMessageMetadata = api.parseMessageMetadata;
49
51
  export const parseSurfaceShowResultId = api.parseSurfaceShowResultId;
@@ -67,4 +69,5 @@ export const sweepOrphanedGraphNodePoints = api.sweepOrphanedGraphNodePoints;
67
69
  export const syncMessageToDisk = api.syncMessageToDisk;
68
70
  export const synthesizeText = api.synthesizeText;
69
71
  export const throwIfCancelled = api.throwIfCancelled;
72
+ export const toToolInputSchema = api.toToolInputSchema;
70
73
  export const updateMessageMetadata = api.updateMessageMetadata;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vellumai/plugin-api",
3
- "version": "0.12.2-dev.202609211713.ad8242b",
3
+ "version": "0.12.2-dev.202609211913.b0ee78c",
4
4
  "description": "Public TypeScript authoring contract for Vellum assistant plugins.",
5
5
  "license": "MIT",
6
6
  "type": "module",