@hachej/boring-workspace 0.1.54 → 0.1.56

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.
@@ -0,0 +1,68 @@
1
+ import { k as WorkspaceBridgeErrorCode } from './workspace-bridge-rpc-A98RA5o6.js';
2
+ export { o as WORKSPACE_BRIDGE_DISABLED_ENV, p as WORKSPACE_BRIDGE_REFRESH_TOKEN_ENV, q as WORKSPACE_BRIDGE_TOKEN_ENV, r as WORKSPACE_BRIDGE_TOKEN_URL_ENV, s as WORKSPACE_BRIDGE_URL_ENV, i as WorkspaceBridgeCallFailure, a as WorkspaceBridgeCallRequest, b as WorkspaceBridgeCallResponse, j as WorkspaceBridgeCallSuccess, c as WorkspaceBridgeError } from './workspace-bridge-rpc-A98RA5o6.js';
3
+
4
+ declare enum WorkspaceBridgeClientErrorCode {
5
+ Config = "WORKSPACE_BRIDGE_CLIENT_CONFIG_ERROR",
6
+ InvalidResponse = "WORKSPACE_BRIDGE_INVALID_RESPONSE",
7
+ Transport = "WORKSPACE_BRIDGE_TRANSPORT_ERROR",
8
+ Timeout = "WORKSPACE_BRIDGE_TIMEOUT",
9
+ Aborted = "WORKSPACE_BRIDGE_ABORTED",
10
+ HttpError = "WORKSPACE_BRIDGE_HTTP_ERROR"
11
+ }
12
+ interface WorkspaceBridgeTokenProviderContext {
13
+ /** True when the previous attempt failed with a 401 and the client is retrying once. */
14
+ refresh: boolean;
15
+ /** Aborts when the per-attempt timeout or caller AbortSignal fires. */
16
+ signal?: AbortSignal;
17
+ }
18
+ type WorkspaceBridgeTokenProvider = (context: WorkspaceBridgeTokenProviderContext) => string | Promise<string>;
19
+ type WorkspaceBridgeClientToken = string | WorkspaceBridgeTokenProvider;
20
+ interface WorkspaceBridgeClientOptions {
21
+ url: string;
22
+ token: WorkspaceBridgeClientToken;
23
+ fetch?: typeof fetch;
24
+ /** Default per-attempt timeout. Defaults to 30s. */
25
+ defaultTimeoutMs?: number;
26
+ }
27
+ interface WorkspaceBridgeClientCallOptions {
28
+ requestId?: string;
29
+ idempotencyKey?: string;
30
+ timeoutMs?: number;
31
+ signal?: AbortSignal;
32
+ }
33
+ declare class WorkspaceBridgeClientConfigError extends Error {
34
+ readonly code = WorkspaceBridgeClientErrorCode.Config;
35
+ readonly missingVar?: string;
36
+ constructor(message: string, options?: {
37
+ missingVar?: string;
38
+ });
39
+ }
40
+ declare class WorkspaceBridgeClientError extends Error {
41
+ readonly code: WorkspaceBridgeErrorCode | WorkspaceBridgeClientErrorCode;
42
+ readonly status?: number;
43
+ readonly requestId?: string;
44
+ constructor(message: string, options: {
45
+ code: WorkspaceBridgeErrorCode | WorkspaceBridgeClientErrorCode;
46
+ status?: number;
47
+ requestId?: string;
48
+ cause?: unknown;
49
+ });
50
+ }
51
+ declare class WorkspaceBridgeClient {
52
+ readonly url: string;
53
+ private readonly token;
54
+ private readonly fetchImpl;
55
+ private readonly defaultTimeoutMs;
56
+ constructor(options: WorkspaceBridgeClientOptions);
57
+ static fromEnv(env?: Record<string, string | undefined>, options?: {
58
+ fetch?: typeof fetch;
59
+ token?: WorkspaceBridgeClientToken;
60
+ defaultTimeoutMs?: number;
61
+ }): WorkspaceBridgeClient;
62
+ call<TOutput = unknown, TInput = unknown>(op: string, input: TInput, options?: WorkspaceBridgeClientCallOptions): Promise<TOutput>;
63
+ private callOnce;
64
+ private resolveToken;
65
+ private shouldRetryWithFreshToken;
66
+ }
67
+
68
+ export { WorkspaceBridgeClient, type WorkspaceBridgeClientCallOptions, WorkspaceBridgeClientConfigError, WorkspaceBridgeClientError, WorkspaceBridgeClientErrorCode, type WorkspaceBridgeClientOptions, type WorkspaceBridgeClientToken, WorkspaceBridgeErrorCode, type WorkspaceBridgeTokenProvider, type WorkspaceBridgeTokenProviderContext };
@@ -0,0 +1,370 @@
1
+ // src/shared/workspace-bridge-rpc.ts
2
+ var WORKSPACE_BRIDGE_URL_ENV = "BORING_WORKSPACE_BRIDGE_URL";
3
+ var WORKSPACE_BRIDGE_TOKEN_ENV = "BORING_WORKSPACE_BRIDGE_TOKEN";
4
+ var WORKSPACE_BRIDGE_TOKEN_URL_ENV = "BORING_WORKSPACE_BRIDGE_TOKEN_URL";
5
+ var WORKSPACE_BRIDGE_REFRESH_TOKEN_ENV = "BORING_WORKSPACE_BRIDGE_REFRESH_TOKEN";
6
+ var WORKSPACE_BRIDGE_DISABLED_ENV = "BORING_WORKSPACE_BRIDGE_DISABLED";
7
+ var WorkspaceBridgeErrorCode = /* @__PURE__ */ ((WorkspaceBridgeErrorCode2) => {
8
+ WorkspaceBridgeErrorCode2["OpNotFound"] = "BRIDGE_OP_NOT_FOUND";
9
+ WorkspaceBridgeErrorCode2["DuplicateOp"] = "BRIDGE_DUPLICATE_OP";
10
+ WorkspaceBridgeErrorCode2["CallerNotAllowed"] = "BRIDGE_CALLER_NOT_ALLOWED";
11
+ WorkspaceBridgeErrorCode2["AuthRequired"] = "BRIDGE_AUTH_REQUIRED";
12
+ WorkspaceBridgeErrorCode2["CapabilityDenied"] = "BRIDGE_CAPABILITY_DENIED";
13
+ WorkspaceBridgeErrorCode2["ResourceScopeDenied"] = "BRIDGE_RESOURCE_SCOPE_DENIED";
14
+ WorkspaceBridgeErrorCode2["SchemaInvalid"] = "BRIDGE_SCHEMA_INVALID";
15
+ WorkspaceBridgeErrorCode2["OutputSchemaInvalid"] = "BRIDGE_OUTPUT_SCHEMA_INVALID";
16
+ WorkspaceBridgeErrorCode2["InputTooLarge"] = "BRIDGE_INPUT_TOO_LARGE";
17
+ WorkspaceBridgeErrorCode2["OutputTooLarge"] = "BRIDGE_OUTPUT_TOO_LARGE";
18
+ WorkspaceBridgeErrorCode2["Timeout"] = "BRIDGE_TIMEOUT";
19
+ WorkspaceBridgeErrorCode2["HandlerFailed"] = "BRIDGE_HANDLER_FAILED";
20
+ WorkspaceBridgeErrorCode2["IdempotencyRequired"] = "BRIDGE_IDEMPOTENCY_REQUIRED";
21
+ WorkspaceBridgeErrorCode2["IdempotencyConflict"] = "BRIDGE_IDEMPOTENCY_CONFLICT";
22
+ WorkspaceBridgeErrorCode2["ReplayRejected"] = "BRIDGE_REPLAY_REJECTED";
23
+ WorkspaceBridgeErrorCode2["RateLimited"] = "BRIDGE_RATE_LIMITED";
24
+ WorkspaceBridgeErrorCode2["InvalidToken"] = "BRIDGE_INVALID_TOKEN";
25
+ WorkspaceBridgeErrorCode2["ExpiredToken"] = "BRIDGE_EXPIRED_TOKEN";
26
+ WorkspaceBridgeErrorCode2["InvalidRequest"] = "BRIDGE_INVALID_REQUEST";
27
+ WorkspaceBridgeErrorCode2["UnsupportedRuntime"] = "BRIDGE_UNSUPPORTED_RUNTIME";
28
+ return WorkspaceBridgeErrorCode2;
29
+ })(WorkspaceBridgeErrorCode || {});
30
+
31
+ // src/bridge-client/index.ts
32
+ var WorkspaceBridgeClientErrorCode = /* @__PURE__ */ ((WorkspaceBridgeClientErrorCode2) => {
33
+ WorkspaceBridgeClientErrorCode2["Config"] = "WORKSPACE_BRIDGE_CLIENT_CONFIG_ERROR";
34
+ WorkspaceBridgeClientErrorCode2["InvalidResponse"] = "WORKSPACE_BRIDGE_INVALID_RESPONSE";
35
+ WorkspaceBridgeClientErrorCode2["Transport"] = "WORKSPACE_BRIDGE_TRANSPORT_ERROR";
36
+ WorkspaceBridgeClientErrorCode2["Timeout"] = "WORKSPACE_BRIDGE_TIMEOUT";
37
+ WorkspaceBridgeClientErrorCode2["Aborted"] = "WORKSPACE_BRIDGE_ABORTED";
38
+ WorkspaceBridgeClientErrorCode2["HttpError"] = "WORKSPACE_BRIDGE_HTTP_ERROR";
39
+ return WorkspaceBridgeClientErrorCode2;
40
+ })(WorkspaceBridgeClientErrorCode || {});
41
+ var WorkspaceBridgeClientConfigError = class extends Error {
42
+ code = "WORKSPACE_BRIDGE_CLIENT_CONFIG_ERROR" /* Config */;
43
+ missingVar;
44
+ constructor(message, options = {}) {
45
+ super(message);
46
+ this.name = "WorkspaceBridgeClientConfigError";
47
+ this.missingVar = options.missingVar;
48
+ }
49
+ };
50
+ var WorkspaceBridgeClientError = class extends Error {
51
+ code;
52
+ status;
53
+ requestId;
54
+ constructor(message, options) {
55
+ super(message);
56
+ this.name = "WorkspaceBridgeClientError";
57
+ this.code = options.code;
58
+ this.status = options.status;
59
+ this.requestId = options.requestId;
60
+ if (options.cause !== void 0) {
61
+ ;
62
+ this.cause = options.cause;
63
+ }
64
+ }
65
+ };
66
+ var WorkspaceBridgeClient = class _WorkspaceBridgeClient {
67
+ url;
68
+ token;
69
+ fetchImpl;
70
+ defaultTimeoutMs;
71
+ constructor(options) {
72
+ this.url = normalizeBridgeUrl(options.url);
73
+ this.token = options.token;
74
+ this.fetchImpl = options.fetch ?? globalThis.fetch;
75
+ this.defaultTimeoutMs = options.defaultTimeoutMs ?? 3e4;
76
+ assertTimeoutMs(this.defaultTimeoutMs, "defaultTimeoutMs");
77
+ if (!this.fetchImpl) {
78
+ throw new WorkspaceBridgeClientConfigError("WorkspaceBridge client requires a fetch implementation");
79
+ }
80
+ }
81
+ static fromEnv(env = readProcessEnv(), options = {}) {
82
+ const disabled = env[WORKSPACE_BRIDGE_DISABLED_ENV];
83
+ if (disabled) {
84
+ throw new WorkspaceBridgeClientConfigError(`WorkspaceBridge runtime env is disabled: ${disabled}`);
85
+ }
86
+ const url = requireEnv(env, WORKSPACE_BRIDGE_URL_ENV);
87
+ const token = options.token ?? tokenFromEnv(env, options.fetch ?? globalThis.fetch);
88
+ return new _WorkspaceBridgeClient({ url, token, fetch: options.fetch, defaultTimeoutMs: options.defaultTimeoutMs });
89
+ }
90
+ async call(op, input, options = {}) {
91
+ const request = {
92
+ op,
93
+ input,
94
+ ...options.requestId ? { requestId: options.requestId } : {},
95
+ ...options.idempotencyKey ? { idempotencyKey: options.idempotencyKey } : {}
96
+ };
97
+ try {
98
+ return await this.callOnce(request, options, false);
99
+ } catch (error) {
100
+ if (this.shouldRetryWithFreshToken(error)) {
101
+ return await this.callOnce(request, options, true);
102
+ }
103
+ throw error;
104
+ }
105
+ }
106
+ async callOnce(request, options, refreshToken) {
107
+ const timeoutMs = options.timeoutMs ?? this.defaultTimeoutMs;
108
+ assertTimeoutMs(timeoutMs, "timeoutMs");
109
+ const abort = createAbortController({ signal: options.signal, timeoutMs });
110
+ try {
111
+ const token = await runWithAbort(() => this.resolveToken(refreshToken, abort.signal), abort);
112
+ const response = await runWithAbort(() => this.fetchImpl(this.url, {
113
+ method: "POST",
114
+ headers: {
115
+ "content-type": "application/json",
116
+ authorization: `Bearer ${token}`
117
+ },
118
+ body: JSON.stringify(request),
119
+ signal: abort.signal
120
+ }), abort);
121
+ const body = await readJsonResponse(response, abort);
122
+ const envelope = parseBridgeEnvelope(body);
123
+ if (!envelope) {
124
+ if (!httpOk(response)) {
125
+ throw new WorkspaceBridgeClientError(httpErrorMessage(response, body), {
126
+ code: "WORKSPACE_BRIDGE_HTTP_ERROR" /* HttpError */,
127
+ status: response.status
128
+ });
129
+ }
130
+ throw new WorkspaceBridgeClientError("WorkspaceBridge response envelope was invalid", {
131
+ code: "WORKSPACE_BRIDGE_INVALID_RESPONSE" /* InvalidResponse */,
132
+ status: response.status
133
+ });
134
+ }
135
+ if (!envelope.ok) {
136
+ throw new WorkspaceBridgeClientError(envelope.error.message, {
137
+ code: envelope.error.code,
138
+ status: response.status,
139
+ requestId: envelope.requestId
140
+ });
141
+ }
142
+ if (!httpOk(response)) {
143
+ throw new WorkspaceBridgeClientError(httpErrorMessage(response, body), {
144
+ code: "WORKSPACE_BRIDGE_HTTP_ERROR" /* HttpError */,
145
+ status: response.status,
146
+ requestId: envelope.requestId
147
+ });
148
+ }
149
+ return envelope.output;
150
+ } catch (error) {
151
+ if (error instanceof WorkspaceBridgeClientError || error instanceof WorkspaceBridgeClientConfigError) throw error;
152
+ throw fetchError(error, abort);
153
+ } finally {
154
+ abort.cleanup();
155
+ }
156
+ }
157
+ async resolveToken(refresh, signal) {
158
+ const value = typeof this.token === "function" ? await this.token({ refresh, signal }) : this.token;
159
+ if (!value) {
160
+ throw new WorkspaceBridgeClientConfigError("WorkspaceBridge token provider returned an empty token");
161
+ }
162
+ return value;
163
+ }
164
+ shouldRetryWithFreshToken(error) {
165
+ if (typeof this.token !== "function") return false;
166
+ return error instanceof WorkspaceBridgeClientError && error.status === 401;
167
+ }
168
+ };
169
+ function tokenFromEnv(env, fetchImpl) {
170
+ const initialToken = requireEnv(env, WORKSPACE_BRIDGE_TOKEN_ENV);
171
+ const tokenUrl = env[WORKSPACE_BRIDGE_TOKEN_URL_ENV];
172
+ const refreshToken = env[WORKSPACE_BRIDGE_REFRESH_TOKEN_ENV];
173
+ if (!tokenUrl && !refreshToken) return initialToken;
174
+ if (!tokenUrl) {
175
+ throw new WorkspaceBridgeClientConfigError(`WorkspaceBridge client missing required env var ${WORKSPACE_BRIDGE_TOKEN_URL_ENV}`, { missingVar: WORKSPACE_BRIDGE_TOKEN_URL_ENV });
176
+ }
177
+ if (!refreshToken) {
178
+ throw new WorkspaceBridgeClientConfigError(`WorkspaceBridge client missing required env var ${WORKSPACE_BRIDGE_REFRESH_TOKEN_ENV}`, { missingVar: WORKSPACE_BRIDGE_REFRESH_TOKEN_ENV });
179
+ }
180
+ if (!fetchImpl) {
181
+ throw new WorkspaceBridgeClientConfigError("WorkspaceBridge refresh token provider requires a fetch implementation");
182
+ }
183
+ const normalizedTokenUrl = normalizeBridgeUrl(tokenUrl);
184
+ let cachedToken = initialToken;
185
+ return async ({ refresh, signal }) => {
186
+ if (!refresh) return cachedToken;
187
+ cachedToken = await fetchRefreshedToken({ tokenUrl: normalizedTokenUrl, refreshToken, fetchImpl, signal });
188
+ return cachedToken;
189
+ };
190
+ }
191
+ async function fetchRefreshedToken(options) {
192
+ const response = await options.fetchImpl(options.tokenUrl, {
193
+ method: "POST",
194
+ headers: {
195
+ "content-type": "application/json",
196
+ authorization: `Bearer ${options.refreshToken}`
197
+ },
198
+ body: "{}",
199
+ signal: options.signal
200
+ });
201
+ const body = await response.json();
202
+ if (isTokenResponse(body)) return body.token;
203
+ const envelope = parseBridgeEnvelope(body);
204
+ if (envelope && !envelope.ok) {
205
+ throw new WorkspaceBridgeClientError(envelope.error.message, {
206
+ code: envelope.error.code,
207
+ status: response.status,
208
+ requestId: envelope.requestId
209
+ });
210
+ }
211
+ if (!httpOk(response)) {
212
+ throw new WorkspaceBridgeClientError(httpErrorMessage(response, body), {
213
+ code: "WORKSPACE_BRIDGE_HTTP_ERROR" /* HttpError */,
214
+ status: response.status
215
+ });
216
+ }
217
+ throw new WorkspaceBridgeClientError("WorkspaceBridge token response envelope was invalid", {
218
+ code: "WORKSPACE_BRIDGE_INVALID_RESPONSE" /* InvalidResponse */,
219
+ status: response.status
220
+ });
221
+ }
222
+ function isTokenResponse(value) {
223
+ return !!value && typeof value === "object" && value.ok === true && typeof value.token === "string";
224
+ }
225
+ function requireEnv(env, name) {
226
+ const value = env[name];
227
+ if (!value) {
228
+ throw new WorkspaceBridgeClientConfigError(`WorkspaceBridge client missing required env var ${name}`, { missingVar: name });
229
+ }
230
+ return value;
231
+ }
232
+ function normalizeBridgeUrl(value) {
233
+ try {
234
+ return new URL(value).toString();
235
+ } catch {
236
+ throw new WorkspaceBridgeClientConfigError(`WorkspaceBridge client env var ${WORKSPACE_BRIDGE_URL_ENV} is not a valid URL`);
237
+ }
238
+ }
239
+ function readProcessEnv() {
240
+ return globalThis.process?.env ?? {};
241
+ }
242
+ function assertTimeoutMs(value, name) {
243
+ if (!Number.isFinite(value) || value <= 0) {
244
+ throw new WorkspaceBridgeClientConfigError(`WorkspaceBridge client ${name} must be a positive finite number`);
245
+ }
246
+ }
247
+ function createAbortController(options) {
248
+ const controller = new AbortController();
249
+ let timedOut = false;
250
+ let callerAborted = Boolean(options.signal?.aborted);
251
+ const abortFromCaller = () => {
252
+ callerAborted = true;
253
+ controller.abort(options.signal?.reason);
254
+ };
255
+ if (options.signal?.aborted) abortFromCaller();
256
+ else options.signal?.addEventListener("abort", abortFromCaller, { once: true });
257
+ const timeout = setTimeout(() => {
258
+ timedOut = true;
259
+ controller.abort(new Error("WorkspaceBridge request timed out"));
260
+ }, options.timeoutMs);
261
+ return {
262
+ signal: controller.signal,
263
+ timedOut: () => timedOut,
264
+ callerAborted: () => callerAborted,
265
+ cleanup: () => {
266
+ clearTimeout(timeout);
267
+ options.signal?.removeEventListener("abort", abortFromCaller);
268
+ }
269
+ };
270
+ }
271
+ function fetchError(error, abort) {
272
+ if (abort.timedOut()) {
273
+ return new WorkspaceBridgeClientError("WorkspaceBridge request timed out", {
274
+ code: "WORKSPACE_BRIDGE_TIMEOUT" /* Timeout */,
275
+ cause: error
276
+ });
277
+ }
278
+ if (abort.callerAborted()) {
279
+ return new WorkspaceBridgeClientError("WorkspaceBridge request was aborted", {
280
+ code: "WORKSPACE_BRIDGE_ABORTED" /* Aborted */,
281
+ cause: error
282
+ });
283
+ }
284
+ return new WorkspaceBridgeClientError("WorkspaceBridge transport failed", {
285
+ code: "WORKSPACE_BRIDGE_TRANSPORT_ERROR" /* Transport */,
286
+ cause: error
287
+ });
288
+ }
289
+ async function runWithAbort(operation, abort) {
290
+ if (abort.signal.aborted) throw fetchError(void 0, abort);
291
+ return await new Promise((resolve, reject) => {
292
+ let settled = false;
293
+ const cleanup = () => abort.signal.removeEventListener("abort", onAbort);
294
+ const settle = (callback) => {
295
+ if (settled) return;
296
+ settled = true;
297
+ cleanup();
298
+ callback();
299
+ };
300
+ const onAbort = () => settle(() => reject(fetchError(void 0, abort)));
301
+ abort.signal.addEventListener("abort", onAbort, { once: true });
302
+ Promise.resolve().then(operation).then(
303
+ (value) => settle(() => resolve(value)),
304
+ (error) => settle(() => reject(error))
305
+ );
306
+ });
307
+ }
308
+ async function readJsonResponse(response, abort) {
309
+ try {
310
+ return await runWithAbort(() => response.json(), abort);
311
+ } catch (error) {
312
+ if (error instanceof WorkspaceBridgeClientError) throw error;
313
+ if (abort.timedOut() || abort.callerAborted()) throw fetchError(error, abort);
314
+ throw new WorkspaceBridgeClientError("WorkspaceBridge response was not valid JSON", {
315
+ code: "WORKSPACE_BRIDGE_INVALID_RESPONSE" /* InvalidResponse */,
316
+ status: response.status,
317
+ cause: error
318
+ });
319
+ }
320
+ }
321
+ function parseBridgeEnvelope(value) {
322
+ if (!value || typeof value !== "object") return null;
323
+ const raw = value;
324
+ const requestId = raw.requestId === void 0 || typeof raw.requestId === "string" ? raw.requestId : void 0;
325
+ if (raw.ok === true) {
326
+ return {
327
+ ok: true,
328
+ op: typeof raw.op === "string" ? raw.op : "",
329
+ ...requestId ? { requestId } : {},
330
+ output: raw.output
331
+ };
332
+ }
333
+ if (raw.ok === false && raw.error && typeof raw.error === "object") {
334
+ const error = raw.error;
335
+ if (typeof error.message !== "string" || !isWorkspaceBridgeErrorCode(error.code)) return null;
336
+ return {
337
+ ok: false,
338
+ op: typeof raw.op === "string" ? raw.op : "",
339
+ ...requestId ? { requestId } : {},
340
+ error: { code: error.code, message: error.message }
341
+ };
342
+ }
343
+ return null;
344
+ }
345
+ var WORKSPACE_BRIDGE_ERROR_CODES = new Set(Object.values(WorkspaceBridgeErrorCode));
346
+ function isWorkspaceBridgeErrorCode(value) {
347
+ return typeof value === "string" && WORKSPACE_BRIDGE_ERROR_CODES.has(value);
348
+ }
349
+ function httpOk(response) {
350
+ return typeof response.ok === "boolean" ? response.ok : response.status >= 200 && response.status < 300;
351
+ }
352
+ function httpErrorMessage(response, body) {
353
+ if (body && typeof body === "object" && typeof body.message === "string") {
354
+ return body.message;
355
+ }
356
+ const statusText = typeof response.statusText === "string" && response.statusText ? ` ${response.statusText}` : "";
357
+ return `WorkspaceBridge HTTP ${response.status}${statusText}`;
358
+ }
359
+ export {
360
+ WORKSPACE_BRIDGE_DISABLED_ENV,
361
+ WORKSPACE_BRIDGE_REFRESH_TOKEN_ENV,
362
+ WORKSPACE_BRIDGE_TOKEN_ENV,
363
+ WORKSPACE_BRIDGE_TOKEN_URL_ENV,
364
+ WORKSPACE_BRIDGE_URL_ENV,
365
+ WorkspaceBridgeClient,
366
+ WorkspaceBridgeClientConfigError,
367
+ WorkspaceBridgeClientError,
368
+ WorkspaceBridgeClientErrorCode,
369
+ WorkspaceBridgeErrorCode
370
+ };
package/dist/plugin.d.ts CHANGED
@@ -2,7 +2,7 @@ import { ComponentType, ReactNode } from 'react';
2
2
  import { P as PaneProps, a as PanelConfig, S as SurfaceOpenRequest, c as SurfacePanelResolution } from './surface-DmIalUmP.js';
3
3
  export { W as WORKSPACE_OPEN_PATH_SURFACE_KIND } from './surface-DmIalUmP.js';
4
4
  export { B as BoringPackageBoringField, a as BoringPackagePiField, b as BoringPackagePiSource, c as BoringPackagePiSourceObject, d as BoringPluginManifestErrorCode, e as BoringPluginManifestIssue, f as BoringPluginManifestValidationResult, g as BoringPluginPackageJson, i as isSafePluginRelativePath, h as isValidBoringPluginId, v as validateBoringPluginManifest } from './manifest-C2vVgH_e.js';
5
- import { a as UiCommand, C as CommandResult, U as UiBridge } from './ui-bridge-LeBuZqfA.js';
5
+ import { a as UiCommand, C as CommandResult, U as UiBridge } from './ui-bridge-BbuUZ5iC.js';
6
6
  import 'dockview-react';
7
7
 
8
8
  type CatalogBadge = {
@@ -54,6 +54,8 @@ interface PluginProviderProps {
54
54
  authHeaders?: Record<string, string>;
55
55
  onAuthError?: (statusCode: number) => void;
56
56
  apiTimeout?: number;
57
+ activeSessionId?: string | null;
58
+ openSessionIds?: readonly string[];
57
59
  children: ReactNode;
58
60
  }
59
61
  type PluginProvider = ComponentType<PluginProviderProps>;