@almadar/workspace 0.1.0 → 0.1.2

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.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import path from 'path';
1
+ import path2 from 'path';
2
2
  import fs from 'fs';
3
3
  import { execFile } from 'child_process';
4
4
 
@@ -11,9 +11,11 @@ var LocalBackend = class {
11
11
  return fs.readFileSync(absPath, "utf-8");
12
12
  }
13
13
  async writeFile(absPath, content) {
14
+ await fs.promises.mkdir(path2.dirname(absPath), { recursive: true });
14
15
  await fs.promises.writeFile(absPath, content, "utf-8");
15
16
  }
16
17
  writeFileSync(absPath, content) {
18
+ fs.mkdirSync(path2.dirname(absPath), { recursive: true });
17
19
  fs.writeFileSync(absPath, content, "utf-8");
18
20
  }
19
21
  exists(absPath) {
@@ -38,6 +40,10 @@ var LocalBackend = class {
38
40
  const s = await fs.promises.stat(absPath);
39
41
  return { size: s.size, mtimeMs: s.mtimeMs, isDirectory: s.isDirectory() };
40
42
  }
43
+ async rename(srcAbs, dstAbs) {
44
+ await fs.promises.mkdir(path2.dirname(dstAbs), { recursive: true });
45
+ await fs.promises.rename(srcAbs, dstAbs);
46
+ }
41
47
  };
42
48
 
43
49
  // src/internal/backends/memory.ts
@@ -104,6 +110,38 @@ var MemoryBackend = class {
104
110
  }
105
111
  throw new Error(`ENOENT: ${absPath}`);
106
112
  }
113
+ async rename(srcAbs, dstAbs) {
114
+ const fileContent = this.files.get(srcAbs);
115
+ if (fileContent !== void 0) {
116
+ this.files.delete(srcAbs);
117
+ this.files.set(dstAbs, fileContent);
118
+ return;
119
+ }
120
+ const srcPrefix = srcAbs.endsWith("/") ? srcAbs : srcAbs + "/";
121
+ const dstPrefix = dstAbs.endsWith("/") ? dstAbs : dstAbs + "/";
122
+ const migrations = [];
123
+ for (const key of this.files.keys()) {
124
+ if (key.startsWith(srcPrefix)) {
125
+ migrations.push([key, dstPrefix + key.slice(srcPrefix.length)]);
126
+ }
127
+ }
128
+ for (const [oldKey, newKey] of migrations) {
129
+ const content = this.files.get(oldKey);
130
+ if (content !== void 0) {
131
+ this.files.delete(oldKey);
132
+ this.files.set(newKey, content);
133
+ }
134
+ }
135
+ const dirsToMigrate = [];
136
+ for (const dir of this.dirs) {
137
+ if (dir === srcAbs || dir.startsWith(srcPrefix)) dirsToMigrate.push(dir);
138
+ }
139
+ for (const oldDir of dirsToMigrate) {
140
+ this.dirs.delete(oldDir);
141
+ const newDir = oldDir === srcAbs ? dstAbs : dstPrefix + oldDir.slice(srcPrefix.length);
142
+ this.dirs.add(newDir);
143
+ }
144
+ }
107
145
  // Test helpers
108
146
  getAll() {
109
147
  return new Map(this.files);
@@ -161,51 +199,51 @@ var WORKSPACE_LAYOUT = {
161
199
  PROJECT_MEMORY: ".almadar/project.orb"
162
200
  };
163
201
  function orbitalFile(workDir, name) {
164
- return path.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR, `${name}.orb`);
202
+ return path2.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR, `${name}.orb`);
165
203
  }
166
204
  function archivedOrbitalFile(workDir, name) {
167
- return path.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR, ".archived", `${name}.orb`);
205
+ return path2.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR, ".archived", `${name}.orb`);
168
206
  }
169
207
  function schemaFile(workDir) {
170
- return path.join(workDir, WORKSPACE_LAYOUT.SCHEMA_FILE);
208
+ return path2.join(workDir, WORKSPACE_LAYOUT.SCHEMA_FILE);
171
209
  }
172
210
  function coordinatorDir(workDir) {
173
- return path.join(workDir, WORKSPACE_LAYOUT.COORDINATOR_DIR);
211
+ return path2.join(workDir, WORKSPACE_LAYOUT.COORDINATOR_DIR);
174
212
  }
175
213
  function coordinatorFile(workDir, basename) {
176
- return path.join(coordinatorDir(workDir), basename);
214
+ return path2.join(coordinatorDir(workDir), basename);
177
215
  }
178
216
  function orbitalSessionDir(workDir, orbital) {
179
- return path.join(workDir, WORKSPACE_LAYOUT.SESSIONS_DIR, orbital);
217
+ return path2.join(workDir, WORKSPACE_LAYOUT.SESSIONS_DIR, orbital);
180
218
  }
181
219
  function orbitalSessionFile(workDir, orbital, basename) {
182
- return path.join(orbitalSessionDir(workDir, orbital), basename);
220
+ return path2.join(orbitalSessionDir(workDir, orbital), basename);
183
221
  }
184
222
  function traceFile(workDir) {
185
- return path.join(workDir, WORKSPACE_LAYOUT.TRACE_FILE);
223
+ return path2.join(workDir, WORKSPACE_LAYOUT.TRACE_FILE);
186
224
  }
187
225
  function compiledDir(workDir) {
188
- return path.join(workDir, WORKSPACE_LAYOUT.COMPILED_DIR);
226
+ return path2.join(workDir, WORKSPACE_LAYOUT.COMPILED_DIR);
189
227
  }
190
228
  function compiledFile(workDir, relPath) {
191
- return path.join(compiledDir(workDir), relPath);
229
+ return path2.join(compiledDir(workDir), relPath);
192
230
  }
193
231
  function appMarkerFile(workDir) {
194
- return path.join(workDir, WORKSPACE_LAYOUT.APP_MARKER);
232
+ return path2.join(workDir, WORKSPACE_LAYOUT.APP_MARKER);
195
233
  }
196
234
  function sandboxedPath(workDir, relPath) {
197
235
  if (typeof relPath !== "string" || relPath.length === 0) {
198
236
  throw new Error("sandbox: empty relative path");
199
237
  }
200
- if (path.isAbsolute(relPath)) {
238
+ if (path2.isAbsolute(relPath)) {
201
239
  throw new Error(`sandbox: absolute paths are not allowed (${relPath})`);
202
240
  }
203
241
  if (/^[a-zA-Z]:[\\/]/.test(relPath)) {
204
242
  throw new Error(`sandbox: drive-letter paths are not allowed (${relPath})`);
205
243
  }
206
- const rootAbs = path.resolve(workDir);
207
- const target = path.resolve(rootAbs, relPath);
208
- if (target !== rootAbs && !target.startsWith(rootAbs + path.sep)) {
244
+ const rootAbs = path2.resolve(workDir);
245
+ const target = path2.resolve(rootAbs, relPath);
246
+ if (target !== rootAbs && !target.startsWith(rootAbs + path2.sep)) {
209
247
  throw new Error(`sandbox: path escapes workspace (${relPath})`);
210
248
  }
211
249
  return target;
@@ -288,7 +326,7 @@ var GitClient = class {
288
326
  }
289
327
  /** Is the working dir already a git repo? */
290
328
  async isRepo() {
291
- return this.backend.exists(path.join(this.cwd, ".git"));
329
+ return this.backend.exists(path2.join(this.cwd, ".git"));
292
330
  }
293
331
  async init() {
294
332
  if (await this.isRepo()) return;
@@ -383,9 +421,9 @@ function execGit(args, cwd) {
383
421
  // src/internal/workspace-manager.ts
384
422
  async function ensureSkeleton(backend, workDir) {
385
423
  await backend.mkdir(workDir, { recursive: true });
386
- await backend.mkdir(path.join(workDir, WORKSPACE_LAYOUT.ALMADAR_DIR), { recursive: true });
387
- await backend.mkdir(path.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR), { recursive: true });
388
- await backend.mkdir(path.join(workDir, WORKSPACE_LAYOUT.SESSIONS_DIR), { recursive: true });
424
+ await backend.mkdir(path2.join(workDir, WORKSPACE_LAYOUT.ALMADAR_DIR), { recursive: true });
425
+ await backend.mkdir(path2.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR), { recursive: true });
426
+ await backend.mkdir(path2.join(workDir, WORKSPACE_LAYOUT.SESSIONS_DIR), { recursive: true });
389
427
  await backend.mkdir(coordinatorDir(workDir), { recursive: true });
390
428
  }
391
429
  async function ensureOrbitalSessionDir(backend, workDir, orbital) {
@@ -396,11 +434,11 @@ async function writeMintTemplatesIfMissing(backend, workDir, userId, projectName
396
434
  if (!backend.exists(schemaPath)) {
397
435
  await backend.writeFile(schemaPath, serializeJson(createSchemaOrbTemplate(projectName)));
398
436
  }
399
- const userPath = path.join(workDir, WORKSPACE_LAYOUT.USER_MEMORY);
437
+ const userPath = path2.join(workDir, WORKSPACE_LAYOUT.USER_MEMORY);
400
438
  if (!backend.exists(userPath)) {
401
439
  await backend.writeFile(userPath, serializeJson(createUserOrbTemplate(userId)));
402
440
  }
403
- const projectPath = path.join(workDir, WORKSPACE_LAYOUT.PROJECT_MEMORY);
441
+ const projectPath = path2.join(workDir, WORKSPACE_LAYOUT.PROJECT_MEMORY);
404
442
  if (!backend.exists(projectPath)) {
405
443
  await backend.writeFile(
406
444
  projectPath,
@@ -435,11 +473,11 @@ function readAppMarker(backend, workDir) {
435
473
  }
436
474
  async function writeAppMarker(backend, workDir, marker) {
437
475
  const markerPath = appMarkerFile(workDir);
438
- await backend.mkdir(path.dirname(markerPath), { recursive: true });
476
+ await backend.mkdir(path2.dirname(markerPath), { recursive: true });
439
477
  await backend.writeFile(markerPath, JSON.stringify(marker, null, 2));
440
478
  }
441
479
  async function findLocalWorkspaceDir(backend, workspacesRoot, userId, appId) {
442
- const userDir = path.join(workspacesRoot, userId);
480
+ const userDir = path2.join(workspacesRoot, userId);
443
481
  if (!backend.exists(userDir)) return null;
444
482
  let entries;
445
483
  try {
@@ -448,7 +486,7 @@ async function findLocalWorkspaceDir(backend, workspacesRoot, userId, appId) {
448
486
  return null;
449
487
  }
450
488
  for (const entry of entries) {
451
- const sessionDir = path.join(userDir, entry);
489
+ const sessionDir = path2.join(userDir, entry);
452
490
  let isDir = false;
453
491
  try {
454
492
  const s = await backend.stat(sessionDir);
@@ -465,23 +503,23 @@ async function findLocalWorkspaceDir(backend, workspacesRoot, userId, appId) {
465
503
  function mintSessionDir(workspacesRoot, userId) {
466
504
  const ts = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
467
505
  const suffix = Date.now().toString(36);
468
- return path.join(workspacesRoot, userId, `${ts}_${suffix}`);
506
+ return path2.join(workspacesRoot, userId, `${ts}_${suffix}`);
469
507
  }
470
508
  async function restoreWorkspace(backend, rootDir, restore) {
471
- const rootAbs = path.resolve(rootDir);
509
+ const rootAbs = path2.resolve(rootDir);
472
510
  await backend.mkdir(rootAbs, { recursive: true });
473
511
  const paths = await restore.listFiles();
474
512
  let filesRestored = 0;
475
513
  let bytesWritten = 0;
476
514
  for (const relativePath of paths) {
477
515
  const normalised = relativePath.replace(/\\/g, "/");
478
- const target = path.resolve(rootAbs, normalised);
479
- if (target !== rootAbs && !target.startsWith(rootAbs + path.sep)) {
516
+ const target = path2.resolve(rootAbs, normalised);
517
+ if (target !== rootAbs && !target.startsWith(rootAbs + path2.sep)) {
480
518
  continue;
481
519
  }
482
520
  const content = await restore.readFile(normalised);
483
521
  if (content === null) continue;
484
- await backend.mkdir(path.dirname(target), { recursive: true });
522
+ await backend.mkdir(path2.dirname(target), { recursive: true });
485
523
  await backend.writeFile(target, content);
486
524
  filesRestored++;
487
525
  bytesWritten += Buffer.byteLength(content, "utf-8");
@@ -546,7 +584,7 @@ var WorkspaceServiceImpl = class {
546
584
  }
547
585
  /** Make sure the parent directory of `absPath` exists. */
548
586
  async ensureParent(absPath) {
549
- await this.backend.mkdir(path.dirname(absPath), { recursive: true });
587
+ await this.backend.mkdir(path2.dirname(absPath), { recursive: true });
550
588
  }
551
589
  async emit(event) {
552
590
  await this.sinks.notifyAll(event);
@@ -572,7 +610,7 @@ var WorkspaceServiceImpl = class {
572
610
  await this.emit({ kind: "orbital", name, content });
573
611
  }
574
612
  listOrbitals() {
575
- const dir = path.join(this.workDir, WORKSPACE_LAYOUT.ORBITALS_DIR);
613
+ const dir = path2.join(this.workDir, WORKSPACE_LAYOUT.ORBITALS_DIR);
576
614
  if (!this.backend.exists(dir)) return [];
577
615
  try {
578
616
  return this.backend.readdirSync(dir).filter((f) => f.endsWith(".orb")).map((f) => f.replace(/\.orb$/, "")).sort();
@@ -607,6 +645,18 @@ var WorkspaceServiceImpl = class {
607
645
  });
608
646
  await this.emit({ kind: "orbital-renamed", from, to });
609
647
  }
648
+ async renameOrbitalSession(from, to) {
649
+ assertOrbitalName(from);
650
+ assertOrbitalName(to);
651
+ const src = orbitalSessionDir(this.workDir, from);
652
+ const dst = orbitalSessionDir(this.workDir, to);
653
+ if (!this.backend.exists(src)) return;
654
+ if (this.backend.exists(dst)) return;
655
+ await this.withLock(src, async () => {
656
+ await this.backend.rename(src, dst);
657
+ });
658
+ await this.emit({ kind: "session-renamed", from, to });
659
+ }
610
660
  // === Schema artifact ===
611
661
  readSchema() {
612
662
  const p = schemaFile(this.workDir);
@@ -791,7 +841,7 @@ var WorkspaceServiceImpl = class {
791
841
  }
792
842
  // === Compiled output ===
793
843
  async writeCompiled(relPath, content) {
794
- if (relPath.includes("..") || path.isAbsolute(relPath)) {
844
+ if (relPath.includes("..") || path2.isAbsolute(relPath)) {
795
845
  throw new Error(`compiled: invalid relPath (${relPath})`);
796
846
  }
797
847
  const p = compiledFile(this.workDir, relPath);
@@ -802,7 +852,7 @@ var WorkspaceServiceImpl = class {
802
852
  await this.emit({ kind: "compiled", relPath, content });
803
853
  }
804
854
  readCompiled(relPath) {
805
- if (relPath.includes("..") || path.isAbsolute(relPath)) return null;
855
+ if (relPath.includes("..") || path2.isAbsolute(relPath)) return null;
806
856
  const p = compiledFile(this.workDir, relPath);
807
857
  if (!this.backend.exists(p)) return null;
808
858
  try {
@@ -927,9 +977,9 @@ function readJsonLinesSync(backend, absPath) {
927
977
  async function walk(backend, dir, root, out) {
928
978
  const entries = await backend.readdir(dir);
929
979
  for (const name of entries) {
930
- const full = path.join(dir, name);
980
+ const full = path2.join(dir, name);
931
981
  const s = await backend.stat(full);
932
- const rel = path.relative(root, full).split(path.sep).join("/");
982
+ const rel = path2.relative(root, full).split(path2.sep).join("/");
933
983
  if (s.isDirectory) {
934
984
  out.push({ path: rel, type: "directory", size: 0 });
935
985
  await walk(backend, full, root, out);
@@ -941,7 +991,7 @@ async function walk(backend, dir, root, out) {
941
991
  async function removeTree(backend, dir) {
942
992
  const entries = await backend.readdir(dir);
943
993
  for (const name of entries) {
944
- const full = path.join(dir, name);
994
+ const full = path2.join(dir, name);
945
995
  let isDir = false;
946
996
  try {
947
997
  isDir = (await backend.stat(full)).isDirectory;
@@ -999,7 +1049,7 @@ async function openWorkspace(opts) {
999
1049
  }
1000
1050
  async function resolveLifecycle(backend, opts) {
1001
1051
  if (opts.adopt) {
1002
- const workDir2 = path.resolve(opts.adopt);
1052
+ const workDir2 = path2.resolve(opts.adopt);
1003
1053
  const marker = readAppMarker(backend, workDir2);
1004
1054
  return { workDir: workDir2, appId: marker?.appId ?? opts.appId };
1005
1055
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/internal/backends/local.ts","../src/internal/backends/memory.ts","../src/internal/sink-manager.ts","../src/internal/path-layout.ts","../src/internal/templates.ts","../src/internal/git-client.ts","../src/internal/workspace-manager.ts","../src/internal/workspace-resolver.ts","../src/internal/restore.ts","../src/internal/memory-files.ts","../src/service.ts","../src/open-workspace.ts"],"names":["path","workDir"],"mappings":";;;;;AAMO,IAAM,eAAN,MAA+C;AAAA,EACpD,MAAM,SAAS,OAAA,EAAkC;AAC/C,IAAA,OAAO,EAAA,CAAG,QAAA,CAAS,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAAA,EAC9C;AAAA,EACA,aAAa,OAAA,EAAyB;AACpC,IAAA,OAAO,EAAA,CAAG,YAAA,CAAa,OAAA,EAAS,OAAO,CAAA;AAAA,EACzC;AAAA,EACA,MAAM,SAAA,CAAU,OAAA,EAAiB,OAAA,EAAgC;AAC/D,IAAA,MAAM,EAAA,CAAG,QAAA,CAAS,SAAA,CAAU,OAAA,EAAS,SAAS,OAAO,CAAA;AAAA,EACvD;AAAA,EACA,aAAA,CAAc,SAAiB,OAAA,EAAuB;AACpD,IAAA,EAAA,CAAG,aAAA,CAAc,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C;AAAA,EACA,OAAO,OAAA,EAA0B;AAC/B,IAAA,OAAO,EAAA,CAAG,WAAW,OAAO,CAAA;AAAA,EAC9B;AAAA,EACA,MAAM,QAAQ,OAAA,EAAoC;AAChD,IAAA,OAAO,EAAA,CAAG,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA;AAAA,EACpC;AAAA,EACA,YAAY,OAAA,EAA2B;AACrC,IAAA,OAAO,EAAA,CAAG,YAAY,OAAO,CAAA;AAAA,EAC/B;AAAA,EACA,MAAM,KAAA,CAAM,OAAA,EAAiB,IAAA,EAA+C;AAC1E,IAAA,MAAM,EAAA,CAAG,QAAA,CAAS,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAAA,EACvC;AAAA,EACA,SAAA,CAAU,SAAiB,IAAA,EAAsC;AAC/D,IAAA,EAAA,CAAG,SAAA,CAAU,SAAS,IAAI,CAAA;AAAA,EAC5B;AAAA,EACA,MAAM,OAAO,OAAA,EAAgC;AAC3C,IAAA,MAAM,EAAA,CAAG,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA;AAAA,EAClC;AAAA,EACA,MAAM,KACJ,OAAA,EACkE;AAClE,IAAA,MAAM,CAAA,GAAI,MAAM,EAAA,CAAG,QAAA,CAAS,KAAK,OAAO,CAAA;AACxC,IAAA,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,OAAA,EAAS,EAAE,OAAA,EAAS,WAAA,EAAa,CAAA,CAAE,WAAA,EAAY,EAAE;AAAA,EAC1E;AACF,CAAA;;;ACtCO,IAAM,gBAAN,MAAgD;AAAA,EAAhD,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,KAAA,uBAAY,GAAA,EAAoB;AACxC,IAAA,IAAA,CAAQ,IAAA,uBAAW,GAAA,EAAY;AAAA,EAAA;AAAA,EAE/B,MAAM,SAAS,OAAA,EAAkC;AAC/C,IAAA,OAAO,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,EAClC;AAAA,EACA,aAAa,OAAA,EAAyB;AACpC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA;AACtC,IAAA,IAAI,YAAY,MAAA,EAAW,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,OAAO,CAAA,CAAE,CAAA;AAC/D,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EACA,MAAM,SAAA,CAAU,OAAA,EAAiB,OAAA,EAAgC;AAC/D,IAAA,IAAA,CAAK,aAAA,CAAc,SAAS,OAAO,CAAA;AAAA,EACrC;AAAA,EACA,aAAA,CAAc,SAAiB,OAAA,EAAuB;AACpD,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AAAA,EACjC;AAAA,EACA,OAAO,OAAA,EAA0B;AAC/B,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,IAAK,KAAK,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG,OAAO,IAAA;AAE9D,IAAA,MAAM,SAAS,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,GAAI,UAAU,OAAA,GAAU,GAAA;AAC3D,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,EAAG;AACjC,MAAA,IAAI,CAAA,CAAE,UAAA,CAAW,MAAM,CAAA,EAAG,OAAO,IAAA;AAAA,IACnC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EACA,MAAM,QAAQ,OAAA,EAAoC;AAChD,IAAA,OAAO,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EACjC;AAAA,EACA,YAAY,OAAA,EAA2B;AACrC,IAAA,MAAM,SAAS,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,GAAI,UAAU,OAAA,GAAU,GAAA;AAC3D,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,EAAG;AACnC,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AAC1B,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AACpC,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACtC,QAAA,IAAI,YAAA,EAAc,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AAAA,MAC5C;AAAA,IACF;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,EAC3B;AAAA,EACA,MAAM,MAAM,OAAA,EAAgC;AAC1C,IAAA,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EACxB;AAAA,EACA,UAAU,OAAA,EAAuB;AAC/B,IAAA,IAAA,CAAK,IAAA,CAAK,IAAI,OAAO,CAAA;AAAA,EACvB;AAAA,EACA,MAAM,OAAO,OAAA,EAAgC;AAC3C,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,EAC3B;AAAA,EACA,MAAM,KACJ,OAAA,EACkE;AAClE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA;AACtC,IAAA,IAAI,YAAY,MAAA,EAAW;AACzB,MAAA,OAAO,EAAE,MAAM,OAAA,CAAQ,MAAA,EAAQ,SAAS,IAAA,CAAK,GAAA,EAAI,EAAG,WAAA,EAAa,KAAA,EAAM;AAAA,IACzE;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,OAAO,GAAG,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,GAAA,EAAI,EAAG,aAAa,IAAA,EAAK;AACrF,IAAA,MAAM,SAAS,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,GAAI,UAAU,OAAA,GAAU,GAAA;AAC3D,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,EAAG;AACjC,MAAA,IAAI,CAAA,CAAE,UAAA,CAAW,MAAM,CAAA,EAAG,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,GAAA,EAAI,EAAG,aAAa,IAAA,EAAK;AAAA,IACrF;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,OAAO,CAAA,CAAE,CAAA;AAAA,EACtC;AAAA;AAAA,EAGA,MAAA,GAA8B;AAC5B,IAAA,OAAO,IAAI,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAAA,EAC3B;AAAA,EACA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAAA,EAClB;AACF,CAAA;;;ACtEO,IAAM,cAAN,MAAkB;AAAA,EAAlB,WAAA,GAAA;AACL,IAAA,IAAA,CAAiB,YAAiC,EAAC;AAAA,EAAA;AAAA;AAAA,EAGnD,UAAU,QAAA,EAAyC;AACjD,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,QAAQ,CAAA;AAC5B,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA;AACzC,MAAA,IAAI,KAAK,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IACxC,CAAA;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,aAAA,GAAwB;AAC1B,IAAA,OAAO,KAAK,SAAA,CAAU,MAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,KAAA,EAA2C;AACzD,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACjC,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC5B,IAAA,CAAK,UAAU,GAAA,CAAI,OAAM,MAAK,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAC;AAAA,KAChD;AACA,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,WAAW,UAAA,EAAY;AAI3B,QAAA,MAAM,MAAA,GAAS,EAAE,MAAA,YAAkB,KAAA,GAAQ,EAAE,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,CAAA,CAAE,MAAM,CAAA;AAC7E,QAAA,OAAA,CAAQ,MAAM,CAAA,8BAAA,EAAiC,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,MAAM,CAAA,CAAE,CAAA;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AACF,CAAA;AC/BO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,WAAA,EAAa,UAAA;AAAA,EACb,YAAA,EAAc,UAAA;AAAA,EACd,YAAA,EAAc,mBAAA;AAAA,EACd,eAAA,EAAiB,+BAAA;AAAA,EACjB,UAAA,EAAY,sBAAA;AAAA,EACZ,WAAA,EAAa,YAAA;AAAA,EACb,YAAA,EAAc,MAAA;AAAA,EACd,UAAA,EAAY,0BAAA;AAAA,EACZ,WAAA,EAAa,mBAAA;AAAA,EACb,cAAA,EAAgB;AAClB,CAAA;AAGO,SAAS,WAAA,CAAY,SAAiB,IAAA,EAAsB;AACjE,EAAA,OAAO,KAAK,IAAA,CAAK,OAAA,EAAS,iBAAiB,YAAA,EAAc,CAAA,EAAG,IAAI,CAAA,IAAA,CAAM,CAAA;AACxE;AAGO,SAAS,mBAAA,CAAoB,SAAiB,IAAA,EAAsB;AACzE,EAAA,OAAO,IAAA,CAAK,KAAK,OAAA,EAAS,gBAAA,CAAiB,cAAc,WAAA,EAAa,CAAA,EAAG,IAAI,CAAA,IAAA,CAAM,CAAA;AACrF;AAGO,SAAS,WAAW,OAAA,EAAyB;AAClD,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,gBAAA,CAAiB,WAAW,CAAA;AACxD;AAGO,SAAS,eAAe,OAAA,EAAyB;AACtD,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,gBAAA,CAAiB,eAAe,CAAA;AAC5D;AAGO,SAAS,eAAA,CAAgB,SAAiB,QAAA,EAA0B;AACzE,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,OAAO,GAAG,QAAQ,CAAA;AACpD;AAGO,SAAS,iBAAA,CAAkB,SAAiB,OAAA,EAAyB;AAC1E,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,gBAAA,CAAiB,cAAc,OAAO,CAAA;AAClE;AAGO,SAAS,kBAAA,CAAmB,OAAA,EAAiB,OAAA,EAAiB,QAAA,EAA0B;AAC7F,EAAA,OAAO,KAAK,IAAA,CAAK,iBAAA,CAAkB,OAAA,EAAS,OAAO,GAAG,QAAQ,CAAA;AAChE;AAGO,SAAS,UAAU,OAAA,EAAyB;AACjD,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,gBAAA,CAAiB,UAAU,CAAA;AACvD;AAGO,SAAS,YAAY,OAAA,EAAyB;AACnD,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,gBAAA,CAAiB,YAAY,CAAA;AACzD;AAGO,SAAS,YAAA,CAAa,SAAiB,OAAA,EAAyB;AACrE,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,OAAO,CAAA;AAChD;AAGO,SAAS,cAAc,OAAA,EAAyB;AACrD,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,gBAAA,CAAiB,UAAU,CAAA;AACvD;AAOO,SAAS,aAAA,CAAc,SAAiB,OAAA,EAAyB;AACtE,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,CAAQ,WAAW,CAAA,EAAG;AACvD,IAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,EAChD;AACA,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yCAAA,EAA4C,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,EACxE;AAEA,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAA,EAAG;AACnC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6CAAA,EAAgD,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,EAC5E;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACpC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,OAAO,CAAA;AAC5C,EAAA,IAAI,MAAA,KAAW,WAAW,CAAC,MAAA,CAAO,WAAW,OAAA,GAAU,IAAA,CAAK,GAAG,CAAA,EAAG;AAChE,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,kBAAkB,IAAA,EAAoB;AACpD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,WAAW,CAAA,EAAG;AACjD,IAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,EACvC;AACA,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,IAAA,EAAM;AAC9E,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACnD;AACF;;;ACrGO,SAAS,wBAAwB,IAAA,EAA0B;AAChE,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAA,EAAS,OAAA;AAAA,IACT,WAAA,EAAa,EAAA;AAAA,IACb,UAAU;AAAC,GACb;AACF;AAGO,SAAS,sBAAsB,MAAA,EAA4B;AAChE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,OAAA,EAAS,OAAA;AAAA,IACT,WAAA,EAAa,uCAAA;AAAA,IACb,QAAA,EAAU;AAAA,MACR;AAAA,QACE,IAAA,EAAM,oBAAA;AAAA,QACN,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,gBAAA;AAAA,UACN,QAAQ,EAAC;AAAA,UACT,SAAA,EAAW;AAAA,YACT;AAAA,cACE,EAAA,EAAI,QAAQ,MAAM,CAAA,CAAA;AAAA,cAClB;AAAA;AACF;AACF,SACF;AAAA,QACA,QAAQ,EAAC;AAAA,QACT,OAAO;AAAC;AACV;AACF,GACF;AACF;AAGO,SAAS,wBAAA,CAAyB,aAAqB,KAAA,EAA4B;AACxF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,eAAA;AAAA,IACN,OAAA,EAAS,OAAA;AAAA,IACT,WAAA,EAAa,wBAAwB,WAAW,CAAA,CAAA;AAAA,IAChD,QAAA,EAAU;AAAA,MACR;AAAA,QACE,IAAA,EAAM,iBAAA;AAAA,QACN,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,gBAAA;AAAA,UACN,QAAQ,EAAC;AAAA,UACT,SAAA,EAAW;AAAA,YACT;AAAA,cACE,EAAA,EAAI,KAAA,IAAS,CAAA,QAAA,EAAW,WAAW,CAAA,CAAA;AAAA,cACnC,OAAO,KAAA,IAAS,EAAA;AAAA,cAChB,WAAA;AAAA,cACA,aAAA,EAAA,iBAAe,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY;AACxC;AACF,SACF;AAAA,QACA,QAAQ,EAAC;AAAA,QACT,OAAO;AAAC;AACV;AACF,GACF;AACF;AAEO,SAAS,cAAc,KAAA,EAA2B;AACvD,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AACtC;AC5DO,IAAM,YAAN,MAAgB;AAAA,EACrB,WAAA,CAA6B,KAA8B,OAAA,EAA2B;AAAzD,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAA8B,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAA4B;AAAA;AAAA,EAGvF,MAAM,MAAA,GAA2B;AAC/B,IAAA,OAAO,IAAA,CAAK,QAAQ,MAAA,CAAOA,IAAAA,CAAK,KAAK,IAAA,CAAK,GAAA,EAAK,MAAM,CAAC,CAAA;AAAA,EACxD;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,MAAM,IAAA,CAAK,MAAA,EAAO,EAAG;AACzB,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,MAAM,CAAC,CAAA;AACxB,IAAA,MAAM,KAAK,IAAA,CAAK,CAAC,QAAA,EAAU,YAAA,EAAc,kBAAkB,CAAC,CAAA;AAC5D,IAAA,MAAM,KAAK,IAAA,CAAK,CAAC,QAAA,EAAU,WAAA,EAAa,eAAe,CAAC,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,MAAA,GAAwB;AAC5B,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,OAAO,OAAA,EAAyC;AACpD,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,uBAAuB,CAAC,CAAA;AAC9E,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,0BAA0B,CAAA;AAClD,MAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA;AAAA,IAC5B,SAAS,GAAA,EAAc;AACrB,MAAA,IAAI,eAAe,KAAA,IAAS,GAAA,CAAI,QAAQ,QAAA,CAAS,mBAAmB,GAAG,OAAO,IAAA;AAC9E,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,GAAA,CAAI,IAAA,EAAc,OAAA,EAAiC;AACvD,IAAA,MAAM,IAAA,GAAO,CAAC,KAAK,CAAA;AACnB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAO,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IAChB;AACA,IAAA,MAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,EACtB;AAAA,EAEA,MAAM,IAAA,CAAK,MAAA,GAAS,QAAA,EAAU,MAAA,EAAgC;AAC5D,IAAA,MAAM,IAAA,GAAO,CAAC,MAAA,EAAQ,MAAM,CAAA;AAC5B,IAAA,IAAI,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC5B,IAAA,MAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,EACtB;AAAA,EAEA,MAAM,IAAA,CAAK,MAAA,GAAS,QAAA,EAAU,MAAA,EAAgC;AAC5D,IAAA,MAAM,IAAA,GAAO,CAAC,MAAA,EAAQ,MAAM,CAAA;AAC5B,IAAA,IAAI,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC5B,IAAA,MAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,EACtB;AAAA,EAEA,MAAM,SAAA,CAAU,MAAA,GAAS,QAAA,EAA4B;AACnD,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,QAAQ,CAAC,CAAA;AACtC,MAAA,OAAO,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA;AAAA,IAC3D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CAAU,MAAA,EAAgB,GAAA,EAA4B;AAC1D,IAAA,MAAM,KAAK,IAAA,CAAK,CAAC,UAAU,KAAA,EAAO,MAAA,EAAQ,GAAG,CAAC,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,MAAA,GAA6B;AACjC,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,KAAK,CAAC,QAAA,EAAU,aAAa,CAAC,CAAA;AACrD,IAAA,MAAM,QAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,CAAE,OAAO,OAAO,CAAA;AAC5C,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,MAAA,MAAM,IAAA,GAAO,KAAK,CAAC,CAAA;AACnB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACzB,MAAA,IAAI,UAAU,GAAA,IAAO,IAAA,KAAS,GAAA,EAAK,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,WAAA,IAC7C,UAAU,GAAA,IAAO,KAAA,KAAU,GAAA,EAAK,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,WAAA,IAChD,IAAA,KAAS,GAAA,EAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,CAAM,WAAW,CAAA,EAAG,MAAA,EAAQ,UAAU,SAAA,EAAU;AAAA,EAClE;AAAA,EAEA,MAAM,OAAA,GAAkC;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,IAAA,CAAK,KAAK,CAAC,WAAA,EAAa,MAAM,CAAC,CAAA;AACjD,MAAA,OAAO,GAAA,CAAI,MAAK,IAAK,IAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,KAAK,IAAA,EAAiC;AAC5C,IAAA,OAAO,OAAA,CAAQ,IAAA,EAAM,IAAA,CAAK,GAAG,CAAA;AAAA,EAC/B;AACF,CAAA;AAEA,SAAS,OAAA,CAAQ,MAAgB,GAAA,EAA8B;AAC7D,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,QAAA,CAAS,KAAA,EAAO,IAAA,EAAM,EAAE,GAAA,EAAK,SAAA,EAAW,EAAA,GAAK,IAAA,GAAO,IAAA,EAAK,EAAG,CAAC,GAAA,EAAK,MAAA,EAAQ,MAAA,KAAW;AACnF,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,MAAM,UAAU,MAAA,EAAQ,IAAA,MAAU,MAAA,EAAQ,IAAA,MAAU,GAAA,CAAI,OAAA;AACxD,QAAA,MAAA,CAAO,IAAI,MAAM,CAAA,IAAA,EAAO,IAAA,CAAK,CAAC,CAAC,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAC,CAAA;AAC9C,QAAA;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;;;ACjGA,eAAsB,cAAA,CACpB,SACA,OAAA,EACe;AACf,EAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,EAAA,MAAM,OAAA,CAAQ,KAAA,CAAMA,IAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,gBAAA,CAAiB,WAAW,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACzF,EAAA,MAAM,OAAA,CAAQ,KAAA,CAAMA,IAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,gBAAA,CAAiB,YAAY,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC1F,EAAA,MAAM,OAAA,CAAQ,KAAA,CAAMA,IAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,gBAAA,CAAiB,YAAY,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC1F,EAAA,MAAM,OAAA,CAAQ,MAAM,cAAA,CAAe,OAAO,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAClE;AAGA,eAAsB,uBAAA,CACpB,OAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,OAAA,CAAQ,MAAM,iBAAA,CAAkB,OAAA,EAAS,OAAO,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC9E;AAGA,eAAsB,2BAAA,CACpB,OAAA,EACA,OAAA,EACA,MAAA,EACA,aACA,KAAA,EACe;AACf,EAAA,MAAM,UAAA,GAAa,WAAW,OAAO,CAAA;AACrC,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AAC/B,IAAA,MAAM,QAAQ,SAAA,CAAU,UAAA,EAAY,cAAc,uBAAA,CAAwB,WAAW,CAAC,CAAC,CAAA;AAAA,EACzF;AACA,EAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,iBAAiB,WAAW,CAAA;AAChE,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC7B,IAAA,MAAM,QAAQ,SAAA,CAAU,QAAA,EAAU,cAAc,qBAAA,CAAsB,MAAM,CAAC,CAAC,CAAA;AAAA,EAChF;AACA,EAAA,MAAM,WAAA,GAAcA,IAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,iBAAiB,cAAc,CAAA;AACtE,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,WAAW,CAAA,EAAG;AAChC,IAAA,MAAM,OAAA,CAAQ,SAAA;AAAA,MACZ,WAAA;AAAA,MACA,aAAA,CAAc,wBAAA,CAAyB,WAAA,EAAa,KAAK,CAAC;AAAA,KAC5D;AAAA,EACF;AACF;AAGA,eAAsB,aAAA,CACpB,SACA,OAAA,EACoB;AACpB,EAAA,MAAM,GAAA,GAAM,IAAI,SAAA,CAAU,OAAA,EAAS,OAAO,CAAA;AAC1C,EAAA,MAAM,IAAI,IAAA,EAAK;AACf,EAAA,OAAO,GAAA;AACT;ACnEO,SAAS,aAAA,CAAc,SAA2B,OAAA,EAAmC;AAC1F,EAAA,MAAM,UAAA,GAAa,cAAc,OAAO,CAAA;AACxC,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,UAAU,GAAG,OAAO,IAAA;AACxC,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,YAAA,CAAa,UAAU,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IACE,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,IACrB,OAAO,MAAA,CAAO,MAAA,KAAW,QAAA,IACzB,OAAO,MAAA,CAAO,SAAA,KAAc,QAAA,EAC/B;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,MAAA,GAAoB;AAAA,MACxB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,WAAW,MAAA,CAAO;AAAA,KACpB;AACA,IAAA,IAAI,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,EAAU,MAAA,CAAO,UAAU,MAAA,CAAO,OAAA;AAChE,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAGA,eAAsB,cAAA,CACpB,OAAA,EACA,OAAA,EACA,MAAA,EACe;AACf,EAAA,MAAM,UAAA,GAAa,cAAc,OAAO,CAAA;AACxC,EAAA,MAAM,OAAA,CAAQ,MAAMA,IAAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACjE,EAAA,MAAM,OAAA,CAAQ,UAAU,UAAA,EAAY,IAAA,CAAK,UAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AACrE;AAMA,eAAsB,qBAAA,CACpB,OAAA,EACA,cAAA,EACA,MAAA,EACA,KAAA,EACwB;AACxB,EAAA,MAAM,OAAA,GAAUA,IAAAA,CAAK,IAAA,CAAK,cAAA,EAAgB,MAAM,CAAA;AAChD,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,OAAO,GAAG,OAAO,IAAA;AAErC,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAM,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAAA,EACzC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,UAAA,GAAaA,IAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AAC3C,IAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,CAAA,GAAI,MAAM,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AACvC,MAAA,KAAA,GAAQ,CAAA,CAAE,WAAA;AAAA,IACZ,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,OAAA,EAAS,UAAU,CAAA;AAChD,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,KAAA,KAAU,KAAA,EAAO,OAAO,UAAA;AAAA,EAC/C;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,cAAA,CAAe,gBAAwB,MAAA,EAAwB;AAC7E,EAAA,MAAM,EAAA,GAAA,qBAAS,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAA;AACrC,EAAA,OAAOA,IAAAA,CAAK,KAAK,cAAA,EAAgB,MAAA,EAAQ,GAAG,EAAE,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAC5D;ACxEA,eAAsB,gBAAA,CACpB,OAAA,EACA,OAAA,EACA,OAAA,EACwB;AACxB,EAAA,MAAM,OAAA,GAAUA,IAAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACpC,EAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AAEhD,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,SAAA,EAAU;AACtC,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,EAAA,KAAA,MAAW,gBAAgB,KAAA,EAAO;AAChC,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAClD,IAAA,MAAM,MAAA,GAASA,IAAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,UAAU,CAAA;AAC/C,IAAA,IAAI,MAAA,KAAW,WAAW,CAAC,MAAA,CAAO,WAAW,OAAA,GAAUA,IAAAA,CAAK,GAAG,CAAA,EAAG;AAEhE,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA;AACjD,IAAA,IAAI,YAAY,IAAA,EAAM;AACtB,IAAA,MAAM,OAAA,CAAQ,MAAMA,IAAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC7D,IAAA,MAAM,OAAA,CAAQ,SAAA,CAAU,MAAA,EAAQ,OAAO,CAAA;AACvC,IAAA,aAAA,EAAA;AACA,IAAA,YAAA,IAAgB,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,OAAO,CAAA;AAAA,EACpD;AAEA,EAAA,OAAO,EAAE,eAAe,YAAA,EAAa;AACvC;;;ACnBA,eAAsB,aAAA,CACpB,OAAA,EACA,OAAA,EACA,KAAA,EACe;AACf,EAAA,MAAM,OAAA,CAAQ,UAAU,OAAA,EAAS,IAAA,CAAK,UAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAC,CAAA;AACjE;AAgCA,eAAsB,cAAA,CACpB,OAAA,EACA,OAAA,EACA,KAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAA,CAAO,OAAO,IAAI,MAAM,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,GAAI,EAAA;AAC7E,EAAA,MAAM,MAAA,GAAS,SAAS,MAAA,GAAS,CAAA,IAAK,CAAC,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,GAAI,IAAA,GAAO,EAAA;AACxE,EAAA,MAAM,OAAA,CAAQ,UAAU,OAAA,EAAS,QAAA,GAAW,SAAS,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAI,IAAI,CAAA;AACnF;;;ACrBA,IAAM,WAAA,GAAc;AAAA,EAClB,QAAA,EAAU,eAAA;AAAA,EACV,IAAA,EAAM,WAAA;AAAA,EACN,cAAA,EAAgB,qBAAA;AAAA,EAChB,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,aAAA,GAAgB;AAAA,EACpB,IAAA,EAAM,WAAA;AAAA,EACN,MAAA,EAAQ,aAAA;AAAA,EACR,OAAA,EAAS,eAAA;AAAA,EACT,aAAA,EAAe,sBAAA;AAAA,EACf,MAAA,EAAQ,aAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAEO,IAAM,uBAAN,MAAuD;AAAA,EAU5D,YAAY,IAAA,EAAuB;AAFnC;AAAA,IAAA,IAAA,CAAiB,UAAA,uBAAiB,GAAA,EAA2B;AAG3D,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,KAAA;AACnB,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA;AAChB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AAAA,EACrB;AAAA;AAAA,EAIA,IAAI,KAAA,GAA4B;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,SAAS,EAAA,EAAkB;AACzB,IAAA,IAAA,CAAK,MAAA,GAAS,EAAA;AAAA,EAChB;AAAA;AAAA;AAAA,EAKQ,QAAA,CAAY,SAAiB,EAAA,EAAkC;AACrE,IAAA,MAAM,OAAO,IAAA,CAAK,UAAA,CAAW,IAAI,OAAO,CAAA,IAAK,QAAQ,OAAA,EAAQ;AAC7D,IAAA,IAAI,QAAA;AACJ,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,YAAY;AACjC,MAAA,QAAA,GAAW,MAAM,EAAA,EAAG;AAAA,IACtB,CAAC,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,MAAM,MAAS,CAAA;AAC5C,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,OAAA,EAAS,SAAS,CAAA;AACtC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,EACjC;AAAA;AAAA,EAGA,MAAc,aAAa,OAAA,EAAgC;AACzD,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAMA,IAAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,EACrE;AAAA,EAEA,MAAc,KAAK,KAAA,EAA2C;AAC5D,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA;AAAA,EAClC;AAAA;AAAA,EAIA,YAAY,IAAA,EAA6B;AACvC,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,MAAM,CAAA,GAAI,WAAA,CAAY,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AACxC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAG,OAAO,IAAA;AACpC,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,CAAC,CAAA;AAAA,IACpC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,YAAA,CAAa,IAAA,EAAc,OAAA,EAAgC;AAC/D,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,MAAM,CAAA,GAAI,WAAA,CAAY,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AACxC,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,YAAY;AACjC,MAAA,MAAM,IAAA,CAAK,aAAa,CAAC,CAAA;AACzB,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,OAAO,CAAA;AAAA,IACzC,CAAC,CAAA;AACD,IAAA,MAAM,KAAK,IAAA,CAAK,EAAE,MAAM,SAAA,EAAW,IAAA,EAAM,SAAS,CAAA;AAAA,EACpD;AAAA,EAEA,YAAA,GAAyB;AACvB,IAAA,MAAM,MAAMA,IAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,iBAAiB,YAAY,CAAA;AACjE,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA,SAAU,EAAC;AACvC,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,CAAY,GAAG,EAChC,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,QAAA,CAAS,MAAM,CAAC,CAAA,CAC9B,GAAA,CAAI,OAAK,CAAA,CAAE,OAAA,CAAQ,UAAU,EAAE,CAAC,EAChC,IAAA,EAAK;AAAA,IACV,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,IAAA,EAA6B;AAChD,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA,EAAG;AAC/B,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,GAAG,CAAA;AAC/C,IAAA,MAAM,GAAA,GAAM,mBAAA,CAAoB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAClD,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK,YAAY;AACnC,MAAA,MAAM,IAAA,CAAK,aAAa,GAAG,CAAA;AAC3B,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,GAAA,EAAK,OAAO,CAAA;AACzC,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA;AAAA,IAC/B,CAAC,CAAA;AACD,IAAA,MAAM,KAAK,IAAA,CAAK,EAAE,IAAA,EAAM,kBAAA,EAAoB,MAAM,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,aAAA,CAAc,IAAA,EAAc,EAAA,EAA2B;AAC3D,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,iBAAA,CAAkB,EAAE,CAAA;AACpB,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAC1C,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,IAAA,CAAK,OAAA,EAAS,EAAE,CAAA;AACxC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA,EAAG;AAC/B,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,GAAG,CAAA;AAC/C,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK,YAAY;AACnC,MAAA,MAAM,IAAA,CAAK,aAAa,GAAG,CAAA;AAC3B,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,GAAA,EAAK,OAAO,CAAA;AACzC,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA;AAAA,IAC/B,CAAC,CAAA;AACD,IAAA,MAAM,KAAK,IAAA,CAAK,EAAE,MAAM,iBAAA,EAAmB,IAAA,EAAM,IAAI,CAAA;AAAA,EACvD;AAAA;AAAA,EAIA,UAAA,GAA4B;AAC1B,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA;AACjC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAG,OAAO,IAAA;AACpC,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,CAAC,CAAA;AAAA,IACpC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,OAAA,EAAgC;AAChD,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA;AACjC,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,YAAY;AACjC,MAAA,MAAM,IAAA,CAAK,aAAa,CAAC,CAAA;AACzB,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,OAAO,CAAA;AAAA,IACzC,CAAC,CAAA;AACD,IAAA,MAAM,KAAK,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,CAAA;AAAA,EAC7C;AAAA;AAAA,EAIA,YAAA,GAA+C;AAC7C,IAAA,OAAO,gBAAA,CAAoB,KAAK,OAAA,EAAS,eAAA,CAAgB,KAAK,OAAA,EAAS,WAAA,CAAY,QAAQ,CAAC,CAAA;AAAA,EAC9F;AAAA,EAEA,MAAM,cAAoC,QAAA,EAA4B;AACpE,IAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,IAAA,CAAK,OAAA,EAAS,YAAY,QAAQ,CAAA;AAC5D,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,YAAY;AACjC,MAAA,MAAM,IAAA,CAAK,aAAa,CAAC,CAAA;AACzB,MAAA,MAAM,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,QAAQ,CAAA;AAAA,IAC/C,CAAC,CAAA;AACD,IAAA,MAAM,KAAK,IAAA,CAAK,EAAE,MAAM,UAAA,EAAY,OAAA,EAAS,UAAU,CAAA;AAAA,EACzD;AAAA,EAEA,QAAA,GAA2C;AACzC,IAAA,OAAO,gBAAA,CAAoB,KAAK,OAAA,EAAS,eAAA,CAAgB,KAAK,OAAA,EAAS,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,EAC1F;AAAA,EAEA,MAAM,UAAgC,IAAA,EAAwB;AAC5D,IAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,IAAA,CAAK,OAAA,EAAS,YAAY,IAAI,CAAA;AACxD,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,YAAY;AACjC,MAAA,MAAM,IAAA,CAAK,aAAa,CAAC,CAAA;AACzB,MAAA,MAAM,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,IAAI,CAAA;AAAA,IAC3C,CAAC,CAAA;AACD,IAAA,MAAM,KAAK,IAAA,CAAK,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAAA,EACjD;AAAA,EAEA,wBAAA,GAAmD;AACjD,IAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,IAAA,CAAK,OAAA,EAAS,YAAY,cAAc,CAAA;AAClE,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAC,CAAA,SAAU,EAAC;AACrC,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,KAAK,OAAA,CAAQ,YAAA,CAAa,CAAC,CAAC,CAAA;AACtD,MAAA,MAAM,MAA8B,EAAC;AACrC,MAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACnC,QAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,QAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,MACtC;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,0BAA0B,OAAA,EAAgD;AAC9E,IAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,IAAA,CAAK,OAAA,EAAS,YAAY,cAAc,CAAA;AAClE,IAAA,MAAM,MAAA,GAAqB,EAAE,GAAG,OAAA,EAAQ;AACxC,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,YAAY;AACjC,MAAA,MAAM,IAAA,CAAK,aAAa,CAAC,CAAA;AACzB,MAAA,MAAM,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,MAAM,CAAA;AAAA,IAC7C,CAAC,CAAA;AACD,IAAA,MAAM,KAAK,IAAA,CAAK,EAAE,MAAM,gBAAA,EAAkB,OAAA,EAAS,SAAS,CAAA;AAAA,EAC9D;AAAA,EAEA,uBAAA,GAA2D;AACzD,IAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,IAAA,CAAK,OAAA,EAAS,YAAY,QAAQ,CAAA;AAC5D,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAG,OAAO,IAAA;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,KAAK,OAAA,CAAQ,YAAA,CAAa,CAAC,CAAC,CAAA;AACtD,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,GAAG,OAAO,IAAA;AACnC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,yBAA8C,QAAA,EAA8B;AAChF,IAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,IAAA,CAAK,OAAA,EAAS,YAAY,QAAQ,CAAA;AAC5D,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,YAAY;AACjC,MAAA,MAAM,IAAA,CAAK,aAAa,CAAC,CAAA;AACzB,MAAA,MAAM,IAAA,CAAK,QAAQ,SAAA,CAAU,CAAA,EAAG,KAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IACnE,CAAC,CAAA;AACD,IAAA,MAAM,KAAK,IAAA,CAAK,EAAE,MAAM,sBAAA,EAAwB,OAAA,EAAS,UAAyB,CAAA;AAAA,EACpF;AAAA;AAAA,EAIQ,WAAA,CAAY,SAAiB,QAAA,EAA0B;AAC7D,IAAA,iBAAA,CAAkB,OAAO,CAAA;AACzB,IAAA,OAAO,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,QAAQ,CAAA;AAAA,EAC3D;AAAA,EAEA,SAA+B,OAAA,EAA2B;AACxD,IAAA,OAAO,gBAAA,CAAoB,KAAK,OAAA,EAAS,IAAA,CAAK,YAAY,OAAA,EAAS,aAAA,CAAc,IAAI,CAAC,CAAA;AAAA,EACxF;AAAA,EAEA,MAAM,SAAA,CAAgC,OAAA,EAAiB,IAAA,EAAwB;AAC7E,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,cAAc,IAAI,CAAA;AACtD,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,YAAY;AACjC,MAAA,MAAM,uBAAA,CAAwB,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,SAAS,OAAO,CAAA;AACjE,MAAA,MAAM,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,IAAI,CAAA;AAAA,IAC3C,CAAC,CAAA;AACD,IAAA,MAAM,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,OAAA,EAAS,MAAM,CAAA;AAAA,EAC1D;AAAA,EAEA,WAAiC,OAAA,EAA2B;AAC1D,IAAA,OAAO,gBAAA,CAAoB,KAAK,OAAA,EAAS,IAAA,CAAK,YAAY,OAAA,EAAS,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,EAC1F;AAAA,EAEA,MAAM,WAAA,CAAkC,OAAA,EAAiB,MAAA,EAA0B;AACjF,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,cAAc,MAAM,CAAA;AACxD,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,YAAY;AACjC,MAAA,MAAM,uBAAA,CAAwB,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,SAAS,OAAO,CAAA;AACjE,MAAA,MAAM,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,MAAM,CAAA;AAAA,IAC7C,CAAC,CAAA;AACD,IAAA,MAAM,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,OAAA,EAAS,QAAQ,CAAA;AAAA,EAC9D;AAAA,EAEA,MAAM,aAAA,CAAoC,OAAA,EAAiB,KAAA,EAAyB;AAClF,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,cAAc,OAAO,CAAA;AACzD,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,YAAY;AACjC,MAAA,MAAM,uBAAA,CAAwB,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,SAAS,OAAO,CAAA;AACjE,MAAA,MAAM,cAAA,CAAe,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,KAAK,CAAA;AAAA,IAC7C,CAAC,CAAA;AACD,IAAA,MAAM,KAAK,IAAA,CAAK,EAAE,MAAM,SAAA,EAAW,OAAA,EAAS,OAAO,CAAA;AAAA,EACrD;AAAA,EAEA,YAAkC,OAAA,EAAsB;AACtD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,cAAc,OAAO,CAAA;AACzD,IAAA,OAAO,iBAAA,CAAqB,IAAA,CAAK,OAAA,EAAS,CAAC,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,mBAAA,CAA0C,OAAA,EAAiB,GAAA,EAAuB;AACtF,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,cAAc,aAAa,CAAA;AAC/D,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,YAAY;AACjC,MAAA,MAAM,uBAAA,CAAwB,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,SAAS,OAAO,CAAA;AACjE,MAAA,MAAM,cAAA,CAAe,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA;AAAA,IAC3C,CAAC,CAAA;AACD,IAAA,MAAM,KAAK,IAAA,CAAK,EAAE,MAAM,gBAAA,EAAkB,OAAA,EAAS,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEA,WAAiC,OAAA,EAAsB;AACrD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,cAAc,MAAM,CAAA;AACxD,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAC,CAAA,SAAU,EAAC;AACrC,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,KAAK,OAAA,CAAQ,YAAA,CAAa,CAAC,CAAC,CAAA;AACtD,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,SAAU,EAAC;AACpC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CAAkC,OAAA,EAAiB,MAAA,EAA4B;AACnF,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,cAAc,MAAM,CAAA;AACxD,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,YAAY;AACjC,MAAA,MAAM,uBAAA,CAAwB,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,SAAS,OAAO,CAAA;AACjE,MAAA,MAAM,IAAA,CAAK,QAAQ,SAAA,CAAU,CAAA,EAAG,KAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IACjE,CAAC,CAAA;AACD,IAAA,MAAM,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,OAAA,EAAS,QAAQ,CAAA;AAAA,EAC9D;AAAA,EAEA,qBAA0C,OAAA,EAA6B;AACrE,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,cAAc,QAAQ,CAAA;AAC1D,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAG,OAAO,IAAA;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,KAAK,OAAA,CAAQ,YAAA,CAAa,CAAC,CAAC,CAAA;AACtD,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,GAAG,OAAO,IAAA;AACnC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,qBAAA,CACJ,OAAA,EACA,QAAA,EACe;AACf,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,cAAc,QAAQ,CAAA;AAC1D,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,YAAY;AACjC,MAAA,MAAM,uBAAA,CAAwB,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,SAAS,OAAO,CAAA;AACjE,MAAA,MAAM,IAAA,CAAK,QAAQ,SAAA,CAAU,CAAA,EAAG,KAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IACnE,CAAC,CAAA;AACD,IAAA,MAAM,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,qBAAqB,OAAA,EAAS,OAAA,EAAS,UAAyB,CAAA;AAAA,EAC1F;AAAA;AAAA,EAIA,MAAM,UAAgC,KAAA,EAAyB;AAC7D,IAAA,MAAM,CAAA,GAAI,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AAChC,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,YAAY;AACjC,MAAA,MAAM,IAAA,CAAK,aAAa,CAAC,CAAA;AACzB,MAAA,MAAM,cAAA,CAAe,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,KAAK,CAAA;AAAA,IAC7C,CAAC,CAAA;AACD,IAAA,MAAM,KAAK,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AAAA,EAC1C;AAAA,EAEA,SAAA,GAAuC;AACrC,IAAA,MAAM,CAAA,GAAI,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AAChC,IAAA,OAAO,iBAAA,CAAqB,IAAA,CAAK,OAAA,EAAS,CAAC,CAAA;AAAA,EAC7C;AAAA;AAAA,EAIA,MAAM,aAAA,CAAc,OAAA,EAAiB,OAAA,EAAgC;AACnE,IAAA,IAAI,QAAQ,QAAA,CAAS,IAAI,KAAKA,IAAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC1D;AACA,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA;AAC5C,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,YAAY;AACjC,MAAA,MAAM,IAAA,CAAK,aAAa,CAAC,CAAA;AACzB,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,OAAO,CAAA;AAAA,IACzC,CAAC,CAAA;AACD,IAAA,MAAM,KAAK,IAAA,CAAK,EAAE,MAAM,UAAA,EAAY,OAAA,EAAS,SAAS,CAAA;AAAA,EACxD;AAAA,EAEA,aAAa,OAAA,EAAgC;AAC3C,IAAA,IAAI,OAAA,CAAQ,SAAS,IAAI,CAAA,IAAKA,KAAK,UAAA,CAAW,OAAO,GAAG,OAAO,IAAA;AAC/D,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA;AAC5C,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAG,OAAO,IAAA;AACpC,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,CAAC,CAAA;AAAA,IACpC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,aAAA,GAA+B;AACnC,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA;AACpC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA,EAAG;AAC/B,IAAA,MAAM,UAAA,CAAW,IAAA,CAAK,OAAA,EAAS,GAAG,CAAA;AAAA,EACpC;AAAA;AAAA,EAIA,MAAM,SAAS,OAAA,EAAyC;AACtD,IAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAG,GAAG,OAAO,IAAA;AACtC,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA;AAAA,IACxC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CAAU,OAAA,EAAiB,OAAA,EAAgC;AAC/D,IAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA;AAC/C,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK,YAAY;AACnC,MAAA,MAAM,IAAA,CAAK,aAAa,GAAG,CAAA;AAC3B,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,GAAA,EAAK,OAAO,CAAA;AAAA,IAC3C,CAAC,CAAA;AACD,IAAA,MAAM,KAAK,IAAA,CAAK,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,SAAS,OAAA,EAA2C;AACxD,IAAA,MAAM,IAAA,GAAO,YAAY,MAAA,GAAY,IAAA,CAAK,UAAU,aAAA,CAAc,IAAA,CAAK,SAAS,OAAO,CAAA;AACvF,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAI,CAAA,SAAU,EAAC;AACxC,IAAA,MAAM,MAAsB,EAAC;AAC7B,IAAA,MAAM,KAAK,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,SAAS,GAAG,CAAA;AAChD,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,OAAA,EAAmC;AAC9C,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA;AAAA,IAC3C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA;AAAA,EAChC;AAAA;AAAA,EAIA,MAAM,cAAc,IAAA,EAGgB;AAClC,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,EAAK,OAAO,IAAA;AACtB,IAAA,MAAM,IAAA,CAAK,IAAI,MAAA,EAAO;AACtB,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,KAAK,OAAO,CAAA;AAC9C,IAAA,IAAI,GAAA,KAAQ,MAAM,OAAO,IAAA;AACzB,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,KAAA,MAAW,KAAK,IAAA,CAAK,IAAA,QAAY,IAAA,CAAK,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AACtC,MAAA,IAAI,CAAE,MAAM,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,QAAQ,CAAA,EAAI;AACzC,QAAA,MAAM,KAAK,GAAA,CAAI,SAAA,CAAU,QAAA,EAAU,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,MACxD;AACA,MAAA,MAAM,KAAK,GAAA,CAAI,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA,CAAO,UAAU,MAAM,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,EAAE,GAAA,EAAI;AAAA,EACf;AAAA,EAEA,MAAM,YAAA,GAAiC;AACrC,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,IAAO,CAAC,IAAA,CAAK,QAAQ,OAAO,KAAA;AACtC,IAAA,IAAI,CAAE,MAAM,IAAA,CAAK,IAAI,SAAA,CAAU,QAAQ,GAAI,OAAO,KAAA;AAClD,IAAA,MAAM,KAAK,GAAA,CAAI,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA,CAAO,UAAU,MAAM,CAAA;AAC1D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAAA,GAAoC;AACxC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACb,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,EAAC,EAAG,QAAA,EAAU,EAAC,EAAG,SAAA,EAAW,EAAC,EAAG,QAAQ,KAAA,EAAM;AAAA,IAC/E;AACA,IAAA,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,GAAA,CAAI,MAAA,EAAO;AAChC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,UAAU,QAAQ,CAAA;AAChD,IAAA,OAAO,EAAE,GAAG,CAAA,EAAG,MAAA,EAAO;AAAA,EACxB;AAAA;AAAA,EAIA,UAAU,QAAA,EAAyC;AACjD,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,QAAQ,CAAA;AAAA,EACtC;AAAA;AAAA,EAIA,MAAM,OAAA,GAAyB;AAE7B,IAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AACnD,IAAA,MAAM,OAAA,CAAQ,WAAW,OAAO,CAAA;AAEhC,IAAA,IAAI,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,MAAA,EAAQ;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,aAAA,CAAc,EAAE,OAAA,EAAS,sBAAsB,CAAA;AAAA,MAC5D,SAAS,GAAA,EAAc;AACrB,QAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2CAAA,EAA8C,GAAG,CAAA,CAAE,CAAA;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AACF,CAAA;AAMA,SAAS,gBAAA,CACP,SACA,OAAA,EACU;AACV,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,OAAO,GAAG,OAAO,IAAA;AACrC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAC,CAAA;AAAA,EACjD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,iBAAA,CACP,SACA,OAAA,EACK;AACL,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,SAAU,EAAC;AACtC,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA;AACxC,IAAA,MAAM,MAAW,EAAC;AAClB,IAAA,KAAA,MAAW,IAAA,IAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAClC,MAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAClB,MAAA,IAAI;AACF,QAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAI,CAAM,CAAA;AAAA,MAChC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,eAAe,IAAA,CACb,OAAA,EACA,GAAA,EACA,IAAA,EACA,GAAA,EACe;AACf,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACzC,EAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,IAAA,MAAM,IAAA,GAAOA,IAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAChC,IAAA,MAAM,CAAA,GAAI,MAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AACjC,IAAA,MAAM,GAAA,GAAMA,IAAAA,CAAK,QAAA,CAAS,IAAA,EAAM,IAAI,CAAA,CAAE,KAAA,CAAMA,IAAAA,CAAK,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC9D,IAAA,IAAI,EAAE,WAAA,EAAa;AACjB,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,MAAM,WAAA,EAAa,IAAA,EAAM,GAAG,CAAA;AAClD,MAAA,MAAM,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,GAAG,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,MAAM,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,IACpD;AAAA,EACF;AACF;AAEA,eAAe,UAAA,CAAW,SAA2B,GAAA,EAA4B;AAC/E,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACzC,EAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,IAAA,MAAM,IAAA,GAAOA,IAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAChC,IAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,IAAI;AACF,MAAA,KAAA,GAAA,CAAS,MAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,WAAA;AAAA,IACrC,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,UAAA,CAAW,SAAS,IAAI,CAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,MAC3B,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;;;ACrkBA,eAAsB,cAAc,IAAA,EAAuD;AACzF,EAAA,MAAM,OAAA,GAA4B,KAAK,OAAA,KAAY,QAAA,GAC/C,IAAI,aAAA,EAAc,GAClB,IAAI,YAAA,EAAa;AACrB,EAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,EAAY;AAE9B,EAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAAiB,OAAA,EAAS,IAAI,CAAA;AAErD,EAAA,MAAM,cAAA,CAAe,OAAA,EAAS,QAAA,CAAS,OAAO,CAAA;AAC9C,EAAA,MAAM,2BAAA;AAAA,IACJ,OAAA;AAAA,IACA,QAAA,CAAS,OAAA;AAAA,IACT,IAAA,CAAK,MAAA;AAAA,IACL,KAAK,WAAA,IAAe,UAAA;AAAA,IACpB,QAAA,CAAS;AAAA,GACX;AAGA,EAAA,IAAI,QAAA,CAAS,UAAU,MAAA,EAAW;AAChC,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,OAAA,EAAS,QAAA,CAAS,OAAO,CAAA;AACxD,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,KAAA,KAAU,SAAS,KAAA,EAAO;AAClD,MAAA,MAAM,MAAA,GAAoB;AAAA,QACxB,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,SAAA,EAAW,QAAA,EAAU,SAAA,IAAa,IAAA,CAAK,GAAA;AAAI,OAC7C;AACA,MAAA,IAAI,KAAK,MAAA,EAAQ,OAAA,EAAS,MAAA,CAAO,OAAA,GAAU,KAAK,MAAA,CAAO,OAAA;AACvD,MAAA,MAAM,cAAA,CAAe,OAAA,EAAS,QAAA,CAAS,OAAA,EAAS,MAAM,CAAA;AAAA,IACxD;AAAA,EACF;AAGA,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,OAAA,KAAY,QAAA,EAAU;AAC5C,IAAA,GAAA,GAAM,MAAM,aAAA,CAAc,OAAA,EAAS,QAAA,CAAS,OAAO,CAAA;AAAA,EACrD;AAEA,EAAA,OAAO,IAAI,oBAAA,CAAqB;AAAA,IAC9B,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,OAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,GAAA;AAAA,IACA,QAAQ,IAAA,CAAK;AAAA,GACd,CAAA;AACH;AAOA,eAAe,gBAAA,CACb,SACA,IAAA,EAC4B;AAE5B,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,MAAMC,QAAAA,GAAUD,IAAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,OAAA,EAASC,QAAO,CAAA;AAC7C,IAAA,OAAO,EAAE,OAAA,EAAAA,QAAAA,EAAS,OAAO,MAAA,EAAQ,KAAA,IAAS,KAAK,KAAA,EAAM;AAAA,EACvD;AAGA,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,MAAM,QAAQ,MAAM,qBAAA;AAAA,MAClB,OAAA;AAAA,MACA,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AACA,IAAA,IAAI,OAAO,OAAO,EAAE,SAAS,KAAA,EAAO,KAAA,EAAO,KAAK,KAAA,EAAM;AAAA,EACxD;AAGA,EAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,OAAA,EAAS;AAC9B,IAAA,MAAMA,QAAAA,GAAU,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,KAAK,MAAM,CAAA;AACrD,IAAA,MAAM,QAAQ,KAAA,CAAMA,QAAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,IAAA,MAAM,gBAAA,CAAiB,OAAA,EAASA,QAAAA,EAAS,IAAA,CAAK,OAAO,CAAA;AACrD,IAAA,OAAO,EAAE,OAAA,EAAAA,QAAAA,EAAS,KAAA,EAAO,KAAK,KAAA,EAAM;AAAA,EACtC;AAGA,EAAA,IAAI,KAAK,KAAA,IAAS,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,OAAO,OAAA,EAAS;AACpD,IAAA,MAAMA,QAAAA,GAAU,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,KAAK,MAAM,CAAA;AACrD,IAAA,MAAM,QAAQ,KAAA,CAAMA,QAAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AAKhD,IAAA,OAAO,EAAE,OAAA,EAAAA,QAAAA,EAAS,KAAA,EAAO,KAAK,KAAA,EAAM;AAAA,EACtC;AAGA,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,KAAK,MAAM,CAAA;AACrD,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACtC","file":"index.js","sourcesContent":["/**\n * Local filesystem backend. The ONLY place `node:fs` is permitted.\n */\nimport fs from 'node:fs';\nimport type { WorkspaceBackend } from '../types.js';\n\nexport class LocalBackend implements WorkspaceBackend {\n async readFile(absPath: string): Promise<string> {\n return fs.promises.readFile(absPath, 'utf-8');\n }\n readFileSync(absPath: string): string {\n return fs.readFileSync(absPath, 'utf-8');\n }\n async writeFile(absPath: string, content: string): Promise<void> {\n await fs.promises.writeFile(absPath, content, 'utf-8');\n }\n writeFileSync(absPath: string, content: string): void {\n fs.writeFileSync(absPath, content, 'utf-8');\n }\n exists(absPath: string): boolean {\n return fs.existsSync(absPath);\n }\n async readdir(absPath: string): Promise<string[]> {\n return fs.promises.readdir(absPath);\n }\n readdirSync(absPath: string): string[] {\n return fs.readdirSync(absPath);\n }\n async mkdir(absPath: string, opts?: { recursive?: boolean }): Promise<void> {\n await fs.promises.mkdir(absPath, opts);\n }\n mkdirSync(absPath: string, opts?: { recursive?: boolean }): void {\n fs.mkdirSync(absPath, opts);\n }\n async unlink(absPath: string): Promise<void> {\n await fs.promises.unlink(absPath);\n }\n async stat(\n absPath: string,\n ): Promise<{ size: number; mtimeMs: number; isDirectory: boolean }> {\n const s = await fs.promises.stat(absPath);\n return { size: s.size, mtimeMs: s.mtimeMs, isDirectory: s.isDirectory() };\n }\n}\n","/**\n * In-memory backend for tests and sandboxed evals. No `node:fs`.\n */\nimport type { WorkspaceBackend } from '../types.js';\n\nexport class MemoryBackend implements WorkspaceBackend {\n private files = new Map<string, string>();\n private dirs = new Set<string>();\n\n async readFile(absPath: string): Promise<string> {\n return this.readFileSync(absPath);\n }\n readFileSync(absPath: string): string {\n const content = this.files.get(absPath);\n if (content === undefined) throw new Error(`ENOENT: ${absPath}`);\n return content;\n }\n async writeFile(absPath: string, content: string): Promise<void> {\n this.writeFileSync(absPath, content);\n }\n writeFileSync(absPath: string, content: string): void {\n this.files.set(absPath, content);\n }\n exists(absPath: string): boolean {\n if (this.files.has(absPath) || this.dirs.has(absPath)) return true;\n // Treat any prefix that has children as an existing dir.\n const prefix = absPath.endsWith('/') ? absPath : absPath + '/';\n for (const k of this.files.keys()) {\n if (k.startsWith(prefix)) return true;\n }\n return false;\n }\n async readdir(absPath: string): Promise<string[]> {\n return this.readdirSync(absPath);\n }\n readdirSync(absPath: string): string[] {\n const prefix = absPath.endsWith('/') ? absPath : absPath + '/';\n const entries = new Set<string>();\n for (const key of this.files.keys()) {\n if (key.startsWith(prefix)) {\n const rest = key.slice(prefix.length);\n const firstSegment = rest.split('/')[0];\n if (firstSegment) entries.add(firstSegment);\n }\n }\n return Array.from(entries);\n }\n async mkdir(absPath: string): Promise<void> {\n this.mkdirSync(absPath);\n }\n mkdirSync(absPath: string): void {\n this.dirs.add(absPath);\n }\n async unlink(absPath: string): Promise<void> {\n this.files.delete(absPath);\n }\n async stat(\n absPath: string,\n ): Promise<{ size: number; mtimeMs: number; isDirectory: boolean }> {\n const content = this.files.get(absPath);\n if (content !== undefined) {\n return { size: content.length, mtimeMs: Date.now(), isDirectory: false };\n }\n // Treat as directory if anything sits under it.\n if (this.dirs.has(absPath)) return { size: 0, mtimeMs: Date.now(), isDirectory: true };\n const prefix = absPath.endsWith('/') ? absPath : absPath + '/';\n for (const k of this.files.keys()) {\n if (k.startsWith(prefix)) return { size: 0, mtimeMs: Date.now(), isDirectory: true };\n }\n throw new Error(`ENOENT: ${absPath}`);\n }\n\n // Test helpers\n getAll(): Map<string, string> {\n return new Map(this.files);\n }\n clear(): void {\n this.files.clear();\n this.dirs.clear();\n }\n}\n","/**\n * Internal SinkManager — fans `WorkspaceWriteEvent` out to every\n * registered `WorkspaceObserver`. A slow / hung observer does not crash\n * the writer; results are collected via `Promise.allSettled`.\n *\n * @packageDocumentation\n */\n\nimport type { WorkspaceObserver, WorkspaceWriteEvent } from '../types.js';\n\nexport class SinkManager {\n private readonly observers: WorkspaceObserver[] = [];\n\n /** Register an observer; returns an unsubscribe function. */\n subscribe(observer: WorkspaceObserver): () => void {\n this.observers.push(observer);\n return () => {\n const i = this.observers.indexOf(observer);\n if (i >= 0) this.observers.splice(i, 1);\n };\n }\n\n /** Snapshot of observer count — useful for diagnostics. */\n get observerCount(): number {\n return this.observers.length;\n }\n\n /**\n * Notify all observers in parallel. Awaits all settlements. A rejected\n * observer is captured in the result; subsequent writes still proceed.\n */\n async notifyAll(event: WorkspaceWriteEvent): Promise<void> {\n if (this.observers.length === 0) return;\n const settled = await Promise.allSettled(\n this.observers.map(async o => o.onWrite(event)),\n );\n for (const r of settled) {\n if (r.status === 'rejected') {\n // Observer failure must not surface as a write failure, but it is\n // useful to keep visible. Console-only so the package stays\n // logger-agnostic.\n const reason = r.reason instanceof Error ? r.reason.message : String(r.reason);\n console.error(`[workspace] observer error on ${event.kind}: ${reason}`);\n }\n }\n }\n}\n","/**\n * Path discipline — every absolute path the service uses is computed here.\n *\n * Consumers never construct paths. Public methods take logical names; the\n * service calls into this module to resolve them. Trusted internal paths\n * (orbital files, session files) use `path.join` directly; sandboxed\n * methods (`readFile` / `writeFile`) go through `sandboxedPath` which\n * rejects traversal.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\n\n/** Single source of truth for workspace directory layout. */\nexport const WORKSPACE_LAYOUT = {\n ALMADAR_DIR: '.almadar',\n ORBITALS_DIR: 'orbitals',\n SESSIONS_DIR: '.almadar/sessions',\n COORDINATOR_DIR: '.almadar/sessions/Coordinator',\n TRACE_FILE: '.almadar/trace.jsonl',\n SCHEMA_FILE: 'schema.orb',\n COMPILED_DIR: 'apps',\n APP_MARKER: '.almadar/app-marker.json',\n USER_MEMORY: '.almadar/user.orb',\n PROJECT_MEMORY: '.almadar/project.orb',\n} as const;\n\n/** Logical orbital name → absolute `.orb` path. */\nexport function orbitalFile(workDir: string, name: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR, `${name}.orb`);\n}\n\n/** Archived orbital path. */\nexport function archivedOrbitalFile(workDir: string, name: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR, '.archived', `${name}.orb`);\n}\n\n/** Schema (combined output) file. */\nexport function schemaFile(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.SCHEMA_FILE);\n}\n\n/** Coordinator session dir. */\nexport function coordinatorDir(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.COORDINATOR_DIR);\n}\n\n/** Coordinator-level artifact path. */\nexport function coordinatorFile(workDir: string, basename: string): string {\n return path.join(coordinatorDir(workDir), basename);\n}\n\n/** Per-orbital session dir. */\nexport function orbitalSessionDir(workDir: string, orbital: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.SESSIONS_DIR, orbital);\n}\n\n/** Per-orbital session-file path. */\nexport function orbitalSessionFile(workDir: string, orbital: string, basename: string): string {\n return path.join(orbitalSessionDir(workDir, orbital), basename);\n}\n\n/** Trace JSONL. */\nexport function traceFile(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.TRACE_FILE);\n}\n\n/** Compiled output base. */\nexport function compiledDir(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.COMPILED_DIR);\n}\n\n/** Compiled-output path for a given relative key. */\nexport function compiledFile(workDir: string, relPath: string): string {\n return path.join(compiledDir(workDir), relPath);\n}\n\n/** App marker — used internally by the resolver/factory. */\nexport function appMarkerFile(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.APP_MARKER);\n}\n\n/**\n * Resolve a user-supplied relative path within the sandbox. Rejects\n * absolute paths, `..` traversal, and any path that resolves outside\n * `workDir`. Returns the absolute resolved path on success.\n */\nexport function sandboxedPath(workDir: string, relPath: string): string {\n if (typeof relPath !== 'string' || relPath.length === 0) {\n throw new Error('sandbox: empty relative path');\n }\n if (path.isAbsolute(relPath)) {\n throw new Error(`sandbox: absolute paths are not allowed (${relPath})`);\n }\n // Reject Windows-style absolute paths on cross-platform consumers.\n if (/^[a-zA-Z]:[\\\\/]/.test(relPath)) {\n throw new Error(`sandbox: drive-letter paths are not allowed (${relPath})`);\n }\n const rootAbs = path.resolve(workDir);\n const target = path.resolve(rootAbs, relPath);\n if (target !== rootAbs && !target.startsWith(rootAbs + path.sep)) {\n throw new Error(`sandbox: path escapes workspace (${relPath})`);\n }\n return target;\n}\n\n/** Validate an orbital logical name — no path separators, no `..`. */\nexport function assertOrbitalName(name: string): void {\n if (typeof name !== 'string' || name.length === 0) {\n throw new Error('orbital name: empty');\n }\n if (name.includes('/') || name.includes('\\\\') || name === '.' || name === '..') {\n throw new Error(`orbital name: invalid (${name})`);\n }\n}\n","/**\n * Mint-time templates. Written by `openWorkspace` when minting a fresh\n * workspace. Internal — not exported from the package barrel.\n *\n * The shapes follow @almadar/core's `OrbitalSchema` but are kept here as\n * literal JSON so this package has zero dependency on the std memory\n * orbital definitions.\n *\n * @packageDocumentation\n */\n\nimport type { JsonObject } from '@almadar/core';\n\n/** Empty scaffold for a new generation. */\nexport function createSchemaOrbTemplate(name: string): JsonObject {\n return {\n name,\n version: '1.0.0',\n description: '',\n orbitals: [],\n };\n}\n\n/** User preferences template — minimal seed. */\nexport function createUserOrbTemplate(userId: string): JsonObject {\n return {\n name: 'UserMemory',\n version: '1.0.0',\n description: 'User preferences and learned patterns',\n orbitals: [\n {\n name: 'PreferenceTracking',\n entity: {\n name: 'UserPreference',\n fields: [],\n instances: [\n {\n id: `pref-${userId}`,\n userId,\n },\n ],\n },\n traits: [],\n pages: [],\n },\n ],\n };\n}\n\n/** Project context template. */\nexport function createProjectOrbTemplate(projectName: string, appId?: string): JsonObject {\n return {\n name: 'ProjectMemory',\n version: '1.0.0',\n description: `Domain knowledge for ${projectName}`,\n orbitals: [\n {\n name: 'DomainKnowledge',\n entity: {\n name: 'ProjectContext',\n fields: [],\n instances: [\n {\n id: appId ?? `project-${projectName}`,\n appId: appId ?? '',\n projectName,\n lastUpdatedAt: new Date().toISOString(),\n },\n ],\n },\n traits: [],\n pages: [],\n },\n ],\n };\n}\n\nexport function serializeJson(value: JsonObject): string {\n return JSON.stringify(value, null, 2);\n}\n","/**\n * Thin wrapper around local `git` CLI for workspace-local operations\n * (init, add, commit, tag, push, pull, status). No `node:fs` use here —\n * existence checks ride the backend.\n *\n * @packageDocumentation\n */\n\nimport { execFile } from 'node:child_process';\nimport path from 'node:path';\nimport type { WorkspaceBackend } from './types.js';\n\nexport interface GitStatus {\n clean: boolean;\n staged: string[];\n modified: string[];\n untracked: string[];\n}\n\nexport class GitClient {\n constructor(private readonly cwd: string, private readonly backend: WorkspaceBackend) {}\n\n /** Is the working dir already a git repo? */\n async isRepo(): Promise<boolean> {\n return this.backend.exists(path.join(this.cwd, '.git'));\n }\n\n async init(): Promise<void> {\n if (await this.isRepo()) return;\n await this.exec(['init']);\n await this.exec(['config', 'user.email', 'agent@almadar.io']);\n await this.exec(['config', 'user.name', 'Almadar Agent']);\n }\n\n async addAll(): Promise<void> {\n await this.exec(['add', '-A']);\n }\n\n async commit(message: string): Promise<string | null> {\n try {\n const out = await this.exec(['commit', '-m', message, '--allow-empty-message']);\n const match = out.match(/\\[[\\w/.-]+ ([a-f0-9]+)\\]/);\n return match ? match[1] : null;\n } catch (err: unknown) {\n if (err instanceof Error && err.message.includes('nothing to commit')) return null;\n throw err;\n }\n }\n\n async tag(name: string, message?: string): Promise<void> {\n const args = ['tag'];\n if (message) {\n args.push('-a', name, '-m', message);\n } else {\n args.push(name);\n }\n await this.exec(args);\n }\n\n async push(remote = 'origin', branch?: string): Promise<void> {\n const args = ['push', remote];\n if (branch) args.push(branch);\n await this.exec(args);\n }\n\n async pull(remote = 'origin', branch?: string): Promise<void> {\n const args = ['pull', remote];\n if (branch) args.push(branch);\n await this.exec(args);\n }\n\n async hasRemote(remote = 'origin'): Promise<boolean> {\n try {\n const out = await this.exec(['remote']);\n return out.split('\\n').map(s => s.trim()).includes(remote);\n } catch {\n return false;\n }\n }\n\n async addRemote(remote: string, url: string): Promise<void> {\n await this.exec(['remote', 'add', remote, url]);\n }\n\n async status(): Promise<GitStatus> {\n const out = await this.exec(['status', '--porcelain']);\n const lines = out.split('\\n').filter(Boolean);\n const staged: string[] = [];\n const modified: string[] = [];\n const untracked: string[] = [];\n for (const line of lines) {\n const index = line[0];\n const work = line[1];\n const file = line.slice(3);\n if (index === '?' && work === '?') untracked.push(file);\n else if (index !== ' ' && index !== '?') staged.push(file);\n else if (work !== ' ') modified.push(file);\n }\n return { clean: lines.length === 0, staged, modified, untracked };\n }\n\n async headSha(): Promise<string | null> {\n try {\n const out = await this.exec(['rev-parse', 'HEAD']);\n return out.trim() || null;\n } catch {\n return null;\n }\n }\n\n private exec(args: string[]): Promise<string> {\n return execGit(args, this.cwd);\n }\n}\n\nfunction execGit(args: string[], cwd: string): Promise<string> {\n return new Promise((resolve, reject) => {\n execFile('git', args, { cwd, maxBuffer: 10 * 1024 * 1024 }, (err, stdout, stderr) => {\n if (err) {\n const message = stderr?.trim() || stdout?.trim() || err.message;\n reject(new Error(`git ${args[0]}: ${message}`));\n return;\n }\n resolve(stdout);\n });\n });\n}\n","/**\n * Internal lifecycle helpers used by `openWorkspace` on mint/adopt/resume.\n *\n * - Create the workspace directory skeleton.\n * - Write mint-time templates (schema.orb, user.orb, project.orb) if missing.\n * - Initialize git when `github` is supplied.\n *\n * No `node:fs` use here — everything rides the backend.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { WorkspaceBackend } from './types.js';\nimport {\n WORKSPACE_LAYOUT,\n coordinatorDir,\n orbitalSessionDir,\n schemaFile,\n} from './path-layout.js';\nimport {\n createSchemaOrbTemplate,\n createUserOrbTemplate,\n createProjectOrbTemplate,\n serializeJson,\n} from './templates.js';\nimport { GitClient } from './git-client.js';\n\n/** Make sure every workspace dir exists. */\nexport async function ensureSkeleton(\n backend: WorkspaceBackend,\n workDir: string,\n): Promise<void> {\n await backend.mkdir(workDir, { recursive: true });\n await backend.mkdir(path.join(workDir, WORKSPACE_LAYOUT.ALMADAR_DIR), { recursive: true });\n await backend.mkdir(path.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR), { recursive: true });\n await backend.mkdir(path.join(workDir, WORKSPACE_LAYOUT.SESSIONS_DIR), { recursive: true });\n await backend.mkdir(coordinatorDir(workDir), { recursive: true });\n}\n\n/** Initialise per-orbital session dir lazily. */\nexport async function ensureOrbitalSessionDir(\n backend: WorkspaceBackend,\n workDir: string,\n orbital: string,\n): Promise<void> {\n await backend.mkdir(orbitalSessionDir(workDir, orbital), { recursive: true });\n}\n\n/** Write mint-time templates only when they don't exist. */\nexport async function writeMintTemplatesIfMissing(\n backend: WorkspaceBackend,\n workDir: string,\n userId: string,\n projectName: string,\n appId?: string,\n): Promise<void> {\n const schemaPath = schemaFile(workDir);\n if (!backend.exists(schemaPath)) {\n await backend.writeFile(schemaPath, serializeJson(createSchemaOrbTemplate(projectName)));\n }\n const userPath = path.join(workDir, WORKSPACE_LAYOUT.USER_MEMORY);\n if (!backend.exists(userPath)) {\n await backend.writeFile(userPath, serializeJson(createUserOrbTemplate(userId)));\n }\n const projectPath = path.join(workDir, WORKSPACE_LAYOUT.PROJECT_MEMORY);\n if (!backend.exists(projectPath)) {\n await backend.writeFile(\n projectPath,\n serializeJson(createProjectOrbTemplate(projectName, appId)),\n );\n }\n}\n\n/** Initialise git for the workspace if it isn't already a repo. */\nexport async function ensureGitInit(\n backend: WorkspaceBackend,\n workDir: string,\n): Promise<GitClient> {\n const git = new GitClient(workDir, backend);\n await git.init();\n return git;\n}\n","/**\n * Lifecycle helpers — read + write the per-workspace app marker, and\n * scan a user's workspace root for one that matches a known `appId`.\n *\n * No `node:fs` here — everything rides the backend.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { JsonObject } from '@almadar/core';\nimport type { WorkspaceBackend, AppMarker } from './types.js';\nimport { appMarkerFile } from './path-layout.js';\n\n/** Synchronous read — used during resolution before the service is built. */\nexport function readAppMarker(backend: WorkspaceBackend, workDir: string): AppMarker | null {\n const markerPath = appMarkerFile(workDir);\n if (!backend.exists(markerPath)) return null;\n try {\n const raw = backend.readFileSync(markerPath);\n const parsed = JSON.parse(raw) as JsonObject;\n if (\n typeof parsed.appId !== 'string'\n || typeof parsed.userId !== 'string'\n || typeof parsed.createdAt !== 'number'\n ) {\n return null;\n }\n const marker: AppMarker = {\n appId: parsed.appId,\n userId: parsed.userId,\n createdAt: parsed.createdAt,\n };\n if (typeof parsed.repoUrl === 'string') marker.repoUrl = parsed.repoUrl;\n return marker;\n } catch {\n return null;\n }\n}\n\n/** Write the marker. Caller ensures the `.almadar/` dir exists. */\nexport async function writeAppMarker(\n backend: WorkspaceBackend,\n workDir: string,\n marker: AppMarker,\n): Promise<void> {\n const markerPath = appMarkerFile(workDir);\n await backend.mkdir(path.dirname(markerPath), { recursive: true });\n await backend.writeFile(markerPath, JSON.stringify(marker, null, 2));\n}\n\n/**\n * Scan `<workspacesRoot>/<userId>/` for a session dir whose\n * `.almadar/app-marker.json` matches `appId`. Returns null on miss.\n */\nexport async function findLocalWorkspaceDir(\n backend: WorkspaceBackend,\n workspacesRoot: string,\n userId: string,\n appId: string,\n): Promise<string | null> {\n const userDir = path.join(workspacesRoot, userId);\n if (!backend.exists(userDir)) return null;\n\n let entries: string[];\n try {\n entries = await backend.readdir(userDir);\n } catch {\n return null;\n }\n\n for (const entry of entries) {\n const sessionDir = path.join(userDir, entry);\n let isDir = false;\n try {\n const s = await backend.stat(sessionDir);\n isDir = s.isDirectory;\n } catch {\n continue;\n }\n if (!isDir) continue;\n const marker = readAppMarker(backend, sessionDir);\n if (marker && marker.appId === appId) return sessionDir;\n }\n return null;\n}\n\n/** Compose a fresh session dir under `<workspacesRoot>/<userId>/`. */\nexport function mintSessionDir(workspacesRoot: string, userId: string): string {\n const ts = new Date().toISOString().slice(0, 10);\n const suffix = Date.now().toString(36);\n return path.join(workspacesRoot, userId, `${ts}_${suffix}`);\n}\n","/**\n * Restore an empty/missing workspace from a `RestoreBackend`.\n *\n * Used by `openWorkspace` when `opts.appId` is set, the local cache\n * misses, and `opts.restore` is supplied. Writes via the backend (so no\n * `node:fs` here).\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { RestoreBackend } from '../types.js';\nimport type { WorkspaceBackend } from './types.js';\n\nexport interface RestoreResult {\n filesRestored: number;\n bytesWritten: number;\n}\n\n/** Pull every file the backend knows about and write it under `rootDir`. */\nexport async function restoreWorkspace(\n backend: WorkspaceBackend,\n rootDir: string,\n restore: RestoreBackend,\n): Promise<RestoreResult> {\n const rootAbs = path.resolve(rootDir);\n await backend.mkdir(rootAbs, { recursive: true });\n\n const paths = await restore.listFiles();\n let filesRestored = 0;\n let bytesWritten = 0;\n\n for (const relativePath of paths) {\n const normalised = relativePath.replace(/\\\\/g, '/');\n const target = path.resolve(rootAbs, normalised);\n if (target !== rootAbs && !target.startsWith(rootAbs + path.sep)) {\n // Escape attempt — drop.\n continue;\n }\n const content = await restore.readFile(normalised);\n if (content === null) continue;\n await backend.mkdir(path.dirname(target), { recursive: true });\n await backend.writeFile(target, content);\n filesRestored++;\n bytesWritten += Buffer.byteLength(content, 'utf-8');\n }\n\n return { filesRestored, bytesWritten };\n}\n","/**\n * Memory-file helpers used internally by the service.\n *\n * @packageDocumentation\n */\n\nimport type { JsonObject } from '@almadar/core';\nimport type { WorkspaceBackend } from './types.js';\n\n/**\n * Try to read JSON from `absPath` via the backend. Returns `null` when\n * the file is missing or unparseable.\n */\nexport async function readJsonFile<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n): Promise<T | null> {\n if (!backend.exists(absPath)) return null;\n try {\n const raw = await backend.readFile(absPath);\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * Write a JSON object via the backend with 2-space pretty-printing.\n */\nexport async function writeJsonFile<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n value: T,\n): Promise<void> {\n await backend.writeFile(absPath, JSON.stringify(value, null, 2));\n}\n\n/**\n * Read newline-delimited JSON. Drops malformed lines silently.\n */\nexport async function readJsonLines<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n): Promise<T[]> {\n if (!backend.exists(absPath)) return [];\n try {\n const raw = await backend.readFile(absPath);\n const out: T[] = [];\n for (const line of raw.split('\\n')) {\n if (!line.trim()) continue;\n try {\n out.push(JSON.parse(line) as T);\n } catch {\n // skip malformed\n }\n }\n return out;\n } catch {\n return [];\n }\n}\n\n/**\n * Append a single JSON value as a line. Used for trace + history streams.\n * Caller is responsible for any per-path serialization (the service's\n * write queue handles that).\n */\nexport async function appendJsonLine<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n value: T,\n): Promise<void> {\n const existing = backend.exists(absPath) ? await backend.readFile(absPath) : '';\n const ending = existing.length > 0 && !existing.endsWith('\\n') ? '\\n' : '';\n await backend.writeFile(absPath, existing + ending + JSON.stringify(value) + '\\n');\n}\n","/**\n * `WorkspaceService` implementation. The single chokepoint — every read\n * and write that any consumer performs lands here, computes its absolute\n * path via `path-layout.ts`, runs the backend op, then fans out a typed\n * `WorkspaceWriteEvent` to every registered observer.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { JsonObject, JsonValue } from '@almadar/core';\nimport type {\n FileTreeNode,\n GitHubConfig,\n GitStatusInfo,\n WorkspaceObserver,\n WorkspaceService,\n WorkspaceWriteEvent,\n} from './types.js';\nimport type { WorkspaceBackend } from './internal/types.js';\nimport { SinkManager } from './internal/sink-manager.js';\nimport { GitClient } from './internal/git-client.js';\nimport {\n archivedOrbitalFile,\n assertOrbitalName,\n compiledDir,\n compiledFile,\n coordinatorFile,\n orbitalFile,\n orbitalSessionFile,\n sandboxedPath,\n schemaFile,\n traceFile,\n WORKSPACE_LAYOUT,\n} from './internal/path-layout.js';\nimport {\n ensureOrbitalSessionDir,\n} from './internal/workspace-manager.js';\nimport {\n appendJsonLine,\n readJsonFile,\n readJsonLines,\n writeJsonFile,\n} from './internal/memory-files.js';\n\ninterface ServiceCtorArgs {\n workDir: string;\n backend: WorkspaceBackend;\n sinks: SinkManager;\n appId?: string;\n git?: GitClient;\n github?: GitHubConfig;\n}\n\nconst COORD_FILES = {\n analysis: 'analysis.json',\n plan: 'plan.json',\n clarifications: 'clarifications.json',\n messages: 'messages.json',\n} as const;\n\nconst ORBITAL_FILES = {\n spec: 'spec.json',\n memory: 'memory.json',\n history: 'history.jsonl',\n paramsHistory: 'params-history.jsonl',\n errors: 'errors.json',\n messages: 'messages.json',\n} as const;\n\nexport class WorkspaceServiceImpl implements WorkspaceService {\n readonly workDir: string;\n private _appId: string | undefined;\n private readonly backend: WorkspaceBackend;\n private readonly sinks: SinkManager;\n private readonly git: GitClient | undefined;\n private readonly github: GitHubConfig | undefined;\n /** Per-absolute-path serial queue. */\n private readonly writeQueue = new Map<string, Promise<void>>();\n\n constructor(args: ServiceCtorArgs) {\n this.workDir = args.workDir;\n this.backend = args.backend;\n this.sinks = args.sinks;\n this._appId = args.appId;\n this.git = args.git;\n this.github = args.github;\n }\n\n // === Identity ===\n\n get appId(): string | undefined {\n return this._appId;\n }\n\n setAppId(id: string): void {\n this._appId = id;\n }\n\n // === Helpers ===\n\n /** Run `op` under a per-path serial lock. */\n private withLock<T>(absPath: string, op: () => Promise<T>): Promise<T> {\n const prev = this.writeQueue.get(absPath) ?? Promise.resolve();\n let resolved!: T;\n const next = prev.then(async () => {\n resolved = await op();\n });\n // Best-effort: ensure the queue continues even on failure.\n const swallowed = next.catch(() => undefined);\n this.writeQueue.set(absPath, swallowed);\n return next.then(() => resolved);\n }\n\n /** Make sure the parent directory of `absPath` exists. */\n private async ensureParent(absPath: string): Promise<void> {\n await this.backend.mkdir(path.dirname(absPath), { recursive: true });\n }\n\n private async emit(event: WorkspaceWriteEvent): Promise<void> {\n await this.sinks.notifyAll(event);\n }\n\n // === Orbital artifacts ===\n\n readOrbital(name: string): string | null {\n assertOrbitalName(name);\n const p = orbitalFile(this.workDir, name);\n if (!this.backend.exists(p)) return null;\n try {\n return this.backend.readFileSync(p);\n } catch {\n return null;\n }\n }\n\n async writeOrbital(name: string, content: string): Promise<void> {\n assertOrbitalName(name);\n const p = orbitalFile(this.workDir, name);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, content);\n });\n await this.emit({ kind: 'orbital', name, content });\n }\n\n listOrbitals(): string[] {\n const dir = path.join(this.workDir, WORKSPACE_LAYOUT.ORBITALS_DIR);\n if (!this.backend.exists(dir)) return [];\n try {\n return this.backend.readdirSync(dir)\n .filter(f => f.endsWith('.orb'))\n .map(f => f.replace(/\\.orb$/, ''))\n .sort();\n } catch {\n return [];\n }\n }\n\n async archiveOrbital(name: string): Promise<void> {\n assertOrbitalName(name);\n const src = orbitalFile(this.workDir, name);\n if (!this.backend.exists(src)) return;\n const content = await this.backend.readFile(src);\n const dst = archivedOrbitalFile(this.workDir, name);\n await this.withLock(src, async () => {\n await this.ensureParent(dst);\n await this.backend.writeFile(dst, content);\n await this.backend.unlink(src);\n });\n await this.emit({ kind: 'orbital-archived', name });\n }\n\n async renameOrbital(from: string, to: string): Promise<void> {\n assertOrbitalName(from);\n assertOrbitalName(to);\n const src = orbitalFile(this.workDir, from);\n const dst = orbitalFile(this.workDir, to);\n if (!this.backend.exists(src)) return;\n const content = await this.backend.readFile(src);\n await this.withLock(src, async () => {\n await this.ensureParent(dst);\n await this.backend.writeFile(dst, content);\n await this.backend.unlink(src);\n });\n await this.emit({ kind: 'orbital-renamed', from, to });\n }\n\n // === Schema artifact ===\n\n readSchema(): string | null {\n const p = schemaFile(this.workDir);\n if (!this.backend.exists(p)) return null;\n try {\n return this.backend.readFileSync(p);\n } catch {\n return null;\n }\n }\n\n async writeSchema(content: string): Promise<void> {\n const p = schemaFile(this.workDir);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, content);\n });\n await this.emit({ kind: 'schema', content });\n }\n\n // === Coordinator session ===\n\n readAnalysis<T extends JsonObject>(): T | null {\n return readJsonFileSync<T>(this.backend, coordinatorFile(this.workDir, COORD_FILES.analysis));\n }\n\n async writeAnalysis<T extends JsonObject>(analysis: T): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.analysis);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await writeJsonFile(this.backend, p, analysis);\n });\n await this.emit({ kind: 'analysis', content: analysis });\n }\n\n readPlan<T extends JsonObject>(): T | null {\n return readJsonFileSync<T>(this.backend, coordinatorFile(this.workDir, COORD_FILES.plan));\n }\n\n async writePlan<T extends JsonObject>(plan: T): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.plan);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await writeJsonFile(this.backend, p, plan);\n });\n await this.emit({ kind: 'plan', content: plan });\n }\n\n readClarificationAnswers(): Record<string, string> {\n const p = coordinatorFile(this.workDir, COORD_FILES.clarifications);\n if (!this.backend.exists(p)) return {};\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p)) as JsonObject;\n const out: Record<string, string> = {};\n for (const k of Object.keys(parsed)) {\n const v = parsed[k];\n if (typeof v === 'string') out[k] = v;\n }\n return out;\n } catch {\n return {};\n }\n }\n\n async writeClarificationAnswers(answers: Record<string, string>): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.clarifications);\n const asJson: JsonObject = { ...answers };\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await writeJsonFile(this.backend, p, asJson);\n });\n await this.emit({ kind: 'clarifications', content: answers });\n }\n\n readCoordinatorMessages<T extends JsonValue>(): T[] | null {\n const p = coordinatorFile(this.workDir, COORD_FILES.messages);\n if (!this.backend.exists(p)) return null;\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p));\n if (!Array.isArray(parsed)) return null;\n return parsed as T[];\n } catch {\n return null;\n }\n }\n\n async writeCoordinatorMessages<T extends JsonValue>(messages: T[]): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.messages);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, JSON.stringify(messages, null, 2));\n });\n await this.emit({ kind: 'coordinator-messages', content: messages as JsonValue[] });\n }\n\n // === Per-orbital session ===\n\n private orbitalFile(orbital: string, basename: string): string {\n assertOrbitalName(orbital);\n return orbitalSessionFile(this.workDir, orbital, basename);\n }\n\n readSpec<T extends JsonObject>(orbital: string): T | null {\n return readJsonFileSync<T>(this.backend, this.orbitalFile(orbital, ORBITAL_FILES.spec));\n }\n\n async writeSpec<T extends JsonObject>(orbital: string, spec: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.spec);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await writeJsonFile(this.backend, p, spec);\n });\n await this.emit({ kind: 'spec', orbital, content: spec });\n }\n\n readMemory<T extends JsonObject>(orbital: string): T | null {\n return readJsonFileSync<T>(this.backend, this.orbitalFile(orbital, ORBITAL_FILES.memory));\n }\n\n async writeMemory<T extends JsonObject>(orbital: string, memory: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.memory);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await writeJsonFile(this.backend, p, memory);\n });\n await this.emit({ kind: 'memory', orbital, content: memory });\n }\n\n async appendHistory<T extends JsonObject>(orbital: string, entry: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.history);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await appendJsonLine(this.backend, p, entry);\n });\n await this.emit({ kind: 'history', orbital, entry });\n }\n\n readHistory<T extends JsonObject>(orbital: string): T[] {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.history);\n return readJsonLinesSync<T>(this.backend, p);\n }\n\n async appendParamsHistory<T extends JsonObject>(orbital: string, row: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.paramsHistory);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await appendJsonLine(this.backend, p, row);\n });\n await this.emit({ kind: 'params-history', orbital, row });\n }\n\n readErrors<T extends JsonObject>(orbital: string): T[] {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.errors);\n if (!this.backend.exists(p)) return [];\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p));\n if (!Array.isArray(parsed)) return [];\n return parsed as T[];\n } catch {\n return [];\n }\n }\n\n async writeErrors<T extends JsonObject>(orbital: string, errors: T[]): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.errors);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await this.backend.writeFile(p, JSON.stringify(errors, null, 2));\n });\n await this.emit({ kind: 'errors', orbital, content: errors });\n }\n\n readSubagentMessages<T extends JsonValue>(orbital: string): T[] | null {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.messages);\n if (!this.backend.exists(p)) return null;\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p));\n if (!Array.isArray(parsed)) return null;\n return parsed as T[];\n } catch {\n return null;\n }\n }\n\n async writeSubagentMessages<T extends JsonValue>(\n orbital: string,\n messages: T[],\n ): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.messages);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await this.backend.writeFile(p, JSON.stringify(messages, null, 2));\n });\n await this.emit({ kind: 'subagent-messages', orbital, content: messages as JsonValue[] });\n }\n\n // === Trace ===\n\n async emitTrace<T extends JsonObject>(event: T): Promise<void> {\n const p = traceFile(this.workDir);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await appendJsonLine(this.backend, p, event);\n });\n await this.emit({ kind: 'trace', event });\n }\n\n readTrace<T extends JsonObject>(): T[] {\n const p = traceFile(this.workDir);\n return readJsonLinesSync<T>(this.backend, p);\n }\n\n // === Compiled output ===\n\n async writeCompiled(relPath: string, content: string): Promise<void> {\n if (relPath.includes('..') || path.isAbsolute(relPath)) {\n throw new Error(`compiled: invalid relPath (${relPath})`);\n }\n const p = compiledFile(this.workDir, relPath);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, content);\n });\n await this.emit({ kind: 'compiled', relPath, content });\n }\n\n readCompiled(relPath: string): string | null {\n if (relPath.includes('..') || path.isAbsolute(relPath)) return null;\n const p = compiledFile(this.workDir, relPath);\n if (!this.backend.exists(p)) return null;\n try {\n return this.backend.readFileSync(p);\n } catch {\n return null;\n }\n }\n\n async clearCompiled(): Promise<void> {\n const dir = compiledDir(this.workDir);\n if (!this.backend.exists(dir)) return;\n await removeTree(this.backend, dir);\n }\n\n // === Sandboxed generic file I/O ===\n\n async readFile(relPath: string): Promise<string | null> {\n const abs = sandboxedPath(this.workDir, relPath);\n if (!this.backend.exists(abs)) return null;\n try {\n return await this.backend.readFile(abs);\n } catch {\n return null;\n }\n }\n\n async writeFile(relPath: string, content: string): Promise<void> {\n const abs = sandboxedPath(this.workDir, relPath);\n await this.withLock(abs, async () => {\n await this.ensureParent(abs);\n await this.backend.writeFile(abs, content);\n });\n await this.emit({ kind: 'file', relPath, content });\n }\n\n async listTree(relPath?: string): Promise<FileTreeNode[]> {\n const base = relPath === undefined ? this.workDir : sandboxedPath(this.workDir, relPath);\n if (!this.backend.exists(base)) return [];\n const out: FileTreeNode[] = [];\n await walk(this.backend, base, this.workDir, out);\n return out;\n }\n\n async exists(relPath: string): Promise<boolean> {\n let abs: string;\n try {\n abs = sandboxedPath(this.workDir, relPath);\n } catch {\n return false;\n }\n return this.backend.exists(abs);\n }\n\n // === Git ===\n\n async commitAndPush(opts: {\n message: string;\n tags?: string[];\n }): Promise<{ sha: string } | null> {\n if (!this.git) return null;\n await this.git.addAll();\n const sha = await this.git.commit(opts.message);\n if (sha === null) return null;\n if (opts.tags) {\n for (const t of opts.tags) await this.git.tag(t);\n }\n if (this.github && this.github.repoUrl) {\n if (!(await this.git.hasRemote('origin'))) {\n await this.git.addRemote('origin', this.github.repoUrl);\n }\n await this.git.push('origin', this.github.branch ?? 'main');\n }\n return { sha };\n }\n\n async pullIfLinked(): Promise<boolean> {\n if (!this.git || !this.github) return false;\n if (!(await this.git.hasRemote('origin'))) return false;\n await this.git.pull('origin', this.github.branch ?? 'main');\n return true;\n }\n\n async gitStatus(): Promise<GitStatusInfo> {\n if (!this.git) {\n return { clean: true, staged: [], modified: [], untracked: [], linked: false };\n }\n const s = await this.git.status();\n const linked = await this.git.hasRemote('origin');\n return { ...s, linked };\n }\n\n // === Observation ===\n\n subscribe(observer: WorkspaceObserver): () => void {\n return this.sinks.subscribe(observer);\n }\n\n // === Disposal ===\n\n async dispose(): Promise<void> {\n // Drain pending writes.\n const pending = Array.from(this.writeQueue.values());\n await Promise.allSettled(pending);\n // Optional final commit when configured.\n if (this.git && this.github) {\n try {\n await this.commitAndPush({ message: 'workspace: dispose' });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`[workspace] dispose: commitAndPush failed: ${msg}`);\n }\n }\n }\n}\n\n// ============================================================================\n// Sync helpers — wrap backend reads with safe JSON parse.\n// ============================================================================\n\nfunction readJsonFileSync<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n): T | null {\n if (!backend.exists(absPath)) return null;\n try {\n return JSON.parse(backend.readFileSync(absPath)) as T;\n } catch {\n return null;\n }\n}\n\nfunction readJsonLinesSync<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n): T[] {\n if (!backend.exists(absPath)) return [];\n try {\n const raw = backend.readFileSync(absPath);\n const out: T[] = [];\n for (const line of raw.split('\\n')) {\n if (!line.trim()) continue;\n try {\n out.push(JSON.parse(line) as T);\n } catch {\n // skip\n }\n }\n return out;\n } catch {\n return [];\n }\n}\n\nasync function walk(\n backend: WorkspaceBackend,\n dir: string,\n root: string,\n out: FileTreeNode[],\n): Promise<void> {\n const entries = await backend.readdir(dir);\n for (const name of entries) {\n const full = path.join(dir, name);\n const s = await backend.stat(full);\n const rel = path.relative(root, full).split(path.sep).join('/');\n if (s.isDirectory) {\n out.push({ path: rel, type: 'directory', size: 0 });\n await walk(backend, full, root, out);\n } else {\n out.push({ path: rel, type: 'file', size: s.size });\n }\n }\n}\n\nasync function removeTree(backend: WorkspaceBackend, dir: string): Promise<void> {\n const entries = await backend.readdir(dir);\n for (const name of entries) {\n const full = path.join(dir, name);\n let isDir = false;\n try {\n isDir = (await backend.stat(full)).isDirectory;\n } catch {\n continue;\n }\n if (isDir) {\n await removeTree(backend, full);\n } else {\n try {\n await backend.unlink(full);\n } catch {\n // ignore\n }\n }\n }\n}\n","/**\n * `openWorkspace` — single entry point for every consumer.\n *\n * Resolves the workspace lifecycle (adopt → resume → restore → clone →\n * mint), constructs the backend + sink manager + git client, writes\n * templates on mint, and returns a fully wired `WorkspaceService`.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { OpenWorkspaceOptions, WorkspaceService } from './types.js';\nimport type { WorkspaceBackend, AppMarker } from './internal/types.js';\nimport { LocalBackend } from './internal/backends/local.js';\nimport { MemoryBackend } from './internal/backends/memory.js';\nimport { SinkManager } from './internal/sink-manager.js';\nimport {\n ensureGitInit,\n ensureSkeleton,\n writeMintTemplatesIfMissing,\n} from './internal/workspace-manager.js';\nimport {\n findLocalWorkspaceDir,\n mintSessionDir,\n readAppMarker,\n writeAppMarker,\n} from './internal/workspace-resolver.js';\nimport { restoreWorkspace } from './internal/restore.js';\nimport { WorkspaceServiceImpl } from './service.js';\n\nexport async function openWorkspace(opts: OpenWorkspaceOptions): Promise<WorkspaceService> {\n const backend: WorkspaceBackend = opts.backend === 'memory'\n ? new MemoryBackend()\n : new LocalBackend();\n const sinks = new SinkManager();\n\n const resolved = await resolveLifecycle(backend, opts);\n\n await ensureSkeleton(backend, resolved.workDir);\n await writeMintTemplatesIfMissing(\n backend,\n resolved.workDir,\n opts.userId,\n opts.projectName ?? 'Untitled',\n resolved.appId,\n );\n\n // App marker — pin appId to dir when known.\n if (resolved.appId !== undefined) {\n const existing = readAppMarker(backend, resolved.workDir);\n if (!existing || existing.appId !== resolved.appId) {\n const marker: AppMarker = {\n appId: resolved.appId,\n userId: opts.userId,\n createdAt: existing?.createdAt ?? Date.now(),\n };\n if (opts.github?.repoUrl) marker.repoUrl = opts.github.repoUrl;\n await writeAppMarker(backend, resolved.workDir, marker);\n }\n }\n\n // Git initialisation only on local backend; memory backend skips git.\n let git;\n if (opts.github && opts.backend !== 'memory') {\n git = await ensureGitInit(backend, resolved.workDir);\n }\n\n return new WorkspaceServiceImpl({\n workDir: resolved.workDir,\n backend,\n sinks,\n appId: resolved.appId,\n git,\n github: opts.github,\n });\n}\n\ninterface ResolvedLifecycle {\n workDir: string;\n appId: string | undefined;\n}\n\nasync function resolveLifecycle(\n backend: WorkspaceBackend,\n opts: OpenWorkspaceOptions,\n): Promise<ResolvedLifecycle> {\n // 1. adopt — caller hands us a directory.\n if (opts.adopt) {\n const workDir = path.resolve(opts.adopt);\n const marker = readAppMarker(backend, workDir);\n return { workDir, appId: marker?.appId ?? opts.appId };\n }\n\n // 2. resume from disk — appId set + we can find a marker locally.\n if (opts.appId) {\n const local = await findLocalWorkspaceDir(\n backend,\n opts.root,\n opts.userId,\n opts.appId,\n );\n if (local) return { workDir: local, appId: opts.appId };\n }\n\n // 3. restore-from-backend — appId set + local miss + restore supplied.\n if (opts.appId && opts.restore) {\n const workDir = mintSessionDir(opts.root, opts.userId);\n await backend.mkdir(workDir, { recursive: true });\n await restoreWorkspace(backend, workDir, opts.restore);\n return { workDir, appId: opts.appId };\n }\n\n // 4. github clone — appId set + local miss + no restore + github cfg.\n if (opts.appId && opts.github && opts.github.repoUrl) {\n const workDir = mintSessionDir(opts.root, opts.userId);\n await backend.mkdir(workDir, { recursive: true });\n // Defer the actual clone to the consumer's git plumbing — we record\n // the marker and let `pullIfLinked` / `commitAndPush` drive remote\n // sync. Cloning requires shell access and we already have a thin git\n // client; emit a placeholder marker and let the consumer drive.\n return { workDir, appId: opts.appId };\n }\n\n // 5. mint fresh — anonymous workspace, appId may be promoted later.\n const workDir = mintSessionDir(opts.root, opts.userId);\n return { workDir, appId: opts.appId };\n}\n"]}
1
+ {"version":3,"sources":["../src/internal/backends/local.ts","../src/internal/backends/memory.ts","../src/internal/sink-manager.ts","../src/internal/path-layout.ts","../src/internal/templates.ts","../src/internal/git-client.ts","../src/internal/workspace-manager.ts","../src/internal/workspace-resolver.ts","../src/internal/restore.ts","../src/internal/memory-files.ts","../src/service.ts","../src/open-workspace.ts"],"names":["path","workDir"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Local filesystem backend. The ONLY place `node:fs` is permitted.\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport type { WorkspaceBackend } from '../types.js';\n\nexport class LocalBackend implements WorkspaceBackend {\n async readFile(absPath: string): Promise<string> {\n return fs.promises.readFile(absPath, 'utf-8');\n }\n readFileSync(absPath: string): string {\n return fs.readFileSync(absPath, 'utf-8');\n }\n async writeFile(absPath: string, content: string): Promise<void> {\n // Auto-mkdir parent — callers don't pre-create the directory structure.\n // Without this, a write to a fresh path (e.g. the first\n // `.almadar/trace.jsonl` write after mint) ENOENTs.\n await fs.promises.mkdir(path.dirname(absPath), { recursive: true });\n await fs.promises.writeFile(absPath, content, 'utf-8');\n }\n writeFileSync(absPath: string, content: string): void {\n fs.mkdirSync(path.dirname(absPath), { recursive: true });\n fs.writeFileSync(absPath, content, 'utf-8');\n }\n exists(absPath: string): boolean {\n return fs.existsSync(absPath);\n }\n async readdir(absPath: string): Promise<string[]> {\n return fs.promises.readdir(absPath);\n }\n readdirSync(absPath: string): string[] {\n return fs.readdirSync(absPath);\n }\n async mkdir(absPath: string, opts?: { recursive?: boolean }): Promise<void> {\n await fs.promises.mkdir(absPath, opts);\n }\n mkdirSync(absPath: string, opts?: { recursive?: boolean }): void {\n fs.mkdirSync(absPath, opts);\n }\n async unlink(absPath: string): Promise<void> {\n await fs.promises.unlink(absPath);\n }\n async stat(\n absPath: string,\n ): Promise<{ size: number; mtimeMs: number; isDirectory: boolean }> {\n const s = await fs.promises.stat(absPath);\n return { size: s.size, mtimeMs: s.mtimeMs, isDirectory: s.isDirectory() };\n }\n async rename(srcAbs: string, dstAbs: string): Promise<void> {\n await fs.promises.mkdir(path.dirname(dstAbs), { recursive: true });\n await fs.promises.rename(srcAbs, dstAbs);\n }\n}\n","/**\n * In-memory backend for tests and sandboxed evals. No `node:fs`.\n */\nimport type { WorkspaceBackend } from '../types.js';\n\nexport class MemoryBackend implements WorkspaceBackend {\n private files = new Map<string, string>();\n private dirs = new Set<string>();\n\n async readFile(absPath: string): Promise<string> {\n return this.readFileSync(absPath);\n }\n readFileSync(absPath: string): string {\n const content = this.files.get(absPath);\n if (content === undefined) throw new Error(`ENOENT: ${absPath}`);\n return content;\n }\n async writeFile(absPath: string, content: string): Promise<void> {\n this.writeFileSync(absPath, content);\n }\n writeFileSync(absPath: string, content: string): void {\n this.files.set(absPath, content);\n }\n exists(absPath: string): boolean {\n if (this.files.has(absPath) || this.dirs.has(absPath)) return true;\n // Treat any prefix that has children as an existing dir.\n const prefix = absPath.endsWith('/') ? absPath : absPath + '/';\n for (const k of this.files.keys()) {\n if (k.startsWith(prefix)) return true;\n }\n return false;\n }\n async readdir(absPath: string): Promise<string[]> {\n return this.readdirSync(absPath);\n }\n readdirSync(absPath: string): string[] {\n const prefix = absPath.endsWith('/') ? absPath : absPath + '/';\n const entries = new Set<string>();\n for (const key of this.files.keys()) {\n if (key.startsWith(prefix)) {\n const rest = key.slice(prefix.length);\n const firstSegment = rest.split('/')[0];\n if (firstSegment) entries.add(firstSegment);\n }\n }\n return Array.from(entries);\n }\n async mkdir(absPath: string): Promise<void> {\n this.mkdirSync(absPath);\n }\n mkdirSync(absPath: string): void {\n this.dirs.add(absPath);\n }\n async unlink(absPath: string): Promise<void> {\n this.files.delete(absPath);\n }\n async stat(\n absPath: string,\n ): Promise<{ size: number; mtimeMs: number; isDirectory: boolean }> {\n const content = this.files.get(absPath);\n if (content !== undefined) {\n return { size: content.length, mtimeMs: Date.now(), isDirectory: false };\n }\n // Treat as directory if anything sits under it.\n if (this.dirs.has(absPath)) return { size: 0, mtimeMs: Date.now(), isDirectory: true };\n const prefix = absPath.endsWith('/') ? absPath : absPath + '/';\n for (const k of this.files.keys()) {\n if (k.startsWith(prefix)) return { size: 0, mtimeMs: Date.now(), isDirectory: true };\n }\n throw new Error(`ENOENT: ${absPath}`);\n }\n async rename(srcAbs: string, dstAbs: string): Promise<void> {\n // File case — direct key swap.\n const fileContent = this.files.get(srcAbs);\n if (fileContent !== undefined) {\n this.files.delete(srcAbs);\n this.files.set(dstAbs, fileContent);\n return;\n }\n // Directory case — every file whose key starts with `srcAbs/` migrates\n // to the matching position under `dstAbs/`. Empty dirs (only present\n // in `this.dirs`) also migrate.\n const srcPrefix = srcAbs.endsWith('/') ? srcAbs : srcAbs + '/';\n const dstPrefix = dstAbs.endsWith('/') ? dstAbs : dstAbs + '/';\n const migrations: Array<[string, string]> = [];\n for (const key of this.files.keys()) {\n if (key.startsWith(srcPrefix)) {\n migrations.push([key, dstPrefix + key.slice(srcPrefix.length)]);\n }\n }\n for (const [oldKey, newKey] of migrations) {\n const content = this.files.get(oldKey);\n if (content !== undefined) {\n this.files.delete(oldKey);\n this.files.set(newKey, content);\n }\n }\n const dirsToMigrate: string[] = [];\n for (const dir of this.dirs) {\n if (dir === srcAbs || dir.startsWith(srcPrefix)) dirsToMigrate.push(dir);\n }\n for (const oldDir of dirsToMigrate) {\n this.dirs.delete(oldDir);\n const newDir = oldDir === srcAbs ? dstAbs : dstPrefix + oldDir.slice(srcPrefix.length);\n this.dirs.add(newDir);\n }\n }\n\n // Test helpers\n getAll(): Map<string, string> {\n return new Map(this.files);\n }\n clear(): void {\n this.files.clear();\n this.dirs.clear();\n }\n}\n","/**\n * Internal SinkManager — fans `WorkspaceWriteEvent` out to every\n * registered `WorkspaceObserver`. A slow / hung observer does not crash\n * the writer; results are collected via `Promise.allSettled`.\n *\n * @packageDocumentation\n */\n\nimport type { WorkspaceObserver, WorkspaceWriteEvent } from '../types.js';\n\nexport class SinkManager {\n private readonly observers: WorkspaceObserver[] = [];\n\n /** Register an observer; returns an unsubscribe function. */\n subscribe(observer: WorkspaceObserver): () => void {\n this.observers.push(observer);\n return () => {\n const i = this.observers.indexOf(observer);\n if (i >= 0) this.observers.splice(i, 1);\n };\n }\n\n /** Snapshot of observer count — useful for diagnostics. */\n get observerCount(): number {\n return this.observers.length;\n }\n\n /**\n * Notify all observers in parallel. Awaits all settlements. A rejected\n * observer is captured in the result; subsequent writes still proceed.\n */\n async notifyAll(event: WorkspaceWriteEvent): Promise<void> {\n if (this.observers.length === 0) return;\n const settled = await Promise.allSettled(\n this.observers.map(async o => o.onWrite(event)),\n );\n for (const r of settled) {\n if (r.status === 'rejected') {\n // Observer failure must not surface as a write failure, but it is\n // useful to keep visible. Console-only so the package stays\n // logger-agnostic.\n const reason = r.reason instanceof Error ? r.reason.message : String(r.reason);\n console.error(`[workspace] observer error on ${event.kind}: ${reason}`);\n }\n }\n }\n}\n","/**\n * Path discipline — every absolute path the service uses is computed here.\n *\n * Consumers never construct paths. Public methods take logical names; the\n * service calls into this module to resolve them. Trusted internal paths\n * (orbital files, session files) use `path.join` directly; sandboxed\n * methods (`readFile` / `writeFile`) go through `sandboxedPath` which\n * rejects traversal.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\n\n/** Single source of truth for workspace directory layout. */\nexport const WORKSPACE_LAYOUT = {\n ALMADAR_DIR: '.almadar',\n ORBITALS_DIR: 'orbitals',\n SESSIONS_DIR: '.almadar/sessions',\n COORDINATOR_DIR: '.almadar/sessions/Coordinator',\n TRACE_FILE: '.almadar/trace.jsonl',\n SCHEMA_FILE: 'schema.orb',\n COMPILED_DIR: 'apps',\n APP_MARKER: '.almadar/app-marker.json',\n USER_MEMORY: '.almadar/user.orb',\n PROJECT_MEMORY: '.almadar/project.orb',\n} as const;\n\n/** Logical orbital name → absolute `.orb` path. */\nexport function orbitalFile(workDir: string, name: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR, `${name}.orb`);\n}\n\n/** Archived orbital path. */\nexport function archivedOrbitalFile(workDir: string, name: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR, '.archived', `${name}.orb`);\n}\n\n/** Schema (combined output) file. */\nexport function schemaFile(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.SCHEMA_FILE);\n}\n\n/** Coordinator session dir. */\nexport function coordinatorDir(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.COORDINATOR_DIR);\n}\n\n/** Coordinator-level artifact path. */\nexport function coordinatorFile(workDir: string, basename: string): string {\n return path.join(coordinatorDir(workDir), basename);\n}\n\n/** Per-orbital session dir. */\nexport function orbitalSessionDir(workDir: string, orbital: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.SESSIONS_DIR, orbital);\n}\n\n/** Per-orbital session-file path. */\nexport function orbitalSessionFile(workDir: string, orbital: string, basename: string): string {\n return path.join(orbitalSessionDir(workDir, orbital), basename);\n}\n\n/** Trace JSONL. */\nexport function traceFile(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.TRACE_FILE);\n}\n\n/** Compiled output base. */\nexport function compiledDir(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.COMPILED_DIR);\n}\n\n/** Compiled-output path for a given relative key. */\nexport function compiledFile(workDir: string, relPath: string): string {\n return path.join(compiledDir(workDir), relPath);\n}\n\n/** App marker — used internally by the resolver/factory. */\nexport function appMarkerFile(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.APP_MARKER);\n}\n\n/**\n * Resolve a user-supplied relative path within the sandbox. Rejects\n * absolute paths, `..` traversal, and any path that resolves outside\n * `workDir`. Returns the absolute resolved path on success.\n */\nexport function sandboxedPath(workDir: string, relPath: string): string {\n if (typeof relPath !== 'string' || relPath.length === 0) {\n throw new Error('sandbox: empty relative path');\n }\n if (path.isAbsolute(relPath)) {\n throw new Error(`sandbox: absolute paths are not allowed (${relPath})`);\n }\n // Reject Windows-style absolute paths on cross-platform consumers.\n if (/^[a-zA-Z]:[\\\\/]/.test(relPath)) {\n throw new Error(`sandbox: drive-letter paths are not allowed (${relPath})`);\n }\n const rootAbs = path.resolve(workDir);\n const target = path.resolve(rootAbs, relPath);\n if (target !== rootAbs && !target.startsWith(rootAbs + path.sep)) {\n throw new Error(`sandbox: path escapes workspace (${relPath})`);\n }\n return target;\n}\n\n/** Validate an orbital logical name — no path separators, no `..`. */\nexport function assertOrbitalName(name: string): void {\n if (typeof name !== 'string' || name.length === 0) {\n throw new Error('orbital name: empty');\n }\n if (name.includes('/') || name.includes('\\\\') || name === '.' || name === '..') {\n throw new Error(`orbital name: invalid (${name})`);\n }\n}\n","/**\n * Mint-time templates. Written by `openWorkspace` when minting a fresh\n * workspace. Internal — not exported from the package barrel.\n *\n * The shapes follow @almadar/core's `OrbitalSchema` but are kept here as\n * literal JSON so this package has zero dependency on the std memory\n * orbital definitions.\n *\n * @packageDocumentation\n */\n\nimport type { JsonObject } from '@almadar/core';\n\n/** Empty scaffold for a new generation. */\nexport function createSchemaOrbTemplate(name: string): JsonObject {\n return {\n name,\n version: '1.0.0',\n description: '',\n orbitals: [],\n };\n}\n\n/** User preferences template — minimal seed. */\nexport function createUserOrbTemplate(userId: string): JsonObject {\n return {\n name: 'UserMemory',\n version: '1.0.0',\n description: 'User preferences and learned patterns',\n orbitals: [\n {\n name: 'PreferenceTracking',\n entity: {\n name: 'UserPreference',\n fields: [],\n instances: [\n {\n id: `pref-${userId}`,\n userId,\n },\n ],\n },\n traits: [],\n pages: [],\n },\n ],\n };\n}\n\n/** Project context template. */\nexport function createProjectOrbTemplate(projectName: string, appId?: string): JsonObject {\n return {\n name: 'ProjectMemory',\n version: '1.0.0',\n description: `Domain knowledge for ${projectName}`,\n orbitals: [\n {\n name: 'DomainKnowledge',\n entity: {\n name: 'ProjectContext',\n fields: [],\n instances: [\n {\n id: appId ?? `project-${projectName}`,\n appId: appId ?? '',\n projectName,\n lastUpdatedAt: new Date().toISOString(),\n },\n ],\n },\n traits: [],\n pages: [],\n },\n ],\n };\n}\n\nexport function serializeJson(value: JsonObject): string {\n return JSON.stringify(value, null, 2);\n}\n","/**\n * Thin wrapper around local `git` CLI for workspace-local operations\n * (init, add, commit, tag, push, pull, status). No `node:fs` use here —\n * existence checks ride the backend.\n *\n * @packageDocumentation\n */\n\nimport { execFile } from 'node:child_process';\nimport path from 'node:path';\nimport type { WorkspaceBackend } from './types.js';\n\nexport interface GitStatus {\n clean: boolean;\n staged: string[];\n modified: string[];\n untracked: string[];\n}\n\nexport class GitClient {\n constructor(private readonly cwd: string, private readonly backend: WorkspaceBackend) {}\n\n /** Is the working dir already a git repo? */\n async isRepo(): Promise<boolean> {\n return this.backend.exists(path.join(this.cwd, '.git'));\n }\n\n async init(): Promise<void> {\n if (await this.isRepo()) return;\n await this.exec(['init']);\n await this.exec(['config', 'user.email', 'agent@almadar.io']);\n await this.exec(['config', 'user.name', 'Almadar Agent']);\n }\n\n async addAll(): Promise<void> {\n await this.exec(['add', '-A']);\n }\n\n async commit(message: string): Promise<string | null> {\n try {\n const out = await this.exec(['commit', '-m', message, '--allow-empty-message']);\n const match = out.match(/\\[[\\w/.-]+ ([a-f0-9]+)\\]/);\n return match ? match[1] : null;\n } catch (err: unknown) {\n if (err instanceof Error && err.message.includes('nothing to commit')) return null;\n throw err;\n }\n }\n\n async tag(name: string, message?: string): Promise<void> {\n const args = ['tag'];\n if (message) {\n args.push('-a', name, '-m', message);\n } else {\n args.push(name);\n }\n await this.exec(args);\n }\n\n async push(remote = 'origin', branch?: string): Promise<void> {\n const args = ['push', remote];\n if (branch) args.push(branch);\n await this.exec(args);\n }\n\n async pull(remote = 'origin', branch?: string): Promise<void> {\n const args = ['pull', remote];\n if (branch) args.push(branch);\n await this.exec(args);\n }\n\n async hasRemote(remote = 'origin'): Promise<boolean> {\n try {\n const out = await this.exec(['remote']);\n return out.split('\\n').map(s => s.trim()).includes(remote);\n } catch {\n return false;\n }\n }\n\n async addRemote(remote: string, url: string): Promise<void> {\n await this.exec(['remote', 'add', remote, url]);\n }\n\n async status(): Promise<GitStatus> {\n const out = await this.exec(['status', '--porcelain']);\n const lines = out.split('\\n').filter(Boolean);\n const staged: string[] = [];\n const modified: string[] = [];\n const untracked: string[] = [];\n for (const line of lines) {\n const index = line[0];\n const work = line[1];\n const file = line.slice(3);\n if (index === '?' && work === '?') untracked.push(file);\n else if (index !== ' ' && index !== '?') staged.push(file);\n else if (work !== ' ') modified.push(file);\n }\n return { clean: lines.length === 0, staged, modified, untracked };\n }\n\n async headSha(): Promise<string | null> {\n try {\n const out = await this.exec(['rev-parse', 'HEAD']);\n return out.trim() || null;\n } catch {\n return null;\n }\n }\n\n private exec(args: string[]): Promise<string> {\n return execGit(args, this.cwd);\n }\n}\n\nfunction execGit(args: string[], cwd: string): Promise<string> {\n return new Promise((resolve, reject) => {\n execFile('git', args, { cwd, maxBuffer: 10 * 1024 * 1024 }, (err, stdout, stderr) => {\n if (err) {\n const message = stderr?.trim() || stdout?.trim() || err.message;\n reject(new Error(`git ${args[0]}: ${message}`));\n return;\n }\n resolve(stdout);\n });\n });\n}\n","/**\n * Internal lifecycle helpers used by `openWorkspace` on mint/adopt/resume.\n *\n * - Create the workspace directory skeleton.\n * - Write mint-time templates (schema.orb, user.orb, project.orb) if missing.\n * - Initialize git when `github` is supplied.\n *\n * No `node:fs` use here — everything rides the backend.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { WorkspaceBackend } from './types.js';\nimport {\n WORKSPACE_LAYOUT,\n coordinatorDir,\n orbitalSessionDir,\n schemaFile,\n} from './path-layout.js';\nimport {\n createSchemaOrbTemplate,\n createUserOrbTemplate,\n createProjectOrbTemplate,\n serializeJson,\n} from './templates.js';\nimport { GitClient } from './git-client.js';\n\n/** Make sure every workspace dir exists. */\nexport async function ensureSkeleton(\n backend: WorkspaceBackend,\n workDir: string,\n): Promise<void> {\n await backend.mkdir(workDir, { recursive: true });\n await backend.mkdir(path.join(workDir, WORKSPACE_LAYOUT.ALMADAR_DIR), { recursive: true });\n await backend.mkdir(path.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR), { recursive: true });\n await backend.mkdir(path.join(workDir, WORKSPACE_LAYOUT.SESSIONS_DIR), { recursive: true });\n await backend.mkdir(coordinatorDir(workDir), { recursive: true });\n}\n\n/** Initialise per-orbital session dir lazily. */\nexport async function ensureOrbitalSessionDir(\n backend: WorkspaceBackend,\n workDir: string,\n orbital: string,\n): Promise<void> {\n await backend.mkdir(orbitalSessionDir(workDir, orbital), { recursive: true });\n}\n\n/** Write mint-time templates only when they don't exist. */\nexport async function writeMintTemplatesIfMissing(\n backend: WorkspaceBackend,\n workDir: string,\n userId: string,\n projectName: string,\n appId?: string,\n): Promise<void> {\n const schemaPath = schemaFile(workDir);\n if (!backend.exists(schemaPath)) {\n await backend.writeFile(schemaPath, serializeJson(createSchemaOrbTemplate(projectName)));\n }\n const userPath = path.join(workDir, WORKSPACE_LAYOUT.USER_MEMORY);\n if (!backend.exists(userPath)) {\n await backend.writeFile(userPath, serializeJson(createUserOrbTemplate(userId)));\n }\n const projectPath = path.join(workDir, WORKSPACE_LAYOUT.PROJECT_MEMORY);\n if (!backend.exists(projectPath)) {\n await backend.writeFile(\n projectPath,\n serializeJson(createProjectOrbTemplate(projectName, appId)),\n );\n }\n}\n\n/** Initialise git for the workspace if it isn't already a repo. */\nexport async function ensureGitInit(\n backend: WorkspaceBackend,\n workDir: string,\n): Promise<GitClient> {\n const git = new GitClient(workDir, backend);\n await git.init();\n return git;\n}\n","/**\n * Lifecycle helpers — read + write the per-workspace app marker, and\n * scan a user's workspace root for one that matches a known `appId`.\n *\n * No `node:fs` here — everything rides the backend.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { JsonObject } from '@almadar/core';\nimport type { WorkspaceBackend, AppMarker } from './types.js';\nimport { appMarkerFile } from './path-layout.js';\n\n/** Synchronous read — used during resolution before the service is built. */\nexport function readAppMarker(backend: WorkspaceBackend, workDir: string): AppMarker | null {\n const markerPath = appMarkerFile(workDir);\n if (!backend.exists(markerPath)) return null;\n try {\n const raw = backend.readFileSync(markerPath);\n const parsed = JSON.parse(raw) as JsonObject;\n if (\n typeof parsed.appId !== 'string'\n || typeof parsed.userId !== 'string'\n || typeof parsed.createdAt !== 'number'\n ) {\n return null;\n }\n const marker: AppMarker = {\n appId: parsed.appId,\n userId: parsed.userId,\n createdAt: parsed.createdAt,\n };\n if (typeof parsed.repoUrl === 'string') marker.repoUrl = parsed.repoUrl;\n return marker;\n } catch {\n return null;\n }\n}\n\n/** Write the marker. Caller ensures the `.almadar/` dir exists. */\nexport async function writeAppMarker(\n backend: WorkspaceBackend,\n workDir: string,\n marker: AppMarker,\n): Promise<void> {\n const markerPath = appMarkerFile(workDir);\n await backend.mkdir(path.dirname(markerPath), { recursive: true });\n await backend.writeFile(markerPath, JSON.stringify(marker, null, 2));\n}\n\n/**\n * Scan `<workspacesRoot>/<userId>/` for a session dir whose\n * `.almadar/app-marker.json` matches `appId`. Returns null on miss.\n */\nexport async function findLocalWorkspaceDir(\n backend: WorkspaceBackend,\n workspacesRoot: string,\n userId: string,\n appId: string,\n): Promise<string | null> {\n const userDir = path.join(workspacesRoot, userId);\n if (!backend.exists(userDir)) return null;\n\n let entries: string[];\n try {\n entries = await backend.readdir(userDir);\n } catch {\n return null;\n }\n\n for (const entry of entries) {\n const sessionDir = path.join(userDir, entry);\n let isDir = false;\n try {\n const s = await backend.stat(sessionDir);\n isDir = s.isDirectory;\n } catch {\n continue;\n }\n if (!isDir) continue;\n const marker = readAppMarker(backend, sessionDir);\n if (marker && marker.appId === appId) return sessionDir;\n }\n return null;\n}\n\n/** Compose a fresh session dir under `<workspacesRoot>/<userId>/`. */\nexport function mintSessionDir(workspacesRoot: string, userId: string): string {\n const ts = new Date().toISOString().slice(0, 10);\n const suffix = Date.now().toString(36);\n return path.join(workspacesRoot, userId, `${ts}_${suffix}`);\n}\n","/**\n * Restore an empty/missing workspace from a `RestoreBackend`.\n *\n * Used by `openWorkspace` when `opts.appId` is set, the local cache\n * misses, and `opts.restore` is supplied. Writes via the backend (so no\n * `node:fs` here).\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { RestoreBackend } from '../types.js';\nimport type { WorkspaceBackend } from './types.js';\n\nexport interface RestoreResult {\n filesRestored: number;\n bytesWritten: number;\n}\n\n/** Pull every file the backend knows about and write it under `rootDir`. */\nexport async function restoreWorkspace(\n backend: WorkspaceBackend,\n rootDir: string,\n restore: RestoreBackend,\n): Promise<RestoreResult> {\n const rootAbs = path.resolve(rootDir);\n await backend.mkdir(rootAbs, { recursive: true });\n\n const paths = await restore.listFiles();\n let filesRestored = 0;\n let bytesWritten = 0;\n\n for (const relativePath of paths) {\n const normalised = relativePath.replace(/\\\\/g, '/');\n const target = path.resolve(rootAbs, normalised);\n if (target !== rootAbs && !target.startsWith(rootAbs + path.sep)) {\n // Escape attempt — drop.\n continue;\n }\n const content = await restore.readFile(normalised);\n if (content === null) continue;\n await backend.mkdir(path.dirname(target), { recursive: true });\n await backend.writeFile(target, content);\n filesRestored++;\n bytesWritten += Buffer.byteLength(content, 'utf-8');\n }\n\n return { filesRestored, bytesWritten };\n}\n","/**\n * Memory-file helpers used internally by the service.\n *\n * @packageDocumentation\n */\n\nimport type { JsonObject } from '@almadar/core';\nimport type { WorkspaceBackend } from './types.js';\n\n/**\n * Try to read JSON from `absPath` via the backend. Returns `null` when\n * the file is missing or unparseable.\n */\nexport async function readJsonFile<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n): Promise<T | null> {\n if (!backend.exists(absPath)) return null;\n try {\n const raw = await backend.readFile(absPath);\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * Write a JSON object via the backend with 2-space pretty-printing.\n */\nexport async function writeJsonFile<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n value: T,\n): Promise<void> {\n await backend.writeFile(absPath, JSON.stringify(value, null, 2));\n}\n\n/**\n * Read newline-delimited JSON. Drops malformed lines silently.\n */\nexport async function readJsonLines<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n): Promise<T[]> {\n if (!backend.exists(absPath)) return [];\n try {\n const raw = await backend.readFile(absPath);\n const out: T[] = [];\n for (const line of raw.split('\\n')) {\n if (!line.trim()) continue;\n try {\n out.push(JSON.parse(line) as T);\n } catch {\n // skip malformed\n }\n }\n return out;\n } catch {\n return [];\n }\n}\n\n/**\n * Append a single JSON value as a line. Used for trace + history streams.\n * Caller is responsible for any per-path serialization (the service's\n * write queue handles that).\n */\nexport async function appendJsonLine<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n value: T,\n): Promise<void> {\n const existing = backend.exists(absPath) ? await backend.readFile(absPath) : '';\n const ending = existing.length > 0 && !existing.endsWith('\\n') ? '\\n' : '';\n await backend.writeFile(absPath, existing + ending + JSON.stringify(value) + '\\n');\n}\n","/**\n * `WorkspaceService` implementation. The single chokepoint — every read\n * and write that any consumer performs lands here, computes its absolute\n * path via `path-layout.ts`, runs the backend op, then fans out a typed\n * `WorkspaceWriteEvent` to every registered observer.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { JsonObject, JsonValue } from '@almadar/core';\nimport type {\n FileTreeNode,\n GitHubConfig,\n GitStatusInfo,\n WorkspaceObserver,\n WorkspaceService,\n WorkspaceWriteEvent,\n} from './types.js';\nimport type { WorkspaceBackend } from './internal/types.js';\nimport { SinkManager } from './internal/sink-manager.js';\nimport { GitClient } from './internal/git-client.js';\nimport {\n archivedOrbitalFile,\n assertOrbitalName,\n compiledDir,\n compiledFile,\n coordinatorFile,\n orbitalFile,\n orbitalSessionDir,\n orbitalSessionFile,\n sandboxedPath,\n schemaFile,\n traceFile,\n WORKSPACE_LAYOUT,\n} from './internal/path-layout.js';\nimport {\n ensureOrbitalSessionDir,\n} from './internal/workspace-manager.js';\nimport {\n appendJsonLine,\n readJsonFile,\n readJsonLines,\n writeJsonFile,\n} from './internal/memory-files.js';\n\ninterface ServiceCtorArgs {\n workDir: string;\n backend: WorkspaceBackend;\n sinks: SinkManager;\n appId?: string;\n git?: GitClient;\n github?: GitHubConfig;\n}\n\nconst COORD_FILES = {\n analysis: 'analysis.json',\n plan: 'plan.json',\n clarifications: 'clarifications.json',\n messages: 'messages.json',\n} as const;\n\nconst ORBITAL_FILES = {\n spec: 'spec.json',\n memory: 'memory.json',\n history: 'history.jsonl',\n paramsHistory: 'params-history.jsonl',\n errors: 'errors.json',\n messages: 'messages.json',\n} as const;\n\nexport class WorkspaceServiceImpl implements WorkspaceService {\n readonly workDir: string;\n private _appId: string | undefined;\n private readonly backend: WorkspaceBackend;\n private readonly sinks: SinkManager;\n private readonly git: GitClient | undefined;\n private readonly github: GitHubConfig | undefined;\n /** Per-absolute-path serial queue. */\n private readonly writeQueue = new Map<string, Promise<void>>();\n\n constructor(args: ServiceCtorArgs) {\n this.workDir = args.workDir;\n this.backend = args.backend;\n this.sinks = args.sinks;\n this._appId = args.appId;\n this.git = args.git;\n this.github = args.github;\n }\n\n // === Identity ===\n\n get appId(): string | undefined {\n return this._appId;\n }\n\n setAppId(id: string): void {\n this._appId = id;\n }\n\n // === Helpers ===\n\n /** Run `op` under a per-path serial lock. */\n private withLock<T>(absPath: string, op: () => Promise<T>): Promise<T> {\n const prev = this.writeQueue.get(absPath) ?? Promise.resolve();\n let resolved!: T;\n const next = prev.then(async () => {\n resolved = await op();\n });\n // Best-effort: ensure the queue continues even on failure.\n const swallowed = next.catch(() => undefined);\n this.writeQueue.set(absPath, swallowed);\n return next.then(() => resolved);\n }\n\n /** Make sure the parent directory of `absPath` exists. */\n private async ensureParent(absPath: string): Promise<void> {\n await this.backend.mkdir(path.dirname(absPath), { recursive: true });\n }\n\n private async emit(event: WorkspaceWriteEvent): Promise<void> {\n await this.sinks.notifyAll(event);\n }\n\n // === Orbital artifacts ===\n\n readOrbital(name: string): string | null {\n assertOrbitalName(name);\n const p = orbitalFile(this.workDir, name);\n if (!this.backend.exists(p)) return null;\n try {\n return this.backend.readFileSync(p);\n } catch {\n return null;\n }\n }\n\n async writeOrbital(name: string, content: string): Promise<void> {\n assertOrbitalName(name);\n const p = orbitalFile(this.workDir, name);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, content);\n });\n await this.emit({ kind: 'orbital', name, content });\n }\n\n listOrbitals(): string[] {\n const dir = path.join(this.workDir, WORKSPACE_LAYOUT.ORBITALS_DIR);\n if (!this.backend.exists(dir)) return [];\n try {\n return this.backend.readdirSync(dir)\n .filter(f => f.endsWith('.orb'))\n .map(f => f.replace(/\\.orb$/, ''))\n .sort();\n } catch {\n return [];\n }\n }\n\n async archiveOrbital(name: string): Promise<void> {\n assertOrbitalName(name);\n const src = orbitalFile(this.workDir, name);\n if (!this.backend.exists(src)) return;\n const content = await this.backend.readFile(src);\n const dst = archivedOrbitalFile(this.workDir, name);\n await this.withLock(src, async () => {\n await this.ensureParent(dst);\n await this.backend.writeFile(dst, content);\n await this.backend.unlink(src);\n });\n await this.emit({ kind: 'orbital-archived', name });\n }\n\n async renameOrbital(from: string, to: string): Promise<void> {\n assertOrbitalName(from);\n assertOrbitalName(to);\n const src = orbitalFile(this.workDir, from);\n const dst = orbitalFile(this.workDir, to);\n if (!this.backend.exists(src)) return;\n const content = await this.backend.readFile(src);\n await this.withLock(src, async () => {\n await this.ensureParent(dst);\n await this.backend.writeFile(dst, content);\n await this.backend.unlink(src);\n });\n await this.emit({ kind: 'orbital-renamed', from, to });\n }\n\n async renameOrbitalSession(from: string, to: string): Promise<void> {\n assertOrbitalName(from);\n assertOrbitalName(to);\n const src = orbitalSessionDir(this.workDir, from);\n const dst = orbitalSessionDir(this.workDir, to);\n if (!this.backend.exists(src)) return;\n if (this.backend.exists(dst)) return;\n await this.withLock(src, async () => {\n await this.backend.rename(src, dst);\n });\n await this.emit({ kind: 'session-renamed', from, to });\n }\n\n // === Schema artifact ===\n\n readSchema(): string | null {\n const p = schemaFile(this.workDir);\n if (!this.backend.exists(p)) return null;\n try {\n return this.backend.readFileSync(p);\n } catch {\n return null;\n }\n }\n\n async writeSchema(content: string): Promise<void> {\n const p = schemaFile(this.workDir);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, content);\n });\n await this.emit({ kind: 'schema', content });\n }\n\n // === Coordinator session ===\n\n readAnalysis<T extends JsonObject>(): T | null {\n return readJsonFileSync<T>(this.backend, coordinatorFile(this.workDir, COORD_FILES.analysis));\n }\n\n async writeAnalysis<T extends JsonObject>(analysis: T): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.analysis);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await writeJsonFile(this.backend, p, analysis);\n });\n await this.emit({ kind: 'analysis', content: analysis });\n }\n\n readPlan<T extends JsonObject>(): T | null {\n return readJsonFileSync<T>(this.backend, coordinatorFile(this.workDir, COORD_FILES.plan));\n }\n\n async writePlan<T extends JsonObject>(plan: T): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.plan);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await writeJsonFile(this.backend, p, plan);\n });\n await this.emit({ kind: 'plan', content: plan });\n }\n\n readClarificationAnswers(): Record<string, string> {\n const p = coordinatorFile(this.workDir, COORD_FILES.clarifications);\n if (!this.backend.exists(p)) return {};\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p)) as JsonObject;\n const out: Record<string, string> = {};\n for (const k of Object.keys(parsed)) {\n const v = parsed[k];\n if (typeof v === 'string') out[k] = v;\n }\n return out;\n } catch {\n return {};\n }\n }\n\n async writeClarificationAnswers(answers: Record<string, string>): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.clarifications);\n const asJson: JsonObject = { ...answers };\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await writeJsonFile(this.backend, p, asJson);\n });\n await this.emit({ kind: 'clarifications', content: answers });\n }\n\n readCoordinatorMessages<T extends JsonValue>(): T[] | null {\n const p = coordinatorFile(this.workDir, COORD_FILES.messages);\n if (!this.backend.exists(p)) return null;\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p));\n if (!Array.isArray(parsed)) return null;\n return parsed as T[];\n } catch {\n return null;\n }\n }\n\n async writeCoordinatorMessages<T extends JsonValue>(messages: T[]): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.messages);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, JSON.stringify(messages, null, 2));\n });\n await this.emit({ kind: 'coordinator-messages', content: messages as JsonValue[] });\n }\n\n // === Per-orbital session ===\n\n private orbitalFile(orbital: string, basename: string): string {\n assertOrbitalName(orbital);\n return orbitalSessionFile(this.workDir, orbital, basename);\n }\n\n readSpec<T extends JsonObject>(orbital: string): T | null {\n return readJsonFileSync<T>(this.backend, this.orbitalFile(orbital, ORBITAL_FILES.spec));\n }\n\n async writeSpec<T extends JsonObject>(orbital: string, spec: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.spec);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await writeJsonFile(this.backend, p, spec);\n });\n await this.emit({ kind: 'spec', orbital, content: spec });\n }\n\n readMemory<T extends JsonObject>(orbital: string): T | null {\n return readJsonFileSync<T>(this.backend, this.orbitalFile(orbital, ORBITAL_FILES.memory));\n }\n\n async writeMemory<T extends JsonObject>(orbital: string, memory: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.memory);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await writeJsonFile(this.backend, p, memory);\n });\n await this.emit({ kind: 'memory', orbital, content: memory });\n }\n\n async appendHistory<T extends JsonObject>(orbital: string, entry: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.history);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await appendJsonLine(this.backend, p, entry);\n });\n await this.emit({ kind: 'history', orbital, entry });\n }\n\n readHistory<T extends JsonObject>(orbital: string): T[] {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.history);\n return readJsonLinesSync<T>(this.backend, p);\n }\n\n async appendParamsHistory<T extends JsonObject>(orbital: string, row: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.paramsHistory);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await appendJsonLine(this.backend, p, row);\n });\n await this.emit({ kind: 'params-history', orbital, row });\n }\n\n readErrors<T extends JsonObject>(orbital: string): T[] {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.errors);\n if (!this.backend.exists(p)) return [];\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p));\n if (!Array.isArray(parsed)) return [];\n return parsed as T[];\n } catch {\n return [];\n }\n }\n\n async writeErrors<T extends JsonObject>(orbital: string, errors: T[]): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.errors);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await this.backend.writeFile(p, JSON.stringify(errors, null, 2));\n });\n await this.emit({ kind: 'errors', orbital, content: errors });\n }\n\n readSubagentMessages<T extends JsonValue>(orbital: string): T[] | null {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.messages);\n if (!this.backend.exists(p)) return null;\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p));\n if (!Array.isArray(parsed)) return null;\n return parsed as T[];\n } catch {\n return null;\n }\n }\n\n async writeSubagentMessages<T extends JsonValue>(\n orbital: string,\n messages: T[],\n ): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.messages);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await this.backend.writeFile(p, JSON.stringify(messages, null, 2));\n });\n await this.emit({ kind: 'subagent-messages', orbital, content: messages as JsonValue[] });\n }\n\n // === Trace ===\n\n async emitTrace<T extends JsonObject>(event: T): Promise<void> {\n const p = traceFile(this.workDir);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await appendJsonLine(this.backend, p, event);\n });\n await this.emit({ kind: 'trace', event });\n }\n\n readTrace<T extends JsonObject>(): T[] {\n const p = traceFile(this.workDir);\n return readJsonLinesSync<T>(this.backend, p);\n }\n\n // === Compiled output ===\n\n async writeCompiled(relPath: string, content: string): Promise<void> {\n if (relPath.includes('..') || path.isAbsolute(relPath)) {\n throw new Error(`compiled: invalid relPath (${relPath})`);\n }\n const p = compiledFile(this.workDir, relPath);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, content);\n });\n await this.emit({ kind: 'compiled', relPath, content });\n }\n\n readCompiled(relPath: string): string | null {\n if (relPath.includes('..') || path.isAbsolute(relPath)) return null;\n const p = compiledFile(this.workDir, relPath);\n if (!this.backend.exists(p)) return null;\n try {\n return this.backend.readFileSync(p);\n } catch {\n return null;\n }\n }\n\n async clearCompiled(): Promise<void> {\n const dir = compiledDir(this.workDir);\n if (!this.backend.exists(dir)) return;\n await removeTree(this.backend, dir);\n }\n\n // === Sandboxed generic file I/O ===\n\n async readFile(relPath: string): Promise<string | null> {\n const abs = sandboxedPath(this.workDir, relPath);\n if (!this.backend.exists(abs)) return null;\n try {\n return await this.backend.readFile(abs);\n } catch {\n return null;\n }\n }\n\n async writeFile(relPath: string, content: string): Promise<void> {\n const abs = sandboxedPath(this.workDir, relPath);\n await this.withLock(abs, async () => {\n await this.ensureParent(abs);\n await this.backend.writeFile(abs, content);\n });\n await this.emit({ kind: 'file', relPath, content });\n }\n\n async listTree(relPath?: string): Promise<FileTreeNode[]> {\n const base = relPath === undefined ? this.workDir : sandboxedPath(this.workDir, relPath);\n if (!this.backend.exists(base)) return [];\n const out: FileTreeNode[] = [];\n await walk(this.backend, base, this.workDir, out);\n return out;\n }\n\n async exists(relPath: string): Promise<boolean> {\n let abs: string;\n try {\n abs = sandboxedPath(this.workDir, relPath);\n } catch {\n return false;\n }\n return this.backend.exists(abs);\n }\n\n // === Git ===\n\n async commitAndPush(opts: {\n message: string;\n tags?: string[];\n }): Promise<{ sha: string } | null> {\n if (!this.git) return null;\n await this.git.addAll();\n const sha = await this.git.commit(opts.message);\n if (sha === null) return null;\n if (opts.tags) {\n for (const t of opts.tags) await this.git.tag(t);\n }\n if (this.github && this.github.repoUrl) {\n if (!(await this.git.hasRemote('origin'))) {\n await this.git.addRemote('origin', this.github.repoUrl);\n }\n await this.git.push('origin', this.github.branch ?? 'main');\n }\n return { sha };\n }\n\n async pullIfLinked(): Promise<boolean> {\n if (!this.git || !this.github) return false;\n if (!(await this.git.hasRemote('origin'))) return false;\n await this.git.pull('origin', this.github.branch ?? 'main');\n return true;\n }\n\n async gitStatus(): Promise<GitStatusInfo> {\n if (!this.git) {\n return { clean: true, staged: [], modified: [], untracked: [], linked: false };\n }\n const s = await this.git.status();\n const linked = await this.git.hasRemote('origin');\n return { ...s, linked };\n }\n\n // === Observation ===\n\n subscribe(observer: WorkspaceObserver): () => void {\n return this.sinks.subscribe(observer);\n }\n\n // === Disposal ===\n\n async dispose(): Promise<void> {\n // Drain pending writes.\n const pending = Array.from(this.writeQueue.values());\n await Promise.allSettled(pending);\n // Optional final commit when configured.\n if (this.git && this.github) {\n try {\n await this.commitAndPush({ message: 'workspace: dispose' });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`[workspace] dispose: commitAndPush failed: ${msg}`);\n }\n }\n }\n}\n\n// ============================================================================\n// Sync helpers — wrap backend reads with safe JSON parse.\n// ============================================================================\n\nfunction readJsonFileSync<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n): T | null {\n if (!backend.exists(absPath)) return null;\n try {\n return JSON.parse(backend.readFileSync(absPath)) as T;\n } catch {\n return null;\n }\n}\n\nfunction readJsonLinesSync<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n): T[] {\n if (!backend.exists(absPath)) return [];\n try {\n const raw = backend.readFileSync(absPath);\n const out: T[] = [];\n for (const line of raw.split('\\n')) {\n if (!line.trim()) continue;\n try {\n out.push(JSON.parse(line) as T);\n } catch {\n // skip\n }\n }\n return out;\n } catch {\n return [];\n }\n}\n\nasync function walk(\n backend: WorkspaceBackend,\n dir: string,\n root: string,\n out: FileTreeNode[],\n): Promise<void> {\n const entries = await backend.readdir(dir);\n for (const name of entries) {\n const full = path.join(dir, name);\n const s = await backend.stat(full);\n const rel = path.relative(root, full).split(path.sep).join('/');\n if (s.isDirectory) {\n out.push({ path: rel, type: 'directory', size: 0 });\n await walk(backend, full, root, out);\n } else {\n out.push({ path: rel, type: 'file', size: s.size });\n }\n }\n}\n\nasync function removeTree(backend: WorkspaceBackend, dir: string): Promise<void> {\n const entries = await backend.readdir(dir);\n for (const name of entries) {\n const full = path.join(dir, name);\n let isDir = false;\n try {\n isDir = (await backend.stat(full)).isDirectory;\n } catch {\n continue;\n }\n if (isDir) {\n await removeTree(backend, full);\n } else {\n try {\n await backend.unlink(full);\n } catch {\n // ignore\n }\n }\n }\n}\n","/**\n * `openWorkspace` — single entry point for every consumer.\n *\n * Resolves the workspace lifecycle (adopt → resume → restore → clone →\n * mint), constructs the backend + sink manager + git client, writes\n * templates on mint, and returns a fully wired `WorkspaceService`.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { OpenWorkspaceOptions, WorkspaceService } from './types.js';\nimport type { WorkspaceBackend, AppMarker } from './internal/types.js';\nimport { LocalBackend } from './internal/backends/local.js';\nimport { MemoryBackend } from './internal/backends/memory.js';\nimport { SinkManager } from './internal/sink-manager.js';\nimport {\n ensureGitInit,\n ensureSkeleton,\n writeMintTemplatesIfMissing,\n} from './internal/workspace-manager.js';\nimport {\n findLocalWorkspaceDir,\n mintSessionDir,\n readAppMarker,\n writeAppMarker,\n} from './internal/workspace-resolver.js';\nimport { restoreWorkspace } from './internal/restore.js';\nimport { WorkspaceServiceImpl } from './service.js';\n\nexport async function openWorkspace(opts: OpenWorkspaceOptions): Promise<WorkspaceService> {\n const backend: WorkspaceBackend = opts.backend === 'memory'\n ? new MemoryBackend()\n : new LocalBackend();\n const sinks = new SinkManager();\n\n const resolved = await resolveLifecycle(backend, opts);\n\n await ensureSkeleton(backend, resolved.workDir);\n await writeMintTemplatesIfMissing(\n backend,\n resolved.workDir,\n opts.userId,\n opts.projectName ?? 'Untitled',\n resolved.appId,\n );\n\n // App marker — pin appId to dir when known.\n if (resolved.appId !== undefined) {\n const existing = readAppMarker(backend, resolved.workDir);\n if (!existing || existing.appId !== resolved.appId) {\n const marker: AppMarker = {\n appId: resolved.appId,\n userId: opts.userId,\n createdAt: existing?.createdAt ?? Date.now(),\n };\n if (opts.github?.repoUrl) marker.repoUrl = opts.github.repoUrl;\n await writeAppMarker(backend, resolved.workDir, marker);\n }\n }\n\n // Git initialisation only on local backend; memory backend skips git.\n let git;\n if (opts.github && opts.backend !== 'memory') {\n git = await ensureGitInit(backend, resolved.workDir);\n }\n\n return new WorkspaceServiceImpl({\n workDir: resolved.workDir,\n backend,\n sinks,\n appId: resolved.appId,\n git,\n github: opts.github,\n });\n}\n\ninterface ResolvedLifecycle {\n workDir: string;\n appId: string | undefined;\n}\n\nasync function resolveLifecycle(\n backend: WorkspaceBackend,\n opts: OpenWorkspaceOptions,\n): Promise<ResolvedLifecycle> {\n // 1. adopt — caller hands us a directory.\n if (opts.adopt) {\n const workDir = path.resolve(opts.adopt);\n const marker = readAppMarker(backend, workDir);\n return { workDir, appId: marker?.appId ?? opts.appId };\n }\n\n // 2. resume from disk — appId set + we can find a marker locally.\n if (opts.appId) {\n const local = await findLocalWorkspaceDir(\n backend,\n opts.root,\n opts.userId,\n opts.appId,\n );\n if (local) return { workDir: local, appId: opts.appId };\n }\n\n // 3. restore-from-backend — appId set + local miss + restore supplied.\n if (opts.appId && opts.restore) {\n const workDir = mintSessionDir(opts.root, opts.userId);\n await backend.mkdir(workDir, { recursive: true });\n await restoreWorkspace(backend, workDir, opts.restore);\n return { workDir, appId: opts.appId };\n }\n\n // 4. github clone — appId set + local miss + no restore + github cfg.\n if (opts.appId && opts.github && opts.github.repoUrl) {\n const workDir = mintSessionDir(opts.root, opts.userId);\n await backend.mkdir(workDir, { recursive: true });\n // Defer the actual clone to the consumer's git plumbing — we record\n // the marker and let `pullIfLinked` / `commitAndPush` drive remote\n // sync. Cloning requires shell access and we already have a thin git\n // client; emit a placeholder marker and let the consumer drive.\n return { workDir, appId: opts.appId };\n }\n\n // 5. mint fresh — anonymous workspace, appId may be promoted later.\n const workDir = mintSessionDir(opts.root, opts.userId);\n return { workDir, appId: opts.appId };\n}\n"]}
@@ -19,4 +19,5 @@ export declare class LocalBackend implements WorkspaceBackend {
19
19
  mtimeMs: number;
20
20
  isDirectory: boolean;
21
21
  }>;
22
+ rename(srcAbs: string, dstAbs: string): Promise<void>;
22
23
  }
@@ -20,6 +20,7 @@ export declare class MemoryBackend implements WorkspaceBackend {
20
20
  mtimeMs: number;
21
21
  isDirectory: boolean;
22
22
  }>;
23
+ rename(srcAbs: string, dstAbs: string): Promise<void>;
23
24
  getAll(): Map<string, string>;
24
25
  clear(): void;
25
26
  }
@@ -28,6 +28,13 @@ export interface WorkspaceBackend {
28
28
  mtimeMs: number;
29
29
  isDirectory: boolean;
30
30
  }>;
31
+ /**
32
+ * Move a file or directory from `srcAbs` to `dstAbs`. Atomic where the
33
+ * underlying filesystem supports it; emulated by recursive copy + unlink
34
+ * for the in-memory backend. Caller is responsible for ensuring `srcAbs`
35
+ * exists; backend ensures `dstAbs`'s parent dir exists before move.
36
+ */
37
+ rename(srcAbs: string, dstAbs: string): Promise<void>;
31
38
  }
32
39
  /**
33
40
  * The persisted marker that pins an `appId` to a workspace dir on disk.
package/dist/service.d.ts CHANGED
@@ -41,6 +41,7 @@ export declare class WorkspaceServiceImpl implements WorkspaceService {
41
41
  listOrbitals(): string[];
42
42
  archiveOrbital(name: string): Promise<void>;
43
43
  renameOrbital(from: string, to: string): Promise<void>;
44
+ renameOrbitalSession(from: string, to: string): Promise<void>;
44
45
  readSchema(): string | null;
45
46
  writeSchema(content: string): Promise<void>;
46
47
  readAnalysis<T extends JsonObject>(): T | null;
package/dist/types.d.ts CHANGED
@@ -80,6 +80,10 @@ export type WorkspaceWriteEvent = {
80
80
  kind: 'orbital-renamed';
81
81
  from: string;
82
82
  to: string;
83
+ } | {
84
+ kind: 'session-renamed';
85
+ from: string;
86
+ to: string;
83
87
  } | {
84
88
  kind: 'file';
85
89
  relPath: string;
@@ -167,6 +171,14 @@ export interface WorkspaceService {
167
171
  listOrbitals(): string[];
168
172
  archiveOrbital(name: string): Promise<void>;
169
173
  renameOrbital(from: string, to: string): Promise<void>;
174
+ /**
175
+ * Move the per-orbital session directory `.almadar/sessions/<from>` to
176
+ * `.almadar/sessions/<to>`. Used when a plan op renames an orbital and
177
+ * the executor needs the session state (spec, memory, history) to
178
+ * follow. Best-effort: no-op when the source dir doesn't exist or the
179
+ * destination already does.
180
+ */
181
+ renameOrbitalSession(from: string, to: string): Promise<void>;
170
182
  readSchema(): string | null;
171
183
  writeSchema(content: string): Promise<void>;
172
184
  readAnalysis<T extends JsonObject>(): T | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/workspace",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Storage-agnostic workspace primitives shared by Almadar consumers. One service, six exports, hidden paths, single observer. See docs/Almadar_Workspace.md.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",