@get-bb/plugin-sdk 0.4.15 → 0.4.17

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.
@@ -5,6 +5,8 @@
5
5
  // Confused by the API, or need a symbol that isn't here? Clone the BB repo
6
6
  // and read the real source: https://github.com/get-bb/bb
7
7
 
8
+ import { z } from 'zod';
9
+
8
10
  /**
9
11
  * The validator-neutral subset of Standard Schema v1 used by plugin RPC.
10
12
  * Zod 4 schemas implement this interface directly; other validators can do
@@ -120,5 +122,480 @@ declare function experimental_defineHostEntry<const Contract extends PluginRpcCo
120
122
  dispose?: () => void | Promise<void>;
121
123
  }): ExperimentalHostEntry<Contract, Signals>;
122
124
 
123
- export { experimental_defineHostEntry };
124
- export type { ExperimentalHostEntry, ExperimentalHostPaths, ExperimentalHostRpcContext, ExperimentalHostRpcHandlers, ExperimentalHostSignalContract, ExperimentalHostSignals, ExperimentalHostWatchChange, ExperimentalHostWatchChangeType, ExperimentalHostWatchEvent, ExperimentalHostWatchListener, ExperimentalHostWatchOptions, ExperimentalHostWatchSubscription, ExperimentalHostWorkerLease };
125
+ /** The input form a resolver writes: the options optional, filled per side by the normalizer. */
126
+ declare const providerResolvedNativeRootInputSchema: z.ZodObject<{
127
+ ancestors: z.ZodOptional<z.ZodBoolean>;
128
+ fallbackName: z.ZodOptional<z.ZodString>;
129
+ namePrefix: z.ZodOptional<z.ZodString>;
130
+ origin: z.ZodEnum<{
131
+ project: "project";
132
+ user: "user";
133
+ }>;
134
+ path: z.ZodString;
135
+ recursive: z.ZodOptional<z.ZodBoolean>;
136
+ shape: z.ZodOptional<z.ZodEnum<{
137
+ "command-file": "command-file";
138
+ "skill-file": "skill-file";
139
+ commands: "commands";
140
+ skill: "skill";
141
+ skills: "skills";
142
+ }>>;
143
+ skipIfManifest: z.ZodOptional<z.ZodString>;
144
+ }, z.core.$strict>;
145
+ type ProviderResolvedNativeRootInput = z.input<typeof providerResolvedNativeRootInputSchema>;
146
+ declare const providerResolvedNativeRootsSchema: z.ZodObject<{
147
+ commands: z.ZodArray<z.ZodObject<{
148
+ ancestors: z.ZodBoolean;
149
+ fallbackName: z.ZodOptional<z.ZodString>;
150
+ namePrefix: z.ZodString;
151
+ origin: z.ZodEnum<{
152
+ project: "project";
153
+ user: "user";
154
+ }>;
155
+ path: z.ZodString;
156
+ recursive: z.ZodBoolean;
157
+ shape: z.ZodEnum<{
158
+ "command-file": "command-file";
159
+ "skill-file": "skill-file";
160
+ commands: "commands";
161
+ skill: "skill";
162
+ skills: "skills";
163
+ }>;
164
+ skipIfManifest: z.ZodOptional<z.ZodString>;
165
+ }, z.core.$strict>>;
166
+ skills: z.ZodArray<z.ZodObject<{
167
+ ancestors: z.ZodBoolean;
168
+ fallbackName: z.ZodOptional<z.ZodString>;
169
+ namePrefix: z.ZodString;
170
+ origin: z.ZodEnum<{
171
+ project: "project";
172
+ user: "user";
173
+ }>;
174
+ path: z.ZodString;
175
+ recursive: z.ZodBoolean;
176
+ shape: z.ZodEnum<{
177
+ "command-file": "command-file";
178
+ "skill-file": "skill-file";
179
+ commands: "commands";
180
+ skill: "skill";
181
+ skills: "skills";
182
+ }>;
183
+ skipIfManifest: z.ZodOptional<z.ZodString>;
184
+ }, z.core.$strict>>;
185
+ }, z.core.$strict>;
186
+ type ProviderResolvedNativeRoots = z.infer<typeof providerResolvedNativeRootsSchema>;
187
+
188
+ /**
189
+ * The host RPC a provider plugin implements when its declaration sets
190
+ * `experimental_resolvesNativeRoots`. Core calls `resolveNativeRoots` on the
191
+ * workspace host each time it lists a provider's commands or skills (cached
192
+ * briefly per host and workspace) and scans the returned roots beside the
193
+ * declared ones. The plugin answers from the host's own files — a moved
194
+ * config directory, installed vendor plugins, config-file skill entries —
195
+ * and decides each root's origin: a project-scoped vendor plugin is
196
+ * `project`, a home-directory entry is `user`.
197
+ *
198
+ * Paths are host-absolute without dot segments. A root's `shape` says how the
199
+ * daemon reads it; the defaults (`skills` for the skills side, `commands` for
200
+ * the commands side) are filled by the contract. A thrown error or a
201
+ * malformed answer is logged by core and yields no resolved roots for that
202
+ * listing; it never fails the listing. A side longer than
203
+ * `PROVIDER_RESOLVED_NATIVE_ROOTS_MAX` is cut to the cap, not refused.
204
+ *
205
+ * The contract validates the whole answer at once, so one root the contract
206
+ * refuses (a vendor plugin whose name cannot be a name prefix, say) would
207
+ * cost the user every other root. A resolver runs its answer through
208
+ * `experimental_filterResolvedNativeRoots` before it returns: each root is
209
+ * judged on its own, a refused one is dropped with a warning, and the rest
210
+ * stand.
211
+ */
212
+
213
+ declare const experimental_nativeRootsResolveInputSchema: z.ZodObject<{
214
+ cwd: z.ZodNullable<z.ZodString>;
215
+ providerId: z.ZodString;
216
+ }, z.core.$strict>;
217
+ type ExperimentalNativeRootsResolveInput = z.infer<typeof experimental_nativeRootsResolveInputSchema>;
218
+ type ResolvedRootSide = keyof ProviderResolvedNativeRoots;
219
+ /** What a resolver returns: the normalized roots, defaults filled per side, each side cut to the cap. */
220
+ declare const experimental_nativeRootsResolveOutputSchema: z.ZodPipe<z.ZodPipe<z.ZodObject<{
221
+ commands: z.ZodOptional<z.ZodArray<z.ZodObject<{
222
+ ancestors: z.ZodOptional<z.ZodBoolean>;
223
+ fallbackName: z.ZodOptional<z.ZodString>;
224
+ namePrefix: z.ZodOptional<z.ZodString>;
225
+ origin: z.ZodEnum<{
226
+ project: "project";
227
+ user: "user";
228
+ }>;
229
+ path: z.ZodString;
230
+ recursive: z.ZodOptional<z.ZodBoolean>;
231
+ shape: z.ZodOptional<z.ZodEnum<{
232
+ "command-file": "command-file";
233
+ "skill-file": "skill-file";
234
+ commands: "commands";
235
+ skill: "skill";
236
+ skills: "skills";
237
+ }>>;
238
+ skipIfManifest: z.ZodOptional<z.ZodString>;
239
+ }, z.core.$strict>>>;
240
+ skills: z.ZodOptional<z.ZodArray<z.ZodObject<{
241
+ ancestors: z.ZodOptional<z.ZodBoolean>;
242
+ fallbackName: z.ZodOptional<z.ZodString>;
243
+ namePrefix: z.ZodOptional<z.ZodString>;
244
+ origin: z.ZodEnum<{
245
+ project: "project";
246
+ user: "user";
247
+ }>;
248
+ path: z.ZodString;
249
+ recursive: z.ZodOptional<z.ZodBoolean>;
250
+ shape: z.ZodOptional<z.ZodEnum<{
251
+ "command-file": "command-file";
252
+ "skill-file": "skill-file";
253
+ commands: "commands";
254
+ skill: "skill";
255
+ skills: "skills";
256
+ }>>;
257
+ skipIfManifest: z.ZodOptional<z.ZodString>;
258
+ }, z.core.$strict>>>;
259
+ }, z.core.$strict>, z.ZodTransform<{
260
+ skills: {
261
+ path: string;
262
+ origin: "project" | "user";
263
+ recursive: boolean;
264
+ ancestors: boolean;
265
+ namePrefix: string;
266
+ shape: "command-file" | "commands" | "skill" | "skill-file" | "skills";
267
+ fallbackName?: string | undefined;
268
+ skipIfManifest?: string | undefined;
269
+ }[];
270
+ commands: {
271
+ path: string;
272
+ origin: "project" | "user";
273
+ recursive: boolean;
274
+ ancestors: boolean;
275
+ namePrefix: string;
276
+ shape: "command-file" | "commands" | "skill" | "skill-file" | "skills";
277
+ fallbackName?: string | undefined;
278
+ skipIfManifest?: string | undefined;
279
+ }[];
280
+ }, {
281
+ skills?: {
282
+ path: string;
283
+ origin: "project" | "user";
284
+ recursive?: boolean | undefined;
285
+ ancestors?: boolean | undefined;
286
+ namePrefix?: string | undefined;
287
+ shape?: "command-file" | "commands" | "skill" | "skill-file" | "skills" | undefined;
288
+ fallbackName?: string | undefined;
289
+ skipIfManifest?: string | undefined;
290
+ }[] | undefined;
291
+ commands?: {
292
+ path: string;
293
+ origin: "project" | "user";
294
+ recursive?: boolean | undefined;
295
+ ancestors?: boolean | undefined;
296
+ namePrefix?: string | undefined;
297
+ shape?: "command-file" | "commands" | "skill" | "skill-file" | "skills" | undefined;
298
+ fallbackName?: string | undefined;
299
+ skipIfManifest?: string | undefined;
300
+ }[] | undefined;
301
+ }>>, z.ZodObject<{
302
+ commands: z.ZodArray<z.ZodObject<{
303
+ ancestors: z.ZodBoolean;
304
+ fallbackName: z.ZodOptional<z.ZodString>;
305
+ namePrefix: z.ZodString;
306
+ origin: z.ZodEnum<{
307
+ project: "project";
308
+ user: "user";
309
+ }>;
310
+ path: z.ZodString;
311
+ recursive: z.ZodBoolean;
312
+ shape: z.ZodEnum<{
313
+ "command-file": "command-file";
314
+ "skill-file": "skill-file";
315
+ commands: "commands";
316
+ skill: "skill";
317
+ skills: "skills";
318
+ }>;
319
+ skipIfManifest: z.ZodOptional<z.ZodString>;
320
+ }, z.core.$strict>>;
321
+ skills: z.ZodArray<z.ZodObject<{
322
+ ancestors: z.ZodBoolean;
323
+ fallbackName: z.ZodOptional<z.ZodString>;
324
+ namePrefix: z.ZodString;
325
+ origin: z.ZodEnum<{
326
+ project: "project";
327
+ user: "user";
328
+ }>;
329
+ path: z.ZodString;
330
+ recursive: z.ZodBoolean;
331
+ shape: z.ZodEnum<{
332
+ "command-file": "command-file";
333
+ "skill-file": "skill-file";
334
+ commands: "commands";
335
+ skill: "skill";
336
+ skills: "skills";
337
+ }>;
338
+ skipIfManifest: z.ZodOptional<z.ZodString>;
339
+ }, z.core.$strict>>;
340
+ }, z.core.$strict>>;
341
+ type ExperimentalNativeRootsResolveOutput = ProviderResolvedNativeRoots;
342
+ /** The input form a handler writes (options optional). */
343
+ type ExperimentalNativeRootsResolveAnswer = z.input<typeof experimental_nativeRootsResolveOutputSchema>;
344
+ /** One root `experimental_filterResolvedNativeRoots` refused, and why. */
345
+ interface ExperimentalDroppedNativeRoot {
346
+ side: ResolvedRootSide;
347
+ path: string;
348
+ reason: string;
349
+ }
350
+ interface ExperimentalFilteredNativeRoots<Skill extends ProviderResolvedNativeRootInput, Command extends ProviderResolvedNativeRootInput> {
351
+ /** The roots that passed, each side cut to the cap, in the order given. */
352
+ answer: {
353
+ skills: Skill[];
354
+ commands: Command[];
355
+ };
356
+ dropped: ExperimentalDroppedNativeRoot[];
357
+ /** How many roots the cap cut from each side. */
358
+ truncated: {
359
+ skills: number;
360
+ commands: number;
361
+ };
362
+ }
363
+ /**
364
+ * Judge each root of an answer on its own against the contract, drop the
365
+ * ones it refuses, and cut each side to `PROVIDER_RESOLVED_NATIVE_ROOTS_MAX`
366
+ * (the first roots stay). `warn` is called once per dropped root and once
367
+ * per cut side, with the path and the reason — once for the worker's
368
+ * lifetime per (side, path, reason), so a persistent bad root does not flood
369
+ * the host diagnostics. A resolver calls this on its
370
+ * answer before it returns, so one odd vendor plugin cannot void the listing.
371
+ * The reason lists the field-level issues when any field is malformed; the
372
+ * cross-field rules are judged only on a root whose fields all parse.
373
+ */
374
+ declare function experimental_filterResolvedNativeRoots<Skill extends ProviderResolvedNativeRootInput, Command extends ProviderResolvedNativeRootInput>(answer: {
375
+ readonly skills?: readonly Skill[];
376
+ readonly commands?: readonly Command[];
377
+ }, options: {
378
+ warn: (message: string) => void;
379
+ /** Warned (side, path, reason) keys; defaults to a set that lives as long as the worker. */
380
+ warned?: Set<string>;
381
+ }): ExperimentalFilteredNativeRoots<Skill, Command>;
382
+ declare const experimental_nativeRootsHostContract: {
383
+ readonly resolveNativeRoots: {
384
+ readonly input: z.ZodObject<{
385
+ cwd: z.ZodNullable<z.ZodString>;
386
+ providerId: z.ZodString;
387
+ }, z.core.$strict>;
388
+ readonly output: z.ZodPipe<z.ZodPipe<z.ZodObject<{
389
+ commands: z.ZodOptional<z.ZodArray<z.ZodObject<{
390
+ ancestors: z.ZodOptional<z.ZodBoolean>;
391
+ fallbackName: z.ZodOptional<z.ZodString>;
392
+ namePrefix: z.ZodOptional<z.ZodString>;
393
+ origin: z.ZodEnum<{
394
+ project: "project";
395
+ user: "user";
396
+ }>;
397
+ path: z.ZodString;
398
+ recursive: z.ZodOptional<z.ZodBoolean>;
399
+ shape: z.ZodOptional<z.ZodEnum<{
400
+ "command-file": "command-file";
401
+ "skill-file": "skill-file";
402
+ commands: "commands";
403
+ skill: "skill";
404
+ skills: "skills";
405
+ }>>;
406
+ skipIfManifest: z.ZodOptional<z.ZodString>;
407
+ }, z.core.$strict>>>;
408
+ skills: z.ZodOptional<z.ZodArray<z.ZodObject<{
409
+ ancestors: z.ZodOptional<z.ZodBoolean>;
410
+ fallbackName: z.ZodOptional<z.ZodString>;
411
+ namePrefix: z.ZodOptional<z.ZodString>;
412
+ origin: z.ZodEnum<{
413
+ project: "project";
414
+ user: "user";
415
+ }>;
416
+ path: z.ZodString;
417
+ recursive: z.ZodOptional<z.ZodBoolean>;
418
+ shape: z.ZodOptional<z.ZodEnum<{
419
+ "command-file": "command-file";
420
+ "skill-file": "skill-file";
421
+ commands: "commands";
422
+ skill: "skill";
423
+ skills: "skills";
424
+ }>>;
425
+ skipIfManifest: z.ZodOptional<z.ZodString>;
426
+ }, z.core.$strict>>>;
427
+ }, z.core.$strict>, z.ZodTransform<{
428
+ skills: {
429
+ path: string;
430
+ origin: "project" | "user";
431
+ recursive: boolean;
432
+ ancestors: boolean;
433
+ namePrefix: string;
434
+ shape: "command-file" | "commands" | "skill" | "skill-file" | "skills";
435
+ fallbackName?: string | undefined;
436
+ skipIfManifest?: string | undefined;
437
+ }[];
438
+ commands: {
439
+ path: string;
440
+ origin: "project" | "user";
441
+ recursive: boolean;
442
+ ancestors: boolean;
443
+ namePrefix: string;
444
+ shape: "command-file" | "commands" | "skill" | "skill-file" | "skills";
445
+ fallbackName?: string | undefined;
446
+ skipIfManifest?: string | undefined;
447
+ }[];
448
+ }, {
449
+ skills?: {
450
+ path: string;
451
+ origin: "project" | "user";
452
+ recursive?: boolean | undefined;
453
+ ancestors?: boolean | undefined;
454
+ namePrefix?: string | undefined;
455
+ shape?: "command-file" | "commands" | "skill" | "skill-file" | "skills" | undefined;
456
+ fallbackName?: string | undefined;
457
+ skipIfManifest?: string | undefined;
458
+ }[] | undefined;
459
+ commands?: {
460
+ path: string;
461
+ origin: "project" | "user";
462
+ recursive?: boolean | undefined;
463
+ ancestors?: boolean | undefined;
464
+ namePrefix?: string | undefined;
465
+ shape?: "command-file" | "commands" | "skill" | "skill-file" | "skills" | undefined;
466
+ fallbackName?: string | undefined;
467
+ skipIfManifest?: string | undefined;
468
+ }[] | undefined;
469
+ }>>, z.ZodObject<{
470
+ commands: z.ZodArray<z.ZodObject<{
471
+ ancestors: z.ZodBoolean;
472
+ fallbackName: z.ZodOptional<z.ZodString>;
473
+ namePrefix: z.ZodString;
474
+ origin: z.ZodEnum<{
475
+ project: "project";
476
+ user: "user";
477
+ }>;
478
+ path: z.ZodString;
479
+ recursive: z.ZodBoolean;
480
+ shape: z.ZodEnum<{
481
+ "command-file": "command-file";
482
+ "skill-file": "skill-file";
483
+ commands: "commands";
484
+ skill: "skill";
485
+ skills: "skills";
486
+ }>;
487
+ skipIfManifest: z.ZodOptional<z.ZodString>;
488
+ }, z.core.$strict>>;
489
+ skills: z.ZodArray<z.ZodObject<{
490
+ ancestors: z.ZodBoolean;
491
+ fallbackName: z.ZodOptional<z.ZodString>;
492
+ namePrefix: z.ZodString;
493
+ origin: z.ZodEnum<{
494
+ project: "project";
495
+ user: "user";
496
+ }>;
497
+ path: z.ZodString;
498
+ recursive: z.ZodBoolean;
499
+ shape: z.ZodEnum<{
500
+ "command-file": "command-file";
501
+ "skill-file": "skill-file";
502
+ commands: "commands";
503
+ skill: "skill";
504
+ skills: "skills";
505
+ }>;
506
+ skipIfManifest: z.ZodOptional<z.ZodString>;
507
+ }, z.core.$strict>>;
508
+ }, z.core.$strict>>;
509
+ };
510
+ };
511
+ type ExperimentalNativeRootsHostContract = typeof experimental_nativeRootsHostContract;
512
+
513
+ /** One root of a `resolveNativeRoots` answer, in the form a handler writes. */
514
+ type ResolvedRoot = NonNullable<ExperimentalNativeRootsResolveAnswer["skills"]>[number];
515
+ type ResolvedRootOrigin = "project" | "user";
516
+ /** The two sides of a `resolveNativeRoots` answer, each path once per side. */
517
+ interface ExperimentalVendorPluginRoots {
518
+ skills: ResolvedRoot[];
519
+ commands: ResolvedRoot[];
520
+ }
521
+ /** One installed vendor plugin in the Claude plugin layout. */
522
+ interface ExperimentalVendorPlugin {
523
+ /** The plugin's root directory (the one holding its manifest), host-absolute. */
524
+ rootPath: string;
525
+ /**
526
+ * The plugin's name: every root is prefixed `<name>:`, and a root
527
+ * `SKILL.md` is named after it when the file's frontmatter names none. A
528
+ * name that cannot be a name prefix costs the plugin its own roots at
529
+ * `experimental_filterResolvedNativeRoots`, not the rest of the answer.
530
+ */
531
+ name: string;
532
+ /** `user` for a personal install, `project` for one the workspace holds. */
533
+ origin: ResolvedRootOrigin;
534
+ /**
535
+ * The manifest's `skills` entries, relative to the root, in the manifest's
536
+ * own form (one path or a list). An absolute or escaping entry is ignored.
537
+ */
538
+ skills?: string | readonly string[];
539
+ /** The manifest's `commands` entries, in the same form. */
540
+ commands?: string | readonly string[];
541
+ }
542
+ interface ExperimentalVendorPluginRootsArgs {
543
+ /** The plugins in answer order; the first to claim a path keeps it. */
544
+ plugins: readonly ExperimentalVendorPlugin[];
545
+ /**
546
+ * The plugin layout. `claude` lists the conventional roots — the root
547
+ * `SKILL.md`, `skills/` and `commands/` — and then the manifest's entries,
548
+ * each directory read flat: a manifest directory that holds `SKILL.md`
549
+ * itself is one skill. `grok` lists the manifest's entries only, each
550
+ * directory read recursively.
551
+ */
552
+ layout: "claude" | "grok";
553
+ }
554
+ interface ExperimentalClaudePluginRootsArgs {
555
+ /**
556
+ * The workspace, or null when bb lists without one: project- and
557
+ * local-scoped installs and the project skills directory's plugins count
558
+ * only for the workspace that holds them.
559
+ */
560
+ cwd: string | null;
561
+ /** The host user's home directory. */
562
+ homeDir: string;
563
+ /** The host environment; only `CLAUDE_CONFIG_DIR` is read. */
564
+ env: Readonly<Record<string, string | undefined>>;
565
+ }
566
+ interface ExperimentalClaudePluginRoots extends ExperimentalVendorPluginRoots {
567
+ /**
568
+ * The Claude config directory the registry was read from:
569
+ * `CLAUDE_CONFIG_DIR` (absolute, `~`-relative, or relative to the home
570
+ * directory), else `~/.claude`. A resolver that also lists the directory's
571
+ * own `skills` and `commands` takes it from here, so both agree.
572
+ */
573
+ claudeDir: string;
574
+ }
575
+ /**
576
+ * The skill and command roots of the given plugins, in the given order, each
577
+ * prefixed with its plugin's name. In the `claude` layout a plugin
578
+ * contributes its root `SKILL.md` (named after the plugin when the file's
579
+ * frontmatter has no name), `skills/`, `commands/`, then the manifest's
580
+ * `skills` and `commands` entries; in the `grok` layout the manifest's
581
+ * entries only, each directory recursive. A missing component is skipped; a
582
+ * path answered twice is kept for the first plugin that named it.
583
+ */
584
+ declare function experimental_resolveVendorPluginRoots(args: ExperimentalVendorPluginRootsArgs): Promise<ExperimentalVendorPluginRoots>;
585
+ /**
586
+ * The roots of every enabled Claude plugin on this host, for one workspace.
587
+ * Claude Code records installs in `<claudeDir>/plugins/installed_plugins.json`
588
+ * and switches them in its settings (`enabledPlugins`: user, then the
589
+ * workspace's `settings.json`, then `settings.local.json`; a manifest's
590
+ * `defaultEnabled` decides an unlisted plugin). A `managed` or `user` install
591
+ * is a user root; a `project` or `local` install counts only when the
592
+ * workspace contains it, and is then a project root. An install whose
593
+ * directory is gone is read from the plugin's cache directory. Plugins
594
+ * dropped into the project and user `skills` directories follow. Each
595
+ * plugin's roots come from `experimental_resolveVendorPluginRoots`
596
+ * (`claude` layout), prefixed `<plugin>:`.
597
+ */
598
+ declare function experimental_resolveClaudePluginRoots(args: ExperimentalClaudePluginRootsArgs): Promise<ExperimentalClaudePluginRoots>;
599
+
600
+ export { experimental_defineHostEntry, experimental_filterResolvedNativeRoots, experimental_nativeRootsHostContract, experimental_nativeRootsResolveInputSchema, experimental_nativeRootsResolveOutputSchema, experimental_resolveClaudePluginRoots, experimental_resolveVendorPluginRoots };
601
+ export type { ExperimentalClaudePluginRoots, ExperimentalClaudePluginRootsArgs, ExperimentalDroppedNativeRoot, ExperimentalFilteredNativeRoots, ExperimentalHostEntry, ExperimentalHostPaths, ExperimentalHostRpcContext, ExperimentalHostRpcHandlers, ExperimentalHostSignalContract, ExperimentalHostSignals, ExperimentalHostWatchChange, ExperimentalHostWatchChangeType, ExperimentalHostWatchEvent, ExperimentalHostWatchListener, ExperimentalHostWatchOptions, ExperimentalHostWatchSubscription, ExperimentalHostWorkerLease, ExperimentalNativeRootsHostContract, ExperimentalNativeRootsResolveAnswer, ExperimentalNativeRootsResolveInput, ExperimentalNativeRootsResolveOutput, ExperimentalVendorPlugin, ExperimentalVendorPluginRoots, ExperimentalVendorPluginRootsArgs };
@@ -21,6 +21,15 @@ declare function requireSlotId(kind: string, value: unknown): string;
21
21
  * provider the host knows (`codex`, `acp-cursor`), not a per-plugin slot.
22
22
  */
23
23
  declare function requireProviderId(kind: string, value: unknown): string;
24
+ /**
25
+ * A timeline renderer kind: `"tool"` (the plugin's providers' generic tool
26
+ * items) or a namespaced extension kind `"<pluginId>/<name>"` (lowercase
27
+ * letters, digits and `-` on both sides, the grammar of
28
+ * `extensionKindSchema`). Ownership of the namespace is enforced by the host
29
+ * against the loading plugin's id, which the collector does not know.
30
+ */
31
+ declare const PLUGIN_TIMELINE_RENDERER_KIND_PATTERN: RegExp;
32
+ declare function requireTimelineRendererKind(kind: string, value: unknown): string;
24
33
  declare function requireMessageDirectiveId(kind: string, value: unknown): string;
25
34
  declare function requireNonEmptyString(kind: string, field: string, value: unknown): string;
26
35
  declare function requireOptionalString(kind: string, field: string, value: unknown): string | undefined;
@@ -32,4 +41,4 @@ declare function requireUniqueId(kind: string, seen: Set<string>, id: string): v
32
41
  */
33
42
  declare function collectComposerCustomization(registration: unknown, seenIds: Set<string>, onRejected: RejectionReporter): ComposerCustomization | null;
34
43
 
35
- export { PLUGIN_SLOT_ID_PATTERN, collectComposerCustomization, normalizePluginThreadRowStatus, requireComponent, requireMessageDirectiveId, requireNonEmptyString, requireOptionalString, requireProviderId, requireSlotId, requireUniqueId };
44
+ export { PLUGIN_SLOT_ID_PATTERN, PLUGIN_TIMELINE_RENDERER_KIND_PATTERN, collectComposerCustomization, normalizePluginThreadRowStatus, requireComponent, requireMessageDirectiveId, requireNonEmptyString, requireOptionalString, requireProviderId, requireSlotId, requireTimelineRendererKind, requireUniqueId };