kith-coord 0.1.1 → 0.1.2
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 +9 -0
- package/README.md +4 -12
- package/dist/cli/index.js +15 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/docs/client-validation.md +6 -0
- package/docs/integrations.md +2 -2
- package/docs/protocol/tools.v1.json +6 -2
- package/docs/protocol.md +6 -4
- package/docs/roadmap.md +1 -1
- package/docs/usage.md +9 -1
- package/package.json +4 -2
- package/server.json +52 -0
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/version.ts","../../src/cli/setup-ledger.ts","../../src/core/repository.ts","../../src/cli/doctor.ts","../../src/core/observation.ts","../../src/core/db.ts","../../src/core/workspace-observation.ts","../../src/core/fencing.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/broker.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/mcp/server.ts","../../src/cli/hook-handler.ts","../../src/cli/init.ts","../../src/cli/index.ts"],"sourcesContent":["export const KITH_VERSION = '0.1.1';\nexport const KITH_PROTOCOL_VERSION = '1.0.0';\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport { discoverRepository, isWithin, physicalPath } from '../core/repository.js';\ntype Plan = Map<string,{content:string;mode?:number}>;\ninterface Entry { before:string|null; after:string; beforeMode:number|null; afterMode:number; drifted?:boolean }\ninterface Ledger { version:1; root:string; files:Record<string,Entry> }\nfunction location(root:string,name:string) {\n if(path.isAbsolute(name)||name.startsWith('.coord'+path.sep)&&!/^\\.coord[\\/]bin[\\/](npm|pnpm|yarn)$/.test(name))throw new Error('Invalid setup ledger path');\n const target=path.resolve(root,name);\n if(!isWithin(root,target)||target===root||physicalPath(target)!==target)throw new Error(`Setup path is redirected or outside repository: ${name}`);\n return target;\n}\nfunction ledgerFile(root:string,coordDir:string) {\n const dir=path.join(coordDir,'setup');\n if(physicalPath(coordDir)!==coordDir||physicalPath(dir)!==dir)throw new Error('Setup state is redirected');\n const file = path.join(dir,crypto.createHash('sha256').update(root).digest('hex')+'.json');\n if (physicalPath(file) !== file) throw new Error('Setup ledger is redirected');\n return file;\n}\nfunction read(root:string,coordDir:string):Ledger {\n const file=ledgerFile(root,coordDir);\n if(!fs.existsSync(file))return {version:1,root,files:{}};\n const value=JSON.parse(fs.readFileSync(file,'utf8')) as Ledger;\n if(value.version!==1||value.root!==root||!value.files||typeof value.files!=='object'||Array.isArray(value.files))throw new Error('Unsupported setup ledger; preserve it before manual repair');\n for(const [name,entry] of Object.entries(value.files)) {\n location(root,name);\n if(!entry||typeof entry.after!=='string'||entry.before!==null&&typeof entry.before!=='string'||![entry.after,entry.before].every(v=>v===null||Buffer.from(v,'base64').toString('base64')===v)||![entry.afterMode,entry.beforeMode].every(v=>v===null||Number.isInteger(v)&&v>=0&&v<=0o777)||(entry.before===null)!==(entry.beforeMode===null))throw new Error('Damaged setup ledger; preserve it before manual repair');\n }\n return value;\n}\nfunction persist(root:string,coordDir:string,ledger:Ledger) {\n const file=ledgerFile(root,coordDir),temp=file+'.'+crypto.randomBytes(6).toString('hex')+'.tmp';\n fs.mkdirSync(path.dirname(file),{recursive:true,mode:0o700});\n const fd=fs.openSync(temp,'wx',0o600);\n try {fs.writeFileSync(fd,JSON.stringify(ledger,null,2)+'\\n');fs.fsyncSync(fd);}finally{fs.closeSync(fd);}\n fs.renameSync(temp,file);\n // Node cannot open directory handles for fsync on Windows; the backup file itself is flushed above.\n for (const parent of process.platform === 'win32' ? [] : [path.dirname(file), coordDir]) {\n const dir=fs.openSync(parent,'r');try{fs.fsyncSync(dir);}finally{fs.closeSync(dir);}\n }\n}\nfunction lock(coordDir:string) {\n const file=path.join(coordDir,'setup.lock'),fd=fs.openSync(file,'wx',0o600);\n fs.writeFileSync(fd,JSON.stringify({pid:process.pid}));\n return ()=>{fs.closeSync(fd);fs.unlinkSync(file);};\n}\n/** Backups are private, persisted before client writes, and never interpreted as commands. */\nexport function applySetupPlan(root:string,coordDir:string,plan:Plan,warnings:string[]) {\n const release=lock(coordDir);\n try {\n const ledger=read(root,coordDir);\n const observed = new Map<string, { bytes: string|null; mode: number|null }>();\n for(const [name,planned] of plan) {\n const relative=path.relative(root,path.isAbsolute(name)?name:path.join(root,name));\n const target=location(root,relative),exists=fs.existsSync(target),current=exists?fs.readFileSync(target).toString('base64'):null;\n const mode=exists?fs.statSync(target).mode&0o777:null,previous=ledger.files[relative];\n observed.set(relative, {bytes:current, mode});\n if(previous&&(previous.drifted||previous.after!==current||previous.afterMode!==mode)) {\n previous.drifted=true;warnings.push(`User changes in ${relative} will be preserved by uninstall; review that file manually.`);\n } else ledger.files[relative]={before:previous?previous.before:current,after:Buffer.from(planned.content).toString('base64'),beforeMode:previous?previous.beforeMode:mode,\n afterMode:mode??(process.platform === 'win32' ? 0o666 : ((planned.mode??0o666)&~process.umask()))};\n }\n persist(root,coordDir,ledger);\n for(const [name,planned] of plan) {\n const relative=path.relative(root,path.isAbsolute(name)?name:path.join(root,name)),target=location(root,relative);\n const snapshot = observed.get(relative)!;\n const current = fs.existsSync(target) ? fs.readFileSync(target).toString('base64') : null;\n const mode = fs.existsSync(target) ? fs.statSync(target).mode & 0o777 : null;\n if (current !== snapshot.bytes || mode !== snapshot.mode) throw new Error(`Configuration changed during setup: ${relative}; preserve the setup ledger before retrying`);\n fs.mkdirSync(path.dirname(target),{recursive:true});fs.writeFileSync(target,planned.content,{encoding:'utf8',mode:planned.mode});\n }\n }finally{release();}\n}\n\n/** Restore only exact recorded Kith writes. Leave database, recovery copies, ignored-state rule and edited files intact. */\nexport function uninstallKith(directory=process.cwd(),dryRun=false) {\n const layout=discoverRepository(directory),root=layout.checkoutRoot;\n if(physicalPath(layout.coordDir)!==layout.coordDir)throw new Error('Coordination directory is redirected');\n const report={ok:true,dryRun,restored:[] as string[],removed:[] as string[],needsReview:[] as string[],retained:[layout.coordDir,'.gitignore']};\n if(!fs.existsSync(layout.coordDir))return report;\n const release=dryRun?()=>{}:lock(layout.coordDir);\n try {\n const ledger=read(root,layout.coordDir);\n for(const [name,entry] of Object.entries(ledger.files)) {\n if(name==='.gitignore')continue;\n const target=location(root,name),current=fs.existsSync(target)?fs.readFileSync(target).toString('base64'):null;\n if(current===entry.before){if(!dryRun)delete ledger.files[name];continue;}\n if(entry.drifted||current!==entry.after||!fs.existsSync(target)||(fs.statSync(target).mode&0o777)!==entry.afterMode){report.needsReview.push(name);continue;}\n if(entry.before===null){report.removed.push(name);if(!dryRun)fs.unlinkSync(target);}\n else {report.restored.push(name);if(!dryRun){fs.writeFileSync(target,Buffer.from(entry.before,'base64'));fs.chmodSync(target,entry.beforeMode!);}}\n if(!dryRun)delete ledger.files[name];\n }\n report.ok=report.needsReview.length===0;\n if(!dryRun)persist(root,layout.coordDir,ledger);\n return report;\n }finally{release();}\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 fs from 'node:fs';\nimport path from 'node:path';\nimport { execFileSync } from 'node:child_process';\nimport { parse as parseToml } from 'smol-toml';\nimport { isWithin, physicalPath } from '../core/repository.js';\nimport { readCoordinationState } from '../core/observation.js';\n\n/** Diagnostics read files and inspect a snapshot; they never initialize state, trust projects, install packages or run configured hooks. */\nexport function doctorReport(directory=process.cwd()) {\n const state=readCoordinationState(directory), root=state.repository.root;\n const checks: Array<{name:string;ok:boolean;detail:string}>=[];\n const check=(name:string,ok:boolean,detail:string)=>checks.push({name,ok,detail});\n const [major,minor]=process.versions.node.split('.').map(Number);\n check('node',major===22 && minor>=13 || major>=24,process.version);\n check('platform',process.platform==='darwin'||process.platform==='linux',process.platform==='win32'?'Native Windows is limited to MCP coordination; supervised mutex commands and shell hooks require macOS/Linux or WSL':process.platform);\n try {\n const version=execFileSync('git',['--version'],{encoding:'utf8',timeout:2000}).trim();\n const parts=/\\b(\\d+)\\.(\\d+)/.exec(version);\n check('git',Boolean(parts && (Number(parts[1])>2 || Number(parts[1])===2 && Number(parts[2])>=38)),version);\n } catch {check('git',false,'Git 2.38+ must be available on PATH');}\n const executable = (command: string) => {\n const candidates = path.isAbsolute(command) ? [command]\n : (process.env.PATH ?? '').split(path.delimiter).filter(Boolean).map(dir => path.join(dir, command));\n return candidates.some(file => {\n try { fs.accessSync(file, fs.constants.X_OK); return fs.statSync(file).isFile(); }\n catch { return false; }\n });\n };\n let configured=0;\n for(const [client,file] of [['claude','.mcp.json'],['cursor','.cursor/mcp.json'],['codex','.codex/config.toml']] as const) {\n const target=path.join(root,file); if(!fs.existsSync(target)) continue;\n try {\n if(!isWithin(root,physicalPath(target)))throw new Error('Configuration is redirected outside the checkout');\n const text=fs.readFileSync(target,'utf8');\n const config=client==='codex'?parseToml(text):JSON.parse(text);\n const server=client==='codex'?config.mcp_servers?.kith:config.mcpServers?.kith;\n if(!server) continue;configured++;\n check(`${client}-mcp`,typeof server.command==='string' && Array.isArray(server.args) && executable(server.command),'Kith stdio launcher must be executable by absolute path or PATH; native client trust and MCP discovery require client validation');\n } catch {check(`${client}-mcp`,false,`Cannot parse ${file}; existing configuration was preserved`);}\n }\n check('mcp-configuration',configured>0,'Configure the clients you use with kith init; diagnostics do not change client settings');\n check('coordination-state',state.state==='ready',state.state==='ready'?'Schema and counters validated on a private snapshot':state.error??'No coordination state; run kith init before starting agents');\n let nativeGuards=false;\n for(const [file,event] of [['.claude/settings.json','PreToolUse'],['.cursor/hooks.json','preToolUse']] as const) {\n const target=path.join(root,file);if(!fs.existsSync(target))continue;\n try {\n if(!isWithin(root,physicalPath(target)))throw new Error('Hook configuration leaves checkout');\n const config=JSON.parse(fs.readFileSync(target,'utf8')),entries=config.hooks?.[event]??[];\n if(!Array.isArray(entries))throw new Error('Hook entries must be an array');\n const hooks=event==='PreToolUse'?entries.flatMap(e=>e?.hooks??[]):entries;\n const guards=hooks.filter(h=>typeof h?.command==='string'&&h.command.includes('--repo')&&h.command.includes(' hook pre'));\n if(guards.length){nativeGuards=true;check(`${event}-failure-policy`,guards.every(h=>event==='PreToolUse'?h.onFailure==='block':h.failClosed===true),'Kith native pre-hooks must block on launch errors and timeouts');}\n }catch{check(`${event}-configuration`,false,`Cannot validate ${file}; configuration preserved`);}\n }\n const id=process.env.KITH_AGENT_ID, token=process.env.KITH_SESSION_TOKEN;\n if(id||token||nativeGuards) {\n const agent=state.agents.find(a=>a.id===id);\n check('session-environment',Boolean(id&&token&&agent?.status==='active'&&agent.lease_expires_at>Date.now()),'Native hooks need a persistent owning shell with both inherited session variables and a current recorded lease. MCP-only workflows do not need these exports. Capability validity is checked on use');\n }\n for(const workspace of state.workspaces) check(`workspace:${workspace.agentId}`,workspace.available && (!workspace.recordedBranch||workspace.recordedBranch===workspace.branch),workspace.error??`${workspace.path}; dirty files: ${workspace.dirtyFiles.length}`);\n return {ok:checks.every(c=>c.ok),repository:state.repository,checks};\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","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 { 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 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 { 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 { 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 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 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_VERSION } from '../version.js';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { KithEngine } from '../core/engine.js';\n\nexport function createKithMcpServer(repoRoot = process.cwd()): {\n server: McpServer;\n engine: KithEngine;\n} {\n const engine = new KithEngine(repoRoot);\n const server = new McpServer({\n name: 'kith-coordinator',\n version: KITH_VERSION,\n }, { instructions: 'Kith coordinates work claims, isolated worktrees, local resources and verified integration for cooperating coding agents. State stays local; no hosted service or model API key is required. Recommended workflow: one isolated worktree per parallel agent. Call kith_begin_work with isolateWorktree:true and explicit scopeGlobs; edit only the returned worktreePath, call kith_record_file_edit, run literal argv with kith_run_with_mutex, and finish with kith_complete_work plus a project verificationCmd. Heartbeat before the session expires. ' + (process.env.KITH_AGENT_ID\n ? `This server shares a session with CLI/hooks. Use agentId '${process.env.KITH_AGENT_ID}'. Its inherited capability is handled internally; do not request or log it.`\n : 'Start with kith_begin_work or kith_start_session and a unique agentId. This connection retains its granted capability. Another connection needs the session token to resume that ID. Keep tokens private.'\n ) });\n\n const tokenFor = (args: { agentId: string; sessionToken?: string }) => args.sessionToken ??\n (process.env.KITH_AGENT_ID === args.agentId ? process.env.KITH_SESSION_TOKEN : undefined);\n const owned = new Set<string>();\n const register = (args: { agentId: string; client?: string; sessionToken?: string; leaseDurationMs?: number }) => {\n const result = engine.fencing.registerAgent({ id: args.agentId, client: args.client ?? 'mcp',\n sessionToken: tokenFor(args), leaseDurationMs: args.leaseDurationMs });\n if (result.agent.pid === process.pid) owned.add(args.agentId);\n return result;\n };\n const authorize = (args: { agentId: string; sessionToken?: string }) => {\n const token = tokenFor(args);\n if (token) engine.fencing.resumeSession(args.agentId, token);\n engine.fencing.heartbeat(args.agentId);\n };\n const disconnected = new AbortController();\n const commands = new Set<Promise<unknown>>();\n const cleanup = () => {\n for (const id of owned) {\n try { engine.fencing.abandonAgentSession(id); } catch { /* Expired or already completed. */ }\n }\n engine.close();\n };\n let closing = false;\n server.server.onclose = () => {\n if (closing) return;\n closing = true;\n disconnected.abort();\n // A command must stop before its process-group guard and database are closed.\n if (commands.size) void Promise.allSettled([...commands]).then(cleanup);\n else cleanup();\n };\n\n const formatReply = (agentId: string | undefined, payload: unknown) => {\n const delta = agentId ? engine.consumeAgentDelta(agentId).formattedFooter : '';\n const data = payload as Record<string, unknown>;\n return {\n content: [\n { type: 'text' as const, text: JSON.stringify(data, null, 2) },\n ...(delta ? [{ type: 'text' as const, text: delta }] : []),\n ],\n structuredContent: data,\n isError: data.ok === false,\n };\n };\n\n server.tool('kith_start_session', 'Create a capability-owned session or resume one with its token.', {\n agentId: z.string(), sessionToken: z.string().optional(), leaseDurationMs: z.number().optional(),\n }, async (args) => formatReply(undefined, { ok: true, ...register(args) }));\n server.tool('kith_heartbeat', 'Renew an active, owned session. Expired sessions cannot be revived.', {\n agentId: z.string(), sessionToken: z.string().optional(),\n }, async (args) => { authorize(args); return formatReply(args.agentId, { ok: true, agent: engine.fencing.getAgent(args.agentId) }); });\n\n server.tool(\n 'kith_begin_work',\n 'Register an agent session, verify no scope lock conflicts exist with sibling agents, acquire monotonic fencing-token locks, and optionally create an isolated Git worktree.',\n {\n agentId: z.string().describe('Unique identifier for this agent session (e.g. claude-1, codex-auth)'),\n sessionToken: z.string().optional(),\n client: z.string().optional().describe('Client name (claude-code, antigravity, codex, cursor)'),\n title: z.string().describe('Short title of the task or intent'),\n intentSummary: z.string().optional().describe('Detailed description of what will be built or modified'),\n scopeGlobs: z.array(z.string()).describe('File paths or glob patterns this agent will edit (e.g. [\"src/auth/**\"])'),\n isolateWorktree: z.boolean().optional().describe('Recommended: true, giving each parallel agent a separate Git worktree'),\n },\n async (args) => {\n const reg = register(args);\n\n const intentRes = engine.beginWork({\n agentId: args.agentId,\n title: args.title,\n intentSummary: args.intentSummary,\n scopeGlobs: args.scopeGlobs,\n isolateWorktree: args.isolateWorktree,\n });\n\n const contracts = engine.depGraph.listContracts().slice(0, 30);\n\n return formatReply(args.agentId, {\n ok: intentRes.ok,\n agent: reg.agent,\n sessionToken: reg.sessionToken,\n fencingToken: intentRes.fencingToken,\n task: intentRes.task,\n locks: intentRes.locks,\n worktree: intentRes.worktree,\n lockConflicts: intentRes.lockConflicts,\n activeSiblingIntents: intentRes.activeSiblingIntents,\n publishedContracts: contracts,\n });\n }\n );\n\n server.tool(\n 'kith_claim_next_task',\n 'Atomically claim the highest-priority unblocked task from the DAG task queue and lock its declared file scope.',\n {\n agentId: z.string().describe('Agent ID claiming the task'),\n sessionToken: z.string().optional(),\n client: z.string().optional(),\n },\n async (args) => {\n const session = register(args);\n const res = engine.intents.claimNextTask(args.agentId);\n return formatReply(args.agentId, { ...res, sessionToken: session.sessionToken });\n }\n );\n\n server.tool(\n 'kith_add_task',\n 'Add a task to the orchestrated DAG queue with optional task dependencies and file scope globs.',\n {\n id: z.string().optional(),\n title: z.string(),\n intentSummary: z.string().optional(),\n priority: z.number().optional(),\n dependsOn: z.array(z.string()).optional(),\n scopeGlobs: z.array(z.string()).optional(),\n },\n async (args) => {\n const task = engine.intents.addTask(args);\n return formatReply(undefined, { ok: true, task });\n }\n );\n\n server.tool(\n 'kith_check_and_lock_files',\n 'Acquire exclusive or shared fencing-token locks on file paths, globs, or symbols.',\n {\n agentId: z.string(),\n sessionToken: z.string().optional(),\n patterns: z.array(z.string()),\n mode: z.enum(['exclusive', 'shared']).optional(),\n reason: z.string().optional(),\n },\n async (args) => {\n authorize(args);\n const res = engine.locks.acquireLocks(args);\n return formatReply(args.agentId, res);\n }\n );\n\n server.tool(\n 'kith_record_file_edit',\n 'Analyze a modified file for supported contract signatures, flag exact name/kind matches in other files as non-blocking reuse hints, check transitive import blast radius, and run a live dirty-tree git merge-tree conflict check.',\n {\n agentId: z.string(),\n sessionToken: z.string().optional(),\n filePath: z.string(),\n content: z.string().optional(),\n },\n async (args) => {\n authorize(args);\n const res = engine.processPostFileEdit({\n agentId: args.agentId,\n filePath: args.filePath,\n content: args.content,\n });\n return formatReply(args.agentId, res);\n }\n );\n\n server.tool(\n 'kith_publish_contract',\n 'Explicitly publish a shared interface, function signature, API route, or schema to the Contract Blackboard.',\n {\n agentId: z.string(),\n sessionToken: z.string().optional(),\n filePath: z.string(),\n symbolName: z.string(),\n kind: z.enum(['function', 'type', 'interface', 'class', 'schema', 'route', 'const']),\n signature: z.string(),\n docComment: z.string().optional(),\n },\n async (args) => {\n authorize(args);\n const contract = engine.depGraph.publishExplicitContract(args);\n return formatReply(args.agentId, { ok: true, contract });\n }\n );\n\n server.tool(\n 'kith_acquire_port',\n 'Reserve a local TCP port among cooperating Kith clients; start the service promptly and handle unrelated bind races.',\n {\n agentId: z.string(),\n sessionToken: z.string().optional(),\n serviceName: z.string(),\n basePort: z.number().optional(),\n },\n async (args) => {\n authorize(args);\n const portRes = await engine.broker.acquirePort(args);\n return formatReply(args.agentId, portRes);\n }\n );\n\n server.tool(\n 'kith_run_with_mutex',\n 'Run an argv command under a renewable named mutex, using the MCP server process permissions. Useful when a sandboxed client shell cannot inspect process identities. Requires an owned session. Cancellation or connection loss stops the supervised command before release. This is command execution, not a filesystem sandbox.',\n {\n agentId: z.string(), sessionToken: z.string().optional(),\n mutexName: z.string().min(1).max(128),\n command: z.array(z.string()).min(1).describe('Executable followed by literal arguments; no implicit shell'),\n cwd: z.string().optional().describe('Directory under the registered worktree or repository; defaults to the worktree when present'),\n leaseDurationMs: z.number().int().min(100).max(86400000).optional(),\n waitTimeoutMs: z.number().int().min(0).max(600000).optional(),\n commandTimeoutMs: z.number().int().min(1).max(600000).optional(),\n maxOutputBytes: z.number().int().min(1).max(1048576).optional(),\n },\n async (args, extra) => {\n authorize(args);\n const root = fs.realpathSync(engine.fencing.getAgent(args.agentId)?.worktree_path ?? engine.coordDb.repoRoot);\n const cwd = fs.realpathSync(path.resolve(root, args.cwd ?? '.'));\n const relative = path.relative(root, cwd);\n if (relative === '..' || relative.startsWith('..' + path.sep) || path.isAbsolute(relative)) {\n throw new Error('Command cwd must be inside the registered worktree or repository');\n }\n const execution = engine.broker.executeWithMutex({\n agentId: args.agentId, mutexName: args.mutexName, command: args.command, cwd,\n leaseDurationMs: args.leaseDurationMs, timeoutMs: args.waitTimeoutMs,\n commandTimeoutMs: args.commandTimeoutMs ?? 60000, maxOutputBytes: args.maxOutputBytes ?? 65536,\n signal: AbortSignal.any([disconnected.signal, extra.signal]),\n });\n commands.add(execution);\n try {\n const result = await execution;\n return formatReply(args.agentId, { ok: result.exitCode === 0, ...result });\n } finally { commands.delete(execution); }\n }\n );\n\n server.tool(\n 'kith_get_status',\n 'Retrieve coordination state, FIFO waiters and guarded commands, plus worktree paths, actual branches, dirty-file overlaps, commit age and ahead/behind against the current integration target HEAD. Normal engine startup may reap expired ownership.',\n {\n agentId: z.string().optional(),\n sessionToken: z.string().optional(),\n },\n async (args) => {\n if (args.agentId) authorize({ ...args, agentId: args.agentId });\n const state = engine.getStatus();\n return formatReply(args.agentId, state);\n }\n );\n\n server.tool(\n 'kith_preview_integrate',\n 'Preview exact Git conflict paths for a committed registered worktree against the current integration target. Refuses dirty inputs; never checkpoints or changes source/target files. A clean preview does not run project verification.',\n { agentId: z.string(), sessionToken: z.string().optional() },\n async args => { authorize(args); return formatReply(args.agentId, engine.previewIntegration(args.agentId)); }\n );\n\n server.tool(\n 'kith_complete_work',\n 'Complete an agent task, optionally run the Speculative Merge Train to verify and merge its worktree branch, and release all locks and resources.',\n {\n agentId: z.string(),\n sessionToken: z.string().optional(),\n taskId: z.string().optional(),\n fencingToken: z.number().optional(),\n mergeBranch: z.string().optional().describe('If work was done on a worktree/branch, run Speculative Merge Train to integrate it'),\n verificationCmd: z.string().optional().describe('Command to run in speculative merge tree (e.g. \"npm run typecheck\")'),\n },\n async (args) => {\n authorize(args);\n const result = engine.completeWork(args);\n return formatReply(result.ok ? undefined : args.agentId, result);\n }\n );\n\n return { server, engine };\n}\n\nexport async function runKithMcpStdioServer(repoRoot = process.cwd()): Promise<void> {\n const { server } = createKithMcpServer(repoRoot);\n const transport = new StdioServerTransport();\n let closing = false;\n const close = () => {\n if (closing) return;\n closing = true;\n process.stdin.off('end', close);\n process.stdin.off('close', close);\n process.off('SIGTERM', close);\n process.off('SIGINT', close);\n void server.close();\n };\n // The SDK transport does not translate stdin EOF into onclose. A running command\n // otherwise keeps the server alive until the client force-kills it.\n process.stdin.once('end', close);\n process.stdin.once('close', close);\n process.once('SIGTERM', close);\n process.once('SIGINT', close);\n try { await server.connect(transport); }\n catch (error) { close(); throw error; }\n}\n","import { discoverRepository } from '../core/repository.js';\nimport { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport { LockEngine } from '../core/locks.js';\nimport { KithEngine } from '../core/engine.js';\n\nexport interface HookInputPayload {\n session_id?: string;\n agent_id?: string;\n tool_name?: string;\n tool_input?: {\n file_path?: string;\n notebook_path?: string;\n path?: string;\n target_file?: string;\n command?: string;\n content?: string;\n new_string?: string;\n };\n}\n\nexport type EnforcementMode = 'block' | 'warn' | 'off';\nexport function enforcementMode(value: unknown = 'block'): EnforcementMode {\n if (value !== 'block' && value !== 'warn' && value !== 'off') throw new Error('Enforcement must be block, warn or off');\n return value;\n}\n\nexport class HookHandler {\n constructor(private readonly engine: KithEngine, private readonly mode: EnforcementMode = 'block') {\n enforcementMode(mode);\n }\n\n private conflict(message: string): { allowed: boolean; exitCode: number; message: string } {\n return this.mode === 'block' ? { allowed: false, exitCode: 2, message }\n : { allowed: true, exitCode: 0, message: this.mode === 'warn' ? `[KITH WARNING] ${message}` : '' };\n }\n\n public static resolveAgentId(payload?: HookInputPayload, explicitAgentId?: string): string {\n return (\n explicitAgentId ??\n process.env.KITH_AGENT_ID ??\n payload?.agent_id ??\n payload?.session_id ??\n `pid-${process.ppid || process.pid}`\n );\n }\n\n /**\n * Handles `PreToolUse` enforcement for file edits (`Edit`, `Write`, `MultiEdit`) and `Bash`.\n * Returns `{ allowed: false, exitCode: 2, message }` when a lock or safety rule is violated.\n */\n public handlePreToolUse(params: {\n agentId: string;\n toolName: string;\n filePath?: string;\n command?: string;\n }): { allowed: boolean; exitCode: number; message: string } {\n this.engine.fencing.assertSession(params.agentId);\n\n const agent = this.engine.fencing.getAgent(params.agentId);\n if (params.filePath) {\n params = { ...params, filePath: LockEngine.normalizeFile(agent?.worktree_path ?? this.engine.coordDb.repoRoot, params.filePath) };\n }\n const tool = params.toolName.toLowerCase();\n\n if ((tool.includes('edit') || tool.includes('write') || tool.includes('replace') || tool.includes('delete')) && !params.filePath) {\n return { allowed: false, exitCode: 2, message: '[KITH LOCK GUARD] Missing file path in edit hook payload.' };\n }\n\n if (this.mode === 'off') return { allowed: true, exitCode: 0, message: '' };\n\n // 1. Pre-Edit / Pre-Write File Lock Enforcement\n if (\n params.filePath &&\n (tool.includes('edit') || tool.includes('write') || tool.includes('replace') || tool.includes('delete'))\n ) {\n const check = this.engine.locks.checkFileWriteAccess({\n agentId: params.agentId,\n filePath: params.filePath,\n });\n\n if (!check.allowed) {\n return this.conflict(`[KITH LOCK GUARD] Write to '${params.filePath}' conflicts with a claim. ${check.reason}`);\n }\n\n // Auto-acquire an advisory/exclusive file lock if the file was unlocked so sibling agents see it immediately\n const acquired = this.engine.locks.acquireLocks({\n agentId: params.agentId,\n patterns: [params.filePath],\n lockType: 'file',\n reason: `Auto-locked on ${params.toolName}`,\n });\n\n if (!acquired.ok) {\n return this.conflict('[KITH LOCK GUARD] Another agent acquired the file lock. Retry after resolving the conflict.');\n }\n return { allowed: true, exitCode: 0, message: '' };\n }\n\n // 2. Pre-Bash Destructive Command Firewall + Merkle Snapshot Capture\n if (tool === 'bash' || tool === 'run_command' || params.command) {\n const cmd = params.command ?? '';\n const agent = this.engine.fencing.getAgent(params.agentId);\n const safety = this.engine.bashGuard.checkCommandSafety({\n agentId: params.agentId,\n command: cmd,\n inIsolatedWorktree: Boolean(agent?.worktree_path),\n });\n\n const conflict = !safety.safe ? this.conflict(`[KITH BASH FIREWALL] ${safety.reason}`) : null;\n if (conflict && !conflict.allowed) return conflict;\n\n this.engine.bashGuard.capturePreBashSnapshot(\n params.agentId,\n agent?.worktree_path ?? this.engine.coordDb.repoRoot\n );\n return conflict ?? { allowed: true, exitCode: 0, message: '' };\n }\n\n return { allowed: true, exitCode: 0, message: '' };\n }\n\n /**\n * Handles `PostToolUse` verification:\n * - For file edits: AST export/import extraction, transitive blast radius, live dirty-tree `git merge-tree`.\n * - For Bash commands: snapshot diff and preserved recovery copies of unauthorized changes.\n */\n public handlePostToolUse(params: {\n agentId: string;\n toolName: string;\n filePath?: string;\n command?: string;\n }): { allowed: boolean; exitCode: number; warnings: string[]; deltaFooter: string } {\n const agent = this.engine.fencing.getAgent(params.agentId);\n if (params.filePath) {\n params = { ...params, filePath: LockEngine.normalizeFile(agent?.worktree_path ?? this.engine.coordDb.repoRoot, params.filePath) };\n }\n const tool = params.toolName.toLowerCase();\n this.engine.fencing.assertSession(params.agentId);\n const warnings: string[] = [];\n\n if (\n params.filePath &&\n (tool.includes('edit') || tool.includes('write') || tool.includes('replace') || tool.includes('delete'))\n ) {\n const agent = this.engine.fencing.getAgent(params.agentId);\n const access = this.engine.locks.checkFileWriteAccess({ agentId: params.agentId, filePath: params.filePath });\n if (!access.allowed && this.mode !== 'block') {\n if (this.mode === 'warn') warnings.push(`[KITH WARNING] ${access.reason}. Edit was not indexed as authorized work.`);\n return { allowed: true, exitCode: 0, warnings, deltaFooter: this.engine.consumeAgentDelta(params.agentId).formattedFooter };\n }\n const postRes = this.engine.processPostFileEdit({\n agentId: params.agentId,\n filePath: params.filePath,\n worktreeDir: agent?.worktree_path ?? undefined,\n });\n warnings.push(...postRes.warnings);\n } else if (tool === 'bash' || tool === 'run_command' || params.command) {\n if (this.mode === 'off') return { allowed: true, exitCode: 0, warnings, deltaFooter: this.engine.consumeAgentDelta(params.agentId).formattedFooter };\n const agent = this.engine.fencing.getAgent(params.agentId);\n const report = this.engine.bashGuard.verifyPostBashAndQuarantine({\n agentId: params.agentId,\n command: params.command ?? 'bash',\n rootDir: agent?.worktree_path ?? this.engine.coordDb.repoRoot,\n });\n\n if (!report.allowed) {\n for (const v of report.quarantinedViolations) {\n warnings.push(\n `[KITH BASH QUARANTINE] Detected a change to locked file '${v.file_path}' during command '${v.command}'. Current workspace bytes were preserved. ${v.reason}. Recovery copies saved to '${v.patch_path}' (and .before when available).`\n );\n }\n const deltaFooter = this.engine.consumeAgentDelta(params.agentId).formattedFooter;\n return {\n allowed: this.mode !== 'block',\n exitCode: this.mode === 'block' ? 2 : 0,\n warnings,\n deltaFooter,\n };\n }\n }\n\n const deltaFooter = this.engine.consumeAgentDelta(params.agentId).formattedFooter;\n return {\n allowed: true,\n exitCode: 0,\n warnings,\n deltaFooter,\n };\n }\n\n /**\n * Git `pre-commit` hook handler: ensures none of the staged files are locked by another live agent.\n */\n public handleGitPreCommit(agentId: string, indexCwd = this.engine.fencing.getAgent(agentId)?.worktree_path ?? this.engine.coordDb.repoRoot): {\n allowed: boolean;\n exitCode: number;\n violations: string[];\n } {\n this.engine.fencing.assertSession(agentId);\n let stagedFiles: string[] = [];\n try {\n const layout = discoverRepository(indexCwd);\n if (!layout.commonGitDir || layout.commonGitDir !== this.engine.coordDb.commonGitDir) throw new Error('Git index belongs to a different repository');\n const out = execFileSync(\n 'git',\n ['diff', '--cached', '--name-only', '-z'],\n { cwd: layout.checkoutRoot, encoding: 'utf8' }\n );\n stagedFiles = out.split('\\0').filter(Boolean);\n } catch {\n return { allowed: false, exitCode: 1, violations: ['Unable to read the Git index.'] };\n }\n\n const violations: string[] = [];\n for (const file of this.mode === 'off' ? [] : stagedFiles) {\n const check = this.engine.locks.checkFileWriteAccess({\n agentId,\n filePath: file,\n });\n if (!check.allowed && check.reason) {\n violations.push(check.reason);\n }\n }\n\n return {\n allowed: violations.length === 0 || this.mode !== 'block',\n exitCode: violations.length === 0 || this.mode !== 'block' ? 0 : 1,\n violations,\n };\n }\n\n public static readJsonStdinSync(): HookInputPayload | undefined {\n if (process.stdin.isTTY) return undefined;\n try {\n const raw = fs.readFileSync(0, 'utf8').trim();\n if (!raw) return undefined;\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) throw new Error('Expected a JSON object');\n return parsed as HookInputPayload;\n } catch (err) {\n throw new Error(`Cannot read hook input: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n}\n","import { KITH_PROTOCOL_VERSION } from '../version.js';\nimport { applySetupPlan } from './setup-ledger.js';\nimport { discoverRepository, isWithin, physicalPath } from '../core/repository.js';\nimport { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { parse as parseToml, stringify as stringifyToml } from 'smol-toml';\nimport { KithEngine } from '../core/engine.js';\nimport { enforcementMode, type EnforcementMode } from './hook-handler.js';\n\nexport const INTEGRATIONS = ['claude', 'codex', 'cursor', 'agents', 'git', 'shims'] as const;\nexport type Integration = (typeof INTEGRATIONS)[number];\nexport interface InitReport {\n repoRoot: string;\n indexedFiles: number;\n configuredFiles: string[];\n dryRun: boolean;\n warnings: string[];\n}\n\nfunction object(value: unknown, label: string): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${label} must be a JSON object. No configuration was written.`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction readConfig(file: string): Record<string, unknown> {\n if (!fs.existsSync(file)) return {};\n try {\n return object(JSON.parse(fs.readFileSync(file, 'utf8')), file);\n } catch (err) {\n throw new Error(`Cannot read ${file}: ${err instanceof Error ? err.message : err}`);\n }\n}\n\nfunction shellQuote(value: string): string {\n return \"'\" + value.replace(/'/g, \"'\\\\''\") + \"'\";\n}\n\n/** Preflight every selected configuration before writing; preserve unrelated settings. */\nexport function initializeKithRepository(\n repoRoot = process.cwd(),\n cliBinaryCommand = 'kith',\n options: { dryRun?: boolean; integrations?: Integration[]; mcpOnly?: boolean; enforcement?: EnforcementMode } = {}\n): InitReport {\n const mode = enforcementMode(options.enforcement);\n const modeArg = mode === 'block' ? '' : ` --enforcement ${mode}`;\n const absRoot = discoverRepository(repoRoot).checkoutRoot;\n const mcpOnly = options.mcpOnly ?? options.integrations === undefined;\n const selected = new Set(options.integrations ?? ['claude', 'codex', 'cursor', 'agents'] as Integration[]);\n if (mcpOnly && (selected.has('git') || selected.has('shims'))) {\n throw new Error('--mcp-only supports client MCP configurations and agent instructions; omit git and shims.');\n }\n for (const integration of selected) {\n if (!INTEGRATIONS.includes(integration)) throw new Error(`Unknown integration: ${integration}`);\n }\n if (process.platform === 'win32' && !mcpOnly && ['claude', 'cursor', 'git', 'shims'].some(name => selected.has(name as Integration))) {\n throw new Error('Native Windows setup supports MCP-only configuration; use --mcp-only or WSL for shell hooks and shims.');\n }\n if (!fs.statSync(absRoot).isDirectory()) throw new Error(`Not a directory: ${absRoot}`);\n const plan = new Map<string, { content: string; mode?: number }>();\n const warnings: string[] = [];\n const add = (name: string, content: string, mode?: number) => {\n const target = path.isAbsolute(name) ? name : path.join(absRoot, name);\n if (!isWithin(absRoot, physicalPath(target))) throw new Error(`Configuration path leaves repository: ${name}`);\n if (!fs.existsSync(target) || fs.readFileSync(target, 'utf8') !== content) {\n plan.set(name, { content, mode });\n }\n };\n const json = (name: string, value: unknown) => add(name, JSON.stringify(value, null, 2) + '\\n');\n const hookCommand = `${cliBinaryCommand} --repo ${shellQuote(absRoot)} hook`;\n // Native clients cannot spawn npm's .cmd launcher directly. Avoid cmd.exe quoting entirely.\n const windowsCli = process.platform === 'win32' ? ['./cli/index.js', './index.js', '../../dist/cli/index.js']\n .map(relative => fileURLToPath(new URL(relative, import.meta.url))).find(file => fs.existsSync(file)) : undefined;\n if (process.platform === 'win32' && !windowsCli) throw new Error('Build Kith before generating native Windows MCP configuration');\n const server = windowsCli\n ? { command: process.execPath, args: [windowsCli, 'mcp', '--repo', absRoot] }\n : { command: 'kith', args: ['mcp', '--repo', absRoot] };\n\n const ignorePath = path.join(absRoot, '.gitignore');\n const ignore = fs.existsSync(ignorePath) ? fs.readFileSync(ignorePath, 'utf8') : '';\n if (!ignore.split(/\\r?\\n/).some((line) => ['.coord/', '/.coord/'].includes(line.trim()))) {\n add('.gitignore', ignore + (ignore && !ignore.endsWith('\\n') ? '\\n' : '') + '\\n# Kith local state and worktrees\\n.coord/\\n');\n }\n\n if (selected.has('claude')) {\n const settings = readConfig(path.join(absRoot, '.claude/settings.json'));\n const hooks = object(settings.hooks ?? {}, 'Claude hooks');\n if (mcpOnly && ['PreToolUse', 'PostToolUse'].some(event => Array.isArray(hooks[event]) && hooks[event].length)) {\n warnings.push('Existing Claude tool hooks preserved. Review whether they require inherited KITH credentials; --mcp-only does not disable guards.');\n }\n for (const [event, phase] of (mcpOnly ? [] : [['PreToolUse', 'pre'], ['PostToolUse', 'post']]) as Array<['PreToolUse' | 'PostToolUse', 'pre' | 'post']>) {\n const entries = hooks[event] ?? [];\n if (!Array.isArray(entries)) throw new Error(`Claude hooks.${event} must be an array.`);\n const baseCommand = `${hookCommand} ${phase}`;\n const command = baseCommand + modeArg;\n const owned = (value: unknown) => typeof value === 'string' && [baseCommand, ...['block', 'warn', 'off'].map(m => `${baseCommand} --enforcement ${m}`)].includes(value);\n const exists = entries.some((entry) => {\n if (!entry || typeof entry !== 'object' || !Array.isArray(entry.hooks)) return false;\n return entry.hooks.some((hook: { command?: string } | null) => owned(hook?.command));\n });\n hooks[event] = exists ? entries.map((entry) => {\n if (!entry || typeof entry !== 'object' || !Array.isArray(entry.hooks)) return entry;\n return { ...entry, hooks: entry.hooks.map((hook: { command?: string } | null) =>\n owned(hook?.command) ? { ...hook, command, ...(event === 'PreToolUse' ? { onFailure: 'block' } : {}) } : hook) };\n }) : [...entries, {\n matcher: 'Edit|Write|MultiEdit|NotebookEdit|Bash',\n hooks: [{ type: 'command', command, ...(event === 'PreToolUse' ? { onFailure: 'block' } : {}) }],\n }];\n }\n if (!mcpOnly) { settings.hooks = hooks; json('.claude/settings.json', settings); }\n const mcp = readConfig(path.join(absRoot, '.mcp.json'));\n mcp.mcpServers = { ...object(mcp.mcpServers ?? {}, 'Claude MCP servers'), kith: server };\n json('.mcp.json', mcp);\n }\n if (selected.has('codex')) {\n const file = path.join(absRoot, '.codex/config.toml');\n const original = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';\n let config: Record<string, unknown>;\n try { config = parseToml(original); }\n catch { throw new Error(`Cannot read ${file}: invalid TOML. No configuration was written.`); }\n const servers = object(config.mcp_servers ?? {}, 'Codex MCP servers');\n if (Object.hasOwn(servers, 'kith')) {\n // Preserve custom transports, approvals and environment settings byte for byte.\n const existing = object(servers.kith, 'Codex Kith MCP server');\n if (existing.command !== server.command || JSON.stringify(existing.args) !== JSON.stringify(server.args) ||\n !['KITH_AGENT_ID', 'KITH_SESSION_TOKEN'].every((name) => Array.isArray(existing.env_vars) && existing.env_vars.includes(name))) {\n warnings.push('Existing Codex kith server preserved. Review its command/args and forward KITH_AGENT_ID and KITH_SESSION_TOKEN using env_vars.');\n }\n } else {\n const addition = stringifyToml({ mcp_servers: { kith: {\n ...server, env_vars: ['KITH_AGENT_ID', 'KITH_SESSION_TOKEN'],\n } } });\n const content = original + (original && !original.endsWith('\\n') ? '\\n' : '') + '\\n# Kith local coordination\\n' + addition;\n parseToml(content); // Validate the complete append before any configuration is written.\n add('.codex/config.toml', content);\n }\n }\n if (selected.has('cursor')) {\n const mcp = readConfig(path.join(absRoot, '.cursor/mcp.json'));\n mcp.mcpServers = { ...object(mcp.mcpServers ?? {}, 'Cursor MCP servers'), kith: server };\n json('.cursor/mcp.json', mcp);\n const existingCursorHooks = readConfig(path.join(absRoot, '.cursor/hooks.json'));\n if(mcpOnly && ['preToolUse','postToolUse'].some(event=>Array.isArray((existingCursorHooks.hooks as Record<string,unknown>)?.[event])&&((existingCursorHooks.hooks as Record<string,unknown>)[event] as unknown[]).length)) warnings.push('Existing Cursor hooks preserved; review their inherited session requirements.');\n if (!mcpOnly) {\n const config = existingCursorHooks;\n if (config.version !== undefined && config.version !== 1) throw new Error('Unsupported Cursor hooks version; no configuration was written.');\n const hooks = object(config.hooks ?? {}, 'Cursor hooks');\n for (const [event, phase] of [['preToolUse', 'pre'], ['postToolUse', 'post']] as const) {\n const entries = hooks[event] ?? [];\n if (!Array.isArray(entries)) throw new Error(`Cursor hooks.${event} must be an array.`);\n const baseCommand = `${hookCommand} ${phase} --client cursor`;\n const owned = (value: unknown) => typeof value === 'string' && [baseCommand, ...['block', 'warn', 'off'].map(m => `${baseCommand} --enforcement ${m}`)].includes(value);\n const entry = { command: baseCommand + modeArg, matcher: 'Shell|Write|Delete', ...(phase === 'pre' ? { failClosed: true } : {}) };\n const exists = entries.some(e => e && typeof e === 'object' && owned(e.command));\n hooks[event] = exists ? entries.map(e => e && typeof e === 'object' && owned(e.command) ? { ...e, ...entry } : e) : [...entries, entry];\n }\n json('.cursor/hooks.json', { ...config, version: 1, hooks });\n }\n }\n if (selected.has('agents')) {\n const file = path.join(absRoot, 'AGENTS.md');\n let content = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '# Repository Agent Instructions\\n';\n const block = `<!-- KITH:START -->\n## Parallel Agent Coordination (kith)\n\nInstruction protocol: ${KITH_PROTOCOL_VERSION}.\n\nUse Kith MCP to claim work, isolate changes in worktrees, share local resources and verify integration. Keep one isolated worktree per parallel agent and keep the owning MCP connection open.\n\n1. Call \\`kith_begin_work\\` with a unique \\`agentId\\`, an explicit \\`scopeGlobs\\` array and \\`isolateWorktree: true\\`.\n2. Edit only the returned \\`worktree.worktreePath\\`. Report changed files through \\`kith_record_file_edit\\` on that connection.\n3. Run serialized commands with \\`kith_run_with_mutex\\`: pass a literal executable/argument array. Its cwd defaults to the registered worktree. Commands run with server permissions and require client approval.\n4. Renew idle sessions with \\`kith_heartbeat\\` before their lease expires (every two minutes for the default five-minute lease; sooner for a shorter lease). Inspect \\`kith_get_status\\`.\n5. Complete with \\`kith_complete_work\\` and a project-specific \\`verificationCmd\\`. Failed verification keeps the integration target unchanged. Successful worktrees are retained for inspection.\n\nThe MCP connection retains its capability; do not copy or log session tokens. A new connection needs a valid capability to resume an existing ID. Locks coordinate cooperating writers; hooks are not an OS security sandbox.\n\nIf Claude/Cursor edit hooks or CLI commands are also enabled, launch the client from a persistent shell after \\`eval \"$(kith session start --agent <id> --owner-pid \"$$\" --shell)\"\\`. CLI, hooks and MCP must inherit the same KITH_AGENT_ID/KITH_SESSION_TOKEN and use the same agent ID. Separate stateless shell calls do not preserve these exports or the owning shell. MCP-only setup skips new native edit hooks and preserves existing ones.\n<!-- KITH:END -->`;\n if (content.includes('<!-- KITH:START -->') !== content.includes('<!-- KITH:END -->')) {\n throw new Error('AGENTS.md has an incomplete Kith block. Repair it before running init.');\n }\n content = content.includes('<!-- KITH:START -->')\n ? content.replace(/<!-- KITH:START -->[\\s\\S]*?<!-- KITH:END -->/, () => block)\n : content.trimEnd() + '\\n\\n' + block + '\\n';\n add('AGENTS.md', content);\n add('.agent/skills/kith/SKILL.md', '---\\nname: kith\\ndescription: Coordinate parallel coding work through Kith MCP and isolated worktrees.\\n---\\n\\nPrefer the Kith MCP tools on one persistent connection. Begin with kith_begin_work using a unique agentId, explicit scopeGlobs and isolateWorktree:true. Edit the returned worktreePath, report files with kith_record_file_edit, run literal command arrays with kith_run_with_mutex, heartbeat before expiry and finish with kith_complete_work plus a project verificationCmd. Inspect kith_get_status. Keep capabilities private. If CLI or native hooks are enabled, first launch the client from a persistent shell with the same KITH_AGENT_ID/KITH_SESSION_TOKEN and --owner-pid \"$$\". Stateless shell calls cannot retain that setup. Locks require cooperating clients.\\n');\n }\n if (selected.has('git')) {\n try {\n const hooksDir = execFileSync('git', ['rev-parse', '--path-format=absolute', '--git-path', 'hooks'], {\n cwd: absRoot, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'],\n }).trim();\n const hook = path.join(hooksDir, 'pre-commit');\n const physicalHooks = fs.existsSync(hooksDir) ? fs.realpathSync(hooksDir) : hooksDir;\n const relativeHooks = path.relative(fs.realpathSync(absRoot), physicalHooks);\n if (relativeHooks === '..' || relativeHooks.startsWith('..' + path.sep) || path.isAbsolute(relativeHooks)) {\n warnings.push('Git hook skipped: hooks directory is outside this repository. Integrate the guard manually.');\n } else {\n const script = (arg: string) => `#!/usr/bin/env sh\\n# Kith coordination guard\\nexec ${hookCommand} pre-commit${arg}\\n`;\n const existing = fs.existsSync(hook) ? fs.readFileSync(hook, 'utf8') : null;\n if (existing === null || ['', ...['block', 'warn', 'off'].map(m => ` --enforcement ${m}`)].some(arg => existing === script(arg))) {\n add(hook, script(modeArg), 0o755);\n } else warnings.push('Existing pre-commit hook preserved; add `kith hook pre-commit` to your hook manager if needed.');\n }\n } catch {\n warnings.push('Git hook skipped: this directory is not a Git worktree.');\n }\n }\n if (selected.has('shims')) {\n for (const manager of ['npm', 'pnpm', 'yarn']) {\n // Remove this shim directory before resolving either kith or the real package manager.\n add(`.coord/bin/${manager}`, `#!/usr/bin/env sh\nshim_dir=$(CDPATH= cd -- \"$(dirname -- \"$0\")\" && pwd)\nkith_path=\nold_ifs=$IFS\nIFS=:\nfor entry in $PATH; do\n [ \"$entry\" = \"$shim_dir\" ] && continue\n if [ -z \"$kith_path\" ]; then kith_path=$entry; else kith_path=\"$kith_path:$entry\"; fi\ndone\nIFS=$old_ifs\nPATH=$kith_path\nexport PATH\ncase \"$1\" in\n install|i|add|remove|ci)\n if [ \"\\${KITH_PACKAGE_INSTALL_GUARDED:-}\" = 1 ]; then exec ${manager} \"$@\"; fi\n exec ${cliBinaryCommand} --repo ${shellQuote(absRoot)} mutex --agent \"\\${KITH_AGENT_ID:-shim-$$}\" --name package-install -- ${manager} \"$@\"\n ;;\n *) exec ${manager} \"$@\" ;;\nesac\n`, 0o755);\n }\n }\n const report: InitReport = {\n repoRoot: absRoot, indexedFiles: 0, configuredFiles: [...plan.keys()],\n dryRun: options.dryRun ?? false, warnings,\n };\n if (report.dryRun) return report;\n const engine = new KithEngine(absRoot);\n try {\n if(plan.size) applySetupPlan(absRoot, engine.coordDb.coordDir, plan, warnings);\n report.indexedFiles = engine.depGraph.indexRepositoryFiles(absRoot);\n } finally {\n engine.close();\n }\n return report;\n}\n","#!/usr/bin/env node\nimport { KITH_VERSION } from '../version.js';\nimport { uninstallKith } from './setup-ledger.js';\nimport { doctorReport } from './doctor.js';\nimport { readCoordinationState, recoveryReport } from '../core/observation.js';\nimport { SessionOwnershipError } from '../core/fencing.js';\nimport { KithEngine } from '../core/engine.js';\nimport { runKithMcpStdioServer } from '../mcp/server.js';\nimport { enforcementMode, HookHandler } from './hook-handler.js';\nimport { INTEGRATIONS, Integration, initializeKithRepository } from './init.js';\n\nfunction parseFlags(argv: string[]): {\n positional: string[];\n flags: Record<string, string | boolean>;\n passthroughCmd: string[];\n} {\n const dashDashIdx = argv.indexOf('--');\n const mainArgs = dashDashIdx >= 0 ? argv.slice(0, dashDashIdx) : argv;\n const passthroughCmd = dashDashIdx >= 0 ? argv.slice(dashDashIdx + 1) : [];\n\n const positional: string[] = [];\n const flags: Record<string, string | boolean> = {};\n\n for (let i = 0; i < mainArgs.length; i++) {\n const arg = mainArgs[i];\n if (arg.startsWith('--')) {\n const eqIdx = arg.indexOf('=');\n if (eqIdx >= 0) {\n flags[arg.slice(2, eqIdx)] = arg.slice(eqIdx + 1);\n } else {\n const key = arg.slice(2);\n const next = mainArgs[i + 1];\n if (!['worktree', 'raw', 'dry-run', 'help', 'version', 'shell', 'new', 'mcp-only', 'offline'].includes(key) && next && !next.startsWith('--')) {\n flags[key] = next;\n i++;\n } else {\n flags[key] = true;\n }\n }\n } else {\n positional.push(arg);\n }\n }\n\n return { positional, flags, passthroughCmd };\n}\n\nasync function main(): Promise<void> {\n const { positional, flags, passthroughCmd } = parseFlags(process.argv.slice(2));\n const cmd = positional[0] ?? 'help';\n const subCmd = positional[1];\n const repoRoot = typeof flags.repo === 'string' ? flags.repo : process.cwd();\n\n if (flags.version || cmd === 'version') { console.log(KITH_VERSION); return; }\n if (flags.help || cmd === 'help') { printHelp(); return; }\n\n if (cmd === 'init') {\n const integrations = typeof flags.only === 'string' ? flags.only.split(',') : undefined;\n if (integrations?.some((name) => !INTEGRATIONS.includes(name as Integration))) {\n throw new Error(`--only accepts: ${INTEGRATIONS.join(', ')}`);\n }\n const report = initializeKithRepository(repoRoot, 'kith', {\n enforcement: enforcementMode(flags.enforcement), dryRun: Boolean(flags['dry-run']), mcpOnly: flags['mcp-only'] ? true : undefined, integrations: integrations as Integration[] | undefined,\n });\n console.log(JSON.stringify({ ok: true, ...report }, null, 2));\n return;\n }\n\n if (cmd === 'mcp') {\n await runKithMcpStdioServer(repoRoot);\n return;\n }\n\n if (cmd === 'uninstall') { const report=uninstallKith(repoRoot,Boolean(flags['dry-run'])); console.log(JSON.stringify(report,null,2)); process.exitCode=report.ok?0:1; return; }\n\n if (cmd === 'doctor') { const report=doctorReport(repoRoot); console.log(JSON.stringify(report,null,2)); process.exitCode=report.ok?0:1; return; }\n\n if (cmd === 'recover' || cmd === 'status' && flags.offline) {\n const state = cmd === 'recover' ? recoveryReport(repoRoot) : readCoordinationState(repoRoot);\n console.log(JSON.stringify(state,null,2)); process.exitCode = state.state === 'unavailable' ? 1 : 0; return;\n }\n\n const commands = ['session', 'status', 'begin', 'complete', 'heartbeat', 'task', 'lock', 'contract', 'worktree', 'port', 'mutex', 'hook'];\n if (!commands.includes(cmd)) throw new Error(`Unknown command '${cmd}'. Run kith help.`);\n const subcommands: Record<string, string[]> = {\n session: ['start', 'end'],\n task: ['add', 'claim', 'list'], lock: ['acquire', 'release', 'list'],\n contract: ['publish', 'list'], worktree: ['spawn', 'remove', 'list', 'preview'],\n hook: ['pre', 'post', 'pre-commit'],\n };\n if (subcommands[cmd] && (!subCmd || !subcommands[cmd].includes(subCmd))) {\n throw new Error(`Expected kith ${cmd} ${subcommands[cmd].join('|')}`);\n }\n const engine = new KithEngine(repoRoot);\n const agentId = String(flags.agent ?? process.env.KITH_AGENT_ID ?? `cli-${process.pid}`);\n const sessionToken = cmd === 'session' && subCmd === 'start' && flags.new ? undefined : typeof flags['session-token'] === 'string' ? flags['session-token']\n : (!process.env.KITH_AGENT_ID || process.env.KITH_AGENT_ID === agentId) ? process.env.KITH_SESSION_TOKEN : undefined;\n const authorize = () => {\n if (!sessionToken) throw new SessionOwnershipError(agentId);\n engine.fencing.resumeSession(agentId, sessionToken);\n };\n const register = () => engine.fencing.registerAgent({ id: agentId,\n client: String(flags.client ?? 'cli'), pid: typeof flags['owner-pid'] === 'string' ? Number(flags['owner-pid'])\n : cmd === 'mutex' && !sessionToken ? process.pid : process.ppid,\n sessionToken, leaseDurationMs: typeof flags['lease-ms'] === 'string' ? Number(flags['lease-ms']) : undefined,\n });\n try {\n if (cmd === 'session') {\n if (subCmd === 'end') {\n authorize(); engine.fencing.abandonAgentSession(agentId);\n console.log(JSON.stringify({ ok: true })); return;\n }\n if (flags.shell && typeof flags['owner-pid'] !== 'string') {\n throw new Error('Shell exports require --owner-pid \"$$\" so command substitution cannot anchor the session to a transient subshell.');\n }\n const session = register();\n if (flags.shell) {\n const quote = (value: string) => \"'\" + value.replace(/'/g, \"'\\\\''\") + \"'\";\n console.log(`export KITH_AGENT_ID=${quote(agentId)}\\nexport KITH_SESSION_TOKEN=${quote(session.sessionToken)}`);\n } else console.log(JSON.stringify(session, null, 2));\n return;\n }\n if (cmd === 'heartbeat') {\n authorize();\n if (!engine.fencing.heartbeat(agentId)) throw new Error('Active --agent <id> required');\n console.log(JSON.stringify({ ok: true, agent: engine.fencing.getAgent(agentId) }, null, 2));\n return;\n }\n\n if (cmd === 'status') {\n const state = engine.getStatus();\n console.log(JSON.stringify(state, null, 2));\n return;\n }\n\n if (cmd === 'begin') {\n const title = String(flags.title ?? flags.intent ?? 'Active work');\n const scopeRaw = typeof flags.scope === 'string' ? flags.scope : '';\n const scopeGlobs = scopeRaw ? scopeRaw.split(',').map((s) => s.trim()) : ['**'];\n\n const session = register();\n\n const res = engine.beginWork({\n agentId,\n title,\n intentSummary: typeof flags.summary === 'string' ? flags.summary : title,\n scopeGlobs,\n isolateWorktree: Boolean(flags.worktree),\n });\n\n console.log(JSON.stringify({ ...res, sessionToken: session.sessionToken }, null, 2));\n process.exitCode = res.ok ? 0 : 1;\n return;\n }\n\n if (cmd === 'complete') {\n authorize();\n const result = engine.completeWork({\n agentId, mergeBranch: typeof flags.merge === 'string' ? flags.merge : undefined,\n verificationCmd: typeof flags.verify === 'string' ? flags.verify : undefined,\n });\n (result.ok ? console.log : console.error)(JSON.stringify(result, null, 2));\n process.exitCode = result.ok ? 0 : 1;\n return;\n }\n\n if (cmd === 'task') {\n if (subCmd === 'add') {\n const title = String(flags.title ?? 'Task');\n const dependsOn =\n typeof flags['depends-on'] === 'string'\n ? flags['depends-on'].split(',').map((s) => s.trim())\n : [];\n const scopeGlobs =\n typeof flags.scope === 'string'\n ? flags.scope.split(',').map((s) => s.trim())\n : [];\n const priority = typeof flags.priority === 'string' ? Number(flags.priority) : 10;\n const task = engine.intents.addTask({\n id: typeof flags.id === 'string' ? flags.id : undefined,\n title,\n dependsOn,\n scopeGlobs,\n priority,\n });\n console.log(JSON.stringify({ ok: true, task }, null, 2));\n return;\n }\n if (subCmd === 'claim') {\n const session = register();\n const res = engine.intents.claimNextTask(agentId);\n console.log(JSON.stringify({ ...res, sessionToken: session.sessionToken }, null, 2));\n process.exitCode = res.claimed ? 0 : 1;\n return;\n }\n console.log(JSON.stringify(engine.intents.listTasks(), null, 2));\n return;\n }\n\n if (cmd === 'lock') {\n if (subCmd === 'acquire') {\n const patterns = String(flags.patterns ?? flags.scope ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n const session = register();\n const res = engine.locks.acquireLocks({ agentId, patterns });\n console.log(JSON.stringify({ ...res, sessionToken: session.sessionToken }, null, 2));\n process.exitCode = res.ok ? 0 : 1;\n return;\n }\n if (subCmd === 'release') {\n authorize();\n const released = engine.locks.releaseLocks({ agentId });\n console.log(JSON.stringify({ ok: true, released }, null, 2));\n return;\n }\n console.log(JSON.stringify(engine.locks.listLocks(), null, 2));\n return;\n }\n\n if (cmd === 'contract') {\n if (subCmd === 'publish') {\n authorize();\n const contract = engine.depGraph.publishExplicitContract({\n agentId,\n filePath: String(flags.file ?? 'unknown'),\n symbolName: String(flags.symbol ?? 'unknown'),\n kind: (flags.kind as 'function') ?? 'function',\n signature: String(flags.signature ?? ''),\n });\n console.log(JSON.stringify({ ok: true, contract }, null, 2));\n return;\n }\n console.log(JSON.stringify(engine.depGraph.listContracts(), null, 2));\n return;\n }\n\n if (cmd === 'worktree') {\n if (subCmd === 'preview') { authorize(); const result=engine.previewIntegration(agentId); console.log(JSON.stringify(result,null,2)); process.exitCode=result.ok && result.clean ? 0 : 1; return; }\n if (subCmd === 'spawn') {\n const session = register();\n const wt = engine.worktrees.spawnWorktree({\n agentId,\n branch: typeof flags.branch === 'string' ? flags.branch : undefined,\n });\n console.log(JSON.stringify({ ok: true, worktree: wt, sessionToken: session.sessionToken }, null, 2));\n return;\n }\n if (subCmd === 'remove') {\n authorize();\n engine.worktrees.removeWorktree(agentId);\n console.log(JSON.stringify({ ok: true }, null, 2));\n return;\n }\n console.log(JSON.stringify(engine.worktrees.listWorktrees(), null, 2));\n return;\n }\n\n if (cmd === 'port') {\n const serviceName = String(flags.service ?? flags.name ?? 'web');\n const basePort = typeof flags.base === 'string' ? Number(flags.base) : 3100;\n const session = register();\n const res = await engine.broker.acquirePort({ agentId, serviceName, basePort });\n if (flags.raw) {\n console.log(res.port);\n } else {\n console.log(JSON.stringify({ ...res, sessionToken: session.sessionToken }, null, 2));\n }\n return;\n }\n\n if (cmd === 'mutex') {\n const mutexName = String(flags.name ?? 'default-mutex');\n const commandToRun = passthroughCmd.length ? passthroughCmd : String(flags.cmd ?? '');\n if (!commandToRun) {\n console.error('Error: provide a command after `--` for `kith mutex`');\n process.exitCode = 1;\n return;\n }\n register();\n const controller = new AbortController();\n let interrupted: NodeJS.Signals | undefined;\n const interrupt = (signal: NodeJS.Signals) => { interrupted = signal; controller.abort(); };\n const sigint = () => interrupt('SIGINT');\n const sigterm = () => interrupt('SIGTERM');\n process.on('SIGINT', sigint); process.on('SIGTERM', sigterm);\n try {\n const res = await engine.broker.executeWithMutex({\n agentId, mutexName, command: commandToRun, signal: controller.signal,\n leaseDurationMs: typeof flags['lease-ms'] === 'string' ? Number(flags['lease-ms']) : undefined,\n timeoutMs: typeof flags['wait-ms'] === 'string' ? Number(flags['wait-ms']) : undefined,\n commandTimeoutMs: typeof flags['timeout-ms'] === 'string' ? Number(flags['timeout-ms']) : undefined,\n onStdout: (chunk) => process.stdout.write(chunk), onStderr: (chunk) => process.stderr.write(chunk),\n });\n process.exitCode = res.exitCode;\n } catch (err) {\n if (interrupted) process.exitCode = interrupted === 'SIGINT' ? 130 : 143;\n else throw err;\n } finally {\n process.off('SIGINT', sigint); process.off('SIGTERM', sigterm);\n if (!sessionToken) {\n try { engine.fencing.completeAgentSession(agentId); }\n catch (err) { if (!(err instanceof SessionOwnershipError)) throw err; }\n }\n }\n return;\n }\n\n if (cmd === 'hook') {\n const handler = new HookHandler(engine, enforcementMode(flags.enforcement));\n const stdinPayload = HookHandler.readJsonStdinSync();\n const agentId = HookHandler.resolveAgentId(\n stdinPayload,\n typeof flags.agent === 'string' ? flags.agent : undefined\n );\n if (!sessionToken) throw new SessionOwnershipError(agentId);\n engine.fencing.resumeSession(agentId, sessionToken);\n const toolName = String(\n flags.tool ?? stdinPayload?.tool_name ?? 'Edit'\n );\n const filePath =\n typeof flags.file === 'string'\n ? flags.file\n : stdinPayload?.tool_input?.file_path ??\n stdinPayload?.tool_input?.notebook_path ??\n stdinPayload?.tool_input?.target_file ??\n stdinPayload?.tool_input?.path;\n const command =\n typeof flags.cmd === 'string'\n ? flags.cmd\n : stdinPayload?.tool_input?.command;\n\n if (subCmd === 'pre') {\n const res = handler.handlePreToolUse({\n agentId,\n toolName,\n filePath,\n command,\n });\n if (flags.client === 'cursor') {\n console.log(JSON.stringify({ permission: res.allowed ? 'allow' : 'deny', ...(res.message ? { user_message: res.message, agent_message: res.message } : {}) }));\n } else if (!res.allowed) console.error(res.message);\n else if (res.message) console.log(JSON.stringify({ hookSpecificOutput: { hookEventName: 'PreToolUse', additionalContext: res.message } }));\n process.exitCode = res.exitCode;\n return;\n }\n\n if (subCmd === 'post') {\n const res = handler.handlePostToolUse({\n agentId,\n toolName,\n filePath,\n command,\n });\n if (flags.client === 'cursor') {\n console.log(JSON.stringify({ additional_context: [...res.warnings, res.deltaFooter].filter(Boolean).join('\\n') }));\n process.exitCode = res.exitCode;\n return;\n }\n if (res.warnings.length > 0 || res.deltaFooter) {\n const msg = [...res.warnings, res.deltaFooter].filter(Boolean).join('\\n');\n if (!res.allowed) {\n console.error(msg);\n } else {\n console.log(\n JSON.stringify({\n systemMessage: msg,\n hookSpecificOutput: { hookEventName: 'PostToolUse', additionalContext: msg },\n })\n );\n }\n }\n process.exitCode = res.exitCode;\n return;\n }\n\n if (subCmd === 'pre-commit') {\n const res = handler.handleGitPreCommit(agentId, process.cwd());\n if (res.violations.length) {\n console.error(\n `[KITH GIT PRE-COMMIT ${res.allowed ? 'WARNING' : 'GUARD'}] Files claimed by sibling agents:\\n` +\n res.violations.map((v) => ` - ${v}`).join('\\n')\n );\n }\n process.exitCode = res.exitCode;\n return;\n }\n }\n } finally {\n engine.close();\n }\n}\n\nfunction printHelp(): void {\n console.log(`Kith (v${KITH_VERSION}) — Local coordination for coding agents\n\nClaim work, isolate changes with worktrees, share local resources, and verify integration.\nNo hosted service required.\n\nUsage:\n kith session start --agent <id> --owner-pid <pid> [--shell] Create or resume a capability-owned session\\n kith init Configure MCP clients (--dry-run, --only, --mcp-only)\n kith heartbeat --agent <id> Refresh the owned session lease\n kith status [--offline] Output JSON state and workspaces; offline never migrates or reaps\\n kith uninstall [--dry-run] Restore unchanged tracked setup files; retain work and recovery state\\n kith doctor Check runtime, PATH, configuration, sessions and worktree health without writes\\n kith recover Inspect retained work, expired claims and recovery records offline\n kith mcp Start stdio MCP server\n kith begin --agent <id> --title <t> --scope <g> Declare intent, check overlaps, lock scope\n kith complete --agent <id> [--merge <branch>] Run Speculative Merge Train & release locks\n kith task add|claim|list Manage orchestrated DAG task queue\n kith lock acquire|release|list Manage fencing-token file/glob locks\n kith contract publish|list Manage Contract Blackboard\n kith worktree spawn|remove|list|preview Manage isolated Git worktrees\n kith port --agent <id> --service <name> Lease collision-free TCP port\n kith mutex --agent <id> --name <m> -- <cmd> Serialize commands via mutex\n kith hook pre|post|pre-commit Tool & git hook handlers\n`);\n}\n\nmain().catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n const args = process.argv.slice(2);\n process.exitCode = args.includes('hook') && args.includes('pre') ? 2 : 1;\n});\n"],"mappings":"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","names":["fs","path","git","path","fs","fs","path","execFileSync","fs","path","createRequire","fs","path","require","fs","path","execFileSync","execFileSync","DatabaseSync","createRequire","path","fs","lock","execFileSync","path","fs","execFileSync","crypto","fs","path","epoch","fs","path","crypto","fs","path","crypto","fs","path","crypto","fs","path","path","fs","crypto","lock","crypto","path","fs","fs","crypto","now","crypto","fs","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","fs","path","execFileSync","fs","agent","deltaFooter","execFileSync","fs","execFileSync","fs","path","fileURLToPath","parseToml","fs","mode","path","fileURLToPath","parseToml","execFileSync","agentId"]}
|
|
1
|
+
{"version":3,"sources":["../../src/version.ts","../../src/cli/setup-ledger.ts","../../src/core/repository.ts","../../src/cli/doctor.ts","../../src/core/observation.ts","../../src/core/db.ts","../../src/core/workspace-observation.ts","../../src/core/fencing.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/broker.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/mcp/server.ts","../../src/cli/hook-handler.ts","../../src/cli/init.ts","../../src/cli/index.ts"],"sourcesContent":["export const KITH_VERSION = '0.1.2';\nexport const KITH_PROTOCOL_VERSION = '1.1.0';\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport { discoverRepository, isWithin, physicalPath } from '../core/repository.js';\ntype Plan = Map<string,{content:string;mode?:number}>;\ninterface Entry { before:string|null; after:string; beforeMode:number|null; afterMode:number; drifted?:boolean }\ninterface Ledger { version:1; root:string; files:Record<string,Entry> }\nfunction location(root:string,name:string) {\n if(path.isAbsolute(name)||name.startsWith('.coord'+path.sep)&&!/^\\.coord[\\/]bin[\\/](npm|pnpm|yarn)$/.test(name))throw new Error('Invalid setup ledger path');\n const target=path.resolve(root,name);\n if(!isWithin(root,target)||target===root||physicalPath(target)!==target)throw new Error(`Setup path is redirected or outside repository: ${name}`);\n return target;\n}\nfunction ledgerFile(root:string,coordDir:string) {\n const dir=path.join(coordDir,'setup');\n if(physicalPath(coordDir)!==coordDir||physicalPath(dir)!==dir)throw new Error('Setup state is redirected');\n const file = path.join(dir,crypto.createHash('sha256').update(root).digest('hex')+'.json');\n if (physicalPath(file) !== file) throw new Error('Setup ledger is redirected');\n return file;\n}\nfunction read(root:string,coordDir:string):Ledger {\n const file=ledgerFile(root,coordDir);\n if(!fs.existsSync(file))return {version:1,root,files:{}};\n const value=JSON.parse(fs.readFileSync(file,'utf8')) as Ledger;\n if(value.version!==1||value.root!==root||!value.files||typeof value.files!=='object'||Array.isArray(value.files))throw new Error('Unsupported setup ledger; preserve it before manual repair');\n for(const [name,entry] of Object.entries(value.files)) {\n location(root,name);\n if(!entry||typeof entry.after!=='string'||entry.before!==null&&typeof entry.before!=='string'||![entry.after,entry.before].every(v=>v===null||Buffer.from(v,'base64').toString('base64')===v)||![entry.afterMode,entry.beforeMode].every(v=>v===null||Number.isInteger(v)&&v>=0&&v<=0o777)||(entry.before===null)!==(entry.beforeMode===null))throw new Error('Damaged setup ledger; preserve it before manual repair');\n }\n return value;\n}\nfunction persist(root:string,coordDir:string,ledger:Ledger) {\n const file=ledgerFile(root,coordDir),temp=file+'.'+crypto.randomBytes(6).toString('hex')+'.tmp';\n fs.mkdirSync(path.dirname(file),{recursive:true,mode:0o700});\n const fd=fs.openSync(temp,'wx',0o600);\n try {fs.writeFileSync(fd,JSON.stringify(ledger,null,2)+'\\n');fs.fsyncSync(fd);}finally{fs.closeSync(fd);}\n fs.renameSync(temp,file);\n // Node cannot open directory handles for fsync on Windows; the backup file itself is flushed above.\n for (const parent of process.platform === 'win32' ? [] : [path.dirname(file), coordDir]) {\n const dir=fs.openSync(parent,'r');try{fs.fsyncSync(dir);}finally{fs.closeSync(dir);}\n }\n}\nfunction lock(coordDir:string) {\n const file=path.join(coordDir,'setup.lock'),fd=fs.openSync(file,'wx',0o600);\n fs.writeFileSync(fd,JSON.stringify({pid:process.pid}));\n return ()=>{fs.closeSync(fd);fs.unlinkSync(file);};\n}\n/** Backups are private, persisted before client writes, and never interpreted as commands. */\nexport function applySetupPlan(root:string,coordDir:string,plan:Plan,warnings:string[]) {\n const release=lock(coordDir);\n try {\n const ledger=read(root,coordDir);\n const observed = new Map<string, { bytes: string|null; mode: number|null }>();\n for(const [name,planned] of plan) {\n const relative=path.relative(root,path.isAbsolute(name)?name:path.join(root,name));\n const target=location(root,relative),exists=fs.existsSync(target),current=exists?fs.readFileSync(target).toString('base64'):null;\n const mode=exists?fs.statSync(target).mode&0o777:null,previous=ledger.files[relative];\n observed.set(relative, {bytes:current, mode});\n if(previous&&(previous.drifted||previous.after!==current||previous.afterMode!==mode)) {\n previous.drifted=true;warnings.push(`User changes in ${relative} will be preserved by uninstall; review that file manually.`);\n } else ledger.files[relative]={before:previous?previous.before:current,after:Buffer.from(planned.content).toString('base64'),beforeMode:previous?previous.beforeMode:mode,\n afterMode:mode??(process.platform === 'win32' ? 0o666 : ((planned.mode??0o666)&~process.umask()))};\n }\n persist(root,coordDir,ledger);\n for(const [name,planned] of plan) {\n const relative=path.relative(root,path.isAbsolute(name)?name:path.join(root,name)),target=location(root,relative);\n const snapshot = observed.get(relative)!;\n const current = fs.existsSync(target) ? fs.readFileSync(target).toString('base64') : null;\n const mode = fs.existsSync(target) ? fs.statSync(target).mode & 0o777 : null;\n if (current !== snapshot.bytes || mode !== snapshot.mode) throw new Error(`Configuration changed during setup: ${relative}; preserve the setup ledger before retrying`);\n fs.mkdirSync(path.dirname(target),{recursive:true});fs.writeFileSync(target,planned.content,{encoding:'utf8',mode:planned.mode});\n }\n }finally{release();}\n}\n\n/** Restore only exact recorded Kith writes. Leave database, recovery copies, ignored-state rule and edited files intact. */\nexport function uninstallKith(directory=process.cwd(),dryRun=false) {\n const layout=discoverRepository(directory),root=layout.checkoutRoot;\n if(physicalPath(layout.coordDir)!==layout.coordDir)throw new Error('Coordination directory is redirected');\n const report={ok:true,dryRun,restored:[] as string[],removed:[] as string[],needsReview:[] as string[],retained:[layout.coordDir,'.gitignore']};\n if(!fs.existsSync(layout.coordDir))return report;\n const release=dryRun?()=>{}:lock(layout.coordDir);\n try {\n const ledger=read(root,layout.coordDir);\n for(const [name,entry] of Object.entries(ledger.files)) {\n if(name==='.gitignore')continue;\n const target=location(root,name),current=fs.existsSync(target)?fs.readFileSync(target).toString('base64'):null;\n if(current===entry.before){if(!dryRun)delete ledger.files[name];continue;}\n if(entry.drifted||current!==entry.after||!fs.existsSync(target)||(fs.statSync(target).mode&0o777)!==entry.afterMode){report.needsReview.push(name);continue;}\n if(entry.before===null){report.removed.push(name);if(!dryRun)fs.unlinkSync(target);}\n else {report.restored.push(name);if(!dryRun){fs.writeFileSync(target,Buffer.from(entry.before,'base64'));fs.chmodSync(target,entry.beforeMode!);}}\n if(!dryRun)delete ledger.files[name];\n }\n report.ok=report.needsReview.length===0;\n if(!dryRun)persist(root,layout.coordDir,ledger);\n return report;\n }finally{release();}\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 fs from 'node:fs';\nimport path from 'node:path';\nimport { execFileSync } from 'node:child_process';\nimport { parse as parseToml } from 'smol-toml';\nimport { isWithin, physicalPath } from '../core/repository.js';\nimport { readCoordinationState } from '../core/observation.js';\n\n/** Diagnostics read files and inspect a snapshot; they never initialize state, trust projects, install packages or run configured hooks. */\nexport function doctorReport(directory=process.cwd()) {\n const state=readCoordinationState(directory), root=state.repository.root;\n const checks: Array<{name:string;ok:boolean;detail:string}>=[];\n const check=(name:string,ok:boolean,detail:string)=>checks.push({name,ok,detail});\n const [major,minor]=process.versions.node.split('.').map(Number);\n check('node',major===22 && minor>=13 || major>=24,process.version);\n check('platform',process.platform==='darwin'||process.platform==='linux',process.platform==='win32'?'Native Windows is limited to MCP coordination; supervised mutex commands and shell hooks require macOS/Linux or WSL':process.platform);\n try {\n const version=execFileSync('git',['--version'],{encoding:'utf8',timeout:2000}).trim();\n const parts=/\\b(\\d+)\\.(\\d+)/.exec(version);\n check('git',Boolean(parts && (Number(parts[1])>2 || Number(parts[1])===2 && Number(parts[2])>=38)),version);\n } catch {check('git',false,'Git 2.38+ must be available on PATH');}\n const executable = (command: string) => {\n const candidates = path.isAbsolute(command) ? [command]\n : (process.env.PATH ?? '').split(path.delimiter).filter(Boolean).map(dir => path.join(dir, command));\n return candidates.some(file => {\n try { fs.accessSync(file, fs.constants.X_OK); return fs.statSync(file).isFile(); }\n catch { return false; }\n });\n };\n let configured=0;\n for(const [client,file] of [['claude','.mcp.json'],['cursor','.cursor/mcp.json'],['codex','.codex/config.toml']] as const) {\n const target=path.join(root,file); if(!fs.existsSync(target)) continue;\n try {\n if(!isWithin(root,physicalPath(target)))throw new Error('Configuration is redirected outside the checkout');\n const text=fs.readFileSync(target,'utf8');\n const config=client==='codex'?parseToml(text):JSON.parse(text);\n const server=client==='codex'?config.mcp_servers?.kith:config.mcpServers?.kith;\n if(!server) continue;configured++;\n check(`${client}-mcp`,typeof server.command==='string' && Array.isArray(server.args) && executable(server.command),'Kith stdio launcher must be executable by absolute path or PATH; native client trust and MCP discovery require client validation');\n } catch {check(`${client}-mcp`,false,`Cannot parse ${file}; existing configuration was preserved`);}\n }\n check('mcp-configuration',configured>0,'Configure the clients you use with kith init; diagnostics do not change client settings');\n check('coordination-state',state.state==='ready',state.state==='ready'?'Schema and counters validated on a private snapshot':state.error??'No coordination state; run kith init before starting agents');\n let nativeGuards=false;\n for(const [file,event] of [['.claude/settings.json','PreToolUse'],['.cursor/hooks.json','preToolUse']] as const) {\n const target=path.join(root,file);if(!fs.existsSync(target))continue;\n try {\n if(!isWithin(root,physicalPath(target)))throw new Error('Hook configuration leaves checkout');\n const config=JSON.parse(fs.readFileSync(target,'utf8')),entries=config.hooks?.[event]??[];\n if(!Array.isArray(entries))throw new Error('Hook entries must be an array');\n const hooks=event==='PreToolUse'?entries.flatMap(e=>e?.hooks??[]):entries;\n const guards=hooks.filter(h=>typeof h?.command==='string'&&h.command.includes('--repo')&&h.command.includes(' hook pre'));\n if(guards.length){nativeGuards=true;check(`${event}-failure-policy`,guards.every(h=>event==='PreToolUse'?h.onFailure==='block':h.failClosed===true),'Kith native pre-hooks must block on launch errors and timeouts');}\n }catch{check(`${event}-configuration`,false,`Cannot validate ${file}; configuration preserved`);}\n }\n const id=process.env.KITH_AGENT_ID, token=process.env.KITH_SESSION_TOKEN;\n if(id||token||nativeGuards) {\n const agent=state.agents.find(a=>a.id===id);\n check('session-environment',Boolean(id&&token&&agent?.status==='active'&&agent.lease_expires_at>Date.now()),'Native hooks need a persistent owning shell with both inherited session variables and a current recorded lease. MCP-only workflows do not need these exports. Capability validity is checked on use');\n }\n for(const workspace of state.workspaces) check(`workspace:${workspace.agentId}`,workspace.available && (!workspace.recordedBranch||workspace.recordedBranch===workspace.branch),workspace.error??`${workspace.path}; dirty files: ${workspace.dirtyFiles.length}`);\n return {ok:checks.every(c=>c.ok),repository:state.repository,checks};\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","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 { 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 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 { 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 { 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 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_VERSION } from '../version.js';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { KithEngine } from '../core/engine.js';\n\nexport function createKithMcpServer(repoRoot = process.cwd()): {\n server: McpServer;\n engine: KithEngine;\n} {\n const engine = new KithEngine(repoRoot);\n const server = new McpServer({\n name: 'kith-coordinator',\n version: KITH_VERSION,\n }, { instructions: 'Kith coordinates work claims, isolated worktrees, local resources and verified integration for cooperating coding agents. State stays local; no hosted service or model API key is required. Recommended workflow: one isolated worktree per parallel agent. Call kith_begin_work with isolateWorktree:true and explicit scopeGlobs; edit only the returned worktreePath, call kith_record_file_edit, run literal argv with kith_run_with_mutex, and finish with kith_complete_work plus a project verificationCmd. Heartbeat before the session expires. ' + (process.env.KITH_AGENT_ID\n ? `This server shares a session with CLI/hooks. Use agentId '${process.env.KITH_AGENT_ID}'. Its inherited capability is handled internally; do not request or log it.`\n : 'Start with kith_begin_work or kith_start_session and a unique agentId. This connection retains its granted capability. Omit sessionToken on subsequent calls on this connection; only another connection needs it to resume that ID. Initial grant/resume replies contain the token and client transcripts may record it. Keep transcripts private.'\n ) });\n\n const tokenFor = (args: { agentId: string; sessionToken?: string }) => args.sessionToken ??\n (process.env.KITH_AGENT_ID === args.agentId ? process.env.KITH_SESSION_TOKEN : undefined);\n const owned = new Set<string>();\n const register = (args: { agentId: string; client?: string; sessionToken?: string; leaseDurationMs?: number }) => {\n const result = engine.fencing.registerAgent({ id: args.agentId, client: args.client ?? 'mcp',\n sessionToken: tokenFor(args), leaseDurationMs: args.leaseDurationMs });\n if (result.agent.pid === process.pid) owned.add(args.agentId);\n return result;\n };\n const authorize = (args: { agentId: string; sessionToken?: string }) => {\n const token = tokenFor(args);\n if (token) engine.fencing.resumeSession(args.agentId, token);\n engine.fencing.heartbeat(args.agentId);\n };\n const disconnected = new AbortController();\n const commands = new Set<Promise<unknown>>();\n const cleanup = () => {\n for (const id of owned) {\n try { engine.fencing.abandonAgentSession(id); } catch { /* Expired or already completed. */ }\n }\n engine.close();\n };\n let closing = false;\n server.server.onclose = () => {\n if (closing) return;\n closing = true;\n disconnected.abort();\n // A command must stop before its process-group guard and database are closed.\n if (commands.size) void Promise.allSettled([...commands]).then(cleanup);\n else cleanup();\n };\n\n const formatReply = (agentId: string | undefined, payload: unknown) => {\n const delta = agentId ? engine.consumeAgentDelta(agentId).formattedFooter : '';\n const data = payload as Record<string, unknown>;\n return {\n content: [\n { type: 'text' as const, text: JSON.stringify(data, null, 2) },\n ...(delta ? [{ type: 'text' as const, text: delta }] : []),\n ],\n structuredContent: data,\n isError: data.ok === false,\n };\n };\n\n server.tool('kith_start_session', 'Create a capability-owned session or resume one with its token.', {\n agentId: z.string(), sessionToken: z.string().optional(), leaseDurationMs: z.number().optional(),\n }, async (args) => formatReply(undefined, { ok: true, ...register(args) }));\n server.tool('kith_heartbeat', 'Renew an active, owned session. Expired sessions cannot be revived.', {\n agentId: z.string(), sessionToken: z.string().optional(),\n }, async (args) => { authorize(args); return formatReply(args.agentId, { ok: true, agent: engine.fencing.getAgent(args.agentId) }); });\n\n server.tool(\n 'kith_begin_work',\n 'Register an agent session, verify no scope lock conflicts exist with sibling agents, acquire monotonic fencing-token locks, and optionally create an isolated Git worktree.',\n {\n agentId: z.string().describe('Unique identifier for this agent session (e.g. claude-1, codex-auth)'),\n sessionToken: z.string().optional(),\n client: z.string().optional().describe('Client name (claude-code, antigravity, codex, cursor)'),\n title: z.string().describe('Short title of the task or intent'),\n intentSummary: z.string().optional().describe('Detailed description of what will be built or modified'),\n scopeGlobs: z.array(z.string()).describe('File paths or glob patterns this agent will edit (e.g. [\"src/auth/**\"])'),\n isolateWorktree: z.boolean().optional().describe('Recommended: true, giving each parallel agent a separate Git worktree'),\n },\n async (args) => {\n const reg = register(args);\n\n const intentRes = engine.beginWork({\n agentId: args.agentId,\n title: args.title,\n intentSummary: args.intentSummary,\n scopeGlobs: args.scopeGlobs,\n isolateWorktree: args.isolateWorktree,\n });\n\n const contracts = engine.depGraph.listContracts().slice(0, 30);\n\n return formatReply(args.agentId, {\n ok: intentRes.ok,\n agent: engine.fencing.getAgent(args.agentId),\n sessionToken: reg.sessionToken,\n fencingToken: intentRes.fencingToken,\n task: intentRes.task,\n locks: intentRes.locks,\n worktree: intentRes.worktree,\n lockConflicts: intentRes.lockConflicts,\n activeSiblingIntents: intentRes.activeSiblingIntents,\n publishedContracts: contracts,\n });\n }\n );\n\n server.tool(\n 'kith_claim_next_task',\n 'Atomically claim the highest-priority unblocked task from the DAG task queue and lock its declared file scope.',\n {\n agentId: z.string().describe('Agent ID claiming the task'),\n sessionToken: z.string().optional(),\n client: z.string().optional(),\n },\n async (args) => {\n const session = register(args);\n const res = engine.intents.claimNextTask(args.agentId);\n return formatReply(args.agentId, { ...res, sessionToken: session.sessionToken });\n }\n );\n\n server.tool(\n 'kith_add_task',\n 'Add a task to the orchestrated DAG queue with optional task dependencies and file scope globs.',\n {\n id: z.string().optional(),\n title: z.string(),\n intentSummary: z.string().optional(),\n priority: z.number().optional(),\n dependsOn: z.array(z.string()).optional(),\n scopeGlobs: z.array(z.string()).optional(),\n },\n async (args) => {\n const task = engine.intents.addTask(args);\n return formatReply(undefined, { ok: true, task });\n }\n );\n\n server.tool(\n 'kith_check_and_lock_files',\n 'Acquire exclusive or shared fencing-token locks on file paths, globs, or symbols.',\n {\n agentId: z.string(),\n sessionToken: z.string().optional(),\n patterns: z.array(z.string()),\n mode: z.enum(['exclusive', 'shared']).optional(),\n reason: z.string().optional(),\n },\n async (args) => {\n authorize(args);\n const res = engine.locks.acquireLocks(args);\n return formatReply(args.agentId, res);\n }\n );\n\n server.tool(\n 'kith_record_file_edit',\n 'Analyze a modified file for supported contract signatures, flag exact name/kind matches in other files as non-blocking reuse hints, check transitive import blast radius, and run a live dirty-tree git merge-tree conflict check.',\n {\n agentId: z.string(),\n sessionToken: z.string().optional(),\n filePath: z.string(),\n content: z.string().optional(),\n },\n async (args) => {\n authorize(args);\n const res = engine.processPostFileEdit({\n agentId: args.agentId,\n filePath: args.filePath,\n content: args.content,\n });\n return formatReply(args.agentId, res);\n }\n );\n\n server.tool(\n 'kith_publish_contract',\n 'Explicitly publish a shared interface, function signature, API route, or schema to the Contract Blackboard.',\n {\n agentId: z.string(),\n sessionToken: z.string().optional(),\n filePath: z.string(),\n symbolName: z.string(),\n kind: z.enum(['function', 'type', 'interface', 'class', 'schema', 'route', 'const']),\n signature: z.string(),\n docComment: z.string().optional(),\n },\n async (args) => {\n authorize(args);\n const contract = engine.depGraph.publishExplicitContract(args);\n return formatReply(args.agentId, { ok: true, contract });\n }\n );\n\n server.tool(\n 'kith_acquire_port',\n 'Reserve a local TCP port among cooperating Kith clients; start the service promptly and handle unrelated bind races.',\n {\n agentId: z.string(),\n sessionToken: z.string().optional(),\n serviceName: z.string(),\n basePort: z.number().optional(),\n },\n async (args) => {\n authorize(args);\n const portRes = await engine.broker.acquirePort(args);\n return formatReply(args.agentId, portRes);\n }\n );\n\n server.tool(\n 'kith_run_with_mutex',\n 'Run an argv command under a renewable named mutex, using the MCP server process permissions. Useful when a sandboxed client shell cannot inspect process identities. Requires an owned session. Cancellation or connection loss stops the supervised command before release. This is command execution, not a filesystem sandbox.',\n {\n agentId: z.string(), sessionToken: z.string().optional(),\n mutexName: z.string().min(1).max(128),\n command: z.array(z.string()).min(1).describe('Executable followed by literal arguments; no implicit shell'),\n cwd: z.string().optional().describe('Directory under the registered worktree or repository; defaults to the worktree when present'),\n leaseDurationMs: z.number().int().min(100).max(86400000).optional(),\n waitTimeoutMs: z.number().int().min(0).max(600000).optional(),\n commandTimeoutMs: z.number().int().min(1).max(600000).optional(),\n maxOutputBytes: z.number().int().min(1).max(1048576).optional(),\n },\n async (args, extra) => {\n authorize(args);\n const root = fs.realpathSync(engine.fencing.getAgent(args.agentId)?.worktree_path ?? engine.coordDb.repoRoot);\n const cwd = fs.realpathSync(path.resolve(root, args.cwd ?? '.'));\n const relative = path.relative(root, cwd);\n if (relative === '..' || relative.startsWith('..' + path.sep) || path.isAbsolute(relative)) {\n throw new Error('Command cwd must be inside the registered worktree or repository');\n }\n const execution = engine.broker.executeWithMutex({\n agentId: args.agentId, mutexName: args.mutexName, command: args.command, cwd,\n leaseDurationMs: args.leaseDurationMs, timeoutMs: args.waitTimeoutMs,\n commandTimeoutMs: args.commandTimeoutMs ?? 60000, maxOutputBytes: args.maxOutputBytes ?? 65536,\n signal: AbortSignal.any([disconnected.signal, extra.signal]),\n });\n commands.add(execution);\n try {\n const result = await execution;\n return formatReply(args.agentId, { ok: result.exitCode === 0, ...result });\n } finally { commands.delete(execution); }\n }\n );\n\n server.tool(\n 'kith_get_status',\n 'Retrieve coordination state, FIFO waiters and guarded commands, plus worktree paths, actual branches, dirty-file overlaps, commit age and ahead/behind against the current integration target HEAD. Normal engine startup may reap expired ownership.',\n {\n agentId: z.string().optional(),\n sessionToken: z.string().optional(),\n includeContracts: z.boolean().optional().describe('Include the full contract registry. Default false keeps frequent status polls compact; contractCount always reports its size.'),\n },\n async (args) => {\n if (args.agentId) authorize({ ...args, agentId: args.agentId });\n const state = engine.getStatus();\n return formatReply(args.agentId, { ...state, contracts: args.includeContracts ? state.contracts : [],\n contractCount: state.contracts.length, contractsIncluded: args.includeContracts ?? false });\n }\n );\n\n server.tool(\n 'kith_preview_integrate',\n 'Preview exact Git conflict paths for a committed registered worktree against the current integration target. Refuses dirty inputs; never checkpoints or changes source/target files. A clean preview does not run project verification.',\n { agentId: z.string(), sessionToken: z.string().optional() },\n async args => { authorize(args); return formatReply(args.agentId, engine.previewIntegration(args.agentId)); }\n );\n\n server.tool(\n 'kith_complete_work',\n 'Complete an agent task, optionally run the Speculative Merge Train to verify and merge its worktree branch, and release all locks and resources.',\n {\n agentId: z.string(),\n sessionToken: z.string().optional(),\n taskId: z.string().optional(),\n fencingToken: z.number().optional(),\n mergeBranch: z.string().optional().describe('Source branch to integrate, not the destination. Defaults to the registered agent branch; destination is the selected repository checkout current branch. Omit for claims-only work without a registered branch.'),\n verificationCmd: z.string().optional().describe('Command to run in speculative merge tree (e.g. \"npm run typecheck\")'),\n },\n async (args) => {\n authorize(args);\n const result = engine.completeWork(args);\n return formatReply(result.ok ? undefined : args.agentId, result);\n }\n );\n\n return { server, engine };\n}\n\nexport async function runKithMcpStdioServer(repoRoot = process.cwd()): Promise<void> {\n const { server } = createKithMcpServer(repoRoot);\n const transport = new StdioServerTransport();\n let closing = false;\n const close = () => {\n if (closing) return;\n closing = true;\n process.stdin.off('end', close);\n process.stdin.off('close', close);\n process.off('SIGTERM', close);\n process.off('SIGINT', close);\n void server.close();\n };\n // The SDK transport does not translate stdin EOF into onclose. A running command\n // otherwise keeps the server alive until the client force-kills it.\n process.stdin.once('end', close);\n process.stdin.once('close', close);\n process.once('SIGTERM', close);\n process.once('SIGINT', close);\n try { await server.connect(transport); }\n catch (error) { close(); throw error; }\n}\n","import { discoverRepository } from '../core/repository.js';\nimport { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport { LockEngine } from '../core/locks.js';\nimport { KithEngine } from '../core/engine.js';\n\nexport interface HookInputPayload {\n session_id?: string;\n agent_id?: string;\n tool_name?: string;\n tool_input?: {\n file_path?: string;\n notebook_path?: string;\n path?: string;\n target_file?: string;\n command?: string;\n content?: string;\n new_string?: string;\n };\n}\n\nexport type EnforcementMode = 'block' | 'warn' | 'off';\nexport function enforcementMode(value: unknown = 'block'): EnforcementMode {\n if (value !== 'block' && value !== 'warn' && value !== 'off') throw new Error('Enforcement must be block, warn or off');\n return value;\n}\n\nexport class HookHandler {\n constructor(private readonly engine: KithEngine, private readonly mode: EnforcementMode = 'block') {\n enforcementMode(mode);\n }\n\n private conflict(message: string): { allowed: boolean; exitCode: number; message: string } {\n return this.mode === 'block' ? { allowed: false, exitCode: 2, message }\n : { allowed: true, exitCode: 0, message: this.mode === 'warn' ? `[KITH WARNING] ${message}` : '' };\n }\n\n public static resolveAgentId(payload?: HookInputPayload, explicitAgentId?: string): string {\n return (\n explicitAgentId ??\n process.env.KITH_AGENT_ID ??\n payload?.agent_id ??\n payload?.session_id ??\n `pid-${process.ppid || process.pid}`\n );\n }\n\n /**\n * Handles `PreToolUse` enforcement for file edits (`Edit`, `Write`, `MultiEdit`) and `Bash`.\n * Returns `{ allowed: false, exitCode: 2, message }` when a lock or safety rule is violated.\n */\n public handlePreToolUse(params: {\n agentId: string;\n toolName: string;\n filePath?: string;\n command?: string;\n }): { allowed: boolean; exitCode: number; message: string } {\n this.engine.fencing.assertSession(params.agentId);\n\n const agent = this.engine.fencing.getAgent(params.agentId);\n if (params.filePath) {\n params = { ...params, filePath: LockEngine.normalizeFile(agent?.worktree_path ?? this.engine.coordDb.repoRoot, params.filePath) };\n }\n const tool = params.toolName.toLowerCase();\n\n if ((tool.includes('edit') || tool.includes('write') || tool.includes('replace') || tool.includes('delete')) && !params.filePath) {\n return { allowed: false, exitCode: 2, message: '[KITH LOCK GUARD] Missing file path in edit hook payload.' };\n }\n\n if (this.mode === 'off') return { allowed: true, exitCode: 0, message: '' };\n\n // 1. Pre-Edit / Pre-Write File Lock Enforcement\n if (\n params.filePath &&\n (tool.includes('edit') || tool.includes('write') || tool.includes('replace') || tool.includes('delete'))\n ) {\n const check = this.engine.locks.checkFileWriteAccess({\n agentId: params.agentId,\n filePath: params.filePath,\n });\n\n if (!check.allowed) {\n return this.conflict(`[KITH LOCK GUARD] Write to '${params.filePath}' conflicts with a claim. ${check.reason}`);\n }\n\n // Auto-acquire an advisory/exclusive file lock if the file was unlocked so sibling agents see it immediately\n const acquired = this.engine.locks.acquireLocks({\n agentId: params.agentId,\n patterns: [params.filePath],\n lockType: 'file',\n reason: `Auto-locked on ${params.toolName}`,\n });\n\n if (!acquired.ok) {\n return this.conflict('[KITH LOCK GUARD] Another agent acquired the file lock. Retry after resolving the conflict.');\n }\n return { allowed: true, exitCode: 0, message: '' };\n }\n\n // 2. Pre-Bash Destructive Command Firewall + Merkle Snapshot Capture\n if (tool === 'bash' || tool === 'run_command' || params.command) {\n const cmd = params.command ?? '';\n const agent = this.engine.fencing.getAgent(params.agentId);\n const safety = this.engine.bashGuard.checkCommandSafety({\n agentId: params.agentId,\n command: cmd,\n inIsolatedWorktree: Boolean(agent?.worktree_path),\n });\n\n const conflict = !safety.safe ? this.conflict(`[KITH BASH FIREWALL] ${safety.reason}`) : null;\n if (conflict && !conflict.allowed) return conflict;\n\n this.engine.bashGuard.capturePreBashSnapshot(\n params.agentId,\n agent?.worktree_path ?? this.engine.coordDb.repoRoot\n );\n return conflict ?? { allowed: true, exitCode: 0, message: '' };\n }\n\n return { allowed: true, exitCode: 0, message: '' };\n }\n\n /**\n * Handles `PostToolUse` verification:\n * - For file edits: AST export/import extraction, transitive blast radius, live dirty-tree `git merge-tree`.\n * - For Bash commands: snapshot diff and preserved recovery copies of unauthorized changes.\n */\n public handlePostToolUse(params: {\n agentId: string;\n toolName: string;\n filePath?: string;\n command?: string;\n }): { allowed: boolean; exitCode: number; warnings: string[]; deltaFooter: string } {\n const agent = this.engine.fencing.getAgent(params.agentId);\n if (params.filePath) {\n params = { ...params, filePath: LockEngine.normalizeFile(agent?.worktree_path ?? this.engine.coordDb.repoRoot, params.filePath) };\n }\n const tool = params.toolName.toLowerCase();\n this.engine.fencing.assertSession(params.agentId);\n const warnings: string[] = [];\n\n if (\n params.filePath &&\n (tool.includes('edit') || tool.includes('write') || tool.includes('replace') || tool.includes('delete'))\n ) {\n const agent = this.engine.fencing.getAgent(params.agentId);\n const access = this.engine.locks.checkFileWriteAccess({ agentId: params.agentId, filePath: params.filePath });\n if (!access.allowed && this.mode !== 'block') {\n if (this.mode === 'warn') warnings.push(`[KITH WARNING] ${access.reason}. Edit was not indexed as authorized work.`);\n return { allowed: true, exitCode: 0, warnings, deltaFooter: this.engine.consumeAgentDelta(params.agentId).formattedFooter };\n }\n const postRes = this.engine.processPostFileEdit({\n agentId: params.agentId,\n filePath: params.filePath,\n worktreeDir: agent?.worktree_path ?? undefined,\n });\n warnings.push(...postRes.warnings);\n } else if (tool === 'bash' || tool === 'run_command' || params.command) {\n if (this.mode === 'off') return { allowed: true, exitCode: 0, warnings, deltaFooter: this.engine.consumeAgentDelta(params.agentId).formattedFooter };\n const agent = this.engine.fencing.getAgent(params.agentId);\n const report = this.engine.bashGuard.verifyPostBashAndQuarantine({\n agentId: params.agentId,\n command: params.command ?? 'bash',\n rootDir: agent?.worktree_path ?? this.engine.coordDb.repoRoot,\n });\n\n if (!report.allowed) {\n for (const v of report.quarantinedViolations) {\n warnings.push(\n `[KITH BASH QUARANTINE] Detected a change to locked file '${v.file_path}' during command '${v.command}'. Current workspace bytes were preserved. ${v.reason}. Recovery copies saved to '${v.patch_path}' (and .before when available).`\n );\n }\n const deltaFooter = this.engine.consumeAgentDelta(params.agentId).formattedFooter;\n return {\n allowed: this.mode !== 'block',\n exitCode: this.mode === 'block' ? 2 : 0,\n warnings,\n deltaFooter,\n };\n }\n }\n\n const deltaFooter = this.engine.consumeAgentDelta(params.agentId).formattedFooter;\n return {\n allowed: true,\n exitCode: 0,\n warnings,\n deltaFooter,\n };\n }\n\n /**\n * Git `pre-commit` hook handler: ensures none of the staged files are locked by another live agent.\n */\n public handleGitPreCommit(agentId: string, indexCwd = this.engine.fencing.getAgent(agentId)?.worktree_path ?? this.engine.coordDb.repoRoot): {\n allowed: boolean;\n exitCode: number;\n violations: string[];\n } {\n this.engine.fencing.assertSession(agentId);\n let stagedFiles: string[] = [];\n try {\n const layout = discoverRepository(indexCwd);\n if (!layout.commonGitDir || layout.commonGitDir !== this.engine.coordDb.commonGitDir) throw new Error('Git index belongs to a different repository');\n const out = execFileSync(\n 'git',\n ['diff', '--cached', '--name-only', '-z'],\n { cwd: layout.checkoutRoot, encoding: 'utf8' }\n );\n stagedFiles = out.split('\\0').filter(Boolean);\n } catch {\n return { allowed: false, exitCode: 1, violations: ['Unable to read the Git index.'] };\n }\n\n const violations: string[] = [];\n for (const file of this.mode === 'off' ? [] : stagedFiles) {\n const check = this.engine.locks.checkFileWriteAccess({\n agentId,\n filePath: file,\n });\n if (!check.allowed && check.reason) {\n violations.push(check.reason);\n }\n }\n\n return {\n allowed: violations.length === 0 || this.mode !== 'block',\n exitCode: violations.length === 0 || this.mode !== 'block' ? 0 : 1,\n violations,\n };\n }\n\n public static readJsonStdinSync(): HookInputPayload | undefined {\n if (process.stdin.isTTY) return undefined;\n try {\n const raw = fs.readFileSync(0, 'utf8').trim();\n if (!raw) return undefined;\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) throw new Error('Expected a JSON object');\n return parsed as HookInputPayload;\n } catch (err) {\n throw new Error(`Cannot read hook input: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n}\n","import { KITH_PROTOCOL_VERSION } from '../version.js';\nimport { applySetupPlan } from './setup-ledger.js';\nimport { discoverRepository, isWithin, physicalPath } from '../core/repository.js';\nimport { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { parse as parseToml, stringify as stringifyToml } from 'smol-toml';\nimport { KithEngine } from '../core/engine.js';\nimport { enforcementMode, type EnforcementMode } from './hook-handler.js';\n\nexport const INTEGRATIONS = ['claude', 'codex', 'cursor', 'agents', 'git', 'shims'] as const;\nexport type Integration = (typeof INTEGRATIONS)[number];\nexport interface InitReport {\n repoRoot: string;\n indexedFiles: number;\n configuredFiles: string[];\n dryRun: boolean;\n warnings: string[];\n}\n\nfunction object(value: unknown, label: string): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${label} must be a JSON object. No configuration was written.`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction readConfig(file: string): Record<string, unknown> {\n if (!fs.existsSync(file)) return {};\n try {\n return object(JSON.parse(fs.readFileSync(file, 'utf8')), file);\n } catch (err) {\n throw new Error(`Cannot read ${file}: ${err instanceof Error ? err.message : err}`);\n }\n}\n\nfunction shellQuote(value: string): string {\n return \"'\" + value.replace(/'/g, \"'\\\\''\") + \"'\";\n}\n\n/** Preflight every selected configuration before writing; preserve unrelated settings. */\nexport function initializeKithRepository(\n repoRoot = process.cwd(),\n cliBinaryCommand = 'kith',\n options: { dryRun?: boolean; integrations?: Integration[]; mcpOnly?: boolean; enforcement?: EnforcementMode } = {}\n): InitReport {\n const mode = enforcementMode(options.enforcement);\n const modeArg = mode === 'block' ? '' : ` --enforcement ${mode}`;\n const absRoot = discoverRepository(repoRoot).checkoutRoot;\n const mcpOnly = options.mcpOnly ?? options.integrations === undefined;\n const selected = new Set(options.integrations ?? ['claude', 'codex', 'cursor', 'agents'] as Integration[]);\n if (mcpOnly && (selected.has('git') || selected.has('shims'))) {\n throw new Error('--mcp-only supports client MCP configurations and agent instructions; omit git and shims.');\n }\n for (const integration of selected) {\n if (!INTEGRATIONS.includes(integration)) throw new Error(`Unknown integration: ${integration}`);\n }\n if (process.platform === 'win32' && !mcpOnly && ['claude', 'cursor', 'git', 'shims'].some(name => selected.has(name as Integration))) {\n throw new Error('Native Windows setup supports MCP-only configuration; use --mcp-only or WSL for shell hooks and shims.');\n }\n if (!fs.statSync(absRoot).isDirectory()) throw new Error(`Not a directory: ${absRoot}`);\n const plan = new Map<string, { content: string; mode?: number }>();\n const warnings: string[] = [];\n const add = (name: string, content: string, mode?: number) => {\n const target = path.isAbsolute(name) ? name : path.join(absRoot, name);\n if (!isWithin(absRoot, physicalPath(target))) throw new Error(`Configuration path leaves repository: ${name}`);\n if (!fs.existsSync(target) || fs.readFileSync(target, 'utf8') !== content) {\n plan.set(name, { content, mode });\n }\n };\n const json = (name: string, value: unknown) => add(name, JSON.stringify(value, null, 2) + '\\n');\n const hookCommand = `${cliBinaryCommand} --repo ${shellQuote(absRoot)} hook`;\n // Native clients cannot spawn npm's .cmd launcher directly. Avoid cmd.exe quoting entirely.\n const windowsCli = process.platform === 'win32' ? ['./cli/index.js', './index.js', '../../dist/cli/index.js']\n .map(relative => fileURLToPath(new URL(relative, import.meta.url))).find(file => fs.existsSync(file)) : undefined;\n if (process.platform === 'win32' && !windowsCli) throw new Error('Build Kith before generating native Windows MCP configuration');\n const server = windowsCli\n ? { command: process.execPath, args: [windowsCli, 'mcp', '--repo', absRoot] }\n : { command: 'kith', args: ['mcp', '--repo', absRoot] };\n\n const ignorePath = path.join(absRoot, '.gitignore');\n const ignore = fs.existsSync(ignorePath) ? fs.readFileSync(ignorePath, 'utf8') : '';\n if (!ignore.split(/\\r?\\n/).some((line) => ['.coord/', '/.coord/'].includes(line.trim()))) {\n add('.gitignore', ignore + (ignore && !ignore.endsWith('\\n') ? '\\n' : '') + '\\n# Kith local state and worktrees\\n.coord/\\n');\n }\n\n if (selected.has('claude')) {\n const settings = readConfig(path.join(absRoot, '.claude/settings.json'));\n const hooks = object(settings.hooks ?? {}, 'Claude hooks');\n if (mcpOnly && ['PreToolUse', 'PostToolUse'].some(event => Array.isArray(hooks[event]) && hooks[event].length)) {\n warnings.push('Existing Claude tool hooks preserved. Review whether they require inherited KITH credentials; --mcp-only does not disable guards.');\n }\n for (const [event, phase] of (mcpOnly ? [] : [['PreToolUse', 'pre'], ['PostToolUse', 'post']]) as Array<['PreToolUse' | 'PostToolUse', 'pre' | 'post']>) {\n const entries = hooks[event] ?? [];\n if (!Array.isArray(entries)) throw new Error(`Claude hooks.${event} must be an array.`);\n const baseCommand = `${hookCommand} ${phase}`;\n const command = baseCommand + modeArg;\n const owned = (value: unknown) => typeof value === 'string' && [baseCommand, ...['block', 'warn', 'off'].map(m => `${baseCommand} --enforcement ${m}`)].includes(value);\n const exists = entries.some((entry) => {\n if (!entry || typeof entry !== 'object' || !Array.isArray(entry.hooks)) return false;\n return entry.hooks.some((hook: { command?: string } | null) => owned(hook?.command));\n });\n hooks[event] = exists ? entries.map((entry) => {\n if (!entry || typeof entry !== 'object' || !Array.isArray(entry.hooks)) return entry;\n return { ...entry, hooks: entry.hooks.map((hook: { command?: string } | null) =>\n owned(hook?.command) ? { ...hook, command, ...(event === 'PreToolUse' ? { onFailure: 'block' } : {}) } : hook) };\n }) : [...entries, {\n matcher: 'Edit|Write|MultiEdit|NotebookEdit|Bash',\n hooks: [{ type: 'command', command, ...(event === 'PreToolUse' ? { onFailure: 'block' } : {}) }],\n }];\n }\n if (!mcpOnly) { settings.hooks = hooks; json('.claude/settings.json', settings); }\n const mcp = readConfig(path.join(absRoot, '.mcp.json'));\n mcp.mcpServers = { ...object(mcp.mcpServers ?? {}, 'Claude MCP servers'), kith: server };\n json('.mcp.json', mcp);\n }\n if (selected.has('codex')) {\n const file = path.join(absRoot, '.codex/config.toml');\n const original = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';\n let config: Record<string, unknown>;\n try { config = parseToml(original); }\n catch { throw new Error(`Cannot read ${file}: invalid TOML. No configuration was written.`); }\n const servers = object(config.mcp_servers ?? {}, 'Codex MCP servers');\n if (Object.hasOwn(servers, 'kith')) {\n // Preserve custom transports, approvals and environment settings byte for byte.\n const existing = object(servers.kith, 'Codex Kith MCP server');\n if (existing.command !== server.command || JSON.stringify(existing.args) !== JSON.stringify(server.args) ||\n !['KITH_AGENT_ID', 'KITH_SESSION_TOKEN'].every((name) => Array.isArray(existing.env_vars) && existing.env_vars.includes(name))) {\n warnings.push('Existing Codex kith server preserved. Review its command/args and forward KITH_AGENT_ID and KITH_SESSION_TOKEN using env_vars.');\n }\n } else {\n const addition = stringifyToml({ mcp_servers: { kith: {\n ...server, env_vars: ['KITH_AGENT_ID', 'KITH_SESSION_TOKEN'],\n } } });\n const content = original + (original && !original.endsWith('\\n') ? '\\n' : '') + '\\n# Kith local coordination\\n' + addition;\n parseToml(content); // Validate the complete append before any configuration is written.\n add('.codex/config.toml', content);\n }\n }\n if (selected.has('cursor')) {\n const mcp = readConfig(path.join(absRoot, '.cursor/mcp.json'));\n mcp.mcpServers = { ...object(mcp.mcpServers ?? {}, 'Cursor MCP servers'), kith: server };\n json('.cursor/mcp.json', mcp);\n const existingCursorHooks = readConfig(path.join(absRoot, '.cursor/hooks.json'));\n if(mcpOnly && ['preToolUse','postToolUse'].some(event=>Array.isArray((existingCursorHooks.hooks as Record<string,unknown>)?.[event])&&((existingCursorHooks.hooks as Record<string,unknown>)[event] as unknown[]).length)) warnings.push('Existing Cursor hooks preserved; review their inherited session requirements.');\n if (!mcpOnly) {\n const config = existingCursorHooks;\n if (config.version !== undefined && config.version !== 1) throw new Error('Unsupported Cursor hooks version; no configuration was written.');\n const hooks = object(config.hooks ?? {}, 'Cursor hooks');\n for (const [event, phase] of [['preToolUse', 'pre'], ['postToolUse', 'post']] as const) {\n const entries = hooks[event] ?? [];\n if (!Array.isArray(entries)) throw new Error(`Cursor hooks.${event} must be an array.`);\n const baseCommand = `${hookCommand} ${phase} --client cursor`;\n const owned = (value: unknown) => typeof value === 'string' && [baseCommand, ...['block', 'warn', 'off'].map(m => `${baseCommand} --enforcement ${m}`)].includes(value);\n const entry = { command: baseCommand + modeArg, matcher: 'Shell|Write|Delete', ...(phase === 'pre' ? { failClosed: true } : {}) };\n const exists = entries.some(e => e && typeof e === 'object' && owned(e.command));\n hooks[event] = exists ? entries.map(e => e && typeof e === 'object' && owned(e.command) ? { ...e, ...entry } : e) : [...entries, entry];\n }\n json('.cursor/hooks.json', { ...config, version: 1, hooks });\n }\n }\n if (selected.has('agents')) {\n const file = path.join(absRoot, 'AGENTS.md');\n let content = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '# Repository Agent Instructions\\n';\n const block = `<!-- KITH:START -->\n## Parallel Agent Coordination (kith)\n\nInstruction protocol: ${KITH_PROTOCOL_VERSION}.\n\nUse Kith MCP to claim work, isolate changes in worktrees, share local resources and verify integration. Keep one isolated worktree per parallel agent and keep the owning MCP connection open.\n\n1. Call \\`kith_begin_work\\` with a unique \\`agentId\\`, an explicit \\`scopeGlobs\\` array and \\`isolateWorktree: true\\`.\n2. Edit only the returned \\`worktree.worktreePath\\`. Report changed files through \\`kith_record_file_edit\\` on that connection.\n3. Run serialized commands with \\`kith_run_with_mutex\\`: pass a literal executable/argument array. Its cwd defaults to the registered worktree. Commands run with server permissions and require client approval.\n4. Renew idle sessions with \\`kith_heartbeat\\` before their lease expires (every two minutes for the default five-minute lease; sooner for a shorter lease). Inspect \\`kith_get_status\\`.\n5. Complete with \\`kith_complete_work\\` and a project-specific \\`verificationCmd\\`. Failed verification keeps the integration target unchanged. Successful worktrees are retained for inspection.\n\nThe MCP connection retains its capability; omit \\`sessionToken\\` on subsequent calls on that connection. Initial grant/resume replies contain the token, so keep client transcripts private. Do not copy tokens into shell commands or public reports. A new connection needs a valid capability to resume an existing ID. Locks coordinate cooperating writers; hooks are not an OS security sandbox.\n\nIf Claude/Cursor edit hooks or CLI commands are also enabled, launch the client from a persistent shell after \\`eval \"$(kith session start --agent <id> --owner-pid \"$$\" --shell)\"\\`. CLI, hooks and MCP must inherit the same KITH_AGENT_ID/KITH_SESSION_TOKEN and use the same agent ID. Separate stateless shell calls do not preserve these exports or the owning shell. MCP-only setup skips new native edit hooks and preserves existing ones.\n<!-- KITH:END -->`;\n if (content.includes('<!-- KITH:START -->') !== content.includes('<!-- KITH:END -->')) {\n throw new Error('AGENTS.md has an incomplete Kith block. Repair it before running init.');\n }\n content = content.includes('<!-- KITH:START -->')\n ? content.replace(/<!-- KITH:START -->[\\s\\S]*?<!-- KITH:END -->/, () => block)\n : content.trimEnd() + '\\n\\n' + block + '\\n';\n add('AGENTS.md', content);\n add('.agent/skills/kith/SKILL.md', '---\\nname: kith\\ndescription: Coordinate parallel coding work through Kith MCP and isolated worktrees.\\n---\\n\\nPrefer the Kith MCP tools on one persistent connection. Begin with kith_begin_work using a unique agentId, explicit scopeGlobs and isolateWorktree:true. Edit the returned worktreePath, report files with kith_record_file_edit, run literal command arrays with kith_run_with_mutex, heartbeat before expiry and finish with kith_complete_work plus a project verificationCmd. Inspect kith_get_status. Keep capabilities private. If CLI or native hooks are enabled, first launch the client from a persistent shell with the same KITH_AGENT_ID/KITH_SESSION_TOKEN and --owner-pid \"$$\". Stateless shell calls cannot retain that setup. Locks require cooperating clients.\\n');\n }\n if (selected.has('git')) {\n try {\n const hooksDir = execFileSync('git', ['rev-parse', '--path-format=absolute', '--git-path', 'hooks'], {\n cwd: absRoot, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'],\n }).trim();\n const hook = path.join(hooksDir, 'pre-commit');\n const physicalHooks = fs.existsSync(hooksDir) ? fs.realpathSync(hooksDir) : hooksDir;\n const relativeHooks = path.relative(fs.realpathSync(absRoot), physicalHooks);\n if (relativeHooks === '..' || relativeHooks.startsWith('..' + path.sep) || path.isAbsolute(relativeHooks)) {\n warnings.push('Git hook skipped: hooks directory is outside this repository. Integrate the guard manually.');\n } else {\n const script = (arg: string) => `#!/usr/bin/env sh\\n# Kith coordination guard\\nexec ${hookCommand} pre-commit${arg}\\n`;\n const existing = fs.existsSync(hook) ? fs.readFileSync(hook, 'utf8') : null;\n if (existing === null || ['', ...['block', 'warn', 'off'].map(m => ` --enforcement ${m}`)].some(arg => existing === script(arg))) {\n add(hook, script(modeArg), 0o755);\n } else warnings.push('Existing pre-commit hook preserved; add `kith hook pre-commit` to your hook manager if needed.');\n }\n } catch {\n warnings.push('Git hook skipped: this directory is not a Git worktree.');\n }\n }\n if (selected.has('shims')) {\n for (const manager of ['npm', 'pnpm', 'yarn']) {\n // Remove this shim directory before resolving either kith or the real package manager.\n add(`.coord/bin/${manager}`, `#!/usr/bin/env sh\nshim_dir=$(CDPATH= cd -- \"$(dirname -- \"$0\")\" && pwd)\nkith_path=\nold_ifs=$IFS\nIFS=:\nfor entry in $PATH; do\n [ \"$entry\" = \"$shim_dir\" ] && continue\n if [ -z \"$kith_path\" ]; then kith_path=$entry; else kith_path=\"$kith_path:$entry\"; fi\ndone\nIFS=$old_ifs\nPATH=$kith_path\nexport PATH\ncase \"$1\" in\n install|i|add|remove|ci)\n if [ \"\\${KITH_PACKAGE_INSTALL_GUARDED:-}\" = 1 ]; then exec ${manager} \"$@\"; fi\n exec ${cliBinaryCommand} --repo ${shellQuote(absRoot)} mutex --agent \"\\${KITH_AGENT_ID:-shim-$$}\" --name package-install -- ${manager} \"$@\"\n ;;\n *) exec ${manager} \"$@\" ;;\nesac\n`, 0o755);\n }\n }\n const report: InitReport = {\n repoRoot: absRoot, indexedFiles: 0, configuredFiles: [...plan.keys()],\n dryRun: options.dryRun ?? false, warnings,\n };\n if (report.dryRun) return report;\n const engine = new KithEngine(absRoot);\n try {\n if(plan.size) applySetupPlan(absRoot, engine.coordDb.coordDir, plan, warnings);\n report.indexedFiles = engine.depGraph.indexRepositoryFiles(absRoot);\n } finally {\n engine.close();\n }\n return report;\n}\n","#!/usr/bin/env node\nimport { KITH_VERSION } from '../version.js';\nimport { uninstallKith } from './setup-ledger.js';\nimport { doctorReport } from './doctor.js';\nimport { readCoordinationState, recoveryReport } from '../core/observation.js';\nimport { SessionOwnershipError } from '../core/fencing.js';\nimport { KithEngine } from '../core/engine.js';\nimport { runKithMcpStdioServer } from '../mcp/server.js';\nimport { enforcementMode, HookHandler } from './hook-handler.js';\nimport { INTEGRATIONS, Integration, initializeKithRepository } from './init.js';\n\nfunction parseFlags(argv: string[]): {\n positional: string[];\n flags: Record<string, string | boolean>;\n passthroughCmd: string[];\n} {\n const dashDashIdx = argv.indexOf('--');\n const mainArgs = dashDashIdx >= 0 ? argv.slice(0, dashDashIdx) : argv;\n const passthroughCmd = dashDashIdx >= 0 ? argv.slice(dashDashIdx + 1) : [];\n\n const positional: string[] = [];\n const flags: Record<string, string | boolean> = {};\n\n for (let i = 0; i < mainArgs.length; i++) {\n const arg = mainArgs[i];\n if (arg.startsWith('--')) {\n const eqIdx = arg.indexOf('=');\n if (eqIdx >= 0) {\n flags[arg.slice(2, eqIdx)] = arg.slice(eqIdx + 1);\n } else {\n const key = arg.slice(2);\n const next = mainArgs[i + 1];\n if (!['worktree', 'raw', 'dry-run', 'help', 'version', 'shell', 'new', 'mcp-only', 'offline'].includes(key) && next && !next.startsWith('--')) {\n flags[key] = next;\n i++;\n } else {\n flags[key] = true;\n }\n }\n } else {\n positional.push(arg);\n }\n }\n\n return { positional, flags, passthroughCmd };\n}\n\nasync function main(): Promise<void> {\n const { positional, flags, passthroughCmd } = parseFlags(process.argv.slice(2));\n const cmd = positional[0] ?? 'help';\n const subCmd = positional[1];\n const repoRoot = typeof flags.repo === 'string' ? flags.repo : process.cwd();\n\n if (flags.version || cmd === 'version') { console.log(KITH_VERSION); return; }\n if (flags.help || cmd === 'help') { printHelp(); return; }\n\n if (cmd === 'init') {\n const integrations = typeof flags.only === 'string' ? flags.only.split(',') : undefined;\n if (integrations?.some((name) => !INTEGRATIONS.includes(name as Integration))) {\n throw new Error(`--only accepts: ${INTEGRATIONS.join(', ')}`);\n }\n const report = initializeKithRepository(repoRoot, 'kith', {\n enforcement: enforcementMode(flags.enforcement), dryRun: Boolean(flags['dry-run']), mcpOnly: flags['mcp-only'] ? true : undefined, integrations: integrations as Integration[] | undefined,\n });\n console.log(JSON.stringify({ ok: true, ...report }, null, 2));\n return;\n }\n\n if (cmd === 'mcp') {\n await runKithMcpStdioServer(repoRoot);\n return;\n }\n\n if (cmd === 'uninstall') { const report=uninstallKith(repoRoot,Boolean(flags['dry-run'])); console.log(JSON.stringify(report,null,2)); process.exitCode=report.ok?0:1; return; }\n\n if (cmd === 'doctor') { const report=doctorReport(repoRoot); console.log(JSON.stringify(report,null,2)); process.exitCode=report.ok?0:1; return; }\n\n if (cmd === 'recover' || cmd === 'status' && flags.offline) {\n const state = cmd === 'recover' ? recoveryReport(repoRoot) : readCoordinationState(repoRoot);\n console.log(JSON.stringify(state,null,2)); process.exitCode = state.state === 'unavailable' ? 1 : 0; return;\n }\n\n const commands = ['session', 'status', 'begin', 'complete', 'heartbeat', 'task', 'lock', 'contract', 'worktree', 'port', 'mutex', 'hook'];\n if (!commands.includes(cmd)) throw new Error(`Unknown command '${cmd}'. Run kith help.`);\n const subcommands: Record<string, string[]> = {\n session: ['start', 'end'],\n task: ['add', 'claim', 'list'], lock: ['acquire', 'release', 'list'],\n contract: ['publish', 'list'], worktree: ['spawn', 'remove', 'list', 'preview'],\n hook: ['pre', 'post', 'pre-commit'],\n };\n if (subcommands[cmd] && (!subCmd || !subcommands[cmd].includes(subCmd))) {\n throw new Error(`Expected kith ${cmd} ${subcommands[cmd].join('|')}`);\n }\n const engine = new KithEngine(repoRoot);\n const agentId = String(flags.agent ?? process.env.KITH_AGENT_ID ?? `cli-${process.pid}`);\n const sessionToken = cmd === 'session' && subCmd === 'start' && flags.new ? undefined : typeof flags['session-token'] === 'string' ? flags['session-token']\n : (!process.env.KITH_AGENT_ID || process.env.KITH_AGENT_ID === agentId) ? process.env.KITH_SESSION_TOKEN : undefined;\n const authorize = () => {\n if (!sessionToken) throw new SessionOwnershipError(agentId);\n engine.fencing.resumeSession(agentId, sessionToken);\n };\n const register = () => engine.fencing.registerAgent({ id: agentId,\n client: String(flags.client ?? 'cli'), pid: typeof flags['owner-pid'] === 'string' ? Number(flags['owner-pid'])\n : cmd === 'mutex' && !sessionToken ? process.pid : process.ppid,\n sessionToken, leaseDurationMs: typeof flags['lease-ms'] === 'string' ? Number(flags['lease-ms']) : undefined,\n });\n try {\n if (cmd === 'session') {\n if (subCmd === 'end') {\n authorize(); engine.fencing.abandonAgentSession(agentId);\n console.log(JSON.stringify({ ok: true })); return;\n }\n if (flags.shell && typeof flags['owner-pid'] !== 'string') {\n throw new Error('Shell exports require --owner-pid \"$$\" so command substitution cannot anchor the session to a transient subshell.');\n }\n const session = register();\n if (flags.shell) {\n const quote = (value: string) => \"'\" + value.replace(/'/g, \"'\\\\''\") + \"'\";\n console.log(`export KITH_AGENT_ID=${quote(agentId)}\\nexport KITH_SESSION_TOKEN=${quote(session.sessionToken)}`);\n } else console.log(JSON.stringify(session, null, 2));\n return;\n }\n if (cmd === 'heartbeat') {\n authorize();\n if (!engine.fencing.heartbeat(agentId)) throw new Error('Active --agent <id> required');\n console.log(JSON.stringify({ ok: true, agent: engine.fencing.getAgent(agentId) }, null, 2));\n return;\n }\n\n if (cmd === 'status') {\n const state = engine.getStatus();\n console.log(JSON.stringify(state, null, 2));\n return;\n }\n\n if (cmd === 'begin') {\n const title = String(flags.title ?? flags.intent ?? 'Active work');\n const scopeRaw = typeof flags.scope === 'string' ? flags.scope : '';\n const scopeGlobs = scopeRaw ? scopeRaw.split(',').map((s) => s.trim()) : ['**'];\n\n const session = register();\n\n const res = engine.beginWork({\n agentId,\n title,\n intentSummary: typeof flags.summary === 'string' ? flags.summary : title,\n scopeGlobs,\n isolateWorktree: Boolean(flags.worktree),\n });\n\n console.log(JSON.stringify({ ...res, sessionToken: session.sessionToken }, null, 2));\n process.exitCode = res.ok ? 0 : 1;\n return;\n }\n\n if (cmd === 'complete') {\n authorize();\n const result = engine.completeWork({\n agentId, mergeBranch: typeof flags.merge === 'string' ? flags.merge : undefined,\n verificationCmd: typeof flags.verify === 'string' ? flags.verify : undefined,\n });\n (result.ok ? console.log : console.error)(JSON.stringify(result, null, 2));\n process.exitCode = result.ok ? 0 : 1;\n return;\n }\n\n if (cmd === 'task') {\n if (subCmd === 'add') {\n const title = String(flags.title ?? 'Task');\n const dependsOn =\n typeof flags['depends-on'] === 'string'\n ? flags['depends-on'].split(',').map((s) => s.trim())\n : [];\n const scopeGlobs =\n typeof flags.scope === 'string'\n ? flags.scope.split(',').map((s) => s.trim())\n : [];\n const priority = typeof flags.priority === 'string' ? Number(flags.priority) : 10;\n const task = engine.intents.addTask({\n id: typeof flags.id === 'string' ? flags.id : undefined,\n title,\n dependsOn,\n scopeGlobs,\n priority,\n });\n console.log(JSON.stringify({ ok: true, task }, null, 2));\n return;\n }\n if (subCmd === 'claim') {\n const session = register();\n const res = engine.intents.claimNextTask(agentId);\n console.log(JSON.stringify({ ...res, sessionToken: session.sessionToken }, null, 2));\n process.exitCode = res.claimed ? 0 : 1;\n return;\n }\n console.log(JSON.stringify(engine.intents.listTasks(), null, 2));\n return;\n }\n\n if (cmd === 'lock') {\n if (subCmd === 'acquire') {\n const patterns = String(flags.patterns ?? flags.scope ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n const session = register();\n const res = engine.locks.acquireLocks({ agentId, patterns });\n console.log(JSON.stringify({ ...res, sessionToken: session.sessionToken }, null, 2));\n process.exitCode = res.ok ? 0 : 1;\n return;\n }\n if (subCmd === 'release') {\n authorize();\n const released = engine.locks.releaseLocks({ agentId });\n console.log(JSON.stringify({ ok: true, released }, null, 2));\n return;\n }\n console.log(JSON.stringify(engine.locks.listLocks(), null, 2));\n return;\n }\n\n if (cmd === 'contract') {\n if (subCmd === 'publish') {\n authorize();\n const contract = engine.depGraph.publishExplicitContract({\n agentId,\n filePath: String(flags.file ?? 'unknown'),\n symbolName: String(flags.symbol ?? 'unknown'),\n kind: (flags.kind as 'function') ?? 'function',\n signature: String(flags.signature ?? ''),\n });\n console.log(JSON.stringify({ ok: true, contract }, null, 2));\n return;\n }\n console.log(JSON.stringify(engine.depGraph.listContracts(), null, 2));\n return;\n }\n\n if (cmd === 'worktree') {\n if (subCmd === 'preview') { authorize(); const result=engine.previewIntegration(agentId); console.log(JSON.stringify(result,null,2)); process.exitCode=result.ok && result.clean ? 0 : 1; return; }\n if (subCmd === 'spawn') {\n const session = register();\n const wt = engine.worktrees.spawnWorktree({\n agentId,\n branch: typeof flags.branch === 'string' ? flags.branch : undefined,\n });\n console.log(JSON.stringify({ ok: true, worktree: wt, sessionToken: session.sessionToken }, null, 2));\n return;\n }\n if (subCmd === 'remove') {\n authorize();\n engine.worktrees.removeWorktree(agentId);\n console.log(JSON.stringify({ ok: true }, null, 2));\n return;\n }\n console.log(JSON.stringify(engine.worktrees.listWorktrees(), null, 2));\n return;\n }\n\n if (cmd === 'port') {\n const serviceName = String(flags.service ?? flags.name ?? 'web');\n const basePort = typeof flags.base === 'string' ? Number(flags.base) : 3100;\n const session = register();\n const res = await engine.broker.acquirePort({ agentId, serviceName, basePort });\n if (flags.raw) {\n console.log(res.port);\n } else {\n console.log(JSON.stringify({ ...res, sessionToken: session.sessionToken }, null, 2));\n }\n return;\n }\n\n if (cmd === 'mutex') {\n const mutexName = String(flags.name ?? 'default-mutex');\n const commandToRun = passthroughCmd.length ? passthroughCmd : String(flags.cmd ?? '');\n if (!commandToRun) {\n console.error('Error: provide a command after `--` for `kith mutex`');\n process.exitCode = 1;\n return;\n }\n register();\n const controller = new AbortController();\n let interrupted: NodeJS.Signals | undefined;\n const interrupt = (signal: NodeJS.Signals) => { interrupted = signal; controller.abort(); };\n const sigint = () => interrupt('SIGINT');\n const sigterm = () => interrupt('SIGTERM');\n process.on('SIGINT', sigint); process.on('SIGTERM', sigterm);\n try {\n const res = await engine.broker.executeWithMutex({\n agentId, mutexName, command: commandToRun, signal: controller.signal,\n leaseDurationMs: typeof flags['lease-ms'] === 'string' ? Number(flags['lease-ms']) : undefined,\n timeoutMs: typeof flags['wait-ms'] === 'string' ? Number(flags['wait-ms']) : undefined,\n commandTimeoutMs: typeof flags['timeout-ms'] === 'string' ? Number(flags['timeout-ms']) : undefined,\n onStdout: (chunk) => process.stdout.write(chunk), onStderr: (chunk) => process.stderr.write(chunk),\n });\n process.exitCode = res.exitCode;\n } catch (err) {\n if (interrupted) process.exitCode = interrupted === 'SIGINT' ? 130 : 143;\n else throw err;\n } finally {\n process.off('SIGINT', sigint); process.off('SIGTERM', sigterm);\n if (!sessionToken) {\n try { engine.fencing.completeAgentSession(agentId); }\n catch (err) { if (!(err instanceof SessionOwnershipError)) throw err; }\n }\n }\n return;\n }\n\n if (cmd === 'hook') {\n const handler = new HookHandler(engine, enforcementMode(flags.enforcement));\n const stdinPayload = HookHandler.readJsonStdinSync();\n const agentId = HookHandler.resolveAgentId(\n stdinPayload,\n typeof flags.agent === 'string' ? flags.agent : undefined\n );\n if (!sessionToken) throw new SessionOwnershipError(agentId);\n engine.fencing.resumeSession(agentId, sessionToken);\n const toolName = String(\n flags.tool ?? stdinPayload?.tool_name ?? 'Edit'\n );\n const filePath =\n typeof flags.file === 'string'\n ? flags.file\n : stdinPayload?.tool_input?.file_path ??\n stdinPayload?.tool_input?.notebook_path ??\n stdinPayload?.tool_input?.target_file ??\n stdinPayload?.tool_input?.path;\n const command =\n typeof flags.cmd === 'string'\n ? flags.cmd\n : stdinPayload?.tool_input?.command;\n\n if (subCmd === 'pre') {\n const res = handler.handlePreToolUse({\n agentId,\n toolName,\n filePath,\n command,\n });\n if (flags.client === 'cursor') {\n console.log(JSON.stringify({ permission: res.allowed ? 'allow' : 'deny', ...(res.message ? { user_message: res.message, agent_message: res.message } : {}) }));\n } else if (!res.allowed) console.error(res.message);\n else if (res.message) console.log(JSON.stringify({ hookSpecificOutput: { hookEventName: 'PreToolUse', additionalContext: res.message } }));\n process.exitCode = res.exitCode;\n return;\n }\n\n if (subCmd === 'post') {\n const res = handler.handlePostToolUse({\n agentId,\n toolName,\n filePath,\n command,\n });\n if (flags.client === 'cursor') {\n console.log(JSON.stringify({ additional_context: [...res.warnings, res.deltaFooter].filter(Boolean).join('\\n') }));\n process.exitCode = res.exitCode;\n return;\n }\n if (res.warnings.length > 0 || res.deltaFooter) {\n const msg = [...res.warnings, res.deltaFooter].filter(Boolean).join('\\n');\n if (!res.allowed) {\n console.error(msg);\n } else {\n console.log(\n JSON.stringify({\n systemMessage: msg,\n hookSpecificOutput: { hookEventName: 'PostToolUse', additionalContext: msg },\n })\n );\n }\n }\n process.exitCode = res.exitCode;\n return;\n }\n\n if (subCmd === 'pre-commit') {\n const res = handler.handleGitPreCommit(agentId, process.cwd());\n if (res.violations.length) {\n console.error(\n `[KITH GIT PRE-COMMIT ${res.allowed ? 'WARNING' : 'GUARD'}] Files claimed by sibling agents:\\n` +\n res.violations.map((v) => ` - ${v}`).join('\\n')\n );\n }\n process.exitCode = res.exitCode;\n return;\n }\n }\n } finally {\n engine.close();\n }\n}\n\nfunction printHelp(): void {\n console.log(`Kith (v${KITH_VERSION}) — Local coordination for coding agents\n\nClaim work, isolate changes with worktrees, share local resources, and verify integration.\nNo hosted service required.\n\nUsage:\n kith session start --agent <id> --owner-pid <pid> [--shell] Create or resume a capability-owned session\\n kith init Configure MCP clients (--dry-run, --only, --mcp-only)\n kith heartbeat --agent <id> Refresh the owned session lease\n kith status [--offline] Output JSON state and workspaces; offline never migrates or reaps\\n kith uninstall [--dry-run] Restore unchanged tracked setup files; retain work and recovery state\\n kith doctor Check runtime, PATH, configuration, sessions and worktree health without writes\\n kith recover Inspect retained work, expired claims and recovery records offline\n kith mcp Start stdio MCP server\n kith begin --agent <id> --title <t> --scope <g> Declare intent, check overlaps, lock scope\n kith complete --agent <id> [--merge <branch>] Run Speculative Merge Train & release locks\n kith task add|claim|list Manage orchestrated DAG task queue\n kith lock acquire|release|list Manage fencing-token file/glob locks\n kith contract publish|list Manage Contract Blackboard\n kith worktree spawn|remove|list|preview Manage isolated Git worktrees\n kith port --agent <id> --service <name> Lease collision-free TCP port\n kith mutex --agent <id> --name <m> -- <cmd> Serialize commands via mutex\n kith hook pre|post|pre-commit Tool & git hook handlers\n`);\n}\n\nmain().catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n const args = process.argv.slice(2);\n process.exitCode = args.includes('hook') && args.includes('pre') ? 2 : 1;\n});\n"],"mappings":"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","names":["fs","path","git","path","fs","fs","path","execFileSync","fs","path","createRequire","fs","path","require","fs","path","execFileSync","execFileSync","DatabaseSync","createRequire","path","fs","lock","execFileSync","path","fs","execFileSync","crypto","fs","path","epoch","fs","path","crypto","fs","path","crypto","fs","path","crypto","fs","path","path","fs","crypto","lock","crypto","path","fs","fs","crypto","now","crypto","fs","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","fs","path","execFileSync","fs","agent","deltaFooter","execFileSync","fs","execFileSync","fs","path","fileURLToPath","parseToml","fs","mode","path","fileURLToPath","parseToml","execFileSync","agentId"]}
|