@stina/extension-api 0.31.1 → 0.32.0-alpha.25ba69d

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.
@@ -210,6 +210,9 @@ export const ButtonPropsSchema = z
210
210
  .object({
211
211
  component: z.literal('Button'),
212
212
  text: z.string().describe('Button text'),
213
+ type: z.enum(['normal', 'primary', 'danger', 'accent']).optional().describe('Visual style'),
214
+ title: z.string().optional().describe('Tooltip shown on hover'),
215
+ disabled: z.boolean().optional().describe('Disable the button'),
213
216
  onClickAction: ExtensionActionRefSchema.describe('Action to call on click'),
214
217
  style: ExtensionComponentStyleSchema.optional(),
215
218
  })
@@ -222,18 +225,58 @@ export const TextInputPropsSchema = z
222
225
  label: z.string().describe('Input label'),
223
226
  placeholder: z.string().optional().describe('Placeholder text'),
224
227
  value: z.string().optional().describe('Current value'),
225
- onChangeAction: ExtensionActionRefSchema.describe('Action to call on change'),
228
+ onChangeAction: ExtensionActionRefSchema.optional().describe('Action to call on change'),
226
229
  style: ExtensionComponentStyleSchema.optional(),
227
230
  })
228
231
  .passthrough()
229
232
  .describe('TextInput component')
230
233
 
234
+ export const PasswordInputPropsSchema = z
235
+ .object({
236
+ component: z.literal('PasswordInput'),
237
+ label: z.string().describe('Input label'),
238
+ placeholder: z.string().optional().describe('Placeholder text'),
239
+ value: z.string().optional().describe('Current value'),
240
+ onChangeAction: ExtensionActionRefSchema.optional().describe('Action to call on change'),
241
+ style: ExtensionComponentStyleSchema.optional(),
242
+ })
243
+ .passthrough()
244
+ .describe('Password input component (text is masked)')
245
+
246
+ export const NumberInputPropsSchema = z
247
+ .object({
248
+ component: z.literal('NumberInput'),
249
+ label: z.string().describe('Input label'),
250
+ placeholder: z.string().optional().describe('Placeholder text'),
251
+ value: z.union([z.string(), z.number()]).optional().describe('Current value'),
252
+ min: z.number().optional().describe('Minimum value'),
253
+ max: z.number().optional().describe('Maximum value'),
254
+ step: z.number().optional().describe('Step'),
255
+ onChangeAction: ExtensionActionRefSchema.optional().describe('Action to call on change'),
256
+ style: ExtensionComponentStyleSchema.optional(),
257
+ })
258
+ .passthrough()
259
+ .describe('Numeric input component')
260
+
261
+ export const TextAreaPropsSchema = z
262
+ .object({
263
+ component: z.literal('TextArea'),
264
+ label: z.string().describe('Input label'),
265
+ placeholder: z.string().optional().describe('Placeholder text'),
266
+ value: z.string().optional().describe('Current value'),
267
+ rows: z.number().int().positive().optional().describe('Number of visible text rows'),
268
+ onChangeAction: ExtensionActionRefSchema.optional().describe('Action to call on change'),
269
+ style: ExtensionComponentStyleSchema.optional(),
270
+ })
271
+ .passthrough()
272
+ .describe('TextArea component for multi-line text input')
273
+
231
274
  export const DateTimeInputPropsSchema = z
232
275
  .object({
233
276
  component: z.literal('DateTimeInput'),
234
277
  label: z.string().describe('Input label'),
235
278
  value: z.string().optional().describe('Current value'),
236
- onChangeAction: ExtensionActionRefSchema.describe('Action to call on change'),
279
+ onChangeAction: ExtensionActionRefSchema.optional().describe('Action to call on change'),
237
280
  style: ExtensionComponentStyleSchema.optional(),
238
281
  })
239
282
  .passthrough()
@@ -245,7 +288,7 @@ export const SelectPropsSchema = z
245
288
  label: z.string().describe('Select label'),
246
289
  options: z.array(z.object({ label: z.string(), value: z.string() })).describe('Available options'),
247
290
  selectedValue: z.string().optional().describe('Currently selected value'),
248
- onChangeAction: ExtensionActionRefSchema.describe('Action to call on change'),
291
+ onChangeAction: ExtensionActionRefSchema.optional().describe('Action to call on change'),
249
292
  style: ExtensionComponentStyleSchema.optional(),
250
293
  })
251
294
  .passthrough()
@@ -256,7 +299,7 @@ export const IconPickerPropsSchema = z
256
299
  component: z.literal('IconPicker'),
257
300
  label: z.string().optional().describe('Picker label'),
258
301
  value: z.string().optional().describe('Currently selected icon name'),
259
- onChangeAction: ExtensionActionRefSchema.describe('Action to call on change'),
302
+ onChangeAction: ExtensionActionRefSchema.optional().describe('Action to call on change'),
260
303
  style: ExtensionComponentStyleSchema.optional(),
261
304
  })
262
305
  .passthrough()
@@ -358,7 +401,7 @@ export const TogglePropsSchema = z
358
401
  description: z.string().optional().describe('Description text'),
359
402
  checked: z.boolean().optional().describe('Whether the toggle is checked'),
360
403
  disabled: z.boolean().optional().describe('Whether the toggle is disabled'),
361
- onChangeAction: ExtensionActionRefSchema.describe('Action to call on change'),
404
+ onChangeAction: ExtensionActionRefSchema.optional().describe('Action to call on change'),
362
405
  style: ExtensionComponentStyleSchema.optional(),
363
406
  })
364
407
  .passthrough()
@@ -399,7 +442,7 @@ export const CheckboxPropsSchema = z
399
442
  checked: z.boolean().optional().describe('Whether the checkbox is checked'),
400
443
  disabled: z.boolean().optional().describe('Whether the checkbox is disabled'),
401
444
  strikethrough: z.boolean().optional().describe('Strike through label when checked'),
402
- onChangeAction: ExtensionActionRefSchema.describe('Action to call on change'),
445
+ onChangeAction: ExtensionActionRefSchema.optional().describe('Action to call on change'),
403
446
  style: ExtensionComponentStyleSchema.optional(),
404
447
  })
405
448
  .passthrough()
@@ -495,6 +538,9 @@ export type LabelProps = z.infer<typeof LabelPropsSchema>
495
538
  export type ParagraphProps = z.infer<typeof ParagraphPropsSchema>
496
539
  export type ButtonProps = z.infer<typeof ButtonPropsSchema>
497
540
  export type TextInputProps = z.infer<typeof TextInputPropsSchema>
541
+ export type PasswordInputProps = z.infer<typeof PasswordInputPropsSchema>
542
+ export type NumberInputProps = z.infer<typeof NumberInputPropsSchema>
543
+ export type TextAreaProps = z.infer<typeof TextAreaPropsSchema>
498
544
  export type DateTimeInputProps = z.infer<typeof DateTimeInputPropsSchema>
499
545
  export type SelectProps = z.infer<typeof SelectPropsSchema>
500
546
  export type IconPickerProps = z.infer<typeof IconPickerPropsSchema>
@@ -18,121 +18,6 @@ export const LocalizedStringSchema = z
18
18
  .union([z.string(), z.record(z.string())])
19
19
  .describe('String or localized string map')
20
20
 
21
- // =============================================================================
22
- // Settings
23
- // =============================================================================
24
-
25
- /**
26
- * Options mapping for select field options from tool response
27
- */
28
- export const SettingOptionsMappingSchema = z
29
- .object({
30
- itemsKey: z.string().describe('Key for items array in tool result data'),
31
- valueKey: z.string().describe('Key for option value'),
32
- labelKey: z.string().describe('Key for option label'),
33
- descriptionKey: z.string().optional().describe('Optional key for description'),
34
- })
35
- .describe('Mapping for select field options')
36
-
37
- /**
38
- * Create mapping for create tool response
39
- */
40
- export const SettingCreateMappingSchema = z
41
- .object({
42
- resultKey: z.string().optional().describe('Key for result data object'),
43
- valueKey: z.string().describe('Key for option value (defaults to "id")'),
44
- })
45
- .describe('Mapping for create tool response')
46
-
47
- /**
48
- * Validation rules for settings
49
- */
50
- export const SettingValidationSchema = z
51
- .object({
52
- required: z.boolean().optional().describe('Whether the field is required'),
53
- min: z.number().optional().describe('Minimum value (number) or length (string)'),
54
- max: z.number().optional().describe('Maximum value (number) or length (string)'),
55
- pattern: z.string().optional().describe('Regex pattern for validation'),
56
- })
57
- .describe('Validation rules')
58
-
59
- /**
60
- * Setting definition type interface for recursive typing
61
- */
62
- export interface SettingDefinitionType {
63
- id: string
64
- title: string
65
- description?: string
66
- type: 'string' | 'number' | 'boolean' | 'select'
67
- default?: unknown
68
- options?: { value: string; label: string }[]
69
- optionsToolId?: string
70
- optionsParams?: Record<string, unknown>
71
- optionsMapping?: z.infer<typeof SettingOptionsMappingSchema>
72
- createToolId?: string
73
- createLabel?: string
74
- createFields?: SettingDefinitionType[]
75
- createParams?: Record<string, unknown>
76
- createMapping?: z.infer<typeof SettingCreateMappingSchema>
77
- validation?: z.infer<typeof SettingValidationSchema>
78
- }
79
-
80
- export const SettingDefinitionSchema: z.ZodType<SettingDefinitionType> = z.lazy(() =>
81
- z
82
- .object({
83
- id: z.string().describe('Setting ID (namespaced automatically)'),
84
- title: z.string().describe('Display title'),
85
- description: z.string().optional().describe('Help text'),
86
- type: z.enum(['string', 'number', 'boolean', 'select']).describe('Setting type'),
87
- default: z.unknown().optional().describe('Default value'),
88
- options: z
89
- .array(z.object({ value: z.string(), label: z.string() }))
90
- .optional()
91
- .describe('For select type: available options'),
92
- optionsToolId: z.string().optional().describe('For select type: load options from tool'),
93
- optionsParams: z.record(z.unknown()).optional().describe('Params for options tool'),
94
- optionsMapping: SettingOptionsMappingSchema.optional().describe('Mapping for options tool response'),
95
- createToolId: z.string().optional().describe('Tool ID for creating a new option'),
96
- createLabel: z.string().optional().describe('Label for create action'),
97
- createFields: z.array(SettingDefinitionSchema).optional().describe('Fields for create form'),
98
- createParams: z.record(z.unknown()).optional().describe('Static params for create tool'),
99
- createMapping: SettingCreateMappingSchema.optional().describe('Mapping for create tool response'),
100
- validation: SettingValidationSchema.optional().describe('Validation rules'),
101
- })
102
- .superRefine((data, ctx) => {
103
- // Validate that create* fields are only used with type: 'select'
104
- const hasCreateFields =
105
- data.createToolId !== undefined ||
106
- data.createLabel !== undefined ||
107
- data.createFields !== undefined ||
108
- data.createParams !== undefined ||
109
- data.createMapping !== undefined
110
-
111
- if (hasCreateFields && data.type !== 'select') {
112
- ctx.addIssue({
113
- code: z.ZodIssueCode.custom,
114
- message: 'create* fields (createToolId, createLabel, createFields, createParams, createMapping) are only valid for type "select"',
115
- path: ['type'],
116
- })
117
- }
118
-
119
- // Validate that select type has options or optionsToolId
120
- if (data.type === 'select') {
121
- const hasOptions = data.options && data.options.length > 0
122
- const hasOptionsToolId = data.optionsToolId !== undefined
123
-
124
- if (!hasOptions && !hasOptionsToolId) {
125
- ctx.addIssue({
126
- code: z.ZodIssueCode.custom,
127
- message: 'Setting of type "select" must have "options" or "optionsToolId"',
128
- path: ['type'],
129
- })
130
- }
131
- }
132
- })
133
- .describe('Setting definition')
134
- )
135
-
136
21
  // =============================================================================
137
22
  // Tool Settings Views
138
23
  // =============================================================================
@@ -177,6 +62,12 @@ export const ToolSettingsListViewSchema = z
177
62
  limitParam: z.string().optional().describe('Param name for limit'),
178
63
  idParam: z.string().optional().describe('Param name for get/delete ID'),
179
64
  listParams: z.record(z.unknown()).optional().describe('Static params for list tool'),
65
+ editView: z
66
+ .object({
67
+ content: ExtensionComponentDataSchema.describe('Root component for the create/edit modal'),
68
+ })
69
+ .optional()
70
+ .describe('Component-tree create/edit form bound to $item.<key>'),
180
71
  })
181
72
  .describe('List view backed by tools')
182
73
 
@@ -207,7 +98,6 @@ export const ToolSettingsViewDefinitionSchema = z
207
98
  title: z.string().describe('Display title'),
208
99
  description: z.string().optional().describe('Help text'),
209
100
  view: ToolSettingsViewSchema.describe('View configuration'),
210
- fields: z.array(SettingDefinitionSchema).optional().describe('Fields for create/edit forms'),
211
101
  })
212
102
  .describe('Tool settings view definition')
213
103
 
@@ -271,60 +161,13 @@ export const PanelDefinitionSchema = z
271
161
  // =============================================================================
272
162
 
273
163
  /**
274
- * Provider config property type
275
- */
276
- export const ProviderConfigPropertyTypeSchema = z
277
- .enum(['string', 'number', 'boolean', 'select', 'password', 'url'])
278
- .describe('Property type')
279
-
280
- /**
281
- * Provider config select option
164
+ * Component-tree-based provider config view.
282
165
  */
283
- export const ProviderConfigSelectOptionSchema = z
166
+ export const ProviderConfigViewSchema = z
284
167
  .object({
285
- value: z.string().describe('Value stored in settings'),
286
- label: z.string().describe('Display label'),
287
- })
288
- .describe('Select option')
289
-
290
- /**
291
- * Provider config validation
292
- */
293
- export const ProviderConfigValidationSchema = z
294
- .object({
295
- pattern: z.string().optional().describe('Regex pattern the value must match'),
296
- minLength: z.number().optional().describe('Minimum string length'),
297
- maxLength: z.number().optional().describe('Maximum string length'),
298
- min: z.number().optional().describe('Minimum number value'),
299
- max: z.number().optional().describe('Maximum number value'),
300
- })
301
- .describe('Validation rules')
302
-
303
- /**
304
- * Provider config property
305
- */
306
- export const ProviderConfigPropertySchema = z
307
- .object({
308
- type: ProviderConfigPropertyTypeSchema.describe('Property type'),
309
- title: z.string().describe('Display label'),
310
- description: z.string().optional().describe('Help text'),
311
- default: z.unknown().optional().describe('Default value'),
312
- required: z.boolean().optional().describe('Whether the field is required'),
313
- placeholder: z.string().optional().describe('Placeholder text'),
314
- options: z.array(ProviderConfigSelectOptionSchema).optional().describe('For select type'),
315
- validation: ProviderConfigValidationSchema.optional().describe('Validation rules'),
316
- })
317
- .describe('Provider config property')
318
-
319
- /**
320
- * Provider config schema
321
- */
322
- export const ProviderConfigSchemaSchema = z
323
- .object({
324
- properties: z.record(ProviderConfigPropertySchema).describe('Property definitions'),
325
- order: z.array(z.string()).optional().describe('Display order of properties'),
168
+ content: ExtensionComponentDataSchema.describe('Root component to render'),
326
169
  })
327
- .describe('Provider configuration schema')
170
+ .describe('Provider configuration view (component tree)')
328
171
 
329
172
  /**
330
173
  * Provider definition
@@ -336,7 +179,7 @@ export const ProviderDefinitionSchema = z
336
179
  description: z.string().optional().describe('Description'),
337
180
  suggestedDefaultModel: z.string().optional().describe('Suggested default model'),
338
181
  defaultSettings: z.record(z.unknown()).optional().describe('Default settings'),
339
- configSchema: ProviderConfigSchemaSchema.optional().describe('Configuration UI schema'),
182
+ configView: ProviderConfigViewSchema.optional().describe('Component-tree configuration view'),
340
183
  })
341
184
  .describe('Provider definition')
342
185
 
@@ -353,6 +196,8 @@ export const ToolDefinitionSchema = z
353
196
  name: LocalizedStringSchema.describe('Display name'),
354
197
  description: LocalizedStringSchema.describe('Description for Stina'),
355
198
  parameters: z.record(z.unknown()).optional().describe('Parameter schema (JSON Schema)'),
199
+ requiresConfirmation: z.boolean().optional().describe('Whether this tool requires user confirmation before execution (default: true)'),
200
+ confirmationPrompt: LocalizedStringSchema.optional().describe('Custom confirmation prompt'),
356
201
  })
357
202
  .describe('Tool definition')
358
203
 
@@ -427,7 +272,6 @@ export const StorageContributionsSchema = z
427
272
  */
428
273
  export const ExtensionContributionsSchema = z
429
274
  .object({
430
- settings: z.array(SettingDefinitionSchema).optional().describe('User-configurable settings'),
431
275
  toolSettings: z.array(ToolSettingsViewDefinitionSchema).optional().describe('Tool settings views'),
432
276
  panels: z.array(PanelDefinitionSchema).optional().describe('Right panel contributions'),
433
277
  providers: z.array(ProviderDefinitionSchema).optional().describe('AI providers'),
@@ -443,10 +287,6 @@ export const ExtensionContributionsSchema = z
443
287
  // =============================================================================
444
288
 
445
289
  export type LocalizedString = z.infer<typeof LocalizedStringSchema>
446
- export type SettingOptionsMapping = z.infer<typeof SettingOptionsMappingSchema>
447
- export type SettingCreateMapping = z.infer<typeof SettingCreateMappingSchema>
448
- export type SettingValidation = z.infer<typeof SettingValidationSchema>
449
- export type SettingDefinition = z.infer<typeof SettingDefinitionSchema>
450
290
  export type ToolSettingsListMapping = z.infer<typeof ToolSettingsListMappingSchema>
451
291
  export type ToolSettingsActionDataSource = z.infer<typeof ToolSettingsActionDataSourceSchema>
452
292
  export type ToolSettingsListView = z.infer<typeof ToolSettingsListViewSchema>
@@ -458,11 +298,7 @@ export type PanelComponentView = z.infer<typeof PanelComponentViewSchema>
458
298
  export type PanelUnknownView = z.infer<typeof PanelUnknownViewSchema>
459
299
  export type PanelView = z.infer<typeof PanelViewSchema>
460
300
  export type PanelDefinition = z.infer<typeof PanelDefinitionSchema>
461
- export type ProviderConfigPropertyType = z.infer<typeof ProviderConfigPropertyTypeSchema>
462
- export type ProviderConfigSelectOption = z.infer<typeof ProviderConfigSelectOptionSchema>
463
- export type ProviderConfigValidation = z.infer<typeof ProviderConfigValidationSchema>
464
- export type ProviderConfigProperty = z.infer<typeof ProviderConfigPropertySchema>
465
- export type ProviderConfigSchema = z.infer<typeof ProviderConfigSchemaSchema>
301
+ export type ProviderConfigView = z.infer<typeof ProviderConfigViewSchema>
466
302
  export type ProviderDefinition = z.infer<typeof ProviderDefinitionSchema>
467
303
  export type ToolDefinition = z.infer<typeof ToolDefinitionSchema>
468
304
  export type CommandDefinition = z.infer<typeof CommandDefinitionSchema>
@@ -39,10 +39,6 @@ export {
39
39
  export {
40
40
  ExtensionContributionsSchema,
41
41
  LocalizedStringSchema,
42
- SettingDefinitionSchema,
43
- SettingOptionsMappingSchema,
44
- SettingCreateMappingSchema,
45
- SettingValidationSchema,
46
42
  ToolSettingsViewDefinitionSchema,
47
43
  ToolSettingsViewSchema,
48
44
  ToolSettingsListViewSchema,
@@ -55,21 +51,13 @@ export {
55
51
  PanelUnknownViewSchema,
56
52
  PanelActionDataSourceSchema,
57
53
  ProviderDefinitionSchema,
58
- ProviderConfigSchemaSchema,
59
- ProviderConfigPropertySchema,
60
- ProviderConfigPropertyTypeSchema,
61
- ProviderConfigSelectOptionSchema,
62
- ProviderConfigValidationSchema,
54
+ ProviderConfigViewSchema,
63
55
  ToolDefinitionSchema,
64
56
  CommandDefinitionSchema,
65
57
  PromptContributionSchema,
66
58
  PromptSectionSchema,
67
59
  type ExtensionContributions,
68
60
  type LocalizedString,
69
- type SettingDefinition,
70
- type SettingOptionsMapping,
71
- type SettingCreateMapping,
72
- type SettingValidation,
73
61
  type ToolSettingsViewDefinition,
74
62
  type ToolSettingsView,
75
63
  type ToolSettingsListView,
@@ -82,11 +70,7 @@ export {
82
70
  type PanelUnknownView,
83
71
  type PanelActionDataSource,
84
72
  type ProviderDefinition,
85
- type ProviderConfigSchema,
86
- type ProviderConfigProperty,
87
- type ProviderConfigPropertyType,
88
- type ProviderConfigSelectOption,
89
- type ProviderConfigValidation,
73
+ type ProviderConfigView,
90
74
  type ToolDefinition,
91
75
  type CommandDefinition,
92
76
  type PromptContribution,
@@ -261,6 +261,11 @@ export interface ParagraphProps extends ExtensionComponentData {
261
261
  export interface ButtonProps extends ExtensionComponentData {
262
262
  component: 'Button'
263
263
  text: string
264
+ /** Visual style. Defaults to "normal". */
265
+ type?: 'normal' | 'primary' | 'danger' | 'accent'
266
+ /** Optional tooltip shown on hover. */
267
+ title?: string
268
+ disabled?: boolean
264
269
  onClickAction: ExtensionActionRef
265
270
  }
266
271
 
@@ -270,7 +275,42 @@ export interface TextInputProps extends ExtensionComponentData {
270
275
  label: string
271
276
  placeholder?: string
272
277
  value?: string
273
- onChangeAction: ExtensionActionRef
278
+ onChangeAction?: ExtensionActionRef
279
+ }
280
+
281
+ /** The extension API properties for the PasswordInput component. */
282
+ export interface PasswordInputProps extends ExtensionComponentData {
283
+ component: 'PasswordInput'
284
+ label: string
285
+ placeholder?: string
286
+ value?: string
287
+ onChangeAction?: ExtensionActionRef
288
+ }
289
+
290
+ /** The extension API properties for the NumberInput component. */
291
+ export interface NumberInputProps extends ExtensionComponentData {
292
+ component: 'NumberInput'
293
+ label: string
294
+ placeholder?: string
295
+ value?: string | number
296
+ /** Optional minimum value. */
297
+ min?: number
298
+ /** Optional maximum value. */
299
+ max?: number
300
+ /** Optional step. */
301
+ step?: number
302
+ onChangeAction?: ExtensionActionRef
303
+ }
304
+
305
+ /** The extension API properties for the TextArea component. */
306
+ export interface TextAreaProps extends ExtensionComponentData {
307
+ component: 'TextArea'
308
+ label: string
309
+ placeholder?: string
310
+ value?: string
311
+ /** Number of visible text rows. Defaults to 4. */
312
+ rows?: number
313
+ onChangeAction?: ExtensionActionRef
274
314
  }
275
315
 
276
316
  /** The extension API properties for the DateTimeInput component. */
@@ -278,7 +318,7 @@ export interface DateTimeInputProps extends ExtensionComponentData {
278
318
  component: 'DateTimeInput'
279
319
  label: string
280
320
  value?: string
281
- onChangeAction: ExtensionActionRef
321
+ onChangeAction?: ExtensionActionRef
282
322
  }
283
323
 
284
324
  /** The extension API properties for the Select component. */
@@ -287,7 +327,7 @@ export interface SelectProps extends ExtensionComponentData {
287
327
  label: string
288
328
  options: Array<{ label: string; value: string }>
289
329
  selectedValue?: string
290
- onChangeAction: ExtensionActionRef
330
+ onChangeAction?: ExtensionActionRef
291
331
  }
292
332
 
293
333
  /** The extension API properties for the IconPicker component. */
@@ -295,7 +335,7 @@ export interface IconPickerProps extends ExtensionComponentData {
295
335
  component: 'IconPicker'
296
336
  label?: string
297
337
  value?: string
298
- onChangeAction: ExtensionActionRef
338
+ onChangeAction?: ExtensionActionRef
299
339
  }
300
340
 
301
341
  /** The extension API properties for the VerticalStack component. */
@@ -371,7 +411,7 @@ export interface ToggleProps extends ExtensionComponentData {
371
411
  description?: string
372
412
  checked?: boolean
373
413
  disabled?: boolean
374
- onChangeAction: ExtensionActionRef
414
+ onChangeAction?: ExtensionActionRef
375
415
  }
376
416
 
377
417
  /** The extension API properties for the Collapsible component. */
@@ -415,7 +455,7 @@ export interface CheckboxProps extends ExtensionComponentData {
415
455
  /** Whether to strike through the label when checked. Defaults to true. */
416
456
  strikethrough?: boolean
417
457
  /** Action to call when the checkbox state changes. */
418
- onChangeAction: ExtensionActionRef
458
+ onChangeAction?: ExtensionActionRef
419
459
  }
420
460
 
421
461
  /** The extension API properties for the Markdown component. */