@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.
@@ -285,6 +285,11 @@ declare const appKeybindingOverridesSchema: z$1.ZodArray<z$1.ZodObject<{
285
285
  "window.new": "window.new";
286
286
  "workspace.openPreferred": "workspace.openPreferred";
287
287
  }>, z$1.ZodTemplateLiteral<`plugin:${string}/${string}`>]>;
288
+ platform: z$1.ZodOptional<z$1.ZodEnum<{
289
+ linux: "linux";
290
+ mac: "mac";
291
+ windows: "windows";
292
+ }>>;
288
293
  shortcut: z$1.ZodNullable<z$1.ZodObject<{
289
294
  alt: z$1.ZodBoolean;
290
295
  control: z$1.ZodBoolean;
@@ -528,6 +533,7 @@ declare const environmentSchema: z$1.ZodObject<{
528
533
  type Environment = z$1.infer<typeof environmentSchema>;
529
534
 
530
535
  declare const experimentsSchema: z$1.ZodRecord<z$1.ZodEnum<{
536
+ androidTesting: "androidTesting";
531
537
  changelogPreview: "changelogPreview";
532
538
  legacyJitiPluginLoader: "legacyJitiPluginLoader";
533
539
  mobileApp: "mobileApp";
@@ -10132,6 +10138,7 @@ declare const systemConfigResponseSchema: z$1.ZodObject<{
10132
10138
  all: z$1.ZodArray<z$1.ZodEnum<{
10133
10139
  browserFocus: "browserFocus";
10134
10140
  editableFocus: "editableFocus";
10141
+ linuxPlatform: "linuxPlatform";
10135
10142
  macPlatform: "macPlatform";
10136
10143
  mainSurface: "mainSurface";
10137
10144
  modalOpen: "modalOpen";
@@ -10141,10 +10148,12 @@ declare const systemConfigResponseSchema: z$1.ZodObject<{
10141
10148
  splitActive: "splitActive";
10142
10149
  terminalFocus: "terminalFocus";
10143
10150
  webSurface: "webSurface";
10151
+ windowsPlatform: "windowsPlatform";
10144
10152
  }>>;
10145
10153
  none: z$1.ZodArray<z$1.ZodEnum<{
10146
10154
  browserFocus: "browserFocus";
10147
10155
  editableFocus: "editableFocus";
10156
+ linuxPlatform: "linuxPlatform";
10148
10157
  macPlatform: "macPlatform";
10149
10158
  mainSurface: "mainSurface";
10150
10159
  modalOpen: "modalOpen";
@@ -10154,10 +10163,12 @@ declare const systemConfigResponseSchema: z$1.ZodObject<{
10154
10163
  splitActive: "splitActive";
10155
10164
  terminalFocus: "terminalFocus";
10156
10165
  webSurface: "webSurface";
10166
+ windowsPlatform: "windowsPlatform";
10157
10167
  }>>;
10158
10168
  }, z$1.core.$strict>;
10159
10169
  }, z$1.core.$strict>>;
10160
10170
  experiments: z$1.ZodRecord<z$1.ZodEnum<{
10171
+ androidTesting: "androidTesting";
10161
10172
  changelogPreview: "changelogPreview";
10162
10173
  legacyJitiPluginLoader: "legacyJitiPluginLoader";
10163
10174
  mobileApp: "mobileApp";
@@ -10266,6 +10277,11 @@ declare const systemConfigResponseSchema: z$1.ZodObject<{
10266
10277
  "window.new": "window.new";
10267
10278
  "workspace.openPreferred": "workspace.openPreferred";
10268
10279
  }>, z$1.ZodTemplateLiteral<`plugin:${string}/${string}`>]>;
10280
+ platform: z$1.ZodOptional<z$1.ZodEnum<{
10281
+ linux: "linux";
10282
+ mac: "mac";
10283
+ windows: "windows";
10284
+ }>>;
10269
10285
  shortcut: z$1.ZodNullable<z$1.ZodObject<{
10270
10286
  alt: z$1.ZodBoolean;
10271
10287
  control: z$1.ZodBoolean;
@@ -10366,6 +10382,7 @@ declare const systemConfigResponseSchema: z$1.ZodObject<{
10366
10382
  all: z$1.ZodArray<z$1.ZodEnum<{
10367
10383
  browserFocus: "browserFocus";
10368
10384
  editableFocus: "editableFocus";
10385
+ linuxPlatform: "linuxPlatform";
10369
10386
  macPlatform: "macPlatform";
10370
10387
  mainSurface: "mainSurface";
10371
10388
  modalOpen: "modalOpen";
@@ -10375,10 +10392,12 @@ declare const systemConfigResponseSchema: z$1.ZodObject<{
10375
10392
  splitActive: "splitActive";
10376
10393
  terminalFocus: "terminalFocus";
10377
10394
  webSurface: "webSurface";
10395
+ windowsPlatform: "windowsPlatform";
10378
10396
  }>>;
10379
10397
  none: z$1.ZodArray<z$1.ZodEnum<{
10380
10398
  browserFocus: "browserFocus";
10381
10399
  editableFocus: "editableFocus";
10400
+ linuxPlatform: "linuxPlatform";
10382
10401
  macPlatform: "macPlatform";
10383
10402
  mainSurface: "mainSurface";
10384
10403
  modalOpen: "modalOpen";
@@ -10388,6 +10407,7 @@ declare const systemConfigResponseSchema: z$1.ZodObject<{
10388
10407
  splitActive: "splitActive";
10389
10408
  terminalFocus: "terminalFocus";
10390
10409
  webSurface: "webSurface";
10410
+ windowsPlatform: "windowsPlatform";
10391
10411
  }>>;
10392
10412
  }, z$1.core.$strict>;
10393
10413
  }, z$1.core.$strict>>;
@@ -10655,6 +10675,27 @@ declare const systemMachineProviderSchema: z$1.ZodObject<{
10655
10675
  supportsSuspend: z$1.ZodBoolean;
10656
10676
  }, z$1.core.$strip>;
10657
10677
  type SystemMachineProvider = z$1.infer<typeof systemMachineProviderSchema>;
10678
+ declare const androidAppArtifactSchema: z$1.ZodObject<{
10679
+ sha256: z$1.ZodString;
10680
+ size: z$1.ZodNumber;
10681
+ version: z$1.ZodString;
10682
+ versionCode: z$1.ZodNumber;
10683
+ }, z$1.core.$strip>;
10684
+ type AndroidAppArtifact = z$1.infer<typeof androidAppArtifactSchema>;
10685
+ type SystemAndroidAppResponse = AndroidAppArtifact | null;
10686
+ declare const androidAppPrepareRequestSchema: z$1.ZodObject<{
10687
+ source: z$1.ZodEnum<{
10688
+ github: "github";
10689
+ local: "local";
10690
+ }>;
10691
+ }, z$1.core.$strip>;
10692
+ type AndroidAppPrepareRequest = z$1.infer<typeof androidAppPrepareRequestSchema>;
10693
+ interface AndroidAppPreparation {
10694
+ status: "failed" | "idle" | "preparing" | "ready";
10695
+ source: "github" | "local" | null;
10696
+ message: string;
10697
+ artifact: AndroidAppArtifact | null;
10698
+ }
10658
10699
 
10659
10700
  interface UiPreferencesResponse {
10660
10701
  preferences: UiPreferenceEntries;
@@ -12136,6 +12177,7 @@ declare const createThreadRequestSchema: z$1.ZodObject<{
12136
12177
  auto: "auto";
12137
12178
  full: "full";
12138
12179
  }>, z$1.ZodLiteral<"workspace-write">]>, z$1.ZodTransform<"accept-edits" | "auto" | "full", "accept-edits" | "auto" | "full" | "workspace-write">>>;
12180
+ pinned: z$1.ZodOptional<z$1.ZodBoolean>;
12139
12181
  pluginMetadata: z$1.ZodOptional<z$1.ZodType<JsonObject, unknown, z$1.core.$ZodTypeInternals<JsonObject, unknown>>>;
12140
12182
  pluginSubmission: z$1.ZodOptional<z$1.ZodObject<{
12141
12183
  data: z$1.ZodType<JsonValue, unknown, z$1.core.$ZodTypeInternals<JsonValue, unknown>>;
@@ -15460,6 +15502,9 @@ interface EnvironmentListProvidersArgs {
15460
15502
  }
15461
15503
  type EnvironmentListProvidersResult = SystemEnvironmentProvider[];
15462
15504
  interface EnvironmentsArea {
15505
+ experimental_cleanup(args: EnvironmentActionArgs): Promise<{
15506
+ ok: true;
15507
+ }>;
15463
15508
  archiveThreads(args: EnvironmentActionArgs): Promise<EnvironmentArchiveThreadsResult>;
15464
15509
  commit(args: EnvironmentCommitArgs): Promise<EnvironmentCommitResult>;
15465
15510
  diff(args: EnvironmentDiffArgs): Promise<EnvironmentDiffResult>;
@@ -15609,6 +15654,7 @@ type HostDeleteResult = {
15609
15654
  type HostDirectoryResult = HostDirectoryListing;
15610
15655
  type HostGetResult = Host & {
15611
15656
  connectMachineId: string | null;
15657
+ threadStorageRootPath: string | null;
15612
15658
  };
15613
15659
  type HostEnrollmentCommandResult = HostEnrollmentCommandResponse;
15614
15660
  type HostReconnectResult = HostReconnectResponse;
@@ -16279,6 +16325,9 @@ interface SystemArea {
16279
16325
  testAiService(args: SystemTestAiServiceArgs): Promise<SystemTestAiServiceResult>;
16280
16326
  transcribeVoice(args: SystemVoiceTranscriptionArgs): Promise<SystemVoiceTranscriptionResult>;
16281
16327
  uiPreferences: SystemUiPreferencesArea;
16328
+ androidAppPreparation(): Promise<AndroidAppPreparation>;
16329
+ prepareAndroidApp(input: AndroidAppPrepareRequest): Promise<AndroidAppPreparation>;
16330
+ androidApp(): Promise<SystemAndroidAppResponse>;
16282
16331
  updateExperiments(args: Experiments): Promise<SystemUpdateExperimentsResult>;
16283
16332
  updateGeneralSettings(args: AppSettingsUpdate): Promise<SystemUpdateGeneralSettingsResult>;
16284
16333
  updateKeyboardSettings(args: AppKeybindingOverrides): Promise<SystemUpdateKeyboardSettingsResult>;
@@ -16988,7 +17037,7 @@ type ExperimentalSidebarNavigationAction = {
16988
17037
  /**
16989
17038
  * Semantic icon identity for one sidebar navigation item. Render it with
16990
17039
  * {@link PluginSdkApp.experimental_SidebarNavigationIcon} to match bb's
16991
- * artwork, including plugin branding.
17040
+ * artwork, including panel icons with plugin branding as their fallback.
16992
17041
  */
16993
17042
  type ExperimentalSidebarNavigationIcon = {
16994
17043
  kind: "host";
@@ -17514,6 +17563,7 @@ type ExperimentalPluginFixedTabReference<Target extends JsonValue$1 = never> = {
17514
17563
  /** A fixed tab declared by a plugin nav panel. */
17515
17564
  type PluginFixedTabRegistration<Target extends JsonValue$1 = never> = ExperimentalPluginFixedTabReference<Target> & {
17516
17565
  title: string;
17566
+ /** Resolved names take precedence over plugin branding; unknown names fall back to branding. */
17517
17567
  icon: BbIconName;
17518
17568
  component: ComponentType<PluginNavPanelProps>;
17519
17569
  /** `flush` lets the component own padding and scrolling. */
@@ -17525,6 +17575,7 @@ interface PluginNavPanelRegistration {
17525
17575
  /** Unique within the plugin; letters, digits, `-`, `_`. */
17526
17576
  id: string;
17527
17577
  title: string;
17578
+ /** Resolved names take precedence over plugin branding in navigation and the header; unknown names fall back to branding. */
17528
17579
  icon: BbIconName;
17529
17580
  /** URL segment under `/plugins/<pluginId>/`; letters, digits, `-`, `_`. */
17530
17581
  path: string;
@@ -17608,8 +17659,8 @@ interface PluginThreadPanelActionRegistration {
17608
17659
  /** Label of the action row in the panel's new-tab launcher. */
17609
17660
  title: string;
17610
17661
  /**
17611
- * Drawn only when the manifest declares no `bb.branding.icon`; the launcher
17612
- * row and opened tabs prefer that over this hint.
17662
+ * Resolved names take precedence over plugin branding in the launcher and
17663
+ * opened tabs. Omitted or unknown names fall back to plugin branding.
17613
17664
  */
17614
17665
  icon?: BbIconName;
17615
17666
  /** Rendered inside every panel tab this action opens. */
@@ -17648,7 +17699,7 @@ interface PluginNewThreadPanelActionRegistration {
17648
17699
  id: string;
17649
17700
  /** Label of the action row in the panel's new-tab launcher. */
17650
17701
  title: string;
17651
- /** Drawn only when the manifest declares no `bb.branding.icon`. */
17702
+ /** Resolved names take precedence over plugin branding; omitted or unknown names fall back to branding. */
17652
17703
  icon?: BbIconName;
17653
17704
  /** Rendered inside every panel tab this action opens. */
17654
17705
  component: ComponentType<PluginNewThreadPanelProps>;
@@ -17693,7 +17744,7 @@ interface PluginSidebarFooterActionRegistration {
17693
17744
  id: string;
17694
17745
  /** Tooltip and accessible label for the icon button. */
17695
17746
  title: string;
17696
- /** Drawn only when the manifest declares no `bb.branding.icon`. */
17747
+ /** Resolved names take precedence over plugin branding; omitted or unknown names fall back to branding. */
17697
17748
  icon: BbIconName;
17698
17749
  /**
17699
17750
  * Runs when the user activates the action (e.g. call `openSettings()`,
@@ -18078,7 +18129,7 @@ interface PluginSidebarThreadDraftState {
18078
18129
  }
18079
18130
  /**
18080
18131
  * The status another plugin's app-wide script set on a thread's row through
18081
- * `useComposer().experimental_setThreadRowStatus` (see
18132
+ * the content-script context's `experimental_setThreadRowStatus` (see
18082
18133
  * {@link PluginSdkApp.useSidebarThreadRowStatus}). bb's row draws it in
18083
18134
  * place of the draft glyph while it is set; a replaced list should do the
18084
18135
  * same so a status set by, say, the drafts or workflows plugin does not
@@ -18118,6 +18169,9 @@ interface PluginSidebarThreadActions {
18118
18169
  * `sectionId` files the new thread under that section, and
18119
18170
  * `environmentId` reuses that environment (the "New thread in
18120
18171
  * environment" affordance), both exactly as bb's own list does.
18172
+ * `experimental_placement` explicitly selects the section and pin state,
18173
+ * overriding `sectionId`. Omitting placement starts unpinned, outside sections
18174
+ * unless `sectionId` is supplied; previous composer placement is cleared.
18121
18175
  * `hostId` selects a machine for a new environment when it
18122
18176
  * is known and supports an environment provider. `environmentId` wins when
18123
18177
  * both are supplied.
@@ -18125,6 +18179,10 @@ interface PluginSidebarThreadActions {
18125
18179
  openNewThread(options?: {
18126
18180
  projectId?: string;
18127
18181
  sectionId?: string;
18182
+ experimental_placement?: {
18183
+ sectionId: string | null;
18184
+ pinned: boolean;
18185
+ };
18128
18186
  environmentId?: string;
18129
18187
  hostId?: string;
18130
18188
  focusPrompt?: boolean;
@@ -18413,12 +18471,19 @@ interface PluginMessageActionContext {
18413
18471
  * is never thrown: the host logs it and reports it here.
18414
18472
  */
18415
18473
  openPanel(options: PluginTargetedPanelActionOpenOptions): boolean;
18474
+ /**
18475
+ * The composer of the thread the message is in, or null when that thread's
18476
+ * composer is not available on this surface. The same handle
18477
+ * `useComposer()` returns there.
18478
+ */
18479
+ composer: PluginComposerApi | null;
18416
18480
  }
18417
18481
  /**
18418
18482
  * An action on chat messages: an icon button in the per-message action bar
18419
18483
  * (user and assistant messages) and an entry in the assistant-message
18420
18484
  * text-selection menu. Host-rendered chrome — the plugin supplies title,
18421
- * icon hint, and `run` behavior only.
18485
+ * icon, and `run` behavior only. Resolved icon names take precedence over
18486
+ * plugin branding; omitted or unknown names fall back to branding.
18422
18487
  */
18423
18488
  interface PluginMessageActionRegistration {
18424
18489
  /** Unique within the plugin; letters, digits, `-`, `_`. */
@@ -18928,12 +18993,6 @@ type PluginComposerScope = {
18928
18993
  kind: "queued-message";
18929
18994
  threadId: string;
18930
18995
  queuedMessageId: string;
18931
- } | {
18932
- kind: "side-chat";
18933
- projectId: string;
18934
- parentThreadId: string;
18935
- tabId: string;
18936
- childThreadId: string | null;
18937
18996
  } | {
18938
18997
  kind: "new-thread";
18939
18998
  /** Root compose's effective selected project; null only while unresolved. */
@@ -18956,35 +19015,39 @@ interface ComposerCustomization {
18956
19015
  component: ComponentType;
18957
19016
  }[];
18958
19017
  plusMenu?: readonly ComposerPlusMenuItem[];
19018
+ /** Host-rendered rows in the menu next to the composer's send button. */
19019
+ sendMenu?: readonly ComposerSendMenuItem[];
18959
19020
  richText?: ComposerRichTextSpec;
18960
19021
  }
18961
19022
  /** Host-rendered menu row in the composer's `+` menu. */
18962
19023
  interface ComposerPlusMenuItem {
18963
19024
  id: string;
18964
19025
  label: string;
18965
- /** Drawn only when the manifest declares no `bb.branding.icon`. */
19026
+ /** Takes precedence over the plugin's `bb.branding.icon`, which is drawn when this is omitted. */
18966
19027
  icon?: BbIconName;
18967
19028
  /** Accessible description for the host-rendered row. */
18968
19029
  description?: string;
18969
- disabled?: boolean | ((view: ComposerView) => boolean);
19030
+ disabled?: boolean | ((composer: PluginComposerApi) => boolean);
18970
19031
  run(context: {
18971
19032
  composer: PluginComposerApi;
18972
- view: ComposerView;
18973
19033
  }): void | Promise<void>;
18974
19034
  }
18975
- /** Reactive read-side of the composer a plugin surface is mounted in. */
18976
- interface ComposerView {
18977
- scope: PluginComposerScope;
18978
- layout: "compact" | "expanded" | "zen";
18979
- draft: {
18980
- text: string;
18981
- isEmpty: boolean;
18982
- attachmentCount: number;
18983
- };
18984
- run: {
18985
- isRunning: boolean;
18986
- isSubmitting: boolean;
18987
- };
19035
+ /**
19036
+ * Host-rendered row in the menu next to the composer's send button, for
19037
+ * alternatives to sending right away (save as a draft, send later). The menu
19038
+ * shows only while the composer can submit.
19039
+ */
19040
+ interface ComposerSendMenuItem {
19041
+ id: string;
19042
+ label: string;
19043
+ /** Takes precedence over the plugin's `bb.branding.icon`, which is drawn when this is omitted. */
19044
+ icon?: BbIconName;
19045
+ /** Accessible description for the host-rendered row. */
19046
+ description?: string;
19047
+ disabled?: boolean | ((composer: PluginComposerApi) => boolean);
19048
+ run(context: {
19049
+ composer: PluginComposerApi;
19050
+ }): void | Promise<void>;
18988
19051
  }
18989
19052
  interface ComposerRichTextSpec {
18990
19053
  /** Content-derived paint: match ranges receive `className`; text is never mutated. */
@@ -18997,18 +19060,80 @@ interface ComposerRichTextSpec {
18997
19060
  }[];
18998
19061
  className: string;
18999
19062
  }[];
19000
- /** Debounced, read-only observation of the structured draft. */
19001
- onDraftChange?(draft: ComposerStructuredDraft, view: ComposerView): void;
19002
19063
  }
19003
- interface ComposerStructuredDraft {
19064
+ /** The composer's text and the @-mention pills in it. */
19065
+ interface ComposerDraft {
19004
19066
  text: string;
19005
- mentions: readonly {
19006
- from: number;
19007
- to: number;
19008
- provider: string;
19009
- id: string;
19010
- label: string;
19011
- }[];
19067
+ mentions: readonly ComposerMention[];
19068
+ }
19069
+ /** An already uploaded attachment; paths retain their original project or thread ownership. */
19070
+ type ComposerAttachment = UploadedPromptAttachment;
19071
+ /** The complete current draft. Snapshots and their entries are immutable. */
19072
+ interface ComposerDraftSnapshot extends ComposerDraft {
19073
+ readonly attachments: readonly ComposerAttachment[];
19074
+ }
19075
+ /** Atomic text and mention replacement, optionally replacing uploaded attachments too. */
19076
+ interface ComposerDraftReplacement extends ComposerDraft {
19077
+ /** Omit to preserve attachments; supply an empty array to remove them all. Does not upload or copy files. */
19078
+ attachments?: readonly ComposerAttachment[];
19079
+ }
19080
+ /**
19081
+ * One @-mention pill: its range in `ComposerDraft.text` plus everything the
19082
+ * host needs to recreate it, so a mention read from `draft` can be passed
19083
+ * back to `insert` unchanged.
19084
+ */
19085
+ type ComposerMention = {
19086
+ from: number;
19087
+ to: number;
19088
+ label: string;
19089
+ } & ({
19090
+ kind: "thread";
19091
+ threadId: string;
19092
+ projectId?: string;
19093
+ } | {
19094
+ kind: "project";
19095
+ projectId: string;
19096
+ } | {
19097
+ kind: "section";
19098
+ sectionId: string;
19099
+ } | {
19100
+ kind: "path";
19101
+ path: string;
19102
+ source: "thread-storage" | "workspace";
19103
+ entryKind: "directory" | "file";
19104
+ } | {
19105
+ kind: "command";
19106
+ trigger: "$" | "/";
19107
+ name: string;
19108
+ source: "command" | "skill";
19109
+ origin: "builtin" | "project" | "user";
19110
+ argumentHint: string | null;
19111
+ } | {
19112
+ kind: "plugin";
19113
+ /** The plugin that owns the pill. */
19114
+ pluginId: string;
19115
+ /** The mention provider id that plugin registered. */
19116
+ provider: string;
19117
+ /** The item id the provider's `resolve` receives at send time. */
19118
+ id: string;
19119
+ icon?: string | null;
19120
+ });
19121
+ /**
19122
+ * What `insert` accepts: text, a mention read from `draft` (any kind), or one
19123
+ * of the calling plugin's own mentions (`{ provider, id, label }`, no `kind`).
19124
+ */
19125
+ type ComposerInsertPart = string | ComposerMention | PluginComposerMention;
19126
+ /** Where `insert` puts its content. */
19127
+ interface ComposerInsertOptions {
19128
+ /**
19129
+ * `"cursor"` (default) inserts at the editor's selection, replacing any
19130
+ * selected text; the selection is kept while focus is elsewhere, and the
19131
+ * composer must be on screen. `"end"` inserts after the last character and
19132
+ * also works for a composer that is not on screen.
19133
+ */
19134
+ at?: "cursor" | "end";
19135
+ /** Put the content on its own paragraph, adding a paragraph break before and after only where text is adjacent. */
19136
+ block?: boolean;
19012
19137
  }
19013
19138
  /** Host-rendered paint applied to the editable composer text. */
19014
19139
  interface PluginComposerTextEffect {
@@ -19040,31 +19165,77 @@ interface PluginComposerMention {
19040
19165
  label: string;
19041
19166
  }
19042
19167
  /**
19043
- * Programmatic access to the chat composer draft — the same shared draft the
19044
- * built-in "Add to chat" affordances (file preview, diff, terminal selections)
19045
- * write to. While a queued message is being edited, writes land in that
19046
- * message's inline editor. In a side chat, writes land in the visible side-chat
19047
- * draft. Otherwise, inside a thread context writes land in that thread's draft;
19048
- * anywhere else (nav panel, homepage section) they seed the new-thread composer
19049
- * draft, which persists until the user sends or clears it.
19168
+ * One composer: its state and the writes a plugin can make. `useComposer()`
19169
+ * returns the composer the calling surface belongs to — inside a composer
19170
+ * slot, that composer; in a thread's panels, that thread's composer;
19171
+ * elsewhere, the current route's draft (the thread in view, or the new-thread
19172
+ * draft).
19173
+ *
19174
+ * The handle is stable: the same composer returns the same object across
19175
+ * renders, and its methods always act on the current draft, so it is safe to
19176
+ * keep in effects, callbacks and async work. Its reactive fields (`text`,
19177
+ * `draft`, `selection`, `isEmpty`, …) re-render the calling component when they change;
19178
+ * depend on those fields, not on the handle, in memo dependency lists.
19179
+ *
19180
+ * A handle always writes to its own composer's draft. Thread and new-thread
19181
+ * drafts persist, so a write after the composer left the screen still lands
19182
+ * in that draft. When the draft no longer exists (a queued-message or
19183
+ * sent-message editor that closed), `insert`, `replace`, `removeMention`, `submit` and
19184
+ * `setSelection` throw "This composer is no longer available"; the older
19185
+ * text methods log a warning and do nothing.
19050
19186
  */
19051
19187
  interface PluginComposerApi {
19052
19188
  scope: PluginComposerScope;
19189
+ /**
19190
+ * Stable identity for this composer's draft: the same across remounts and
19191
+ * reloads for thread and new-thread composers (including a `ThreadChat`),
19192
+ * and per editing session for queued-message and sent-message editors.
19193
+ */
19194
+ readonly key: string;
19195
+ /** `"compact"` in the collapsed single-line layout, otherwise `"expanded"`. */
19196
+ readonly layout: "compact" | "expanded";
19197
+ /** The thread's agent is running or stopping. Always false in a new-thread composer. */
19198
+ readonly isRunning: boolean;
19199
+ /** The composer is submitting right now. */
19200
+ readonly isSubmitting: boolean;
19201
+ /**
19202
+ * Pressing Enter would not submit right now: the same decision as the
19203
+ * host's send button (empty draft, uploads in progress, loading, a
19204
+ * selection or setup missing, a pending interaction, voice input, …).
19205
+ */
19206
+ readonly isSubmittingBlocked: boolean;
19207
+ /** The host's message for why submitting is blocked, or null when it is not. */
19208
+ readonly submittingBlockedReason: string | null;
19209
+ /** No text (ignoring whitespace), no mentions and no attachments. */
19210
+ readonly isEmpty: boolean;
19211
+ /** Attachments that have finished uploading. */
19212
+ readonly attachmentCount: number;
19053
19213
  /** Current plain text for this composer scope. */
19054
19214
  readonly text: string;
19215
+ /** The complete current draft, including uploaded attachments. Stable until the draft changes. */
19216
+ readonly draft: ComposerDraftSnapshot;
19217
+ /** Current picker values, or null when this composer has no pickers. Stable until a picker value changes. */
19218
+ readonly selection: ComposerSelection | null;
19055
19219
  /**
19056
- * Replace the draft's plain text. Attachments are preserved. Inline mentions
19057
- * outside the changed range are preserved and rebased; mentions overlapped
19058
- * by the replacement are removed because their text representation changed.
19220
+ * Replace text and mentions together in one committed change. An updater
19221
+ * receives the latest immutable snapshot, including attachments, and must
19222
+ * return its result synchronously. Returning that same snapshot is a no-op.
19223
+ * Omitted attachments are preserved; an explicit list replaces them, and
19224
+ * an empty list clears them. Does not infer or rebase mention ranges.
19225
+ * Ranges are non-overlapping UTF-16 offsets into the supplied text.
19226
+ * Invalid results, throwing updaters, and unavailable editors leave the
19227
+ * draft unchanged. Does not focus, submit, upload, or copy files between
19228
+ * projects. Use `insert` for insertion at the editor's cursor.
19059
19229
  */
19060
- setText(next: string): void;
19230
+ replace(next: ComposerDraftReplacement | ((current: ComposerDraftSnapshot) => ComposerDraftReplacement)): void;
19061
19231
  /**
19062
- * Replace the draft's plain text from the latest committed value. Uses the
19063
- * same structured-state reconciliation as `setText`.
19232
+ * Insert text and mentions. See {@link ComposerInsertOptions} for placement.
19233
+ * Mentions read from `draft` are recreated exactly; the calling plugin's
19234
+ * own `{ provider, id, label }` resolves through its mention provider.
19235
+ * Throws for another plugin's mention without `kind`, and for
19236
+ * `at: "cursor"` when the composer is not on screen.
19064
19237
  */
19065
- updateText(updater: (current: string) => string): void;
19066
- /** Clear plain text without clearing independently attached files. */
19067
- clear(): void;
19238
+ insert(parts: ComposerInsertPart | readonly ComposerInsertPart[], options?: ComposerInsertOptions): void;
19068
19239
  /**
19069
19240
  * Apply a host-rendered effect to this composer's editable text, or clear it.
19070
19241
  * Effects are scoped to the calling plugin and automatically clear when the
@@ -19077,38 +19248,22 @@ interface PluginComposerApi {
19077
19248
  * scope changes.
19078
19249
  */
19079
19250
  setInputLock(locked: boolean): void;
19080
- /**
19081
- * Append text to the draft as a `> ` blockquote block and focus the
19082
- * composer. Blank text is a no-op. This is the "reference this selection
19083
- * in chat" primitive.
19084
- */
19085
- addQuote(text: string): void;
19086
- /**
19087
- * Insert an @-mention pill that resolves through this plugin's mention
19088
- * provider at send time — the durable way to reference an entity whose
19089
- * content should be fetched fresh when the message is sent.
19090
- */
19091
- insertMention(mention: PluginComposerMention): void;
19092
- /** Remove this plugin's matching mention pills and their text from the current draft. */
19093
- experimental_removeMention(mention: {
19094
- provider: string;
19095
- id: string;
19096
- }): void;
19097
19251
  /** Subscribe to successful local submissions in this composer scope, including accepted queued messages. Failed sends and draft clearing do not notify. Dispose on unmount. */
19098
- experimental_onSubmitted(listener: () => void): () => void;
19252
+ onSubmitted(listener: () => void): () => void;
19099
19253
  /** Focus the composer caret at the end of the draft. */
19100
19254
  focus(): void;
19101
19255
  /**
19102
- * Submit this composer's draft through the composer's OWN submit pipeline,
19103
- * optionally scheduling it or attaching plugin-owned dispatch data.
19104
- *
19105
- * This is a real submission, not a plugin-issued send: the host builds the
19106
- * request exactly as pressing Enter would, so the draft's attachments and
19256
+ * Submit this composer's draft exactly as pressing Enter would: the same
19257
+ * checks and the same action (send, or queue while the thread is busy; a
19258
+ * provider handoff creates a new thread). The draft's attachments and
19107
19259
  * @-mentions, and — in the new-thread composer — the provider, model,
19108
19260
  * reasoning level, service tier, permission mode and environment the user
19109
- * has selected on screen, all travel with it. A plugin cannot assemble that
19110
- * tuple itself, which is why sending from the backend instead would silently
19111
- * run the message with different settings than the ones in front of the user.
19261
+ * has selected on screen, all travel with it.
19262
+ *
19263
+ * While attachments are uploading it waits for them, then checks again; it
19264
+ * rejects if an upload fails. Otherwise, when submitting is blocked it
19265
+ * rejects with `submittingBlockedReason`, a message safe to show to the
19266
+ * user. The queued-message and sent-message editors save edits and reject.
19112
19267
  *
19113
19268
  * `sendAt` queues the submission until that time. `experimental_data` is
19114
19269
  * opaque JSON delivered to dispatch hooks together with the calling plugin's
@@ -19117,16 +19272,10 @@ interface PluginComposerApi {
19117
19272
  * later attempts; core does not persist or interpret the opaque data.
19118
19273
  *
19119
19274
  * Resolves once the host has accepted the submission and cleared the draft.
19120
- * Rejects when the composer refused to submit — a scope with no submit
19121
- * pipeline (a queued-message editor, a side chat), an empty draft, or a
19122
- * composer that is not ready (still loading its execution defaults, missing
19123
- * an environment). The rejection's message is safe to show to the user.
19124
19275
  * Failures of the underlying request are reported by bb's own submit error
19125
19276
  * handling and restore the draft, exactly as an interactive failure does.
19126
- *
19127
- * Experimental: see docs/api_to_audit.md.
19128
19277
  */
19129
- experimental_submit(options: ExperimentalComposerSubmitOptions): Promise<void>;
19278
+ submit(options: ComposerSubmitOptions): Promise<void>;
19130
19279
  /**
19131
19280
  * Set this composer's pickers as if each value had been picked by hand.
19132
19281
  *
@@ -19173,18 +19322,15 @@ interface PluginComposerApi {
19173
19322
  * mounted outside any composer), when the calling surface is no longer
19174
19323
  * active, and when a value is not a known reasoning level, service tier or
19175
19324
  * permission mode.
19176
- *
19177
- * Experimental: see docs/api_to_audit.md.
19178
19325
  */
19179
- experimental_setSelection(selection: ExperimentalComposerSelection): Promise<ExperimentalComposerSelection>;
19326
+ setSelection(selection: ComposerSelection): Promise<ComposerSelection>;
19180
19327
  }
19181
19328
  /**
19182
- * Picker values for `experimental_setSelection`, and the shape it resolves
19183
- * with. Field names match `NewThreadRequest` and the `default*` props of
19329
+ * Current picker values in `selection`, input for `setSelection`, and the shape it resolves with. Field names match `NewThreadRequest` and the `default*` props of
19184
19330
  * `experimental_NewThreadComposer`, so one routed decision can feed the
19185
19331
  * composer, the embedded composer and `bb.sdk.threads.spawn` alike.
19186
19332
  */
19187
- interface ExperimentalComposerSelection {
19333
+ interface ComposerSelection {
19188
19334
  /** New-thread composers only. BB's personal-project id means "Don't work in a project". */
19189
19335
  projectId?: string;
19190
19336
  /**
@@ -19205,13 +19351,13 @@ interface ExperimentalComposerSelection {
19205
19351
  permissionMode?: PermissionMode;
19206
19352
  }
19207
19353
  /**
19208
- * What `experimental_submit` does differently from pressing Enter.
19354
+ * What `submit` does differently from pressing Enter.
19209
19355
  *
19210
19356
  * `experimental_data` is opaque JSON delivered to dispatch hooks. The runtime
19211
19357
  * associates it with the calling plugin automatically for the initial
19212
19358
  * dispatch attempt.
19213
19359
  */
19214
- type ExperimentalComposerSubmitOptions = {
19360
+ type ComposerSubmitOptions = {
19215
19361
  sendAt: number;
19216
19362
  experimental_data?: JsonValue$1;
19217
19363
  } | {
@@ -19436,7 +19582,7 @@ interface NewThreadRequest {
19436
19582
  input: PromptInput[];
19437
19583
  /**
19438
19584
  * Epoch ms the first turn should dispatch at. Present only when the
19439
- * submission came from `useComposer().experimental_submit` — a scheduled
19585
+ * submission came from `useComposer().submit` — a scheduled
19440
19586
  * create — and absent otherwise, which is what makes an ordinary submission
19441
19587
  * start work at once. Forward it to `threads.spawn` unchanged: the thread is
19442
19588
  * created `pending` and its first message is queued as a row until then.
@@ -19740,6 +19886,20 @@ interface PluginSdkApp {
19740
19886
  /** Read or clear the owning tab's validated, session-scoped target. */
19741
19887
  experimental_useFixedTabTarget<Target extends JsonValue$1>(tab: ExperimentalPluginFixedTabReference<Target>): ExperimentalFixedTabTargetState<Target> | null;
19742
19888
  useComposer(): PluginComposerApi;
19889
+ /**
19890
+ * Every composer on screen that plugin composer customizations mount in,
19891
+ * oldest first: the thread page's composer, a `ThreadChat`'s composer, the
19892
+ * new-thread composer and open queued-message editors. Use it from a panel
19893
+ * or page that writes into a composer the user picks — label each by its
19894
+ * `scope`, then call `insert`, `focus` or `submit` on the chosen handle.
19895
+ *
19896
+ * Each handle is stable while its composer stays on screen and follows the
19897
+ * same lifetime rule as `useComposer()`. `setTextEffect` and `setInputLock`
19898
+ * have no effect here; call them from a composer slot's `useComposer()`.
19899
+ * The calling component re-renders when the list or any listed draft
19900
+ * changes.
19901
+ */
19902
+ useComposers(): readonly PluginComposerApi[];
19743
19903
  /**
19744
19904
  * The sidebar's live thread view (see {@link PluginSidebarThreadsState}).
19745
19905
  * Reads the host's own cache and realtime subscriptions, so it costs no
@@ -19800,7 +19960,7 @@ interface PluginSdkApp {
19800
19960
  experimental_useSidebarNavigationSplit(itemId: string, options?: ExperimentalSidebarNavigationSplitOptions): ExperimentalSidebarNavigationSplit;
19801
19961
  /**
19802
19962
  * bb's artwork for a navigation item's icon: bb's glyphs for its own items,
19803
- * and the contributing plugin's branding for plugin panels. Experimental:
19963
+ * and the panel's explicit icon, falling back to plugin branding, for plugin panels. Experimental:
19804
19964
  * see docs/api_to_audit.md.
19805
19965
  */
19806
19966
  experimental_SidebarNavigationIcon: ComponentType<ExperimentalSidebarNavigationIconProps>;
@@ -19960,7 +20120,6 @@ interface PluginSdkApp {
19960
20120
  * docs/api_to_audit.md.
19961
20121
  */
19962
20122
  experimental_Diff: ComponentType<DiffProps>;
19963
- useComposerView(): ComposerView;
19964
20123
  }
19965
20124
 
19966
20125
  declare const experimental_Icon: react.ComponentType<ExperimentalIconProps>;
@@ -19989,7 +20148,7 @@ declare const useBbNavigate: () => BbNavigate;
19989
20148
  declare const experimental_useAppPanel: () => ExperimentalAppPanel;
19990
20149
  declare const experimental_useFixedTabTarget: <Target extends JsonValue$1>(tab: ExperimentalPluginFixedTabReference<Target>) => ExperimentalFixedTabTargetState<Target> | null;
19991
20150
  declare const useComposer: () => PluginComposerApi;
19992
- declare const useComposerView: () => ComposerView;
20151
+ declare const useComposers: () => readonly PluginComposerApi[];
19993
20152
  declare const experimental_useSidebarThreads: (options?: {
19994
20153
  experimental_lifecycles: readonly ("active" | "archived")[];
19995
20154
  }) => PluginSidebarThreadsState;
@@ -20011,5 +20170,5 @@ declare const useSdk: () => PluginBrowserBbSdk;
20011
20170
  declare const experimental_useProviders: () => PluginProvidersState;
20012
20171
  declare const experimental_useCodeTheme: () => PluginCodeThemeState;
20013
20172
 
20014
- export { Markdown, ThreadChat, ThreadTitle, UrlLink, definePluginApp, experimental_BranchPicker, experimental_Diff, experimental_FileLink, experimental_Icon, experimental_NewThreadComposer, experimental_PermissionModePicker, experimental_ProviderIcon, experimental_ProviderModelPicker, experimental_SidebarNavigationIcon, experimental_SourceCode, experimental_useAppPanel, experimental_useBranches, experimental_useCheckoutState, experimental_useCodeTheme, experimental_useFixedTabTarget, experimental_usePluginId, experimental_useProviders, experimental_useQuestionFormHost, experimental_useSidebarNavigation, experimental_useSidebarNavigationSplit, experimental_useSidebarThreadActions, experimental_useSidebarThreadPullRequest, experimental_useSidebarThreadSplit, experimental_useSidebarThreads, useBbContext, useBbNavigate, useComposer, useComposerView, useEnvironmentProviders, useRealtime, useRealtimeConnectionState, useRpc, useSdk, useSettings, useSidebarSplitLayout, useSidebarThreadDraft, useSidebarThreadDraftIds, useSidebarThreadRowStatus, useSidebarThreadRowStatuses, useSidebarThreadShortcut };
20015
- export type { BbContext, BbNavigate, BranchPickerProps, BranchesState, CheckoutState, CodeOverflowMode, ComposerCustomization, ComposerPlusMenuItem, ComposerRichTextSpec, ComposerStructuredDraft, ComposerView, DiffProps, DiffViewMode, ExperimentalAppIcons, ExperimentalAppOverlayProps, ExperimentalAppOverlayRegistration, ExperimentalAppPanel, ExperimentalAppPanelSurface, ExperimentalComposerSelection, ExperimentalComposerSubmitOptions, ExperimentalDiffFileContent, ExperimentalDiffFullFileContents, ExperimentalFileLinkProps, ExperimentalFileLocation, ExperimentalFileOpenOptions, ExperimentalFixedTabTargetContract, ExperimentalFixedTabTargetState, ExperimentalIconProps, ExperimentalIconRegistration, ExperimentalLiveFileTarget, ExperimentalOpenFixedTabOptions, ExperimentalPermissionModePickerProps, ExperimentalPluginBrowserPage, ExperimentalPluginBrowserPageEvaluateOptions, ExperimentalPluginBrowserPageWorld, ExperimentalPluginBrowserToolbarActionProps, ExperimentalPluginBrowserToolbarActionRegistration, ExperimentalPluginFixedTabReference, 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$1 as JsonValue, MarkdownProps, NewThreadComposerProps, NewThreadRequest, PluginAppBuilder, PluginAppCommands, PluginAppComposer, PluginAppContentScripts, PluginAppDefinition, PluginAppSetup, PluginAppSlots, PluginBoundThreadsArea, PluginBrowserBbSdk, PluginCodeThemeData, PluginCodeThemeState, PluginCodeThemeTokenRule, PluginCommandContext, PluginCommandRegistration, PluginCommandShortcut, PluginComposerApi, PluginComposerMention, PluginComposerScope, PluginComposerTextEffect, PluginComposerThreadRowStatus, PluginContentScriptContext, PluginContentScriptDisposer, PluginContentScriptRegistration, PluginDiffRendererProps, PluginDiffRendererRegistration, PluginEnvironmentProvider, PluginEnvironmentProviderInputsChange, PluginEnvironmentProviderInputsProps, PluginEnvironmentProviderInputsRegistration, PluginEnvironmentProvidersState, PluginFileOpenerProps, PluginFileOpenerRegistration, PluginFileOpenerSource, PluginFixedTabDeclaration, PluginFixedTabRegistration, PluginHomepageSectionProps, PluginHomepageSectionRegistration, PluginMachineProviderInputsChange, PluginMachineProviderInputsProps, PluginMachineProviderInputsRegistration, 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, PluginSidebarSection, PluginSidebarSplitLayout, PluginSidebarSplitPane, PluginSidebarThread, PluginSidebarThreadActions, PluginSidebarThreadActivity, PluginSidebarThreadDraftState, PluginSidebarThreadIndicator, PluginSidebarThreadPullRequestState, PluginSidebarThreadRowStatus, PluginSidebarThreadShortcut, PluginSidebarThreadSplit, PluginSidebarThreadsState, PluginSourceCodeRendererProps, PluginSourceCodeRendererRegistration, PluginTargetedPanelActionOpenOptions, PluginThreadHeaderActionProps, PluginThreadHeaderActionRegistration, PluginThreadListProps, PluginThreadListRegistration, PluginThreadPanelActionContext, PluginThreadPanelActionRegistration, PluginThreadPanelProps, PluginThreadTitleProps, PluginTimelineRendererProps, PluginTimelineRendererRegistration, PluginTimelineRendererRow, PluginTimelineRowPresentation, PluginTimelineRowStatus, ReadonlyJsonValue, SourceCodeLineRange, SourceCodeProps, StandardSchemaV1, StandardSchemaV1InferInput, StandardSchemaV1InferOutput, StandardSchemaV1Issue, StandardSchemaV1Result, ThreadChatMessageAction, ThreadChatMessageReference, ThreadChatProps, UrlLinkProps, UseBranchesArgs, UseCheckoutStateArgs };
20173
+ export { Markdown, ThreadChat, ThreadTitle, UrlLink, definePluginApp, experimental_BranchPicker, experimental_Diff, experimental_FileLink, experimental_Icon, experimental_NewThreadComposer, experimental_PermissionModePicker, experimental_ProviderIcon, experimental_ProviderModelPicker, experimental_SidebarNavigationIcon, experimental_SourceCode, experimental_useAppPanel, experimental_useBranches, experimental_useCheckoutState, experimental_useCodeTheme, experimental_useFixedTabTarget, experimental_usePluginId, experimental_useProviders, experimental_useQuestionFormHost, experimental_useSidebarNavigation, experimental_useSidebarNavigationSplit, experimental_useSidebarThreadActions, experimental_useSidebarThreadPullRequest, experimental_useSidebarThreadSplit, experimental_useSidebarThreads, useBbContext, useBbNavigate, useComposer, useComposers, useEnvironmentProviders, useRealtime, useRealtimeConnectionState, useRpc, useSdk, useSettings, useSidebarSplitLayout, useSidebarThreadDraft, useSidebarThreadDraftIds, useSidebarThreadRowStatus, useSidebarThreadRowStatuses, useSidebarThreadShortcut };
20174
+ export type { BbContext, BbNavigate, BranchPickerProps, BranchesState, CheckoutState, CodeOverflowMode, ComposerAttachment, ComposerCustomization, ComposerDraft, ComposerDraftReplacement, ComposerDraftSnapshot, ComposerInsertOptions, ComposerInsertPart, ComposerMention, ComposerPlusMenuItem, ComposerRichTextSpec, ComposerSelection, ComposerSendMenuItem, ComposerSubmitOptions, DiffProps, DiffViewMode, ExperimentalAppIcons, ExperimentalAppOverlayProps, ExperimentalAppOverlayRegistration, ExperimentalAppPanel, ExperimentalAppPanelSurface, ExperimentalDiffFileContent, ExperimentalDiffFullFileContents, ExperimentalFileLinkProps, ExperimentalFileLocation, ExperimentalFileOpenOptions, ExperimentalFixedTabTargetContract, ExperimentalFixedTabTargetState, ExperimentalIconProps, ExperimentalIconRegistration, ExperimentalLiveFileTarget, ExperimentalOpenFixedTabOptions, ExperimentalPermissionModePickerProps, ExperimentalPluginBrowserPage, ExperimentalPluginBrowserPageEvaluateOptions, ExperimentalPluginBrowserPageWorld, ExperimentalPluginBrowserToolbarActionProps, ExperimentalPluginBrowserToolbarActionRegistration, ExperimentalPluginFixedTabReference, 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$1 as JsonValue, MarkdownProps, NewThreadComposerProps, NewThreadRequest, PluginAppBuilder, PluginAppCommands, PluginAppComposer, PluginAppContentScripts, PluginAppDefinition, PluginAppSetup, PluginAppSlots, PluginBoundThreadsArea, PluginBrowserBbSdk, PluginCodeThemeData, PluginCodeThemeState, PluginCodeThemeTokenRule, PluginCommandContext, PluginCommandRegistration, PluginCommandShortcut, PluginComposerApi, PluginComposerMention, PluginComposerScope, PluginComposerTextEffect, PluginComposerThreadRowStatus, PluginContentScriptContext, PluginContentScriptDisposer, PluginContentScriptRegistration, PluginDiffRendererProps, PluginDiffRendererRegistration, PluginEnvironmentProvider, PluginEnvironmentProviderInputsChange, PluginEnvironmentProviderInputsProps, PluginEnvironmentProviderInputsRegistration, PluginEnvironmentProvidersState, PluginFileOpenerProps, PluginFileOpenerRegistration, PluginFileOpenerSource, PluginFixedTabDeclaration, PluginFixedTabRegistration, PluginHomepageSectionProps, PluginHomepageSectionRegistration, PluginMachineProviderInputsChange, PluginMachineProviderInputsProps, PluginMachineProviderInputsRegistration, 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, PluginSidebarSection, PluginSidebarSplitLayout, PluginSidebarSplitPane, PluginSidebarThread, PluginSidebarThreadActions, PluginSidebarThreadActivity, PluginSidebarThreadDraftState, PluginSidebarThreadIndicator, PluginSidebarThreadPullRequestState, PluginSidebarThreadRowStatus, PluginSidebarThreadShortcut, PluginSidebarThreadSplit, PluginSidebarThreadsState, PluginSourceCodeRendererProps, PluginSourceCodeRendererRegistration, PluginTargetedPanelActionOpenOptions, PluginThreadHeaderActionProps, PluginThreadHeaderActionRegistration, PluginThreadListProps, PluginThreadListRegistration, PluginThreadPanelActionContext, PluginThreadPanelActionRegistration, PluginThreadPanelProps, PluginThreadTitleProps, PluginTimelineRendererProps, PluginTimelineRendererRegistration, PluginTimelineRendererRow, PluginTimelineRowPresentation, PluginTimelineRowStatus, ReadonlyJsonValue, SourceCodeLineRange, SourceCodeProps, StandardSchemaV1, StandardSchemaV1InferInput, StandardSchemaV1InferOutput, StandardSchemaV1Issue, StandardSchemaV1Result, ThreadChatMessageAction, ThreadChatMessageReference, ThreadChatProps, UrlLinkProps, UseBranchesArgs, UseCheckoutStateArgs };