@get-bb/plugin-sdk 0.5.31 → 0.6.5

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.
@@ -234,6 +234,11 @@ declare const appKeybindingOverridesSchema: z$1.ZodArray<z$1.ZodObject<{
234
234
  "window.new": "window.new";
235
235
  "workspace.openPreferred": "workspace.openPreferred";
236
236
  }>, z$1.ZodTemplateLiteral<`plugin:${string}/${string}`>]>;
237
+ platform: z$1.ZodOptional<z$1.ZodEnum<{
238
+ linux: "linux";
239
+ mac: "mac";
240
+ windows: "windows";
241
+ }>>;
237
242
  shortcut: z$1.ZodNullable<z$1.ZodObject<{
238
243
  alt: z$1.ZodBoolean;
239
244
  control: z$1.ZodBoolean;
@@ -483,6 +488,7 @@ declare const environmentSchema: z$1.ZodObject<{
483
488
  type Environment = z$1.infer<typeof environmentSchema>;
484
489
 
485
490
  declare const experimentsSchema: z$1.ZodRecord<z$1.ZodEnum<{
491
+ androidTesting: "androidTesting";
486
492
  changelogPreview: "changelogPreview";
487
493
  legacyJitiPluginLoader: "legacyJitiPluginLoader";
488
494
  mobileApp: "mobileApp";
@@ -10183,6 +10189,7 @@ declare const systemConfigResponseSchema: z$1.ZodObject<{
10183
10189
  all: z$1.ZodArray<z$1.ZodEnum<{
10184
10190
  browserFocus: "browserFocus";
10185
10191
  editableFocus: "editableFocus";
10192
+ linuxPlatform: "linuxPlatform";
10186
10193
  macPlatform: "macPlatform";
10187
10194
  mainSurface: "mainSurface";
10188
10195
  modalOpen: "modalOpen";
@@ -10192,10 +10199,12 @@ declare const systemConfigResponseSchema: z$1.ZodObject<{
10192
10199
  splitActive: "splitActive";
10193
10200
  terminalFocus: "terminalFocus";
10194
10201
  webSurface: "webSurface";
10202
+ windowsPlatform: "windowsPlatform";
10195
10203
  }>>;
10196
10204
  none: z$1.ZodArray<z$1.ZodEnum<{
10197
10205
  browserFocus: "browserFocus";
10198
10206
  editableFocus: "editableFocus";
10207
+ linuxPlatform: "linuxPlatform";
10199
10208
  macPlatform: "macPlatform";
10200
10209
  mainSurface: "mainSurface";
10201
10210
  modalOpen: "modalOpen";
@@ -10205,10 +10214,12 @@ declare const systemConfigResponseSchema: z$1.ZodObject<{
10205
10214
  splitActive: "splitActive";
10206
10215
  terminalFocus: "terminalFocus";
10207
10216
  webSurface: "webSurface";
10217
+ windowsPlatform: "windowsPlatform";
10208
10218
  }>>;
10209
10219
  }, z$1.core.$strict>;
10210
10220
  }, z$1.core.$strict>>;
10211
10221
  experiments: z$1.ZodRecord<z$1.ZodEnum<{
10222
+ androidTesting: "androidTesting";
10212
10223
  changelogPreview: "changelogPreview";
10213
10224
  legacyJitiPluginLoader: "legacyJitiPluginLoader";
10214
10225
  mobileApp: "mobileApp";
@@ -10317,6 +10328,11 @@ declare const systemConfigResponseSchema: z$1.ZodObject<{
10317
10328
  "window.new": "window.new";
10318
10329
  "workspace.openPreferred": "workspace.openPreferred";
10319
10330
  }>, z$1.ZodTemplateLiteral<`plugin:${string}/${string}`>]>;
10331
+ platform: z$1.ZodOptional<z$1.ZodEnum<{
10332
+ linux: "linux";
10333
+ mac: "mac";
10334
+ windows: "windows";
10335
+ }>>;
10320
10336
  shortcut: z$1.ZodNullable<z$1.ZodObject<{
10321
10337
  alt: z$1.ZodBoolean;
10322
10338
  control: z$1.ZodBoolean;
@@ -10417,6 +10433,7 @@ declare const systemConfigResponseSchema: z$1.ZodObject<{
10417
10433
  all: z$1.ZodArray<z$1.ZodEnum<{
10418
10434
  browserFocus: "browserFocus";
10419
10435
  editableFocus: "editableFocus";
10436
+ linuxPlatform: "linuxPlatform";
10420
10437
  macPlatform: "macPlatform";
10421
10438
  mainSurface: "mainSurface";
10422
10439
  modalOpen: "modalOpen";
@@ -10426,10 +10443,12 @@ declare const systemConfigResponseSchema: z$1.ZodObject<{
10426
10443
  splitActive: "splitActive";
10427
10444
  terminalFocus: "terminalFocus";
10428
10445
  webSurface: "webSurface";
10446
+ windowsPlatform: "windowsPlatform";
10429
10447
  }>>;
10430
10448
  none: z$1.ZodArray<z$1.ZodEnum<{
10431
10449
  browserFocus: "browserFocus";
10432
10450
  editableFocus: "editableFocus";
10451
+ linuxPlatform: "linuxPlatform";
10433
10452
  macPlatform: "macPlatform";
10434
10453
  mainSurface: "mainSurface";
10435
10454
  modalOpen: "modalOpen";
@@ -10439,6 +10458,7 @@ declare const systemConfigResponseSchema: z$1.ZodObject<{
10439
10458
  splitActive: "splitActive";
10440
10459
  terminalFocus: "terminalFocus";
10441
10460
  webSurface: "webSurface";
10461
+ windowsPlatform: "windowsPlatform";
10442
10462
  }>>;
10443
10463
  }, z$1.core.$strict>;
10444
10464
  }, z$1.core.$strict>>;
@@ -10706,6 +10726,27 @@ declare const systemMachineProviderSchema: z$1.ZodObject<{
10706
10726
  supportsSuspend: z$1.ZodBoolean;
10707
10727
  }, z$1.core.$strip>;
10708
10728
  type SystemMachineProvider = z$1.infer<typeof systemMachineProviderSchema>;
10729
+ declare const androidAppArtifactSchema: z$1.ZodObject<{
10730
+ sha256: z$1.ZodString;
10731
+ size: z$1.ZodNumber;
10732
+ version: z$1.ZodString;
10733
+ versionCode: z$1.ZodNumber;
10734
+ }, z$1.core.$strip>;
10735
+ type AndroidAppArtifact = z$1.infer<typeof androidAppArtifactSchema>;
10736
+ type SystemAndroidAppResponse = AndroidAppArtifact | null;
10737
+ declare const androidAppPrepareRequestSchema: z$1.ZodObject<{
10738
+ source: z$1.ZodEnum<{
10739
+ github: "github";
10740
+ local: "local";
10741
+ }>;
10742
+ }, z$1.core.$strip>;
10743
+ type AndroidAppPrepareRequest = z$1.infer<typeof androidAppPrepareRequestSchema>;
10744
+ interface AndroidAppPreparation {
10745
+ status: "failed" | "idle" | "preparing" | "ready";
10746
+ source: "github" | "local" | null;
10747
+ message: string;
10748
+ artifact: AndroidAppArtifact | null;
10749
+ }
10709
10750
 
10710
10751
  interface UiPreferencesResponse {
10711
10752
  preferences: UiPreferenceEntries;
@@ -12188,6 +12229,7 @@ declare const createThreadRequestSchema: z$1.ZodObject<{
12188
12229
  auto: "auto";
12189
12230
  full: "full";
12190
12231
  }>, z$1.ZodLiteral<"workspace-write">]>, z$1.ZodTransform<"accept-edits" | "auto" | "full", "accept-edits" | "auto" | "full" | "workspace-write">>>;
12232
+ pinned: z$1.ZodOptional<z$1.ZodBoolean>;
12191
12233
  pluginMetadata: z$1.ZodOptional<z$1.ZodType<JsonObject, unknown, z$1.core.$ZodTypeInternals<JsonObject, unknown>>>;
12192
12234
  pluginSubmission: z$1.ZodOptional<z$1.ZodObject<{
12193
12235
  data: z$1.ZodType<JsonValue$1, unknown, z$1.core.$ZodTypeInternals<JsonValue$1, unknown>>;
@@ -15512,6 +15554,9 @@ interface EnvironmentListProvidersArgs {
15512
15554
  }
15513
15555
  type EnvironmentListProvidersResult = SystemEnvironmentProvider[];
15514
15556
  interface EnvironmentsArea {
15557
+ experimental_cleanup(args: EnvironmentActionArgs): Promise<{
15558
+ ok: true;
15559
+ }>;
15515
15560
  archiveThreads(args: EnvironmentActionArgs): Promise<EnvironmentArchiveThreadsResult>;
15516
15561
  commit(args: EnvironmentCommitArgs): Promise<EnvironmentCommitResult>;
15517
15562
  diff(args: EnvironmentDiffArgs): Promise<EnvironmentDiffResult>;
@@ -15672,6 +15717,7 @@ type HostDeleteResult = {
15672
15717
  type HostDirectoryResult = HostDirectoryListing;
15673
15718
  type HostGetResult = Host & {
15674
15719
  connectMachineId: string | null;
15720
+ threadStorageRootPath: string | null;
15675
15721
  };
15676
15722
  type HostEnrollmentCommandResult = HostEnrollmentCommandResponse;
15677
15723
  type HostReconnectResult = HostReconnectResponse;
@@ -16342,6 +16388,9 @@ interface SystemArea {
16342
16388
  testAiService(args: SystemTestAiServiceArgs): Promise<SystemTestAiServiceResult>;
16343
16389
  transcribeVoice(args: SystemVoiceTranscriptionArgs): Promise<SystemVoiceTranscriptionResult>;
16344
16390
  uiPreferences: SystemUiPreferencesArea;
16391
+ androidAppPreparation(): Promise<AndroidAppPreparation>;
16392
+ prepareAndroidApp(input: AndroidAppPrepareRequest): Promise<AndroidAppPreparation>;
16393
+ androidApp(): Promise<SystemAndroidAppResponse>;
16345
16394
  updateExperiments(args: Experiments): Promise<SystemUpdateExperimentsResult>;
16346
16395
  updateGeneralSettings(args: AppSettingsUpdate): Promise<SystemUpdateGeneralSettingsResult>;
16347
16396
  updateKeyboardSettings(args: AppKeybindingOverrides): Promise<SystemUpdateKeyboardSettingsResult>;
@@ -16997,9 +17046,33 @@ interface PluginRpcMethodContract<InputSchema extends StandardSchemaV1 = Standar
16997
17046
  type PluginRpcContract = Readonly<Record<string, PluginRpcMethodContract>>;
16998
17047
  /** Define a shared RPC contract while preserving exact method/schema types. */
16999
17048
  declare function defineRpcContract<const Contract extends PluginRpcContract>(contract: Contract): Contract;
17049
+ /**
17050
+ * Who invoked an rpc method. `plugin` means another loaded plugin (or this
17051
+ * one) called through its own `bb.sdk.plugins.callRpc`; the host verifies
17052
+ * that with a per-load token only the server knows. Every other caller — the
17053
+ * app, the `bb` CLI, agents, and bb itself — is `client`.
17054
+ */
17055
+ type ExperimentalPluginRpcCaller = {
17056
+ readonly kind: "plugin";
17057
+ readonly pluginId: string;
17058
+ } | {
17059
+ readonly kind: "client";
17060
+ };
17061
+ /** Second argument of every rpc handler. */
17062
+ interface ExperimentalPluginRpcHandlerContext {
17063
+ readonly experimental_caller: ExperimentalPluginRpcCaller;
17064
+ }
17000
17065
  type PluginRpcHandlers<Contract extends PluginRpcContract> = {
17001
17066
  [Method in keyof Contract]: (input: StandardSchemaV1InferOutput<Contract[Method]["input"]>) => StandardSchemaV1InferInput<Contract[Method]["output"]> | Promise<StandardSchemaV1InferInput<Contract[Method]["output"]>>;
17002
17067
  };
17068
+ /**
17069
+ * Handlers as `bb.rpc.register` calls them: the validated input, then the
17070
+ * call's context. A `PluginRpcHandlers` map is assignable to this type, so
17071
+ * handlers that ignore the context keep their one-argument signature.
17072
+ */
17073
+ type ExperimentalPluginRpcHandlersWithContext<Contract extends PluginRpcContract> = {
17074
+ [Method in keyof Contract]: (input: StandardSchemaV1InferOutput<Contract[Method]["input"]>, context: ExperimentalPluginRpcHandlerContext) => StandardSchemaV1InferInput<Contract[Method]["output"]> | Promise<StandardSchemaV1InferInput<Contract[Method]["output"]>>;
17075
+ };
17003
17076
  type PluginRpcCallInput<Method extends PluginRpcMethodContract> = StandardSchemaV1InferInput<Method["input"]>;
17004
17077
  type PluginRpcCallArgs<Method extends PluginRpcMethodContract> = null extends PluginRpcCallInput<Method> ? [input?: PluginRpcCallInput<Method>] : [input: PluginRpcCallInput<Method>];
17005
17078
  type PluginRpcResult<Method extends PluginRpcMethodContract> = StandardSchemaV1InferOutput<Method["output"]>;
@@ -17140,7 +17213,7 @@ type ExperimentalSidebarNavigationAction = {
17140
17213
  /**
17141
17214
  * Semantic icon identity for one sidebar navigation item. Render it with
17142
17215
  * {@link PluginSdkApp.experimental_SidebarNavigationIcon} to match bb's
17143
- * artwork, including plugin branding.
17216
+ * artwork, including panel icons with plugin branding as their fallback.
17144
17217
  */
17145
17218
  type ExperimentalSidebarNavigationIcon = {
17146
17219
  kind: "host";
@@ -17666,6 +17739,7 @@ type ExperimentalPluginFixedTabReference<Target extends JsonValue = never> = {
17666
17739
  /** A fixed tab declared by a plugin nav panel. */
17667
17740
  type PluginFixedTabRegistration<Target extends JsonValue = never> = ExperimentalPluginFixedTabReference<Target> & {
17668
17741
  title: string;
17742
+ /** Resolved names take precedence over plugin branding; unknown names fall back to branding. */
17669
17743
  icon: BbIconName;
17670
17744
  component: ComponentType<PluginNavPanelProps>;
17671
17745
  /** `flush` lets the component own padding and scrolling. */
@@ -17677,6 +17751,7 @@ interface PluginNavPanelRegistration {
17677
17751
  /** Unique within the plugin; letters, digits, `-`, `_`. */
17678
17752
  id: string;
17679
17753
  title: string;
17754
+ /** Resolved names take precedence over plugin branding in navigation and the header; unknown names fall back to branding. */
17680
17755
  icon: BbIconName;
17681
17756
  /** URL segment under `/plugins/<pluginId>/`; letters, digits, `-`, `_`. */
17682
17757
  path: string;
@@ -17760,8 +17835,8 @@ interface PluginThreadPanelActionRegistration {
17760
17835
  /** Label of the action row in the panel's new-tab launcher. */
17761
17836
  title: string;
17762
17837
  /**
17763
- * Drawn only when the manifest declares no `bb.branding.icon`; the launcher
17764
- * row and opened tabs prefer that over this hint.
17838
+ * Resolved names take precedence over plugin branding in the launcher and
17839
+ * opened tabs. Omitted or unknown names fall back to plugin branding.
17765
17840
  */
17766
17841
  icon?: BbIconName;
17767
17842
  /** Rendered inside every panel tab this action opens. */
@@ -17800,7 +17875,7 @@ interface PluginNewThreadPanelActionRegistration {
17800
17875
  id: string;
17801
17876
  /** Label of the action row in the panel's new-tab launcher. */
17802
17877
  title: string;
17803
- /** Drawn only when the manifest declares no `bb.branding.icon`. */
17878
+ /** Resolved names take precedence over plugin branding; omitted or unknown names fall back to branding. */
17804
17879
  icon?: BbIconName;
17805
17880
  /** Rendered inside every panel tab this action opens. */
17806
17881
  component: ComponentType<PluginNewThreadPanelProps>;
@@ -17845,7 +17920,7 @@ interface PluginSidebarFooterActionRegistration {
17845
17920
  id: string;
17846
17921
  /** Tooltip and accessible label for the icon button. */
17847
17922
  title: string;
17848
- /** Drawn only when the manifest declares no `bb.branding.icon`. */
17923
+ /** Resolved names take precedence over plugin branding; omitted or unknown names fall back to branding. */
17849
17924
  icon: BbIconName;
17850
17925
  /**
17851
17926
  * Runs when the user activates the action (e.g. call `openSettings()`,
@@ -18230,7 +18305,7 @@ interface PluginSidebarThreadDraftState {
18230
18305
  }
18231
18306
  /**
18232
18307
  * The status another plugin's app-wide script set on a thread's row through
18233
- * `useComposer().experimental_setThreadRowStatus` (see
18308
+ * the content-script context's `experimental_setThreadRowStatus` (see
18234
18309
  * {@link PluginSdkApp.useSidebarThreadRowStatus}). bb's row draws it in
18235
18310
  * place of the draft glyph while it is set; a replaced list should do the
18236
18311
  * same so a status set by, say, the drafts or workflows plugin does not
@@ -18270,6 +18345,9 @@ interface PluginSidebarThreadActions {
18270
18345
  * `sectionId` files the new thread under that section, and
18271
18346
  * `environmentId` reuses that environment (the "New thread in
18272
18347
  * environment" affordance), both exactly as bb's own list does.
18348
+ * `experimental_placement` explicitly selects the section and pin state,
18349
+ * overriding `sectionId`. Omitting placement starts unpinned, outside sections
18350
+ * unless `sectionId` is supplied; previous composer placement is cleared.
18273
18351
  * `hostId` selects a machine for a new environment when it
18274
18352
  * is known and supports an environment provider. `environmentId` wins when
18275
18353
  * both are supplied.
@@ -18277,6 +18355,10 @@ interface PluginSidebarThreadActions {
18277
18355
  openNewThread(options?: {
18278
18356
  projectId?: string;
18279
18357
  sectionId?: string;
18358
+ experimental_placement?: {
18359
+ sectionId: string | null;
18360
+ pinned: boolean;
18361
+ };
18280
18362
  environmentId?: string;
18281
18363
  hostId?: string;
18282
18364
  focusPrompt?: boolean;
@@ -18565,12 +18647,19 @@ interface PluginMessageActionContext {
18565
18647
  * is never thrown: the host logs it and reports it here.
18566
18648
  */
18567
18649
  openPanel(options: PluginTargetedPanelActionOpenOptions): boolean;
18650
+ /**
18651
+ * The composer of the thread the message is in, or null when that thread's
18652
+ * composer is not available on this surface. The same handle
18653
+ * `useComposer()` returns there.
18654
+ */
18655
+ composer: PluginComposerApi | null;
18568
18656
  }
18569
18657
  /**
18570
18658
  * An action on chat messages: an icon button in the per-message action bar
18571
18659
  * (user and assistant messages) and an entry in the assistant-message
18572
18660
  * text-selection menu. Host-rendered chrome — the plugin supplies title,
18573
- * icon hint, and `run` behavior only.
18661
+ * icon, and `run` behavior only. Resolved icon names take precedence over
18662
+ * plugin branding; omitted or unknown names fall back to branding.
18574
18663
  */
18575
18664
  interface PluginMessageActionRegistration {
18576
18665
  /** Unique within the plugin; letters, digits, `-`, `_`. */
@@ -19080,12 +19169,6 @@ type PluginComposerScope = {
19080
19169
  kind: "queued-message";
19081
19170
  threadId: string;
19082
19171
  queuedMessageId: string;
19083
- } | {
19084
- kind: "side-chat";
19085
- projectId: string;
19086
- parentThreadId: string;
19087
- tabId: string;
19088
- childThreadId: string | null;
19089
19172
  } | {
19090
19173
  kind: "new-thread";
19091
19174
  /** Root compose's effective selected project; null only while unresolved. */
@@ -19108,35 +19191,39 @@ interface ComposerCustomization {
19108
19191
  component: ComponentType;
19109
19192
  }[];
19110
19193
  plusMenu?: readonly ComposerPlusMenuItem[];
19194
+ /** Host-rendered rows in the menu next to the composer's send button. */
19195
+ sendMenu?: readonly ComposerSendMenuItem[];
19111
19196
  richText?: ComposerRichTextSpec;
19112
19197
  }
19113
19198
  /** Host-rendered menu row in the composer's `+` menu. */
19114
19199
  interface ComposerPlusMenuItem {
19115
19200
  id: string;
19116
19201
  label: string;
19117
- /** Drawn only when the manifest declares no `bb.branding.icon`. */
19202
+ /** Takes precedence over the plugin's `bb.branding.icon`, which is drawn when this is omitted. */
19118
19203
  icon?: BbIconName;
19119
19204
  /** Accessible description for the host-rendered row. */
19120
19205
  description?: string;
19121
- disabled?: boolean | ((view: ComposerView) => boolean);
19206
+ disabled?: boolean | ((composer: PluginComposerApi) => boolean);
19122
19207
  run(context: {
19123
19208
  composer: PluginComposerApi;
19124
- view: ComposerView;
19125
19209
  }): void | Promise<void>;
19126
19210
  }
19127
- /** Reactive read-side of the composer a plugin surface is mounted in. */
19128
- interface ComposerView {
19129
- scope: PluginComposerScope;
19130
- layout: "compact" | "expanded" | "zen";
19131
- draft: {
19132
- text: string;
19133
- isEmpty: boolean;
19134
- attachmentCount: number;
19135
- };
19136
- run: {
19137
- isRunning: boolean;
19138
- isSubmitting: boolean;
19139
- };
19211
+ /**
19212
+ * Host-rendered row in the menu next to the composer's send button, for
19213
+ * alternatives to sending right away (save as a draft, send later). The menu
19214
+ * shows only while the composer can submit.
19215
+ */
19216
+ interface ComposerSendMenuItem {
19217
+ id: string;
19218
+ label: string;
19219
+ /** Takes precedence over the plugin's `bb.branding.icon`, which is drawn when this is omitted. */
19220
+ icon?: BbIconName;
19221
+ /** Accessible description for the host-rendered row. */
19222
+ description?: string;
19223
+ disabled?: boolean | ((composer: PluginComposerApi) => boolean);
19224
+ run(context: {
19225
+ composer: PluginComposerApi;
19226
+ }): void | Promise<void>;
19140
19227
  }
19141
19228
  interface ComposerRichTextSpec {
19142
19229
  /** Content-derived paint: match ranges receive `className`; text is never mutated. */
@@ -19149,18 +19236,80 @@ interface ComposerRichTextSpec {
19149
19236
  }[];
19150
19237
  className: string;
19151
19238
  }[];
19152
- /** Debounced, read-only observation of the structured draft. */
19153
- onDraftChange?(draft: ComposerStructuredDraft, view: ComposerView): void;
19154
19239
  }
19155
- interface ComposerStructuredDraft {
19240
+ /** The composer's text and the @-mention pills in it. */
19241
+ interface ComposerDraft {
19156
19242
  text: string;
19157
- mentions: readonly {
19158
- from: number;
19159
- to: number;
19160
- provider: string;
19161
- id: string;
19162
- label: string;
19163
- }[];
19243
+ mentions: readonly ComposerMention[];
19244
+ }
19245
+ /** An already uploaded attachment; paths retain their original project or thread ownership. */
19246
+ type ComposerAttachment = UploadedPromptAttachment;
19247
+ /** The complete current draft. Snapshots and their entries are immutable. */
19248
+ interface ComposerDraftSnapshot extends ComposerDraft {
19249
+ readonly attachments: readonly ComposerAttachment[];
19250
+ }
19251
+ /** Atomic text and mention replacement, optionally replacing uploaded attachments too. */
19252
+ interface ComposerDraftReplacement extends ComposerDraft {
19253
+ /** Omit to preserve attachments; supply an empty array to remove them all. Does not upload or copy files. */
19254
+ attachments?: readonly ComposerAttachment[];
19255
+ }
19256
+ /**
19257
+ * One @-mention pill: its range in `ComposerDraft.text` plus everything the
19258
+ * host needs to recreate it, so a mention read from `draft` can be passed
19259
+ * back to `insert` unchanged.
19260
+ */
19261
+ type ComposerMention = {
19262
+ from: number;
19263
+ to: number;
19264
+ label: string;
19265
+ } & ({
19266
+ kind: "thread";
19267
+ threadId: string;
19268
+ projectId?: string;
19269
+ } | {
19270
+ kind: "project";
19271
+ projectId: string;
19272
+ } | {
19273
+ kind: "section";
19274
+ sectionId: string;
19275
+ } | {
19276
+ kind: "path";
19277
+ path: string;
19278
+ source: "thread-storage" | "workspace";
19279
+ entryKind: "directory" | "file";
19280
+ } | {
19281
+ kind: "command";
19282
+ trigger: "$" | "/";
19283
+ name: string;
19284
+ source: "command" | "skill";
19285
+ origin: "builtin" | "project" | "user";
19286
+ argumentHint: string | null;
19287
+ } | {
19288
+ kind: "plugin";
19289
+ /** The plugin that owns the pill. */
19290
+ pluginId: string;
19291
+ /** The mention provider id that plugin registered. */
19292
+ provider: string;
19293
+ /** The item id the provider's `resolve` receives at send time. */
19294
+ id: string;
19295
+ icon?: string | null;
19296
+ });
19297
+ /**
19298
+ * What `insert` accepts: text, a mention read from `draft` (any kind), or one
19299
+ * of the calling plugin's own mentions (`{ provider, id, label }`, no `kind`).
19300
+ */
19301
+ type ComposerInsertPart = string | ComposerMention | PluginComposerMention;
19302
+ /** Where `insert` puts its content. */
19303
+ interface ComposerInsertOptions {
19304
+ /**
19305
+ * `"cursor"` (default) inserts at the editor's selection, replacing any
19306
+ * selected text; the selection is kept while focus is elsewhere, and the
19307
+ * composer must be on screen. `"end"` inserts after the last character and
19308
+ * also works for a composer that is not on screen.
19309
+ */
19310
+ at?: "cursor" | "end";
19311
+ /** Put the content on its own paragraph, adding a paragraph break before and after only where text is adjacent. */
19312
+ block?: boolean;
19164
19313
  }
19165
19314
  /** Host-rendered paint applied to the editable composer text. */
19166
19315
  interface PluginComposerTextEffect {
@@ -19192,31 +19341,77 @@ interface PluginComposerMention {
19192
19341
  label: string;
19193
19342
  }
19194
19343
  /**
19195
- * Programmatic access to the chat composer draft — the same shared draft the
19196
- * built-in "Add to chat" affordances (file preview, diff, terminal selections)
19197
- * write to. While a queued message is being edited, writes land in that
19198
- * message's inline editor. In a side chat, writes land in the visible side-chat
19199
- * draft. Otherwise, inside a thread context writes land in that thread's draft;
19200
- * anywhere else (nav panel, homepage section) they seed the new-thread composer
19201
- * draft, which persists until the user sends or clears it.
19344
+ * One composer: its state and the writes a plugin can make. `useComposer()`
19345
+ * returns the composer the calling surface belongs to — inside a composer
19346
+ * slot, that composer; in a thread's panels, that thread's composer;
19347
+ * elsewhere, the current route's draft (the thread in view, or the new-thread
19348
+ * draft).
19349
+ *
19350
+ * The handle is stable: the same composer returns the same object across
19351
+ * renders, and its methods always act on the current draft, so it is safe to
19352
+ * keep in effects, callbacks and async work. Its reactive fields (`text`,
19353
+ * `draft`, `selection`, `isEmpty`, …) re-render the calling component when they change;
19354
+ * depend on those fields, not on the handle, in memo dependency lists.
19355
+ *
19356
+ * A handle always writes to its own composer's draft. Thread and new-thread
19357
+ * drafts persist, so a write after the composer left the screen still lands
19358
+ * in that draft. When the draft no longer exists (a queued-message or
19359
+ * sent-message editor that closed), `insert`, `replace`, `removeMention`, `submit` and
19360
+ * `setSelection` throw "This composer is no longer available"; the older
19361
+ * text methods log a warning and do nothing.
19202
19362
  */
19203
19363
  interface PluginComposerApi {
19204
19364
  scope: PluginComposerScope;
19365
+ /**
19366
+ * Stable identity for this composer's draft: the same across remounts and
19367
+ * reloads for thread and new-thread composers (including a `ThreadChat`),
19368
+ * and per editing session for queued-message and sent-message editors.
19369
+ */
19370
+ readonly key: string;
19371
+ /** `"compact"` in the collapsed single-line layout, otherwise `"expanded"`. */
19372
+ readonly layout: "compact" | "expanded";
19373
+ /** The thread's agent is running or stopping. Always false in a new-thread composer. */
19374
+ readonly isRunning: boolean;
19375
+ /** The composer is submitting right now. */
19376
+ readonly isSubmitting: boolean;
19377
+ /**
19378
+ * Pressing Enter would not submit right now: the same decision as the
19379
+ * host's send button (empty draft, uploads in progress, loading, a
19380
+ * selection or setup missing, a pending interaction, voice input, …).
19381
+ */
19382
+ readonly isSubmittingBlocked: boolean;
19383
+ /** The host's message for why submitting is blocked, or null when it is not. */
19384
+ readonly submittingBlockedReason: string | null;
19385
+ /** No text (ignoring whitespace), no mentions and no attachments. */
19386
+ readonly isEmpty: boolean;
19387
+ /** Attachments that have finished uploading. */
19388
+ readonly attachmentCount: number;
19205
19389
  /** Current plain text for this composer scope. */
19206
19390
  readonly text: string;
19207
- /**
19208
- * Replace the draft's plain text. Attachments are preserved. Inline mentions
19209
- * outside the changed range are preserved and rebased; mentions overlapped
19210
- * by the replacement are removed because their text representation changed.
19211
- */
19212
- setText(next: string): void;
19213
- /**
19214
- * Replace the draft's plain text from the latest committed value. Uses the
19215
- * same structured-state reconciliation as `setText`.
19216
- */
19217
- updateText(updater: (current: string) => string): void;
19218
- /** Clear plain text without clearing independently attached files. */
19219
- clear(): void;
19391
+ /** The complete current draft, including uploaded attachments. Stable until the draft changes. */
19392
+ readonly draft: ComposerDraftSnapshot;
19393
+ /** Current picker values, or null when this composer has no pickers. Stable until a picker value changes. */
19394
+ readonly selection: ComposerSelection | null;
19395
+ /**
19396
+ * Replace text and mentions together in one committed change. An updater
19397
+ * receives the latest immutable snapshot, including attachments, and must
19398
+ * return its result synchronously. Returning that same snapshot is a no-op.
19399
+ * Omitted attachments are preserved; an explicit list replaces them, and
19400
+ * an empty list clears them. Does not infer or rebase mention ranges.
19401
+ * Ranges are non-overlapping UTF-16 offsets into the supplied text.
19402
+ * Invalid results, throwing updaters, and unavailable editors leave the
19403
+ * draft unchanged. Does not focus, submit, upload, or copy files between
19404
+ * projects. Use `insert` for insertion at the editor's cursor.
19405
+ */
19406
+ replace(next: ComposerDraftReplacement | ((current: ComposerDraftSnapshot) => ComposerDraftReplacement)): void;
19407
+ /**
19408
+ * Insert text and mentions. See {@link ComposerInsertOptions} for placement.
19409
+ * Mentions read from `draft` are recreated exactly; the calling plugin's
19410
+ * own `{ provider, id, label }` resolves through its mention provider.
19411
+ * Throws for another plugin's mention without `kind`, and for
19412
+ * `at: "cursor"` when the composer is not on screen.
19413
+ */
19414
+ insert(parts: ComposerInsertPart | readonly ComposerInsertPart[], options?: ComposerInsertOptions): void;
19220
19415
  /**
19221
19416
  * Apply a host-rendered effect to this composer's editable text, or clear it.
19222
19417
  * Effects are scoped to the calling plugin and automatically clear when the
@@ -19229,38 +19424,22 @@ interface PluginComposerApi {
19229
19424
  * scope changes.
19230
19425
  */
19231
19426
  setInputLock(locked: boolean): void;
19232
- /**
19233
- * Append text to the draft as a `> ` blockquote block and focus the
19234
- * composer. Blank text is a no-op. This is the "reference this selection
19235
- * in chat" primitive.
19236
- */
19237
- addQuote(text: string): void;
19238
- /**
19239
- * Insert an @-mention pill that resolves through this plugin's mention
19240
- * provider at send time — the durable way to reference an entity whose
19241
- * content should be fetched fresh when the message is sent.
19242
- */
19243
- insertMention(mention: PluginComposerMention): void;
19244
- /** Remove this plugin's matching mention pills and their text from the current draft. */
19245
- experimental_removeMention(mention: {
19246
- provider: string;
19247
- id: string;
19248
- }): void;
19249
19427
  /** Subscribe to successful local submissions in this composer scope, including accepted queued messages. Failed sends and draft clearing do not notify. Dispose on unmount. */
19250
- experimental_onSubmitted(listener: () => void): () => void;
19428
+ onSubmitted(listener: () => void): () => void;
19251
19429
  /** Focus the composer caret at the end of the draft. */
19252
19430
  focus(): void;
19253
19431
  /**
19254
- * Submit this composer's draft through the composer's OWN submit pipeline,
19255
- * optionally scheduling it or attaching plugin-owned dispatch data.
19256
- *
19257
- * This is a real submission, not a plugin-issued send: the host builds the
19258
- * request exactly as pressing Enter would, so the draft's attachments and
19432
+ * Submit this composer's draft exactly as pressing Enter would: the same
19433
+ * checks and the same action (send, or queue while the thread is busy; a
19434
+ * provider handoff creates a new thread). The draft's attachments and
19259
19435
  * @-mentions, and — in the new-thread composer — the provider, model,
19260
19436
  * reasoning level, service tier, permission mode and environment the user
19261
- * has selected on screen, all travel with it. A plugin cannot assemble that
19262
- * tuple itself, which is why sending from the backend instead would silently
19263
- * run the message with different settings than the ones in front of the user.
19437
+ * has selected on screen, all travel with it.
19438
+ *
19439
+ * While attachments are uploading it waits for them, then checks again; it
19440
+ * rejects if an upload fails. Otherwise, when submitting is blocked it
19441
+ * rejects with `submittingBlockedReason`, a message safe to show to the
19442
+ * user. The queued-message and sent-message editors save edits and reject.
19264
19443
  *
19265
19444
  * `sendAt` queues the submission until that time. `experimental_data` is
19266
19445
  * opaque JSON delivered to dispatch hooks together with the calling plugin's
@@ -19269,16 +19448,10 @@ interface PluginComposerApi {
19269
19448
  * later attempts; core does not persist or interpret the opaque data.
19270
19449
  *
19271
19450
  * Resolves once the host has accepted the submission and cleared the draft.
19272
- * Rejects when the composer refused to submit — a scope with no submit
19273
- * pipeline (a queued-message editor, a side chat), an empty draft, or a
19274
- * composer that is not ready (still loading its execution defaults, missing
19275
- * an environment). The rejection's message is safe to show to the user.
19276
19451
  * Failures of the underlying request are reported by bb's own submit error
19277
19452
  * handling and restore the draft, exactly as an interactive failure does.
19278
- *
19279
- * Experimental: see docs/api_to_audit.md.
19280
19453
  */
19281
- experimental_submit(options: ExperimentalComposerSubmitOptions): Promise<void>;
19454
+ submit(options: ComposerSubmitOptions): Promise<void>;
19282
19455
  /**
19283
19456
  * Set this composer's pickers as if each value had been picked by hand.
19284
19457
  *
@@ -19325,18 +19498,15 @@ interface PluginComposerApi {
19325
19498
  * mounted outside any composer), when the calling surface is no longer
19326
19499
  * active, and when a value is not a known reasoning level, service tier or
19327
19500
  * permission mode.
19328
- *
19329
- * Experimental: see docs/api_to_audit.md.
19330
19501
  */
19331
- experimental_setSelection(selection: ExperimentalComposerSelection): Promise<ExperimentalComposerSelection>;
19502
+ setSelection(selection: ComposerSelection): Promise<ComposerSelection>;
19332
19503
  }
19333
19504
  /**
19334
- * Picker values for `experimental_setSelection`, and the shape it resolves
19335
- * with. Field names match `NewThreadRequest` and the `default*` props of
19505
+ * Current picker values in `selection`, input for `setSelection`, and the shape it resolves with. Field names match `NewThreadRequest` and the `default*` props of
19336
19506
  * `experimental_NewThreadComposer`, so one routed decision can feed the
19337
19507
  * composer, the embedded composer and `bb.sdk.threads.spawn` alike.
19338
19508
  */
19339
- interface ExperimentalComposerSelection {
19509
+ interface ComposerSelection {
19340
19510
  /** New-thread composers only. BB's personal-project id means "Don't work in a project". */
19341
19511
  projectId?: string;
19342
19512
  /**
@@ -19357,13 +19527,13 @@ interface ExperimentalComposerSelection {
19357
19527
  permissionMode?: PermissionMode;
19358
19528
  }
19359
19529
  /**
19360
- * What `experimental_submit` does differently from pressing Enter.
19530
+ * What `submit` does differently from pressing Enter.
19361
19531
  *
19362
19532
  * `experimental_data` is opaque JSON delivered to dispatch hooks. The runtime
19363
19533
  * associates it with the calling plugin automatically for the initial
19364
19534
  * dispatch attempt.
19365
19535
  */
19366
- type ExperimentalComposerSubmitOptions = {
19536
+ type ComposerSubmitOptions = {
19367
19537
  sendAt: number;
19368
19538
  experimental_data?: JsonValue;
19369
19539
  } | {
@@ -19588,7 +19758,7 @@ interface NewThreadRequest {
19588
19758
  input: PromptInput[];
19589
19759
  /**
19590
19760
  * Epoch ms the first turn should dispatch at. Present only when the
19591
- * submission came from `useComposer().experimental_submit` — a scheduled
19761
+ * submission came from `useComposer().submit` — a scheduled
19592
19762
  * create — and absent otherwise, which is what makes an ordinary submission
19593
19763
  * start work at once. Forward it to `threads.spawn` unchanged: the thread is
19594
19764
  * created `pending` and its first message is queued as a row until then.
@@ -19892,6 +20062,20 @@ interface PluginSdkApp {
19892
20062
  /** Read or clear the owning tab's validated, session-scoped target. */
19893
20063
  experimental_useFixedTabTarget<Target extends JsonValue>(tab: ExperimentalPluginFixedTabReference<Target>): ExperimentalFixedTabTargetState<Target> | null;
19894
20064
  useComposer(): PluginComposerApi;
20065
+ /**
20066
+ * Every composer on screen that plugin composer customizations mount in,
20067
+ * oldest first: the thread page's composer, a `ThreadChat`'s composer, the
20068
+ * new-thread composer and open queued-message editors. Use it from a panel
20069
+ * or page that writes into a composer the user picks — label each by its
20070
+ * `scope`, then call `insert`, `focus` or `submit` on the chosen handle.
20071
+ *
20072
+ * Each handle is stable while its composer stays on screen and follows the
20073
+ * same lifetime rule as `useComposer()`. `setTextEffect` and `setInputLock`
20074
+ * have no effect here; call them from a composer slot's `useComposer()`.
20075
+ * The calling component re-renders when the list or any listed draft
20076
+ * changes.
20077
+ */
20078
+ useComposers(): readonly PluginComposerApi[];
19895
20079
  /**
19896
20080
  * The sidebar's live thread view (see {@link PluginSidebarThreadsState}).
19897
20081
  * Reads the host's own cache and realtime subscriptions, so it costs no
@@ -19952,7 +20136,7 @@ interface PluginSdkApp {
19952
20136
  experimental_useSidebarNavigationSplit(itemId: string, options?: ExperimentalSidebarNavigationSplitOptions): ExperimentalSidebarNavigationSplit;
19953
20137
  /**
19954
20138
  * bb's artwork for a navigation item's icon: bb's glyphs for its own items,
19955
- * and the contributing plugin's branding for plugin panels. Experimental:
20139
+ * and the panel's explicit icon, falling back to plugin branding, for plugin panels. Experimental:
19956
20140
  * see docs/api_to_audit.md.
19957
20141
  */
19958
20142
  experimental_SidebarNavigationIcon: ComponentType<ExperimentalSidebarNavigationIconProps>;
@@ -20112,7 +20296,6 @@ interface PluginSdkApp {
20112
20296
  * docs/api_to_audit.md.
20113
20297
  */
20114
20298
  experimental_Diff: ComponentType<DiffProps>;
20115
- useComposerView(): ComposerView;
20116
20299
  }
20117
20300
 
20118
20301
  type PluginMachineProviderResource = Exclude<JsonValue$2, null>;
@@ -21012,7 +21195,7 @@ interface MessageDispatchHookContext {
21012
21195
  queuedMessages: ThreadQueuedMessage[];
21013
21196
  /**
21014
21197
  * Opaque JSON supplied by a plugin through the composer's
21015
- * `experimental_submit`, paired with that plugin's id. Null for ordinary
21198
+ * `submit`, paired with that plugin's id. Null for ordinary
21016
21199
  * submissions and queued re-attempts. Core does not persist or interpret
21017
21200
  * the data.
21018
21201
  */
@@ -21167,9 +21350,11 @@ interface PluginRpc {
21167
21350
  * `/api/v1/plugins/<id>/rpc/<method>` with "local" auth semantics. The
21168
21351
  * host validates input before invocation and output before strict JSON
21169
21352
  * serialization. The response is `{ ok: true, result }` or
21170
- * `{ ok: false, error: { code, message, issues? } }`.
21353
+ * `{ ok: false, error: { code, message, issues? } }`. Each handler gets
21354
+ * the call's context as its second argument; `experimental_caller` names
21355
+ * the plugin that called through `bb.sdk.plugins.callRpc`, or `client`.
21171
21356
  */
21172
- register<Contract extends PluginRpcContract>(contract: Contract, handlers: PluginRpcHandlers<Contract>, options?: {
21357
+ register<Contract extends PluginRpcContract>(contract: Contract, handlers: ExperimentalPluginRpcHandlersWithContext<Contract>, options?: {
21173
21358
  experimental_discoverable?: boolean;
21174
21359
  experimental_description?: string;
21175
21360
  }): void;
@@ -21963,8 +22148,9 @@ interface PluginMentionItem {
21963
22148
  subtitle?: string;
21964
22149
  /**
21965
22150
  * BB icon name: a built-in name, or a name the plugin's app bundle
21966
- * registered with `app.experimental_icons.register()`. The row prefers the
21967
- * plugin's own branding icon when it ships one; unknown names fall back to
22151
+ * registered with `app.experimental_icons.register()`. Resolved names take
22152
+ * precedence over plugin branding in menu rows, composer pills, and sent
22153
+ * messages. Omitted or unknown names fall back to plugin branding, then
21968
22154
  * the generic plugin icon.
21969
22155
  */
21970
22156
  icon?: string;
@@ -22524,4 +22710,4 @@ declare function cliCommand<const TOptions extends CliOptions = Record<string, n
22524
22710
  declare function defineCli(spec: PluginCliSpec): PluginCliRegistration;
22525
22711
 
22526
22712
  export { PLUGIN_CLI_OUTPUT_MAX_BYTES, PluginCliError, cliCommand, defineCli, defineRpcContract, experimental_defineHostEntry };
22527
- export type { BbContext, BbNavigate, BbPluginApi, BranchPickerProps, BranchesState, CheckoutState, CodeOverflowMode, ComposerCustomization, ComposerPlusMenuItem, ComposerRichTextSpec, ComposerStructuredDraft, ComposerView, DiffProps, DiffViewMode, ExperimentalAppIcons, ExperimentalAppOverlayProps, ExperimentalAppOverlayRegistration, ExperimentalAppPanel, ExperimentalAppPanelSurface, ExperimentalComposerSelection, ExperimentalComposerSubmitOptions, ExperimentalDesktopBrowserAcquireInput, ExperimentalDesktopBrowserCreateInput, ExperimentalDesktopBrowserLease, ExperimentalDesktopBrowserScope, ExperimentalDesktopBrowsersArea, ExperimentalDiffFileContent, ExperimentalDiffFullFileContents, ExperimentalFileLinkProps, ExperimentalFileLocation, ExperimentalFileOpenOptions, ExperimentalFixedTabTargetContract, ExperimentalFixedTabTargetState, ExperimentalHostCallOptions, ExperimentalHostClient, ExperimentalHostEntry, ExperimentalHostPaths, ExperimentalHostRpcContext, ExperimentalHostRpcHandlers, ExperimentalHostSignalContract, ExperimentalHostSignalEvent, ExperimentalHostSignals, ExperimentalHostWatchChange, ExperimentalHostWatchChangeType, ExperimentalHostWatchEvent, ExperimentalHostWatchListener, ExperimentalHostWatchOptions, ExperimentalHostWatchSubscription, ExperimentalHostWorkerLease, ExperimentalIconProps, ExperimentalIconRegistration, ExperimentalLiveFileTarget, ExperimentalOpenFixedTabOptions, ExperimentalPermissionModePickerProps, ExperimentalPluginBrowserPage, ExperimentalPluginBrowserPageEvaluateOptions, ExperimentalPluginBrowserPageWorld, ExperimentalPluginBrowserToolbarActionProps, ExperimentalPluginBrowserToolbarActionRegistration, ExperimentalPluginFixedTabReference, ExperimentalPluginMentionImage, ExperimentalPluginProviderEnvContext, ExperimentalPluginProviderEnvEntry, ExperimentalPluginProviderEnvHealth, ExperimentalPluginProviderEnvHealthContext, ExperimentalPluginWebSocket, ExperimentalPluginWebSocketContext, ExperimentalPluginWebSocketHandler, ExperimentalPluginWebSocketHandlers, ExperimentalProviderIconProps, ExperimentalProviderModelPickerProps, ExperimentalProviderModelPickerRouting, ExperimentalProviderModelPickerValue, ExperimentalQuestionFormHost, ExperimentalQuestionShortcut, ExperimentalSidebarFooter, ExperimentalSidebarFooterActionContext, ExperimentalSidebarFooterActionRegistration, ExperimentalSidebarFooterDisclosureController, ExperimentalSidebarFooterDisclosureProps, ExperimentalSidebarFooterDisclosureRegistration, ExperimentalSidebarFooterItemBase, ExperimentalSidebarFooterItemRegistration, ExperimentalSidebarHeaderProps, ExperimentalSidebarHeaderRegistration, ExperimentalSidebarNavigationAction, ExperimentalSidebarNavigationActions, ExperimentalSidebarNavigationActivationOptions, ExperimentalSidebarNavigationIcon, ExperimentalSidebarNavigationIconProps, ExperimentalSidebarNavigationItem, ExperimentalSidebarNavigationProps, ExperimentalSidebarNavigationRegistration, ExperimentalSidebarNavigationShortcut, ExperimentalSidebarNavigationSplit, ExperimentalSidebarNavigationSplitOptions, ExperimentalSidebarNavigationState, JsonValue, MachineBootstrapApi, MachineBootstrapRequest, MachineExecutor, MachineExecutorRequest, MarkdownProps, MessageDispatchHookContext, MessageDispatchHookDecision, NewThreadComposerProps, NewThreadRequest, PluginAgentConfiguration, PluginAgentConfigurationContext, PluginAgentToolContentPart, PluginAgentToolContext, PluginAgentToolRegistrationBase, PluginAgentToolResult, PluginAgentToolSelection, PluginAgents, PluginAiCompleteOptions, PluginAiServiceDeclaration, PluginAiServiceStatus, PluginAiServices, PluginAiTranscribeOptions, PluginAppBuilder, PluginAppCommands, PluginAppComposer, PluginAppContentScripts, PluginAppDefinition, PluginAppSetup, PluginAppSlots, PluginBackground, PluginBbSdk, PluginBoundThreadsArea, PluginBrowserBbSdk, PluginCli, PluginCliBooleanOption, PluginCliCommand, PluginCliCommandInfo, PluginCliConstraint, PluginCliContext, PluginCliDurationOption, PluginCliDurationUnit, PluginCliEnumOption, PluginCliErrorCode, PluginCliExecutionResult, PluginCliIntegerOption, PluginCliOption, PluginCliOptionValues, PluginCliOutputLimitError, PluginCliPositional, PluginCliPositionalValues, PluginCliRegistration, PluginCliResult, PluginCliRunInput, PluginCliSpec, PluginCliStringOption, PluginCodeThemeData, PluginCodeThemeState, PluginCodeThemeTokenRule, PluginCommandContext, PluginCommandRegistration, PluginCommandShortcut, PluginComposerApi, PluginComposerMention, PluginComposerScope, PluginComposerTextEffect, PluginComposerThreadRowStatus, PluginContentScriptContext, PluginContentScriptDisposer, PluginContentScriptRegistration, PluginDiffRendererProps, PluginDiffRendererRegistration, PluginDispatchAttemptKind, PluginDispatchEnvironmentIntent, PluginDispatchExecution, PluginDispatchExecutionSources, PluginDispatchInput, PluginEnvironmentProvider, PluginEnvironmentProviderDeclaration, PluginEnvironmentProviderInputsChange, PluginEnvironmentProviderInputsProps, PluginEnvironmentProviderInputsRegistration, PluginEnvironmentProviderRequirements, PluginEnvironmentProvidersState, PluginEnvironmentValidateDecision, PluginEnvironments, PluginEvents, PluginFileOpenerProps, PluginFileOpenerRegistration, PluginFileOpenerSource, PluginFixedTabDeclaration, PluginFixedTabRegistration, PluginHomepageSectionProps, PluginHomepageSectionRegistration, PluginHookHandler, PluginHookName, PluginHookSignatures, PluginHooks, PluginHosts, PluginHttp, PluginHttpAuthMode, PluginHttpHandler, PluginInteractionCancelReason, PluginInteractionDescription, PluginInteractionRequest, PluginInteractionResult, PluginKvStorage, PluginLogger, PluginMachineProviderDeclaration, PluginMachineProviderInputsChange, PluginMachineProviderInputsProps, PluginMachineProviderInputsRegistration, PluginMachineValidateDecision, PluginMachines, PluginMentionItem, PluginMentionProviderRegistration, PluginMentionSearchContext, PluginMentionTrigger, PluginMessageActionContext, PluginMessageActionRegistration, PluginMessageDirectiveMessage, PluginMessageDirectiveOpenWorkspaceFile, PluginMessageDirectiveProps, PluginMessageDirectiveRegistration, PluginNavPanelProps, PluginNavPanelRegistration, PluginNewThreadPanelActionContext, PluginNewThreadPanelActionRegistration, PluginNewThreadPanelProps, PluginPanelActionOpenOptions, PluginPendingInteractionProps, PluginPendingInteractionRegistration, PluginPendingInteractionView, PluginProviderCapabilities, PluginProviderCompletedTurnDisplay, PluginProviderComposerAction, PluginProviderDeclaration, PluginProviderExtensionKindDeclaration, PluginProviderFallbackModel, PluginProviderIconRegistration, PluginProviderMaintenance, PluginProviderModelCatalogScope, PluginProviderNativeRootEntry, PluginProviderNativeRoots, PluginProviderOptionDescriptor, PluginProviderOptionsContext, PluginProviderPermissionMode, PluginProviderReasoningLevel, PluginProviderStrings, PluginProviders, PluginProvidersState, PluginRealtime, PluginRealtimeConnectionState, PluginRowLabels, PluginRowPresentation, PluginRpc, PluginRpcCallArgs, PluginRpcClient, PluginRpcContract, PluginRpcError, PluginRpcErrorCode, PluginRpcHandlers, PluginRpcIssuePathSegment, PluginRpcMethodContract, PluginRpcResult, PluginRpcValidationIssue, PluginSdkApp, PluginServerAccess, PluginServerApi, PluginSettingDescriptor, PluginSettingDescriptors, PluginSettingValue, PluginSettings, PluginSettingsHandle, PluginSettingsSectionProps, PluginSettingsSectionRegistration, PluginSettingsState, PluginSettingsValues, PluginSharedPortTunnelIdentity, PluginSidebarFooterActionContext, PluginSidebarFooterActionProps, PluginSidebarFooterActionRegistration, PluginSidebarProject, PluginSidebarPullRequest, PluginSidebarSection, PluginSidebarSplitLayout, PluginSidebarSplitPane, PluginSidebarThread, PluginSidebarThreadActions, PluginSidebarThreadActivity, PluginSidebarThreadDraftState, PluginSidebarThreadIndicator, PluginSidebarThreadPullRequestState, PluginSidebarThreadRowStatus, PluginSidebarThreadShortcut, PluginSidebarThreadSplit, PluginSidebarThreadsState, PluginSourceCodeRendererProps, PluginSourceCodeRendererRegistration, PluginStatusApi, PluginStorage, PluginTargetedPanelActionOpenOptions, PluginThreadEventHandler, PluginThreadEventName, PluginThreadEventPayloads, PluginThreadHeaderActionProps, PluginThreadHeaderActionRegistration, PluginThreadListProps, PluginThreadListRegistration, PluginThreadPanelActionContext, PluginThreadPanelActionRegistration, PluginThreadPanelProps, PluginThreadTitleProps, PluginTimelineRendererProps, PluginTimelineRendererRegistration, PluginTimelineRendererRow, PluginTimelineRowPresentation, PluginTimelineRowStatus, PluginTurnFailedEvent, PluginUi, ReadonlyJsonValue, ServerAccessGrant, ServerAccessProviderDeclaration, SourceCodeLineRange, SourceCodeProps, StandardSchemaV1, StandardSchemaV1InferInput, StandardSchemaV1InferOutput, StandardSchemaV1Issue, StandardSchemaV1Result, ThreadChatMessageAction, ThreadChatMessageReference, ThreadChatProps, UrlLinkProps, UseBranchesArgs, UseCheckoutStateArgs };
22713
+ export type { BbContext, BbNavigate, BbPluginApi, BranchPickerProps, BranchesState, CheckoutState, CodeOverflowMode, ComposerAttachment, ComposerCustomization, ComposerDraft, ComposerDraftReplacement, ComposerDraftSnapshot, ComposerInsertOptions, ComposerInsertPart, ComposerMention, ComposerPlusMenuItem, ComposerRichTextSpec, ComposerSelection, ComposerSendMenuItem, ComposerSubmitOptions, DiffProps, DiffViewMode, ExperimentalAppIcons, ExperimentalAppOverlayProps, ExperimentalAppOverlayRegistration, ExperimentalAppPanel, ExperimentalAppPanelSurface, ExperimentalDesktopBrowserAcquireInput, ExperimentalDesktopBrowserCreateInput, ExperimentalDesktopBrowserLease, ExperimentalDesktopBrowserScope, ExperimentalDesktopBrowsersArea, ExperimentalDiffFileContent, ExperimentalDiffFullFileContents, ExperimentalFileLinkProps, ExperimentalFileLocation, ExperimentalFileOpenOptions, ExperimentalFixedTabTargetContract, ExperimentalFixedTabTargetState, ExperimentalHostCallOptions, ExperimentalHostClient, ExperimentalHostEntry, ExperimentalHostPaths, ExperimentalHostRpcContext, ExperimentalHostRpcHandlers, ExperimentalHostSignalContract, ExperimentalHostSignalEvent, ExperimentalHostSignals, ExperimentalHostWatchChange, ExperimentalHostWatchChangeType, ExperimentalHostWatchEvent, ExperimentalHostWatchListener, ExperimentalHostWatchOptions, ExperimentalHostWatchSubscription, ExperimentalHostWorkerLease, ExperimentalIconProps, ExperimentalIconRegistration, ExperimentalLiveFileTarget, ExperimentalOpenFixedTabOptions, ExperimentalPermissionModePickerProps, ExperimentalPluginBrowserPage, ExperimentalPluginBrowserPageEvaluateOptions, ExperimentalPluginBrowserPageWorld, ExperimentalPluginBrowserToolbarActionProps, ExperimentalPluginBrowserToolbarActionRegistration, ExperimentalPluginFixedTabReference, ExperimentalPluginMentionImage, ExperimentalPluginProviderEnvContext, ExperimentalPluginProviderEnvEntry, ExperimentalPluginProviderEnvHealth, ExperimentalPluginProviderEnvHealthContext, ExperimentalPluginRpcCaller, ExperimentalPluginRpcHandlerContext, ExperimentalPluginRpcHandlersWithContext, ExperimentalPluginWebSocket, ExperimentalPluginWebSocketContext, ExperimentalPluginWebSocketHandler, ExperimentalPluginWebSocketHandlers, ExperimentalProviderIconProps, ExperimentalProviderModelPickerProps, ExperimentalProviderModelPickerRouting, ExperimentalProviderModelPickerValue, ExperimentalQuestionFormHost, ExperimentalQuestionShortcut, ExperimentalSidebarFooter, ExperimentalSidebarFooterActionContext, ExperimentalSidebarFooterActionRegistration, ExperimentalSidebarFooterDisclosureController, ExperimentalSidebarFooterDisclosureProps, ExperimentalSidebarFooterDisclosureRegistration, ExperimentalSidebarFooterItemBase, ExperimentalSidebarFooterItemRegistration, ExperimentalSidebarHeaderProps, ExperimentalSidebarHeaderRegistration, ExperimentalSidebarNavigationAction, ExperimentalSidebarNavigationActions, ExperimentalSidebarNavigationActivationOptions, ExperimentalSidebarNavigationIcon, ExperimentalSidebarNavigationIconProps, ExperimentalSidebarNavigationItem, ExperimentalSidebarNavigationProps, ExperimentalSidebarNavigationRegistration, ExperimentalSidebarNavigationShortcut, ExperimentalSidebarNavigationSplit, ExperimentalSidebarNavigationSplitOptions, ExperimentalSidebarNavigationState, JsonValue, MachineBootstrapApi, MachineBootstrapRequest, MachineExecutor, MachineExecutorRequest, MarkdownProps, MessageDispatchHookContext, MessageDispatchHookDecision, NewThreadComposerProps, NewThreadRequest, PluginAgentConfiguration, PluginAgentConfigurationContext, PluginAgentToolContentPart, PluginAgentToolContext, PluginAgentToolRegistrationBase, PluginAgentToolResult, PluginAgentToolSelection, PluginAgents, PluginAiCompleteOptions, PluginAiServiceDeclaration, PluginAiServiceStatus, PluginAiServices, PluginAiTranscribeOptions, PluginAppBuilder, PluginAppCommands, PluginAppComposer, PluginAppContentScripts, PluginAppDefinition, PluginAppSetup, PluginAppSlots, PluginBackground, PluginBbSdk, PluginBoundThreadsArea, PluginBrowserBbSdk, PluginCli, PluginCliBooleanOption, PluginCliCommand, PluginCliCommandInfo, PluginCliConstraint, PluginCliContext, PluginCliDurationOption, PluginCliDurationUnit, PluginCliEnumOption, PluginCliErrorCode, PluginCliExecutionResult, PluginCliIntegerOption, PluginCliOption, PluginCliOptionValues, PluginCliOutputLimitError, PluginCliPositional, PluginCliPositionalValues, PluginCliRegistration, PluginCliResult, PluginCliRunInput, PluginCliSpec, PluginCliStringOption, PluginCodeThemeData, PluginCodeThemeState, PluginCodeThemeTokenRule, PluginCommandContext, PluginCommandRegistration, PluginCommandShortcut, PluginComposerApi, PluginComposerMention, PluginComposerScope, PluginComposerTextEffect, PluginComposerThreadRowStatus, PluginContentScriptContext, PluginContentScriptDisposer, PluginContentScriptRegistration, PluginDiffRendererProps, PluginDiffRendererRegistration, PluginDispatchAttemptKind, PluginDispatchEnvironmentIntent, PluginDispatchExecution, PluginDispatchExecutionSources, PluginDispatchInput, PluginEnvironmentProvider, PluginEnvironmentProviderDeclaration, PluginEnvironmentProviderInputsChange, PluginEnvironmentProviderInputsProps, PluginEnvironmentProviderInputsRegistration, PluginEnvironmentProviderRequirements, PluginEnvironmentProvidersState, PluginEnvironmentValidateDecision, PluginEnvironments, PluginEvents, PluginFileOpenerProps, PluginFileOpenerRegistration, PluginFileOpenerSource, PluginFixedTabDeclaration, PluginFixedTabRegistration, PluginHomepageSectionProps, PluginHomepageSectionRegistration, PluginHookHandler, PluginHookName, PluginHookSignatures, PluginHooks, PluginHosts, PluginHttp, PluginHttpAuthMode, PluginHttpHandler, PluginInteractionCancelReason, PluginInteractionDescription, PluginInteractionRequest, PluginInteractionResult, PluginKvStorage, PluginLogger, PluginMachineProviderDeclaration, PluginMachineProviderInputsChange, PluginMachineProviderInputsProps, PluginMachineProviderInputsRegistration, PluginMachineValidateDecision, PluginMachines, PluginMentionItem, PluginMentionProviderRegistration, PluginMentionSearchContext, PluginMentionTrigger, PluginMessageActionContext, PluginMessageActionRegistration, PluginMessageDirectiveMessage, PluginMessageDirectiveOpenWorkspaceFile, PluginMessageDirectiveProps, PluginMessageDirectiveRegistration, PluginNavPanelProps, PluginNavPanelRegistration, PluginNewThreadPanelActionContext, PluginNewThreadPanelActionRegistration, PluginNewThreadPanelProps, PluginPanelActionOpenOptions, PluginPendingInteractionProps, PluginPendingInteractionRegistration, PluginPendingInteractionView, PluginProviderCapabilities, PluginProviderCompletedTurnDisplay, PluginProviderComposerAction, PluginProviderDeclaration, PluginProviderExtensionKindDeclaration, PluginProviderFallbackModel, PluginProviderIconRegistration, PluginProviderMaintenance, PluginProviderModelCatalogScope, PluginProviderNativeRootEntry, PluginProviderNativeRoots, PluginProviderOptionDescriptor, PluginProviderOptionsContext, PluginProviderPermissionMode, PluginProviderReasoningLevel, PluginProviderStrings, PluginProviders, PluginProvidersState, PluginRealtime, PluginRealtimeConnectionState, PluginRowLabels, PluginRowPresentation, PluginRpc, PluginRpcCallArgs, PluginRpcClient, PluginRpcContract, PluginRpcError, PluginRpcErrorCode, PluginRpcHandlers, PluginRpcIssuePathSegment, PluginRpcMethodContract, PluginRpcResult, PluginRpcValidationIssue, PluginSdkApp, PluginServerAccess, PluginServerApi, PluginSettingDescriptor, PluginSettingDescriptors, PluginSettingValue, PluginSettings, PluginSettingsHandle, PluginSettingsSectionProps, PluginSettingsSectionRegistration, PluginSettingsState, PluginSettingsValues, PluginSharedPortTunnelIdentity, PluginSidebarFooterActionContext, PluginSidebarFooterActionProps, PluginSidebarFooterActionRegistration, PluginSidebarProject, PluginSidebarPullRequest, PluginSidebarSection, PluginSidebarSplitLayout, PluginSidebarSplitPane, PluginSidebarThread, PluginSidebarThreadActions, PluginSidebarThreadActivity, PluginSidebarThreadDraftState, PluginSidebarThreadIndicator, PluginSidebarThreadPullRequestState, PluginSidebarThreadRowStatus, PluginSidebarThreadShortcut, PluginSidebarThreadSplit, PluginSidebarThreadsState, PluginSourceCodeRendererProps, PluginSourceCodeRendererRegistration, PluginStatusApi, PluginStorage, PluginTargetedPanelActionOpenOptions, PluginThreadEventHandler, PluginThreadEventName, PluginThreadEventPayloads, PluginThreadHeaderActionProps, PluginThreadHeaderActionRegistration, PluginThreadListProps, PluginThreadListRegistration, PluginThreadPanelActionContext, PluginThreadPanelActionRegistration, PluginThreadPanelProps, PluginThreadTitleProps, PluginTimelineRendererProps, PluginTimelineRendererRegistration, PluginTimelineRendererRow, PluginTimelineRowPresentation, PluginTimelineRowStatus, PluginTurnFailedEvent, PluginUi, ReadonlyJsonValue, ServerAccessGrant, ServerAccessProviderDeclaration, SourceCodeLineRange, SourceCodeProps, StandardSchemaV1, StandardSchemaV1InferInput, StandardSchemaV1InferOutput, StandardSchemaV1Issue, StandardSchemaV1Result, ThreadChatMessageAction, ThreadChatMessageReference, ThreadChatProps, UrlLinkProps, UseBranchesArgs, UseCheckoutStateArgs };