@almadar/workspace 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -757,6 +757,11 @@ var WorkspaceIndexImpl = class {
757
757
  await writeSidecar(this.deps.backend, this.deps.workDir, orbital, entry);
758
758
  this.entries.set(orbital, entry);
759
759
  this.stale.delete(orbital);
760
+ await this.deps.sinks.notifyAll({
761
+ kind: "workspace-index",
762
+ orbital,
763
+ content: serializeEntryForMirror(entry)
764
+ });
760
765
  }
761
766
  async embedOne(text) {
762
767
  const { embeddings } = await this.deps.embedder.embedBatch([text]);
@@ -768,6 +773,21 @@ var WorkspaceIndexImpl = class {
768
773
  return embeddings;
769
774
  }
770
775
  };
776
+ function serializeEntryForMirror(entry) {
777
+ return {
778
+ schemaVersion: entry.schemaVersion,
779
+ specChecksum: entry.specChecksum,
780
+ identityVector: [...entry.identityVector],
781
+ identityFingerprint: entry.identityFingerprint,
782
+ extraTraitIdentities: entry.extraTraitIdentities.map((e) => ({
783
+ ref: e.ref,
784
+ alias: e.alias,
785
+ fingerprint: e.fingerprint,
786
+ vector: [...e.vector]
787
+ })),
788
+ bakedAt: entry.bakedAt
789
+ };
790
+ }
771
791
  function extractExtraTraitInputs(spec) {
772
792
  const params = asJsonObject2(spec["params"]);
773
793
  if (!params) return [];
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/workspace-index/types.ts","../src/workspace-index/cosine.ts","../src/workspace-index/fingerprint.ts","../src/workspace-index/sidecar.ts","../src/workspace-index/index-impl.ts","../src/service.ts","../src/workspace-index/embedder.ts","../src/open-workspace.ts"],"names":["path","asJsonObject","workDir"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Local filesystem backend. The ONLY place `node:fs` is permitted.\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport type { WorkspaceBackend } from '../types.js';\n\nexport class LocalBackend implements WorkspaceBackend {\n async readFile(absPath: string): Promise<string> {\n return fs.promises.readFile(absPath, 'utf-8');\n }\n readFileSync(absPath: string): string {\n return fs.readFileSync(absPath, 'utf-8');\n }\n async writeFile(absPath: string, content: string): Promise<void> {\n // Auto-mkdir parent — callers don't pre-create the directory structure.\n // Without this, a write to a fresh path (e.g. the first\n // `.almadar/trace.jsonl` write after mint) ENOENTs.\n await fs.promises.mkdir(path.dirname(absPath), { recursive: true });\n await fs.promises.writeFile(absPath, content, 'utf-8');\n }\n writeFileSync(absPath: string, content: string): void {\n fs.mkdirSync(path.dirname(absPath), { recursive: true });\n fs.writeFileSync(absPath, content, 'utf-8');\n }\n exists(absPath: string): boolean {\n return fs.existsSync(absPath);\n }\n async readdir(absPath: string): Promise<string[]> {\n return fs.promises.readdir(absPath);\n }\n readdirSync(absPath: string): string[] {\n return fs.readdirSync(absPath);\n }\n async mkdir(absPath: string, opts?: { recursive?: boolean }): Promise<void> {\n await fs.promises.mkdir(absPath, opts);\n }\n mkdirSync(absPath: string, opts?: { recursive?: boolean }): void {\n fs.mkdirSync(absPath, opts);\n }\n async unlink(absPath: string): Promise<void> {\n await fs.promises.unlink(absPath);\n }\n async stat(\n absPath: string,\n ): Promise<{ size: number; mtimeMs: number; isDirectory: boolean }> {\n const s = await fs.promises.stat(absPath);\n return { size: s.size, mtimeMs: s.mtimeMs, isDirectory: s.isDirectory() };\n }\n async rename(srcAbs: string, dstAbs: string): Promise<void> {\n await fs.promises.mkdir(path.dirname(dstAbs), { recursive: true });\n await fs.promises.rename(srcAbs, dstAbs);\n }\n}\n","/**\n * In-memory backend for tests and sandboxed evals. No `node:fs`.\n */\nimport type { WorkspaceBackend } from '../types.js';\n\nexport class MemoryBackend implements WorkspaceBackend {\n private files = new Map<string, string>();\n private dirs = new Set<string>();\n\n async readFile(absPath: string): Promise<string> {\n return this.readFileSync(absPath);\n }\n readFileSync(absPath: string): string {\n const content = this.files.get(absPath);\n if (content === undefined) throw new Error(`ENOENT: ${absPath}`);\n return content;\n }\n async writeFile(absPath: string, content: string): Promise<void> {\n this.writeFileSync(absPath, content);\n }\n writeFileSync(absPath: string, content: string): void {\n this.files.set(absPath, content);\n }\n exists(absPath: string): boolean {\n if (this.files.has(absPath) || this.dirs.has(absPath)) return true;\n // Treat any prefix that has children as an existing dir.\n const prefix = absPath.endsWith('/') ? absPath : absPath + '/';\n for (const k of this.files.keys()) {\n if (k.startsWith(prefix)) return true;\n }\n return false;\n }\n async readdir(absPath: string): Promise<string[]> {\n return this.readdirSync(absPath);\n }\n readdirSync(absPath: string): string[] {\n const prefix = absPath.endsWith('/') ? absPath : absPath + '/';\n const entries = new Set<string>();\n for (const key of this.files.keys()) {\n if (key.startsWith(prefix)) {\n const rest = key.slice(prefix.length);\n const firstSegment = rest.split('/')[0];\n if (firstSegment) entries.add(firstSegment);\n }\n }\n return Array.from(entries);\n }\n async mkdir(absPath: string): Promise<void> {\n this.mkdirSync(absPath);\n }\n mkdirSync(absPath: string): void {\n this.dirs.add(absPath);\n }\n async unlink(absPath: string): Promise<void> {\n this.files.delete(absPath);\n }\n async stat(\n absPath: string,\n ): Promise<{ size: number; mtimeMs: number; isDirectory: boolean }> {\n const content = this.files.get(absPath);\n if (content !== undefined) {\n return { size: content.length, mtimeMs: Date.now(), isDirectory: false };\n }\n // Treat as directory if anything sits under it.\n if (this.dirs.has(absPath)) return { size: 0, mtimeMs: Date.now(), isDirectory: true };\n const prefix = absPath.endsWith('/') ? absPath : absPath + '/';\n for (const k of this.files.keys()) {\n if (k.startsWith(prefix)) return { size: 0, mtimeMs: Date.now(), isDirectory: true };\n }\n throw new Error(`ENOENT: ${absPath}`);\n }\n async rename(srcAbs: string, dstAbs: string): Promise<void> {\n // File case — direct key swap.\n const fileContent = this.files.get(srcAbs);\n if (fileContent !== undefined) {\n this.files.delete(srcAbs);\n this.files.set(dstAbs, fileContent);\n return;\n }\n // Directory case — every file whose key starts with `srcAbs/` migrates\n // to the matching position under `dstAbs/`. Empty dirs (only present\n // in `this.dirs`) also migrate.\n const srcPrefix = srcAbs.endsWith('/') ? srcAbs : srcAbs + '/';\n const dstPrefix = dstAbs.endsWith('/') ? dstAbs : dstAbs + '/';\n const migrations: Array<[string, string]> = [];\n for (const key of this.files.keys()) {\n if (key.startsWith(srcPrefix)) {\n migrations.push([key, dstPrefix + key.slice(srcPrefix.length)]);\n }\n }\n for (const [oldKey, newKey] of migrations) {\n const content = this.files.get(oldKey);\n if (content !== undefined) {\n this.files.delete(oldKey);\n this.files.set(newKey, content);\n }\n }\n const dirsToMigrate: string[] = [];\n for (const dir of this.dirs) {\n if (dir === srcAbs || dir.startsWith(srcPrefix)) dirsToMigrate.push(dir);\n }\n for (const oldDir of dirsToMigrate) {\n this.dirs.delete(oldDir);\n const newDir = oldDir === srcAbs ? dstAbs : dstPrefix + oldDir.slice(srcPrefix.length);\n this.dirs.add(newDir);\n }\n }\n\n // Test helpers\n getAll(): Map<string, string> {\n return new Map(this.files);\n }\n clear(): void {\n this.files.clear();\n this.dirs.clear();\n }\n}\n","/**\n * Internal SinkManager — fans `WorkspaceWriteEvent` out to every\n * registered `WorkspaceObserver`. A slow / hung observer does not crash\n * the writer; results are collected via `Promise.allSettled`.\n *\n * @packageDocumentation\n */\n\nimport type { WorkspaceObserver, WorkspaceWriteEvent } from '../types.js';\n\nexport class SinkManager {\n private readonly observers: WorkspaceObserver[] = [];\n\n /** Register an observer; returns an unsubscribe function. */\n subscribe(observer: WorkspaceObserver): () => void {\n this.observers.push(observer);\n return () => {\n const i = this.observers.indexOf(observer);\n if (i >= 0) this.observers.splice(i, 1);\n };\n }\n\n /** Snapshot of observer count — useful for diagnostics. */\n get observerCount(): number {\n return this.observers.length;\n }\n\n /**\n * Notify all observers in parallel. Awaits all settlements. A rejected\n * observer is captured in the result; subsequent writes still proceed.\n */\n async notifyAll(event: WorkspaceWriteEvent): Promise<void> {\n if (this.observers.length === 0) return;\n const settled = await Promise.allSettled(\n this.observers.map(async o => o.onWrite(event)),\n );\n for (const r of settled) {\n if (r.status === 'rejected') {\n // Observer failure must not surface as a write failure, but it is\n // useful to keep visible. Console-only so the package stays\n // logger-agnostic.\n const reason = r.reason instanceof Error ? r.reason.message : String(r.reason);\n console.error(`[workspace] observer error on ${event.kind}: ${reason}`);\n }\n }\n }\n}\n","/**\n * Path discipline — every absolute path the service uses is computed here.\n *\n * Consumers never construct paths. Public methods take logical names; the\n * service calls into this module to resolve them. Trusted internal paths\n * (orbital files, session files) use `path.join` directly; sandboxed\n * methods (`readFile` / `writeFile`) go through `sandboxedPath` which\n * rejects traversal.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\n\n/** Single source of truth for workspace directory layout. */\nexport const WORKSPACE_LAYOUT = {\n ALMADAR_DIR: '.almadar',\n ORBITALS_DIR: 'orbitals',\n SESSIONS_DIR: '.almadar/sessions',\n COORDINATOR_DIR: '.almadar/sessions/Coordinator',\n TRACE_FILE: '.almadar/trace.jsonl',\n SCHEMA_FILE: 'schema.orb',\n COMPILED_DIR: 'apps',\n APP_MARKER: '.almadar/app-marker.json',\n USER_MEMORY: '.almadar/user.orb',\n PROJECT_MEMORY: '.almadar/project.orb',\n} as const;\n\n/** Logical orbital name → absolute `.orb` path. */\nexport function orbitalFile(workDir: string, name: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR, `${name}.orb`);\n}\n\n/** Archived orbital path. */\nexport function archivedOrbitalFile(workDir: string, name: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR, '.archived', `${name}.orb`);\n}\n\n/** Schema (combined output) file. */\nexport function schemaFile(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.SCHEMA_FILE);\n}\n\n/** Coordinator session dir. */\nexport function coordinatorDir(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.COORDINATOR_DIR);\n}\n\n/** Coordinator-level artifact path. */\nexport function coordinatorFile(workDir: string, basename: string): string {\n return path.join(coordinatorDir(workDir), basename);\n}\n\n/** Per-orbital session dir. */\nexport function orbitalSessionDir(workDir: string, orbital: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.SESSIONS_DIR, orbital);\n}\n\n/** Per-orbital session-file path. */\nexport function orbitalSessionFile(workDir: string, orbital: string, basename: string): string {\n return path.join(orbitalSessionDir(workDir, orbital), basename);\n}\n\n/** Trace JSONL. */\nexport function traceFile(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.TRACE_FILE);\n}\n\n/** Compiled output base. */\nexport function compiledDir(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.COMPILED_DIR);\n}\n\n/** Compiled-output path for a given relative key. */\nexport function compiledFile(workDir: string, relPath: string): string {\n return path.join(compiledDir(workDir), relPath);\n}\n\n/** App marker — used internally by the resolver/factory. */\nexport function appMarkerFile(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.APP_MARKER);\n}\n\n/**\n * Resolve a user-supplied relative path within the sandbox. Rejects\n * absolute paths, `..` traversal, and any path that resolves outside\n * `workDir`. Returns the absolute resolved path on success.\n */\nexport function sandboxedPath(workDir: string, relPath: string): string {\n if (typeof relPath !== 'string' || relPath.length === 0) {\n throw new Error('sandbox: empty relative path');\n }\n if (path.isAbsolute(relPath)) {\n throw new Error(`sandbox: absolute paths are not allowed (${relPath})`);\n }\n // Reject Windows-style absolute paths on cross-platform consumers.\n if (/^[a-zA-Z]:[\\\\/]/.test(relPath)) {\n throw new Error(`sandbox: drive-letter paths are not allowed (${relPath})`);\n }\n const rootAbs = path.resolve(workDir);\n const target = path.resolve(rootAbs, relPath);\n if (target !== rootAbs && !target.startsWith(rootAbs + path.sep)) {\n throw new Error(`sandbox: path escapes workspace (${relPath})`);\n }\n return target;\n}\n\n/** Validate an orbital logical name — no path separators, no `..`. */\nexport function assertOrbitalName(name: string): void {\n if (typeof name !== 'string' || name.length === 0) {\n throw new Error('orbital name: empty');\n }\n if (name.includes('/') || name.includes('\\\\') || name === '.' || name === '..') {\n throw new Error(`orbital name: invalid (${name})`);\n }\n}\n","/**\n * Mint-time templates. Written by `openWorkspace` when minting a fresh\n * workspace. Internal — not exported from the package barrel.\n *\n * The shapes follow @almadar/core's `OrbitalSchema` but are kept here as\n * literal JSON so this package has zero dependency on the std memory\n * orbital definitions.\n *\n * @packageDocumentation\n */\n\nimport type { JsonObject } from '@almadar/core';\n\n/** Empty scaffold for a new generation. */\nexport function createSchemaOrbTemplate(name: string): JsonObject {\n return {\n name,\n version: '1.0.0',\n description: '',\n orbitals: [],\n };\n}\n\n/** User preferences template — minimal seed. */\nexport function createUserOrbTemplate(userId: string): JsonObject {\n return {\n name: 'UserMemory',\n version: '1.0.0',\n description: 'User preferences and learned patterns',\n orbitals: [\n {\n name: 'PreferenceTracking',\n entity: {\n name: 'UserPreference',\n fields: [],\n instances: [\n {\n id: `pref-${userId}`,\n userId,\n },\n ],\n },\n traits: [],\n pages: [],\n },\n ],\n };\n}\n\n/** Project context template. */\nexport function createProjectOrbTemplate(projectName: string, appId?: string): JsonObject {\n return {\n name: 'ProjectMemory',\n version: '1.0.0',\n description: `Domain knowledge for ${projectName}`,\n orbitals: [\n {\n name: 'DomainKnowledge',\n entity: {\n name: 'ProjectContext',\n fields: [],\n instances: [\n {\n id: appId ?? `project-${projectName}`,\n appId: appId ?? '',\n projectName,\n lastUpdatedAt: new Date().toISOString(),\n },\n ],\n },\n traits: [],\n pages: [],\n },\n ],\n };\n}\n\nexport function serializeJson(value: JsonObject): string {\n return JSON.stringify(value, null, 2);\n}\n","/**\n * Thin wrapper around local `git` CLI for workspace-local operations\n * (init, add, commit, tag, push, pull, status). No `node:fs` use here —\n * existence checks ride the backend.\n *\n * @packageDocumentation\n */\n\nimport { execFile } from 'node:child_process';\nimport path from 'node:path';\nimport type { WorkspaceBackend } from './types.js';\n\nexport interface GitStatus {\n clean: boolean;\n staged: string[];\n modified: string[];\n untracked: string[];\n}\n\nexport class GitClient {\n constructor(private readonly cwd: string, private readonly backend: WorkspaceBackend) {}\n\n /** Is the working dir already a git repo? */\n async isRepo(): Promise<boolean> {\n return this.backend.exists(path.join(this.cwd, '.git'));\n }\n\n async init(): Promise<void> {\n if (await this.isRepo()) return;\n await this.exec(['init']);\n await this.exec(['config', 'user.email', 'agent@almadar.io']);\n await this.exec(['config', 'user.name', 'Almadar Agent']);\n }\n\n async addAll(): Promise<void> {\n await this.exec(['add', '-A']);\n }\n\n async commit(message: string): Promise<string | null> {\n try {\n const out = await this.exec(['commit', '-m', message, '--allow-empty-message']);\n const match = out.match(/\\[[\\w/.-]+ ([a-f0-9]+)\\]/);\n return match ? match[1] : null;\n } catch (err: unknown) {\n if (err instanceof Error && err.message.includes('nothing to commit')) return null;\n throw err;\n }\n }\n\n async tag(name: string, message?: string): Promise<void> {\n const args = ['tag'];\n if (message) {\n args.push('-a', name, '-m', message);\n } else {\n args.push(name);\n }\n await this.exec(args);\n }\n\n async push(remote = 'origin', branch?: string): Promise<void> {\n const args = ['push', remote];\n if (branch) args.push(branch);\n await this.exec(args);\n }\n\n async pull(remote = 'origin', branch?: string): Promise<void> {\n const args = ['pull', remote];\n if (branch) args.push(branch);\n await this.exec(args);\n }\n\n async hasRemote(remote = 'origin'): Promise<boolean> {\n try {\n const out = await this.exec(['remote']);\n return out.split('\\n').map(s => s.trim()).includes(remote);\n } catch {\n return false;\n }\n }\n\n async addRemote(remote: string, url: string): Promise<void> {\n await this.exec(['remote', 'add', remote, url]);\n }\n\n async status(): Promise<GitStatus> {\n const out = await this.exec(['status', '--porcelain']);\n const lines = out.split('\\n').filter(Boolean);\n const staged: string[] = [];\n const modified: string[] = [];\n const untracked: string[] = [];\n for (const line of lines) {\n const index = line[0];\n const work = line[1];\n const file = line.slice(3);\n if (index === '?' && work === '?') untracked.push(file);\n else if (index !== ' ' && index !== '?') staged.push(file);\n else if (work !== ' ') modified.push(file);\n }\n return { clean: lines.length === 0, staged, modified, untracked };\n }\n\n async headSha(): Promise<string | null> {\n try {\n const out = await this.exec(['rev-parse', 'HEAD']);\n return out.trim() || null;\n } catch {\n return null;\n }\n }\n\n private exec(args: string[]): Promise<string> {\n return execGit(args, this.cwd);\n }\n}\n\nfunction execGit(args: string[], cwd: string): Promise<string> {\n return new Promise((resolve, reject) => {\n execFile('git', args, { cwd, maxBuffer: 10 * 1024 * 1024 }, (err, stdout, stderr) => {\n if (err) {\n const message = stderr?.trim() || stdout?.trim() || err.message;\n reject(new Error(`git ${args[0]}: ${message}`));\n return;\n }\n resolve(stdout);\n });\n });\n}\n","/**\n * Internal lifecycle helpers used by `openWorkspace` on mint/adopt/resume.\n *\n * - Create the workspace directory skeleton.\n * - Write mint-time templates (schema.orb, user.orb, project.orb) if missing.\n * - Initialize git when `github` is supplied.\n *\n * No `node:fs` use here — everything rides the backend.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { WorkspaceBackend } from './types.js';\nimport {\n WORKSPACE_LAYOUT,\n coordinatorDir,\n orbitalSessionDir,\n schemaFile,\n} from './path-layout.js';\nimport {\n createSchemaOrbTemplate,\n createUserOrbTemplate,\n createProjectOrbTemplate,\n serializeJson,\n} from './templates.js';\nimport { GitClient } from './git-client.js';\n\n/** Make sure every workspace dir exists. */\nexport async function ensureSkeleton(\n backend: WorkspaceBackend,\n workDir: string,\n): Promise<void> {\n await backend.mkdir(workDir, { recursive: true });\n await backend.mkdir(path.join(workDir, WORKSPACE_LAYOUT.ALMADAR_DIR), { recursive: true });\n await backend.mkdir(path.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR), { recursive: true });\n await backend.mkdir(path.join(workDir, WORKSPACE_LAYOUT.SESSIONS_DIR), { recursive: true });\n await backend.mkdir(coordinatorDir(workDir), { recursive: true });\n}\n\n/** Initialise per-orbital session dir lazily. */\nexport async function ensureOrbitalSessionDir(\n backend: WorkspaceBackend,\n workDir: string,\n orbital: string,\n): Promise<void> {\n await backend.mkdir(orbitalSessionDir(workDir, orbital), { recursive: true });\n}\n\n/** Write mint-time templates only when they don't exist. */\nexport async function writeMintTemplatesIfMissing(\n backend: WorkspaceBackend,\n workDir: string,\n userId: string,\n projectName: string,\n appId?: string,\n): Promise<void> {\n const schemaPath = schemaFile(workDir);\n if (!backend.exists(schemaPath)) {\n await backend.writeFile(schemaPath, serializeJson(createSchemaOrbTemplate(projectName)));\n }\n const userPath = path.join(workDir, WORKSPACE_LAYOUT.USER_MEMORY);\n if (!backend.exists(userPath)) {\n await backend.writeFile(userPath, serializeJson(createUserOrbTemplate(userId)));\n }\n const projectPath = path.join(workDir, WORKSPACE_LAYOUT.PROJECT_MEMORY);\n if (!backend.exists(projectPath)) {\n await backend.writeFile(\n projectPath,\n serializeJson(createProjectOrbTemplate(projectName, appId)),\n );\n }\n}\n\n/** Initialise git for the workspace if it isn't already a repo. */\nexport async function ensureGitInit(\n backend: WorkspaceBackend,\n workDir: string,\n): Promise<GitClient> {\n const git = new GitClient(workDir, backend);\n await git.init();\n return git;\n}\n","/**\n * Lifecycle helpers — read + write the per-workspace app marker, and\n * scan a user's workspace root for one that matches a known `appId`.\n *\n * No `node:fs` here — everything rides the backend.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport { randomBytes } from 'node:crypto';\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/**\n * Compose a fresh session dir under `<workspacesRoot>/<userId>/`.\n *\n * The suffix combines `Date.now().toString(36)` with 4 hex chars of\n * `crypto.randomBytes` so two concurrent mints in the same millisecond\n * cannot collide on the same path. Without the random tail, two\n * `mintSessionDir` calls in the same ms produced the same path; the\n * subsequent `backend.mkdir(..., { recursive: true })` silently succeeded\n * for both, and two `WorkspaceService` instances ended up pointing at\n * the same directory — observed in apps/builder during concurrent\n * `/analyze` + `/skill/generate-stream` requests.\n */\nexport function mintSessionDir(workspacesRoot: string, userId: string): string {\n const ts = new Date().toISOString().slice(0, 10);\n const suffix = `${Date.now().toString(36)}${randomBytes(2).toString('hex')}`;\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 * Public types for the workspace index — Phase A of\n * `docs/Almadar_Workspace_Index.md`. Identity vectors per orbital and\n * per extraTraits[] entry, used for semantic coercion of LLM-emitted\n * names back to canonical entities (R-10 orbital name drift + R-8\n * duplicate-ref trait drift).\n *\n * @packageDocumentation\n */\n\nimport type { JsonObject } from '@almadar/core';\n\n/** Schema version baked into every sidecar; mismatch triggers re-bake. */\nexport const WORKSPACE_INDEX_SCHEMA_VERSION = 1 as const;\n\n/** Default coercion threshold per the doc's locked decision. */\nexport const DEFAULT_COERCION_THRESHOLD = 0.85 as const;\n\n/**\n * Per-extraTraits[] entry identity vector. Baked alongside the orbital\n * sidecar whenever the orbital's spec.json is written.\n */\nexport interface ExtraTraitIdentity {\n /** Canonical ref of this entry (the key for coercion match). */\n ref: string;\n /** Entry's `name` rename, or trait-name tail of ref if no rename. */\n alias: string;\n /** Fingerprint text actually embedded — kept for debugging. */\n fingerprint: string;\n /** 768-d vector from bge-base-en-v1.5 (or whatever model the embedder uses). */\n vector: readonly number[];\n}\n\n/**\n * Per-orbital sidecar contents, persisted at\n * `.almadar/sessions/<Orbital>/index.json` after every spec write.\n */\nexport interface OrbitalIndexEntry {\n schemaVersion: typeof WORKSPACE_INDEX_SCHEMA_VERSION;\n /** sha256 of the spec.json that produced this sidecar. */\n specChecksum: string;\n /** Orbital-level identity vector. */\n identityVector: readonly number[];\n /** Fingerprint text for the orbital identity vector — kept for debugging. */\n identityFingerprint: string;\n /** One per current `extraTraits[]` entry on this orbital. */\n extraTraitIdentities: readonly ExtraTraitIdentity[];\n /** Epoch ms at bake time — debugging only. */\n bakedAt: number;\n}\n\n/**\n * Input to `resolveTraitRef` — the LLM's emitted extraTraits entry,\n * narrowed to the fields the coercion needs to see. Mirrors the\n * `RawExtraTraitRef` shape rabit's analyzer constructs.\n */\nexport interface TraitRefEmit {\n ref: string;\n name?: string;\n linkedEntity?: string;\n}\n\n/**\n * Common result shape for both `resolveOrbitalName` and\n * `resolveTraitRef`. `coercedTo` is null when no existing entity\n * exceeded the threshold — the emit is genuinely new.\n */\nexport interface ResolveResult {\n coercedTo: string | null;\n similarity: number;\n method: 'identity-vector';\n}\n\n/**\n * Options for both `resolveOrbitalName` and `resolveTraitRef`. The\n * default threshold (0.85) lives in `DEFAULT_COERCION_THRESHOLD`.\n */\nexport interface ResolveOptions {\n threshold?: number;\n}\n\n/**\n * Stats surface for diagnostics. Cheap to compute (read in-memory\n * state).\n */\nexport interface WorkspaceIndexStats {\n orbitalCount: number;\n extraTraitIdentityCount: number;\n staleOrbitals: readonly string[];\n}\n\n/**\n * Public surface exposed via `WorkspaceService.index`.\n */\nexport interface WorkspaceIndex {\n /**\n * Walk every existing orbital, bake any missing or stale sidecars.\n * Called synchronously by `openWorkspace` (strict cold start per the\n * doc decision) so this is the authoritative point past which all\n * subsequent queries return real data. Idempotent — re-baking an\n * already-warm sidecar is a no-op (checksum matches).\n */\n warm(): Promise<void>;\n\n /**\n * R-10 coercion. Embed `name`, cosine-match against every orbital's\n * identity vector, return the best match if it exceeds the\n * threshold. Returns `{ coercedTo: null, ... }` when below threshold\n * or when no orbitals exist in the workspace.\n */\n resolveOrbitalName(name: string, opts?: ResolveOptions): Promise<ResolveResult>;\n\n /**\n * R-8 coercion. Embed an LLM-emitted trait emit, cosine-match against\n * the existing `extraTraits[]` identity vectors on the named orbital.\n * Returns the existing entry's `ref` (or its `name` rename) as\n * `coercedTo` when match exceeds threshold; null when the emit is a\n * genuinely new addition.\n *\n * Scoped per orbital — the same trait import on two different orbitals\n * is structurally legitimate, so we don't cross-coerce.\n */\n resolveTraitRef(\n emit: TraitRefEmit,\n orbitalContext: { orbitalName: string },\n opts?: ResolveOptions,\n ): Promise<ResolveResult>;\n\n /** Diagnostics surface. */\n stats(): WorkspaceIndexStats;\n}\n\n/**\n * Pluggable embedder — production wires `@almadar/llm`'s\n * `EmbeddingClient`; tests inject a deterministic mock.\n */\nexport interface EmbedderPort {\n /** Embed a batch of texts; returned vectors are in input order. */\n embedBatch(texts: readonly string[]): Promise<{\n embeddings: readonly (readonly number[])[];\n }>;\n}\n\n/**\n * JSON shape persisted at `.almadar/sessions/<Orbital>/index.json`.\n * Mirrors `OrbitalIndexEntry` but with the JsonObject upper-bound the\n * workspace's writeJsonFile helper requires.\n */\nexport type OrbitalIndexSidecar = OrbitalIndexEntry & JsonObject;\n","/**\n * Cosine similarity. Defensive: zero-vector and length-mismatch\n * return 0 instead of throwing or returning NaN — a malformed manifest\n * entry shouldn't crash the index.\n *\n * @packageDocumentation\n */\n\nexport function cosineSimilarity(\n a: readonly number[],\n b: readonly number[],\n): number {\n if (a.length !== b.length || a.length === 0) return 0;\n let dot = 0;\n let magA = 0;\n let magB = 0;\n for (let i = 0; i < a.length; i++) {\n const av = a[i] ?? 0;\n const bv = b[i] ?? 0;\n dot += av * bv;\n magA += av * av;\n magB += bv * bv;\n }\n if (magA === 0 || magB === 0) return 0;\n return dot / (Math.sqrt(magA) * Math.sqrt(magB));\n}\n","/**\n * Fingerprint composition — pure functions that turn typed spec state\n * into the short text strings the embedder hashes.\n *\n * Per the doc, orbital identity vectors stay small (~50-100 tokens)\n * so they're stable under spec edits, while content/extraTrait\n * fingerprints can grow more.\n *\n * @packageDocumentation\n */\n\nimport type { JsonObject, JsonValue } from '@almadar/core';\n\n/**\n * Compose the orbital identity fingerprint from a spec.\n *\n * Pulls these typed fields off the spec (all optional — when missing\n * the segment is omitted, never `undefined` interpolated):\n * - `orbitalName` (top-level on spec) — the discriminating signal\n * - `params.entityName` — boosts cosine when the name drifts but the\n * entity stays (e.g. `VisitOrbital` → `VisitV2Orbital`, same entity)\n *\n * The `organism` is intentionally OMITTED: every orbital in an app\n * shares it (`std-record-modal` across an entire CRUD app), so\n * including it dominates the cosine and makes unrelated orbital\n * names look similar (real-embedder spec showed `InvoiceOrbital ·\n * Invoice · std-record-modal` matching `ProductOrbital` above the\n * 0.85 threshold). Keeping the fingerprint name+entity-only sharpens\n * the geometry for R-10 coercion.\n *\n * The output is a single string with ` · ` separators.\n */\nexport function composeOrbitalIdentityFingerprint(\n spec: JsonObject,\n): string {\n const segments: string[] = [];\n pushString(segments, spec['orbitalName']);\n const params = asJsonObject(spec['params']);\n if (params) {\n pushString(segments, params['entityName']);\n }\n return segments.join(' · ');\n}\n\n/**\n * Compose the per-extraTraits[] entry fingerprint.\n *\n * Used both at bake time (for the sidecar's extraTraitIdentities[])\n * and at query time (for the LLM-emitted entry being coerced). The\n * shape MUST be identical on both sides so cosine geometry is\n * meaningful — same fields in the same order.\n */\nexport function composeExtraTraitIdentityFingerprint(emit: {\n ref: string;\n name?: string;\n linkedEntity?: string;\n}): string {\n const segments: string[] = [];\n pushString(segments, emit.ref);\n // Emit the alias explicitly so the embedder sees \"ProductAccessControl\n // for RowAccessGate\" — not just the ref.\n const alias = emit.name && emit.name.length > 0 ? emit.name : tailOfRef(emit.ref);\n if (alias && alias !== emit.ref) {\n pushString(segments, alias);\n }\n pushString(segments, emit.linkedEntity);\n return segments.join(' · ');\n}\n\n/**\n * Derive the alias an entry would canonically be referenced by. Used by\n * the sidecar baker to store the `alias` field next to each extraTrait\n * identity vector — also the value `resolveTraitRef` returns as\n * `coercedTo` when a match fires.\n */\nexport function deriveExtraTraitAlias(emit: { ref: string; name?: string }): string {\n if (emit.name && emit.name.length > 0) return emit.name;\n return tailOfRef(emit.ref);\n}\n\nfunction pushString(out: string[], value: JsonValue | undefined): void {\n if (typeof value === 'string' && value.length > 0) out.push(value);\n}\n\nfunction asJsonObject(value: JsonValue | undefined): JsonObject | null {\n if (value === undefined || value === null) return null;\n if (typeof value !== 'object' || Array.isArray(value)) return null;\n return value;\n}\n\nfunction tailOfRef(ref: string): string {\n const match = /\\.traits\\.([A-Za-z0-9_]+)$/.exec(ref);\n return match ? match[1] : ref;\n}\n","/**\n * Sidecar I/O for per-orbital index entries.\n *\n * Reuses the workspace package's existing typed file helpers\n * (`readJsonFile` + `writeJsonFile`) and path layout\n * (`orbitalSessionFile`). No parallel file plumbing; no parallel path\n * math.\n *\n * @packageDocumentation\n */\n\nimport { createHash } from 'node:crypto';\nimport type { JsonObject } from '@almadar/core';\nimport type { WorkspaceBackend } from '../internal/types.js';\nimport { orbitalSessionFile } from '../internal/path-layout.js';\nimport { readJsonFile, writeJsonFile } from '../internal/memory-files.js';\nimport { ensureOrbitalSessionDir } from '../internal/workspace-manager.js';\nimport type { OrbitalIndexEntry, OrbitalIndexSidecar } from './types.js';\nimport { WORKSPACE_INDEX_SCHEMA_VERSION } from './types.js';\n\nconst SIDECAR_BASENAME = 'index.json';\n\nexport function sidecarPath(workDir: string, orbital: string): string {\n return orbitalSessionFile(workDir, orbital, SIDECAR_BASENAME);\n}\n\nexport async function readSidecar(\n backend: WorkspaceBackend,\n workDir: string,\n orbital: string,\n): Promise<OrbitalIndexEntry | null> {\n const raw = await readJsonFile<OrbitalIndexSidecar>(backend, sidecarPath(workDir, orbital));\n if (raw === null) return null;\n if (raw.schemaVersion !== WORKSPACE_INDEX_SCHEMA_VERSION) return null;\n return raw;\n}\n\nexport async function writeSidecar(\n backend: WorkspaceBackend,\n workDir: string,\n orbital: string,\n entry: OrbitalIndexEntry,\n): Promise<void> {\n await ensureOrbitalSessionDir(backend, workDir, orbital);\n // Cast through JsonObject is safe — OrbitalIndexEntry's shape only\n // contains primitives + arrays of primitives + arrays of objects whose\n // fields are likewise json-compatible. The structural compatibility is\n // captured by the OrbitalIndexSidecar intersection type.\n await writeJsonFile<OrbitalIndexSidecar>(\n backend,\n sidecarPath(workDir, orbital),\n entry as OrbitalIndexSidecar,\n );\n}\n\n/**\n * SHA-256 over the JSON-stringified spec — the same content the\n * sidecar's embeddings were computed from. Used to detect stale\n * sidecars (spec changed since last bake → re-bake).\n */\nexport function checksumSpec(spec: JsonObject): string {\n return createHash('sha256').update(JSON.stringify(spec)).digest('hex');\n}\n","/**\n * `WorkspaceIndexImpl` — the runtime carrying the identity vectors per\n * orbital + per extraTraits[] entry. Wires into the workspace's\n * `SinkManager` to re-bake on each `kind: 'spec'` write; exposes the\n * coercion methods `resolveOrbitalName` + `resolveTraitRef`.\n *\n * @packageDocumentation\n */\n\nimport type { JsonObject, JsonValue } from '@almadar/core';\nimport type { WorkspaceBackend } from '../internal/types.js';\nimport type { SinkManager } from '../internal/sink-manager.js';\nimport type {\n EmbedderPort,\n ExtraTraitIdentity,\n OrbitalIndexEntry,\n ResolveOptions,\n ResolveResult,\n TraitRefEmit,\n WorkspaceIndex,\n WorkspaceIndexStats,\n} from './types.js';\nimport {\n DEFAULT_COERCION_THRESHOLD,\n WORKSPACE_INDEX_SCHEMA_VERSION,\n} from './types.js';\nimport { cosineSimilarity } from './cosine.js';\nimport {\n composeExtraTraitIdentityFingerprint,\n composeOrbitalIdentityFingerprint,\n deriveExtraTraitAlias,\n} from './fingerprint.js';\nimport { checksumSpec, readSidecar, writeSidecar } from './sidecar.js';\n\nexport interface WorkspaceIndexDeps {\n workDir: string;\n backend: WorkspaceBackend;\n sinks: SinkManager;\n embedder: EmbedderPort;\n listOrbitals: () => string[];\n readSpec: (orbital: string) => JsonObject | null;\n}\n\ninterface ExtraTraitFingerprintInput {\n fingerprint: string;\n ref: string;\n alias: string;\n}\n\nexport class WorkspaceIndexImpl implements WorkspaceIndex {\n private readonly entries = new Map<string, OrbitalIndexEntry>();\n /** Serialized re-bake per orbital so concurrent writeSpec events don't race. */\n private readonly bakeQueue = new Map<string, Promise<void>>();\n /** Names whose checksum doesn't match the current spec — surfaced via stats. */\n private readonly stale = new Set<string>();\n\n constructor(private readonly deps: WorkspaceIndexDeps) {\n this.deps.sinks.subscribe({\n onWrite: async (event) => {\n if (event.kind !== 'spec') return;\n await this.rebakeOrbital(event.orbital, event.content);\n },\n });\n }\n\n async warm(): Promise<void> {\n const orbitals = this.deps.listOrbitals();\n const work: Promise<void>[] = [];\n for (const orbital of orbitals) {\n const spec = this.deps.readSpec(orbital);\n if (spec === null) {\n // Orbital exists on disk but has no spec.json — nothing to bake.\n // (Coordinator owns spec creation; an orbital may be archived or\n // mid-creation.) Keep the entry slot empty.\n continue;\n }\n const checksum = checksumSpec(spec);\n const existing = await readSidecar(this.deps.backend, this.deps.workDir, orbital);\n if (existing !== null && existing.specChecksum === checksum) {\n this.entries.set(orbital, existing);\n this.stale.delete(orbital);\n continue;\n }\n work.push(this.bakeAndPersist(orbital, spec, checksum));\n }\n await Promise.all(work);\n }\n\n async resolveOrbitalName(name: string, opts?: ResolveOptions): Promise<ResolveResult> {\n const threshold = opts?.threshold ?? DEFAULT_COERCION_THRESHOLD;\n if (this.entries.size === 0) {\n return { coercedTo: null, similarity: 0, method: 'identity-vector' };\n }\n const [vector] = await this.embedOne(name);\n let bestOrbital: string | null = null;\n let bestSim = 0;\n for (const [orbital, entry] of this.entries) {\n const sim = cosineSimilarity(vector, entry.identityVector);\n if (sim > bestSim) {\n bestSim = sim;\n bestOrbital = orbital;\n }\n }\n if (bestOrbital !== null && bestSim >= threshold) {\n return { coercedTo: bestOrbital, similarity: bestSim, method: 'identity-vector' };\n }\n return { coercedTo: null, similarity: bestSim, method: 'identity-vector' };\n }\n\n async resolveTraitRef(\n emit: TraitRefEmit,\n orbitalContext: { orbitalName: string },\n opts?: ResolveOptions,\n ): Promise<ResolveResult> {\n const threshold = opts?.threshold ?? DEFAULT_COERCION_THRESHOLD;\n const entry = this.entries.get(orbitalContext.orbitalName);\n if (!entry || entry.extraTraitIdentities.length === 0) {\n return { coercedTo: null, similarity: 0, method: 'identity-vector' };\n }\n const fingerprint = composeExtraTraitIdentityFingerprint(emit);\n const [vector] = await this.embedOne(fingerprint);\n let bestAlias: string | null = null;\n let bestSim = 0;\n for (const candidate of entry.extraTraitIdentities) {\n const sim = cosineSimilarity(vector, candidate.vector);\n if (sim > bestSim) {\n bestSim = sim;\n bestAlias = candidate.alias;\n }\n }\n if (bestAlias !== null && bestSim >= threshold) {\n return { coercedTo: bestAlias, similarity: bestSim, method: 'identity-vector' };\n }\n return { coercedTo: null, similarity: bestSim, method: 'identity-vector' };\n }\n\n stats(): WorkspaceIndexStats {\n let extraTraitIdentityCount = 0;\n for (const entry of this.entries.values()) {\n extraTraitIdentityCount += entry.extraTraitIdentities.length;\n }\n return {\n orbitalCount: this.entries.size,\n extraTraitIdentityCount,\n staleOrbitals: Array.from(this.stale).sort(),\n };\n }\n\n private async rebakeOrbital(orbital: string, spec: JsonObject): Promise<void> {\n const checksum = checksumSpec(spec);\n const existing = this.entries.get(orbital);\n if (existing && existing.specChecksum === checksum) return;\n await this.enqueueBake(orbital, () => this.bakeAndPersist(orbital, spec, checksum));\n }\n\n private enqueueBake(orbital: string, op: () => Promise<void>): Promise<void> {\n const prev = this.bakeQueue.get(orbital) ?? Promise.resolve();\n const next = prev.then(op);\n const swallowed = next.catch(() => undefined);\n this.bakeQueue.set(orbital, swallowed);\n return next;\n }\n\n private async bakeAndPersist(\n orbital: string,\n spec: JsonObject,\n checksum: string,\n ): Promise<void> {\n this.stale.add(orbital);\n const identityFingerprint = composeOrbitalIdentityFingerprint(spec);\n const extraInputs = extractExtraTraitInputs(spec);\n const allTexts = [identityFingerprint, ...extraInputs.map((e) => e.fingerprint)];\n const { embeddings } = await this.deps.embedder.embedBatch(allTexts);\n if (embeddings.length !== allTexts.length) {\n throw new Error(\n `[workspace-index] embedder returned ${embeddings.length} vectors for ${allTexts.length} inputs`,\n );\n }\n const [identityVector, ...extraVectors] = embeddings;\n const extraTraitIdentities: ExtraTraitIdentity[] = extraInputs.map((input, idx) => ({\n ref: input.ref,\n alias: input.alias,\n fingerprint: input.fingerprint,\n vector: extraVectors[idx],\n }));\n const entry: OrbitalIndexEntry = {\n schemaVersion: WORKSPACE_INDEX_SCHEMA_VERSION,\n specChecksum: checksum,\n identityVector,\n identityFingerprint,\n extraTraitIdentities,\n bakedAt: Date.now(),\n };\n await writeSidecar(this.deps.backend, this.deps.workDir, orbital, entry);\n this.entries.set(orbital, entry);\n this.stale.delete(orbital);\n }\n\n private async embedOne(text: string): Promise<readonly (readonly number[])[]> {\n const { embeddings } = await this.deps.embedder.embedBatch([text]);\n if (embeddings.length !== 1) {\n throw new Error(\n `[workspace-index] embedder returned ${embeddings.length} vectors for a single text`,\n );\n }\n return embeddings;\n }\n}\n\nfunction extractExtraTraitInputs(spec: JsonObject): ExtraTraitFingerprintInput[] {\n const params = asJsonObject(spec['params']);\n if (!params) return [];\n const extras = params['extraTraits'];\n if (!Array.isArray(extras)) return [];\n const out: ExtraTraitFingerprintInput[] = [];\n for (const entry of extras) {\n const obj = asJsonObject(entry);\n if (!obj) continue;\n const ref = typeof obj['ref'] === 'string' ? obj['ref'] : null;\n if (ref === null) continue;\n const name = typeof obj['name'] === 'string' ? obj['name'] : undefined;\n const linkedEntity = typeof obj['linkedEntity'] === 'string' ? obj['linkedEntity'] : undefined;\n const alias = deriveExtraTraitAlias({ ref, name });\n out.push({\n ref,\n alias,\n fingerprint: composeExtraTraitIdentityFingerprint({ ref, name, linkedEntity }),\n });\n }\n return out;\n}\n\nfunction asJsonObject(value: JsonValue | undefined): JsonObject | null {\n if (value === undefined || value === null) return null;\n if (typeof value !== 'object' || Array.isArray(value)) return null;\n return value;\n}\n","/**\n * `WorkspaceService` implementation. The single chokepoint — every read\n * and write that any consumer performs lands here, computes its absolute\n * path via `path-layout.ts`, runs the backend op, then fans out a typed\n * `WorkspaceWriteEvent` to every registered observer.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { JsonObject, JsonValue } from '@almadar/core';\nimport type {\n FileTreeNode,\n GitHubConfig,\n GitStatusInfo,\n WorkspaceObserver,\n WorkspaceService,\n WorkspaceWriteEvent,\n} from './types.js';\nimport type { WorkspaceBackend } from './internal/types.js';\nimport { SinkManager } from './internal/sink-manager.js';\nimport { GitClient } from './internal/git-client.js';\nimport {\n archivedOrbitalFile,\n assertOrbitalName,\n compiledDir,\n compiledFile,\n coordinatorFile,\n orbitalFile,\n orbitalSessionDir,\n orbitalSessionFile,\n sandboxedPath,\n schemaFile,\n traceFile,\n WORKSPACE_LAYOUT,\n} from './internal/path-layout.js';\nimport {\n ensureOrbitalSessionDir,\n} from './internal/workspace-manager.js';\nimport {\n appendJsonLine,\n readJsonFile,\n readJsonLines,\n writeJsonFile,\n} from './internal/memory-files.js';\nimport { WorkspaceIndexImpl } from './workspace-index/index-impl.js';\nimport type { EmbedderPort, WorkspaceIndex } from './workspace-index/types.js';\n\ninterface ServiceCtorArgs {\n workDir: string;\n backend: WorkspaceBackend;\n sinks: SinkManager;\n embedder: EmbedderPort;\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 readonly index: WorkspaceIndex;\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 this.index = new WorkspaceIndexImpl({\n workDir: this.workDir,\n backend: this.backend,\n sinks: this.sinks,\n embedder: args.embedder,\n listOrbitals: () => this.listOrbitals(),\n readSpec: (orbital) => this.readSpec(orbital),\n });\n }\n\n // === Identity ===\n\n get appId(): string | undefined {\n return this._appId;\n }\n\n setAppId(id: string): void {\n this._appId = id;\n }\n\n // === Helpers ===\n\n /** Run `op` under a per-path serial lock. */\n private withLock<T>(absPath: string, op: () => Promise<T>): Promise<T> {\n const prev = this.writeQueue.get(absPath) ?? Promise.resolve();\n let resolved!: T;\n const next = prev.then(async () => {\n resolved = await op();\n });\n // Best-effort: ensure the queue continues even on failure.\n const swallowed = next.catch(() => undefined);\n this.writeQueue.set(absPath, swallowed);\n return next.then(() => resolved);\n }\n\n /** Make sure the parent directory of `absPath` exists. */\n private async ensureParent(absPath: string): Promise<void> {\n await this.backend.mkdir(path.dirname(absPath), { recursive: true });\n }\n\n private async emit(event: WorkspaceWriteEvent): Promise<void> {\n await this.sinks.notifyAll(event);\n }\n\n // === Orbital artifacts ===\n\n readOrbital(name: string): string | null {\n assertOrbitalName(name);\n const p = orbitalFile(this.workDir, name);\n if (!this.backend.exists(p)) return null;\n try {\n return this.backend.readFileSync(p);\n } catch {\n return null;\n }\n }\n\n async writeOrbital(name: string, content: string): Promise<void> {\n assertOrbitalName(name);\n const p = orbitalFile(this.workDir, name);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, content);\n });\n await this.emit({ kind: 'orbital', name, content });\n }\n\n listOrbitals(): string[] {\n const dir = path.join(this.workDir, WORKSPACE_LAYOUT.ORBITALS_DIR);\n if (!this.backend.exists(dir)) return [];\n try {\n return this.backend.readdirSync(dir)\n .filter(f => f.endsWith('.orb'))\n .map(f => f.replace(/\\.orb$/, ''))\n .sort();\n } catch {\n return [];\n }\n }\n\n async archiveOrbital(name: string): Promise<void> {\n assertOrbitalName(name);\n const src = orbitalFile(this.workDir, name);\n if (!this.backend.exists(src)) return;\n const content = await this.backend.readFile(src);\n const dst = archivedOrbitalFile(this.workDir, name);\n await this.withLock(src, async () => {\n await this.ensureParent(dst);\n await this.backend.writeFile(dst, content);\n await this.backend.unlink(src);\n });\n await this.emit({ kind: 'orbital-archived', name });\n }\n\n async renameOrbital(from: string, to: string): Promise<void> {\n assertOrbitalName(from);\n assertOrbitalName(to);\n const src = orbitalFile(this.workDir, from);\n const dst = orbitalFile(this.workDir, to);\n if (!this.backend.exists(src)) return;\n const content = await this.backend.readFile(src);\n await this.withLock(src, async () => {\n await this.ensureParent(dst);\n await this.backend.writeFile(dst, content);\n await this.backend.unlink(src);\n });\n await this.emit({ kind: 'orbital-renamed', from, to });\n }\n\n async renameOrbitalSession(from: string, to: string): Promise<void> {\n assertOrbitalName(from);\n assertOrbitalName(to);\n const src = orbitalSessionDir(this.workDir, from);\n const dst = orbitalSessionDir(this.workDir, to);\n if (!this.backend.exists(src)) return;\n if (this.backend.exists(dst)) return;\n await this.withLock(src, async () => {\n await this.backend.rename(src, dst);\n });\n await this.emit({ kind: 'session-renamed', from, to });\n }\n\n // === Schema artifact ===\n\n readSchema(): string | null {\n const p = schemaFile(this.workDir);\n if (!this.backend.exists(p)) return null;\n try {\n return this.backend.readFileSync(p);\n } catch {\n return null;\n }\n }\n\n async writeSchema(content: string): Promise<void> {\n const p = schemaFile(this.workDir);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, content);\n });\n await this.emit({ kind: 'schema', content });\n }\n\n // === Coordinator session ===\n\n readAnalysis<T extends JsonObject>(): T | null {\n return readJsonFileSync<T>(this.backend, coordinatorFile(this.workDir, COORD_FILES.analysis));\n }\n\n async writeAnalysis<T extends JsonObject>(analysis: T): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.analysis);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await writeJsonFile(this.backend, p, analysis);\n });\n await this.emit({ kind: 'analysis', content: analysis });\n }\n\n readPlan<T extends JsonObject>(): T | null {\n return readJsonFileSync<T>(this.backend, coordinatorFile(this.workDir, COORD_FILES.plan));\n }\n\n async writePlan<T extends JsonObject>(plan: T): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.plan);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await writeJsonFile(this.backend, p, plan);\n });\n await this.emit({ kind: 'plan', content: plan });\n }\n\n readClarificationAnswers(): Record<string, string> {\n const p = coordinatorFile(this.workDir, COORD_FILES.clarifications);\n if (!this.backend.exists(p)) return {};\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p)) as JsonObject;\n const out: Record<string, string> = {};\n for (const k of Object.keys(parsed)) {\n const v = parsed[k];\n if (typeof v === 'string') out[k] = v;\n }\n return out;\n } catch {\n return {};\n }\n }\n\n async writeClarificationAnswers(answers: Record<string, string>): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.clarifications);\n const asJson: JsonObject = { ...answers };\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await writeJsonFile(this.backend, p, asJson);\n });\n await this.emit({ kind: 'clarifications', content: answers });\n }\n\n readCoordinatorMessages<T extends JsonValue>(): T[] | null {\n const p = coordinatorFile(this.workDir, COORD_FILES.messages);\n if (!this.backend.exists(p)) return null;\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p));\n if (!Array.isArray(parsed)) return null;\n return parsed as T[];\n } catch {\n return null;\n }\n }\n\n async writeCoordinatorMessages<T extends JsonValue>(messages: T[]): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.messages);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, JSON.stringify(messages, null, 2));\n });\n await this.emit({ kind: 'coordinator-messages', content: messages as JsonValue[] });\n }\n\n // === Per-orbital session ===\n\n private orbitalFile(orbital: string, basename: string): string {\n assertOrbitalName(orbital);\n return orbitalSessionFile(this.workDir, orbital, basename);\n }\n\n readSpec<T extends JsonObject>(orbital: string): T | null {\n return readJsonFileSync<T>(this.backend, this.orbitalFile(orbital, ORBITAL_FILES.spec));\n }\n\n async writeSpec<T extends JsonObject>(orbital: string, spec: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.spec);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await writeJsonFile(this.backend, p, spec);\n });\n await this.emit({ kind: 'spec', orbital, content: spec });\n }\n\n readMemory<T extends JsonObject>(orbital: string): T | null {\n return readJsonFileSync<T>(this.backend, this.orbitalFile(orbital, ORBITAL_FILES.memory));\n }\n\n async writeMemory<T extends JsonObject>(orbital: string, memory: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.memory);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await writeJsonFile(this.backend, p, memory);\n });\n await this.emit({ kind: 'memory', orbital, content: memory });\n }\n\n async appendHistory<T extends JsonObject>(orbital: string, entry: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.history);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await appendJsonLine(this.backend, p, entry);\n });\n await this.emit({ kind: 'history', orbital, entry });\n }\n\n readHistory<T extends JsonObject>(orbital: string): T[] {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.history);\n return readJsonLinesSync<T>(this.backend, p);\n }\n\n async appendParamsHistory<T extends JsonObject>(orbital: string, row: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.paramsHistory);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await appendJsonLine(this.backend, p, row);\n });\n await this.emit({ kind: 'params-history', orbital, row });\n }\n\n readErrors<T extends JsonObject>(orbital: string): T[] {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.errors);\n if (!this.backend.exists(p)) return [];\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p));\n if (!Array.isArray(parsed)) return [];\n return parsed as T[];\n } catch {\n return [];\n }\n }\n\n async writeErrors<T extends JsonObject>(orbital: string, errors: T[]): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.errors);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await this.backend.writeFile(p, JSON.stringify(errors, null, 2));\n });\n await this.emit({ kind: 'errors', orbital, content: errors });\n }\n\n readSubagentMessages<T extends JsonValue>(orbital: string): T[] | null {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.messages);\n if (!this.backend.exists(p)) return null;\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p));\n if (!Array.isArray(parsed)) return null;\n return parsed as T[];\n } catch {\n return null;\n }\n }\n\n async writeSubagentMessages<T extends JsonValue>(\n orbital: string,\n messages: T[],\n ): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.messages);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await this.backend.writeFile(p, JSON.stringify(messages, null, 2));\n });\n await this.emit({ kind: 'subagent-messages', orbital, content: messages as JsonValue[] });\n }\n\n // === Trace ===\n\n async emitTrace<T extends JsonObject>(event: T): Promise<void> {\n const p = traceFile(this.workDir);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await appendJsonLine(this.backend, p, event);\n });\n await this.emit({ kind: 'trace', event });\n }\n\n readTrace<T extends JsonObject>(): T[] {\n const p = traceFile(this.workDir);\n return readJsonLinesSync<T>(this.backend, p);\n }\n\n // === Compiled output ===\n\n async writeCompiled(relPath: string, content: string): Promise<void> {\n if (relPath.includes('..') || path.isAbsolute(relPath)) {\n throw new Error(`compiled: invalid relPath (${relPath})`);\n }\n const p = compiledFile(this.workDir, relPath);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, content);\n });\n await this.emit({ kind: 'compiled', relPath, content });\n }\n\n readCompiled(relPath: string): string | null {\n if (relPath.includes('..') || path.isAbsolute(relPath)) return null;\n const p = compiledFile(this.workDir, relPath);\n if (!this.backend.exists(p)) return null;\n try {\n return this.backend.readFileSync(p);\n } catch {\n return null;\n }\n }\n\n async clearCompiled(): Promise<void> {\n const dir = compiledDir(this.workDir);\n if (!this.backend.exists(dir)) return;\n await removeTree(this.backend, dir);\n }\n\n // === Sandboxed generic file I/O ===\n\n async readFile(relPath: string): Promise<string | null> {\n const abs = sandboxedPath(this.workDir, relPath);\n if (!this.backend.exists(abs)) return null;\n try {\n return await this.backend.readFile(abs);\n } catch {\n return null;\n }\n }\n\n async writeFile(relPath: string, content: string): Promise<void> {\n const abs = sandboxedPath(this.workDir, relPath);\n await this.withLock(abs, async () => {\n await this.ensureParent(abs);\n await this.backend.writeFile(abs, content);\n });\n await this.emit({ kind: 'file', relPath, content });\n }\n\n async listTree(relPath?: string): Promise<FileTreeNode[]> {\n const base = relPath === undefined ? this.workDir : sandboxedPath(this.workDir, relPath);\n if (!this.backend.exists(base)) return [];\n const out: FileTreeNode[] = [];\n await walk(this.backend, base, this.workDir, out);\n return out;\n }\n\n async exists(relPath: string): Promise<boolean> {\n let abs: string;\n try {\n abs = sandboxedPath(this.workDir, relPath);\n } catch {\n return false;\n }\n return this.backend.exists(abs);\n }\n\n // === Git ===\n\n async commitAndPush(opts: {\n message: string;\n tags?: string[];\n }): Promise<{ sha: string } | null> {\n if (!this.git) return null;\n await this.git.addAll();\n const sha = await this.git.commit(opts.message);\n if (sha === null) return null;\n if (opts.tags) {\n for (const t of opts.tags) await this.git.tag(t);\n }\n if (this.github && this.github.repoUrl) {\n if (!(await this.git.hasRemote('origin'))) {\n await this.git.addRemote('origin', this.github.repoUrl);\n }\n await this.git.push('origin', this.github.branch ?? 'main');\n }\n return { sha };\n }\n\n async pullIfLinked(): Promise<boolean> {\n if (!this.git || !this.github) return false;\n if (!(await this.git.hasRemote('origin'))) return false;\n await this.git.pull('origin', this.github.branch ?? 'main');\n return true;\n }\n\n async gitStatus(): Promise<GitStatusInfo> {\n if (!this.git) {\n return { clean: true, staged: [], modified: [], untracked: [], linked: false };\n }\n const s = await this.git.status();\n const linked = await this.git.hasRemote('origin');\n return { ...s, linked };\n }\n\n // === Observation ===\n\n subscribe(observer: WorkspaceObserver): () => void {\n return this.sinks.subscribe(observer);\n }\n\n // === Disposal ===\n\n async dispose(): Promise<void> {\n // Drain pending writes.\n const pending = Array.from(this.writeQueue.values());\n await Promise.allSettled(pending);\n // Optional final commit when configured.\n if (this.git && this.github) {\n try {\n await this.commitAndPush({ message: 'workspace: dispose' });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`[workspace] dispose: commitAndPush failed: ${msg}`);\n }\n }\n }\n}\n\n// ============================================================================\n// Sync helpers — wrap backend reads with safe JSON parse.\n// ============================================================================\n\nfunction readJsonFileSync<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n): T | null {\n if (!backend.exists(absPath)) return null;\n try {\n return JSON.parse(backend.readFileSync(absPath)) as T;\n } catch {\n return null;\n }\n}\n\nfunction readJsonLinesSync<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n): T[] {\n if (!backend.exists(absPath)) return [];\n try {\n const raw = backend.readFileSync(absPath);\n const out: T[] = [];\n for (const line of raw.split('\\n')) {\n if (!line.trim()) continue;\n try {\n out.push(JSON.parse(line) as T);\n } catch {\n // skip\n }\n }\n return out;\n } catch {\n return [];\n }\n}\n\nasync function walk(\n backend: WorkspaceBackend,\n dir: string,\n root: string,\n out: FileTreeNode[],\n): Promise<void> {\n const entries = await backend.readdir(dir);\n for (const name of entries) {\n const full = path.join(dir, name);\n const s = await backend.stat(full);\n const rel = path.relative(root, full).split(path.sep).join('/');\n if (s.isDirectory) {\n out.push({ path: rel, type: 'directory', size: 0 });\n await walk(backend, full, root, out);\n } else {\n out.push({ path: rel, type: 'file', size: s.size });\n }\n }\n}\n\nasync function removeTree(backend: WorkspaceBackend, dir: string): Promise<void> {\n const entries = await backend.readdir(dir);\n for (const name of entries) {\n const full = path.join(dir, name);\n let isDir = false;\n try {\n isDir = (await backend.stat(full)).isDirectory;\n } catch {\n continue;\n }\n if (isDir) {\n await removeTree(backend, full);\n } else {\n try {\n await backend.unlink(full);\n } catch {\n // ignore\n }\n }\n }\n}\n","/**\n * Embedder port + production binding to `@almadar/llm`'s\n * `EmbeddingClient`.\n *\n * The port lets tests inject a deterministic mock without paying for\n * real network calls. Production wiring constructs an `EmbeddingClient`\n * once per workspace open and reuses it for every bake.\n *\n * @packageDocumentation\n */\n\nimport { EmbeddingClient } from '@almadar/llm';\nimport type { EmbedderPort } from './types.js';\n\n/**\n * Production embedder backed by `@almadar/llm`'s `EmbeddingClient` on\n * the openrouter provider (bge-base-en-v1.5, 768-d) — same model the\n * catalog narrower uses, so vectors share an embedding space across\n * the workspace + catalog surfaces.\n *\n * Construction is lazy: the `EmbeddingClient` (and its env-key check)\n * only fires when `embedBatch` is first called. A workspace that has\n * no orbitals to bake never pays the cost or trips the missing-key\n * error — useful for the memory-backed CLI runner that opens fresh\n * workspaces without an API key.\n */\nexport function createDefaultEmbedder(): EmbedderPort {\n let client: EmbeddingClient | null = null;\n function get(): EmbeddingClient {\n if (client === null) client = new EmbeddingClient({ provider: 'openrouter' });\n return client;\n }\n return {\n async embedBatch(texts) {\n if (texts.length === 0) return { embeddings: [] };\n const result = await get().embedBatch(texts);\n return { embeddings: result.embeddings };\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';\nimport { createDefaultEmbedder } from './workspace-index/embedder.js';\n\n/**\n * Per-(userId, appId) in-process dedupe of concurrent `openWorkspace`\n * calls. Two near-simultaneous calls for the same appId would both fail\n * `findLocalWorkspaceDir` (neither has written `app-marker.json` yet)\n * and both fall through to `mintSessionDir`, producing two distinct\n * directories for the same logical workspace. The cached Promise lets\n * subsequent callers await the first call's resolution and share the\n * resulting `WorkspaceService` instance.\n *\n * The cache key includes `backend` because memory and local backends\n * are disjoint stores — a memory-backed call must not share with a\n * local-backed one. Anonymous calls (no `appId`) bypass entirely;\n * every anonymous mint is intended to be a fresh independent session.\n *\n * Failed resolutions clear their own entry so the next call retries\n * cleanly instead of returning the cached rejection forever.\n */\nconst openWorkspaceInFlight = new Map<string, Promise<WorkspaceService>>();\n\nfunction openWorkspaceCacheKey(opts: OpenWorkspaceOptions): string | null {\n if (opts.appId === undefined) return null;\n const backendTag = opts.backend === 'memory' ? 'memory' : 'local';\n return `${backendTag}:${opts.userId}:${opts.appId}`;\n}\n\nexport async function openWorkspace(opts: OpenWorkspaceOptions): Promise<WorkspaceService> {\n const key = openWorkspaceCacheKey(opts);\n if (key !== null) {\n const cached = openWorkspaceInFlight.get(key);\n if (cached) return cached;\n const pending = (async () => {\n try {\n return await openWorkspaceInternal(opts);\n } catch (err) {\n openWorkspaceInFlight.delete(key);\n throw err;\n }\n })();\n openWorkspaceInFlight.set(key, pending);\n return pending;\n }\n return openWorkspaceInternal(opts);\n}\n\nasync function openWorkspaceInternal(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 const service = new WorkspaceServiceImpl({\n workDir: resolved.workDir,\n backend,\n sinks,\n embedder: opts.embedder ?? createDefaultEmbedder(),\n appId: resolved.appId,\n git,\n github: opts.github,\n });\n\n // Strict cold start — warm any missing or stale index sidecars before\n // returning so the first `resolveOrbitalName`/`resolveTraitRef` call\n // sees authoritative data (per Almadar_Workspace_Index.md decision).\n await service.index.warm();\n\n return service;\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/workspace-index/types.ts","../src/workspace-index/cosine.ts","../src/workspace-index/fingerprint.ts","../src/workspace-index/sidecar.ts","../src/workspace-index/index-impl.ts","../src/service.ts","../src/workspace-index/embedder.ts","../src/open-workspace.ts"],"names":["path","asJsonObject","workDir"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Local filesystem backend. The ONLY place `node:fs` is permitted.\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport type { WorkspaceBackend } from '../types.js';\n\nexport class LocalBackend implements WorkspaceBackend {\n async readFile(absPath: string): Promise<string> {\n return fs.promises.readFile(absPath, 'utf-8');\n }\n readFileSync(absPath: string): string {\n return fs.readFileSync(absPath, 'utf-8');\n }\n async writeFile(absPath: string, content: string): Promise<void> {\n // Auto-mkdir parent — callers don't pre-create the directory structure.\n // Without this, a write to a fresh path (e.g. the first\n // `.almadar/trace.jsonl` write after mint) ENOENTs.\n await fs.promises.mkdir(path.dirname(absPath), { recursive: true });\n await fs.promises.writeFile(absPath, content, 'utf-8');\n }\n writeFileSync(absPath: string, content: string): void {\n fs.mkdirSync(path.dirname(absPath), { recursive: true });\n fs.writeFileSync(absPath, content, 'utf-8');\n }\n exists(absPath: string): boolean {\n return fs.existsSync(absPath);\n }\n async readdir(absPath: string): Promise<string[]> {\n return fs.promises.readdir(absPath);\n }\n readdirSync(absPath: string): string[] {\n return fs.readdirSync(absPath);\n }\n async mkdir(absPath: string, opts?: { recursive?: boolean }): Promise<void> {\n await fs.promises.mkdir(absPath, opts);\n }\n mkdirSync(absPath: string, opts?: { recursive?: boolean }): void {\n fs.mkdirSync(absPath, opts);\n }\n async unlink(absPath: string): Promise<void> {\n await fs.promises.unlink(absPath);\n }\n async stat(\n absPath: string,\n ): Promise<{ size: number; mtimeMs: number; isDirectory: boolean }> {\n const s = await fs.promises.stat(absPath);\n return { size: s.size, mtimeMs: s.mtimeMs, isDirectory: s.isDirectory() };\n }\n async rename(srcAbs: string, dstAbs: string): Promise<void> {\n await fs.promises.mkdir(path.dirname(dstAbs), { recursive: true });\n await fs.promises.rename(srcAbs, dstAbs);\n }\n}\n","/**\n * In-memory backend for tests and sandboxed evals. No `node:fs`.\n */\nimport type { WorkspaceBackend } from '../types.js';\n\nexport class MemoryBackend implements WorkspaceBackend {\n private files = new Map<string, string>();\n private dirs = new Set<string>();\n\n async readFile(absPath: string): Promise<string> {\n return this.readFileSync(absPath);\n }\n readFileSync(absPath: string): string {\n const content = this.files.get(absPath);\n if (content === undefined) throw new Error(`ENOENT: ${absPath}`);\n return content;\n }\n async writeFile(absPath: string, content: string): Promise<void> {\n this.writeFileSync(absPath, content);\n }\n writeFileSync(absPath: string, content: string): void {\n this.files.set(absPath, content);\n }\n exists(absPath: string): boolean {\n if (this.files.has(absPath) || this.dirs.has(absPath)) return true;\n // Treat any prefix that has children as an existing dir.\n const prefix = absPath.endsWith('/') ? absPath : absPath + '/';\n for (const k of this.files.keys()) {\n if (k.startsWith(prefix)) return true;\n }\n return false;\n }\n async readdir(absPath: string): Promise<string[]> {\n return this.readdirSync(absPath);\n }\n readdirSync(absPath: string): string[] {\n const prefix = absPath.endsWith('/') ? absPath : absPath + '/';\n const entries = new Set<string>();\n for (const key of this.files.keys()) {\n if (key.startsWith(prefix)) {\n const rest = key.slice(prefix.length);\n const firstSegment = rest.split('/')[0];\n if (firstSegment) entries.add(firstSegment);\n }\n }\n return Array.from(entries);\n }\n async mkdir(absPath: string): Promise<void> {\n this.mkdirSync(absPath);\n }\n mkdirSync(absPath: string): void {\n this.dirs.add(absPath);\n }\n async unlink(absPath: string): Promise<void> {\n this.files.delete(absPath);\n }\n async stat(\n absPath: string,\n ): Promise<{ size: number; mtimeMs: number; isDirectory: boolean }> {\n const content = this.files.get(absPath);\n if (content !== undefined) {\n return { size: content.length, mtimeMs: Date.now(), isDirectory: false };\n }\n // Treat as directory if anything sits under it.\n if (this.dirs.has(absPath)) return { size: 0, mtimeMs: Date.now(), isDirectory: true };\n const prefix = absPath.endsWith('/') ? absPath : absPath + '/';\n for (const k of this.files.keys()) {\n if (k.startsWith(prefix)) return { size: 0, mtimeMs: Date.now(), isDirectory: true };\n }\n throw new Error(`ENOENT: ${absPath}`);\n }\n async rename(srcAbs: string, dstAbs: string): Promise<void> {\n // File case — direct key swap.\n const fileContent = this.files.get(srcAbs);\n if (fileContent !== undefined) {\n this.files.delete(srcAbs);\n this.files.set(dstAbs, fileContent);\n return;\n }\n // Directory case — every file whose key starts with `srcAbs/` migrates\n // to the matching position under `dstAbs/`. Empty dirs (only present\n // in `this.dirs`) also migrate.\n const srcPrefix = srcAbs.endsWith('/') ? srcAbs : srcAbs + '/';\n const dstPrefix = dstAbs.endsWith('/') ? dstAbs : dstAbs + '/';\n const migrations: Array<[string, string]> = [];\n for (const key of this.files.keys()) {\n if (key.startsWith(srcPrefix)) {\n migrations.push([key, dstPrefix + key.slice(srcPrefix.length)]);\n }\n }\n for (const [oldKey, newKey] of migrations) {\n const content = this.files.get(oldKey);\n if (content !== undefined) {\n this.files.delete(oldKey);\n this.files.set(newKey, content);\n }\n }\n const dirsToMigrate: string[] = [];\n for (const dir of this.dirs) {\n if (dir === srcAbs || dir.startsWith(srcPrefix)) dirsToMigrate.push(dir);\n }\n for (const oldDir of dirsToMigrate) {\n this.dirs.delete(oldDir);\n const newDir = oldDir === srcAbs ? dstAbs : dstPrefix + oldDir.slice(srcPrefix.length);\n this.dirs.add(newDir);\n }\n }\n\n // Test helpers\n getAll(): Map<string, string> {\n return new Map(this.files);\n }\n clear(): void {\n this.files.clear();\n this.dirs.clear();\n }\n}\n","/**\n * Internal SinkManager — fans `WorkspaceWriteEvent` out to every\n * registered `WorkspaceObserver`. A slow / hung observer does not crash\n * the writer; results are collected via `Promise.allSettled`.\n *\n * @packageDocumentation\n */\n\nimport type { WorkspaceObserver, WorkspaceWriteEvent } from '../types.js';\n\nexport class SinkManager {\n private readonly observers: WorkspaceObserver[] = [];\n\n /** Register an observer; returns an unsubscribe function. */\n subscribe(observer: WorkspaceObserver): () => void {\n this.observers.push(observer);\n return () => {\n const i = this.observers.indexOf(observer);\n if (i >= 0) this.observers.splice(i, 1);\n };\n }\n\n /** Snapshot of observer count — useful for diagnostics. */\n get observerCount(): number {\n return this.observers.length;\n }\n\n /**\n * Notify all observers in parallel. Awaits all settlements. A rejected\n * observer is captured in the result; subsequent writes still proceed.\n */\n async notifyAll(event: WorkspaceWriteEvent): Promise<void> {\n if (this.observers.length === 0) return;\n const settled = await Promise.allSettled(\n this.observers.map(async o => o.onWrite(event)),\n );\n for (const r of settled) {\n if (r.status === 'rejected') {\n // Observer failure must not surface as a write failure, but it is\n // useful to keep visible. Console-only so the package stays\n // logger-agnostic.\n const reason = r.reason instanceof Error ? r.reason.message : String(r.reason);\n console.error(`[workspace] observer error on ${event.kind}: ${reason}`);\n }\n }\n }\n}\n","/**\n * Path discipline — every absolute path the service uses is computed here.\n *\n * Consumers never construct paths. Public methods take logical names; the\n * service calls into this module to resolve them. Trusted internal paths\n * (orbital files, session files) use `path.join` directly; sandboxed\n * methods (`readFile` / `writeFile`) go through `sandboxedPath` which\n * rejects traversal.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\n\n/** Single source of truth for workspace directory layout. */\nexport const WORKSPACE_LAYOUT = {\n ALMADAR_DIR: '.almadar',\n ORBITALS_DIR: 'orbitals',\n SESSIONS_DIR: '.almadar/sessions',\n COORDINATOR_DIR: '.almadar/sessions/Coordinator',\n TRACE_FILE: '.almadar/trace.jsonl',\n SCHEMA_FILE: 'schema.orb',\n COMPILED_DIR: 'apps',\n APP_MARKER: '.almadar/app-marker.json',\n USER_MEMORY: '.almadar/user.orb',\n PROJECT_MEMORY: '.almadar/project.orb',\n} as const;\n\n/** Logical orbital name → absolute `.orb` path. */\nexport function orbitalFile(workDir: string, name: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR, `${name}.orb`);\n}\n\n/** Archived orbital path. */\nexport function archivedOrbitalFile(workDir: string, name: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR, '.archived', `${name}.orb`);\n}\n\n/** Schema (combined output) file. */\nexport function schemaFile(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.SCHEMA_FILE);\n}\n\n/** Coordinator session dir. */\nexport function coordinatorDir(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.COORDINATOR_DIR);\n}\n\n/** Coordinator-level artifact path. */\nexport function coordinatorFile(workDir: string, basename: string): string {\n return path.join(coordinatorDir(workDir), basename);\n}\n\n/** Per-orbital session dir. */\nexport function orbitalSessionDir(workDir: string, orbital: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.SESSIONS_DIR, orbital);\n}\n\n/** Per-orbital session-file path. */\nexport function orbitalSessionFile(workDir: string, orbital: string, basename: string): string {\n return path.join(orbitalSessionDir(workDir, orbital), basename);\n}\n\n/** Trace JSONL. */\nexport function traceFile(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.TRACE_FILE);\n}\n\n/** Compiled output base. */\nexport function compiledDir(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.COMPILED_DIR);\n}\n\n/** Compiled-output path for a given relative key. */\nexport function compiledFile(workDir: string, relPath: string): string {\n return path.join(compiledDir(workDir), relPath);\n}\n\n/** App marker — used internally by the resolver/factory. */\nexport function appMarkerFile(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.APP_MARKER);\n}\n\n/**\n * Resolve a user-supplied relative path within the sandbox. Rejects\n * absolute paths, `..` traversal, and any path that resolves outside\n * `workDir`. Returns the absolute resolved path on success.\n */\nexport function sandboxedPath(workDir: string, relPath: string): string {\n if (typeof relPath !== 'string' || relPath.length === 0) {\n throw new Error('sandbox: empty relative path');\n }\n if (path.isAbsolute(relPath)) {\n throw new Error(`sandbox: absolute paths are not allowed (${relPath})`);\n }\n // Reject Windows-style absolute paths on cross-platform consumers.\n if (/^[a-zA-Z]:[\\\\/]/.test(relPath)) {\n throw new Error(`sandbox: drive-letter paths are not allowed (${relPath})`);\n }\n const rootAbs = path.resolve(workDir);\n const target = path.resolve(rootAbs, relPath);\n if (target !== rootAbs && !target.startsWith(rootAbs + path.sep)) {\n throw new Error(`sandbox: path escapes workspace (${relPath})`);\n }\n return target;\n}\n\n/** Validate an orbital logical name — no path separators, no `..`. */\nexport function assertOrbitalName(name: string): void {\n if (typeof name !== 'string' || name.length === 0) {\n throw new Error('orbital name: empty');\n }\n if (name.includes('/') || name.includes('\\\\') || name === '.' || name === '..') {\n throw new Error(`orbital name: invalid (${name})`);\n }\n}\n","/**\n * Mint-time templates. Written by `openWorkspace` when minting a fresh\n * workspace. Internal — not exported from the package barrel.\n *\n * The shapes follow @almadar/core's `OrbitalSchema` but are kept here as\n * literal JSON so this package has zero dependency on the std memory\n * orbital definitions.\n *\n * @packageDocumentation\n */\n\nimport type { JsonObject } from '@almadar/core';\n\n/** Empty scaffold for a new generation. */\nexport function createSchemaOrbTemplate(name: string): JsonObject {\n return {\n name,\n version: '1.0.0',\n description: '',\n orbitals: [],\n };\n}\n\n/** User preferences template — minimal seed. */\nexport function createUserOrbTemplate(userId: string): JsonObject {\n return {\n name: 'UserMemory',\n version: '1.0.0',\n description: 'User preferences and learned patterns',\n orbitals: [\n {\n name: 'PreferenceTracking',\n entity: {\n name: 'UserPreference',\n fields: [],\n instances: [\n {\n id: `pref-${userId}`,\n userId,\n },\n ],\n },\n traits: [],\n pages: [],\n },\n ],\n };\n}\n\n/** Project context template. */\nexport function createProjectOrbTemplate(projectName: string, appId?: string): JsonObject {\n return {\n name: 'ProjectMemory',\n version: '1.0.0',\n description: `Domain knowledge for ${projectName}`,\n orbitals: [\n {\n name: 'DomainKnowledge',\n entity: {\n name: 'ProjectContext',\n fields: [],\n instances: [\n {\n id: appId ?? `project-${projectName}`,\n appId: appId ?? '',\n projectName,\n lastUpdatedAt: new Date().toISOString(),\n },\n ],\n },\n traits: [],\n pages: [],\n },\n ],\n };\n}\n\nexport function serializeJson(value: JsonObject): string {\n return JSON.stringify(value, null, 2);\n}\n","/**\n * Thin wrapper around local `git` CLI for workspace-local operations\n * (init, add, commit, tag, push, pull, status). No `node:fs` use here —\n * existence checks ride the backend.\n *\n * @packageDocumentation\n */\n\nimport { execFile } from 'node:child_process';\nimport path from 'node:path';\nimport type { WorkspaceBackend } from './types.js';\n\nexport interface GitStatus {\n clean: boolean;\n staged: string[];\n modified: string[];\n untracked: string[];\n}\n\nexport class GitClient {\n constructor(private readonly cwd: string, private readonly backend: WorkspaceBackend) {}\n\n /** Is the working dir already a git repo? */\n async isRepo(): Promise<boolean> {\n return this.backend.exists(path.join(this.cwd, '.git'));\n }\n\n async init(): Promise<void> {\n if (await this.isRepo()) return;\n await this.exec(['init']);\n await this.exec(['config', 'user.email', 'agent@almadar.io']);\n await this.exec(['config', 'user.name', 'Almadar Agent']);\n }\n\n async addAll(): Promise<void> {\n await this.exec(['add', '-A']);\n }\n\n async commit(message: string): Promise<string | null> {\n try {\n const out = await this.exec(['commit', '-m', message, '--allow-empty-message']);\n const match = out.match(/\\[[\\w/.-]+ ([a-f0-9]+)\\]/);\n return match ? match[1] : null;\n } catch (err: unknown) {\n if (err instanceof Error && err.message.includes('nothing to commit')) return null;\n throw err;\n }\n }\n\n async tag(name: string, message?: string): Promise<void> {\n const args = ['tag'];\n if (message) {\n args.push('-a', name, '-m', message);\n } else {\n args.push(name);\n }\n await this.exec(args);\n }\n\n async push(remote = 'origin', branch?: string): Promise<void> {\n const args = ['push', remote];\n if (branch) args.push(branch);\n await this.exec(args);\n }\n\n async pull(remote = 'origin', branch?: string): Promise<void> {\n const args = ['pull', remote];\n if (branch) args.push(branch);\n await this.exec(args);\n }\n\n async hasRemote(remote = 'origin'): Promise<boolean> {\n try {\n const out = await this.exec(['remote']);\n return out.split('\\n').map(s => s.trim()).includes(remote);\n } catch {\n return false;\n }\n }\n\n async addRemote(remote: string, url: string): Promise<void> {\n await this.exec(['remote', 'add', remote, url]);\n }\n\n async status(): Promise<GitStatus> {\n const out = await this.exec(['status', '--porcelain']);\n const lines = out.split('\\n').filter(Boolean);\n const staged: string[] = [];\n const modified: string[] = [];\n const untracked: string[] = [];\n for (const line of lines) {\n const index = line[0];\n const work = line[1];\n const file = line.slice(3);\n if (index === '?' && work === '?') untracked.push(file);\n else if (index !== ' ' && index !== '?') staged.push(file);\n else if (work !== ' ') modified.push(file);\n }\n return { clean: lines.length === 0, staged, modified, untracked };\n }\n\n async headSha(): Promise<string | null> {\n try {\n const out = await this.exec(['rev-parse', 'HEAD']);\n return out.trim() || null;\n } catch {\n return null;\n }\n }\n\n private exec(args: string[]): Promise<string> {\n return execGit(args, this.cwd);\n }\n}\n\nfunction execGit(args: string[], cwd: string): Promise<string> {\n return new Promise((resolve, reject) => {\n execFile('git', args, { cwd, maxBuffer: 10 * 1024 * 1024 }, (err, stdout, stderr) => {\n if (err) {\n const message = stderr?.trim() || stdout?.trim() || err.message;\n reject(new Error(`git ${args[0]}: ${message}`));\n return;\n }\n resolve(stdout);\n });\n });\n}\n","/**\n * Internal lifecycle helpers used by `openWorkspace` on mint/adopt/resume.\n *\n * - Create the workspace directory skeleton.\n * - Write mint-time templates (schema.orb, user.orb, project.orb) if missing.\n * - Initialize git when `github` is supplied.\n *\n * No `node:fs` use here — everything rides the backend.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { WorkspaceBackend } from './types.js';\nimport {\n WORKSPACE_LAYOUT,\n coordinatorDir,\n orbitalSessionDir,\n schemaFile,\n} from './path-layout.js';\nimport {\n createSchemaOrbTemplate,\n createUserOrbTemplate,\n createProjectOrbTemplate,\n serializeJson,\n} from './templates.js';\nimport { GitClient } from './git-client.js';\n\n/** Make sure every workspace dir exists. */\nexport async function ensureSkeleton(\n backend: WorkspaceBackend,\n workDir: string,\n): Promise<void> {\n await backend.mkdir(workDir, { recursive: true });\n await backend.mkdir(path.join(workDir, WORKSPACE_LAYOUT.ALMADAR_DIR), { recursive: true });\n await backend.mkdir(path.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR), { recursive: true });\n await backend.mkdir(path.join(workDir, WORKSPACE_LAYOUT.SESSIONS_DIR), { recursive: true });\n await backend.mkdir(coordinatorDir(workDir), { recursive: true });\n}\n\n/** Initialise per-orbital session dir lazily. */\nexport async function ensureOrbitalSessionDir(\n backend: WorkspaceBackend,\n workDir: string,\n orbital: string,\n): Promise<void> {\n await backend.mkdir(orbitalSessionDir(workDir, orbital), { recursive: true });\n}\n\n/** Write mint-time templates only when they don't exist. */\nexport async function writeMintTemplatesIfMissing(\n backend: WorkspaceBackend,\n workDir: string,\n userId: string,\n projectName: string,\n appId?: string,\n): Promise<void> {\n const schemaPath = schemaFile(workDir);\n if (!backend.exists(schemaPath)) {\n await backend.writeFile(schemaPath, serializeJson(createSchemaOrbTemplate(projectName)));\n }\n const userPath = path.join(workDir, WORKSPACE_LAYOUT.USER_MEMORY);\n if (!backend.exists(userPath)) {\n await backend.writeFile(userPath, serializeJson(createUserOrbTemplate(userId)));\n }\n const projectPath = path.join(workDir, WORKSPACE_LAYOUT.PROJECT_MEMORY);\n if (!backend.exists(projectPath)) {\n await backend.writeFile(\n projectPath,\n serializeJson(createProjectOrbTemplate(projectName, appId)),\n );\n }\n}\n\n/** Initialise git for the workspace if it isn't already a repo. */\nexport async function ensureGitInit(\n backend: WorkspaceBackend,\n workDir: string,\n): Promise<GitClient> {\n const git = new GitClient(workDir, backend);\n await git.init();\n return git;\n}\n","/**\n * Lifecycle helpers — read + write the per-workspace app marker, and\n * scan a user's workspace root for one that matches a known `appId`.\n *\n * No `node:fs` here — everything rides the backend.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport { randomBytes } from 'node:crypto';\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/**\n * Compose a fresh session dir under `<workspacesRoot>/<userId>/`.\n *\n * The suffix combines `Date.now().toString(36)` with 4 hex chars of\n * `crypto.randomBytes` so two concurrent mints in the same millisecond\n * cannot collide on the same path. Without the random tail, two\n * `mintSessionDir` calls in the same ms produced the same path; the\n * subsequent `backend.mkdir(..., { recursive: true })` silently succeeded\n * for both, and two `WorkspaceService` instances ended up pointing at\n * the same directory — observed in apps/builder during concurrent\n * `/analyze` + `/skill/generate-stream` requests.\n */\nexport function mintSessionDir(workspacesRoot: string, userId: string): string {\n const ts = new Date().toISOString().slice(0, 10);\n const suffix = `${Date.now().toString(36)}${randomBytes(2).toString('hex')}`;\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 * Public types for the workspace index — Phase A of\n * `docs/Almadar_Workspace_Index.md`. Identity vectors per orbital and\n * per extraTraits[] entry, used for semantic coercion of LLM-emitted\n * names back to canonical entities (R-10 orbital name drift + R-8\n * duplicate-ref trait drift).\n *\n * @packageDocumentation\n */\n\nimport type { JsonObject } from '@almadar/core';\n\n/** Schema version baked into every sidecar; mismatch triggers re-bake. */\nexport const WORKSPACE_INDEX_SCHEMA_VERSION = 1 as const;\n\n/** Default coercion threshold per the doc's locked decision. */\nexport const DEFAULT_COERCION_THRESHOLD = 0.85 as const;\n\n/**\n * Per-extraTraits[] entry identity vector. Baked alongside the orbital\n * sidecar whenever the orbital's spec.json is written.\n */\nexport interface ExtraTraitIdentity {\n /** Canonical ref of this entry (the key for coercion match). */\n ref: string;\n /** Entry's `name` rename, or trait-name tail of ref if no rename. */\n alias: string;\n /** Fingerprint text actually embedded — kept for debugging. */\n fingerprint: string;\n /** 768-d vector from bge-base-en-v1.5 (or whatever model the embedder uses). */\n vector: readonly number[];\n}\n\n/**\n * Per-orbital sidecar contents, persisted at\n * `.almadar/sessions/<Orbital>/index.json` after every spec write.\n */\nexport interface OrbitalIndexEntry {\n schemaVersion: typeof WORKSPACE_INDEX_SCHEMA_VERSION;\n /** sha256 of the spec.json that produced this sidecar. */\n specChecksum: string;\n /** Orbital-level identity vector. */\n identityVector: readonly number[];\n /** Fingerprint text for the orbital identity vector — kept for debugging. */\n identityFingerprint: string;\n /** One per current `extraTraits[]` entry on this orbital. */\n extraTraitIdentities: readonly ExtraTraitIdentity[];\n /** Epoch ms at bake time — debugging only. */\n bakedAt: number;\n}\n\n/**\n * Input to `resolveTraitRef` — the LLM's emitted extraTraits entry,\n * narrowed to the fields the coercion needs to see. Mirrors the\n * `RawExtraTraitRef` shape rabit's analyzer constructs.\n */\nexport interface TraitRefEmit {\n ref: string;\n name?: string;\n linkedEntity?: string;\n}\n\n/**\n * Common result shape for both `resolveOrbitalName` and\n * `resolveTraitRef`. `coercedTo` is null when no existing entity\n * exceeded the threshold — the emit is genuinely new.\n */\nexport interface ResolveResult {\n coercedTo: string | null;\n similarity: number;\n method: 'identity-vector';\n}\n\n/**\n * Options for both `resolveOrbitalName` and `resolveTraitRef`. The\n * default threshold (0.85) lives in `DEFAULT_COERCION_THRESHOLD`.\n */\nexport interface ResolveOptions {\n threshold?: number;\n}\n\n/**\n * Stats surface for diagnostics. Cheap to compute (read in-memory\n * state).\n */\nexport interface WorkspaceIndexStats {\n orbitalCount: number;\n extraTraitIdentityCount: number;\n staleOrbitals: readonly string[];\n}\n\n/**\n * Public surface exposed via `WorkspaceService.index`.\n */\nexport interface WorkspaceIndex {\n /**\n * Walk every existing orbital, bake any missing or stale sidecars.\n * Called synchronously by `openWorkspace` (strict cold start per the\n * doc decision) so this is the authoritative point past which all\n * subsequent queries return real data. Idempotent — re-baking an\n * already-warm sidecar is a no-op (checksum matches).\n */\n warm(): Promise<void>;\n\n /**\n * R-10 coercion. Embed `name`, cosine-match against every orbital's\n * identity vector, return the best match if it exceeds the\n * threshold. Returns `{ coercedTo: null, ... }` when below threshold\n * or when no orbitals exist in the workspace.\n */\n resolveOrbitalName(name: string, opts?: ResolveOptions): Promise<ResolveResult>;\n\n /**\n * R-8 coercion. Embed an LLM-emitted trait emit, cosine-match against\n * the existing `extraTraits[]` identity vectors on the named orbital.\n * Returns the existing entry's `ref` (or its `name` rename) as\n * `coercedTo` when match exceeds threshold; null when the emit is a\n * genuinely new addition.\n *\n * Scoped per orbital — the same trait import on two different orbitals\n * is structurally legitimate, so we don't cross-coerce.\n */\n resolveTraitRef(\n emit: TraitRefEmit,\n orbitalContext: { orbitalName: string },\n opts?: ResolveOptions,\n ): Promise<ResolveResult>;\n\n /** Diagnostics surface. */\n stats(): WorkspaceIndexStats;\n}\n\n/**\n * Pluggable embedder — production wires `@almadar/llm`'s\n * `EmbeddingClient`; tests inject a deterministic mock.\n */\nexport interface EmbedderPort {\n /** Embed a batch of texts; returned vectors are in input order. */\n embedBatch(texts: readonly string[]): Promise<{\n embeddings: readonly (readonly number[])[];\n }>;\n}\n\n/**\n * JSON shape persisted at `.almadar/sessions/<Orbital>/index.json`.\n * Mirrors `OrbitalIndexEntry` but with the JsonObject upper-bound the\n * workspace's writeJsonFile helper requires.\n */\nexport type OrbitalIndexSidecar = OrbitalIndexEntry & JsonObject;\n","/**\n * Cosine similarity. Defensive: zero-vector and length-mismatch\n * return 0 instead of throwing or returning NaN — a malformed manifest\n * entry shouldn't crash the index.\n *\n * @packageDocumentation\n */\n\nexport function cosineSimilarity(\n a: readonly number[],\n b: readonly number[],\n): number {\n if (a.length !== b.length || a.length === 0) return 0;\n let dot = 0;\n let magA = 0;\n let magB = 0;\n for (let i = 0; i < a.length; i++) {\n const av = a[i] ?? 0;\n const bv = b[i] ?? 0;\n dot += av * bv;\n magA += av * av;\n magB += bv * bv;\n }\n if (magA === 0 || magB === 0) return 0;\n return dot / (Math.sqrt(magA) * Math.sqrt(magB));\n}\n","/**\n * Fingerprint composition — pure functions that turn typed spec state\n * into the short text strings the embedder hashes.\n *\n * Per the doc, orbital identity vectors stay small (~50-100 tokens)\n * so they're stable under spec edits, while content/extraTrait\n * fingerprints can grow more.\n *\n * @packageDocumentation\n */\n\nimport type { JsonObject, JsonValue } from '@almadar/core';\n\n/**\n * Compose the orbital identity fingerprint from a spec.\n *\n * Pulls these typed fields off the spec (all optional — when missing\n * the segment is omitted, never `undefined` interpolated):\n * - `orbitalName` (top-level on spec) — the discriminating signal\n * - `params.entityName` — boosts cosine when the name drifts but the\n * entity stays (e.g. `VisitOrbital` → `VisitV2Orbital`, same entity)\n *\n * The `organism` is intentionally OMITTED: every orbital in an app\n * shares it (`std-record-modal` across an entire CRUD app), so\n * including it dominates the cosine and makes unrelated orbital\n * names look similar (real-embedder spec showed `InvoiceOrbital ·\n * Invoice · std-record-modal` matching `ProductOrbital` above the\n * 0.85 threshold). Keeping the fingerprint name+entity-only sharpens\n * the geometry for R-10 coercion.\n *\n * The output is a single string with ` · ` separators.\n */\nexport function composeOrbitalIdentityFingerprint(\n spec: JsonObject,\n): string {\n const segments: string[] = [];\n pushString(segments, spec['orbitalName']);\n const params = asJsonObject(spec['params']);\n if (params) {\n pushString(segments, params['entityName']);\n }\n return segments.join(' · ');\n}\n\n/**\n * Compose the per-extraTraits[] entry fingerprint.\n *\n * Used both at bake time (for the sidecar's extraTraitIdentities[])\n * and at query time (for the LLM-emitted entry being coerced). The\n * shape MUST be identical on both sides so cosine geometry is\n * meaningful — same fields in the same order.\n */\nexport function composeExtraTraitIdentityFingerprint(emit: {\n ref: string;\n name?: string;\n linkedEntity?: string;\n}): string {\n const segments: string[] = [];\n pushString(segments, emit.ref);\n // Emit the alias explicitly so the embedder sees \"ProductAccessControl\n // for RowAccessGate\" — not just the ref.\n const alias = emit.name && emit.name.length > 0 ? emit.name : tailOfRef(emit.ref);\n if (alias && alias !== emit.ref) {\n pushString(segments, alias);\n }\n pushString(segments, emit.linkedEntity);\n return segments.join(' · ');\n}\n\n/**\n * Derive the alias an entry would canonically be referenced by. Used by\n * the sidecar baker to store the `alias` field next to each extraTrait\n * identity vector — also the value `resolveTraitRef` returns as\n * `coercedTo` when a match fires.\n */\nexport function deriveExtraTraitAlias(emit: { ref: string; name?: string }): string {\n if (emit.name && emit.name.length > 0) return emit.name;\n return tailOfRef(emit.ref);\n}\n\nfunction pushString(out: string[], value: JsonValue | undefined): void {\n if (typeof value === 'string' && value.length > 0) out.push(value);\n}\n\nfunction asJsonObject(value: JsonValue | undefined): JsonObject | null {\n if (value === undefined || value === null) return null;\n if (typeof value !== 'object' || Array.isArray(value)) return null;\n return value;\n}\n\nfunction tailOfRef(ref: string): string {\n const match = /\\.traits\\.([A-Za-z0-9_]+)$/.exec(ref);\n return match ? match[1] : ref;\n}\n","/**\n * Sidecar I/O for per-orbital index entries.\n *\n * Reuses the workspace package's existing typed file helpers\n * (`readJsonFile` + `writeJsonFile`) and path layout\n * (`orbitalSessionFile`). No parallel file plumbing; no parallel path\n * math.\n *\n * @packageDocumentation\n */\n\nimport { createHash } from 'node:crypto';\nimport type { JsonObject } from '@almadar/core';\nimport type { WorkspaceBackend } from '../internal/types.js';\nimport { orbitalSessionFile } from '../internal/path-layout.js';\nimport { readJsonFile, writeJsonFile } from '../internal/memory-files.js';\nimport { ensureOrbitalSessionDir } from '../internal/workspace-manager.js';\nimport type { OrbitalIndexEntry, OrbitalIndexSidecar } from './types.js';\nimport { WORKSPACE_INDEX_SCHEMA_VERSION } from './types.js';\n\nconst SIDECAR_BASENAME = 'index.json';\n\nexport function sidecarPath(workDir: string, orbital: string): string {\n return orbitalSessionFile(workDir, orbital, SIDECAR_BASENAME);\n}\n\nexport async function readSidecar(\n backend: WorkspaceBackend,\n workDir: string,\n orbital: string,\n): Promise<OrbitalIndexEntry | null> {\n const raw = await readJsonFile<OrbitalIndexSidecar>(backend, sidecarPath(workDir, orbital));\n if (raw === null) return null;\n if (raw.schemaVersion !== WORKSPACE_INDEX_SCHEMA_VERSION) return null;\n return raw;\n}\n\nexport async function writeSidecar(\n backend: WorkspaceBackend,\n workDir: string,\n orbital: string,\n entry: OrbitalIndexEntry,\n): Promise<void> {\n await ensureOrbitalSessionDir(backend, workDir, orbital);\n // Cast through JsonObject is safe — OrbitalIndexEntry's shape only\n // contains primitives + arrays of primitives + arrays of objects whose\n // fields are likewise json-compatible. The structural compatibility is\n // captured by the OrbitalIndexSidecar intersection type.\n await writeJsonFile<OrbitalIndexSidecar>(\n backend,\n sidecarPath(workDir, orbital),\n entry as OrbitalIndexSidecar,\n );\n}\n\n/**\n * SHA-256 over the JSON-stringified spec — the same content the\n * sidecar's embeddings were computed from. Used to detect stale\n * sidecars (spec changed since last bake → re-bake).\n */\nexport function checksumSpec(spec: JsonObject): string {\n return createHash('sha256').update(JSON.stringify(spec)).digest('hex');\n}\n","/**\n * `WorkspaceIndexImpl` — the runtime carrying the identity vectors per\n * orbital + per extraTraits[] entry. Wires into the workspace's\n * `SinkManager` to re-bake on each `kind: 'spec'` write; exposes the\n * coercion methods `resolveOrbitalName` + `resolveTraitRef`.\n *\n * @packageDocumentation\n */\n\nimport type { JsonObject, JsonValue } from '@almadar/core';\nimport type { WorkspaceBackend } from '../internal/types.js';\nimport type { SinkManager } from '../internal/sink-manager.js';\nimport type {\n EmbedderPort,\n ExtraTraitIdentity,\n OrbitalIndexEntry,\n ResolveOptions,\n ResolveResult,\n TraitRefEmit,\n WorkspaceIndex,\n WorkspaceIndexStats,\n} from './types.js';\nimport {\n DEFAULT_COERCION_THRESHOLD,\n WORKSPACE_INDEX_SCHEMA_VERSION,\n} from './types.js';\nimport { cosineSimilarity } from './cosine.js';\nimport {\n composeExtraTraitIdentityFingerprint,\n composeOrbitalIdentityFingerprint,\n deriveExtraTraitAlias,\n} from './fingerprint.js';\nimport { checksumSpec, readSidecar, writeSidecar } from './sidecar.js';\n\nexport interface WorkspaceIndexDeps {\n workDir: string;\n backend: WorkspaceBackend;\n sinks: SinkManager;\n embedder: EmbedderPort;\n listOrbitals: () => string[];\n readSpec: (orbital: string) => JsonObject | null;\n}\n\ninterface ExtraTraitFingerprintInput {\n fingerprint: string;\n ref: string;\n alias: string;\n}\n\nexport class WorkspaceIndexImpl implements WorkspaceIndex {\n private readonly entries = new Map<string, OrbitalIndexEntry>();\n /** Serialized re-bake per orbital so concurrent writeSpec events don't race. */\n private readonly bakeQueue = new Map<string, Promise<void>>();\n /** Names whose checksum doesn't match the current spec — surfaced via stats. */\n private readonly stale = new Set<string>();\n\n constructor(private readonly deps: WorkspaceIndexDeps) {\n this.deps.sinks.subscribe({\n onWrite: async (event) => {\n if (event.kind !== 'spec') return;\n await this.rebakeOrbital(event.orbital, event.content);\n },\n });\n }\n\n async warm(): Promise<void> {\n const orbitals = this.deps.listOrbitals();\n const work: Promise<void>[] = [];\n for (const orbital of orbitals) {\n const spec = this.deps.readSpec(orbital);\n if (spec === null) {\n // Orbital exists on disk but has no spec.json — nothing to bake.\n // (Coordinator owns spec creation; an orbital may be archived or\n // mid-creation.) Keep the entry slot empty.\n continue;\n }\n const checksum = checksumSpec(spec);\n const existing = await readSidecar(this.deps.backend, this.deps.workDir, orbital);\n if (existing !== null && existing.specChecksum === checksum) {\n this.entries.set(orbital, existing);\n this.stale.delete(orbital);\n continue;\n }\n work.push(this.bakeAndPersist(orbital, spec, checksum));\n }\n await Promise.all(work);\n }\n\n async resolveOrbitalName(name: string, opts?: ResolveOptions): Promise<ResolveResult> {\n const threshold = opts?.threshold ?? DEFAULT_COERCION_THRESHOLD;\n if (this.entries.size === 0) {\n return { coercedTo: null, similarity: 0, method: 'identity-vector' };\n }\n const [vector] = await this.embedOne(name);\n let bestOrbital: string | null = null;\n let bestSim = 0;\n for (const [orbital, entry] of this.entries) {\n const sim = cosineSimilarity(vector, entry.identityVector);\n if (sim > bestSim) {\n bestSim = sim;\n bestOrbital = orbital;\n }\n }\n if (bestOrbital !== null && bestSim >= threshold) {\n return { coercedTo: bestOrbital, similarity: bestSim, method: 'identity-vector' };\n }\n return { coercedTo: null, similarity: bestSim, method: 'identity-vector' };\n }\n\n async resolveTraitRef(\n emit: TraitRefEmit,\n orbitalContext: { orbitalName: string },\n opts?: ResolveOptions,\n ): Promise<ResolveResult> {\n const threshold = opts?.threshold ?? DEFAULT_COERCION_THRESHOLD;\n const entry = this.entries.get(orbitalContext.orbitalName);\n if (!entry || entry.extraTraitIdentities.length === 0) {\n return { coercedTo: null, similarity: 0, method: 'identity-vector' };\n }\n const fingerprint = composeExtraTraitIdentityFingerprint(emit);\n const [vector] = await this.embedOne(fingerprint);\n let bestAlias: string | null = null;\n let bestSim = 0;\n for (const candidate of entry.extraTraitIdentities) {\n const sim = cosineSimilarity(vector, candidate.vector);\n if (sim > bestSim) {\n bestSim = sim;\n bestAlias = candidate.alias;\n }\n }\n if (bestAlias !== null && bestSim >= threshold) {\n return { coercedTo: bestAlias, similarity: bestSim, method: 'identity-vector' };\n }\n return { coercedTo: null, similarity: bestSim, method: 'identity-vector' };\n }\n\n stats(): WorkspaceIndexStats {\n let extraTraitIdentityCount = 0;\n for (const entry of this.entries.values()) {\n extraTraitIdentityCount += entry.extraTraitIdentities.length;\n }\n return {\n orbitalCount: this.entries.size,\n extraTraitIdentityCount,\n staleOrbitals: Array.from(this.stale).sort(),\n };\n }\n\n private async rebakeOrbital(orbital: string, spec: JsonObject): Promise<void> {\n const checksum = checksumSpec(spec);\n const existing = this.entries.get(orbital);\n if (existing && existing.specChecksum === checksum) return;\n await this.enqueueBake(orbital, () => this.bakeAndPersist(orbital, spec, checksum));\n }\n\n private enqueueBake(orbital: string, op: () => Promise<void>): Promise<void> {\n const prev = this.bakeQueue.get(orbital) ?? Promise.resolve();\n const next = prev.then(op);\n const swallowed = next.catch(() => undefined);\n this.bakeQueue.set(orbital, swallowed);\n return next;\n }\n\n private async bakeAndPersist(\n orbital: string,\n spec: JsonObject,\n checksum: string,\n ): Promise<void> {\n this.stale.add(orbital);\n const identityFingerprint = composeOrbitalIdentityFingerprint(spec);\n const extraInputs = extractExtraTraitInputs(spec);\n const allTexts = [identityFingerprint, ...extraInputs.map((e) => e.fingerprint)];\n const { embeddings } = await this.deps.embedder.embedBatch(allTexts);\n if (embeddings.length !== allTexts.length) {\n throw new Error(\n `[workspace-index] embedder returned ${embeddings.length} vectors for ${allTexts.length} inputs`,\n );\n }\n const [identityVector, ...extraVectors] = embeddings;\n const extraTraitIdentities: ExtraTraitIdentity[] = extraInputs.map((input, idx) => ({\n ref: input.ref,\n alias: input.alias,\n fingerprint: input.fingerprint,\n vector: extraVectors[idx],\n }));\n const entry: OrbitalIndexEntry = {\n schemaVersion: WORKSPACE_INDEX_SCHEMA_VERSION,\n specChecksum: checksum,\n identityVector,\n identityFingerprint,\n extraTraitIdentities,\n bakedAt: Date.now(),\n };\n await writeSidecar(this.deps.backend, this.deps.workDir, orbital, entry);\n this.entries.set(orbital, entry);\n this.stale.delete(orbital);\n // Emit so the apps/builder Firestore mirror (and any other registered\n // observer) can persist the sidecar alongside spec.json, memory.json,\n // etc. Without this, cold restore re-bakes every orbital on every\n // server restart — paid embedder calls for deterministic vectors.\n await this.deps.sinks.notifyAll({\n kind: 'workspace-index',\n orbital,\n content: serializeEntryForMirror(entry),\n });\n }\n\n private async embedOne(text: string): Promise<readonly (readonly number[])[]> {\n const { embeddings } = await this.deps.embedder.embedBatch([text]);\n if (embeddings.length !== 1) {\n throw new Error(\n `[workspace-index] embedder returned ${embeddings.length} vectors for a single text`,\n );\n }\n return embeddings;\n }\n}\n\n/**\n * Project a typed `OrbitalIndexEntry` into a plain `JsonObject` so it\n * can ride the typed `WorkspaceWriteEvent.content` channel. Object\n * literal + spread → TS infers a fresh shape structurally assignable\n * to the JsonObject index signature; no cast needed.\n */\nfunction serializeEntryForMirror(entry: OrbitalIndexEntry): JsonObject {\n return {\n schemaVersion: entry.schemaVersion,\n specChecksum: entry.specChecksum,\n identityVector: [...entry.identityVector],\n identityFingerprint: entry.identityFingerprint,\n extraTraitIdentities: entry.extraTraitIdentities.map((e) => ({\n ref: e.ref,\n alias: e.alias,\n fingerprint: e.fingerprint,\n vector: [...e.vector],\n })),\n bakedAt: entry.bakedAt,\n };\n}\n\nfunction extractExtraTraitInputs(spec: JsonObject): ExtraTraitFingerprintInput[] {\n const params = asJsonObject(spec['params']);\n if (!params) return [];\n const extras = params['extraTraits'];\n if (!Array.isArray(extras)) return [];\n const out: ExtraTraitFingerprintInput[] = [];\n for (const entry of extras) {\n const obj = asJsonObject(entry);\n if (!obj) continue;\n const ref = typeof obj['ref'] === 'string' ? obj['ref'] : null;\n if (ref === null) continue;\n const name = typeof obj['name'] === 'string' ? obj['name'] : undefined;\n const linkedEntity = typeof obj['linkedEntity'] === 'string' ? obj['linkedEntity'] : undefined;\n const alias = deriveExtraTraitAlias({ ref, name });\n out.push({\n ref,\n alias,\n fingerprint: composeExtraTraitIdentityFingerprint({ ref, name, linkedEntity }),\n });\n }\n return out;\n}\n\nfunction asJsonObject(value: JsonValue | undefined): JsonObject | null {\n if (value === undefined || value === null) return null;\n if (typeof value !== 'object' || Array.isArray(value)) return null;\n return value;\n}\n","/**\n * `WorkspaceService` implementation. The single chokepoint — every read\n * and write that any consumer performs lands here, computes its absolute\n * path via `path-layout.ts`, runs the backend op, then fans out a typed\n * `WorkspaceWriteEvent` to every registered observer.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { JsonObject, JsonValue } from '@almadar/core';\nimport type {\n FileTreeNode,\n GitHubConfig,\n GitStatusInfo,\n WorkspaceObserver,\n WorkspaceService,\n WorkspaceWriteEvent,\n} from './types.js';\nimport type { WorkspaceBackend } from './internal/types.js';\nimport { SinkManager } from './internal/sink-manager.js';\nimport { GitClient } from './internal/git-client.js';\nimport {\n archivedOrbitalFile,\n assertOrbitalName,\n compiledDir,\n compiledFile,\n coordinatorFile,\n orbitalFile,\n orbitalSessionDir,\n orbitalSessionFile,\n sandboxedPath,\n schemaFile,\n traceFile,\n WORKSPACE_LAYOUT,\n} from './internal/path-layout.js';\nimport {\n ensureOrbitalSessionDir,\n} from './internal/workspace-manager.js';\nimport {\n appendJsonLine,\n readJsonFile,\n readJsonLines,\n writeJsonFile,\n} from './internal/memory-files.js';\nimport { WorkspaceIndexImpl } from './workspace-index/index-impl.js';\nimport type { EmbedderPort, WorkspaceIndex } from './workspace-index/types.js';\n\ninterface ServiceCtorArgs {\n workDir: string;\n backend: WorkspaceBackend;\n sinks: SinkManager;\n embedder: EmbedderPort;\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 readonly index: WorkspaceIndex;\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 this.index = new WorkspaceIndexImpl({\n workDir: this.workDir,\n backend: this.backend,\n sinks: this.sinks,\n embedder: args.embedder,\n listOrbitals: () => this.listOrbitals(),\n readSpec: (orbital) => this.readSpec(orbital),\n });\n }\n\n // === Identity ===\n\n get appId(): string | undefined {\n return this._appId;\n }\n\n setAppId(id: string): void {\n this._appId = id;\n }\n\n // === Helpers ===\n\n /** Run `op` under a per-path serial lock. */\n private withLock<T>(absPath: string, op: () => Promise<T>): Promise<T> {\n const prev = this.writeQueue.get(absPath) ?? Promise.resolve();\n let resolved!: T;\n const next = prev.then(async () => {\n resolved = await op();\n });\n // Best-effort: ensure the queue continues even on failure.\n const swallowed = next.catch(() => undefined);\n this.writeQueue.set(absPath, swallowed);\n return next.then(() => resolved);\n }\n\n /** Make sure the parent directory of `absPath` exists. */\n private async ensureParent(absPath: string): Promise<void> {\n await this.backend.mkdir(path.dirname(absPath), { recursive: true });\n }\n\n private async emit(event: WorkspaceWriteEvent): Promise<void> {\n await this.sinks.notifyAll(event);\n }\n\n // === Orbital artifacts ===\n\n readOrbital(name: string): string | null {\n assertOrbitalName(name);\n const p = orbitalFile(this.workDir, name);\n if (!this.backend.exists(p)) return null;\n try {\n return this.backend.readFileSync(p);\n } catch {\n return null;\n }\n }\n\n async writeOrbital(name: string, content: string): Promise<void> {\n assertOrbitalName(name);\n const p = orbitalFile(this.workDir, name);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, content);\n });\n await this.emit({ kind: 'orbital', name, content });\n }\n\n listOrbitals(): string[] {\n const dir = path.join(this.workDir, WORKSPACE_LAYOUT.ORBITALS_DIR);\n if (!this.backend.exists(dir)) return [];\n try {\n return this.backend.readdirSync(dir)\n .filter(f => f.endsWith('.orb'))\n .map(f => f.replace(/\\.orb$/, ''))\n .sort();\n } catch {\n return [];\n }\n }\n\n async archiveOrbital(name: string): Promise<void> {\n assertOrbitalName(name);\n const src = orbitalFile(this.workDir, name);\n if (!this.backend.exists(src)) return;\n const content = await this.backend.readFile(src);\n const dst = archivedOrbitalFile(this.workDir, name);\n await this.withLock(src, async () => {\n await this.ensureParent(dst);\n await this.backend.writeFile(dst, content);\n await this.backend.unlink(src);\n });\n await this.emit({ kind: 'orbital-archived', name });\n }\n\n async renameOrbital(from: string, to: string): Promise<void> {\n assertOrbitalName(from);\n assertOrbitalName(to);\n const src = orbitalFile(this.workDir, from);\n const dst = orbitalFile(this.workDir, to);\n if (!this.backend.exists(src)) return;\n const content = await this.backend.readFile(src);\n await this.withLock(src, async () => {\n await this.ensureParent(dst);\n await this.backend.writeFile(dst, content);\n await this.backend.unlink(src);\n });\n await this.emit({ kind: 'orbital-renamed', from, to });\n }\n\n async renameOrbitalSession(from: string, to: string): Promise<void> {\n assertOrbitalName(from);\n assertOrbitalName(to);\n const src = orbitalSessionDir(this.workDir, from);\n const dst = orbitalSessionDir(this.workDir, to);\n if (!this.backend.exists(src)) return;\n if (this.backend.exists(dst)) return;\n await this.withLock(src, async () => {\n await this.backend.rename(src, dst);\n });\n await this.emit({ kind: 'session-renamed', from, to });\n }\n\n // === Schema artifact ===\n\n readSchema(): string | null {\n const p = schemaFile(this.workDir);\n if (!this.backend.exists(p)) return null;\n try {\n return this.backend.readFileSync(p);\n } catch {\n return null;\n }\n }\n\n async writeSchema(content: string): Promise<void> {\n const p = schemaFile(this.workDir);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, content);\n });\n await this.emit({ kind: 'schema', content });\n }\n\n // === Coordinator session ===\n\n readAnalysis<T extends JsonObject>(): T | null {\n return readJsonFileSync<T>(this.backend, coordinatorFile(this.workDir, COORD_FILES.analysis));\n }\n\n async writeAnalysis<T extends JsonObject>(analysis: T): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.analysis);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await writeJsonFile(this.backend, p, analysis);\n });\n await this.emit({ kind: 'analysis', content: analysis });\n }\n\n readPlan<T extends JsonObject>(): T | null {\n return readJsonFileSync<T>(this.backend, coordinatorFile(this.workDir, COORD_FILES.plan));\n }\n\n async writePlan<T extends JsonObject>(plan: T): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.plan);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await writeJsonFile(this.backend, p, plan);\n });\n await this.emit({ kind: 'plan', content: plan });\n }\n\n readClarificationAnswers(): Record<string, string> {\n const p = coordinatorFile(this.workDir, COORD_FILES.clarifications);\n if (!this.backend.exists(p)) return {};\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p)) as JsonObject;\n const out: Record<string, string> = {};\n for (const k of Object.keys(parsed)) {\n const v = parsed[k];\n if (typeof v === 'string') out[k] = v;\n }\n return out;\n } catch {\n return {};\n }\n }\n\n async writeClarificationAnswers(answers: Record<string, string>): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.clarifications);\n const asJson: JsonObject = { ...answers };\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await writeJsonFile(this.backend, p, asJson);\n });\n await this.emit({ kind: 'clarifications', content: answers });\n }\n\n readCoordinatorMessages<T extends JsonValue>(): T[] | null {\n const p = coordinatorFile(this.workDir, COORD_FILES.messages);\n if (!this.backend.exists(p)) return null;\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p));\n if (!Array.isArray(parsed)) return null;\n return parsed as T[];\n } catch {\n return null;\n }\n }\n\n async writeCoordinatorMessages<T extends JsonValue>(messages: T[]): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.messages);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, JSON.stringify(messages, null, 2));\n });\n await this.emit({ kind: 'coordinator-messages', content: messages as JsonValue[] });\n }\n\n // === Per-orbital session ===\n\n private orbitalFile(orbital: string, basename: string): string {\n assertOrbitalName(orbital);\n return orbitalSessionFile(this.workDir, orbital, basename);\n }\n\n readSpec<T extends JsonObject>(orbital: string): T | null {\n return readJsonFileSync<T>(this.backend, this.orbitalFile(orbital, ORBITAL_FILES.spec));\n }\n\n async writeSpec<T extends JsonObject>(orbital: string, spec: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.spec);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await writeJsonFile(this.backend, p, spec);\n });\n await this.emit({ kind: 'spec', orbital, content: spec });\n }\n\n readMemory<T extends JsonObject>(orbital: string): T | null {\n return readJsonFileSync<T>(this.backend, this.orbitalFile(orbital, ORBITAL_FILES.memory));\n }\n\n async writeMemory<T extends JsonObject>(orbital: string, memory: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.memory);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await writeJsonFile(this.backend, p, memory);\n });\n await this.emit({ kind: 'memory', orbital, content: memory });\n }\n\n async appendHistory<T extends JsonObject>(orbital: string, entry: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.history);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await appendJsonLine(this.backend, p, entry);\n });\n await this.emit({ kind: 'history', orbital, entry });\n }\n\n readHistory<T extends JsonObject>(orbital: string): T[] {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.history);\n return readJsonLinesSync<T>(this.backend, p);\n }\n\n async appendParamsHistory<T extends JsonObject>(orbital: string, row: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.paramsHistory);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await appendJsonLine(this.backend, p, row);\n });\n await this.emit({ kind: 'params-history', orbital, row });\n }\n\n readErrors<T extends JsonObject>(orbital: string): T[] {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.errors);\n if (!this.backend.exists(p)) return [];\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p));\n if (!Array.isArray(parsed)) return [];\n return parsed as T[];\n } catch {\n return [];\n }\n }\n\n async writeErrors<T extends JsonObject>(orbital: string, errors: T[]): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.errors);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await this.backend.writeFile(p, JSON.stringify(errors, null, 2));\n });\n await this.emit({ kind: 'errors', orbital, content: errors });\n }\n\n readSubagentMessages<T extends JsonValue>(orbital: string): T[] | null {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.messages);\n if (!this.backend.exists(p)) return null;\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p));\n if (!Array.isArray(parsed)) return null;\n return parsed as T[];\n } catch {\n return null;\n }\n }\n\n async writeSubagentMessages<T extends JsonValue>(\n orbital: string,\n messages: T[],\n ): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.messages);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await this.backend.writeFile(p, JSON.stringify(messages, null, 2));\n });\n await this.emit({ kind: 'subagent-messages', orbital, content: messages as JsonValue[] });\n }\n\n // === Trace ===\n\n async emitTrace<T extends JsonObject>(event: T): Promise<void> {\n const p = traceFile(this.workDir);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await appendJsonLine(this.backend, p, event);\n });\n await this.emit({ kind: 'trace', event });\n }\n\n readTrace<T extends JsonObject>(): T[] {\n const p = traceFile(this.workDir);\n return readJsonLinesSync<T>(this.backend, p);\n }\n\n // === Compiled output ===\n\n async writeCompiled(relPath: string, content: string): Promise<void> {\n if (relPath.includes('..') || path.isAbsolute(relPath)) {\n throw new Error(`compiled: invalid relPath (${relPath})`);\n }\n const p = compiledFile(this.workDir, relPath);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, content);\n });\n await this.emit({ kind: 'compiled', relPath, content });\n }\n\n readCompiled(relPath: string): string | null {\n if (relPath.includes('..') || path.isAbsolute(relPath)) return null;\n const p = compiledFile(this.workDir, relPath);\n if (!this.backend.exists(p)) return null;\n try {\n return this.backend.readFileSync(p);\n } catch {\n return null;\n }\n }\n\n async clearCompiled(): Promise<void> {\n const dir = compiledDir(this.workDir);\n if (!this.backend.exists(dir)) return;\n await removeTree(this.backend, dir);\n }\n\n // === Sandboxed generic file I/O ===\n\n async readFile(relPath: string): Promise<string | null> {\n const abs = sandboxedPath(this.workDir, relPath);\n if (!this.backend.exists(abs)) return null;\n try {\n return await this.backend.readFile(abs);\n } catch {\n return null;\n }\n }\n\n async writeFile(relPath: string, content: string): Promise<void> {\n const abs = sandboxedPath(this.workDir, relPath);\n await this.withLock(abs, async () => {\n await this.ensureParent(abs);\n await this.backend.writeFile(abs, content);\n });\n await this.emit({ kind: 'file', relPath, content });\n }\n\n async listTree(relPath?: string): Promise<FileTreeNode[]> {\n const base = relPath === undefined ? this.workDir : sandboxedPath(this.workDir, relPath);\n if (!this.backend.exists(base)) return [];\n const out: FileTreeNode[] = [];\n await walk(this.backend, base, this.workDir, out);\n return out;\n }\n\n async exists(relPath: string): Promise<boolean> {\n let abs: string;\n try {\n abs = sandboxedPath(this.workDir, relPath);\n } catch {\n return false;\n }\n return this.backend.exists(abs);\n }\n\n // === Git ===\n\n async commitAndPush(opts: {\n message: string;\n tags?: string[];\n }): Promise<{ sha: string } | null> {\n if (!this.git) return null;\n await this.git.addAll();\n const sha = await this.git.commit(opts.message);\n if (sha === null) return null;\n if (opts.tags) {\n for (const t of opts.tags) await this.git.tag(t);\n }\n if (this.github && this.github.repoUrl) {\n if (!(await this.git.hasRemote('origin'))) {\n await this.git.addRemote('origin', this.github.repoUrl);\n }\n await this.git.push('origin', this.github.branch ?? 'main');\n }\n return { sha };\n }\n\n async pullIfLinked(): Promise<boolean> {\n if (!this.git || !this.github) return false;\n if (!(await this.git.hasRemote('origin'))) return false;\n await this.git.pull('origin', this.github.branch ?? 'main');\n return true;\n }\n\n async gitStatus(): Promise<GitStatusInfo> {\n if (!this.git) {\n return { clean: true, staged: [], modified: [], untracked: [], linked: false };\n }\n const s = await this.git.status();\n const linked = await this.git.hasRemote('origin');\n return { ...s, linked };\n }\n\n // === Observation ===\n\n subscribe(observer: WorkspaceObserver): () => void {\n return this.sinks.subscribe(observer);\n }\n\n // === Disposal ===\n\n async dispose(): Promise<void> {\n // Drain pending writes.\n const pending = Array.from(this.writeQueue.values());\n await Promise.allSettled(pending);\n // Optional final commit when configured.\n if (this.git && this.github) {\n try {\n await this.commitAndPush({ message: 'workspace: dispose' });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`[workspace] dispose: commitAndPush failed: ${msg}`);\n }\n }\n }\n}\n\n// ============================================================================\n// Sync helpers — wrap backend reads with safe JSON parse.\n// ============================================================================\n\nfunction readJsonFileSync<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n): T | null {\n if (!backend.exists(absPath)) return null;\n try {\n return JSON.parse(backend.readFileSync(absPath)) as T;\n } catch {\n return null;\n }\n}\n\nfunction readJsonLinesSync<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n): T[] {\n if (!backend.exists(absPath)) return [];\n try {\n const raw = backend.readFileSync(absPath);\n const out: T[] = [];\n for (const line of raw.split('\\n')) {\n if (!line.trim()) continue;\n try {\n out.push(JSON.parse(line) as T);\n } catch {\n // skip\n }\n }\n return out;\n } catch {\n return [];\n }\n}\n\nasync function walk(\n backend: WorkspaceBackend,\n dir: string,\n root: string,\n out: FileTreeNode[],\n): Promise<void> {\n const entries = await backend.readdir(dir);\n for (const name of entries) {\n const full = path.join(dir, name);\n const s = await backend.stat(full);\n const rel = path.relative(root, full).split(path.sep).join('/');\n if (s.isDirectory) {\n out.push({ path: rel, type: 'directory', size: 0 });\n await walk(backend, full, root, out);\n } else {\n out.push({ path: rel, type: 'file', size: s.size });\n }\n }\n}\n\nasync function removeTree(backend: WorkspaceBackend, dir: string): Promise<void> {\n const entries = await backend.readdir(dir);\n for (const name of entries) {\n const full = path.join(dir, name);\n let isDir = false;\n try {\n isDir = (await backend.stat(full)).isDirectory;\n } catch {\n continue;\n }\n if (isDir) {\n await removeTree(backend, full);\n } else {\n try {\n await backend.unlink(full);\n } catch {\n // ignore\n }\n }\n }\n}\n","/**\n * Embedder port + production binding to `@almadar/llm`'s\n * `EmbeddingClient`.\n *\n * The port lets tests inject a deterministic mock without paying for\n * real network calls. Production wiring constructs an `EmbeddingClient`\n * once per workspace open and reuses it for every bake.\n *\n * @packageDocumentation\n */\n\nimport { EmbeddingClient } from '@almadar/llm';\nimport type { EmbedderPort } from './types.js';\n\n/**\n * Production embedder backed by `@almadar/llm`'s `EmbeddingClient` on\n * the openrouter provider (bge-base-en-v1.5, 768-d) — same model the\n * catalog narrower uses, so vectors share an embedding space across\n * the workspace + catalog surfaces.\n *\n * Construction is lazy: the `EmbeddingClient` (and its env-key check)\n * only fires when `embedBatch` is first called. A workspace that has\n * no orbitals to bake never pays the cost or trips the missing-key\n * error — useful for the memory-backed CLI runner that opens fresh\n * workspaces without an API key.\n */\nexport function createDefaultEmbedder(): EmbedderPort {\n let client: EmbeddingClient | null = null;\n function get(): EmbeddingClient {\n if (client === null) client = new EmbeddingClient({ provider: 'openrouter' });\n return client;\n }\n return {\n async embedBatch(texts) {\n if (texts.length === 0) return { embeddings: [] };\n const result = await get().embedBatch(texts);\n return { embeddings: result.embeddings };\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';\nimport { createDefaultEmbedder } from './workspace-index/embedder.js';\n\n/**\n * Per-(userId, appId) in-process dedupe of concurrent `openWorkspace`\n * calls. Two near-simultaneous calls for the same appId would both fail\n * `findLocalWorkspaceDir` (neither has written `app-marker.json` yet)\n * and both fall through to `mintSessionDir`, producing two distinct\n * directories for the same logical workspace. The cached Promise lets\n * subsequent callers await the first call's resolution and share the\n * resulting `WorkspaceService` instance.\n *\n * The cache key includes `backend` because memory and local backends\n * are disjoint stores — a memory-backed call must not share with a\n * local-backed one. Anonymous calls (no `appId`) bypass entirely;\n * every anonymous mint is intended to be a fresh independent session.\n *\n * Failed resolutions clear their own entry so the next call retries\n * cleanly instead of returning the cached rejection forever.\n */\nconst openWorkspaceInFlight = new Map<string, Promise<WorkspaceService>>();\n\nfunction openWorkspaceCacheKey(opts: OpenWorkspaceOptions): string | null {\n if (opts.appId === undefined) return null;\n const backendTag = opts.backend === 'memory' ? 'memory' : 'local';\n return `${backendTag}:${opts.userId}:${opts.appId}`;\n}\n\nexport async function openWorkspace(opts: OpenWorkspaceOptions): Promise<WorkspaceService> {\n const key = openWorkspaceCacheKey(opts);\n if (key !== null) {\n const cached = openWorkspaceInFlight.get(key);\n if (cached) return cached;\n const pending = (async () => {\n try {\n return await openWorkspaceInternal(opts);\n } catch (err) {\n openWorkspaceInFlight.delete(key);\n throw err;\n }\n })();\n openWorkspaceInFlight.set(key, pending);\n return pending;\n }\n return openWorkspaceInternal(opts);\n}\n\nasync function openWorkspaceInternal(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 const service = new WorkspaceServiceImpl({\n workDir: resolved.workDir,\n backend,\n sinks,\n embedder: opts.embedder ?? createDefaultEmbedder(),\n appId: resolved.appId,\n git,\n github: opts.github,\n });\n\n // Strict cold start — warm any missing or stale index sidecars before\n // returning so the first `resolveOrbitalName`/`resolveTraitRef` call\n // sees authoritative data (per Almadar_Workspace_Index.md decision).\n await service.index.warm();\n\n return service;\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/dist/types.d.ts CHANGED
@@ -89,6 +89,10 @@ export type WorkspaceWriteEvent = {
89
89
  kind: 'file';
90
90
  relPath: string;
91
91
  content: string;
92
+ } | {
93
+ kind: 'workspace-index';
94
+ orbital: string;
95
+ content: JsonObject;
92
96
  };
93
97
  /**
94
98
  * Caller-supplied backend used when the local cache misses but the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/workspace",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
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",