@pstdio/sdk 0.15.0 → 0.17.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.
@@ -3,6 +3,7 @@ import { type ExtensionClient } from "./extensions";
3
3
  import { type NotificationsClient } from "./notifications";
4
4
  import { type ProjectClient } from "./projects";
5
5
  import type { ClientOptions } from "./request";
6
+ import { type RuntimeClient } from "./runtime";
6
7
  import { type SessionClient } from "./sessions";
7
8
  import { type SettingsClient } from "./settings";
8
9
  import { type SkillClient } from "./skills";
@@ -20,5 +21,6 @@ export type PstdioClient = {
20
21
  extensions: ExtensionClient;
21
22
  settings: SettingsClient;
22
23
  sync: SyncClient;
24
+ runtime: RuntimeClient;
23
25
  };
24
26
  export declare const createClient: (options?: ClientOptions) => PstdioClient;
@@ -1,10 +1,11 @@
1
- import type { CommandExecuteRequest, CommandExecuteResponse, DispatchExtensionEventInput, EnableInstalledExtensionRequest, EnableInstalledExtensionResponse, ListExtensionAppearanceResponse, ListExtensionCommandsResponse, UpdateInstalledExtensionTemplateInput, UpdateInstalledExtensionTemplateResponse } from "pstdio-api-contracts";
1
+ import type { CommandExecuteRequest, CommandExecuteResponse, DispatchExtensionEventInput, EnableInstalledExtensionRequest, EnableInstalledExtensionResponse, ListExtensionAppearanceResponse, ListExtensionCommandsResponse, ListProjectExtensionsResponse, 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>;
5
5
  updateInstalledTemplate(installName: string, templateKey: string, input: UpdateInstalledExtensionTemplateInput): Promise<UpdateInstalledExtensionTemplateResponse>;
6
6
  listAppearance(projectId: string): Promise<ListExtensionAppearanceResponse>;
7
7
  listCommands(projectId: string): Promise<ListExtensionCommandsResponse>;
8
+ listProject(projectId: string): Promise<ListProjectExtensionsResponse>;
8
9
  execute(commandId: string, request: CommandExecuteRequest): Promise<CommandExecuteResponse>;
9
10
  dispatchEvent(projectId: string, input: DispatchExtensionEventInput): Promise<void>;
10
11
  };
@@ -4,6 +4,7 @@ export type { ExtensionClient } from "./extensions";
4
4
  export type { NotificationsClient } from "./notifications";
5
5
  export type { ProjectClient } from "./projects";
6
6
  export { type ClientOptions, createRequest, PstdioApiError, type RequestFn, type RequestOptions, } from "./request";
7
+ export { createRuntimeClient, type RuntimeClient } from "./runtime";
7
8
  export type { ListSessionsInput, SessionClient, SessionStreamConnection, SessionStreamHandlers } from "./sessions";
8
9
  export type { SettingsClient } from "./settings";
9
10
  export type { SkillClient } from "./skills";
@@ -31,6 +31,7 @@ var createExtensionClient = (request) => ({
31
31
  }),
32
32
  listAppearance: (projectId) => request(`/v1/projects/${projectId}/extensions/appearance`),
33
33
  listCommands: (projectId) => request(`/v1/projects/${projectId}/extensions/commands`),
34
+ listProject: (projectId) => request(`/v1/projects/${projectId}/extensions`),
34
35
  execute: (commandId, input) => {
35
36
  const { projectId, ...body } = input;
36
37
  return request(`/v1/projects/${projectId}/extensions/commands/${encodeURIComponent(commandId)}/execute`, {
@@ -150,15 +151,27 @@ ${hookOutput}` : message;
150
151
  }
151
152
  return `Request failed: ${status}`;
152
153
  };
153
- var resolveBaseUrl = (options) => options.baseUrl ?? (typeof process !== "undefined" ? process.env.PSTDIO_API_URL : undefined) ?? "http://localhost:19840";
154
+ var processEnvironment = () => typeof process !== "undefined" && process.env ? process.env : undefined;
155
+ var resolveBaseUrl = (options) => options.baseUrl ?? processEnvironment()?.PSTDIO_API_URL ?? "http://127.0.0.1:19840";
154
156
  var resolveClientUrl = (baseUrl, path) => path.startsWith("http://") || path.startsWith("https://") ? path : `${baseUrl}${path}`;
157
+ var isSameOriginTarget = (baseUrl, path, url) => {
158
+ if (!path.startsWith("http://") && !path.startsWith("https://"))
159
+ return true;
160
+ try {
161
+ return new URL(url).origin === new URL(baseUrl).origin;
162
+ } catch {
163
+ return false;
164
+ }
165
+ };
155
166
  var resolveFetch = (options) => options.fetch ?? globalThis.fetch;
167
+ var resolveToken = (options) => options.token ?? processEnvironment()?.PSTDIO_API_TOKEN;
156
168
  var createRequestHeaders = (options, reqOpts = {}) => {
157
169
  const headers = new Headers(reqOpts.headers);
158
170
  if (reqOpts.hasJsonBody && !headers.has("content-type"))
159
171
  headers.set("content-type", "application/json");
160
- if (options.token)
161
- headers.set("authorization", `Bearer ${options.token}`);
172
+ const token = resolveToken(options);
173
+ if (token)
174
+ headers.set("authorization", `Bearer ${token}`);
162
175
  return headers;
163
176
  };
164
177
  var isBinaryBody = (body) => body instanceof ArrayBuffer || ArrayBuffer.isView(body);
@@ -178,17 +191,20 @@ var createRequest = (options) => {
178
191
  const baseUrl = resolveBaseUrl(options);
179
192
  const fetchFn = resolveFetch(options);
180
193
  return async (path, reqOpts = {}) => {
194
+ const url = resolveClientUrl(baseUrl, path);
181
195
  const headers = createRequestHeaders(options, {
182
196
  headers: reqOpts.headers,
183
197
  hasJsonBody: reqOpts.body !== undefined && !isBinaryBody(reqOpts.body)
184
198
  });
185
- const url = resolveClientUrl(baseUrl, path);
199
+ if (!isSameOriginTarget(baseUrl, path, url))
200
+ headers.delete("authorization");
186
201
  const response = await fetchFn(url, {
187
202
  method: reqOpts.method ?? "GET",
188
203
  headers: Object.fromEntries(headers.entries()),
189
204
  body: reqOpts.body !== undefined ? serializeRequestBody(reqOpts.body) : undefined,
190
205
  signal: reqOpts.signal,
191
- cache: reqOpts.cache
206
+ cache: reqOpts.cache,
207
+ credentials: "same-origin"
192
208
  });
193
209
  if (!response.ok) {
194
210
  const errorBody = await response.json().catch(() => null);
@@ -201,6 +217,11 @@ var createRequest = (options) => {
201
217
  };
202
218
  };
203
219
 
220
+ // src/client/runtime.ts
221
+ var createRuntimeClient = (request) => ({
222
+ provisionBrowserSession: () => request("/runtime/browser-session", { method: "POST" })
223
+ });
224
+
204
225
  // src/client/sse.ts
205
226
  var parseSseEvent = (part) => {
206
227
  let event = "message";
@@ -467,7 +488,8 @@ var createSyncClient = (clientOptions) => ({
467
488
  try {
468
489
  const response = await resolveFetch(clientOptions)(resolveClientUrl(resolveBaseUrl(clientOptions), buildSyncStreamPath(lastSeq)), {
469
490
  headers: Object.fromEntries(createRequestHeaders(clientOptions).entries()),
470
- signal: abortController.signal
491
+ signal: abortController.signal,
492
+ credentials: "same-origin"
471
493
  });
472
494
  if (!response.ok || !response.body)
473
495
  throw new Error("SSE connection failed");
@@ -544,11 +566,13 @@ var createClient = (options = {}) => {
544
566
  notifications: createNotificationsClient(request),
545
567
  extensions: createExtensionClient(request),
546
568
  settings: createSettingsClient(request),
547
- sync: createSyncClient(options)
569
+ sync: createSyncClient(options),
570
+ runtime: createRuntimeClient(request)
548
571
  };
549
572
  };
550
573
  export {
551
574
  parseSyncDeleteEvent,
575
+ createRuntimeClient,
552
576
  createRequest,
553
577
  createClient,
554
578
  applySyncEvent,
@@ -0,0 +1,5 @@
1
+ import type { RequestFn } from "./request";
2
+ export type RuntimeClient = {
3
+ provisionBrowserSession: () => Promise<void>;
4
+ };
5
+ export declare const createRuntimeClient: (request: RequestFn) => RuntimeClient;
@@ -1,7 +1,7 @@
1
1
  export type { CreateNotificationInput, ListNotificationsQuery, ListNotificationsResponse, Notification, NotificationAction, NotificationActionResult, NotificationActorType, NotificationKind, NotificationOrigin, NotificationPriority, NotificationStatus, UpdateNotificationInput, } from "pstdio-api-contracts";
2
2
  export type * from "pstdio-api-contracts/extension-kernel";
3
3
  export type { CommitPayload, ConflictPayload, MergePayload, RebasePayload, SessionLifecyclePayload, WorkspaceProvisionPayload, WorkspaceType, WorktreeRemovedPayload, } from "pstdio-api-contracts/extension-kernel";
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
+ export { ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES, EXTENSION_API_VERSION, getWorkbenchModeLayoutTargetPanel, 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 WorkbenchModePanel, type WorkbenchSettingsScope, type WorkbenchSettingsTarget, type WorkbenchTargetDefinition, type WorkbenchTargetGranularity, type WorkbenchTreeTarget, type WorkbenchViewTarget, workbenchMenuTargets, workbenchModeLayoutTargets, workbenchModePanels, workbenchSettingsScopes, workbenchSettingsTargets, workbenchTargets, workbenchTreeTargets, workbenchViewTargets, workspaceEvents, workspaceSlots, worktreeEvents, } from "pstdio-api-contracts/extension-kernel";
5
5
  export { type CommandResponse, unwrapCommandOutcome } from "./command-outcome";
6
6
  export { defineCommand, defineHook, defineMiddleware } from "./define-command";
7
7
  export { defineExtension } from "./define-extension";
@@ -28,7 +28,7 @@ var defineSlot = (id, options) => ({
28
28
 
29
29
  // ../pstdio-api-contracts/src/extension-kernel/kernel-slots.ts
30
30
  var projectSlots = {
31
- sidebar: defineSlot("project.sidebar", { kind: "view" }),
31
+ sidenav: defineSlot("project.sidenav", { kind: "panel" }),
32
32
  headerPrimary: defineSlot("project.headerPrimary", { kind: "menu" }),
33
33
  headerOverflow: defineSlot("project.headerOverflow", { kind: "menu" }),
34
34
  settingsPanels: defineSlot("project.settingsPanels", { kind: "settings" })
@@ -41,7 +41,7 @@ var sessionSlots = {
41
41
  var workspaceSlots = {
42
42
  headerPrimary: defineSlot("workspace.headerPrimary", { kind: "menu" }),
43
43
  headerOverflow: defineSlot("workspace.headerOverflow", { kind: "menu" }),
44
- sidebar: defineSlot("workspace.sidebar", { kind: "view" })
44
+ sidenav: defineSlot("workspace.sidenav", { kind: "panel" })
45
45
  };
46
46
  var projectEvents = {
47
47
  opened: eventRef("project.opened")
@@ -116,6 +116,20 @@ var workbenchTreeTargets = [
116
116
  "workbench.main.left.tree",
117
117
  "workbench.main.right.tree"
118
118
  ];
119
+ var workbenchRegions = [
120
+ "nav",
121
+ "activity",
122
+ "sidenav-header",
123
+ "sidenav",
124
+ "main-header",
125
+ "main",
126
+ "secondary-header",
127
+ "secondary",
128
+ "side-header",
129
+ "side",
130
+ "status",
131
+ "overlay"
132
+ ];
119
133
  var workbenchViewTargets = [
120
134
  "workbench.main",
121
135
  "workbench.main.left",
@@ -124,6 +138,7 @@ var workbenchViewTargets = [
124
138
  ];
125
139
  var workbenchSettingsTargets = ["workbench.settings"];
126
140
  var workbenchSettingsScopes = ["project", "global"];
141
+ var workbenchModePanels = ["main", "secondary", "side"];
127
142
  var workbenchModeLayoutTargets = [
128
143
  "workbench.left",
129
144
  "workbench.main.left",
@@ -131,6 +146,14 @@ var workbenchModeLayoutTargets = [
131
146
  "workbench.main.right",
132
147
  "workbench.secondary"
133
148
  ];
149
+ var workbenchModeLayoutTargetPanels = {
150
+ "workbench.left": undefined,
151
+ "workbench.main.left": "main",
152
+ "workbench.main": "main",
153
+ "workbench.main.right": "main",
154
+ "workbench.secondary": "secondary"
155
+ };
156
+ var getWorkbenchModeLayoutTargetPanel = (target) => workbenchModeLayoutTargetPanels[target];
134
157
  var workbenchTargets = [
135
158
  {
136
159
  id: "workbench.nav.actions",
@@ -162,30 +185,6 @@ var workbenchTargets = [
162
185
  granularity: "areaTree",
163
186
  rationale: "Tree entries for the active tree renderer mounted in the main-right area."
164
187
  },
165
- {
166
- id: "workbench.main",
167
- allowedKinds: ["view"],
168
- granularity: "area",
169
- rationale: "Direct extension view placement in the main area."
170
- },
171
- {
172
- id: "workbench.main.left",
173
- allowedKinds: ["view"],
174
- granularity: "area",
175
- rationale: "Direct extension view placement in the main-left area."
176
- },
177
- {
178
- id: "workbench.main.right",
179
- allowedKinds: ["view"],
180
- granularity: "area",
181
- rationale: "Direct extension view placement in the main-right area."
182
- },
183
- {
184
- id: "workbench.secondary",
185
- allowedKinds: ["view"],
186
- granularity: "area",
187
- rationale: "Direct extension view placement in the secondary area."
188
- },
189
188
  {
190
189
  id: "workbench.settings",
191
190
  allowedKinds: ["settings"],
@@ -276,6 +275,8 @@ var defineExtensionView = (definition) => ({
276
275
  var params = {
277
276
  text: (options) => ({ type: "text", ...options }),
278
277
  longText: (options) => ({ type: "longtext", ...options }),
278
+ markdown: (options) => ({ type: "markdown", ...options }),
279
+ files: (options) => ({ type: "files", ...options }),
279
280
  number: (options) => ({ type: "number", ...options }),
280
281
  boolean: (options) => ({ type: "boolean", ...options }),
281
282
  select: (options) => ({ type: "select", ...options }),
@@ -398,6 +399,7 @@ export {
398
399
  workbenchTargets,
399
400
  workbenchSettingsTargets,
400
401
  workbenchSettingsScopes,
402
+ workbenchModePanels,
401
403
  workbenchModeLayoutTargets,
402
404
  workbenchMenuTargets,
403
405
  unwrapCommandOutcome,
@@ -412,6 +414,7 @@ export {
412
414
  isLocalizedString,
413
415
  gitEvents,
414
416
  getWorkbenchTargetDefinition,
417
+ getWorkbenchModeLayoutTargetPanel,
415
418
  eventRef,
416
419
  defineMiddleware,
417
420
  defineHook,
@@ -1,4 +1,4 @@
1
- import type { BooleanParam, HarnessParam, JsonParam, ListParam, LongTextParam, MultiSelectParam, NumberParam, RepoParam, ResourceParam, SelectParam, TemplateParam, TextParam } from "pstdio-api-contracts/extension-kernel";
1
+ import type { BooleanParam, FilesParam, HarnessParam, JsonParam, ListParam, LongTextParam, MarkdownParam, MultiSelectParam, NumberParam, RepoParam, ResourceParam, SelectParam, TemplateParam, TextParam } from "pstdio-api-contracts/extension-kernel";
2
2
  type RequiredOf<TOptions> = TOptions extends {
3
3
  required: infer TRequired extends boolean;
4
4
  } ? TRequired : undefined;
@@ -18,6 +18,8 @@ type ParamOptions<TParam extends {
18
18
  export declare const params: {
19
19
  text: <const TOptions extends ParamOptions<TextParam> | undefined = undefined>(options?: TOptions) => TextParam<RequiredOf<TOptions>>;
20
20
  longText: <const TOptions extends ParamOptions<LongTextParam> | undefined = undefined>(options?: TOptions) => LongTextParam<RequiredOf<TOptions>>;
21
+ markdown: <const TOptions extends ParamOptions<MarkdownParam> | undefined = undefined>(options?: TOptions) => MarkdownParam<RequiredOf<TOptions>>;
22
+ files: <const TOptions extends ParamOptions<FilesParam> | undefined = undefined>(options?: TOptions) => FilesParam<RequiredOf<TOptions>>;
21
23
  number: <const TOptions extends ParamOptions<NumberParam> | undefined = undefined>(options?: TOptions) => NumberParam<RequiredOf<TOptions>>;
22
24
  boolean: <const TOptions extends ParamOptions<BooleanParam> | undefined = undefined>(options?: TOptions) => BooleanParam<RequiredOf<TOptions>>;
23
25
  select: <const TOptions extends ParamOptions<SelectParam>>(options: TOptions) => SelectParam<RequiredOf<TOptions>>;