@almadar/workspace 0.1.0 → 0.1.1
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 +40 -38
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
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) {
|
|
@@ -161,51 +163,51 @@ var WORKSPACE_LAYOUT = {
|
|
|
161
163
|
PROJECT_MEMORY: ".almadar/project.orb"
|
|
162
164
|
};
|
|
163
165
|
function orbitalFile(workDir, name) {
|
|
164
|
-
return
|
|
166
|
+
return path2.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR, `${name}.orb`);
|
|
165
167
|
}
|
|
166
168
|
function archivedOrbitalFile(workDir, name) {
|
|
167
|
-
return
|
|
169
|
+
return path2.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR, ".archived", `${name}.orb`);
|
|
168
170
|
}
|
|
169
171
|
function schemaFile(workDir) {
|
|
170
|
-
return
|
|
172
|
+
return path2.join(workDir, WORKSPACE_LAYOUT.SCHEMA_FILE);
|
|
171
173
|
}
|
|
172
174
|
function coordinatorDir(workDir) {
|
|
173
|
-
return
|
|
175
|
+
return path2.join(workDir, WORKSPACE_LAYOUT.COORDINATOR_DIR);
|
|
174
176
|
}
|
|
175
177
|
function coordinatorFile(workDir, basename) {
|
|
176
|
-
return
|
|
178
|
+
return path2.join(coordinatorDir(workDir), basename);
|
|
177
179
|
}
|
|
178
180
|
function orbitalSessionDir(workDir, orbital) {
|
|
179
|
-
return
|
|
181
|
+
return path2.join(workDir, WORKSPACE_LAYOUT.SESSIONS_DIR, orbital);
|
|
180
182
|
}
|
|
181
183
|
function orbitalSessionFile(workDir, orbital, basename) {
|
|
182
|
-
return
|
|
184
|
+
return path2.join(orbitalSessionDir(workDir, orbital), basename);
|
|
183
185
|
}
|
|
184
186
|
function traceFile(workDir) {
|
|
185
|
-
return
|
|
187
|
+
return path2.join(workDir, WORKSPACE_LAYOUT.TRACE_FILE);
|
|
186
188
|
}
|
|
187
189
|
function compiledDir(workDir) {
|
|
188
|
-
return
|
|
190
|
+
return path2.join(workDir, WORKSPACE_LAYOUT.COMPILED_DIR);
|
|
189
191
|
}
|
|
190
192
|
function compiledFile(workDir, relPath) {
|
|
191
|
-
return
|
|
193
|
+
return path2.join(compiledDir(workDir), relPath);
|
|
192
194
|
}
|
|
193
195
|
function appMarkerFile(workDir) {
|
|
194
|
-
return
|
|
196
|
+
return path2.join(workDir, WORKSPACE_LAYOUT.APP_MARKER);
|
|
195
197
|
}
|
|
196
198
|
function sandboxedPath(workDir, relPath) {
|
|
197
199
|
if (typeof relPath !== "string" || relPath.length === 0) {
|
|
198
200
|
throw new Error("sandbox: empty relative path");
|
|
199
201
|
}
|
|
200
|
-
if (
|
|
202
|
+
if (path2.isAbsolute(relPath)) {
|
|
201
203
|
throw new Error(`sandbox: absolute paths are not allowed (${relPath})`);
|
|
202
204
|
}
|
|
203
205
|
if (/^[a-zA-Z]:[\\/]/.test(relPath)) {
|
|
204
206
|
throw new Error(`sandbox: drive-letter paths are not allowed (${relPath})`);
|
|
205
207
|
}
|
|
206
|
-
const rootAbs =
|
|
207
|
-
const target =
|
|
208
|
-
if (target !== rootAbs && !target.startsWith(rootAbs +
|
|
208
|
+
const rootAbs = path2.resolve(workDir);
|
|
209
|
+
const target = path2.resolve(rootAbs, relPath);
|
|
210
|
+
if (target !== rootAbs && !target.startsWith(rootAbs + path2.sep)) {
|
|
209
211
|
throw new Error(`sandbox: path escapes workspace (${relPath})`);
|
|
210
212
|
}
|
|
211
213
|
return target;
|
|
@@ -288,7 +290,7 @@ var GitClient = class {
|
|
|
288
290
|
}
|
|
289
291
|
/** Is the working dir already a git repo? */
|
|
290
292
|
async isRepo() {
|
|
291
|
-
return this.backend.exists(
|
|
293
|
+
return this.backend.exists(path2.join(this.cwd, ".git"));
|
|
292
294
|
}
|
|
293
295
|
async init() {
|
|
294
296
|
if (await this.isRepo()) return;
|
|
@@ -383,9 +385,9 @@ function execGit(args, cwd) {
|
|
|
383
385
|
// src/internal/workspace-manager.ts
|
|
384
386
|
async function ensureSkeleton(backend, workDir) {
|
|
385
387
|
await backend.mkdir(workDir, { recursive: true });
|
|
386
|
-
await backend.mkdir(
|
|
387
|
-
await backend.mkdir(
|
|
388
|
-
await backend.mkdir(
|
|
388
|
+
await backend.mkdir(path2.join(workDir, WORKSPACE_LAYOUT.ALMADAR_DIR), { recursive: true });
|
|
389
|
+
await backend.mkdir(path2.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR), { recursive: true });
|
|
390
|
+
await backend.mkdir(path2.join(workDir, WORKSPACE_LAYOUT.SESSIONS_DIR), { recursive: true });
|
|
389
391
|
await backend.mkdir(coordinatorDir(workDir), { recursive: true });
|
|
390
392
|
}
|
|
391
393
|
async function ensureOrbitalSessionDir(backend, workDir, orbital) {
|
|
@@ -396,11 +398,11 @@ async function writeMintTemplatesIfMissing(backend, workDir, userId, projectName
|
|
|
396
398
|
if (!backend.exists(schemaPath)) {
|
|
397
399
|
await backend.writeFile(schemaPath, serializeJson(createSchemaOrbTemplate(projectName)));
|
|
398
400
|
}
|
|
399
|
-
const userPath =
|
|
401
|
+
const userPath = path2.join(workDir, WORKSPACE_LAYOUT.USER_MEMORY);
|
|
400
402
|
if (!backend.exists(userPath)) {
|
|
401
403
|
await backend.writeFile(userPath, serializeJson(createUserOrbTemplate(userId)));
|
|
402
404
|
}
|
|
403
|
-
const projectPath =
|
|
405
|
+
const projectPath = path2.join(workDir, WORKSPACE_LAYOUT.PROJECT_MEMORY);
|
|
404
406
|
if (!backend.exists(projectPath)) {
|
|
405
407
|
await backend.writeFile(
|
|
406
408
|
projectPath,
|
|
@@ -435,11 +437,11 @@ function readAppMarker(backend, workDir) {
|
|
|
435
437
|
}
|
|
436
438
|
async function writeAppMarker(backend, workDir, marker) {
|
|
437
439
|
const markerPath = appMarkerFile(workDir);
|
|
438
|
-
await backend.mkdir(
|
|
440
|
+
await backend.mkdir(path2.dirname(markerPath), { recursive: true });
|
|
439
441
|
await backend.writeFile(markerPath, JSON.stringify(marker, null, 2));
|
|
440
442
|
}
|
|
441
443
|
async function findLocalWorkspaceDir(backend, workspacesRoot, userId, appId) {
|
|
442
|
-
const userDir =
|
|
444
|
+
const userDir = path2.join(workspacesRoot, userId);
|
|
443
445
|
if (!backend.exists(userDir)) return null;
|
|
444
446
|
let entries;
|
|
445
447
|
try {
|
|
@@ -448,7 +450,7 @@ async function findLocalWorkspaceDir(backend, workspacesRoot, userId, appId) {
|
|
|
448
450
|
return null;
|
|
449
451
|
}
|
|
450
452
|
for (const entry of entries) {
|
|
451
|
-
const sessionDir =
|
|
453
|
+
const sessionDir = path2.join(userDir, entry);
|
|
452
454
|
let isDir = false;
|
|
453
455
|
try {
|
|
454
456
|
const s = await backend.stat(sessionDir);
|
|
@@ -465,23 +467,23 @@ async function findLocalWorkspaceDir(backend, workspacesRoot, userId, appId) {
|
|
|
465
467
|
function mintSessionDir(workspacesRoot, userId) {
|
|
466
468
|
const ts = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
467
469
|
const suffix = Date.now().toString(36);
|
|
468
|
-
return
|
|
470
|
+
return path2.join(workspacesRoot, userId, `${ts}_${suffix}`);
|
|
469
471
|
}
|
|
470
472
|
async function restoreWorkspace(backend, rootDir, restore) {
|
|
471
|
-
const rootAbs =
|
|
473
|
+
const rootAbs = path2.resolve(rootDir);
|
|
472
474
|
await backend.mkdir(rootAbs, { recursive: true });
|
|
473
475
|
const paths = await restore.listFiles();
|
|
474
476
|
let filesRestored = 0;
|
|
475
477
|
let bytesWritten = 0;
|
|
476
478
|
for (const relativePath of paths) {
|
|
477
479
|
const normalised = relativePath.replace(/\\/g, "/");
|
|
478
|
-
const target =
|
|
479
|
-
if (target !== rootAbs && !target.startsWith(rootAbs +
|
|
480
|
+
const target = path2.resolve(rootAbs, normalised);
|
|
481
|
+
if (target !== rootAbs && !target.startsWith(rootAbs + path2.sep)) {
|
|
480
482
|
continue;
|
|
481
483
|
}
|
|
482
484
|
const content = await restore.readFile(normalised);
|
|
483
485
|
if (content === null) continue;
|
|
484
|
-
await backend.mkdir(
|
|
486
|
+
await backend.mkdir(path2.dirname(target), { recursive: true });
|
|
485
487
|
await backend.writeFile(target, content);
|
|
486
488
|
filesRestored++;
|
|
487
489
|
bytesWritten += Buffer.byteLength(content, "utf-8");
|
|
@@ -546,7 +548,7 @@ var WorkspaceServiceImpl = class {
|
|
|
546
548
|
}
|
|
547
549
|
/** Make sure the parent directory of `absPath` exists. */
|
|
548
550
|
async ensureParent(absPath) {
|
|
549
|
-
await this.backend.mkdir(
|
|
551
|
+
await this.backend.mkdir(path2.dirname(absPath), { recursive: true });
|
|
550
552
|
}
|
|
551
553
|
async emit(event) {
|
|
552
554
|
await this.sinks.notifyAll(event);
|
|
@@ -572,7 +574,7 @@ var WorkspaceServiceImpl = class {
|
|
|
572
574
|
await this.emit({ kind: "orbital", name, content });
|
|
573
575
|
}
|
|
574
576
|
listOrbitals() {
|
|
575
|
-
const dir =
|
|
577
|
+
const dir = path2.join(this.workDir, WORKSPACE_LAYOUT.ORBITALS_DIR);
|
|
576
578
|
if (!this.backend.exists(dir)) return [];
|
|
577
579
|
try {
|
|
578
580
|
return this.backend.readdirSync(dir).filter((f) => f.endsWith(".orb")).map((f) => f.replace(/\.orb$/, "")).sort();
|
|
@@ -791,7 +793,7 @@ var WorkspaceServiceImpl = class {
|
|
|
791
793
|
}
|
|
792
794
|
// === Compiled output ===
|
|
793
795
|
async writeCompiled(relPath, content) {
|
|
794
|
-
if (relPath.includes("..") ||
|
|
796
|
+
if (relPath.includes("..") || path2.isAbsolute(relPath)) {
|
|
795
797
|
throw new Error(`compiled: invalid relPath (${relPath})`);
|
|
796
798
|
}
|
|
797
799
|
const p = compiledFile(this.workDir, relPath);
|
|
@@ -802,7 +804,7 @@ var WorkspaceServiceImpl = class {
|
|
|
802
804
|
await this.emit({ kind: "compiled", relPath, content });
|
|
803
805
|
}
|
|
804
806
|
readCompiled(relPath) {
|
|
805
|
-
if (relPath.includes("..") ||
|
|
807
|
+
if (relPath.includes("..") || path2.isAbsolute(relPath)) return null;
|
|
806
808
|
const p = compiledFile(this.workDir, relPath);
|
|
807
809
|
if (!this.backend.exists(p)) return null;
|
|
808
810
|
try {
|
|
@@ -927,9 +929,9 @@ function readJsonLinesSync(backend, absPath) {
|
|
|
927
929
|
async function walk(backend, dir, root, out) {
|
|
928
930
|
const entries = await backend.readdir(dir);
|
|
929
931
|
for (const name of entries) {
|
|
930
|
-
const full =
|
|
932
|
+
const full = path2.join(dir, name);
|
|
931
933
|
const s = await backend.stat(full);
|
|
932
|
-
const rel =
|
|
934
|
+
const rel = path2.relative(root, full).split(path2.sep).join("/");
|
|
933
935
|
if (s.isDirectory) {
|
|
934
936
|
out.push({ path: rel, type: "directory", size: 0 });
|
|
935
937
|
await walk(backend, full, root, out);
|
|
@@ -941,7 +943,7 @@ async function walk(backend, dir, root, out) {
|
|
|
941
943
|
async function removeTree(backend, dir) {
|
|
942
944
|
const entries = await backend.readdir(dir);
|
|
943
945
|
for (const name of entries) {
|
|
944
|
-
const full =
|
|
946
|
+
const full = path2.join(dir, name);
|
|
945
947
|
let isDir = false;
|
|
946
948
|
try {
|
|
947
949
|
isDir = (await backend.stat(full)).isDirectory;
|
|
@@ -999,7 +1001,7 @@ async function openWorkspace(opts) {
|
|
|
999
1001
|
}
|
|
1000
1002
|
async function resolveLifecycle(backend, opts) {
|
|
1001
1003
|
if (opts.adopt) {
|
|
1002
|
-
const workDir2 =
|
|
1004
|
+
const workDir2 = path2.resolve(opts.adopt);
|
|
1003
1005
|
const marker = readAppMarker(backend, workDir2);
|
|
1004
1006
|
return { workDir: workDir2, appId: marker?.appId ?? opts.appId };
|
|
1005
1007
|
}
|
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":"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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 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}\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@almadar/workspace",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
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",
|