@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
package/README.md
CHANGED
|
@@ -21,9 +21,9 @@ Any mounted plugin component can use
|
|
|
21
21
|
same plugin's registered thread-panel actions; it returns false when the
|
|
22
22
|
current surface has no thread side panel.
|
|
23
23
|
|
|
24
|
-
Use `
|
|
24
|
+
Use `UrlLink` for a real anchor that applies BB's current
|
|
25
25
|
in-app/external-browser preference on ordinary HTTP(S) activation, or
|
|
26
|
-
`useBbNavigate().
|
|
26
|
+
`useBbNavigate().openUrl(url)` for a button or menu. Internal app
|
|
27
27
|
routes, modifier clicks, explicit anchor targets, and unsupported schemes stay
|
|
28
28
|
browser-owned. A `_blank` or named target preserves supplied `rel` tokens but
|
|
29
29
|
adds `noopener noreferrer` unless `rel` explicitly contains `opener`, so a
|
|
@@ -44,7 +44,7 @@ the current host accepted the intent. Targets never infer an ambient workspace.
|
|
|
44
44
|
The frontend harness records both methods and accepts `openFilePreview` and
|
|
45
45
|
`openFileExternally` behavior options.
|
|
46
46
|
|
|
47
|
-
A nav panel's `
|
|
47
|
+
A nav panel's `fixedTabs` entries must include the containing nav
|
|
48
48
|
panel's `id` as `panelId`; each entry is also a stable reference to that
|
|
49
49
|
plugin's own tab. Give a targeted tab an `experimental_target.validate` type guard, call
|
|
50
50
|
`experimental_useAppPanel().openFixedTab({ surface: { kind:
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// Portable type declarations for `@get-bb/plugin-sdk`. Unpublished BB
|
|
2
|
+
// workspace contracts are flattened; public subpaths may reuse the
|
|
3
|
+
// package root without requiring any other @bb/* package.
|
|
4
|
+
//
|
|
5
|
+
// Confused by the API, or need a symbol that isn't here? Clone the BB repo
|
|
6
|
+
// and read the real source: https://github.com/get-bb/bb
|
|
7
|
+
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
|
|
10
|
+
interface JsonObject {
|
|
11
|
+
[key: string]: JsonValue;
|
|
12
|
+
}
|
|
13
|
+
type JsonValue = string | number | boolean | null | JsonValue[] | JsonObject;
|
|
14
|
+
|
|
15
|
+
/** Why a call did not produce a result; core's retry policy keys on it. */
|
|
16
|
+
declare const experimental_aiServiceErrorCodeSchema: z.ZodEnum<{
|
|
17
|
+
auth_required: "auth_required";
|
|
18
|
+
invalid_response: "invalid_response";
|
|
19
|
+
rate_limited: "rate_limited";
|
|
20
|
+
request_failed: "request_failed";
|
|
21
|
+
service_unavailable: "service_unavailable";
|
|
22
|
+
timeout: "timeout";
|
|
23
|
+
}>;
|
|
24
|
+
type ExperimentalAiServiceErrorCode = z.infer<typeof experimental_aiServiceErrorCodeSchema>;
|
|
25
|
+
declare const experimental_aiInferenceCompleteInputSchema: z.ZodObject<{
|
|
26
|
+
model: z.ZodString;
|
|
27
|
+
outputSchema: z.ZodType<JsonObject, unknown, z.core.$ZodTypeInternals<JsonObject, unknown>>;
|
|
28
|
+
prompt: z.ZodString;
|
|
29
|
+
reasoningEffort: z.ZodLiteral<"none">;
|
|
30
|
+
serviceId: z.ZodString;
|
|
31
|
+
timeoutMs: z.ZodNumber;
|
|
32
|
+
}, z.core.$strict>;
|
|
33
|
+
type ExperimentalAiInferenceCompleteInput = z.infer<typeof experimental_aiInferenceCompleteInputSchema>;
|
|
34
|
+
declare const experimental_aiInferenceCompleteOutputSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
35
|
+
model: z.ZodString;
|
|
36
|
+
ok: z.ZodLiteral<true>;
|
|
37
|
+
value: z.ZodType<JsonObject, unknown, z.core.$ZodTypeInternals<JsonObject, unknown>>;
|
|
38
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
39
|
+
code: z.ZodEnum<{
|
|
40
|
+
auth_required: "auth_required";
|
|
41
|
+
invalid_response: "invalid_response";
|
|
42
|
+
rate_limited: "rate_limited";
|
|
43
|
+
request_failed: "request_failed";
|
|
44
|
+
service_unavailable: "service_unavailable";
|
|
45
|
+
timeout: "timeout";
|
|
46
|
+
}>;
|
|
47
|
+
message: z.ZodString;
|
|
48
|
+
ok: z.ZodLiteral<false>;
|
|
49
|
+
}, z.core.$strict>]>;
|
|
50
|
+
type ExperimentalAiInferenceCompleteOutput = z.infer<typeof experimental_aiInferenceCompleteOutputSchema>;
|
|
51
|
+
declare const experimental_aiVoiceTranscribeInputSchema: z.ZodObject<{
|
|
52
|
+
audioBase64: z.ZodString;
|
|
53
|
+
filename: z.ZodString;
|
|
54
|
+
mimeType: z.ZodString;
|
|
55
|
+
model: z.ZodString;
|
|
56
|
+
prompt: z.ZodNullable<z.ZodString>;
|
|
57
|
+
serviceId: z.ZodString;
|
|
58
|
+
timeoutMs: z.ZodNumber;
|
|
59
|
+
}, z.core.$strict>;
|
|
60
|
+
type ExperimentalAiVoiceTranscribeInput = z.infer<typeof experimental_aiVoiceTranscribeInputSchema>;
|
|
61
|
+
declare const experimental_aiVoiceTranscribeOutputSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
62
|
+
model: z.ZodString;
|
|
63
|
+
ok: z.ZodLiteral<true>;
|
|
64
|
+
text: z.ZodString;
|
|
65
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
66
|
+
code: z.ZodEnum<{
|
|
67
|
+
auth_required: "auth_required";
|
|
68
|
+
invalid_response: "invalid_response";
|
|
69
|
+
rate_limited: "rate_limited";
|
|
70
|
+
request_failed: "request_failed";
|
|
71
|
+
service_unavailable: "service_unavailable";
|
|
72
|
+
timeout: "timeout";
|
|
73
|
+
}>;
|
|
74
|
+
message: z.ZodString;
|
|
75
|
+
ok: z.ZodLiteral<false>;
|
|
76
|
+
}, z.core.$strict>]>;
|
|
77
|
+
type ExperimentalAiVoiceTranscribeOutput = z.infer<typeof experimental_aiVoiceTranscribeOutputSchema>;
|
|
78
|
+
/**
|
|
79
|
+
* The host RPC methods an AI-service plugin implements. A plugin that
|
|
80
|
+
* registers only `inference` still builds against the full contract; the
|
|
81
|
+
* unregistered method may answer `{ ok: false, code: "request_failed" }`.
|
|
82
|
+
*/
|
|
83
|
+
declare const experimental_aiServicesHostContract: {
|
|
84
|
+
readonly "ai.inference.complete": {
|
|
85
|
+
readonly input: z.ZodObject<{
|
|
86
|
+
model: z.ZodString;
|
|
87
|
+
outputSchema: z.ZodType<JsonObject, unknown, z.core.$ZodTypeInternals<JsonObject, unknown>>;
|
|
88
|
+
prompt: z.ZodString;
|
|
89
|
+
reasoningEffort: z.ZodLiteral<"none">;
|
|
90
|
+
serviceId: z.ZodString;
|
|
91
|
+
timeoutMs: z.ZodNumber;
|
|
92
|
+
}, z.core.$strict>;
|
|
93
|
+
readonly output: z.ZodUnion<readonly [z.ZodObject<{
|
|
94
|
+
model: z.ZodString;
|
|
95
|
+
ok: z.ZodLiteral<true>;
|
|
96
|
+
value: z.ZodType<JsonObject, unknown, z.core.$ZodTypeInternals<JsonObject, unknown>>;
|
|
97
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
98
|
+
code: z.ZodEnum<{
|
|
99
|
+
auth_required: "auth_required";
|
|
100
|
+
invalid_response: "invalid_response";
|
|
101
|
+
rate_limited: "rate_limited";
|
|
102
|
+
request_failed: "request_failed";
|
|
103
|
+
service_unavailable: "service_unavailable";
|
|
104
|
+
timeout: "timeout";
|
|
105
|
+
}>;
|
|
106
|
+
message: z.ZodString;
|
|
107
|
+
ok: z.ZodLiteral<false>;
|
|
108
|
+
}, z.core.$strict>]>;
|
|
109
|
+
};
|
|
110
|
+
readonly "ai.voice.transcribe": {
|
|
111
|
+
readonly input: z.ZodObject<{
|
|
112
|
+
audioBase64: z.ZodString;
|
|
113
|
+
filename: z.ZodString;
|
|
114
|
+
mimeType: z.ZodString;
|
|
115
|
+
model: z.ZodString;
|
|
116
|
+
prompt: z.ZodNullable<z.ZodString>;
|
|
117
|
+
serviceId: z.ZodString;
|
|
118
|
+
timeoutMs: z.ZodNumber;
|
|
119
|
+
}, z.core.$strict>;
|
|
120
|
+
readonly output: z.ZodUnion<readonly [z.ZodObject<{
|
|
121
|
+
model: z.ZodString;
|
|
122
|
+
ok: z.ZodLiteral<true>;
|
|
123
|
+
text: z.ZodString;
|
|
124
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
125
|
+
code: z.ZodEnum<{
|
|
126
|
+
auth_required: "auth_required";
|
|
127
|
+
invalid_response: "invalid_response";
|
|
128
|
+
rate_limited: "rate_limited";
|
|
129
|
+
request_failed: "request_failed";
|
|
130
|
+
service_unavailable: "service_unavailable";
|
|
131
|
+
timeout: "timeout";
|
|
132
|
+
}>;
|
|
133
|
+
message: z.ZodString;
|
|
134
|
+
ok: z.ZodLiteral<false>;
|
|
135
|
+
}, z.core.$strict>]>;
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
type ExperimentalAiServicesHostContract = typeof experimental_aiServicesHostContract;
|
|
139
|
+
|
|
140
|
+
export { experimental_aiInferenceCompleteInputSchema, experimental_aiInferenceCompleteOutputSchema, experimental_aiServiceErrorCodeSchema, experimental_aiServicesHostContract, experimental_aiVoiceTranscribeInputSchema, experimental_aiVoiceTranscribeOutputSchema };
|
|
141
|
+
export type { ExperimentalAiInferenceCompleteInput, ExperimentalAiInferenceCompleteOutput, ExperimentalAiServiceErrorCode, ExperimentalAiServicesHostContract, ExperimentalAiVoiceTranscribeInput, ExperimentalAiVoiceTranscribeOutput };
|
|
@@ -184,6 +184,10 @@ type PromptInput = z.infer<typeof promptInputSchema>;
|
|
|
184
184
|
declare const providerInfoSchema: z.ZodObject<{
|
|
185
185
|
available: z.ZodBoolean;
|
|
186
186
|
capabilities: z.ZodObject<{
|
|
187
|
+
modelCatalogScope: z.ZodEnum<{
|
|
188
|
+
host: "host";
|
|
189
|
+
workspace: "workspace";
|
|
190
|
+
}>;
|
|
187
191
|
permissionModes: z.ZodArray<z.ZodEnum<{
|
|
188
192
|
"accept-edits": "accept-edits";
|
|
189
193
|
auto: "auto";
|
|
@@ -221,16 +225,22 @@ declare const providerInfoSchema: z.ZodObject<{
|
|
|
221
225
|
kind: z.ZodLiteral<"goal">;
|
|
222
226
|
}, z.core.$strip>], "kind">>;
|
|
223
227
|
displayName: z.ZodString;
|
|
224
|
-
experimental_providerHealth: z.ZodBoolean;
|
|
225
|
-
experimental_providerInstallation: z.ZodBoolean;
|
|
226
|
-
experimental_providerUsage: z.ZodBoolean;
|
|
227
228
|
extensionKinds: z.ZodOptional<z.ZodRecord<z.ZodString & z.ZodType<`${string}/${string}`, string, z.core.$ZodTypeInternals<`${string}/${string}`, string>>, z.ZodObject<{
|
|
228
229
|
item: z.ZodBoolean;
|
|
229
230
|
state: z.ZodBoolean;
|
|
230
231
|
}, z.core.$strip>>>;
|
|
231
232
|
family: z.ZodOptional<z.ZodString>;
|
|
233
|
+
icon: z.ZodOptional<z.ZodObject<{
|
|
234
|
+
glyph: z.ZodString;
|
|
235
|
+
}, z.core.$strip>>;
|
|
232
236
|
id: z.ZodString;
|
|
233
237
|
logoUrl: z.ZodNullable<z.ZodString>;
|
|
238
|
+
maintenance: z.ZodObject<{
|
|
239
|
+
health: z.ZodBoolean;
|
|
240
|
+
installation: z.ZodBoolean;
|
|
241
|
+
usage: z.ZodBoolean;
|
|
242
|
+
}, z.core.$strip>;
|
|
243
|
+
pluginId: z.ZodString;
|
|
234
244
|
reasoningLevels: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
235
245
|
description: z.ZodOptional<z.ZodString>;
|
|
236
246
|
id: z.ZodString;
|
|
@@ -417,7 +427,9 @@ interface PluginThreadListProps {
|
|
|
417
427
|
*
|
|
418
428
|
* @experimental Audit before relying on this as a stable contract.
|
|
419
429
|
*/
|
|
420
|
-
|
|
430
|
+
Original: ComponentType;
|
|
431
|
+
/** @deprecated Renamed to `Original` in SDK 0.4.16; removed in bb 0.42. */
|
|
432
|
+
experimental_Original?: ComponentType;
|
|
421
433
|
}
|
|
422
434
|
/**
|
|
423
435
|
* Props passed to an `experimental_threadHeaderAction` component, rendered in
|
|
@@ -468,7 +480,9 @@ interface PluginFileOpenerProps {
|
|
|
468
480
|
*
|
|
469
481
|
* @experimental Audit before relying on this as a stable contract.
|
|
470
482
|
*/
|
|
471
|
-
|
|
483
|
+
Original: ComponentType;
|
|
484
|
+
/** @deprecated Renamed to `Original` in SDK 0.4.16; removed in bb 0.42. */
|
|
485
|
+
experimental_Original?: ComponentType;
|
|
472
486
|
}
|
|
473
487
|
/** How a code line longer than the viewport is presented. */
|
|
474
488
|
type CodeOverflowMode = "scroll" | "wrap";
|
|
@@ -559,7 +573,9 @@ interface PluginSourceCodeRendererProps {
|
|
|
559
573
|
*
|
|
560
574
|
* @experimental Audit before relying on this as a stable contract.
|
|
561
575
|
*/
|
|
562
|
-
|
|
576
|
+
Original: ComponentType;
|
|
577
|
+
/** @deprecated Renamed to `Original` in SDK 0.4.16; removed in bb 0.42. */
|
|
578
|
+
experimental_Original?: ComponentType;
|
|
563
579
|
}
|
|
564
580
|
/**
|
|
565
581
|
* Props passed to an `experimental_diffRenderer` component. `patch` is always
|
|
@@ -586,7 +602,9 @@ interface PluginDiffRendererProps {
|
|
|
586
602
|
*
|
|
587
603
|
* @experimental Audit before relying on this as a stable contract.
|
|
588
604
|
*/
|
|
589
|
-
|
|
605
|
+
Original: ComponentType;
|
|
606
|
+
/** @deprecated Renamed to `Original` in SDK 0.4.16; removed in bb 0.42. */
|
|
607
|
+
experimental_Original?: ComponentType;
|
|
590
608
|
}
|
|
591
609
|
/**
|
|
592
610
|
* Message context passed to a `messageDirective` component — the assistant
|
|
@@ -660,7 +678,7 @@ type ExperimentalPluginFixedTabReference<Target extends JsonValue = never> = {
|
|
|
660
678
|
readonly experimental_target: ExperimentalFixedTabTargetContract<Target>;
|
|
661
679
|
});
|
|
662
680
|
/** A fixed tab declared by a plugin nav panel. */
|
|
663
|
-
type
|
|
681
|
+
type PluginFixedTabRegistration<Target extends JsonValue = never> = ExperimentalPluginFixedTabReference<Target> & {
|
|
664
682
|
title: string;
|
|
665
683
|
/** Icon hint (BB icon name); unknown names fall back to a generic icon. */
|
|
666
684
|
icon: string;
|
|
@@ -669,7 +687,7 @@ type ExperimentalPluginFixedTabRegistration<Target extends JsonValue = never> =
|
|
|
669
687
|
layout?: "flush" | "padded";
|
|
670
688
|
};
|
|
671
689
|
/** A fixed tab with either no target or an owner-validated JSON target. */
|
|
672
|
-
type
|
|
690
|
+
type PluginFixedTabDeclaration = PluginFixedTabRegistration | PluginFixedTabRegistration<JsonValue>;
|
|
673
691
|
interface PluginNavPanelRegistration {
|
|
674
692
|
/** Unique within the plugin; letters, digits, `-`, `_`. */
|
|
675
693
|
id: string;
|
|
@@ -689,7 +707,7 @@ interface PluginNavPanelRegistration {
|
|
|
689
707
|
*
|
|
690
708
|
* Experimental: see docs/api_to_audit.md.
|
|
691
709
|
*/
|
|
692
|
-
|
|
710
|
+
fixedTabs?: readonly PluginFixedTabDeclaration[];
|
|
693
711
|
/**
|
|
694
712
|
* Optional presentational component rendered at the trailing edge of this
|
|
695
713
|
* panel's sidebar row. It receives no props so it can own a narrow live
|
|
@@ -811,7 +829,17 @@ interface PluginNewThreadPanelActionRegistration {
|
|
|
811
829
|
run?(context: PluginNewThreadPanelActionContext): void | Promise<void>;
|
|
812
830
|
}
|
|
813
831
|
interface PluginPendingInteractionRegistration {
|
|
814
|
-
/**
|
|
832
|
+
/**
|
|
833
|
+
* The renderer's plugin-local name. Two addresses resolve to it: the
|
|
834
|
+
* `rendererId` a backend passes to `bb.ui.requestInput`, and the `<name>`
|
|
835
|
+
* half of a provider bridge's `interaction/request` kind
|
|
836
|
+
* `"<pluginId>/<name>"` (docs/provider-plugin-api.md §4), which the client
|
|
837
|
+
* splits on the slash to find this registration under its plugin.
|
|
838
|
+
* `bb.ui.requestInput` validates `rendererId` against `/^[a-zA-Z0-9_-]+$/`;
|
|
839
|
+
* an extension kind must match `/^[a-z0-9-]+\/[a-z0-9-]+$/`
|
|
840
|
+
* (`EXTENSION_KIND_PATTERN` in @bb/domain), so an id addressable both ways
|
|
841
|
+
* uses lowercase letters, digits, and "-" only.
|
|
842
|
+
*/
|
|
815
843
|
id: string;
|
|
816
844
|
component: ComponentType<PluginPendingInteractionProps>;
|
|
817
845
|
}
|
|
@@ -1083,7 +1111,7 @@ interface PluginSidebarThreadSplit {
|
|
|
1083
1111
|
* enabled. If multiple plugins register one, the first in deterministic slot
|
|
1084
1112
|
* order is active by default; removing it reveals the next. The user can pin
|
|
1085
1113
|
* BB's list or a specific provider under Settings → Appearance. A plugin can
|
|
1086
|
-
* also use its own setting and render `
|
|
1114
|
+
* also use its own setting and render `Original` conditionally.
|
|
1087
1115
|
* An absent or crashing replacement falls back to BB's list rather than
|
|
1088
1116
|
* leaving the user with no sidebar.
|
|
1089
1117
|
*
|
|
@@ -1107,7 +1135,7 @@ interface PluginThreadListRegistration {
|
|
|
1107
1135
|
* order. The user can pin BB's preview or a specific opener per extension
|
|
1108
1136
|
* under Settings → Files. The file tab's "Open with" menu can override that
|
|
1109
1137
|
* choice for one open. A plugin can also use its own setting and render
|
|
1110
|
-
* `
|
|
1138
|
+
* `Original` conditionally. Applies to working-tree, host, and
|
|
1111
1139
|
* thread-storage files — never to git-ref snapshots (diff views always use
|
|
1112
1140
|
* BB's preview).
|
|
1113
1141
|
*/
|
|
@@ -1127,7 +1155,7 @@ interface PluginFileOpenerRegistration {
|
|
|
1127
1155
|
* **exclusive**: one renderer at a time. Registering activates it while the
|
|
1128
1156
|
* plugin is enabled; if several are registered the first in deterministic slot
|
|
1129
1157
|
* order wins. A missing, disabled, or crashing replacement falls back to BB's
|
|
1130
|
-
* renderer, and a replacement can render `
|
|
1158
|
+
* renderer, and a replacement can render `Original` to delegate
|
|
1131
1159
|
* per call (behind its own setting, by language, by size — whatever it needs).
|
|
1132
1160
|
*/
|
|
1133
1161
|
interface PluginSourceCodeRendererRegistration {
|
|
@@ -1143,7 +1171,7 @@ interface PluginSourceCodeRendererRegistration {
|
|
|
1143
1171
|
* Replace BB's diff renderer everywhere it renders supplied diff content — the
|
|
1144
1172
|
* timeline file diffs, the environment diff panel's text bodies, and every
|
|
1145
1173
|
* plugin that calls `experimental_Diff`. Exclusive, with the same activation,
|
|
1146
|
-
* fallback, and `
|
|
1174
|
+
* fallback, and `Original` delegation rules as
|
|
1147
1175
|
* {@link PluginSourceCodeRendererRegistration}.
|
|
1148
1176
|
*/
|
|
1149
1177
|
interface PluginDiffRendererRegistration {
|
|
@@ -1297,6 +1325,94 @@ interface PluginProviderIconRegistration {
|
|
|
1297
1325
|
className?: string;
|
|
1298
1326
|
}>;
|
|
1299
1327
|
}
|
|
1328
|
+
/**
|
|
1329
|
+
* The declarative presentation persisted with a timeline item (docs/
|
|
1330
|
+
* provider-plugin-api.md §3): what every client renders when no plugin code
|
|
1331
|
+
* is present. A renderer receives it so it can reuse the bridge's label,
|
|
1332
|
+
* glyph and tint instead of re-deriving them from the payload.
|
|
1333
|
+
*/
|
|
1334
|
+
interface PluginTimelineRowPresentation {
|
|
1335
|
+
label: {
|
|
1336
|
+
pending: string;
|
|
1337
|
+
completed: string;
|
|
1338
|
+
};
|
|
1339
|
+
icon: {
|
|
1340
|
+
glyph: string;
|
|
1341
|
+
};
|
|
1342
|
+
title?: string;
|
|
1343
|
+
/** Short Markdown, length-capped at ingest. */
|
|
1344
|
+
detail?: string;
|
|
1345
|
+
suppress?: boolean;
|
|
1346
|
+
tint?: {
|
|
1347
|
+
light: string;
|
|
1348
|
+
dark: string;
|
|
1349
|
+
};
|
|
1350
|
+
}
|
|
1351
|
+
type PluginTimelineRowStatus = "completed" | "error" | "interrupted" | "pending";
|
|
1352
|
+
/** The projected row a `experimental_timelineRenderer` component receives. */
|
|
1353
|
+
interface PluginTimelineRendererRow {
|
|
1354
|
+
id: string;
|
|
1355
|
+
threadId: string;
|
|
1356
|
+
turnId: string | null;
|
|
1357
|
+
/**
|
|
1358
|
+
* The item kind the renderer registered for: this plugin's extension kind
|
|
1359
|
+
* (`"<pluginId>/<name>"`) or `"tool"` for a generic tool item.
|
|
1360
|
+
*/
|
|
1361
|
+
kind: string;
|
|
1362
|
+
/** The tool name for a `"tool"` row; null for an extension row. */
|
|
1363
|
+
toolName: string | null;
|
|
1364
|
+
status: PluginTimelineRowStatus;
|
|
1365
|
+
startedAt: number;
|
|
1366
|
+
completedAt: number | null;
|
|
1367
|
+
}
|
|
1368
|
+
interface PluginTimelineRendererProps {
|
|
1369
|
+
row: PluginTimelineRendererRow;
|
|
1370
|
+
/**
|
|
1371
|
+
* The item's data: an extension item's payload (validated against the
|
|
1372
|
+
* plugin's declared schema at ingest), or for a `"tool"` row the call's
|
|
1373
|
+
* `{ arguments, output }`.
|
|
1374
|
+
*/
|
|
1375
|
+
payload: JsonValue;
|
|
1376
|
+
/**
|
|
1377
|
+
* The bridge's presentation for the row. Null only for a generic tool row
|
|
1378
|
+
* persisted before bridges attached presentation (grammar v2); an
|
|
1379
|
+
* extension row always has one.
|
|
1380
|
+
*/
|
|
1381
|
+
presentation: PluginTimelineRowPresentation | null;
|
|
1382
|
+
/** The thread the row belongs to. */
|
|
1383
|
+
thread: {
|
|
1384
|
+
id: string;
|
|
1385
|
+
providerId: string | null;
|
|
1386
|
+
};
|
|
1387
|
+
/**
|
|
1388
|
+
* The host's declarative base for this row's body (the presentation's
|
|
1389
|
+
* `detail`, or the tool call's arguments and output). Render it to keep
|
|
1390
|
+
* the default body beside the plugin's own content.
|
|
1391
|
+
*/
|
|
1392
|
+
Original: ComponentType<Record<never, never>>;
|
|
1393
|
+
}
|
|
1394
|
+
/**
|
|
1395
|
+
* Render the expanded body of the timeline rows this plugin owns: its own
|
|
1396
|
+
* extension item kinds (`"<pluginId>/<name>"`, where `<pluginId>` is this
|
|
1397
|
+
* plugin), and `"tool"` for the generic tool items of the providers this
|
|
1398
|
+
* plugin registered. Core kinds (message, command, fileChange, fileRead,
|
|
1399
|
+
* search, delegation, planSteps, …) always use the core renderers and are
|
|
1400
|
+
* customized through the bridge's presentation alone.
|
|
1401
|
+
*
|
|
1402
|
+
* The row's header — the bridge's label, glyph, tint and headline — stays
|
|
1403
|
+
* host-rendered so the timeline reads uniformly; the component owns the
|
|
1404
|
+
* body. When no renderer is registered for a kind (the plugin is not loaded,
|
|
1405
|
+
* uninstalled, or never shipped an app bundle) the declarative base renders
|
|
1406
|
+
* instead, so a row never goes blank. Crashes are contained per row.
|
|
1407
|
+
*/
|
|
1408
|
+
interface PluginTimelineRendererRegistration {
|
|
1409
|
+
/**
|
|
1410
|
+
* `"<pluginId>/<name>"` for one of this plugin's extension kinds, or
|
|
1411
|
+
* `"tool"` for the generic tool items of this plugin's providers.
|
|
1412
|
+
*/
|
|
1413
|
+
kind: string;
|
|
1414
|
+
component: ComponentType<PluginTimelineRendererProps>;
|
|
1415
|
+
}
|
|
1300
1416
|
interface PluginAppSlots {
|
|
1301
1417
|
homepageSection(registration: PluginHomepageSectionRegistration): void;
|
|
1302
1418
|
settingsSection(registration: PluginSettingsSectionRegistration): void;
|
|
@@ -1353,6 +1469,13 @@ interface PluginAppSlots {
|
|
|
1353
1469
|
* docs/api_to_audit.md.
|
|
1354
1470
|
*/
|
|
1355
1471
|
experimental_providerIcon(registration: PluginProviderIconRegistration): void;
|
|
1472
|
+
/**
|
|
1473
|
+
* Render the body of this plugin's own timeline rows: its extension kinds
|
|
1474
|
+
* and its providers' generic tool items (see
|
|
1475
|
+
* {@link PluginTimelineRendererRegistration}). Experimental: see
|
|
1476
|
+
* docs/api_to_audit.md.
|
|
1477
|
+
*/
|
|
1478
|
+
experimental_timelineRenderer(registration: PluginTimelineRendererRegistration): void;
|
|
1356
1479
|
}
|
|
1357
1480
|
interface PluginAppComposer {
|
|
1358
1481
|
customize(registration: ComposerCustomization): void;
|
|
@@ -1881,7 +2004,7 @@ interface MarkdownProps {
|
|
|
1881
2004
|
* supplied `rel` tokens and receive safe defaults unless `opener` is explicit.
|
|
1882
2005
|
* Experimental: see docs/api_to_audit.md.
|
|
1883
2006
|
*/
|
|
1884
|
-
interface
|
|
2007
|
+
interface UrlLinkProps extends Omit<ComponentPropsWithoutRef<"a">, "href"> {
|
|
1885
2008
|
href: string;
|
|
1886
2009
|
}
|
|
1887
2010
|
/** A live file whose identity is complete without ambient route context. */
|
|
@@ -1985,7 +2108,7 @@ interface BbNavigate {
|
|
|
1985
2108
|
* false for schemes the host does not own. Experimental: see
|
|
1986
2109
|
* docs/api_to_audit.md.
|
|
1987
2110
|
*/
|
|
1988
|
-
|
|
2111
|
+
openUrl(url: string): boolean;
|
|
1989
2112
|
/** Open a live file in this surface's shared BB preview panel. */
|
|
1990
2113
|
experimental_openFilePreview(options: ExperimentalFileOpenOptions): boolean;
|
|
1991
2114
|
/** Open a live file in this client's preferred external file target. */
|
|
@@ -2075,7 +2198,7 @@ interface PluginSdkApp {
|
|
|
2075
2198
|
* A real anchor whose ordinary HTTP(S) activation uses BB's URL preference.
|
|
2076
2199
|
* Experimental: see docs/api_to_audit.md.
|
|
2077
2200
|
*/
|
|
2078
|
-
|
|
2201
|
+
UrlLink: ComponentType<UrlLinkProps>;
|
|
2079
2202
|
/** Host-rendered live-file link backed by the shared navigation controller. */
|
|
2080
2203
|
experimental_FileLink: ComponentType<ExperimentalFileLinkProps>;
|
|
2081
2204
|
/**
|
|
@@ -2120,7 +2243,7 @@ declare const definePluginApp: (setup: PluginAppSetup) => PluginAppDefinition;
|
|
|
2120
2243
|
declare const ThreadChat: react.ComponentType<ThreadChatProps>;
|
|
2121
2244
|
declare const Markdown: react.ComponentType<MarkdownProps>;
|
|
2122
2245
|
declare const experimental_FileLink: react.ComponentType<ExperimentalFileLinkProps>;
|
|
2123
|
-
declare const
|
|
2246
|
+
declare const UrlLink: react.ComponentType<UrlLinkProps>;
|
|
2124
2247
|
declare const experimental_NewThreadComposer: react.ComponentType<NewThreadComposerProps>;
|
|
2125
2248
|
declare const experimental_ProviderModelPicker: react.ComponentType<ExperimentalProviderModelPickerProps>;
|
|
2126
2249
|
declare const experimental_PermissionModePicker: react.ComponentType<ExperimentalPermissionModePickerProps>;
|
|
@@ -2142,5 +2265,5 @@ declare const experimental_useSidebarThreadPullRequest: (threadId: string) => Pl
|
|
|
2142
2265
|
declare const experimental_useSidebarThreadSplit: (threadId: string) => PluginSidebarThreadSplit;
|
|
2143
2266
|
declare const experimental_useProviders: () => PluginProvidersState;
|
|
2144
2267
|
|
|
2145
|
-
export { Markdown, ThreadChat, definePluginApp, experimental_Diff, experimental_FileLink, experimental_NewThreadComposer, experimental_PermissionModePicker, experimental_ProviderModelPicker, experimental_SourceCode,
|
|
2146
|
-
export type { BbContext, BbNavigate, CodeOverflowMode, ComposerCustomization, ComposerPlusMenuItem, ComposerRichTextSpec, ComposerStructuredDraft, ComposerView, DiffProps, DiffViewMode, ExperimentalAppPanel, ExperimentalAppPanelSurface, ExperimentalDiffFileContent, ExperimentalDiffFullFileContents, ExperimentalFileLinkProps, ExperimentalFileLocation, ExperimentalFileOpenOptions, ExperimentalFixedTabTargetContract, ExperimentalFixedTabTargetState, ExperimentalLiveFileTarget, ExperimentalOpenFixedTabOptions, ExperimentalPermissionModePickerProps,
|
|
2268
|
+
export { Markdown, ThreadChat, UrlLink, definePluginApp, experimental_Diff, experimental_FileLink, experimental_NewThreadComposer, experimental_PermissionModePicker, experimental_ProviderModelPicker, experimental_SourceCode, experimental_useAppPanel, experimental_useFixedTabTarget, experimental_useProviders, experimental_useSidebarThreadActions, experimental_useSidebarThreadPullRequest, experimental_useSidebarThreadSplit, experimental_useSidebarThreads, useBbContext, useBbNavigate, useComposer, useComposerView, useRealtime, useRealtimeConnectionState, useRpc, useSettings };
|
|
2269
|
+
export type { BbContext, BbNavigate, CodeOverflowMode, ComposerCustomization, ComposerPlusMenuItem, ComposerRichTextSpec, ComposerStructuredDraft, ComposerView, DiffProps, DiffViewMode, ExperimentalAppPanel, ExperimentalAppPanelSurface, ExperimentalDiffFileContent, ExperimentalDiffFullFileContents, ExperimentalFileLinkProps, ExperimentalFileLocation, ExperimentalFileOpenOptions, ExperimentalFixedTabTargetContract, ExperimentalFixedTabTargetState, ExperimentalLiveFileTarget, ExperimentalOpenFixedTabOptions, ExperimentalPermissionModePickerProps, ExperimentalPluginFixedTabReference, ExperimentalProviderModelPickerProps, ExperimentalProviderModelPickerRouting, ExperimentalProviderModelPickerValue, JsonValue, MarkdownProps, NewThreadComposerProps, NewThreadRequest, PluginAppBuilder, PluginAppComposer, PluginAppContentScripts, PluginAppDefinition, PluginAppSetup, PluginAppSlots, PluginCommandPaletteActionContext, PluginCommandPaletteActionRegistration, PluginComposerApi, PluginComposerMention, PluginComposerScope, PluginComposerTextEffect, PluginComposerThreadRowStatus, PluginContentScriptContext, PluginContentScriptDisposer, PluginContentScriptRegistration, PluginDiffRendererProps, PluginDiffRendererRegistration, PluginFileOpenerProps, PluginFileOpenerRegistration, PluginFileOpenerSource, PluginFixedTabDeclaration, PluginFixedTabRegistration, PluginHomepageSectionProps, PluginHomepageSectionRegistration, PluginMessageActionContext, PluginMessageActionRegistration, PluginMessageDirectiveMessage, PluginMessageDirectiveOpenWorkspaceFile, PluginMessageDirectiveProps, PluginMessageDirectiveRegistration, PluginNavPanelProps, PluginNavPanelRegistration, PluginNewThreadPanelActionContext, PluginNewThreadPanelActionRegistration, PluginNewThreadPanelProps, PluginPanelActionOpenOptions, PluginPendingInteractionProps, PluginPendingInteractionRegistration, PluginPendingInteractionView, PluginProviderIconRegistration, PluginProvidersState, PluginRealtimeConnectionState, PluginRpcCallArgs, PluginRpcClient, PluginRpcContract, PluginRpcError, PluginRpcErrorCode, PluginRpcHandlers, PluginRpcIssuePathSegment, PluginRpcMethodContract, PluginRpcResult, PluginRpcValidationIssue, PluginSdkApp, PluginSettingsSectionProps, PluginSettingsSectionRegistration, PluginSettingsState, PluginSidebarFooterActionContext, PluginSidebarFooterActionProps, PluginSidebarFooterActionRegistration, PluginSidebarProject, PluginSidebarPullRequest, PluginSidebarSplitPane, PluginSidebarThread, PluginSidebarThreadActions, PluginSidebarThreadActivity, PluginSidebarThreadIndicator, PluginSidebarThreadPullRequestState, PluginSidebarThreadSplit, PluginSidebarThreadsState, PluginSidebarWorkspaceKind, PluginSourceCodeRendererProps, PluginSourceCodeRendererRegistration, PluginTargetedPanelActionOpenOptions, PluginThreadHeaderActionProps, PluginThreadHeaderActionRegistration, PluginThreadListProps, PluginThreadListRegistration, PluginThreadPanelActionContext, PluginThreadPanelActionRegistration, PluginThreadPanelProps, PluginTimelineRendererProps, PluginTimelineRendererRegistration, PluginTimelineRendererRow, PluginTimelineRowPresentation, PluginTimelineRowStatus, SourceCodeLineRange, SourceCodeProps, StandardSchemaV1, StandardSchemaV1InferInput, StandardSchemaV1InferOutput, StandardSchemaV1Issue, StandardSchemaV1Result, ThreadChatMessageAction, ThreadChatMessageReference, ThreadChatProps, UrlLinkProps };
|