@ikenga/contract 0.5.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/engine/acp.d.ts +271 -0
  2. package/dist/engine/acp.d.ts.map +1 -0
  3. package/dist/engine/acp.js +13 -0
  4. package/dist/engine/acp.js.map +1 -0
  5. package/dist/{engine.d.ts → engine/adapter.d.ts} +60 -243
  6. package/dist/engine/adapter.d.ts.map +1 -0
  7. package/dist/{engine.js → engine/adapter.js} +14 -6
  8. package/dist/engine/adapter.js.map +1 -0
  9. package/dist/engine/errors.d.ts +17 -0
  10. package/dist/engine/errors.d.ts.map +1 -0
  11. package/dist/engine/errors.js +19 -0
  12. package/dist/engine/errors.js.map +1 -0
  13. package/dist/engine/index.d.ts +14 -0
  14. package/dist/engine/index.d.ts.map +1 -0
  15. package/dist/engine/index.js +14 -0
  16. package/dist/engine/index.js.map +1 -0
  17. package/dist/engine/portability.d.ts +113 -0
  18. package/dist/engine/portability.d.ts.map +1 -0
  19. package/dist/engine/portability.js +17 -0
  20. package/dist/engine/portability.js.map +1 -0
  21. package/dist/engine/subagent-transcoder.d.ts +24 -0
  22. package/dist/engine/subagent-transcoder.d.ts.map +1 -0
  23. package/dist/engine/subagent-transcoder.js +341 -0
  24. package/dist/engine/subagent-transcoder.js.map +1 -0
  25. package/dist/index.d.ts +1 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +1 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/manifest.d.ts +147 -0
  30. package/dist/manifest.d.ts.map +1 -1
  31. package/dist/manifest.js +32 -1
  32. package/dist/manifest.js.map +1 -1
  33. package/dist/registry.d.ts +216 -0
  34. package/dist/registry.d.ts.map +1 -1
  35. package/dist/registry.js +23 -0
  36. package/dist/registry.js.map +1 -1
  37. package/dist/rpc.d.ts +1 -1
  38. package/dist/rpc.d.ts.map +1 -1
  39. package/package.json +3 -3
  40. package/src/{engine.ts → engine/acp.ts} +49 -198
  41. package/src/engine/adapter.ts +243 -0
  42. package/src/{engine.test.ts → engine/engine.test.ts} +33 -2
  43. package/src/engine/errors.ts +20 -0
  44. package/src/engine/index.ts +14 -0
  45. package/src/engine/portability.ts +123 -0
  46. package/src/engine/subagent-transcoder.test.ts +306 -0
  47. package/src/engine/subagent-transcoder.ts +333 -0
  48. package/src/index.ts +1 -1
  49. package/src/manifest.ts +35 -1
  50. package/src/registry.ts +25 -0
  51. package/src/rpc.ts +1 -1
  52. package/dist/engine.d.ts.map +0 -1
  53. package/dist/engine.js.map +0 -1
@@ -0,0 +1,333 @@
1
+ /**
2
+ * Subagent format transcoder — ADR-012 §5.
3
+ *
4
+ * Translates between the canonical Markdown + YAML-frontmatter shape used
5
+ * by Claude Code and Gemini CLI and the TOML shape used by Codex CLI.
6
+ * Zero external dependencies: hand-rolled mini-parsers for YAML
7
+ * frontmatter and the TOML keys ADR §5 lists.
8
+ *
9
+ * Supported keys (top-level):
10
+ * - Canonical (round-trips): name, description, tools, model, system_prompt
11
+ * - Codex extras (preserved when present): developer_instructions,
12
+ * sandbox_mode, mcp_servers, skills
13
+ * - Claude/Gemini extras (preserved in YAML, ignored by Codex):
14
+ * temperature, max_turns, timeout_mins
15
+ *
16
+ * Nested table support is limited to `[mcp_servers]` — that's the only
17
+ * realistic surface for subagents. Arrays of tables, inline tables, and
18
+ * comments are not parsed; the transcoder operates on files we generate
19
+ * or files following ADR §5's spec.
20
+ */
21
+
22
+ // ---------- Public API ----------
23
+
24
+ export function mdToCodexToml(md: string): string {
25
+ const { frontmatter, body } = parseFrontmatter(md);
26
+ const fm = { ...frontmatter };
27
+ // Body becomes system_prompt unless the frontmatter already has one
28
+ // (in which case body wins — same convention as Gemini/Claude tooling).
29
+ if (body.length > 0) fm.system_prompt = body;
30
+ return emitToml(fm);
31
+ }
32
+
33
+ export function codexTomlToMd(toml: string): string {
34
+ const data = parseToml(toml);
35
+ const body = typeof data.system_prompt === 'string' ? data.system_prompt : '';
36
+ const fmOnly: Record<string, unknown> = { ...data };
37
+ delete fmOnly.system_prompt;
38
+ return emitFrontmatter(fmOnly) + body;
39
+ }
40
+
41
+ export function mdToGeminiCommandToml(md: string): string {
42
+ // Gemini commands are slash commands, not subagents: the body is `prompt`
43
+ // (not `system_prompt`) and frontmatter keys live at the top level.
44
+ const { frontmatter, body } = parseFrontmatter(md);
45
+ const fm: Record<string, unknown> = { ...frontmatter };
46
+ if (body.length > 0) fm.prompt = body;
47
+ return emitToml(fm);
48
+ }
49
+
50
+ // ---------- YAML frontmatter (read) ----------
51
+
52
+ interface Frontmatter {
53
+ frontmatter: Record<string, unknown>;
54
+ body: string;
55
+ }
56
+
57
+ const FRONT_DELIM = /^---\s*$/;
58
+
59
+ function parseFrontmatter(md: string): Frontmatter {
60
+ const lines = md.split('\n');
61
+ if (lines.length === 0 || !FRONT_DELIM.test(lines[0] ?? '')) {
62
+ return { frontmatter: {}, body: md };
63
+ }
64
+ let closeIdx = -1;
65
+ for (let i = 1; i < lines.length; i++) {
66
+ if (FRONT_DELIM.test(lines[i] ?? '')) {
67
+ closeIdx = i;
68
+ break;
69
+ }
70
+ }
71
+ if (closeIdx === -1) {
72
+ throw new Error('subagent transcoder: unterminated YAML frontmatter (missing closing `---`)');
73
+ }
74
+ const yamlLines = lines.slice(1, closeIdx);
75
+ const bodyLines = lines.slice(closeIdx + 1);
76
+ // Strip exactly one leading blank line between `---` and body, if present.
77
+ if (bodyLines.length > 0 && bodyLines[0] === '') bodyLines.shift();
78
+ return {
79
+ frontmatter: parseYamlBlock(yamlLines),
80
+ body: bodyLines.join('\n'),
81
+ };
82
+ }
83
+
84
+ function parseYamlBlock(lines: string[]): Record<string, unknown> {
85
+ const out: Record<string, unknown> = {};
86
+ let i = 0;
87
+ while (i < lines.length) {
88
+ const raw = lines[i] ?? '';
89
+ if (raw.trim() === '') { i++; continue; }
90
+ if (/^\s/.test(raw)) {
91
+ throw new Error(`subagent transcoder: unexpected indented line in YAML frontmatter: ${JSON.stringify(raw)}`);
92
+ }
93
+ const colon = raw.indexOf(':');
94
+ if (colon < 0) {
95
+ throw new Error(`subagent transcoder: malformed YAML line (no \`:\`): ${JSON.stringify(raw)}`);
96
+ }
97
+ const key = raw.slice(0, colon).trim();
98
+ const rest = raw.slice(colon + 1).trim();
99
+ if (rest === '') {
100
+ // Block-style list: subsequent ` - item` lines.
101
+ const list: string[] = [];
102
+ i++;
103
+ while (i < lines.length && /^\s+-\s/.test(lines[i] ?? '')) {
104
+ const item = (lines[i] ?? '').replace(/^\s+-\s+/, '');
105
+ list.push(parseScalar(item) as string);
106
+ i++;
107
+ }
108
+ out[key] = list;
109
+ continue;
110
+ }
111
+ out[key] = parseScalar(rest);
112
+ i++;
113
+ }
114
+ return out;
115
+ }
116
+
117
+ function parseScalar(s: string): unknown {
118
+ const t = s.trim();
119
+ if (t.startsWith('[') && t.endsWith(']')) {
120
+ // Inline list: `[a, b, "c, d"]` — supports quoted items with commas.
121
+ const inner = t.slice(1, -1);
122
+ return splitInlineList(inner).map((p) => parseScalar(p));
123
+ }
124
+ if (t.startsWith('"') && t.endsWith('"') && t.length >= 2) {
125
+ // Double-quoted: honor JSON escape sequences (\n, \t, \\, \").
126
+ try {
127
+ return JSON.parse(t);
128
+ } catch {
129
+ return t.slice(1, -1);
130
+ }
131
+ }
132
+ if (t.startsWith("'") && t.endsWith("'") && t.length >= 2) {
133
+ // Single-quoted YAML strings are literal.
134
+ return t.slice(1, -1);
135
+ }
136
+ if (t === 'true') return true;
137
+ if (t === 'false') return false;
138
+ if (t === 'null' || t === '~' || t === '') return null;
139
+ if (/^-?\d+(\.\d+)?$/.test(t)) return Number(t);
140
+ return t;
141
+ }
142
+
143
+ function splitInlineList(inner: string): string[] {
144
+ const out: string[] = [];
145
+ let buf = '';
146
+ let inQuote: string | null = null;
147
+ for (const ch of inner) {
148
+ if (inQuote) {
149
+ buf += ch;
150
+ if (ch === inQuote) inQuote = null;
151
+ continue;
152
+ }
153
+ if (ch === '"' || ch === "'") { inQuote = ch; buf += ch; continue; }
154
+ if (ch === ',') { out.push(buf.trim()); buf = ''; continue; }
155
+ buf += ch;
156
+ }
157
+ if (buf.trim() !== '') out.push(buf.trim());
158
+ return out;
159
+ }
160
+
161
+ // ---------- YAML frontmatter (write) ----------
162
+
163
+ function emitFrontmatter(fm: Record<string, unknown>): string {
164
+ const keys = Object.keys(fm);
165
+ if (keys.length === 0) return '---\n---\n';
166
+ const parts: string[] = ['---'];
167
+ for (const k of keys) {
168
+ const v = fm[k];
169
+ if (Array.isArray(v)) {
170
+ // Always emit lists in inline form for stability — round-trip with
171
+ // block-style lists still works because the reader accepts both.
172
+ parts.push(`${k}: [${v.map((it) => emitYamlScalar(it)).join(', ')}]`);
173
+ } else if (v !== undefined && v !== null) {
174
+ parts.push(`${k}: ${emitYamlScalar(v)}`);
175
+ } else if (v === null) {
176
+ parts.push(`${k}: null`);
177
+ }
178
+ }
179
+ parts.push('---');
180
+ parts.push('');
181
+ return parts.join('\n');
182
+ }
183
+
184
+ function emitYamlScalar(v: unknown): string {
185
+ if (typeof v === 'number' || typeof v === 'boolean') return String(v);
186
+ if (v === null || v === undefined) return 'null';
187
+ const s = String(v);
188
+ // Quote when content has YAML-significant chars or leading/trailing space.
189
+ if (/[:#\[\]{},&*?|<>=!%@`]/.test(s) || /^\s|\s$/.test(s) || s === '') {
190
+ return JSON.stringify(s);
191
+ }
192
+ return s;
193
+ }
194
+
195
+ // ---------- TOML (write) ----------
196
+
197
+ function emitToml(data: Record<string, unknown>): string {
198
+ const lines: string[] = [];
199
+ const nested: Array<[string, Record<string, unknown>]> = [];
200
+ for (const k of Object.keys(data)) {
201
+ const v = data[k];
202
+ if (isPlainObject(v)) {
203
+ nested.push([k, v]);
204
+ continue;
205
+ }
206
+ lines.push(`${k} = ${emitTomlValue(v, k)}`);
207
+ }
208
+ for (const [name, table] of nested) {
209
+ lines.push('');
210
+ lines.push(`[${name}]`);
211
+ for (const tk of Object.keys(table)) {
212
+ lines.push(`${tk} = ${emitTomlValue((table as Record<string, unknown>)[tk], tk)}`);
213
+ }
214
+ }
215
+ return lines.join('\n') + '\n';
216
+ }
217
+
218
+ function emitTomlValue(v: unknown, key: string): string {
219
+ if (typeof v === 'string') {
220
+ // Triple-quoted for the prompt-bearing keys + anything multi-line.
221
+ if (key === 'system_prompt' || key === 'prompt' || key === 'developer_instructions' || v.includes('\n')) {
222
+ // Triple-quoted multi-line string per TOML spec: the immediately
223
+ // following newline after the opening `"""` is stripped, so we
224
+ // preserve the body byte-for-byte by placing closing `"""` directly
225
+ // after the body (no separator newline).
226
+ const escaped = v.replace(/"""/g, '"\\""\\""');
227
+ return `"""\n${escaped}"""`;
228
+ }
229
+ return JSON.stringify(v);
230
+ }
231
+ if (typeof v === 'number' || typeof v === 'boolean') return String(v);
232
+ if (v === null || v === undefined) return '""';
233
+ if (Array.isArray(v)) {
234
+ return `[${v.map((it) => emitTomlValue(it, key)).join(', ')}]`;
235
+ }
236
+ // Fallback — should not be hit because objects are routed to nested tables.
237
+ return JSON.stringify(v);
238
+ }
239
+
240
+ function isPlainObject(v: unknown): v is Record<string, unknown> {
241
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
242
+ }
243
+
244
+ // ---------- TOML (read) ----------
245
+
246
+ function parseToml(toml: string): Record<string, unknown> {
247
+ const out: Record<string, unknown> = {};
248
+ const lines = toml.split('\n');
249
+ let i = 0;
250
+ let currentTable: Record<string, unknown> = out;
251
+ while (i < lines.length) {
252
+ const raw = lines[i] ?? '';
253
+ const trimmed = raw.trim();
254
+ if (trimmed === '' || trimmed.startsWith('#')) { i++; continue; }
255
+ const tableMatch = /^\[([^\]]+)\]$/.exec(trimmed);
256
+ if (tableMatch) {
257
+ const name = (tableMatch[1] ?? '').trim();
258
+ const tbl: Record<string, unknown> = {};
259
+ out[name] = tbl;
260
+ currentTable = tbl;
261
+ i++;
262
+ continue;
263
+ }
264
+ const eq = raw.indexOf('=');
265
+ if (eq < 0) {
266
+ throw new Error(`subagent transcoder: malformed TOML line: ${JSON.stringify(raw)}`);
267
+ }
268
+ const key = raw.slice(0, eq).trim();
269
+ const restRaw = raw.slice(eq + 1);
270
+ const rest = restRaw.trim();
271
+ if (rest.startsWith('"""')) {
272
+ // Multi-line triple-quoted string. ADR §5 emits these with the
273
+ // opening `"""` on its own line; we accept both shapes.
274
+ const { value, consumed } = parseTripleQuoted(lines, i, eq);
275
+ currentTable[key] = value;
276
+ i += consumed;
277
+ continue;
278
+ }
279
+ currentTable[key] = parseTomlScalar(rest);
280
+ i++;
281
+ }
282
+ return out;
283
+ }
284
+
285
+ function parseTripleQuoted(lines: string[], startIdx: number, eqPos: number): { value: string; consumed: number } {
286
+ const first = lines[startIdx] ?? '';
287
+ // Strip the `key = """` prefix from the first line.
288
+ const afterOpen = first.slice(eqPos + 1).trim().slice(3);
289
+ let consumed = 1;
290
+ // Closing on the same line: `key = """text"""`
291
+ if (afterOpen.endsWith('"""') && afterOpen.length >= 3) {
292
+ return { value: unescapeTriple(afterOpen.slice(0, -3)), consumed };
293
+ }
294
+ // Per TOML spec, the newline immediately following the opening `"""`
295
+ // is stripped. We then collect content until the closing `"""` and
296
+ // include the body byte-for-byte (no synthetic trailing `\n`).
297
+ const buf: string[] = [];
298
+ if (afterOpen !== '') buf.push(afterOpen);
299
+ for (let j = startIdx + 1; j < lines.length; j++) {
300
+ const ln = lines[j] ?? '';
301
+ consumed++;
302
+ if (ln.endsWith('"""')) {
303
+ const trailing = ln.slice(0, -3);
304
+ // Closing on its own line — the `\n` before `"""` is part of the
305
+ // body; otherwise the trailing chunk is the body's last line.
306
+ if (trailing === '' && buf.length > 0) {
307
+ return { value: unescapeTriple(buf.join('\n') + '\n'), consumed };
308
+ }
309
+ buf.push(trailing);
310
+ return { value: unescapeTriple(buf.join('\n')), consumed };
311
+ }
312
+ buf.push(ln);
313
+ }
314
+ throw new Error('subagent transcoder: unterminated TOML triple-quoted string');
315
+ }
316
+
317
+ function unescapeTriple(s: string): string {
318
+ // Inverse of the `"""` → `"\""\""` escape applied during emit.
319
+ return s.replace(/"\\""\\""/g, '"""');
320
+ }
321
+
322
+ function parseTomlScalar(s: string): unknown {
323
+ if (s.startsWith('"') && s.endsWith('"')) {
324
+ return JSON.parse(s);
325
+ }
326
+ if (s.startsWith('[') && s.endsWith(']')) {
327
+ return splitInlineList(s.slice(1, -1)).map((p) => parseTomlScalar(p));
328
+ }
329
+ if (s === 'true') return true;
330
+ if (s === 'false') return false;
331
+ if (/^-?\d+(\.\d+)?$/.test(s)) return Number(s);
332
+ return s;
333
+ }
package/src/index.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export * from './manifest.js';
2
2
  export * from './rpc.js';
3
- export * from './engine.js';
3
+ export * from './engine/index.js';
4
4
  export * from './scopes.js';
5
5
  export * from './iyke.js';
6
6
  export * from './artifact.js';
package/src/manifest.ts CHANGED
@@ -9,7 +9,7 @@
9
9
  // On disk: `<pkg-root>/manifest.json` (JSON, not TOML).
10
10
 
11
11
  import { z } from 'zod';
12
- import { EngineProvidesSchema } from './engine.js';
12
+ import { EngineProvidesSchema } from './engine/index.js';
13
13
 
14
14
  export const IKENGA_API_VERSION = 1 as const;
15
15
  export const IKENGA_API_MIN_SUPPORTED = 1 as const;
@@ -28,6 +28,14 @@ export const McpServerSchema = z.object({
28
28
  env: z.record(z.string()).default({}),
29
29
  /** "per-call" (default) | "long-lived" */
30
30
  lifecycle: z.enum(['per-call', 'long-lived']).optional(),
31
+ /** Phase 9: glob patterns relative to pkg dir; supervisor restarts the
32
+ * long-lived child 250 ms after any matched file changes. Per-call entries
33
+ * ignore this. Empty = no watcher. */
34
+ restart_when_changed: z.array(z.string()).default([]),
35
+ /** Phase 9: auto-restart on unexpected exit. Default true (existing
36
+ * supervisor behavior). Set false for one-shot long-lived tools. Per-call
37
+ * entries ignore this. */
38
+ auto_restart: z.boolean().default(true),
31
39
  });
32
40
  export type McpServer = z.infer<typeof McpServerSchema>;
33
41
 
@@ -38,6 +46,12 @@ export const SidecarSpecSchema = z.object({
38
46
  bin: z.string(),
39
47
  /** "json" (default) | "raw" */
40
48
  stdio: z.string().default('json'),
49
+ /** Phase 9: glob patterns relative to pkg dir; supervisor restarts the
50
+ * sidecar 250 ms after any matched file changes. Empty = no watcher. */
51
+ restart_when_changed: z.array(z.string()).default([]),
52
+ /** Phase 9: auto-restart on unexpected exit. Default true (existing
53
+ * supervisor behavior). Set false for one-shot tools. */
54
+ auto_restart: z.boolean().default(true),
41
55
  });
42
56
  export type SidecarSpec = z.infer<typeof SidecarSpecSchema>;
43
57
 
@@ -133,6 +147,18 @@ export const QueriesBlockSchema = z.object({
133
147
  key_prefixes: z.array(z.string()).default([]),
134
148
  });
135
149
 
150
+ /**
151
+ * UI preview screenshot. `path` is relative to the package's install_path
152
+ * for bundled pkgs; the shell resolves it to a webview-loadable URL on
153
+ * render. Registry pkgs surface absolute https:// URLs through the
154
+ * `screenshots` array on the registry entry (see `./registry.ts`).
155
+ */
156
+ export const ScreenshotSchema = z.object({
157
+ path: z.string(),
158
+ caption: z.string().optional(),
159
+ });
160
+ export type Screenshot = z.infer<typeof ScreenshotSchema>;
161
+
136
162
  // ---------- Manifest ----------
137
163
 
138
164
  export const ManifestSchema = z.object({
@@ -171,6 +197,14 @@ export const ManifestSchema = z.object({
171
197
  * See `@ikenga/contract/engine` for the source-of-truth schema.
172
198
  */
173
199
  engine: EngineProvidesSchema.optional(),
200
+
201
+ /**
202
+ * Optional UI preview screenshots surfaced by the package manager and the
203
+ * install sheet. `path` is relative to the package's install_path; the
204
+ * shell mints a webview-loadable URL for it on render. Packages without
205
+ * UI (engines, MCP-only servers) typically leave this empty.
206
+ */
207
+ screenshots: z.array(ScreenshotSchema).default([]),
174
208
  });
175
209
 
176
210
  export type Manifest = z.infer<typeof ManifestSchema>;
package/src/registry.ts CHANGED
@@ -33,6 +33,17 @@ export const PkgDepSchema = z.object({
33
33
  });
34
34
  export type PkgDep = z.infer<typeof PkgDepSchema>;
35
35
 
36
+ /**
37
+ * Hosted preview screenshot for a registry pkg. The publish workflow uploads
38
+ * each `manifest.screenshots[].path` to a CDN and emits the absolute URL
39
+ * here, so the shell can render a preview without downloading the pkg.
40
+ */
41
+ export const HostedScreenshotSchema = z.object({
42
+ url: z.string().url(),
43
+ caption: z.string().optional(),
44
+ });
45
+ export type HostedScreenshot = z.infer<typeof HostedScreenshotSchema>;
46
+
36
47
  export const PkgVersionSchema = z.object({
37
48
  /** Semver, e.g. `0.1.0`. */
38
49
  version: z.string(),
@@ -48,6 +59,14 @@ export const PkgVersionSchema = z.object({
48
59
  manifest: ManifestSchema,
49
60
  /** Cross-pkg deps within `@ikenga/pkg-*`. External deps ride in the tarball. */
50
61
  deps: z.array(PkgDepSchema).default([]),
62
+ /**
63
+ * Absolute URLs for the screenshots declared in the manifest. The publish
64
+ * workflow uploads `manifest.screenshots[].path` files to a CDN and emits
65
+ * the resulting URL here; consumers should prefer these over the relative
66
+ * `manifest.screenshots[].path` values (which are only meaningful after
67
+ * install). Same order as `manifest.screenshots`; captions are mirrored.
68
+ */
69
+ screenshots: z.array(HostedScreenshotSchema).default([]),
51
70
  });
52
71
  export type PkgVersion = z.infer<typeof PkgVersionSchema>;
53
72
 
@@ -80,6 +99,12 @@ export const RegistryEntrySchema = z.object({
80
99
  description: z.string().optional(),
81
100
  /** Manifest `kind` hint ("engine" | "skill" | "embedded" | "windowed"). */
82
101
  kind: z.string().optional(),
102
+ /**
103
+ * Hero screenshot URL for the catalog row thumbnail. Set to the first
104
+ * uploaded screenshot of the latest version. Omitted for pkgs without UI.
105
+ * Lets the shell render a thumb without fetching the per-pkg detail file.
106
+ */
107
+ screenshot: z.string().url().optional(),
83
108
  });
84
109
  export type RegistryEntry = z.infer<typeof RegistryEntrySchema>;
85
110
 
package/src/rpc.ts CHANGED
@@ -85,7 +85,7 @@ export interface RpcMethods {
85
85
 
86
86
  // Notifications: shell → pkg
87
87
  export interface ShellToPkgNotifications {
88
- 'engine.event': { sessionId: string; event: import('./engine.js').EngineEvent };
88
+ 'engine.event': { sessionId: string; event: import('./engine/index.js').EngineEvent };
89
89
  'shell.theme_changed': { theme: 'light' | 'dark' };
90
90
  'shell.pane_focused': { focused: boolean };
91
91
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,wDAAwD;AACxD,mCAAmC;AACnC,mCAAmC;AACnC,4DAA4D;AAE5D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA+BxB,8DAA8D;AAE9D;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,kEAAkE;IAClE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;IACtB,6DAA6D;IAC7D,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,2EAA2E;IAC3E,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,mFAAmF;IACnF,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;IACtB,oDAAoD;IACpD,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE;IAC5B,oCAAoC;IACpC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;IACvB,gDAAgD;IAChD,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE;IAC1B,8CAA8C;IAC9C,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE;IAC3B,2EAA2E;IAC3E,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE;IAC1B,qEAAqE;IACrE,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE;IACzB,+DAA+D;IAC/D,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE;IAChB,wCAAwC;IACxC,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE;CAC3B,CAAC,CAAC;AAGH,2DAA2D;AAE3D;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,sFAAsF;IACtF,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAClD,4DAA4D;IAC5D,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAChD;;;OAGG;IACH,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,4CAA4C;IAC5C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAGH;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C;;;;OAIG;IACH,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,0EAA0E;IAC1E,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,gDAAgD;IAChD,YAAY,EAAE,uBAAuB;IACrC,sDAAsD;IACtD,UAAU,EAAE,sBAAsB,CAAC,OAAO,CAAC;QACzC,iBAAiB,EAAE,EAAE;QACrB,eAAe,EAAE,EAAE;KACpB,CAAC;CACH,CAAC,CAAC"}