@pstdio/sdk 0.8.0 → 0.10.0

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.
Files changed (66) hide show
  1. package/README.md +37 -184
  2. package/dist/api/extensions.d.ts +1 -1
  3. package/dist/api/index.d.ts +1 -2
  4. package/dist/api/statuses.d.ts +1 -0
  5. package/dist/api/tags.d.ts +1 -0
  6. package/dist/api/tickets.d.ts +3 -0
  7. package/dist/api/workspaces.d.ts +10 -1
  8. package/dist/client/client.d.ts +3 -2
  9. package/dist/client/index.d.ts +0 -1
  10. package/dist/client/index.js +0 -12
  11. package/dist/client/projects.d.ts +0 -11
  12. package/dist/client/statuses.d.ts +2 -0
  13. package/dist/client/tags.d.ts +2 -0
  14. package/dist/client/tickets.d.ts +2 -0
  15. package/dist/client/workspaces.d.ts +2 -0
  16. package/dist/extensions/define-command.d.ts +1 -1
  17. package/dist/extensions/define-extension.d.ts +50 -7
  18. package/dist/extensions/index.d.ts +3 -2
  19. package/dist/extensions/index.js +120 -11
  20. package/dist/extensions/kernel-slots.d.ts +36 -35
  21. package/dist/extensions/params.d.ts +19 -12
  22. package/dist/extensions/refs.d.ts +3 -3
  23. package/dist/extensions/slots.d.ts +1 -9
  24. package/dist/extensions/types/commands.d.ts +8 -0
  25. package/dist/extensions/types/context.d.ts +191 -12
  26. package/dist/extensions/types/contributions.d.ts +183 -10
  27. package/dist/extensions/types/extension.d.ts +16 -10
  28. package/dist/extensions/types/params.d.ts +43 -29
  29. package/dist/extensions/types/slots.d.ts +1 -1
  30. package/dist/extensions/types/webview-capabilities.d.ts +12 -2
  31. package/dist/extensions/workbench-targets.d.ts +134 -0
  32. package/dist/hooks/attempt.d.ts +2 -0
  33. package/dist/hooks/entities.d.ts +2 -0
  34. package/dist/hooks/index.d.ts +1 -1
  35. package/dist/hooks/ticket.d.ts +3 -0
  36. package/dist/resources/index.js +2 -2
  37. package/dist/resources/status.d.ts +1 -0
  38. package/dist/resources/tag.d.ts +1 -0
  39. package/dist/resources/ticket.d.ts +1 -0
  40. package/dist/resources/workspace.d.ts +4 -1
  41. package/package.json +2 -6
  42. package/dist/api/actions.d.ts +0 -13
  43. package/dist/client/actions.d.ts +0 -8
  44. package/dist/plugins/define-plugin.d.ts +0 -2
  45. package/dist/plugins/helpers/context.d.ts +0 -24
  46. package/dist/plugins/helpers/create-attempt.d.ts +0 -5
  47. package/dist/plugins/helpers/create-session.d.ts +0 -21
  48. package/dist/plugins/helpers/create-workspace.d.ts +0 -5
  49. package/dist/plugins/helpers/find-ticket-by-ref.d.ts +0 -6
  50. package/dist/plugins/helpers/find-workspace-by-ref.d.ts +0 -5
  51. package/dist/plugins/helpers/followup-session.d.ts +0 -29
  52. package/dist/plugins/helpers/get-attempts-for-ticket.d.ts +0 -17
  53. package/dist/plugins/helpers/index.d.ts +0 -16
  54. package/dist/plugins/helpers/remove-all-worktrees-for-ticket.d.ts +0 -2
  55. package/dist/plugins/helpers/run-command.d.ts +0 -10
  56. package/dist/plugins/helpers/save-ticket.d.ts +0 -14
  57. package/dist/plugins/helpers/set-ticket-status.d.ts +0 -7
  58. package/dist/plugins/helpers/set-workspace-attempt-status.d.ts +0 -7
  59. package/dist/plugins/helpers/ticket-pull.d.ts +0 -18
  60. package/dist/plugins/helpers/update-ticket-when-all-attempts-match.d.ts +0 -7
  61. package/dist/plugins/helpers/workspaces-for-ticket.d.ts +0 -17
  62. package/dist/plugins/helpers/worktree-bootstrap.d.ts +0 -8
  63. package/dist/plugins/hooks.d.ts +0 -42
  64. package/dist/plugins/index.d.ts +0 -5
  65. package/dist/plugins/index.js +0 -739
  66. package/dist/plugins/types.d.ts +0 -112
@@ -1,4 +1,4 @@
1
- import type { CommandHelpersApi, CommandInvocation, CommandMiddlewareResult, CommandNotice, CommandSource } from "./commands";
1
+ import type { CommandHelpersApi, CommandInvocation, CommandMiddlewareResult, CommandNotice, CommandSource, WorkbenchAttachmentInvocationContext } from "./commands";
2
2
  import type { EventDeliveryResult, EventRef } from "./events";
3
3
  import type { JsonObject, MaybePromise, Struct } from "./json";
4
4
  import type { RepoContext, ResourceAnchor, ResourceRef } from "./resources";
@@ -67,7 +67,7 @@ export interface ExtensionSessionsApi {
67
67
  prompt?: string;
68
68
  template?: string;
69
69
  vars?: JsonObject;
70
- harness?: unknown;
70
+ harness?: ExtensionHarnessInput;
71
71
  workspaceId?: string;
72
72
  repoId?: string;
73
73
  anchors?: ResourceAnchor[];
@@ -82,6 +82,174 @@ export interface ExtensionSessionsApi {
82
82
  vars?: JsonObject;
83
83
  }): Promise<void>;
84
84
  }
85
+ export interface ExtensionHarnessInput {
86
+ harnessId: string;
87
+ model?: string;
88
+ }
89
+ /** @deprecated Legacy core ticket extension API. Ticket data is owned by the pstdio tickets extension. */
90
+ export interface ExtensionTicket {
91
+ id: string;
92
+ shorthand: string;
93
+ created_at?: string;
94
+ updated_at?: string;
95
+ display_title?: string | null;
96
+ displayTitle?: string | null;
97
+ user_prompt?: string | null;
98
+ userPrompt?: string | null;
99
+ parent_id?: string | null;
100
+ parentId?: string | null;
101
+ draft?: boolean;
102
+ archived?: boolean;
103
+ status_id?: string | null;
104
+ status?: string | null;
105
+ status_name?: string | null;
106
+ tag_ids?: string[];
107
+ tag_names?: string[];
108
+ tagIds?: string[];
109
+ tagNames?: string[];
110
+ file_id?: string | null;
111
+ fileId?: string | null;
112
+ fileIds?: string[];
113
+ }
114
+ /** @deprecated Legacy core ticket extension API. Ticket data is owned by the pstdio tickets extension. */
115
+ export interface ExtensionTicketFile {
116
+ id: string;
117
+ file_name?: string | null;
118
+ fileName?: string | null;
119
+ file_kind?: string | null;
120
+ fileKind?: string | null;
121
+ mime_type?: string | null;
122
+ mimeType?: string | null;
123
+ created_at?: string;
124
+ updated_at?: string;
125
+ }
126
+ /** @deprecated Legacy core ticket extension API. Ticket data is owned by the pstdio tickets extension. */
127
+ export interface ExtensionTicketListInput {
128
+ status?: string;
129
+ tag?: string | string[];
130
+ archived?: boolean;
131
+ draft?: boolean;
132
+ parentId?: string;
133
+ shorthand?: string;
134
+ search?: string;
135
+ }
136
+ export interface ExtensionWorkspace {
137
+ id: string;
138
+ project_id?: string;
139
+ workspace_shorthand?: string;
140
+ /** @deprecated Legacy ticket-workspace linkage. Ticket data is owned by the pstdio tickets extension. */
141
+ ticket_id?: string | null;
142
+ /** @deprecated Legacy ticket-workspace linkage. Ticket data is owned by the pstdio tickets extension. */
143
+ ticket_shorthand?: string | null;
144
+ branch?: string | null;
145
+ worktree_path?: string | null;
146
+ attempt_status_id?: string | null;
147
+ attempt_status_name?: string | null;
148
+ initializing?: boolean;
149
+ }
150
+ /** @deprecated Legacy core ticket extension API. Ticket data is owned by the pstdio tickets extension. */
151
+ export interface ExtensionTicketsApi {
152
+ list(input?: ExtensionTicketListInput): Promise<ExtensionTicket[]>;
153
+ get(ref: string): Promise<ExtensionTicket>;
154
+ update(input: {
155
+ ticket: string;
156
+ content?: string;
157
+ }): Promise<ExtensionTicket>;
158
+ listFiles(ref: string): Promise<ExtensionTicketFile[]>;
159
+ createAttempt(input: {
160
+ ticket: string;
161
+ agent?: string;
162
+ branch?: string;
163
+ repoId?: string;
164
+ repoPath?: string;
165
+ mode?: "worktree" | "current_branch";
166
+ model?: string;
167
+ prompt?: string;
168
+ base?: string;
169
+ startSession?: boolean;
170
+ }): Promise<unknown>;
171
+ setStatus(input: {
172
+ ticket: string;
173
+ status: string;
174
+ }): Promise<void>;
175
+ updateWhenAllAttemptsMatch(input: {
176
+ ticket: string;
177
+ allAttemptsStatus: string;
178
+ setStatus: string;
179
+ }): Promise<{
180
+ updated: boolean;
181
+ }>;
182
+ }
183
+ /** @deprecated Legacy core ticket status extension API. Ticket statuses are owned by the pstdio tickets extension. */
184
+ export interface ExtensionTicketStatus {
185
+ id: string;
186
+ name: string;
187
+ color: string;
188
+ sortOrder: number;
189
+ isDefault: boolean;
190
+ canCreate: boolean;
191
+ canDragIn: boolean;
192
+ canDragOut: boolean;
193
+ columnActions: string[];
194
+ }
195
+ /** @deprecated Legacy core ticket status extension API. Ticket statuses are owned by the pstdio tickets extension. */
196
+ export interface ExtensionTicketStatusesApi {
197
+ list(): Promise<ExtensionTicketStatus[]>;
198
+ create(input: {
199
+ name: string;
200
+ color: string;
201
+ sortOrder?: number;
202
+ isDefault?: boolean;
203
+ canCreate?: boolean;
204
+ canDragIn?: boolean;
205
+ canDragOut?: boolean;
206
+ columnActions?: string[];
207
+ }): Promise<ExtensionTicketStatus>;
208
+ update(input: {
209
+ statusId: string;
210
+ name?: string;
211
+ color?: string;
212
+ sortOrder?: number;
213
+ canCreate?: boolean;
214
+ canDragIn?: boolean;
215
+ canDragOut?: boolean;
216
+ columnActions?: string[];
217
+ }): Promise<ExtensionTicketStatus>;
218
+ setDefault(input: {
219
+ statusId: string;
220
+ }): Promise<void>;
221
+ delete(input: {
222
+ statusId: string;
223
+ }): Promise<void>;
224
+ }
225
+ /** @deprecated Legacy ticket attempt status extension API. Workspace status automation is extension-owned. */
226
+ export interface ExtensionAttemptStatus {
227
+ id: string;
228
+ name: string;
229
+ color: string;
230
+ sortOrder: number;
231
+ isDefault: boolean;
232
+ }
233
+ /** @deprecated Legacy ticket attempt status extension API. Workspace status automation is extension-owned. */
234
+ export interface ExtensionAttemptStatusesApi {
235
+ list(): Promise<ExtensionAttemptStatus[]>;
236
+ create(input: {
237
+ name: string;
238
+ color: string;
239
+ sortOrder?: number;
240
+ isDefault?: boolean;
241
+ }): Promise<ExtensionAttemptStatus>;
242
+ update(input: {
243
+ statusId: string;
244
+ name?: string;
245
+ color?: string;
246
+ sortOrder?: number;
247
+ isDefault?: boolean;
248
+ }): Promise<ExtensionAttemptStatus>;
249
+ delete(input: {
250
+ statusId: string;
251
+ }): Promise<void>;
252
+ }
85
253
  export interface SetAttemptStatusInput {
86
254
  workspaceId: string;
87
255
  status: string;
@@ -95,8 +263,9 @@ export interface SetAttemptStatusResult {
95
263
  status_change_id: string;
96
264
  }
97
265
  export interface ExtensionWorkspacesApi {
98
- get(id: string): Promise<unknown>;
99
- create(input: JsonObject): Promise<unknown>;
266
+ get(id: string): Promise<ExtensionWorkspace | null>;
267
+ getByShorthand(shorthand: string): Promise<ExtensionWorkspace | null>;
268
+ create(input: JsonObject): Promise<ExtensionWorkspace>;
100
269
  archive(id: string): Promise<void>;
101
270
  delete(id: string): Promise<void>;
102
271
  setAttemptStatus(input: SetAttemptStatusInput): Promise<SetAttemptStatusResult>;
@@ -104,13 +273,16 @@ export interface ExtensionWorkspacesApi {
104
273
  export interface BootstrapWorktreeInput {
105
274
  repoPath: string;
106
275
  worktreePath: string;
276
+ /** @deprecated Legacy ticket worktree bootstrap. Ticket worktree setup is owned by the pstdio tickets extension. */
107
277
  ticketId?: string;
108
278
  }
279
+ /** @deprecated Legacy ticket worktree cleanup. Ticket worktree setup is owned by the pstdio tickets extension. */
109
280
  export interface RemoveWorktreesForTicketInput {
110
281
  ticketId?: string;
111
282
  }
112
283
  export interface ExtensionWorktreesApi {
113
284
  bootstrap(input: BootstrapWorktreeInput): Promise<void>;
285
+ /** @deprecated Legacy ticket worktree cleanup. Ticket worktree setup is owned by the pstdio tickets extension. */
114
286
  removeAllForTicket(input: RemoveWorktreesForTicketInput): Promise<number>;
115
287
  }
116
288
  export interface ExtensionReposApi {
@@ -169,13 +341,13 @@ export interface ExtensionLoggerApi {
169
341
  warn(message: string, metadata?: JsonObject): void;
170
342
  error(message: string, metadata?: JsonObject): void;
171
343
  }
172
- export interface ExtensionSettingsApi<TSettings extends Struct = Struct> {
344
+ export interface ExtensionSettingsApi<TSettings extends Record<string, unknown> = Record<string, unknown>> {
173
345
  all(): Promise<Partial<TSettings>>;
174
- get<TKey extends keyof TSettings>(key: TKey): Promise<TSettings[TKey] | undefined>;
175
- set<TKey extends keyof TSettings>(key: TKey, value: TSettings[TKey]): Promise<void>;
176
- delete<TKey extends keyof TSettings>(key: TKey): Promise<void>;
346
+ get<TKey extends keyof TSettings & string>(key: TKey): Promise<TSettings[TKey] | undefined>;
347
+ set<TKey extends keyof TSettings & string>(key: TKey, value: TSettings[TKey]): Promise<void>;
348
+ delete<TKey extends keyof TSettings & string>(key: TKey): Promise<void>;
177
349
  }
178
- export interface ExtensionContextBase {
350
+ export interface ExtensionContextBase<TSettings extends Record<string, unknown> = Record<string, unknown>> {
179
351
  projectId: string;
180
352
  extensionId: string;
181
353
  /** Extension package name. Used for grouping/prefixing user-facing references. */
@@ -185,6 +357,12 @@ export interface ExtensionContextBase {
185
357
  storage: ExtensionStorageApi;
186
358
  artifacts: ExtensionArtifactApi;
187
359
  files: ExtensionFilesApi;
360
+ /** @deprecated Legacy core ticket extension API. Ticket data is owned by the pstdio tickets extension. */
361
+ tickets: ExtensionTicketsApi;
362
+ /** @deprecated Legacy core ticket status extension API. Ticket statuses are owned by the pstdio tickets extension. */
363
+ ticketStatuses: ExtensionTicketStatusesApi;
364
+ /** @deprecated Legacy ticket attempt status extension API. Workspace status automation is extension-owned. */
365
+ attemptStatuses: ExtensionAttemptStatusesApi;
188
366
  sessions: ExtensionSessionsApi;
189
367
  workspaces: ExtensionWorkspacesApi;
190
368
  worktrees: ExtensionWorktreesApi;
@@ -196,19 +374,20 @@ export interface ExtensionContextBase {
196
374
  process: ExtensionProcessApi;
197
375
  net: ExtensionNetApi;
198
376
  logger: ExtensionLoggerApi;
199
- settings: ExtensionSettingsApi;
377
+ settings: ExtensionSettingsApi<TSettings>;
200
378
  }
201
- export interface CommandContext<TParams extends Struct = Struct> extends ExtensionContextBase {
379
+ export interface CommandContext<TParams extends Struct = Struct, TSettings extends Record<string, unknown> = Record<string, unknown>> extends ExtensionContextBase<TSettings> {
202
380
  commandId: string;
203
381
  invocationId: string;
204
382
  invocation: CommandInvocation<TParams>;
205
383
  resource?: ResourceRef;
384
+ attachment?: WorkbenchAttachmentInvocationContext;
206
385
  slot?: SlotInvocationContext;
207
386
  params: TParams;
208
387
  }
209
388
  export type CommandMiddlewareContext<TParams extends Struct = Struct> = CommandContext<TParams>;
210
389
  export type CommandMiddlewareHandler<TParams extends Struct = Struct> = (ctx: CommandMiddlewareContext<TParams>) => MaybePromise<CommandMiddlewareResult<TParams>>;
211
- export type CommandRunHandler<TParams extends Struct = Struct, TResult = unknown> = (ctx: CommandContext<TParams>) => MaybePromise<TResult>;
390
+ export type CommandRunHandler<TParams extends Struct = Struct, TResult = unknown, TSettings extends Record<string, unknown> = Record<string, unknown>> = (ctx: CommandContext<TParams, TSettings>) => MaybePromise<TResult>;
212
391
  export interface EventContext extends ExtensionContextBase {
213
392
  eventId: string;
214
393
  deliveryId: string;
@@ -1,5 +1,7 @@
1
+ import type { WorkbenchMenuTarget, WorkbenchModeLayoutTarget, WorkbenchSettingsScope, WorkbenchSettingsTarget, WorkbenchTreeTarget, WorkbenchViewTarget } from "../workbench-targets";
1
2
  import type { CommandRef, CommandSource } from "./commands";
2
- import type { JsonObject, Struct } from "./json";
3
+ import type { JsonObject, JsonValue, Struct } from "./json";
4
+ import type { ParamObjectSchema } from "./params";
3
5
  import type { PackageAssetDescriptor } from "./resources";
4
6
  import type { SlotRef } from "./slots";
5
7
  import type { WebviewCapabilityDeclaration } from "./webview-capabilities";
@@ -11,12 +13,14 @@ export interface CliContribution {
11
13
  hidden?: boolean;
12
14
  }
13
15
  export interface WhenExpression {
16
+ mode?: string | string[];
14
17
  source?: CommandSource[];
15
18
  resourceType?: string[];
16
19
  metadata?: JsonObject;
17
20
  }
18
21
  export interface MenuContribution<TSlotContext extends Struct = Struct, TParams extends Struct = Struct> {
19
- slot: SlotRef<TSlotContext, "menu"> | string;
22
+ target?: WorkbenchMenuTarget;
23
+ slot?: SlotRef<TSlotContext, "menu"> | string;
20
24
  label?: string;
21
25
  group?: string;
22
26
  placement?: "first" | "default" | "last";
@@ -26,17 +30,51 @@ export interface MenuContribution<TSlotContext extends Struct = Struct, TParams
26
30
  params?: Partial<TParams>;
27
31
  presentation?: "menu-item" | "button" | "icon-button";
28
32
  }
29
- export interface NavigationContribution<TSlotContext extends Struct = Struct, TParams extends Struct = Struct> {
30
- slot: SlotRef<TSlotContext, "navigation"> | string;
33
+ export interface TreeItemContribution<TParams extends Struct = Struct> {
34
+ target: WorkbenchTreeTarget;
31
35
  label: string;
32
36
  group?: string;
33
37
  placement?: "first" | "default" | "last";
34
- route?: string;
35
- href?: string;
36
- command?: CommandRef<TParams, unknown> | string;
37
- params?: Partial<TParams>;
38
38
  icon?: string;
39
39
  when?: WhenExpression;
40
+ action: {
41
+ kind: "command";
42
+ command: CommandRef<TParams, unknown> | string;
43
+ params?: Partial<TParams>;
44
+ } | {
45
+ kind: "dataRenderer";
46
+ dataRenderer: string;
47
+ } | {
48
+ kind: "route";
49
+ route: string;
50
+ } | {
51
+ kind: "href";
52
+ href: string;
53
+ };
54
+ }
55
+ export type WorkbenchLayoutTarget = WorkbenchModeLayoutTarget;
56
+ export type ModeTargetContribution = {
57
+ target: WorkbenchLayoutTarget;
58
+ view: string;
59
+ title?: string;
60
+ resource?: string;
61
+ pinned?: boolean;
62
+ } | {
63
+ target: WorkbenchLayoutTarget;
64
+ resource: string;
65
+ widget?: string;
66
+ title?: string;
67
+ pinned?: boolean;
68
+ };
69
+ export interface ModeLayoutContribution {
70
+ reset?: boolean | WorkbenchLayoutTarget[];
71
+ open?: ModeTargetContribution[];
72
+ }
73
+ export interface ModeContribution {
74
+ id?: string;
75
+ label: string;
76
+ icon?: string;
77
+ layout?: ModeLayoutContribution;
40
78
  }
41
79
  export interface WebviewContribution {
42
80
  entry: PackageAssetDescriptor;
@@ -45,7 +83,8 @@ export interface WebviewContribution {
45
83
  }
46
84
  export interface ViewContribution<TSlotContext extends Struct = Struct> {
47
85
  title: string;
48
- slot: SlotRef<TSlotContext, "view"> | string;
86
+ target?: WorkbenchViewTarget;
87
+ slot?: SlotRef<TSlotContext, "view"> | string;
49
88
  group?: string;
50
89
  placement?: "first" | "default" | "last";
51
90
  webview: WebviewContribution;
@@ -57,9 +96,143 @@ export interface RouteContribution {
57
96
  }
58
97
  export interface SettingsPanelContribution<TSlotContext extends Struct = Struct> {
59
98
  title: string;
60
- slot: SlotRef<TSlotContext, "settings"> | string;
99
+ target?: WorkbenchSettingsTarget;
100
+ scope?: WorkbenchSettingsScope;
101
+ slot?: SlotRef<TSlotContext, "settings"> | string;
61
102
  webview: WebviewContribution;
62
103
  }
104
+ export type DataRendererViewMode = "board" | "list";
105
+ export type DataRendererSortDirection = "asc" | "desc";
106
+ export interface DataRendererEnumOption {
107
+ value: string;
108
+ label: string;
109
+ color?: string;
110
+ icon?: string | null;
111
+ }
112
+ export type DataRendererAttributeType = {
113
+ kind: "enum";
114
+ options: DataRendererEnumOption[];
115
+ } | {
116
+ kind: "enum-multi";
117
+ options: DataRendererEnumOption[];
118
+ } | {
119
+ kind: "string";
120
+ } | {
121
+ kind: "date";
122
+ } | {
123
+ kind: "number";
124
+ } | {
125
+ kind: "user";
126
+ };
127
+ export interface DataRendererAttributeDescriptor {
128
+ id: string;
129
+ label: string;
130
+ type: DataRendererAttributeType;
131
+ filterable?: boolean;
132
+ groupable?: boolean;
133
+ sortable?: boolean;
134
+ displayable?: boolean;
135
+ editable?: boolean;
136
+ }
137
+ export interface DataRendererSettings {
138
+ viewMode: DataRendererViewMode;
139
+ columnGrouping: string;
140
+ rowGrouping: string;
141
+ ordering: {
142
+ attributeId: string;
143
+ direction: DataRendererSortDirection;
144
+ };
145
+ displayProperties: string[];
146
+ }
147
+ export type DataRendererFilterState = Record<string, string[]>;
148
+ export interface DataRendererQueryParams {
149
+ settings: DataRendererSettings;
150
+ filters: DataRendererFilterState;
151
+ }
152
+ export interface DataRendererResourceRef {
153
+ type: string;
154
+ id: string;
155
+ projectId?: string;
156
+ label?: string;
157
+ extensionId?: string;
158
+ metadata?: JsonObject;
159
+ }
160
+ export interface DataRendererRow {
161
+ id: string;
162
+ title: string;
163
+ resource?: DataRendererResourceRef;
164
+ attributes: Record<string, unknown>;
165
+ }
166
+ export interface DataRendererColumnAction {
167
+ id: string;
168
+ label: string;
169
+ icon?: string;
170
+ }
171
+ export interface DataRendererBoardColumnConfig {
172
+ color?: string;
173
+ canDragIn?: boolean;
174
+ canDragOut?: boolean;
175
+ canCreate?: boolean;
176
+ actions?: DataRendererColumnAction[];
177
+ }
178
+ export interface DataRendererQueryResult {
179
+ rows: DataRendererRow[];
180
+ attributes?: DataRendererAttributeDescriptor[];
181
+ boardColumnConfigs?: Record<string, DataRendererBoardColumnConfig>;
182
+ }
183
+ export interface DataRendererCreateRowContribution<TParams extends ParamObjectSchema = ParamObjectSchema> {
184
+ command: CommandRef<Struct, unknown> | string;
185
+ title?: string;
186
+ submitLabel?: string;
187
+ columnParam?: string;
188
+ params?: TParams;
189
+ }
190
+ export interface DataRendererSavedViewsContribution {
191
+ resourceKind: string;
192
+ scope?: "project" | "user";
193
+ }
194
+ export interface DataRendererContribution {
195
+ title: string;
196
+ resourceKind?: string;
197
+ attributes?: DataRendererAttributeDescriptor[];
198
+ queryCommand: CommandRef<DataRendererQueryParams, DataRendererQueryResult> | string;
199
+ updateAttributeCommand?: CommandRef<{
200
+ rowId: string;
201
+ attributeId: string;
202
+ value: unknown;
203
+ }, unknown> | string;
204
+ reorderCommand?: CommandRef<{
205
+ rowId: string;
206
+ beforeRowId?: string;
207
+ }, unknown> | string;
208
+ columnActionCommand?: CommandRef<{
209
+ columnId: string;
210
+ actionId: string;
211
+ }, unknown> | string;
212
+ createRow?: DataRendererCreateRowContribution;
213
+ defaultSettings?: Partial<DataRendererSettings>;
214
+ defaultFilters?: DataRendererFilterState;
215
+ emptyTitle?: string;
216
+ emptyDescription?: string;
217
+ hideToolbar?: boolean;
218
+ savedViews?: DataRendererSavedViewsContribution;
219
+ }
220
+ export type ExtensionSettingScope = "global" | "project";
221
+ export type ExtensionSettingValueType = "boolean" | "number" | "string" | "array" | "object";
222
+ export type ExtensionSettingValueForType<TType extends ExtensionSettingValueType> = TType extends "boolean" ? boolean : TType extends "number" ? number : TType extends "string" ? string : TType extends "array" ? JsonValue[] : JsonObject;
223
+ export type ExtensionSettingProperty<TType extends ExtensionSettingValueType = ExtensionSettingValueType> = {
224
+ [TSettingType in TType]: {
225
+ type: TSettingType;
226
+ scope: ExtensionSettingScope;
227
+ default?: ExtensionSettingValueForType<TSettingType>;
228
+ enum?: ExtensionSettingValueForType<TSettingType>[];
229
+ title?: string;
230
+ description?: string;
231
+ };
232
+ }[TType];
233
+ export interface ExtensionSettingsContribution<TProperties extends Record<string, ExtensionSettingProperty> = Record<string, ExtensionSettingProperty>> {
234
+ properties: TProperties;
235
+ }
63
236
  export interface RendererContribution<TSlotContext extends Struct = Struct> {
64
237
  slot: SlotRef<TSlotContext, "renderer"> | string;
65
238
  for: string;
@@ -1,10 +1,9 @@
1
1
  import type { CommandRef } from "./commands";
2
2
  import type { CommandMiddlewareHandler, CommandRunHandler, EventContext, ExtensionContextBase, MigrationContext, SetupContext } from "./context";
3
- import type { ArtifactMountContribution, CliContribution, FileIconThemeContribution, MenuContribution, NavigationContribution, RendererContribution, RouteContribution, SettingsPanelContribution, SkillContribution, TemplateContribution, TemplateTypeContribution, ThemeContribution, ViewContribution } from "./contributions";
3
+ import type { ArtifactMountContribution, CliContribution, DataRendererContribution, ExtensionSettingsContribution, FileIconThemeContribution, MenuContribution, ModeContribution, RendererContribution, RouteContribution, SettingsPanelContribution, SkillContribution, TemplateContribution, TemplateTypeContribution, ThemeContribution, TreeItemContribution, ViewContribution } from "./contributions";
4
4
  import type { EventRef } from "./events";
5
5
  import type { JsonObject, MaybePromise, Struct } from "./json";
6
6
  import type { ParamObjectSchema, ParamsOf } from "./params";
7
- import type { SlotRef } from "./slots";
8
7
  /** Current host extension API version. `engines.pstdio` in package.json is a semver range checked against this. */
9
8
  export declare const EXTENSION_API_VERSION = "1.0.0";
10
9
  type SchemaParams<TSchema extends ParamObjectSchema | undefined> = TSchema extends ParamObjectSchema ? ParamsOf<TSchema> : Struct;
@@ -12,13 +11,13 @@ type SchemaParams<TSchema extends ParamObjectSchema | undefined> = TSchema exten
12
11
  * A command exposed by an extension. The `params` schema (typed via `params.*`) drives
13
12
  * the inferred shape of `ctx.params` in `run`.
14
13
  */
15
- export interface CommandDefinition<TSchema extends ParamObjectSchema | undefined = ParamObjectSchema | undefined, TResult = unknown> {
14
+ export interface CommandDefinition<TSchema extends ParamObjectSchema | undefined = ParamObjectSchema | undefined, TResult = unknown, TSettings extends Record<string, unknown> = Record<string, unknown>> {
16
15
  title: string;
17
16
  description?: string;
18
17
  params?: TSchema;
19
18
  menus?: MenuContribution[];
20
19
  cli?: boolean | CliContribution;
21
- run: CommandRunHandler<SchemaParams<TSchema>, TResult>;
20
+ run: CommandRunHandler<SchemaParams<TSchema>, TResult, TSettings>;
22
21
  }
23
22
  /**
24
23
  * Middleware that runs before a command. Use `command` for a typed `CommandRef`; use
@@ -101,6 +100,7 @@ export interface ProjectExtensionInstance {
101
100
  enabled: boolean;
102
101
  config: JsonObject;
103
102
  }
103
+ export type ExtensionLoadScope = "user" | "repo";
104
104
  /** Validated view of an extension's package.json identity fields. */
105
105
  export interface PackageManifest {
106
106
  /** Extension package name. Matches `^[a-z][a-z0-9-]*$`. */
@@ -117,22 +117,28 @@ export interface PackageManifest {
117
117
  main: string;
118
118
  /** Semver range checked against the host extension API version. */
119
119
  enginesPstdio: string;
120
+ /** Prompt Studio-specific package metadata. */
121
+ pstdio?: {
122
+ /** Install/load scope. Defaults to "user" when omitted. */
123
+ scope?: ExtensionLoadScope;
124
+ };
120
125
  /** Derived `${publisher}.${name}`. */
121
126
  id: string;
122
127
  }
123
- /** UI surface contributions: slots, routes, panels, renderers. */
128
+ /** UI surface contributions: modes, routes, panels, renderers. */
124
129
  export interface UiContributions {
125
- slots?: Record<string, SlotRef>;
130
+ modes?: Record<string, ModeContribution>;
126
131
  routes?: Record<string, RouteContribution>;
127
132
  views?: Record<string, ViewContribution>;
128
- navigation?: Record<string, NavigationContribution>;
133
+ treeItems?: Record<string, TreeItemContribution>;
129
134
  settingsPanels?: Record<string, SettingsPanelContribution>;
135
+ dataRenderers?: Record<string, DataRendererContribution>;
130
136
  activityRenderers?: Record<string, RendererContribution>;
131
137
  sessionAnchorRenderers?: Record<string, RendererContribution>;
132
138
  }
133
139
  /** Behavioural surface: commands, middleware, hooks, schedules. */
134
140
  export interface BehaviourContributions {
135
- commands?: Record<string, CommandDefinition<any, any>>;
141
+ commands?: Record<string, CommandDefinition<any, any, any>>;
136
142
  middlewares?: Record<string, MiddlewareDefinition<any, any>>;
137
143
  hooks?: Record<string, HookDefinition<any>>;
138
144
  schedules?: Record<string, ScheduleContribution<any>>;
@@ -162,7 +168,7 @@ export interface ExtensionLifecycle {
162
168
  * contribution surfaces.
163
169
  */
164
170
  export interface ExtensionDefinition extends UiContributions, BehaviourContributions, AssetContributions, ProviderContributions, ExtensionLifecycle {
165
- settings?: ParamObjectSchema;
171
+ settings?: ExtensionSettingsContribution;
166
172
  }
167
- export type ExtensionSourceKind = "local" | "package";
173
+ export type ExtensionSourceKind = "local_path" | "git" | "registry";
168
174
  export {};