@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.
- package/README.md +3 -3
- package/bundled-types/bb-plugin-sdk-ai-services.d.ts +141 -0
- package/bundled-types/bb-plugin-sdk-app.d.ts +144 -21
- package/bundled-types/bb-plugin-sdk-host.d.ts +479 -2
- package/bundled-types/bb-plugin-sdk-internal-composer-customization-validation.d.ts +10 -1
- package/bundled-types/bb-plugin-sdk-internal-host-policy.d.ts +339 -32
- package/bundled-types/bb-plugin-sdk-internal-plugin-app-collector.d.ts +2 -1
- package/bundled-types/bb-plugin-sdk-provider-bridge-acp.d.ts +824 -0
- package/bundled-types/bb-plugin-sdk-provider-bridge-testing.d.ts +1742 -211
- package/bundled-types/bb-plugin-sdk-provider-bridge.d.ts +2985 -2442
- package/bundled-types/bb-plugin-sdk-testing-app.d.ts +4 -3
- package/bundled-types/bb-plugin-sdk-testing.d.ts +551 -9
- package/bundled-types/bb-plugin-sdk.d.ts +1337 -1349
- package/dist/ai-services.js +91 -0
- package/dist/app.js +2 -2
- package/dist/host.js +14547 -1
- package/dist/internal/composer-customization-validation.js +11 -0
- package/dist/internal/host-policy.js +656 -91
- package/dist/internal/plugin-app-collector.js +58 -14
- package/dist/provider-bridge-acp.js +9940 -0
- package/dist/provider-bridge-testing.js +2979 -1395
- package/dist/provider-bridge-worker-entry.mjs +917 -0
- package/dist/provider-bridge.js +2255 -3718
- package/dist/replay-provider-child.mjs +650 -0
- package/dist/testing/app.js +63 -19
- package/dist/testing/index.js +803 -115
- package/package.json +14 -1
|
@@ -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
|
-
|
|
124
|
-
|
|
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 };
|