@pstdio/sdk 0.13.2 → 0.15.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.
@@ -1 +1 @@
1
- export type { CommandExecuteRequest, CommandExecuteResponse, ExtensionCommandPaletteContribution, ExtensionCommandPaletteResourceRecord, ExtensionCommandRecord, ExtensionDataRendererRecord, ExtensionDiagnostic, ExtensionKeybindingRecord, ExtensionMenuContribution, ExtensionModeRecord, ExtensionNavigationRecord, ExtensionRecord, ExtensionRouteRecord, ExtensionSettingDefinitionRecord, ExtensionSettingsPanelRecord, ExtensionSettingValueRecord, ExtensionTreeItemContribution, ExtensionTreeRendererRecord, ExtensionViewRecord, ListExtensionAppearanceResponse, ListExtensionCommandsResponse, ListExtensionSettingsResponse, ListProjectExtensionsResponse, LocalizableString, ModeLayoutContributionRecord, ProjectExtensionInstance, UpdateExtensionSettingRequest, UpdateInstalledExtensionTemplateInput, UpdateInstalledExtensionTemplateResponse, WorkbenchExtensionCommandPaletteResourceRecord, WorkbenchExtensionDataRendererRecord, WorkbenchExtensionMetadata, WorkbenchExtensionTreeRendererRecord, } from "pstdio-api-contracts";
1
+ export type { CommandExecuteRequest, CommandExecuteResponse, ExtensionCommandPaletteContribution, ExtensionCommandPaletteResourceRecord, ExtensionCommandRecord, ExtensionControlsRendererRecord, ExtensionDataRendererRecord, ExtensionDiagnostic, ExtensionKeybindingRecord, ExtensionMenuContribution, ExtensionModeRecord, ExtensionNavigationRecord, ExtensionRecord, ExtensionRouteRecord, ExtensionSettingDefinitionRecord, ExtensionSettingsPanelRecord, ExtensionSettingValueRecord, ExtensionTreeItemContribution, ExtensionTreeRendererRecord, ExtensionViewRecord, ListExtensionAppearanceResponse, ListExtensionCommandsResponse, ListExtensionSettingsResponse, ListProjectExtensionsResponse, LocalizableString, ModeLayoutContributionRecord, ProjectExtensionInstance, UpdateExtensionSettingRequest, UpdateInstalledExtensionTemplateInput, UpdateInstalledExtensionTemplateResponse, WorkbenchExtensionCommandPaletteResourceRecord, WorkbenchExtensionControlsRendererRecord, WorkbenchExtensionDataRendererRecord, WorkbenchExtensionMetadata, WorkbenchExtensionTreeRendererRecord, } from "pstdio-api-contracts";
@@ -1,8 +1,10 @@
1
- export type { CommandExecuteRequest, CommandExecuteResponse, ExtensionCommandPaletteContribution, ExtensionCommandPaletteResourceRecord, ExtensionCommandRecord, ExtensionDataRendererRecord, ExtensionDiagnostic, ExtensionKeybindingRecord, ExtensionMenuContribution, ExtensionModeRecord, ExtensionNavigationRecord, ExtensionRecord, ExtensionRouteRecord, ExtensionSettingDefinitionRecord, ExtensionSettingsPanelRecord, ExtensionSettingValueRecord, ExtensionTreeItemContribution, ExtensionTreeRendererRecord, ExtensionViewRecord, ListExtensionAppearanceResponse, ListExtensionCommandsResponse, ListExtensionSettingsResponse, ListProjectExtensionsResponse, LocalizableString, ProjectExtensionInstance, UpdateExtensionSettingRequest, UpdateInstalledExtensionTemplateInput, UpdateInstalledExtensionTemplateResponse, WorkbenchExtensionCommandPaletteResourceRecord, WorkbenchExtensionDataRendererRecord, WorkbenchExtensionMetadata, WorkbenchExtensionTreeRendererRecord, } from "./extensions";
1
+ export type { CreateNotificationInput, ListNotificationsQuery, ListNotificationsResponse, Notification, NotificationAction, NotificationActionResult, NotificationActorType, NotificationKind, NotificationOrigin, NotificationPriority, NotificationStatus, ResourceRef, UpdateNotificationInput, } from "pstdio-api-contracts";
2
+ export type { CommandExecuteRequest, CommandExecuteResponse, ExtensionCommandPaletteContribution, ExtensionCommandPaletteResourceRecord, ExtensionCommandRecord, ExtensionControlsRendererRecord, ExtensionDataRendererRecord, ExtensionDiagnostic, ExtensionKeybindingRecord, ExtensionMenuContribution, ExtensionModeRecord, ExtensionNavigationRecord, ExtensionRecord, ExtensionRouteRecord, ExtensionSettingDefinitionRecord, ExtensionSettingsPanelRecord, ExtensionSettingValueRecord, ExtensionTreeItemContribution, ExtensionTreeRendererRecord, ExtensionViewRecord, ListExtensionAppearanceResponse, ListExtensionCommandsResponse, ListExtensionSettingsResponse, ListProjectExtensionsResponse, LocalizableString, ProjectExtensionInstance, UpdateExtensionSettingRequest, UpdateInstalledExtensionTemplateInput, UpdateInstalledExtensionTemplateResponse, WorkbenchExtensionCommandPaletteResourceRecord, WorkbenchExtensionControlsRendererRecord, WorkbenchExtensionDataRendererRecord, WorkbenchExtensionMetadata, WorkbenchExtensionTreeRendererRecord, } from "./extensions";
2
3
  export type { CreateProjectInput, RegisterRepoInput } from "./projects";
3
4
  export type { ApprovalInput, CreateSessionInput, FollowUpInput, ResolveSessionIdInput, ResolveSessionIdResponse, SessionAttachment, SessionAttachmentRef, SessionConversationResponse, } from "./sessions";
4
5
  export { sessionAttachmentMimeTypesByExtension } from "./sessions";
5
6
  export type { Settings, UpdateSettingsInput } from "./settings";
6
7
  export type { UpdateSkillInput } from "./skills";
7
8
  export type { CreateTemplateInput, UpdateTemplateInput } from "./templates";
9
+ export type { TerminalHostEvent, TerminalSessionOperation, TerminalSessionRequest, TerminalSessionResult, } from "./terminal";
8
10
  export type { CreateWorkspaceInput, RemoveWorktreeResponse, RenameWorkspaceInput } from "./workspaces";
package/dist/api/index.js CHANGED
@@ -13636,11 +13636,12 @@ var sessionEvents = {
13636
13636
  };
13637
13637
  var workspaceEvents = {
13638
13638
  created: eventRef("workspace.created"),
13639
+ provision: eventRef("workspace.provision"),
13640
+ ready: eventRef("workspace.ready"),
13639
13641
  archived: eventRef("workspace.archived"),
13640
13642
  deleted: eventRef("workspace.deleted")
13641
13643
  };
13642
13644
  var worktreeEvents = {
13643
- created: eventRef("worktree.created"),
13644
13645
  removed: eventRef("worktree.removed")
13645
13646
  };
13646
13647
  var gitEvents = {
@@ -13669,12 +13670,16 @@ var WEBVIEW_DECLARABLE_CAPABILITIES = [
13669
13670
  "commands.execute",
13670
13671
  "resource.open",
13671
13672
  "notification.show",
13673
+ "notification.action",
13674
+ "notification.resolve",
13675
+ "notification.dismiss",
13672
13676
  "preferences.get",
13673
13677
  "preferences.set",
13674
13678
  "extension.settings.all",
13675
13679
  "extension.settings.get",
13676
13680
  "extension.settings.set",
13677
13681
  "extension.settings.delete",
13682
+ "terminal.session",
13678
13683
  "files.upload",
13679
13684
  "files.list",
13680
13685
  "files.delete"
@@ -13958,6 +13963,21 @@ var extensionCommandPaletteContributionSchema = exports_external.object({
13958
13963
  when: extensionWhenExpressionSchema.optional()
13959
13964
  });
13960
13965
 
13966
+ // ../pstdio-api-contracts/src/extensions/controls-renderer.ts
13967
+ var extensionControlsRendererRecordSchema = exports_external.object({
13968
+ id: exports_external.string(),
13969
+ extensionId: exports_external.string(),
13970
+ title: localizableStringSchema,
13971
+ queryCommandId: exports_external.string(),
13972
+ updateValueCommandId: exports_external.string().optional(),
13973
+ applyCommandId: exports_external.string().optional(),
13974
+ resetCommandId: exports_external.string().optional(),
13975
+ refreshEventIds: exports_external.array(exports_external.string()).optional(),
13976
+ defaultValues: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
13977
+ emptyTitle: localizableStringSchema.optional(),
13978
+ emptyDescription: localizableStringSchema.optional()
13979
+ });
13980
+
13961
13981
  // ../pstdio-api-contracts/src/extensions/data-renderer.ts
13962
13982
  var dataRendererEnumOptionSchema = exports_external.object({
13963
13983
  value: exports_external.string(),
@@ -14128,8 +14148,9 @@ var workbenchExtensionSettingsPanelRecordSchema = extensionSettingsPanelRecordSc
14128
14148
  });
14129
14149
 
14130
14150
  // ../pstdio-api-contracts/src/extensions/views.ts
14131
- var hasSingleViewBody = (value) => [value.webview, value.treeRendererId, value.fileRendererId].filter(Boolean).length === 1;
14132
- var singleViewBodyMessage = "Extension views must declare exactly one body: webview, treeRendererId, or fileRendererId";
14151
+ var hasSingleViewBody = (value) => [value.webview, value.treeRendererId, value.fileRendererId, value.controlsRendererId].filter(Boolean).length === 1;
14152
+ var singleViewBodyMessage = "Extension views must declare exactly one body: webview, treeRendererId, fileRendererId, or controlsRendererId";
14153
+ var hostTreeDefaultSchema = exports_external.enum(["default", "none"]);
14133
14154
  var extensionViewRecordBaseSchema = exports_external.object({
14134
14155
  id: exports_external.string(),
14135
14156
  extensionId: exports_external.string(),
@@ -14142,7 +14163,10 @@ var extensionViewRecordBaseSchema = exports_external.object({
14142
14163
  surface: exports_external.enum(["panel", "modal"]).optional(),
14143
14164
  webview: extensionWebviewContributionSchema.optional(),
14144
14165
  treeRendererId: exports_external.string().optional(),
14145
- fileRendererId: exports_external.string().optional()
14166
+ fileRendererId: exports_external.string().optional(),
14167
+ controlsRendererId: exports_external.string().optional(),
14168
+ hostTreeHeader: hostTreeDefaultSchema.optional(),
14169
+ hostTreeFooter: hostTreeDefaultSchema.optional()
14146
14170
  });
14147
14171
  var extensionViewRecordSchema = extensionViewRecordBaseSchema.refine(hasSingleViewBody, {
14148
14172
  message: singleViewBodyMessage
@@ -14257,6 +14281,7 @@ var extensionsCheckResponseSchema = exports_external.object({
14257
14281
  commandPaletteResources: exports_external.array(extensionCommandPaletteResourceRecordSchema),
14258
14282
  treeRenderers: exports_external.array(extensionTreeRendererRecordSchema),
14259
14283
  fileRenderers: exports_external.array(extensionFileRendererRecordSchema),
14284
+ controlsRenderers: exports_external.array(extensionControlsRendererRecordSchema),
14260
14285
  keybindings: exports_external.array(extensionKeybindingRecordSchema),
14261
14286
  settingsDefinitions: exports_external.array(extensionSettingDefinitionRecordSchema).optional(),
14262
14287
  templates: exports_external.array(extensionViewLikeSchema),
@@ -14278,6 +14303,7 @@ var workbenchExtensionMetadataSchema = exports_external.object({
14278
14303
  commandPaletteResources: exports_external.array(extensionCommandPaletteResourceRecordSchema).optional(),
14279
14304
  treeRenderers: exports_external.array(extensionTreeRendererRecordSchema).optional(),
14280
14305
  fileRenderers: exports_external.array(extensionFileRendererRecordSchema).optional(),
14306
+ controlsRenderers: exports_external.array(extensionControlsRendererRecordSchema).optional(),
14281
14307
  keybindings: exports_external.array(extensionKeybindingRecordSchema).optional(),
14282
14308
  settingsDefinitions: exports_external.array(extensionSettingDefinitionRecordSchema).optional(),
14283
14309
  diagnostics: exports_external.array(extensionDiagnosticSchema)
@@ -14322,6 +14348,7 @@ var extensionAttachmentInvocationSchema = exports_external.object({
14322
14348
  });
14323
14349
  var commandExecuteRequestSchema = exports_external.object({
14324
14350
  projectId: exports_external.string().min(1),
14351
+ workspaceId: exports_external.string().optional(),
14325
14352
  params: jsonObjectSchema.optional(),
14326
14353
  resource: extensionResourceRefSchema.optional(),
14327
14354
  attachment: extensionAttachmentInvocationSchema.optional(),
@@ -14331,6 +14358,7 @@ var commandExecuteRequestSchema = exports_external.object({
14331
14358
  metadata: jsonObjectSchema.optional()
14332
14359
  });
14333
14360
  var commandExecuteBodySchema = exports_external.object({
14361
+ workspaceId: exports_external.string().optional(),
14334
14362
  params: jsonObjectSchema.optional(),
14335
14363
  resource: extensionResourceRefSchema.optional(),
14336
14364
  attachment: extensionAttachmentInvocationSchema.optional(),
@@ -14339,6 +14367,10 @@ var commandExecuteBodySchema = exports_external.object({
14339
14367
  source: commandSourceSchema.optional(),
14340
14368
  metadata: jsonObjectSchema.optional()
14341
14369
  });
14370
+ var dispatchExtensionEventBodySchema = exports_external.object({
14371
+ eventId: exports_external.string().min(1),
14372
+ payload: jsonObjectSchema
14373
+ }).strict();
14342
14374
  var serializedErrorSchema = exports_external.object({
14343
14375
  name: exports_external.string().optional(),
14344
14376
  message: exports_external.string(),
@@ -0,0 +1,49 @@
1
+ export interface TerminalSessionRequest {
2
+ /** Command + args to run; defaults to the user's login shell when omitted. */
3
+ command?: string[];
4
+ /** Working directory; falls back to the extension's workspace root. */
5
+ cwd?: string;
6
+ /** Extra env vars merged over the inherited environment. */
7
+ env?: Record<string, string>;
8
+ /** Initial column count; the renderer can resize later. */
9
+ cols: number;
10
+ /** Initial row count; the renderer can resize later. */
11
+ rows: number;
12
+ }
13
+ export type TerminalSessionOperation = {
14
+ operation: "open";
15
+ request: TerminalSessionRequest;
16
+ } | {
17
+ operation: "write";
18
+ sessionId: string;
19
+ data: string | Uint8Array;
20
+ } | {
21
+ operation: "resize";
22
+ sessionId: string;
23
+ cols: number;
24
+ rows: number;
25
+ } | {
26
+ operation: "kill";
27
+ sessionId: string;
28
+ signal?: string;
29
+ } | {
30
+ operation: "subscribe";
31
+ sessionId: string;
32
+ };
33
+ export type TerminalSessionResult = {
34
+ operation: "open";
35
+ sessionId: string;
36
+ } | {
37
+ operation: "write" | "resize" | "kill" | "subscribe";
38
+ accepted: true;
39
+ };
40
+ export type TerminalHostEvent = {
41
+ sessionId: string;
42
+ kind: "data";
43
+ chunk: Uint8Array;
44
+ } | {
45
+ sessionId: string;
46
+ kind: "exit";
47
+ code: number | null;
48
+ signal: string | null;
49
+ };
@@ -1,5 +1,6 @@
1
1
  import { type AgentClient } from "./agents";
2
2
  import { type ExtensionClient } from "./extensions";
3
+ import { type NotificationsClient } from "./notifications";
3
4
  import { type ProjectClient } from "./projects";
4
5
  import type { ClientOptions } from "./request";
5
6
  import { type SessionClient } from "./sessions";
@@ -15,6 +16,7 @@ export type PstdioClient = {
15
16
  templates: TemplateClient;
16
17
  skills: SkillClient;
17
18
  agents: AgentClient;
19
+ notifications: NotificationsClient;
18
20
  extensions: ExtensionClient;
19
21
  settings: SettingsClient;
20
22
  sync: SyncClient;
@@ -1,4 +1,4 @@
1
- import type { CommandExecuteRequest, CommandExecuteResponse, EnableInstalledExtensionRequest, EnableInstalledExtensionResponse, ListExtensionAppearanceResponse, ListExtensionCommandsResponse, UpdateInstalledExtensionTemplateInput, UpdateInstalledExtensionTemplateResponse } from "pstdio-api-contracts";
1
+ import type { CommandExecuteRequest, CommandExecuteResponse, DispatchExtensionEventInput, EnableInstalledExtensionRequest, EnableInstalledExtensionResponse, ListExtensionAppearanceResponse, ListExtensionCommandsResponse, UpdateInstalledExtensionTemplateInput, UpdateInstalledExtensionTemplateResponse } from "pstdio-api-contracts";
2
2
  import type { RequestFn } from "./request";
3
3
  export type ExtensionClient = {
4
4
  enableInstalled(projectId: string, installName: string, request: EnableInstalledExtensionRequest): Promise<EnableInstalledExtensionResponse>;
@@ -6,5 +6,6 @@ export type ExtensionClient = {
6
6
  listAppearance(projectId: string): Promise<ListExtensionAppearanceResponse>;
7
7
  listCommands(projectId: string): Promise<ListExtensionCommandsResponse>;
8
8
  execute(commandId: string, request: CommandExecuteRequest): Promise<CommandExecuteResponse>;
9
+ dispatchEvent(projectId: string, input: DispatchExtensionEventInput): Promise<void>;
9
10
  };
10
11
  export declare const createExtensionClient: (request: RequestFn) => ExtensionClient;
@@ -1,6 +1,7 @@
1
1
  export type { AgentClient } from "./agents";
2
2
  export { createClient, type PstdioClient } from "./client";
3
3
  export type { ExtensionClient } from "./extensions";
4
+ export type { NotificationsClient } from "./notifications";
4
5
  export type { ProjectClient } from "./projects";
5
6
  export { type ClientOptions, createRequest, PstdioApiError, type RequestFn, type RequestOptions, } from "./request";
6
7
  export type { ListSessionsInput, SessionClient, SessionStreamConnection, SessionStreamHandlers } from "./sessions";
@@ -37,7 +37,51 @@ var createExtensionClient = (request) => ({
37
37
  method: "POST",
38
38
  body
39
39
  });
40
- }
40
+ },
41
+ dispatchEvent: (projectId, body) => request(`/v1/projects/${projectId}/extensions/events/dispatch`, {
42
+ method: "POST",
43
+ body
44
+ })
45
+ });
46
+
47
+ // src/client/notifications.ts
48
+ var appendArrayOrValue = (params, key, value) => {
49
+ if (value === undefined)
50
+ return;
51
+ params.set(key, Array.isArray(value) ? value.join(",") : value);
52
+ };
53
+ var buildQuery = (query = {}) => {
54
+ const params = new URLSearchParams;
55
+ appendArrayOrValue(params, "status", query.status);
56
+ appendArrayOrValue(params, "priority", query.priority);
57
+ if (query.sourceExtensionId)
58
+ params.set("sourceExtensionId", query.sourceExtensionId);
59
+ if (query.resourceType)
60
+ params.set("resourceType", query.resourceType);
61
+ if (query.resourceId)
62
+ params.set("resourceId", query.resourceId);
63
+ if (query.cursor)
64
+ params.set("cursor", query.cursor);
65
+ if (query.limit !== undefined)
66
+ params.set("limit", String(query.limit));
67
+ const value = params.toString();
68
+ return value ? `?${value}` : "";
69
+ };
70
+ var notificationPath = (projectId, suffix = "") => `/v1/projects/${encodeURIComponent(projectId)}/notifications${suffix}`;
71
+ var createNotificationsClient = (request) => ({
72
+ list: (projectId, query) => request(notificationPath(projectId, buildQuery(query))),
73
+ count: (projectId, query) => request(notificationPath(projectId, `/count${buildQuery(query)}`)),
74
+ get: (projectId, id) => request(notificationPath(projectId, `/${encodeURIComponent(id)}`)),
75
+ create: (input) => {
76
+ const { projectId, ...body } = input;
77
+ return request(notificationPath(projectId), { method: "POST", body });
78
+ },
79
+ update: (projectId, id, input) => request(notificationPath(projectId, `/${encodeURIComponent(id)}`), { method: "PATCH", body: input }),
80
+ markRead: (projectId, id) => request(notificationPath(projectId, `/${encodeURIComponent(id)}/read`), { method: "POST" }),
81
+ dismiss: (projectId, id) => request(notificationPath(projectId, `/${encodeURIComponent(id)}/dismiss`), { method: "POST" }),
82
+ markDone: (projectId, id) => request(notificationPath(projectId, `/${encodeURIComponent(id)}/done`), { method: "POST" }),
83
+ snooze: (projectId, id, until) => request(notificationPath(projectId, `/${encodeURIComponent(id)}/snooze`), { method: "POST", body: { until } }),
84
+ resolveByDedupeKey: (projectId, input) => request(notificationPath(projectId, "/resolve-by-dedupe-key"), { method: "POST", body: input })
41
85
  });
42
86
 
43
87
  // src/client/projects.ts
@@ -497,6 +541,7 @@ var createClient = (options = {}) => {
497
541
  templates: createTemplateClient(request),
498
542
  skills: createSkillClient(request),
499
543
  agents: createAgentClient(request),
544
+ notifications: createNotificationsClient(request),
500
545
  extensions: createExtensionClient(request),
501
546
  settings: createSettingsClient(request),
502
547
  sync: createSyncClient(options)
@@ -0,0 +1,23 @@
1
+ import type { CreateNotificationInput, ListNotificationsQuery, ListNotificationsResponse, Notification, NotificationStatus, UpdateNotificationInput } from "pstdio-api-contracts";
2
+ import type { RequestFn } from "./request";
3
+ export type NotificationsClient = {
4
+ list(projectId: string, query?: ListNotificationsQuery): Promise<ListNotificationsResponse>;
5
+ count(projectId: string, query?: Pick<ListNotificationsQuery, "status" | "priority" | "sourceExtensionId">): Promise<{
6
+ count: number;
7
+ }>;
8
+ get(projectId: string, id: string): Promise<Notification>;
9
+ create(input: CreateNotificationInput): Promise<Notification>;
10
+ update(projectId: string, id: string, input: UpdateNotificationInput): Promise<Notification>;
11
+ markRead(projectId: string, id: string): Promise<Notification>;
12
+ dismiss(projectId: string, id: string): Promise<Notification>;
13
+ markDone(projectId: string, id: string): Promise<Notification>;
14
+ snooze(projectId: string, id: string, until: string): Promise<Notification>;
15
+ resolveByDedupeKey(projectId: string, input: {
16
+ dedupeKey: string;
17
+ status?: Extract<NotificationStatus, "done" | "dismissed" | "expired">;
18
+ }): Promise<{
19
+ resolved: number;
20
+ notifications: Notification[];
21
+ }>;
22
+ };
23
+ export declare const createNotificationsClient: (request: RequestFn) => NotificationsClient;
@@ -10,6 +10,8 @@
10
10
  */
11
11
  export type GuestHost = {
12
12
  call: <TResult = unknown>(method: string, params?: unknown) => Promise<TResult>;
13
+ /** Subscribe to host-pushed events for a capability scope (e.g. "terminal.session"). */
14
+ onEvent: (scope: string, handler: (payload: unknown) => void) => () => void;
13
15
  };
14
16
  export type PropsStore<TProps = unknown> = {
15
17
  get: () => TProps;
@@ -1,5 +1,6 @@
1
+ export type { CreateNotificationInput, ListNotificationsQuery, ListNotificationsResponse, Notification, NotificationAction, NotificationActionResult, NotificationActorType, NotificationKind, NotificationOrigin, NotificationPriority, NotificationStatus, UpdateNotificationInput, } from "pstdio-api-contracts";
1
2
  export type * from "pstdio-api-contracts/extension-kernel";
2
- export type { CommitPayload, ConflictPayload, MergePayload, RebasePayload, SessionLifecyclePayload, WorktreeCreatedEventPayload, WorktreeRemovedPayload, } from "pstdio-api-contracts/extension-kernel";
3
+ export type { CommitPayload, ConflictPayload, MergePayload, RebasePayload, SessionLifecyclePayload, WorkspaceProvisionPayload, WorkspaceType, WorktreeRemovedPayload, } from "pstdio-api-contracts/extension-kernel";
3
4
  export { ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES, EXTENSION_API_VERSION, getWorkbenchTargetDefinition, gitEvents, isLocalizedString, type Localizable, type LocalizedString, l10n, packageAsset, projectEvents, projectSlots, sessionEvents, sessionSlots, WEBVIEW_DECLARABLE_CAPABILITIES, WEBVIEW_HOST_CAPABILITIES, WEBVIEW_HOST_CAPABILITY_VERSION, type WorkbenchAttachmentTarget, type WorkbenchContributionKind, type WorkbenchLayoutTarget, type WorkbenchMenuTarget, type WorkbenchModeLayoutTarget, type WorkbenchSettingsScope, type WorkbenchSettingsTarget, type WorkbenchTargetDefinition, type WorkbenchTargetGranularity, type WorkbenchTreeTarget, type WorkbenchViewTarget, workbenchMenuTargets, workbenchModeLayoutTargets, workbenchSettingsScopes, workbenchSettingsTargets, workbenchTargets, workbenchTreeTargets, workbenchViewTargets, workspaceEvents, workspaceSlots, worktreeEvents, } from "pstdio-api-contracts/extension-kernel";
4
5
  export { type CommandResponse, unwrapCommandOutcome } from "./command-outcome";
5
6
  export { defineCommand, defineHook, defineMiddleware } from "./define-command";
@@ -7,4 +8,5 @@ export { defineExtension } from "./define-extension";
7
8
  export { defineExtensionView, type ExtensionViewModule, type ExtensionViewRender, type ExtensionViewRenderContext, type GuestHost, type PropsStore, type WebviewFilesClient, } from "./define-extension-view";
8
9
  export { params } from "./params";
9
10
  export { commandEvent, commandRef, commandsOf, eventRef } from "./refs";
11
+ export { createTerminalSessionBridge, type TerminalSessionAdapter, type TerminalSessionBridge, type TerminalSessionExit, } from "./terminal-session-bridge";
10
12
  export { matchesResourceWhen } from "./when";
@@ -56,11 +56,12 @@ var sessionEvents = {
56
56
  };
57
57
  var workspaceEvents = {
58
58
  created: eventRef("workspace.created"),
59
+ provision: eventRef("workspace.provision"),
60
+ ready: eventRef("workspace.ready"),
59
61
  archived: eventRef("workspace.archived"),
60
62
  deleted: eventRef("workspace.deleted")
61
63
  };
62
64
  var worktreeEvents = {
63
- created: eventRef("worktree.created"),
64
65
  removed: eventRef("worktree.removed")
65
66
  };
66
67
  var gitEvents = {
@@ -89,12 +90,16 @@ var WEBVIEW_DECLARABLE_CAPABILITIES = [
89
90
  "commands.execute",
90
91
  "resource.open",
91
92
  "notification.show",
93
+ "notification.action",
94
+ "notification.resolve",
95
+ "notification.dismiss",
92
96
  "preferences.get",
93
97
  "preferences.set",
94
98
  "extension.settings.all",
95
99
  "extension.settings.get",
96
100
  "extension.settings.set",
97
101
  "extension.settings.delete",
102
+ "terminal.session",
98
103
  "files.upload",
99
104
  "files.list",
100
105
  "files.delete"
@@ -305,6 +310,78 @@ var commandsOf = (packageName, extension) => {
305
310
  }
306
311
  return refs;
307
312
  };
313
+ // src/extensions/terminal-session-bridge.ts
314
+ var TERMINAL_SESSION_CAPABILITY = "terminal.session";
315
+ var createTerminalSessionBridge = (host) => ({
316
+ async openSession(request) {
317
+ const call = (operation) => host.call(TERMINAL_SESSION_CAPABILITY, operation);
318
+ const opened = await call({ operation: "open", request });
319
+ const sessionId = opened.sessionId;
320
+ const dataHandlers = new Set;
321
+ const exitHandlers = new Set;
322
+ const errorHandlers = new Set;
323
+ const callDetached = (operation) => {
324
+ call(operation).catch((error) => {
325
+ const message = error instanceof Error ? error.message : String(error);
326
+ for (const handler of errorHandlers)
327
+ handler({ message });
328
+ });
329
+ };
330
+ const pendingData = [];
331
+ let pendingExit = null;
332
+ const unsubscribeHostEvents = host.onEvent(TERMINAL_SESSION_CAPABILITY, (payload) => {
333
+ const event = payload;
334
+ if (event.sessionId !== sessionId)
335
+ return;
336
+ if (event.kind === "data") {
337
+ if (dataHandlers.size === 0) {
338
+ pendingData.push(event.chunk);
339
+ return;
340
+ }
341
+ for (const handler of dataHandlers)
342
+ handler(event.chunk);
343
+ return;
344
+ }
345
+ const exit = { code: event.code, signal: event.signal };
346
+ if (exitHandlers.size === 0)
347
+ pendingExit = exit;
348
+ for (const handler of exitHandlers)
349
+ handler(exit);
350
+ unsubscribeHostEvents();
351
+ });
352
+ await call({ operation: "subscribe", sessionId });
353
+ return {
354
+ id: sessionId,
355
+ write(data) {
356
+ callDetached({ operation: "write", sessionId, data });
357
+ },
358
+ resize(cols, rows) {
359
+ callDetached({ operation: "resize", sessionId, cols, rows });
360
+ },
361
+ async kill(signal) {
362
+ await call({ operation: "kill", sessionId, signal });
363
+ },
364
+ onData(handler) {
365
+ dataHandlers.add(handler);
366
+ while (pendingData.length > 0)
367
+ handler(pendingData.shift());
368
+ return () => dataHandlers.delete(handler);
369
+ },
370
+ onExit(handler) {
371
+ exitHandlers.add(handler);
372
+ if (pendingExit) {
373
+ handler(pendingExit);
374
+ pendingExit = null;
375
+ }
376
+ return () => exitHandlers.delete(handler);
377
+ },
378
+ onError(handler) {
379
+ errorHandlers.add(handler);
380
+ return () => errorHandlers.delete(handler);
381
+ }
382
+ };
383
+ }
384
+ });
308
385
  // src/extensions/when.ts
309
386
  var matchesResourceWhen = (when, resourceType) => {
310
387
  const resourceTypes = when?.resourceType;
@@ -341,6 +418,7 @@ export {
341
418
  defineExtensionView,
342
419
  defineExtension,
343
420
  defineCommand,
421
+ createTerminalSessionBridge,
344
422
  commandsOf,
345
423
  commandRef,
346
424
  commandEvent,
@@ -0,0 +1,32 @@
1
+ import type { TerminalSessionRequest } from "../api/terminal";
2
+ import type { GuestHost } from "./define-extension-view";
3
+ export interface TerminalSessionExit {
4
+ code: number | null;
5
+ signal: string | null;
6
+ }
7
+ /**
8
+ * Renderer-side session over the `terminal.session` capability. Structurally
9
+ * compatible with the `TerminalSessionAdapter` contract of `@pstdio/ui/terminal`,
10
+ * so it plugs straight into the `Terminal` component's `bridge` prop.
11
+ */
12
+ export interface TerminalSessionAdapter {
13
+ readonly id: string;
14
+ write(data: string | Uint8Array): void;
15
+ resize(cols: number, rows: number): void;
16
+ kill(signal?: string): Promise<void>;
17
+ onData(handler: (chunk: Uint8Array) => void): () => void;
18
+ onExit(handler: (exit: TerminalSessionExit) => void): () => void;
19
+ onError(handler: (error: {
20
+ message: string;
21
+ }) => void): () => void;
22
+ }
23
+ export interface TerminalSessionBridge {
24
+ openSession(request: TerminalSessionRequest): Promise<TerminalSessionAdapter>;
25
+ }
26
+ /**
27
+ * Builds a terminal bridge for an extension webview from its `GuestHost`.
28
+ * Operations go through `host.call("terminal.session", ...)`; output and exit
29
+ * events arrive through the host event channel. The webview must declare the
30
+ * `terminal.session` capability or every call is rejected by the host gate.
31
+ */
32
+ export declare const createTerminalSessionBridge: (host: GuestHost) => TerminalSessionBridge;
@@ -13636,11 +13636,12 @@ var sessionEvents = {
13636
13636
  };
13637
13637
  var workspaceEvents = {
13638
13638
  created: eventRef("workspace.created"),
13639
+ provision: eventRef("workspace.provision"),
13640
+ ready: eventRef("workspace.ready"),
13639
13641
  archived: eventRef("workspace.archived"),
13640
13642
  deleted: eventRef("workspace.deleted")
13641
13643
  };
13642
13644
  var worktreeEvents = {
13643
- created: eventRef("worktree.created"),
13644
13645
  removed: eventRef("worktree.removed")
13645
13646
  };
13646
13647
  var gitEvents = {
@@ -13669,12 +13670,16 @@ var WEBVIEW_DECLARABLE_CAPABILITIES = [
13669
13670
  "commands.execute",
13670
13671
  "resource.open",
13671
13672
  "notification.show",
13673
+ "notification.action",
13674
+ "notification.resolve",
13675
+ "notification.dismiss",
13672
13676
  "preferences.get",
13673
13677
  "preferences.set",
13674
13678
  "extension.settings.all",
13675
13679
  "extension.settings.get",
13676
13680
  "extension.settings.set",
13677
13681
  "extension.settings.delete",
13682
+ "terminal.session",
13678
13683
  "files.upload",
13679
13684
  "files.list",
13680
13685
  "files.delete"
@@ -13958,6 +13963,21 @@ var extensionCommandPaletteContributionSchema = exports_external.object({
13958
13963
  when: extensionWhenExpressionSchema.optional()
13959
13964
  });
13960
13965
 
13966
+ // ../pstdio-api-contracts/src/extensions/controls-renderer.ts
13967
+ var extensionControlsRendererRecordSchema = exports_external.object({
13968
+ id: exports_external.string(),
13969
+ extensionId: exports_external.string(),
13970
+ title: localizableStringSchema,
13971
+ queryCommandId: exports_external.string(),
13972
+ updateValueCommandId: exports_external.string().optional(),
13973
+ applyCommandId: exports_external.string().optional(),
13974
+ resetCommandId: exports_external.string().optional(),
13975
+ refreshEventIds: exports_external.array(exports_external.string()).optional(),
13976
+ defaultValues: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
13977
+ emptyTitle: localizableStringSchema.optional(),
13978
+ emptyDescription: localizableStringSchema.optional()
13979
+ });
13980
+
13961
13981
  // ../pstdio-api-contracts/src/extensions/data-renderer.ts
13962
13982
  var dataRendererEnumOptionSchema = exports_external.object({
13963
13983
  value: exports_external.string(),
@@ -14128,8 +14148,9 @@ var workbenchExtensionSettingsPanelRecordSchema = extensionSettingsPanelRecordSc
14128
14148
  });
14129
14149
 
14130
14150
  // ../pstdio-api-contracts/src/extensions/views.ts
14131
- var hasSingleViewBody = (value) => [value.webview, value.treeRendererId, value.fileRendererId].filter(Boolean).length === 1;
14132
- var singleViewBodyMessage = "Extension views must declare exactly one body: webview, treeRendererId, or fileRendererId";
14151
+ var hasSingleViewBody = (value) => [value.webview, value.treeRendererId, value.fileRendererId, value.controlsRendererId].filter(Boolean).length === 1;
14152
+ var singleViewBodyMessage = "Extension views must declare exactly one body: webview, treeRendererId, fileRendererId, or controlsRendererId";
14153
+ var hostTreeDefaultSchema = exports_external.enum(["default", "none"]);
14133
14154
  var extensionViewRecordBaseSchema = exports_external.object({
14134
14155
  id: exports_external.string(),
14135
14156
  extensionId: exports_external.string(),
@@ -14142,7 +14163,10 @@ var extensionViewRecordBaseSchema = exports_external.object({
14142
14163
  surface: exports_external.enum(["panel", "modal"]).optional(),
14143
14164
  webview: extensionWebviewContributionSchema.optional(),
14144
14165
  treeRendererId: exports_external.string().optional(),
14145
- fileRendererId: exports_external.string().optional()
14166
+ fileRendererId: exports_external.string().optional(),
14167
+ controlsRendererId: exports_external.string().optional(),
14168
+ hostTreeHeader: hostTreeDefaultSchema.optional(),
14169
+ hostTreeFooter: hostTreeDefaultSchema.optional()
14146
14170
  });
14147
14171
  var extensionViewRecordSchema = extensionViewRecordBaseSchema.refine(hasSingleViewBody, {
14148
14172
  message: singleViewBodyMessage
@@ -14257,6 +14281,7 @@ var extensionsCheckResponseSchema = exports_external.object({
14257
14281
  commandPaletteResources: exports_external.array(extensionCommandPaletteResourceRecordSchema),
14258
14282
  treeRenderers: exports_external.array(extensionTreeRendererRecordSchema),
14259
14283
  fileRenderers: exports_external.array(extensionFileRendererRecordSchema),
14284
+ controlsRenderers: exports_external.array(extensionControlsRendererRecordSchema),
14260
14285
  keybindings: exports_external.array(extensionKeybindingRecordSchema),
14261
14286
  settingsDefinitions: exports_external.array(extensionSettingDefinitionRecordSchema).optional(),
14262
14287
  templates: exports_external.array(extensionViewLikeSchema),
@@ -14278,6 +14303,7 @@ var workbenchExtensionMetadataSchema = exports_external.object({
14278
14303
  commandPaletteResources: exports_external.array(extensionCommandPaletteResourceRecordSchema).optional(),
14279
14304
  treeRenderers: exports_external.array(extensionTreeRendererRecordSchema).optional(),
14280
14305
  fileRenderers: exports_external.array(extensionFileRendererRecordSchema).optional(),
14306
+ controlsRenderers: exports_external.array(extensionControlsRendererRecordSchema).optional(),
14281
14307
  keybindings: exports_external.array(extensionKeybindingRecordSchema).optional(),
14282
14308
  settingsDefinitions: exports_external.array(extensionSettingDefinitionRecordSchema).optional(),
14283
14309
  diagnostics: exports_external.array(extensionDiagnosticSchema)
@@ -14322,6 +14348,7 @@ var extensionAttachmentInvocationSchema = exports_external.object({
14322
14348
  });
14323
14349
  var commandExecuteRequestSchema = exports_external.object({
14324
14350
  projectId: exports_external.string().min(1),
14351
+ workspaceId: exports_external.string().optional(),
14325
14352
  params: jsonObjectSchema.optional(),
14326
14353
  resource: extensionResourceRefSchema.optional(),
14327
14354
  attachment: extensionAttachmentInvocationSchema.optional(),
@@ -14331,6 +14358,7 @@ var commandExecuteRequestSchema = exports_external.object({
14331
14358
  metadata: jsonObjectSchema.optional()
14332
14359
  });
14333
14360
  var commandExecuteBodySchema = exports_external.object({
14361
+ workspaceId: exports_external.string().optional(),
14334
14362
  params: jsonObjectSchema.optional(),
14335
14363
  resource: extensionResourceRefSchema.optional(),
14336
14364
  attachment: extensionAttachmentInvocationSchema.optional(),
@@ -14339,6 +14367,10 @@ var commandExecuteBodySchema = exports_external.object({
14339
14367
  source: commandSourceSchema.optional(),
14340
14368
  metadata: jsonObjectSchema.optional()
14341
14369
  });
14370
+ var dispatchExtensionEventBodySchema = exports_external.object({
14371
+ eventId: exports_external.string().min(1),
14372
+ payload: jsonObjectSchema
14373
+ }).strict();
14342
14374
  var serializedErrorSchema = exports_external.object({
14343
14375
  name: exports_external.string().optional(),
14344
14376
  message: exports_external.string(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pstdio/sdk",
3
- "version": "0.13.2",
3
+ "version": "0.15.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/pufflyai/prompt-studio"