@get-bb/plugin-sdk 0.4.104 → 0.4.108

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.
@@ -2102,6 +2102,8 @@ interface ComposerCustomization {
2102
2102
  /** Host-rendered menu row in the composer's `+` menu. */
2103
2103
  interface ComposerPlusMenuItem {
2104
2104
  id: string;
2105
+ /** Also offer this action in the desktop send dropdown and mobile long-press menu. */
2106
+ experimental_sendMenu?: boolean;
2105
2107
  label: string;
2106
2108
  /** Drawn only when the manifest declares no `bb.branding.icon`. */
2107
2109
  icon?: BbIconName;
@@ -2470,9 +2472,8 @@ interface ExperimentalProviderModelPickerProps {
2470
2472
  /**
2471
2473
  * Props of the host-owned `experimental_BranchPicker` component — bb's branch
2472
2474
  * picker bundled with its branch-options loading for the given host and
2473
- * project, the control bb's own New Thread composer renders as "Branch from".
2474
- * The host owns fetching, searching, and refreshing the branch list; the
2475
- * caller owns only the selection.
2475
+ * project. The host owns fetching, searching, and refreshing the branch list;
2476
+ * the caller owns the selection and its meaning.
2476
2477
  */
2477
2478
  interface BranchPickerProps {
2478
2479
  /**
@@ -2483,21 +2484,21 @@ interface BranchPickerProps {
2483
2484
  /** The project whose source on `hostId` is listed; null disables loading. */
2484
2485
  projectId: string | null;
2485
2486
  /**
2486
- * The selected branch name, or null when no branch is chosen (the host
2487
- * shows its placeholder and the consumer falls back to its own default).
2487
+ * The selected branch name, or null when no branch is chosen. A null value
2488
+ * shows the placeholder without selecting or implying a default branch.
2488
2489
  */
2489
2490
  value: string | null;
2490
2491
  /** Called with the picked branch name, or null when the pick is cleared. */
2491
2492
  onChange(next: string | null): void;
2492
2493
  /**
2493
- * Text placed before the branch on the trigger, e.g. "Base:". Omitted, the
2494
- * trigger is the branch alone.
2494
+ * Text placed before the branch on the trigger and used as the menu heading,
2495
+ * e.g. "Compare with:". Omitted, the trigger is the branch alone and the menu
2496
+ * uses the neutral "Branches" heading.
2495
2497
  */
2496
2498
  label?: string;
2497
2499
  /**
2498
- * The trigger while nothing is picked. Omitted, the host shows the resolved
2499
- * default worktree base branch muted, or a neutral `default` placeholder
2500
- * when the base cannot be resolved.
2500
+ * The complete trigger text while nothing is picked, without the label
2501
+ * prefix. Defaults to "Select branch".
2501
2502
  */
2502
2503
  placeholder?: string;
2503
2504
  /** Render the current selection without allowing changes. */
@@ -292,6 +292,8 @@ interface PluginEnvironmentProviderDefinition<R extends PluginEnvironmentProvide
292
292
  /** Experimental per-machine availability, probed in the background for pickers and again at thread creation: see docs/api_to_audit.md. */
293
293
  availability?(context: PluginEnvironmentProviderAvailabilityContext): PluginEnvironmentProviderAvailability | Promise<PluginEnvironmentProviderAvailability>;
294
294
  validate?(context: PluginEnvironmentProviderValidateContext<R, S>): PluginEnvironmentValidateDecision | Promise<PluginEnvironmentValidateDecision>;
295
+ /** Pure path selection from parsed inputs. Core reuses a recorded environment on the selected host before calling create; null requests normal creation. */
296
+ experimental_existingPath?(inputs: InputsValue<S>): string | null;
295
297
  create(context: PluginEnvironmentProviderCreateContext<R, S>): Promise<PluginEnvironmentProviderCreateResult>;
296
298
  remove(context: PluginEnvironmentProviderRemoveContext): Promise<PluginEnvironmentProviderRemoveResult>;
297
299
  }
@@ -630,6 +630,8 @@ interface PluginEnvironmentProviderDefinition<R extends PluginEnvironmentProvide
630
630
  /** Experimental per-machine availability, probed in the background for pickers and again at thread creation: see docs/api_to_audit.md. */
631
631
  availability?(context: PluginEnvironmentProviderAvailabilityContext): PluginEnvironmentProviderAvailability | Promise<PluginEnvironmentProviderAvailability>;
632
632
  validate?(context: PluginEnvironmentProviderValidateContext<R, S>): PluginEnvironmentValidateDecision | Promise<PluginEnvironmentValidateDecision>;
633
+ /** Pure path selection from parsed inputs. Core reuses a recorded environment on the selected host before calling create; null requests normal creation. */
634
+ experimental_existingPath?(inputs: InputsValue$1<S>): string | null;
633
635
  create(context: PluginEnvironmentProviderCreateContext<R, S>): Promise<PluginEnvironmentProviderCreateResult>;
634
636
  remove(context: PluginEnvironmentProviderRemoveContext): Promise<PluginEnvironmentProviderRemoveResult>;
635
637
  }
@@ -1931,6 +1933,7 @@ interface NormalizedPluginEnvironmentProvider {
1931
1933
  inputsJsonSchema: JsonValue | null;
1932
1934
  availability: NonNullable<PluginEnvironmentProviderDeclaration["availability"]> | null;
1933
1935
  validate: NonNullable<PluginEnvironmentProviderDeclaration["validate"]> | null;
1936
+ experimental_existingPath: NonNullable<PluginEnvironmentProviderDeclaration["experimental_existingPath"]> | null;
1934
1937
  create: PluginEnvironmentProviderDeclaration["create"];
1935
1938
  remove: PluginEnvironmentProviderDeclaration["remove"];
1936
1939
  policy: PluginEnvironmentProviderPolicy;
@@ -423,6 +423,8 @@ interface PluginEnvironmentProviderDefinition<R extends PluginEnvironmentProvide
423
423
  /** Experimental per-machine availability, probed in the background for pickers and again at thread creation: see docs/api_to_audit.md. */
424
424
  availability?(context: PluginEnvironmentProviderAvailabilityContext): PluginEnvironmentProviderAvailability | Promise<PluginEnvironmentProviderAvailability>;
425
425
  validate?(context: PluginEnvironmentProviderValidateContext<R, S>): PluginEnvironmentValidateDecision | Promise<PluginEnvironmentValidateDecision>;
426
+ /** Pure path selection from parsed inputs. Core reuses a recorded environment on the selected host before calling create; null requests normal creation. */
427
+ experimental_existingPath?(inputs: InputsValue<S>): string | null;
426
428
  create(context: PluginEnvironmentProviderCreateContext<R, S>): Promise<PluginEnvironmentProviderCreateResult>;
427
429
  remove(context: PluginEnvironmentProviderRemoveContext): Promise<PluginEnvironmentProviderRemoveResult>;
428
430
  }
@@ -980,6 +982,7 @@ interface NormalizedPluginEnvironmentProvider {
980
982
  inputsJsonSchema: JsonValue | null;
981
983
  availability: NonNullable<PluginEnvironmentProviderDeclaration["availability"]> | null;
982
984
  validate: NonNullable<PluginEnvironmentProviderDeclaration["validate"]> | null;
985
+ experimental_existingPath: NonNullable<PluginEnvironmentProviderDeclaration["experimental_existingPath"]> | null;
983
986
  create: PluginEnvironmentProviderDeclaration["create"];
984
987
  remove: PluginEnvironmentProviderDeclaration["remove"];
985
988
  policy: PluginEnvironmentProviderPolicy;
@@ -98,7 +98,7 @@ declare const appSettingsUpdateSchema: z$1.ZodUnion<readonly [z$1.ZodObject<{
98
98
  }, z$1.core.$strict>]>;
99
99
  type AppSettingsUpdate = z$1.infer<typeof appSettingsUpdateSchema>;
100
100
 
101
- declare const UI_PREFERENCE_KEYS: readonly ["sidebar.organizationMode", "sidebar.threadGrouping.environment", "sidebar.chronologicalSort", "sidebar.sortDirection", "sidebar.sectionOrder", "sidebar.manualSectionOrder", "sidebar.machineSectionOrder", "sidebar.collapsedSections", "sidebar.collapsedProjects", "sidebar.collapsedThreads", "sidebar.collapsedEnvironments", "sidebar.collapsedThreadSections", "sidebar.collapsedMachines", "sidebar.footerOrder", "sidebar.hiddenFooterItems", "sidebar.pluginPanelOrder", "sidebar.visiblePluginPanels", "sidebar.navigationProvider", "sidebar.threadListProvider"];
101
+ declare const UI_PREFERENCE_KEYS: readonly ["sidebar.organizationMode", "sidebar.threadGrouping.environment", "sidebar.chronologicalSort", "sidebar.sortDirection", "sidebar.sectionOrder", "sidebar.manualSectionOrder", "sidebar.machineSectionOrder", "sidebar.hiddenGroups", "sidebar.collapsedSections", "sidebar.collapsedProjects", "sidebar.collapsedThreads", "sidebar.collapsedEnvironments", "sidebar.collapsedThreadSections", "sidebar.collapsedMachines", "sidebar.footerOrder", "sidebar.hiddenFooterItems", "sidebar.pluginPanelOrder", "sidebar.visiblePluginPanels", "sidebar.navigationProvider", "sidebar.threadListProvider"];
102
102
  type UiPreferenceKey = (typeof UI_PREFERENCE_KEYS)[number];
103
103
  interface UiPreferenceDefinition<Schema extends z$1.ZodTypeAny = z$1.ZodTypeAny> {
104
104
  schema: Schema;
@@ -126,6 +126,7 @@ declare const uiPreferenceDefinitions: {
126
126
  readonly "sidebar.sectionOrder": UiPreferenceDefinition<z$1.ZodArray<z$1.ZodString>>;
127
127
  readonly "sidebar.manualSectionOrder": UiPreferenceDefinition<z$1.ZodArray<z$1.ZodString>>;
128
128
  readonly "sidebar.machineSectionOrder": UiPreferenceDefinition<z$1.ZodArray<z$1.ZodString>>;
129
+ readonly "sidebar.hiddenGroups": UiPreferenceDefinition<z$1.ZodPipe<z$1.ZodArray<z$1.ZodString>, z$1.ZodTransform<string[], string[]>>>;
129
130
  readonly "sidebar.collapsedSections": UiPreferenceDefinition<z$1.ZodArray<z$1.ZodEnum<{
130
131
  pinned: "pinned";
131
132
  threads: "threads";
@@ -179,11 +180,19 @@ declare const appKeybindingOverridesSchema: z$1.ZodArray<z$1.ZodObject<{
179
180
  "pane.focus.6": "pane.focus.6";
180
181
  "pane.focus.7": "pane.focus.7";
181
182
  "pane.focus.8": "pane.focus.8";
183
+ "pane.focus.down": "pane.focus.down";
184
+ "pane.focus.left": "pane.focus.left";
182
185
  "pane.focus.next": "pane.focus.next";
183
186
  "pane.focus.previous": "pane.focus.previous";
187
+ "pane.focus.right": "pane.focus.right";
188
+ "pane.focus.up": "pane.focus.up";
184
189
  "pane.maximize.toggle": "pane.maximize.toggle";
185
190
  "panel.close": "panel.close";
186
191
  "panel.newTab": "panel.newTab";
192
+ "panel.nextNewTabItem": "panel.nextNewTabItem";
193
+ "panel.nextTab": "panel.nextTab";
194
+ "panel.previousNewTabItem": "panel.previousNewTabItem";
195
+ "panel.previousTab": "panel.previousTab";
187
196
  "panel.reopenClosedTab": "panel.reopenClosedTab";
188
197
  "panel.toggle": "panel.toggle";
189
198
  "question.select.1": "question.select.1";
@@ -9936,11 +9945,19 @@ declare const systemConfigResponseSchema: z$1.ZodObject<{
9936
9945
  "pane.focus.6": "pane.focus.6";
9937
9946
  "pane.focus.7": "pane.focus.7";
9938
9947
  "pane.focus.8": "pane.focus.8";
9948
+ "pane.focus.down": "pane.focus.down";
9949
+ "pane.focus.left": "pane.focus.left";
9939
9950
  "pane.focus.next": "pane.focus.next";
9940
9951
  "pane.focus.previous": "pane.focus.previous";
9952
+ "pane.focus.right": "pane.focus.right";
9953
+ "pane.focus.up": "pane.focus.up";
9941
9954
  "pane.maximize.toggle": "pane.maximize.toggle";
9942
9955
  "panel.close": "panel.close";
9943
9956
  "panel.newTab": "panel.newTab";
9957
+ "panel.nextNewTabItem": "panel.nextNewTabItem";
9958
+ "panel.nextTab": "panel.nextTab";
9959
+ "panel.previousNewTabItem": "panel.previousNewTabItem";
9960
+ "panel.previousTab": "panel.previousTab";
9944
9961
  "panel.reopenClosedTab": "panel.reopenClosedTab";
9945
9962
  "panel.toggle": "panel.toggle";
9946
9963
  "question.select.1": "question.select.1";
@@ -10071,11 +10088,19 @@ declare const systemConfigResponseSchema: z$1.ZodObject<{
10071
10088
  "pane.focus.6": "pane.focus.6";
10072
10089
  "pane.focus.7": "pane.focus.7";
10073
10090
  "pane.focus.8": "pane.focus.8";
10091
+ "pane.focus.down": "pane.focus.down";
10092
+ "pane.focus.left": "pane.focus.left";
10074
10093
  "pane.focus.next": "pane.focus.next";
10075
10094
  "pane.focus.previous": "pane.focus.previous";
10095
+ "pane.focus.right": "pane.focus.right";
10096
+ "pane.focus.up": "pane.focus.up";
10076
10097
  "pane.maximize.toggle": "pane.maximize.toggle";
10077
10098
  "panel.close": "panel.close";
10078
10099
  "panel.newTab": "panel.newTab";
10100
+ "panel.nextNewTabItem": "panel.nextNewTabItem";
10101
+ "panel.nextTab": "panel.nextTab";
10102
+ "panel.previousNewTabItem": "panel.previousNewTabItem";
10103
+ "panel.previousTab": "panel.previousTab";
10079
10104
  "panel.reopenClosedTab": "panel.reopenClosedTab";
10080
10105
  "panel.toggle": "panel.toggle";
10081
10106
  "question.select.1": "question.select.1";
@@ -10146,11 +10171,19 @@ declare const systemConfigResponseSchema: z$1.ZodObject<{
10146
10171
  "pane.focus.6": "pane.focus.6";
10147
10172
  "pane.focus.7": "pane.focus.7";
10148
10173
  "pane.focus.8": "pane.focus.8";
10174
+ "pane.focus.down": "pane.focus.down";
10175
+ "pane.focus.left": "pane.focus.left";
10149
10176
  "pane.focus.next": "pane.focus.next";
10150
10177
  "pane.focus.previous": "pane.focus.previous";
10178
+ "pane.focus.right": "pane.focus.right";
10179
+ "pane.focus.up": "pane.focus.up";
10151
10180
  "pane.maximize.toggle": "pane.maximize.toggle";
10152
10181
  "panel.close": "panel.close";
10153
10182
  "panel.newTab": "panel.newTab";
10183
+ "panel.nextNewTabItem": "panel.nextNewTabItem";
10184
+ "panel.nextTab": "panel.nextTab";
10185
+ "panel.previousNewTabItem": "panel.previousNewTabItem";
10186
+ "panel.previousTab": "panel.previousTab";
10154
10187
  "panel.reopenClosedTab": "panel.reopenClosedTab";
10155
10188
  "panel.toggle": "panel.toggle";
10156
10189
  "question.select.1": "question.select.1";
@@ -14098,6 +14131,13 @@ declare const timelineTurnSummaryDetailsResponseSchema: z$1.ZodObject<{
14098
14131
  rows: z$1.ZodArray<z$1.ZodType<TimelineRow, unknown, z$1.core.$ZodTypeInternals<TimelineRow, unknown>>>;
14099
14132
  }, z$1.core.$strip>;
14100
14133
  type TimelineTurnSummaryDetailsResponse = z$1.infer<typeof timelineTurnSummaryDetailsResponseSchema>;
14134
+ declare const threadImageMetadataSchema: z$1.ZodObject<{
14135
+ etag: z$1.ZodNullable<z$1.ZodString>;
14136
+ height: z$1.ZodNumber;
14137
+ source: z$1.ZodString;
14138
+ width: z$1.ZodNumber;
14139
+ }, z$1.core.$strip>;
14140
+ type ThreadImageMetadata = z$1.infer<typeof threadImageMetadataSchema>;
14101
14141
  declare const threadTimelineResponseSchema: z$1.ZodObject<{
14102
14142
  activeBackgroundCommands: z$1.ZodArray<z$1.ZodObject<{
14103
14143
  completedAt: z$1.ZodNullable<z$1.ZodNumber>;
@@ -14364,6 +14404,12 @@ declare const threadTimelineResponseSchema: z$1.ZodObject<{
14364
14404
  tokensUsed: z$1.ZodNumber;
14365
14405
  updatedAt: z$1.ZodNumber;
14366
14406
  }, z$1.core.$strip>>;
14407
+ imageMetadata: z$1.ZodOptional<z$1.ZodArray<z$1.ZodObject<{
14408
+ etag: z$1.ZodNullable<z$1.ZodString>;
14409
+ height: z$1.ZodNumber;
14410
+ source: z$1.ZodString;
14411
+ width: z$1.ZodNumber;
14412
+ }, z$1.core.$strip>>>;
14367
14413
  maxSeq: z$1.ZodNumber;
14368
14414
  modelFallback: z$1.ZodNullable<z$1.ZodObject<{
14369
14415
  detectedAt: z$1.ZodNumber;
@@ -16847,6 +16893,8 @@ interface ComposerCustomization {
16847
16893
  /** Host-rendered menu row in the composer's `+` menu. */
16848
16894
  interface ComposerPlusMenuItem {
16849
16895
  id: string;
16896
+ /** Also offer this action in the desktop send dropdown and mobile long-press menu. */
16897
+ experimental_sendMenu?: boolean;
16850
16898
  label: string;
16851
16899
  /** Drawn only when the manifest declares no `bb.branding.icon`. */
16852
16900
  icon?: BbIconName;
@@ -17215,9 +17263,8 @@ interface ExperimentalProviderModelPickerProps {
17215
17263
  /**
17216
17264
  * Props of the host-owned `experimental_BranchPicker` component — bb's branch
17217
17265
  * picker bundled with its branch-options loading for the given host and
17218
- * project, the control bb's own New Thread composer renders as "Branch from".
17219
- * The host owns fetching, searching, and refreshing the branch list; the
17220
- * caller owns only the selection.
17266
+ * project. The host owns fetching, searching, and refreshing the branch list;
17267
+ * the caller owns the selection and its meaning.
17221
17268
  */
17222
17269
  interface BranchPickerProps {
17223
17270
  /**
@@ -17228,21 +17275,21 @@ interface BranchPickerProps {
17228
17275
  /** The project whose source on `hostId` is listed; null disables loading. */
17229
17276
  projectId: string | null;
17230
17277
  /**
17231
- * The selected branch name, or null when no branch is chosen (the host
17232
- * shows its placeholder and the consumer falls back to its own default).
17278
+ * The selected branch name, or null when no branch is chosen. A null value
17279
+ * shows the placeholder without selecting or implying a default branch.
17233
17280
  */
17234
17281
  value: string | null;
17235
17282
  /** Called with the picked branch name, or null when the pick is cleared. */
17236
17283
  onChange(next: string | null): void;
17237
17284
  /**
17238
- * Text placed before the branch on the trigger, e.g. "Base:". Omitted, the
17239
- * trigger is the branch alone.
17285
+ * Text placed before the branch on the trigger and used as the menu heading,
17286
+ * e.g. "Compare with:". Omitted, the trigger is the branch alone and the menu
17287
+ * uses the neutral "Branches" heading.
17240
17288
  */
17241
17289
  label?: string;
17242
17290
  /**
17243
- * The trigger while nothing is picked. Omitted, the host shows the resolved
17244
- * default worktree base branch muted, or a neutral `default` placeholder
17245
- * when the base cannot be resolved.
17291
+ * The complete trigger text while nothing is picked, without the label
17292
+ * prefix. Defaults to "Select branch".
17246
17293
  */
17247
17294
  placeholder?: string;
17248
17295
  /** Render the current selection without allowing changes. */
@@ -17917,6 +17964,8 @@ interface PluginEnvironmentProviderDefinition<R extends PluginEnvironmentProvide
17917
17964
  /** Experimental per-machine availability, probed in the background for pickers and again at thread creation: see docs/api_to_audit.md. */
17918
17965
  availability?(context: PluginEnvironmentProviderAvailabilityContext): PluginEnvironmentProviderAvailability | Promise<PluginEnvironmentProviderAvailability>;
17919
17966
  validate?(context: PluginEnvironmentProviderValidateContext<R, S>): PluginEnvironmentValidateDecision$1 | Promise<PluginEnvironmentValidateDecision$1>;
17967
+ /** Pure path selection from parsed inputs. Core reuses a recorded environment on the selected host before calling create; null requests normal creation. */
17968
+ experimental_existingPath?(inputs: InputsValue<S>): string | null;
17920
17969
  create(context: PluginEnvironmentProviderCreateContext<R, S>): Promise<PluginEnvironmentProviderCreateResult>;
17921
17970
  remove(context: PluginEnvironmentProviderRemoveContext): Promise<PluginEnvironmentProviderRemoveResult>;
17922
17971
  }
@@ -19376,6 +19425,9 @@ interface ThreadsArea {
19376
19425
  tabs: ThreadTabsArea;
19377
19426
  context(args: ThreadStatusArgs): Promise<ThreadContextResult>;
19378
19427
  timeline(args: ThreadTimelineArgs): Promise<ThreadTimelineResult>;
19428
+ saveImageMetadata(args: ThreadImageMetadata & ThreadStatusArgs): Promise<{
19429
+ ok: true;
19430
+ }>;
19379
19431
  timelineTurnSummaryDetails(args: ThreadTimelineTurnSummaryDetailsArgs): Promise<ThreadTimelineTurnSummaryDetailsResult>;
19380
19432
  storageFiles(args: ThreadStorageFilesArgs): Promise<ThreadStorageFilesResult>;
19381
19433
  storageLocation(args: ThreadStatusArgs): Promise<ThreadStorageLocationResult>;
@@ -159,6 +159,12 @@ function parseRegions(kind, registration, onRejected) {
159
159
  "description",
160
160
  entry?.description
161
161
  );
162
+ const sendMenu = entry?.experimental_sendMenu;
163
+ if (sendMenu !== void 0 && typeof sendMenu !== "boolean") {
164
+ throw new Error(
165
+ `${entryKind}: "experimental_sendMenu" must be a boolean when set`
166
+ );
167
+ }
162
168
  const disabled = entry?.disabled;
163
169
  if (disabled !== void 0 && typeof disabled !== "boolean" && typeof disabled !== "function") {
164
170
  throw new Error(
@@ -168,6 +174,7 @@ function parseRegions(kind, registration, onRejected) {
168
174
  return {
169
175
  id,
170
176
  label: requireNonEmptyString(entryKind, "label", entry?.label),
177
+ ...sendMenu !== void 0 ? { experimental_sendMenu: sendMenu } : {},
171
178
  ...icon !== void 0 ? { icon } : {},
172
179
  ...description !== void 0 ? { description } : {},
173
180
  ...disabled !== void 0 ? {
@@ -1983,6 +1983,12 @@ function validatePluginEnvironmentProviderDeclaration(declaration) {
1983
1983
  declaration.availability,
1984
1984
  "availability"
1985
1985
  );
1986
+ assertOptionalFunction(
1987
+ "environment provider",
1988
+ id,
1989
+ declaration.experimental_existingPath,
1990
+ "experimental_existingPath"
1991
+ );
1986
1992
  return {
1987
1993
  id,
1988
1994
  displayName,
@@ -1993,6 +1999,7 @@ function validatePluginEnvironmentProviderDeclaration(declaration) {
1993
1999
  inputsJsonSchema: inputs === null ? null : inputs.jsonSchema,
1994
2000
  availability: declaration.availability ?? null,
1995
2001
  validate: declaration.validate ?? null,
2002
+ experimental_existingPath: declaration.experimental_existingPath ?? null,
1996
2003
  create: declaration.create,
1997
2004
  remove: declaration.remove,
1998
2005
  policy: environmentProviderPolicySchema.parse(declaration.policy ?? {})
@@ -13902,6 +13902,12 @@ function parseRegions(kind, registration, onRejected) {
13902
13902
  "description",
13903
13903
  entry?.description
13904
13904
  );
13905
+ const sendMenu = entry?.experimental_sendMenu;
13906
+ if (sendMenu !== void 0 && typeof sendMenu !== "boolean") {
13907
+ throw new Error(
13908
+ `${entryKind}: "experimental_sendMenu" must be a boolean when set`
13909
+ );
13910
+ }
13905
13911
  const disabled = entry?.disabled;
13906
13912
  if (disabled !== void 0 && typeof disabled !== "boolean" && typeof disabled !== "function") {
13907
13913
  throw new Error(
@@ -13911,6 +13917,7 @@ function parseRegions(kind, registration, onRejected) {
13911
13917
  return {
13912
13918
  id,
13913
13919
  label: requireNonEmptyString(entryKind, "label", entry?.label),
13920
+ ...sendMenu !== void 0 ? { experimental_sendMenu: sendMenu } : {},
13914
13921
  ...icon !== void 0 ? { icon } : {},
13915
13922
  ...description !== void 0 ? { description } : {},
13916
13923
  ...disabled !== void 0 ? {
@@ -9277,7 +9277,7 @@ async function handleFsWriteTextFile(session, params, responder) {
9277
9277
  ...oldText === void 0 ? {} : { oldText },
9278
9278
  content: parsed.data.content
9279
9279
  });
9280
- responder.result(null);
9280
+ responder.result({});
9281
9281
  } catch (error) {
9282
9282
  responder.error(
9283
9283
  -32603,
@@ -182,6 +182,12 @@ function parseRegions(kind, registration, onRejected) {
182
182
  "description",
183
183
  entry?.description
184
184
  );
185
+ const sendMenu = entry?.experimental_sendMenu;
186
+ if (sendMenu !== void 0 && typeof sendMenu !== "boolean") {
187
+ throw new Error(
188
+ `${entryKind}: "experimental_sendMenu" must be a boolean when set`
189
+ );
190
+ }
185
191
  const disabled = entry?.disabled;
186
192
  if (disabled !== void 0 && typeof disabled !== "boolean" && typeof disabled !== "function") {
187
193
  throw new Error(
@@ -191,6 +197,7 @@ function parseRegions(kind, registration, onRejected) {
191
197
  return {
192
198
  id,
193
199
  label: requireNonEmptyString(entryKind, "label", entry?.label),
200
+ ...sendMenu !== void 0 ? { experimental_sendMenu: sendMenu } : {},
194
201
  ...icon !== void 0 ? { icon } : {},
195
202
  ...description !== void 0 ? { description } : {},
196
203
  ...disabled !== void 0 ? {
@@ -15157,7 +15164,7 @@ function TestBranchPicker({
15157
15164
  "input",
15158
15165
  {
15159
15166
  "aria-label": label ?? "Branch",
15160
- placeholder: placeholder ?? "",
15167
+ placeholder: placeholder ?? "Select branch",
15161
15168
  disabled: inert,
15162
15169
  value: value ?? "",
15163
15170
  onChange: (event) => {
@@ -2008,6 +2008,12 @@ function validatePluginEnvironmentProviderDeclaration(declaration) {
2008
2008
  declaration.availability,
2009
2009
  "availability"
2010
2010
  );
2011
+ assertOptionalFunction(
2012
+ "environment provider",
2013
+ id,
2014
+ declaration.experimental_existingPath,
2015
+ "experimental_existingPath"
2016
+ );
2011
2017
  return {
2012
2018
  id,
2013
2019
  displayName,
@@ -2018,6 +2024,7 @@ function validatePluginEnvironmentProviderDeclaration(declaration) {
2018
2024
  inputsJsonSchema: inputs === null ? null : inputs.jsonSchema,
2019
2025
  availability: declaration.availability ?? null,
2020
2026
  validate: declaration.validate ?? null,
2027
+ experimental_existingPath: declaration.experimental_existingPath ?? null,
2021
2028
  create: declaration.create,
2022
2029
  remove: declaration.remove,
2023
2030
  policy: environmentProviderPolicySchema.parse(declaration.policy ?? {})
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@get-bb/plugin-sdk",
3
- "version": "0.4.104",
3
+ "version": "0.4.108",
4
4
  "homepage": "https://github.com/get-bb/bb#readme",
5
5
  "bugs": {
6
6
  "url": "https://github.com/get-bb/bb/issues"