@almadar/agent 1.6.3 → 2.0.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/LICENSE +21 -72
- package/README.md +25 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -1
- package/dist/workspace/index.js +39 -0
- package/dist/workspace/index.js.map +1 -1
- package/package.json +9 -8
- package/dist/agent/index.d.ts +0 -13
- package/dist/api-types-CXrq-fts.d.ts +0 -561
- package/dist/event-transformer/index.d.ts +0 -125
- package/dist/firestore-checkpointer-CkNKXoun.d.ts +0 -184
- package/dist/index-DW3F-Ihx.d.ts +0 -2501
- package/dist/index-DZn69no8.d.ts +0 -1014
- package/dist/index.d.ts +0 -1679
- package/dist/orbital-subagent-BdFuf77p.d.ts +0 -1436
- package/dist/persistence/index.d.ts +0 -201
- package/dist/tools/index.d.ts +0 -8
- package/dist/types.d.ts +0 -170
- package/dist/workspace/index.d.ts +0 -355
package/dist/workspace/index.js
CHANGED
|
@@ -68,6 +68,10 @@ var GitClient = class {
|
|
|
68
68
|
constructor(cwd) {
|
|
69
69
|
this.cwd = cwd;
|
|
70
70
|
}
|
|
71
|
+
/** Get the working directory path. */
|
|
72
|
+
getCwd() {
|
|
73
|
+
return this.cwd;
|
|
74
|
+
}
|
|
71
75
|
/** Check if git is available on the system. */
|
|
72
76
|
static async isAvailable() {
|
|
73
77
|
try {
|
|
@@ -198,6 +202,7 @@ var GitSink = class {
|
|
|
198
202
|
this.name = "git";
|
|
199
203
|
this.commitQueue = Promise.resolve();
|
|
200
204
|
this.available = null;
|
|
205
|
+
this.pushConfig = null;
|
|
201
206
|
this.client = new GitClient(workspaceRoot);
|
|
202
207
|
}
|
|
203
208
|
/** Initialize the git repo. Must be called before onFileWritten. */
|
|
@@ -209,6 +214,17 @@ var GitSink = class {
|
|
|
209
214
|
}
|
|
210
215
|
await this.client.init();
|
|
211
216
|
}
|
|
217
|
+
/**
|
|
218
|
+
* Enable pushing to a remote GitHub repo on session end.
|
|
219
|
+
* Push failures are non-fatal — local commits are always preserved.
|
|
220
|
+
*/
|
|
221
|
+
enablePush(config) {
|
|
222
|
+
this.pushConfig = config;
|
|
223
|
+
}
|
|
224
|
+
/** Get the working directory path. */
|
|
225
|
+
getCwd() {
|
|
226
|
+
return this.client.getCwd();
|
|
227
|
+
}
|
|
212
228
|
async onFileWritten(path, _content, meta) {
|
|
213
229
|
if (!this.available) return;
|
|
214
230
|
this.commitQueue = this.commitQueue.then(async () => {
|
|
@@ -230,6 +246,29 @@ var GitSink = class {
|
|
|
230
246
|
`session/${sessionId}`,
|
|
231
247
|
`Session ${sessionId} complete`
|
|
232
248
|
);
|
|
249
|
+
if (this.pushConfig) {
|
|
250
|
+
await this.pushToRemote();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Push local commits to the remote GitHub repository.
|
|
255
|
+
* Non-fatal — failures are logged but do not throw.
|
|
256
|
+
*/
|
|
257
|
+
async pushToRemote() {
|
|
258
|
+
if (!this.pushConfig) return;
|
|
259
|
+
const { token, branch, repoUrl } = this.pushConfig;
|
|
260
|
+
const cwd = this.client.getCwd();
|
|
261
|
+
try {
|
|
262
|
+
console.log(`[GitSink] Pushing to ${repoUrl} branch ${branch}...`);
|
|
263
|
+
const { push } = await import('@almadar/integrations/github');
|
|
264
|
+
await push({ branchName: branch, workDir: cwd }, cwd, token);
|
|
265
|
+
console.log(`[GitSink] Push successful`);
|
|
266
|
+
} catch (error) {
|
|
267
|
+
console.error(
|
|
268
|
+
`[GitSink] Push failed (local commits preserved):`,
|
|
269
|
+
error instanceof Error ? error.message : error
|
|
270
|
+
);
|
|
271
|
+
}
|
|
233
272
|
}
|
|
234
273
|
};
|
|
235
274
|
function formatCommitMessage(path, meta) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/workspace/types.ts","../../src/workspace/sink-manager.ts","../../src/workspace/git-client.ts","../../src/workspace/sinks/git-sink.ts","../../src/memory/memory-orbital.ts","../../src/workspace/templates.ts","../../src/workspace/memory-files.ts","../../src/workspace/workspace-manager.ts","../../src/workspace/sinks/firestore-sink.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Workspace Types\n *\n * Core type definitions for the workspace-centric persistence architecture.\n * The workspace is the central unit: files in a git-tracked directory,\n * with pluggable sinks for Firestore, GitHub, etc.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Workspace Layout\n// ============================================================================\n\n/** Standard directory structure inside a workspace. */\nexport const WORKSPACE_LAYOUT = {\n /** Root directory for Almadar workspace state. */\n ALMADAR_DIR: '.almadar',\n /** User preferences and learned patterns. */\n USER_MEMORY: '.almadar/user.orb',\n /** Project-level domain knowledge. */\n PROJECT_MEMORY: '.almadar/project.orb',\n /** The generation artifact (shared memory for all agents). */\n SCHEMA: '.almadar/schema.orb',\n /** Individual orbital files (one per subagent). */\n ORBITALS_DIR: '.almadar/orbitals',\n} as const;\n\n// ============================================================================\n// File Metadata\n// ============================================================================\n\n/** Classification of a file write for routing to appropriate sinks. */\nexport interface FileMeta {\n /** What kind of file was written. */\n fileType: 'schema' | 'orbital' | 'memory' | 'domain' | 'other';\n /** Orbital name (only when fileType is 'orbital'). */\n orbitalName?: string;\n /** Session ID for attribution. */\n sessionId?: string;\n}\n\n// ============================================================================\n// Workspace Sink\n// ============================================================================\n\n/**\n * A pluggable persistence backend that reacts to workspace file writes.\n *\n * Sinks are registered with the SinkManager and notified on every file write.\n * Each sink is independent — a failure in one does not affect others.\n */\nexport interface WorkspaceSink {\n /** Human-readable name for logging/diagnostics. */\n readonly name: string;\n\n /**\n * Called when a file is written to the workspace.\n * @param path - Relative path within the workspace root\n * @param content - File content as a string\n * @param meta - Classification metadata for routing\n */\n onFileWritten(path: string, content: string, meta: FileMeta): Promise<void>;\n\n /**\n * Called when the session ends. Used for cleanup, final sync, tagging, etc.\n * @param sessionId - The session being ended\n */\n onSessionEnd(sessionId: string): Promise<void>;\n}\n\n// ============================================================================\n// Sink Results\n// ============================================================================\n\n/** Result of notifying a single sink. */\nexport interface SinkResult {\n /** Which sink produced this result. */\n sinkName: string;\n /** Whether the sink operation succeeded. */\n success: boolean;\n /** Error details if the operation failed. */\n error?: Error;\n}\n\n// ============================================================================\n// Workspace Configuration\n// ============================================================================\n\n/** Configuration for initializing a workspace. */\nexport interface WorkspaceConfig {\n /** Absolute path to the workspace root directory. */\n rootDir: string;\n /** User ID for memory file attribution. */\n userId: string;\n /** Session ID for git tags and logging. */\n sessionId: string;\n /** App ID (may be assigned later on first schema write). */\n appId?: string;\n /** Project name for the schema template. */\n projectName?: string;\n /** Whether to initialize git in the workspace. Defaults to true. */\n gitEnabled?: boolean;\n /** Sinks to register on initialization. */\n sinks?: WorkspaceSink[];\n}\n\n// ============================================================================\n// Memory Snapshot\n// ============================================================================\n\n/** Snapshot of all .orb memory file instances, read at session start. */\nexport interface MemorySnapshot {\n /** User preferences from .almadar/user.orb instances. */\n user: Record<string, unknown>[];\n /** Project context from .almadar/project.orb instances. */\n project: Record<string, unknown>[];\n}\n","/**\n * SinkManager — Fan-out file writes to registered workspace sinks.\n *\n * Uses Promise.allSettled for fault isolation: a Firestore error\n * does not prevent the git commit, and vice versa.\n *\n * @packageDocumentation\n */\n\nimport type { WorkspaceSink, FileMeta, SinkResult } from './types.js';\n\nexport class SinkManager {\n private readonly sinks: WorkspaceSink[] = [];\n\n /** Register a sink to receive file write notifications. */\n register(sink: WorkspaceSink): void {\n this.sinks.push(sink);\n }\n\n /** Get registered sink names (for diagnostics). */\n get registeredSinks(): string[] {\n return this.sinks.map(s => s.name);\n }\n\n /**\n * Notify all sinks that a file was written.\n * Returns results from each sink — failures in one don't affect others.\n */\n async notifyFileWritten(\n path: string,\n content: string,\n meta: FileMeta,\n ): Promise<SinkResult[]> {\n if (this.sinks.length === 0) return [];\n\n const results = await Promise.allSettled(\n this.sinks.map(sink => sink.onFileWritten(path, content, meta)),\n );\n\n return results.map((result, i) => ({\n sinkName: this.sinks[i].name,\n success: result.status === 'fulfilled',\n error: result.status === 'rejected' ? toError(result.reason) : undefined,\n }));\n }\n\n /**\n * Notify all sinks that the session has ended.\n * Returns results from each sink — failures in one don't affect others.\n */\n async notifySessionEnd(sessionId: string): Promise<SinkResult[]> {\n if (this.sinks.length === 0) return [];\n\n const results = await Promise.allSettled(\n this.sinks.map(sink => sink.onSessionEnd(sessionId)),\n );\n\n return results.map((result, i) => ({\n sinkName: this.sinks[i].name,\n success: result.status === 'fulfilled',\n error: result.status === 'rejected' ? toError(result.reason) : undefined,\n }));\n }\n}\n\n/** Coerce an unknown rejection reason to an Error. */\nfunction toError(reason: unknown): Error {\n if (reason instanceof Error) return reason;\n return new Error(String(reason));\n}\n","/**\n * GitClient — Thin wrapper around local git CLI operations.\n *\n * Uses child_process.execFile for safety (no shell injection).\n * Designed for workspace-local operations only (init, add, commit, tag).\n * Remote operations (push, PR) use @almadar/integrations instead.\n *\n * @packageDocumentation\n */\n\nimport { execFile } from 'child_process';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface GitLogEntry {\n hash: string;\n message: string;\n date: string;\n author: string;\n}\n\nexport interface GitStatus {\n clean: boolean;\n staged: string[];\n modified: string[];\n untracked: string[];\n}\n\n// ============================================================================\n// GitClient\n// ============================================================================\n\nexport class GitClient {\n constructor(private readonly cwd: string) {}\n\n /** Check if git is available on the system. */\n static async isAvailable(): Promise<boolean> {\n try {\n await execGit(['--version'], '/tmp');\n return true;\n } catch {\n return false;\n }\n }\n\n /** Check if the workspace is already a git repository. */\n async isRepo(): Promise<boolean> {\n try {\n await this.exec(['rev-parse', '--is-inside-work-tree']);\n return true;\n } catch {\n return false;\n }\n }\n\n /** Initialize a new git repository. No-op if already initialized. */\n async init(): Promise<void> {\n if (await this.isRepo()) return;\n await this.exec(['init']);\n // Set default user for agent commits (won't affect global config)\n await this.exec(['config', 'user.email', 'agent@almadar.io']);\n await this.exec(['config', 'user.name', 'Almadar Agent']);\n }\n\n /** Stage files for commit. */\n async add(paths: string[]): Promise<void> {\n if (paths.length === 0) return;\n await this.exec(['add', ...paths]);\n }\n\n /** Stage all changes (equivalent to git add -A). */\n async addAll(): Promise<void> {\n await this.exec(['add', '-A']);\n }\n\n /**\n * Create a commit with the given message.\n * Returns the commit hash, or null if there was nothing to commit.\n */\n async commit(message: string): Promise<string | null> {\n try {\n const output = await this.exec(['commit', '-m', message, '--allow-empty-message']);\n const match = output.match(/\\[[\\w/.-]+ ([a-f0-9]+)\\]/);\n return match ? match[1] : null;\n } catch (err) {\n // \"nothing to commit\" is not an error\n if (err instanceof Error && err.message.includes('nothing to commit')) {\n return null;\n }\n throw err;\n }\n }\n\n /** Create an annotated tag. */\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 /** Get recent commits. */\n async log(limit = 10): Promise<GitLogEntry[]> {\n try {\n const output = await this.exec([\n 'log',\n `--max-count=${limit}`,\n '--format=%H|%s|%aI|%an',\n ]);\n return output\n .trim()\n .split('\\n')\n .filter(Boolean)\n .map(line => {\n const [hash, message, date, author] = line.split('|');\n return { hash, message, date, author };\n });\n } catch {\n // No commits yet\n return [];\n }\n }\n\n /** Get workspace status. */\n async status(): Promise<GitStatus> {\n const output = await this.exec(['status', '--porcelain']);\n const lines = output.trim().split('\\n').filter(Boolean);\n const staged: string[] = [];\n const modified: string[] = [];\n const untracked: string[] = [];\n\n for (const line of lines) {\n const indexStatus = line[0];\n const workTreeStatus = line[1];\n const file = line.slice(3);\n\n if (indexStatus === '?' && workTreeStatus === '?') {\n untracked.push(file);\n } else if (indexStatus !== ' ' && indexStatus !== '?') {\n staged.push(file);\n } else if (workTreeStatus !== ' ') {\n modified.push(file);\n }\n }\n\n return {\n clean: lines.length === 0,\n staged,\n modified,\n untracked,\n };\n }\n\n /** Get diff output between two references. */\n async diff(from?: string, to?: string): Promise<string> {\n const args = ['diff'];\n if (from) args.push(from);\n if (to) args.push(to);\n return this.exec(args);\n }\n\n private exec(args: string[]): Promise<string> {\n return execGit(args, this.cwd);\n }\n}\n\n// ============================================================================\n// Helpers\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 * GitSink — Auto-commit workspace file writes to a local git repository.\n *\n * Implements the WorkspaceSink interface. Every file write becomes a git commit\n * with a structured message. Concurrent writes are serialized via a commit queue\n * to prevent git lock contention (handles parallel subagent case).\n *\n * Gracefully degrades if git is not available (logs warning, no-ops).\n *\n * @packageDocumentation\n */\n\nimport { basename } from 'path';\nimport { GitClient } from '../git-client.js';\nimport type { WorkspaceSink, FileMeta } from '../types.js';\n\nexport class GitSink implements WorkspaceSink {\n readonly name = 'git';\n private readonly client: GitClient;\n private commitQueue: Promise<void> = Promise.resolve();\n private available: boolean | null = null;\n\n constructor(workspaceRoot: string) {\n this.client = new GitClient(workspaceRoot);\n }\n\n /** Initialize the git repo. Must be called before onFileWritten. */\n async initialize(): Promise<void> {\n this.available = await GitClient.isAvailable();\n if (!this.available) {\n console.warn('[GitSink] git not available — commits will be skipped');\n return;\n }\n await this.client.init();\n }\n\n async onFileWritten(path: string, _content: string, meta: FileMeta): Promise<void> {\n if (!this.available) return;\n\n // Serialize commits via promise chain to prevent git lock contention\n this.commitQueue = this.commitQueue.then(async () => {\n const message = formatCommitMessage(path, meta);\n await this.client.add([path]);\n await this.client.commit(message);\n });\n\n await this.commitQueue;\n }\n\n async onSessionEnd(sessionId: string): Promise<void> {\n if (!this.available) return;\n\n // Wait for any pending commits to finish\n await this.commitQueue;\n\n // Stage any remaining changes and create session-end commit\n const status = await this.client.status();\n if (!status.clean) {\n await this.client.addAll();\n await this.client.commit(`session-end: ${sessionId}`);\n }\n\n // Tag the session\n await this.client.tag(\n `session/${sessionId}`,\n `Session ${sessionId} complete`,\n );\n }\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Generate a structured git commit message from file metadata. */\nfunction formatCommitMessage(path: string, meta: FileMeta): string {\n const filename = basename(path);\n switch (meta.fileType) {\n case 'orbital':\n return `add(${meta.orbitalName ?? filename}): orbital generated`;\n case 'schema':\n return `update(schema): ${filename}`;\n case 'memory':\n return `update(memory): ${filename}`;\n case 'domain':\n return `add(domain): ${filename}`;\n default:\n return `update: ${filename}`;\n }\n}\n","/**\n * Memory Orbital Schema\n *\n * Defines the structure for agent memory using Orbital types.\n * This is an OrbitalSchema that represents user memory, preferences,\n * and generation history.\n *\n * @packageDocumentation\n */\n\nimport type {\n OrbitalSchema,\n Entity,\n Trait,\n} from '@almadar/core';\n\n// ============================================================================\n// Memory Entity Types\n// ============================================================================\n\n/**\n * User preference entity - stores learned or explicit preferences\n */\nexport const UserPreferenceEntity: Entity = {\n name: 'UserPreference',\n persistence: 'persistent',\n fields: [\n { name: 'id', type: 'string', required: true },\n { name: 'userId', type: 'string', required: true },\n { name: 'namingConvention', type: 'enum', values: ['PascalCase', 'camelCase', 'snake_case'], default: 'PascalCase' },\n { name: 'validationStyle', type: 'enum', values: ['strict', 'minimal', 'none'], default: 'strict' },\n { name: 'preferredPatterns', type: 'array', items: { name: 'pattern', type: 'string' }, default: [] },\n { name: 'commonEntities', type: 'array', items: { name: 'entity', type: 'string' }, default: [] },\n { name: 'commonTraits', type: 'array', items: { name: 'trait', type: 'string' }, default: [] },\n { name: 'learnedAt', type: 'timestamp' },\n { name: 'confidence', type: 'number', default: 0.5 },\n ],\n};\n\n/**\n * Generation session entity - stores history of generations\n */\nexport const GenerationSessionEntity: Entity = {\n name: 'GenerationSession',\n persistence: 'persistent',\n fields: [\n { name: 'id', type: 'string', required: true },\n { name: 'userId', type: 'string', required: true },\n { name: 'threadId', type: 'string', required: true },\n { name: 'prompt', type: 'string', required: true },\n { name: 'skill', type: 'string', required: true },\n { name: 'entities', type: 'array', items: { name: 'entity', type: 'string' }, default: [] },\n { name: 'patterns', type: 'array', items: { name: 'pattern', type: 'string' }, default: [] },\n { name: 'createdAt', type: 'timestamp', required: true },\n { name: 'completedAt', type: 'timestamp' },\n { name: 'success', type: 'boolean', default: false },\n ],\n};\n\n/**\n * Project context entity - stores project-specific conventions\n */\nexport const ProjectContextEntity: Entity = {\n name: 'ProjectContext',\n persistence: 'persistent',\n fields: [\n { name: 'id', type: 'string', required: true },\n { name: 'appId', type: 'string', required: true },\n { name: 'userId', type: 'string', required: true },\n { name: 'projectName', type: 'string' },\n { name: 'description', type: 'string' },\n { name: 'existingEntities', type: 'array', items: { name: 'entity', type: 'string' }, default: [] },\n { name: 'conventions', type: 'array', items: { name: 'convention', type: 'string' }, default: [] },\n { name: 'domain', type: 'enum', values: ['business', 'ecommerce', 'cms', 'dashboard', 'workflow'], default: 'business' },\n { name: 'lastUpdatedAt', type: 'timestamp', required: true },\n ],\n};\n\n// ============================================================================\n// Memory Orbital Schema\n// ============================================================================\n\n/**\n * The complete Memory Orbital Schema\n * This defines the structure for storing agent memory\n */\nexport const MemoryOrbitalSchema: OrbitalSchema = {\n name: 'AgentMemory',\n version: '1.0.0',\n description: 'Memory system for KFlow DeepAgent - stores user preferences, generation history, and project context',\n orbitals: [\n {\n name: 'UserPreferenceMemory',\n entity: UserPreferenceEntity,\n traits: [],\n pages: [],\n },\n {\n name: 'GenerationHistoryMemory',\n entity: GenerationSessionEntity,\n traits: [],\n pages: [],\n },\n {\n name: 'ProjectContextMemory',\n entity: ProjectContextEntity,\n traits: [],\n pages: [],\n },\n ],\n};\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type UserPreference = {\n id: string;\n userId: string;\n namingConvention: 'PascalCase' | 'camelCase' | 'snake_case';\n validationStyle: 'strict' | 'minimal' | 'none';\n preferredPatterns: string[];\n commonEntities: string[];\n commonTraits: string[];\n learnedAt: Date;\n confidence: number;\n};\n\nexport type GenerationSession = {\n id: string;\n userId: string;\n threadId: string;\n prompt: string;\n skill: string;\n generatedSchema?: Record<string, unknown>;\n entities: string[];\n patterns: string[];\n validationResult?: { valid: boolean; errors: unknown[] };\n createdAt: Date;\n completedAt?: Date;\n success: boolean;\n};\n\nexport type ProjectContext = {\n id: string;\n appId: string;\n userId: string;\n projectName?: string;\n description?: string;\n existingEntities: string[];\n conventions: string[];\n domain: 'business' | 'ecommerce' | 'cms' | 'dashboard' | 'workflow';\n lastUpdatedAt: Date;\n};\n","/**\n * Workspace Templates\n *\n * .orb memory file templates as TypeScript constants.\n * These are written to `.almadar/` on workspace initialization.\n *\n * Reuses entity definitions from `memory-orbital.ts` for type consistency.\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalSchema, Entity } from '@almadar/core';\nimport {\n UserPreferenceEntity,\n ProjectContextEntity,\n} from '../memory/memory-orbital.js';\n\n// ============================================================================\n// User Memory Template\n// ============================================================================\n\n/**\n * Create the user.orb template — tracks user preferences with a temporal learning trait.\n *\n * The `instances` field carries the living memory data.\n * Git commits to this file ARE the state transitions over time.\n */\nexport function createUserOrbTemplate(userId: string): OrbitalSchema {\n const entity: Entity = {\n ...UserPreferenceEntity,\n instances: [{\n id: `pref-${userId}`,\n userId,\n namingConvention: 'PascalCase',\n validationStyle: 'strict',\n preferredPatterns: [],\n commonEntities: [],\n commonTraits: [],\n confidence: 0,\n }],\n };\n\n return {\n name: 'UserMemory',\n version: '1.0.0',\n description: 'User preferences and learned patterns',\n orbitals: [{\n name: 'PreferenceTracking',\n entity,\n traits: [{\n name: 'Learning',\n category: 'interaction',\n linkedEntity: 'UserPreference',\n stateMachine: {\n states: [\n { name: 'Cold', isInitial: true },\n { name: 'Warming' },\n { name: 'Confident' },\n ],\n events: [\n { key: 'SESSION_COMPLETE', name: 'Session Complete' },\n { key: 'RESET', name: 'Reset' },\n ],\n transitions: [\n {\n from: 'Cold', to: 'Warming', event: 'SESSION_COMPLETE',\n effects: [['set', '@entity.confidence', ['min', 1, ['add', '@entity.confidence', 0.1]]]],\n },\n {\n from: 'Warming', to: 'Warming', event: 'SESSION_COMPLETE',\n guard: ['<', '@entity.confidence', 0.8],\n effects: [['set', '@entity.confidence', ['min', 1, ['add', '@entity.confidence', 0.1]]]],\n },\n {\n from: 'Warming', to: 'Confident', event: 'SESSION_COMPLETE',\n guard: ['>=', '@entity.confidence', 0.8],\n },\n {\n from: 'Confident', to: 'Cold', event: 'RESET',\n effects: [['set', '@entity.confidence', 0]],\n },\n ],\n },\n }],\n pages: [],\n }],\n };\n}\n\n// ============================================================================\n// Project Memory Template\n// ============================================================================\n\n/**\n * Create the project.orb template — tracks project domain knowledge.\n *\n * Accumulates known entities, relations, and domain terms across sessions.\n */\nexport function createProjectOrbTemplate(\n projectName: string,\n appId?: string,\n): OrbitalSchema {\n const entity: Entity = {\n ...ProjectContextEntity,\n instances: [{\n id: appId ?? `project-${projectName}`,\n appId: appId ?? '',\n userId: '',\n projectName,\n description: '',\n existingEntities: [],\n conventions: [],\n domain: 'business',\n lastUpdatedAt: new Date().toISOString(),\n }],\n };\n\n return {\n name: 'ProjectMemory',\n version: '1.0.0',\n description: `Domain knowledge for ${projectName}`,\n orbitals: [{\n name: 'DomainKnowledge',\n entity,\n traits: [{\n name: 'Accumulating',\n category: 'interaction',\n linkedEntity: 'ProjectContext',\n stateMachine: {\n states: [\n { name: 'Empty', isInitial: true },\n { name: 'Growing' },\n { name: 'Mature' },\n ],\n events: [\n { key: 'ENTITY_DISCOVERED', name: 'Entity Discovered' },\n { key: 'SESSION_COMPLETE', name: 'Session Complete' },\n ],\n transitions: [\n { from: 'Empty', to: 'Growing', event: 'ENTITY_DISCOVERED' },\n { from: 'Growing', to: 'Growing', event: 'ENTITY_DISCOVERED' },\n {\n from: 'Growing', to: 'Mature', event: 'SESSION_COMPLETE',\n guard: ['>=', '@entity.sessionCount', 5],\n },\n ],\n },\n }],\n pages: [],\n }],\n };\n}\n\n// ============================================================================\n// Schema Template\n// ============================================================================\n\n/**\n * Create the schema.orb template — empty scaffold for a new generation.\n */\nexport function createSchemaOrbTemplate(name: string): OrbitalSchema {\n return {\n name,\n version: '1.0.0',\n description: '',\n orbitals: [],\n };\n}\n\n// ============================================================================\n// Serialization\n// ============================================================================\n\n/** Serialize an OrbitalSchema to a formatted JSON string. */\nexport function serializeOrb(schema: OrbitalSchema): string {\n return JSON.stringify(schema, null, 2);\n}\n\n/** Parse a JSON string into an OrbitalSchema. Returns null on parse failure. */\nexport function parseOrb(content: string): OrbitalSchema | null {\n try {\n return JSON.parse(content) as OrbitalSchema;\n } catch {\n return null;\n }\n}\n","/**\n * Memory Files — Read/write .orb memory file instances.\n *\n * The `instances` field on an OrbitalSchema entity is the living data carrier.\n * These utilities read and write that field without touching the rest of the schema.\n *\n * @packageDocumentation\n */\n\nimport { readFile, writeFile } from 'fs/promises';\nimport type { OrbitalSchema, Entity } from '@almadar/core';\n\n// ============================================================================\n// Read\n// ============================================================================\n\n/**\n * Read the `instances` array from the first orbital's entity in an .orb file.\n * Returns an empty array if the file doesn't exist or has no instances.\n */\nexport async function readOrbInstances(\n filePath: string,\n): Promise<Record<string, unknown>[]> {\n try {\n const content = await readFile(filePath, 'utf-8');\n const schema = JSON.parse(content) as OrbitalSchema;\n const entity = schema.orbitals?.[0]?.entity;\n if (!entity || typeof entity === 'string') return [];\n return ((entity as Entity).instances ?? []) as Record<string, unknown>[];\n } catch {\n return [];\n }\n}\n\n/**\n * Read and parse a complete .orb file.\n * Returns null if the file doesn't exist or is invalid JSON.\n */\nexport async function readOrb(filePath: string): Promise<OrbitalSchema | null> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as OrbitalSchema;\n } catch {\n return null;\n }\n}\n\n// ============================================================================\n// Write\n// ============================================================================\n\n/**\n * Update the `instances` array in the first orbital's entity of an .orb file.\n * Preserves the rest of the schema structure (traits, pages, etc.).\n *\n * If the file doesn't exist, this is a no-op (the workspace should be\n * initialized with templates first).\n */\nexport async function writeOrbInstances(\n filePath: string,\n instances: Record<string, unknown>[],\n): Promise<boolean> {\n try {\n const content = await readFile(filePath, 'utf-8');\n const schema = JSON.parse(content) as OrbitalSchema;\n const entity = schema.orbitals?.[0]?.entity;\n if (!entity || typeof entity === 'string') return false;\n (entity as Entity).instances = instances;\n await writeFile(filePath, JSON.stringify(schema, null, 2), 'utf-8');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Write a complete OrbitalSchema to an .orb file.\n */\nexport async function writeOrb(\n filePath: string,\n schema: OrbitalSchema,\n): Promise<void> {\n await writeFile(filePath, JSON.stringify(schema, null, 2), 'utf-8');\n}\n","/**\n * WorkspaceManager — Lifecycle management for agent workspaces.\n *\n * Handles initialization (create dirs, write .orb templates, git init),\n * file write notifications (fan out to sinks), memory read/write,\n * and session end (final commit, tag, cleanup).\n *\n * @packageDocumentation\n */\n\nimport { mkdir, access } from 'fs/promises';\nimport { join } from 'path';\nimport type {\n WorkspaceConfig,\n FileMeta,\n SinkResult,\n MemorySnapshot,\n} from './types.js';\nimport { WORKSPACE_LAYOUT } from './types.js';\nimport { SinkManager } from './sink-manager.js';\nimport { GitClient } from './git-client.js';\nimport { GitSink } from './sinks/git-sink.js';\nimport {\n createUserOrbTemplate,\n createProjectOrbTemplate,\n createSchemaOrbTemplate,\n serializeOrb,\n} from './templates.js';\nimport { readOrbInstances, writeOrbInstances, writeOrb } from './memory-files.js';\n\n// ============================================================================\n// WorkspaceManager\n// ============================================================================\n\nexport class WorkspaceManager {\n private readonly config: WorkspaceConfig;\n private readonly sinkManager: SinkManager;\n private gitSink: GitSink | null = null;\n private initialized = false;\n\n constructor(config: WorkspaceConfig) {\n this.config = config;\n this.sinkManager = new SinkManager();\n\n // Register any sinks provided in config\n if (config.sinks) {\n for (const sink of config.sinks) {\n this.sinkManager.register(sink);\n }\n }\n }\n\n /** Get the absolute path to a workspace-relative path. */\n resolve(relativePath: string): string {\n return join(this.config.rootDir, relativePath);\n }\n\n /** Get the SinkManager for direct registration of additional sinks. */\n get sinks(): SinkManager {\n return this.sinkManager;\n }\n\n // ==========================================================================\n // Initialization\n // ==========================================================================\n\n /**\n * Initialize the workspace: create directories, write .orb templates,\n * optionally initialize git.\n *\n * Safe to call multiple times — skips if already initialized.\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Create .almadar/ directory structure\n const almadarDir = this.resolve(WORKSPACE_LAYOUT.ALMADAR_DIR);\n const orbitalsDir = this.resolve(WORKSPACE_LAYOUT.ORBITALS_DIR);\n await mkdir(almadarDir, { recursive: true });\n await mkdir(orbitalsDir, { recursive: true });\n\n // Write .orb template files (only if they don't exist)\n await this.writeTemplateIfMissing(\n WORKSPACE_LAYOUT.USER_MEMORY,\n serializeOrb(createUserOrbTemplate(this.config.userId)),\n );\n await this.writeTemplateIfMissing(\n WORKSPACE_LAYOUT.PROJECT_MEMORY,\n serializeOrb(createProjectOrbTemplate(\n this.config.projectName ?? 'Untitled',\n this.config.appId,\n )),\n );\n await this.writeTemplateIfMissing(\n WORKSPACE_LAYOUT.SCHEMA,\n serializeOrb(createSchemaOrbTemplate(\n this.config.projectName ?? 'Untitled',\n )),\n );\n\n // Initialize git if enabled\n if (this.config.gitEnabled !== false) {\n this.gitSink = new GitSink(this.config.rootDir);\n await this.gitSink.initialize();\n this.sinkManager.register(this.gitSink);\n\n // Initial commit with template files\n const git = new GitClient(this.config.rootDir);\n if (await git.isRepo()) {\n await git.addAll();\n await git.commit('init: workspace initialized');\n }\n }\n\n this.initialized = true;\n }\n\n // ==========================================================================\n // File Write Notifications\n // ==========================================================================\n\n /**\n * Notify sinks that a file was written.\n * Call this from the server when the agent writes a file.\n *\n * @param relativePath - Path relative to workspace root\n * @param content - File content as string\n * @param meta - Optional metadata override (auto-inferred if not provided)\n */\n async onFileWritten(\n relativePath: string,\n content: string,\n meta?: Partial<FileMeta>,\n ): Promise<SinkResult[]> {\n const fullMeta = inferFileMeta(relativePath, meta);\n return this.sinkManager.notifyFileWritten(relativePath, content, fullMeta);\n }\n\n // ==========================================================================\n // Memory Operations\n // ==========================================================================\n\n /**\n * Load memory from .orb files. Call at session start to provide\n * the agent with user preferences and project context.\n */\n async loadMemory(): Promise<MemorySnapshot> {\n const [user, project] = await Promise.all([\n readOrbInstances(this.resolve(WORKSPACE_LAYOUT.USER_MEMORY)),\n readOrbInstances(this.resolve(WORKSPACE_LAYOUT.PROJECT_MEMORY)),\n ]);\n return { user, project };\n }\n\n /**\n * Update memory .orb file instances. Call at session end to\n * persist learned preferences and discovered domain knowledge.\n */\n async saveMemory(updates: {\n user?: Record<string, unknown>[];\n project?: Record<string, unknown>[];\n }): Promise<void> {\n const writes: Promise<boolean>[] = [];\n\n if (updates.user) {\n writes.push(\n writeOrbInstances(this.resolve(WORKSPACE_LAYOUT.USER_MEMORY), updates.user),\n );\n }\n if (updates.project) {\n writes.push(\n writeOrbInstances(this.resolve(WORKSPACE_LAYOUT.PROJECT_MEMORY), updates.project),\n );\n }\n\n await Promise.all(writes);\n\n // Notify sinks about memory updates\n if (updates.user) {\n const content = JSON.stringify(updates.user, null, 2);\n await this.sinkManager.notifyFileWritten(\n WORKSPACE_LAYOUT.USER_MEMORY,\n content,\n { fileType: 'memory', sessionId: this.config.sessionId },\n );\n }\n if (updates.project) {\n const content = JSON.stringify(updates.project, null, 2);\n await this.sinkManager.notifyFileWritten(\n WORKSPACE_LAYOUT.PROJECT_MEMORY,\n content,\n { fileType: 'memory', sessionId: this.config.sessionId },\n );\n }\n }\n\n // ==========================================================================\n // Session End\n // ==========================================================================\n\n /**\n * End the session: notify all sinks, create git tag.\n * Call from the server when the agent session completes.\n */\n async endSession(): Promise<SinkResult[]> {\n return this.sinkManager.notifySessionEnd(this.config.sessionId);\n }\n\n // ==========================================================================\n // Helpers\n // ==========================================================================\n\n private async writeTemplateIfMissing(\n relativePath: string,\n content: string,\n ): Promise<void> {\n const fullPath = this.resolve(relativePath);\n try {\n await access(fullPath);\n // File exists — don't overwrite\n } catch {\n await writeOrb(fullPath, JSON.parse(content));\n }\n }\n}\n\n// ============================================================================\n// File Type Inference\n// ============================================================================\n\n/**\n * Infer file metadata from the path when not explicitly provided.\n * Uses workspace layout conventions to classify files.\n */\nfunction inferFileMeta(relativePath: string, partial?: Partial<FileMeta>): FileMeta {\n if (partial?.fileType) {\n return {\n fileType: partial.fileType,\n orbitalName: partial.orbitalName,\n sessionId: partial.sessionId,\n };\n }\n\n // Infer from path patterns\n if (relativePath.includes('/orbitals/') || relativePath.match(/\\.orbitals\\//)) {\n const name = relativePath.split('/').pop()?.replace(/\\.(orb|json)$/, '') ?? undefined;\n return { fileType: 'orbital', orbitalName: name, sessionId: partial?.sessionId };\n }\n if (relativePath.endsWith('schema.orb') || relativePath.endsWith('schema.json')) {\n return { fileType: 'schema', sessionId: partial?.sessionId };\n }\n if (relativePath.endsWith('user.orb') || relativePath.endsWith('project.orb')) {\n return { fileType: 'memory', sessionId: partial?.sessionId };\n }\n if (relativePath.endsWith('domain.txt')) {\n return { fileType: 'domain', sessionId: partial?.sessionId };\n }\n\n return { fileType: 'other', sessionId: partial?.sessionId };\n}\n","/**\n * FirestoreSink — Per-orbital Firestore persistence as a workspace sink.\n *\n * Takes injected save functions so @almadar/agent stays free of firebase-admin.\n * The server provides concrete implementations via KFlowAccessLayer.\n *\n * Key property: each orbital is its own Firestore document.\n * Two subagents writing different orbitals = zero contention.\n *\n * @packageDocumentation\n */\n\nimport type { WorkspaceSink, FileMeta } from '../types.js';\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\n/**\n * Injected dependencies for FirestoreSink.\n * The server provides these — the agent package has no Firestore dependency.\n */\nexport interface FirestoreSinkConfig {\n /** User ID for Firestore document paths. */\n userId: string;\n /** App ID (may be assigned later on first schema write). */\n appId?: string;\n /** Save a single orbital to its own Firestore document. */\n saveOrbital(orbitalName: string, orbital: unknown): Promise<void>;\n /** Save schema metadata (name, version, config). */\n saveSchema?(schema: unknown): Promise<{ appId: string }>;\n /** Save memory updates (user preferences, project context). */\n saveMemory?(memoryType: string, data: unknown): Promise<void>;\n /** Callback when a new app is created (for SSE event emission). */\n onAppCreated?(appId: string): void;\n}\n\n// ============================================================================\n// FirestoreSink\n// ============================================================================\n\nexport class FirestoreSink implements WorkspaceSink {\n readonly name = 'firestore';\n private readonly config: FirestoreSinkConfig;\n\n constructor(config: FirestoreSinkConfig) {\n this.config = config;\n }\n\n /** Update the appId after it's been assigned (e.g., on first schema write). */\n setAppId(appId: string): void {\n this.config.appId = appId;\n }\n\n async onFileWritten(_path: string, content: string, meta: FileMeta): Promise<void> {\n switch (meta.fileType) {\n case 'orbital': {\n if (!meta.orbitalName) return;\n const orbital = JSON.parse(content);\n await this.config.saveOrbital(meta.orbitalName, orbital);\n break;\n }\n case 'schema': {\n if (!this.config.saveSchema) return;\n const schema = JSON.parse(content);\n const result = await this.config.saveSchema(schema);\n if (result.appId && !this.config.appId) {\n this.config.appId = result.appId;\n this.config.onAppCreated?.(result.appId);\n }\n break;\n }\n case 'memory': {\n if (!this.config.saveMemory) return;\n const data = JSON.parse(content);\n // Derive memory type from the schema name (e.g., \"UserMemory\" → \"user\")\n const memoryType = data?.name?.toLowerCase()?.replace('memory', '') || 'unknown';\n await this.config.saveMemory(memoryType, data);\n break;\n }\n default:\n // Non-persistent file types (domain, other) are not synced to Firestore\n break;\n }\n }\n\n async onSessionEnd(_sessionId: string): Promise<void> {\n // No-op — memory sync is handled by WorkspaceManager.endSession()\n // which writes .orb files first (triggering onFileWritten for memory type).\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/workspace/types.ts","../../src/workspace/sink-manager.ts","../../src/workspace/git-client.ts","../../src/workspace/sinks/git-sink.ts","../../src/memory/memory-orbital.ts","../../src/workspace/templates.ts","../../src/workspace/memory-files.ts","../../src/workspace/workspace-manager.ts","../../src/workspace/sinks/firestore-sink.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Workspace Types\n *\n * Core type definitions for the workspace-centric persistence architecture.\n * The workspace is the central unit: files in a git-tracked directory,\n * with pluggable sinks for Firestore, GitHub, etc.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Workspace Layout\n// ============================================================================\n\n/** Standard directory structure inside a workspace. */\nexport const WORKSPACE_LAYOUT = {\n /** Root directory for Almadar workspace state. */\n ALMADAR_DIR: '.almadar',\n /** User preferences and learned patterns. */\n USER_MEMORY: '.almadar/user.orb',\n /** Project-level domain knowledge. */\n PROJECT_MEMORY: '.almadar/project.orb',\n /** The generation artifact (shared memory for all agents). */\n SCHEMA: '.almadar/schema.orb',\n /** Individual orbital files (one per subagent). */\n ORBITALS_DIR: '.almadar/orbitals',\n} as const;\n\n// ============================================================================\n// File Metadata\n// ============================================================================\n\n/** Classification of a file write for routing to appropriate sinks. */\nexport interface FileMeta {\n /** What kind of file was written. */\n fileType: 'schema' | 'orbital' | 'memory' | 'domain' | 'other';\n /** Orbital name (only when fileType is 'orbital'). */\n orbitalName?: string;\n /** Session ID for attribution. */\n sessionId?: string;\n}\n\n// ============================================================================\n// Workspace Sink\n// ============================================================================\n\n/**\n * A pluggable persistence backend that reacts to workspace file writes.\n *\n * Sinks are registered with the SinkManager and notified on every file write.\n * Each sink is independent — a failure in one does not affect others.\n */\nexport interface WorkspaceSink {\n /** Human-readable name for logging/diagnostics. */\n readonly name: string;\n\n /**\n * Called when a file is written to the workspace.\n * @param path - Relative path within the workspace root\n * @param content - File content as a string\n * @param meta - Classification metadata for routing\n */\n onFileWritten(path: string, content: string, meta: FileMeta): Promise<void>;\n\n /**\n * Called when the session ends. Used for cleanup, final sync, tagging, etc.\n * @param sessionId - The session being ended\n */\n onSessionEnd(sessionId: string): Promise<void>;\n}\n\n// ============================================================================\n// Sink Results\n// ============================================================================\n\n/** Result of notifying a single sink. */\nexport interface SinkResult {\n /** Which sink produced this result. */\n sinkName: string;\n /** Whether the sink operation succeeded. */\n success: boolean;\n /** Error details if the operation failed. */\n error?: Error;\n}\n\n// ============================================================================\n// Workspace Configuration\n// ============================================================================\n\n/** Configuration for initializing a workspace. */\nexport interface WorkspaceConfig {\n /** Absolute path to the workspace root directory. */\n rootDir: string;\n /** User ID for memory file attribution. */\n userId: string;\n /** Session ID for git tags and logging. */\n sessionId: string;\n /** App ID (may be assigned later on first schema write). */\n appId?: string;\n /** Project name for the schema template. */\n projectName?: string;\n /** Whether to initialize git in the workspace. Defaults to true. */\n gitEnabled?: boolean;\n /** Sinks to register on initialization. */\n sinks?: WorkspaceSink[];\n}\n\n// ============================================================================\n// Memory Snapshot\n// ============================================================================\n\n/** Snapshot of all .orb memory file instances, read at session start. */\nexport interface MemorySnapshot {\n /** User preferences from .almadar/user.orb instances. */\n user: Record<string, unknown>[];\n /** Project context from .almadar/project.orb instances. */\n project: Record<string, unknown>[];\n}\n","/**\n * SinkManager — Fan-out file writes to registered workspace sinks.\n *\n * Uses Promise.allSettled for fault isolation: a Firestore error\n * does not prevent the git commit, and vice versa.\n *\n * @packageDocumentation\n */\n\nimport type { WorkspaceSink, FileMeta, SinkResult } from './types.js';\n\nexport class SinkManager {\n private readonly sinks: WorkspaceSink[] = [];\n\n /** Register a sink to receive file write notifications. */\n register(sink: WorkspaceSink): void {\n this.sinks.push(sink);\n }\n\n /** Get registered sink names (for diagnostics). */\n get registeredSinks(): string[] {\n return this.sinks.map(s => s.name);\n }\n\n /**\n * Notify all sinks that a file was written.\n * Returns results from each sink — failures in one don't affect others.\n */\n async notifyFileWritten(\n path: string,\n content: string,\n meta: FileMeta,\n ): Promise<SinkResult[]> {\n if (this.sinks.length === 0) return [];\n\n const results = await Promise.allSettled(\n this.sinks.map(sink => sink.onFileWritten(path, content, meta)),\n );\n\n return results.map((result, i) => ({\n sinkName: this.sinks[i].name,\n success: result.status === 'fulfilled',\n error: result.status === 'rejected' ? toError(result.reason) : undefined,\n }));\n }\n\n /**\n * Notify all sinks that the session has ended.\n * Returns results from each sink — failures in one don't affect others.\n */\n async notifySessionEnd(sessionId: string): Promise<SinkResult[]> {\n if (this.sinks.length === 0) return [];\n\n const results = await Promise.allSettled(\n this.sinks.map(sink => sink.onSessionEnd(sessionId)),\n );\n\n return results.map((result, i) => ({\n sinkName: this.sinks[i].name,\n success: result.status === 'fulfilled',\n error: result.status === 'rejected' ? toError(result.reason) : undefined,\n }));\n }\n}\n\n/** Coerce an unknown rejection reason to an Error. */\nfunction toError(reason: unknown): Error {\n if (reason instanceof Error) return reason;\n return new Error(String(reason));\n}\n","/**\n * GitClient — Thin wrapper around local git CLI operations.\n *\n * Uses child_process.execFile for safety (no shell injection).\n * Designed for workspace-local operations only (init, add, commit, tag).\n * Remote operations (push, PR) use @almadar/integrations instead.\n *\n * @packageDocumentation\n */\n\nimport { execFile } from 'child_process';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface GitLogEntry {\n hash: string;\n message: string;\n date: string;\n author: string;\n}\n\nexport interface GitStatus {\n clean: boolean;\n staged: string[];\n modified: string[];\n untracked: string[];\n}\n\n// ============================================================================\n// GitClient\n// ============================================================================\n\nexport class GitClient {\n constructor(private readonly cwd: string) {}\n\n /** Get the working directory path. */\n getCwd(): string {\n return this.cwd;\n }\n\n /** Check if git is available on the system. */\n static async isAvailable(): Promise<boolean> {\n try {\n await execGit(['--version'], '/tmp');\n return true;\n } catch {\n return false;\n }\n }\n\n /** Check if the workspace is already a git repository. */\n async isRepo(): Promise<boolean> {\n try {\n await this.exec(['rev-parse', '--is-inside-work-tree']);\n return true;\n } catch {\n return false;\n }\n }\n\n /** Initialize a new git repository. No-op if already initialized. */\n async init(): Promise<void> {\n if (await this.isRepo()) return;\n await this.exec(['init']);\n // Set default user for agent commits (won't affect global config)\n await this.exec(['config', 'user.email', 'agent@almadar.io']);\n await this.exec(['config', 'user.name', 'Almadar Agent']);\n }\n\n /** Stage files for commit. */\n async add(paths: string[]): Promise<void> {\n if (paths.length === 0) return;\n await this.exec(['add', ...paths]);\n }\n\n /** Stage all changes (equivalent to git add -A). */\n async addAll(): Promise<void> {\n await this.exec(['add', '-A']);\n }\n\n /**\n * Create a commit with the given message.\n * Returns the commit hash, or null if there was nothing to commit.\n */\n async commit(message: string): Promise<string | null> {\n try {\n const output = await this.exec(['commit', '-m', message, '--allow-empty-message']);\n const match = output.match(/\\[[\\w/.-]+ ([a-f0-9]+)\\]/);\n return match ? match[1] : null;\n } catch (err) {\n // \"nothing to commit\" is not an error\n if (err instanceof Error && err.message.includes('nothing to commit')) {\n return null;\n }\n throw err;\n }\n }\n\n /** Create an annotated tag. */\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 /** Get recent commits. */\n async log(limit = 10): Promise<GitLogEntry[]> {\n try {\n const output = await this.exec([\n 'log',\n `--max-count=${limit}`,\n '--format=%H|%s|%aI|%an',\n ]);\n return output\n .trim()\n .split('\\n')\n .filter(Boolean)\n .map(line => {\n const [hash, message, date, author] = line.split('|');\n return { hash, message, date, author };\n });\n } catch {\n // No commits yet\n return [];\n }\n }\n\n /** Get workspace status. */\n async status(): Promise<GitStatus> {\n const output = await this.exec(['status', '--porcelain']);\n const lines = output.trim().split('\\n').filter(Boolean);\n const staged: string[] = [];\n const modified: string[] = [];\n const untracked: string[] = [];\n\n for (const line of lines) {\n const indexStatus = line[0];\n const workTreeStatus = line[1];\n const file = line.slice(3);\n\n if (indexStatus === '?' && workTreeStatus === '?') {\n untracked.push(file);\n } else if (indexStatus !== ' ' && indexStatus !== '?') {\n staged.push(file);\n } else if (workTreeStatus !== ' ') {\n modified.push(file);\n }\n }\n\n return {\n clean: lines.length === 0,\n staged,\n modified,\n untracked,\n };\n }\n\n /** Get diff output between two references. */\n async diff(from?: string, to?: string): Promise<string> {\n const args = ['diff'];\n if (from) args.push(from);\n if (to) args.push(to);\n return this.exec(args);\n }\n\n private exec(args: string[]): Promise<string> {\n return execGit(args, this.cwd);\n }\n}\n\n// ============================================================================\n// Helpers\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 * GitSink — Auto-commit workspace file writes to a local git repository.\n *\n * Implements the WorkspaceSink interface. Every file write becomes a git commit\n * with a structured message. Concurrent writes are serialized via a commit queue\n * to prevent git lock contention (handles parallel subagent case).\n *\n * Optionally pushes to a remote GitHub repo on session end via `enablePush()`.\n * Push failures are non-fatal (logged, local commits preserved).\n *\n * Gracefully degrades if git is not available (logs warning, no-ops).\n *\n * @packageDocumentation\n */\n\nimport { basename } from 'path';\nimport { GitClient } from '../git-client.js';\nimport type { WorkspaceSink, FileMeta } from '../types.js';\n\n/**\n * Configuration for pushing to a remote GitHub repository on session end.\n */\nexport interface GitSinkPushConfig {\n token: string;\n branch: string;\n repoUrl: string;\n}\n\nexport class GitSink implements WorkspaceSink {\n readonly name = 'git';\n private readonly client: GitClient;\n private commitQueue: Promise<void> = Promise.resolve();\n private available: boolean | null = null;\n private pushConfig: GitSinkPushConfig | null = null;\n\n constructor(workspaceRoot: string) {\n this.client = new GitClient(workspaceRoot);\n }\n\n /** Initialize the git repo. Must be called before onFileWritten. */\n async initialize(): Promise<void> {\n this.available = await GitClient.isAvailable();\n if (!this.available) {\n console.warn('[GitSink] git not available — commits will be skipped');\n return;\n }\n await this.client.init();\n }\n\n /**\n * Enable pushing to a remote GitHub repo on session end.\n * Push failures are non-fatal — local commits are always preserved.\n */\n enablePush(config: GitSinkPushConfig): void {\n this.pushConfig = config;\n }\n\n /** Get the working directory path. */\n getCwd(): string {\n return this.client.getCwd();\n }\n\n async onFileWritten(path: string, _content: string, meta: FileMeta): Promise<void> {\n if (!this.available) return;\n\n // Serialize commits via promise chain to prevent git lock contention\n this.commitQueue = this.commitQueue.then(async () => {\n const message = formatCommitMessage(path, meta);\n await this.client.add([path]);\n await this.client.commit(message);\n });\n\n await this.commitQueue;\n }\n\n async onSessionEnd(sessionId: string): Promise<void> {\n if (!this.available) return;\n\n // Wait for any pending commits to finish\n await this.commitQueue;\n\n // Stage any remaining changes and create session-end commit\n const status = await this.client.status();\n if (!status.clean) {\n await this.client.addAll();\n await this.client.commit(`session-end: ${sessionId}`);\n }\n\n // Tag the session\n await this.client.tag(\n `session/${sessionId}`,\n `Session ${sessionId} complete`,\n );\n\n // Push to remote if configured\n if (this.pushConfig) {\n await this.pushToRemote();\n }\n }\n\n /**\n * Push local commits to the remote GitHub repository.\n * Non-fatal — failures are logged but do not throw.\n */\n private async pushToRemote(): Promise<void> {\n if (!this.pushConfig) return;\n\n const { token, branch, repoUrl } = this.pushConfig;\n const cwd = this.client.getCwd();\n\n try {\n console.log(`[GitSink] Pushing to ${repoUrl} branch ${branch}...`);\n\n // Dynamic import to avoid hard dependency on @almadar/integrations\n const { push } = await import('@almadar/integrations/github');\n await push({ branchName: branch, workDir: cwd }, cwd, token);\n\n console.log(`[GitSink] Push successful`);\n } catch (error) {\n // Non-fatal — local commits are preserved\n console.error(\n `[GitSink] Push failed (local commits preserved):`,\n error instanceof Error ? error.message : error,\n );\n }\n }\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Generate a structured git commit message from file metadata. */\nfunction formatCommitMessage(path: string, meta: FileMeta): string {\n const filename = basename(path);\n switch (meta.fileType) {\n case 'orbital':\n return `add(${meta.orbitalName ?? filename}): orbital generated`;\n case 'schema':\n return `update(schema): ${filename}`;\n case 'memory':\n return `update(memory): ${filename}`;\n case 'domain':\n return `add(domain): ${filename}`;\n default:\n return `update: ${filename}`;\n }\n}\n","/**\n * Memory Orbital Schema\n *\n * Defines the structure for agent memory using Orbital types.\n * This is an OrbitalSchema that represents user memory, preferences,\n * and generation history.\n *\n * @packageDocumentation\n */\n\nimport type {\n OrbitalSchema,\n Entity,\n Trait,\n} from '@almadar/core';\n\n// ============================================================================\n// Memory Entity Types\n// ============================================================================\n\n/**\n * User preference entity - stores learned or explicit preferences\n */\nexport const UserPreferenceEntity: Entity = {\n name: 'UserPreference',\n persistence: 'persistent',\n fields: [\n { name: 'id', type: 'string', required: true },\n { name: 'userId', type: 'string', required: true },\n { name: 'namingConvention', type: 'enum', values: ['PascalCase', 'camelCase', 'snake_case'], default: 'PascalCase' },\n { name: 'validationStyle', type: 'enum', values: ['strict', 'minimal', 'none'], default: 'strict' },\n { name: 'preferredPatterns', type: 'array', items: { name: 'pattern', type: 'string' }, default: [] },\n { name: 'commonEntities', type: 'array', items: { name: 'entity', type: 'string' }, default: [] },\n { name: 'commonTraits', type: 'array', items: { name: 'trait', type: 'string' }, default: [] },\n { name: 'learnedAt', type: 'timestamp' },\n { name: 'confidence', type: 'number', default: 0.5 },\n ],\n};\n\n/**\n * Generation session entity - stores history of generations\n */\nexport const GenerationSessionEntity: Entity = {\n name: 'GenerationSession',\n persistence: 'persistent',\n fields: [\n { name: 'id', type: 'string', required: true },\n { name: 'userId', type: 'string', required: true },\n { name: 'threadId', type: 'string', required: true },\n { name: 'prompt', type: 'string', required: true },\n { name: 'skill', type: 'string', required: true },\n { name: 'entities', type: 'array', items: { name: 'entity', type: 'string' }, default: [] },\n { name: 'patterns', type: 'array', items: { name: 'pattern', type: 'string' }, default: [] },\n { name: 'createdAt', type: 'timestamp', required: true },\n { name: 'completedAt', type: 'timestamp' },\n { name: 'success', type: 'boolean', default: false },\n ],\n};\n\n/**\n * Project context entity - stores project-specific conventions\n */\nexport const ProjectContextEntity: Entity = {\n name: 'ProjectContext',\n persistence: 'persistent',\n fields: [\n { name: 'id', type: 'string', required: true },\n { name: 'appId', type: 'string', required: true },\n { name: 'userId', type: 'string', required: true },\n { name: 'projectName', type: 'string' },\n { name: 'description', type: 'string' },\n { name: 'existingEntities', type: 'array', items: { name: 'entity', type: 'string' }, default: [] },\n { name: 'conventions', type: 'array', items: { name: 'convention', type: 'string' }, default: [] },\n { name: 'domain', type: 'enum', values: ['business', 'ecommerce', 'cms', 'dashboard', 'workflow'], default: 'business' },\n { name: 'lastUpdatedAt', type: 'timestamp', required: true },\n ],\n};\n\n// ============================================================================\n// Memory Orbital Schema\n// ============================================================================\n\n/**\n * The complete Memory Orbital Schema\n * This defines the structure for storing agent memory\n */\nexport const MemoryOrbitalSchema: OrbitalSchema = {\n name: 'AgentMemory',\n version: '1.0.0',\n description: 'Memory system for KFlow DeepAgent - stores user preferences, generation history, and project context',\n orbitals: [\n {\n name: 'UserPreferenceMemory',\n entity: UserPreferenceEntity,\n traits: [],\n pages: [],\n },\n {\n name: 'GenerationHistoryMemory',\n entity: GenerationSessionEntity,\n traits: [],\n pages: [],\n },\n {\n name: 'ProjectContextMemory',\n entity: ProjectContextEntity,\n traits: [],\n pages: [],\n },\n ],\n};\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type UserPreference = {\n id: string;\n userId: string;\n namingConvention: 'PascalCase' | 'camelCase' | 'snake_case';\n validationStyle: 'strict' | 'minimal' | 'none';\n preferredPatterns: string[];\n commonEntities: string[];\n commonTraits: string[];\n learnedAt: Date;\n confidence: number;\n};\n\nexport type GenerationSession = {\n id: string;\n userId: string;\n threadId: string;\n prompt: string;\n skill: string;\n generatedSchema?: Record<string, unknown>;\n entities: string[];\n patterns: string[];\n validationResult?: { valid: boolean; errors: unknown[] };\n createdAt: Date;\n completedAt?: Date;\n success: boolean;\n};\n\nexport type ProjectContext = {\n id: string;\n appId: string;\n userId: string;\n projectName?: string;\n description?: string;\n existingEntities: string[];\n conventions: string[];\n domain: 'business' | 'ecommerce' | 'cms' | 'dashboard' | 'workflow';\n lastUpdatedAt: Date;\n};\n","/**\n * Workspace Templates\n *\n * .orb memory file templates as TypeScript constants.\n * These are written to `.almadar/` on workspace initialization.\n *\n * Reuses entity definitions from `memory-orbital.ts` for type consistency.\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalSchema, Entity } from '@almadar/core';\nimport {\n UserPreferenceEntity,\n ProjectContextEntity,\n} from '../memory/memory-orbital.js';\n\n// ============================================================================\n// User Memory Template\n// ============================================================================\n\n/**\n * Create the user.orb template — tracks user preferences with a temporal learning trait.\n *\n * The `instances` field carries the living memory data.\n * Git commits to this file ARE the state transitions over time.\n */\nexport function createUserOrbTemplate(userId: string): OrbitalSchema {\n const entity: Entity = {\n ...UserPreferenceEntity,\n instances: [{\n id: `pref-${userId}`,\n userId,\n namingConvention: 'PascalCase',\n validationStyle: 'strict',\n preferredPatterns: [],\n commonEntities: [],\n commonTraits: [],\n confidence: 0,\n }],\n };\n\n return {\n name: 'UserMemory',\n version: '1.0.0',\n description: 'User preferences and learned patterns',\n orbitals: [{\n name: 'PreferenceTracking',\n entity,\n traits: [{\n name: 'Learning',\n category: 'interaction',\n linkedEntity: 'UserPreference',\n stateMachine: {\n states: [\n { name: 'Cold', isInitial: true },\n { name: 'Warming' },\n { name: 'Confident' },\n ],\n events: [\n { key: 'SESSION_COMPLETE', name: 'Session Complete' },\n { key: 'RESET', name: 'Reset' },\n ],\n transitions: [\n {\n from: 'Cold', to: 'Warming', event: 'SESSION_COMPLETE',\n effects: [['set', '@entity.confidence', ['min', 1, ['add', '@entity.confidence', 0.1]]]],\n },\n {\n from: 'Warming', to: 'Warming', event: 'SESSION_COMPLETE',\n guard: ['<', '@entity.confidence', 0.8],\n effects: [['set', '@entity.confidence', ['min', 1, ['add', '@entity.confidence', 0.1]]]],\n },\n {\n from: 'Warming', to: 'Confident', event: 'SESSION_COMPLETE',\n guard: ['>=', '@entity.confidence', 0.8],\n },\n {\n from: 'Confident', to: 'Cold', event: 'RESET',\n effects: [['set', '@entity.confidence', 0]],\n },\n ],\n },\n }],\n pages: [],\n }],\n };\n}\n\n// ============================================================================\n// Project Memory Template\n// ============================================================================\n\n/**\n * Create the project.orb template — tracks project domain knowledge.\n *\n * Accumulates known entities, relations, and domain terms across sessions.\n */\nexport function createProjectOrbTemplate(\n projectName: string,\n appId?: string,\n): OrbitalSchema {\n const entity: Entity = {\n ...ProjectContextEntity,\n instances: [{\n id: appId ?? `project-${projectName}`,\n appId: appId ?? '',\n userId: '',\n projectName,\n description: '',\n existingEntities: [],\n conventions: [],\n domain: 'business',\n lastUpdatedAt: new Date().toISOString(),\n }],\n };\n\n return {\n name: 'ProjectMemory',\n version: '1.0.0',\n description: `Domain knowledge for ${projectName}`,\n orbitals: [{\n name: 'DomainKnowledge',\n entity,\n traits: [{\n name: 'Accumulating',\n category: 'interaction',\n linkedEntity: 'ProjectContext',\n stateMachine: {\n states: [\n { name: 'Empty', isInitial: true },\n { name: 'Growing' },\n { name: 'Mature' },\n ],\n events: [\n { key: 'ENTITY_DISCOVERED', name: 'Entity Discovered' },\n { key: 'SESSION_COMPLETE', name: 'Session Complete' },\n ],\n transitions: [\n { from: 'Empty', to: 'Growing', event: 'ENTITY_DISCOVERED' },\n { from: 'Growing', to: 'Growing', event: 'ENTITY_DISCOVERED' },\n {\n from: 'Growing', to: 'Mature', event: 'SESSION_COMPLETE',\n guard: ['>=', '@entity.sessionCount', 5],\n },\n ],\n },\n }],\n pages: [],\n }],\n };\n}\n\n// ============================================================================\n// Schema Template\n// ============================================================================\n\n/**\n * Create the schema.orb template — empty scaffold for a new generation.\n */\nexport function createSchemaOrbTemplate(name: string): OrbitalSchema {\n return {\n name,\n version: '1.0.0',\n description: '',\n orbitals: [],\n };\n}\n\n// ============================================================================\n// Serialization\n// ============================================================================\n\n/** Serialize an OrbitalSchema to a formatted JSON string. */\nexport function serializeOrb(schema: OrbitalSchema): string {\n return JSON.stringify(schema, null, 2);\n}\n\n/** Parse a JSON string into an OrbitalSchema. Returns null on parse failure. */\nexport function parseOrb(content: string): OrbitalSchema | null {\n try {\n return JSON.parse(content) as OrbitalSchema;\n } catch {\n return null;\n }\n}\n","/**\n * Memory Files — Read/write .orb memory file instances.\n *\n * The `instances` field on an OrbitalSchema entity is the living data carrier.\n * These utilities read and write that field without touching the rest of the schema.\n *\n * @packageDocumentation\n */\n\nimport { readFile, writeFile } from 'fs/promises';\nimport type { OrbitalSchema, Entity } from '@almadar/core';\n\n// ============================================================================\n// Read\n// ============================================================================\n\n/**\n * Read the `instances` array from the first orbital's entity in an .orb file.\n * Returns an empty array if the file doesn't exist or has no instances.\n */\nexport async function readOrbInstances(\n filePath: string,\n): Promise<Record<string, unknown>[]> {\n try {\n const content = await readFile(filePath, 'utf-8');\n const schema = JSON.parse(content) as OrbitalSchema;\n const entity = schema.orbitals?.[0]?.entity;\n if (!entity || typeof entity === 'string') return [];\n return ((entity as Entity).instances ?? []) as Record<string, unknown>[];\n } catch {\n return [];\n }\n}\n\n/**\n * Read and parse a complete .orb file.\n * Returns null if the file doesn't exist or is invalid JSON.\n */\nexport async function readOrb(filePath: string): Promise<OrbitalSchema | null> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as OrbitalSchema;\n } catch {\n return null;\n }\n}\n\n// ============================================================================\n// Write\n// ============================================================================\n\n/**\n * Update the `instances` array in the first orbital's entity of an .orb file.\n * Preserves the rest of the schema structure (traits, pages, etc.).\n *\n * If the file doesn't exist, this is a no-op (the workspace should be\n * initialized with templates first).\n */\nexport async function writeOrbInstances(\n filePath: string,\n instances: Record<string, unknown>[],\n): Promise<boolean> {\n try {\n const content = await readFile(filePath, 'utf-8');\n const schema = JSON.parse(content) as OrbitalSchema;\n const entity = schema.orbitals?.[0]?.entity;\n if (!entity || typeof entity === 'string') return false;\n (entity as Entity).instances = instances;\n await writeFile(filePath, JSON.stringify(schema, null, 2), 'utf-8');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Write a complete OrbitalSchema to an .orb file.\n */\nexport async function writeOrb(\n filePath: string,\n schema: OrbitalSchema,\n): Promise<void> {\n await writeFile(filePath, JSON.stringify(schema, null, 2), 'utf-8');\n}\n","/**\n * WorkspaceManager — Lifecycle management for agent workspaces.\n *\n * Handles initialization (create dirs, write .orb templates, git init),\n * file write notifications (fan out to sinks), memory read/write,\n * and session end (final commit, tag, cleanup).\n *\n * @packageDocumentation\n */\n\nimport { mkdir, access } from 'fs/promises';\nimport { join } from 'path';\nimport type {\n WorkspaceConfig,\n FileMeta,\n SinkResult,\n MemorySnapshot,\n} from './types.js';\nimport { WORKSPACE_LAYOUT } from './types.js';\nimport { SinkManager } from './sink-manager.js';\nimport { GitClient } from './git-client.js';\nimport { GitSink } from './sinks/git-sink.js';\nimport {\n createUserOrbTemplate,\n createProjectOrbTemplate,\n createSchemaOrbTemplate,\n serializeOrb,\n} from './templates.js';\nimport { readOrbInstances, writeOrbInstances, writeOrb } from './memory-files.js';\n\n// ============================================================================\n// WorkspaceManager\n// ============================================================================\n\nexport class WorkspaceManager {\n private readonly config: WorkspaceConfig;\n private readonly sinkManager: SinkManager;\n private gitSink: GitSink | null = null;\n private initialized = false;\n\n constructor(config: WorkspaceConfig) {\n this.config = config;\n this.sinkManager = new SinkManager();\n\n // Register any sinks provided in config\n if (config.sinks) {\n for (const sink of config.sinks) {\n this.sinkManager.register(sink);\n }\n }\n }\n\n /** Get the absolute path to a workspace-relative path. */\n resolve(relativePath: string): string {\n return join(this.config.rootDir, relativePath);\n }\n\n /** Get the SinkManager for direct registration of additional sinks. */\n get sinks(): SinkManager {\n return this.sinkManager;\n }\n\n // ==========================================================================\n // Initialization\n // ==========================================================================\n\n /**\n * Initialize the workspace: create directories, write .orb templates,\n * optionally initialize git.\n *\n * Safe to call multiple times — skips if already initialized.\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Create .almadar/ directory structure\n const almadarDir = this.resolve(WORKSPACE_LAYOUT.ALMADAR_DIR);\n const orbitalsDir = this.resolve(WORKSPACE_LAYOUT.ORBITALS_DIR);\n await mkdir(almadarDir, { recursive: true });\n await mkdir(orbitalsDir, { recursive: true });\n\n // Write .orb template files (only if they don't exist)\n await this.writeTemplateIfMissing(\n WORKSPACE_LAYOUT.USER_MEMORY,\n serializeOrb(createUserOrbTemplate(this.config.userId)),\n );\n await this.writeTemplateIfMissing(\n WORKSPACE_LAYOUT.PROJECT_MEMORY,\n serializeOrb(createProjectOrbTemplate(\n this.config.projectName ?? 'Untitled',\n this.config.appId,\n )),\n );\n await this.writeTemplateIfMissing(\n WORKSPACE_LAYOUT.SCHEMA,\n serializeOrb(createSchemaOrbTemplate(\n this.config.projectName ?? 'Untitled',\n )),\n );\n\n // Initialize git if enabled\n if (this.config.gitEnabled !== false) {\n this.gitSink = new GitSink(this.config.rootDir);\n await this.gitSink.initialize();\n this.sinkManager.register(this.gitSink);\n\n // Initial commit with template files\n const git = new GitClient(this.config.rootDir);\n if (await git.isRepo()) {\n await git.addAll();\n await git.commit('init: workspace initialized');\n }\n }\n\n this.initialized = true;\n }\n\n // ==========================================================================\n // File Write Notifications\n // ==========================================================================\n\n /**\n * Notify sinks that a file was written.\n * Call this from the server when the agent writes a file.\n *\n * @param relativePath - Path relative to workspace root\n * @param content - File content as string\n * @param meta - Optional metadata override (auto-inferred if not provided)\n */\n async onFileWritten(\n relativePath: string,\n content: string,\n meta?: Partial<FileMeta>,\n ): Promise<SinkResult[]> {\n const fullMeta = inferFileMeta(relativePath, meta);\n return this.sinkManager.notifyFileWritten(relativePath, content, fullMeta);\n }\n\n // ==========================================================================\n // Memory Operations\n // ==========================================================================\n\n /**\n * Load memory from .orb files. Call at session start to provide\n * the agent with user preferences and project context.\n */\n async loadMemory(): Promise<MemorySnapshot> {\n const [user, project] = await Promise.all([\n readOrbInstances(this.resolve(WORKSPACE_LAYOUT.USER_MEMORY)),\n readOrbInstances(this.resolve(WORKSPACE_LAYOUT.PROJECT_MEMORY)),\n ]);\n return { user, project };\n }\n\n /**\n * Update memory .orb file instances. Call at session end to\n * persist learned preferences and discovered domain knowledge.\n */\n async saveMemory(updates: {\n user?: Record<string, unknown>[];\n project?: Record<string, unknown>[];\n }): Promise<void> {\n const writes: Promise<boolean>[] = [];\n\n if (updates.user) {\n writes.push(\n writeOrbInstances(this.resolve(WORKSPACE_LAYOUT.USER_MEMORY), updates.user),\n );\n }\n if (updates.project) {\n writes.push(\n writeOrbInstances(this.resolve(WORKSPACE_LAYOUT.PROJECT_MEMORY), updates.project),\n );\n }\n\n await Promise.all(writes);\n\n // Notify sinks about memory updates\n if (updates.user) {\n const content = JSON.stringify(updates.user, null, 2);\n await this.sinkManager.notifyFileWritten(\n WORKSPACE_LAYOUT.USER_MEMORY,\n content,\n { fileType: 'memory', sessionId: this.config.sessionId },\n );\n }\n if (updates.project) {\n const content = JSON.stringify(updates.project, null, 2);\n await this.sinkManager.notifyFileWritten(\n WORKSPACE_LAYOUT.PROJECT_MEMORY,\n content,\n { fileType: 'memory', sessionId: this.config.sessionId },\n );\n }\n }\n\n // ==========================================================================\n // Session End\n // ==========================================================================\n\n /**\n * End the session: notify all sinks, create git tag.\n * Call from the server when the agent session completes.\n */\n async endSession(): Promise<SinkResult[]> {\n return this.sinkManager.notifySessionEnd(this.config.sessionId);\n }\n\n // ==========================================================================\n // Helpers\n // ==========================================================================\n\n private async writeTemplateIfMissing(\n relativePath: string,\n content: string,\n ): Promise<void> {\n const fullPath = this.resolve(relativePath);\n try {\n await access(fullPath);\n // File exists — don't overwrite\n } catch {\n await writeOrb(fullPath, JSON.parse(content));\n }\n }\n}\n\n// ============================================================================\n// File Type Inference\n// ============================================================================\n\n/**\n * Infer file metadata from the path when not explicitly provided.\n * Uses workspace layout conventions to classify files.\n */\nfunction inferFileMeta(relativePath: string, partial?: Partial<FileMeta>): FileMeta {\n if (partial?.fileType) {\n return {\n fileType: partial.fileType,\n orbitalName: partial.orbitalName,\n sessionId: partial.sessionId,\n };\n }\n\n // Infer from path patterns\n if (relativePath.includes('/orbitals/') || relativePath.match(/\\.orbitals\\//)) {\n const name = relativePath.split('/').pop()?.replace(/\\.(orb|json)$/, '') ?? undefined;\n return { fileType: 'orbital', orbitalName: name, sessionId: partial?.sessionId };\n }\n if (relativePath.endsWith('schema.orb') || relativePath.endsWith('schema.json')) {\n return { fileType: 'schema', sessionId: partial?.sessionId };\n }\n if (relativePath.endsWith('user.orb') || relativePath.endsWith('project.orb')) {\n return { fileType: 'memory', sessionId: partial?.sessionId };\n }\n if (relativePath.endsWith('domain.txt')) {\n return { fileType: 'domain', sessionId: partial?.sessionId };\n }\n\n return { fileType: 'other', sessionId: partial?.sessionId };\n}\n","/**\n * FirestoreSink — Per-orbital Firestore persistence as a workspace sink.\n *\n * Takes injected save functions so @almadar/agent stays free of firebase-admin.\n * The server provides concrete implementations via KFlowAccessLayer.\n *\n * Key property: each orbital is its own Firestore document.\n * Two subagents writing different orbitals = zero contention.\n *\n * @packageDocumentation\n */\n\nimport type { WorkspaceSink, FileMeta } from '../types.js';\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\n/**\n * Injected dependencies for FirestoreSink.\n * The server provides these — the agent package has no Firestore dependency.\n */\nexport interface FirestoreSinkConfig {\n /** User ID for Firestore document paths. */\n userId: string;\n /** App ID (may be assigned later on first schema write). */\n appId?: string;\n /** Save a single orbital to its own Firestore document. */\n saveOrbital(orbitalName: string, orbital: unknown): Promise<void>;\n /** Save schema metadata (name, version, config). */\n saveSchema?(schema: unknown): Promise<{ appId: string }>;\n /** Save memory updates (user preferences, project context). */\n saveMemory?(memoryType: string, data: unknown): Promise<void>;\n /** Callback when a new app is created (for SSE event emission). */\n onAppCreated?(appId: string): void;\n}\n\n// ============================================================================\n// FirestoreSink\n// ============================================================================\n\nexport class FirestoreSink implements WorkspaceSink {\n readonly name = 'firestore';\n private readonly config: FirestoreSinkConfig;\n\n constructor(config: FirestoreSinkConfig) {\n this.config = config;\n }\n\n /** Update the appId after it's been assigned (e.g., on first schema write). */\n setAppId(appId: string): void {\n this.config.appId = appId;\n }\n\n async onFileWritten(_path: string, content: string, meta: FileMeta): Promise<void> {\n switch (meta.fileType) {\n case 'orbital': {\n if (!meta.orbitalName) return;\n const orbital = JSON.parse(content);\n await this.config.saveOrbital(meta.orbitalName, orbital);\n break;\n }\n case 'schema': {\n if (!this.config.saveSchema) return;\n const schema = JSON.parse(content);\n const result = await this.config.saveSchema(schema);\n if (result.appId && !this.config.appId) {\n this.config.appId = result.appId;\n this.config.onAppCreated?.(result.appId);\n }\n break;\n }\n case 'memory': {\n if (!this.config.saveMemory) return;\n const data = JSON.parse(content);\n // Derive memory type from the schema name (e.g., \"UserMemory\" → \"user\")\n const memoryType = data?.name?.toLowerCase()?.replace('memory', '') || 'unknown';\n await this.config.saveMemory(memoryType, data);\n break;\n }\n default:\n // Non-persistent file types (domain, other) are not synced to Firestore\n break;\n }\n }\n\n async onSessionEnd(_sessionId: string): Promise<void> {\n // No-op — memory sync is handled by WorkspaceManager.endSession()\n // which writes .orb files first (triggering onFileWritten for memory type).\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@almadar/agent",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "AI agent infrastructure for Almadar orbital schema generation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -43,13 +43,13 @@
|
|
|
43
43
|
"access": "public"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
+
"@almadar/core": ">=2.0.0",
|
|
47
|
+
"@almadar/integrations": ">=2.0.0",
|
|
48
|
+
"@almadar/llm": ">=2.0.0",
|
|
49
|
+
"@almadar/patterns": ">=2.0.0",
|
|
50
|
+
"@almadar/skills": ">=2.0.0",
|
|
46
51
|
"uuid": "^9.0.0",
|
|
47
|
-
"zod": "^3.22.0"
|
|
48
|
-
"@almadar/core": "1.0.17",
|
|
49
|
-
"@almadar/llm": "1.0.17",
|
|
50
|
-
"@almadar/integrations": "1.0.15",
|
|
51
|
-
"@almadar/patterns": "1.1.1",
|
|
52
|
-
"@almadar/skills": "1.4.0"
|
|
52
|
+
"zod": "^3.22.0"
|
|
53
53
|
},
|
|
54
54
|
"peerDependencies": {
|
|
55
55
|
"@langchain/core": ">=1.0.0",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"repository": {
|
|
88
88
|
"type": "git",
|
|
89
89
|
"url": "https://github.com/almadar-io/almadar.git",
|
|
90
|
-
"directory": "packages/
|
|
90
|
+
"directory": "docs/packages/agent"
|
|
91
91
|
},
|
|
92
92
|
"license": "MIT",
|
|
93
93
|
"keywords": [
|
|
@@ -97,6 +97,7 @@
|
|
|
97
97
|
"deepagent",
|
|
98
98
|
"schema-generation"
|
|
99
99
|
],
|
|
100
|
+
"homepage": "https://github.com/almadar-io/almadar#readme",
|
|
100
101
|
"scripts": {
|
|
101
102
|
"build": "tsup",
|
|
102
103
|
"build:watch": "tsup --watch",
|
package/dist/agent/index.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export { E as EVENT_BUDGETS, S as SessionManager, f as SessionManagerOptions, g as Skill, F as SkillAgent, h as SkillAgentOptions, i as SkillAgentResult, j as SkillLoader, k as SkillMeta, l as SkillRefLoader, n as ToolTelemetry, W as WorkflowToolWrapper, p as WorkflowToolWrapperOptions, r as createEvalWorkflowWrapper, s as createSkillAgent, u as createWorkflowToolWrapper, w as getBudgetWarningMessage, x as getEventBudget, y as getInterruptConfig, B as resumeSkillAgent } from '../index-DZn69no8.js';
|
|
2
|
-
export { Command } from '@langchain/langgraph';
|
|
3
|
-
export { P as PersistenceMode, S as SessionMetadata, e as SessionRecord } from '../firestore-checkpointer-CkNKXoun.js';
|
|
4
|
-
import '@almadar/llm';
|
|
5
|
-
import '../orbital-subagent-BdFuf77p.js';
|
|
6
|
-
import '@langchain/core/tools';
|
|
7
|
-
import 'zod';
|
|
8
|
-
import '../api-types-CXrq-fts.js';
|
|
9
|
-
import '@almadar/core/types';
|
|
10
|
-
import '@langchain/langgraph-checkpoint';
|
|
11
|
-
import '@almadar/core';
|
|
12
|
-
import '@langchain/core/messages';
|
|
13
|
-
import '@langchain/core/runnables';
|