@openchamber/sdk 2.1.1 → 2.3.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.
@@ -92,6 +92,48 @@ export declare const hostMessageSchema: z.ZodUnion<readonly [z.ZodObject<{
92
92
  }, z.core.$strip>;
93
93
  channel: z.ZodLiteral<"openchamber.sdk">;
94
94
  v: z.ZodLiteral<1>;
95
+ }, z.core.$strip>, z.ZodObject<{
96
+ type: z.ZodLiteral<"shells">;
97
+ payload: z.ZodObject<{
98
+ subscriptionId: z.ZodString;
99
+ snapshot: z.ZodObject<{
100
+ kind: z.ZodLiteral<"shells">;
101
+ scope: z.ZodDiscriminatedUnion<[z.ZodObject<{
102
+ kind: z.ZodLiteral<"session">;
103
+ sessionId: z.ZodString;
104
+ }, z.core.$strict>, z.ZodObject<{
105
+ kind: z.ZodLiteral<"project">;
106
+ projectId: z.ZodString;
107
+ }, z.core.$strict>, z.ZodObject<{
108
+ kind: z.ZodLiteral<"global">;
109
+ }, z.core.$strict>], "kind">;
110
+ shells: z.ZodArray<z.ZodObject<{
111
+ id: z.ZodString;
112
+ sessionID: z.ZodString;
113
+ command: z.ZodString;
114
+ startedAt: z.ZodNumber;
115
+ background: z.ZodBoolean;
116
+ }, z.core.$strict>>;
117
+ ended: z.ZodArray<z.ZodObject<{
118
+ id: z.ZodString;
119
+ sessionID: z.ZodString;
120
+ command: z.ZodString;
121
+ startedAt: z.ZodNumber;
122
+ background: z.ZodBoolean;
123
+ status: z.ZodEnum<{
124
+ exited: "exited";
125
+ timeout: "timeout";
126
+ killed: "killed";
127
+ stopped: "stopped";
128
+ unknown: "unknown";
129
+ }>;
130
+ exit: z.ZodOptional<z.ZodNumber>;
131
+ endedAt: z.ZodNumber;
132
+ }, z.core.$strict>>;
133
+ }, z.core.$strict>;
134
+ }, z.core.$strip>;
135
+ channel: z.ZodLiteral<"openchamber.sdk">;
136
+ v: z.ZodLiteral<1>;
95
137
  }, z.core.$strip>, z.ZodObject<{
96
138
  type: z.ZodLiteral<"ready">;
97
139
  payload: z.ZodObject<{
@@ -459,7 +501,13 @@ export declare const hostMessageSchema: z.ZodUnion<readonly [z.ZodObject<{
459
501
  data: z.ZodOptional<z.ZodJSONSchema>;
460
502
  }, z.core.$strip>>;
461
503
  }, z.core.$strip>>;
462
- }, z.core.$strip>], "kind">, z.ZodUnion<readonly [z.ZodObject<{
504
+ }, z.core.$strip>], "kind">, z.ZodObject<{
505
+ output: z.ZodString;
506
+ cursor: z.ZodNumber;
507
+ skipped: z.ZodBoolean;
508
+ }, z.core.$strip>, z.ZodObject<{
509
+ stopped: z.ZodLiteral<true>;
510
+ }, z.core.$strip>, z.ZodUnion<readonly [z.ZodObject<{
463
511
  sessionId: z.ZodString;
464
512
  sent: z.ZodEnum<{
465
513
  failed: "failed";
@@ -511,9 +559,9 @@ export declare const hostMessageSchema: z.ZodUnion<readonly [z.ZodObject<{
511
559
  }>;
512
560
  }, z.core.$strip>, z.ZodObject<{
513
561
  status: z.ZodEnum<{
562
+ stopped: "stopped";
514
563
  ready: "ready";
515
564
  failed: "failed";
516
- stopped: "stopped";
517
565
  starting: "starting";
518
566
  }>;
519
567
  }, z.core.$strip>, z.ZodObject<{
@@ -641,7 +689,7 @@ export declare const hostMessageSchema: z.ZodUnion<readonly [z.ZodObject<{
641
689
  } | {
642
690
  sent: "failed" | "sent" | "no-model" | "skipped";
643
691
  } | {
644
- status: "ready" | "failed" | "stopped" | "starting";
692
+ status: "stopped" | "ready" | "failed" | "starting";
645
693
  } | {
646
694
  content: string;
647
695
  } | {
@@ -657,6 +705,12 @@ export declare const hostMessageSchema: z.ZodUnion<readonly [z.ZodObject<{
657
705
  mtime: number;
658
706
  } | {
659
707
  text: string;
708
+ } | {
709
+ output: string;
710
+ cursor: number;
711
+ skipped: boolean;
712
+ } | {
713
+ stopped: true;
660
714
  };
661
715
  error?: undefined;
662
716
  code?: undefined;
@@ -676,7 +730,7 @@ export declare const hostMessageSchema: z.ZodUnion<readonly [z.ZodObject<{
676
730
  id: string;
677
731
  ok: false;
678
732
  error: string;
679
- code: "HOST_UNAVAILABLE" | "HOST_TIMEOUT" | "HOST_REJECTED" | "DISCONNECTED" | "DISABLED" | "BAD_PATH" | "NO_INTEGRATION" | "NO_SERVICE" | "SERVICE_FAILED" | "NO_SESSION" | "SESSION_BUSY" | "NOT_GRANTED" | "NO_DIRECTORY" | "NOT_FOUND" | "FILE_TOO_LARGE" | "DENIED" | "NO_MODEL" | "MODEL_FAILED" | "UNSUPPORTED";
733
+ code: "HOST_UNAVAILABLE" | "HOST_TIMEOUT" | "HOST_REJECTED" | "DISCONNECTED" | "DISABLED" | "BAD_PATH" | "NO_INTEGRATION" | "NO_SERVICE" | "SERVICE_FAILED" | "REQUEST_FAILED" | "RESPONSE_TOO_LARGE" | "NO_SESSION" | "SESSION_BUSY" | "NOT_GRANTED" | "NO_DIRECTORY" | "NOT_FOUND" | "FILE_TOO_LARGE" | "DENIED" | "NO_MODEL" | "MODEL_FAILED" | "UNSUPPORTED";
680
734
  payload?: undefined;
681
735
  }, {
682
736
  type: "result";
@@ -778,7 +832,7 @@ export declare const hostMessageSchema: z.ZodUnion<readonly [z.ZodObject<{
778
832
  } | {
779
833
  sent: "failed" | "sent" | "no-model" | "skipped";
780
834
  } | {
781
- status: "ready" | "failed" | "stopped" | "starting";
835
+ status: "stopped" | "ready" | "failed" | "starting";
782
836
  } | {
783
837
  content: string;
784
838
  } | {
@@ -794,6 +848,12 @@ export declare const hostMessageSchema: z.ZodUnion<readonly [z.ZodObject<{
794
848
  mtime: number;
795
849
  } | {
796
850
  text: string;
851
+ } | {
852
+ output: string;
853
+ cursor: number;
854
+ skipped: boolean;
855
+ } | {
856
+ stopped: true;
797
857
  } | undefined;
798
858
  }>>, z.ZodObject<{
799
859
  type: z.ZodLiteral<"action">;
@@ -915,6 +975,49 @@ export declare const guestMessageSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
915
975
  }, z.core.$strip>;
916
976
  channel: z.ZodLiteral<"openchamber.sdk">;
917
977
  v: z.ZodLiteral<1>;
978
+ }, z.core.$strip>, z.ZodObject<{
979
+ type: z.ZodLiteral<"shells-subscribe">;
980
+ id: z.ZodString;
981
+ payload: z.ZodObject<{
982
+ subscriptionId: z.ZodString;
983
+ scope: z.ZodDiscriminatedUnion<[z.ZodObject<{
984
+ kind: z.ZodLiteral<"session">;
985
+ sessionId: z.ZodString;
986
+ }, z.core.$strict>, z.ZodObject<{
987
+ kind: z.ZodLiteral<"project">;
988
+ projectId: z.ZodString;
989
+ }, z.core.$strict>, z.ZodObject<{
990
+ kind: z.ZodLiteral<"global">;
991
+ }, z.core.$strict>], "kind">;
992
+ }, z.core.$strict>;
993
+ channel: z.ZodLiteral<"openchamber.sdk">;
994
+ v: z.ZodLiteral<1>;
995
+ }, z.core.$strip>, z.ZodObject<{
996
+ type: z.ZodLiteral<"shells-unsubscribe">;
997
+ id: z.ZodString;
998
+ payload: z.ZodObject<{
999
+ subscriptionId: z.ZodString;
1000
+ }, z.core.$strict>;
1001
+ channel: z.ZodLiteral<"openchamber.sdk">;
1002
+ v: z.ZodLiteral<1>;
1003
+ }, z.core.$strip>, z.ZodObject<{
1004
+ type: z.ZodLiteral<"shell-output">;
1005
+ id: z.ZodString;
1006
+ payload: z.ZodObject<{
1007
+ shellId: z.ZodString;
1008
+ cursor: z.ZodOptional<z.ZodNumber>;
1009
+ tailBytes: z.ZodOptional<z.ZodNumber>;
1010
+ }, z.core.$strict>;
1011
+ channel: z.ZodLiteral<"openchamber.sdk">;
1012
+ v: z.ZodLiteral<1>;
1013
+ }, z.core.$strip>, z.ZodObject<{
1014
+ type: z.ZodLiteral<"shell-stop">;
1015
+ id: z.ZodString;
1016
+ payload: z.ZodObject<{
1017
+ shellId: z.ZodString;
1018
+ }, z.core.$strict>;
1019
+ channel: z.ZodLiteral<"openchamber.sdk">;
1020
+ v: z.ZodLiteral<1>;
918
1021
  }, z.core.$strip>, z.ZodObject<{
919
1022
  type: z.ZodLiteral<"storage">;
920
1023
  id: z.ZodString;
package/dist/protocol.js CHANGED
@@ -2,6 +2,7 @@ import { z } from 'zod';
2
2
  import { guestSessionWorktreeSchema, guestStorageRequestSchema, guestStorageResultSchema, guestWorkspaceQuerySchema, guestWorkspaceSnapshotSchema } from "./workspace-schemas.js";
3
3
  import { guestStatusControlEventSchema, guestStatusControlsSchema } from "./status-control-schemas.js";
4
4
  import { guestPopoverClosedEventSchema, guestPopoverDataSchema, guestPopoverRequestSchema } from "./popover-schemas.js";
5
+ import { GUEST_SHELL_END_STATUSES, GUEST_SHELL_ID_MAX, GUEST_SHELLS_MAX, GUEST_SHELL_OUTPUT_TAIL_MAX } from "./shells.js";
5
6
  import { OPENCHAMBER_SDK_API_VERSION, OPENCHAMBER_SDK_CHANNEL } from "./api-version.js";
6
7
  import { SERVICE_STATUS_VALUES, ATTACH_PROVIDER_ID, GUEST_ACCOUNT_MAX, GUEST_ATTACH_AUTHOR_MAX, GUEST_BADGE_MAX, GUEST_FRAME_HEIGHT_MAX, GUEST_COMMIT_SHA, GUEST_ITEM_MESSAGE_TEXT_MAX, GUEST_ITEM_SESSION_MAX, GUEST_RESOLVE_ERROR_MAX, GUEST_ATTACH_BRANCH_MAX, GUEST_ATTACH_DATA_MAX, GUEST_ATTACH_ID_MAX, GUEST_ATTACH_TEXT_MAX, GUEST_ATTACH_TITLE_MAX, GUEST_ATTACH_URL_MAX, GUEST_CLIPBOARD_TEXT_MAX, GUEST_COMPOSE_TEXT_MAX, GUEST_FILE_CONTENT_MAX, GUEST_FILE_ENTRY_KINDS, GUEST_FILE_LIST_MAX, GUEST_GENERATE_OUTPUT_TOKENS_MAX, GUEST_GENERATE_PROMPT_MAX, GUEST_GENERATE_SYSTEM_MAX, GUEST_GENERATE_TEXT_MAX, GUEST_FILE_PATH_MAX, GUEST_FILE_STAT_KINDS, GUEST_REQUEST_BODY_MAX, GUEST_REQUEST_PATH_MAX, GUEST_REQUEST_RESPONSE_MAX, GUEST_SESSION_AGENT_MAX, GUEST_SESSION_MODEL_MAX, GUEST_SETTING_VALUE_MAX, GUEST_TOAST_MAX, SESSION_LIFECYCLE_PHASES, SETTING_KEY, START_SESSION_SENT, isGuestFilePath, isGuestRequestPath, resolveHostRequestErrorCode, } from "./contract.js";
7
8
  import { GUEST_FILE_EDITOR_CONTENT_MAX, GUEST_FILE_EDITOR_VERSION_MAX } from "./file-editor.js";
@@ -98,9 +99,19 @@ const fileStatResultPayloadSchema = z.object({
98
99
  const generateResultPayloadSchema = z.object({
99
100
  text: z.string().max(GUEST_GENERATE_TEXT_MAX),
100
101
  });
102
+ const shellOutputResultPayloadSchema = z.object({
103
+ output: z.string(),
104
+ cursor: z.number(),
105
+ skipped: z.boolean(),
106
+ });
107
+ const shellStopResultPayloadSchema = z.object({
108
+ stopped: z.literal(true),
109
+ });
101
110
  const hostResultPayloadSchema = z.union([
102
111
  guestStorageResultSchema,
103
112
  guestWorkspaceSnapshotSchema,
113
+ shellOutputResultPayloadSchema,
114
+ shellStopResultPayloadSchema,
104
115
  startSessionResultPayloadSchema,
105
116
  requestResultPayloadSchema,
106
117
  promptResultPayloadSchema,
@@ -214,8 +225,36 @@ const hostResultSchema = z.object({
214
225
  code: resolveHostRequestErrorCode(message.code),
215
226
  };
216
227
  });
228
+ const guestRunningShellSchema = z.object({
229
+ id: z.string().min(1).max(GUEST_SHELL_ID_MAX),
230
+ sessionID: z.string().min(1).max(1024),
231
+ command: z.string(),
232
+ startedAt: z.number().nonnegative(),
233
+ background: z.boolean(),
234
+ }).strict();
235
+ const guestEndedShellSchema = guestRunningShellSchema.extend({
236
+ status: z.enum(GUEST_SHELL_END_STATUSES),
237
+ exit: z.number().int().optional(),
238
+ endedAt: z.number().nonnegative(),
239
+ }).strict();
240
+ const guestShellsScopeSchema = z.discriminatedUnion('kind', [
241
+ z.object({ kind: z.literal('session'), sessionId: z.string().min(1).max(1024) }).strict(),
242
+ z.object({ kind: z.literal('project'), projectId: z.string().min(1).max(1024) }).strict(),
243
+ z.object({ kind: z.literal('global') }).strict(),
244
+ ]);
245
+ const guestRunningShellsSnapshotSchema = z.object({
246
+ kind: z.literal('shells'),
247
+ scope: guestShellsScopeSchema,
248
+ shells: z.array(guestRunningShellSchema).max(GUEST_SHELLS_MAX),
249
+ ended: z.array(guestEndedShellSchema).max(GUEST_SHELLS_MAX),
250
+ }).strict();
217
251
  export const hostMessageSchema = z.union([
218
252
  z.object({ ...envelope, type: z.literal('workspace'), payload: z.object({ subscriptionId: z.string().min(1).max(128), snapshot: guestWorkspaceSnapshotSchema }) }),
253
+ z.object({
254
+ ...envelope,
255
+ type: z.literal('shells'),
256
+ payload: z.object({ subscriptionId: z.string().min(1).max(128), snapshot: guestRunningShellsSnapshotSchema }),
257
+ }),
219
258
  z.object({
220
259
  ...envelope,
221
260
  type: z.literal('ready'),
@@ -332,6 +371,10 @@ export const guestMessageSchema = z.discriminatedUnion('type', [
332
371
  z.object({ ...envelope, type: z.literal('workspace-read'), id: z.string().min(1), payload: guestWorkspaceQuerySchema }),
333
372
  z.object({ ...envelope, type: z.literal('workspace-subscribe'), id: z.string().min(1), payload: z.object({ subscriptionId: z.string().min(1).max(128), query: guestWorkspaceQuerySchema }) }),
334
373
  z.object({ ...envelope, type: z.literal('workspace-unsubscribe'), id: z.string().min(1), payload: z.object({ subscriptionId: z.string().min(1).max(128) }) }),
374
+ z.object({ ...envelope, type: z.literal('shells-subscribe'), id: z.string().min(1), payload: z.object({ subscriptionId: z.string().min(1).max(128), scope: guestShellsScopeSchema }).strict() }),
375
+ z.object({ ...envelope, type: z.literal('shells-unsubscribe'), id: z.string().min(1), payload: z.object({ subscriptionId: z.string().min(1).max(128) }).strict() }),
376
+ z.object({ ...envelope, type: z.literal('shell-output'), id: z.string().min(1), payload: z.object({ shellId: z.string().min(1).max(GUEST_SHELL_ID_MAX), cursor: z.number().int().nonnegative().optional(), tailBytes: z.number().int().positive().max(GUEST_SHELL_OUTPUT_TAIL_MAX).optional() }).strict() }),
377
+ z.object({ ...envelope, type: z.literal('shell-stop'), id: z.string().min(1), payload: z.object({ shellId: z.string().min(1).max(GUEST_SHELL_ID_MAX) }).strict() }),
335
378
  z.object({ ...envelope, type: z.literal('storage'), id: z.string().min(1), payload: guestStorageRequestSchema }),
336
379
  z.object({
337
380
  ...envelope,
@@ -1,4 +1,4 @@
1
- export declare const GUEST_SCROLLBAR_CSS = "\n:root {\n --oc-scrollbar-thumb: color-mix(in srgb, var(--oc-muted, currentColor) 40%, transparent);\n --oc-scrollbar-thumb-hover: color-mix(in srgb, var(--oc-muted, currentColor) 65%, transparent);\n scrollbar-gutter: stable;\n}\n* {\n scrollbar-width: thin;\n scrollbar-color: transparent transparent;\n}\n:hover, [data-oc-scrolling] {\n scrollbar-color: var(--oc-scrollbar-thumb) transparent;\n}\n/* Chromium's standard scrollbar properties otherwise override its pseudo-elements. */\n@supports selector(::-webkit-scrollbar) {\n *, :hover, [data-oc-scrolling] { scrollbar-width: auto; scrollbar-color: auto; }\n ::-webkit-scrollbar { width: 6px; height: 6px; background: transparent; }\n ::-webkit-scrollbar-track { background: transparent; }\n ::-webkit-scrollbar-thumb {\n background: transparent;\n border-radius: 999px;\n min-width: 24px;\n min-height: 24px;\n }\n :hover::-webkit-scrollbar-thumb, [data-oc-scrolling]::-webkit-scrollbar-thumb { background: var(--oc-scrollbar-thumb); }\n ::-webkit-scrollbar-thumb:hover { background: var(--oc-scrollbar-thumb-hover); }\n ::-webkit-scrollbar-corner { background: transparent; }\n ::-webkit-scrollbar-button { display: none; width: 0; height: 0; }\n}\n@media (forced-colors: active) {\n *, :hover, [data-oc-scrolling] { scrollbar-color: auto; }\n ::-webkit-scrollbar-thumb, ::-webkit-scrollbar-thumb:hover { background: CanvasText; }\n}\n";
1
+ export declare const GUEST_SCROLLBAR_CSS = "\n:root {\n /* Quiet at rest like the app's own thumbs; hover gives a clear grab target. */\n --oc-scrollbar-thumb: color-mix(in srgb, var(--oc-muted, currentColor) 18%, transparent);\n --oc-scrollbar-thumb-hover: color-mix(in srgb, var(--oc-muted, currentColor) 36%, transparent);\n scrollbar-gutter: stable;\n}\n* {\n scrollbar-width: thin;\n scrollbar-color: transparent transparent;\n}\n:hover, [data-oc-scrolling] {\n scrollbar-color: var(--oc-scrollbar-thumb) transparent;\n}\n/* Chromium's standard scrollbar properties otherwise override its pseudo-elements. */\n@supports selector(::-webkit-scrollbar) {\n *, :hover, [data-oc-scrolling] { scrollbar-width: auto; scrollbar-color: auto; }\n ::-webkit-scrollbar { width: 6px; height: 6px; background: transparent; }\n ::-webkit-scrollbar-track { background: transparent; }\n ::-webkit-scrollbar-thumb {\n background: transparent;\n border-radius: 999px;\n min-width: 24px;\n min-height: 24px;\n }\n :hover::-webkit-scrollbar-thumb, [data-oc-scrolling]::-webkit-scrollbar-thumb { background: var(--oc-scrollbar-thumb); }\n ::-webkit-scrollbar-thumb:hover { background: var(--oc-scrollbar-thumb-hover); }\n ::-webkit-scrollbar-corner { background: transparent; }\n ::-webkit-scrollbar-button { display: none; width: 0; height: 0; }\n}\n@media (forced-colors: active) {\n *, :hover, [data-oc-scrolling] { scrollbar-color: auto; }\n ::-webkit-scrollbar-thumb, ::-webkit-scrollbar-thumb:hover { background: CanvasText; }\n}\n";
2
2
  /**
3
3
  * Marks whichever element scrolls (the root for document scrolling) with
4
4
  * `GUEST_SCROLLING_ATTRIBUTE` and clears it once scrolling has been quiet for
@@ -14,8 +14,9 @@
14
14
  const GUEST_SCROLLING_ATTRIBUTE = 'data-oc-scrolling';
15
15
  export const GUEST_SCROLLBAR_CSS = `
16
16
  :root {
17
- --oc-scrollbar-thumb: color-mix(in srgb, var(--oc-muted, currentColor) 40%, transparent);
18
- --oc-scrollbar-thumb-hover: color-mix(in srgb, var(--oc-muted, currentColor) 65%, transparent);
17
+ /* Quiet at rest like the app's own thumbs; hover gives a clear grab target. */
18
+ --oc-scrollbar-thumb: color-mix(in srgb, var(--oc-muted, currentColor) 18%, transparent);
19
+ --oc-scrollbar-thumb-hover: color-mix(in srgb, var(--oc-muted, currentColor) 36%, transparent);
19
20
  scrollbar-gutter: stable;
20
21
  }
21
22
  * {
@@ -0,0 +1,69 @@
1
+ export declare const GUEST_SHELL_ID_MAX = 128;
2
+ export declare const GUEST_SHELLS_MAX = 200;
3
+ export declare const GUEST_SHELL_OUTPUT_TAIL_MAX = 65536;
4
+ /** A shell command still running on behalf of a session. */
5
+ export type GuestRunningShell = {
6
+ id: string;
7
+ sessionID: string;
8
+ command: string;
9
+ startedAt: number;
10
+ /** True for a job the turn does not wait for; false while the turn that ran it is blocked on it. */
11
+ background: boolean;
12
+ };
13
+ export declare const GUEST_SHELL_END_STATUSES: readonly ["exited", "timeout", "killed", "stopped", "unknown"];
14
+ /**
15
+ * How a shell command ended: `exited` on its own (see `exit`), `timeout`,
16
+ * `killed` by a signal, `stopped` by a user (Stop, or aborting the turn that
17
+ * waited on it), or `unknown` when
18
+ * OpenChamber missed the end (a reconnect) and only saw the command gone.
19
+ */
20
+ export type GuestShellEndStatus = (typeof GUEST_SHELL_END_STATUSES)[number];
21
+ /** A shell command OpenChamber saw running that has since ended. */
22
+ export type GuestEndedShell = GuestRunningShell & {
23
+ status: GuestShellEndStatus;
24
+ /** Exit code, when the command exited and OpenCode reported one. */
25
+ exit?: number;
26
+ endedAt: number;
27
+ };
28
+ /**
29
+ * Which running shells a subscription covers: one session and its subagents,
30
+ * every session of a registered project, or every session the app sees.
31
+ */
32
+ export type GuestShellsScope = {
33
+ kind: 'session';
34
+ sessionId: string;
35
+ } | {
36
+ kind: 'project';
37
+ projectId: string;
38
+ } | {
39
+ kind: 'global';
40
+ };
41
+ export type GuestRunningShellsSnapshot = {
42
+ kind: 'shells';
43
+ /** Echo of the scope the subscription asked for. */
44
+ scope: GuestShellsScope;
45
+ shells: GuestRunningShell[];
46
+ /**
47
+ * Commands in scope that ended since OpenChamber started watching, oldest
48
+ * end first. Kept in memory only: empty after an app reload or runtime
49
+ * switch, and capped at `GUEST_SHELLS_MAX`, newest kept.
50
+ */
51
+ ended: GuestEndedShell[];
52
+ };
53
+ export type GuestShellsSubscription = {
54
+ subscriptionId: string;
55
+ scope: GuestShellsScope;
56
+ };
57
+ export type GuestShellOutputRequest = {
58
+ shellId: string;
59
+ cursor?: number;
60
+ tailBytes?: number;
61
+ };
62
+ export type GuestShellOutputResult = {
63
+ output: string;
64
+ cursor: number;
65
+ skipped: boolean;
66
+ };
67
+ export type GuestShellStopResult = {
68
+ stopped: true;
69
+ };
package/dist/shells.js ADDED
@@ -0,0 +1,4 @@
1
+ export const GUEST_SHELL_ID_MAX = 128;
2
+ export const GUEST_SHELLS_MAX = 200;
3
+ export const GUEST_SHELL_OUTPUT_TAIL_MAX = 65536;
4
+ export const GUEST_SHELL_END_STATUSES = ['exited', 'timeout', 'killed', 'stopped', 'unknown'];
@@ -1,5 +1,6 @@
1
1
  export { applyHostReady, applyHostTheme } from './theme.ts';
2
2
  export type { ThemeRoot } from './theme.ts';
3
+ export { GUEST_UI_LOOK_CSS } from './style.ts';
3
4
  export type { Handle } from './dom.ts';
4
5
  export { mountButton } from './button.ts';
5
6
  export type { ButtonHandle, ButtonProps, ButtonSize, ButtonVariant } from './button.ts';
package/dist/ui/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { applyHostReady, applyHostTheme } from "./theme.js";
2
+ export { GUEST_UI_LOOK_CSS } from "./style.js";
2
3
  export { mountButton } from "./button.js";
3
4
  export { mountTextField } from "./field.js";
4
5
  export { mountSearchField } from "./search.js";
package/dist/ui/option.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { button, el, setAttr } from "./dom.js";
2
+ import { icon } from "./icons.js";
2
3
  const optionId = (uid, id) => `${uid}-${id ?? ''}`;
3
4
  export const createOption = (uid, role, spec, on) => {
4
5
  const node = button('oc-sdk-option');
@@ -18,6 +19,13 @@ export const createOption = (uid, role, spec, on) => {
18
19
  hint.textContent = spec.hint;
19
20
  node.append(hint);
20
21
  }
22
+ if (role === 'option') {
23
+ // The host's styles drop the selection fill only for options that carry the mark.
24
+ node.dataset.mark = 'check';
25
+ const check = el('span', 'oc-sdk-option-check');
26
+ check.append(icon('check', 14));
27
+ node.append(check);
28
+ }
21
29
  node.addEventListener('pointerenter', on.hover);
22
30
  node.addEventListener('click', on.pick);
23
31
  return node;
@@ -1 +1,10 @@
1
+ /**
2
+ * Appearance: colours, fonts, borders, corner radii, shadows, and the hover,
3
+ * pressed, selected and focus states. The kit carries it for previews outside
4
+ * the host, and the server appends the running app's copy to every served
5
+ * extension document, after the kit's own style element, so installed bundles
6
+ * follow the app's look without a rebuild. Selectors here keep the specificity
7
+ * of the rules they override in older bundles.
8
+ */
9
+ export declare const GUEST_UI_LOOK_CSS: string;
1
10
  export declare const UI_CSS: string;