kith-coord 0.1.2 → 0.1.4
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/CHANGELOG.md +20 -0
- package/README.md +28 -2
- package/bin/kith-menubar +0 -0
- package/dist/cli/index.js +859 -123
- package/dist/cli/index.js.map +1 -1
- package/dist/command-worker.js +1 -1
- package/dist/command-worker.js.map +1 -1
- package/dist/index.d.ts +56 -15
- package/dist/index.js +110 -9
- package/dist/index.js.map +1 -1
- package/docs/client-validation.md +5 -0
- package/docs/integrations.md +16 -3
- package/docs/protocol/tools.v1.json +125 -1
- package/docs/protocol.md +10 -2
- package/docs/reliability.md +3 -0
- package/docs/roadmap.md +12 -33
- package/docs/usage.md +68 -0
- package/docs/validation/2026-10-22-product-claude.json +38 -0
- package/docs/validation/2026-10-22-product-codex.json +76 -0
- package/package.json +7 -4
- package/server.json +4 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../src/core/workspace-observation.ts","../src/core/repository.ts","../src/core/engine.ts","../src/core/ast-analyzer.ts","../src/core/bash-guard.ts","../src/core/locks.ts","../src/core/glob.ts","../src/core/fencing.ts","../src/core/broker.ts","../src/core/db.ts","../src/core/dep-graph.ts","../src/core/intents.ts","../src/core/merge-train.ts","../src/core/shadow-git.ts","../src/core/worktree-cow.ts","../src/core/observation.ts"],"sourcesContent":["export const KITH_VERSION = '0.1.2';\nexport const KITH_PROTOCOL_VERSION = '1.1.0';\n","import { execFileSync, spawnSync } from 'node:child_process';\nimport type { AgentRecord } from './fencing.js';\nimport { discoverRepository, physicalPath } from './repository.js';\n\nfunction git(cwd: string, ...args: string[]): string {\n return execFileSync('git', ['-c', 'core.fsmonitor=false', ...args], {\n cwd, encoding: 'utf8', env: { ...process.env, GIT_OPTIONAL_LOCKS: '0' },\n stdio: ['ignore','pipe','pipe'], timeout: 5000, maxBuffer: 4 * 1024 * 1024,\n });\n}\nexport interface WorktreeChange { status: string; path: string; originalPath?: string }\nexport function worktreeChanges(cwd: string): WorktreeChange[] {\n const records = git(cwd, 'status', '--porcelain=v1', '-z', '--untracked-files=all').split('\\0');\n const changes: WorktreeChange[] = [];\n for (let i = 0; i < records.length; i++) {\n const record = records[i]; if (!record) continue;\n const change: WorktreeChange = { status: record.slice(0,2), path: record.slice(3) };\n if (/[RC]/.test(change.status)) change.originalPath = records[++i];\n changes.push(change);\n }\n return changes;\n}\nexport interface WorkspaceObservation {\n agentId: string; path: string; recordedBranch: string | null; status: AgentRecord['status'];\n leaseExpired: boolean; lastHeartbeatAt: number; available: boolean; error?: string;\n branch: string | null; head: string | null; comparisonBase: string | null;\n dirtyFiles: WorktreeChange[]; lastCommitAt: number | null; hoursSinceLastCommit: number | null;\n ahead: number | null; behind: number | null; overlaps: Array<{ path: string; agentIds: string[] }>;\n}\n/** Git observation never stages files, checks out branches, fetches, or refreshes the index. */\nexport function observeWorkspaces(repoRoot: string, agents: AgentRecord[], now = Date.now()): WorkspaceObservation[] {\n let base: string | null = null;\n try { base = git(repoRoot, 'rev-parse', '--verify', 'HEAD').trim(); } catch { /* Non-Git or unborn checkout. */ }\n const workspaces = agents.filter(a => a.worktree_path || a.status === 'active').map(a => {\n const result: WorkspaceObservation = { agentId: a.id, path: a.worktree_path ?? repoRoot, recordedBranch: a.branch, status: a.status,\n leaseExpired: a.lease_expires_at <= now, lastHeartbeatAt: a.last_heartbeat_at, available: false,\n branch: null, head: null, comparisonBase: base, dirtyFiles: [], lastCommitAt: null, hoursSinceLastCommit: null, ahead: null, behind: null, overlaps: [] };\n try {\n if (discoverRepository(result.path).commonGitDir !== discoverRepository(repoRoot).commonGitDir) throw new Error('Workspace belongs to another repository');\n result.dirtyFiles = worktreeChanges(result.path);\n result.head = git(result.path, 'rev-parse', '--verify', 'HEAD').trim();\n result.branch = git(result.path, 'branch', '--show-current').trim() || null;\n result.lastCommitAt = Number(git(result.path, 'show', '-s', '--format=%ct', 'HEAD').trim()) * 1000;\n result.hoursSinceLastCommit = Math.max(0, now - result.lastCommitAt) / 3_600_000;\n if (base) {\n const [behind, ahead] = git(result.path, 'rev-list', '--left-right', '--count', `${base}...${result.head}`).trim().split(/\\s+/).map(Number);\n result.ahead = ahead; result.behind = behind;\n }\n result.available = true;\n } catch (error) { result.error = error instanceof Error ? error.message : String(error); }\n return result;\n });\n for (const workspace of workspaces) {\n if (!workspace.available) continue;\n const files = new Set(workspace.dirtyFiles.flatMap(c => [c.path, ...(c.originalPath ? [c.originalPath] : [])]));\n for (const file of files) {\n const peers = workspaces.filter(peer => peer.agentId !== workspace.agentId && peer.status === 'active' && peer.available\n && peer.dirtyFiles.some(c => c.path === file || c.originalPath === file)).map(peer => peer.agentId);\n if (peers.length) workspace.overlaps.push({ path: file, agentIds: peers });\n }\n }\n return workspaces;\n}\n\n/** Preview committed inputs only. merge-tree may write unreachable Git objects, never worktree/index/database contents. */\nexport function previewIntegration(repoRoot: string, agent: AgentRecord) {\n if (!agent.worktree_path || !agent.branch) throw new Error('Integration preview requires a registered worktree and branch');\n const source = discoverRepository(agent.worktree_path), target = discoverRepository(repoRoot);\n if (source.checkoutRoot !== physicalPath(agent.worktree_path) || source.commonGitDir !== target.commonGitDir\n || git(agent.worktree_path, 'branch', '--show-current').trim() !== agent.branch.replace(/^refs\\/heads\\//,'')) {\n throw new Error('Registered source checkout repository or branch does not match');\n }\n const sourceHead = git(agent.worktree_path, 'rev-parse', '--verify', 'HEAD').trim();\n const targetHead = git(repoRoot, 'rev-parse', '--verify', 'HEAD').trim();\n const dirtyFiles = worktreeChanges(agent.worktree_path);\n const targetDirtyFiles = worktreeChanges(repoRoot).filter(change => !(change.status === '??' && target.coordDir === target.checkoutRoot + '/.coord' && change.path.startsWith('.coord/')));\n const sourceBranch=git(agent.worktree_path,'branch','--show-current').trim(), targetBranch=git(repoRoot,'branch','--show-current').trim();\n if(!targetBranch) throw new Error('Integration target must be on a branch');\n if(targetDirtyFiles.length) return {ok:false,clean:null,sourceHead,targetHead,sourceBranch,targetBranch,conflicts:[],dirtyFiles,targetDirtyFiles,reason:'Integration target has local changes. Preserve or commit them before preview.'};\n if (dirtyFiles.length) return { ok: false, clean: null, sourceHead, targetHead, sourceBranch, targetBranch, conflicts: [], dirtyFiles, targetDirtyFiles,\n reason: 'Commit or preserve source changes before preview. Uncommitted edits are not included in a committed-tree preview.' };\n const drivers = spawnSync('git', ['config', '--get-regexp', '^merge\\\\..*\\\\.driver$'], {\n cwd: repoRoot, encoding: 'utf8', timeout: 5000, maxBuffer: 4 * 1024 * 1024,\n });\n if (drivers.error || drivers.status !== 0 && drivers.status !== 1) throw new Error('Cannot inspect merge-driver configuration safely');\n if (drivers.status === 0) throw new Error('Integration preview is unavailable with configured custom merge drivers; they can execute commands');\n const probe = spawnSync('git', ['merge-tree', '--write-tree', '-z', targetHead, sourceHead], {\n cwd: repoRoot, encoding: 'utf8', env: { ...process.env, GIT_OPTIONAL_LOCKS: '0' }, timeout: 10_000, maxBuffer: 4 * 1024 * 1024,\n });\n if (probe.error || probe.status !== 0 && probe.status !== 1) throw new Error(`Git integration preview failed: ${probe.error?.message ?? probe.stderr}`);\n // Conflict stages precede the empty record separating informational messages.\n const stages = probe.stdout.split('\\0').slice(1);\n const boundary = stages.indexOf('');\n const conflicts = [...new Set(stages.slice(0, boundary < 0 ? stages.length : boundary).flatMap(record => {\n const match = /^\\d{6} [0-9a-f]+ [123]\\t([\\s\\S]+)$/.exec(record); return match ? [match[1]] : [];\n }))];\n if (probe.status === 1 && !conflicts.length) throw new Error('Git returned a conflict without identifiable paths; preview is unavailable');\n if (git(repoRoot,'rev-parse','HEAD').trim() !== targetHead || git(agent.worktree_path,'rev-parse','HEAD').trim() !== sourceHead\n || git(repoRoot,'branch','--show-current').trim() !== targetBranch\n || git(agent.worktree_path,'branch','--show-current').trim() !== sourceBranch\n || worktreeChanges(repoRoot).some(change => !(change.status === '??' && target.coordDir === target.checkoutRoot + '/.coord' && change.path.startsWith('.coord/')))\n || worktreeChanges(agent.worktree_path).length) throw new Error('Source or target changed during preview; retry');\n return { ok: true, clean: probe.status === 0, sourceHead, targetHead, sourceBranch, targetBranch, conflicts, dirtyFiles, targetDirtyFiles, verified: false };\n}\n\n","import { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface RepositoryLayout {\n checkoutRoot: string;\n commonGitDir: string | null;\n isLinkedWorktree: boolean;\n coordDir: string;\n}\n\n/** Resolve missing leaves through their nearest existing parent; never hide a broken link. */\nexport function physicalPath(input: string): string {\n if (process.platform === 'win32') input = input.replaceAll('/', path.sep);\n const absolute = path.isAbsolute(input) ? input : process.cwd() + path.sep + input;\n let current = path.parse(absolute).root;\n for (const component of absolute.slice(current.length).split(path.sep)) {\n if (!component || component === '.') continue;\n if (component === '..') { current = path.dirname(current); continue; }\n const candidate = path.join(current, component);\n try {\n fs.lstatSync(candidate);\n current = fs.realpathSync.native(candidate);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;\n // A symlink with a missing target is not a missing leaf.\n try { fs.lstatSync(candidate); throw new Error(`Unresolved symlink: ${candidate}`); }\n catch (statError) { if ((statError as NodeJS.ErrnoException).code !== 'ENOENT') throw statError; }\n current = candidate;\n }\n }\n return current;\n}\n\nexport function isWithin(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative !== '..' && !relative.startsWith('..' + path.sep) && !path.isAbsolute(relative);\n}\n\n/** Resolve a concrete file, including missing leaves, and refuse symlinks leaving the checkout. */\nexport function repositoryFile(root: string, file: string): string {\n if (!file || /[\\x00-\\x1f\\x7f]/u.test(file) || process.platform !== 'win32' && file.includes('\\\\')) throw new Error(`Invalid file path: ${file}`);\n const canonicalRoot = physicalPath(root);\n const target = physicalPath(path.isAbsolute(file) ? file : canonicalRoot + path.sep + file);\n if (!isWithin(canonicalRoot, target) || target === canonicalRoot) {\n throw new Error(`File is outside repository: ${file}`);\n }\n return path.relative(canonicalRoot, target).split(path.sep).join('/');\n}\n\n/** Git's common directory identifies shared coordination; Git operations stay in this checkout. */\nexport function discoverRepository(input: string): RepositoryLayout {\n const directory = fs.realpathSync.native(input);\n if (!fs.statSync(directory).isDirectory()) throw new Error(`Not a directory: ${input}`);\n const git = (...args: string[]) => execFileSync('git', ['rev-parse', ...args], {\n cwd: directory, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'],\n }).replace(/\\r?\\n$/, '');\n try {\n const checkoutRoot = fs.realpathSync(git('--show-toplevel'));\n if (!isWithin(checkoutRoot, directory)) throw new Error('Git routing environment selects a different checkout');\n const commonGitDir = fs.realpathSync(git('--path-format=absolute', '--git-common-dir'));\n const isLinkedWorktree = fs.realpathSync(git('--absolute-git-dir')) !== commonGitDir;\n // Preserve the existing main-checkout .coord location for ordinary repositories.\n // Separate Git directories use their own shared state, independent of checkout location.\n const coordDir = path.basename(commonGitDir) === '.git'\n ? path.join(path.dirname(commonGitDir), '.coord')\n : path.join(commonGitDir, 'kith');\n return { checkoutRoot, commonGitDir, coordDir, isLinkedWorktree };\n } catch (error) {\n // Never silently create an independent coordinator inside a broken/unavailable Git repo.\n const markerExists = (file: string) => {\n try { fs.lstatSync(file); return true; }\n catch (failure) { if ((failure as NodeJS.ErrnoException).code === 'ENOENT') return false; throw failure; }\n };\n for (let current = directory; ; current = path.dirname(current)) {\n if (markerExists(path.join(current, '.git')) || fs.existsSync(path.join(current, 'HEAD')) && fs.existsSync(path.join(current, 'objects'))) {\n throw new Error(`Cannot discover Git repository at ${directory}: ${error instanceof Error ? error.message : String(error)}`);\n }\n if (path.dirname(current) === current) break;\n }\n if (process.env.GIT_DIR || process.env.GIT_WORK_TREE || process.env.GIT_COMMON_DIR) throw error;\n return { checkoutRoot: directory, commonGitDir: null, coordDir: path.join(directory, '.coord'), isLinkedWorktree: false };\n }\n}\n\n/** Read-only probe using an existing directory; uncertain results retain exclusion. */\nexport function caseSensitivePaths(root: string): boolean {\n for (let current = physicalPath(root); path.dirname(current) !== current; current = path.dirname(current)) {\n const name = path.basename(current);\n const variant = name.replace(/[a-zA-Z]/, c => c === c.toLowerCase() ? c.toUpperCase() : c.toLowerCase());\n if (variant === name) continue;\n try {\n const original = fs.statSync(current);\n const alias = fs.statSync(path.join(path.dirname(current), variant));\n return original.dev !== alias.dev || original.ino !== alias.ino;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return true;\n return false;\n }\n }\n return false;\n}\n","import { KITH_PROTOCOL_VERSION } from '../version.js';\nimport { observeWorkspaces, previewIntegration } from './workspace-observation.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { AstAnalyzer, ExtractedSymbol } from './ast-analyzer.js';\nimport { BashMerkleGuard } from './bash-guard.js';\nimport { ResourceBroker } from './broker.js';\nimport { CoordDatabase, CoordEvent } from './db.js';\nimport {\n BlastRadiusAlert,\n DependencyAndContractEngine,\n FileModificationReport,\n} from './dep-graph.js';\nimport { FencingAndAgentManager } from './fencing.js';\nimport { IntentAndTaskEngine } from './intents.js';\nimport { LockEngine } from './locks.js';\nimport { SpeculativeMergeTrain } from './merge-train.js';\nimport { ConflictRecord, ShadowGitEngine } from './shadow-git.js';\nimport { CoWWorktreeManager } from './worktree-cow.js';\n\nexport interface AgentUnreadDelta {\n events: CoordEvent[];\n activeConflicts: ConflictRecord[];\n formattedFooter: string;\n}\n\nexport interface PostFileEditHookResult {\n filePath: string;\n contractReport: FileModificationReport;\n dirtyMergeConflicts: ConflictRecord[];\n warnings: string[];\n}\n\nexport class KithEngine {\n public readonly coordDb: CoordDatabase;\n public readonly fencing: FencingAndAgentManager;\n public readonly locks: LockEngine;\n public readonly intents: IntentAndTaskEngine;\n public readonly depGraph: DependencyAndContractEngine;\n public readonly shadowGit: ShadowGitEngine;\n public readonly worktrees: CoWWorktreeManager;\n public readonly mergeTrain: SpeculativeMergeTrain;\n public readonly bashGuard: BashMerkleGuard;\n public readonly broker: ResourceBroker;\n\n constructor(repoRoot = process.cwd(), customDbPath?: string) {\n this.coordDb = new CoordDatabase(repoRoot, customDbPath);\n this.fencing = new FencingAndAgentManager(this.coordDb);\n this.locks = new LockEngine(this.coordDb, this.fencing);\n this.intents = new IntentAndTaskEngine(this.coordDb, this.fencing, this.locks);\n this.depGraph = new DependencyAndContractEngine(this.coordDb, this.locks, this.fencing);\n this.shadowGit = new ShadowGitEngine(this.coordDb, this.fencing);\n this.worktrees = new CoWWorktreeManager(this.coordDb, this.fencing);\n this.mergeTrain = new SpeculativeMergeTrain(this.coordDb, this.fencing);\n this.bashGuard = new BashMerkleGuard(\n this.coordDb,\n this.fencing,\n this.locks,\n this.depGraph,\n this.shadowGit\n );\n this.broker = new ResourceBroker(this.coordDb, this.fencing);\n }\n\n /**\n * Executes the complete PostToolUse pipeline whenever an agent writes or edits a file:\n * 1. Extracts AST exports/imports and updates the Contract Blackboard & Import Graph\n * 2. Computes transitive breaking-change blast radius across downstream dependent files\n * 3. Updates the agent's shadow Git index (`GIT_INDEX_FILE`) and runs `git merge-tree` against sibling dirty trees\n */\n public processPostFileEdit(params: {\n agentId: string;\n filePath: string;\n content?: string;\n worktreeDir?: string;\n }): PostFileEditHookResult {\n this.fencing.heartbeat(params.agentId);\n const targetRoot = params.worktreeDir ?? this.fencing.getAgent(params.agentId)?.worktree_path ?? this.coordDb.repoRoot;\n const file = LockEngine.normalizeFile(targetRoot, params.filePath);\n const access = this.locks.checkFileWriteAccess({ agentId: params.agentId, filePath: file });\n if (!access.allowed) throw new Error(access.reason);\n const content = params.content ?? (fs.existsSync(path.join(targetRoot, file)) ? fs.readFileSync(path.join(targetRoot, file), 'utf8') : '');\n\n const contractReport = this.depGraph.recordFileModification(\n params.agentId,\n file,\n content\n );\n\n const mergeProbe = this.shadowGit.probeAllActiveConflicts(\n params.agentId,\n [{ filePath: file, content }],\n targetRoot\n );\n\n const warnings: string[] = [];\n // Advisory only: matching names do not establish equivalent behavior.\n const existingSymbols = this.coordDb.db.prepare(`\n SELECT peer.symbol_name, peer.kind, peer.file_path\n FROM contracts AS edited JOIN contracts AS peer\n ON peer.symbol_name = edited.symbol_name COLLATE BINARY AND peer.kind = edited.kind\n WHERE edited.file_path = ? AND peer.file_path != edited.file_path\n ORDER BY peer.symbol_name, peer.file_path\n `).all(file) as Array<{ symbol_name: string; kind: string; file_path: string }>;\n for (const symbol of existingSymbols) {\n warnings.push(`[EXISTING SYMBOL] '${symbol.symbol_name}' (${symbol.kind}) is also recorded in '${symbol.file_path}'. Consider reuse if it serves the same purpose.`);\n }\n\n for (const brk of contractReport.breakingChanges) {\n const targetWho = brk.affectedAgentId\n ? ` (actively locked by agent '${brk.affectedAgentId}')`\n : '';\n warnings.push(\n `[BLAST RADIUS ALERT] Breaking signature change on '${brk.symbolName}' in '${brk.modifiedFile}' impacts downstream consumer '${brk.affectedDownstreamFile}' (${brk.hopDistance} hop(s) away)${targetWho}.`\n );\n }\n\n for (const conf of mergeProbe.conflicts) {\n const peer = conf.agent_a === params.agentId ? conf.agent_b : conf.agent_a;\n warnings.push(\n `[LIVE DIRTY-TREE CONFLICT] Uncommitted changes in '${conf.file_path}' conflict with active agent '${peer}' (${conf.severity}: ${conf.details.reason}).`\n );\n }\n\n return {\n filePath: file,\n contractReport,\n dirtyMergeConflicts: mergeProbe.conflicts,\n warnings,\n };\n }\n\n /**\n * Consumes unread coordination events and active conflicts for `agentId` since its last tool call\n * and formats a concise context-delta footer to append to MCP/CLI responses.\n */\n public consumeAgentDelta(agentId: string): AgentUnreadDelta {\n this.fencing.assertSession(agentId);\n const agent = this.fencing.getAgent(agentId);\n const sinceId = agent?.last_seen_event_id ?? 0;\n const page = this.coordDb.getEventsSince(sinceId, 50);\n const allNewEvents = page.filter((e) => e.agent_id !== agentId);\n\n const deliveredId = page.at(-1)?.id ?? sinceId;\n if (agent && deliveredId > sinceId) {\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(agentId);\n this.coordDb.db.prepare(`UPDATE agents SET last_seen_event_id = ? WHERE id = ?`).run(deliveredId, agentId);\n });\n }\n\n const activeConflicts = this.shadowGit\n .listConflicts()\n .filter(\n (c) =>\n c.agent_a === agentId || c.agent_b === agentId\n );\n\n const lines: string[] = [];\n for (const ev of allNewEvents) {\n if (\n ev.event_type === 'contracts_updated' ||\n ev.event_type === 'contract_published' ||\n ev.event_type === 'contract_breaking_change' ||\n ev.event_type === 'intent_declared'\n ) {\n lines.push(`• [${ev.event_type}] by ${ev.agent_id ?? 'system'}: ${JSON.stringify(ev.payload)}`);\n }\n }\n\n for (const c of activeConflicts) {\n const peer = c.agent_a === agentId ? c.agent_b : c.agent_a;\n lines.push(\n `• [ACTIVE CONFLICT] ${c.file_path} with agent '${peer}' (${c.severity}: ${c.details.reason})`\n );\n }\n\n const formattedFooter =\n lines.length > 0\n ? `\\n\\n--- KITH LIVE SIBLING DELTA ---\\n${lines.join('\\n')}`\n : '';\n\n return {\n events: allNewEvents,\n activeConflicts,\n formattedFooter,\n };\n }\n\n public getStatus() {\n const agents = this.fencing.listAgents(true);\n return {\n protocolVersion: KITH_PROTOCOL_VERSION,\n repository: { root: this.coordDb.repoRoot, commonGitDir: this.coordDb.commonGitDir, coordDir: this.coordDb.coordDir },\n runtime: { node: process.version }, fencingEpoch: this.coordDb.currentFencingEpoch(),\n agents, locks: this.locks.listLocks(), tasks: this.intents.listTasks(),\n conflicts: this.shadowGit.listConflicts(), contracts: this.depGraph.listContracts(), resources: this.broker.listResources(),\n mergeQueue: this.mergeTrain.listQueue(), quarantined: this.bashGuard.listQuarantined(),\n mutexWaiters: this.coordDb.db.prepare('SELECT ticket,mutex_name,owner_agent_id,session_epoch,expires_at FROM mutex_waiters ORDER BY ticket').all(),\n commandGuards: this.coordDb.db.prepare('SELECT mutex_name,owner_agent_id,worker_pid,supervisor_pid FROM mutex_runs ORDER BY mutex_name').all(),\n workspaces: observeWorkspaces(this.coordDb.repoRoot, agents),\n };\n }\n\n public previewIntegration(agentId: string) {\n this.fencing.assertSession(agentId);\n return previewIntegration(this.coordDb.repoRoot, this.fencing.getAgent(agentId)!);\n }\n\n public beginWork(params: Parameters<IntentAndTaskEngine['declareIntent']>[0] & { isolateWorktree?: boolean }) {\n const intent = this.intents.declareIntent(params);\n const worktree = intent.ok && params.isolateWorktree\n ? this.worktrees.spawnWorktree({ agentId: params.agentId }) : null;\n return { ...intent, worktree };\n }\n\n public completeWork(params: {\n agentId: string; taskId?: string; fencingToken?: number;\n mergeBranch?: string; verificationCmd?: string;\n }) {\n this.fencing.assertSession(params.agentId);\n const agent = this.fencing.getAgent(params.agentId);\n const branch = params.mergeBranch ?? agent?.branch;\n const mergeResult = branch ? this.mergeTrain.enqueueAndMerge({\n agentId: params.agentId, branch, worktreePath: agent?.worktree_path,\n verificationCmd: params.verificationCmd,\n }) : null;\n if (mergeResult && !mergeResult.merged) return {\n ok: false, mergeResult,\n error: 'Speculative merge train failed. Fix the reported issues before completing work.',\n };\n // Retain worktrees for inspection; release ownership only after integration succeeds.\n const completedTasks = this.intents.completeTask(params);\n this.fencing.completeAgentSession(params.agentId);\n return { ok: true, completedTasks, mergeResult };\n }\n\n public close(): void {\n if (this.broker.hasActiveCommands()) throw new Error('Await or cancel active mutex commands before closing Kith');\n this.coordDb.close();\n }\n}\n\nexport {\n AstAnalyzer,\n ExtractedSymbol,\n BashMerkleGuard,\n ResourceBroker,\n CoordDatabase,\n CoordEvent,\n DependencyAndContractEngine,\n BlastRadiusAlert,\n FileModificationReport,\n FencingAndAgentManager,\n IntentAndTaskEngine,\n LockEngine,\n SpeculativeMergeTrain,\n ShadowGitEngine,\n ConflictRecord,\n CoWWorktreeManager,\n};\n","import { repositoryFile } from './repository.js';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport type SymbolKind =\n | 'function'\n | 'type'\n | 'interface'\n | 'class'\n | 'schema'\n | 'route'\n | 'const';\n\nexport interface ExtractedSymbol {\n symbolName: string;\n kind: SymbolKind;\n signature: string;\n astHash: string;\n paramsFingerprint: string;\n docComment: string;\n}\n\nexport interface ExtractedImport {\n rawSpecifier: string;\n resolvedPath: string | null;\n importedSymbols: string[];\n}\n\nexport interface FileAstAnalysis {\n filePath: string;\n fileHash: string;\n exports: ExtractedSymbol[];\n imports: ExtractedImport[];\n}\n\nexport class AstAnalyzer {\n /**\n * Analyzes a source file's content to extract exported contracts (functions, types,\n * interfaces, schemas, routes) and imported module dependencies.\n */\n public static analyzeSource(\n repoRoot: string,\n filePath: string,\n sourceContent?: string\n ): FileAstAnalysis {\n const relPath = repositoryFile(repoRoot, filePath);\n const absPath = path.join(repoRoot, relPath);\n const content = sourceContent ?? (fs.existsSync(absPath) ? fs.readFileSync(absPath, 'utf8') : '');\n const fileHash = crypto.createHash('sha256').update(content).digest('hex').slice(0, 16);\n\n const exports = AstAnalyzer.extractExports(content);\n const imports = AstAnalyzer.extractImports(repoRoot, relPath, content);\n\n return {\n filePath: relPath,\n fileHash,\n exports,\n imports,\n };\n }\n\n public static extractExports(content: string): ExtractedSymbol[] {\n const results = new Map<string, ExtractedSymbol>();\n const lines = content.split(/\\r?\\n/);\n\n const getPrecedingDoc = (lineIndex: number): string => {\n const comments: string[] = [];\n let i = lineIndex - 1;\n while (i >= 0) {\n const trimmed = lines[i].trim();\n if (\n trimmed.startsWith('//') ||\n trimmed.startsWith('*') ||\n trimmed.startsWith('/*') ||\n trimmed.startsWith('*/') ||\n trimmed.startsWith('#')\n ) {\n comments.unshift(\n trimmed\n .replace(/^(\\/\\/+|\\/\\*+|\\*+\\/|#|\\*)\\s?/, '')\n .trim()\n );\n i--;\n } else if (trimmed === '') {\n break;\n } else {\n break;\n }\n }\n return comments.filter(Boolean).join(' ').slice(0, 240);\n };\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('//') || trimmed.startsWith('/*')) continue;\n\n // 1. Exported TS/JS function: export [async] function name<T>(params): ReturnType\n const fnMatch = trimmed.match(\n /^export\\s+(?:default\\s+)?(?:async\\s+)?function\\s+([A-Za-z0-9_$]+)\\s*(?:<[^>]*>)?\\s*\\(([^)]*)\\)\\s*(?::\\s*([^{;]+))?/\n );\n if (fnMatch) {\n const [, name, rawParams, rawReturn] = fnMatch;\n const cleanReturn = (rawReturn ?? 'unknown').trim();\n const sig = `function ${name}(${AstAnalyzer.normalizeWhitespace(rawParams)}): ${cleanReturn}`;\n const kind: SymbolKind = /^(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)$/.test(name)\n ? 'route'\n : 'function';\n results.set(name, {\n symbolName: name,\n kind,\n signature: sig,\n astHash: AstAnalyzer.hashSignature(sig),\n paramsFingerprint: AstAnalyzer.computeParamsFingerprint(rawParams, cleanReturn),\n docComment: getPrecedingDoc(i),\n });\n continue;\n }\n\n // 2. Exported arrow function: export const name = [async] (params): ReturnType =>\n const arrowMatch = trimmed.match(\n /^export\\s+const\\s+([A-Za-z0-9_$]+)\\s*(?::\\s*[^=]+)?=\\s*(?:async\\s+)?(?:\\(([^)]*)\\)|([A-Za-z0-9_$]+))\\s*(?::\\s*([^=]+?))?\\s*=>/\n );\n if (arrowMatch) {\n const [, name, tupleParams, singleParam, rawReturn] = arrowMatch;\n const rawParams = tupleParams ?? singleParam ?? '';\n const cleanReturn = (rawReturn ?? 'unknown').trim();\n const sig = `function ${name}(${AstAnalyzer.normalizeWhitespace(rawParams)}): ${cleanReturn}`;\n results.set(name, {\n symbolName: name,\n kind: 'function',\n signature: sig,\n astHash: AstAnalyzer.hashSignature(sig),\n paramsFingerprint: AstAnalyzer.computeParamsFingerprint(rawParams, cleanReturn),\n docComment: getPrecedingDoc(i),\n });\n continue;\n }\n\n // 3. Exported interface: export interface Name { ... }\n const ifaceMatch = trimmed.match(\n /^export\\s+interface\\s+([A-Za-z0-9_$]+)(?:\\s*<[^>]*>)?(?:\\s+extends\\s+[^{]+)?\\s*\\{/\n );\n if (ifaceMatch) {\n const name = ifaceMatch[1];\n const bodyFields = AstAnalyzer.extractBracedBlockSummary(lines, i);\n const sig = `interface ${name} { ${bodyFields} }`;\n results.set(name, {\n symbolName: name,\n kind: 'interface',\n signature: sig,\n astHash: AstAnalyzer.hashSignature(sig),\n paramsFingerprint: `interface:${AstAnalyzer.extractFieldTypesFingerprint(bodyFields)}`,\n docComment: getPrecedingDoc(i),\n });\n continue;\n }\n\n // 4. Exported type alias: export type Name = ...\n const typeMatch = trimmed.match(/^export\\s+type\\s+([A-Za-z0-9_$]+)(?:\\s*<[^>]*>)?\\s*=\\s*(.+)$/);\n if (typeMatch) {\n const [, name, rhs] = typeMatch;\n const fullRhs = rhs.includes('{') && !rhs.includes('}')\n ? `{ ${AstAnalyzer.extractBracedBlockSummary(lines, i)} }`\n : rhs.replace(/;$/, '').trim();\n const sig = `type ${name} = ${AstAnalyzer.normalizeWhitespace(fullRhs)}`;\n results.set(name, {\n symbolName: name,\n kind: 'type',\n signature: sig,\n astHash: AstAnalyzer.hashSignature(sig),\n paramsFingerprint: `type:${AstAnalyzer.normalizeWhitespace(fullRhs)}`,\n docComment: getPrecedingDoc(i),\n });\n continue;\n }\n\n // 5. Exported class: export class Name\n const classMatch = trimmed.match(\n /^export\\s+(?:default\\s+)?(?:abstract\\s+)?class\\s+([A-Za-z0-9_$]+)/\n );\n if (classMatch) {\n const name = classMatch[1];\n const sig = `class ${name}`;\n results.set(name, {\n symbolName: name,\n kind: 'class',\n signature: sig,\n astHash: AstAnalyzer.hashSignature(sig),\n paramsFingerprint: `class:${name}`,\n docComment: getPrecedingDoc(i),\n });\n continue;\n }\n\n // 6. Exported Zod/Valibot/Drizzle schema or constant: export const NameSchema = ...\n const constMatch = trimmed.match(\n /^export\\s+const\\s+([A-Za-z0-9_$]+)\\s*(?::\\s*([^=]+))?\\s*=\\s*(.+)$/\n );\n if (constMatch) {\n const [, name, explicitType, rhs] = constMatch;\n const isSchema = /Schema$|z\\.|pgTable|sqliteTable|mysqlTable/.test(name + rhs);\n const kind: SymbolKind = isSchema ? 'schema' : 'const';\n const sig = `const ${name}: ${(explicitType ?? rhs.slice(0, 60)).replace(/;$/, '').trim()}`;\n results.set(name, {\n symbolName: name,\n kind,\n signature: sig,\n astHash: AstAnalyzer.hashSignature(sig),\n paramsFingerprint: `${kind}:${name}`,\n docComment: getPrecedingDoc(i),\n });\n continue;\n }\n\n // 7. Python top-level function: def name(params) -> ReturnType:\n const pyFnMatch = line.match(\n /^(?:async\\s+)?def\\s+([a-zA-Z0-9_]+)\\s*\\(([^)]*)\\)\\s*(?:->\\s*([^:]+))?:/\n );\n if (pyFnMatch && !pyFnMatch[1].startsWith('_')) {\n const [, name, rawParams, rawRet] = pyFnMatch;\n const ret = (rawRet ?? 'Any').trim();\n const sig = `def ${name}(${AstAnalyzer.normalizeWhitespace(rawParams)}) -> ${ret}`;\n results.set(name, {\n symbolName: name,\n kind: 'function',\n signature: sig,\n astHash: AstAnalyzer.hashSignature(sig),\n paramsFingerprint: AstAnalyzer.computeParamsFingerprint(rawParams, ret),\n docComment: getPrecedingDoc(i),\n });\n }\n }\n\n return Array.from(results.values());\n }\n\n public static extractImports(\n repoRoot: string,\n sourceRelPath: string,\n content: string\n ): ExtractedImport[] {\n const imports: ExtractedImport[] = [];\n const importRegex =\n /(?:import\\s+(?:type\\s+)?(?:(\\{[^}]*\\})|([A-Za-z0-9_$*]+))?\\s*(?:,\\s*(\\{[^}]*\\}))?\\s*from\\s+['\"]([^'\"]+)['\"]|export\\s+(?:\\*|\\{[^}]*\\})\\s+from\\s+['\"]([^'\"]+)['\"]|require\\(\\s*['\"]([^'\"]+)['\"]\\s*\\))/g;\n\n let match: RegExpExecArray | null;\n while ((match = importRegex.exec(content)) !== null) {\n const namedBlock = match[1] ?? match[3] ?? '';\n const defaultIdent = match[2] ?? '';\n const specifier = match[4] ?? match[5] ?? match[6] ?? '';\n if (!specifier) continue;\n\n const symbols: string[] = [];\n if (defaultIdent) symbols.push(defaultIdent.trim());\n if (namedBlock) {\n const inner = namedBlock.replace(/[{}]/g, '');\n for (const part of inner.split(',')) {\n const clean = part.trim().split(/\\s+as\\s+/)[0].replace(/^type\\s+/, '').trim();\n if (clean) symbols.push(clean);\n }\n }\n\n const resolvedPath = AstAnalyzer.resolveRelativeImport(\n repoRoot,\n sourceRelPath,\n specifier\n );\n\n imports.push({\n rawSpecifier: specifier,\n resolvedPath,\n importedSymbols: symbols,\n });\n }\n\n return imports;\n }\n\n public static resolveRelativeImport(\n repoRoot: string,\n sourceRelPath: string,\n specifier: string\n ): string | null {\n if (!specifier.startsWith('.')) {\n return null;\n }\n\n const sourceDir = path.dirname(path.join(repoRoot, sourceRelPath));\n // Strip .js / .jsx extension often used in TypeScript ESM imports\n const baseTarget = path.resolve(sourceDir, specifier.replace(/\\.(js|jsx|mjs|cjs)$/, ''));\n\n const candidates = [\n path.resolve(sourceDir, specifier),\n `${baseTarget}.ts`,\n `${baseTarget}.tsx`,\n `${baseTarget}.js`,\n `${baseTarget}.mjs`,\n path.join(baseTarget, 'index.ts'),\n path.join(baseTarget, 'index.tsx'),\n path.join(baseTarget, 'index.js'),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) {\n try { return repositoryFile(repoRoot, candidate); } catch { return null; }\n }\n }\n\n // Even if target file hasn't been flushed to disk yet, infer `.ts` relative path\n const inferred = `${baseTarget}.ts`;\n try { return repositoryFile(repoRoot, inferred); } catch { return null; }\n }\n\n private static extractBracedBlockSummary(lines: string[], startIndex: number): string {\n const fields: string[] = [];\n let depth = 0;\n for (let i = startIndex; i < Math.min(lines.length, startIndex + 35); i++) {\n const line = lines[i];\n for (const ch of line) {\n if (ch === '{') depth++;\n else if (ch === '}') depth--;\n }\n if (i > startIndex && depth >= 1) {\n const clean = line.trim().replace(/;$/, '').replace(/,$/, '');\n if (clean && !clean.startsWith('//') && clean !== '}') {\n fields.push(clean);\n }\n }\n if (depth <= 0 && i >= startIndex && line.includes('}')) {\n break;\n }\n }\n return fields.join('; ');\n }\n\n private static extractFieldTypesFingerprint(bodyFields: string): string {\n return bodyFields\n .split(';')\n .map((f) => {\n const parts = f.split(':');\n return parts.length > 1 ? parts[1].trim().toLowerCase() : f.trim().toLowerCase();\n })\n .filter(Boolean)\n .sort()\n .join(',');\n }\n\n public static computeParamsFingerprint(rawParams: string, rawReturn: string): string {\n const paramTypes = rawParams\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean)\n .map((p) => {\n const colonIdx = p.indexOf(':');\n if (colonIdx === -1) return 'any';\n return p\n .slice(colonIdx + 1)\n .replace(/=.*$/, '')\n .trim()\n .toLowerCase();\n });\n\n const retNorm = rawReturn\n .replace(/^Promise<(.+)>$/, '$1')\n .trim()\n .toLowerCase();\n\n return `(${paramTypes.join(',')})->${retNorm}`;\n }\n\n private static normalizeWhitespace(s: string): string {\n return s.replace(/\\s+/g, ' ').trim();\n }\n\n private static hashSignature(sig: string): string {\n return crypto.createHash('sha256').update(sig).digest('hex').slice(0, 16);\n }\n}\n","import crypto from 'node:crypto';\nimport { physicalPath } from './repository.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { CoordDatabase } from './db.js';\nimport { DependencyAndContractEngine } from './dep-graph.js';\nimport { FencingAndAgentManager } from './fencing.js';\nimport { LockEngine } from './locks.js';\nimport { ShadowGitEngine } from './shadow-git.js';\n\nexport interface FileSnapshotEntry {\n relPath: string;\n mtimeMs: number;\n size: number;\n sha256: string;\n lockedByOther: boolean;\n backupContentBase64?: string;\n}\n\nexport interface QuarantineRecord {\n id: string;\n agent_id: string;\n command: string;\n file_path: string;\n patch_path: string;\n reason: string;\n created_at: number;\n}\n\nexport interface BashGuardPostReport {\n allowed: boolean;\n authorizedModifiedFiles: string[];\n quarantinedViolations: QuarantineRecord[];\n}\n\nconst GIT_PREFIX = String.raw`\\bgit(?:\\s+(?:-C|-c|--git-dir|--work-tree)(?:=|\\s+)(?:\"[^\"]*\"|'[^']*'|[^\\s;&|]+)|\\s+--(?:no-pager|literal-pathspecs|no-optional-locks))*\\s+`;\nconst DESTRUCTIVE_SHARED_TREE = new RegExp(GIT_PREFIX + String.raw`(?:reset|clean|checkout|restore|switch|stash|merge|rebase|pull|cherry-pick|revert|am)\\b`);\nconst DESTRUCTIVE_SHARED_REFS = new RegExp(GIT_PREFIX + String.raw`(?:update-ref|symbolic-ref|worktree\\s+(?:remove|prune)|branch\\s+(?:-[dDmMfF]|--(?:delete|move|force)))\\b`);\n\nexport class BashMerkleGuard {\n constructor(\n private readonly coordDb: CoordDatabase,\n private readonly fencing: FencingAndAgentManager,\n private readonly lockEngine: LockEngine,\n private readonly depGraph: DependencyAndContractEngine,\n private readonly shadowGit: ShadowGitEngine\n ) {}\n\n /**\n * Checks whether a shell command is safe to execute in the workspace.\n */\n public checkCommandSafety(params: {\n agentId: string;\n command: string;\n inIsolatedWorktree?: boolean;\n }): { safe: boolean; reason?: string } {\n this.fencing.assertSession(params.agentId);\n const root = physicalPath(this.fencing.getAgent(params.agentId)?.worktree_path ?? this.coordDb.repoRoot);\n const peers = this.fencing.listAgents(true).filter(a => a.id !== params.agentId);\n const sharesCheckout = peers.some(a => physicalPath(a.worktree_path ?? this.coordDb.repoRoot) === root);\n if (peers.length && DESTRUCTIVE_SHARED_REFS.test(params.command) || sharesCheckout && DESTRUCTIVE_SHARED_TREE.test(params.command)) {\n return { safe: false, reason: 'Git operation can replace shared work or refs while peer agents are active. Coordinate the operation before retrying.' };\n }\n\n return { safe: true };\n }\n\n private getSnapshotFilePath(agentId: string): string {\n const epoch = this.fencing.assertSession(agentId);\n const safeId = crypto.createHash('sha256').update(`${agentId}:${epoch}`).digest('hex');\n return path.join(this.coordDb.coordDir, 'snapshots', `${safeId}.json`);\n }\n\n /**\n * Captures a Merkle snapshot of workspace files before a Bash tool execution.\n * For any file locked by another active agent, stores a full lossless backup so\n * unauthorized mutations by bash scripts (`sed`, `python`, etc.) can be reverted atomically.\n */\n public capturePreBashSnapshot(agentId: string, rootDir = this.coordDb.repoRoot): string {\n const activeLocks = this.lockEngine\n .listLocks()\n .filter((l) => l.owner_agent_id !== agentId);\n\n const entries: Record<string, FileSnapshotEntry> = {};\n const files = this.walkWorkspaceFiles(rootDir);\n\n for (const absPath of files) {\n const relPath = path.relative(rootDir, absPath).replace(/\\\\/g, '/');\n const stat = fs.statSync(absPath);\n if (stat.size > 5 * 1024 * 1024) continue; // Skip >5MB binaries\n\n const buf = fs.readFileSync(absPath);\n const sha256 = crypto.createHash('sha256').update(buf).digest('hex');\n const lockedByOther = activeLocks.some((l) =>\n LockEngine.patternsOverlap(relPath, l.pattern)\n );\n\n entries[relPath] = {\n relPath,\n mtimeMs: stat.mtimeMs,\n size: stat.size,\n sha256,\n lockedByOther,\n backupContentBase64: lockedByOther ? buf.toString('base64') : undefined,\n };\n }\n\n const snapPath = this.getSnapshotFilePath(agentId);\n fs.writeFileSync(\n snapPath,\n JSON.stringify({ timestamp: Date.now(), rootDir, entries }),\n { encoding: 'utf8', mode: 0o600 }\n );\n return snapPath;\n }\n\n /**\n * Compares workspace state after a Bash command completes against the pre-Bash Merkle snapshot.\n * Saves recovery copies of edits to files locked by sibling agents. Restoration is opt-in,\n * and indexes authorized modifications into the AST Contract Blackboard & Dirty-Tree Conflict Radar.\n */\n public verifyPostBashAndQuarantine(params: {\n agentId: string;\n command: string;\n rootDir?: string;\n restoreLockedFiles?: boolean;\n }): BashGuardPostReport {\n const snapPath = this.getSnapshotFilePath(params.agentId);\n if (!fs.existsSync(snapPath)) {\n return { allowed: true, authorizedModifiedFiles: [], quarantinedViolations: [] };\n }\n\n const rawSnap = JSON.parse(fs.readFileSync(snapPath, 'utf8')) as {\n timestamp: number;\n rootDir: string;\n entries: Record<string, FileSnapshotEntry>;\n };\n const rootDir = params.rootDir ?? rawSnap.rootDir ?? this.coordDb.repoRoot;\n const beforeEntries = rawSnap.entries;\n\n const currentFiles = this.walkWorkspaceFiles(rootDir);\n const seenCurrentRelPaths = new Set<string>();\n const authorizedModifiedFiles: string[] = [];\n const quarantinedViolations: QuarantineRecord[] = [];\n\n for (const absPath of currentFiles) {\n const relPath = path.relative(rootDir, absPath).replace(/\\\\/g, '/');\n seenCurrentRelPaths.add(relPath);\n const stat = fs.statSync(absPath);\n if (stat.size > 5 * 1024 * 1024) continue;\n\n const prev = beforeEntries[relPath];\n if (prev && prev.mtimeMs === stat.mtimeMs && prev.size === stat.size) {\n continue;\n }\n\n const buf = fs.readFileSync(absPath);\n const sha256 = crypto.createHash('sha256').update(buf).digest('hex');\n if (prev && prev.sha256 === sha256) {\n continue;\n }\n\n // File was created or modified during the bash command!\n const access = this.lockEngine.checkFileWriteAccess({\n agentId: params.agentId,\n filePath: relPath,\n });\n\n if (!access.allowed) {\n const violation = this.quarantineAndRevertFile({\n agentId: params.agentId,\n command: params.command,\n rootDir,\n relPath,\n unauthorizedBuf: buf,\n restoreLockedFiles: params.restoreLockedFiles ?? false,\n prevEntry: prev ?? null,\n reason: access.reason ?? 'Locked by another agent',\n });\n quarantinedViolations.push(violation);\n } else {\n authorizedModifiedFiles.push(relPath);\n }\n }\n\n // Also check if any previously existing file was deleted by the bash command\n for (const [relPath, prev] of Object.entries(beforeEntries)) {\n if (!seenCurrentRelPaths.has(relPath)) {\n const access = this.lockEngine.checkFileWriteAccess({\n agentId: params.agentId,\n filePath: relPath,\n });\n if (!access.allowed) {\n const violation = this.quarantineAndRevertFile({\n agentId: params.agentId,\n command: params.command,\n rootDir,\n relPath,\n unauthorizedBuf: null,\n restoreLockedFiles: params.restoreLockedFiles ?? false,\n prevEntry: prev,\n reason: access.reason ?? 'Deleted file locked by another agent',\n });\n quarantinedViolations.push(violation);\n } else {\n authorizedModifiedFiles.push(relPath);\n }\n }\n }\n\n // Clean up snapshot file\n try {\n fs.unlinkSync(snapPath);\n } catch {\n // Ignore\n }\n\n // Update AST contracts and shadow git tree for authorized modifications\n if (authorizedModifiedFiles.length > 0) {\n for (const relFile of authorizedModifiedFiles) {\n const absFile = path.join(rootDir, relFile);\n if (fs.existsSync(absFile) && /\\.(ts|tsx|js|jsx|mjs|py)$/.test(relFile)) {\n this.depGraph.recordFileModification(params.agentId, relFile, fs.readFileSync(absFile, 'utf8'));\n }\n }\n this.shadowGit.probeAllActiveConflicts(\n params.agentId,\n authorizedModifiedFiles.map((f) => ({ filePath: f })),\n rootDir\n );\n }\n\n return {\n allowed: quarantinedViolations.length === 0,\n authorizedModifiedFiles,\n quarantinedViolations,\n };\n }\n\n private quarantineAndRevertFile(params: {\n agentId: string;\n command: string;\n rootDir: string;\n relPath: string;\n unauthorizedBuf: Buffer | null;\n restoreLockedFiles: boolean;\n prevEntry: FileSnapshotEntry | null;\n reason: string;\n }): QuarantineRecord {\n const id = `quar_${crypto.randomBytes(6).toString('hex')}`;\n const now = Date.now();\n const safeName = params.relPath.replace(/[^a-zA-Z0-9._-]/g, '_');\n const patchPath = path.join(\n this.coordDb.coordDir,\n 'quarantine',\n `${id}_${safeName}.quarantine`\n );\n\n if (params.unauthorizedBuf) {\n fs.writeFileSync(patchPath, params.unauthorizedBuf, { mode: 0o600 });\n } else {\n fs.writeFileSync(patchPath, `[DELETED BY COMMAND: ${params.command}]\\n`, { encoding: 'utf8', mode: 0o600 });\n }\n\n if (params.prevEntry?.backupContentBase64 !== undefined) {\n fs.writeFileSync(patchPath + '.before', Buffer.from(params.prevEntry.backupContentBase64, 'base64'), { mode: 0o600 });\n }\n const absTarget = path.join(params.rootDir, params.relPath);\n if (params.restoreLockedFiles && params.prevEntry === null) {\n // Newly created unauthorized file -> remove it\n if (fs.existsSync(absTarget)) {\n fs.unlinkSync(absTarget);\n }\n } else if (params.restoreLockedFiles && params.prevEntry?.backupContentBase64 !== undefined) {\n // Restore exact pre-command bytes\n fs.mkdirSync(path.dirname(absTarget), { recursive: true });\n fs.writeFileSync(\n absTarget,\n Buffer.from(params.prevEntry.backupContentBase64, 'base64')\n );\n }\n\n const record: QuarantineRecord = {\n id,\n agent_id: params.agentId,\n command: params.command,\n file_path: params.relPath,\n patch_path: patchPath,\n reason: params.reason,\n created_at: now,\n };\n\n this.coordDb.withTransaction(() => {\n this.coordDb.db\n .prepare(`\n INSERT INTO quarantine (id, agent_id, command, file_path, patch_path, reason, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n .run(\n record.id,\n record.agent_id,\n record.command,\n record.file_path,\n record.patch_path,\n record.reason,\n record.created_at\n );\n\n this.coordDb.logEvent(params.agentId, 'bash_mutation_quarantined', {\n filePath: params.relPath,\n command: params.command,\n patchPath,\n reason: params.reason,\n });\n });\n\n return record;\n }\n\n private walkWorkspaceFiles(dir: string, acc: string[] = []): string[] {\n if (!fs.existsSync(dir)) return acc;\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (\n entry.name === '.git' ||\n entry.name === '.coord' ||\n entry.name === 'node_modules' ||\n entry.name === 'dist' ||\n entry.name === 'coverage' ||\n entry.name === '.next' ||\n entry.name === 'target'\n ) {\n continue;\n }\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n this.walkWorkspaceFiles(fullPath, acc);\n } else if (entry.isFile()) {\n acc.push(fullPath);\n }\n }\n return acc;\n }\n\n public listQuarantined(): QuarantineRecord[] {\n return this.coordDb.db\n .prepare(`SELECT * FROM quarantine ORDER BY created_at DESC`)\n .all() as unknown as QuarantineRecord[];\n }\n}\n","import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { scopeSegments, scopesOverlap } from './glob.js';\nimport { caseSensitivePaths, isWithin, physicalPath, repositoryFile } from './repository.js';\nimport { CoordDatabase } from './db.js';\nimport { FencingAndAgentManager, StaleFencingTokenError } from './fencing.js';\n\nexport interface LockRecord {\n id: string;\n pattern: string;\n lock_type: 'glob' | 'file' | 'symbol';\n mode: 'exclusive' | 'shared';\n owner_agent_id: string;\n task_id: string | null;\n fencing_token: number;\n reason: string;\n acquired_at: number;\n expires_at: number;\n}\n\nexport interface LockConflict {\n existingLock: LockRecord;\n requestedPattern: string;\n ownerAgentName: string;\n ownerIntent: string | null;\n}\n\nexport interface AcquireLockResult {\n ok: boolean;\n fencingToken: number;\n locks: LockRecord[];\n conflicts: LockConflict[];\n}\n\nexport class LockEngine {\n private readonly pathCase = new Map<string, boolean>();\n constructor(\n private readonly coordDb: CoordDatabase,\n private readonly fencing: FencingAndAgentManager\n ) {}\n\n public static normalizePattern(repoRoot: string, rawPattern: string): string {\n if (rawPattern.startsWith('file:')) return LockEngine.literalScope(LockEngine.normalizeFile(repoRoot, rawPattern.slice(5)));\n if (rawPattern.startsWith('symbol:')) {\n const hash = rawPattern.indexOf('#');\n const name = rawPattern.slice(hash + 1);\n if (hash < 0 || !/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name)) throw new Error('Symbol scope must include #symbolName');\n const file = LockEngine.normalizeFile(repoRoot, rawPattern.slice(7, hash));\n return `symbol:${file}#${name}`;\n }\n if (!rawPattern || /[\\\\\\x00-\\x1f\\x7f]/u.test(rawPattern)) throw new Error(`Invalid repository scope: ${rawPattern}`);\n const root = physicalPath(repoRoot);\n const parts = rawPattern.split('/');\n const magic = parts.findIndex(p => /[?*]/u.test(p));\n // Resolve the literal prefix before normalizing .., so symlink/.. cannot escape.\n const prefix = magic < 0 ? rawPattern : parts.slice(0, magic).join('/') || '.';\n const absolute = physicalPath(path.isAbsolute(prefix) ? prefix : root + '/' + prefix);\n if (!isWithin(root, absolute)) throw new Error(`Scope is outside repository: ${rawPattern}`);\n const relative = path.relative(root, absolute).split(path.sep).join('/');\n const suffix = magic < 0 ? '' : parts.slice(magic).join('/');\n const normalized = [relative, suffix].filter(Boolean).join('/');\n scopeSegments(normalized);\n return normalized;\n }\n\n public static normalizeFile(repoRoot: string, file: string): string {\n const normalized = repositoryFile(repoRoot, file);\n scopeSegments(normalized, true);\n return normalized;\n }\n\n private static literalScope(file: string): string {\n try {\n scopeSegments(file);\n if (!/[?*]/u.test(file) && !file.startsWith('symbol:') && !file.startsWith('file:')) return file;\n } catch { /* Explicit literal scopes support filenames containing reserved glob syntax. */ }\n return 'file:' + file;\n }\n\n private rootForAgent(agentId: string): string {\n return this.fencing.getAgent(agentId)?.worktree_path ?? this.coordDb.repoRoot;\n }\n\n // A wildcard can traverse an alias that maps to a different scope. If exact\n // lexical comparison was disjoint, retain exclusion when such aliases exist.\n private wildcardHasAliases(pattern: string): boolean {\n if (pattern.startsWith('symbol:') || pattern.startsWith('file:')) return false;\n const segments = scopeSegments(pattern);\n const first = segments.findIndex(s => /[?*]/u.test(s));\n if (first < 0) return false;\n const prefix = segments.slice(0, first).join('/');\n const roots = new Set([this.coordDb.repoRoot, ...this.fencing.listAgents(true).map(a => a.worktree_path).filter((p): p is string => Boolean(p))]);\n const pending = [...roots].map(root => ({ root, relative: prefix }));\n let budget = 10_000;\n while (pending.length) {\n const { root, relative } = pending.pop()!;\n const dir = path.join(root, relative);\n let entries;\n try { entries = fs.readdirSync(dir, { withFileTypes: true }); }\n catch (error) { if ((error as NodeJS.ErrnoException).code === 'ENOENT') continue; return true; }\n for (const entry of entries) {\n if (--budget < 0) return true;\n const file = relative ? relative + '/' + entry.name : entry.name;\n if (entry.isSymbolicLink()) return true;\n const fold = (value: string) => value.normalize('NFC').toLowerCase().replace(/ς/g, 'σ');\n if (!LockEngine.patternsOverlap(fold(pattern), fold(file)) && !LockEngine.patternsOverlap(fold(pattern), fold(file + '/**'))) continue;\n if (entry.isDirectory()) pending.push({ root, relative: file });\n }\n }\n return false;\n }\n\n /** Exact overlap for the documented scope grammar; legacy unsupported locks block conservatively. */\n public static patternsOverlap(rawA: string, rawB: string): boolean {\n const decode = (value: string) => {\n if (value.startsWith('symbol:')) {\n const match = /^symbol:(.+)#([A-Za-z_$][A-Za-z0-9_$]*)$/.exec(value);\n if (!match) throw new Error('Invalid symbol scope');\n scopeSegments(match[1], true);\n return { file: match[1], symbol: match[2], literal: true };\n }\n const literal = value.startsWith('file:');\n const file = literal ? value.slice(5) : value;\n scopeSegments(file, literal);\n return { file, symbol: null, literal };\n };\n try {\n const a = decode(rawA), b = decode(rawB);\n if (a.symbol && b.symbol) return a.file === b.file && a.symbol === b.symbol;\n return scopesOverlap(a.file, b.file, a.literal, b.literal);\n } catch { return true; }\n }\n\n /**\n * Atomically acquires locks on one or more file/glob/symbol patterns.\n * All-or-nothing: if any pattern conflicts with another live agent, no locks are created.\n */\n public acquireLocks(params: {\n agentId: string;\n patterns: string[];\n mode?: 'exclusive' | 'shared';\n lockType?: 'glob' | 'file' | 'symbol';\n taskId?: string | null;\n reason?: string;\n leaseDurationMs?: number;\n }): AcquireLockResult {\n this.fencing.reapDeadAgents();\n\n const mode = params.mode ?? 'exclusive';\n const lockType = params.lockType ?? 'glob';\n const now = Date.now();\n const expiresAt = now + (params.leaseDurationMs ?? FencingAndAgentManager.DEFAULT_LEASE_MS);\n const normalizedPatterns = Array.from(\n new Set(params.patterns.map((p) => LockEngine.normalizePattern(this.rootForAgent(params.agentId), lockType === 'file' && !p.startsWith('file:') ? 'file:' + p : p)))\n );\n\n return this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const existingLocks = this.coordDb.db\n .prepare(`SELECT * FROM locks WHERE expires_at > ?`)\n .all(now) as unknown as LockRecord[];\n\n const conflicts: LockConflict[] = [];\n\n for (const reqPattern of normalizedPatterns) {\n for (const existing of existingLocks) {\n if (existing.owner_agent_id === params.agentId) {\n continue;\n }\n const bothShared = mode === 'shared' && existing.mode === 'shared';\n if (bothShared) {\n continue;\n }\n\n if (this.overlapsExisting(reqPattern, existing.pattern)) {\n const owner = this.fencing.getAgent(existing.owner_agent_id);\n const activeTask = this.coordDb.db\n .prepare(\n `SELECT intent_summary FROM tasks WHERE owner_agent_id = ? AND status = 'active' LIMIT 1`\n )\n .get(existing.owner_agent_id) as { intent_summary: string } | undefined;\n\n conflicts.push({\n existingLock: existing,\n requestedPattern: reqPattern,\n ownerAgentName: owner?.name ?? existing.owner_agent_id,\n ownerIntent: activeTask?.intent_summary ?? existing.reason ?? null,\n });\n }\n }\n }\n\n if (conflicts.length > 0) {\n this.coordDb.logEvent(params.agentId, 'lock_conflict', {\n requestedPatterns: normalizedPatterns,\n conflicts: conflicts.map((c) => ({\n pattern: c.existingLock.pattern,\n owner: c.existingLock.owner_agent_id,\n })),\n });\n return {\n ok: false,\n fencingToken: this.coordDb.currentFencingEpoch(),\n locks: [],\n conflicts,\n };\n }\n\n const token = this.coordDb.nextFencingToken();\n const acquired: LockRecord[] = [];\n\n for (const pattern of normalizedPatterns) {\n // Upsert if same agent already holds this exact pattern\n this.coordDb.db\n .prepare(`DELETE FROM locks WHERE owner_agent_id = ? AND pattern = ?`)\n .run(params.agentId, pattern);\n\n const id = `lock_${crypto.randomBytes(6).toString('hex')}`;\n const inferredType = pattern.startsWith('file:') ? 'file' : pattern.startsWith('symbol:')\n ? 'symbol'\n : pattern.includes('*') || pattern.includes('?') || pattern.includes('{')\n ? 'glob'\n : lockType === 'glob'\n ? 'file'\n : lockType;\n\n this.coordDb.db\n .prepare(`\n INSERT INTO locks (\n id, pattern, lock_type, mode, owner_agent_id,\n task_id, fencing_token, reason, acquired_at, expires_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n .run(\n id,\n pattern,\n inferredType,\n mode,\n params.agentId,\n params.taskId ?? null,\n token,\n params.reason ?? '',\n now,\n expiresAt\n );\n\n acquired.push({\n id,\n pattern,\n lock_type: inferredType,\n mode,\n owner_agent_id: params.agentId,\n task_id: params.taskId ?? null,\n fencing_token: token,\n reason: params.reason ?? '',\n acquired_at: now,\n expires_at: expiresAt,\n });\n }\n\n this.coordDb.logEvent(params.agentId, 'locks_acquired', {\n patterns: normalizedPatterns,\n fencingToken: token,\n });\n\n return {\n ok: true,\n fencingToken: token,\n locks: acquired,\n conflicts: [],\n };\n });\n }\n\n /**\n * Checks whether `agentId` is allowed to edit `filePath`.\n * Also verifies the fencing token if provided.\n */\n public checkFileWriteAccess(params: {\n agentId: string;\n filePath: string;\n fencingToken?: number;\n }): {\n allowed: boolean;\n reason?: string;\n conflictingLock?: LockRecord;\n ownerIntent?: string | null;\n } {\n this.fencing.reapDeadAgents();\n this.fencing.assertSession(params.agentId);\n const normPath = LockEngine.normalizeFile(this.rootForAgent(params.agentId), params.filePath);\n const requested = LockEngine.literalScope(normPath);\n const now = Date.now();\n\n const activeLocks = this.coordDb.db\n .prepare(`SELECT * FROM locks WHERE expires_at > ?`)\n .all(now) as unknown as LockRecord[];\n\n for (const lock of activeLocks) {\n if (this.overlapsExisting(requested, lock.pattern)) {\n if (lock.owner_agent_id !== params.agentId) {\n const activeTask = this.coordDb.db\n .prepare(\n `SELECT intent_summary FROM tasks WHERE owner_agent_id = ? AND status = 'active' LIMIT 1`\n )\n .get(lock.owner_agent_id) as { intent_summary: string } | undefined;\n\n return {\n allowed: false,\n reason: `File '${normPath}' is locked by agent '${lock.owner_agent_id}' (pattern: '${lock.pattern}', token: ${lock.fencing_token}). Intent: ${\n activeTask?.intent_summary ?? (lock.reason || 'active work')\n }`,\n conflictingLock: lock,\n ownerIntent: activeTask?.intent_summary ?? lock.reason ?? null,\n };\n } else if (params.fencingToken !== undefined) {\n this.fencing.verifyFencingToken(normPath, params.fencingToken, lock.fencing_token);\n }\n }\n }\n\n return { allowed: true };\n }\n\n public releaseLocks(params: {\n agentId: string;\n patterns?: string[];\n fencingToken?: number;\n }): number {\n return this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const myLocks = this.coordDb.db\n .prepare(`SELECT * FROM locks WHERE owner_agent_id = ?`)\n .all(params.agentId) as unknown as LockRecord[];\n\n if (params.fencingToken !== undefined) {\n for (const lock of myLocks) {\n if (\n !params.patterns ||\n params.patterns.some(\n (p) => LockEngine.normalizePattern(this.rootForAgent(params.agentId), p) === lock.pattern\n )\n ) {\n this.fencing.verifyFencingToken(lock.pattern, params.fencingToken, lock.fencing_token);\n }\n }\n }\n\n if (!params.patterns || params.patterns.length === 0) {\n const res = this.coordDb.db\n .prepare(`DELETE FROM locks WHERE owner_agent_id = ?`)\n .run(params.agentId);\n return Number(res.changes);\n }\n\n let count = 0;\n for (const rawPattern of params.patterns) {\n const norm = LockEngine.normalizePattern(this.rootForAgent(params.agentId), rawPattern);\n const res = this.coordDb.db\n .prepare(`DELETE FROM locks WHERE owner_agent_id = ? AND pattern = ?`)\n .run(params.agentId, norm);\n count += Number(res.changes);\n }\n return count;\n });\n }\n\n private overlapsExisting(requested: string, existing: string): boolean {\n try {\n const normalized = LockEngine.normalizePattern(this.coordDb.repoRoot, existing);\n const roots = [this.coordDb.repoRoot, ...this.fencing.listAgents(true).map(a => a.worktree_path).filter((p): p is string => Boolean(p))];\n const insensitive = roots.some(root => {\n if (!this.pathCase.has(root)) this.pathCase.set(root, caseSensitivePaths(root));\n return !this.pathCase.get(root);\n });\n const fold = (scope: string) => {\n const hash = scope.startsWith('symbol:') ? scope.lastIndexOf('#') : -1;\n const file = hash < 0 ? scope : scope.slice(0, hash);\n return file.normalize('NFC').toLowerCase().replace(/ς/g, 'σ') + (hash < 0 ? '' : scope.slice(hash));\n };\n const overlap = (a: string, b: string) => LockEngine.patternsOverlap(a, b)\n || insensitive && LockEngine.patternsOverlap(fold(a), fold(b));\n return overlap(requested, existing) || overlap(requested, normalized)\n || this.wildcardHasAliases(requested) || this.wildcardHasAliases(normalized);\n }\n catch { return true; }\n }\n\n public listLocks(): LockRecord[] {\n this.fencing.reapDeadAgents();\n return this.coordDb.db\n .prepare(`SELECT * FROM locks WHERE expires_at > ? ORDER BY acquired_at ASC`)\n .all(Date.now()) as unknown as LockRecord[];\n }\n}\n\nexport { StaleFencingTokenError };\n","/**\n * Scope grammar: slash-separated literals, * and ? within a segment, and ** as\n * a whole segment. Wildcards include dotfiles. No braces, classes, negation,\n * extglobs or escaping. Reject unsupported syntax instead of guessing.\n */\nexport function scopeSegments(pattern: string, literal = false): string[] {\n if (!pattern || pattern.length > 512 || (literal ? /[\\x00-\\x1f\\x7f\\\\]/u : /[\\x00-\\x1f\\x7f\\\\[\\]{}()!]/u).test(pattern)) {\n throw new Error(`Unsupported scope syntax: ${pattern}`);\n }\n const segments = pattern.split('/');\n if (segments.length > 64 || segments.some(s => !s || s === '.' || s === '..' || !literal && s.includes('**') && s !== '**')) {\n throw new Error(`Invalid scope segments: ${pattern}`);\n }\n return segments;\n}\n\n// Intersection of two segment wildcard automata. Track empty/dot/dot-dot so\n// only actual filename components can witness an overlap.\nfunction segmentsOverlap(a: string, b: string, literalA: boolean, literalB: boolean): boolean {\n const STAR = Symbol('star'), ANY = Symbol('any');\n const tokens = (text: string, literal: boolean) => Array.from(text).map(c => !literal && c === '*' ? STAR : !literal && c === '?' ? ANY : c);\n const left = tokens(a, literalA), right = tokens(b, literalB);\n const queue: Array<[number, number, number]> = [[0, 0, 0]];\n const seen = new Set<string>();\n for (let q = 0; q < queue.length; q++) {\n const [i, j, kind] = queue[q];\n const key = `${i},${j},${kind}`;\n if (seen.has(key)) continue;\n seen.add(key);\n if (i === left.length && j === right.length && kind === 3) return true;\n const x = left[i], y = right[j];\n if (x === STAR) queue.push([i + 1, j, kind]);\n if (y === STAR) queue.push([i, j + 1, kind]);\n if (x === undefined || y === undefined) continue;\n const anyX = x === STAR || x === ANY, anyY = y === STAR || y === ANY;\n if (!anyX && !anyY && x !== y) continue;\n const literal = !anyX ? x : !anyY ? y : undefined;\n const nextI = x === STAR ? i : i + 1, nextJ = y === STAR ? j : j + 1;\n if (literal === undefined || literal === '.') {\n queue.push([nextI, nextJ, kind === 0 ? 1 : kind === 1 ? 2 : 3]);\n }\n if (literal === undefined || literal !== '.') queue.push([nextI, nextJ, 3]);\n }\n return false;\n}\n\n/** Exact language intersection, including zero-directory and repeated globstars. */\nexport function scopesOverlap(a: string, b: string, literalA = false, literalB = false): boolean {\n const left = scopeSegments(a, literalA), right = scopeSegments(b, literalB);\n const queue: Array<[number, number, boolean]> = [[0, 0, false]];\n const seen = new Set<string>();\n const memo = new Map<string, boolean>();\n for (let q = 0; q < queue.length; q++) {\n const [i, j, consumed] = queue[q];\n const key = `${i},${j},${consumed}`;\n if (seen.has(key)) continue;\n seen.add(key);\n if (i === left.length && j === right.length && consumed) return true;\n const x = left[i], y = right[j];\n const starA = !literalA && x === '**', starB = !literalB && y === '**';\n if (starA) queue.push([i + 1, j, consumed]);\n if (starB) queue.push([i, j + 1, consumed]);\n if (x === undefined || y === undefined) continue;\n const pair = JSON.stringify([x, y]);\n let overlap = memo.get(pair);\n if (overlap === undefined) {\n overlap = segmentsOverlap(starA ? '*' : x, starB ? '*' : y, starA ? false : literalA, starB ? false : literalB);\n memo.set(pair, overlap);\n }\n if (overlap) queue.push([starA ? i : i + 1, starB ? j : j + 1, true]);\n }\n return false;\n}\n","import { execFileSync } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { CoordDatabase } from './db.js';\n\nexport interface AgentRecord {\n id: string;\n name: string;\n client: string;\n pid: number;\n pid_start_time: string;\n pgid: number;\n worktree_path: string | null;\n branch: string | null;\n shadow_tree_sha: string | null;\n status: 'active' | 'idle' | 'dead' | 'completed';\n last_seen_event_id: number;\n registered_at: number;\n last_heartbeat_at: number;\n lease_expires_at: number;\n}\n\nexport class SessionOwnershipError extends Error {\n constructor(agentId: string) {\n super(`No valid active session capability for '${agentId}'. Start a session, or resume it with its session token.`);\n this.name = 'SessionOwnershipError';\n }\n}\n\nexport class StaleFencingTokenError extends Error {\n constructor(public readonly resourceId: string, public readonly providedToken: number, public readonly expectedToken: number) {\n super(`Fencing token mismatch for '${resourceId}': provided ${providedToken}, expected ${expectedToken}.`);\n this.name = 'StaleFencingTokenError';\n }\n}\n\ninterface SessionRow { token_hash: string; epoch: number }\nexport interface SessionRegistration { agent: AgentRecord; fencingToken: number; sessionToken: string; sessionEpoch: number }\n\nexport class FencingAndAgentManager {\n public static readonly DEFAULT_LEASE_MS = 5 * 60 * 1000;\n private readonly capabilities = new Map<string, string>();\n private static ownWindowsStart: string | null = null;\n\n constructor(private readonly coordDb: CoordDatabase) {}\n\n public static validateLease(duration: number): number {\n if (!Number.isSafeInteger(duration) || duration < 100 || duration > 86_400_000) {\n throw new Error('Lease duration must be an integer between 100 and 86400000 milliseconds');\n }\n return duration;\n }\n\n /** A real kernel process identity; tests must not supply liveness sentinels. */\n public static getProcessStartTime(pid: number): string | null {\n if (!Number.isSafeInteger(pid) || pid <= 0) return null;\n try {\n if (process.platform === 'linux') {\n const stat = fs.readFileSync(`/proc/${pid}/stat`, 'utf8');\n return `linux:${stat.slice(stat.lastIndexOf(')') + 2).split(' ')[19]}`;\n }\n if (process.platform === 'win32') {\n // Only our own identity is immutable for this process lifetime. Never cache other PIDs.\n if (pid === process.pid && this.ownWindowsStart) return this.ownWindowsStart;\n const powershell = path.join(process.env.SystemRoot ?? 'C:\\\\Windows', 'System32', 'WindowsPowerShell', 'v1.0', 'powershell.exe');\n const ticks = execFileSync(powershell, ['-NoProfile', '-NonInteractive', '-Command',\n `(Get-Process -Id ${pid} -ErrorAction Stop).StartTime.ToUniversalTime().Ticks.ToString([System.Globalization.CultureInfo]::InvariantCulture)`],\n { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], timeout: 5000, windowsHide: true }).trim();\n if (!/^\\d+$/.test(ticks)) return null;\n const identity = `windows:${ticks}`;\n if (pid === process.pid) this.ownWindowsStart = identity;\n return identity;\n }\n const out = execFileSync('ps', ['-o', 'lstart=', '-p', String(pid)], {\n encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], timeout: 1500,\n env: { ...process.env, LC_ALL: 'C' },\n }).trim();\n return out || null;\n } catch { return null; }\n }\n\n public static isProcessAlive(pid: number, expectedStartTime: string): boolean {\n if (!Number.isSafeInteger(pid) || pid <= 0) return false;\n try { process.kill(pid, 0); }\n catch (err) { if ((err as NodeJS.ErrnoException).code === 'ESRCH') return false; }\n const current = this.getProcessStartTime(pid);\n // Failure to inspect a live process is not evidence that its locks can be stolen.\n return current === null || current === expectedStartTime;\n }\n\n public registerAgent(params: {\n id: string; name?: string; client?: string; pid?: number; pgid?: number;\n worktreePath?: string | null; branch?: string | null; leaseDurationMs?: number;\n sessionToken?: string;\n }): SessionRegistration {\n if (!/^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,127}$/.test(params.id)) throw new Error('Invalid agent ID');\n const leaseMs = FencingAndAgentManager.validateLease(params.leaseDurationMs ?? FencingAndAgentManager.DEFAULT_LEASE_MS);\n this.reapDeadAgents();\n return this.coordDb.withTransaction(() => {\n const existing = this.getAgent(params.id);\n const supplied = params.sessionToken ?? this.capabilities.get(params.id);\n if (existing?.status === 'active') {\n const epoch = this.assertSession(params.id, supplied);\n // Resuming never changes the process anchor or session generation.\n this.capabilities.set(params.id, supplied!);\n this.heartbeat(params.id, leaseMs);\n return { agent: this.getAgent(params.id)!, fencingToken: epoch, sessionToken: supplied!, sessionEpoch: epoch };\n }\n if (params.sessionToken !== undefined) throw new SessionOwnershipError(params.id);\n const pid = params.pid ?? process.pid;\n const start = FencingAndAgentManager.getProcessStartTime(pid);\n if (!start) throw new Error(`Cannot determine start time of live session owner PID ${pid}`);\n const now = Date.now();\n const epoch = this.coordDb.nextFencingToken();\n const token = crypto.randomBytes(32).toString('base64url');\n const latest = (this.coordDb.db.prepare('SELECT COALESCE(MAX(id), 0) AS id FROM events').get() as { id: number }).id;\n this.coordDb.db.prepare(`\n INSERT INTO agents (id, name, client, pid, pid_start_time, pgid, worktree_path, branch,\n shadow_tree_sha, status, last_seen_event_id, registered_at, last_heartbeat_at, lease_expires_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL, 'active', ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET name=excluded.name, client=excluded.client, pid=excluded.pid,\n pid_start_time=excluded.pid_start_time, pgid=excluded.pgid, status='active',\n worktree_path=COALESCE(agents.worktree_path, excluded.worktree_path),\n shadow_tree_sha=NULL, last_seen_event_id=excluded.last_seen_event_id,\n registered_at=excluded.registered_at, last_heartbeat_at=excluded.last_heartbeat_at,\n lease_expires_at=excluded.lease_expires_at\n `).run(params.id, params.name ?? existing?.name ?? params.id, params.client ?? 'unknown',\n pid, start, params.pgid ?? pid, params.worktreePath ?? (this.coordDb.isLinkedWorktree ? this.coordDb.repoRoot : null), params.branch ?? null,\n latest, now, now, now + leaseMs);\n this.coordDb.db.prepare('INSERT OR REPLACE INTO agent_sessions(agent_id, token_hash, epoch) VALUES (?, ?, ?)')\n .run(params.id, this.hash(token), epoch);\n this.capabilities.set(params.id, token);\n this.coordDb.logEvent(params.id, 'agent_registered', { client: params.client ?? 'unknown', pid, sessionEpoch: epoch });\n return { agent: this.getAgent(params.id)!, fencingToken: epoch, sessionToken: token, sessionEpoch: epoch };\n });\n }\n\n public resumeSession(agentId: string, sessionToken: string): number {\n const epoch = this.assertSession(agentId, sessionToken);\n this.capabilities.set(agentId, sessionToken);\n return epoch;\n }\n\n public assertSession(agentId: string, sessionToken = this.capabilities.get(agentId)): number {\n const agent = this.getAgent(agentId);\n const session = this.coordDb.db.prepare('SELECT token_hash, epoch FROM agent_sessions WHERE agent_id = ?')\n .get(agentId) as SessionRow | undefined;\n if (!agent || agent.status !== 'active' || agent.lease_expires_at <= Date.now() || !session ||\n !sessionToken || this.hash(sessionToken) !== session.token_hash ||\n !FencingAndAgentManager.isProcessAlive(agent.pid, agent.pid_start_time)) {\n throw new SessionOwnershipError(agentId);\n }\n return session.epoch;\n }\n\n public sessionEnvironment(agentId: string): NodeJS.ProcessEnv {\n this.assertSession(agentId);\n return { ...process.env, KITH_AGENT_ID: agentId, KITH_SESSION_TOKEN: this.capabilities.get(agentId)! };\n }\n\n public heartbeat(agentId: string, leaseDurationMs = FencingAndAgentManager.DEFAULT_LEASE_MS): AgentRecord {\n const lease = FencingAndAgentManager.validateLease(leaseDurationMs);\n return this.coordDb.withTransaction(() => {\n this.assertSession(agentId);\n const now = Date.now();\n const expires = now + lease;\n this.coordDb.db.prepare('UPDATE agents SET last_heartbeat_at=?, lease_expires_at=? WHERE id=?').run(now, expires, agentId);\n this.coordDb.db.prepare('UPDATE locks SET expires_at=MAX(expires_at, ?) WHERE owner_agent_id=? AND expires_at>?')\n .run(expires, agentId, now);\n // Mutex renewal requires its exact acquisition token, not just a session heartbeat.\n this.coordDb.db.prepare(\"UPDATE resources SET expires_at=MAX(expires_at, ?) WHERE type='port' AND owner_agent_id=? AND expires_at>?\")\n .run(expires, agentId, now);\n return this.getAgent(agentId)!;\n });\n }\n\n public getAgent(agentId: string): AgentRecord | null {\n return (this.coordDb.db.prepare('SELECT * FROM agents WHERE id=?').get(agentId) as AgentRecord | undefined) ?? null;\n }\n\n public listAgents(onlyActive = false): AgentRecord[] {\n this.reapDeadAgents();\n return this.coordDb.db.prepare(onlyActive\n ? \"SELECT * FROM agents WHERE status='active' ORDER BY registered_at\"\n : 'SELECT * FROM agents ORDER BY registered_at DESC').all() as unknown as AgentRecord[];\n }\n\n public reapDeadAgents(): string[] {\n const agents = this.coordDb.db.prepare(\"SELECT * FROM agents WHERE status='active'\").all() as unknown as AgentRecord[];\n const liveness = new Map<string, boolean>();\n const candidates = agents.filter((a) => {\n const key = `${a.pid}:${a.pid_start_time}`;\n if (!liveness.has(key)) liveness.set(key, FencingAndAgentManager.isProcessAlive(a.pid, a.pid_start_time));\n return a.lease_expires_at <= Date.now() || !liveness.get(key);\n });\n if (!candidates.length) return [];\n return this.coordDb.withTransaction(() => {\n const reaped: string[] = [];\n for (const previous of candidates) {\n const current = this.getAgent(previous.id);\n // Recheck after taking the writer lock: a heartbeat or replacement may have won.\n if (!current || current.status !== 'active' || current.registered_at !== previous.registered_at ||\n current.pid !== previous.pid || current.pid_start_time !== previous.pid_start_time) continue;\n if (current.lease_expires_at > Date.now() && FencingAndAgentManager.isProcessAlive(current.pid, current.pid_start_time)) continue;\n this.reclaim(current.id, 'dead', 'process_died_or_lease_expired');\n reaped.push(current.id);\n }\n return reaped;\n });\n }\n\n public completeAgentSession(agentId: string): void {\n this.coordDb.withTransaction(() => { this.assertSession(agentId); this.reclaim(agentId, 'completed', 'session_completed'); });\n this.capabilities.delete(agentId);\n }\n\n public abandonAgentSession(agentId: string): void {\n this.coordDb.withTransaction(() => { this.assertSession(agentId); this.reclaim(agentId, 'dead', 'client_disconnected'); });\n this.capabilities.delete(agentId);\n }\n\n private reclaim(agentId: string, status: 'dead' | 'completed', reason: string): void {\n const epoch = this.coordDb.nextFencingToken();\n const now = Date.now();\n this.coordDb.db.prepare('UPDATE agents SET status=?, last_heartbeat_at=? WHERE id=?').run(status, now, agentId);\n this.coordDb.db.prepare('DELETE FROM locks WHERE owner_agent_id=?').run(agentId);\n this.coordDb.db.prepare('DELETE FROM resources WHERE owner_agent_id=?').run(agentId);\n this.coordDb.db.prepare('DELETE FROM mutex_waiters WHERE owner_agent_id=?').run(agentId);\n // Live command guards survive session expiry until their process group has stopped.\n this.coordDb.db.prepare('DELETE FROM conflicts WHERE agent_a=? OR agent_b=?').run(agentId, agentId);\n if (status === 'dead') {\n this.coordDb.db.prepare(\"UPDATE tasks SET status='queued', owner_agent_id=NULL, fencing_token=NULL, updated_at=? WHERE owner_agent_id=? AND status='active'\")\n .run(now, agentId);\n } else {\n this.coordDb.db.prepare(\"UPDATE tasks SET status='done', updated_at=? WHERE owner_agent_id=? AND status='active'\")\n .run(now, agentId);\n }\n this.coordDb.logEvent(agentId, `agent_${status}`, { reason, newFencingEpoch: epoch });\n }\n\n public verifyFencingToken(resourceId: string, provided: number, expected: number): void {\n if (provided !== expected) throw new StaleFencingTokenError(resourceId, provided, expected);\n }\n\n private hash(token: string): string { return crypto.createHash('sha256').update(token).digest('hex'); }\n}\n","import { fork } from 'node:child_process';\nimport fs from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport crypto from 'node:crypto';\nimport net from 'node:net';\nimport { CoordDatabase } from './db.js';\nimport { FencingAndAgentManager } from './fencing.js';\n\nexport interface ResourceRecord {\n id: string;\n type: 'port' | 'mutex';\n name: string;\n value: string;\n owner_agent_id: string;\n fencing_token: number;\n queue: string[];\n acquired_at: number;\n expires_at: number;\n}\n\nexport class ResourceBroker {\n private activeExecutions = 0;\n public hasActiveCommands(): boolean { return this.activeExecutions > 0; }\n constructor(\n private readonly coordDb: CoordDatabase,\n private readonly fencing: FencingAndAgentManager\n ) {}\n\n /**\n * Acquires a collision-free port lease for `(agentId, serviceName)`.\n * Verifies both SQLite resource table and OS TCP socket availability.\n */\n public async acquirePort(params: {\n agentId: string;\n serviceName: string;\n basePort?: number;\n leaseDurationMs?: number;\n }): Promise<{ port: number; fencingToken: number; resource: ResourceRecord }> {\n this.fencing.reapDeadAgents();\n this.fencing.assertSession(params.agentId);\n const basePort = params.basePort ?? 3100;\n const leaseMs = FencingAndAgentManager.validateLease(params.leaseDurationMs ?? FencingAndAgentManager.DEFAULT_LEASE_MS);\n const now = Date.now();\n const expiresAt = now + leaseMs;\n const resourceKey = `${params.agentId}:${params.serviceName}`;\n\n // Check if this agent already holds a port for this service\n const existing = this.getResource('port', resourceKey);\n if (existing && existing.expires_at > now) {\n return this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n this.coordDb.db.prepare(`UPDATE resources SET expires_at = ? WHERE id = ?`).run(expiresAt, existing.id);\n return {\n port: Number(existing.value), fencingToken: existing.fencing_token,\n resource: this.getResource('port', resourceKey)!,\n };\n });\n }\n\n if (!Number.isInteger(basePort) || basePort < 1 || basePort > 65535) {\n throw new Error('basePort must be an integer between 1 and 65535');\n }\n const limit = Math.min(basePort + 500, 65536);\n for (let candidatePort = basePort; candidatePort < limit; candidatePort++) {\n if (!(await ResourceBroker.isTcpPortFree(candidatePort))) continue;\n // The OS probe is asynchronous. Recheck reservations under the writer lock.\n const reservation = this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const now = Date.now();\n const sameService = this.getResource('port', resourceKey);\n if (sameService && sameService.expires_at > now) {\n return { port: Number(sameService.value), fencingToken: sameService.fencing_token, resource: sameService };\n }\n const taken = this.coordDb.db.prepare(\n `SELECT id FROM resources WHERE type = 'port' AND value = ? AND expires_at > ?`\n ).get(String(candidatePort), now);\n if (taken) return null;\n const token = this.coordDb.nextFencingToken();\n this.coordDb.db.prepare(`\n INSERT OR REPLACE INTO resources (\n id, type, name, value, owner_agent_id, fencing_token, queue_json, acquired_at, expires_at\n ) VALUES (?, 'port', ?, ?, ?, ?, '[]', ?, ?)\n `).run(`res_${crypto.randomBytes(6).toString('hex')}`, resourceKey,\n String(candidatePort), params.agentId, token, now, now + leaseMs);\n this.coordDb.logEvent(params.agentId, 'port_leased', {\n serviceName: params.serviceName, port: candidatePort, fencingToken: token,\n });\n return { port: candidatePort, fencingToken: token, resource: this.getResource('port', resourceKey)! };\n });\n if (reservation) return reservation;\n }\n throw new Error(`No free port available in range ${basePort}-${limit - 1}`);\n }\n\n public static isTcpPortFree(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = net.createServer();\n server.unref();\n server.on('error', () => resolve(false));\n server.listen(port, '127.0.0.1', () => {\n server.close(() => resolve(true));\n });\n });\n }\n\n /** FIFO order survives releases; queued requests belong to a specific session epoch. */\n public tryAcquireMutex(params: {\n agentId: string; mutexName: string; leaseDurationMs?: number; requestId?: string;\n }): { acquired: boolean; fencingToken: number; holderAgentId: string; queuePosition: number } {\n this.fencing.reapDeadAgents();\n const leaseMs = FencingAndAgentManager.validateLease(params.leaseDurationMs ?? FencingAndAgentManager.DEFAULT_LEASE_MS);\n return this.coordDb.withTransaction(() => {\n const epoch = this.fencing.assertSession(params.agentId);\n const now = Date.now();\n const requestId = params.requestId ?? `session:${epoch}`;\n this.pruneWaiters(params.mutexName);\n const run = this.getRun(params.mutexName);\n const guarded = run && this.runIsAlive(run);\n if (run && !guarded) this.clearRun(run);\n const existing = this.getResource('mutex', params.mutexName);\n if (!guarded && existing && existing.expires_at > now && existing.owner_agent_id === params.agentId) {\n this.coordDb.db.prepare('UPDATE resources SET expires_at=? WHERE id=?').run(now + leaseMs, existing.id);\n return { acquired: true, fencingToken: existing.fencing_token, holderAgentId: params.agentId, queuePosition: 0 };\n }\n const start = FencingAndAgentManager.getProcessStartTime(process.pid);\n if (!start) throw new Error('Cannot inspect mutex waiter process. Sandboxed MCP clients can use kith_run_with_mutex instead.');\n this.coordDb.db.prepare(`INSERT INTO mutex_waiters\n (mutex_name, request_id, owner_agent_id, session_epoch, waiter_pid, waiter_start, expires_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(mutex_name, request_id) DO UPDATE SET expires_at=excluded.expires_at\n `).run(params.mutexName, requestId, params.agentId, epoch, process.pid, start, now + leaseMs);\n const waiters = this.waiters(params.mutexName);\n const position = waiters.findIndex((w) => w.request_id === requestId) + 1;\n if (guarded || (existing && existing.expires_at > now) || position !== 1) {\n return { acquired: false, fencingToken: run?.fencing_token ?? existing?.fencing_token ?? 0,\n holderAgentId: guarded ? run!.owner_agent_id : existing?.owner_agent_id ?? waiters[0].owner_agent_id,\n queuePosition: position };\n }\n const token = this.coordDb.nextFencingToken();\n this.coordDb.db.prepare(`INSERT OR REPLACE INTO resources\n (id, type, name, value, owner_agent_id, fencing_token, queue_json, acquired_at, expires_at)\n VALUES (?, 'mutex', ?, 'locked', ?, ?, '[]', ?, ?)\n `).run(existing?.id ?? `res_${crypto.randomBytes(6).toString('hex')}`, params.mutexName, params.agentId, token, now, now + leaseMs);\n this.coordDb.db.prepare('DELETE FROM mutex_waiters WHERE mutex_name=? AND request_id=?').run(params.mutexName, requestId);\n this.coordDb.logEvent(params.agentId, 'mutex_acquired', { mutexName: params.mutexName, fencingToken: token });\n return { acquired: true, fencingToken: token, holderAgentId: params.agentId, queuePosition: 0 };\n });\n }\n\n public renewMutex(params: { agentId: string; mutexName: string; fencingToken: number; leaseDurationMs?: number }): void {\n const lease = FencingAndAgentManager.validateLease(params.leaseDurationMs ?? FencingAndAgentManager.DEFAULT_LEASE_MS);\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const resource = this.getResource('mutex', params.mutexName);\n if (!resource || resource.owner_agent_id !== params.agentId || resource.expires_at <= Date.now()) {\n throw new Error(`Mutex lease lost: ${params.mutexName}`);\n }\n this.fencing.verifyFencingToken(params.mutexName, params.fencingToken, resource.fencing_token);\n this.coordDb.db.prepare('UPDATE resources SET expires_at=? WHERE id=?').run(Date.now() + lease, resource.id);\n });\n }\n\n public releaseMutex(params: { agentId: string; mutexName: string; fencingToken: number }): boolean {\n return this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const resource = this.getResource('mutex', params.mutexName);\n if (!resource || resource.owner_agent_id !== params.agentId) return false;\n this.fencing.verifyFencingToken(params.mutexName, params.fencingToken, resource.fencing_token);\n const run = this.getRun(params.mutexName);\n if (run && this.runIsAlive(run)) throw new Error('Cannot release a mutex while its supervised process group is alive');\n this.coordDb.db.prepare('DELETE FROM resources WHERE id=?').run(resource.id);\n this.coordDb.logEvent(params.agentId, 'mutex_released', { mutexName: params.mutexName });\n return true;\n });\n }\n\n /** Renew leases while a detached, recorded process group runs; stop it before releasing. */\n public async executeWithMutex(params: {\n agentId: string; mutexName: string; command: string | string[]; cwd?: string;\n timeoutMs?: number; commandTimeoutMs?: number; leaseDurationMs?: number;\n killGraceMs?: number; signal?: AbortSignal; maxOutputBytes?: number;\n onStdout?: (chunk: Buffer) => void; onStderr?: (chunk: Buffer) => void;\n }): Promise<{ stdout: string; stderr: string; exitCode: number; waitedMs: number }> {\n if (process.platform === 'win32') throw new Error('Supervised mutex commands currently require macOS or Linux process groups');\n if (!params.command.length) throw new Error('A command is required');\n const leaseMs = FencingAndAgentManager.validateLease(params.leaseDurationMs ?? FencingAndAgentManager.DEFAULT_LEASE_MS);\n const waitTimeout = params.timeoutMs ?? 60_000;\n const grace = params.killGraceMs ?? 1000;\n if (!Number.isFinite(waitTimeout) || waitTimeout < 0 || !Number.isFinite(grace) || grace < 0 ||\n (params.commandTimeoutMs !== undefined && (!Number.isFinite(params.commandTimeoutMs) || params.commandTimeoutMs <= 0))) {\n throw new Error('Timeouts must be finite nonnegative milliseconds (command timeout must be positive)');\n }\n if (params.maxOutputBytes !== undefined && (!Number.isSafeInteger(params.maxOutputBytes) || params.maxOutputBytes <= 0)) throw new Error('maxOutputBytes must be a positive integer');\n const epoch = this.fencing.assertSession(params.agentId);\n const requestId = crypto.randomUUID();\n const started = Date.now();\n let run: MutexRun | null = null;\n const abortError = () => new DOMException('Mutex command cancelled', 'AbortError');\n this.activeExecutions++;\n try {\n while (!run) {\n if (params.signal?.aborted) throw abortError();\n run = this.coordDb.withTransaction(() => {\n const attempt = this.tryAcquireMutex({ ...params, requestId });\n if (!attempt.acquired) return null;\n const record: MutexRun = {\n mutex_name: params.mutexName, run_id: requestId, owner_agent_id: params.agentId,\n session_epoch: epoch, fencing_token: attempt.fencingToken, supervisor_pid: process.pid,\n supervisor_start: FencingAndAgentManager.getProcessStartTime(process.pid)!, worker_pid: null, worker_start: null,\n };\n this.coordDb.db.prepare(`INSERT INTO mutex_runs\n (mutex_name, run_id, owner_agent_id, session_epoch, fencing_token, supervisor_pid, supervisor_start)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `).run(record.mutex_name, record.run_id, record.owner_agent_id, epoch, record.fencing_token, process.pid, record.supervisor_start);\n return record;\n });\n if (run) break;\n if (Date.now() - started >= waitTimeout) throw new Error(`Timed out waiting for mutex '${params.mutexName}'`);\n this.fencing.heartbeat(params.agentId);\n await delay(Math.min(50, Math.max(10, leaseMs / 4)));\n }\n const waitedMs = Date.now() - started;\n const candidates = ['./command-worker.js', '../command-worker.js', '../../dist/command-worker.js']\n .map((name) => fileURLToPath(new URL(name, import.meta.url)));\n const script = candidates.find((name) => fs.existsSync(name));\n if (!script) throw new Error('Missing command worker. Build Kith before running supervised commands.');\n const worker = fork(script, [], { detached: true, stdio: ['ignore', 'pipe', 'pipe', 'ipc'], execArgv: [] });\n const workerPid = worker.pid;\n if (!workerPid) {\n worker.on('error', () => {});\n throw new Error('Could not start command supervisor');\n }\n let workerIdentity = FencingAndAgentManager.getProcessStartTime(workerPid);\n let failure: Error | undefined;\n let outcome: { exitCode: number; error?: string } | undefined;\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n let outputBytes = 0;\n let killTimer: ReturnType<typeof setTimeout> | undefined;\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n let stopDeadline: number | undefined;\n let disposed = false;\n let finishStopped!: () => void;\n const stopped = new Promise<void>((resolve) => { finishStopped = resolve; });\n const stop = (err?: Error) => {\n if (disposed) return;\n failure ??= err;\n const termError = signalGroup(workerPid, 'SIGTERM', workerIdentity);\n failure ??= termError;\n killTimer ??= setTimeout(() => {\n const killError = signalGroup(workerPid, 'SIGKILL', workerIdentity);\n failure ??= killError;\n }, grace);\n stopDeadline ??= Date.now() + grace + 5000;\n stopTimer ??= setTimeout(finishStopped, Math.max(0, stopDeadline - Date.now()));\n };\n const onAbort = () => stop(abortError());\n params.signal?.addEventListener('abort', onAbort, { once: true });\n const interval = setInterval(() => {\n try {\n this.fencing.heartbeat(params.agentId);\n this.renewMutex({ ...params, fencingToken: run!.fencing_token });\n } catch (err) { stop(err instanceof Error ? err : new Error(String(err))); }\n }, Math.max(10, Math.floor(leaseMs / 3)));\n const commandTimer = params.commandTimeoutMs === undefined ? undefined\n : setTimeout(() => stop(new Error('Mutex command execution timed out')), params.commandTimeoutMs);\n const capture = (destination: Buffer[], stream?: (chunk: Buffer) => void) => (chunk: Buffer) => {\n stream?.(chunk);\n outputBytes += chunk.length;\n if (outputBytes > (params.maxOutputBytes ?? 16 * 1024 * 1024)) stop(new Error('Mutex command output limit exceeded'));\n else destination.push(chunk);\n };\n worker.stdout!.on('data', capture(stdout, params.onStdout));\n worker.stderr!.on('data', capture(stderr, params.onStderr));\n worker.on('message', (message: { ready?: boolean; exitCode?: number; error?: string }) => {\n if (disposed) return;\n if (message.ready) {\n try {\n if (params.signal?.aborted) throw abortError();\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const identity = FencingAndAgentManager.getProcessStartTime(workerPid);\n if (!identity) throw new Error('Cannot inspect command worker');\n this.coordDb.db.prepare('UPDATE mutex_runs SET worker_pid=?, worker_start=? WHERE run_id=?')\n .run(workerPid, identity, requestId);\n run!.worker_pid = workerPid;\n run!.worker_start = identity;\n workerIdentity = identity;\n this.renewMutex({ ...params, fencingToken: run!.fencing_token });\n });\n worker.send({ command: params.command, cwd: params.cwd ?? this.coordDb.repoRoot, mutexName: params.mutexName });\n } catch (err) { stop(err instanceof Error ? err : new Error(String(err))); }\n } else {\n outcome = { exitCode: message.exitCode ?? 1, error: message.error };\n }\n });\n worker.once('exit', () => { if (!disposed && groupIsAlive(workerPid, workerIdentity)) stop(); });\n try {\n await Promise.race([new Promise<void>((resolve, reject) => {\n worker.once('close', () => resolve());\n worker.once('error', reject);\n }), stopped]);\n if (params.signal?.aborted) failure ??= abortError();\n if (failure) throw failure;\n if (!outcome) throw new Error('Command worker exited without a result');\n if (outcome.error) throw new Error(outcome.error);\n return { stdout: Buffer.concat(stdout).toString(), stderr: Buffer.concat(stderr).toString(), exitCode: outcome.exitCode, waitedMs };\n } finally {\n clearInterval(interval);\n if (commandTimer) clearTimeout(commandTimer);\n params.signal?.removeEventListener('abort', onAbort);\n if (groupIsAlive(workerPid, workerIdentity)) {\n const killError = signalGroup(workerPid, 'SIGKILL', workerIdentity);\n failure ??= killError;\n const deadline = stopDeadline ?? Date.now() + 5000;\n while (groupIsAlive(workerPid, workerIdentity) && Date.now() < deadline) await delay(20);\n }\n disposed = true;\n if (killTimer) clearTimeout(killTimer);\n if (stopTimer) clearTimeout(stopTimer);\n if (groupIsAlive(workerPid, workerIdentity)) {\n // Retain the durable guard, but don't leave this caller pinned forever.\n worker.stdout?.destroy(); worker.stderr?.destroy();\n if (worker.connected) worker.disconnect();\n worker.unref();\n throw new Error('Command group has not stopped; mutex guard retained for safety');\n }\n }\n } finally {\n try {\n this.coordDb.withTransaction(() => {\n this.coordDb.db.prepare('DELETE FROM mutex_waiters WHERE mutex_name=? AND request_id=? AND session_epoch=?')\n .run(params.mutexName, requestId, epoch);\n if (run && !this.runIsAlive(run)) this.clearRun(run);\n // No protected command can start before the worker-group handshake.\n if (run && run.worker_pid === null) this.clearRun(run);\n });\n } finally { this.activeExecutions--; }\n }\n }\n\n private getRun(name: string): MutexRun | null {\n return (this.coordDb.db.prepare('SELECT * FROM mutex_runs WHERE mutex_name=?').get(name) as MutexRun | undefined) ?? null;\n }\n\n private runIsAlive(run: MutexRun): boolean {\n return run.worker_pid !== null ? groupIsAlive(run.worker_pid, run.worker_start)\n : FencingAndAgentManager.isProcessAlive(run.supervisor_pid, run.supervisor_start);\n }\n\n private clearRun(run: MutexRun): void {\n this.coordDb.db.prepare('DELETE FROM mutex_runs WHERE mutex_name=? AND run_id=?').run(run.mutex_name, run.run_id);\n this.coordDb.db.prepare(\"DELETE FROM resources WHERE type='mutex' AND name=? AND fencing_token=?\")\n .run(run.mutex_name, run.fencing_token);\n }\n\n private waiters(name: string): MutexWaiter[] {\n return this.coordDb.db.prepare('SELECT * FROM mutex_waiters WHERE mutex_name=? ORDER BY ticket').all(name) as unknown as MutexWaiter[];\n }\n\n private pruneWaiters(name: string): void {\n for (const waiter of this.waiters(name)) {\n const agent = this.fencing.getAgent(waiter.owner_agent_id);\n const session = this.coordDb.db.prepare('SELECT epoch FROM agent_sessions WHERE agent_id=?').get(waiter.owner_agent_id) as { epoch: number } | undefined;\n if (!agent || agent.status !== 'active' || agent.lease_expires_at <= Date.now() || session?.epoch !== waiter.session_epoch ||\n waiter.expires_at <= Date.now() || !FencingAndAgentManager.isProcessAlive(waiter.waiter_pid, waiter.waiter_start)) {\n this.coordDb.db.prepare('DELETE FROM mutex_waiters WHERE ticket=?').run(waiter.ticket);\n }\n }\n }\n\n public getResource(type: 'port' | 'mutex', name: string): ResourceRecord | null {\n const row = this.coordDb.db\n .prepare(`SELECT * FROM resources WHERE type = ? AND name = ?`)\n .get(type, name) as Record<string, unknown> | undefined;\n if (!row) return null;\n return this.mapRow(row);\n }\n\n public listResources(): ResourceRecord[] {\n this.fencing.reapDeadAgents();\n const rows = this.coordDb.db\n .prepare(`SELECT * FROM resources WHERE expires_at > ? ORDER BY acquired_at ASC`)\n .all(Date.now()) as Array<Record<string, unknown>>;\n return rows.map((r) => this.mapRow(r));\n }\n\n private mapRow(row: Record<string, unknown>): ResourceRecord {\n return {\n id: String(row.id),\n type: row.type as 'port' | 'mutex',\n name: String(row.name),\n value: String(row.value),\n owner_agent_id: String(row.owner_agent_id),\n fencing_token: Number(row.fencing_token),\n queue: row.type === 'mutex' ? this.waiters(String(row.name)).map((w) => w.owner_agent_id) : [],\n acquired_at: Number(row.acquired_at),\n expires_at: Number(row.expires_at),\n };\n }\n}\n\ninterface MutexRun {\n mutex_name: string; run_id: string; owner_agent_id: string; session_epoch: number;\n fencing_token: number; supervisor_pid: number; supervisor_start: string;\n worker_pid: number | null; worker_start: string | null;\n}\ninterface MutexWaiter {\n ticket: number; request_id: string; owner_agent_id: string; session_epoch: number;\n waiter_pid: number; waiter_start: string; expires_at: number;\n}\nfunction groupIsAlive(pgid: number, expectedStart?: string | null): boolean {\n if (expectedStart) {\n const currentStart = FencingAndAgentManager.getProcessStartTime(pgid);\n if (currentStart && currentStart !== expectedStart) return false;\n }\n try { process.kill(-pgid, 0); }\n catch (err) { return (err as NodeJS.ErrnoException).code !== 'ESRCH'; }\n if (process.platform === 'linux') {\n // A killed, adopted zombie cannot execute writes. Some container PID 1s\n // leave zombies unreaped, so kill(-pgid, 0) alone would retain guards forever.\n try {\n for (const pid of fs.readdirSync('/proc').filter((name) => /^\\d+$/.test(name))) {\n let stat: string;\n try { stat = fs.readFileSync(`/proc/${pid}/stat`, 'utf8'); }\n catch (err) { if ((err as NodeJS.ErrnoException).code === 'ENOENT' || (err as NodeJS.ErrnoException).code === 'ESRCH') continue; return true; }\n const fields = stat.slice(stat.lastIndexOf(')') + 2).split(' ');\n if (Number(fields[2]) === pgid && fields[0] !== 'Z' && fields[0] !== 'X') return true;\n }\n return false;\n } catch { return true; }\n }\n return true;\n}\nfunction signalGroup(pgid: number, signal: NodeJS.Signals, expectedStart?: string | null): Error | undefined {\n if (!groupIsAlive(pgid, expectedStart)) return;\n try { process.kill(-pgid, signal); }\n catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ESRCH') return err instanceof Error ? err : new Error(String(err));\n }\n}\nfunction delay(ms: number): Promise<void> { return new Promise((resolve) => setTimeout(resolve, ms)); }\n","import type { DatabaseSync as DatabaseSyncType } from 'node:sqlite';\nimport { createRequire } from 'node:module';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { discoverRepository, isWithin, physicalPath } from './repository.js';\n\nconst require = createRequire(import.meta.url);\nconst { DatabaseSync } = require('node:sqlite') as {\n DatabaseSync: typeof DatabaseSyncType;\n};\n\nexport interface CoordEvent {\n id: number;\n timestamp: number;\n agent_id: string | null;\n event_type: string;\n payload: Record<string, unknown>;\n}\n\nexport class CoordDatabase {\n public readonly db: DatabaseSyncType;\n public readonly repoRoot: string;\n public readonly commonGitDir: string | null;\n public readonly isLinkedWorktree: boolean;\n public readonly coordDir: string;\n public readonly dbPath: string;\n private inTransaction = false;\n\n constructor(repoRoot: string, customDbPath?: string) {\n const layout = discoverRepository(repoRoot);\n this.repoRoot = layout.checkoutRoot;\n this.commonGitDir = layout.commonGitDir;\n this.isLinkedWorktree = layout.isLinkedWorktree;\n for (let current = fs.realpathSync.native(repoRoot); isWithin(this.repoRoot, current); current = path.dirname(current)) {\n const local = path.join(current, '.coord');\n if (local !== layout.coordDir && fs.existsSync(path.join(local, 'state.db'))) {\n throw new Error(`Legacy checkout-local coordination state found at ${local}. Stop clients and preserve that directory before consolidating shared state.`);\n }\n if (current === this.repoRoot) break;\n }\n this.coordDir = layout.coordDir;\n if (physicalPath(this.coordDir) !== this.coordDir) throw new Error('Coordination directory must not be a symlink');\n this.dbPath = customDbPath ?? path.join(this.coordDir, 'state.db');\n if (!customDbPath && physicalPath(this.dbPath) !== this.dbPath) throw new Error('Coordination database must not be a symlink');\n const recoveryFiles = !customDbPath && (fs.existsSync(path.join(this.coordDir, 'merge-train.lock')) || fs.existsSync(path.join(this.coordDir, 'setup.lock')) ||\n ['shadow-index', 'quarantine', 'snapshots', 'worktrees', 'setup'].some(name => {\n const dir = path.join(this.coordDir, name);\n return fs.existsSync(dir) && (!fs.lstatSync(dir).isDirectory() || fs.readdirSync(dir).length > 0);\n }));\n const sidecars = ['-wal', '-shm', '-journal'].some(suffix => fs.existsSync(this.dbPath + suffix));\n if (!fs.existsSync(this.dbPath) && (recoveryFiles || sidecars)) {\n throw new Error('Missing coordination database with existing recovery state. Stop clients and preserve the database, sidecars and worktrees before repair.');\n }\n // Reject unknown state through a read-only connection before pragmas, checkpoints or setup writes.\n if (fs.existsSync(this.dbPath)) {\n const probe = new DatabaseSync(this.dbPath, { readOnly: true });\n try {\n probe.exec('PRAGMA busy_timeout=10000; BEGIN');\n CoordDatabase.schemaVersion(probe, !recoveryFiles);\n const check = probe.prepare('PRAGMA quick_check(1)').get() as { quick_check: string };\n if (check.quick_check !== 'ok') throw new Error('Damaged coordination database. Preserve all state before repair.');\n } finally { probe.close(); }\n }\n fs.mkdirSync(this.coordDir, { recursive: true, mode: 0o700 });\n for (const name of ['shadow-index', 'quarantine', 'snapshots', 'worktrees']) {\n const target = path.join(this.coordDir, name);\n if (!isWithin(this.coordDir, physicalPath(target)) || physicalPath(target) !== target) {\n throw new Error(`Coordination subdirectory must not be a symlink: ${name}`);\n }\n fs.mkdirSync(target, { recursive: true });\n }\n\n this.db = new DatabaseSync(this.dbPath);\n\n try {\n this.configurePragmas(); this.migrate(!recoveryFiles);\n }\n catch (err) { this.db.close(); throw err; }\n }\n\n /** Validate an existing snapshot without migration or ownership changes. */\n public static inspectSchema(db: DatabaseSyncType): number {\n const version = this.schemaVersion(db, false);\n const check = db.prepare('PRAGMA quick_check(1)').get() as { quick_check: string };\n if (check.quick_check !== 'ok') throw new Error('Damaged coordination database. Preserve all state before repair.');\n return version;\n }\n\n private configurePragmas(): void {\n this.db.exec(`\n PRAGMA busy_timeout = 10000;\n PRAGMA journal_mode = WAL;\n PRAGMA synchronous = NORMAL;\n PRAGMA foreign_keys = ON;\n PRAGMA temp_store = MEMORY;\n `);\n }\n\n private static schemaVersion(db: DatabaseSyncType, allowEmpty: boolean): number {\n const tables = db.prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name NOT GLOB 'sqlite_*'\").all() as Array<{ name: string }>;\n if (!tables.length) {\n if (!allowEmpty) throw new Error('Empty coordination database with existing recovery files. Preserve all state before repair.');\n return 1; // Fresh or interrupted first initialization, with no recovery files.\n }\n if (!tables.some(table => table.name === 'meta')) throw new Error('Missing coordination schema metadata. Preserve the database before repair.');\n const row = db.prepare(\"SELECT value FROM meta WHERE key='schema_version'\").get() as { value: string } | undefined;\n if (row?.value !== '1' && row?.value !== '2') {\n throw new Error(`Unsupported coordination schema version: ${String(row?.value)}. Preserve the database before upgrading or repairing it.`);\n }\n const version = Number(row.value);\n const required = ['agents', 'tasks', 'locks', 'file_deps', 'contracts', 'conflicts', 'merge_queue', 'resources', 'quarantine', 'events',\n ...(version === 2 ? ['agent_sessions', 'mutex_waiters', 'mutex_runs'] : [])];\n if (required.some(name => !tables.some(table => table.name === name))) {\n throw new Error('Incomplete coordination schema. Preserve the database before repair.');\n }\n // Check ownership fields that could otherwise make live owners or guards appear absent.\n const columns: Record<string, string> = {\n agents: 'id,pid,pid_start_time,status,registered_at,lease_expires_at,worktree_path,branch',\n tasks: 'status,owner_agent_id,fencing_token,scope_globs_json,depends_on_json',\n locks: 'owner_agent_id,pattern,mode,fencing_token,expires_at',\n resources: 'type,name,owner_agent_id,fencing_token,expires_at',\n ...(version === 2 ? {\n agent_sessions: 'agent_id,token_hash,epoch',\n mutex_waiters: 'ticket,mutex_name,request_id,owner_agent_id,session_epoch,waiter_pid,waiter_start,expires_at',\n mutex_runs: 'mutex_name,run_id,owner_agent_id,session_epoch,fencing_token,supervisor_pid,supervisor_start,worker_pid,worker_start',\n } : {}),\n };\n for (const [table, fields] of Object.entries(columns)) {\n try { db.prepare(`SELECT ${fields} FROM ${table} LIMIT 0`); }\n catch { throw new Error(`Incomplete coordination schema (${table}). Preserve the database before repair.`); }\n }\n const epoch = CoordDatabase.fencingEpoch(db);\n const tokens = ['SELECT fencing_token AS token FROM locks', 'SELECT fencing_token FROM tasks',\n 'SELECT fencing_token FROM resources', 'SELECT fencing_token FROM merge_queue',\n ...(version === 2 ? ['SELECT epoch FROM agent_sessions', 'SELECT session_epoch FROM mutex_waiters', 'SELECT fencing_token FROM mutex_runs'] : [])];\n if (db.prepare(`SELECT 1 FROM (${tokens.join(' UNION ALL ')}) WHERE token IS NOT NULL AND (typeof(token)!='integer' OR token<0 OR token>?) LIMIT 1`).get(epoch)) {\n throw new Error('Invalid or regressed fencing counter. Preserve the database before repair.');\n }\n return version;\n }\n\n private static fencingEpoch(db: DatabaseSyncType): number {\n const row = db.prepare(\"SELECT value FROM meta WHERE key='fencing_epoch'\").get() as { value: string } | undefined;\n const epoch = Number(row?.value);\n if (!row || typeof row.value !== 'string' || !/^(0|[1-9][0-9]*)$/.test(row.value) || !Number.isSafeInteger(epoch)) {\n throw new Error('Missing or invalid fencing counter. Preserve the database before repair.');\n }\n return epoch;\n }\n\n private migrate(allowEmpty: boolean): void {\n this.withTransaction(() => {\n const version = CoordDatabase.schemaVersion(this.db, allowEmpty);\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n\n INSERT OR IGNORE INTO meta (key, value) VALUES ('fencing_epoch', '1000');\n INSERT OR IGNORE INTO meta (key, value) VALUES ('schema_version', '1');\n\n CREATE TABLE IF NOT EXISTS agents (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n client TEXT NOT NULL,\n pid INTEGER NOT NULL,\n pid_start_time TEXT NOT NULL,\n pgid INTEGER NOT NULL,\n worktree_path TEXT,\n branch TEXT,\n shadow_tree_sha TEXT,\n status TEXT NOT NULL DEFAULT 'active',\n last_seen_event_id INTEGER NOT NULL DEFAULT 0,\n registered_at INTEGER NOT NULL,\n last_heartbeat_at INTEGER NOT NULL,\n lease_expires_at INTEGER NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_agents_status ON agents(status);\n\n CREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n intent_summary TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'queued',\n priority INTEGER NOT NULL DEFAULT 0,\n owner_agent_id TEXT,\n fencing_token INTEGER,\n depends_on_json TEXT NOT NULL DEFAULT '[]',\n scope_globs_json TEXT NOT NULL DEFAULT '[]',\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status, priority DESC);\n CREATE INDEX IF NOT EXISTS idx_tasks_owner ON tasks(owner_agent_id);\n\n CREATE TABLE IF NOT EXISTS locks (\n id TEXT PRIMARY KEY,\n pattern TEXT NOT NULL,\n lock_type TEXT NOT NULL DEFAULT 'glob',\n mode TEXT NOT NULL DEFAULT 'exclusive',\n owner_agent_id TEXT NOT NULL,\n task_id TEXT,\n fencing_token INTEGER NOT NULL,\n reason TEXT NOT NULL DEFAULT '',\n acquired_at INTEGER NOT NULL,\n expires_at INTEGER NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_locks_owner ON locks(owner_agent_id);\n CREATE INDEX IF NOT EXISTS idx_locks_pattern ON locks(pattern);\n\n CREATE TABLE IF NOT EXISTS file_deps (\n source_file TEXT NOT NULL,\n target_file TEXT NOT NULL,\n imported_symbols_json TEXT NOT NULL DEFAULT '[]',\n file_hash TEXT NOT NULL,\n updated_at INTEGER NOT NULL,\n PRIMARY KEY (source_file, target_file)\n );\n\n CREATE INDEX IF NOT EXISTS idx_file_deps_target ON file_deps(target_file);\n\n CREATE TABLE IF NOT EXISTS contracts (\n id TEXT PRIMARY KEY,\n file_path TEXT NOT NULL,\n symbol_name TEXT NOT NULL,\n kind TEXT NOT NULL,\n signature TEXT NOT NULL,\n ast_hash TEXT NOT NULL,\n params_fingerprint TEXT NOT NULL,\n doc_comment TEXT NOT NULL DEFAULT '',\n owner_agent_id TEXT,\n version INTEGER NOT NULL DEFAULT 1,\n is_breaking INTEGER NOT NULL DEFAULT 0,\n updated_at INTEGER NOT NULL,\n UNIQUE(file_path, symbol_name)\n );\n\n CREATE TABLE IF NOT EXISTS conflicts (\n id TEXT PRIMARY KEY,\n agent_a TEXT NOT NULL,\n agent_b TEXT NOT NULL,\n file_path TEXT NOT NULL,\n severity TEXT NOT NULL,\n details_json TEXT NOT NULL,\n detected_at INTEGER NOT NULL,\n UNIQUE(agent_a, agent_b, file_path)\n );\n\n CREATE TABLE IF NOT EXISTS merge_queue (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n branch TEXT NOT NULL,\n worktree_path TEXT,\n status TEXT NOT NULL DEFAULT 'queued',\n fencing_token INTEGER NOT NULL,\n verification_cmd TEXT,\n diagnostics_output TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS resources (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n name TEXT NOT NULL,\n value TEXT NOT NULL,\n owner_agent_id TEXT NOT NULL,\n fencing_token INTEGER NOT NULL,\n queue_json TEXT NOT NULL DEFAULT '[]',\n acquired_at INTEGER NOT NULL,\n expires_at INTEGER NOT NULL,\n UNIQUE(type, name)\n );\n\n CREATE TABLE IF NOT EXISTS quarantine (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n command TEXT NOT NULL,\n file_path TEXT NOT NULL,\n patch_path TEXT NOT NULL,\n reason TEXT NOT NULL,\n created_at INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n timestamp INTEGER NOT NULL,\n agent_id TEXT,\n event_type TEXT NOT NULL,\n payload_json TEXT NOT NULL\n );\n `);\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS agent_sessions (\n agent_id TEXT PRIMARY KEY, token_hash TEXT NOT NULL, epoch INTEGER NOT NULL\n );\n CREATE TABLE IF NOT EXISTS mutex_waiters (\n ticket INTEGER PRIMARY KEY AUTOINCREMENT, mutex_name TEXT NOT NULL,\n request_id TEXT NOT NULL, owner_agent_id TEXT NOT NULL, session_epoch INTEGER NOT NULL,\n waiter_pid INTEGER NOT NULL, waiter_start TEXT NOT NULL, expires_at INTEGER NOT NULL,\n UNIQUE(mutex_name, request_id)\n );\n CREATE TABLE IF NOT EXISTS mutex_runs (\n mutex_name TEXT PRIMARY KEY, run_id TEXT NOT NULL UNIQUE, owner_agent_id TEXT NOT NULL,\n session_epoch INTEGER NOT NULL, fencing_token INTEGER NOT NULL,\n supervisor_pid INTEGER NOT NULL, supervisor_start TEXT NOT NULL,\n worker_pid INTEGER, worker_start TEXT\n );\n `);\n if (version < 2) {\n // Legacy sessions have no capability. Invalidate coordination ownership, never files.\n this.db.exec(`\n UPDATE tasks SET status='queued', owner_agent_id=NULL, fencing_token=NULL\n WHERE status='active' AND owner_agent_id IN (SELECT id FROM agents);\n DELETE FROM locks;\n DELETE FROM resources;\n DELETE FROM conflicts;\n UPDATE agents SET status='dead' WHERE status='active';\n UPDATE meta SET value='2' WHERE key='schema_version';\n `);\n }\n });\n }\n\n /**\n * Executes a synchronous callback inside a `BEGIN IMMEDIATE` transaction\n * with automatic jittered backoff retries if another process temporarily holds the WAL write lock.\n */\n public withTransaction<T>(fn: () => T, maxRetries = 12): T {\n if (this.inTransaction) {\n return fn();\n }\n\n let attempt = 0;\n while (true) {\n try {\n this.db.exec('BEGIN IMMEDIATE');\n this.inTransaction = true;\n try {\n const result = fn();\n this.db.exec('COMMIT');\n this.inTransaction = false;\n return result;\n } catch (innerErr) {\n try {\n this.db.exec('ROLLBACK');\n } catch {\n // Ignore rollback errors if connection already rolled back\n }\n this.inTransaction = false;\n throw innerErr;\n }\n } catch (err: unknown) {\n this.inTransaction = false;\n const msg = err instanceof Error ? err.message : String(err);\n if (\n attempt < maxRetries &&\n (msg.includes('SQLITE_BUSY') || msg.includes('database is locked'))\n ) {\n attempt++;\n const sleepMs = Math.min(250, 5 * Math.pow(1.5, attempt) + Math.random() * 10);\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, Math.round(sleepMs));\n continue;\n }\n throw err;\n }\n }\n }\n\n /**\n * Atomically increments and returns the next monotonic fencing token.\n */\n public nextFencingToken(): number {\n return this.withTransaction(() => {\n const next = this.currentFencingEpoch() + 1;\n if (!Number.isSafeInteger(next)) throw new Error('Fencing counter exhausted; preserve state before recovery.');\n this.db.prepare(\"UPDATE meta SET value=? WHERE key='fencing_epoch'\").run(String(next));\n return next;\n });\n }\n\n public currentFencingEpoch(): number {\n return CoordDatabase.fencingEpoch(this.db);\n }\n\n public logEvent(\n agentId: string | null,\n eventType: string,\n payload: Record<string, unknown> = {}\n ): number {\n const res = this.db\n .prepare(`\n INSERT INTO events (timestamp, agent_id, event_type, payload_json)\n VALUES (?, ?, ?, ?)\n `)\n .run(Date.now(), agentId, eventType, JSON.stringify(payload));\n return Number(res.lastInsertRowid);\n }\n\n public getEventsSince(sinceId: number, limit = 100): CoordEvent[] {\n const rows = this.db\n .prepare(`\n SELECT id, timestamp, agent_id, event_type, payload_json\n FROM events\n WHERE id > ?\n ORDER BY id ASC\n LIMIT ?\n `)\n .all(sinceId, limit) as Array<{\n id: number;\n timestamp: number;\n agent_id: string | null;\n event_type: string;\n payload_json: string;\n }>;\n\n return rows.map((r) => ({\n id: r.id,\n timestamp: r.timestamp,\n agent_id: r.agent_id,\n event_type: r.event_type,\n payload: JSON.parse(r.payload_json) as Record<string, unknown>,\n }));\n }\n\n public close(): void {\n try {\n this.db.close();\n } catch {\n // Ignore already closed\n }\n }\n}\n","import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { AstAnalyzer, ExtractedSymbol, SymbolKind } from './ast-analyzer.js';\nimport { FencingAndAgentManager } from './fencing.js';\nimport { CoordDatabase } from './db.js';\nimport { LockEngine } from './locks.js';\n\nexport interface ContractRecord {\n id: string;\n file_path: string;\n symbol_name: string;\n kind: SymbolKind;\n signature: string;\n ast_hash: string;\n params_fingerprint: string;\n doc_comment: string;\n owner_agent_id: string | null;\n version: number;\n is_breaking: boolean;\n updated_at: number;\n}\n\nexport interface BlastRadiusAlert {\n modifiedFile: string;\n symbolName: string;\n previousSignature: string;\n newSignature: string | null; // null if deleted\n affectedDownstreamFile: string;\n hopDistance: number;\n affectedAgentId: string | null;\n}\n\nexport interface FileModificationReport {\n filePath: string;\n upsertedContracts: ContractRecord[];\n removedSymbols: string[];\n breakingChanges: BlastRadiusAlert[];\n transitiveDependents: Array<{ filePath: string; hopDistance: number }>;\n}\n\nexport class DependencyAndContractEngine {\n constructor(\n private readonly coordDb: CoordDatabase,\n private readonly lockEngine: LockEngine,\n private readonly fencing: FencingAndAgentManager\n ) {}\n\n /**\n * Scans a repository directory to index initial file dependencies and exported contracts.\n */\n public indexRepositoryFiles(dirPath = this.coordDb.repoRoot): number {\n const files = this.walkSourceFiles(dirPath);\n let indexedCount = 0;\n for (const file of files) {\n this.recordFileModification(null, file);\n indexedCount++;\n }\n return indexedCount;\n }\n\n private walkSourceFiles(dir: string, acc: string[] = []): string[] {\n if (!fs.existsSync(dir) || dir !== this.coordDb.repoRoot && fs.existsSync(path.join(dir, '.git'))) return acc;\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (\n entry.name.startsWith('.') ||\n entry.name === 'node_modules' ||\n entry.name === 'dist' ||\n entry.name === 'build' ||\n entry.name === 'target' ||\n entry.name === 'coverage'\n ) {\n continue;\n }\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n this.walkSourceFiles(fullPath, acc);\n } else if (entry.isFile() && /\\.(ts|tsx|js|jsx|mjs|py)$/.test(entry.name) && !entry.name.endsWith('.d.ts')) {\n acc.push(fullPath);\n }\n }\n return acc;\n }\n\n /**\n * Automatically parses a modified file's imports and exports, updates the dependency graph\n * and Contract Blackboard, and calculates the transitive blast radius\n * if any exported signature changed or was removed.\n */\n public recordFileModification(\n agentId: string | null,\n rawFilePath: string,\n sourceContent?: string\n ): FileModificationReport {\n const analysis = AstAnalyzer.analyzeSource(\n this.coordDb.repoRoot,\n rawFilePath,\n sourceContent\n );\n const relPath = analysis.filePath;\n const now = Date.now();\n\n return this.coordDb.withTransaction(() => {\n if (agentId) this.fencing.assertSession(agentId);\n // 1. Update outgoing import edges in `file_deps`\n this.coordDb.db\n .prepare(`DELETE FROM file_deps WHERE source_file = ?`)\n .run(relPath);\n\n for (const imp of analysis.imports) {\n if (!imp.resolvedPath) continue;\n this.coordDb.db\n .prepare(`\n INSERT OR REPLACE INTO file_deps (\n source_file, target_file, imported_symbols_json, file_hash, updated_at\n )\n VALUES (?, ?, ?, ?, ?)\n `)\n .run(\n relPath,\n imp.resolvedPath,\n JSON.stringify(imp.importedSymbols),\n analysis.fileHash,\n now\n );\n }\n\n // 2. Compare new exports against existing contracts for this file\n const existingRows = this.coordDb.db\n .prepare(`SELECT * FROM contracts WHERE file_path = ?`)\n .all(relPath) as Array<Record<string, unknown>>;\n\n const existingBySymbol = new Map<string, ContractRecord>(\n existingRows.map((r) => [String(r.symbol_name), this.mapRowToContract(r)])\n );\n\n const newSymbolNames = new Set(analysis.exports.map((e) => e.symbolName));\n const upsertedContracts: ContractRecord[] = [];\n const removedSymbols: string[] = [];\n const changedSymbols: Array<{\n symbolName: string;\n previousSignature: string;\n newSignature: string | null;\n }> = [];\n\n // Check for removed exports\n for (const [oldName, oldContract] of existingBySymbol.entries()) {\n if (!newSymbolNames.has(oldName)) {\n removedSymbols.push(oldName);\n changedSymbols.push({\n symbolName: oldName,\n previousSignature: oldContract.signature,\n newSignature: null,\n });\n this.coordDb.db\n .prepare(`DELETE FROM contracts WHERE id = ?`)\n .run(oldContract.id);\n }\n }\n\n // Upsert current exports\n for (const exp of analysis.exports) {\n const prev = existingBySymbol.get(exp.symbolName);\n // A body-only edit does not republish every unchanged interface in the file.\n // Import edges above still reflect the newly analyzed source.\n if (prev && prev.kind === exp.kind && prev.signature === exp.signature\n && prev.ast_hash === exp.astHash && prev.params_fingerprint === exp.paramsFingerprint\n && prev.doc_comment === exp.docComment) continue;\n const isBreaking = prev !== undefined && prev.ast_hash !== exp.astHash;\n if (isBreaking && prev) {\n changedSymbols.push({\n symbolName: exp.symbolName,\n previousSignature: prev.signature,\n newSignature: exp.signature,\n });\n }\n\n const contract = this.upsertContractInternal({\n filePath: relPath,\n symbol: exp,\n agentId,\n prev,\n isBreaking,\n now,\n });\n upsertedContracts.push(contract);\n }\n\n // 3. Calculate transitive blast radius if exports were modified or removed\n const transitiveDependents = this.getTransitiveDependents(relPath, 4);\n const breakingChanges: BlastRadiusAlert[] = [];\n\n if (changedSymbols.length > 0 && transitiveDependents.length > 0) {\n const activeLocks = this.lockEngine.listLocks();\n\n for (const change of changedSymbols) {\n for (const dep of transitiveDependents) {\n // Check if this direct/transitive dependent imports the changed symbol (for hop=1)\n if (dep.hopDistance === 1 && dep.importedSymbols.length > 0) {\n if (\n !dep.importedSymbols.includes('*') &&\n !dep.importedSymbols.includes(change.symbolName)\n ) {\n continue;\n }\n }\n\n // Find if another active agent holds a lock covering `dep.filePath`\n const affectedLock = activeLocks.find(\n (l) =>\n l.owner_agent_id !== agentId &&\n LockEngine.patternsOverlap(dep.filePath, l.pattern)\n );\n\n const alert: BlastRadiusAlert = {\n modifiedFile: relPath,\n symbolName: change.symbolName,\n previousSignature: change.previousSignature,\n newSignature: change.newSignature,\n affectedDownstreamFile: dep.filePath,\n hopDistance: dep.hopDistance,\n affectedAgentId: affectedLock?.owner_agent_id ?? null,\n };\n breakingChanges.push(alert);\n\n if (agentId && affectedLock) {\n const conflictId = `conf_${crypto.randomBytes(6).toString('hex')}`;\n this.coordDb.db\n .prepare(`\n INSERT OR REPLACE INTO conflicts (\n id, agent_a, agent_b, file_path, severity, details_json, detected_at\n )\n VALUES (?, ?, ?, ?, 'transitive_contract_break', ?, ?)\n `)\n .run(\n conflictId,\n agentId,\n affectedLock.owner_agent_id,\n dep.filePath,\n JSON.stringify(alert),\n now\n );\n }\n }\n }\n\n this.coordDb.logEvent(agentId, 'contract_breaking_change', {\n filePath: relPath,\n breakingChanges,\n });\n } else if (upsertedContracts.length > 0 && agentId) {\n this.coordDb.logEvent(agentId, 'contracts_updated', {\n filePath: relPath,\n symbols: upsertedContracts.map((c) => ({\n name: c.symbol_name,\n signature: c.signature,\n version: c.version,\n })),\n });\n }\n\n return {\n filePath: relPath,\n upsertedContracts,\n removedSymbols,\n breakingChanges,\n transitiveDependents: transitiveDependents.map((d) => ({\n filePath: d.filePath,\n hopDistance: d.hopDistance,\n })),\n };\n });\n }\n\n /**\n * Explicitly publishes a contract to the shared blackboard (e.g. REST route, env var, or type).\n */\n public publishExplicitContract(params: {\n agentId: string;\n filePath: string;\n symbolName: string;\n kind: SymbolKind;\n signature: string;\n docComment?: string;\n }): ContractRecord {\n const relPath = LockEngine.normalizeFile(this.coordDb.repoRoot, params.filePath);\n const now = Date.now();\n const astHash = crypto\n .createHash('sha256')\n .update(params.signature)\n .digest('hex')\n .slice(0, 16);\n\n return this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const prevRow = this.coordDb.db\n .prepare(`SELECT * FROM contracts WHERE file_path = ? AND symbol_name = ?`)\n .get(relPath, params.symbolName) as Record<string, unknown> | undefined;\n const prev = prevRow ? this.mapRowToContract(prevRow) : undefined;\n const isBreaking = prev !== undefined && prev.ast_hash !== astHash;\n\n const contract = this.upsertContractInternal({\n filePath: relPath,\n symbol: {\n symbolName: params.symbolName,\n kind: params.kind,\n signature: params.signature,\n astHash,\n paramsFingerprint: `${params.kind}:${params.symbolName}`,\n docComment: params.docComment ?? '',\n },\n agentId: params.agentId,\n prev,\n isBreaking,\n now,\n });\n\n this.coordDb.logEvent(params.agentId, 'contract_published', {\n filePath: relPath,\n symbolName: params.symbolName,\n signature: params.signature,\n isBreaking,\n });\n\n return contract;\n });\n }\n\n private upsertContractInternal(params: {\n filePath: string;\n symbol: ExtractedSymbol;\n agentId: string | null;\n prev?: ContractRecord;\n isBreaking: boolean;\n now: number;\n }): ContractRecord {\n const id = params.prev?.id ?? `ctr_${crypto.randomBytes(6).toString('hex')}`;\n const version = params.prev\n ? params.prev.ast_hash !== params.symbol.astHash\n ? params.prev.version + 1\n : params.prev.version\n : 1;\n\n this.coordDb.db\n .prepare(`\n INSERT OR REPLACE INTO contracts (\n id, file_path, symbol_name, kind, signature,\n ast_hash, params_fingerprint, doc_comment,\n owner_agent_id, version, is_breaking, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n .run(\n id,\n params.filePath,\n params.symbol.symbolName,\n params.symbol.kind,\n params.symbol.signature,\n params.symbol.astHash,\n params.symbol.paramsFingerprint,\n params.symbol.docComment,\n params.agentId ?? params.prev?.owner_agent_id ?? null,\n version,\n params.isBreaking ? 1 : 0,\n params.now\n );\n\n return {\n id,\n file_path: params.filePath,\n symbol_name: params.symbol.symbolName,\n kind: params.symbol.kind,\n signature: params.symbol.signature,\n ast_hash: params.symbol.astHash,\n params_fingerprint: params.symbol.paramsFingerprint,\n doc_comment: params.symbol.docComment,\n owner_agent_id: params.agentId ?? params.prev?.owner_agent_id ?? null,\n version,\n is_breaking: params.isBreaking,\n updated_at: params.now,\n };\n }\n\n /**\n * Computes all files that directly or transitively import `targetFile` up to `maxHops` away.\n */\n public getTransitiveDependents(\n targetFile: string,\n maxHops = 4\n ): Array<{ filePath: string; hopDistance: number; importedSymbols: string[] }> {\n const normTarget = LockEngine.normalizeFile(this.coordDb.repoRoot, targetFile);\n const visited = new Map<string, { hopDistance: number; importedSymbols: string[] }>();\n let frontier: string[] = [normTarget];\n\n for (let hop = 1; hop <= maxHops; hop++) {\n const nextFrontier: string[] = [];\n for (const curr of frontier) {\n const rows = this.coordDb.db\n .prepare(`SELECT source_file, imported_symbols_json FROM file_deps WHERE target_file = ?`)\n .all(curr) as Array<{ source_file: string; imported_symbols_json: string }>;\n\n for (const r of rows) {\n if (r.source_file === normTarget || visited.has(r.source_file)) continue;\n visited.set(r.source_file, {\n hopDistance: hop,\n importedSymbols: JSON.parse(r.imported_symbols_json) as string[],\n });\n nextFrontier.push(r.source_file);\n }\n }\n if (nextFrontier.length === 0) break;\n frontier = nextFrontier;\n }\n\n return Array.from(visited.entries()).map(([filePath, meta]) => ({\n filePath,\n hopDistance: meta.hopDistance,\n importedSymbols: meta.importedSymbols,\n }));\n }\n\n public listContracts(filePathFilter?: string): ContractRecord[] {\n const rows = filePathFilter\n ? (this.coordDb.db\n .prepare(`SELECT * FROM contracts WHERE file_path = ? ORDER BY updated_at DESC`)\n .all(LockEngine.normalizeFile(this.coordDb.repoRoot, filePathFilter)) as Array<\n Record<string, unknown>\n >)\n : (this.coordDb.db\n .prepare(`SELECT * FROM contracts ORDER BY updated_at DESC`)\n .all() as Array<Record<string, unknown>>);\n\n return rows.map((r) => this.mapRowToContract(r));\n }\n\n private mapRowToContract(row: Record<string, unknown>): ContractRecord {\n return {\n id: String(row.id),\n file_path: String(row.file_path),\n symbol_name: String(row.symbol_name),\n kind: row.kind as SymbolKind,\n signature: String(row.signature),\n ast_hash: String(row.ast_hash),\n params_fingerprint: String(row.params_fingerprint),\n doc_comment: String(row.doc_comment ?? ''),\n owner_agent_id: (row.owner_agent_id as string | null) ?? null,\n version: Number(row.version),\n is_breaking: Boolean(row.is_breaking),\n updated_at: Number(row.updated_at),\n };\n }\n}\n","import crypto from 'node:crypto';\nimport { CoordDatabase } from './db.js';\nimport { FencingAndAgentManager } from './fencing.js';\nimport { LockConflict, LockEngine, LockRecord } from './locks.js';\n\nexport interface TaskRecord {\n id: string;\n title: string;\n intent_summary: string;\n status: 'queued' | 'active' | 'done' | 'blocked';\n priority: number;\n owner_agent_id: string | null;\n fencing_token: number | null;\n depends_on: string[];\n scope_globs: string[];\n created_at: number;\n updated_at: number;\n}\n\nexport interface DeclareIntentResult {\n ok: boolean;\n task: TaskRecord | null;\n fencingToken: number;\n locks: LockRecord[];\n lockConflicts: LockConflict[];\n activeSiblingIntents: TaskRecord[];\n}\n\nexport class IntentAndTaskEngine {\n constructor(\n private readonly coordDb: CoordDatabase,\n private readonly fencing: FencingAndAgentManager,\n private readonly lockEngine: LockEngine\n ) {}\n\n /**\n * Peer-to-Peer Mode: Declares an agent's intent, checks scope-lock collisions\n * and reserves the scope if available.\n */\n public declareIntent(params: {\n agentId: string;\n title: string;\n intentSummary?: string;\n scopeGlobs: string[];\n }): DeclareIntentResult {\n this.fencing.reapDeadAgents();\n const summary = params.intentSummary ?? params.title;\n\n return this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const activeTasks = this.listTasks({ status: 'active' }).filter(\n (t) => t.owner_agent_id !== params.agentId\n );\n\n const taskId = `task_${crypto.randomBytes(6).toString('hex')}`;\n const lockRes = this.lockEngine.acquireLocks({\n agentId: params.agentId,\n patterns: params.scopeGlobs,\n taskId,\n reason: params.title,\n });\n\n if (!lockRes.ok) {\n return {\n ok: false,\n task: null,\n fencingToken: lockRes.fencingToken,\n locks: [],\n lockConflicts: lockRes.conflicts,\n activeSiblingIntents: activeTasks,\n };\n }\n\n const now = Date.now();\n const normGlobs = params.scopeGlobs.map((g) =>\n LockEngine.normalizePattern(this.fencing.getAgent(params.agentId)?.worktree_path ?? this.coordDb.repoRoot, g)\n );\n\n this.coordDb.db\n .prepare(`\n INSERT INTO tasks (\n id, title, intent_summary, status, priority,\n owner_agent_id, fencing_token, depends_on_json, scope_globs_json,\n created_at, updated_at\n )\n VALUES (?, ?, ?, 'active', 50, ?, ?, '[]', ?, ?, ?)\n `)\n .run(\n taskId,\n params.title,\n summary,\n params.agentId,\n lockRes.fencingToken,\n JSON.stringify(normGlobs),\n now,\n now\n );\n\n this.coordDb.logEvent(params.agentId, 'intent_declared', {\n taskId,\n title: params.title,\n scopeGlobs: normGlobs,\n fencingToken: lockRes.fencingToken,\n });\n\n return {\n ok: true,\n task: this.getTask(taskId),\n fencingToken: lockRes.fencingToken,\n locks: lockRes.locks,\n lockConflicts: [],\n activeSiblingIntents: activeTasks,\n };\n });\n }\n\n /**\n * Orchestrator Mode: Adds a task to the DAG queue with optional dependencies and priority.\n */\n public addTask(params: {\n id?: string;\n title: string;\n intentSummary?: string;\n priority?: number;\n dependsOn?: string[];\n scopeGlobs?: string[];\n }): TaskRecord {\n const id = params.id ?? `task_${crypto.randomBytes(6).toString('hex')}`;\n const dependsOn = params.dependsOn ?? [];\n const scopeGlobs = (params.scopeGlobs ?? []).map((g) =>\n LockEngine.normalizePattern(this.coordDb.repoRoot, g)\n );\n\n return this.coordDb.withTransaction(() => {\n for (const depId of dependsOn) {\n if (depId === id) {\n throw new Error(`Task '${id}' cannot depend on itself.`);\n }\n const dep = this.getTask(depId);\n if (!dep) {\n throw new Error(`Dependency task '${depId}' does not exist.`);\n }\n if (this.hasPathInDag(depId, id)) {\n throw new Error(`Circular dependency detected between '${id}' and '${depId}'.`);\n }\n }\n\n const now = Date.now();\n this.coordDb.db\n .prepare(`\n INSERT INTO tasks (\n id, title, intent_summary, status, priority,\n owner_agent_id, fencing_token, depends_on_json, scope_globs_json,\n created_at, updated_at\n )\n VALUES (?, ?, ?, 'queued', ?, NULL, NULL, ?, ?, ?, ?)\n `)\n .run(\n id,\n params.title,\n params.intentSummary ?? params.title,\n params.priority ?? 10,\n JSON.stringify(dependsOn),\n JSON.stringify(scopeGlobs),\n now,\n now\n );\n\n this.coordDb.logEvent(null, 'task_queued', { id, title: params.title, dependsOn });\n return this.getTask(id)!;\n });\n }\n\n private hasPathInDag(startId: string, targetId: string, visited = new Set<string>()): boolean {\n if (startId === targetId) return true;\n if (visited.has(startId)) return false;\n visited.add(startId);\n\n const task = this.getTask(startId);\n if (!task) return false;\n for (const dep of task.depends_on) {\n if (this.hasPathInDag(dep, targetId, visited)) return true;\n }\n return false;\n }\n\n /**\n * Orchestrator Mode: Atomically claims the highest-priority unblocked task whose scope locks are available.\n */\n public claimNextTask(agentId: string): {\n claimed: boolean;\n task: TaskRecord | null;\n fencingToken: number | null;\n locks: LockRecord[];\n reason?: string;\n } {\n this.fencing.reapDeadAgents();\n\n return this.coordDb.withTransaction(() => {\n this.fencing.assertSession(agentId);\n const allTasks = this.listTasks();\n const taskById = new Map(allTasks.map((t) => [t.id, t]));\n const queued = allTasks\n .filter((t) => t.status === 'queued')\n .sort((a, b) => b.priority - a.priority || a.created_at - b.created_at);\n\n if (queued.length === 0) {\n return { claimed: false, task: null, fencingToken: null, locks: [], reason: 'no_queued_tasks' };\n }\n\n for (const candidate of queued) {\n const depsSatisfied = candidate.depends_on.every(\n (depId) => taskById.get(depId)?.status === 'done'\n );\n if (!depsSatisfied) continue;\n\n let fencingToken = this.coordDb.currentFencingEpoch();\n let locks: LockRecord[] = [];\n\n if (candidate.scope_globs.length > 0) {\n const lockRes = this.lockEngine.acquireLocks({\n agentId,\n patterns: candidate.scope_globs,\n taskId: candidate.id,\n reason: candidate.title,\n });\n if (!lockRes.ok) {\n continue;\n }\n fencingToken = lockRes.fencingToken;\n locks = lockRes.locks;\n } else {\n fencingToken = this.coordDb.nextFencingToken();\n }\n\n const now = Date.now();\n this.coordDb.db\n .prepare(`\n UPDATE tasks\n SET status = 'active', owner_agent_id = ?, fencing_token = ?, updated_at = ?\n WHERE id = ?\n `)\n .run(agentId, fencingToken, now, candidate.id);\n\n this.coordDb.logEvent(agentId, 'task_claimed', {\n taskId: candidate.id,\n title: candidate.title,\n fencingToken,\n });\n\n return {\n claimed: true,\n task: this.getTask(candidate.id),\n fencingToken,\n locks,\n };\n }\n\n return {\n claimed: false,\n task: null,\n fencingToken: null,\n locks: [],\n reason: 'all_queued_tasks_blocked_by_dependencies_or_locks',\n };\n });\n }\n\n public completeTask(params: {\n agentId: string;\n taskId?: string;\n fencingToken?: number;\n releaseLocks?: boolean;\n }): TaskRecord[] {\n return this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const rows = params.taskId\n ? [this.getTask(params.taskId)].filter((t): t is TaskRecord => t !== null)\n : this.listTasks({ status: 'active' }).filter((t) => t.owner_agent_id === params.agentId);\n\n const now = Date.now();\n const completed: TaskRecord[] = [];\n\n for (const task of rows) {\n if (task.status !== 'active' || task.owner_agent_id !== params.agentId) {\n throw new Error(\n `Task '${task.id}' is owned by '${task.owner_agent_id}', not '${params.agentId}'.`\n );\n }\n if (params.fencingToken !== undefined && task.fencing_token !== null) {\n this.fencing.verifyFencingToken(task.id, params.fencingToken, task.fencing_token);\n }\n\n this.coordDb.db\n .prepare(`UPDATE tasks SET status = 'done', updated_at = ? WHERE id = ?`)\n .run(now, task.id);\n\n if (params.releaseLocks !== false) {\n this.coordDb.db\n .prepare(`DELETE FROM locks WHERE owner_agent_id = ? AND task_id = ?`)\n .run(params.agentId, task.id);\n }\n\n this.coordDb.logEvent(params.agentId, 'task_completed', { taskId: task.id });\n completed.push(this.getTask(task.id)!);\n }\n\n return completed;\n });\n }\n\n public getTask(taskId: string): TaskRecord | null {\n const row = this.coordDb.db\n .prepare(`SELECT * FROM tasks WHERE id = ?`)\n .get(taskId) as\n | {\n id: string;\n title: string;\n intent_summary: string;\n status: 'queued' | 'active' | 'done' | 'blocked';\n priority: number;\n owner_agent_id: string | null;\n fencing_token: number | null;\n depends_on_json: string;\n scope_globs_json: string;\n created_at: number;\n updated_at: number;\n }\n | undefined;\n\n if (!row) return null;\n return {\n id: row.id,\n title: row.title,\n intent_summary: row.intent_summary,\n status: row.status,\n priority: row.priority,\n owner_agent_id: row.owner_agent_id,\n fencing_token: row.fencing_token,\n depends_on: JSON.parse(row.depends_on_json) as string[],\n scope_globs: JSON.parse(row.scope_globs_json) as string[],\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n }\n\n public listTasks(filter?: { status?: TaskRecord['status'] }): TaskRecord[] {\n this.fencing.reapDeadAgents();\n const rows = filter?.status\n ? (this.coordDb.db\n .prepare(`SELECT * FROM tasks WHERE status = ? ORDER BY priority DESC, created_at ASC`)\n .all(filter.status) as Array<Record<string, unknown>>)\n : (this.coordDb.db\n .prepare(`SELECT * FROM tasks ORDER BY priority DESC, created_at ASC`)\n .all() as Array<Record<string, unknown>>);\n\n return rows.map((row) => ({\n id: String(row.id),\n title: String(row.title),\n intent_summary: String(row.intent_summary),\n status: row.status as TaskRecord['status'],\n priority: Number(row.priority),\n owner_agent_id: (row.owner_agent_id as string | null) ?? null,\n fencing_token: (row.fencing_token as number | null) ?? null,\n depends_on: JSON.parse(String(row.depends_on_json)) as string[],\n scope_globs: JSON.parse(String(row.scope_globs_json)) as string[],\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at),\n }));\n }\n}\n","import { discoverRepository, physicalPath } from './repository.js';\nimport { execFileSync, execSync } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { FencingAndAgentManager } from './fencing.js';\nimport { CoordDatabase } from './db.js';\n\nexport interface MergeTrainEntry {\n id: string;\n agent_id: string;\n branch: string;\n worktree_path: string | null;\n status: 'queued' | 'testing' | 'merged' | 'failed';\n fencing_token: number;\n verification_cmd: string | null;\n diagnostics_output: string | null;\n created_at: number;\n updated_at: number;\n}\n\nexport interface SpeculativeMergeResult {\n merged: boolean;\n entry: MergeTrainEntry;\n mergedCommitSha: string | null;\n diagnostics: string;\n}\n\nexport class SpeculativeMergeTrain {\n constructor(private readonly coordDb: CoordDatabase, private readonly fencing: FencingAndAgentManager) {}\n\n /**\n * Enqueues and executes a Bors-style speculative integration test in an isolated staging\n * worktree before advancing the main repository branch.\n * Refuses Git conflicts and runs `verificationCmd` (e.g. `tsc --noEmit` or `npm test`) before fast-forwarding `main`.\n */\n public enqueueAndMerge(params: {\n agentId: string;\n branch: string;\n worktreePath?: string | null;\n verificationCmd?: string | null;\n commitMessage?: string;\n }): SpeculativeMergeResult {\n this.fencing.assertSession(params.agentId);\n const sessionEnv = this.fencing.sessionEnvironment(params.agentId);\n const now = Date.now();\n const id = `mrg_${crypto.randomBytes(6).toString('hex')}`;\n const token = this.coordDb.nextFencingToken();\n\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n this.coordDb.db\n .prepare(`\n INSERT INTO merge_queue (\n id, agent_id, branch, worktree_path, status,\n fencing_token, verification_cmd, diagnostics_output,\n created_at, updated_at\n )\n VALUES (?, ?, ?, ?, 'testing', ?, ?, NULL, ?, ?)\n `)\n .run(\n id,\n params.agentId,\n params.branch,\n params.worktreePath ?? null,\n token,\n params.verificationCmd ?? null,\n now,\n now\n );\n });\n\n const stageDir = path.join(this.coordDb.coordDir, 'worktrees', `_merge_train_${id}`);\n const lockPath = path.join(this.coordDb.coordDir, 'merge-train.lock');\n let lockFd: number | undefined;\n\n try {\n try {\n lockFd = fs.openSync(lockPath, 'wx', 0o600);\n fs.writeFileSync(lockFd, JSON.stringify({ pid: process.pid, entryId: id }));\n } catch {\n throw new Error('Merge train is busy. If its owner crashed, inspect .coord/merge-train.lock before removing it.');\n }\n const baseHead = this.gitHead(this.coordDb.repoRoot);\n const targetBranch = this.gitBranch(this.coordDb.repoRoot);\n if (!targetBranch) throw new Error('Merge target must be on a branch, not a detached HEAD.');\n this.requireCleanTarget();\n // Validate ownership and repository/branch identity before staging any source bytes.\n if (params.worktreePath) {\n const registered = this.fencing.getAgent(params.agentId)?.worktree_path;\n if (!registered || physicalPath(registered) !== physicalPath(params.worktreePath)) {\n throw new Error(\"Source checkout must be the agent's registered worktree.\");\n }\n const source = discoverRepository(params.worktreePath);\n if (source.commonGitDir !== this.coordDb.commonGitDir || source.checkoutRoot !== physicalPath(params.worktreePath)\n || this.gitBranch(source.checkoutRoot) !== params.branch.replace(/^refs\\/heads\\//, '')) {\n throw new Error('Source checkout repository or branch does not match the requested integration.');\n }\n }\n // 1. If the agent's worktree has uncommitted changes, commit them to its branch first\n if (params.worktreePath) {\n const statusOut = execFileSync('git', ['status', '--porcelain'], {\n cwd: params.worktreePath,\n encoding: 'utf8',\n }).trim();\n if (statusOut.length > 0) {\n execFileSync('git', ['add', '-A'], { cwd: params.worktreePath, env: sessionEnv, stdio: 'ignore' });\n execFileSync(\n 'git',\n [\n 'commit',\n '-m',\n params.commitMessage ?? `feat(${params.agentId}): automated worktree checkpoint`,\n ],\n { cwd: params.worktreePath, env: sessionEnv, stdio: 'ignore' }\n );\n }\n }\n\n // Freeze the source ref after its checkpoint; never interpret a user ref as merge options.\n const sourceSha = execFileSync('git', ['rev-parse', '--verify', '--end-of-options', `${params.branch}^{commit}`], {\n cwd: this.coordDb.repoRoot, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'],\n }).trim();\n // Clean up any previous staging worktree\n this.cleanupStageWorktree(stageDir);\n\n // Create detached staging worktree at repoRoot's HEAD\n execFileSync('git', ['worktree', 'add', '--detach', stageDir, baseHead], {\n cwd: this.coordDb.repoRoot,\n stdio: 'ignore',\n });\n\n // Hydrate node_modules into staging worktree if present\n const rootNodeModules = path.join(this.coordDb.repoRoot, 'node_modules');\n const stageNodeModules = path.join(stageDir, 'node_modules');\n const hydratedNodeModules = fs.existsSync(rootNodeModules) && !fs.existsSync(stageNodeModules);\n if (hydratedNodeModules) {\n fs.symlinkSync(rootNodeModules, stageNodeModules, 'dir');\n }\n\n // 2. Attempt merge of `params.branch` into detached HEAD in `stageDir`\n try {\n execFileSync(\n 'git',\n ['merge', '--no-ff', '-m', `Merge branch '${params.branch}' (${params.agentId})`, sourceSha],\n {\n cwd: stageDir, env: sessionEnv,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'pipe'],\n }\n );\n } catch {\n const conflictedFiles = execFileSync('git', ['diff', '--name-only', '--diff-filter=U', '-z'], {\n cwd: stageDir, encoding: 'utf8',\n }).split('\\0').filter(Boolean);\n throw new Error(conflictedFiles.length\n ? `Merge conflicts in ${conflictedFiles.map(file => JSON.stringify(file)).join(', ')}. Resolve conflicts in '${params.branch}' before merging.`\n : `git merge failed on branch '${params.branch}'.`);\n }\n\n const verifiedSha = this.gitHead(stageDir);\n\n // 3. Run verification command inside the speculative staging tree if specified\n let diagnostics = 'Speculative merge clean.';\n if (params.verificationCmd) {\n try {\n const out = execSync(params.verificationCmd, {\n cwd: stageDir, env: sessionEnv,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'pipe'],\n timeout: 120_000,\n });\n diagnostics = `Verification passed (${params.verificationCmd}):\\n${out.trim()}`.trim();\n } catch (verifyErr: unknown) {\n const stdout = (verifyErr as { stdout?: string })?.stdout ?? '';\n const stderr = (verifyErr as { stderr?: string })?.stderr ?? '';\n const combined = `${stdout}\\n${stderr}`.trim();\n throw new Error(\n `Speculative verification failed ('${params.verificationCmd}'):\\n${combined}`\n );\n }\n }\n\n // 4. Advance the main repository to the verified speculative commit\n const stageChanges = execFileSync('git', ['status', '--porcelain', '-z', '--untracked-files=normal'], {\n cwd: stageDir, encoding: 'utf8',\n }).split('\\0').filter(Boolean);\n const unchangedHydration = hydratedNodeModules && fs.lstatSync(stageNodeModules, { throwIfNoEntry: false })?.isSymbolicLink()\n && fs.readlinkSync(stageNodeModules) === rootNodeModules;\n if (this.gitHead(stageDir) !== verifiedSha || stageChanges.some(change => !(unchangedHydration && change === '?? node_modules'))) {\n throw new Error('Verification changed the staging checkout. Apply fixes in the source worktree and retry with a read-only check.');\n }\n\n if (this.gitHead(this.coordDb.repoRoot) !== baseHead ||\n this.gitBranch(this.coordDb.repoRoot) !== targetBranch) {\n throw new Error('Merge target changed during verification. Retry against the new target.');\n }\n this.fencing.assertSession(params.agentId);\n this.requireCleanTarget();\n execFileSync('git', ['merge', '--ff-only', verifiedSha], {\n cwd: this.coordDb.repoRoot,\n stdio: 'ignore',\n });\n\n this.cleanupStageWorktree(stageDir);\n\n const updatedAt = Date.now();\n this.coordDb.withTransaction(() => {\n this.coordDb.db\n .prepare(`\n UPDATE merge_queue\n SET status = 'merged', diagnostics_output = ?, updated_at = ?\n WHERE id = ?\n `)\n .run(diagnostics, updatedAt, id);\n\n this.coordDb.logEvent(params.agentId, 'merge_train_succeeded', {\n id,\n branch: params.branch,\n verifiedSha,\n });\n });\n\n return {\n merged: true,\n entry: this.getEntry(id)!,\n mergedCommitSha: verifiedSha,\n diagnostics,\n };\n } catch (err: unknown) {\n this.cleanupStageWorktree(stageDir);\n const diagnostics = err instanceof Error ? err.message : String(err);\n const updatedAt = Date.now();\n\n this.coordDb.withTransaction(() => {\n this.coordDb.db\n .prepare(`\n UPDATE merge_queue\n SET status = 'failed', diagnostics_output = ?, updated_at = ?\n WHERE id = ?\n `)\n .run(diagnostics, updatedAt, id);\n\n this.coordDb.logEvent(params.agentId, 'merge_train_failed', {\n id,\n branch: params.branch,\n diagnostics,\n });\n });\n\n return {\n merged: false,\n entry: this.getEntry(id)!,\n mergedCommitSha: null,\n diagnostics,\n };\n } finally {\n if (lockFd !== undefined) {\n fs.closeSync(lockFd);\n fs.unlinkSync(lockPath);\n }\n }\n }\n\n private gitHead(cwd: string): string {\n return execFileSync('git', ['rev-parse', 'HEAD'], { cwd, encoding: 'utf8' }).trim();\n }\n\n private gitBranch(cwd: string): string {\n return execFileSync('git', ['symbolic-ref', '--quiet', '--short', 'HEAD'], {\n cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'],\n }).trim();\n }\n\n private requireCleanTarget(): void {\n const status = execFileSync('git', ['status', '--porcelain', '--untracked-files=normal'], {\n cwd: this.coordDb.repoRoot, encoding: 'utf8',\n });\n if (status.split(/\\r?\\n/).some((line) => line && line !== '?? .coord/')) {\n throw new Error('Merge target has local changes. Commit or preserve them before integrating.');\n }\n }\n\n private cleanupStageWorktree(stageDir: string): void {\n if (!fs.existsSync(stageDir)) return;\n try {\n execFileSync('git', ['worktree', 'remove', '--force', stageDir], {\n cwd: this.coordDb.repoRoot,\n stdio: 'ignore',\n });\n } catch {\n if (fs.existsSync(stageDir)) {\n fs.rmSync(stageDir, { recursive: true, force: true });\n }\n try {\n execFileSync('git', ['worktree', 'prune'], {\n cwd: this.coordDb.repoRoot,\n stdio: 'ignore',\n });\n } catch {\n // Ignore\n }\n }\n }\n\n public getEntry(id: string): MergeTrainEntry | null {\n const row = this.coordDb.db\n .prepare(`SELECT * FROM merge_queue WHERE id = ?`)\n .get(id) as MergeTrainEntry | undefined;\n return row ?? null;\n }\n\n public listQueue(): MergeTrainEntry[] {\n return this.coordDb.db\n .prepare(`SELECT * FROM merge_queue ORDER BY created_at DESC`)\n .all() as unknown as MergeTrainEntry[];\n }\n}\n","import { execFileSync } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { CoordDatabase } from './db.js';\nimport { FencingAndAgentManager } from './fencing.js';\nimport { LockEngine } from './locks.js';\n\nexport interface ConflictRecord {\n id: string;\n agent_a: string;\n agent_b: string;\n file_path: string;\n severity:\n | 'text_conflict'\n | 'transitive_contract_break';\n details: {\n reason: string;\n baseBlob?: string;\n blobA?: string;\n blobB?: string;\n };\n detected_at: number;\n}\n\nexport interface DirtyMergeProbeResult {\n clean: boolean;\n mergedTreeSha: string | null;\n conflicts: ConflictRecord[];\n}\n\nexport class ShadowGitEngine {\n constructor(\n private readonly coordDb: CoordDatabase,\n private readonly fencing: FencingAndAgentManager\n ) {}\n\n public isGitRepository(dir = this.coordDb.repoRoot): boolean {\n try {\n execFileSync('git', ['rev-parse', '--is-inside-work-tree'], {\n cwd: dir,\n stdio: 'ignore',\n });\n return true;\n } catch {\n return false;\n }\n }\n\n public getHeadCommit(dir = this.coordDb.repoRoot): string | null {\n try {\n return execFileSync('git', ['rev-parse', 'HEAD'], {\n cwd: dir,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n }).trim();\n } catch {\n return null;\n }\n }\n\n private getShadowIndexPath(agentId: string): string {\n const safeId = agentId.replace(/[^a-zA-Z0-9_-]/g, '_');\n const epoch = this.fencing.assertSession(agentId);\n return path.join(this.coordDb.coordDir, 'shadow-index', `${safeId}-${epoch}.index`);\n }\n\n /**\n * Updates an agent's ephemeral shadow Git index (`.coord/shadow-index/<agent-id>.index`)\n * without touching the repository's real `.git/index`, and creates a synthetic shadow\n * commit object in `.git/objects` so `git merge-tree --write-tree` can run 3-way merges\n * across uncommitted files in <15ms.\n */\n public updateAgentShadowTree(params: {\n agentId: string;\n modifiedFiles?: Array<{ filePath: string; content?: string }>;\n worktreeDir?: string;\n }): string | null {\n this.fencing.assertSession(params.agentId);\n const targetDir = params.worktreeDir ?? this.coordDb.repoRoot;\n if (!this.isGitRepository(targetDir)) return null;\n\n const headCommit = this.getHeadCommit(targetDir);\n if (!headCommit) return null;\n\n const shadowIndex = this.getShadowIndexPath(params.agentId);\n const env = { ...process.env, GIT_INDEX_FILE: shadowIndex };\n\n // Initialize shadow index from HEAD if it doesn't exist yet\n if (!fs.existsSync(shadowIndex)) {\n execFileSync('git', ['read-tree', headCommit], {\n cwd: targetDir,\n env,\n stdio: 'ignore',\n });\n }\n\n if (params.worktreeDir && (!params.modifiedFiles || params.modifiedFiles.length === 0)) {\n // In an isolated worktree, stage all dirty working-tree files into the shadow index\n execFileSync('git', ['read-tree', headCommit], {\n cwd: targetDir,\n env,\n stdio: 'ignore',\n });\n execFileSync('git', ['add', '-A'], {\n cwd: targetDir,\n env,\n stdio: 'ignore',\n });\n } else if (params.modifiedFiles && params.modifiedFiles.length > 0) {\n for (const mod of params.modifiedFiles) {\n const relPath = LockEngine.normalizeFile(targetDir, mod.filePath);\n const absPath = path.join(targetDir, relPath);\n const content =\n mod.content ??\n (fs.existsSync(absPath) ? fs.readFileSync(absPath, 'utf8') : null);\n\n if (content === null) {\n // File was deleted\n {\n execFileSync('git', ['--literal-pathspecs', 'update-index', '--force-remove', '--', relPath], {\n cwd: targetDir,\n env,\n stdio: 'ignore',\n });\n }\n } else {\n const tracked = execFileSync('git', ['--literal-pathspecs', 'ls-files', '--stage', '-z', '--', relPath], {\n cwd: targetDir, env, encoding: 'utf8',\n }).split('\\0').find(Boolean);\n const trackedMode = tracked?.split(' ')[0];\n const stat = fs.existsSync(absPath) ? fs.lstatSync(absPath) : null;\n if (trackedMode && !['100644', '100755'].includes(trackedMode) || stat?.isSymbolicLink()) {\n throw new Error(`Cannot report symlinks or special entries as source content: ${relPath}`);\n }\n const mode = trackedMode ?? (stat && stat.mode & 0o111 ? '100755' : '100644');\n const blobSha = execFileSync('git', ['hash-object', '-w', '--stdin'], {\n cwd: targetDir,\n input: content,\n encoding: 'utf8',\n }).trim();\n\n execFileSync(\n 'git',\n ['update-index', '--add', '--cacheinfo', `${mode},${blobSha},${relPath}`],\n {\n cwd: targetDir,\n env,\n stdio: 'ignore',\n }\n );\n }\n }\n }\n\n const treeSha = execFileSync('git', ['write-tree'], {\n cwd: targetDir,\n env,\n encoding: 'utf8',\n }).trim();\n\n const shadowCommitSha = execFileSync(\n 'git',\n ['commit-tree', treeSha, '-p', headCommit, '-m', `kith-shadow:${params.agentId}`],\n {\n cwd: targetDir,\n encoding: 'utf8',\n }\n ).trim();\n\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n this.coordDb.db.prepare(`UPDATE agents SET shadow_tree_sha = ? WHERE id = ?`).run(shadowCommitSha, params.agentId);\n });\n\n return shadowCommitSha;\n }\n\n /**\n * Runs `git merge-tree --write-tree` across `agentId`'s dirty shadow commit and every\n * other active agent's dirty shadow commit (or branch).\n */\n public probeAllActiveConflicts(\n agentId: string,\n modifiedFiles?: Array<{ filePath: string; content?: string }>,\n worktreeDir?: string\n ): DirtyMergeProbeResult {\n const myShadowCommit = this.updateAgentShadowTree({\n agentId,\n modifiedFiles,\n worktreeDir,\n });\n\n if (!myShadowCommit) {\n return { clean: true, mergedTreeSha: null, conflicts: [] };\n }\n\n const activeAgents = this.fencing\n .listAgents(true)\n .filter((a) => a.id !== agentId && a.shadow_tree_sha);\n\n const allConflicts: ConflictRecord[] = [];\n let lastMergedTreeSha: string | null = null;\n\n // Also clear legacy derived conflict classifications before re-probing.\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(agentId);\n this.coordDb.db.prepare(`DELETE FROM conflicts WHERE (agent_a = ? OR agent_b = ?) AND severity IN ('text_conflict', 'ast_conflict', 'auto_mergeable')`).run(agentId, agentId);\n });\n\n for (const peer of activeAgents) {\n if (!peer.shadow_tree_sha) continue;\n const res = this.probePairConflict(\n agentId,\n myShadowCommit,\n peer.id,\n peer.shadow_tree_sha\n );\n if (res.mergedTreeSha) {\n lastMergedTreeSha = res.mergedTreeSha;\n }\n allConflicts.push(...res.conflicts);\n }\n\n return {\n clean: allConflicts.length === 0,\n mergedTreeSha: lastMergedTreeSha,\n conflicts: allConflicts,\n };\n }\n\n public probePairConflict(\n agentA: string,\n commitA: string,\n agentB: string,\n commitB: string\n ): DirtyMergeProbeResult {\n this.fencing.assertSession(agentA);\n try {\n const stdout = execFileSync(\n 'git',\n ['merge-tree', '--write-tree', '-z', commitA, commitB],\n {\n cwd: this.coordDb.repoRoot,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n }\n ).trim();\n\n const mergedTreeSha = stdout.split('\\0')[0]?.trim() ?? null;\n return {\n clean: true,\n mergedTreeSha,\n conflicts: [],\n };\n } catch (err: unknown) {\n const stdout =\n typeof (err as { stdout?: unknown })?.stdout === 'string'\n ? ((err as { stdout: string }).stdout ?? '')\n : '';\n\n const stageBlobsByFile = new Map<\n string,\n { stage1?: string; stage2?: string; stage3?: string }\n >();\n\n for (const line of stdout.split('\\0')) {\n // Format: 100644 <blob-sha> <stage>\\t<file-path>\n const m = line.match(/^(\\d{6}) ([0-9a-f]+) ([123])\\t([\\s\\S]+)$/);\n if (m) {\n const [, , blobSha, stage, filePath] = m;\n const entry = stageBlobsByFile.get(filePath) ?? {};\n if (stage === '1') entry.stage1 = blobSha;\n if (stage === '2') entry.stage2 = blobSha;\n if (stage === '3') entry.stage3 = blobSha;\n stageBlobsByFile.set(filePath, entry);\n }\n }\n\n if (stageBlobsByFile.size === 0) {\n throw new Error(`git merge-tree failed without a usable conflict result: ${err instanceof Error ? err.message : String(err)}`);\n }\n const conflicts: ConflictRecord[] = [];\n const now = Date.now();\n\n for (const [filePath, stages] of stageBlobsByFile.entries()) {\n const severity = 'text_conflict' as const;\n\n const record: ConflictRecord = {\n id: `conf_${crypto.randomBytes(6).toString('hex')}`,\n agent_a: agentA,\n agent_b: agentB,\n file_path: filePath,\n severity,\n details: {\n reason: 'Git merge conflict requires explicit resolution',\n baseBlob: stages.stage1,\n blobA: stages.stage2,\n blobB: stages.stage3,\n },\n detected_at: now,\n };\n\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(agentA);\n this.coordDb.db\n .prepare(`\n INSERT OR REPLACE INTO conflicts (\n id, agent_a, agent_b, file_path, severity, details_json, detected_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n .run(\n record.id,\n agentA,\n agentB,\n filePath,\n severity,\n JSON.stringify(record.details),\n now\n );\n });\n\n conflicts.push(record);\n }\n\n this.fencing.assertSession(agentA);\n if (conflicts.length) {\n this.coordDb.logEvent(agentA, 'dirty_merge_conflict', {\n peerAgent: agentB,\n files: conflicts.map((c) => c.file_path),\n });\n }\n\n return {\n clean: false,\n mergedTreeSha: null,\n conflicts,\n };\n }\n }\n\n public listConflicts(): ConflictRecord[] {\n this.fencing.reapDeadAgents();\n const rows = this.coordDb.db\n .prepare(`SELECT * FROM conflicts ORDER BY detected_at DESC`)\n .all() as Array<Record<string, unknown>>;\n\n return rows.map((r) => ({\n id: String(r.id),\n agent_a: String(r.agent_a),\n agent_b: String(r.agent_b),\n file_path: String(r.file_path),\n severity: r.severity as ConflictRecord['severity'],\n details: JSON.parse(String(r.details_json)) as ConflictRecord['details'],\n detected_at: Number(r.detected_at),\n }));\n }\n}\n","import { physicalPath } from './repository.js';\nimport { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { CoordDatabase } from './db.js';\nimport { FencingAndAgentManager } from './fencing.js';\n\nexport interface SpawnedWorktree {\n agentId: string;\n worktreePath: string;\n branch: string;\n hydrationMethod: 'apfs-cow' | 'reflink-cow' | 'copy' | 'none';\n hydratedDirs: string[];\n durationMs: number;\n}\n\nexport class CoWWorktreeManager {\n private static readonly HYDRATABLE_DIRS = ['node_modules', '.venv', 'venv', '.turbo'];\n private static readonly ENV_FILES = ['.env', '.env.local', '.env.development', '.env.test'];\n\n constructor(\n private readonly coordDb: CoordDatabase,\n private readonly fencing: FencingAndAgentManager\n ) {}\n\n /**\n * Spawns an isolated Git worktree for `agentId` and hydrates `node_modules` / `.env`\n * using APFS Copy-on-Write (`cp -cR`) on macOS or reflink on Linux (with independent-copy fallback).\n */\n public spawnWorktree(params: {\n agentId: string;\n branch?: string;\n baseRef?: string;\n }): SpawnedWorktree {\n this.fencing.assertSession(params.agentId);\n const start = Date.now();\n const safeId = params.agentId.replace(/[^a-zA-Z0-9_-]/g, '-');\n const branch = params.branch ?? `kith/${safeId}`;\n const baseRef = params.baseRef ?? 'HEAD';\n const worktreePath = path.join(this.coordDb.coordDir, 'worktrees', safeId);\n\n if (!this.fencing.getAgent(params.agentId)) throw new Error(`Unknown agent: ${params.agentId}`);\n if (!safeId || safeId === '.' || safeId === '..') throw new Error('Invalid agent ID');\n if (fs.existsSync(worktreePath)) {\n throw new Error(`Worktree already exists: ${worktreePath}. Commit or preserve its work before removing it.`);\n }\n\n fs.mkdirSync(path.dirname(worktreePath), { recursive: true });\n\n execFileSync('git', ['worktree', 'add', '-b', branch, worktreePath, baseRef], {\n cwd: this.coordDb.repoRoot,\n stdio: 'ignore',\n });\n\n const hydratedDirs: string[] = [];\n let hydrationMethod: SpawnedWorktree['hydrationMethod'] = 'none';\n\n for (const dirName of CoWWorktreeManager.HYDRATABLE_DIRS) {\n const srcDir = path.join(this.coordDb.repoRoot, dirName);\n const destDir = path.join(worktreePath, dirName);\n if (!fs.existsSync(srcDir) || fs.existsSync(destDir)) continue;\n\n const method = this.cloneDirectoryCoW(srcDir, destDir);\n hydrationMethod = method;\n hydratedDirs.push(dirName);\n }\n\n for (const envName of CoWWorktreeManager.ENV_FILES) {\n const srcEnv = path.join(this.coordDb.repoRoot, envName);\n const destEnv = path.join(worktreePath, envName);\n if (fs.existsSync(srcEnv) && !fs.existsSync(destEnv)) {\n fs.copyFileSync(srcEnv, destEnv);\n }\n }\n\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n this.coordDb.db\n .prepare(`UPDATE agents SET worktree_path = ?, branch = ? WHERE id = ?`)\n .run(worktreePath, branch, params.agentId);\n\n this.coordDb.logEvent(params.agentId, 'worktree_spawned', {\n worktreePath,\n branch,\n hydrationMethod,\n hydratedDirs,\n });\n });\n\n return {\n agentId: params.agentId,\n worktreePath,\n branch,\n hydrationMethod,\n hydratedDirs,\n durationMs: Date.now() - start,\n };\n }\n\n private cloneDirectoryCoW(\n srcDir: string,\n destDir: string\n ): 'apfs-cow' | 'reflink-cow' | 'copy' {\n if (process.platform === 'darwin') {\n try {\n execFileSync('cp', ['-cR', srcDir, destDir], {\n stdio: 'ignore',\n timeout: 5000,\n });\n return 'apfs-cow';\n } catch {\n // Fallback if volume is not APFS\n }\n } else if (process.platform === 'linux') {\n try {\n execFileSync('cp', ['--reflink=always', '-R', srcDir, destDir], {\n stdio: 'ignore',\n timeout: 5000,\n });\n return 'reflink-cow';\n } catch {\n // Fallback if filesystem does not support reflinks\n }\n }\n\n // A failed clone can leave a partial destination. Copy into an independent tree.\n fs.rmSync(destDir, { recursive: true, force: true });\n fs.cpSync(srcDir, destDir, { recursive: true, dereference: false });\n return 'copy';\n }\n\n public removeWorktree(agentId: string): boolean {\n this.fencing.assertSession(agentId);\n const safeId = agentId.replace(/[^a-zA-Z0-9_-]/g, '-');\n const worktreePath = path.join(this.coordDb.coordDir, 'worktrees', safeId);\n\n if (!fs.existsSync(worktreePath)) return false;\n const registered = this.fencing.getAgent(agentId)?.worktree_path;\n if (!registered || physicalPath(registered) !== physicalPath(worktreePath)\n || this.fencing.listAgents(true).some(agent => agent.id !== agentId && agent.worktree_path && physicalPath(agent.worktree_path) === physicalPath(worktreePath))) {\n throw new Error('Refusing to remove a worktree that is not exclusively registered to this agent.');\n }\n const status = execFileSync('git', ['status', '--porcelain', '--untracked-files=normal', '--ignored=matching'], {\n cwd: worktreePath, encoding: 'utf8',\n });\n if (status.trim()) {\n throw new Error(`Refusing to remove dirty worktree: ${worktreePath}. Commit or preserve changed, untracked, and ignored files first.`);\n }\n // The explicit status check also protects ignored files such as .env.\n execFileSync('git', ['worktree', 'remove', worktreePath], {\n cwd: this.coordDb.repoRoot, stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(agentId);\n this.coordDb.db.prepare(`UPDATE agents SET worktree_path = NULL, branch = NULL WHERE id = ?`).run(agentId);\n });\n\n return true;\n }\n\n public listWorktrees(): Array<{ path: string; head: string; branch: string | null }> {\n try {\n const out = execFileSync('git', ['worktree', 'list', '--porcelain'], {\n cwd: this.coordDb.repoRoot,\n encoding: 'utf8',\n });\n\n const entries: Array<{ path: string; head: string; branch: string | null }> = [];\n let current: { path: string; head: string; branch: string | null } | null = null;\n\n for (const line of out.split(/\\r?\\n/)) {\n if (line.startsWith('worktree ')) {\n if (current) entries.push(current);\n current = { path: line.slice('worktree '.length).trim(), head: '', branch: null };\n } else if (line.startsWith('HEAD ') && current) {\n current.head = line.slice('HEAD '.length).trim();\n } else if (line.startsWith('branch ') && current) {\n current.branch = line.slice('branch '.length).replace(/^refs\\/heads\\//, '').trim();\n }\n }\n if (current) entries.push(current);\n return entries;\n } catch {\n return [];\n }\n }\n}\n","import { KITH_PROTOCOL_VERSION } from '../version.js';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { createRequire } from 'node:module';\nimport type { DatabaseSync as Database } from 'node:sqlite';\nimport { CoordDatabase } from './db.js';\nimport { discoverRepository, isWithin, physicalPath } from './repository.js';\nimport type { AgentRecord } from './fencing.js';\nimport { observeWorkspaces } from './workspace-observation.js';\nconst { DatabaseSync } = createRequire(import.meta.url)('node:sqlite') as { DatabaseSync: typeof Database };\n\n/** Copies a consistent stopped-state set before opening SQLite, so even SHM reconstruction cannot touch original recovery files. */\nexport function readCoordinationState(directory = process.cwd()) {\n const layout = discoverRepository(directory), observedAt = Date.now();\n const empty = { protocolVersion: KITH_PROTOCOL_VERSION, observedAt, repository: { root: layout.checkoutRoot, commonGitDir: layout.commonGitDir, coordDir: layout.coordDir },\n runtime: { node: process.version }, state: 'missing' as 'ready'|'missing'|'unavailable', error: undefined as string|undefined,\n fencingEpoch: 0, agents: [] as AgentRecord[], tasks: [] as Record<string,unknown>[], locks: [] as Record<string,unknown>[],\n conflicts: [] as Record<string,unknown>[], contracts: [] as Record<string,unknown>[], resources: [] as Record<string,unknown>[],\n mergeQueue: [] as Record<string,unknown>[], quarantined: [] as Record<string,unknown>[], mutexWaiters: [] as Record<string,unknown>[],\n commandGuards: [] as Record<string,unknown>[], events: [] as Record<string,unknown>[], workspaces: [] as ReturnType<typeof observeWorkspaces> };\n let scratch: string | undefined, db: Database | undefined;\n try {\n const file = path.join(layout.coordDir,'state.db');\n if (physicalPath(layout.coordDir) !== layout.coordDir || physicalPath(file) !== file) throw new Error('Coordination state must not be a symlink');\n for (let current = fs.realpathSync.native(directory); isWithin(layout.checkoutRoot, current); current = path.dirname(current)) {\n const local = path.join(current,'.coord');\n if (local !== layout.coordDir && fs.existsSync(path.join(local,'state.db'))) throw new Error(`Legacy independent state at ${local}; preserve it before consolidation`);\n if (current === layout.checkoutRoot) break;\n }\n if (!fs.existsSync(file)) {\n if (['setup.lock', 'merge-train.lock'].some(name => fs.existsSync(path.join(layout.coordDir, name))) || ['-wal','-shm','-journal'].some(s => fs.existsSync(file+s)) || ['worktrees','quarantine','snapshots','shadow-index','setup'].some(name => { const p=path.join(layout.coordDir,name); return fs.existsSync(p) && (!fs.lstatSync(p).isDirectory() || fs.readdirSync(p).length>0); })) throw new Error('Missing database with retained sidecars; preserve the recovery set');\n return empty;\n }\n const files = ['', '-wal', '-shm', '-journal'].map(s => file+s);\n const identity = (f: string) => {\n if (!fs.existsSync(f)) return null;\n if (physicalPath(f) !== f || !fs.lstatSync(f).isFile()) throw new Error('Database or sidecar is redirected or not a regular file');\n const s=fs.statSync(f,{bigint:true}); return [s.dev,s.ino,s.size,s.mtimeNs,s.ctimeNs].join(':');\n };\n const before = files.map(identity);\n scratch = fs.mkdtempSync(path.join(os.tmpdir(),'kith-observe-'));\n for (let i=0;i<files.length;i++) if (before[i]) {\n const target = path.join(scratch,path.basename(files[i])); fs.copyFileSync(files[i],target); fs.chmodSync(target,0o600);\n }\n if (JSON.stringify(before)!==JSON.stringify(files.map(identity))) throw new Error('Coordination state changed during snapshot; stop writers or retry');\n db = new DatabaseSync(path.join(scratch,'state.db'), {readOnly:true});\n db.exec('PRAGMA query_only=ON; PRAGMA busy_timeout=1000; BEGIN');\n if (CoordDatabase.inspectSchema(db)!==2) throw new Error('Offline observation requires schema 2; preserve state and upgrade with clients stopped');\n const all = <T=Record<string,unknown>>(sql:string) => db!.prepare(sql).all() as unknown as T[];\n const agents=all<AgentRecord>('SELECT * FROM agents ORDER BY registered_at DESC');\n const state = { ...empty, state:'ready' as const,\n fencingEpoch:Number((db.prepare(\"SELECT value FROM meta WHERE key='fencing_epoch'\").get() as {value:string}).value), agents,\n tasks:all('SELECT * FROM tasks ORDER BY priority DESC,created_at').map(({depends_on_json,scope_globs_json,...r})=>({...r,depends_on:JSON.parse(String(depends_on_json)),scope_globs:JSON.parse(String(scope_globs_json))})),\n locks:all('SELECT * FROM locks ORDER BY acquired_at'),\n conflicts:all('SELECT * FROM conflicts ORDER BY detected_at DESC').map(({details_json,...r})=>({...r,details:JSON.parse(String(details_json))})),\n contracts:all('SELECT * FROM contracts ORDER BY updated_at DESC').map(r=>({...r,is_breaking:Boolean(r.is_breaking)})),\n resources:all('SELECT * FROM resources ORDER BY acquired_at'), mergeQueue:all('SELECT * FROM merge_queue ORDER BY created_at DESC'),\n quarantined:all('SELECT * FROM quarantine ORDER BY created_at DESC'),\n mutexWaiters:all('SELECT ticket,mutex_name,owner_agent_id,session_epoch,expires_at FROM mutex_waiters ORDER BY ticket'),\n commandGuards:all('SELECT mutex_name,owner_agent_id,worker_pid,supervisor_pid FROM mutex_runs ORDER BY mutex_name'),\n events:all('SELECT * FROM events ORDER BY id DESC LIMIT 100').map(({payload_json,...r})=>({...r,payload:JSON.parse(String(payload_json))})),\n workspaces:observeWorkspaces(layout.checkoutRoot,agents,observedAt),\n };\n db.exec('COMMIT'); return state;\n } catch(error) { return {...empty,state:'unavailable' as const,error:error instanceof Error ? error.message : String(error)}; }\n finally { db?.close(); if(scratch) fs.rmSync(scratch,{recursive:true,force:true}); }\n}\n\n/** Recovery is an inspection report: it never clears guards, expires claims, deletes worktrees or restores files. */\nexport function recoveryReport(directory=process.cwd()) {\n const state=readCoordinationState(directory), retainedRoot=path.join(state.repository.coordDir,'worktrees');\n const retained = physicalPath(retainedRoot) === retainedRoot && fs.existsSync(retainedRoot) && fs.lstatSync(retainedRoot).isDirectory() && !fs.lstatSync(retainedRoot).isSymbolicLink()\n ? fs.readdirSync(retainedRoot,{withFileTypes:true}).map(entry=>({path:path.join(retainedRoot,entry.name),symlink:entry.isSymbolicLink(),\n agentIds:state.agents.filter(a=>a.worktree_path===path.join(retainedRoot,entry.name)).map(a=>a.id)})) : [];\n return {...state,retainedWorktrees:retained,expiredClaims:state.locks.filter(lock=>Number(lock.expires_at)<=state.observedAt),\n unfinishedIntegrations:state.mergeQueue.filter(entry=>entry.status!=='merged'),\n setupLock:{path:path.join(state.repository.coordDir,'setup.lock'),present:fs.existsSync(path.join(state.repository.coordDir,'setup.lock'))},\n integrationLock:{path:path.join(state.repository.coordDir,'merge-train.lock'),present:fs.existsSync(path.join(state.repository.coordDir,'merge-train.lock'))}};\n}\n"],"mappings":"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","names":["execFileSync","git","execFileSync","fs","path","fs","path","crypto","fs","path","crypto","fs","path","execFileSync","crypto","fs","path","epoch","path","fs","crypto","crypto","path","fs","fs","crypto","now","crypto","fs","fs","path","require","fs","path","crypto","fs","path","fs","path","crypto","crypto","crypto","execFileSync","crypto","fs","path","execFileSync","crypto","fs","path","execFileSync","path","fs","crypto","execFileSync","fs","path","fs","path","fs","path","createRequire","DatabaseSync","createRequire","path","fs"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/claim-wait.ts","../src/version.ts","../src/core/workspace-observation.ts","../src/core/repository.ts","../src/core/engine.ts","../src/core/ast-analyzer.ts","../src/core/bash-guard.ts","../src/core/locks.ts","../src/core/glob.ts","../src/core/fencing.ts","../src/core/broker.ts","../src/core/db.ts","../src/core/dep-graph.ts","../src/core/intents.ts","../src/core/merge-train.ts","../src/core/shadow-git.ts","../src/core/worktree-cow.ts","../src/core/observation.ts"],"sourcesContent":["/** Cooperative, bounded retry. No transaction or partial claim is held while sleeping. */\nexport async function waitForClaim<T extends { ok: boolean }>(params: {\n attempt: () => T; heartbeat: () => void; signal?: AbortSignal; waitTimeoutMs: number;\n}): Promise<T & { waitedMs: number; waitTimedOut: boolean }> {\n const { waitTimeoutMs, signal } = params;\n if (!Number.isSafeInteger(waitTimeoutMs) || waitTimeoutMs < 0 || waitTimeoutMs > 600_000) {\n throw new Error('waitTimeoutMs must be an integer between 0 and 600000');\n }\n const started = performance.now();\n let previous: T | undefined;\n for (;;) {\n signal?.throwIfAborted();\n const elapsed = Math.round(performance.now() - started);\n if (previous && elapsed >= waitTimeoutMs) return { ...previous, waitedMs: elapsed, waitTimedOut: true };\n params.heartbeat();\n const result = params.attempt();\n const waitedMs = Math.round(performance.now() - started);\n if (result.ok || waitedMs >= waitTimeoutMs) return { ...result, waitedMs, waitTimedOut: !result.ok };\n previous = result;\n await new Promise<void>((resolve, reject) => {\n const abort = () => { clearTimeout(timer); reject(signal!.reason); };\n const timer = setTimeout(() => { signal?.removeEventListener('abort', abort); resolve(); }, Math.min(100, waitTimeoutMs - waitedMs));\n signal?.addEventListener('abort', abort, { once: true });\n });\n }\n}\n","export const KITH_VERSION = '0.1.4';\nexport const KITH_PROTOCOL_VERSION = '1.3.0';\n","import { execFileSync, spawnSync } from 'node:child_process';\nimport type { AgentRecord } from './fencing.js';\nimport { discoverRepository, physicalPath } from './repository.js';\n\nfunction git(cwd: string, ...args: string[]): string {\n return execFileSync('git', ['-c', 'core.fsmonitor=false', ...args], {\n cwd, encoding: 'utf8', env: { ...process.env, GIT_OPTIONAL_LOCKS: '0' },\n stdio: ['ignore','pipe','pipe'], timeout: 5000, maxBuffer: 4 * 1024 * 1024,\n });\n}\nexport interface WorktreeChange { status: string; path: string; originalPath?: string }\nexport function worktreeChanges(cwd: string): WorktreeChange[] {\n const records = git(cwd, 'status', '--porcelain=v1', '-z', '--untracked-files=all').split('\\0');\n const changes: WorktreeChange[] = [];\n for (let i = 0; i < records.length; i++) {\n const record = records[i]; if (!record) continue;\n const change: WorktreeChange = { status: record.slice(0,2), path: record.slice(3) };\n if (/[RC]/.test(change.status)) change.originalPath = records[++i];\n changes.push(change);\n }\n return changes;\n}\nexport interface WorkspaceObservation {\n agentId: string; path: string; recordedBranch: string | null; status: AgentRecord['status'];\n leaseExpired: boolean; lastHeartbeatAt: number; available: boolean; error?: string;\n branch: string | null; head: string | null; comparisonBase: string | null;\n dirtyFiles: WorktreeChange[]; lastCommitAt: number | null; hoursSinceLastCommit: number | null;\n ahead: number | null; behind: number | null; overlaps: Array<{ path: string; agentIds: string[] }>;\n}\n/** Git observation never stages files, checks out branches, fetches, or refreshes the index. */\nexport function observeWorkspaces(repoRoot: string, agents: AgentRecord[], now = Date.now()): WorkspaceObservation[] {\n let base: string | null = null;\n try { base = git(repoRoot, 'rev-parse', '--verify', 'HEAD').trim(); } catch { /* Non-Git or unborn checkout. */ }\n const workspaces = agents.filter(a => a.worktree_path || a.status === 'active').map(a => {\n const result: WorkspaceObservation = { agentId: a.id, path: a.worktree_path ?? repoRoot, recordedBranch: a.branch, status: a.status,\n leaseExpired: a.lease_expires_at <= now, lastHeartbeatAt: a.last_heartbeat_at, available: false,\n branch: null, head: null, comparisonBase: base, dirtyFiles: [], lastCommitAt: null, hoursSinceLastCommit: null, ahead: null, behind: null, overlaps: [] };\n try {\n if (discoverRepository(result.path).commonGitDir !== discoverRepository(repoRoot).commonGitDir) throw new Error('Workspace belongs to another repository');\n result.dirtyFiles = worktreeChanges(result.path);\n result.head = git(result.path, 'rev-parse', '--verify', 'HEAD').trim();\n result.branch = git(result.path, 'branch', '--show-current').trim() || null;\n result.lastCommitAt = Number(git(result.path, 'show', '-s', '--format=%ct', 'HEAD').trim()) * 1000;\n result.hoursSinceLastCommit = Math.max(0, now - result.lastCommitAt) / 3_600_000;\n if (base) {\n const [behind, ahead] = git(result.path, 'rev-list', '--left-right', '--count', `${base}...${result.head}`).trim().split(/\\s+/).map(Number);\n result.ahead = ahead; result.behind = behind;\n }\n result.available = true;\n } catch (error) { result.error = error instanceof Error ? error.message : String(error); }\n return result;\n });\n for (const workspace of workspaces) {\n if (!workspace.available) continue;\n const files = new Set(workspace.dirtyFiles.flatMap(c => [c.path, ...(c.originalPath ? [c.originalPath] : [])]));\n for (const file of files) {\n const peers = workspaces.filter(peer => peer.agentId !== workspace.agentId && peer.status === 'active' && peer.available\n && peer.dirtyFiles.some(c => c.path === file || c.originalPath === file)).map(peer => peer.agentId);\n if (peers.length) workspace.overlaps.push({ path: file, agentIds: peers });\n }\n }\n return workspaces;\n}\n\n/** Preview committed inputs only. merge-tree may write unreachable Git objects, never worktree/index/database contents. */\nexport function previewIntegration(repoRoot: string, agent: AgentRecord) {\n if (!agent.worktree_path || !agent.branch) throw new Error('Integration preview requires a registered worktree and branch');\n const source = discoverRepository(agent.worktree_path), target = discoverRepository(repoRoot);\n if (source.checkoutRoot !== physicalPath(agent.worktree_path) || source.commonGitDir !== target.commonGitDir\n || git(agent.worktree_path, 'branch', '--show-current').trim() !== agent.branch.replace(/^refs\\/heads\\//,'')) {\n throw new Error('Registered source checkout repository or branch does not match');\n }\n const sourceHead = git(agent.worktree_path, 'rev-parse', '--verify', 'HEAD').trim();\n const targetHead = git(repoRoot, 'rev-parse', '--verify', 'HEAD').trim();\n const dirtyFiles = worktreeChanges(agent.worktree_path);\n const targetDirtyFiles = worktreeChanges(repoRoot).filter(change => !(change.status === '??' && target.coordDir === target.checkoutRoot + '/.coord' && change.path.startsWith('.coord/')));\n const sourceBranch=git(agent.worktree_path,'branch','--show-current').trim(), targetBranch=git(repoRoot,'branch','--show-current').trim();\n if(!targetBranch) throw new Error('Integration target must be on a branch');\n if(targetDirtyFiles.length) return {ok:false,clean:null,sourceHead,targetHead,sourceBranch,targetBranch,conflicts:[],dirtyFiles,targetDirtyFiles,reason:'Integration target has local changes. Preserve or commit them before preview.'};\n if (dirtyFiles.length) return { ok: false, clean: null, sourceHead, targetHead, sourceBranch, targetBranch, conflicts: [], dirtyFiles, targetDirtyFiles,\n reason: 'Commit or preserve source changes before preview. Uncommitted edits are not included in a committed-tree preview.' };\n const drivers = spawnSync('git', ['config', '--get-regexp', '^merge\\\\..*\\\\.driver$'], {\n cwd: repoRoot, encoding: 'utf8', timeout: 5000, maxBuffer: 4 * 1024 * 1024,\n });\n if (drivers.error || drivers.status !== 0 && drivers.status !== 1) throw new Error('Cannot inspect merge-driver configuration safely');\n if (drivers.status === 0) throw new Error('Integration preview is unavailable with configured custom merge drivers; they can execute commands');\n const probe = spawnSync('git', ['merge-tree', '--write-tree', '-z', targetHead, sourceHead], {\n cwd: repoRoot, encoding: 'utf8', env: { ...process.env, GIT_OPTIONAL_LOCKS: '0' }, timeout: 10_000, maxBuffer: 4 * 1024 * 1024,\n });\n if (probe.error || probe.status !== 0 && probe.status !== 1) throw new Error(`Git integration preview failed: ${probe.error?.message ?? probe.stderr}`);\n // Conflict stages precede the empty record separating informational messages.\n const stages = probe.stdout.split('\\0').slice(1);\n const boundary = stages.indexOf('');\n const conflicts = [...new Set(stages.slice(0, boundary < 0 ? stages.length : boundary).flatMap(record => {\n const match = /^\\d{6} [0-9a-f]+ [123]\\t([\\s\\S]+)$/.exec(record); return match ? [match[1]] : [];\n }))];\n if (probe.status === 1 && !conflicts.length) throw new Error('Git returned a conflict without identifiable paths; preview is unavailable');\n if (git(repoRoot,'rev-parse','HEAD').trim() !== targetHead || git(agent.worktree_path,'rev-parse','HEAD').trim() !== sourceHead\n || git(repoRoot,'branch','--show-current').trim() !== targetBranch\n || git(agent.worktree_path,'branch','--show-current').trim() !== sourceBranch\n || worktreeChanges(repoRoot).some(change => !(change.status === '??' && target.coordDir === target.checkoutRoot + '/.coord' && change.path.startsWith('.coord/')))\n || worktreeChanges(agent.worktree_path).length) throw new Error('Source or target changed during preview; retry');\n return { ok: true, clean: probe.status === 0, sourceHead, targetHead, sourceBranch, targetBranch, conflicts, dirtyFiles, targetDirtyFiles, verified: false };\n}\n\n","import { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface RepositoryLayout {\n checkoutRoot: string;\n commonGitDir: string | null;\n isLinkedWorktree: boolean;\n coordDir: string;\n}\n\n/** Resolve missing leaves through their nearest existing parent; never hide a broken link. */\nexport function physicalPath(input: string): string {\n if (process.platform === 'win32') input = input.replaceAll('/', path.sep);\n const absolute = path.isAbsolute(input) ? input : process.cwd() + path.sep + input;\n let current = path.parse(absolute).root;\n for (const component of absolute.slice(current.length).split(path.sep)) {\n if (!component || component === '.') continue;\n if (component === '..') { current = path.dirname(current); continue; }\n const candidate = path.join(current, component);\n try {\n fs.lstatSync(candidate);\n current = fs.realpathSync.native(candidate);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;\n // A symlink with a missing target is not a missing leaf.\n try { fs.lstatSync(candidate); throw new Error(`Unresolved symlink: ${candidate}`); }\n catch (statError) { if ((statError as NodeJS.ErrnoException).code !== 'ENOENT') throw statError; }\n current = candidate;\n }\n }\n return current;\n}\n\nexport function isWithin(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative !== '..' && !relative.startsWith('..' + path.sep) && !path.isAbsolute(relative);\n}\n\n/** Resolve a concrete file, including missing leaves, and refuse symlinks leaving the checkout. */\nexport function repositoryFile(root: string, file: string): string {\n if (!file || /[\\x00-\\x1f\\x7f]/u.test(file) || process.platform !== 'win32' && file.includes('\\\\')) throw new Error(`Invalid file path: ${file}`);\n const canonicalRoot = physicalPath(root);\n const target = physicalPath(path.isAbsolute(file) ? file : canonicalRoot + path.sep + file);\n if (!isWithin(canonicalRoot, target) || target === canonicalRoot) {\n throw new Error(`File is outside repository: ${file}`);\n }\n return path.relative(canonicalRoot, target).split(path.sep).join('/');\n}\n\n/** Git's common directory identifies shared coordination; Git operations stay in this checkout. */\nexport function discoverRepository(input: string): RepositoryLayout {\n const directory = fs.realpathSync.native(input);\n if (directory === path.parse(directory).root) {\n throw new Error('Cannot coordinate a filesystem root; select an explicit project with --repo.');\n }\n if (!fs.statSync(directory).isDirectory()) throw new Error(`Not a directory: ${input}`);\n const git = (...args: string[]) => execFileSync('git', ['rev-parse', ...args], {\n cwd: directory, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'],\n }).replace(/\\r?\\n$/, '');\n try {\n const checkoutRoot = fs.realpathSync(git('--show-toplevel'));\n if (!isWithin(checkoutRoot, directory)) throw new Error('Git routing environment selects a different checkout');\n const commonGitDir = fs.realpathSync(git('--path-format=absolute', '--git-common-dir'));\n const isLinkedWorktree = fs.realpathSync(git('--absolute-git-dir')) !== commonGitDir;\n // Preserve the existing main-checkout .coord location for ordinary repositories.\n // Separate Git directories use their own shared state, independent of checkout location.\n const coordDir = path.basename(commonGitDir) === '.git'\n ? path.join(path.dirname(commonGitDir), '.coord')\n : path.join(commonGitDir, 'kith');\n return { checkoutRoot, commonGitDir, coordDir, isLinkedWorktree };\n } catch (error) {\n // Never silently create an independent coordinator inside a broken/unavailable Git repo.\n const markerExists = (file: string) => {\n try { fs.lstatSync(file); return true; }\n catch (failure) { if ((failure as NodeJS.ErrnoException).code === 'ENOENT') return false; throw failure; }\n };\n for (let current = directory; ; current = path.dirname(current)) {\n if (markerExists(path.join(current, '.git')) || fs.existsSync(path.join(current, 'HEAD')) && fs.existsSync(path.join(current, 'objects'))) {\n throw new Error(`Cannot discover Git repository at ${directory}: ${error instanceof Error ? error.message : String(error)}`);\n }\n if (path.dirname(current) === current) break;\n }\n if (process.env.GIT_DIR || process.env.GIT_WORK_TREE || process.env.GIT_COMMON_DIR) throw error;\n return { checkoutRoot: directory, commonGitDir: null, coordDir: path.join(directory, '.coord'), isLinkedWorktree: false };\n }\n}\n\n/** Read-only probe using an existing directory; uncertain results retain exclusion. */\nexport function caseSensitivePaths(root: string): boolean {\n for (let current = physicalPath(root); path.dirname(current) !== current; current = path.dirname(current)) {\n const name = path.basename(current);\n const variant = name.replace(/[a-zA-Z]/, c => c === c.toLowerCase() ? c.toUpperCase() : c.toLowerCase());\n if (variant === name) continue;\n try {\n const original = fs.statSync(current);\n const alias = fs.statSync(path.join(path.dirname(current), variant));\n return original.dev !== alias.dev || original.ino !== alias.ino;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return true;\n return false;\n }\n }\n return false;\n}\n","import { waitForClaim } from './claim-wait.js';\nimport { KITH_PROTOCOL_VERSION } from '../version.js';\nimport { observeWorkspaces, previewIntegration } from './workspace-observation.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { AstAnalyzer, ExtractedSymbol } from './ast-analyzer.js';\nimport { BashMerkleGuard } from './bash-guard.js';\nimport { ResourceBroker } from './broker.js';\nimport { CoordDatabase, CoordEvent } from './db.js';\nimport {\n BlastRadiusAlert,\n DependencyAndContractEngine,\n FileModificationReport,\n} from './dep-graph.js';\nimport { FencingAndAgentManager } from './fencing.js';\nimport { IntentAndTaskEngine } from './intents.js';\nimport { LockEngine } from './locks.js';\nimport { SpeculativeMergeTrain } from './merge-train.js';\nimport { ConflictRecord, ShadowGitEngine } from './shadow-git.js';\nimport { CoWWorktreeManager } from './worktree-cow.js';\n\nexport interface AgentUnreadDelta {\n events: CoordEvent[];\n activeConflicts: ConflictRecord[];\n formattedFooter: string;\n}\n\nexport interface PostFileEditHookResult {\n filePath: string;\n contractReport: FileModificationReport;\n dirtyMergeConflicts: ConflictRecord[];\n warnings: string[];\n}\n\nexport class KithEngine {\n private activeClaimWaits = 0;\n public readonly coordDb: CoordDatabase;\n public readonly fencing: FencingAndAgentManager;\n public readonly locks: LockEngine;\n public readonly intents: IntentAndTaskEngine;\n public readonly depGraph: DependencyAndContractEngine;\n public readonly shadowGit: ShadowGitEngine;\n public readonly worktrees: CoWWorktreeManager;\n public readonly mergeTrain: SpeculativeMergeTrain;\n public readonly bashGuard: BashMerkleGuard;\n public readonly broker: ResourceBroker;\n\n constructor(repoRoot = process.cwd(), customDbPath?: string) {\n this.coordDb = new CoordDatabase(repoRoot, customDbPath);\n this.fencing = new FencingAndAgentManager(this.coordDb);\n this.locks = new LockEngine(this.coordDb, this.fencing);\n this.intents = new IntentAndTaskEngine(this.coordDb, this.fencing, this.locks);\n this.depGraph = new DependencyAndContractEngine(this.coordDb, this.locks, this.fencing);\n this.shadowGit = new ShadowGitEngine(this.coordDb, this.fencing);\n this.worktrees = new CoWWorktreeManager(this.coordDb, this.fencing);\n this.mergeTrain = new SpeculativeMergeTrain(this.coordDb, this.fencing);\n this.bashGuard = new BashMerkleGuard(\n this.coordDb,\n this.fencing,\n this.locks,\n this.depGraph,\n this.shadowGit\n );\n this.broker = new ResourceBroker(this.coordDb, this.fencing);\n }\n\n /**\n * Executes the complete PostToolUse pipeline whenever an agent writes or edits a file:\n * 1. Extracts AST exports/imports and updates the Contract Blackboard & Import Graph\n * 2. Computes transitive breaking-change blast radius across downstream dependent files\n * 3. Updates the agent's shadow Git index (`GIT_INDEX_FILE`) and runs `git merge-tree` against sibling dirty trees\n */\n public processPostFileEdit(params: {\n agentId: string;\n filePath: string;\n content?: string;\n worktreeDir?: string;\n }): PostFileEditHookResult {\n this.fencing.heartbeat(params.agentId);\n const targetRoot = params.worktreeDir ?? this.fencing.getAgent(params.agentId)?.worktree_path ?? this.coordDb.repoRoot;\n const file = LockEngine.normalizeFile(targetRoot, params.filePath);\n const access = this.locks.checkFileWriteAccess({ agentId: params.agentId, filePath: file });\n if (!access.allowed) throw new Error(access.reason);\n const content = params.content ?? (fs.existsSync(path.join(targetRoot, file)) ? fs.readFileSync(path.join(targetRoot, file), 'utf8') : '');\n\n const contractReport = this.depGraph.recordFileModification(\n params.agentId,\n file,\n content\n );\n\n const mergeProbe = this.shadowGit.probeAllActiveConflicts(\n params.agentId,\n [{ filePath: file, content }],\n targetRoot\n );\n\n const warnings: string[] = [];\n // Advisory only: matching names do not establish equivalent behavior.\n const existingSymbols = this.coordDb.db.prepare(`\n SELECT peer.symbol_name, peer.kind, peer.file_path\n FROM contracts AS edited JOIN contracts AS peer\n ON peer.symbol_name = edited.symbol_name COLLATE BINARY AND peer.kind = edited.kind\n WHERE edited.file_path = ? AND peer.file_path != edited.file_path\n ORDER BY peer.symbol_name, peer.file_path\n `).all(file) as Array<{ symbol_name: string; kind: string; file_path: string }>;\n for (const symbol of existingSymbols) {\n warnings.push(`[EXISTING SYMBOL] '${symbol.symbol_name}' (${symbol.kind}) is also recorded in '${symbol.file_path}'. Consider reuse if it serves the same purpose.`);\n }\n\n for (const brk of contractReport.breakingChanges) {\n const targetWho = brk.affectedAgentId\n ? ` (actively locked by agent '${brk.affectedAgentId}')`\n : '';\n warnings.push(\n `[BLAST RADIUS ALERT] Breaking signature change on '${brk.symbolName}' in '${brk.modifiedFile}' impacts downstream consumer '${brk.affectedDownstreamFile}' (${brk.hopDistance} hop(s) away)${targetWho}.`\n );\n }\n\n for (const conf of mergeProbe.conflicts) {\n const peer = conf.agent_a === params.agentId ? conf.agent_b : conf.agent_a;\n warnings.push(\n `[LIVE DIRTY-TREE CONFLICT] Uncommitted changes in '${conf.file_path}' conflict with active agent '${peer}' (${conf.severity}: ${conf.details.reason}).`\n );\n }\n\n return {\n filePath: file,\n contractReport,\n dirtyMergeConflicts: mergeProbe.conflicts,\n warnings,\n };\n }\n\n /**\n * Consumes unread coordination events and active conflicts for `agentId` since its last tool call\n * and formats a concise context-delta footer to append to MCP/CLI responses.\n */\n public consumeAgentDelta(agentId: string): AgentUnreadDelta {\n this.fencing.assertSession(agentId);\n const agent = this.fencing.getAgent(agentId);\n const sinceId = agent?.last_seen_event_id ?? 0;\n const page = this.coordDb.getEventsSince(sinceId, 50);\n const allNewEvents = page.filter((e) => e.agent_id !== agentId);\n\n const deliveredId = page.at(-1)?.id ?? sinceId;\n if (agent && deliveredId > sinceId) {\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(agentId);\n this.coordDb.db.prepare(`UPDATE agents SET last_seen_event_id = ? WHERE id = ?`).run(deliveredId, agentId);\n });\n }\n\n const activeConflicts = this.shadowGit\n .listConflicts()\n .filter(\n (c) =>\n c.agent_a === agentId || c.agent_b === agentId\n );\n\n const lines: string[] = [];\n for (const ev of allNewEvents) {\n if (\n ev.event_type === 'contracts_updated' ||\n ev.event_type === 'contract_published' ||\n ev.event_type === 'contract_breaking_change' ||\n ev.event_type === 'intent_declared'\n ) {\n lines.push(`• [${ev.event_type}] by ${ev.agent_id ?? 'system'}: ${JSON.stringify(ev.payload)}`);\n }\n }\n\n for (const c of activeConflicts) {\n const peer = c.agent_a === agentId ? c.agent_b : c.agent_a;\n lines.push(\n `• [ACTIVE CONFLICT] ${c.file_path} with agent '${peer}' (${c.severity}: ${c.details.reason})`\n );\n }\n\n const formattedFooter =\n lines.length > 0\n ? `\\n\\n--- KITH LIVE SIBLING DELTA ---\\n${lines.join('\\n')}`\n : '';\n\n return {\n events: allNewEvents,\n activeConflicts,\n formattedFooter,\n };\n }\n\n public getStatus() {\n const agents = this.fencing.listAgents(true);\n return {\n protocolVersion: KITH_PROTOCOL_VERSION,\n repository: { root: this.coordDb.repoRoot, commonGitDir: this.coordDb.commonGitDir, coordDir: this.coordDb.coordDir },\n runtime: { node: process.version }, fencingEpoch: this.coordDb.currentFencingEpoch(),\n agents, locks: this.locks.listLocks(), tasks: this.intents.listTasks(),\n conflicts: this.shadowGit.listConflicts(), contracts: this.depGraph.listContracts(), resources: this.broker.listResources(),\n mergeQueue: this.mergeTrain.listQueue(), quarantined: this.bashGuard.listQuarantined(),\n mutexWaiters: this.coordDb.db.prepare('SELECT ticket,mutex_name,owner_agent_id,session_epoch,expires_at FROM mutex_waiters ORDER BY ticket').all(),\n commandGuards: this.coordDb.db.prepare('SELECT mutex_name,owner_agent_id,worker_pid,supervisor_pid FROM mutex_runs ORDER BY mutex_name').all(),\n workspaces: observeWorkspaces(this.coordDb.repoRoot, agents),\n };\n }\n\n public previewIntegration(agentId: string) {\n this.fencing.assertSession(agentId);\n return previewIntegration(this.coordDb.repoRoot, this.fencing.getAgent(agentId)!);\n }\n\n public beginWork(params: Parameters<IntentAndTaskEngine['declareIntent']>[0] & { isolateWorktree?: boolean }) {\n const intent = this.intents.declareIntent(params);\n const worktree = intent.ok && params.isolateWorktree\n ? this.worktrees.spawnWorktree({ agentId: params.agentId }) : null;\n return { ...intent, worktree };\n }\n\n public async beginWorkWhenAvailable(params: Parameters<KithEngine['beginWork']>[0] & {\n waitTimeoutMs: number; signal?: AbortSignal;\n }) {\n return this.waitForOwnedClaim(params, () => this.beginWork(params));\n }\n\n public async acquireLocksWhenAvailable(params: Parameters<LockEngine['acquireLocks']>[0] & {\n waitTimeoutMs: number; signal?: AbortSignal;\n }) {\n return this.waitForOwnedClaim(params, () => this.locks.acquireLocks(params));\n }\n\n private async waitForOwnedClaim<T extends { ok: boolean }>(params: {\n agentId: string; waitTimeoutMs: number; signal?: AbortSignal;\n }, attempt: () => T) {\n this.activeClaimWaits++;\n try {\n return await waitForClaim({ ...params, attempt, heartbeat: () => { this.fencing.heartbeat(params.agentId); } });\n } finally { this.activeClaimWaits--; }\n }\n\n public completeWork(params: {\n agentId: string; taskId?: string; fencingToken?: number;\n mergeBranch?: string; verificationCmd?: string;\n }) {\n this.fencing.assertSession(params.agentId);\n const agent = this.fencing.getAgent(params.agentId);\n const branch = params.mergeBranch ?? agent?.branch;\n const mergeResult = branch ? this.mergeTrain.enqueueAndMerge({\n agentId: params.agentId, branch, worktreePath: agent?.worktree_path,\n verificationCmd: params.verificationCmd,\n }) : null;\n if (mergeResult && !mergeResult.merged) return {\n ok: false, mergeResult,\n error: 'Speculative merge train failed. Fix the reported issues before completing work.',\n };\n // Retain worktrees for inspection; release ownership only after integration succeeds.\n const completedTasks = this.intents.completeTask(params);\n this.fencing.completeAgentSession(params.agentId);\n return { ok: true, completedTasks, mergeResult };\n }\n\n public close(): void {\n if (this.activeClaimWaits) throw new Error('Await or cancel active file claim waits before closing Kith');\n if (this.broker.hasActiveCommands()) throw new Error('Await or cancel active mutex commands before closing Kith');\n this.coordDb.close();\n }\n}\n\nexport {\n AstAnalyzer,\n ExtractedSymbol,\n BashMerkleGuard,\n ResourceBroker,\n CoordDatabase,\n CoordEvent,\n DependencyAndContractEngine,\n BlastRadiusAlert,\n FileModificationReport,\n FencingAndAgentManager,\n IntentAndTaskEngine,\n LockEngine,\n SpeculativeMergeTrain,\n ShadowGitEngine,\n ConflictRecord,\n CoWWorktreeManager,\n};\n","import { repositoryFile } from './repository.js';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport type SymbolKind =\n | 'function'\n | 'type'\n | 'interface'\n | 'class'\n | 'schema'\n | 'route'\n | 'const';\n\nexport interface ExtractedSymbol {\n symbolName: string;\n kind: SymbolKind;\n signature: string;\n astHash: string;\n paramsFingerprint: string;\n docComment: string;\n}\n\nexport interface ExtractedImport {\n rawSpecifier: string;\n resolvedPath: string | null;\n importedSymbols: string[];\n}\n\nexport interface FileAstAnalysis {\n filePath: string;\n fileHash: string;\n exports: ExtractedSymbol[];\n imports: ExtractedImport[];\n}\n\nexport class AstAnalyzer {\n /**\n * Analyzes a source file's content to extract exported contracts (functions, types,\n * interfaces, schemas, routes) and imported module dependencies.\n */\n public static analyzeSource(\n repoRoot: string,\n filePath: string,\n sourceContent?: string\n ): FileAstAnalysis {\n const relPath = repositoryFile(repoRoot, filePath);\n const absPath = path.join(repoRoot, relPath);\n const content = sourceContent ?? (fs.existsSync(absPath) ? fs.readFileSync(absPath, 'utf8') : '');\n const fileHash = crypto.createHash('sha256').update(content).digest('hex').slice(0, 16);\n\n const exports = AstAnalyzer.extractExports(content);\n const imports = AstAnalyzer.extractImports(repoRoot, relPath, content);\n\n return {\n filePath: relPath,\n fileHash,\n exports,\n imports,\n };\n }\n\n public static extractExports(content: string): ExtractedSymbol[] {\n const results = new Map<string, ExtractedSymbol>();\n const lines = content.split(/\\r?\\n/);\n\n const getPrecedingDoc = (lineIndex: number): string => {\n const comments: string[] = [];\n let i = lineIndex - 1;\n while (i >= 0) {\n const trimmed = lines[i].trim();\n if (\n trimmed.startsWith('//') ||\n trimmed.startsWith('*') ||\n trimmed.startsWith('/*') ||\n trimmed.startsWith('*/') ||\n trimmed.startsWith('#')\n ) {\n comments.unshift(\n trimmed\n .replace(/^(\\/\\/+|\\/\\*+|\\*+\\/|#|\\*)\\s?/, '')\n .trim()\n );\n i--;\n } else if (trimmed === '') {\n break;\n } else {\n break;\n }\n }\n return comments.filter(Boolean).join(' ').slice(0, 240);\n };\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('//') || trimmed.startsWith('/*')) continue;\n\n // 1. Exported TS/JS function: export [async] function name<T>(params): ReturnType\n const fnMatch = trimmed.match(\n /^export\\s+(?:default\\s+)?(?:async\\s+)?function\\s+([A-Za-z0-9_$]+)\\s*(?:<[^>]*>)?\\s*\\(([^)]*)\\)\\s*(?::\\s*([^{;]+))?/\n );\n if (fnMatch) {\n const [, name, rawParams, rawReturn] = fnMatch;\n const cleanReturn = (rawReturn ?? 'unknown').trim();\n const sig = `function ${name}(${AstAnalyzer.normalizeWhitespace(rawParams)}): ${cleanReturn}`;\n const kind: SymbolKind = /^(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)$/.test(name)\n ? 'route'\n : 'function';\n results.set(name, {\n symbolName: name,\n kind,\n signature: sig,\n astHash: AstAnalyzer.hashSignature(sig),\n paramsFingerprint: AstAnalyzer.computeParamsFingerprint(rawParams, cleanReturn),\n docComment: getPrecedingDoc(i),\n });\n continue;\n }\n\n // 2. Exported arrow function: export const name = [async] (params): ReturnType =>\n const arrowMatch = trimmed.match(\n /^export\\s+const\\s+([A-Za-z0-9_$]+)\\s*(?::\\s*[^=]+)?=\\s*(?:async\\s+)?(?:\\(([^)]*)\\)|([A-Za-z0-9_$]+))\\s*(?::\\s*([^=]+?))?\\s*=>/\n );\n if (arrowMatch) {\n const [, name, tupleParams, singleParam, rawReturn] = arrowMatch;\n const rawParams = tupleParams ?? singleParam ?? '';\n const cleanReturn = (rawReturn ?? 'unknown').trim();\n const sig = `function ${name}(${AstAnalyzer.normalizeWhitespace(rawParams)}): ${cleanReturn}`;\n results.set(name, {\n symbolName: name,\n kind: 'function',\n signature: sig,\n astHash: AstAnalyzer.hashSignature(sig),\n paramsFingerprint: AstAnalyzer.computeParamsFingerprint(rawParams, cleanReturn),\n docComment: getPrecedingDoc(i),\n });\n continue;\n }\n\n // 3. Exported interface: export interface Name { ... }\n const ifaceMatch = trimmed.match(\n /^export\\s+interface\\s+([A-Za-z0-9_$]+)(?:\\s*<[^>]*>)?(?:\\s+extends\\s+[^{]+)?\\s*\\{/\n );\n if (ifaceMatch) {\n const name = ifaceMatch[1];\n const bodyFields = AstAnalyzer.extractBracedBlockSummary(lines, i);\n const sig = `interface ${name} { ${bodyFields} }`;\n results.set(name, {\n symbolName: name,\n kind: 'interface',\n signature: sig,\n astHash: AstAnalyzer.hashSignature(sig),\n paramsFingerprint: `interface:${AstAnalyzer.extractFieldTypesFingerprint(bodyFields)}`,\n docComment: getPrecedingDoc(i),\n });\n continue;\n }\n\n // 4. Exported type alias: export type Name = ...\n const typeMatch = trimmed.match(/^export\\s+type\\s+([A-Za-z0-9_$]+)(?:\\s*<[^>]*>)?\\s*=\\s*(.+)$/);\n if (typeMatch) {\n const [, name, rhs] = typeMatch;\n const fullRhs = rhs.includes('{') && !rhs.includes('}')\n ? `{ ${AstAnalyzer.extractBracedBlockSummary(lines, i)} }`\n : rhs.replace(/;$/, '').trim();\n const sig = `type ${name} = ${AstAnalyzer.normalizeWhitespace(fullRhs)}`;\n results.set(name, {\n symbolName: name,\n kind: 'type',\n signature: sig,\n astHash: AstAnalyzer.hashSignature(sig),\n paramsFingerprint: `type:${AstAnalyzer.normalizeWhitespace(fullRhs)}`,\n docComment: getPrecedingDoc(i),\n });\n continue;\n }\n\n // 5. Exported class: export class Name\n const classMatch = trimmed.match(\n /^export\\s+(?:default\\s+)?(?:abstract\\s+)?class\\s+([A-Za-z0-9_$]+)/\n );\n if (classMatch) {\n const name = classMatch[1];\n const sig = `class ${name}`;\n results.set(name, {\n symbolName: name,\n kind: 'class',\n signature: sig,\n astHash: AstAnalyzer.hashSignature(sig),\n paramsFingerprint: `class:${name}`,\n docComment: getPrecedingDoc(i),\n });\n continue;\n }\n\n // 6. Exported Zod/Valibot/Drizzle schema or constant: export const NameSchema = ...\n const constMatch = trimmed.match(\n /^export\\s+const\\s+([A-Za-z0-9_$]+)\\s*(?::\\s*([^=]+))?\\s*=\\s*(.+)$/\n );\n if (constMatch) {\n const [, name, explicitType, rhs] = constMatch;\n const isSchema = /Schema$|z\\.|pgTable|sqliteTable|mysqlTable/.test(name + rhs);\n const kind: SymbolKind = isSchema ? 'schema' : 'const';\n const sig = `const ${name}: ${(explicitType ?? rhs.slice(0, 60)).replace(/;$/, '').trim()}`;\n results.set(name, {\n symbolName: name,\n kind,\n signature: sig,\n astHash: AstAnalyzer.hashSignature(sig),\n paramsFingerprint: `${kind}:${name}`,\n docComment: getPrecedingDoc(i),\n });\n continue;\n }\n\n // 7. Python top-level function: def name(params) -> ReturnType:\n const pyFnMatch = line.match(\n /^(?:async\\s+)?def\\s+([a-zA-Z0-9_]+)\\s*\\(([^)]*)\\)\\s*(?:->\\s*([^:]+))?:/\n );\n if (pyFnMatch && !pyFnMatch[1].startsWith('_')) {\n const [, name, rawParams, rawRet] = pyFnMatch;\n const ret = (rawRet ?? 'Any').trim();\n const sig = `def ${name}(${AstAnalyzer.normalizeWhitespace(rawParams)}) -> ${ret}`;\n results.set(name, {\n symbolName: name,\n kind: 'function',\n signature: sig,\n astHash: AstAnalyzer.hashSignature(sig),\n paramsFingerprint: AstAnalyzer.computeParamsFingerprint(rawParams, ret),\n docComment: getPrecedingDoc(i),\n });\n }\n }\n\n return Array.from(results.values());\n }\n\n public static extractImports(\n repoRoot: string,\n sourceRelPath: string,\n content: string\n ): ExtractedImport[] {\n const imports: ExtractedImport[] = [];\n const importRegex =\n /(?:import\\s+(?:type\\s+)?(?:(\\{[^}]*\\})|([A-Za-z0-9_$*]+))?\\s*(?:,\\s*(\\{[^}]*\\}))?\\s*from\\s+['\"]([^'\"]+)['\"]|export\\s+(?:\\*|\\{[^}]*\\})\\s+from\\s+['\"]([^'\"]+)['\"]|require\\(\\s*['\"]([^'\"]+)['\"]\\s*\\))/g;\n\n let match: RegExpExecArray | null;\n while ((match = importRegex.exec(content)) !== null) {\n const namedBlock = match[1] ?? match[3] ?? '';\n const defaultIdent = match[2] ?? '';\n const specifier = match[4] ?? match[5] ?? match[6] ?? '';\n if (!specifier) continue;\n\n const symbols: string[] = [];\n if (defaultIdent) symbols.push(defaultIdent.trim());\n if (namedBlock) {\n const inner = namedBlock.replace(/[{}]/g, '');\n for (const part of inner.split(',')) {\n const clean = part.trim().split(/\\s+as\\s+/)[0].replace(/^type\\s+/, '').trim();\n if (clean) symbols.push(clean);\n }\n }\n\n const resolvedPath = AstAnalyzer.resolveRelativeImport(\n repoRoot,\n sourceRelPath,\n specifier\n );\n\n imports.push({\n rawSpecifier: specifier,\n resolvedPath,\n importedSymbols: symbols,\n });\n }\n\n return imports;\n }\n\n public static resolveRelativeImport(\n repoRoot: string,\n sourceRelPath: string,\n specifier: string\n ): string | null {\n if (!specifier.startsWith('.')) {\n return null;\n }\n\n const sourceDir = path.dirname(path.join(repoRoot, sourceRelPath));\n // Strip .js / .jsx extension often used in TypeScript ESM imports\n const baseTarget = path.resolve(sourceDir, specifier.replace(/\\.(js|jsx|mjs|cjs)$/, ''));\n\n const candidates = [\n path.resolve(sourceDir, specifier),\n `${baseTarget}.ts`,\n `${baseTarget}.tsx`,\n `${baseTarget}.js`,\n `${baseTarget}.mjs`,\n path.join(baseTarget, 'index.ts'),\n path.join(baseTarget, 'index.tsx'),\n path.join(baseTarget, 'index.js'),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) {\n try { return repositoryFile(repoRoot, candidate); } catch { return null; }\n }\n }\n\n // Even if target file hasn't been flushed to disk yet, infer `.ts` relative path\n const inferred = `${baseTarget}.ts`;\n try { return repositoryFile(repoRoot, inferred); } catch { return null; }\n }\n\n private static extractBracedBlockSummary(lines: string[], startIndex: number): string {\n const fields: string[] = [];\n let depth = 0;\n for (let i = startIndex; i < Math.min(lines.length, startIndex + 35); i++) {\n const line = lines[i];\n for (const ch of line) {\n if (ch === '{') depth++;\n else if (ch === '}') depth--;\n }\n if (i > startIndex && depth >= 1) {\n const clean = line.trim().replace(/;$/, '').replace(/,$/, '');\n if (clean && !clean.startsWith('//') && clean !== '}') {\n fields.push(clean);\n }\n }\n if (depth <= 0 && i >= startIndex && line.includes('}')) {\n break;\n }\n }\n return fields.join('; ');\n }\n\n private static extractFieldTypesFingerprint(bodyFields: string): string {\n return bodyFields\n .split(';')\n .map((f) => {\n const parts = f.split(':');\n return parts.length > 1 ? parts[1].trim().toLowerCase() : f.trim().toLowerCase();\n })\n .filter(Boolean)\n .sort()\n .join(',');\n }\n\n public static computeParamsFingerprint(rawParams: string, rawReturn: string): string {\n const paramTypes = rawParams\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean)\n .map((p) => {\n const colonIdx = p.indexOf(':');\n if (colonIdx === -1) return 'any';\n return p\n .slice(colonIdx + 1)\n .replace(/=.*$/, '')\n .trim()\n .toLowerCase();\n });\n\n const retNorm = rawReturn\n .replace(/^Promise<(.+)>$/, '$1')\n .trim()\n .toLowerCase();\n\n return `(${paramTypes.join(',')})->${retNorm}`;\n }\n\n private static normalizeWhitespace(s: string): string {\n return s.replace(/\\s+/g, ' ').trim();\n }\n\n private static hashSignature(sig: string): string {\n return crypto.createHash('sha256').update(sig).digest('hex').slice(0, 16);\n }\n}\n","import crypto from 'node:crypto';\nimport { physicalPath } from './repository.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { CoordDatabase } from './db.js';\nimport { DependencyAndContractEngine } from './dep-graph.js';\nimport { FencingAndAgentManager } from './fencing.js';\nimport { LockEngine } from './locks.js';\nimport { ShadowGitEngine } from './shadow-git.js';\n\nexport interface FileSnapshotEntry {\n relPath: string;\n mtimeMs: number;\n size: number;\n sha256: string;\n lockedByOther: boolean;\n backupContentBase64?: string;\n}\n\nexport interface QuarantineRecord {\n id: string;\n agent_id: string;\n command: string;\n file_path: string;\n patch_path: string;\n reason: string;\n created_at: number;\n}\n\nexport interface BashGuardPostReport {\n allowed: boolean;\n authorizedModifiedFiles: string[];\n quarantinedViolations: QuarantineRecord[];\n}\n\nconst GIT_PREFIX = String.raw`\\bgit(?:\\s+(?:-C|-c|--git-dir|--work-tree)(?:=|\\s+)(?:\"[^\"]*\"|'[^']*'|[^\\s;&|]+)|\\s+--(?:no-pager|literal-pathspecs|no-optional-locks))*\\s+`;\nconst DESTRUCTIVE_SHARED_TREE = new RegExp(GIT_PREFIX + String.raw`(?:reset|clean|checkout|restore|switch|stash|merge|rebase|pull|cherry-pick|revert|am)\\b`);\nconst DESTRUCTIVE_SHARED_REFS = new RegExp(GIT_PREFIX + String.raw`(?:update-ref|symbolic-ref|worktree\\s+(?:remove|prune)|branch\\s+(?:-[dDmMfF]|--(?:delete|move|force)))\\b`);\n\nexport class BashMerkleGuard {\n constructor(\n private readonly coordDb: CoordDatabase,\n private readonly fencing: FencingAndAgentManager,\n private readonly lockEngine: LockEngine,\n private readonly depGraph: DependencyAndContractEngine,\n private readonly shadowGit: ShadowGitEngine\n ) {}\n\n /**\n * Checks whether a shell command is safe to execute in the workspace.\n */\n public checkCommandSafety(params: {\n agentId: string;\n command: string;\n inIsolatedWorktree?: boolean;\n }): { safe: boolean; reason?: string } {\n this.fencing.assertSession(params.agentId);\n const root = physicalPath(this.fencing.getAgent(params.agentId)?.worktree_path ?? this.coordDb.repoRoot);\n const peers = this.fencing.listAgents(true).filter(a => a.id !== params.agentId);\n const sharesCheckout = peers.some(a => physicalPath(a.worktree_path ?? this.coordDb.repoRoot) === root);\n if (peers.length && DESTRUCTIVE_SHARED_REFS.test(params.command) || sharesCheckout && DESTRUCTIVE_SHARED_TREE.test(params.command)) {\n return { safe: false, reason: 'Git operation can replace shared work or refs while peer agents are active. Coordinate the operation before retrying.' };\n }\n\n return { safe: true };\n }\n\n private getSnapshotFilePath(agentId: string): string {\n const epoch = this.fencing.assertSession(agentId);\n const safeId = crypto.createHash('sha256').update(`${agentId}:${epoch}`).digest('hex');\n return path.join(this.coordDb.coordDir, 'snapshots', `${safeId}.json`);\n }\n\n /**\n * Captures a Merkle snapshot of workspace files before a Bash tool execution.\n * For any file locked by another active agent, stores a full lossless backup so\n * unauthorized mutations by bash scripts (`sed`, `python`, etc.) can be reverted atomically.\n */\n public capturePreBashSnapshot(agentId: string, rootDir = this.coordDb.repoRoot): string {\n const activeLocks = this.lockEngine\n .listLocks()\n .filter((l) => l.owner_agent_id !== agentId);\n\n const entries: Record<string, FileSnapshotEntry> = {};\n const files = this.walkWorkspaceFiles(rootDir);\n\n for (const absPath of files) {\n const relPath = path.relative(rootDir, absPath).replace(/\\\\/g, '/');\n const stat = fs.statSync(absPath);\n if (stat.size > 5 * 1024 * 1024) continue; // Skip >5MB binaries\n\n const buf = fs.readFileSync(absPath);\n const sha256 = crypto.createHash('sha256').update(buf).digest('hex');\n const lockedByOther = activeLocks.some((l) =>\n LockEngine.patternsOverlap(relPath, l.pattern)\n );\n\n entries[relPath] = {\n relPath,\n mtimeMs: stat.mtimeMs,\n size: stat.size,\n sha256,\n lockedByOther,\n backupContentBase64: lockedByOther ? buf.toString('base64') : undefined,\n };\n }\n\n const snapPath = this.getSnapshotFilePath(agentId);\n fs.writeFileSync(\n snapPath,\n JSON.stringify({ timestamp: Date.now(), rootDir, entries }),\n { encoding: 'utf8', mode: 0o600 }\n );\n return snapPath;\n }\n\n /**\n * Compares workspace state after a Bash command completes against the pre-Bash Merkle snapshot.\n * Saves recovery copies of edits to files locked by sibling agents. Restoration is opt-in,\n * and indexes authorized modifications into the AST Contract Blackboard & Dirty-Tree Conflict Radar.\n */\n public verifyPostBashAndQuarantine(params: {\n agentId: string;\n command: string;\n rootDir?: string;\n restoreLockedFiles?: boolean;\n }): BashGuardPostReport {\n const snapPath = this.getSnapshotFilePath(params.agentId);\n if (!fs.existsSync(snapPath)) {\n return { allowed: true, authorizedModifiedFiles: [], quarantinedViolations: [] };\n }\n\n const rawSnap = JSON.parse(fs.readFileSync(snapPath, 'utf8')) as {\n timestamp: number;\n rootDir: string;\n entries: Record<string, FileSnapshotEntry>;\n };\n const rootDir = params.rootDir ?? rawSnap.rootDir ?? this.coordDb.repoRoot;\n const beforeEntries = rawSnap.entries;\n\n const currentFiles = this.walkWorkspaceFiles(rootDir);\n const seenCurrentRelPaths = new Set<string>();\n const authorizedModifiedFiles: string[] = [];\n const quarantinedViolations: QuarantineRecord[] = [];\n\n for (const absPath of currentFiles) {\n const relPath = path.relative(rootDir, absPath).replace(/\\\\/g, '/');\n seenCurrentRelPaths.add(relPath);\n const stat = fs.statSync(absPath);\n if (stat.size > 5 * 1024 * 1024) continue;\n\n const prev = beforeEntries[relPath];\n if (prev && prev.mtimeMs === stat.mtimeMs && prev.size === stat.size) {\n continue;\n }\n\n const buf = fs.readFileSync(absPath);\n const sha256 = crypto.createHash('sha256').update(buf).digest('hex');\n if (prev && prev.sha256 === sha256) {\n continue;\n }\n\n // File was created or modified during the bash command!\n const access = this.lockEngine.checkFileWriteAccess({\n agentId: params.agentId,\n filePath: relPath,\n });\n\n if (!access.allowed) {\n const violation = this.quarantineAndRevertFile({\n agentId: params.agentId,\n command: params.command,\n rootDir,\n relPath,\n unauthorizedBuf: buf,\n restoreLockedFiles: params.restoreLockedFiles ?? false,\n prevEntry: prev ?? null,\n reason: access.reason ?? 'Locked by another agent',\n });\n quarantinedViolations.push(violation);\n } else {\n authorizedModifiedFiles.push(relPath);\n }\n }\n\n // Also check if any previously existing file was deleted by the bash command\n for (const [relPath, prev] of Object.entries(beforeEntries)) {\n if (!seenCurrentRelPaths.has(relPath)) {\n const access = this.lockEngine.checkFileWriteAccess({\n agentId: params.agentId,\n filePath: relPath,\n });\n if (!access.allowed) {\n const violation = this.quarantineAndRevertFile({\n agentId: params.agentId,\n command: params.command,\n rootDir,\n relPath,\n unauthorizedBuf: null,\n restoreLockedFiles: params.restoreLockedFiles ?? false,\n prevEntry: prev,\n reason: access.reason ?? 'Deleted file locked by another agent',\n });\n quarantinedViolations.push(violation);\n } else {\n authorizedModifiedFiles.push(relPath);\n }\n }\n }\n\n // Clean up snapshot file\n try {\n fs.unlinkSync(snapPath);\n } catch {\n // Ignore\n }\n\n // Update AST contracts and shadow git tree for authorized modifications\n if (authorizedModifiedFiles.length > 0) {\n for (const relFile of authorizedModifiedFiles) {\n const absFile = path.join(rootDir, relFile);\n if (fs.existsSync(absFile) && /\\.(ts|tsx|js|jsx|mjs|py)$/.test(relFile)) {\n this.depGraph.recordFileModification(params.agentId, relFile, fs.readFileSync(absFile, 'utf8'));\n }\n }\n this.shadowGit.probeAllActiveConflicts(\n params.agentId,\n authorizedModifiedFiles.map((f) => ({ filePath: f })),\n rootDir\n );\n }\n\n return {\n allowed: quarantinedViolations.length === 0,\n authorizedModifiedFiles,\n quarantinedViolations,\n };\n }\n\n private quarantineAndRevertFile(params: {\n agentId: string;\n command: string;\n rootDir: string;\n relPath: string;\n unauthorizedBuf: Buffer | null;\n restoreLockedFiles: boolean;\n prevEntry: FileSnapshotEntry | null;\n reason: string;\n }): QuarantineRecord {\n const id = `quar_${crypto.randomBytes(6).toString('hex')}`;\n const now = Date.now();\n const safeName = params.relPath.replace(/[^a-zA-Z0-9._-]/g, '_');\n const patchPath = path.join(\n this.coordDb.coordDir,\n 'quarantine',\n `${id}_${safeName}.quarantine`\n );\n\n if (params.unauthorizedBuf) {\n fs.writeFileSync(patchPath, params.unauthorizedBuf, { mode: 0o600 });\n } else {\n fs.writeFileSync(patchPath, `[DELETED BY COMMAND: ${params.command}]\\n`, { encoding: 'utf8', mode: 0o600 });\n }\n\n if (params.prevEntry?.backupContentBase64 !== undefined) {\n fs.writeFileSync(patchPath + '.before', Buffer.from(params.prevEntry.backupContentBase64, 'base64'), { mode: 0o600 });\n }\n const absTarget = path.join(params.rootDir, params.relPath);\n if (params.restoreLockedFiles && params.prevEntry === null) {\n // Newly created unauthorized file -> remove it\n if (fs.existsSync(absTarget)) {\n fs.unlinkSync(absTarget);\n }\n } else if (params.restoreLockedFiles && params.prevEntry?.backupContentBase64 !== undefined) {\n // Restore exact pre-command bytes\n fs.mkdirSync(path.dirname(absTarget), { recursive: true });\n fs.writeFileSync(\n absTarget,\n Buffer.from(params.prevEntry.backupContentBase64, 'base64')\n );\n }\n\n const record: QuarantineRecord = {\n id,\n agent_id: params.agentId,\n command: params.command,\n file_path: params.relPath,\n patch_path: patchPath,\n reason: params.reason,\n created_at: now,\n };\n\n this.coordDb.withTransaction(() => {\n this.coordDb.db\n .prepare(`\n INSERT INTO quarantine (id, agent_id, command, file_path, patch_path, reason, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n .run(\n record.id,\n record.agent_id,\n record.command,\n record.file_path,\n record.patch_path,\n record.reason,\n record.created_at\n );\n\n this.coordDb.logEvent(params.agentId, 'bash_mutation_quarantined', {\n filePath: params.relPath,\n command: params.command,\n patchPath,\n reason: params.reason,\n });\n });\n\n return record;\n }\n\n private walkWorkspaceFiles(dir: string, acc: string[] = []): string[] {\n if (!fs.existsSync(dir)) return acc;\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (\n entry.name === '.git' ||\n entry.name === '.coord' ||\n entry.name === 'node_modules' ||\n entry.name === 'dist' ||\n entry.name === 'coverage' ||\n entry.name === '.next' ||\n entry.name === 'target'\n ) {\n continue;\n }\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n this.walkWorkspaceFiles(fullPath, acc);\n } else if (entry.isFile()) {\n acc.push(fullPath);\n }\n }\n return acc;\n }\n\n public listQuarantined(): QuarantineRecord[] {\n return this.coordDb.db\n .prepare(`SELECT * FROM quarantine ORDER BY created_at DESC`)\n .all() as unknown as QuarantineRecord[];\n }\n}\n","import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { scopeSegments, scopesOverlap } from './glob.js';\nimport { caseSensitivePaths, isWithin, physicalPath, repositoryFile } from './repository.js';\nimport { CoordDatabase } from './db.js';\nimport { FencingAndAgentManager, StaleFencingTokenError } from './fencing.js';\n\nexport interface LockRecord {\n id: string;\n pattern: string;\n lock_type: 'glob' | 'file' | 'symbol';\n mode: 'exclusive' | 'shared';\n owner_agent_id: string;\n task_id: string | null;\n fencing_token: number;\n reason: string;\n acquired_at: number;\n expires_at: number;\n}\n\nexport interface LockConflict {\n existingLock: LockRecord;\n requestedPattern: string;\n ownerAgentName: string;\n ownerIntent: string | null;\n}\n\nexport interface AcquireLockResult {\n ok: boolean;\n fencingToken: number;\n locks: LockRecord[];\n conflicts: LockConflict[];\n}\n\nexport class LockEngine {\n private readonly pathCase = new Map<string, boolean>();\n constructor(\n private readonly coordDb: CoordDatabase,\n private readonly fencing: FencingAndAgentManager\n ) {}\n\n public static normalizePattern(repoRoot: string, rawPattern: string): string {\n if (rawPattern.startsWith('file:')) return LockEngine.literalScope(LockEngine.normalizeFile(repoRoot, rawPattern.slice(5)));\n if (rawPattern.startsWith('symbol:')) {\n const hash = rawPattern.indexOf('#');\n const name = rawPattern.slice(hash + 1);\n if (hash < 0 || !/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name)) throw new Error('Symbol scope must include #symbolName');\n const file = LockEngine.normalizeFile(repoRoot, rawPattern.slice(7, hash));\n return `symbol:${file}#${name}`;\n }\n if (!rawPattern || /[\\\\\\x00-\\x1f\\x7f]/u.test(rawPattern)) throw new Error(`Invalid repository scope: ${rawPattern}`);\n const root = physicalPath(repoRoot);\n const parts = rawPattern.split('/');\n const magic = parts.findIndex(p => /[?*]/u.test(p));\n // Resolve the literal prefix before normalizing .., so symlink/.. cannot escape.\n const prefix = magic < 0 ? rawPattern : parts.slice(0, magic).join('/') || '.';\n const absolute = physicalPath(path.isAbsolute(prefix) ? prefix : root + '/' + prefix);\n if (!isWithin(root, absolute)) throw new Error(`Scope is outside repository: ${rawPattern}`);\n const relative = path.relative(root, absolute).split(path.sep).join('/');\n const suffix = magic < 0 ? '' : parts.slice(magic).join('/');\n const normalized = [relative, suffix].filter(Boolean).join('/');\n scopeSegments(normalized);\n return normalized;\n }\n\n public static normalizeFile(repoRoot: string, file: string): string {\n const normalized = repositoryFile(repoRoot, file);\n scopeSegments(normalized, true);\n return normalized;\n }\n\n private static literalScope(file: string): string {\n try {\n scopeSegments(file);\n if (!/[?*]/u.test(file) && !file.startsWith('symbol:') && !file.startsWith('file:')) return file;\n } catch { /* Explicit literal scopes support filenames containing reserved glob syntax. */ }\n return 'file:' + file;\n }\n\n private rootForAgent(agentId: string): string {\n return this.fencing.getAgent(agentId)?.worktree_path ?? this.coordDb.repoRoot;\n }\n\n // A wildcard can traverse an alias that maps to a different scope. If exact\n // lexical comparison was disjoint, retain exclusion when such aliases exist.\n private wildcardHasAliases(pattern: string): boolean {\n if (pattern.startsWith('symbol:') || pattern.startsWith('file:')) return false;\n const segments = scopeSegments(pattern);\n const first = segments.findIndex(s => /[?*]/u.test(s));\n if (first < 0) return false;\n const prefix = segments.slice(0, first).join('/');\n const roots = new Set([this.coordDb.repoRoot, ...this.fencing.listAgents(true).map(a => a.worktree_path).filter((p): p is string => Boolean(p))]);\n const pending = [...roots].map(root => ({ root, relative: prefix }));\n let budget = 10_000;\n while (pending.length) {\n const { root, relative } = pending.pop()!;\n const dir = path.join(root, relative);\n let entries;\n try { entries = fs.readdirSync(dir, { withFileTypes: true }); }\n catch (error) { if ((error as NodeJS.ErrnoException).code === 'ENOENT') continue; return true; }\n for (const entry of entries) {\n if (--budget < 0) return true;\n const file = relative ? relative + '/' + entry.name : entry.name;\n if (entry.isSymbolicLink()) return true;\n const fold = (value: string) => value.normalize('NFC').toLowerCase().replace(/ς/g, 'σ');\n if (!LockEngine.patternsOverlap(fold(pattern), fold(file)) && !LockEngine.patternsOverlap(fold(pattern), fold(file + '/**'))) continue;\n if (entry.isDirectory()) pending.push({ root, relative: file });\n }\n }\n return false;\n }\n\n /** Exact overlap for the documented scope grammar; legacy unsupported locks block conservatively. */\n public static patternsOverlap(rawA: string, rawB: string): boolean {\n const decode = (value: string) => {\n if (value.startsWith('symbol:')) {\n const match = /^symbol:(.+)#([A-Za-z_$][A-Za-z0-9_$]*)$/.exec(value);\n if (!match) throw new Error('Invalid symbol scope');\n scopeSegments(match[1], true);\n return { file: match[1], symbol: match[2], literal: true };\n }\n const literal = value.startsWith('file:');\n const file = literal ? value.slice(5) : value;\n scopeSegments(file, literal);\n return { file, symbol: null, literal };\n };\n try {\n const a = decode(rawA), b = decode(rawB);\n if (a.symbol && b.symbol) return a.file === b.file && a.symbol === b.symbol;\n return scopesOverlap(a.file, b.file, a.literal, b.literal);\n } catch { return true; }\n }\n\n /**\n * Atomically acquires locks on one or more file/glob/symbol patterns.\n * All-or-nothing: if any pattern conflicts with another live agent, no locks are created.\n */\n public acquireLocks(params: {\n agentId: string;\n patterns: string[];\n mode?: 'exclusive' | 'shared';\n lockType?: 'glob' | 'file' | 'symbol';\n taskId?: string | null;\n reason?: string;\n leaseDurationMs?: number;\n }): AcquireLockResult {\n this.fencing.reapDeadAgents();\n\n const mode = params.mode ?? 'exclusive';\n const lockType = params.lockType ?? 'glob';\n const now = Date.now();\n const expiresAt = now + (params.leaseDurationMs ?? FencingAndAgentManager.DEFAULT_LEASE_MS);\n const normalizedPatterns = Array.from(\n new Set(params.patterns.map((p) => LockEngine.normalizePattern(this.rootForAgent(params.agentId), lockType === 'file' && !p.startsWith('file:') ? 'file:' + p : p)))\n );\n\n return this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const existingLocks = this.coordDb.db\n .prepare(`SELECT * FROM locks WHERE expires_at > ?`)\n .all(now) as unknown as LockRecord[];\n\n const conflicts: LockConflict[] = [];\n\n for (const reqPattern of normalizedPatterns) {\n for (const existing of existingLocks) {\n if (existing.owner_agent_id === params.agentId) {\n continue;\n }\n const bothShared = mode === 'shared' && existing.mode === 'shared';\n if (bothShared) {\n continue;\n }\n\n if (this.overlapsExisting(reqPattern, existing.pattern)) {\n const owner = this.fencing.getAgent(existing.owner_agent_id);\n const activeTask = this.coordDb.db\n .prepare(\n `SELECT intent_summary FROM tasks WHERE owner_agent_id = ? AND status = 'active' LIMIT 1`\n )\n .get(existing.owner_agent_id) as { intent_summary: string } | undefined;\n\n conflicts.push({\n existingLock: existing,\n requestedPattern: reqPattern,\n ownerAgentName: owner?.name ?? existing.owner_agent_id,\n ownerIntent: activeTask?.intent_summary ?? existing.reason ?? null,\n });\n }\n }\n }\n\n if (conflicts.length > 0) {\n this.coordDb.logEvent(params.agentId, 'lock_conflict', {\n requestedPatterns: normalizedPatterns,\n conflicts: conflicts.map((c) => ({\n pattern: c.existingLock.pattern,\n owner: c.existingLock.owner_agent_id,\n })),\n });\n return {\n ok: false,\n fencingToken: this.coordDb.currentFencingEpoch(),\n locks: [],\n conflicts,\n };\n }\n\n const token = this.coordDb.nextFencingToken();\n const acquired: LockRecord[] = [];\n\n for (const pattern of normalizedPatterns) {\n // Upsert if same agent already holds this exact pattern\n this.coordDb.db\n .prepare(`DELETE FROM locks WHERE owner_agent_id = ? AND pattern = ?`)\n .run(params.agentId, pattern);\n\n const id = `lock_${crypto.randomBytes(6).toString('hex')}`;\n const inferredType = pattern.startsWith('file:') ? 'file' : pattern.startsWith('symbol:')\n ? 'symbol'\n : pattern.includes('*') || pattern.includes('?') || pattern.includes('{')\n ? 'glob'\n : lockType === 'glob'\n ? 'file'\n : lockType;\n\n this.coordDb.db\n .prepare(`\n INSERT INTO locks (\n id, pattern, lock_type, mode, owner_agent_id,\n task_id, fencing_token, reason, acquired_at, expires_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n .run(\n id,\n pattern,\n inferredType,\n mode,\n params.agentId,\n params.taskId ?? null,\n token,\n params.reason ?? '',\n now,\n expiresAt\n );\n\n acquired.push({\n id,\n pattern,\n lock_type: inferredType,\n mode,\n owner_agent_id: params.agentId,\n task_id: params.taskId ?? null,\n fencing_token: token,\n reason: params.reason ?? '',\n acquired_at: now,\n expires_at: expiresAt,\n });\n }\n\n this.coordDb.logEvent(params.agentId, 'locks_acquired', {\n patterns: normalizedPatterns,\n fencingToken: token,\n });\n\n return {\n ok: true,\n fencingToken: token,\n locks: acquired,\n conflicts: [],\n };\n });\n }\n\n /**\n * Checks whether `agentId` is allowed to edit `filePath`.\n * Also verifies the fencing token if provided.\n */\n public checkFileWriteAccess(params: {\n agentId: string;\n filePath: string;\n fencingToken?: number;\n }): {\n allowed: boolean;\n reason?: string;\n conflictingLock?: LockRecord;\n ownerIntent?: string | null;\n } {\n this.fencing.reapDeadAgents();\n this.fencing.assertSession(params.agentId);\n const normPath = LockEngine.normalizeFile(this.rootForAgent(params.agentId), params.filePath);\n const requested = LockEngine.literalScope(normPath);\n const now = Date.now();\n\n const activeLocks = this.coordDb.db\n .prepare(`SELECT * FROM locks WHERE expires_at > ?`)\n .all(now) as unknown as LockRecord[];\n\n for (const lock of activeLocks) {\n if (this.overlapsExisting(requested, lock.pattern)) {\n if (lock.owner_agent_id !== params.agentId) {\n const activeTask = this.coordDb.db\n .prepare(\n `SELECT intent_summary FROM tasks WHERE owner_agent_id = ? AND status = 'active' LIMIT 1`\n )\n .get(lock.owner_agent_id) as { intent_summary: string } | undefined;\n\n return {\n allowed: false,\n reason: `File '${normPath}' is locked by agent '${lock.owner_agent_id}' (pattern: '${lock.pattern}', token: ${lock.fencing_token}). Intent: ${\n activeTask?.intent_summary ?? (lock.reason || 'active work')\n }`,\n conflictingLock: lock,\n ownerIntent: activeTask?.intent_summary ?? lock.reason ?? null,\n };\n } else if (params.fencingToken !== undefined) {\n this.fencing.verifyFencingToken(normPath, params.fencingToken, lock.fencing_token);\n }\n }\n }\n\n return { allowed: true };\n }\n\n public releaseLocks(params: {\n agentId: string;\n patterns?: string[];\n fencingToken?: number;\n }): number {\n return this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const myLocks = this.coordDb.db\n .prepare(`SELECT * FROM locks WHERE owner_agent_id = ?`)\n .all(params.agentId) as unknown as LockRecord[];\n\n if (params.fencingToken !== undefined) {\n for (const lock of myLocks) {\n if (\n !params.patterns ||\n params.patterns.some(\n (p) => LockEngine.normalizePattern(this.rootForAgent(params.agentId), p) === lock.pattern\n )\n ) {\n this.fencing.verifyFencingToken(lock.pattern, params.fencingToken, lock.fencing_token);\n }\n }\n }\n\n if (!params.patterns || params.patterns.length === 0) {\n const res = this.coordDb.db\n .prepare(`DELETE FROM locks WHERE owner_agent_id = ?`)\n .run(params.agentId);\n return Number(res.changes);\n }\n\n let count = 0;\n for (const rawPattern of params.patterns) {\n const norm = LockEngine.normalizePattern(this.rootForAgent(params.agentId), rawPattern);\n const res = this.coordDb.db\n .prepare(`DELETE FROM locks WHERE owner_agent_id = ? AND pattern = ?`)\n .run(params.agentId, norm);\n count += Number(res.changes);\n }\n return count;\n });\n }\n\n private overlapsExisting(requested: string, existing: string): boolean {\n try {\n const normalized = LockEngine.normalizePattern(this.coordDb.repoRoot, existing);\n const roots = [this.coordDb.repoRoot, ...this.fencing.listAgents(true).map(a => a.worktree_path).filter((p): p is string => Boolean(p))];\n const insensitive = roots.some(root => {\n if (!this.pathCase.has(root)) this.pathCase.set(root, caseSensitivePaths(root));\n return !this.pathCase.get(root);\n });\n const fold = (scope: string) => {\n const hash = scope.startsWith('symbol:') ? scope.lastIndexOf('#') : -1;\n const file = hash < 0 ? scope : scope.slice(0, hash);\n return file.normalize('NFC').toLowerCase().replace(/ς/g, 'σ') + (hash < 0 ? '' : scope.slice(hash));\n };\n const overlap = (a: string, b: string) => LockEngine.patternsOverlap(a, b)\n || insensitive && LockEngine.patternsOverlap(fold(a), fold(b));\n return overlap(requested, existing) || overlap(requested, normalized)\n || this.wildcardHasAliases(requested) || this.wildcardHasAliases(normalized);\n }\n catch { return true; }\n }\n\n public listLocks(): LockRecord[] {\n this.fencing.reapDeadAgents();\n return this.coordDb.db\n .prepare(`SELECT * FROM locks WHERE expires_at > ? ORDER BY acquired_at ASC`)\n .all(Date.now()) as unknown as LockRecord[];\n }\n}\n\nexport { StaleFencingTokenError };\n","/**\n * Scope grammar: slash-separated literals, * and ? within a segment, and ** as\n * a whole segment. Wildcards include dotfiles. No braces, classes, negation,\n * extglobs or escaping. Reject unsupported syntax instead of guessing.\n */\nexport function scopeSegments(pattern: string, literal = false): string[] {\n if (!pattern || pattern.length > 512 || (literal ? /[\\x00-\\x1f\\x7f\\\\]/u : /[\\x00-\\x1f\\x7f\\\\[\\]{}()!]/u).test(pattern)) {\n throw new Error(`Unsupported scope syntax: ${pattern}`);\n }\n const segments = pattern.split('/');\n if (segments.length > 64 || segments.some(s => !s || s === '.' || s === '..' || !literal && s.includes('**') && s !== '**')) {\n throw new Error(`Invalid scope segments: ${pattern}`);\n }\n return segments;\n}\n\n// Intersection of two segment wildcard automata. Track empty/dot/dot-dot so\n// only actual filename components can witness an overlap.\nfunction segmentsOverlap(a: string, b: string, literalA: boolean, literalB: boolean): boolean {\n const STAR = Symbol('star'), ANY = Symbol('any');\n const tokens = (text: string, literal: boolean) => Array.from(text).map(c => !literal && c === '*' ? STAR : !literal && c === '?' ? ANY : c);\n const left = tokens(a, literalA), right = tokens(b, literalB);\n const queue: Array<[number, number, number]> = [[0, 0, 0]];\n const seen = new Set<string>();\n for (let q = 0; q < queue.length; q++) {\n const [i, j, kind] = queue[q];\n const key = `${i},${j},${kind}`;\n if (seen.has(key)) continue;\n seen.add(key);\n if (i === left.length && j === right.length && kind === 3) return true;\n const x = left[i], y = right[j];\n if (x === STAR) queue.push([i + 1, j, kind]);\n if (y === STAR) queue.push([i, j + 1, kind]);\n if (x === undefined || y === undefined) continue;\n const anyX = x === STAR || x === ANY, anyY = y === STAR || y === ANY;\n if (!anyX && !anyY && x !== y) continue;\n const literal = !anyX ? x : !anyY ? y : undefined;\n const nextI = x === STAR ? i : i + 1, nextJ = y === STAR ? j : j + 1;\n if (literal === undefined || literal === '.') {\n queue.push([nextI, nextJ, kind === 0 ? 1 : kind === 1 ? 2 : 3]);\n }\n if (literal === undefined || literal !== '.') queue.push([nextI, nextJ, 3]);\n }\n return false;\n}\n\n/** Exact language intersection, including zero-directory and repeated globstars. */\nexport function scopesOverlap(a: string, b: string, literalA = false, literalB = false): boolean {\n const left = scopeSegments(a, literalA), right = scopeSegments(b, literalB);\n const queue: Array<[number, number, boolean]> = [[0, 0, false]];\n const seen = new Set<string>();\n const memo = new Map<string, boolean>();\n for (let q = 0; q < queue.length; q++) {\n const [i, j, consumed] = queue[q];\n const key = `${i},${j},${consumed}`;\n if (seen.has(key)) continue;\n seen.add(key);\n if (i === left.length && j === right.length && consumed) return true;\n const x = left[i], y = right[j];\n const starA = !literalA && x === '**', starB = !literalB && y === '**';\n if (starA) queue.push([i + 1, j, consumed]);\n if (starB) queue.push([i, j + 1, consumed]);\n if (x === undefined || y === undefined) continue;\n const pair = JSON.stringify([x, y]);\n let overlap = memo.get(pair);\n if (overlap === undefined) {\n overlap = segmentsOverlap(starA ? '*' : x, starB ? '*' : y, starA ? false : literalA, starB ? false : literalB);\n memo.set(pair, overlap);\n }\n if (overlap) queue.push([starA ? i : i + 1, starB ? j : j + 1, true]);\n }\n return false;\n}\n","import { execFileSync } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { CoordDatabase } from './db.js';\n\nexport interface AgentRecord {\n id: string;\n name: string;\n client: string;\n pid: number;\n pid_start_time: string;\n pgid: number;\n worktree_path: string | null;\n branch: string | null;\n shadow_tree_sha: string | null;\n status: 'active' | 'idle' | 'dead' | 'completed';\n last_seen_event_id: number;\n registered_at: number;\n last_heartbeat_at: number;\n lease_expires_at: number;\n}\n\nexport class SessionOwnershipError extends Error {\n constructor(agentId: string) {\n super(`No valid active session capability for '${agentId}'. Start a session, or resume it with its session token.`);\n this.name = 'SessionOwnershipError';\n }\n}\n\nexport class StaleFencingTokenError extends Error {\n constructor(public readonly resourceId: string, public readonly providedToken: number, public readonly expectedToken: number) {\n super(`Fencing token mismatch for '${resourceId}': provided ${providedToken}, expected ${expectedToken}.`);\n this.name = 'StaleFencingTokenError';\n }\n}\n\ninterface SessionRow { token_hash: string; epoch: number }\nexport interface SessionRegistration { agent: AgentRecord; fencingToken: number; sessionToken: string; sessionEpoch: number }\n\nexport class FencingAndAgentManager {\n public static readonly DEFAULT_LEASE_MS = 5 * 60 * 1000;\n private readonly capabilities = new Map<string, string>();\n private static ownWindowsStart: string | null = null;\n private static inspectionFailure: string | null = null;\n\n constructor(private readonly coordDb: CoordDatabase) {}\n\n public static validateLease(duration: number): number {\n if (!Number.isSafeInteger(duration) || duration < 100 || duration > 86_400_000) {\n throw new Error('Lease duration must be an integer between 100 and 86400000 milliseconds');\n }\n return duration;\n }\n\n /** A real kernel process identity; tests must not supply liveness sentinels. */\n public static getProcessStartTime(pid: number): string | null {\n this.inspectionFailure = null;\n if (!Number.isSafeInteger(pid) || pid <= 0) return null;\n try {\n if (process.platform === 'linux') {\n const stat = fs.readFileSync(`/proc/${pid}/stat`, 'utf8');\n return `linux:${stat.slice(stat.lastIndexOf(')') + 2).split(' ')[19]}`;\n }\n if (process.platform === 'win32') {\n // Only our own identity is immutable for this process lifetime. Never cache other PIDs.\n if (pid === process.pid && this.ownWindowsStart) return this.ownWindowsStart;\n const powershell = path.join(process.env.SystemRoot ?? 'C:\\\\Windows', 'System32', 'WindowsPowerShell', 'v1.0', 'powershell.exe');\n // Query the kernel-backed Process API directly, avoiding cold Get-Process module auto-loading.\n const ticks = execFileSync(powershell, ['-NoProfile', '-NonInteractive', '-Command',\n `([System.Diagnostics.Process]::GetProcessById(${pid})).StartTime.ToUniversalTime().Ticks.ToString([System.Globalization.CultureInfo]::InvariantCulture)`],\n { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], timeout: 15000, windowsHide: true }).trim();\n if (!/^\\d+$/.test(ticks)) { this.inspectionFailure = 'invalid kernel creation-time response'; return null; }\n const identity = `windows:${ticks}`;\n if (pid === process.pid) this.ownWindowsStart = identity;\n return identity;\n }\n const out = execFileSync('ps', ['-o', 'lstart=', '-p', String(pid)], {\n encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], timeout: 1500,\n env: { ...process.env, LC_ALL: 'C' },\n }).trim();\n return out || null;\n } catch (error) {\n const failure = error as NodeJS.ErrnoException & { status?: number; signal?: string };\n this.inspectionFailure = [failure.code, failure.status === undefined ? null : `exit ${failure.status}`, failure.signal].filter(Boolean).join(', ') || 'inspection unavailable';\n return null;\n }\n }\n\n public static isProcessAlive(pid: number, expectedStartTime: string): boolean {\n if (!Number.isSafeInteger(pid) || pid <= 0) return false;\n try { process.kill(pid, 0); }\n catch (err) { if ((err as NodeJS.ErrnoException).code === 'ESRCH') return false; }\n const current = this.getProcessStartTime(pid);\n // Failure to inspect a live process is not evidence that its locks can be stolen.\n return current === null || current === expectedStartTime;\n }\n\n public registerAgent(params: {\n id: string; name?: string; client?: string; pid?: number; pgid?: number;\n worktreePath?: string | null; branch?: string | null; leaseDurationMs?: number;\n sessionToken?: string;\n }): SessionRegistration {\n if (!/^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,127}$/.test(params.id)) throw new Error('Invalid agent ID');\n const leaseMs = FencingAndAgentManager.validateLease(params.leaseDurationMs ?? FencingAndAgentManager.DEFAULT_LEASE_MS);\n this.reapDeadAgents();\n return this.coordDb.withTransaction(() => {\n const existing = this.getAgent(params.id);\n const supplied = params.sessionToken ?? this.capabilities.get(params.id);\n if (existing?.status === 'active') {\n const epoch = this.assertSession(params.id, supplied);\n // Resuming never changes the process anchor or session generation.\n this.capabilities.set(params.id, supplied!);\n this.heartbeat(params.id, leaseMs);\n return { agent: this.getAgent(params.id)!, fencingToken: epoch, sessionToken: supplied!, sessionEpoch: epoch };\n }\n if (params.sessionToken !== undefined) throw new SessionOwnershipError(params.id);\n const pid = params.pid ?? process.pid;\n const start = FencingAndAgentManager.getProcessStartTime(pid);\n if (!start) throw new Error(`Cannot determine start time of live session owner PID ${pid} (${FencingAndAgentManager.inspectionFailure ?? 'inspection unavailable'})`);\n const now = Date.now();\n const epoch = this.coordDb.nextFencingToken();\n const token = crypto.randomBytes(32).toString('base64url');\n const latest = (this.coordDb.db.prepare('SELECT COALESCE(MAX(id), 0) AS id FROM events').get() as { id: number }).id;\n this.coordDb.db.prepare(`\n INSERT INTO agents (id, name, client, pid, pid_start_time, pgid, worktree_path, branch,\n shadow_tree_sha, status, last_seen_event_id, registered_at, last_heartbeat_at, lease_expires_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL, 'active', ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET name=excluded.name, client=excluded.client, pid=excluded.pid,\n pid_start_time=excluded.pid_start_time, pgid=excluded.pgid, status='active',\n worktree_path=COALESCE(agents.worktree_path, excluded.worktree_path),\n shadow_tree_sha=NULL, last_seen_event_id=excluded.last_seen_event_id,\n registered_at=excluded.registered_at, last_heartbeat_at=excluded.last_heartbeat_at,\n lease_expires_at=excluded.lease_expires_at\n `).run(params.id, params.name ?? existing?.name ?? params.id, params.client ?? 'unknown',\n pid, start, params.pgid ?? pid, params.worktreePath ?? (this.coordDb.isLinkedWorktree ? this.coordDb.repoRoot : null), params.branch ?? null,\n latest, now, now, now + leaseMs);\n this.coordDb.db.prepare('INSERT OR REPLACE INTO agent_sessions(agent_id, token_hash, epoch) VALUES (?, ?, ?)')\n .run(params.id, this.hash(token), epoch);\n this.capabilities.set(params.id, token);\n this.coordDb.logEvent(params.id, 'agent_registered', { client: params.client ?? 'unknown', pid, sessionEpoch: epoch });\n return { agent: this.getAgent(params.id)!, fencingToken: epoch, sessionToken: token, sessionEpoch: epoch };\n });\n }\n\n public resumeSession(agentId: string, sessionToken: string): number {\n const epoch = this.assertSession(agentId, sessionToken);\n this.capabilities.set(agentId, sessionToken);\n return epoch;\n }\n\n public assertSession(agentId: string, sessionToken = this.capabilities.get(agentId)): number {\n const agent = this.getAgent(agentId);\n const session = this.coordDb.db.prepare('SELECT token_hash, epoch FROM agent_sessions WHERE agent_id = ?')\n .get(agentId) as SessionRow | undefined;\n if (!agent || agent.status !== 'active' || agent.lease_expires_at <= Date.now() || !session ||\n !sessionToken || this.hash(sessionToken) !== session.token_hash ||\n !FencingAndAgentManager.isProcessAlive(agent.pid, agent.pid_start_time)) {\n throw new SessionOwnershipError(agentId);\n }\n return session.epoch;\n }\n\n public sessionEnvironment(agentId: string): NodeJS.ProcessEnv {\n this.assertSession(agentId);\n return { ...process.env, KITH_AGENT_ID: agentId, KITH_SESSION_TOKEN: this.capabilities.get(agentId)! };\n }\n\n public heartbeat(agentId: string, leaseDurationMs = FencingAndAgentManager.DEFAULT_LEASE_MS): AgentRecord {\n const lease = FencingAndAgentManager.validateLease(leaseDurationMs);\n return this.coordDb.withTransaction(() => {\n this.assertSession(agentId);\n const now = Date.now();\n const expires = now + lease;\n this.coordDb.db.prepare('UPDATE agents SET last_heartbeat_at=?, lease_expires_at=? WHERE id=?').run(now, expires, agentId);\n this.coordDb.db.prepare('UPDATE locks SET expires_at=MAX(expires_at, ?) WHERE owner_agent_id=? AND expires_at>?')\n .run(expires, agentId, now);\n // Mutex renewal requires its exact acquisition token, not just a session heartbeat.\n this.coordDb.db.prepare(\"UPDATE resources SET expires_at=MAX(expires_at, ?) WHERE type='port' AND owner_agent_id=? AND expires_at>?\")\n .run(expires, agentId, now);\n return this.getAgent(agentId)!;\n });\n }\n\n public getAgent(agentId: string): AgentRecord | null {\n return (this.coordDb.db.prepare('SELECT * FROM agents WHERE id=?').get(agentId) as AgentRecord | undefined) ?? null;\n }\n\n public listAgents(onlyActive = false): AgentRecord[] {\n this.reapDeadAgents();\n return this.coordDb.db.prepare(onlyActive\n ? \"SELECT * FROM agents WHERE status='active' ORDER BY registered_at\"\n : 'SELECT * FROM agents ORDER BY registered_at DESC').all() as unknown as AgentRecord[];\n }\n\n public reapDeadAgents(): string[] {\n const agents = this.coordDb.db.prepare(\"SELECT * FROM agents WHERE status='active'\").all() as unknown as AgentRecord[];\n const liveness = new Map<string, boolean>();\n const candidates = agents.filter((a) => {\n const key = `${a.pid}:${a.pid_start_time}`;\n if (!liveness.has(key)) liveness.set(key, FencingAndAgentManager.isProcessAlive(a.pid, a.pid_start_time));\n return a.lease_expires_at <= Date.now() || !liveness.get(key);\n });\n if (!candidates.length) return [];\n return this.coordDb.withTransaction(() => {\n const reaped: string[] = [];\n for (const previous of candidates) {\n const current = this.getAgent(previous.id);\n // Recheck after taking the writer lock: a heartbeat or replacement may have won.\n if (!current || current.status !== 'active' || current.registered_at !== previous.registered_at ||\n current.pid !== previous.pid || current.pid_start_time !== previous.pid_start_time) continue;\n if (current.lease_expires_at > Date.now() && FencingAndAgentManager.isProcessAlive(current.pid, current.pid_start_time)) continue;\n this.reclaim(current.id, 'dead', 'process_died_or_lease_expired');\n reaped.push(current.id);\n }\n return reaped;\n });\n }\n\n public completeAgentSession(agentId: string): void {\n this.coordDb.withTransaction(() => { this.assertSession(agentId); this.reclaim(agentId, 'completed', 'session_completed'); });\n this.capabilities.delete(agentId);\n }\n\n public abandonAgentSession(agentId: string): void {\n this.coordDb.withTransaction(() => { this.assertSession(agentId); this.reclaim(agentId, 'dead', 'client_disconnected'); });\n this.capabilities.delete(agentId);\n }\n\n private reclaim(agentId: string, status: 'dead' | 'completed', reason: string): void {\n const epoch = this.coordDb.nextFencingToken();\n const now = Date.now();\n this.coordDb.db.prepare('UPDATE agents SET status=?, last_heartbeat_at=? WHERE id=?').run(status, now, agentId);\n this.coordDb.db.prepare('DELETE FROM locks WHERE owner_agent_id=?').run(agentId);\n this.coordDb.db.prepare('DELETE FROM resources WHERE owner_agent_id=?').run(agentId);\n this.coordDb.db.prepare('DELETE FROM mutex_waiters WHERE owner_agent_id=?').run(agentId);\n // Live command guards survive session expiry until their process group has stopped.\n this.coordDb.db.prepare('DELETE FROM conflicts WHERE agent_a=? OR agent_b=?').run(agentId, agentId);\n if (status === 'dead') {\n this.coordDb.db.prepare(\"UPDATE tasks SET status='queued', owner_agent_id=NULL, fencing_token=NULL, updated_at=? WHERE owner_agent_id=? AND status='active'\")\n .run(now, agentId);\n } else {\n this.coordDb.db.prepare(\"UPDATE tasks SET status='done', updated_at=? WHERE owner_agent_id=? AND status='active'\")\n .run(now, agentId);\n }\n this.coordDb.logEvent(agentId, `agent_${status}`, { reason, newFencingEpoch: epoch });\n }\n\n public verifyFencingToken(resourceId: string, provided: number, expected: number): void {\n if (provided !== expected) throw new StaleFencingTokenError(resourceId, provided, expected);\n }\n\n private hash(token: string): string { return crypto.createHash('sha256').update(token).digest('hex'); }\n}\n","import { fork } from 'node:child_process';\nimport fs from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport crypto from 'node:crypto';\nimport net from 'node:net';\nimport { CoordDatabase } from './db.js';\nimport { FencingAndAgentManager } from './fencing.js';\n\nexport interface ResourceRecord {\n id: string;\n type: 'port' | 'mutex';\n name: string;\n value: string;\n owner_agent_id: string;\n fencing_token: number;\n queue: string[];\n acquired_at: number;\n expires_at: number;\n}\n\nexport interface SupervisedCommandOptions {\n agentId: string; command: string | string[]; cwd?: string;\n timeoutMs?: number; commandTimeoutMs?: number; leaseDurationMs?: number;\n killGraceMs?: number; signal?: AbortSignal; maxOutputBytes?: number;\n onStdout?: (chunk: Buffer) => void; onStderr?: (chunk: Buffer) => void;\n}\ninterface CommandLifecycle {\n prepare: () => Promise<{ command: string[]; env: Record<string, string> }>;\n renew: () => void;\n release: () => void;\n}\n\nexport class ResourceBroker {\n private activeExecutions = 0;\n public hasActiveCommands(): boolean { return this.activeExecutions > 0; }\n constructor(\n private readonly coordDb: CoordDatabase,\n private readonly fencing: FencingAndAgentManager\n ) {}\n\n /**\n * Acquires a collision-free port lease for `(agentId, serviceName)`.\n * Verifies both SQLite resource table and OS TCP socket availability.\n */\n public async acquirePort(params: {\n agentId: string;\n serviceName: string;\n basePort?: number;\n leaseDurationMs?: number;\n }): Promise<{ port: number; fencingToken: number; resource: ResourceRecord }> {\n this.fencing.reapDeadAgents();\n this.fencing.assertSession(params.agentId);\n const basePort = params.basePort ?? 3100;\n const leaseMs = FencingAndAgentManager.validateLease(params.leaseDurationMs ?? FencingAndAgentManager.DEFAULT_LEASE_MS);\n const now = Date.now();\n const expiresAt = now + leaseMs;\n if (!Number.isInteger(basePort) || basePort < 1 || basePort > 65535) throw new Error('basePort must be an integer between 1 and 65535');\n const resourceKey = `${params.agentId}:${params.serviceName}`;\n\n // Check if this agent already holds a port for this service\n const existing = this.getResource('port', resourceKey);\n if (existing && existing.expires_at > now) {\n return this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n this.coordDb.db.prepare(`UPDATE resources SET expires_at = ? WHERE id = ?`).run(expiresAt, existing.id);\n return {\n port: Number(existing.value), fencingToken: existing.fencing_token,\n resource: this.getResource('port', resourceKey)!,\n };\n });\n }\n\n if (!Number.isInteger(basePort) || basePort < 1 || basePort > 65535) {\n throw new Error('basePort must be an integer between 1 and 65535');\n }\n const limit = Math.min(basePort + 500, 65536);\n for (let candidatePort = basePort; candidatePort < limit; candidatePort++) {\n if (!(await ResourceBroker.isTcpPortFree(candidatePort))) continue;\n // The OS probe is asynchronous. Recheck reservations under the writer lock.\n const reservation = this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const now = Date.now();\n const sameService = this.getResource('port', resourceKey);\n if (sameService && sameService.expires_at > now) {\n return { port: Number(sameService.value), fencingToken: sameService.fencing_token, resource: sameService };\n }\n const taken = this.coordDb.db.prepare(\n `SELECT id FROM resources WHERE type = 'port' AND value = ? AND expires_at > ?`\n ).get(String(candidatePort), now);\n if (taken) return null;\n const token = this.coordDb.nextFencingToken();\n this.coordDb.db.prepare(`\n INSERT OR REPLACE INTO resources (\n id, type, name, value, owner_agent_id, fencing_token, queue_json, acquired_at, expires_at\n ) VALUES (?, 'port', ?, ?, ?, ?, '[]', ?, ?)\n `).run(`res_${crypto.randomBytes(6).toString('hex')}`, resourceKey,\n String(candidatePort), params.agentId, token, now, now + leaseMs);\n this.coordDb.logEvent(params.agentId, 'port_leased', {\n serviceName: params.serviceName, port: candidatePort, fencingToken: token,\n });\n return { port: candidatePort, fencingToken: token, resource: this.getResource('port', resourceKey)! };\n });\n if (reservation) return reservation;\n }\n throw new Error(`No free port available in range ${basePort}-${limit - 1}`);\n }\n\n public static isTcpPortFree(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = net.createServer();\n server.unref();\n server.on('error', () => resolve(false));\n server.listen(port, '127.0.0.1', () => {\n server.close(() => resolve(true));\n });\n });\n }\n\n /** FIFO order survives releases; queued requests belong to a specific session epoch. */\n public tryAcquireMutex(params: {\n agentId: string; mutexName: string; leaseDurationMs?: number; requestId?: string;\n }): { acquired: boolean; fencingToken: number; holderAgentId: string; queuePosition: number } {\n this.fencing.reapDeadAgents();\n const leaseMs = FencingAndAgentManager.validateLease(params.leaseDurationMs ?? FencingAndAgentManager.DEFAULT_LEASE_MS);\n return this.coordDb.withTransaction(() => {\n const epoch = this.fencing.assertSession(params.agentId);\n const now = Date.now();\n const requestId = params.requestId ?? `session:${epoch}`;\n this.pruneWaiters(params.mutexName);\n const run = this.getRun(params.mutexName);\n const guarded = run && this.runIsAlive(run);\n if (run && !guarded) this.clearRun(run);\n const existing = this.getResource('mutex', params.mutexName);\n if (!guarded && existing && existing.expires_at > now && existing.owner_agent_id === params.agentId) {\n this.coordDb.db.prepare('UPDATE resources SET expires_at=? WHERE id=?').run(now + leaseMs, existing.id);\n return { acquired: true, fencingToken: existing.fencing_token, holderAgentId: params.agentId, queuePosition: 0 };\n }\n const start = FencingAndAgentManager.getProcessStartTime(process.pid);\n if (!start) throw new Error('Cannot inspect mutex waiter process. Sandboxed MCP clients can use kith_run_with_mutex instead.');\n this.coordDb.db.prepare(`INSERT INTO mutex_waiters\n (mutex_name, request_id, owner_agent_id, session_epoch, waiter_pid, waiter_start, expires_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(mutex_name, request_id) DO UPDATE SET expires_at=excluded.expires_at\n `).run(params.mutexName, requestId, params.agentId, epoch, process.pid, start, now + leaseMs);\n const waiters = this.waiters(params.mutexName);\n const position = waiters.findIndex((w) => w.request_id === requestId) + 1;\n if (guarded || (existing && existing.expires_at > now) || position !== 1) {\n return { acquired: false, fencingToken: run?.fencing_token ?? existing?.fencing_token ?? 0,\n holderAgentId: guarded ? run!.owner_agent_id : existing?.owner_agent_id ?? waiters[0].owner_agent_id,\n queuePosition: position };\n }\n const token = this.coordDb.nextFencingToken();\n this.coordDb.db.prepare(`INSERT OR REPLACE INTO resources\n (id, type, name, value, owner_agent_id, fencing_token, queue_json, acquired_at, expires_at)\n VALUES (?, 'mutex', ?, 'locked', ?, ?, '[]', ?, ?)\n `).run(existing?.id ?? `res_${crypto.randomBytes(6).toString('hex')}`, params.mutexName, params.agentId, token, now, now + leaseMs);\n this.coordDb.db.prepare('DELETE FROM mutex_waiters WHERE mutex_name=? AND request_id=?').run(params.mutexName, requestId);\n this.coordDb.logEvent(params.agentId, 'mutex_acquired', { mutexName: params.mutexName, fencingToken: token });\n return { acquired: true, fencingToken: token, holderAgentId: params.agentId, queuePosition: 0 };\n });\n }\n\n public renewMutex(params: { agentId: string; mutexName: string; fencingToken: number; leaseDurationMs?: number }): void {\n const lease = FencingAndAgentManager.validateLease(params.leaseDurationMs ?? FencingAndAgentManager.DEFAULT_LEASE_MS);\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const resource = this.getResource('mutex', params.mutexName);\n if (!resource || resource.owner_agent_id !== params.agentId || resource.expires_at <= Date.now()) {\n throw new Error(`Mutex lease lost: ${params.mutexName}`);\n }\n this.fencing.verifyFencingToken(params.mutexName, params.fencingToken, resource.fencing_token);\n this.coordDb.db.prepare('UPDATE resources SET expires_at=? WHERE id=?').run(Date.now() + lease, resource.id);\n });\n }\n\n public releaseMutex(params: { agentId: string; mutexName: string; fencingToken: number }): boolean {\n return this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const resource = this.getResource('mutex', params.mutexName);\n if (!resource || resource.owner_agent_id !== params.agentId) return false;\n this.fencing.verifyFencingToken(params.mutexName, params.fencingToken, resource.fencing_token);\n const run = this.getRun(params.mutexName);\n if (run && this.runIsAlive(run)) throw new Error('Cannot release a mutex while its supervised process group is alive');\n this.coordDb.db.prepare('DELETE FROM resources WHERE id=?').run(resource.id);\n this.coordDb.logEvent(params.agentId, 'mutex_released', { mutexName: params.mutexName });\n return true;\n });\n }\n\n /** Launch on the allocated port, without interpreting arguments as shell code. */\n public async executeWithPort(params: Omit<SupervisedCommandOptions, 'command'> & {\n command: string[]; serviceName: string; basePort?: number;\n onPort?: (port: number) => void;\n }) {\n if (!params.command.length || !params.command[0]) throw new Error('A command is required');\n if (!params.serviceName || params.serviceName.length > 128) throw new Error('serviceName must contain 1 to 128 characters');\n const mutexName = `dev-port:${params.agentId}:${params.serviceName}`;\n let allocation: Awaited<ReturnType<ResourceBroker['acquirePort']>> | undefined;\n const leaseMs = FencingAndAgentManager.validateLease(params.leaseDurationMs ?? FencingAndAgentManager.DEFAULT_LEASE_MS);\n const result = await this.executeGuarded({ ...params, mutexName }, {\n prepare: async () => {\n allocation = await this.acquirePort({ ...params, basePort: params.basePort ?? 3000 });\n params.onPort?.(allocation.port);\n return { command: params.command.map((arg) => arg.replaceAll('{port}', String(allocation!.port))),\n env: { PORT: String(allocation.port), KITH_PORT: String(allocation.port) } };\n },\n renew: () => {\n if (!allocation) return;\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const resource = this.getResource('port', `${params.agentId}:${params.serviceName}`);\n if (!resource || resource.fencing_token !== allocation!.fencingToken || resource.expires_at <= Date.now()) {\n throw new Error('Dev server port lease lost');\n }\n this.coordDb.db.prepare('UPDATE resources SET expires_at=? WHERE id=?').run(Date.now() + leaseMs, resource.id);\n });\n },\n release: () => {\n if (allocation) this.coordDb.db.prepare(\"DELETE FROM resources WHERE type='port' AND name=? AND fencing_token=?\")\n .run(`${params.agentId}:${params.serviceName}`, allocation.fencingToken);\n },\n });\n return { ...result, port: allocation!.port };\n }\n\n /** Renew leases while a detached, recorded process group runs; stop it before releasing. */\n public executeWithMutex(params: SupervisedCommandOptions & { mutexName: string }) {\n return this.executeGuarded(params);\n }\n\n private async executeGuarded(params: SupervisedCommandOptions & { mutexName: string }, lifecycle?: CommandLifecycle):\n Promise<{ stdout: string; stderr: string; exitCode: number; waitedMs: number }> {\n if (process.platform === 'win32') throw new Error('Supervised mutex commands currently require macOS or Linux process groups');\n if (!params.command.length) throw new Error('A command is required');\n const leaseMs = FencingAndAgentManager.validateLease(params.leaseDurationMs ?? FencingAndAgentManager.DEFAULT_LEASE_MS);\n const waitTimeout = params.timeoutMs ?? 60_000;\n const grace = params.killGraceMs ?? 1000;\n if (!Number.isFinite(waitTimeout) || waitTimeout < 0 || !Number.isFinite(grace) || grace < 0 ||\n (params.commandTimeoutMs !== undefined && (!Number.isFinite(params.commandTimeoutMs) || params.commandTimeoutMs <= 0))) {\n throw new Error('Timeouts must be finite nonnegative milliseconds (command timeout must be positive)');\n }\n if (params.maxOutputBytes !== undefined && (!Number.isSafeInteger(params.maxOutputBytes) || params.maxOutputBytes <= 0)) throw new Error('maxOutputBytes must be a positive integer');\n const epoch = this.fencing.assertSession(params.agentId);\n const requestId = crypto.randomUUID();\n const started = Date.now();\n let run: MutexRun | null = null;\n const abortError = () => new DOMException('Mutex command cancelled', 'AbortError');\n this.activeExecutions++;\n try {\n while (!run) {\n if (params.signal?.aborted) throw abortError();\n run = this.coordDb.withTransaction(() => {\n const attempt = this.tryAcquireMutex({ ...params, requestId });\n if (!attempt.acquired) return null;\n const record: MutexRun = {\n mutex_name: params.mutexName, run_id: requestId, owner_agent_id: params.agentId,\n session_epoch: epoch, fencing_token: attempt.fencingToken, supervisor_pid: process.pid,\n supervisor_start: FencingAndAgentManager.getProcessStartTime(process.pid)!, worker_pid: null, worker_start: null,\n };\n this.coordDb.db.prepare(`INSERT INTO mutex_runs\n (mutex_name, run_id, owner_agent_id, session_epoch, fencing_token, supervisor_pid, supervisor_start)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `).run(record.mutex_name, record.run_id, record.owner_agent_id, epoch, record.fencing_token, process.pid, record.supervisor_start);\n return record;\n });\n if (run) break;\n if (Date.now() - started >= waitTimeout) throw new Error(`Timed out waiting for mutex '${params.mutexName}'`);\n this.fencing.heartbeat(params.agentId);\n await delay(Math.min(50, Math.max(10, leaseMs / 4)));\n }\n const waitedMs = Date.now() - started;\n const prepared = await lifecycle?.prepare();\n if (params.signal?.aborted) throw abortError();\n const candidates = ['./command-worker.js', '../command-worker.js', '../../dist/command-worker.js']\n .map((name) => fileURLToPath(new URL(name, import.meta.url)));\n const script = candidates.find((name) => fs.existsSync(name));\n if (!script) throw new Error('Missing command worker. Build Kith before running supervised commands.');\n const worker = fork(script, [], { detached: true, stdio: ['ignore', 'pipe', 'pipe', 'ipc'], execArgv: [] });\n const workerPid = worker.pid;\n if (!workerPid) {\n worker.on('error', () => {});\n throw new Error('Could not start command supervisor');\n }\n let workerIdentity = FencingAndAgentManager.getProcessStartTime(workerPid);\n let failure: Error | undefined;\n let outcome: { exitCode: number; error?: string } | undefined;\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n let outputBytes = 0;\n let killTimer: ReturnType<typeof setTimeout> | undefined;\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n let stopDeadline: number | undefined;\n let disposed = false;\n let finishStopped!: () => void;\n const stopped = new Promise<void>((resolve) => { finishStopped = resolve; });\n const stop = (err?: Error) => {\n if (disposed) return;\n failure ??= err;\n const termError = signalGroup(workerPid, 'SIGTERM', workerIdentity);\n failure ??= termError;\n killTimer ??= setTimeout(() => {\n const killError = signalGroup(workerPid, 'SIGKILL', workerIdentity);\n failure ??= killError;\n }, grace);\n stopDeadline ??= Date.now() + grace + 5000;\n stopTimer ??= setTimeout(finishStopped, Math.max(0, stopDeadline - Date.now()));\n };\n const onAbort = () => stop(abortError());\n params.signal?.addEventListener('abort', onAbort, { once: true });\n const interval = setInterval(() => {\n try {\n this.fencing.heartbeat(params.agentId);\n this.renewMutex({ ...params, fencingToken: run!.fencing_token });\n lifecycle?.renew();\n } catch (err) { stop(err instanceof Error ? err : new Error(String(err))); }\n }, Math.max(10, Math.floor(leaseMs / 3)));\n const commandTimer = params.commandTimeoutMs === undefined ? undefined\n : setTimeout(() => stop(new Error('Mutex command execution timed out')), params.commandTimeoutMs);\n const capture = (destination: Buffer[], stream?: (chunk: Buffer) => void) => (chunk: Buffer) => {\n stream?.(chunk);\n outputBytes += chunk.length;\n if (outputBytes > (params.maxOutputBytes ?? 16 * 1024 * 1024)) stop(new Error('Mutex command output limit exceeded'));\n else destination.push(chunk);\n };\n worker.stdout!.on('data', capture(stdout, params.onStdout));\n worker.stderr!.on('data', capture(stderr, params.onStderr));\n worker.on('message', (message: { ready?: boolean; exitCode?: number; error?: string }) => {\n if (disposed) return;\n if (message.ready) {\n try {\n if (params.signal?.aborted) throw abortError();\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const identity = FencingAndAgentManager.getProcessStartTime(workerPid);\n if (!identity) throw new Error('Cannot inspect command worker');\n this.coordDb.db.prepare('UPDATE mutex_runs SET worker_pid=?, worker_start=? WHERE run_id=?')\n .run(workerPid, identity, requestId);\n run!.worker_pid = workerPid;\n run!.worker_start = identity;\n workerIdentity = identity;\n this.renewMutex({ ...params, fencingToken: run!.fencing_token });\n lifecycle?.renew();\n });\n worker.send({ command: prepared?.command ?? params.command, env: prepared?.env, cwd: params.cwd ?? this.coordDb.repoRoot, mutexName: params.mutexName });\n } catch (err) { stop(err instanceof Error ? err : new Error(String(err))); }\n } else {\n outcome = { exitCode: message.exitCode ?? 1, error: message.error };\n }\n });\n worker.once('exit', () => { if (!disposed && groupIsAlive(workerPid, workerIdentity)) stop(); });\n try {\n await Promise.race([new Promise<void>((resolve, reject) => {\n worker.once('close', () => resolve());\n worker.once('error', reject);\n }), stopped]);\n if (params.signal?.aborted) failure ??= abortError();\n if (failure) throw failure;\n if (!outcome) throw new Error('Command worker exited without a result');\n if (outcome.error) throw new Error(outcome.error);\n return { stdout: Buffer.concat(stdout).toString(), stderr: Buffer.concat(stderr).toString(), exitCode: outcome.exitCode, waitedMs };\n } finally {\n clearInterval(interval);\n if (commandTimer) clearTimeout(commandTimer);\n params.signal?.removeEventListener('abort', onAbort);\n if (groupIsAlive(workerPid, workerIdentity)) {\n const killError = signalGroup(workerPid, 'SIGKILL', workerIdentity);\n failure ??= killError;\n const deadline = stopDeadline ?? Date.now() + 5000;\n while (groupIsAlive(workerPid, workerIdentity) && Date.now() < deadline) await delay(20);\n }\n disposed = true;\n if (killTimer) clearTimeout(killTimer);\n if (stopTimer) clearTimeout(stopTimer);\n if (groupIsAlive(workerPid, workerIdentity)) {\n // Retain the durable guard, but don't leave this caller pinned forever.\n worker.stdout?.destroy(); worker.stderr?.destroy();\n if (worker.connected) worker.disconnect();\n worker.unref();\n throw new Error('Command group has not stopped; mutex guard retained for safety');\n }\n }\n } finally {\n try {\n this.coordDb.withTransaction(() => {\n this.coordDb.db.prepare('DELETE FROM mutex_waiters WHERE mutex_name=? AND request_id=? AND session_epoch=?')\n .run(params.mutexName, requestId, epoch);\n if (run && !this.runIsAlive(run)) this.clearRun(run);\n // No protected command can start before the worker-group handshake.\n if (run && run.worker_pid === null) this.clearRun(run);\n if (!this.getRun(params.mutexName)) lifecycle?.release();\n });\n } finally { this.activeExecutions--; }\n }\n }\n\n private getRun(name: string): MutexRun | null {\n return (this.coordDb.db.prepare('SELECT * FROM mutex_runs WHERE mutex_name=?').get(name) as MutexRun | undefined) ?? null;\n }\n\n private runIsAlive(run: MutexRun): boolean {\n return run.worker_pid !== null ? groupIsAlive(run.worker_pid, run.worker_start)\n : FencingAndAgentManager.isProcessAlive(run.supervisor_pid, run.supervisor_start);\n }\n\n private clearRun(run: MutexRun): void {\n this.coordDb.db.prepare('DELETE FROM mutex_runs WHERE mutex_name=? AND run_id=?').run(run.mutex_name, run.run_id);\n this.coordDb.db.prepare(\"DELETE FROM resources WHERE type='mutex' AND name=? AND fencing_token=?\")\n .run(run.mutex_name, run.fencing_token);\n }\n\n private waiters(name: string): MutexWaiter[] {\n return this.coordDb.db.prepare('SELECT * FROM mutex_waiters WHERE mutex_name=? ORDER BY ticket').all(name) as unknown as MutexWaiter[];\n }\n\n private pruneWaiters(name: string): void {\n for (const waiter of this.waiters(name)) {\n const agent = this.fencing.getAgent(waiter.owner_agent_id);\n const session = this.coordDb.db.prepare('SELECT epoch FROM agent_sessions WHERE agent_id=?').get(waiter.owner_agent_id) as { epoch: number } | undefined;\n if (!agent || agent.status !== 'active' || agent.lease_expires_at <= Date.now() || session?.epoch !== waiter.session_epoch ||\n waiter.expires_at <= Date.now() || !FencingAndAgentManager.isProcessAlive(waiter.waiter_pid, waiter.waiter_start)) {\n this.coordDb.db.prepare('DELETE FROM mutex_waiters WHERE ticket=?').run(waiter.ticket);\n }\n }\n }\n\n public getResource(type: 'port' | 'mutex', name: string): ResourceRecord | null {\n const row = this.coordDb.db\n .prepare(`SELECT * FROM resources WHERE type = ? AND name = ?`)\n .get(type, name) as Record<string, unknown> | undefined;\n if (!row) return null;\n return this.mapRow(row);\n }\n\n public listResources(): ResourceRecord[] {\n this.fencing.reapDeadAgents();\n const rows = this.coordDb.db\n .prepare(`SELECT * FROM resources WHERE expires_at > ? ORDER BY acquired_at ASC`)\n .all(Date.now()) as Array<Record<string, unknown>>;\n return rows.map((r) => this.mapRow(r));\n }\n\n private mapRow(row: Record<string, unknown>): ResourceRecord {\n return {\n id: String(row.id),\n type: row.type as 'port' | 'mutex',\n name: String(row.name),\n value: String(row.value),\n owner_agent_id: String(row.owner_agent_id),\n fencing_token: Number(row.fencing_token),\n queue: row.type === 'mutex' ? this.waiters(String(row.name)).map((w) => w.owner_agent_id) : [],\n acquired_at: Number(row.acquired_at),\n expires_at: Number(row.expires_at),\n };\n }\n}\n\ninterface MutexRun {\n mutex_name: string; run_id: string; owner_agent_id: string; session_epoch: number;\n fencing_token: number; supervisor_pid: number; supervisor_start: string;\n worker_pid: number | null; worker_start: string | null;\n}\ninterface MutexWaiter {\n ticket: number; request_id: string; owner_agent_id: string; session_epoch: number;\n waiter_pid: number; waiter_start: string; expires_at: number;\n}\nfunction groupIsAlive(pgid: number, expectedStart?: string | null): boolean {\n if (expectedStart) {\n const currentStart = FencingAndAgentManager.getProcessStartTime(pgid);\n if (currentStart && currentStart !== expectedStart) return false;\n }\n try { process.kill(-pgid, 0); }\n catch (err) { return (err as NodeJS.ErrnoException).code !== 'ESRCH'; }\n if (process.platform === 'linux') {\n // A killed, adopted zombie cannot execute writes. Some container PID 1s\n // leave zombies unreaped, so kill(-pgid, 0) alone would retain guards forever.\n try {\n for (const pid of fs.readdirSync('/proc').filter((name) => /^\\d+$/.test(name))) {\n let stat: string;\n try { stat = fs.readFileSync(`/proc/${pid}/stat`, 'utf8'); }\n catch (err) { if ((err as NodeJS.ErrnoException).code === 'ENOENT' || (err as NodeJS.ErrnoException).code === 'ESRCH') continue; return true; }\n const fields = stat.slice(stat.lastIndexOf(')') + 2).split(' ');\n if (Number(fields[2]) === pgid && fields[0] !== 'Z' && fields[0] !== 'X') return true;\n }\n return false;\n } catch { return true; }\n }\n return true;\n}\nfunction signalGroup(pgid: number, signal: NodeJS.Signals, expectedStart?: string | null): Error | undefined {\n if (!groupIsAlive(pgid, expectedStart)) return;\n try { process.kill(-pgid, signal); }\n catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ESRCH') return err instanceof Error ? err : new Error(String(err));\n }\n}\nfunction delay(ms: number): Promise<void> { return new Promise((resolve) => setTimeout(resolve, ms)); }\n","import type { DatabaseSync as DatabaseSyncType } from 'node:sqlite';\nimport { createRequire } from 'node:module';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { discoverRepository, isWithin, physicalPath } from './repository.js';\n\nconst require = createRequire(import.meta.url);\nconst { DatabaseSync } = require('node:sqlite') as {\n DatabaseSync: typeof DatabaseSyncType;\n};\n\nexport interface CoordEvent {\n id: number;\n timestamp: number;\n agent_id: string | null;\n event_type: string;\n payload: Record<string, unknown>;\n}\n\nexport class CoordDatabase {\n public readonly db: DatabaseSyncType;\n public readonly repoRoot: string;\n public readonly commonGitDir: string | null;\n public readonly isLinkedWorktree: boolean;\n public readonly coordDir: string;\n public readonly dbPath: string;\n private inTransaction = false;\n\n constructor(repoRoot: string, customDbPath?: string) {\n const layout = discoverRepository(repoRoot);\n this.repoRoot = layout.checkoutRoot;\n this.commonGitDir = layout.commonGitDir;\n this.isLinkedWorktree = layout.isLinkedWorktree;\n for (let current = fs.realpathSync.native(repoRoot); isWithin(this.repoRoot, current); current = path.dirname(current)) {\n const local = path.join(current, '.coord');\n if (local !== layout.coordDir && fs.existsSync(path.join(local, 'state.db'))) {\n throw new Error(`Legacy checkout-local coordination state found at ${local}. Stop clients and preserve that directory before consolidating shared state.`);\n }\n if (current === this.repoRoot) break;\n }\n this.coordDir = layout.coordDir;\n if (physicalPath(this.coordDir) !== this.coordDir) throw new Error('Coordination directory must not be a symlink');\n this.dbPath = customDbPath ?? path.join(this.coordDir, 'state.db');\n if (!customDbPath && physicalPath(this.dbPath) !== this.dbPath) throw new Error('Coordination database must not be a symlink');\n const recoveryFiles = !customDbPath && (fs.existsSync(path.join(this.coordDir, 'merge-train.lock')) || fs.existsSync(path.join(this.coordDir, 'setup.lock')) ||\n ['shadow-index', 'quarantine', 'snapshots', 'worktrees', 'setup'].some(name => {\n const dir = path.join(this.coordDir, name);\n return fs.existsSync(dir) && (!fs.lstatSync(dir).isDirectory() || fs.readdirSync(dir).length > 0);\n }));\n const sidecars = ['-wal', '-shm', '-journal'].some(suffix => fs.existsSync(this.dbPath + suffix));\n if (!fs.existsSync(this.dbPath) && (recoveryFiles || sidecars)) {\n throw new Error('Missing coordination database with existing recovery state. Stop clients and preserve the database, sidecars and worktrees before repair.');\n }\n // Reject unknown state through a read-only connection before pragmas, checkpoints or setup writes.\n if (fs.existsSync(this.dbPath)) {\n const probe = new DatabaseSync(this.dbPath, { readOnly: true });\n try {\n probe.exec('PRAGMA busy_timeout=10000; BEGIN');\n CoordDatabase.schemaVersion(probe, !recoveryFiles);\n const check = probe.prepare('PRAGMA quick_check(1)').get() as { quick_check: string };\n if (check.quick_check !== 'ok') throw new Error('Damaged coordination database. Preserve all state before repair.');\n } finally { probe.close(); }\n }\n fs.mkdirSync(this.coordDir, { recursive: true, mode: 0o700 });\n for (const name of ['shadow-index', 'quarantine', 'snapshots', 'worktrees']) {\n const target = path.join(this.coordDir, name);\n if (!isWithin(this.coordDir, physicalPath(target)) || physicalPath(target) !== target) {\n throw new Error(`Coordination subdirectory must not be a symlink: ${name}`);\n }\n fs.mkdirSync(target, { recursive: true });\n }\n\n this.db = new DatabaseSync(this.dbPath);\n\n try {\n this.configurePragmas(); this.migrate(!recoveryFiles);\n }\n catch (err) { this.db.close(); throw err; }\n }\n\n /** Validate an existing snapshot without migration or ownership changes. */\n public static inspectSchema(db: DatabaseSyncType): number {\n const version = this.schemaVersion(db, false);\n const check = db.prepare('PRAGMA quick_check(1)').get() as { quick_check: string };\n if (check.quick_check !== 'ok') throw new Error('Damaged coordination database. Preserve all state before repair.');\n return version;\n }\n\n private configurePragmas(): void {\n this.db.exec(`\n PRAGMA busy_timeout = 10000;\n PRAGMA journal_mode = WAL;\n PRAGMA synchronous = NORMAL;\n PRAGMA foreign_keys = ON;\n PRAGMA temp_store = MEMORY;\n `);\n }\n\n private static schemaVersion(db: DatabaseSyncType, allowEmpty: boolean): number {\n const tables = db.prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name NOT GLOB 'sqlite_*'\").all() as Array<{ name: string }>;\n if (!tables.length) {\n if (!allowEmpty) throw new Error('Empty coordination database with existing recovery files. Preserve all state before repair.');\n return 1; // Fresh or interrupted first initialization, with no recovery files.\n }\n if (!tables.some(table => table.name === 'meta')) throw new Error('Missing coordination schema metadata. Preserve the database before repair.');\n const row = db.prepare(\"SELECT value FROM meta WHERE key='schema_version'\").get() as { value: string } | undefined;\n if (row?.value !== '1' && row?.value !== '2') {\n throw new Error(`Unsupported coordination schema version: ${String(row?.value)}. Preserve the database before upgrading or repairing it.`);\n }\n const version = Number(row.value);\n const required = ['agents', 'tasks', 'locks', 'file_deps', 'contracts', 'conflicts', 'merge_queue', 'resources', 'quarantine', 'events',\n ...(version === 2 ? ['agent_sessions', 'mutex_waiters', 'mutex_runs'] : [])];\n if (required.some(name => !tables.some(table => table.name === name))) {\n throw new Error('Incomplete coordination schema. Preserve the database before repair.');\n }\n // Check ownership fields that could otherwise make live owners or guards appear absent.\n const columns: Record<string, string> = {\n agents: 'id,pid,pid_start_time,status,registered_at,lease_expires_at,worktree_path,branch',\n tasks: 'status,owner_agent_id,fencing_token,scope_globs_json,depends_on_json',\n locks: 'owner_agent_id,pattern,mode,fencing_token,expires_at',\n resources: 'type,name,owner_agent_id,fencing_token,expires_at',\n ...(version === 2 ? {\n agent_sessions: 'agent_id,token_hash,epoch',\n mutex_waiters: 'ticket,mutex_name,request_id,owner_agent_id,session_epoch,waiter_pid,waiter_start,expires_at',\n mutex_runs: 'mutex_name,run_id,owner_agent_id,session_epoch,fencing_token,supervisor_pid,supervisor_start,worker_pid,worker_start',\n } : {}),\n };\n for (const [table, fields] of Object.entries(columns)) {\n try { db.prepare(`SELECT ${fields} FROM ${table} LIMIT 0`); }\n catch { throw new Error(`Incomplete coordination schema (${table}). Preserve the database before repair.`); }\n }\n const epoch = CoordDatabase.fencingEpoch(db);\n const tokens = ['SELECT fencing_token AS token FROM locks', 'SELECT fencing_token FROM tasks',\n 'SELECT fencing_token FROM resources', 'SELECT fencing_token FROM merge_queue',\n ...(version === 2 ? ['SELECT epoch FROM agent_sessions', 'SELECT session_epoch FROM mutex_waiters', 'SELECT fencing_token FROM mutex_runs'] : [])];\n if (db.prepare(`SELECT 1 FROM (${tokens.join(' UNION ALL ')}) WHERE token IS NOT NULL AND (typeof(token)!='integer' OR token<0 OR token>?) LIMIT 1`).get(epoch)) {\n throw new Error('Invalid or regressed fencing counter. Preserve the database before repair.');\n }\n return version;\n }\n\n private static fencingEpoch(db: DatabaseSyncType): number {\n const row = db.prepare(\"SELECT value FROM meta WHERE key='fencing_epoch'\").get() as { value: string } | undefined;\n const epoch = Number(row?.value);\n if (!row || typeof row.value !== 'string' || !/^(0|[1-9][0-9]*)$/.test(row.value) || !Number.isSafeInteger(epoch)) {\n throw new Error('Missing or invalid fencing counter. Preserve the database before repair.');\n }\n return epoch;\n }\n\n private migrate(allowEmpty: boolean): void {\n this.withTransaction(() => {\n const version = CoordDatabase.schemaVersion(this.db, allowEmpty);\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n\n INSERT OR IGNORE INTO meta (key, value) VALUES ('fencing_epoch', '1000');\n INSERT OR IGNORE INTO meta (key, value) VALUES ('schema_version', '1');\n\n CREATE TABLE IF NOT EXISTS agents (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n client TEXT NOT NULL,\n pid INTEGER NOT NULL,\n pid_start_time TEXT NOT NULL,\n pgid INTEGER NOT NULL,\n worktree_path TEXT,\n branch TEXT,\n shadow_tree_sha TEXT,\n status TEXT NOT NULL DEFAULT 'active',\n last_seen_event_id INTEGER NOT NULL DEFAULT 0,\n registered_at INTEGER NOT NULL,\n last_heartbeat_at INTEGER NOT NULL,\n lease_expires_at INTEGER NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_agents_status ON agents(status);\n\n CREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n intent_summary TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'queued',\n priority INTEGER NOT NULL DEFAULT 0,\n owner_agent_id TEXT,\n fencing_token INTEGER,\n depends_on_json TEXT NOT NULL DEFAULT '[]',\n scope_globs_json TEXT NOT NULL DEFAULT '[]',\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status, priority DESC);\n CREATE INDEX IF NOT EXISTS idx_tasks_owner ON tasks(owner_agent_id);\n\n CREATE TABLE IF NOT EXISTS locks (\n id TEXT PRIMARY KEY,\n pattern TEXT NOT NULL,\n lock_type TEXT NOT NULL DEFAULT 'glob',\n mode TEXT NOT NULL DEFAULT 'exclusive',\n owner_agent_id TEXT NOT NULL,\n task_id TEXT,\n fencing_token INTEGER NOT NULL,\n reason TEXT NOT NULL DEFAULT '',\n acquired_at INTEGER NOT NULL,\n expires_at INTEGER NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_locks_owner ON locks(owner_agent_id);\n CREATE INDEX IF NOT EXISTS idx_locks_pattern ON locks(pattern);\n\n CREATE TABLE IF NOT EXISTS file_deps (\n source_file TEXT NOT NULL,\n target_file TEXT NOT NULL,\n imported_symbols_json TEXT NOT NULL DEFAULT '[]',\n file_hash TEXT NOT NULL,\n updated_at INTEGER NOT NULL,\n PRIMARY KEY (source_file, target_file)\n );\n\n CREATE INDEX IF NOT EXISTS idx_file_deps_target ON file_deps(target_file);\n\n CREATE TABLE IF NOT EXISTS contracts (\n id TEXT PRIMARY KEY,\n file_path TEXT NOT NULL,\n symbol_name TEXT NOT NULL,\n kind TEXT NOT NULL,\n signature TEXT NOT NULL,\n ast_hash TEXT NOT NULL,\n params_fingerprint TEXT NOT NULL,\n doc_comment TEXT NOT NULL DEFAULT '',\n owner_agent_id TEXT,\n version INTEGER NOT NULL DEFAULT 1,\n is_breaking INTEGER NOT NULL DEFAULT 0,\n updated_at INTEGER NOT NULL,\n UNIQUE(file_path, symbol_name)\n );\n\n CREATE TABLE IF NOT EXISTS conflicts (\n id TEXT PRIMARY KEY,\n agent_a TEXT NOT NULL,\n agent_b TEXT NOT NULL,\n file_path TEXT NOT NULL,\n severity TEXT NOT NULL,\n details_json TEXT NOT NULL,\n detected_at INTEGER NOT NULL,\n UNIQUE(agent_a, agent_b, file_path)\n );\n\n CREATE TABLE IF NOT EXISTS merge_queue (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n branch TEXT NOT NULL,\n worktree_path TEXT,\n status TEXT NOT NULL DEFAULT 'queued',\n fencing_token INTEGER NOT NULL,\n verification_cmd TEXT,\n diagnostics_output TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS resources (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n name TEXT NOT NULL,\n value TEXT NOT NULL,\n owner_agent_id TEXT NOT NULL,\n fencing_token INTEGER NOT NULL,\n queue_json TEXT NOT NULL DEFAULT '[]',\n acquired_at INTEGER NOT NULL,\n expires_at INTEGER NOT NULL,\n UNIQUE(type, name)\n );\n\n CREATE TABLE IF NOT EXISTS quarantine (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n command TEXT NOT NULL,\n file_path TEXT NOT NULL,\n patch_path TEXT NOT NULL,\n reason TEXT NOT NULL,\n created_at INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n timestamp INTEGER NOT NULL,\n agent_id TEXT,\n event_type TEXT NOT NULL,\n payload_json TEXT NOT NULL\n );\n `);\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS agent_sessions (\n agent_id TEXT PRIMARY KEY, token_hash TEXT NOT NULL, epoch INTEGER NOT NULL\n );\n CREATE TABLE IF NOT EXISTS mutex_waiters (\n ticket INTEGER PRIMARY KEY AUTOINCREMENT, mutex_name TEXT NOT NULL,\n request_id TEXT NOT NULL, owner_agent_id TEXT NOT NULL, session_epoch INTEGER NOT NULL,\n waiter_pid INTEGER NOT NULL, waiter_start TEXT NOT NULL, expires_at INTEGER NOT NULL,\n UNIQUE(mutex_name, request_id)\n );\n CREATE TABLE IF NOT EXISTS mutex_runs (\n mutex_name TEXT PRIMARY KEY, run_id TEXT NOT NULL UNIQUE, owner_agent_id TEXT NOT NULL,\n session_epoch INTEGER NOT NULL, fencing_token INTEGER NOT NULL,\n supervisor_pid INTEGER NOT NULL, supervisor_start TEXT NOT NULL,\n worker_pid INTEGER, worker_start TEXT\n );\n `);\n if (version < 2) {\n // Legacy sessions have no capability. Invalidate coordination ownership, never files.\n this.db.exec(`\n UPDATE tasks SET status='queued', owner_agent_id=NULL, fencing_token=NULL\n WHERE status='active' AND owner_agent_id IN (SELECT id FROM agents);\n DELETE FROM locks;\n DELETE FROM resources;\n DELETE FROM conflicts;\n UPDATE agents SET status='dead' WHERE status='active';\n UPDATE meta SET value='2' WHERE key='schema_version';\n `);\n }\n });\n }\n\n /**\n * Executes a synchronous callback inside a `BEGIN IMMEDIATE` transaction\n * with automatic jittered backoff retries if another process temporarily holds the WAL write lock.\n */\n public withTransaction<T>(fn: () => T, maxRetries = 12): T {\n if (this.inTransaction) {\n return fn();\n }\n\n let attempt = 0;\n while (true) {\n try {\n this.db.exec('BEGIN IMMEDIATE');\n this.inTransaction = true;\n try {\n const result = fn();\n this.db.exec('COMMIT');\n this.inTransaction = false;\n return result;\n } catch (innerErr) {\n try {\n this.db.exec('ROLLBACK');\n } catch {\n // Ignore rollback errors if connection already rolled back\n }\n this.inTransaction = false;\n throw innerErr;\n }\n } catch (err: unknown) {\n this.inTransaction = false;\n const msg = err instanceof Error ? err.message : String(err);\n if (\n attempt < maxRetries &&\n (msg.includes('SQLITE_BUSY') || msg.includes('database is locked'))\n ) {\n attempt++;\n const sleepMs = Math.min(250, 5 * Math.pow(1.5, attempt) + Math.random() * 10);\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, Math.round(sleepMs));\n continue;\n }\n throw err;\n }\n }\n }\n\n /**\n * Atomically increments and returns the next monotonic fencing token.\n */\n public nextFencingToken(): number {\n return this.withTransaction(() => {\n const next = this.currentFencingEpoch() + 1;\n if (!Number.isSafeInteger(next)) throw new Error('Fencing counter exhausted; preserve state before recovery.');\n this.db.prepare(\"UPDATE meta SET value=? WHERE key='fencing_epoch'\").run(String(next));\n return next;\n });\n }\n\n public currentFencingEpoch(): number {\n return CoordDatabase.fencingEpoch(this.db);\n }\n\n public logEvent(\n agentId: string | null,\n eventType: string,\n payload: Record<string, unknown> = {}\n ): number {\n const res = this.db\n .prepare(`\n INSERT INTO events (timestamp, agent_id, event_type, payload_json)\n VALUES (?, ?, ?, ?)\n `)\n .run(Date.now(), agentId, eventType, JSON.stringify(payload));\n return Number(res.lastInsertRowid);\n }\n\n public getEventsSince(sinceId: number, limit = 100): CoordEvent[] {\n const rows = this.db\n .prepare(`\n SELECT id, timestamp, agent_id, event_type, payload_json\n FROM events\n WHERE id > ?\n ORDER BY id ASC\n LIMIT ?\n `)\n .all(sinceId, limit) as Array<{\n id: number;\n timestamp: number;\n agent_id: string | null;\n event_type: string;\n payload_json: string;\n }>;\n\n return rows.map((r) => ({\n id: r.id,\n timestamp: r.timestamp,\n agent_id: r.agent_id,\n event_type: r.event_type,\n payload: JSON.parse(r.payload_json) as Record<string, unknown>,\n }));\n }\n\n public close(): void {\n try {\n this.db.close();\n } catch {\n // Ignore already closed\n }\n }\n}\n","import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { AstAnalyzer, ExtractedSymbol, SymbolKind } from './ast-analyzer.js';\nimport { FencingAndAgentManager } from './fencing.js';\nimport { CoordDatabase } from './db.js';\nimport { LockEngine } from './locks.js';\n\nexport interface ContractRecord {\n id: string;\n file_path: string;\n symbol_name: string;\n kind: SymbolKind;\n signature: string;\n ast_hash: string;\n params_fingerprint: string;\n doc_comment: string;\n owner_agent_id: string | null;\n version: number;\n is_breaking: boolean;\n updated_at: number;\n}\n\nexport interface BlastRadiusAlert {\n modifiedFile: string;\n symbolName: string;\n previousSignature: string;\n newSignature: string | null; // null if deleted\n affectedDownstreamFile: string;\n hopDistance: number;\n affectedAgentId: string | null;\n}\n\nexport interface FileModificationReport {\n filePath: string;\n upsertedContracts: ContractRecord[];\n removedSymbols: string[];\n breakingChanges: BlastRadiusAlert[];\n transitiveDependents: Array<{ filePath: string; hopDistance: number }>;\n}\n\nexport class DependencyAndContractEngine {\n constructor(\n private readonly coordDb: CoordDatabase,\n private readonly lockEngine: LockEngine,\n private readonly fencing: FencingAndAgentManager\n ) {}\n\n /**\n * Scans a repository directory to index initial file dependencies and exported contracts.\n */\n public indexRepositoryFiles(dirPath = this.coordDb.repoRoot): number {\n const files = this.walkSourceFiles(dirPath);\n let indexedCount = 0;\n for (const file of files) {\n this.recordFileModification(null, file);\n indexedCount++;\n }\n return indexedCount;\n }\n\n private walkSourceFiles(dir: string, acc: string[] = []): string[] {\n if (!fs.existsSync(dir) || dir !== this.coordDb.repoRoot && fs.existsSync(path.join(dir, '.git'))) return acc;\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (\n entry.name.startsWith('.') ||\n entry.name === 'node_modules' ||\n entry.name === 'dist' ||\n entry.name === 'build' ||\n entry.name === 'target' ||\n entry.name === 'coverage'\n ) {\n continue;\n }\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n this.walkSourceFiles(fullPath, acc);\n } else if (entry.isFile() && /\\.(ts|tsx|js|jsx|mjs|py)$/.test(entry.name) && !entry.name.endsWith('.d.ts')) {\n acc.push(fullPath);\n }\n }\n return acc;\n }\n\n /**\n * Automatically parses a modified file's imports and exports, updates the dependency graph\n * and Contract Blackboard, and calculates the transitive blast radius\n * if any exported signature changed or was removed.\n */\n public recordFileModification(\n agentId: string | null,\n rawFilePath: string,\n sourceContent?: string\n ): FileModificationReport {\n const analysis = AstAnalyzer.analyzeSource(\n this.coordDb.repoRoot,\n rawFilePath,\n sourceContent\n );\n const relPath = analysis.filePath;\n const now = Date.now();\n\n return this.coordDb.withTransaction(() => {\n if (agentId) this.fencing.assertSession(agentId);\n // 1. Update outgoing import edges in `file_deps`\n this.coordDb.db\n .prepare(`DELETE FROM file_deps WHERE source_file = ?`)\n .run(relPath);\n\n for (const imp of analysis.imports) {\n if (!imp.resolvedPath) continue;\n this.coordDb.db\n .prepare(`\n INSERT OR REPLACE INTO file_deps (\n source_file, target_file, imported_symbols_json, file_hash, updated_at\n )\n VALUES (?, ?, ?, ?, ?)\n `)\n .run(\n relPath,\n imp.resolvedPath,\n JSON.stringify(imp.importedSymbols),\n analysis.fileHash,\n now\n );\n }\n\n // 2. Compare new exports against existing contracts for this file\n const existingRows = this.coordDb.db\n .prepare(`SELECT * FROM contracts WHERE file_path = ?`)\n .all(relPath) as Array<Record<string, unknown>>;\n\n const existingBySymbol = new Map<string, ContractRecord>(\n existingRows.map((r) => [String(r.symbol_name), this.mapRowToContract(r)])\n );\n\n const newSymbolNames = new Set(analysis.exports.map((e) => e.symbolName));\n const upsertedContracts: ContractRecord[] = [];\n const removedSymbols: string[] = [];\n const changedSymbols: Array<{\n symbolName: string;\n previousSignature: string;\n newSignature: string | null;\n }> = [];\n\n // Check for removed exports\n for (const [oldName, oldContract] of existingBySymbol.entries()) {\n if (!newSymbolNames.has(oldName)) {\n removedSymbols.push(oldName);\n changedSymbols.push({\n symbolName: oldName,\n previousSignature: oldContract.signature,\n newSignature: null,\n });\n this.coordDb.db\n .prepare(`DELETE FROM contracts WHERE id = ?`)\n .run(oldContract.id);\n }\n }\n\n // Upsert current exports\n for (const exp of analysis.exports) {\n const prev = existingBySymbol.get(exp.symbolName);\n // A body-only edit does not republish every unchanged interface in the file.\n // Import edges above still reflect the newly analyzed source.\n if (prev && prev.kind === exp.kind && prev.signature === exp.signature\n && prev.ast_hash === exp.astHash && prev.params_fingerprint === exp.paramsFingerprint\n && prev.doc_comment === exp.docComment) continue;\n const isBreaking = prev !== undefined && prev.ast_hash !== exp.astHash;\n if (isBreaking && prev) {\n changedSymbols.push({\n symbolName: exp.symbolName,\n previousSignature: prev.signature,\n newSignature: exp.signature,\n });\n }\n\n const contract = this.upsertContractInternal({\n filePath: relPath,\n symbol: exp,\n agentId,\n prev,\n isBreaking,\n now,\n });\n upsertedContracts.push(contract);\n }\n\n // 3. Calculate transitive blast radius if exports were modified or removed\n const transitiveDependents = this.getTransitiveDependents(relPath, 4);\n const breakingChanges: BlastRadiusAlert[] = [];\n\n if (changedSymbols.length > 0 && transitiveDependents.length > 0) {\n const activeLocks = this.lockEngine.listLocks();\n\n for (const change of changedSymbols) {\n for (const dep of transitiveDependents) {\n // Check if this direct/transitive dependent imports the changed symbol (for hop=1)\n if (dep.hopDistance === 1 && dep.importedSymbols.length > 0) {\n if (\n !dep.importedSymbols.includes('*') &&\n !dep.importedSymbols.includes(change.symbolName)\n ) {\n continue;\n }\n }\n\n // Find if another active agent holds a lock covering `dep.filePath`\n const affectedLock = activeLocks.find(\n (l) =>\n l.owner_agent_id !== agentId &&\n LockEngine.patternsOverlap(dep.filePath, l.pattern)\n );\n\n const alert: BlastRadiusAlert = {\n modifiedFile: relPath,\n symbolName: change.symbolName,\n previousSignature: change.previousSignature,\n newSignature: change.newSignature,\n affectedDownstreamFile: dep.filePath,\n hopDistance: dep.hopDistance,\n affectedAgentId: affectedLock?.owner_agent_id ?? null,\n };\n breakingChanges.push(alert);\n\n if (agentId && affectedLock) {\n const conflictId = `conf_${crypto.randomBytes(6).toString('hex')}`;\n this.coordDb.db\n .prepare(`\n INSERT OR REPLACE INTO conflicts (\n id, agent_a, agent_b, file_path, severity, details_json, detected_at\n )\n VALUES (?, ?, ?, ?, 'transitive_contract_break', ?, ?)\n `)\n .run(\n conflictId,\n agentId,\n affectedLock.owner_agent_id,\n dep.filePath,\n JSON.stringify(alert),\n now\n );\n }\n }\n }\n\n this.coordDb.logEvent(agentId, 'contract_breaking_change', {\n filePath: relPath,\n breakingChanges,\n });\n } else if (upsertedContracts.length > 0 && agentId) {\n this.coordDb.logEvent(agentId, 'contracts_updated', {\n filePath: relPath,\n symbols: upsertedContracts.map((c) => ({\n name: c.symbol_name,\n signature: c.signature,\n version: c.version,\n })),\n });\n }\n\n return {\n filePath: relPath,\n upsertedContracts,\n removedSymbols,\n breakingChanges,\n transitiveDependents: transitiveDependents.map((d) => ({\n filePath: d.filePath,\n hopDistance: d.hopDistance,\n })),\n };\n });\n }\n\n /**\n * Explicitly publishes a contract to the shared blackboard (e.g. REST route, env var, or type).\n */\n public publishExplicitContract(params: {\n agentId: string;\n filePath: string;\n symbolName: string;\n kind: SymbolKind;\n signature: string;\n docComment?: string;\n }): ContractRecord {\n const relPath = LockEngine.normalizeFile(this.coordDb.repoRoot, params.filePath);\n const now = Date.now();\n const astHash = crypto\n .createHash('sha256')\n .update(params.signature)\n .digest('hex')\n .slice(0, 16);\n\n return this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const prevRow = this.coordDb.db\n .prepare(`SELECT * FROM contracts WHERE file_path = ? AND symbol_name = ?`)\n .get(relPath, params.symbolName) as Record<string, unknown> | undefined;\n const prev = prevRow ? this.mapRowToContract(prevRow) : undefined;\n const isBreaking = prev !== undefined && prev.ast_hash !== astHash;\n\n const contract = this.upsertContractInternal({\n filePath: relPath,\n symbol: {\n symbolName: params.symbolName,\n kind: params.kind,\n signature: params.signature,\n astHash,\n paramsFingerprint: `${params.kind}:${params.symbolName}`,\n docComment: params.docComment ?? '',\n },\n agentId: params.agentId,\n prev,\n isBreaking,\n now,\n });\n\n this.coordDb.logEvent(params.agentId, 'contract_published', {\n filePath: relPath,\n symbolName: params.symbolName,\n signature: params.signature,\n isBreaking,\n });\n\n return contract;\n });\n }\n\n private upsertContractInternal(params: {\n filePath: string;\n symbol: ExtractedSymbol;\n agentId: string | null;\n prev?: ContractRecord;\n isBreaking: boolean;\n now: number;\n }): ContractRecord {\n const id = params.prev?.id ?? `ctr_${crypto.randomBytes(6).toString('hex')}`;\n const version = params.prev\n ? params.prev.ast_hash !== params.symbol.astHash\n ? params.prev.version + 1\n : params.prev.version\n : 1;\n\n this.coordDb.db\n .prepare(`\n INSERT OR REPLACE INTO contracts (\n id, file_path, symbol_name, kind, signature,\n ast_hash, params_fingerprint, doc_comment,\n owner_agent_id, version, is_breaking, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n .run(\n id,\n params.filePath,\n params.symbol.symbolName,\n params.symbol.kind,\n params.symbol.signature,\n params.symbol.astHash,\n params.symbol.paramsFingerprint,\n params.symbol.docComment,\n params.agentId ?? params.prev?.owner_agent_id ?? null,\n version,\n params.isBreaking ? 1 : 0,\n params.now\n );\n\n return {\n id,\n file_path: params.filePath,\n symbol_name: params.symbol.symbolName,\n kind: params.symbol.kind,\n signature: params.symbol.signature,\n ast_hash: params.symbol.astHash,\n params_fingerprint: params.symbol.paramsFingerprint,\n doc_comment: params.symbol.docComment,\n owner_agent_id: params.agentId ?? params.prev?.owner_agent_id ?? null,\n version,\n is_breaking: params.isBreaking,\n updated_at: params.now,\n };\n }\n\n /**\n * Computes all files that directly or transitively import `targetFile` up to `maxHops` away.\n */\n public getTransitiveDependents(\n targetFile: string,\n maxHops = 4\n ): Array<{ filePath: string; hopDistance: number; importedSymbols: string[] }> {\n const normTarget = LockEngine.normalizeFile(this.coordDb.repoRoot, targetFile);\n const visited = new Map<string, { hopDistance: number; importedSymbols: string[] }>();\n let frontier: string[] = [normTarget];\n\n for (let hop = 1; hop <= maxHops; hop++) {\n const nextFrontier: string[] = [];\n for (const curr of frontier) {\n const rows = this.coordDb.db\n .prepare(`SELECT source_file, imported_symbols_json FROM file_deps WHERE target_file = ?`)\n .all(curr) as Array<{ source_file: string; imported_symbols_json: string }>;\n\n for (const r of rows) {\n if (r.source_file === normTarget || visited.has(r.source_file)) continue;\n visited.set(r.source_file, {\n hopDistance: hop,\n importedSymbols: JSON.parse(r.imported_symbols_json) as string[],\n });\n nextFrontier.push(r.source_file);\n }\n }\n if (nextFrontier.length === 0) break;\n frontier = nextFrontier;\n }\n\n return Array.from(visited.entries()).map(([filePath, meta]) => ({\n filePath,\n hopDistance: meta.hopDistance,\n importedSymbols: meta.importedSymbols,\n }));\n }\n\n public listContracts(filePathFilter?: string): ContractRecord[] {\n const rows = filePathFilter\n ? (this.coordDb.db\n .prepare(`SELECT * FROM contracts WHERE file_path = ? ORDER BY updated_at DESC`)\n .all(LockEngine.normalizeFile(this.coordDb.repoRoot, filePathFilter)) as Array<\n Record<string, unknown>\n >)\n : (this.coordDb.db\n .prepare(`SELECT * FROM contracts ORDER BY updated_at DESC`)\n .all() as Array<Record<string, unknown>>);\n\n return rows.map((r) => this.mapRowToContract(r));\n }\n\n private mapRowToContract(row: Record<string, unknown>): ContractRecord {\n return {\n id: String(row.id),\n file_path: String(row.file_path),\n symbol_name: String(row.symbol_name),\n kind: row.kind as SymbolKind,\n signature: String(row.signature),\n ast_hash: String(row.ast_hash),\n params_fingerprint: String(row.params_fingerprint),\n doc_comment: String(row.doc_comment ?? ''),\n owner_agent_id: (row.owner_agent_id as string | null) ?? null,\n version: Number(row.version),\n is_breaking: Boolean(row.is_breaking),\n updated_at: Number(row.updated_at),\n };\n }\n}\n","import crypto from 'node:crypto';\nimport { CoordDatabase } from './db.js';\nimport { FencingAndAgentManager } from './fencing.js';\nimport { LockConflict, LockEngine, LockRecord } from './locks.js';\n\nexport interface TaskRecord {\n id: string;\n title: string;\n intent_summary: string;\n status: 'queued' | 'active' | 'done' | 'blocked';\n priority: number;\n owner_agent_id: string | null;\n fencing_token: number | null;\n depends_on: string[];\n scope_globs: string[];\n created_at: number;\n updated_at: number;\n}\n\nexport interface DeclareIntentResult {\n ok: boolean;\n task: TaskRecord | null;\n fencingToken: number;\n locks: LockRecord[];\n lockConflicts: LockConflict[];\n activeSiblingIntents: TaskRecord[];\n}\n\nexport class IntentAndTaskEngine {\n constructor(\n private readonly coordDb: CoordDatabase,\n private readonly fencing: FencingAndAgentManager,\n private readonly lockEngine: LockEngine\n ) {}\n\n /**\n * Peer-to-Peer Mode: Declares an agent's intent, checks scope-lock collisions\n * and reserves the scope if available.\n */\n public declareIntent(params: {\n agentId: string;\n title: string;\n intentSummary?: string;\n scopeGlobs: string[];\n }): DeclareIntentResult {\n this.fencing.reapDeadAgents();\n const summary = params.intentSummary ?? params.title;\n\n return this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const activeTasks = this.listTasks({ status: 'active' }).filter(\n (t) => t.owner_agent_id !== params.agentId\n );\n\n const taskId = `task_${crypto.randomBytes(6).toString('hex')}`;\n const lockRes = this.lockEngine.acquireLocks({\n agentId: params.agentId,\n patterns: params.scopeGlobs,\n taskId,\n reason: params.title,\n });\n\n if (!lockRes.ok) {\n return {\n ok: false,\n task: null,\n fencingToken: lockRes.fencingToken,\n locks: [],\n lockConflicts: lockRes.conflicts,\n activeSiblingIntents: activeTasks,\n };\n }\n\n const now = Date.now();\n const normGlobs = params.scopeGlobs.map((g) =>\n LockEngine.normalizePattern(this.fencing.getAgent(params.agentId)?.worktree_path ?? this.coordDb.repoRoot, g)\n );\n\n this.coordDb.db\n .prepare(`\n INSERT INTO tasks (\n id, title, intent_summary, status, priority,\n owner_agent_id, fencing_token, depends_on_json, scope_globs_json,\n created_at, updated_at\n )\n VALUES (?, ?, ?, 'active', 50, ?, ?, '[]', ?, ?, ?)\n `)\n .run(\n taskId,\n params.title,\n summary,\n params.agentId,\n lockRes.fencingToken,\n JSON.stringify(normGlobs),\n now,\n now\n );\n\n this.coordDb.logEvent(params.agentId, 'intent_declared', {\n taskId,\n title: params.title,\n scopeGlobs: normGlobs,\n fencingToken: lockRes.fencingToken,\n });\n\n return {\n ok: true,\n task: this.getTask(taskId),\n fencingToken: lockRes.fencingToken,\n locks: lockRes.locks,\n lockConflicts: [],\n activeSiblingIntents: activeTasks,\n };\n });\n }\n\n /**\n * Orchestrator Mode: Adds a task to the DAG queue with optional dependencies and priority.\n */\n public addTask(params: {\n id?: string;\n title: string;\n intentSummary?: string;\n priority?: number;\n dependsOn?: string[];\n scopeGlobs?: string[];\n }): TaskRecord {\n const id = params.id ?? `task_${crypto.randomBytes(6).toString('hex')}`;\n const dependsOn = params.dependsOn ?? [];\n const scopeGlobs = (params.scopeGlobs ?? []).map((g) =>\n LockEngine.normalizePattern(this.coordDb.repoRoot, g)\n );\n\n return this.coordDb.withTransaction(() => {\n for (const depId of dependsOn) {\n if (depId === id) {\n throw new Error(`Task '${id}' cannot depend on itself.`);\n }\n const dep = this.getTask(depId);\n if (!dep) {\n throw new Error(`Dependency task '${depId}' does not exist.`);\n }\n if (this.hasPathInDag(depId, id)) {\n throw new Error(`Circular dependency detected between '${id}' and '${depId}'.`);\n }\n }\n\n const now = Date.now();\n this.coordDb.db\n .prepare(`\n INSERT INTO tasks (\n id, title, intent_summary, status, priority,\n owner_agent_id, fencing_token, depends_on_json, scope_globs_json,\n created_at, updated_at\n )\n VALUES (?, ?, ?, 'queued', ?, NULL, NULL, ?, ?, ?, ?)\n `)\n .run(\n id,\n params.title,\n params.intentSummary ?? params.title,\n params.priority ?? 10,\n JSON.stringify(dependsOn),\n JSON.stringify(scopeGlobs),\n now,\n now\n );\n\n this.coordDb.logEvent(null, 'task_queued', { id, title: params.title, dependsOn });\n return this.getTask(id)!;\n });\n }\n\n private hasPathInDag(startId: string, targetId: string, visited = new Set<string>()): boolean {\n if (startId === targetId) return true;\n if (visited.has(startId)) return false;\n visited.add(startId);\n\n const task = this.getTask(startId);\n if (!task) return false;\n for (const dep of task.depends_on) {\n if (this.hasPathInDag(dep, targetId, visited)) return true;\n }\n return false;\n }\n\n /**\n * Orchestrator Mode: Atomically claims the highest-priority unblocked task whose scope locks are available.\n */\n public claimNextTask(agentId: string): {\n claimed: boolean;\n task: TaskRecord | null;\n fencingToken: number | null;\n locks: LockRecord[];\n reason?: string;\n } {\n this.fencing.reapDeadAgents();\n\n return this.coordDb.withTransaction(() => {\n this.fencing.assertSession(agentId);\n const allTasks = this.listTasks();\n const taskById = new Map(allTasks.map((t) => [t.id, t]));\n const queued = allTasks\n .filter((t) => t.status === 'queued')\n .sort((a, b) => b.priority - a.priority || a.created_at - b.created_at);\n\n if (queued.length === 0) {\n return { claimed: false, task: null, fencingToken: null, locks: [], reason: 'no_queued_tasks' };\n }\n\n for (const candidate of queued) {\n const depsSatisfied = candidate.depends_on.every(\n (depId) => taskById.get(depId)?.status === 'done'\n );\n if (!depsSatisfied) continue;\n\n let fencingToken = this.coordDb.currentFencingEpoch();\n let locks: LockRecord[] = [];\n\n if (candidate.scope_globs.length > 0) {\n const lockRes = this.lockEngine.acquireLocks({\n agentId,\n patterns: candidate.scope_globs,\n taskId: candidate.id,\n reason: candidate.title,\n });\n if (!lockRes.ok) {\n continue;\n }\n fencingToken = lockRes.fencingToken;\n locks = lockRes.locks;\n } else {\n fencingToken = this.coordDb.nextFencingToken();\n }\n\n const now = Date.now();\n this.coordDb.db\n .prepare(`\n UPDATE tasks\n SET status = 'active', owner_agent_id = ?, fencing_token = ?, updated_at = ?\n WHERE id = ?\n `)\n .run(agentId, fencingToken, now, candidate.id);\n\n this.coordDb.logEvent(agentId, 'task_claimed', {\n taskId: candidate.id,\n title: candidate.title,\n fencingToken,\n });\n\n return {\n claimed: true,\n task: this.getTask(candidate.id),\n fencingToken,\n locks,\n };\n }\n\n return {\n claimed: false,\n task: null,\n fencingToken: null,\n locks: [],\n reason: 'all_queued_tasks_blocked_by_dependencies_or_locks',\n };\n });\n }\n\n public completeTask(params: {\n agentId: string;\n taskId?: string;\n fencingToken?: number;\n releaseLocks?: boolean;\n }): TaskRecord[] {\n return this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n const rows = params.taskId\n ? [this.getTask(params.taskId)].filter((t): t is TaskRecord => t !== null)\n : this.listTasks({ status: 'active' }).filter((t) => t.owner_agent_id === params.agentId);\n\n const now = Date.now();\n const completed: TaskRecord[] = [];\n\n for (const task of rows) {\n if (task.status !== 'active' || task.owner_agent_id !== params.agentId) {\n throw new Error(\n `Task '${task.id}' is owned by '${task.owner_agent_id}', not '${params.agentId}'.`\n );\n }\n if (params.fencingToken !== undefined && task.fencing_token !== null) {\n this.fencing.verifyFencingToken(task.id, params.fencingToken, task.fencing_token);\n }\n\n this.coordDb.db\n .prepare(`UPDATE tasks SET status = 'done', updated_at = ? WHERE id = ?`)\n .run(now, task.id);\n\n if (params.releaseLocks !== false) {\n this.coordDb.db\n .prepare(`DELETE FROM locks WHERE owner_agent_id = ? AND task_id = ?`)\n .run(params.agentId, task.id);\n }\n\n this.coordDb.logEvent(params.agentId, 'task_completed', { taskId: task.id });\n completed.push(this.getTask(task.id)!);\n }\n\n return completed;\n });\n }\n\n public getTask(taskId: string): TaskRecord | null {\n const row = this.coordDb.db\n .prepare(`SELECT * FROM tasks WHERE id = ?`)\n .get(taskId) as\n | {\n id: string;\n title: string;\n intent_summary: string;\n status: 'queued' | 'active' | 'done' | 'blocked';\n priority: number;\n owner_agent_id: string | null;\n fencing_token: number | null;\n depends_on_json: string;\n scope_globs_json: string;\n created_at: number;\n updated_at: number;\n }\n | undefined;\n\n if (!row) return null;\n return {\n id: row.id,\n title: row.title,\n intent_summary: row.intent_summary,\n status: row.status,\n priority: row.priority,\n owner_agent_id: row.owner_agent_id,\n fencing_token: row.fencing_token,\n depends_on: JSON.parse(row.depends_on_json) as string[],\n scope_globs: JSON.parse(row.scope_globs_json) as string[],\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n }\n\n public listTasks(filter?: { status?: TaskRecord['status'] }): TaskRecord[] {\n this.fencing.reapDeadAgents();\n const rows = filter?.status\n ? (this.coordDb.db\n .prepare(`SELECT * FROM tasks WHERE status = ? ORDER BY priority DESC, created_at ASC`)\n .all(filter.status) as Array<Record<string, unknown>>)\n : (this.coordDb.db\n .prepare(`SELECT * FROM tasks ORDER BY priority DESC, created_at ASC`)\n .all() as Array<Record<string, unknown>>);\n\n return rows.map((row) => ({\n id: String(row.id),\n title: String(row.title),\n intent_summary: String(row.intent_summary),\n status: row.status as TaskRecord['status'],\n priority: Number(row.priority),\n owner_agent_id: (row.owner_agent_id as string | null) ?? null,\n fencing_token: (row.fencing_token as number | null) ?? null,\n depends_on: JSON.parse(String(row.depends_on_json)) as string[],\n scope_globs: JSON.parse(String(row.scope_globs_json)) as string[],\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at),\n }));\n }\n}\n","import { discoverRepository, physicalPath } from './repository.js';\nimport { execFileSync, execSync } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { FencingAndAgentManager } from './fencing.js';\nimport { CoordDatabase } from './db.js';\n\nexport interface MergeTrainEntry {\n id: string;\n agent_id: string;\n branch: string;\n worktree_path: string | null;\n status: 'queued' | 'testing' | 'merged' | 'failed';\n fencing_token: number;\n verification_cmd: string | null;\n diagnostics_output: string | null;\n created_at: number;\n updated_at: number;\n}\n\nexport interface SpeculativeMergeResult {\n merged: boolean;\n entry: MergeTrainEntry;\n mergedCommitSha: string | null;\n diagnostics: string;\n}\n\nexport class SpeculativeMergeTrain {\n constructor(private readonly coordDb: CoordDatabase, private readonly fencing: FencingAndAgentManager) {}\n\n /**\n * Enqueues and executes a Bors-style speculative integration test in an isolated staging\n * worktree before advancing the main repository branch.\n * Refuses Git conflicts and runs `verificationCmd` (e.g. `tsc --noEmit` or `npm test`) before fast-forwarding `main`.\n */\n public enqueueAndMerge(params: {\n agentId: string;\n branch: string;\n worktreePath?: string | null;\n verificationCmd?: string | null;\n commitMessage?: string;\n }): SpeculativeMergeResult {\n this.fencing.assertSession(params.agentId);\n const sessionEnv = this.fencing.sessionEnvironment(params.agentId);\n const now = Date.now();\n const id = `mrg_${crypto.randomBytes(6).toString('hex')}`;\n const token = this.coordDb.nextFencingToken();\n\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n this.coordDb.db\n .prepare(`\n INSERT INTO merge_queue (\n id, agent_id, branch, worktree_path, status,\n fencing_token, verification_cmd, diagnostics_output,\n created_at, updated_at\n )\n VALUES (?, ?, ?, ?, 'testing', ?, ?, NULL, ?, ?)\n `)\n .run(\n id,\n params.agentId,\n params.branch,\n params.worktreePath ?? null,\n token,\n params.verificationCmd ?? null,\n now,\n now\n );\n });\n\n const stageDir = path.join(this.coordDb.coordDir, 'worktrees', `_merge_train_${id}`);\n const lockPath = path.join(this.coordDb.coordDir, 'merge-train.lock');\n let lockFd: number | undefined;\n\n try {\n try {\n lockFd = fs.openSync(lockPath, 'wx', 0o600);\n fs.writeFileSync(lockFd, JSON.stringify({ pid: process.pid, entryId: id }));\n } catch {\n throw new Error('Merge train is busy. If its owner crashed, inspect .coord/merge-train.lock before removing it.');\n }\n const baseHead = this.gitHead(this.coordDb.repoRoot);\n const targetBranch = this.gitBranch(this.coordDb.repoRoot);\n if (!targetBranch) throw new Error('Merge target must be on a branch, not a detached HEAD.');\n this.requireCleanTarget();\n // Validate ownership and repository/branch identity before staging any source bytes.\n if (params.worktreePath) {\n const registered = this.fencing.getAgent(params.agentId)?.worktree_path;\n if (!registered || physicalPath(registered) !== physicalPath(params.worktreePath)) {\n throw new Error(\"Source checkout must be the agent's registered worktree.\");\n }\n const source = discoverRepository(params.worktreePath);\n if (source.commonGitDir !== this.coordDb.commonGitDir || source.checkoutRoot !== physicalPath(params.worktreePath)\n || this.gitBranch(source.checkoutRoot) !== params.branch.replace(/^refs\\/heads\\//, '')) {\n throw new Error('Source checkout repository or branch does not match the requested integration.');\n }\n }\n // 1. If the agent's worktree has uncommitted changes, commit them to its branch first\n if (params.worktreePath) {\n const statusOut = execFileSync('git', ['status', '--porcelain'], {\n cwd: params.worktreePath,\n encoding: 'utf8',\n }).trim();\n if (statusOut.length > 0) {\n execFileSync('git', ['add', '-A'], { cwd: params.worktreePath, env: sessionEnv, stdio: 'ignore' });\n execFileSync(\n 'git',\n [\n 'commit',\n '-m',\n params.commitMessage ?? `feat(${params.agentId}): automated worktree checkpoint`,\n ],\n { cwd: params.worktreePath, env: sessionEnv, stdio: 'ignore' }\n );\n }\n }\n\n // Freeze the source ref after its checkpoint; never interpret a user ref as merge options.\n const sourceSha = execFileSync('git', ['rev-parse', '--verify', '--end-of-options', `${params.branch}^{commit}`], {\n cwd: this.coordDb.repoRoot, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'],\n }).trim();\n // Clean up any previous staging worktree\n this.cleanupStageWorktree(stageDir);\n\n // Create detached staging worktree at repoRoot's HEAD\n execFileSync('git', ['worktree', 'add', '--detach', stageDir, baseHead], {\n cwd: this.coordDb.repoRoot,\n stdio: 'ignore',\n });\n\n // Hydrate node_modules into staging worktree if present\n const rootNodeModules = path.join(this.coordDb.repoRoot, 'node_modules');\n const stageNodeModules = path.join(stageDir, 'node_modules');\n const hydratedNodeModules = fs.existsSync(rootNodeModules) && !fs.existsSync(stageNodeModules);\n if (hydratedNodeModules) {\n fs.symlinkSync(rootNodeModules, stageNodeModules, 'dir');\n }\n\n // 2. Attempt merge of `params.branch` into detached HEAD in `stageDir`\n try {\n execFileSync(\n 'git',\n ['merge', '--no-ff', '-m', `Merge branch '${params.branch}' (${params.agentId})`, sourceSha],\n {\n cwd: stageDir, env: sessionEnv,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'pipe'],\n }\n );\n } catch {\n const conflictedFiles = execFileSync('git', ['diff', '--name-only', '--diff-filter=U', '-z'], {\n cwd: stageDir, encoding: 'utf8',\n }).split('\\0').filter(Boolean);\n throw new Error(conflictedFiles.length\n ? `Merge conflicts in ${conflictedFiles.map(file => JSON.stringify(file)).join(', ')}. Resolve conflicts in '${params.branch}' before merging.`\n : `git merge failed on branch '${params.branch}'.`);\n }\n\n const verifiedSha = this.gitHead(stageDir);\n\n // 3. Run verification command inside the speculative staging tree if specified\n let diagnostics = 'Speculative merge clean.';\n if (params.verificationCmd) {\n try {\n const out = execSync(params.verificationCmd, {\n cwd: stageDir, env: sessionEnv,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'pipe'],\n timeout: 120_000,\n });\n diagnostics = `Verification passed (${params.verificationCmd}):\\n${out.trim()}`.trim();\n } catch (verifyErr: unknown) {\n const stdout = (verifyErr as { stdout?: string })?.stdout ?? '';\n const stderr = (verifyErr as { stderr?: string })?.stderr ?? '';\n const combined = `${stdout}\\n${stderr}`.trim();\n throw new Error(\n `Speculative verification failed ('${params.verificationCmd}'):\\n${combined}`\n );\n }\n }\n\n // 4. Advance the main repository to the verified speculative commit\n const stageChanges = execFileSync('git', ['status', '--porcelain', '-z', '--untracked-files=normal'], {\n cwd: stageDir, encoding: 'utf8',\n }).split('\\0').filter(Boolean);\n const unchangedHydration = hydratedNodeModules && fs.lstatSync(stageNodeModules, { throwIfNoEntry: false })?.isSymbolicLink()\n && fs.readlinkSync(stageNodeModules) === rootNodeModules;\n if (this.gitHead(stageDir) !== verifiedSha || stageChanges.some(change => !(unchangedHydration && change === '?? node_modules'))) {\n throw new Error('Verification changed the staging checkout. Apply fixes in the source worktree and retry with a read-only check.');\n }\n\n if (this.gitHead(this.coordDb.repoRoot) !== baseHead ||\n this.gitBranch(this.coordDb.repoRoot) !== targetBranch) {\n throw new Error('Merge target changed during verification. Retry against the new target.');\n }\n this.fencing.assertSession(params.agentId);\n this.requireCleanTarget();\n execFileSync('git', ['merge', '--ff-only', verifiedSha], {\n cwd: this.coordDb.repoRoot,\n stdio: 'ignore',\n });\n\n this.cleanupStageWorktree(stageDir);\n\n const updatedAt = Date.now();\n this.coordDb.withTransaction(() => {\n this.coordDb.db\n .prepare(`\n UPDATE merge_queue\n SET status = 'merged', diagnostics_output = ?, updated_at = ?\n WHERE id = ?\n `)\n .run(diagnostics, updatedAt, id);\n\n this.coordDb.logEvent(params.agentId, 'merge_train_succeeded', {\n id,\n branch: params.branch,\n verifiedSha,\n });\n });\n\n return {\n merged: true,\n entry: this.getEntry(id)!,\n mergedCommitSha: verifiedSha,\n diagnostics,\n };\n } catch (err: unknown) {\n this.cleanupStageWorktree(stageDir);\n const diagnostics = err instanceof Error ? err.message : String(err);\n const updatedAt = Date.now();\n\n this.coordDb.withTransaction(() => {\n this.coordDb.db\n .prepare(`\n UPDATE merge_queue\n SET status = 'failed', diagnostics_output = ?, updated_at = ?\n WHERE id = ?\n `)\n .run(diagnostics, updatedAt, id);\n\n this.coordDb.logEvent(params.agentId, 'merge_train_failed', {\n id,\n branch: params.branch,\n diagnostics,\n });\n });\n\n return {\n merged: false,\n entry: this.getEntry(id)!,\n mergedCommitSha: null,\n diagnostics,\n };\n } finally {\n if (lockFd !== undefined) {\n fs.closeSync(lockFd);\n fs.unlinkSync(lockPath);\n }\n }\n }\n\n private gitHead(cwd: string): string {\n return execFileSync('git', ['rev-parse', 'HEAD'], { cwd, encoding: 'utf8' }).trim();\n }\n\n private gitBranch(cwd: string): string {\n return execFileSync('git', ['symbolic-ref', '--quiet', '--short', 'HEAD'], {\n cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'],\n }).trim();\n }\n\n private requireCleanTarget(): void {\n const status = execFileSync('git', ['status', '--porcelain', '--untracked-files=normal'], {\n cwd: this.coordDb.repoRoot, encoding: 'utf8',\n });\n if (status.split(/\\r?\\n/).some((line) => line && line !== '?? .coord/')) {\n throw new Error('Merge target has local changes. Commit or preserve them before integrating.');\n }\n }\n\n private cleanupStageWorktree(stageDir: string): void {\n if (!fs.existsSync(stageDir)) return;\n try {\n execFileSync('git', ['worktree', 'remove', '--force', stageDir], {\n cwd: this.coordDb.repoRoot,\n stdio: 'ignore',\n });\n } catch {\n if (fs.existsSync(stageDir)) {\n fs.rmSync(stageDir, { recursive: true, force: true });\n }\n try {\n execFileSync('git', ['worktree', 'prune'], {\n cwd: this.coordDb.repoRoot,\n stdio: 'ignore',\n });\n } catch {\n // Ignore\n }\n }\n }\n\n public getEntry(id: string): MergeTrainEntry | null {\n const row = this.coordDb.db\n .prepare(`SELECT * FROM merge_queue WHERE id = ?`)\n .get(id) as MergeTrainEntry | undefined;\n return row ?? null;\n }\n\n public listQueue(): MergeTrainEntry[] {\n return this.coordDb.db\n .prepare(`SELECT * FROM merge_queue ORDER BY created_at DESC`)\n .all() as unknown as MergeTrainEntry[];\n }\n}\n","import { execFileSync } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { CoordDatabase } from './db.js';\nimport { FencingAndAgentManager } from './fencing.js';\nimport { LockEngine } from './locks.js';\n\nexport interface ConflictRecord {\n id: string;\n agent_a: string;\n agent_b: string;\n file_path: string;\n severity:\n | 'text_conflict'\n | 'transitive_contract_break';\n details: {\n reason: string;\n baseBlob?: string;\n blobA?: string;\n blobB?: string;\n };\n detected_at: number;\n}\n\nexport interface DirtyMergeProbeResult {\n clean: boolean;\n mergedTreeSha: string | null;\n conflicts: ConflictRecord[];\n}\n\nexport class ShadowGitEngine {\n constructor(\n private readonly coordDb: CoordDatabase,\n private readonly fencing: FencingAndAgentManager\n ) {}\n\n public isGitRepository(dir = this.coordDb.repoRoot): boolean {\n try {\n execFileSync('git', ['rev-parse', '--is-inside-work-tree'], {\n cwd: dir,\n stdio: 'ignore',\n });\n return true;\n } catch {\n return false;\n }\n }\n\n public getHeadCommit(dir = this.coordDb.repoRoot): string | null {\n try {\n return execFileSync('git', ['rev-parse', 'HEAD'], {\n cwd: dir,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n }).trim();\n } catch {\n return null;\n }\n }\n\n private getShadowIndexPath(agentId: string): string {\n const safeId = agentId.replace(/[^a-zA-Z0-9_-]/g, '_');\n const epoch = this.fencing.assertSession(agentId);\n return path.join(this.coordDb.coordDir, 'shadow-index', `${safeId}-${epoch}.index`);\n }\n\n /**\n * Updates an agent's ephemeral shadow Git index (`.coord/shadow-index/<agent-id>.index`)\n * without touching the repository's real `.git/index`, and creates a synthetic shadow\n * commit object in `.git/objects` so `git merge-tree --write-tree` can run 3-way merges\n * across uncommitted files in <15ms.\n */\n public updateAgentShadowTree(params: {\n agentId: string;\n modifiedFiles?: Array<{ filePath: string; content?: string }>;\n worktreeDir?: string;\n }): string | null {\n this.fencing.assertSession(params.agentId);\n const targetDir = params.worktreeDir ?? this.coordDb.repoRoot;\n if (!this.isGitRepository(targetDir)) return null;\n\n const headCommit = this.getHeadCommit(targetDir);\n if (!headCommit) return null;\n\n const shadowIndex = this.getShadowIndexPath(params.agentId);\n const env = { ...process.env, GIT_INDEX_FILE: shadowIndex };\n\n // Initialize shadow index from HEAD if it doesn't exist yet\n if (!fs.existsSync(shadowIndex)) {\n execFileSync('git', ['read-tree', headCommit], {\n cwd: targetDir,\n env,\n stdio: 'ignore',\n });\n }\n\n if (params.worktreeDir && (!params.modifiedFiles || params.modifiedFiles.length === 0)) {\n // In an isolated worktree, stage all dirty working-tree files into the shadow index\n execFileSync('git', ['read-tree', headCommit], {\n cwd: targetDir,\n env,\n stdio: 'ignore',\n });\n execFileSync('git', ['add', '-A'], {\n cwd: targetDir,\n env,\n stdio: 'ignore',\n });\n } else if (params.modifiedFiles && params.modifiedFiles.length > 0) {\n for (const mod of params.modifiedFiles) {\n const relPath = LockEngine.normalizeFile(targetDir, mod.filePath);\n const absPath = path.join(targetDir, relPath);\n const content =\n mod.content ??\n (fs.existsSync(absPath) ? fs.readFileSync(absPath, 'utf8') : null);\n\n if (content === null) {\n // File was deleted\n {\n execFileSync('git', ['--literal-pathspecs', 'update-index', '--force-remove', '--', relPath], {\n cwd: targetDir,\n env,\n stdio: 'ignore',\n });\n }\n } else {\n const tracked = execFileSync('git', ['--literal-pathspecs', 'ls-files', '--stage', '-z', '--', relPath], {\n cwd: targetDir, env, encoding: 'utf8',\n }).split('\\0').find(Boolean);\n const trackedMode = tracked?.split(' ')[0];\n const stat = fs.existsSync(absPath) ? fs.lstatSync(absPath) : null;\n if (trackedMode && !['100644', '100755'].includes(trackedMode) || stat?.isSymbolicLink()) {\n throw new Error(`Cannot report symlinks or special entries as source content: ${relPath}`);\n }\n const mode = trackedMode ?? (stat && stat.mode & 0o111 ? '100755' : '100644');\n const blobSha = execFileSync('git', ['hash-object', '-w', '--stdin'], {\n cwd: targetDir,\n input: content,\n encoding: 'utf8',\n }).trim();\n\n execFileSync(\n 'git',\n ['update-index', '--add', '--cacheinfo', `${mode},${blobSha},${relPath}`],\n {\n cwd: targetDir,\n env,\n stdio: 'ignore',\n }\n );\n }\n }\n }\n\n const treeSha = execFileSync('git', ['write-tree'], {\n cwd: targetDir,\n env,\n encoding: 'utf8',\n }).trim();\n\n const shadowCommitSha = execFileSync(\n 'git',\n ['commit-tree', treeSha, '-p', headCommit, '-m', `kith-shadow:${params.agentId}`],\n {\n cwd: targetDir,\n encoding: 'utf8',\n }\n ).trim();\n\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n this.coordDb.db.prepare(`UPDATE agents SET shadow_tree_sha = ? WHERE id = ?`).run(shadowCommitSha, params.agentId);\n });\n\n return shadowCommitSha;\n }\n\n /**\n * Runs `git merge-tree --write-tree` across `agentId`'s dirty shadow commit and every\n * other active agent's dirty shadow commit (or branch).\n */\n public probeAllActiveConflicts(\n agentId: string,\n modifiedFiles?: Array<{ filePath: string; content?: string }>,\n worktreeDir?: string\n ): DirtyMergeProbeResult {\n const myShadowCommit = this.updateAgentShadowTree({\n agentId,\n modifiedFiles,\n worktreeDir,\n });\n\n if (!myShadowCommit) {\n return { clean: true, mergedTreeSha: null, conflicts: [] };\n }\n\n const activeAgents = this.fencing\n .listAgents(true)\n .filter((a) => a.id !== agentId && a.shadow_tree_sha);\n\n const allConflicts: ConflictRecord[] = [];\n let lastMergedTreeSha: string | null = null;\n\n // Also clear legacy derived conflict classifications before re-probing.\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(agentId);\n this.coordDb.db.prepare(`DELETE FROM conflicts WHERE (agent_a = ? OR agent_b = ?) AND severity IN ('text_conflict', 'ast_conflict', 'auto_mergeable')`).run(agentId, agentId);\n });\n\n for (const peer of activeAgents) {\n if (!peer.shadow_tree_sha) continue;\n const res = this.probePairConflict(\n agentId,\n myShadowCommit,\n peer.id,\n peer.shadow_tree_sha\n );\n if (res.mergedTreeSha) {\n lastMergedTreeSha = res.mergedTreeSha;\n }\n allConflicts.push(...res.conflicts);\n }\n\n return {\n clean: allConflicts.length === 0,\n mergedTreeSha: lastMergedTreeSha,\n conflicts: allConflicts,\n };\n }\n\n public probePairConflict(\n agentA: string,\n commitA: string,\n agentB: string,\n commitB: string\n ): DirtyMergeProbeResult {\n this.fencing.assertSession(agentA);\n try {\n const stdout = execFileSync(\n 'git',\n ['merge-tree', '--write-tree', '-z', commitA, commitB],\n {\n cwd: this.coordDb.repoRoot,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n }\n ).trim();\n\n const mergedTreeSha = stdout.split('\\0')[0]?.trim() ?? null;\n return {\n clean: true,\n mergedTreeSha,\n conflicts: [],\n };\n } catch (err: unknown) {\n const stdout =\n typeof (err as { stdout?: unknown })?.stdout === 'string'\n ? ((err as { stdout: string }).stdout ?? '')\n : '';\n\n const stageBlobsByFile = new Map<\n string,\n { stage1?: string; stage2?: string; stage3?: string }\n >();\n\n for (const line of stdout.split('\\0')) {\n // Format: 100644 <blob-sha> <stage>\\t<file-path>\n const m = line.match(/^(\\d{6}) ([0-9a-f]+) ([123])\\t([\\s\\S]+)$/);\n if (m) {\n const [, , blobSha, stage, filePath] = m;\n const entry = stageBlobsByFile.get(filePath) ?? {};\n if (stage === '1') entry.stage1 = blobSha;\n if (stage === '2') entry.stage2 = blobSha;\n if (stage === '3') entry.stage3 = blobSha;\n stageBlobsByFile.set(filePath, entry);\n }\n }\n\n if (stageBlobsByFile.size === 0) {\n throw new Error(`git merge-tree failed without a usable conflict result: ${err instanceof Error ? err.message : String(err)}`);\n }\n const conflicts: ConflictRecord[] = [];\n const now = Date.now();\n\n for (const [filePath, stages] of stageBlobsByFile.entries()) {\n const severity = 'text_conflict' as const;\n\n const record: ConflictRecord = {\n id: `conf_${crypto.randomBytes(6).toString('hex')}`,\n agent_a: agentA,\n agent_b: agentB,\n file_path: filePath,\n severity,\n details: {\n reason: 'Git merge conflict requires explicit resolution',\n baseBlob: stages.stage1,\n blobA: stages.stage2,\n blobB: stages.stage3,\n },\n detected_at: now,\n };\n\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(agentA);\n this.coordDb.db\n .prepare(`\n INSERT OR REPLACE INTO conflicts (\n id, agent_a, agent_b, file_path, severity, details_json, detected_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n .run(\n record.id,\n agentA,\n agentB,\n filePath,\n severity,\n JSON.stringify(record.details),\n now\n );\n });\n\n conflicts.push(record);\n }\n\n this.fencing.assertSession(agentA);\n if (conflicts.length) {\n this.coordDb.logEvent(agentA, 'dirty_merge_conflict', {\n peerAgent: agentB,\n files: conflicts.map((c) => c.file_path),\n });\n }\n\n return {\n clean: false,\n mergedTreeSha: null,\n conflicts,\n };\n }\n }\n\n public listConflicts(): ConflictRecord[] {\n this.fencing.reapDeadAgents();\n const rows = this.coordDb.db\n .prepare(`SELECT * FROM conflicts ORDER BY detected_at DESC`)\n .all() as Array<Record<string, unknown>>;\n\n return rows.map((r) => ({\n id: String(r.id),\n agent_a: String(r.agent_a),\n agent_b: String(r.agent_b),\n file_path: String(r.file_path),\n severity: r.severity as ConflictRecord['severity'],\n details: JSON.parse(String(r.details_json)) as ConflictRecord['details'],\n detected_at: Number(r.detected_at),\n }));\n }\n}\n","import { physicalPath } from './repository.js';\nimport { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { CoordDatabase } from './db.js';\nimport { FencingAndAgentManager } from './fencing.js';\n\nexport interface SpawnedWorktree {\n agentId: string;\n worktreePath: string;\n branch: string;\n hydrationMethod: 'apfs-cow' | 'reflink-cow' | 'copy' | 'none';\n hydratedDirs: string[];\n durationMs: number;\n}\n\nexport class CoWWorktreeManager {\n private static readonly HYDRATABLE_DIRS = ['node_modules', '.venv', 'venv', '.turbo'];\n private static readonly ENV_FILES = ['.env', '.env.local', '.env.development', '.env.test'];\n\n constructor(\n private readonly coordDb: CoordDatabase,\n private readonly fencing: FencingAndAgentManager\n ) {}\n\n /**\n * Spawns an isolated Git worktree for `agentId` and hydrates `node_modules` / `.env`\n * using APFS Copy-on-Write (`cp -cR`) on macOS or reflink on Linux (with independent-copy fallback).\n */\n public spawnWorktree(params: {\n agentId: string;\n branch?: string;\n baseRef?: string;\n }): SpawnedWorktree {\n this.fencing.assertSession(params.agentId);\n const start = Date.now();\n const safeId = params.agentId.replace(/[^a-zA-Z0-9_-]/g, '-');\n const branch = params.branch ?? `kith/${safeId}`;\n const baseRef = params.baseRef ?? 'HEAD';\n const worktreePath = path.join(this.coordDb.coordDir, 'worktrees', safeId);\n\n if (!this.fencing.getAgent(params.agentId)) throw new Error(`Unknown agent: ${params.agentId}`);\n if (!safeId || safeId === '.' || safeId === '..') throw new Error('Invalid agent ID');\n if (fs.existsSync(worktreePath)) {\n throw new Error(`Worktree already exists: ${worktreePath}. Commit or preserve its work before removing it.`);\n }\n\n fs.mkdirSync(path.dirname(worktreePath), { recursive: true });\n\n execFileSync('git', ['worktree', 'add', '-b', branch, worktreePath, baseRef], {\n cwd: this.coordDb.repoRoot,\n stdio: 'ignore',\n });\n\n const hydratedDirs: string[] = [];\n let hydrationMethod: SpawnedWorktree['hydrationMethod'] = 'none';\n\n for (const dirName of CoWWorktreeManager.HYDRATABLE_DIRS) {\n const srcDir = path.join(this.coordDb.repoRoot, dirName);\n const destDir = path.join(worktreePath, dirName);\n if (!fs.existsSync(srcDir) || fs.existsSync(destDir)) continue;\n\n const method = this.cloneDirectoryCoW(srcDir, destDir);\n hydrationMethod = method;\n hydratedDirs.push(dirName);\n }\n\n for (const envName of CoWWorktreeManager.ENV_FILES) {\n const srcEnv = path.join(this.coordDb.repoRoot, envName);\n const destEnv = path.join(worktreePath, envName);\n if (fs.existsSync(srcEnv) && !fs.existsSync(destEnv)) {\n fs.copyFileSync(srcEnv, destEnv);\n }\n }\n\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(params.agentId);\n this.coordDb.db\n .prepare(`UPDATE agents SET worktree_path = ?, branch = ? WHERE id = ?`)\n .run(worktreePath, branch, params.agentId);\n\n this.coordDb.logEvent(params.agentId, 'worktree_spawned', {\n worktreePath,\n branch,\n hydrationMethod,\n hydratedDirs,\n });\n });\n\n return {\n agentId: params.agentId,\n worktreePath,\n branch,\n hydrationMethod,\n hydratedDirs,\n durationMs: Date.now() - start,\n };\n }\n\n private cloneDirectoryCoW(\n srcDir: string,\n destDir: string\n ): 'apfs-cow' | 'reflink-cow' | 'copy' {\n if (process.platform === 'darwin') {\n try {\n execFileSync('cp', ['-cR', srcDir, destDir], {\n stdio: 'ignore',\n timeout: 5000,\n });\n return 'apfs-cow';\n } catch {\n // Fallback if volume is not APFS\n }\n } else if (process.platform === 'linux') {\n try {\n execFileSync('cp', ['--reflink=always', '-R', srcDir, destDir], {\n stdio: 'ignore',\n timeout: 5000,\n });\n return 'reflink-cow';\n } catch {\n // Fallback if filesystem does not support reflinks\n }\n }\n\n // A failed clone can leave a partial destination. Copy into an independent tree.\n fs.rmSync(destDir, { recursive: true, force: true });\n fs.cpSync(srcDir, destDir, { recursive: true, dereference: false });\n return 'copy';\n }\n\n public removeWorktree(agentId: string): boolean {\n this.fencing.assertSession(agentId);\n const safeId = agentId.replace(/[^a-zA-Z0-9_-]/g, '-');\n const worktreePath = path.join(this.coordDb.coordDir, 'worktrees', safeId);\n\n if (!fs.existsSync(worktreePath)) return false;\n const registered = this.fencing.getAgent(agentId)?.worktree_path;\n if (!registered || physicalPath(registered) !== physicalPath(worktreePath)\n || this.fencing.listAgents(true).some(agent => agent.id !== agentId && agent.worktree_path && physicalPath(agent.worktree_path) === physicalPath(worktreePath))) {\n throw new Error('Refusing to remove a worktree that is not exclusively registered to this agent.');\n }\n const status = execFileSync('git', ['status', '--porcelain', '--untracked-files=normal', '--ignored=matching'], {\n cwd: worktreePath, encoding: 'utf8',\n });\n if (status.trim()) {\n throw new Error(`Refusing to remove dirty worktree: ${worktreePath}. Commit or preserve changed, untracked, and ignored files first.`);\n }\n // The explicit status check also protects ignored files such as .env.\n execFileSync('git', ['worktree', 'remove', worktreePath], {\n cwd: this.coordDb.repoRoot, stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n this.coordDb.withTransaction(() => {\n this.fencing.assertSession(agentId);\n this.coordDb.db.prepare(`UPDATE agents SET worktree_path = NULL, branch = NULL WHERE id = ?`).run(agentId);\n });\n\n return true;\n }\n\n public listWorktrees(): Array<{ path: string; head: string; branch: string | null }> {\n try {\n const out = execFileSync('git', ['worktree', 'list', '--porcelain'], {\n cwd: this.coordDb.repoRoot,\n encoding: 'utf8',\n });\n\n const entries: Array<{ path: string; head: string; branch: string | null }> = [];\n let current: { path: string; head: string; branch: string | null } | null = null;\n\n for (const line of out.split(/\\r?\\n/)) {\n if (line.startsWith('worktree ')) {\n if (current) entries.push(current);\n current = { path: line.slice('worktree '.length).trim(), head: '', branch: null };\n } else if (line.startsWith('HEAD ') && current) {\n current.head = line.slice('HEAD '.length).trim();\n } else if (line.startsWith('branch ') && current) {\n current.branch = line.slice('branch '.length).replace(/^refs\\/heads\\//, '').trim();\n }\n }\n if (current) entries.push(current);\n return entries;\n } catch {\n return [];\n }\n }\n}\n","import { KITH_PROTOCOL_VERSION } from '../version.js';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { createRequire } from 'node:module';\nimport type { DatabaseSync as Database } from 'node:sqlite';\nimport { CoordDatabase } from './db.js';\nimport { discoverRepository, isWithin, physicalPath } from './repository.js';\nimport type { AgentRecord } from './fencing.js';\nimport { observeWorkspaces } from './workspace-observation.js';\nconst { DatabaseSync } = createRequire(import.meta.url)('node:sqlite') as { DatabaseSync: typeof Database };\n\n/** Copies a consistent stopped-state set before opening SQLite, so even SHM reconstruction cannot touch original recovery files. */\nexport function readCoordinationState(directory = process.cwd()) {\n const layout = discoverRepository(directory), observedAt = Date.now();\n const empty = { protocolVersion: KITH_PROTOCOL_VERSION, observedAt, repository: { root: layout.checkoutRoot, commonGitDir: layout.commonGitDir, coordDir: layout.coordDir },\n runtime: { node: process.version }, state: 'missing' as 'ready'|'missing'|'unavailable', error: undefined as string|undefined,\n fencingEpoch: 0, agents: [] as AgentRecord[], tasks: [] as Record<string,unknown>[], locks: [] as Record<string,unknown>[],\n conflicts: [] as Record<string,unknown>[], contracts: [] as Record<string,unknown>[], resources: [] as Record<string,unknown>[],\n mergeQueue: [] as Record<string,unknown>[], quarantined: [] as Record<string,unknown>[], mutexWaiters: [] as Record<string,unknown>[],\n commandGuards: [] as Record<string,unknown>[], events: [] as Record<string,unknown>[], workspaces: [] as ReturnType<typeof observeWorkspaces> };\n let scratch: string | undefined, db: Database | undefined;\n try {\n const file = path.join(layout.coordDir,'state.db');\n if (physicalPath(layout.coordDir) !== layout.coordDir || physicalPath(file) !== file) throw new Error('Coordination state must not be a symlink');\n for (let current = fs.realpathSync.native(directory); isWithin(layout.checkoutRoot, current); current = path.dirname(current)) {\n const local = path.join(current,'.coord');\n if (local !== layout.coordDir && fs.existsSync(path.join(local,'state.db'))) throw new Error(`Legacy independent state at ${local}; preserve it before consolidation`);\n if (current === layout.checkoutRoot) break;\n }\n if (!fs.existsSync(file)) {\n if (['setup.lock', 'merge-train.lock'].some(name => fs.existsSync(path.join(layout.coordDir, name))) || ['-wal','-shm','-journal'].some(s => fs.existsSync(file+s)) || ['worktrees','quarantine','snapshots','shadow-index','setup'].some(name => { const p=path.join(layout.coordDir,name); return fs.existsSync(p) && (!fs.lstatSync(p).isDirectory() || fs.readdirSync(p).length>0); })) throw new Error('Missing database with retained sidecars; preserve the recovery set');\n return empty;\n }\n const files = ['', '-wal', '-shm', '-journal'].map(s => file+s);\n const identity = (f: string) => {\n if (!fs.existsSync(f)) return null;\n if (physicalPath(f) !== f || !fs.lstatSync(f).isFile()) throw new Error('Database or sidecar is redirected or not a regular file');\n const s=fs.statSync(f,{bigint:true}); return [s.dev,s.ino,s.size,s.mtimeNs,s.ctimeNs].join(':');\n };\n const before = files.map(identity);\n scratch = fs.mkdtempSync(path.join(os.tmpdir(),'kith-observe-'));\n for (let i=0;i<files.length;i++) if (before[i]) {\n const target = path.join(scratch,path.basename(files[i])); fs.copyFileSync(files[i],target); fs.chmodSync(target,0o600);\n }\n if (JSON.stringify(before)!==JSON.stringify(files.map(identity))) throw new Error('Coordination state changed during snapshot; stop writers or retry');\n db = new DatabaseSync(path.join(scratch,'state.db'), {readOnly:true});\n db.exec('PRAGMA query_only=ON; PRAGMA busy_timeout=1000; BEGIN');\n if (CoordDatabase.inspectSchema(db)!==2) throw new Error('Offline observation requires schema 2; preserve state and upgrade with clients stopped');\n const all = <T=Record<string,unknown>>(sql:string) => db!.prepare(sql).all() as unknown as T[];\n const agents=all<AgentRecord>('SELECT * FROM agents ORDER BY registered_at DESC');\n const state = { ...empty, state:'ready' as const,\n fencingEpoch:Number((db.prepare(\"SELECT value FROM meta WHERE key='fencing_epoch'\").get() as {value:string}).value), agents,\n tasks:all('SELECT * FROM tasks ORDER BY priority DESC,created_at').map(({depends_on_json,scope_globs_json,...r})=>({...r,depends_on:JSON.parse(String(depends_on_json)),scope_globs:JSON.parse(String(scope_globs_json))})),\n locks:all('SELECT * FROM locks ORDER BY acquired_at'),\n conflicts:all('SELECT * FROM conflicts ORDER BY detected_at DESC').map(({details_json,...r})=>({...r,details:JSON.parse(String(details_json))})),\n contracts:all('SELECT * FROM contracts ORDER BY updated_at DESC').map(r=>({...r,is_breaking:Boolean(r.is_breaking)})),\n resources:all('SELECT * FROM resources ORDER BY acquired_at'), mergeQueue:all('SELECT * FROM merge_queue ORDER BY created_at DESC'),\n quarantined:all('SELECT * FROM quarantine ORDER BY created_at DESC'),\n mutexWaiters:all('SELECT ticket,mutex_name,owner_agent_id,session_epoch,expires_at FROM mutex_waiters ORDER BY ticket'),\n commandGuards:all('SELECT mutex_name,owner_agent_id,worker_pid,supervisor_pid FROM mutex_runs ORDER BY mutex_name'),\n events:all('SELECT * FROM events ORDER BY id DESC LIMIT 100').map(({payload_json,...r})=>({...r,payload:JSON.parse(String(payload_json))})),\n workspaces:observeWorkspaces(layout.checkoutRoot,agents,observedAt),\n };\n db.exec('COMMIT'); return state;\n } catch(error) { return {...empty,state:'unavailable' as const,error:error instanceof Error ? error.message : String(error)}; }\n finally { db?.close(); if(scratch) fs.rmSync(scratch,{recursive:true,force:true}); }\n}\n\n/** Recovery is an inspection report: it never clears guards, expires claims, deletes worktrees or restores files. */\nexport function recoveryReport(directory=process.cwd()) {\n const state=readCoordinationState(directory), retainedRoot=path.join(state.repository.coordDir,'worktrees');\n const retained = physicalPath(retainedRoot) === retainedRoot && fs.existsSync(retainedRoot) && fs.lstatSync(retainedRoot).isDirectory() && !fs.lstatSync(retainedRoot).isSymbolicLink()\n ? fs.readdirSync(retainedRoot,{withFileTypes:true}).map(entry=>({path:path.join(retainedRoot,entry.name),symlink:entry.isSymbolicLink(),\n agentIds:state.agents.filter(a=>a.worktree_path===path.join(retainedRoot,entry.name)).map(a=>a.id)})) : [];\n return {...state,retainedWorktrees:retained,expiredClaims:state.locks.filter(lock=>Number(lock.expires_at)<=state.observedAt),\n unfinishedIntegrations:state.mergeQueue.filter(entry=>entry.status!=='merged'),\n setupLock:{path:path.join(state.repository.coordDir,'setup.lock'),present:fs.existsSync(path.join(state.repository.coordDir,'setup.lock'))},\n integrationLock:{path:path.join(state.repository.coordDir,'merge-train.lock'),present:fs.existsSync(path.join(state.repository.coordDir,'merge-train.lock'))}};\n}\n"],"mappings":"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","names":["execFileSync","git","execFileSync","fs","path","fs","path","crypto","fs","path","crypto","fs","path","execFileSync","crypto","fs","path","epoch","path","fs","crypto","crypto","path","fs","fs","crypto","now","crypto","fs","fs","path","require","fs","path","crypto","fs","path","fs","path","crypto","crypto","crypto","execFileSync","crypto","fs","path","execFileSync","crypto","fs","path","execFileSync","path","fs","crypto","execFileSync","fs","path","fs","path","fs","path","createRequire","DatabaseSync","createRequire","path","fs"]}
|