@almadar/workspace 0.1.0-alpha.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/concurrency.test.d.ts +1 -0
- package/dist/__tests__/lifecycle.test.d.ts +1 -0
- package/dist/__tests__/observer.test.d.ts +1 -0
- package/dist/__tests__/service.test.d.ts +1 -0
- package/dist/index.d.ts +10 -1
- package/dist/index.js +1029 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/backends/index.d.ts +2 -0
- package/dist/internal/backends/local.d.ts +22 -0
- package/dist/internal/backends/memory.d.ts +25 -0
- package/dist/internal/git-client.d.ts +32 -0
- package/dist/internal/memory-files.d.ts +26 -0
- package/dist/internal/path-layout.d.ts +54 -0
- package/dist/internal/restore.d.ts +17 -0
- package/dist/internal/sink-manager.d.ts +20 -0
- package/dist/internal/templates.d.ts +18 -0
- package/dist/internal/types.d.ts +44 -0
- package/dist/internal/workspace-manager.d.ts +21 -0
- package/dist/internal/workspace-resolver.d.ts +20 -0
- package/dist/open-workspace.d.ts +11 -0
- package/dist/service.d.ts +86 -0
- package/dist/types.d.ts +210 -0
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../src/internal/backends/local.ts","../src/internal/backends/memory.ts","../src/internal/sink-manager.ts","../src/internal/path-layout.ts","../src/internal/templates.ts","../src/internal/git-client.ts","../src/internal/workspace-manager.ts","../src/internal/workspace-resolver.ts","../src/internal/restore.ts","../src/internal/memory-files.ts","../src/service.ts","../src/open-workspace.ts"],"names":["path","workDir"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Local filesystem backend. The ONLY place `node:fs` is permitted.\n */\nimport fs from 'node:fs';\nimport type { WorkspaceBackend } from '../types.js';\n\nexport class LocalBackend implements WorkspaceBackend {\n async readFile(absPath: string): Promise<string> {\n return fs.promises.readFile(absPath, 'utf-8');\n }\n readFileSync(absPath: string): string {\n return fs.readFileSync(absPath, 'utf-8');\n }\n async writeFile(absPath: string, content: string): Promise<void> {\n await fs.promises.writeFile(absPath, content, 'utf-8');\n }\n writeFileSync(absPath: string, content: string): void {\n fs.writeFileSync(absPath, content, 'utf-8');\n }\n exists(absPath: string): boolean {\n return fs.existsSync(absPath);\n }\n async readdir(absPath: string): Promise<string[]> {\n return fs.promises.readdir(absPath);\n }\n readdirSync(absPath: string): string[] {\n return fs.readdirSync(absPath);\n }\n async mkdir(absPath: string, opts?: { recursive?: boolean }): Promise<void> {\n await fs.promises.mkdir(absPath, opts);\n }\n mkdirSync(absPath: string, opts?: { recursive?: boolean }): void {\n fs.mkdirSync(absPath, opts);\n }\n async unlink(absPath: string): Promise<void> {\n await fs.promises.unlink(absPath);\n }\n async stat(\n absPath: string,\n ): Promise<{ size: number; mtimeMs: number; isDirectory: boolean }> {\n const s = await fs.promises.stat(absPath);\n return { size: s.size, mtimeMs: s.mtimeMs, isDirectory: s.isDirectory() };\n }\n}\n","/**\n * In-memory backend for tests and sandboxed evals. No `node:fs`.\n */\nimport type { WorkspaceBackend } from '../types.js';\n\nexport class MemoryBackend implements WorkspaceBackend {\n private files = new Map<string, string>();\n private dirs = new Set<string>();\n\n async readFile(absPath: string): Promise<string> {\n return this.readFileSync(absPath);\n }\n readFileSync(absPath: string): string {\n const content = this.files.get(absPath);\n if (content === undefined) throw new Error(`ENOENT: ${absPath}`);\n return content;\n }\n async writeFile(absPath: string, content: string): Promise<void> {\n this.writeFileSync(absPath, content);\n }\n writeFileSync(absPath: string, content: string): void {\n this.files.set(absPath, content);\n }\n exists(absPath: string): boolean {\n if (this.files.has(absPath) || this.dirs.has(absPath)) return true;\n // Treat any prefix that has children as an existing dir.\n const prefix = absPath.endsWith('/') ? absPath : absPath + '/';\n for (const k of this.files.keys()) {\n if (k.startsWith(prefix)) return true;\n }\n return false;\n }\n async readdir(absPath: string): Promise<string[]> {\n return this.readdirSync(absPath);\n }\n readdirSync(absPath: string): string[] {\n const prefix = absPath.endsWith('/') ? absPath : absPath + '/';\n const entries = new Set<string>();\n for (const key of this.files.keys()) {\n if (key.startsWith(prefix)) {\n const rest = key.slice(prefix.length);\n const firstSegment = rest.split('/')[0];\n if (firstSegment) entries.add(firstSegment);\n }\n }\n return Array.from(entries);\n }\n async mkdir(absPath: string): Promise<void> {\n this.mkdirSync(absPath);\n }\n mkdirSync(absPath: string): void {\n this.dirs.add(absPath);\n }\n async unlink(absPath: string): Promise<void> {\n this.files.delete(absPath);\n }\n async stat(\n absPath: string,\n ): Promise<{ size: number; mtimeMs: number; isDirectory: boolean }> {\n const content = this.files.get(absPath);\n if (content !== undefined) {\n return { size: content.length, mtimeMs: Date.now(), isDirectory: false };\n }\n // Treat as directory if anything sits under it.\n if (this.dirs.has(absPath)) return { size: 0, mtimeMs: Date.now(), isDirectory: true };\n const prefix = absPath.endsWith('/') ? absPath : absPath + '/';\n for (const k of this.files.keys()) {\n if (k.startsWith(prefix)) return { size: 0, mtimeMs: Date.now(), isDirectory: true };\n }\n throw new Error(`ENOENT: ${absPath}`);\n }\n\n // Test helpers\n getAll(): Map<string, string> {\n return new Map(this.files);\n }\n clear(): void {\n this.files.clear();\n this.dirs.clear();\n }\n}\n","/**\n * Internal SinkManager — fans `WorkspaceWriteEvent` out to every\n * registered `WorkspaceObserver`. A slow / hung observer does not crash\n * the writer; results are collected via `Promise.allSettled`.\n *\n * @packageDocumentation\n */\n\nimport type { WorkspaceObserver, WorkspaceWriteEvent } from '../types.js';\n\nexport class SinkManager {\n private readonly observers: WorkspaceObserver[] = [];\n\n /** Register an observer; returns an unsubscribe function. */\n subscribe(observer: WorkspaceObserver): () => void {\n this.observers.push(observer);\n return () => {\n const i = this.observers.indexOf(observer);\n if (i >= 0) this.observers.splice(i, 1);\n };\n }\n\n /** Snapshot of observer count — useful for diagnostics. */\n get observerCount(): number {\n return this.observers.length;\n }\n\n /**\n * Notify all observers in parallel. Awaits all settlements. A rejected\n * observer is captured in the result; subsequent writes still proceed.\n */\n async notifyAll(event: WorkspaceWriteEvent): Promise<void> {\n if (this.observers.length === 0) return;\n const settled = await Promise.allSettled(\n this.observers.map(async o => o.onWrite(event)),\n );\n for (const r of settled) {\n if (r.status === 'rejected') {\n // Observer failure must not surface as a write failure, but it is\n // useful to keep visible. Console-only so the package stays\n // logger-agnostic.\n const reason = r.reason instanceof Error ? r.reason.message : String(r.reason);\n console.error(`[workspace] observer error on ${event.kind}: ${reason}`);\n }\n }\n }\n}\n","/**\n * Path discipline — every absolute path the service uses is computed here.\n *\n * Consumers never construct paths. Public methods take logical names; the\n * service calls into this module to resolve them. Trusted internal paths\n * (orbital files, session files) use `path.join` directly; sandboxed\n * methods (`readFile` / `writeFile`) go through `sandboxedPath` which\n * rejects traversal.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\n\n/** Single source of truth for workspace directory layout. */\nexport const WORKSPACE_LAYOUT = {\n ALMADAR_DIR: '.almadar',\n ORBITALS_DIR: 'orbitals',\n SESSIONS_DIR: '.almadar/sessions',\n COORDINATOR_DIR: '.almadar/sessions/Coordinator',\n TRACE_FILE: '.almadar/trace.jsonl',\n SCHEMA_FILE: 'schema.orb',\n COMPILED_DIR: 'apps',\n APP_MARKER: '.almadar/app-marker.json',\n USER_MEMORY: '.almadar/user.orb',\n PROJECT_MEMORY: '.almadar/project.orb',\n} as const;\n\n/** Logical orbital name → absolute `.orb` path. */\nexport function orbitalFile(workDir: string, name: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR, `${name}.orb`);\n}\n\n/** Archived orbital path. */\nexport function archivedOrbitalFile(workDir: string, name: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR, '.archived', `${name}.orb`);\n}\n\n/** Schema (combined output) file. */\nexport function schemaFile(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.SCHEMA_FILE);\n}\n\n/** Coordinator session dir. */\nexport function coordinatorDir(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.COORDINATOR_DIR);\n}\n\n/** Coordinator-level artifact path. */\nexport function coordinatorFile(workDir: string, basename: string): string {\n return path.join(coordinatorDir(workDir), basename);\n}\n\n/** Per-orbital session dir. */\nexport function orbitalSessionDir(workDir: string, orbital: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.SESSIONS_DIR, orbital);\n}\n\n/** Per-orbital session-file path. */\nexport function orbitalSessionFile(workDir: string, orbital: string, basename: string): string {\n return path.join(orbitalSessionDir(workDir, orbital), basename);\n}\n\n/** Trace JSONL. */\nexport function traceFile(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.TRACE_FILE);\n}\n\n/** Compiled output base. */\nexport function compiledDir(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.COMPILED_DIR);\n}\n\n/** Compiled-output path for a given relative key. */\nexport function compiledFile(workDir: string, relPath: string): string {\n return path.join(compiledDir(workDir), relPath);\n}\n\n/** App marker — used internally by the resolver/factory. */\nexport function appMarkerFile(workDir: string): string {\n return path.join(workDir, WORKSPACE_LAYOUT.APP_MARKER);\n}\n\n/**\n * Resolve a user-supplied relative path within the sandbox. Rejects\n * absolute paths, `..` traversal, and any path that resolves outside\n * `workDir`. Returns the absolute resolved path on success.\n */\nexport function sandboxedPath(workDir: string, relPath: string): string {\n if (typeof relPath !== 'string' || relPath.length === 0) {\n throw new Error('sandbox: empty relative path');\n }\n if (path.isAbsolute(relPath)) {\n throw new Error(`sandbox: absolute paths are not allowed (${relPath})`);\n }\n // Reject Windows-style absolute paths on cross-platform consumers.\n if (/^[a-zA-Z]:[\\\\/]/.test(relPath)) {\n throw new Error(`sandbox: drive-letter paths are not allowed (${relPath})`);\n }\n const rootAbs = path.resolve(workDir);\n const target = path.resolve(rootAbs, relPath);\n if (target !== rootAbs && !target.startsWith(rootAbs + path.sep)) {\n throw new Error(`sandbox: path escapes workspace (${relPath})`);\n }\n return target;\n}\n\n/** Validate an orbital logical name — no path separators, no `..`. */\nexport function assertOrbitalName(name: string): void {\n if (typeof name !== 'string' || name.length === 0) {\n throw new Error('orbital name: empty');\n }\n if (name.includes('/') || name.includes('\\\\') || name === '.' || name === '..') {\n throw new Error(`orbital name: invalid (${name})`);\n }\n}\n","/**\n * Mint-time templates. Written by `openWorkspace` when minting a fresh\n * workspace. Internal — not exported from the package barrel.\n *\n * The shapes follow @almadar/core's `OrbitalSchema` but are kept here as\n * literal JSON so this package has zero dependency on the std memory\n * orbital definitions.\n *\n * @packageDocumentation\n */\n\nimport type { JsonObject } from '@almadar/core';\n\n/** Empty scaffold for a new generation. */\nexport function createSchemaOrbTemplate(name: string): JsonObject {\n return {\n name,\n version: '1.0.0',\n description: '',\n orbitals: [],\n };\n}\n\n/** User preferences template — minimal seed. */\nexport function createUserOrbTemplate(userId: string): JsonObject {\n return {\n name: 'UserMemory',\n version: '1.0.0',\n description: 'User preferences and learned patterns',\n orbitals: [\n {\n name: 'PreferenceTracking',\n entity: {\n name: 'UserPreference',\n fields: [],\n instances: [\n {\n id: `pref-${userId}`,\n userId,\n },\n ],\n },\n traits: [],\n pages: [],\n },\n ],\n };\n}\n\n/** Project context template. */\nexport function createProjectOrbTemplate(projectName: string, appId?: string): JsonObject {\n return {\n name: 'ProjectMemory',\n version: '1.0.0',\n description: `Domain knowledge for ${projectName}`,\n orbitals: [\n {\n name: 'DomainKnowledge',\n entity: {\n name: 'ProjectContext',\n fields: [],\n instances: [\n {\n id: appId ?? `project-${projectName}`,\n appId: appId ?? '',\n projectName,\n lastUpdatedAt: new Date().toISOString(),\n },\n ],\n },\n traits: [],\n pages: [],\n },\n ],\n };\n}\n\nexport function serializeJson(value: JsonObject): string {\n return JSON.stringify(value, null, 2);\n}\n","/**\n * Thin wrapper around local `git` CLI for workspace-local operations\n * (init, add, commit, tag, push, pull, status). No `node:fs` use here —\n * existence checks ride the backend.\n *\n * @packageDocumentation\n */\n\nimport { execFile } from 'node:child_process';\nimport path from 'node:path';\nimport type { WorkspaceBackend } from './types.js';\n\nexport interface GitStatus {\n clean: boolean;\n staged: string[];\n modified: string[];\n untracked: string[];\n}\n\nexport class GitClient {\n constructor(private readonly cwd: string, private readonly backend: WorkspaceBackend) {}\n\n /** Is the working dir already a git repo? */\n async isRepo(): Promise<boolean> {\n return this.backend.exists(path.join(this.cwd, '.git'));\n }\n\n async init(): Promise<void> {\n if (await this.isRepo()) return;\n await this.exec(['init']);\n await this.exec(['config', 'user.email', 'agent@almadar.io']);\n await this.exec(['config', 'user.name', 'Almadar Agent']);\n }\n\n async addAll(): Promise<void> {\n await this.exec(['add', '-A']);\n }\n\n async commit(message: string): Promise<string | null> {\n try {\n const out = await this.exec(['commit', '-m', message, '--allow-empty-message']);\n const match = out.match(/\\[[\\w/.-]+ ([a-f0-9]+)\\]/);\n return match ? match[1] : null;\n } catch (err: unknown) {\n if (err instanceof Error && err.message.includes('nothing to commit')) return null;\n throw err;\n }\n }\n\n async tag(name: string, message?: string): Promise<void> {\n const args = ['tag'];\n if (message) {\n args.push('-a', name, '-m', message);\n } else {\n args.push(name);\n }\n await this.exec(args);\n }\n\n async push(remote = 'origin', branch?: string): Promise<void> {\n const args = ['push', remote];\n if (branch) args.push(branch);\n await this.exec(args);\n }\n\n async pull(remote = 'origin', branch?: string): Promise<void> {\n const args = ['pull', remote];\n if (branch) args.push(branch);\n await this.exec(args);\n }\n\n async hasRemote(remote = 'origin'): Promise<boolean> {\n try {\n const out = await this.exec(['remote']);\n return out.split('\\n').map(s => s.trim()).includes(remote);\n } catch {\n return false;\n }\n }\n\n async addRemote(remote: string, url: string): Promise<void> {\n await this.exec(['remote', 'add', remote, url]);\n }\n\n async status(): Promise<GitStatus> {\n const out = await this.exec(['status', '--porcelain']);\n const lines = out.split('\\n').filter(Boolean);\n const staged: string[] = [];\n const modified: string[] = [];\n const untracked: string[] = [];\n for (const line of lines) {\n const index = line[0];\n const work = line[1];\n const file = line.slice(3);\n if (index === '?' && work === '?') untracked.push(file);\n else if (index !== ' ' && index !== '?') staged.push(file);\n else if (work !== ' ') modified.push(file);\n }\n return { clean: lines.length === 0, staged, modified, untracked };\n }\n\n async headSha(): Promise<string | null> {\n try {\n const out = await this.exec(['rev-parse', 'HEAD']);\n return out.trim() || null;\n } catch {\n return null;\n }\n }\n\n private exec(args: string[]): Promise<string> {\n return execGit(args, this.cwd);\n }\n}\n\nfunction execGit(args: string[], cwd: string): Promise<string> {\n return new Promise((resolve, reject) => {\n execFile('git', args, { cwd, maxBuffer: 10 * 1024 * 1024 }, (err, stdout, stderr) => {\n if (err) {\n const message = stderr?.trim() || stdout?.trim() || err.message;\n reject(new Error(`git ${args[0]}: ${message}`));\n return;\n }\n resolve(stdout);\n });\n });\n}\n","/**\n * Internal lifecycle helpers used by `openWorkspace` on mint/adopt/resume.\n *\n * - Create the workspace directory skeleton.\n * - Write mint-time templates (schema.orb, user.orb, project.orb) if missing.\n * - Initialize git when `github` is supplied.\n *\n * No `node:fs` use here — everything rides the backend.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { WorkspaceBackend } from './types.js';\nimport {\n WORKSPACE_LAYOUT,\n coordinatorDir,\n orbitalSessionDir,\n schemaFile,\n} from './path-layout.js';\nimport {\n createSchemaOrbTemplate,\n createUserOrbTemplate,\n createProjectOrbTemplate,\n serializeJson,\n} from './templates.js';\nimport { GitClient } from './git-client.js';\n\n/** Make sure every workspace dir exists. */\nexport async function ensureSkeleton(\n backend: WorkspaceBackend,\n workDir: string,\n): Promise<void> {\n await backend.mkdir(workDir, { recursive: true });\n await backend.mkdir(path.join(workDir, WORKSPACE_LAYOUT.ALMADAR_DIR), { recursive: true });\n await backend.mkdir(path.join(workDir, WORKSPACE_LAYOUT.ORBITALS_DIR), { recursive: true });\n await backend.mkdir(path.join(workDir, WORKSPACE_LAYOUT.SESSIONS_DIR), { recursive: true });\n await backend.mkdir(coordinatorDir(workDir), { recursive: true });\n}\n\n/** Initialise per-orbital session dir lazily. */\nexport async function ensureOrbitalSessionDir(\n backend: WorkspaceBackend,\n workDir: string,\n orbital: string,\n): Promise<void> {\n await backend.mkdir(orbitalSessionDir(workDir, orbital), { recursive: true });\n}\n\n/** Write mint-time templates only when they don't exist. */\nexport async function writeMintTemplatesIfMissing(\n backend: WorkspaceBackend,\n workDir: string,\n userId: string,\n projectName: string,\n appId?: string,\n): Promise<void> {\n const schemaPath = schemaFile(workDir);\n if (!backend.exists(schemaPath)) {\n await backend.writeFile(schemaPath, serializeJson(createSchemaOrbTemplate(projectName)));\n }\n const userPath = path.join(workDir, WORKSPACE_LAYOUT.USER_MEMORY);\n if (!backend.exists(userPath)) {\n await backend.writeFile(userPath, serializeJson(createUserOrbTemplate(userId)));\n }\n const projectPath = path.join(workDir, WORKSPACE_LAYOUT.PROJECT_MEMORY);\n if (!backend.exists(projectPath)) {\n await backend.writeFile(\n projectPath,\n serializeJson(createProjectOrbTemplate(projectName, appId)),\n );\n }\n}\n\n/** Initialise git for the workspace if it isn't already a repo. */\nexport async function ensureGitInit(\n backend: WorkspaceBackend,\n workDir: string,\n): Promise<GitClient> {\n const git = new GitClient(workDir, backend);\n await git.init();\n return git;\n}\n","/**\n * Lifecycle helpers — read + write the per-workspace app marker, and\n * scan a user's workspace root for one that matches a known `appId`.\n *\n * No `node:fs` here — everything rides the backend.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { JsonObject } from '@almadar/core';\nimport type { WorkspaceBackend, AppMarker } from './types.js';\nimport { appMarkerFile } from './path-layout.js';\n\n/** Synchronous read — used during resolution before the service is built. */\nexport function readAppMarker(backend: WorkspaceBackend, workDir: string): AppMarker | null {\n const markerPath = appMarkerFile(workDir);\n if (!backend.exists(markerPath)) return null;\n try {\n const raw = backend.readFileSync(markerPath);\n const parsed = JSON.parse(raw) as JsonObject;\n if (\n typeof parsed.appId !== 'string'\n || typeof parsed.userId !== 'string'\n || typeof parsed.createdAt !== 'number'\n ) {\n return null;\n }\n const marker: AppMarker = {\n appId: parsed.appId,\n userId: parsed.userId,\n createdAt: parsed.createdAt,\n };\n if (typeof parsed.repoUrl === 'string') marker.repoUrl = parsed.repoUrl;\n return marker;\n } catch {\n return null;\n }\n}\n\n/** Write the marker. Caller ensures the `.almadar/` dir exists. */\nexport async function writeAppMarker(\n backend: WorkspaceBackend,\n workDir: string,\n marker: AppMarker,\n): Promise<void> {\n const markerPath = appMarkerFile(workDir);\n await backend.mkdir(path.dirname(markerPath), { recursive: true });\n await backend.writeFile(markerPath, JSON.stringify(marker, null, 2));\n}\n\n/**\n * Scan `<workspacesRoot>/<userId>/` for a session dir whose\n * `.almadar/app-marker.json` matches `appId`. Returns null on miss.\n */\nexport async function findLocalWorkspaceDir(\n backend: WorkspaceBackend,\n workspacesRoot: string,\n userId: string,\n appId: string,\n): Promise<string | null> {\n const userDir = path.join(workspacesRoot, userId);\n if (!backend.exists(userDir)) return null;\n\n let entries: string[];\n try {\n entries = await backend.readdir(userDir);\n } catch {\n return null;\n }\n\n for (const entry of entries) {\n const sessionDir = path.join(userDir, entry);\n let isDir = false;\n try {\n const s = await backend.stat(sessionDir);\n isDir = s.isDirectory;\n } catch {\n continue;\n }\n if (!isDir) continue;\n const marker = readAppMarker(backend, sessionDir);\n if (marker && marker.appId === appId) return sessionDir;\n }\n return null;\n}\n\n/** Compose a fresh session dir under `<workspacesRoot>/<userId>/`. */\nexport function mintSessionDir(workspacesRoot: string, userId: string): string {\n const ts = new Date().toISOString().slice(0, 10);\n const suffix = Date.now().toString(36);\n return path.join(workspacesRoot, userId, `${ts}_${suffix}`);\n}\n","/**\n * Restore an empty/missing workspace from a `RestoreBackend`.\n *\n * Used by `openWorkspace` when `opts.appId` is set, the local cache\n * misses, and `opts.restore` is supplied. Writes via the backend (so no\n * `node:fs` here).\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { RestoreBackend } from '../types.js';\nimport type { WorkspaceBackend } from './types.js';\n\nexport interface RestoreResult {\n filesRestored: number;\n bytesWritten: number;\n}\n\n/** Pull every file the backend knows about and write it under `rootDir`. */\nexport async function restoreWorkspace(\n backend: WorkspaceBackend,\n rootDir: string,\n restore: RestoreBackend,\n): Promise<RestoreResult> {\n const rootAbs = path.resolve(rootDir);\n await backend.mkdir(rootAbs, { recursive: true });\n\n const paths = await restore.listFiles();\n let filesRestored = 0;\n let bytesWritten = 0;\n\n for (const relativePath of paths) {\n const normalised = relativePath.replace(/\\\\/g, '/');\n const target = path.resolve(rootAbs, normalised);\n if (target !== rootAbs && !target.startsWith(rootAbs + path.sep)) {\n // Escape attempt — drop.\n continue;\n }\n const content = await restore.readFile(normalised);\n if (content === null) continue;\n await backend.mkdir(path.dirname(target), { recursive: true });\n await backend.writeFile(target, content);\n filesRestored++;\n bytesWritten += Buffer.byteLength(content, 'utf-8');\n }\n\n return { filesRestored, bytesWritten };\n}\n","/**\n * Memory-file helpers used internally by the service.\n *\n * @packageDocumentation\n */\n\nimport type { JsonObject } from '@almadar/core';\nimport type { WorkspaceBackend } from './types.js';\n\n/**\n * Try to read JSON from `absPath` via the backend. Returns `null` when\n * the file is missing or unparseable.\n */\nexport async function readJsonFile<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n): Promise<T | null> {\n if (!backend.exists(absPath)) return null;\n try {\n const raw = await backend.readFile(absPath);\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * Write a JSON object via the backend with 2-space pretty-printing.\n */\nexport async function writeJsonFile<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n value: T,\n): Promise<void> {\n await backend.writeFile(absPath, JSON.stringify(value, null, 2));\n}\n\n/**\n * Read newline-delimited JSON. Drops malformed lines silently.\n */\nexport async function readJsonLines<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n): Promise<T[]> {\n if (!backend.exists(absPath)) return [];\n try {\n const raw = await backend.readFile(absPath);\n const out: T[] = [];\n for (const line of raw.split('\\n')) {\n if (!line.trim()) continue;\n try {\n out.push(JSON.parse(line) as T);\n } catch {\n // skip malformed\n }\n }\n return out;\n } catch {\n return [];\n }\n}\n\n/**\n * Append a single JSON value as a line. Used for trace + history streams.\n * Caller is responsible for any per-path serialization (the service's\n * write queue handles that).\n */\nexport async function appendJsonLine<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n value: T,\n): Promise<void> {\n const existing = backend.exists(absPath) ? await backend.readFile(absPath) : '';\n const ending = existing.length > 0 && !existing.endsWith('\\n') ? '\\n' : '';\n await backend.writeFile(absPath, existing + ending + JSON.stringify(value) + '\\n');\n}\n","/**\n * `WorkspaceService` implementation. The single chokepoint — every read\n * and write that any consumer performs lands here, computes its absolute\n * path via `path-layout.ts`, runs the backend op, then fans out a typed\n * `WorkspaceWriteEvent` to every registered observer.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { JsonObject, JsonValue } from '@almadar/core';\nimport type {\n FileTreeNode,\n GitHubConfig,\n GitStatusInfo,\n WorkspaceObserver,\n WorkspaceService,\n WorkspaceWriteEvent,\n} from './types.js';\nimport type { WorkspaceBackend } from './internal/types.js';\nimport { SinkManager } from './internal/sink-manager.js';\nimport { GitClient } from './internal/git-client.js';\nimport {\n archivedOrbitalFile,\n assertOrbitalName,\n compiledDir,\n compiledFile,\n coordinatorFile,\n orbitalFile,\n orbitalSessionFile,\n sandboxedPath,\n schemaFile,\n traceFile,\n WORKSPACE_LAYOUT,\n} from './internal/path-layout.js';\nimport {\n ensureOrbitalSessionDir,\n} from './internal/workspace-manager.js';\nimport {\n appendJsonLine,\n readJsonFile,\n readJsonLines,\n writeJsonFile,\n} from './internal/memory-files.js';\n\ninterface ServiceCtorArgs {\n workDir: string;\n backend: WorkspaceBackend;\n sinks: SinkManager;\n appId?: string;\n git?: GitClient;\n github?: GitHubConfig;\n}\n\nconst COORD_FILES = {\n analysis: 'analysis.json',\n plan: 'plan.json',\n clarifications: 'clarifications.json',\n messages: 'messages.json',\n} as const;\n\nconst ORBITAL_FILES = {\n spec: 'spec.json',\n memory: 'memory.json',\n history: 'history.jsonl',\n paramsHistory: 'params-history.jsonl',\n errors: 'errors.json',\n messages: 'messages.json',\n} as const;\n\nexport class WorkspaceServiceImpl implements WorkspaceService {\n readonly workDir: string;\n private _appId: string | undefined;\n private readonly backend: WorkspaceBackend;\n private readonly sinks: SinkManager;\n private readonly git: GitClient | undefined;\n private readonly github: GitHubConfig | undefined;\n /** Per-absolute-path serial queue. */\n private readonly writeQueue = new Map<string, Promise<void>>();\n\n constructor(args: ServiceCtorArgs) {\n this.workDir = args.workDir;\n this.backend = args.backend;\n this.sinks = args.sinks;\n this._appId = args.appId;\n this.git = args.git;\n this.github = args.github;\n }\n\n // === Identity ===\n\n get appId(): string | undefined {\n return this._appId;\n }\n\n setAppId(id: string): void {\n this._appId = id;\n }\n\n // === Helpers ===\n\n /** Run `op` under a per-path serial lock. */\n private withLock<T>(absPath: string, op: () => Promise<T>): Promise<T> {\n const prev = this.writeQueue.get(absPath) ?? Promise.resolve();\n let resolved!: T;\n const next = prev.then(async () => {\n resolved = await op();\n });\n // Best-effort: ensure the queue continues even on failure.\n const swallowed = next.catch(() => undefined);\n this.writeQueue.set(absPath, swallowed);\n return next.then(() => resolved);\n }\n\n /** Make sure the parent directory of `absPath` exists. */\n private async ensureParent(absPath: string): Promise<void> {\n await this.backend.mkdir(path.dirname(absPath), { recursive: true });\n }\n\n private async emit(event: WorkspaceWriteEvent): Promise<void> {\n await this.sinks.notifyAll(event);\n }\n\n // === Orbital artifacts ===\n\n readOrbital(name: string): string | null {\n assertOrbitalName(name);\n const p = orbitalFile(this.workDir, name);\n if (!this.backend.exists(p)) return null;\n try {\n return this.backend.readFileSync(p);\n } catch {\n return null;\n }\n }\n\n async writeOrbital(name: string, content: string): Promise<void> {\n assertOrbitalName(name);\n const p = orbitalFile(this.workDir, name);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, content);\n });\n await this.emit({ kind: 'orbital', name, content });\n }\n\n listOrbitals(): string[] {\n const dir = path.join(this.workDir, WORKSPACE_LAYOUT.ORBITALS_DIR);\n if (!this.backend.exists(dir)) return [];\n try {\n return this.backend.readdirSync(dir)\n .filter(f => f.endsWith('.orb'))\n .map(f => f.replace(/\\.orb$/, ''))\n .sort();\n } catch {\n return [];\n }\n }\n\n async archiveOrbital(name: string): Promise<void> {\n assertOrbitalName(name);\n const src = orbitalFile(this.workDir, name);\n if (!this.backend.exists(src)) return;\n const content = await this.backend.readFile(src);\n const dst = archivedOrbitalFile(this.workDir, name);\n await this.withLock(src, async () => {\n await this.ensureParent(dst);\n await this.backend.writeFile(dst, content);\n await this.backend.unlink(src);\n });\n await this.emit({ kind: 'orbital-archived', name });\n }\n\n async renameOrbital(from: string, to: string): Promise<void> {\n assertOrbitalName(from);\n assertOrbitalName(to);\n const src = orbitalFile(this.workDir, from);\n const dst = orbitalFile(this.workDir, to);\n if (!this.backend.exists(src)) return;\n const content = await this.backend.readFile(src);\n await this.withLock(src, async () => {\n await this.ensureParent(dst);\n await this.backend.writeFile(dst, content);\n await this.backend.unlink(src);\n });\n await this.emit({ kind: 'orbital-renamed', from, to });\n }\n\n // === Schema artifact ===\n\n readSchema(): string | null {\n const p = schemaFile(this.workDir);\n if (!this.backend.exists(p)) return null;\n try {\n return this.backend.readFileSync(p);\n } catch {\n return null;\n }\n }\n\n async writeSchema(content: string): Promise<void> {\n const p = schemaFile(this.workDir);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, content);\n });\n await this.emit({ kind: 'schema', content });\n }\n\n // === Coordinator session ===\n\n readAnalysis<T extends JsonObject>(): T | null {\n return readJsonFileSync<T>(this.backend, coordinatorFile(this.workDir, COORD_FILES.analysis));\n }\n\n async writeAnalysis<T extends JsonObject>(analysis: T): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.analysis);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await writeJsonFile(this.backend, p, analysis);\n });\n await this.emit({ kind: 'analysis', content: analysis });\n }\n\n readPlan<T extends JsonObject>(): T | null {\n return readJsonFileSync<T>(this.backend, coordinatorFile(this.workDir, COORD_FILES.plan));\n }\n\n async writePlan<T extends JsonObject>(plan: T): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.plan);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await writeJsonFile(this.backend, p, plan);\n });\n await this.emit({ kind: 'plan', content: plan });\n }\n\n readClarificationAnswers(): Record<string, string> {\n const p = coordinatorFile(this.workDir, COORD_FILES.clarifications);\n if (!this.backend.exists(p)) return {};\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p)) as JsonObject;\n const out: Record<string, string> = {};\n for (const k of Object.keys(parsed)) {\n const v = parsed[k];\n if (typeof v === 'string') out[k] = v;\n }\n return out;\n } catch {\n return {};\n }\n }\n\n async writeClarificationAnswers(answers: Record<string, string>): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.clarifications);\n const asJson: JsonObject = { ...answers };\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await writeJsonFile(this.backend, p, asJson);\n });\n await this.emit({ kind: 'clarifications', content: answers });\n }\n\n readCoordinatorMessages<T extends JsonValue>(): T[] | null {\n const p = coordinatorFile(this.workDir, COORD_FILES.messages);\n if (!this.backend.exists(p)) return null;\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p));\n if (!Array.isArray(parsed)) return null;\n return parsed as T[];\n } catch {\n return null;\n }\n }\n\n async writeCoordinatorMessages<T extends JsonValue>(messages: T[]): Promise<void> {\n const p = coordinatorFile(this.workDir, COORD_FILES.messages);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, JSON.stringify(messages, null, 2));\n });\n await this.emit({ kind: 'coordinator-messages', content: messages as JsonValue[] });\n }\n\n // === Per-orbital session ===\n\n private orbitalFile(orbital: string, basename: string): string {\n assertOrbitalName(orbital);\n return orbitalSessionFile(this.workDir, orbital, basename);\n }\n\n readSpec<T extends JsonObject>(orbital: string): T | null {\n return readJsonFileSync<T>(this.backend, this.orbitalFile(orbital, ORBITAL_FILES.spec));\n }\n\n async writeSpec<T extends JsonObject>(orbital: string, spec: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.spec);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await writeJsonFile(this.backend, p, spec);\n });\n await this.emit({ kind: 'spec', orbital, content: spec });\n }\n\n readMemory<T extends JsonObject>(orbital: string): T | null {\n return readJsonFileSync<T>(this.backend, this.orbitalFile(orbital, ORBITAL_FILES.memory));\n }\n\n async writeMemory<T extends JsonObject>(orbital: string, memory: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.memory);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await writeJsonFile(this.backend, p, memory);\n });\n await this.emit({ kind: 'memory', orbital, content: memory });\n }\n\n async appendHistory<T extends JsonObject>(orbital: string, entry: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.history);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await appendJsonLine(this.backend, p, entry);\n });\n await this.emit({ kind: 'history', orbital, entry });\n }\n\n readHistory<T extends JsonObject>(orbital: string): T[] {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.history);\n return readJsonLinesSync<T>(this.backend, p);\n }\n\n async appendParamsHistory<T extends JsonObject>(orbital: string, row: T): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.paramsHistory);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await appendJsonLine(this.backend, p, row);\n });\n await this.emit({ kind: 'params-history', orbital, row });\n }\n\n readErrors<T extends JsonObject>(orbital: string): T[] {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.errors);\n if (!this.backend.exists(p)) return [];\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p));\n if (!Array.isArray(parsed)) return [];\n return parsed as T[];\n } catch {\n return [];\n }\n }\n\n async writeErrors<T extends JsonObject>(orbital: string, errors: T[]): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.errors);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await this.backend.writeFile(p, JSON.stringify(errors, null, 2));\n });\n await this.emit({ kind: 'errors', orbital, content: errors });\n }\n\n readSubagentMessages<T extends JsonValue>(orbital: string): T[] | null {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.messages);\n if (!this.backend.exists(p)) return null;\n try {\n const parsed = JSON.parse(this.backend.readFileSync(p));\n if (!Array.isArray(parsed)) return null;\n return parsed as T[];\n } catch {\n return null;\n }\n }\n\n async writeSubagentMessages<T extends JsonValue>(\n orbital: string,\n messages: T[],\n ): Promise<void> {\n const p = this.orbitalFile(orbital, ORBITAL_FILES.messages);\n await this.withLock(p, async () => {\n await ensureOrbitalSessionDir(this.backend, this.workDir, orbital);\n await this.backend.writeFile(p, JSON.stringify(messages, null, 2));\n });\n await this.emit({ kind: 'subagent-messages', orbital, content: messages as JsonValue[] });\n }\n\n // === Trace ===\n\n async emitTrace<T extends JsonObject>(event: T): Promise<void> {\n const p = traceFile(this.workDir);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await appendJsonLine(this.backend, p, event);\n });\n await this.emit({ kind: 'trace', event });\n }\n\n readTrace<T extends JsonObject>(): T[] {\n const p = traceFile(this.workDir);\n return readJsonLinesSync<T>(this.backend, p);\n }\n\n // === Compiled output ===\n\n async writeCompiled(relPath: string, content: string): Promise<void> {\n if (relPath.includes('..') || path.isAbsolute(relPath)) {\n throw new Error(`compiled: invalid relPath (${relPath})`);\n }\n const p = compiledFile(this.workDir, relPath);\n await this.withLock(p, async () => {\n await this.ensureParent(p);\n await this.backend.writeFile(p, content);\n });\n await this.emit({ kind: 'compiled', relPath, content });\n }\n\n readCompiled(relPath: string): string | null {\n if (relPath.includes('..') || path.isAbsolute(relPath)) return null;\n const p = compiledFile(this.workDir, relPath);\n if (!this.backend.exists(p)) return null;\n try {\n return this.backend.readFileSync(p);\n } catch {\n return null;\n }\n }\n\n async clearCompiled(): Promise<void> {\n const dir = compiledDir(this.workDir);\n if (!this.backend.exists(dir)) return;\n await removeTree(this.backend, dir);\n }\n\n // === Sandboxed generic file I/O ===\n\n async readFile(relPath: string): Promise<string | null> {\n const abs = sandboxedPath(this.workDir, relPath);\n if (!this.backend.exists(abs)) return null;\n try {\n return await this.backend.readFile(abs);\n } catch {\n return null;\n }\n }\n\n async writeFile(relPath: string, content: string): Promise<void> {\n const abs = sandboxedPath(this.workDir, relPath);\n await this.withLock(abs, async () => {\n await this.ensureParent(abs);\n await this.backend.writeFile(abs, content);\n });\n await this.emit({ kind: 'file', relPath, content });\n }\n\n async listTree(relPath?: string): Promise<FileTreeNode[]> {\n const base = relPath === undefined ? this.workDir : sandboxedPath(this.workDir, relPath);\n if (!this.backend.exists(base)) return [];\n const out: FileTreeNode[] = [];\n await walk(this.backend, base, this.workDir, out);\n return out;\n }\n\n async exists(relPath: string): Promise<boolean> {\n let abs: string;\n try {\n abs = sandboxedPath(this.workDir, relPath);\n } catch {\n return false;\n }\n return this.backend.exists(abs);\n }\n\n // === Git ===\n\n async commitAndPush(opts: {\n message: string;\n tags?: string[];\n }): Promise<{ sha: string } | null> {\n if (!this.git) return null;\n await this.git.addAll();\n const sha = await this.git.commit(opts.message);\n if (sha === null) return null;\n if (opts.tags) {\n for (const t of opts.tags) await this.git.tag(t);\n }\n if (this.github && this.github.repoUrl) {\n if (!(await this.git.hasRemote('origin'))) {\n await this.git.addRemote('origin', this.github.repoUrl);\n }\n await this.git.push('origin', this.github.branch ?? 'main');\n }\n return { sha };\n }\n\n async pullIfLinked(): Promise<boolean> {\n if (!this.git || !this.github) return false;\n if (!(await this.git.hasRemote('origin'))) return false;\n await this.git.pull('origin', this.github.branch ?? 'main');\n return true;\n }\n\n async gitStatus(): Promise<GitStatusInfo> {\n if (!this.git) {\n return { clean: true, staged: [], modified: [], untracked: [], linked: false };\n }\n const s = await this.git.status();\n const linked = await this.git.hasRemote('origin');\n return { ...s, linked };\n }\n\n // === Observation ===\n\n subscribe(observer: WorkspaceObserver): () => void {\n return this.sinks.subscribe(observer);\n }\n\n // === Disposal ===\n\n async dispose(): Promise<void> {\n // Drain pending writes.\n const pending = Array.from(this.writeQueue.values());\n await Promise.allSettled(pending);\n // Optional final commit when configured.\n if (this.git && this.github) {\n try {\n await this.commitAndPush({ message: 'workspace: dispose' });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`[workspace] dispose: commitAndPush failed: ${msg}`);\n }\n }\n }\n}\n\n// ============================================================================\n// Sync helpers — wrap backend reads with safe JSON parse.\n// ============================================================================\n\nfunction readJsonFileSync<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n): T | null {\n if (!backend.exists(absPath)) return null;\n try {\n return JSON.parse(backend.readFileSync(absPath)) as T;\n } catch {\n return null;\n }\n}\n\nfunction readJsonLinesSync<T extends JsonObject>(\n backend: WorkspaceBackend,\n absPath: string,\n): T[] {\n if (!backend.exists(absPath)) return [];\n try {\n const raw = backend.readFileSync(absPath);\n const out: T[] = [];\n for (const line of raw.split('\\n')) {\n if (!line.trim()) continue;\n try {\n out.push(JSON.parse(line) as T);\n } catch {\n // skip\n }\n }\n return out;\n } catch {\n return [];\n }\n}\n\nasync function walk(\n backend: WorkspaceBackend,\n dir: string,\n root: string,\n out: FileTreeNode[],\n): Promise<void> {\n const entries = await backend.readdir(dir);\n for (const name of entries) {\n const full = path.join(dir, name);\n const s = await backend.stat(full);\n const rel = path.relative(root, full).split(path.sep).join('/');\n if (s.isDirectory) {\n out.push({ path: rel, type: 'directory', size: 0 });\n await walk(backend, full, root, out);\n } else {\n out.push({ path: rel, type: 'file', size: s.size });\n }\n }\n}\n\nasync function removeTree(backend: WorkspaceBackend, dir: string): Promise<void> {\n const entries = await backend.readdir(dir);\n for (const name of entries) {\n const full = path.join(dir, name);\n let isDir = false;\n try {\n isDir = (await backend.stat(full)).isDirectory;\n } catch {\n continue;\n }\n if (isDir) {\n await removeTree(backend, full);\n } else {\n try {\n await backend.unlink(full);\n } catch {\n // ignore\n }\n }\n }\n}\n","/**\n * `openWorkspace` — single entry point for every consumer.\n *\n * Resolves the workspace lifecycle (adopt → resume → restore → clone →\n * mint), constructs the backend + sink manager + git client, writes\n * templates on mint, and returns a fully wired `WorkspaceService`.\n *\n * @packageDocumentation\n */\n\nimport path from 'node:path';\nimport type { OpenWorkspaceOptions, WorkspaceService } from './types.js';\nimport type { WorkspaceBackend, AppMarker } from './internal/types.js';\nimport { LocalBackend } from './internal/backends/local.js';\nimport { MemoryBackend } from './internal/backends/memory.js';\nimport { SinkManager } from './internal/sink-manager.js';\nimport {\n ensureGitInit,\n ensureSkeleton,\n writeMintTemplatesIfMissing,\n} from './internal/workspace-manager.js';\nimport {\n findLocalWorkspaceDir,\n mintSessionDir,\n readAppMarker,\n writeAppMarker,\n} from './internal/workspace-resolver.js';\nimport { restoreWorkspace } from './internal/restore.js';\nimport { WorkspaceServiceImpl } from './service.js';\n\nexport async function openWorkspace(opts: OpenWorkspaceOptions): Promise<WorkspaceService> {\n const backend: WorkspaceBackend = opts.backend === 'memory'\n ? new MemoryBackend()\n : new LocalBackend();\n const sinks = new SinkManager();\n\n const resolved = await resolveLifecycle(backend, opts);\n\n await ensureSkeleton(backend, resolved.workDir);\n await writeMintTemplatesIfMissing(\n backend,\n resolved.workDir,\n opts.userId,\n opts.projectName ?? 'Untitled',\n resolved.appId,\n );\n\n // App marker — pin appId to dir when known.\n if (resolved.appId !== undefined) {\n const existing = readAppMarker(backend, resolved.workDir);\n if (!existing || existing.appId !== resolved.appId) {\n const marker: AppMarker = {\n appId: resolved.appId,\n userId: opts.userId,\n createdAt: existing?.createdAt ?? Date.now(),\n };\n if (opts.github?.repoUrl) marker.repoUrl = opts.github.repoUrl;\n await writeAppMarker(backend, resolved.workDir, marker);\n }\n }\n\n // Git initialisation only on local backend; memory backend skips git.\n let git;\n if (opts.github && opts.backend !== 'memory') {\n git = await ensureGitInit(backend, resolved.workDir);\n }\n\n return new WorkspaceServiceImpl({\n workDir: resolved.workDir,\n backend,\n sinks,\n appId: resolved.appId,\n git,\n github: opts.github,\n });\n}\n\ninterface ResolvedLifecycle {\n workDir: string;\n appId: string | undefined;\n}\n\nasync function resolveLifecycle(\n backend: WorkspaceBackend,\n opts: OpenWorkspaceOptions,\n): Promise<ResolvedLifecycle> {\n // 1. adopt — caller hands us a directory.\n if (opts.adopt) {\n const workDir = path.resolve(opts.adopt);\n const marker = readAppMarker(backend, workDir);\n return { workDir, appId: marker?.appId ?? opts.appId };\n }\n\n // 2. resume from disk — appId set + we can find a marker locally.\n if (opts.appId) {\n const local = await findLocalWorkspaceDir(\n backend,\n opts.root,\n opts.userId,\n opts.appId,\n );\n if (local) return { workDir: local, appId: opts.appId };\n }\n\n // 3. restore-from-backend — appId set + local miss + restore supplied.\n if (opts.appId && opts.restore) {\n const workDir = mintSessionDir(opts.root, opts.userId);\n await backend.mkdir(workDir, { recursive: true });\n await restoreWorkspace(backend, workDir, opts.restore);\n return { workDir, appId: opts.appId };\n }\n\n // 4. github clone — appId set + local miss + no restore + github cfg.\n if (opts.appId && opts.github && opts.github.repoUrl) {\n const workDir = mintSessionDir(opts.root, opts.userId);\n await backend.mkdir(workDir, { recursive: true });\n // Defer the actual clone to the consumer's git plumbing — we record\n // the marker and let `pullIfLinked` / `commitAndPush` drive remote\n // sync. Cloning requires shell access and we already have a thin git\n // client; emit a placeholder marker and let the consumer drive.\n return { workDir, appId: opts.appId };\n }\n\n // 5. mint fresh — anonymous workspace, appId may be promoted later.\n const workDir = mintSessionDir(opts.root, opts.userId);\n return { workDir, appId: opts.appId };\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { WorkspaceBackend } from '../types.js';
|
|
2
|
+
export declare class LocalBackend implements WorkspaceBackend {
|
|
3
|
+
readFile(absPath: string): Promise<string>;
|
|
4
|
+
readFileSync(absPath: string): string;
|
|
5
|
+
writeFile(absPath: string, content: string): Promise<void>;
|
|
6
|
+
writeFileSync(absPath: string, content: string): void;
|
|
7
|
+
exists(absPath: string): boolean;
|
|
8
|
+
readdir(absPath: string): Promise<string[]>;
|
|
9
|
+
readdirSync(absPath: string): string[];
|
|
10
|
+
mkdir(absPath: string, opts?: {
|
|
11
|
+
recursive?: boolean;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
mkdirSync(absPath: string, opts?: {
|
|
14
|
+
recursive?: boolean;
|
|
15
|
+
}): void;
|
|
16
|
+
unlink(absPath: string): Promise<void>;
|
|
17
|
+
stat(absPath: string): Promise<{
|
|
18
|
+
size: number;
|
|
19
|
+
mtimeMs: number;
|
|
20
|
+
isDirectory: boolean;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory backend for tests and sandboxed evals. No `node:fs`.
|
|
3
|
+
*/
|
|
4
|
+
import type { WorkspaceBackend } from '../types.js';
|
|
5
|
+
export declare class MemoryBackend implements WorkspaceBackend {
|
|
6
|
+
private files;
|
|
7
|
+
private dirs;
|
|
8
|
+
readFile(absPath: string): Promise<string>;
|
|
9
|
+
readFileSync(absPath: string): string;
|
|
10
|
+
writeFile(absPath: string, content: string): Promise<void>;
|
|
11
|
+
writeFileSync(absPath: string, content: string): void;
|
|
12
|
+
exists(absPath: string): boolean;
|
|
13
|
+
readdir(absPath: string): Promise<string[]>;
|
|
14
|
+
readdirSync(absPath: string): string[];
|
|
15
|
+
mkdir(absPath: string): Promise<void>;
|
|
16
|
+
mkdirSync(absPath: string): void;
|
|
17
|
+
unlink(absPath: string): Promise<void>;
|
|
18
|
+
stat(absPath: string): Promise<{
|
|
19
|
+
size: number;
|
|
20
|
+
mtimeMs: number;
|
|
21
|
+
isDirectory: boolean;
|
|
22
|
+
}>;
|
|
23
|
+
getAll(): Map<string, string>;
|
|
24
|
+
clear(): void;
|
|
25
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin wrapper around local `git` CLI for workspace-local operations
|
|
3
|
+
* (init, add, commit, tag, push, pull, status). No `node:fs` use here —
|
|
4
|
+
* existence checks ride the backend.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
import type { WorkspaceBackend } from './types.js';
|
|
9
|
+
export interface GitStatus {
|
|
10
|
+
clean: boolean;
|
|
11
|
+
staged: string[];
|
|
12
|
+
modified: string[];
|
|
13
|
+
untracked: string[];
|
|
14
|
+
}
|
|
15
|
+
export declare class GitClient {
|
|
16
|
+
private readonly cwd;
|
|
17
|
+
private readonly backend;
|
|
18
|
+
constructor(cwd: string, backend: WorkspaceBackend);
|
|
19
|
+
/** Is the working dir already a git repo? */
|
|
20
|
+
isRepo(): Promise<boolean>;
|
|
21
|
+
init(): Promise<void>;
|
|
22
|
+
addAll(): Promise<void>;
|
|
23
|
+
commit(message: string): Promise<string | null>;
|
|
24
|
+
tag(name: string, message?: string): Promise<void>;
|
|
25
|
+
push(remote?: string, branch?: string): Promise<void>;
|
|
26
|
+
pull(remote?: string, branch?: string): Promise<void>;
|
|
27
|
+
hasRemote(remote?: string): Promise<boolean>;
|
|
28
|
+
addRemote(remote: string, url: string): Promise<void>;
|
|
29
|
+
status(): Promise<GitStatus>;
|
|
30
|
+
headSha(): Promise<string | null>;
|
|
31
|
+
private exec;
|
|
32
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory-file helpers used internally by the service.
|
|
3
|
+
*
|
|
4
|
+
* @packageDocumentation
|
|
5
|
+
*/
|
|
6
|
+
import type { JsonObject } from '@almadar/core';
|
|
7
|
+
import type { WorkspaceBackend } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Try to read JSON from `absPath` via the backend. Returns `null` when
|
|
10
|
+
* the file is missing or unparseable.
|
|
11
|
+
*/
|
|
12
|
+
export declare function readJsonFile<T extends JsonObject>(backend: WorkspaceBackend, absPath: string): Promise<T | null>;
|
|
13
|
+
/**
|
|
14
|
+
* Write a JSON object via the backend with 2-space pretty-printing.
|
|
15
|
+
*/
|
|
16
|
+
export declare function writeJsonFile<T extends JsonObject>(backend: WorkspaceBackend, absPath: string, value: T): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Read newline-delimited JSON. Drops malformed lines silently.
|
|
19
|
+
*/
|
|
20
|
+
export declare function readJsonLines<T extends JsonObject>(backend: WorkspaceBackend, absPath: string): Promise<T[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Append a single JSON value as a line. Used for trace + history streams.
|
|
23
|
+
* Caller is responsible for any per-path serialization (the service's
|
|
24
|
+
* write queue handles that).
|
|
25
|
+
*/
|
|
26
|
+
export declare function appendJsonLine<T extends JsonObject>(backend: WorkspaceBackend, absPath: string, value: T): Promise<void>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path discipline — every absolute path the service uses is computed here.
|
|
3
|
+
*
|
|
4
|
+
* Consumers never construct paths. Public methods take logical names; the
|
|
5
|
+
* service calls into this module to resolve them. Trusted internal paths
|
|
6
|
+
* (orbital files, session files) use `path.join` directly; sandboxed
|
|
7
|
+
* methods (`readFile` / `writeFile`) go through `sandboxedPath` which
|
|
8
|
+
* rejects traversal.
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
/** Single source of truth for workspace directory layout. */
|
|
13
|
+
export declare const WORKSPACE_LAYOUT: {
|
|
14
|
+
readonly ALMADAR_DIR: ".almadar";
|
|
15
|
+
readonly ORBITALS_DIR: "orbitals";
|
|
16
|
+
readonly SESSIONS_DIR: ".almadar/sessions";
|
|
17
|
+
readonly COORDINATOR_DIR: ".almadar/sessions/Coordinator";
|
|
18
|
+
readonly TRACE_FILE: ".almadar/trace.jsonl";
|
|
19
|
+
readonly SCHEMA_FILE: "schema.orb";
|
|
20
|
+
readonly COMPILED_DIR: "apps";
|
|
21
|
+
readonly APP_MARKER: ".almadar/app-marker.json";
|
|
22
|
+
readonly USER_MEMORY: ".almadar/user.orb";
|
|
23
|
+
readonly PROJECT_MEMORY: ".almadar/project.orb";
|
|
24
|
+
};
|
|
25
|
+
/** Logical orbital name → absolute `.orb` path. */
|
|
26
|
+
export declare function orbitalFile(workDir: string, name: string): string;
|
|
27
|
+
/** Archived orbital path. */
|
|
28
|
+
export declare function archivedOrbitalFile(workDir: string, name: string): string;
|
|
29
|
+
/** Schema (combined output) file. */
|
|
30
|
+
export declare function schemaFile(workDir: string): string;
|
|
31
|
+
/** Coordinator session dir. */
|
|
32
|
+
export declare function coordinatorDir(workDir: string): string;
|
|
33
|
+
/** Coordinator-level artifact path. */
|
|
34
|
+
export declare function coordinatorFile(workDir: string, basename: string): string;
|
|
35
|
+
/** Per-orbital session dir. */
|
|
36
|
+
export declare function orbitalSessionDir(workDir: string, orbital: string): string;
|
|
37
|
+
/** Per-orbital session-file path. */
|
|
38
|
+
export declare function orbitalSessionFile(workDir: string, orbital: string, basename: string): string;
|
|
39
|
+
/** Trace JSONL. */
|
|
40
|
+
export declare function traceFile(workDir: string): string;
|
|
41
|
+
/** Compiled output base. */
|
|
42
|
+
export declare function compiledDir(workDir: string): string;
|
|
43
|
+
/** Compiled-output path for a given relative key. */
|
|
44
|
+
export declare function compiledFile(workDir: string, relPath: string): string;
|
|
45
|
+
/** App marker — used internally by the resolver/factory. */
|
|
46
|
+
export declare function appMarkerFile(workDir: string): string;
|
|
47
|
+
/**
|
|
48
|
+
* Resolve a user-supplied relative path within the sandbox. Rejects
|
|
49
|
+
* absolute paths, `..` traversal, and any path that resolves outside
|
|
50
|
+
* `workDir`. Returns the absolute resolved path on success.
|
|
51
|
+
*/
|
|
52
|
+
export declare function sandboxedPath(workDir: string, relPath: string): string;
|
|
53
|
+
/** Validate an orbital logical name — no path separators, no `..`. */
|
|
54
|
+
export declare function assertOrbitalName(name: string): void;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Restore an empty/missing workspace from a `RestoreBackend`.
|
|
3
|
+
*
|
|
4
|
+
* Used by `openWorkspace` when `opts.appId` is set, the local cache
|
|
5
|
+
* misses, and `opts.restore` is supplied. Writes via the backend (so no
|
|
6
|
+
* `node:fs` here).
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
import type { RestoreBackend } from '../types.js';
|
|
11
|
+
import type { WorkspaceBackend } from './types.js';
|
|
12
|
+
export interface RestoreResult {
|
|
13
|
+
filesRestored: number;
|
|
14
|
+
bytesWritten: number;
|
|
15
|
+
}
|
|
16
|
+
/** Pull every file the backend knows about and write it under `rootDir`. */
|
|
17
|
+
export declare function restoreWorkspace(backend: WorkspaceBackend, rootDir: string, restore: RestoreBackend): Promise<RestoreResult>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal SinkManager — fans `WorkspaceWriteEvent` out to every
|
|
3
|
+
* registered `WorkspaceObserver`. A slow / hung observer does not crash
|
|
4
|
+
* the writer; results are collected via `Promise.allSettled`.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
import type { WorkspaceObserver, WorkspaceWriteEvent } from '../types.js';
|
|
9
|
+
export declare class SinkManager {
|
|
10
|
+
private readonly observers;
|
|
11
|
+
/** Register an observer; returns an unsubscribe function. */
|
|
12
|
+
subscribe(observer: WorkspaceObserver): () => void;
|
|
13
|
+
/** Snapshot of observer count — useful for diagnostics. */
|
|
14
|
+
get observerCount(): number;
|
|
15
|
+
/**
|
|
16
|
+
* Notify all observers in parallel. Awaits all settlements. A rejected
|
|
17
|
+
* observer is captured in the result; subsequent writes still proceed.
|
|
18
|
+
*/
|
|
19
|
+
notifyAll(event: WorkspaceWriteEvent): Promise<void>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mint-time templates. Written by `openWorkspace` when minting a fresh
|
|
3
|
+
* workspace. Internal — not exported from the package barrel.
|
|
4
|
+
*
|
|
5
|
+
* The shapes follow @almadar/core's `OrbitalSchema` but are kept here as
|
|
6
|
+
* literal JSON so this package has zero dependency on the std memory
|
|
7
|
+
* orbital definitions.
|
|
8
|
+
*
|
|
9
|
+
* @packageDocumentation
|
|
10
|
+
*/
|
|
11
|
+
import type { JsonObject } from '@almadar/core';
|
|
12
|
+
/** Empty scaffold for a new generation. */
|
|
13
|
+
export declare function createSchemaOrbTemplate(name: string): JsonObject;
|
|
14
|
+
/** User preferences template — minimal seed. */
|
|
15
|
+
export declare function createUserOrbTemplate(userId: string): JsonObject;
|
|
16
|
+
/** Project context template. */
|
|
17
|
+
export declare function createProjectOrbTemplate(projectName: string, appId?: string): JsonObject;
|
|
18
|
+
export declare function serializeJson(value: JsonObject): string;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal types — not exported from the package barrel.
|
|
3
|
+
*
|
|
4
|
+
* @packageDocumentation
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Pluggable filesystem backend contract. The backend is the ONLY layer
|
|
8
|
+
* permitted to touch `node:fs`. Local + memory impls live under
|
|
9
|
+
* `src/internal/backends/`.
|
|
10
|
+
*/
|
|
11
|
+
export interface WorkspaceBackend {
|
|
12
|
+
readFile(absPath: string): Promise<string>;
|
|
13
|
+
readFileSync(absPath: string): string;
|
|
14
|
+
writeFile(absPath: string, content: string): Promise<void>;
|
|
15
|
+
writeFileSync(absPath: string, content: string): void;
|
|
16
|
+
exists(absPath: string): boolean;
|
|
17
|
+
readdir(absPath: string): Promise<string[]>;
|
|
18
|
+
readdirSync(absPath: string): string[];
|
|
19
|
+
mkdir(absPath: string, opts?: {
|
|
20
|
+
recursive?: boolean;
|
|
21
|
+
}): Promise<void>;
|
|
22
|
+
mkdirSync(absPath: string, opts?: {
|
|
23
|
+
recursive?: boolean;
|
|
24
|
+
}): void;
|
|
25
|
+
unlink(absPath: string): Promise<void>;
|
|
26
|
+
stat(absPath: string): Promise<{
|
|
27
|
+
size: number;
|
|
28
|
+
mtimeMs: number;
|
|
29
|
+
isDirectory: boolean;
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The persisted marker that pins an `appId` to a workspace dir on disk.
|
|
34
|
+
* Lives at `<workDir>/.almadar/app-marker.json`. Internal — the public
|
|
35
|
+
* surface only exposes `service.appId`.
|
|
36
|
+
*
|
|
37
|
+
* @internal
|
|
38
|
+
*/
|
|
39
|
+
export interface AppMarker {
|
|
40
|
+
appId: string;
|
|
41
|
+
userId: string;
|
|
42
|
+
createdAt: number;
|
|
43
|
+
repoUrl?: string;
|
|
44
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal lifecycle helpers used by `openWorkspace` on mint/adopt/resume.
|
|
3
|
+
*
|
|
4
|
+
* - Create the workspace directory skeleton.
|
|
5
|
+
* - Write mint-time templates (schema.orb, user.orb, project.orb) if missing.
|
|
6
|
+
* - Initialize git when `github` is supplied.
|
|
7
|
+
*
|
|
8
|
+
* No `node:fs` use here — everything rides the backend.
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
import type { WorkspaceBackend } from './types.js';
|
|
13
|
+
import { GitClient } from './git-client.js';
|
|
14
|
+
/** Make sure every workspace dir exists. */
|
|
15
|
+
export declare function ensureSkeleton(backend: WorkspaceBackend, workDir: string): Promise<void>;
|
|
16
|
+
/** Initialise per-orbital session dir lazily. */
|
|
17
|
+
export declare function ensureOrbitalSessionDir(backend: WorkspaceBackend, workDir: string, orbital: string): Promise<void>;
|
|
18
|
+
/** Write mint-time templates only when they don't exist. */
|
|
19
|
+
export declare function writeMintTemplatesIfMissing(backend: WorkspaceBackend, workDir: string, userId: string, projectName: string, appId?: string): Promise<void>;
|
|
20
|
+
/** Initialise git for the workspace if it isn't already a repo. */
|
|
21
|
+
export declare function ensureGitInit(backend: WorkspaceBackend, workDir: string): Promise<GitClient>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lifecycle helpers — read + write the per-workspace app marker, and
|
|
3
|
+
* scan a user's workspace root for one that matches a known `appId`.
|
|
4
|
+
*
|
|
5
|
+
* No `node:fs` here — everything rides the backend.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import type { WorkspaceBackend, AppMarker } from './types.js';
|
|
10
|
+
/** Synchronous read — used during resolution before the service is built. */
|
|
11
|
+
export declare function readAppMarker(backend: WorkspaceBackend, workDir: string): AppMarker | null;
|
|
12
|
+
/** Write the marker. Caller ensures the `.almadar/` dir exists. */
|
|
13
|
+
export declare function writeAppMarker(backend: WorkspaceBackend, workDir: string, marker: AppMarker): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Scan `<workspacesRoot>/<userId>/` for a session dir whose
|
|
16
|
+
* `.almadar/app-marker.json` matches `appId`. Returns null on miss.
|
|
17
|
+
*/
|
|
18
|
+
export declare function findLocalWorkspaceDir(backend: WorkspaceBackend, workspacesRoot: string, userId: string, appId: string): Promise<string | null>;
|
|
19
|
+
/** Compose a fresh session dir under `<workspacesRoot>/<userId>/`. */
|
|
20
|
+
export declare function mintSessionDir(workspacesRoot: string, userId: string): string;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `openWorkspace` — single entry point for every consumer.
|
|
3
|
+
*
|
|
4
|
+
* Resolves the workspace lifecycle (adopt → resume → restore → clone →
|
|
5
|
+
* mint), constructs the backend + sink manager + git client, writes
|
|
6
|
+
* templates on mint, and returns a fully wired `WorkspaceService`.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
import type { OpenWorkspaceOptions, WorkspaceService } from './types.js';
|
|
11
|
+
export declare function openWorkspace(opts: OpenWorkspaceOptions): Promise<WorkspaceService>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `WorkspaceService` implementation. The single chokepoint — every read
|
|
3
|
+
* and write that any consumer performs lands here, computes its absolute
|
|
4
|
+
* path via `path-layout.ts`, runs the backend op, then fans out a typed
|
|
5
|
+
* `WorkspaceWriteEvent` to every registered observer.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import type { JsonObject, JsonValue } from '@almadar/core';
|
|
10
|
+
import type { FileTreeNode, GitHubConfig, GitStatusInfo, WorkspaceObserver, WorkspaceService } from './types.js';
|
|
11
|
+
import type { WorkspaceBackend } from './internal/types.js';
|
|
12
|
+
import { SinkManager } from './internal/sink-manager.js';
|
|
13
|
+
import { GitClient } from './internal/git-client.js';
|
|
14
|
+
interface ServiceCtorArgs {
|
|
15
|
+
workDir: string;
|
|
16
|
+
backend: WorkspaceBackend;
|
|
17
|
+
sinks: SinkManager;
|
|
18
|
+
appId?: string;
|
|
19
|
+
git?: GitClient;
|
|
20
|
+
github?: GitHubConfig;
|
|
21
|
+
}
|
|
22
|
+
export declare class WorkspaceServiceImpl implements WorkspaceService {
|
|
23
|
+
readonly workDir: string;
|
|
24
|
+
private _appId;
|
|
25
|
+
private readonly backend;
|
|
26
|
+
private readonly sinks;
|
|
27
|
+
private readonly git;
|
|
28
|
+
private readonly github;
|
|
29
|
+
/** Per-absolute-path serial queue. */
|
|
30
|
+
private readonly writeQueue;
|
|
31
|
+
constructor(args: ServiceCtorArgs);
|
|
32
|
+
get appId(): string | undefined;
|
|
33
|
+
setAppId(id: string): void;
|
|
34
|
+
/** Run `op` under a per-path serial lock. */
|
|
35
|
+
private withLock;
|
|
36
|
+
/** Make sure the parent directory of `absPath` exists. */
|
|
37
|
+
private ensureParent;
|
|
38
|
+
private emit;
|
|
39
|
+
readOrbital(name: string): string | null;
|
|
40
|
+
writeOrbital(name: string, content: string): Promise<void>;
|
|
41
|
+
listOrbitals(): string[];
|
|
42
|
+
archiveOrbital(name: string): Promise<void>;
|
|
43
|
+
renameOrbital(from: string, to: string): Promise<void>;
|
|
44
|
+
readSchema(): string | null;
|
|
45
|
+
writeSchema(content: string): Promise<void>;
|
|
46
|
+
readAnalysis<T extends JsonObject>(): T | null;
|
|
47
|
+
writeAnalysis<T extends JsonObject>(analysis: T): Promise<void>;
|
|
48
|
+
readPlan<T extends JsonObject>(): T | null;
|
|
49
|
+
writePlan<T extends JsonObject>(plan: T): Promise<void>;
|
|
50
|
+
readClarificationAnswers(): Record<string, string>;
|
|
51
|
+
writeClarificationAnswers(answers: Record<string, string>): Promise<void>;
|
|
52
|
+
readCoordinatorMessages<T extends JsonValue>(): T[] | null;
|
|
53
|
+
writeCoordinatorMessages<T extends JsonValue>(messages: T[]): Promise<void>;
|
|
54
|
+
private orbitalFile;
|
|
55
|
+
readSpec<T extends JsonObject>(orbital: string): T | null;
|
|
56
|
+
writeSpec<T extends JsonObject>(orbital: string, spec: T): Promise<void>;
|
|
57
|
+
readMemory<T extends JsonObject>(orbital: string): T | null;
|
|
58
|
+
writeMemory<T extends JsonObject>(orbital: string, memory: T): Promise<void>;
|
|
59
|
+
appendHistory<T extends JsonObject>(orbital: string, entry: T): Promise<void>;
|
|
60
|
+
readHistory<T extends JsonObject>(orbital: string): T[];
|
|
61
|
+
appendParamsHistory<T extends JsonObject>(orbital: string, row: T): Promise<void>;
|
|
62
|
+
readErrors<T extends JsonObject>(orbital: string): T[];
|
|
63
|
+
writeErrors<T extends JsonObject>(orbital: string, errors: T[]): Promise<void>;
|
|
64
|
+
readSubagentMessages<T extends JsonValue>(orbital: string): T[] | null;
|
|
65
|
+
writeSubagentMessages<T extends JsonValue>(orbital: string, messages: T[]): Promise<void>;
|
|
66
|
+
emitTrace<T extends JsonObject>(event: T): Promise<void>;
|
|
67
|
+
readTrace<T extends JsonObject>(): T[];
|
|
68
|
+
writeCompiled(relPath: string, content: string): Promise<void>;
|
|
69
|
+
readCompiled(relPath: string): string | null;
|
|
70
|
+
clearCompiled(): Promise<void>;
|
|
71
|
+
readFile(relPath: string): Promise<string | null>;
|
|
72
|
+
writeFile(relPath: string, content: string): Promise<void>;
|
|
73
|
+
listTree(relPath?: string): Promise<FileTreeNode[]>;
|
|
74
|
+
exists(relPath: string): Promise<boolean>;
|
|
75
|
+
commitAndPush(opts: {
|
|
76
|
+
message: string;
|
|
77
|
+
tags?: string[];
|
|
78
|
+
}): Promise<{
|
|
79
|
+
sha: string;
|
|
80
|
+
} | null>;
|
|
81
|
+
pullIfLinked(): Promise<boolean>;
|
|
82
|
+
gitStatus(): Promise<GitStatusInfo>;
|
|
83
|
+
subscribe(observer: WorkspaceObserver): () => void;
|
|
84
|
+
dispose(): Promise<void>;
|
|
85
|
+
}
|
|
86
|
+
export {};
|