@get-bb/plugin-sdk 0.4.99 → 0.4.104

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.
@@ -855,6 +855,23 @@ interface ExperimentalAppOverlayRegistration {
855
855
  id: string;
856
856
  component: ComponentType<ExperimentalAppOverlayProps>;
857
857
  }
858
+ /**
859
+ * A name the host resolves to a glyph, in this order: a name any plugin
860
+ * registered with `app.experimental_icons.register()`, then a built-in BB icon
861
+ * name (`"Zap"`), then a namespaced `"<pluginId>/<name>"` glyph naming an
862
+ * entry of that plugin's manifest `bb.branding.experimental_icons` map. A
863
+ * registration therefore shadows a built-in, and either shadows a declared
864
+ * icon of the same name. Names that resolve to none of the three fall back to
865
+ * the surface's generic icon.
866
+ *
867
+ * Declared icons and registrations are one vocabulary here: the same name
868
+ * works in `experimental_Icon`, in every field below, and — for a declared
869
+ * icon — in the tool, provider and bridge-row declarations that accept one.
870
+ * Declared icons need no frontend bundle and survive the plugin being stopped;
871
+ * registrations can be any React component but live only while the plugin's
872
+ * app bundle is loaded.
873
+ */
874
+ type BbIconName = string;
858
875
  /**
859
876
  * Owner-defined validator for a fixed tab's transient target. The host first
860
877
  * verifies that the value is JSON-safe, then calls this validator before
@@ -879,8 +896,7 @@ type ExperimentalPluginFixedTabReference<Target extends JsonValue$1 = never> = {
879
896
  /** A fixed tab declared by a plugin nav panel. */
880
897
  type PluginFixedTabRegistration<Target extends JsonValue$1 = never> = ExperimentalPluginFixedTabReference<Target> & {
881
898
  title: string;
882
- /** Icon hint (BB icon name); unknown names fall back to a generic icon. */
883
- icon: string;
899
+ icon: BbIconName;
884
900
  component: ComponentType<PluginNavPanelProps>;
885
901
  /** `flush` lets the component own padding and scrolling. */
886
902
  layout?: "flush" | "padded";
@@ -891,8 +907,7 @@ interface PluginNavPanelRegistration {
891
907
  /** Unique within the plugin; letters, digits, `-`, `_`. */
892
908
  id: string;
893
909
  title: string;
894
- /** Icon hint (BB icon name); unknown names fall back to a generic icon. */
895
- icon: string;
910
+ icon: BbIconName;
896
911
  /** URL segment under `/plugins/<pluginId>/`; letters, digits, `-`, `_`. */
897
912
  path: string;
898
913
  component: ComponentType<PluginNavPanelProps>;
@@ -975,10 +990,10 @@ interface PluginThreadPanelActionRegistration {
975
990
  /** Label of the action row in the panel's new-tab launcher. */
976
991
  title: string;
977
992
  /**
978
- * Icon hint (BB icon name) used when the plugin ships no logo; the
979
- * launcher row and opened tabs prefer the plugin's logo.
993
+ * Drawn only when the manifest declares no `bb.branding.icon`; the launcher
994
+ * row and opened tabs prefer that over this hint.
980
995
  */
981
- icon?: string;
996
+ icon?: BbIconName;
982
997
  /** Rendered inside every panel tab this action opens. */
983
998
  component: ComponentType<PluginThreadPanelProps>;
984
999
  /**
@@ -1015,8 +1030,8 @@ interface PluginNewThreadPanelActionRegistration {
1015
1030
  id: string;
1016
1031
  /** Label of the action row in the panel's new-tab launcher. */
1017
1032
  title: string;
1018
- /** Icon hint (BB icon name) used when the plugin ships no logo. */
1019
- icon?: string;
1033
+ /** Drawn only when the manifest declares no `bb.branding.icon`. */
1034
+ icon?: BbIconName;
1020
1035
  /** Rendered inside every panel tab this action opens. */
1021
1036
  component: ComponentType<PluginNewThreadPanelProps>;
1022
1037
  /** Host framing; matches `threadPanelAction`. */
@@ -1060,8 +1075,8 @@ interface PluginSidebarFooterActionRegistration {
1060
1075
  id: string;
1061
1076
  /** Tooltip and accessible label for the icon button. */
1062
1077
  title: string;
1063
- /** Icon hint (BB icon name); unknown names fall back to a generic icon. */
1064
- icon: string;
1078
+ /** Drawn only when the manifest declares no `bb.branding.icon`. */
1079
+ icon: BbIconName;
1065
1080
  /**
1066
1081
  * Runs when the user activates the action (e.g. call `openSettings()`,
1067
1082
  * open a panel via other surfaces, toast). Errors (sync or async) are
@@ -1080,8 +1095,7 @@ interface ExperimentalSidebarFooterItemBase {
1080
1095
  id: string;
1081
1096
  /** Tooltip and accessible label for the host-rendered icon button. */
1082
1097
  label: string;
1083
- /** BB icon-name hint; unknown names fall back to a generic icon. */
1084
- icon: string;
1098
+ icon: BbIconName;
1085
1099
  }
1086
1100
  /** A sidebar-footer item that runs a callback when activated. */
1087
1101
  interface ExperimentalSidebarFooterActionRegistration extends ExperimentalSidebarFooterItemBase {
@@ -1558,8 +1572,7 @@ interface PluginMessageActionRegistration {
1558
1572
  id: string;
1559
1573
  /** Tooltip / menu label for the action. */
1560
1574
  title: string;
1561
- /** Icon hint (BB icon name); unknown names fall back to a generic icon. */
1562
- icon?: string;
1575
+ icon?: BbIconName;
1563
1576
  /**
1564
1577
  * Runs when the user activates the action. Errors (sync or async) are
1565
1578
  * contained and logged; they never break the timeline.
@@ -1618,10 +1631,6 @@ interface PluginCommandRegistration {
1618
1631
  */
1619
1632
  run(context: PluginCommandContext): void | Promise<void>;
1620
1633
  }
1621
- /** @deprecated Use PluginCommandContext. */
1622
- type PluginCommandPaletteActionContext = PluginCommandContext;
1623
- /** @deprecated Use PluginCommandRegistration. */
1624
- type PluginCommandPaletteActionRegistration = PluginCommandRegistration;
1625
1634
  /** Registers commands for bb's command palette. */
1626
1635
  interface PluginAppCommands {
1627
1636
  /** Register a command. IDs are unique within this plugin, including legacy slot registrations. */
@@ -1990,6 +1999,11 @@ interface ExperimentalProviderIconProps {
1990
1999
  "aria-hidden"?: boolean | "false" | "true";
1991
2000
  "aria-label"?: string;
1992
2001
  }
2002
+ /**
2003
+ * An app icon registered by a plugin. The registry is app-wide: a registered
2004
+ * name is usable wherever a `BbIconName` is — `experimental_Icon`, and every
2005
+ * host-rendered surface that takes one — by this plugin or any other.
2006
+ */
1993
2007
  interface ExperimentalIconRegistration {
1994
2008
  /** Shared app name. Namespacing is recommended, but not required. */
1995
2009
  name: string;
@@ -2000,10 +2014,11 @@ interface ExperimentalIconRegistration {
2000
2014
  }
2001
2015
  interface ExperimentalAppIcons {
2002
2016
  /**
2003
- * Add or override an app icon during setup. Returns nothing; the host
2004
- * replaces registrations on reload and removes them on unload. Duplicate
2005
- * names within a plugin reject setup. Between plugins, the first plugin id
2006
- * in lexical order wins, independent of bundle load order.
2017
+ * Add or override an app icon during setup. A registered name shadows a
2018
+ * built-in of the same name. Returns nothing; the host replaces
2019
+ * registrations on reload and removes them on unload. Duplicate names within
2020
+ * a plugin reject setup. Between plugins, the first plugin id in lexical
2021
+ * order wins, independent of bundle load order.
2007
2022
  */
2008
2023
  register(registration: ExperimentalIconRegistration): void;
2009
2024
  }
@@ -2088,8 +2103,8 @@ interface ComposerCustomization {
2088
2103
  interface ComposerPlusMenuItem {
2089
2104
  id: string;
2090
2105
  label: string;
2091
- /** BB icon name; unknown names fall back to the generic plugin icon. */
2092
- icon?: string;
2106
+ /** Drawn only when the manifest declares no `bb.branding.icon`. */
2107
+ icon?: BbIconName;
2093
2108
  /** Accessible description for the host-rendered row. */
2094
2109
  description?: string;
2095
2110
  disabled?: boolean | ((view: ComposerView) => boolean);
@@ -2142,8 +2157,11 @@ interface PluginComposerTextEffect {
2142
2157
  }
2143
2158
  /** Host-rendered status that temporarily replaces a thread's draft glyph. */
2144
2159
  interface PluginComposerThreadRowStatus {
2145
- /** BB icon-name hint; unknown names fall back to the generic plugin icon. */
2146
- icon: string;
2160
+ /**
2161
+ * Always drawn as given: unlike the plugin-badged surfaces, this one has no
2162
+ * preference for the plugin's own `bb.branding.icon`.
2163
+ */
2164
+ icon: BbIconName;
2147
2165
  /** Accessible label for the status glyph. */
2148
2166
  label: string;
2149
2167
  /**
@@ -2250,6 +2268,82 @@ interface PluginComposerApi {
2250
2268
  * Experimental: see docs/api_to_audit.md.
2251
2269
  */
2252
2270
  experimental_submit(options: ExperimentalComposerSubmitOptions): Promise<void>;
2271
+ /**
2272
+ * Set this composer's pickers as if each value had been picked by hand.
2273
+ *
2274
+ * Every field is optional. An omitted field is left alone. A field this
2275
+ * composer has no picker for is ignored rather than rejected: a thread
2276
+ * composer has no project or environment; a provider without service tiers
2277
+ * has no tier; a fork draft locks its project, provider and environment.
2278
+ * Values travel through the same paths the pickers use, so in the
2279
+ * new-thread composer they become the remembered defaults for the next
2280
+ * thread and are reported as the user's explicit choices, and in a thread
2281
+ * composer a provider change starts the same handoff the picker starts:
2282
+ * the handoff block is prepended to the draft and the next send creates a
2283
+ * new thread. A same-provider model change in a thread does not start a
2284
+ * handoff, exactly like the picker.
2285
+ *
2286
+ * In the new-thread composer the project is switched first and awaited
2287
+ * (attachments are copied to the new project), then the environment and
2288
+ * machine are applied to the new project, then provider, model, reasoning
2289
+ * level, service tier and permission mode. A provider change reloads the
2290
+ * model catalog before the model and reasoning level are applied to it.
2291
+ * Because the project switch remounts plugin surfaces, the returned
2292
+ * promise is owned by the composer and still resolves after the calling
2293
+ * component has unmounted.
2294
+ *
2295
+ * Resolves with the composer's own selection once it has settled: the
2296
+ * applied values have committed and the model catalog for the selected
2297
+ * provider and machine has finished loading, so model, reasoning level and
2298
+ * permission mode have reconciled against it. The catalog wait is bounded;
2299
+ * if it has not finished after 15 seconds the promise resolves with the
2300
+ * selection as it stands. The result carries only the fields this composer
2301
+ * has, so a missing key means "no such picker here" and a value that
2302
+ * differs from the one passed was reconciled (a reasoning level the model
2303
+ * does not support, a permission mode above the machine's ceiling, a model
2304
+ * the provider does not list). A provider the composer does not list is
2305
+ * ignored together with the model and reasoning level meant for it, so the
2306
+ * stored provider preference never names something the picker could not
2307
+ * have chosen. `environment` is absent while the composer
2308
+ * has no submittable environment; `providerId` and `model` are absent
2309
+ * while nothing is selected; `serviceTier` is present only when the
2310
+ * selected provider has tiers and one is chosen.
2311
+ *
2312
+ * Rejects, with a message safe to show to the user, in a composer with no
2313
+ * pickers at all (a queued-message editor, a side chat, a plugin surface
2314
+ * mounted outside any composer), when the calling surface is no longer
2315
+ * active, and when a value is not a known reasoning level, service tier or
2316
+ * permission mode.
2317
+ *
2318
+ * Experimental: see docs/api_to_audit.md.
2319
+ */
2320
+ experimental_setSelection(selection: ExperimentalComposerSelection): Promise<ExperimentalComposerSelection>;
2321
+ }
2322
+ /**
2323
+ * Picker values for `experimental_setSelection`, and the shape it resolves
2324
+ * with. Field names match `NewThreadRequest` and the `default*` props of
2325
+ * `experimental_NewThreadComposer`, so one routed decision can feed the
2326
+ * composer, the embedded composer and `bb.sdk.threads.spawn` alike.
2327
+ */
2328
+ interface ExperimentalComposerSelection {
2329
+ /** New-thread composers only. BB's personal-project id means "Don't work in a project". */
2330
+ projectId?: string;
2331
+ /**
2332
+ * New-thread composers only. `{ type: "project-default" }` and a `host`
2333
+ * environment without a `hostId` seed nothing and are ignored. Provider
2334
+ * `inputs` are not applied; the provider's own inputs control keeps its
2335
+ * value, and the result reports what the composer would submit.
2336
+ */
2337
+ environment?: CreateThreadEnvironmentArgs;
2338
+ /** A provider the composer does not list is ignored, and `model` and `reasoningLevel` with it. */
2339
+ providerId?: string;
2340
+ /** Applied only when the composer ends up on the requested provider (or none was requested). */
2341
+ model?: string;
2342
+ /** Applied only when the composer ends up on the requested provider (or none was requested). */
2343
+ reasoningLevel?: ReasoningLevel;
2344
+ /** Ignored by a provider with no service tiers. */
2345
+ serviceTier?: ServiceTier;
2346
+ permissionMode?: PermissionMode;
2253
2347
  }
2254
2348
  /**
2255
2349
  * What `experimental_submit` does differently from pressing Enter.
@@ -2276,8 +2370,7 @@ interface ThreadChatMessageAction {
2276
2370
  id: string;
2277
2371
  /** Tooltip / menu label for the action. */
2278
2372
  title: string;
2279
- /** Icon hint (BB icon name); unknown names fall back to a generic icon. */
2280
- icon?: string;
2373
+ icon?: BbIconName;
2281
2374
  /**
2282
2375
  * Message roles the action applies to. Omitted = both user and assistant
2283
2376
  * messages.
@@ -2931,4 +3024,4 @@ declare const experimental_useProviders: () => PluginProvidersState;
2931
3024
  declare const experimental_useCodeTheme: () => PluginCodeThemeState;
2932
3025
 
2933
3026
  export { Markdown, ThreadChat, UrlLink, definePluginApp, experimental_BranchPicker, experimental_Diff, experimental_FileLink, experimental_Icon, experimental_NewThreadComposer, experimental_PermissionModePicker, experimental_ProviderIcon, experimental_ProviderModelPicker, experimental_SourceCode, experimental_useAppPanel, experimental_useBranches, experimental_useCheckoutState, experimental_useCodeTheme, experimental_useFixedTabTarget, experimental_useProviders, experimental_useSidebarThreadActions, experimental_useSidebarThreadPullRequest, experimental_useSidebarThreadSplit, experimental_useSidebarThreads, useBbContext, useBbNavigate, useComposer, useComposerView, useRealtime, useRealtimeConnectionState, useRpc, useSettings };
2934
- export type { BbContext, BbNavigate, BranchPickerProps, BranchesState, CheckoutState, CodeOverflowMode, ComposerCustomization, ComposerPlusMenuItem, ComposerRichTextSpec, ComposerStructuredDraft, ComposerView, DiffProps, DiffViewMode, ExperimentalAppIcons, ExperimentalAppOverlayProps, ExperimentalAppOverlayRegistration, ExperimentalAppPanel, ExperimentalAppPanelSurface, ExperimentalComposerSubmitOptions, ExperimentalDiffFileContent, ExperimentalDiffFullFileContents, ExperimentalFileLinkProps, ExperimentalFileLocation, ExperimentalFileOpenOptions, ExperimentalFixedTabTargetContract, ExperimentalFixedTabTargetState, ExperimentalIconProps, ExperimentalIconRegistration, ExperimentalLiveFileTarget, ExperimentalOpenFixedTabOptions, ExperimentalPermissionModePickerProps, ExperimentalPluginBrowserPage, ExperimentalPluginBrowserPageEvaluateOptions, ExperimentalPluginBrowserPageWorld, ExperimentalPluginBrowserToolbarActionProps, ExperimentalPluginBrowserToolbarActionRegistration, ExperimentalPluginFixedTabReference, ExperimentalProviderIconProps, ExperimentalProviderModelPickerProps, ExperimentalProviderModelPickerRouting, ExperimentalProviderModelPickerValue, ExperimentalSidebarFooter, ExperimentalSidebarFooterActionContext, ExperimentalSidebarFooterActionRegistration, ExperimentalSidebarFooterDisclosureController, ExperimentalSidebarFooterDisclosureProps, ExperimentalSidebarFooterDisclosureRegistration, ExperimentalSidebarFooterItemBase, ExperimentalSidebarFooterItemRegistration, ExperimentalSidebarNavigationAction, ExperimentalSidebarNavigationActivationOptions, ExperimentalSidebarNavigationIcon, ExperimentalSidebarNavigationItem, ExperimentalSidebarNavigationProps, ExperimentalSidebarNavigationRegistration, ExperimentalSidebarNavigationShortcut, JsonValue$1 as JsonValue, MarkdownProps, NewThreadComposerProps, NewThreadRequest, PluginAppBuilder, PluginAppCommands, PluginAppComposer, PluginAppContentScripts, PluginAppDefinition, PluginAppSetup, PluginAppSlots, PluginCodeThemeData, PluginCodeThemeState, PluginCodeThemeTokenRule, PluginCommandContext, PluginCommandPaletteActionContext, PluginCommandPaletteActionRegistration, PluginCommandRegistration, PluginCommandShortcut, PluginComposerApi, PluginComposerMention, PluginComposerScope, PluginComposerTextEffect, PluginComposerThreadRowStatus, PluginContentScriptContext, PluginContentScriptDisposer, PluginContentScriptRegistration, PluginDiffRendererProps, PluginDiffRendererRegistration, PluginEnvironmentProviderInputsChange, PluginEnvironmentProviderInputsProps, PluginEnvironmentProviderInputsRegistration, 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, PluginSidebarSplitPane, PluginSidebarThread, PluginSidebarThreadActions, PluginSidebarThreadActivity, PluginSidebarThreadIndicator, PluginSidebarThreadPullRequestState, PluginSidebarThreadSplit, PluginSidebarThreadsState, PluginSourceCodeRendererProps, PluginSourceCodeRendererRegistration, PluginTargetedPanelActionOpenOptions, PluginThreadHeaderActionProps, PluginThreadHeaderActionRegistration, PluginThreadListProps, PluginThreadListRegistration, PluginThreadPanelActionContext, PluginThreadPanelActionRegistration, PluginThreadPanelProps, PluginTimelineRendererProps, PluginTimelineRendererRegistration, PluginTimelineRendererRow, PluginTimelineRowPresentation, PluginTimelineRowStatus, ReadonlyJsonValue, SourceCodeLineRange, SourceCodeProps, StandardSchemaV1, StandardSchemaV1InferInput, StandardSchemaV1InferOutput, StandardSchemaV1Issue, StandardSchemaV1Result, ThreadChatMessageAction, ThreadChatMessageReference, ThreadChatProps, UrlLinkProps, UseBranchesArgs, UseCheckoutStateArgs };
3027
+ 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, ExperimentalSidebarFooter, ExperimentalSidebarFooterActionContext, ExperimentalSidebarFooterActionRegistration, ExperimentalSidebarFooterDisclosureController, ExperimentalSidebarFooterDisclosureProps, ExperimentalSidebarFooterDisclosureRegistration, ExperimentalSidebarFooterItemBase, ExperimentalSidebarFooterItemRegistration, ExperimentalSidebarNavigationAction, ExperimentalSidebarNavigationActivationOptions, ExperimentalSidebarNavigationIcon, ExperimentalSidebarNavigationItem, ExperimentalSidebarNavigationProps, ExperimentalSidebarNavigationRegistration, ExperimentalSidebarNavigationShortcut, JsonValue$1 as JsonValue, MarkdownProps, NewThreadComposerProps, NewThreadRequest, PluginAppBuilder, PluginAppCommands, PluginAppComposer, PluginAppContentScripts, PluginAppDefinition, PluginAppSetup, PluginAppSlots, PluginCodeThemeData, PluginCodeThemeState, PluginCodeThemeTokenRule, PluginCommandContext, PluginCommandRegistration, PluginCommandShortcut, PluginComposerApi, PluginComposerMention, PluginComposerScope, PluginComposerTextEffect, PluginComposerThreadRowStatus, PluginContentScriptContext, PluginContentScriptDisposer, PluginContentScriptRegistration, PluginDiffRendererProps, PluginDiffRendererRegistration, PluginEnvironmentProviderInputsChange, PluginEnvironmentProviderInputsProps, PluginEnvironmentProviderInputsRegistration, 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, PluginSidebarSplitPane, PluginSidebarThread, PluginSidebarThreadActions, PluginSidebarThreadActivity, PluginSidebarThreadIndicator, PluginSidebarThreadPullRequestState, PluginSidebarThreadSplit, PluginSidebarThreadsState, PluginSourceCodeRendererProps, PluginSourceCodeRendererRegistration, PluginTargetedPanelActionOpenOptions, PluginThreadHeaderActionProps, PluginThreadHeaderActionRegistration, PluginThreadListProps, PluginThreadListRegistration, PluginThreadPanelActionContext, PluginThreadPanelActionRegistration, PluginThreadPanelProps, PluginTimelineRendererProps, PluginTimelineRendererRegistration, PluginTimelineRendererRow, PluginTimelineRowPresentation, PluginTimelineRowStatus, ReadonlyJsonValue, SourceCodeLineRange, SourceCodeProps, StandardSchemaV1, StandardSchemaV1InferInput, StandardSchemaV1InferOutput, StandardSchemaV1Issue, StandardSchemaV1Result, ThreadChatMessageAction, ThreadChatMessageReference, ThreadChatProps, UrlLinkProps, UseBranchesArgs, UseCheckoutStateArgs };
@@ -300,6 +300,21 @@ type CallerExecutionInputSource = z.infer<typeof callerExecutionInputSourceSchem
300
300
  declare const PROVIDER_FORK_VALUES: readonly ["none", "tip", "checkpoint"];
301
301
  type ProviderFork = (typeof PROVIDER_FORK_VALUES)[number];
302
302
 
303
+ declare const threadTurnInitiatorSchema: z.ZodEnum<{
304
+ agent: "agent";
305
+ system: "system";
306
+ user: "user";
307
+ }>;
308
+ type ThreadTurnInitiator = z.infer<typeof threadTurnInitiatorSchema>;
309
+
310
+ declare const threadCreateOriginSchema: z.ZodEnum<{
311
+ app: "app";
312
+ cli: "cli";
313
+ plugin: "plugin";
314
+ sdk: "sdk";
315
+ }>;
316
+ type ThreadCreateOrigin = z.infer<typeof threadCreateOriginSchema>;
317
+
303
318
  declare const threadQueuedMessageSchema: z.ZodObject<{
304
319
  content: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
305
320
  mentions: z.ZodDefault<z.ZodArray<z.ZodObject<{
@@ -394,6 +409,13 @@ declare const threadQueuedMessageSchema: z.ZodObject<{
394
409
  user: "user";
395
410
  }>;
396
411
  model: z.ZodString;
412
+ origin: z.ZodNullable<z.ZodEnum<{
413
+ app: "app";
414
+ cli: "cli";
415
+ plugin: "plugin";
416
+ sdk: "sdk";
417
+ }>>;
418
+ originPluginId: z.ZodNullable<z.ZodString>;
397
419
  payload: z.ZodDiscriminatedUnion<[z.ZodObject<{
398
420
  kind: z.ZodLiteral<"inline">;
399
421
  }, z.core.$strip>, z.ZodObject<{
@@ -448,22 +470,7 @@ declare const threadQueuedMessageSchema: z.ZodObject<{
448
470
  }, z.core.$strip>;
449
471
  type ThreadQueuedMessage = z.infer<typeof threadQueuedMessageSchema>;
450
472
 
451
- declare const threadCreateOriginSchema: z.ZodEnum<{
452
- app: "app";
453
- cli: "cli";
454
- plugin: "plugin";
455
- sdk: "sdk";
456
- }>;
457
- type ThreadCreateOrigin = z.infer<typeof threadCreateOriginSchema>;
458
473
  type ExecutionInputFieldSource = CallerExecutionInputSource;
459
- declare const startedOnBehalfOfSchema: z.ZodObject<{
460
- initiator: z.ZodEnum<{
461
- agent: "agent";
462
- system: "system";
463
- }>;
464
- senderThreadId: z.ZodString;
465
- }, z.core.$strip>;
466
- type StartedOnBehalfOf = z.infer<typeof startedOnBehalfOfSchema>;
467
474
  declare const threadResponseSchema: z.ZodObject<{
468
475
  activeBackgroundAgentCount: z.ZodNumber;
469
476
  archivedAt: z.ZodNullable<z.ZodNumber>;
@@ -1016,8 +1023,26 @@ interface MessageDispatchHookContext {
1016
1023
  /** Whether this attempt starts a turn or joins a running one. */
1017
1024
  attempt: PluginDispatchAttemptKind;
1018
1025
  /**
1019
- * The queued row this attempt is re-trying, or null when the attempt is
1020
- * inline and no row has ever existed for it.
1026
+ * The author category shared by this dispatch's messages: `user`, `agent`,
1027
+ * or `system`. `mixed` means the queued messages have different categories.
1028
+ * Different agents still share the `agent` category; read `queuedMessages`
1029
+ * for each message's author. `mixed` is a hook summary, not a turn initiator.
1030
+ */
1031
+ initiator: ThreadTurnInitiator | "mixed";
1032
+ /**
1033
+ * The thread that sent every message in this dispatch: a thread id, null
1034
+ * when none of them has a sender, or the literal `"mixed"` when the rows
1035
+ * disagree. A thread-start names its requesting thread; a message a human
1036
+ * typed and a core-driven retry have no sender. Null therefore still means
1037
+ * "nobody sent this" rather than "bb could not tell", so a handler may key
1038
+ * a human-versus-agent policy on it; `queuedMessages` names each row's own
1039
+ * sender. Thread ids are prefixed, so no id collides with `"mixed"`.
1040
+ */
1041
+ senderThreadId: string | "mixed" | null;
1042
+ /**
1043
+ * All queued rows this attempt is re-trying, in dispatch order. Empty for
1044
+ * an inline attempt. Each row retains its own content, author, and origin; `input`
1045
+ * contains their combined input, and the hook decides for the whole group.
1021
1046
  *
1022
1047
  * This is how a hook tells a fresh send from a re-attempt of something it
1023
1048
  * already decided about — the replacement for the old
@@ -1025,7 +1050,7 @@ interface MessageDispatchHookContext {
1025
1050
  * should treat the two identically; a hook that logs should not
1026
1051
  * double-count.
1027
1052
  */
1028
- queuedMessage: ThreadQueuedMessage | null;
1053
+ queuedMessages: ThreadQueuedMessage[];
1029
1054
  /**
1030
1055
  * Opaque JSON supplied by a plugin through the composer's
1031
1056
  * `experimental_submit`, paired with that plugin's id. Null for ordinary
@@ -1036,10 +1061,15 @@ interface MessageDispatchHookContext {
1036
1061
  pluginId: string;
1037
1062
  data: JsonValue;
1038
1063
  } | null;
1039
- /** How the dispatch was requested; null for internal/core-driven sends. */
1040
- origin: ThreadCreateOrigin | null;
1041
- originPluginId: string | null;
1042
- startedOnBehalfOf: StartedOnBehalfOf | null;
1064
+ /**
1065
+ * How the dispatch was requested; null for internal/core-driven sends, which
1066
+ * includes every follow-up, steer and retry. Persisted with the queued row,
1067
+ * so a drained re-attempt reads what its first attempt read. For a grouped
1068
+ * dispatch, each field is its shared value or `"mixed"` when rows differ,
1069
+ * including a value versus null. Each queued row exposes its own origin.
1070
+ */
1071
+ origin: ThreadCreateOrigin | "mixed" | null;
1072
+ originPluginId: string | "mixed" | null;
1043
1073
  parentThreadId: string | null;
1044
1074
  }
1045
1075
  /**
@@ -1077,6 +1107,23 @@ interface PluginCliContext {
1077
1107
  /** Aborted when the invoking CLI HTTP request disconnects. */
1078
1108
  signal?: AbortSignal;
1079
1109
  }
1110
+ /**
1111
+ * What a submitted form leaves in the thread timeline, chosen by the plugin.
1112
+ * bb never stores the form's payload or the submitted value; it stores only
1113
+ * this description, so a plugin decides what the transcript keeps.
1114
+ */
1115
+ interface PluginInteractionDescription {
1116
+ /** Row title once submitted; defaults to the presentation's completed label. */
1117
+ title?: string;
1118
+ /** Short Markdown for the expanded row. */
1119
+ detail?: string;
1120
+ /**
1121
+ * Persisted with the row and handed to this plugin's
1122
+ * `experimental_timelineRenderer` registered for `"<pluginId>/<rendererId>"`.
1123
+ * Omit anything the transcript must not keep.
1124
+ */
1125
+ payload?: JsonValue;
1126
+ }
1080
1127
  interface PluginInteractionRequest {
1081
1128
  threadId: string;
1082
1129
  rendererId: string;
@@ -1084,6 +1131,19 @@ interface PluginInteractionRequest {
1084
1131
  payload: JsonValue;
1085
1132
  /** Defaults to ten minutes; capped at one hour. */
1086
1133
  timeoutMs?: number;
1134
+ /**
1135
+ * How the form reads as a timeline row while it waits and once it settles,
1136
+ * in the same shape as a native tool's presentation. bb fills what is left
1137
+ * out: "Waiting for <title>" / "Submitted <title>" and the plugin's glyph.
1138
+ */
1139
+ presentation?: PluginRowPresentation;
1140
+ /**
1141
+ * Called once with the submitted value, before the waiting `requestInput`
1142
+ * promise resolves; never for a cancellation, which bb titles itself. Its
1143
+ * return is persisted on the row. A throw or a slow return leaves the row
1144
+ * with its completed label and nothing more.
1145
+ */
1146
+ describeSubmission?(value: JsonValue): PluginInteractionDescription | Promise<PluginInteractionDescription>;
1087
1147
  }
1088
1148
  interface PluginCliResult {
1089
1149
  exitCode: number;
@@ -1114,6 +1174,15 @@ interface PluginCliRegistration {
1114
1174
  /** Subcommand metadata rendered in help and the plugin-commands skill
1115
1175
  * without executing plugin code. Parsing argv is plugin-owned. */
1116
1176
  commands?: PluginCliCommandInfo[];
1177
+ /**
1178
+ * Set when `run` answers `--help` / `-h` itself, at every level, without
1179
+ * executing a command. The `bb` CLI then forwards help requests to the
1180
+ * plugin instead of printing the one-line `usage` from `commands`.
1181
+ * `defineCli` sets it. Leave it unset for a hand-written `run`:
1182
+ * the host cannot know that such a parser will not act on the other
1183
+ * arguments.
1184
+ */
1185
+ rendersHelp?: boolean;
1117
1186
  run(argv: string[], ctx: PluginCliContext): PluginCliResult | Promise<PluginCliResult>;
1118
1187
  }
1119
1188
  /** Per-turn context handed to bb.agents context providers (design §4.4). */
@@ -1134,30 +1203,37 @@ type PluginAgentToolResult = string | {
1134
1203
  interface PluginAgentToolContext {
1135
1204
  threadId: string;
1136
1205
  projectId: string;
1137
- /** The tool-call request's abort signal (aborts if the daemon round-trip
1138
- * is torn down mid-call). */
1206
+ /**
1207
+ * Aborts when the tool-call request is cancelled, the thread is stopped or
1208
+ * deleted, or this plugin is disposed. Opening a form with `bb.ui.requestInput`
1209
+ * detaches the call from its request: the agent receives a waiting notice,
1210
+ * and request cancellation no longer aborts this signal. The tool's eventual
1211
+ * result is delivered as a system message (success steers a running turn or
1212
+ * starts a new one; an `isError` result only steers). Thread stop/delete and
1213
+ * plugin disposal still abort the signal after detachment.
1214
+ */
1139
1215
  signal: AbortSignal;
1140
1216
  }
1141
1217
  /**
1142
- * The row title of a plugin tool call while it is pending and once it
1218
+ * The title of a plugin-owned timeline row while it is pending and once it
1143
1219
  * settled. Each label is capped at 80 characters and rendered as plain text.
1144
1220
  */
1145
- interface PluginAgentToolLabels {
1146
- /** Label shown while the tool call is pending. */
1221
+ interface PluginRowLabels {
1222
+ /** Label shown while the row is pending. */
1147
1223
  pending: string;
1148
- /** Label shown after the tool call completes successfully. */
1224
+ /** Label shown after the row completes successfully. */
1149
1225
  completed: string;
1150
1226
  }
1151
1227
  /**
1152
- * How calls to a native plugin tool read as a timeline row (grammar v3). Every
1153
- * field is optional at registration: the server fills what the plugin leaves
1154
- * out (a generic `Running <name>` / `Ran <name>` label; the plugin's branding
1155
- * glyph, then `Toolbox`) and hands one complete presentation to the provider
1156
- * bridge with the tool definition.
1228
+ * How something a plugin owns reads as a timeline row (grammar v3): a native
1229
+ * tool's calls, or the row a `bb.ui.requestInput` form leaves behind. Every
1230
+ * field is optional: the server fills what the plugin leaves out (a generic
1231
+ * label; the plugin's branding glyph, then `Toolbox`) and hands one complete
1232
+ * presentation to whatever renders the row.
1157
1233
  */
1158
- interface PluginAgentToolPresentation {
1159
- /** Row title while the call is pending and once it settled. */
1160
- label?: PluginAgentToolLabels;
1234
+ interface PluginRowPresentation {
1235
+ /** Row title while the row is pending and once it settled. */
1236
+ label?: PluginRowLabels;
1161
1237
  /**
1162
1238
  * A named host glyph (`{ glyph: "Workflow" }`), or one of this plugin's
1163
1239
  * own declared icons by its namespaced glyph (`{ glyph: "<pluginId>/<name>" }`,
@@ -1549,6 +1625,12 @@ interface PluginMentionItem {
1549
1625
  id: string;
1550
1626
  title: string;
1551
1627
  subtitle?: string;
1628
+ /**
1629
+ * BB icon name: a built-in name, or a name the plugin's app bundle
1630
+ * registered with `app.experimental_icons.register()`. The row prefers the
1631
+ * plugin's own branding icon when it ships one; unknown names fall back to
1632
+ * the generic plugin icon.
1633
+ */
1552
1634
  icon?: string;
1553
1635
  }
1554
1636
  /** Agent-only image context resolved with a plugin mention. */
@@ -1765,7 +1847,7 @@ declare function publishRpcMethod(method: string, contract: PluginRpcMethodContr
1765
1847
  * in a plugin unit test registers in bb, and one bb rejects is rejected
1766
1848
  * with the same message.
1767
1849
  */
1768
- declare function parsePluginAgentToolPresentation(toolName: string, value: unknown): PluginAgentToolPresentation | null;
1850
+ declare function parsePluginRowPresentation(subject: string, value: unknown): PluginRowPresentation | null;
1769
1851
  /** Compact issue summary from a (possibly foreign-instance) zod error. */
1770
1852
  declare function summarizeStandardIssues(issues: readonly StandardSchemaV1Issue[]): string;
1771
1853
  declare function enforcePluginCliOutputLimit(result: Omit<PluginCliExecutionResult, "error">, jsonOutput: boolean): PluginCliExecutionResult;
@@ -1919,6 +2001,7 @@ declare function normalizeCliRegistration(registration: PluginCliRegistration, a
1919
2001
  name: string;
1920
2002
  summary: string;
1921
2003
  commands: PluginCliCommandInfo[];
2004
+ rendersHelp: boolean;
1922
2005
  run: PluginCliRegistration["run"];
1923
2006
  };
1924
2007
  type AgentToolExecute = (params: unknown, ctx: PluginAgentToolContext) => PluginAgentToolResult | Promise<PluginAgentToolResult>;
@@ -1936,14 +2019,14 @@ declare function normalizeAgentToolRegistration(args: {
1936
2019
  name: string;
1937
2020
  description: string;
1938
2021
  instructions?: string;
1939
- presentation?: PluginAgentToolPresentation;
2022
+ presentation?: PluginRowPresentation;
1940
2023
  parameters: unknown;
1941
2024
  execute(params: never, ctx: PluginAgentToolContext): PluginAgentToolResult | Promise<PluginAgentToolResult>;
1942
2025
  };
1943
2026
  }): {
1944
2027
  name: string;
1945
2028
  description: string;
1946
- presentation: PluginAgentToolPresentation | null;
2029
+ presentation: PluginRowPresentation | null;
1947
2030
  instructions: string | null;
1948
2031
  inputSchema: unknown;
1949
2032
  parse: AgentToolParse;
@@ -1958,13 +2041,16 @@ declare function normalizeMentionProviderRegistration(provider: PluginMentionPro
1958
2041
  search: PluginMentionProviderRegistration["search"];
1959
2042
  resolve: PluginMentionProviderRegistration["resolve"];
1960
2043
  };
1961
- declare function normalizeInteractionRequest(request: PluginInteractionRequest): {
2044
+ interface NormalizedPluginInteractionRequest {
1962
2045
  threadId: string;
1963
2046
  rendererId: string;
1964
2047
  title: string;
1965
2048
  payload: JsonValue;
1966
2049
  timeoutMs: number;
1967
- };
2050
+ presentation: PluginRowPresentation | null;
2051
+ describeSubmission: NonNullable<PluginInteractionRequest["describeSubmission"]> | null;
2052
+ }
2053
+ declare function normalizeInteractionRequest(request: PluginInteractionRequest): NormalizedPluginInteractionRequest;
1968
2054
  declare function validateProviderEnvContribution(label: "provider environment contribution" | "provider environment health contribution", providerId: string, resolve: unknown, registered: ReadonlyMap<string, unknown>): void;
1969
2055
  declare function normalizePluginAgentConfiguration(args: {
1970
2056
  knownSkillIds: ReadonlySet<string>;
@@ -1980,5 +2066,5 @@ declare function normalizePluginAgentConfiguration(args: {
1980
2066
  declare function validateRpcValue(schema: StandardSchemaV1, value: unknown, phase: "input" | "output", fail: (error: PluginRpcError) => never): Promise<unknown>;
1981
2067
  declare function normalizeRpcJsonResult(value: unknown, fail: (error: PluginRpcError) => never): JsonValue;
1982
2068
 
1983
- export { ENVIRONMENT_PROVIDER_DESCRIPTION_MAX_CHARS, ENVIRONMENT_PROVIDER_DISPLAY_NAME_MAX_CHARS, ENVIRONMENT_PROVIDER_ID_PATTERN, ENVIRONMENT_PROVIDER_REQUIREMENT_NAMES, KV_VALUE_MAX_BYTES, MACHINE_PROVIDER_DESCRIPTION_MAX_CHARS, PLUGIN_AGENT_STATUS_LABEL_MAX_CHARS, PLUGIN_MENTION_TRIGGER_VALUES, PLUGIN_PROVIDER_BRIDGE_OPTIONS_MAX_BYTES, PLUGIN_PROVIDER_COMPOSER_ACTION_VALUES, PLUGIN_PROVIDER_DISPLAY_NAME_MAX_CHARS, PLUGIN_PROVIDER_ENV_MAX_ENTRIES, PLUGIN_PROVIDER_ENV_NAME_PATTERN, PLUGIN_PROVIDER_PERMISSION_MODE_VALUES, PLUGIN_PROVIDER_REASONING_LEVEL_VALUES, PROVIDER_ID_PATTERN, RESERVED_AGENT_TOOL_NAMES, RESERVED_BB_CLI_COMMANDS, SERVER_DIRECT_AI_SERVICE_IDS, SETTING_KEY_PATTERN, adoptHttpRouteResponse, aiServiceAlreadyRegisteredMessage, assertAiServiceRegistrable, coerceStoredPluginSettingValue, deriveValidatedProviderOptions, enforcePluginCliOutputLimit, environmentCompositionSchema, isPluginMentionTrigger, isStandardSchema, normalizeAgentToolRegistration, normalizeCliRegistration, normalizeHttpRouteRegistration, normalizeInteractionRequest, normalizeMentionProviderRegistration, normalizePluginAgentConfiguration, normalizeRealtimePayload, normalizeRpcJsonResult, normalizeRpcRegistration, normalizeWebSocketRouteRegistration, parsePluginAgentToolPresentation, pluginCliCollisionWarning, pluginHookAlreadyRegisteredMessage, providerAlreadyRegisteredMessage, providerIconRefusalMessage, providerWithoutBridgeMessage, publishRpcMethod, readRpcPublicationOptions, registerSettingDescriptors, runPluginStorageMigrations, storePluginHook, summarizeStandardIssues, undeclaredIconProblem, validateBackgroundServiceRegistration, validatePluginAiServiceDeclaration, validatePluginEnvironmentProviderDeclaration, validatePluginMachineProviderDeclaration, validatePluginProviderDeclaration, validatePluginProviderEnvEntries, validateProviderEnvContribution, validateRpcValue, validateScheduleRegistration, validateServerAccessProviderDeclaration, validateSettingsUpdate };
1984
- export type { AiServiceHostBinding, NormalizedPluginEnvironmentComposition, NormalizedPluginEnvironmentProvider, NormalizedPluginEnvironmentProviderRequirements, NormalizedPluginMachineProvider, NormalizedPluginProviderDeclaration };
2069
+ export { ENVIRONMENT_PROVIDER_DESCRIPTION_MAX_CHARS, ENVIRONMENT_PROVIDER_DISPLAY_NAME_MAX_CHARS, ENVIRONMENT_PROVIDER_ID_PATTERN, ENVIRONMENT_PROVIDER_REQUIREMENT_NAMES, KV_VALUE_MAX_BYTES, MACHINE_PROVIDER_DESCRIPTION_MAX_CHARS, PLUGIN_AGENT_STATUS_LABEL_MAX_CHARS, PLUGIN_MENTION_TRIGGER_VALUES, PLUGIN_PROVIDER_BRIDGE_OPTIONS_MAX_BYTES, PLUGIN_PROVIDER_COMPOSER_ACTION_VALUES, PLUGIN_PROVIDER_DISPLAY_NAME_MAX_CHARS, PLUGIN_PROVIDER_ENV_MAX_ENTRIES, PLUGIN_PROVIDER_ENV_NAME_PATTERN, PLUGIN_PROVIDER_PERMISSION_MODE_VALUES, PLUGIN_PROVIDER_REASONING_LEVEL_VALUES, PROVIDER_ID_PATTERN, RESERVED_AGENT_TOOL_NAMES, RESERVED_BB_CLI_COMMANDS, SERVER_DIRECT_AI_SERVICE_IDS, SETTING_KEY_PATTERN, adoptHttpRouteResponse, aiServiceAlreadyRegisteredMessage, assertAiServiceRegistrable, coerceStoredPluginSettingValue, deriveValidatedProviderOptions, enforcePluginCliOutputLimit, environmentCompositionSchema, isPluginMentionTrigger, isStandardSchema, normalizeAgentToolRegistration, normalizeCliRegistration, normalizeHttpRouteRegistration, normalizeInteractionRequest, normalizeMentionProviderRegistration, normalizePluginAgentConfiguration, normalizeRealtimePayload, normalizeRpcJsonResult, normalizeRpcRegistration, normalizeWebSocketRouteRegistration, parsePluginRowPresentation, pluginCliCollisionWarning, pluginHookAlreadyRegisteredMessage, providerAlreadyRegisteredMessage, providerIconRefusalMessage, providerWithoutBridgeMessage, publishRpcMethod, readRpcPublicationOptions, registerSettingDescriptors, runPluginStorageMigrations, storePluginHook, summarizeStandardIssues, undeclaredIconProblem, validateBackgroundServiceRegistration, validatePluginAiServiceDeclaration, validatePluginEnvironmentProviderDeclaration, validatePluginMachineProviderDeclaration, validatePluginProviderDeclaration, validatePluginProviderEnvEntries, validateProviderEnvContribution, validateRpcValue, validateScheduleRegistration, validateServerAccessProviderDeclaration, validateSettingsUpdate };
2070
+ export type { AiServiceHostBinding, NormalizedPluginEnvironmentComposition, NormalizedPluginEnvironmentProvider, NormalizedPluginEnvironmentProviderRequirements, NormalizedPluginInteractionRequest, NormalizedPluginMachineProvider, NormalizedPluginProviderDeclaration };
@@ -3589,6 +3589,7 @@ declare const threadEventSchema: z.ZodPipe<z.ZodUnknown, z.ZodUnion<readonly [z.
3589
3589
  "child-outcome-batch": "child-outcome-batch";
3590
3590
  "ownership-assigned": "ownership-assigned";
3591
3591
  "ownership-removed": "ownership-removed";
3592
+ "tool-result-delivered": "tool-result-delivered";
3592
3593
  unlabeled: "unlabeled";
3593
3594
  }>>;
3594
3595
  systemMessageSubject: z.ZodOptional<z.ZodNullable<z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -3598,6 +3599,10 @@ declare const threadEventSchema: z.ZodPipe<z.ZodUnknown, z.ZodUnion<readonly [z.
3598
3599
  }, z.core.$strip>, z.ZodObject<{
3599
3600
  count: z.ZodNumber;
3600
3601
  kind: z.ZodLiteral<"thread-batch">;
3602
+ }, z.core.$strip>, z.ZodObject<{
3603
+ kind: z.ZodLiteral<"tool-call">;
3604
+ suppress: z.ZodBoolean;
3605
+ toolName: z.ZodString;
3601
3606
  }, z.core.$strip>], "kind">>>;
3602
3607
  target: z.ZodDiscriminatedUnion<[z.ZodObject<{
3603
3608
  kind: z.ZodLiteral<"thread-start">;
@@ -3851,9 +3856,39 @@ declare const threadEventSchema: z.ZodPipe<z.ZodUnknown, z.ZodUnion<readonly [z.
3851
3856
  }, z.core.$strip>;
3852
3857
  payload: z.ZodObject<{
3853
3858
  kind: z.ZodLiteral<"plugin">;
3859
+ presentation: z.ZodOptional<z.ZodObject<{
3860
+ badge: z.ZodOptional<z.ZodObject<{
3861
+ glyph: z.ZodString;
3862
+ hint: z.ZodString;
3863
+ label: z.ZodString;
3864
+ tone: z.ZodEnum<{
3865
+ destructive: "destructive";
3866
+ neutral: "neutral";
3867
+ }>;
3868
+ }, z.core.$strip>>;
3869
+ detail: z.ZodOptional<z.ZodString>;
3870
+ icon: z.ZodObject<{
3871
+ glyph: z.ZodString;
3872
+ }, z.core.$strip>;
3873
+ label: z.ZodObject<{
3874
+ completed: z.ZodString;
3875
+ pending: z.ZodString;
3876
+ }, z.core.$strip>;
3877
+ suppress: z.ZodOptional<z.ZodBoolean>;
3878
+ tint: z.ZodOptional<z.ZodObject<{
3879
+ dark: z.ZodString;
3880
+ light: z.ZodString;
3881
+ }, z.core.$strip>>;
3882
+ title: z.ZodOptional<z.ZodString>;
3883
+ }, z.core.$strip>>;
3854
3884
  title: z.ZodString;
3855
3885
  }, z.core.$strip>;
3856
3886
  resolution: z.ZodNullable<z.ZodObject<{
3887
+ description: z.ZodOptional<z.ZodObject<{
3888
+ detail: z.ZodOptional<z.ZodString>;
3889
+ payload: z.ZodOptional<z.ZodType<JsonValue, unknown, z.core.$ZodTypeInternals<JsonValue, unknown>>>;
3890
+ title: z.ZodOptional<z.ZodString>;
3891
+ }, z.core.$strip>>;
3857
3892
  kind: z.ZodLiteral<"plugin_submitted">;
3858
3893
  }, z.core.$strip>>;
3859
3894
  status: z.ZodEnum<{