neural-loom 0.2.69 → 0.2.70
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/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/cache/.previewinfo +1 -1
- package/.next/cache/.rscinfo +1 -1
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/dev/build-manifest.json +50 -0
- package/.next/dev/fallback-build-manifest.json +37 -0
- package/.next/dev/logs/next-development.log +3737 -0
- package/.next/dev/server/chunks/[root-of-the-server]__11uf~fd._.js +2396 -0
- package/.next/dev/server/chunks/[root-of-the-server]__11uf~fd._.js.map +20 -0
- package/.next/dev/server/chunks/ssr/[externals]__0.o~_~l._.js +32 -0
- package/.next/dev/server/chunks/ssr/[externals]__0.o~_~l._.js.map +5 -0
- package/.next/dev/server/chunks/ssr/[externals]_next_dist_shared_lib_no-fallback-error_external_0fgm~bn.js +8 -0
- package/.next/dev/server/chunks/ssr/[externals]_next_dist_shared_lib_no-fallback-error_external_0fgm~bn.js.map +5 -0
- package/.next/dev/server/chunks/ssr/[root-of-the-server]__0je5zm2._.js +285 -0
- package/.next/dev/server/chunks/ssr/[root-of-the-server]__0je5zm2._.js.map +9 -0
- package/.next/dev/server/chunks/ssr/node_modules_01ed9g5._.js +6621 -0
- package/.next/dev/server/chunks/ssr/node_modules_01ed9g5._.js.map +76 -0
- package/.next/dev/server/chunks/ssr/node_modules_129w7gn._.js +4399 -0
- package/.next/dev/server/chunks/ssr/node_modules_129w7gn._.js.map +35 -0
- package/.next/dev/server/chunks/ssr/node_modules_next_12i4inu._.js +55 -0
- package/.next/dev/server/chunks/ssr/node_modules_next_12i4inu._.js.map +7 -0
- package/.next/dev/server/middleware-build-manifest.js +50 -0
- package/.next/dev/server/next-font-manifest.js +1 -0
- package/.next/dev/server/next-font-manifest.json +11 -0
- package/.next/dev/server/pages/_app/build-manifest.json +23 -0
- package/.next/dev/server/pages/_app/client-build-manifest.json +5 -0
- package/.next/dev/server/pages/_app/next-font-manifest.json +6 -0
- package/.next/dev/server/pages/_app/pages-manifest.json +3 -0
- package/.next/dev/server/pages/_app/react-loadable-manifest.json +1 -0
- package/.next/dev/server/pages/_app.js +4 -0
- package/.next/dev/server/pages/_app.js.map +5 -0
- package/.next/dev/server/pages/_document/next-font-manifest.json +6 -0
- package/.next/dev/server/pages/_document/pages-manifest.json +3 -0
- package/.next/dev/server/pages/_document/react-loadable-manifest.json +1 -0
- package/.next/dev/server/pages/_document.js +5 -0
- package/.next/dev/server/pages/_document.js.map +5 -0
- package/.next/dev/server/pages/_error/build-manifest.json +22 -0
- package/.next/dev/server/pages/_error/client-build-manifest.json +5 -0
- package/.next/dev/server/pages/_error/next-font-manifest.json +6 -0
- package/.next/dev/server/pages/_error/pages-manifest.json +3 -0
- package/.next/dev/server/pages/_error/react-loadable-manifest.json +1 -0
- package/.next/dev/server/pages/_error.js +8 -0
- package/.next/dev/server/pages/_error.js.map +5 -0
- package/.next/dev/server/pages-manifest.json +5 -0
- package/.next/dev/static/chunks/[next]_entry_page-loader_ts_0j~flwh._.js +23 -0
- package/.next/dev/static/chunks/[next]_entry_page-loader_ts_0j~flwh._.js.map +6 -0
- package/.next/dev/static/chunks/[next]_entry_page-loader_ts_0rqw6yo._.js +23 -0
- package/.next/dev/static/chunks/[next]_entry_page-loader_ts_0rqw6yo._.js.map +6 -0
- package/.next/dev/static/chunks/[root-of-the-server]__01mw43t._.js +476 -0
- package/.next/dev/static/chunks/[root-of-the-server]__01mw43t._.js.map +6 -0
- package/.next/dev/static/chunks/[root-of-the-server]__0c0okpg._.js +476 -0
- package/.next/dev/static/chunks/[root-of-the-server]__0c0okpg._.js.map +6 -0
- package/.next/dev/static/chunks/node_modules_0lx093h._.js +1343 -0
- package/.next/dev/static/chunks/node_modules_0lx093h._.js.map +13 -0
- package/.next/dev/static/chunks/node_modules_next_app_0jt-zj..js +8 -0
- package/.next/dev/static/chunks/node_modules_next_app_0jt-zj..js.map +6 -0
- package/.next/dev/static/chunks/node_modules_next_dist_0rt-2cr._.js +2334 -0
- package/.next/dev/static/chunks/node_modules_next_dist_0rt-2cr._.js.map +26 -0
- package/.next/dev/static/chunks/node_modules_next_dist_0u_w_5s._.js +2165 -0
- package/.next/dev/static/chunks/node_modules_next_dist_0u_w_5s._.js.map +25 -0
- package/.next/dev/static/chunks/node_modules_next_dist_client_0pe1dg-._.js +4091 -0
- package/.next/dev/static/chunks/node_modules_next_dist_client_0pe1dg-._.js.map +49 -0
- package/.next/dev/static/chunks/node_modules_next_dist_compiled_0o6l_m6._.js +6064 -0
- package/.next/dev/static/chunks/node_modules_next_dist_compiled_0o6l_m6._.js.map +17 -0
- package/.next/dev/static/chunks/node_modules_next_dist_shared_lib_0ek5eq7._.js +6535 -0
- package/.next/dev/static/chunks/node_modules_next_dist_shared_lib_0ek5eq7._.js.map +72 -0
- package/.next/dev/static/chunks/node_modules_next_dist_shared_lib_0n1wg2c._.js +6294 -0
- package/.next/dev/static/chunks/node_modules_next_dist_shared_lib_0n1wg2c._.js.map +70 -0
- package/.next/dev/static/chunks/node_modules_react-dom_0bruynb._.js +15381 -0
- package/.next/dev/static/chunks/node_modules_react-dom_0bruynb._.js.map +9 -0
- package/.next/dev/static/chunks/pages/_app.js +13 -0
- package/.next/dev/static/chunks/pages/_error.js +12 -0
- package/.next/dev/static/chunks/pages__app_0-bg2z-._.js.map +11 -0
- package/.next/dev/static/chunks/pages__app_07xvfw~._.js +5 -0
- package/.next/dev/static/chunks/pages__error_0.i_zsq._.js.map +11 -0
- package/.next/dev/static/chunks/pages__error_07xvfw~._.js +5 -0
- package/.next/dev/static/chunks/turbopack-pages__app_0-bg2z-._.js +2236 -0
- package/.next/dev/static/chunks/turbopack-pages__error_0.i_zsq._.js +2236 -0
- package/.next/diagnostics/route-bundle-stats.json +1 -1
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/configs/route.js.nft.json +1 -1
- package/.next/server/app/api/context/aider/route.js.nft.json +1 -1
- package/.next/server/app/api/context/claude/route.js.nft.json +1 -1
- package/.next/server/app/api/context/route.js.nft.json +1 -1
- package/.next/server/app/api/context/ssh/route.js.nft.json +1 -1
- package/.next/server/app/api/recents/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/inject/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/input/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/launch/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/scope/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/start/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/stats/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/stop/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/upload-image/route.js.nft.json +1 -1
- package/.next/server/app/api/sql/connections/route.js.nft.json +1 -1
- package/.next/server/app/api/sql/mcp/route.js.nft.json +1 -1
- package/.next/server/app/api/sql/query/route.js.nft.json +1 -1
- package/.next/server/app/api/sql/schema/route.js.nft.json +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +2 -2
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/page/react-loadable-manifest.json +3 -3
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0tq0maq._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0tq0maq._.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{008bf~h8rh5_3.js → 0fxouf2n_5adf.js} +1 -1
- package/.next/static/chunks/{00pgauqedvo01.js → 0r3x2gcn0sde..js} +1 -1
- package/.next/static/chunks/11c6f8pb_6s91.js +4 -0
- package/.next/trace +1 -1
- package/.next/trace-build +1 -1
- package/package.json +1 -1
- package/src/app/components/MarkdownPreview.tsx +17 -10
- package/src/app/components/TerminalConsole.tsx +25 -11
- package/.next/static/chunks/0ii_nb0g40rmj.js +0 -4
- /package/.next/static/{EglcK14vXeSWIjxjJCP9A → llmJsGQafolZV5_sqEw4l}/_buildManifest.js +0 -0
- /package/.next/static/{EglcK14vXeSWIjxjJCP9A → llmJsGQafolZV5_sqEw4l}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{EglcK14vXeSWIjxjJCP9A → llmJsGQafolZV5_sqEw4l}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": [],
|
|
4
|
+
"sections": [
|
|
5
|
+
{"offset": {"line": 64, "column": 0}, "map": {"version":3,"sources":["file:///C:/Users/Dave/OneDrive/Projects/JS/neural-loom/src/lib/agents/AgentRunner.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\n\nexport interface RunnerStatus {\n id: string;\n name: string;\n type: 'mock' | 'claude' | 'claude-docker' | 'claude-ssh' | 'aider' | 'aider-docker' | 'shell';\n status: 'idle' | 'running' | 'stopped';\n createdAt: string;\n logsCount: number;\n workspaceRoot?: string;\n scopedDirs?: string[];\n lastSyncedWorkspaceFolders?: string[];\n tokenUsage?: { input: number; output: number; cost: number };\n agentState?: 'idle' | 'thinking' | 'complete' | 'needs-input';\n}\n\nexport interface TokenTransaction {\n timestamp: string;\n sessionId: string;\n sessionName: string;\n type: string;\n inputTokens: number;\n outputTokens: number;\n cost: number;\n totalInput: number;\n totalOutput: number;\n totalCost: number;\n}\n\nexport abstract class AgentRunner {\n abstract id: string;\n abstract name: string;\n abstract type: 'mock' | 'claude' | 'claude-docker' | 'claude-ssh' | 'aider' | 'aider-docker' | 'shell';\n abstract status: 'idle' | 'running' | 'stopped';\n abstract createdAt: string;\n abstract logs: string[];\n workspaceRoot?: string;\n scopedDirs?: string[];\n lastSyncedWorkspaceFolders?: string[];\n tokenUsage: { input: number; output: number; cost: number } = { input: 0, output: 0, cost: 0 };\n agentState: 'idle' | 'thinking' | 'complete' | 'needs-input' = 'idle';\n protected hasAnalyzedInitialState = false;\n private stateTimer: NodeJS.Timeout | null = null;\n private idleTimer: NodeJS.Timeout | null = null;\n private lastLoggedUsage = { input: 0, output: 0, cost: 0 };\n\n public resetInitialStateAnalysis(): void {\n this.hasAnalyzedInitialState = false;\n }\n\n protected logTokenUsageUpdate(): void {\n if (\n this.tokenUsage.input === this.lastLoggedUsage.input &&\n this.tokenUsage.output === this.lastLoggedUsage.output &&\n this.tokenUsage.cost === this.lastLoggedUsage.cost\n ) {\n return;\n }\n\n const diffInput = this.tokenUsage.input - this.lastLoggedUsage.input;\n const diffOutput = this.tokenUsage.output - this.lastLoggedUsage.output;\n const diffCost = this.tokenUsage.cost - this.lastLoggedUsage.cost;\n\n if (diffInput > 0 || diffOutput > 0 || diffCost > 0) {\n try {\n const configDir = path.join(process.cwd(), \".ai\", \"neural-loom\");\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n const historyFile = path.join(configDir, \"token-history.json\");\n let history: TokenTransaction[] = [];\n if (fs.existsSync(historyFile)) {\n try {\n history = JSON.parse(fs.readFileSync(historyFile, \"utf8\")) || [];\n } catch {\n history = [];\n }\n }\n\n history.push({\n timestamp: new Date().toISOString(),\n sessionId: this.id,\n sessionName: this.name,\n type: this.type,\n inputTokens: diffInput > 0 ? diffInput : 0,\n outputTokens: diffOutput > 0 ? diffOutput : 0,\n cost: diffCost > 0 ? diffCost : 0,\n totalInput: this.tokenUsage.input,\n totalOutput: this.tokenUsage.output,\n totalCost: this.tokenUsage.cost\n });\n\n fs.writeFileSync(historyFile, JSON.stringify(history, null, 2), \"utf8\");\n this.lastLoggedUsage = { ...this.tokenUsage };\n } catch (err) {\n console.error(\"[AgentRunner] Failed to log token usage transaction:\", err);\n }\n }\n }\n\n protected parseTokenUsage(data: string): void {\n const cleanData = data.replace(/\\x1b\\[[0-9;]*m/g, \"\"); // Strip ANSI colors\n\n // Regex for cost\n const costMatch = cleanData.match(/(?:cost|estimated cost)[:\\s]*\\$([0-9.]+)/i);\n if (costMatch) {\n this.tokenUsage.cost = parseFloat(costMatch[1]);\n }\n\n const parseNum = (str: string): number => {\n str = str.replace(/,/g, '').toLowerCase().trim();\n if (str.endsWith('k')) {\n return parseFloat(str.slice(0, -1)) * 1000;\n }\n if (str.endsWith('m')) {\n return parseFloat(str.slice(0, -1)) * 1000000;\n }\n return parseInt(str, 10) || 0;\n };\n\n // Tokens pattern: \"Tokens: 1,500 sent, 300 received\" or \"1.5k sent, 0.3k received\"\n const tokensPattern1 = /tokens?[:\\s]*([0-9,.]+[km]?)\\s*(?:sent|input|prompt)[^a-zA-Z0-9]+([0-9,.]+[km]?)\\s*(?:received|output|completion)/i;\n const match1 = cleanData.match(tokensPattern1);\n if (match1) {\n this.tokenUsage.input = parseNum(match1[1]);\n this.tokenUsage.output = parseNum(match1[2]);\n } else {\n // Try separate matches\n const inputMatch = cleanData.match(/([0-9,.]+[km]?)\\s*(?:sent|input|prompt)\\s*tokens?/i) || cleanData.match(/tokens?\\s*(?:sent|input|prompt)[:\\s]*([0-9,.]+[km]?)/i);\n if (inputMatch) {\n this.tokenUsage.input = parseNum(inputMatch[1]);\n }\n const outputMatch = cleanData.match(/([0-9,.]+[km]?)\\s*(?:received|output|completion)\\s*tokens?/i) || cleanData.match(/tokens?\\s*(?:received|output|completion)[:\\s]*([0-9,.]+[km]?)/i);\n if (outputMatch) {\n this.tokenUsage.output = parseNum(outputMatch[1]);\n }\n }\n\n // Fallback cost estimation if input/output is updated but cost is 0/unmatched\n if (this.tokenUsage.cost === 0 && (this.tokenUsage.input > 0 || this.tokenUsage.output > 0)) {\n this.tokenUsage.cost = (this.tokenUsage.input * 0.000003) + (this.tokenUsage.output * 0.000015);\n }\n this.logTokenUsageUpdate();\n }\n\n abstract start(resume?: boolean): Promise<void>;\n abstract stop(): Promise<void>;\n abstract sendInput(text: string, isRaw?: boolean): Promise<void>;\n getStatus(): RunnerStatus {\n if (!this.hasAnalyzedInitialState && this.status === 'running') {\n this.analyzeState();\n this.hasAnalyzedInitialState = true;\n }\n return {\n id: this.id,\n name: this.name,\n type: this.type,\n status: this.status,\n createdAt: this.createdAt,\n logsCount: this.logs.length,\n workspaceRoot: this.workspaceRoot || (this.type === 'shell' ? (process.env.ORIGINAL_CWD || process.cwd()) : undefined),\n scopedDirs: this.scopedDirs,\n lastSyncedWorkspaceFolders: this.lastSyncedWorkspaceFolders,\n tokenUsage: this.tokenUsage,\n agentState: this.agentState\n };\n }\n \n resize(_cols: number, _rows: number): void {\n // No-op by default, overridden by PTY runners\n }\n\n protected listeners: ((data: string) => void)[] = [];\n\n public onOutput(callback: (data: string) => void): void {\n this.listeners.push(callback);\n }\n\n public offOutput(callback: (data: string) => void): void {\n this.listeners = this.listeners.filter(cb => cb !== callback);\n }\n\n protected emitOutput(data: string): void {\n this.updateAgentState(data);\n this.listeners.forEach(cb => cb(data));\n }\n\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n protected async writeToPty(ptyProcess: any, text: string): Promise<void> {\n if (!ptyProcess) return;\n const isWin = process.platform === \"win32\";\n if (isWin && text.length > 100) {\n const chunkSize = 128;\n for (let i = 0; i < text.length; i += chunkSize) {\n const chunk = text.slice(i, i + chunkSize);\n ptyProcess.write(chunk);\n await new Promise((resolve) => setTimeout(resolve, 10));\n }\n } else {\n ptyProcess.write(text);\n }\n }\n\n protected updateAgentState(newData: string): void {\n if (this.status !== 'running') {\n this.agentState = 'idle';\n return;\n }\n\n const isTelemetry = /\\[Telemetry\\]/i.test(newData);\n\n if (newData.trim().length > 0 && !isTelemetry) {\n this.agentState = 'thinking';\n }\n\n if (this.stateTimer) {\n clearTimeout(this.stateTimer);\n }\n\n this.stateTimer = setTimeout(() => {\n this.analyzeState();\n }, 800);\n }\n\n private analyzeState(): void {\n if (this.status !== 'running') {\n this.agentState = 'idle';\n return;\n }\n\n // Filter out telemetry lines to prevent shifting the prompt/question out of the logs tail\n const nonTelemetryLogs = this.logs.filter(line => !/\\[Telemetry\\]/i.test(line));\n const tailLines = nonTelemetryLogs.slice(-5).join(\"\");\n const cleanTail = tailLines.replace(/\\x1b\\[[0-9;]*[a-zA-Z]/g, \"\").trim();\n\n const isPrompt = \n cleanTail.endsWith(\">\") || \n cleanTail.endsWith(\"> \") ||\n /([a-zA-Z0-9_-]+>\\s*)$/.test(cleanTail) ||\n cleanTail.endsWith(\"$\") ||\n cleanTail.endsWith(\"$ \");\n\n const isQuestion = \n /(\\[y\\/n\\]|\\(y\\/n\\)|\\?|confirm|allow|should I|would you|press enter|proceed)/i.test(cleanTail);\n\n if (isPrompt) {\n if (this.agentState === 'thinking' || this.agentState === 'needs-input') {\n this.agentState = 'complete';\n \n if (this.idleTimer) clearTimeout(this.idleTimer);\n this.idleTimer = setTimeout(() => {\n if (this.agentState === 'complete') {\n this.agentState = 'idle';\n }\n }, 5000);\n }\n } else if (isQuestion) {\n this.agentState = 'needs-input';\n }\n }\n}\n"],"names":["AgentRunner","workspaceRoot","scopedDirs","lastSyncedWorkspaceFolders","tokenUsage","input","output","cost","agentState","hasAnalyzedInitialState","stateTimer","idleTimer","lastLoggedUsage","resetInitialStateAnalysis","logTokenUsageUpdate","diffInput","diffOutput","diffCost","configDir","join","process","cwd","existsSync","mkdirSync","recursive","historyFile","history","JSON","parse","readFileSync","push","timestamp","Date","toISOString","sessionId","id","sessionName","name","type","inputTokens","outputTokens","totalInput","totalOutput","totalCost","writeFileSync","stringify","err","console","error","parseTokenUsage","data","cleanData","replace","costMatch","match","parseFloat","parseNum","str","toLowerCase","trim","endsWith","slice","parseInt","tokensPattern1","match1","inputMatch","outputMatch","getStatus","status","analyzeState","createdAt","logsCount","logs","length","env","ORIGINAL_CWD","undefined","resize","_cols","_rows","listeners","onOutput","callback","offOutput","filter","cb","emitOutput","updateAgentState","forEach","writeToPty","ptyProcess","text","isWin","platform","chunkSize","i","chunk","write","Promise","resolve","setTimeout","newData","isTelemetry","test","clearTimeout","nonTelemetryLogs","line","tailLines","cleanTail","isPrompt","isQuestion"],"mappings":"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"}},
|
|
6
|
+
{"offset": {"line": 277, "column": 0}, "map": {"version":3,"sources":["file:///C:/Users/Dave/OneDrive/Projects/JS/neural-loom/src/lib/config.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport os from \"os\";\n\nlet cachedConfigDir: string | null = null;\n\nexport function getConfigDir(): string {\n if (cachedConfigDir) {\n return cachedConfigDir;\n }\n\n const primaryDir = path.join(process.env.ORIGINAL_CWD || process.cwd(), \".ai\", \"neural-loom\");\n \n try {\n // Check if primary directory exists. If not, try to create it.\n if (!fs.existsSync(primaryDir)) {\n fs.mkdirSync(primaryDir, { recursive: true });\n }\n // Perform a test write to verify write permissions (crucial for read-only directories like C:\\Program Files)\n const testFile = path.join(primaryDir, \".write-test-\" + Math.random().toString(36).substring(7));\n fs.writeFileSync(testFile, \"test\");\n fs.unlinkSync(testFile);\n cachedConfigDir = primaryDir;\n return primaryDir;\n } catch (err) {\n // If EPERM or any other write error occurs, fall back to the user's home directory\n console.warn(`[Config] Primary config dir is not writable (${primaryDir}). Falling back to home directory.`);\n const fallbackDir = path.join(os.homedir(), \".ai\", \"neural-loom\");\n try {\n if (!fs.existsSync(fallbackDir)) {\n fs.mkdirSync(fallbackDir, { recursive: true });\n }\n cachedConfigDir = fallbackDir;\n return fallbackDir;\n } catch (fallbackErr) {\n console.error(\"[Config] Fallback config dir is also not writable!\", fallbackErr);\n cachedConfigDir = primaryDir;\n return primaryDir;\n }\n }\n}\n\nexport function isDirWritable(dir: string): boolean {\n try {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n const testFile = path.join(dir, \".write-test-\" + Math.random().toString(36).substring(7));\n fs.writeFileSync(testFile, \"test\");\n fs.unlinkSync(testFile);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isSystemDirectory(dir: string): boolean {\n const normalized = dir.toLowerCase().replace(/\\\\/g, \"/\");\n return (\n normalized.includes(\"/program files\") ||\n normalized.includes(\"/windows/system32\") ||\n normalized.includes(\"/winnt\") ||\n normalized.startsWith(\"/usr/\") ||\n normalized.startsWith(\"/bin/\") ||\n normalized.startsWith(\"/sbin/\") ||\n normalized.startsWith(\"/etc/\") ||\n normalized.startsWith(\"/var/\")\n );\n}\n\nexport function getDefaultWorkspaceRoot(): string {\n const launchDir = process.env.ORIGINAL_CWD || process.cwd();\n \n if (isDirWritable(launchDir) && !isSystemDirectory(launchDir)) {\n return launchDir.replace(/\\\\/g, \"/\");\n }\n \n const home = os.homedir();\n const commonDirs = [\n path.join(home, \"OneDrive\", \"Projects\"),\n path.join(home, \"Projects\"),\n path.join(home, \"source\", \"repos\"),\n path.join(home, \"Documents\"),\n home\n ];\n \n for (const dir of commonDirs) {\n try {\n if (fs.existsSync(dir) && isDirWritable(dir)) {\n return dir.replace(/\\\\/g, \"/\");\n }\n } catch {\n // Continue checking\n }\n }\n \n return home.replace(/\\\\/g, \"/\");\n}\n\n"],"names":["cachedConfigDir","getConfigDir","primaryDir","join","process","env","ORIGINAL_CWD","cwd","existsSync","mkdirSync","recursive","testFile","Math","random","toString","substring","writeFileSync","unlinkSync","err","console","warn","fallbackDir","homedir","fallbackErr","error","isDirWritable","dir","isSystemDirectory","normalized","toLowerCase","replace","includes","startsWith","getDefaultWorkspaceRoot","launchDir","home","commonDirs"],"mappings":"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"}},
|
|
7
|
+
{"offset": {"line": 378, "column": 0}, "map": {"version":3,"sources":["file:///C:/Users/Dave/OneDrive/Projects/JS/neural-loom/src/lib/agents/SessionPersister.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport { getConfigDir } from \"../config\";\n\nexport interface PersistedSession {\n id: string;\n name: string;\n type: string;\n status: 'idle' | 'running' | 'stopped';\n createdAt: string;\n logs: string[];\n workspaceRoot?: string;\n scopedDirs?: string[];\n lastSyncedWorkspaceFolders?: string[];\n}\n\nexport class SessionPersister {\n private static pendingSaves = new Map<string, NodeJS.Timeout>();\n private static pendingData = new Map<string, PersistedSession>();\n\n private static getSessionsDir(): string {\n const dir = path.join(getConfigDir(), \"sessions\");\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n return dir;\n }\n\n public static saveSession(\n session: { id: string; name: string; type: string; status: string; createdAt: string; logs: string[]; workspaceRoot?: string; scopedDirs?: string[]; lastSyncedWorkspaceFolders?: string[] },\n immediate = false\n ) {\n const data: PersistedSession = {\n id: session.id,\n name: session.name,\n type: session.type,\n status: (session.status === 'running' && session.type === 'mock') ? 'running' : session.status as 'idle' | 'running' | 'stopped', // Mock sessions can persist as running or restart\n createdAt: session.createdAt,\n logs: session.logs,\n workspaceRoot: session.workspaceRoot,\n scopedDirs: session.scopedDirs,\n lastSyncedWorkspaceFolders: session.lastSyncedWorkspaceFolders\n };\n\n if (immediate) {\n // Clear any pending debounced save\n const timer = this.pendingSaves.get(session.id);\n if (timer) {\n clearTimeout(timer);\n this.pendingSaves.delete(session.id);\n }\n this.pendingData.delete(session.id);\n this.writeToDisk(session.id, data);\n return;\n }\n\n // Update pending data\n this.pendingData.set(session.id, data);\n\n // Schedule save if not already scheduled\n if (!this.pendingSaves.has(session.id)) {\n const timer = setTimeout(() => {\n this.pendingSaves.delete(session.id);\n const dataToWrite = this.pendingData.get(session.id);\n if (dataToWrite) {\n this.pendingData.delete(session.id);\n this.writeToDisk(session.id, dataToWrite);\n }\n }, 1000); // 1-second debounce\n this.pendingSaves.set(session.id, timer);\n }\n }\n\n private static writeToDisk(id: string, data: PersistedSession) {\n try {\n const dir = this.getSessionsDir();\n const filePath = path.join(dir, `${id}.json`);\n fs.writeFile(filePath, JSON.stringify(data, null, 2), \"utf8\", (err) => {\n if (err) {\n console.error(`[SessionPersister] Failed to save session ${id} asynchronously:`, err);\n }\n });\n } catch (err) {\n console.error(`[SessionPersister] Failed to save session ${id}:`, err);\n }\n }\n\n public static loadAllSessions(): PersistedSession[] {\n try {\n const dir = this.getSessionsDir();\n const files = fs.readdirSync(dir);\n const sessions: PersistedSession[] = [];\n\n for (const file of files) {\n if (file.endsWith(\".json\")) {\n const filePath = path.join(dir, file);\n try {\n const raw = fs.readFileSync(filePath, \"utf8\");\n const data: PersistedSession = JSON.parse(raw);\n // On server restart, active PTY processes (which are dead) are marked stopped\n if (data.status === \"running\" && data.type !== \"mock\") {\n data.status = \"stopped\";\n data.logs.push(\"\\r\\n\\x1b[1;31m[System] Server restarted. Terminal connection lost.\\x1b[0m\\r\\n\");\n // Save the updated status back to disk\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), \"utf8\");\n }\n sessions.push(data);\n } catch (fileErr) {\n console.error(`[SessionPersister] Failed to load session file ${file}:`, fileErr);\n }\n }\n }\n return sessions;\n } catch (err) {\n console.error(\"[SessionPersister] Failed to load sessions:\", err);\n return [];\n }\n }\n\n public static cancelPendingSave(id: string) {\n const timer = this.pendingSaves.get(id);\n if (timer) {\n clearTimeout(timer);\n this.pendingSaves.delete(id);\n }\n this.pendingData.delete(id);\n }\n\n public static deleteSession(id: string) {\n this.cancelPendingSave(id);\n try {\n const dir = this.getSessionsDir();\n const filePath = path.join(dir, `${id}.json`);\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n } catch (err) {\n console.error(`[SessionPersister] Failed to delete session ${id}:`, err);\n }\n }\n}\n"],"names":["SessionPersister","pendingSaves","Map","pendingData","getSessionsDir","dir","join","existsSync","mkdirSync","recursive","saveSession","session","immediate","data","id","name","type","status","createdAt","logs","workspaceRoot","scopedDirs","lastSyncedWorkspaceFolders","timer","get","clearTimeout","delete","writeToDisk","set","has","setTimeout","dataToWrite","filePath","writeFile","JSON","stringify","err","console","error","loadAllSessions","files","readdirSync","sessions","file","endsWith","raw","readFileSync","parse","push","writeFileSync","fileErr","cancelPendingSave","deleteSession","unlinkSync"],"mappings":"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"}},
|
|
8
|
+
{"offset": {"line": 506, "column": 0}, "map": {"version":3,"sources":["file:///C:/Users/Dave/OneDrive/Projects/JS/neural-loom/src/lib/agents/MockRunner.ts"],"sourcesContent":["import { AgentRunner } from \"./AgentRunner\";\nimport { SessionPersister } from \"./SessionPersister\";\n\nexport class MockRunner extends AgentRunner {\n id: string;\n name: string;\n type: 'mock' | 'claude' | 'claude-docker' | 'claude-ssh' | 'aider' | 'aider-docker' | 'shell' = 'mock';\n status: 'idle' | 'running' | 'stopped' = 'idle';\n createdAt: string;\n logs: string[] = [];\n \n private intervalId: NodeJS.Timeout | null = null;\n private awaitingConfirmation = false;\n private mockSteps = [\n \"[NeuralLoom] Loading virtual PTY context...\",\n \"[NeuralLoom] Spawning sandbox mock runtime environment...\",\n \"[Mock Agent] Model online (v2.0-mock-flash). Dedicated memory allocated.\",\n \"[Mock Agent] System rules parsed successfully from global context registry.\",\n \"[Mock Agent] Awaiting developer commands. Type '/help' to list mock skills.\",\n \"mock-agent> \"\n ];\n private stepIndex = 0;\n\n constructor(id: string, name?: string) {\n super();\n this.id = id;\n this.name = name || `Mock Session ${id.substring(0, 8)}`;\n this.createdAt = new Date().toISOString();\n }\n\n private appendLog(line: string) {\n this.logs.push(line);\n this.parseTokenUsage(line);\n this.emitOutput(line + \"\\r\\n\");\n SessionPersister.saveSession(this);\n }\n\n async start(resume?: boolean): Promise<void> {\n if (this.status === 'running') return;\n this.status = 'running';\n \n // Add banner\n this.appendLog(\"\\x1b[1;35m==================================================\\x1b[0m\");\n this.appendLog(\"\\x1b[1;36m NEURALLOOM SIMULATED AGENT ENVIRONMENT \\x1b[0m\");\n this.appendLog(\"\\x1b[1;35m==================================================\\x1b[0m\");\n \n // Post initial log immediately\n if (this.stepIndex < this.mockSteps.length) {\n this.appendLog(this.mockSteps[this.stepIndex++]);\n }\n\n // Schedule subsequent logs\n this.intervalId = setInterval(() => {\n this.tokenUsage.input += Math.floor(Math.random() * 50) + 10;\n this.tokenUsage.output += Math.floor(Math.random() * 20) + 5;\n this.tokenUsage.cost = (this.tokenUsage.input * 0.000003) + (this.tokenUsage.output * 0.000015);\n\n if (this.stepIndex < this.mockSteps.length) {\n this.appendLog(this.mockSteps[this.stepIndex++]);\n } else {\n // Just general ambient telemetry mock log\n const time = new Date().toLocaleTimeString();\n this.appendLog(`[${time}] [Telemetry] CPU utilization 1.2% | Memory 142MB | Link stable.`);\n }\n }, 4000);\n }\n\n async stop(): Promise<void> {\n this.status = 'stopped';\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n this.appendLog(\"\\x1b[1;31m[System] Process terminated. Connection closed.\\x1b[0m\");\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async sendInput(text: string, _isRaw?: boolean): Promise<void> {\n if (this.status !== 'running') {\n this.appendLog(`\\x1b[1;31m[Error] Cannot write input: process is ${this.status}.\\x1b[0m`);\n return;\n }\n \n // Echo the command back as user prompt\n this.appendLog(`\\x1b[1;32m> ${text}\\x1b[0m`);\n\n // Simulated parser responses\n setTimeout(() => {\n const cleanInput = text.trim().toLowerCase();\n\n if (this.awaitingConfirmation) {\n if (cleanInput === 'y' || cleanInput === 'yes') {\n this.appendLog(\"[Mock Agent] Proceeding with production deployment...\");\n setTimeout(() => {\n this.appendLog(\"[Mock Agent] Deploying build artifacts to edge network...\");\n this.appendLog(\"[Mock Agent] Deployment complete. Site live!\");\n this.appendLog(\"mock-agent> \");\n }, 1000);\n } else if (cleanInput === 'n' || cleanInput === 'no') {\n this.appendLog(\"[Mock Agent] Deployment aborted.\");\n this.appendLog(\"mock-agent> \");\n } else {\n this.appendLog(\"[Mock Agent] Invalid input. Please confirm with y/n:\");\n return; // Remain in confirmation state\n }\n this.awaitingConfirmation = false;\n return;\n }\n\n if (cleanInput === '/help') {\n this.appendLog(\"[Mock Agent] Available commands:\");\n this.appendLog(\" /help - List available mock commands.\");\n this.appendLog(\" /status - Fetch current agent diagnostic metrics.\");\n this.appendLog(\" /context - View loaded staging files.\");\n this.appendLog(\" /deploy - Trigger production deployment wizard (requires confirmation).\");\n this.appendLog(\" /clear - Flush terminal console buffer.\");\n this.appendLog(\"mock-agent> \");\n } else if (cleanInput === '/status') {\n this.appendLog(\"[Mock Agent] Diagnostics:\");\n this.appendLog(\" - Connection Type: WebSocket gateway (mock)\");\n this.appendLog(` - Active Runtime: ${this.id}`);\n this.appendLog(\" - Sandbox State: Healthy (0 warnings)\");\n this.appendLog(\"mock-agent> \");\n } else if (cleanInput === '/context') {\n this.appendLog(\"[Mock Agent] Loaded Workspace Context Files:\");\n this.appendLog(\" - [Mounted] src/app/globals.css (Modified)\");\n this.appendLog(\" - [Mounted] src/app/page.tsx\");\n this.appendLog(\"mock-agent> \");\n } else if (cleanInput === '/deploy') {\n this.appendLog(\"[Mock Agent] Starting production deployment...\");\n this.appendLog(\"[Mock Agent] Warning: This will push current local build to server.\");\n this.appendLog(\"[Mock Agent] Are you sure you want to proceed? (y/n)\");\n this.awaitingConfirmation = true;\n } else if (cleanInput === '/clear') {\n this.logs = [];\n this.appendLog(\"\\x1b[1;33m[Console Cleared]\\x1b[0m\");\n this.appendLog(\"mock-agent> \");\n } else {\n this.appendLog(`[Mock Agent] Received command: \"${text}\". Processing...`);\n setTimeout(() => {\n this.appendLog(`[Mock Agent] Done. Task simulated successfully.`);\n this.appendLog(\"mock-agent> \");\n }, 1500);\n }\n }, 400);\n }\n}\n\n"],"names":["MockRunner","id","name","type","status","createdAt","logs","intervalId","awaitingConfirmation","mockSteps","stepIndex","substring","Date","toISOString","appendLog","line","push","parseTokenUsage","emitOutput","saveSession","start","resume","length","setInterval","tokenUsage","input","Math","floor","random","output","cost","time","toLocaleTimeString","stop","clearInterval","sendInput","text","_isRaw","setTimeout","cleanInput","trim","toLowerCase"],"mappings":";;;;AAAA;AACA;;;AAEO,MAAMA,mBAAmB,oJAAW;IACzCC,GAAW;IACXC,KAAa;IACbC,OAAgG,OAAO;IACvGC,SAAyC,OAAO;IAChDC,UAAkB;IAClBC,OAAiB,EAAE,CAAC;IAEZC,aAAoC,KAAK;IACzCC,uBAAuB,MAAM;IAC7BC,YAAY;QAClB;QACA;QACA;QACA;QACA;QACA;KACD,CAAC;IACMC,YAAY,EAAE;IAEtBV,YAAYC,EAAU,EAAEC,IAAa,CAAE;QACrC,KAAK;QACL,IAAI,CAACD,EAAE,GAAGA;QACV,IAAI,CAACC,IAAI,GAAGA,QAAQ,CAAC,aAAa,EAAED,GAAGU,SAAS,CAAC,GAAG,IAAI;QACxD,IAAI,CAACN,SAAS,GAAG,IAAIO,OAAOC,WAAW;IACzC;IAEQC,UAAUC,IAAY,EAAE;QAC9B,IAAI,CAACT,IAAI,CAACU,IAAI,CAACD;QACf,IAAI,CAACE,eAAe,CAACF;QACrB,IAAI,CAACG,UAAU,CAACH,OAAO;QACvB,8JAAgB,CAACI,WAAW,CAAC,IAAI;IACnC;IAEA,MAAMC,MAAMC,MAAgB,EAAiB;QAC3C,IAAI,IAAI,CAACjB,MAAM,KAAK,WAAW;QAC/B,IAAI,CAACA,MAAM,GAAG;QAEd,aAAa;QACb,IAAI,CAACU,SAAS,CAAC;QACf,IAAI,CAACA,SAAS,CAAC;QACf,IAAI,CAACA,SAAS,CAAC;QAEf,+BAA+B;QAC/B,IAAI,IAAI,CAACJ,SAAS,GAAG,IAAI,CAACD,SAAS,CAACa,MAAM,EAAE;YAC1C,IAAI,CAACR,SAAS,CAAC,IAAI,CAACL,SAAS,CAAC,IAAI,CAACC,SAAS,GAAG;QACjD;QAEA,2BAA2B;QAC3B,IAAI,CAACH,UAAU,GAAGgB,YAAY;YAC5B,IAAI,CAACC,UAAU,CAACC,KAAK,IAAIC,KAAKC,KAAK,CAACD,KAAKE,MAAM,KAAK,MAAM;YAC1D,IAAI,CAACJ,UAAU,CAACK,MAAM,IAAIH,KAAKC,KAAK,CAACD,KAAKE,MAAM,KAAK,MAAM;YAC3D,IAAI,CAACJ,UAAU,CAACM,IAAI,GAAG,AAAC,IAAI,CAACN,UAAU,CAACC,KAAK,GAAG,WAAa,IAAI,CAACD,UAAU,CAACK,MAAM,GAAG;YAEtF,IAAI,IAAI,CAACnB,SAAS,GAAG,IAAI,CAACD,SAAS,CAACa,MAAM,EAAE;gBAC1C,IAAI,CAACR,SAAS,CAAC,IAAI,CAACL,SAAS,CAAC,IAAI,CAACC,SAAS,GAAG;YACjD,OAAO;gBACL,0CAA0C;gBAC1C,MAAMqB,OAAO,IAAInB,OAAOoB,kBAAkB;gBAC1C,IAAI,CAAClB,SAAS,CAAC,CAAC,CAAC,EAAEiB,KAAK,gEAAgE,CAAC;YAC3F;QACF,GAAG;IACL;IAEA,MAAME,OAAsB;QAC1B,IAAI,CAAC7B,MAAM,GAAG;QACd,IAAI,IAAI,CAACG,UAAU,EAAE;YACnB2B,cAAc,IAAI,CAAC3B,UAAU;YAC7B,IAAI,CAACA,UAAU,GAAG;QACpB;QACA,IAAI,CAACO,SAAS,CAAC;IACjB;IAEA,6DAA6D;IAC7D,MAAMqB,UAAUC,IAAY,EAAEC,MAAgB,EAAiB;QAC7D,IAAI,IAAI,CAACjC,MAAM,KAAK,WAAW;YAC7B,IAAI,CAACU,SAAS,CAAC,CAAC,iDAAiD,EAAE,IAAI,CAACV,MAAM,CAAC,QAAQ,CAAC;YACxF;QACF;QAEA,uCAAuC;QACvC,IAAI,CAACU,SAAS,CAAC,CAAC,YAAY,EAAEsB,KAAK,OAAO,CAAC;QAE3C,6BAA6B;QAC7BE,WAAW;YACT,MAAMC,aAAaH,KAAKI,IAAI,GAAGC,WAAW;YAE1C,IAAI,IAAI,CAACjC,oBAAoB,EAAE;gBAC7B,IAAI+B,eAAe,OAAOA,eAAe,OAAO;oBAC9C,IAAI,CAACzB,SAAS,CAAC;oBACfwB,WAAW;wBACT,IAAI,CAACxB,SAAS,CAAC;wBACf,IAAI,CAACA,SAAS,CAAC;wBACf,IAAI,CAACA,SAAS,CAAC;oBACjB,GAAG;gBACL,OAAO,IAAIyB,eAAe,OAAOA,eAAe,MAAM;oBACpD,IAAI,CAACzB,SAAS,CAAC;oBACf,IAAI,CAACA,SAAS,CAAC;gBACjB,OAAO;oBACL,IAAI,CAACA,SAAS,CAAC;oBACf,QAAQ,+BAA+B;gBACzC;gBACA,IAAI,CAACN,oBAAoB,GAAG;gBAC5B;YACF;YAEA,IAAI+B,eAAe,SAAS;gBAC1B,IAAI,CAACzB,SAAS,CAAC;gBACf,IAAI,CAACA,SAAS,CAAC;gBACf,IAAI,CAACA,SAAS,CAAC;gBACf,IAAI,CAACA,SAAS,CAAC;gBACf,IAAI,CAACA,SAAS,CAAC;gBACf,IAAI,CAACA,SAAS,CAAC;gBACf,IAAI,CAACA,SAAS,CAAC;YACjB,OAAO,IAAIyB,eAAe,WAAW;gBACnC,IAAI,CAACzB,SAAS,CAAC;gBACf,IAAI,CAACA,SAAS,CAAC;gBACf,IAAI,CAACA,SAAS,CAAC,CAAC,oBAAoB,EAAE,IAAI,CAACb,EAAE,EAAE;gBAC/C,IAAI,CAACa,SAAS,CAAC;gBACf,IAAI,CAACA,SAAS,CAAC;YACjB,OAAO,IAAIyB,eAAe,YAAY;gBACpC,IAAI,CAACzB,SAAS,CAAC;gBACf,IAAI,CAACA,SAAS,CAAC;gBACf,IAAI,CAACA,SAAS,CAAC;gBACf,IAAI,CAACA,SAAS,CAAC;YACjB,OAAO,IAAIyB,eAAe,WAAW;gBACnC,IAAI,CAACzB,SAAS,CAAC;gBACf,IAAI,CAACA,SAAS,CAAC;gBACf,IAAI,CAACA,SAAS,CAAC;gBACf,IAAI,CAACN,oBAAoB,GAAG;YAC9B,OAAO,IAAI+B,eAAe,UAAU;gBAClC,IAAI,CAACjC,IAAI,GAAG,EAAE;gBACd,IAAI,CAACQ,SAAS,CAAC;gBACf,IAAI,CAACA,SAAS,CAAC;YACjB,OAAO;gBACL,IAAI,CAACA,SAAS,CAAC,CAAC,gCAAgC,EAAEsB,KAAK,gBAAgB,CAAC;gBACxEE,WAAW;oBACT,IAAI,CAACxB,SAAS,CAAC,CAAC,+CAA+C,CAAC;oBAChE,IAAI,CAACA,SAAS,CAAC;gBACjB,GAAG;YACL;QACF,GAAG;IACL;AACF"}},
|
|
9
|
+
{"offset": {"line": 654, "column": 0}, "map": {"version":3,"sources":["file:///C:/Users/Dave/OneDrive/Projects/JS/neural-loom/src/lib/agents/ClaudeRunner.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport os from \"os\";\nimport { execSync } from \"child_process\";\nimport { getConfigDir } from \"../config\";\nimport type { IPty } from \"node-pty\";\nimport { AgentRunner } from \"./AgentRunner\";\nimport { SessionPersister } from \"./SessionPersister\";\n\nfunction isWindows(): boolean {\n return typeof process !== \"undefined\" && process.platform === \"win32\";\n}\n\nfunction findGitBash(): string | null {\n if (!isWindows()) {\n return \"bash\";\n }\n const pf = process.env.PROGRAMFILES || \"C:\\\\Program Files\";\n const pf86 = process.env[\"PROGRAMFILES(X86)\"] || \"C:\\\\Program Files (x86)\";\n const local = process.env.LOCALAPPDATA || \"\";\n\n const candidates: string[] = [\n process.env.WINGMAN_BASH_PATH,\n path.join(pf, \"Git\", \"bin\", \"bash.exe\"),\n path.join(pf86, \"Git\", \"bin\", \"bash.exe\"),\n local ? path.join(local, \"Programs\", \"Git\", \"bin\", \"bash.exe\") : \"\",\n ].filter((p): p is string => typeof p === \"string\" && p !== \"\");\n\n return candidates.find(p => fs.existsSync(p)) || null;\n}\n\nexport class ClaudeRunner extends AgentRunner {\n id: string;\n name: string;\n type: 'mock' | 'claude' | 'claude-docker' | 'claude-ssh' | 'aider' | 'aider-docker' | 'shell' = 'claude';\n status: 'idle' | 'running' | 'stopped' = 'idle';\n createdAt: string;\n logs: string[] = [];\n\n private ptyProcess: IPty | null = null;\n private ptyModule: typeof import(\"node-pty\") | null = null;\n\n constructor(id: string, name?: string) {\n super();\n this.id = id;\n this.name = name || `Claude Session ${id.substring(0, 8)}`;\n this.createdAt = new Date().toISOString();\n }\n\n private appendLog(line: string) {\n this.logs.push(line);\n if (this.logs.length > 5000) {\n this.logs.shift();\n }\n this.parseTokenUsage(line);\n this.emitOutput(line);\n SessionPersister.saveSession(this);\n }\n\n async start(resume?: boolean): Promise<void> {\n if (this.status === 'running') return;\n\n // Detect Git Bash on Windows\n const useCmd = isWindows();\n const shellPath = useCmd ? (process.env.COMSPEC || \"cmd.exe\") : findGitBash();\n if (!shellPath) {\n this.status = 'stopped';\n this.appendLog(\"\\x1b[1;31m[System Error] Shell not found. Cannot spawn terminal.\\x1b[0m\\r\\n\");\n return;\n }\n const shellArgs = useCmd ? [\"/c\"] : [\"-c\"];\n\n try {\n // Dynamic import to prevent bundler SSR/Turbopack errors on server start\n if (!this.ptyModule) {\n this.ptyModule = eval(\"require\")(\"node-pty\");\n }\n\n this.status = 'running';\n this.appendLog(\"\\x1b[1;35m==================================================\\x1b[0m\\r\\n\");\n this.appendLog(\"\\x1b[1;36m NEURALLOOM ACTIVE CLAUDE TERMINAL ROUTE \\x1b[0m\\r\\n\");\n this.appendLog(\"\\x1b[1;35m==================================================\\x1b[0m\\r\\n\");\n \n const targetCwd = (this.workspaceRoot && fs.existsSync(this.workspaceRoot)) \n ? this.workspaceRoot \n : process.env.ORIGINAL_CWD || process.cwd();\n\n // Load Claude configuration to check for extraFlags (like --resume)\n let extraFlags = \"\";\n if (resume) {\n extraFlags = \"--resume\";\n } else {\n const claudeConfigPath = path.join(getConfigDir(), \"claude.json\");\n if (fs.existsSync(claudeConfigPath)) {\n try {\n const config = JSON.parse(fs.readFileSync(claudeConfigPath, \"utf8\"));\n if (config.extraFlags) {\n extraFlags = config.extraFlags;\n }\n } catch (err) {\n console.error(\"Failed to parse Claude configuration:\", err);\n }\n }\n }\n\n // Setup process environment with injected keys\n const customEnv = {\n ...process.env,\n TERM: \"xterm-256color\",\n COLORTERM: \"truecolor\",\n } as NodeJS.ProcessEnv;\n\n if (isWindows()) {\n const vsNode = \"C:\\\\Program Files\\\\Microsoft Visual Studio\\\\2022\\\\Community\\\\MSBuild\\\\Microsoft\\\\VisualStudio\\\\NodeJs\";\n const localNpm = path.join(os.homedir(), \"AppData\", \"Local\", \"npm\");\n const existingPath = process.env.Path || process.env.PATH || \"\";\n const winPath = [vsNode, localNpm, existingPath].filter(Boolean).join(\";\");\n\n for (const key of Object.keys(customEnv)) {\n if (key.toLowerCase() === \"path\") {\n delete customEnv[key];\n }\n }\n customEnv.Path = winPath;\n customEnv.PATH = winPath;\n }\n\n // Check if 'claude' command exists in PATH, fallback to npx if not\n let baseCmd = \"claude\";\n try {\n const checkCmd = isWindows() ? \"where.exe claude\" : \"which claude\";\n execSync(checkCmd, { env: customEnv, stdio: \"ignore\" });\n } catch {\n baseCmd = \"npx -y @anthropic-ai/claude-code\";\n }\n\n const claudeCmd = `${baseCmd} ${extraFlags}`.trim();\n this.appendLog(`[System] Spawning command: ${claudeCmd}\\r\\n`);\n\n // Spawn shell and run 'claude' command\n this.ptyProcess = this.ptyModule!.spawn(shellPath, [...shellArgs, claudeCmd], {\n name: \"xterm-256color\",\n cols: 120,\n rows: 30,\n cwd: targetCwd,\n env: customEnv,\n });\n\n // Capture output\n this.ptyProcess.onData((data: string) => {\n this.appendLog(data);\n });\n\n // Capture process exit\n this.ptyProcess.onExit(({ exitCode, signal }: { exitCode: number; signal?: number }) => {\n this.status = 'stopped';\n this.appendLog(`\\r\\n\\x1b[1;31m[System] Claude Code PTY process exited (code=${exitCode}, signal=${signal}).\\x1b[0m\\r\\n`);\n this.ptyProcess = null;\n });\n\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n this.status = 'stopped';\n this.appendLog(`\\x1b[1;31m[System Error] Failed to initialize node-pty runner: ${errorMessage}\\x1b[0m\\r\\n`);\n console.error(\"Failed to start Claude PTY runner:\", err);\n }\n }\n\n async stop(): Promise<void> {\n this.status = 'stopped';\n if (this.ptyProcess) {\n try {\n this.ptyProcess.kill();\n } catch (err) {\n console.error(\"Error killing PTY process:\", err);\n }\n this.ptyProcess = null;\n }\n this.appendLog(\"\\r\\n\\x1b[1;31m[System] Terminal bridge terminated.\\x1b[0m\\r\\n\");\n }\n\n async sendInput(text: string, isRaw = false): Promise<void> {\n if (this.status !== 'running' || !this.ptyProcess) {\n this.appendLog(`\\r\\n\\x1b[1;31m[Error] Cannot write: session process is ${this.status}.\\x1b[0m\\r\\n`);\n return;\n }\n\n this.agentState = 'thinking';\n await this.writeToPty(this.ptyProcess, isRaw ? text : text + \"\\r\");\n }\n\n override resize(cols: number, rows: number): void {\n if (this.ptyProcess) {\n try {\n this.ptyProcess.resize(cols, rows);\n } catch (err) {\n console.error(\"[ClaudeRunner] Failed to resize PTY:\", err);\n }\n }\n }\n}\n\n"],"names":["isWindows","process","platform","findGitBash","pf","env","PROGRAMFILES","pf86","local","LOCALAPPDATA","candidates","WINGMAN_BASH_PATH","join","filter","p","find","existsSync","ClaudeRunner","id","name","type","status","createdAt","logs","ptyProcess","ptyModule","substring","Date","toISOString","appendLog","line","push","length","shift","parseTokenUsage","emitOutput","saveSession","start","resume","useCmd","shellPath","COMSPEC","shellArgs","eval","targetCwd","workspaceRoot","ORIGINAL_CWD","cwd","extraFlags","claudeConfigPath","config","JSON","parse","readFileSync","err","console","error","customEnv","TERM","COLORTERM","vsNode","localNpm","homedir","existingPath","Path","PATH","winPath","Boolean","key","Object","keys","toLowerCase","baseCmd","checkCmd","stdio","claudeCmd","trim","spawn","cols","rows","onData","data","onExit","exitCode","signal","errorMessage","Error","message","stop","kill","sendInput","text","isRaw","agentState","writeToPty","resize"],"mappings":"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"}},
|
|
10
|
+
{"offset": {"line": 854, "column": 0}, "map": {"version":3,"sources":["file:///C:/Users/Dave/OneDrive/Projects/JS/neural-loom/src/lib/agents/DockerRunner.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport { getConfigDir } from \"../config\";\nimport type { IPty } from \"node-pty\";\nimport { AgentRunner } from \"./AgentRunner\";\nimport { SessionPersister } from \"./SessionPersister\";\n\nfunction isWindows(): boolean {\n return typeof process !== \"undefined\" && process.platform === \"win32\";\n}\n\nfunction findGitBash(): string | null {\n if (!isWindows()) {\n return \"bash\";\n }\n const pf = process.env.PROGRAMFILES || \"C:\\\\Program Files\";\n const pf86 = process.env[\"PROGRAMFILES(X86)\"] || \"C:\\\\Program Files (x86)\";\n const local = process.env.LOCALAPPDATA || \"\";\n\n const candidates: string[] = [\n process.env.WINGMAN_BASH_PATH,\n path.join(pf, \"Git\", \"bin\", \"bash.exe\"),\n path.join(pf86, \"Git\", \"bin\", \"bash.exe\"),\n local ? path.join(local, \"Programs\", \"Git\", \"bin\", \"bash.exe\") : \"\",\n ].filter((p): p is string => typeof p === \"string\" && p !== \"\");\n\n return candidates.find(p => fs.existsSync(p)) || null;\n}\n\nexport class DockerRunner extends AgentRunner {\n id: string;\n name: string;\n type: 'mock' | 'claude' | 'claude-docker' | 'claude-ssh' | 'aider' | 'aider-docker' | 'shell' = 'claude-docker';\n status: 'idle' | 'running' | 'stopped' = 'idle';\n createdAt: string;\n logs: string[] = [];\n\n private ptyProcess: IPty | null = null;\n private ptyModule: typeof import(\"node-pty\") | null = null;\n\n constructor(id: string, name?: string) {\n super();\n this.id = id;\n this.name = name || `Docker Session ${id.substring(0, 8)}`;\n this.createdAt = new Date().toISOString();\n }\n\n private appendLog(line: string) {\n this.logs.push(line);\n if (this.logs.length > 5000) {\n this.logs.shift();\n }\n this.parseTokenUsage(line);\n this.emitOutput(line);\n SessionPersister.saveSession(this);\n }\n\n async start(resume?: boolean): Promise<void> {\n if (this.status === 'running') return;\n\n this.status = 'running';\n this.appendLog(\"\\x1b[1;35m==================================================\\x1b[0m\\r\\n\");\n this.appendLog(\"\\x1b[1;36m NEURALLOOM DOCKER SANDBOX RUNTIME BRIDGE \\x1b[0m\\r\\n\");\n this.appendLog(\"\\x1b[1;35m==================================================\\x1b[0m\\r\\n\");\n this.appendLog(\"[System] Verifying Docker environment accessibility...\\r\\n\");\n\n const bashPath = findGitBash();\n if (!bashPath) {\n this.status = 'stopped';\n this.appendLog(\"\\x1b[1;31m[System Error] Git Bash not found. Cannot bootstrap PTY sandbox.\\x1b[0m\\r\\n\");\n return;\n }\n\n try {\n if (!this.ptyModule) {\n this.ptyModule = eval(\"require\")(\"node-pty\");\n }\n\n const targetCwd = (this.workspaceRoot && fs.existsSync(this.workspaceRoot)) \n ? this.workspaceRoot \n : process.env.ORIGINAL_CWD || process.cwd();\n\n // Check if docker executable exists by spawning `docker -v`\n const testPty = this.ptyModule!.spawn(bashPath, [\"-c\", \"docker --version\"], {\n name: \"xterm-256color\",\n cols: 80,\n rows: 10,\n cwd: targetCwd,\n });\n\n let hasDocker = false;\n testPty.onData((data) => {\n if (data.toLowerCase().includes(\"docker version\")) {\n hasDocker = true;\n }\n });\n\n // Wait briefly for docker check\n await new Promise(resolve => setTimeout(resolve, 800));\n testPty.kill();\n\n if (!hasDocker) {\n this.status = 'stopped';\n this.appendLog(\"\\x1b[1;31m[Dependency Warning] Docker command not recognized in local PATH.\\x1b[0m\\r\\n\");\n this.appendLog(\"\\x1b[1;33mPlease install Docker Desktop (https://www.docker.com/products/docker-desktop) and ensure the daemon is running.\\x1b[0m\\r\\n\");\n this.appendLog(\"\\x1b[1;31m[System] Sandbox launch aborted.\\x1b[0m\\r\\n\");\n return;\n }\n\n // If docker is available, spawn container with mounted workspace\n this.appendLog(\"[System] Docker detected. Initializing container mount...\\r\\n\");\n \n const mounts: string[] = [`-v \"${targetCwd}:/workspace\"`];\n if (this.scopedDirs && Array.isArray(this.scopedDirs)) {\n this.scopedDirs.forEach((dir) => {\n if (fs.existsSync(dir)) {\n const folderName = path.basename(dir).replace(/[^a-zA-Z0-9-_]/g, \"_\");\n mounts.push(`-v \"${dir}:/scoped/${folderName}\"`);\n }\n });\n }\n const mountsStr = mounts.join(\" \");\n\n // Load Claude configuration to check for extraFlags (like --resume)\n let extraFlags = \"\";\n if (resume) {\n extraFlags = \"--resume\";\n } else {\n const claudeConfigPath = path.join(getConfigDir(), \"claude.json\");\n if (fs.existsSync(claudeConfigPath)) {\n try {\n const config = JSON.parse(fs.readFileSync(claudeConfigPath, \"utf8\"));\n if (config.extraFlags) {\n extraFlags = config.extraFlags;\n }\n } catch (err) {\n console.error(\"Failed to parse Claude configuration:\", err);\n }\n }\n }\n\n const dockerCmd = `docker run -it --name neural-loom-session-${this.id} --rm ${mountsStr} -w /workspace node:20-alpine npx -y @anthropic-ai/claude-code ${extraFlags}`.trim();\n\n this.ptyProcess = this.ptyModule!.spawn(bashPath, [\"-c\", dockerCmd], {\n name: \"xterm-256color\",\n cols: 120,\n rows: 30,\n cwd: targetCwd,\n env: {\n ...process.env,\n TERM: \"xterm-256color\",\n COLORTERM: \"truecolor\",\n },\n });\n\n this.ptyProcess.onData((data: string) => {\n this.appendLog(data);\n });\n\n this.ptyProcess.onExit(({ exitCode, signal }: { exitCode: number; signal?: number }) => {\n this.status = 'stopped';\n this.appendLog(`\\r\\n\\x1b[1;31m[System] Docker Sandbox exited (code=${exitCode}, signal=${signal}).\\x1b[0m\\r\\n`);\n this.ptyProcess = null;\n });\n\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n this.status = 'stopped';\n this.appendLog(`\\x1b[1;31m[System Error] Failed to launch Docker runner: ${errorMessage}\\x1b[0m\\r\\n`);\n }\n }\n\n async stop(): Promise<void> {\n this.status = 'stopped';\n if (this.ptyProcess) {\n try {\n this.ptyProcess.kill();\n } catch (err) {\n console.error(\"Error killing Docker PTY process:\", err);\n }\n this.ptyProcess = null;\n }\n this.appendLog(\"\\r\\n\\x1b[1;31m[System] Docker container stopped and unmounted.\\x1b[0m\\r\\n\");\n }\n\n async sendInput(text: string, isRaw = false): Promise<void> {\n if (this.status !== 'running' || !this.ptyProcess) {\n this.appendLog(`\\r\\n\\x1b[1;31m[Error] Cannot write: Docker container is ${this.status}.\\x1b[0m\\r\\n`);\n return;\n }\n\n this.agentState = 'thinking';\n await this.writeToPty(this.ptyProcess, isRaw ? text : text + \"\\r\");\n }\n\n override resize(cols: number, rows: number): void {\n if (this.ptyProcess) {\n try {\n this.ptyProcess.resize(cols, rows);\n } catch (err) {\n console.error(\"[DockerRunner] Failed to resize PTY:\", err);\n }\n }\n }\n}\n\n"],"names":["isWindows","process","platform","findGitBash","pf","env","PROGRAMFILES","pf86","local","LOCALAPPDATA","candidates","WINGMAN_BASH_PATH","join","filter","p","find","existsSync","DockerRunner","id","name","type","status","createdAt","logs","ptyProcess","ptyModule","substring","Date","toISOString","appendLog","line","push","length","shift","parseTokenUsage","emitOutput","saveSession","start","resume","bashPath","eval","targetCwd","workspaceRoot","ORIGINAL_CWD","cwd","testPty","spawn","cols","rows","hasDocker","onData","data","toLowerCase","includes","Promise","resolve","setTimeout","kill","mounts","scopedDirs","Array","isArray","forEach","dir","folderName","basename","replace","mountsStr","extraFlags","claudeConfigPath","config","JSON","parse","readFileSync","err","console","error","dockerCmd","trim","TERM","COLORTERM","onExit","exitCode","signal","errorMessage","Error","message","stop","sendInput","text","isRaw","agentState","writeToPty","resize"],"mappings":"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"}},
|
|
11
|
+
{"offset": {"line": 1048, "column": 0}, "map": {"version":3,"sources":["file:///C:/Users/Dave/OneDrive/Projects/JS/neural-loom/src/lib/agents/SSHRunner.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport { getConfigDir } from \"../config\";\nimport type { IPty } from \"node-pty\";\nimport { AgentRunner } from \"./AgentRunner\";\nimport { SessionPersister } from \"./SessionPersister\";\n\nfunction isWindows(): boolean {\n return typeof process !== \"undefined\" && process.platform === \"win32\";\n}\n\nfunction findGitBash(): string | null {\n if (!isWindows()) {\n return \"bash\";\n }\n const pf = process.env.PROGRAMFILES || \"C:\\\\Program Files\";\n const pf86 = process.env[\"PROGRAMFILES(X86)\"] || \"C:\\\\Program Files (x86)\";\n const local = process.env.LOCALAPPDATA || \"\";\n\n const candidates: string[] = [\n process.env.WINGMAN_BASH_PATH,\n path.join(pf, \"Git\", \"bin\", \"bash.exe\"),\n path.join(pf86, \"Git\", \"bin\", \"bash.exe\"),\n local ? path.join(local, \"Programs\", \"Git\", \"bin\", \"bash.exe\") : \"\",\n ].filter((p): p is string => typeof p === \"string\" && p !== \"\");\n\n return candidates.find(p => fs.existsSync(p)) || null;\n}\n\ninterface SSHConfig {\n host: string;\n username: string;\n privateKeyPath?: string;\n port?: number;\n}\n\nexport class SSHRunner extends AgentRunner {\n id: string;\n name: string;\n type: 'mock' | 'claude' | 'claude-docker' | 'claude-ssh' | 'aider' | 'aider-docker' | 'shell' = 'claude-ssh';\n status: 'idle' | 'running' | 'stopped' = 'idle';\n createdAt: string;\n logs: string[] = [];\n\n private ptyProcess: IPty | null = null;\n private ptyModule: typeof import(\"node-pty\") | null = null;\n\n constructor(id: string, name?: string) {\n super();\n this.id = id;\n this.name = name || `SSH Session ${id.substring(0, 8)}`;\n this.createdAt = new Date().toISOString();\n }\n\n private appendLog(line: string) {\n this.logs.push(line);\n if (this.logs.length > 5000) {\n this.logs.shift();\n }\n this.parseTokenUsage(line);\n this.emitOutput(line);\n SessionPersister.saveSession(this);\n }\n\n async start(resume?: boolean): Promise<void> {\n if (this.status === 'running') return;\n\n this.status = 'running';\n this.appendLog(\"\\x1b[1;35m==================================================\\x1b[0m\\r\\n\");\n this.appendLog(\"\\x1b[1;36m NEURALLOOM REMOTE VM (SSH) ROUTE BRIDGE \\x1b[0m\\r\\n\");\n this.appendLog(\"\\x1b[1;35m==================================================\\x1b[0m\\r\\n\");\n this.appendLog(\"[System] Loading SSH configuration...\\r\\n\");\n\n const bashPath = findGitBash();\n if (!bashPath) {\n this.status = 'stopped';\n this.appendLog(\"\\x1b[1;31m[System Error] Git Bash not found. Cannot bootstrap SSH terminal.\\x1b[0m\\r\\n\");\n return;\n }\n\n const configPath = path.join(getConfigDir(), \"ssh.json\");\n if (!fs.existsSync(configPath)) {\n this.status = 'stopped';\n this.appendLog(\"\\x1b[1;31m[Configuration Error] ssh.json not found!\\x1b[0m\\r\\n\");\n this.appendLog(`\\x1b[1;33mPlease create the SSH credentials file at: ${configPath}\\x1b[0m\\r\\n`);\n this.appendLog(\"\\x1b[1;36mTemplate structure:\\x1b[0m\\r\\n\");\n this.appendLog(\n JSON.stringify(\n {\n host: \"your.remote.host.com\",\n username: \"dave\",\n privateKeyPath: \"C:\\\\\\\\Users\\\\\\\\Dave\\\\\\\\.ssh\\\\\\\\id_rsa\",\n port: 22,\n },\n null,\n 2\n ).replace(/\\n/g, \"\\r\\n\") + \"\\r\\n\"\n );\n this.appendLog(\"\\x1b[1;31m[System] SSH startup aborted.\\x1b[0m\\r\\n\");\n return;\n }\n\n try {\n const rawConfig = fs.readFileSync(configPath, \"utf8\");\n const config: SSHConfig = JSON.parse(rawConfig);\n\n if (!config.host || !config.username) {\n this.status = 'stopped';\n this.appendLog(\"\\x1b[1;31m[System Error] Invalid ssh.json configuration. 'host' and 'username' are required.\\x1b[0m\\r\\n\");\n return;\n }\n\n if (!this.ptyModule) {\n this.ptyModule = eval(\"require\")(\"node-pty\");\n }\n\n this.appendLog(`[System] Connecting to ${config.username}@${config.host}...\\r\\n`);\n\n const portOpt = config.port ? `-p ${config.port}` : \"\";\n const keyOpt = config.privateKeyPath ? `-i \"${config.privateKeyPath}\"` : \"\";\n \n // Load Claude configuration to check for extraFlags (like --resume)\n let extraFlags = \"\";\n if (resume) {\n extraFlags = \"--resume\";\n } else {\n const claudeConfigPath = path.join(getConfigDir(), \"claude.json\");\n if (fs.existsSync(claudeConfigPath)) {\n try {\n const config = JSON.parse(fs.readFileSync(claudeConfigPath, \"utf8\"));\n if (config.extraFlags) {\n extraFlags = config.extraFlags;\n }\n } catch (err) {\n console.error(\"Failed to parse Claude configuration:\", err);\n }\n }\n }\n\n const sshCmd = `ssh -t ${keyOpt} ${portOpt} ${config.username}@${config.host} \"claude ${extraFlags}\"`;\n\n this.ptyProcess = this.ptyModule!.spawn(bashPath, [\"-c\", sshCmd], {\n name: \"xterm-256color\",\n cols: 120,\n rows: 30,\n cwd: process.env.ORIGINAL_CWD || process.cwd(),\n env: {\n ...process.env,\n TERM: \"xterm-256color\",\n COLORTERM: \"truecolor\",\n },\n });\n\n this.ptyProcess.onData((data: string) => {\n this.appendLog(data);\n });\n\n this.ptyProcess.onExit(({ exitCode, signal }: { exitCode: number; signal?: number }) => {\n this.status = 'stopped';\n this.appendLog(`\\r\\n\\x1b[1;31m[System] SSH Session exited (code=${exitCode}, signal=${signal}).\\x1b[0m\\r\\n`);\n this.ptyProcess = null;\n });\n\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n this.status = 'stopped';\n this.appendLog(`\\x1b[1;31m[System Error] SSH connection failed: ${errorMessage}\\x1b[0m\\r\\n`);\n }\n }\n\n async stop(): Promise<void> {\n this.status = 'stopped';\n if (this.ptyProcess) {\n try {\n this.ptyProcess.kill();\n } catch (err) {\n console.error(\"Error killing SSH PTY process:\", err);\n }\n this.ptyProcess = null;\n }\n this.appendLog(\"\\r\\n\\x1b[1;31m[System] SSH Connection terminated.\\x1b[0m\\r\\n\");\n }\n\n async sendInput(text: string, isRaw = false): Promise<void> {\n if (this.status !== 'running' || !this.ptyProcess) {\n this.appendLog(`\\r\\n\\x1b[1;31m[Error] Cannot write: SSH session is ${this.status}.\\x1b[0m\\r\\n`);\n return;\n }\n\n this.agentState = 'thinking';\n await this.writeToPty(this.ptyProcess, isRaw ? text : text + \"\\r\");\n }\n\n override resize(cols: number, rows: number): void {\n if (this.ptyProcess) {\n try {\n this.ptyProcess.resize(cols, rows);\n } catch (err) {\n console.error(\"[SSHRunner] Failed to resize PTY:\", err);\n }\n }\n }\n}\n\n"],"names":["isWindows","process","platform","findGitBash","pf","env","PROGRAMFILES","pf86","local","LOCALAPPDATA","candidates","WINGMAN_BASH_PATH","join","filter","p","find","existsSync","SSHRunner","id","name","type","status","createdAt","logs","ptyProcess","ptyModule","substring","Date","toISOString","appendLog","line","push","length","shift","parseTokenUsage","emitOutput","saveSession","start","resume","bashPath","configPath","JSON","stringify","host","username","privateKeyPath","port","replace","rawConfig","readFileSync","config","parse","eval","portOpt","keyOpt","extraFlags","claudeConfigPath","err","console","error","sshCmd","spawn","cols","rows","cwd","ORIGINAL_CWD","TERM","COLORTERM","onData","data","onExit","exitCode","signal","errorMessage","Error","message","stop","kill","sendInput","text","isRaw","agentState","writeToPty","resize"],"mappings":"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"}},
|
|
12
|
+
{"offset": {"line": 1226, "column": 0}, "map": {"version":3,"sources":["file:///C:/Users/Dave/OneDrive/Projects/JS/neural-loom/src/lib/agents/AiderRunner.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport { exec } from \"child_process\";\nimport { getConfigDir } from \"../config\";\nimport type { IPty } from \"node-pty\";\nimport { AgentRunner } from \"./AgentRunner\";\nimport { SessionPersister } from \"./SessionPersister\";\n\nfunction isWindows(): boolean {\n return typeof process !== \"undefined\" && process.platform === \"win32\";\n}\n\nfunction findGitBash(): string | null {\n if (!isWindows()) {\n return \"bash\";\n }\n const pf = process.env.PROGRAMFILES || \"C:\\\\Program Files\";\n const pf86 = process.env[\"PROGRAMFILES(X86)\"] || \"C:\\\\Program Files (x86)\";\n const local = process.env.LOCALAPPDATA || \"\";\n\n const candidates: string[] = [\n process.env.WINGMAN_BASH_PATH,\n path.join(pf, \"Git\", \"bin\", \"bash.exe\"),\n path.join(pf86, \"Git\", \"bin\", \"bash.exe\"),\n local ? path.join(local, \"Programs\", \"Git\", \"bin\", \"bash.exe\") : \"\",\n ].filter((p): p is string => typeof p === \"string\" && p !== \"\");\n\n return candidates.find(p => fs.existsSync(p)) || null;\n}\n\nfunction getFilesForAider(dir: string): string {\n const maxFiles = 150;\n const files: string[] = [];\n \n function walk(current: string) {\n if (files.length >= maxFiles) return;\n try {\n const entries = fs.readdirSync(current, { withFileTypes: true });\n for (const entry of entries) {\n const name = entry.name;\n if (\n name.startsWith(\".\") ||\n name === \"node_modules\" ||\n name === \"out\" ||\n name === \".next\" ||\n name === \"bin\" ||\n name === \"obj\" ||\n name === \"dist\" ||\n name === \"build\"\n ) {\n continue;\n }\n const fullPath = path.join(current, name);\n if (entry.isDirectory()) {\n walk(fullPath);\n } else {\n const relPath = path.relative(dir, fullPath);\n files.push(relPath);\n if (files.length >= maxFiles) return;\n }\n }\n } catch (err) {\n console.error(\"Error reading dir for Aider files list:\", err);\n }\n }\n\n walk(dir);\n return files.map(f => `\"${f.replace(/\"/g, '\\\\\"')}\"`).join(\" \");\n}\n\nexport class AiderRunner extends AgentRunner {\n id: string;\n name: string;\n type: 'mock' | 'claude' | 'claude-docker' | 'claude-ssh' | 'aider' | 'aider-docker' | 'shell';\n status: 'idle' | 'running' | 'stopped' = 'idle';\n createdAt: string;\n logs: string[] = [];\n\n private ptyProcess: IPty | null = null;\n private ptyModule: typeof import(\"node-pty\") | null = null;\n\n constructor(id: string, type: 'aider' | 'aider-docker', name?: string) {\n super();\n this.id = id;\n this.type = type;\n this.name = name || (type === 'aider-docker' ? `Aider Docker ${id.substring(0, 8)}` : `Aider Session ${id.substring(0, 8)}`);\n this.createdAt = new Date().toISOString();\n }\n\n private appendLog(line: string) {\n this.logs.push(line);\n if (this.logs.length > 5000) {\n this.logs.shift();\n }\n this.parseTokenUsage(line);\n this.emitOutput(line);\n SessionPersister.saveSession(this);\n }\n\n async start(resume?: boolean): Promise<void> {\n if (this.status === 'running') return;\n\n this.status = 'running';\n this.appendLog(\"\\x1b[1;35m==================================================\\x1b[0m\\r\\n\");\n this.appendLog(`\\x1b[1;36m NEURALLOOM AIDER AGENT ROUTE (${this.type.toUpperCase()}) \\x1b[0m\\r\\n`);\n this.appendLog(\"\\x1b[1;35m==================================================\\x1b[0m\\r\\n\");\n\n const useCmd = isWindows();\n const shellPath = useCmd ? (process.env.COMSPEC || \"cmd.exe\") : findGitBash();\n if (!shellPath) {\n this.status = 'stopped';\n this.appendLog(\"\\x1b[1;31m[System Error] Shell not found. Cannot spawn terminal.\\x1b[0m\\r\\n\");\n return;\n }\n const shellArgs = useCmd ? [\"/c\"] : [\"-c\"];\n\n try {\n if (!this.ptyModule) {\n this.ptyModule = eval(\"require\")(\"node-pty\");\n }\n\n // Load Aider configuration\n let aiderConfig = {\n openaiApiKey: \"\",\n anthropicApiKey: \"\",\n geminiApiKey: \"\",\n model: \"claude-3-5-sonnet\",\n extraFlags: \"\",\n loadAllFiles: true,\n };\n\n const aiderConfigPath = path.join(getConfigDir(), \"aider.json\");\n if (fs.existsSync(aiderConfigPath)) {\n try {\n aiderConfig = JSON.parse(fs.readFileSync(aiderConfigPath, \"utf8\"));\n } catch (err) {\n console.error(\"Failed to parse Aider configuration:\", err);\n }\n }\n\n // Setup process environment with injected keys\n const customEnv = {\n ...process.env,\n TERM: \"xterm-256color\",\n COLORTERM: \"truecolor\",\n NEURAL_LOOM: \"true\",\n } as Record<string, string>;\n\n if (aiderConfig.openaiApiKey) {\n customEnv.OPENAI_API_KEY = aiderConfig.openaiApiKey;\n }\n if (aiderConfig.anthropicApiKey) {\n customEnv.ANTHROPIC_API_KEY = aiderConfig.anthropicApiKey;\n }\n if (aiderConfig.geminiApiKey) {\n customEnv.GEMINI_API_KEY = aiderConfig.geminiApiKey;\n }\n\n const targetCwd = (this.workspaceRoot && fs.existsSync(this.workspaceRoot)) \n ? this.workspaceRoot \n : process.env.ORIGINAL_CWD || process.cwd();\n\n const modelFlag = aiderConfig.model ? `--model ${aiderConfig.model}` : \"\";\n const extraFlags = aiderConfig.extraFlags || \"\";\n \n let loadAllFilesFlag = \"\";\n if (aiderConfig.loadAllFiles !== false) {\n if (extraFlags.includes(\"--no-git\")) {\n loadAllFilesFlag = getFilesForAider(targetCwd);\n } else {\n loadAllFilesFlag = \".\";\n }\n }\n\n if (this.type === \"aider-docker\") {\n this.appendLog(\"[System] Verifying Docker environment accessibility...\\r\\n\");\n\n // Check if docker executable exists by running `docker --version`\n const hasDocker = await new Promise<boolean>((resolve) => {\n exec(\"docker --version\", { env: process.env }, (error: Error | null, stdout: string) => {\n if (!error && stdout.toLowerCase().includes(\"version\")) {\n resolve(true);\n } else {\n resolve(false);\n }\n });\n });\n\n if (!hasDocker) {\n this.status = 'stopped';\n this.appendLog(\"\\x1b[1;31m[Dependency Warning] Docker command not recognized in local PATH.\\x1b[0m\\r\\n\");\n this.appendLog(\"\\x1b[1;33mPlease install Docker Desktop and ensure the daemon is running.\\x1b[0m\\r\\n\");\n return;\n }\n\n this.appendLog(\"[System] Spawning Aider container environment...\\r\\n\");\n const envFlags: string[] = [];\n if (aiderConfig.openaiApiKey) envFlags.push(\"-e OPENAI_API_KEY\");\n if (aiderConfig.anthropicApiKey) envFlags.push(\"-e ANTHROPIC_API_KEY\");\n if (aiderConfig.geminiApiKey) envFlags.push(\"-e GEMINI_API_KEY\");\n envFlags.push(\"-e NEURAL_LOOM=true\");\n const envFlagsStr = envFlags.join(\" \");\n\n // Volume mounts for primary workspace and each scoped directory\n const mounts: string[] = [`-v \"${targetCwd}:/workspace\"`];\n if (this.scopedDirs && Array.isArray(this.scopedDirs)) {\n this.scopedDirs.forEach((dir) => {\n if (fs.existsSync(dir)) {\n const folderName = path.basename(dir).replace(/[^a-zA-Z0-9-_]/g, \"_\");\n mounts.push(`-v \"${dir}:/scoped/${folderName}\"`);\n }\n });\n }\n const mountsStr = mounts.join(\" \");\n\n const dockerCmd = `docker run -it --name neural-loom-session-${this.id} --rm ${mountsStr} -w /workspace ${envFlagsStr} paulgauthier/aider ${modelFlag} ${extraFlags} --no-fancy-input ${loadAllFilesFlag}`.trim();\n\n this.ptyProcess = this.ptyModule!.spawn(shellPath, [...shellArgs, dockerCmd], {\n name: \"xterm-256color\",\n cols: 120,\n rows: 30,\n cwd: targetCwd,\n env: customEnv,\n });\n } else {\n this.appendLog(\"[System] Verifying 'aider' command availability in local PATH...\\r\\n\");\n\n // Check if aider executable exists by running `aider --version`\n const hasAider = await new Promise<boolean>((resolve) => {\n exec(\"aider --version\", { env: process.env }, (error: Error | null, stdout: string) => {\n if (!error && stdout.toLowerCase().includes(\"aider\")) {\n resolve(true);\n } else {\n resolve(false);\n }\n });\n });\n\n if (!hasAider) {\n this.status = 'stopped';\n this.appendLog(\"\\x1b[1;31m[Dependency Warning] 'aider' executable not found on local PATH.\\x1b[0m\\r\\n\");\n this.appendLog(\"\\x1b[1;33mPlease install Aider globally via pip:\\r\\n pip install aider-chat\\x1b[0m\\r\\n\");\n return;\n }\n\n this.appendLog(\"[System] Spawning local Aider CLI...\\r\\n\");\n const localCmd = `aider ${modelFlag} ${extraFlags} --no-fancy-input ${loadAllFilesFlag}`.trim();\n\n this.ptyProcess = this.ptyModule!.spawn(shellPath, [...shellArgs, localCmd], {\n name: \"xterm-256color\",\n cols: 120,\n rows: 30,\n cwd: targetCwd,\n env: customEnv,\n });\n }\n\n this.ptyProcess.onData((data: string) => {\n this.appendLog(data);\n });\n\n this.ptyProcess.onExit(({ exitCode, signal }: { exitCode: number; signal?: number }) => {\n this.status = 'stopped';\n this.appendLog(`\\r\\n\\x1b[1;31m[System] Aider process exited (code=${exitCode}, signal=${signal}).\\x1b[0m\\r\\n`);\n this.ptyProcess = null;\n });\n\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n this.status = 'stopped';\n this.appendLog(`\\x1b[1;31m[System Error] Failed to launch Aider: ${errorMessage}\\x1b[0m\\r\\n`);\n }\n }\n\n async stop(): Promise<void> {\n this.status = 'stopped';\n if (this.ptyProcess) {\n try {\n this.ptyProcess.kill();\n } catch (err) {\n console.error(\"Error killing Aider PTY process:\", err);\n }\n this.ptyProcess = null;\n }\n this.appendLog(\"\\r\\n\\x1b[1;31m[System] Aider session terminated.\\x1b[0m\\r\\n\");\n }\n\n async sendInput(text: string, isRaw = false): Promise<void> {\n if (this.status !== 'running' || !this.ptyProcess) {\n this.appendLog(`\\r\\n\\x1b[1;31m[Error] Cannot write: Aider process is ${this.status}.\\x1b[0m\\r\\n`);\n return;\n }\n\n this.agentState = 'thinking';\n await this.writeToPty(this.ptyProcess, isRaw ? text : text + \"\\r\");\n }\n\n override resize(cols: number, rows: number): void {\n if (this.ptyProcess) {\n try {\n this.ptyProcess.resize(cols, rows);\n } catch (err) {\n console.error(\"[AiderRunner] Failed to resize PTY:\", err);\n }\n }\n }\n}\n\n"],"names":["isWindows","process","platform","findGitBash","pf","env","PROGRAMFILES","pf86","local","LOCALAPPDATA","candidates","WINGMAN_BASH_PATH","join","filter","p","find","existsSync","getFilesForAider","dir","maxFiles","files","walk","current","length","entries","readdirSync","withFileTypes","entry","name","startsWith","fullPath","isDirectory","relPath","relative","push","err","console","error","map","f","replace","AiderRunner","id","type","status","createdAt","logs","ptyProcess","ptyModule","substring","Date","toISOString","appendLog","line","shift","parseTokenUsage","emitOutput","saveSession","start","resume","toUpperCase","useCmd","shellPath","COMSPEC","shellArgs","eval","aiderConfig","openaiApiKey","anthropicApiKey","geminiApiKey","model","extraFlags","loadAllFiles","aiderConfigPath","JSON","parse","readFileSync","customEnv","TERM","COLORTERM","NEURAL_LOOM","OPENAI_API_KEY","ANTHROPIC_API_KEY","GEMINI_API_KEY","targetCwd","workspaceRoot","ORIGINAL_CWD","cwd","modelFlag","loadAllFilesFlag","includes","hasDocker","Promise","resolve","stdout","toLowerCase","envFlags","envFlagsStr","mounts","scopedDirs","Array","isArray","forEach","folderName","basename","mountsStr","dockerCmd","trim","spawn","cols","rows","hasAider","localCmd","onData","data","onExit","exitCode","signal","errorMessage","Error","message","stop","kill","sendInput","text","isRaw","agentState","writeToPty","resize"],"mappings":"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"}},
|
|
13
|
+
{"offset": {"line": 1573, "column": 0}, "map": {"version":3,"sources":["file:///C:/Users/Dave/OneDrive/Projects/JS/neural-loom/src/lib/agents/WebSocketServer.ts"],"sourcesContent":["import { WebSocketServer, WebSocket } from \"ws\";\nimport { AgentRunner } from \"./AgentRunner\";\n\ndeclare global {\n var wss: WebSocketServer | undefined;\n var wsPort: number | undefined;\n}\n\nlet getSessionCallback: ((id: string) => AgentRunner | undefined) | null = null;\n\nexport function initWebSocketServer(port = 9601, getSession?: (id: string) => AgentRunner | undefined) {\n if (getSession) {\n getSessionCallback = getSession;\n }\n // Prevent duplicate WebSocket servers during hot reloads in development\n if (global.wss) {\n console.log(`[WebSocketServer] WebSocket Server already active on port ${global.wsPort || 9601} (cached).`);\n return;\n }\n\n let currentPort = port;\n const maxPort = port + 10;\n\n function tryBind() {\n console.log(`[WebSocketServer] Launching NeuralLoom WebSocket Gateway on port ${currentPort}...`);\n\n try {\n const wss = new WebSocketServer({ port: currentPort });\n\n wss.on(\"error\", (err: unknown) => {\n const socketErr = err as { code?: string };\n if (socketErr.code === \"EADDRINUSE\" && currentPort < maxPort) {\n console.warn(`[WebSocketServer] Port ${currentPort} in use, trying next port...`);\n currentPort++;\n tryBind();\n } else {\n console.error(\"[WebSocketServer] WebSocket server error:\", err);\n }\n });\n\n wss.on(\"listening\", () => {\n global.wss = wss;\n global.wsPort = currentPort;\n console.log(`[WebSocketServer] WebSocket gateway successfully listening on port ${currentPort}.`);\n });\n\n wss.on(\"connection\", (ws: WebSocket & { sessionId?: string; outputListener?: (data: string) => void }) => {\n console.log(\"[WebSocketServer] New client connected via gateway.\");\n\n let mockBuffer = \"\";\n\n ws.on(\"message\", async (rawMsg) => {\n try {\n const msg = JSON.parse(rawMsg.toString());\n\n // Client handshake to establish connection to a specific session\n if (msg.type === \"handshake\") {\n const { sessionId } = msg;\n\n // Clean up previous registration for this connection if it exists\n if (ws.sessionId && ws.outputListener) {\n const oldSession = getSessionCallback ? getSessionCallback(ws.sessionId) : null;\n if (oldSession) {\n oldSession.offOutput(ws.outputListener);\n }\n }\n\n const session = getSessionCallback ? getSessionCallback(sessionId) : null;\n\n if (session) {\n ws.sessionId = sessionId;\n console.log(`[WebSocketServer] Client connected to active session: ${sessionId}`);\n\n // Subscribe to runner output events\n const listener = (data: string) => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: \"output\", data }));\n }\n };\n ws.outputListener = listener;\n session.onOutput(listener);\n\n // Send handshake acknowledgment and full historical logs\n ws.send(\n JSON.stringify({\n type: \"handshake-ack\",\n sessionId,\n history: session.logs.join(\"\"),\n })\n );\n } else {\n ws.send(JSON.stringify({ type: \"error\", message: \"Requested session not found\" }));\n }\n }\n\n // User terminal input routing\n if (msg.type === \"input\" && ws.sessionId) {\n const session = getSessionCallback ? getSessionCallback(ws.sessionId) : null;\n if (session && session.status === \"running\") {\n if (session.type === \"mock\") {\n // Buffer input for simulated command parsing in MockRunner\n const data = msg.data;\n if (data === \"\\r\" || data === \"\\r\\n\") {\n ws.send(JSON.stringify({ type: \"output\", data: \"\\r\\n\" }));\n const cmd = mockBuffer;\n mockBuffer = \"\";\n await session.sendInput(cmd);\n } else if (data === \"\\u007f\" || data === \"\\b\") { // Backspace\n if (mockBuffer.length > 0) {\n mockBuffer = mockBuffer.slice(0, -1);\n ws.send(JSON.stringify({ type: \"output\", data: \"\\b \\b\" }));\n }\n } else {\n mockBuffer += data;\n ws.send(JSON.stringify({ type: \"output\", data })); // Local echo of key\n }\n } else {\n // Pass raw keystrokes straight to Claude Code PTY\n await session.sendInput(msg.data, true);\n }\n }\n }\n\n // User terminal resize routing\n if (msg.type === \"resize\" && ws.sessionId) {\n const { cols, rows } = msg;\n const session = getSessionCallback ? getSessionCallback(ws.sessionId) : null;\n if (session) {\n session.resize(cols, rows);\n }\n }\n } catch (err) {\n console.error(\"[WebSocketServer] Error processing socket packet:\", err);\n }\n });\n\n ws.on(\"close\", () => {\n if (ws.sessionId && ws.outputListener) {\n const session = getSessionCallback ? getSessionCallback(ws.sessionId) : null;\n if (session) {\n session.offOutput(ws.outputListener);\n }\n }\n console.log(\"[WebSocketServer] Client connection closed.\");\n });\n\n ws.on(\"error\", (err) => {\n console.error(\"[WebSocketServer] Socket error:\", err);\n });\n });\n\n } catch (error) {\n if (currentPort < maxPort) {\n currentPort++;\n tryBind();\n } else {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`[WebSocketServer] Failed to initialize WebSocket Server: ${errorMessage}`);\n }\n }\n }\n\n tryBind();\n}\n"],"names":["getSessionCallback","initWebSocketServer","port","getSession","wss","console","log","wsPort","currentPort","maxPort","tryBind","on","err","socketErr","code","warn","error","ws","mockBuffer","rawMsg","msg","JSON","parse","toString","type","sessionId","outputListener","oldSession","offOutput","session","listener","data","readyState","OPEN","send","stringify","onOutput","history","logs","join","message","status","cmd","sendInput","length","slice","cols","rows","resize","errorMessage","Error"],"mappings":"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"}},
|
|
14
|
+
{"offset": {"line": 1735, "column": 0}, "map": {"version":3,"sources":["file:///C:/Users/Dave/OneDrive/Projects/JS/neural-loom/src/lib/agents/ContextManager.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport { isDirWritable } from \"../config\";\n\nexport class ContextManager {\n private static writableCache = new Map<string, boolean>();\n\n private static isWritable(root: string): boolean {\n if (this.writableCache.has(root)) {\n return this.writableCache.get(root)!;\n }\n const res = isDirWritable(root);\n this.writableCache.set(root, res);\n return res;\n }\n\n private static get workspaceRoot(): string {\n return process.env.ORIGINAL_CWD || process.cwd();\n }\n\n private static ensureDirs(root: string) {\n if (!this.isWritable(root)) {\n return;\n }\n try {\n const aiDir = path.join(root, \".ai\", \"neural-loom\");\n if (!fs.existsSync(aiDir)) {\n fs.mkdirSync(aiDir, { recursive: true });\n }\n\n const commandDir = path.join(root, \".claude\", \"commands\");\n if (!fs.existsSync(commandDir)) {\n fs.mkdirSync(commandDir, { recursive: true });\n }\n } catch (err) {\n console.warn(`[ContextManager] Failed to ensure directories at ${root}:`, err);\n }\n }\n\n public static initializeStaging(root: string = process.env.ORIGINAL_CWD || process.cwd()) {\n if (!this.isWritable(root)) {\n return;\n }\n try {\n this.ensureDirs(root);\n\n // Create /ccp.md custom slash command file\n const ccpPath = path.join(root, \".claude\", \"commands\", \"ccp.md\");\n if (!fs.existsSync(ccpPath)) {\n fs.writeFileSync(\n ccpPath,\n \"Read the prompt from .ai/neural-loom/cprompt.md and execute it. This is a staged prompt from the NeuralLoom UI. Treat the contents as user instructions.\\n\"\n );\n }\n\n // Create /ccc.md custom slash command file\n const cccPath = path.join(root, \".claude\", \"commands\", \"ccc.md\");\n if (!fs.existsSync(cccPath)) {\n fs.writeFileSync(\n cccPath,\n \"Read the context from .ai/neural-loom/ccontext.md. This is persistent context from the NeuralLoom UI. Absorb it as background information for this session. Acknowledge briefly what you received.\\n\"\n );\n }\n } catch (err) {\n console.warn(`[ContextManager] Failed to initialize staging at ${root}:`, err);\n }\n }\n\n public static updatePrompt(promptText: string, root: string = process.env.ORIGINAL_CWD || process.cwd()) {\n if (!this.isWritable(root)) {\n return;\n }\n try {\n this.ensureDirs(root);\n const promptFile = path.join(root, \".ai\", \"neural-loom\", \"cprompt.md\");\n fs.writeFileSync(promptFile, promptText);\n } catch (err) {\n console.error(`[ContextManager] Failed to write prompt file at ${root}:`, err);\n }\n }\n\n public static updateContext(contextText: string, root: string = process.env.ORIGINAL_CWD || process.cwd()) {\n if (!this.isWritable(root)) {\n return;\n }\n try {\n this.ensureDirs(root);\n const contextFile = path.join(root, \".ai\", \"neural-loom\", \"ccontext.md\");\n fs.writeFileSync(contextFile, contextText);\n } catch (err) {\n console.error(`[ContextManager] Failed to write context file at ${root}:`, err);\n }\n }\n\n public static updateRules(rulesText: string, root: string = process.env.ORIGINAL_CWD || process.cwd()) {\n if (!this.isWritable(root)) {\n return;\n }\n try {\n this.ensureDirs(root);\n const agentsMdPath = path.join(root, \"AGENTS.md\");\n fs.writeFileSync(agentsMdPath, rulesText, \"utf8\");\n } catch (err) {\n console.error(`[ContextManager] Failed to write rules file at ${root}:`, err);\n }\n }\n\n public static loadPrompt(root: string = process.env.ORIGINAL_CWD || process.cwd()): string {\n const promptFile = path.join(root, \".ai\", \"neural-loom\", \"cprompt.md\");\n return fs.existsSync(promptFile) ? fs.readFileSync(promptFile, \"utf8\") : \"\";\n }\n\n public static loadRules(root: string = process.env.ORIGINAL_CWD || process.cwd()): string {\n const agentsMdPath = path.join(root, \"AGENTS.md\");\n return fs.existsSync(agentsMdPath) ? fs.readFileSync(agentsMdPath, \"utf8\") : \"\";\n }\n\n public static compileGlobalRules() {\n this.compileSessionContext();\n }\n\n public static compileSessionContext(root: string = process.env.ORIGINAL_CWD || process.cwd(), scopedDirs?: string[]) {\n if (!this.isWritable(root)) {\n return;\n }\n try {\n this.ensureDirs(root);\n this.initializeStaging(root);\n \n // Check if AGENTS.md rules template exists\n const agentsMdPath = path.join(root, \"AGENTS.md\");\n let agentsRules = \"\";\n if (fs.existsSync(agentsMdPath)) {\n agentsRules = fs.readFileSync(agentsMdPath, \"utf8\");\n } else {\n // Try fallback from global\n const fallbackPath = path.join(this.workspaceRoot, \"AGENTS.md\");\n if (fs.existsSync(fallbackPath)) {\n agentsRules = fs.readFileSync(fallbackPath, \"utf8\");\n }\n }\n\n // Generate maps\n let maps = `## Workspace Root Map (${root}):\\n${this.generateProjectMapFor(root)}`;\n\n if (scopedDirs && Array.isArray(scopedDirs)) {\n scopedDirs.forEach((dir) => {\n if (fs.existsSync(dir)) {\n maps += `\\n\\n## Scoped Directory Map (${dir}):\\n${this.generateProjectMapFor(dir)}`;\n }\n });\n }\n\n // Combine rules and folder map\n const compiledContext = `# System Rules & Guidelines\\n\\n${agentsRules}\\n\\n# Project File Hierarchy Map\\n\\n${maps}`;\n this.updateContext(compiledContext, root);\n\n // Write a default empty prompt staging file if missing\n const promptFile = path.join(root, \".ai\", \"neural-loom\", \"cprompt.md\");\n if (!fs.existsSync(promptFile)) {\n fs.writeFileSync(promptFile, \"Hello! Please review the project context (/ccc) and check for any tasks to execute.\");\n }\n } catch (err) {\n console.warn(`[ContextManager] Failed to compile session context at ${root}:`, err);\n }\n }\n\n private static generateProjectMapFor(targetDir: string): string {\n try {\n const walk = (dir: string, depth = 0): string => {\n if (depth > 2) return \"\"; // Keep map depth concise to fit tokens\n let result = \"\";\n const files = fs.readdirSync(dir, { withFileTypes: true });\n for (const file of files) {\n if (\n file.name.startsWith(\".\") ||\n file.name === \"node_modules\" ||\n file.name === \"out\" ||\n file.name === \".next\"\n ) {\n continue;\n }\n const indent = \" \".repeat(depth);\n if (file.isDirectory()) {\n result += `${indent}- [Dir] ${file.name}/\\n`;\n result += walk(path.join(dir, file.name), depth + 1);\n } else {\n result += `${indent}- [File] ${file.name}\\n`;\n }\n }\n return result;\n };\n return walk(targetDir);\n } catch (err) {\n return \"Error generating project map: \" + (err instanceof Error ? err.message : String(err));\n }\n }\n}\n"],"names":["ContextManager","writableCache","Map","isWritable","root","has","get","res","set","workspaceRoot","process","env","ORIGINAL_CWD","cwd","ensureDirs","aiDir","join","existsSync","mkdirSync","recursive","commandDir","err","console","warn","initializeStaging","ccpPath","writeFileSync","cccPath","updatePrompt","promptText","promptFile","error","updateContext","contextText","contextFile","updateRules","rulesText","agentsMdPath","loadPrompt","readFileSync","loadRules","compileGlobalRules","compileSessionContext","scopedDirs","agentsRules","fallbackPath","maps","generateProjectMapFor","Array","isArray","forEach","dir","compiledContext","targetDir","walk","depth","result","files","readdirSync","withFileTypes","file","name","startsWith","indent","repeat","isDirectory","Error","message","String"],"mappings":"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"}},
|
|
15
|
+
{"offset": {"line": 1918, "column": 0}, "map": {"version":3,"sources":["file:///C:/Users/Dave/OneDrive/Projects/JS/neural-loom/src/lib/agents/ShellRunner.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport type { IPty } from \"node-pty\";\nimport { AgentRunner } from \"./AgentRunner\";\n\nfunction isWindows(): boolean {\n return typeof process !== \"undefined\" && process.platform === \"win32\";\n}\n\nfunction findGitBash(): string | null {\n if (!isWindows()) {\n return \"bash\";\n }\n const pf = process.env.PROGRAMFILES || \"C:\\\\Program Files\";\n const pf86 = process.env[\"PROGRAMFILES(X86)\"] || \"C:\\\\Program Files (x86)\";\n const local = process.env.LOCALAPPDATA || \"\";\n\n const candidates: string[] = [\n process.env.WINGMAN_BASH_PATH,\n path.join(pf, \"Git\", \"bin\", \"bash.exe\"),\n path.join(pf86, \"Git\", \"bin\", \"bash.exe\"),\n local ? path.join(local, \"Programs\", \"Git\", \"bin\", \"bash.exe\") : \"\",\n ].filter((p): p is string => typeof p === \"string\" && p !== \"\");\n\n const found = candidates.find(p => fs.existsSync(p));\n if (found) return found;\n\n // Fallback to PowerShell or Cmd on Windows\n const windir = process.env.windir || \"C:\\\\Windows\";\n const powershell = path.join(windir, \"System32\", \"WindowsPowerShell\", \"v1.0\", \"powershell.exe\");\n if (fs.existsSync(powershell)) return powershell;\n\n const cmd = path.join(windir, \"System32\", \"cmd.exe\");\n if (fs.existsSync(cmd)) return cmd;\n\n return null;\n}\n\nexport class ShellRunner extends AgentRunner {\n id: string;\n name: string;\n type: 'mock' | 'claude' | 'claude-docker' | 'claude-ssh' | 'aider' | 'aider-docker' | 'shell' = \"shell\";\n status: 'idle' | 'running' | 'stopped' = 'idle';\n createdAt: string;\n logs: string[] = [];\n\n private ptyProcess: IPty | null = null;\n private ptyModule: typeof import(\"node-pty\") | null = null;\n\n constructor(id: string = \"workspace-terminal\", name?: string, workspaceRoot?: string) {\n super();\n this.id = id;\n this.name = name || \"Workspace Shell\";\n this.workspaceRoot = workspaceRoot;\n this.createdAt = new Date().toISOString();\n }\n\n private appendLog(line: string) {\n this.logs.push(line);\n if (this.logs.length > 5000) {\n this.logs.shift();\n }\n this.emitOutput(line);\n }\n\n async start(resume?: boolean): Promise<void> {\n if (this.status === 'running') return;\n\n const shellPath = findGitBash();\n if (!shellPath) {\n this.status = 'stopped';\n this.appendLog(\"[System Error] Shell executable (Git Bash/PowerShell) not found.\\r\\n\");\n return;\n }\n\n try {\n if (!this.ptyModule) {\n this.ptyModule = eval(\"require\")(\"node-pty\");\n }\n\n this.status = 'running';\n this.appendLog(\"\\x1b[1;36m[System] Launching workspace terminal interactive shell...\\x1b[0m\\r\\n\");\n\n const targetCwd = (this.workspaceRoot && fs.existsSync(this.workspaceRoot))\n ? this.workspaceRoot\n : process.env.ORIGINAL_CWD || process.cwd();\n\n // Spawn login/interactive shell\n const spawnArgs = isWindows() && shellPath.endsWith(\"bash.exe\") ? [\"--login\"] : [];\n\n this.ptyProcess = this.ptyModule!.spawn(shellPath, spawnArgs, {\n name: \"xterm-256color\",\n cols: 120,\n rows: 30,\n cwd: targetCwd,\n env: {\n ...process.env,\n TERM: \"xterm-256color\",\n COLORTERM: \"truecolor\",\n },\n });\n\n this.ptyProcess.onData((data: string) => {\n this.appendLog(data);\n });\n\n this.ptyProcess.onExit(({ exitCode, signal }: { exitCode: number; signal?: number }) => {\n this.status = 'stopped';\n this.appendLog(`\\r\\n\\x1b[1;31m[System] Shell process exited (code=${exitCode}, signal=${signal}).\\x1b[0m\\r\\n`);\n this.ptyProcess = null;\n });\n\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n this.status = 'stopped';\n this.appendLog(`[System Error] Failed to initialize shell runner: ${errorMessage}\\r\\n`);\n }\n }\n\n async stop(): Promise<void> {\n this.status = 'stopped';\n if (this.ptyProcess) {\n try {\n this.ptyProcess.kill();\n } catch (err) {\n console.error(\"Error killing shell process:\", err);\n }\n this.ptyProcess = null;\n }\n this.appendLog(\"\\r\\n\\x1b[1;31m[System] Shell session stopped.\\x1b[0m\\r\\n\");\n }\n\n async sendInput(text: string, isRaw = false): Promise<void> {\n if (this.status !== 'running' || !this.ptyProcess) {\n this.appendLog(`\\r\\n[Error] Shell process is ${this.status}.\\r\\n`);\n return;\n }\n \n this.agentState = 'thinking';\n await this.writeToPty(this.ptyProcess, isRaw ? text : text + \"\\r\");\n }\n\n override resize(cols: number, rows: number): void {\n if (this.ptyProcess) {\n try {\n this.ptyProcess.resize(cols, rows);\n } catch (err) {\n console.error(\"[ShellRunner] Failed to resize:\", err);\n }\n }\n }\n}\n\n"],"names":["isWindows","process","platform","findGitBash","pf","env","PROGRAMFILES","pf86","local","LOCALAPPDATA","candidates","WINGMAN_BASH_PATH","join","filter","p","found","find","existsSync","windir","powershell","cmd","ShellRunner","id","name","type","status","createdAt","logs","ptyProcess","ptyModule","workspaceRoot","Date","toISOString","appendLog","line","push","length","shift","emitOutput","start","resume","shellPath","eval","targetCwd","ORIGINAL_CWD","cwd","spawnArgs","endsWith","spawn","cols","rows","TERM","COLORTERM","onData","data","onExit","exitCode","signal","err","errorMessage","Error","message","stop","kill","console","error","sendInput","text","isRaw","agentState","writeToPty","resize"],"mappings":"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"}},
|
|
16
|
+
{"offset": {"line": 2055, "column": 0}, "map": {"version":3,"sources":["file:///C:/Users/Dave/OneDrive/Projects/JS/neural-loom/src/lib/workspaceParser.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\n\nexport function getWorkspaceFileFolders(workspaceRoot: string): string[] {\n try {\n if (!workspaceRoot || !fs.existsSync(workspaceRoot)) return [];\n \n // Normalize workspaceRoot path\n const normRoot = path.resolve(workspaceRoot).replace(/\\\\/g, \"/\");\n \n const files = fs.readdirSync(normRoot);\n const workspaceFile = files.find(f => f.endsWith(\".code-workspace\"));\n if (!workspaceFile) return [];\n\n const filePath = path.join(normRoot, workspaceFile);\n const content = fs.readFileSync(filePath, \"utf8\");\n const json = JSON.parse(content);\n \n if (!json.folders || !Array.isArray(json.folders)) return [];\n \n const folders: string[] = [];\n for (const folder of json.folders) {\n if (folder.path) {\n // Resolve relative to workspace root (where the workspace file resides)\n const resolved = path.resolve(normRoot, folder.path).replace(/\\\\/g, \"/\");\n \n // Exclude the workspace root folder itself\n if (resolved !== normRoot) {\n if (fs.existsSync(resolved)) {\n folders.push(resolved);\n }\n }\n }\n }\n return folders;\n } catch (err) {\n console.error(\"[WorkspaceParser] Failed to parse code-workspace file:\", err);\n return [];\n }\n}\n"],"names":["getWorkspaceFileFolders","workspaceRoot","existsSync","normRoot","resolve","replace","files","readdirSync","workspaceFile","find","f","endsWith","filePath","join","content","readFileSync","json","JSON","parse","folders","Array","isArray","folder","path","resolved","push","err","console","error"],"mappings":";;;;AAAA;AACA;;;AAEO,SAASA,wBAAwBC,aAAqB;IAC3D,IAAI;QACF,IAAI,CAACA,iBAAiB,CAAC,wGAAE,CAACC,UAAU,CAACD,gBAAgB,OAAO,EAAE;QAE9D,+BAA+B;QAC/B,MAAME,WAAW,4GAAI,CAACC,OAAO,CAACH,eAAeI,OAAO,CAAC,OAAO;QAE5D,MAAMC,QAAQ,wGAAE,CAACC,WAAW,CAACJ;QAC7B,MAAMK,gBAAgBF,MAAMG,IAAI,CAACC,CAAAA,IAAKA,EAAEC,QAAQ,CAAC;QACjD,IAAI,CAACH,eAAe,OAAO,EAAE;QAE7B,MAAMI,WAAW,4GAAI,CAACC,IAAI,CAACV,UAAUK;QACrC,MAAMM,UAAU,wGAAE,CAACC,YAAY,CAACH,UAAU;QAC1C,MAAMI,OAAOC,KAAKC,KAAK,CAACJ;QAExB,IAAI,CAACE,KAAKG,OAAO,IAAI,CAACC,MAAMC,OAAO,CAACL,KAAKG,OAAO,GAAG,OAAO,EAAE;QAE5D,MAAMA,UAAoB,EAAE;QAC5B,KAAK,MAAMG,UAAUN,KAAKG,OAAO,CAAE;YACjC,IAAIG,OAAOC,IAAI,EAAE;gBACf,wEAAwE;gBACxE,MAAMC,WAAW,4GAAI,CAACpB,OAAO,CAACD,UAAUmB,OAAOC,IAAI,EAAElB,OAAO,CAAC,OAAO;gBAEpE,2CAA2C;gBAC3C,IAAImB,aAAarB,UAAU;oBACzB,IAAI,wGAAE,CAACD,UAAU,CAACsB,WAAW;wBAC3BL,QAAQM,IAAI,CAACD;oBACf;gBACF;YACF;QACF;QACA,OAAOL;IACT,EAAE,OAAOO,KAAK;QACZC,QAAQC,KAAK,CAAC,0DAA0DF;QACxE,OAAO,EAAE;IACX;AACF"}},
|
|
17
|
+
{"offset": {"line": 2098, "column": 0}, "map": {"version":3,"sources":["file:///C:/Users/Dave/OneDrive/Projects/JS/neural-loom/src/lib/agents/SessionManager.ts"],"sourcesContent":["import crypto from \"crypto\";\nimport { AgentRunner, RunnerStatus } from \"./AgentRunner\";\nimport { MockRunner } from \"./MockRunner\";\nimport { ClaudeRunner } from \"./ClaudeRunner\";\nimport { DockerRunner } from \"./DockerRunner\";\nimport { SSHRunner } from \"./SSHRunner\";\nimport { AiderRunner } from \"./AiderRunner\";\nimport { initWebSocketServer } from \"./WebSocketServer\";\nimport { ContextManager } from \"./ContextManager\";\nimport { SessionPersister } from \"./SessionPersister\";\nimport { ShellRunner } from \"./ShellRunner\";\nimport { getWorkspaceFileFolders } from \"../workspaceParser\";\n\ndeclare global {\n var sessionManager: SessionManager | undefined;\n}\n\nexport class SessionManager {\n private static instance: SessionManager | null = null;\n private sessions = new Map<string, AgentRunner>();\n\n private constructor() {\n // Bootstrap staging filesystem and slash commands\n ContextManager.initializeStaging();\n ContextManager.compileGlobalRules();\n\n // Spawn/start permanent workspace terminal shell runner\n const shellRunner = new ShellRunner();\n shellRunner.start();\n this.sessions.set(shellRunner.id, shellRunner);\n\n // Reload persisted sessions\n try {\n const saved = SessionPersister.loadAllSessions();\n for (const data of saved) {\n // Preserved persisted session\n\n let runner: AgentRunner;\n if (data.type === \"mock\") {\n runner = new MockRunner(data.id, data.name);\n } else if (data.type === \"claude-docker\") {\n runner = new DockerRunner(data.id, data.name);\n } else if (data.type === \"claude-ssh\") {\n runner = new SSHRunner(data.id, data.name);\n } else if (data.type === \"aider\" || data.type === \"aider-docker\") {\n runner = new AiderRunner(data.id, data.type as 'aider' | 'aider-docker', data.name);\n } else if (data.type === \"shell\") {\n runner = new ShellRunner(data.id, data.name, data.workspaceRoot);\n } else {\n runner = new ClaudeRunner(data.id, data.name);\n }\n\n runner.status = data.status;\n runner.createdAt = data.createdAt;\n runner.logs = data.logs;\n runner.workspaceRoot = data.workspaceRoot;\n runner.scopedDirs = data.scopedDirs;\n runner.lastSyncedWorkspaceFolders = data.lastSyncedWorkspaceFolders;\n\n this.sessions.set(data.id, runner);\n }\n } catch (err) {\n console.error(\"[SessionManager] Failed to reload saved sessions:\", err);\n }\n }\n\n public static getInstance(): SessionManager {\n if (!globalThis.sessionManager) {\n globalThis.sessionManager = new SessionManager();\n // Initialize WebSocket gateway server\n const wsPort = Number(process.env.WS_PORT) || 9601;\n initWebSocketServer(wsPort, (id) => globalThis.sessionManager!.getSession(id));\n }\n return globalThis.sessionManager;\n }\n\n private generateId(): string {\n return crypto.randomUUID();\n }\n\n public async createSession(\n type: 'mock' | 'claude' | 'claude-docker' | 'claude-ssh' | 'aider' | 'aider-docker' | 'shell',\n name?: string,\n workspaceRoot?: string,\n scopedDirs?: string[],\n parentSessionId?: string\n ): Promise<AgentRunner> {\n const id = (type === 'shell' && parentSessionId)\n ? `shell-${parentSessionId}-${crypto.randomUUID()}`\n : this.generateId();\n let runner: AgentRunner;\n\n if (type === 'mock') {\n runner = new MockRunner(id, name);\n } else if (type === 'claude-docker') {\n runner = new DockerRunner(id, name);\n } else if (type === 'claude-ssh') {\n runner = new SSHRunner(id, name);\n } else if (type === 'aider' || type === 'aider-docker') {\n runner = new AiderRunner(id, type, name);\n } else if (type === 'shell') {\n runner = new ShellRunner(id, name, workspaceRoot);\n } else {\n runner = new ClaudeRunner(id, name);\n }\n\n runner.workspaceRoot = workspaceRoot;\n runner.scopedDirs = scopedDirs;\n\n runner.resetInitialStateAnalysis();\n await runner.start();\n this.sessions.set(id, runner);\n SessionPersister.saveSession(runner, true);\n return runner;\n }\n\n public getSession(id: string): AgentRunner | undefined {\n const runner = this.sessions.get(id);\n if (runner) {\n this.syncWorkspaceFolders(runner);\n }\n return runner;\n }\n\n public listSessions(): RunnerStatus[] {\n return Array.from(this.sessions.values()).map(runner => {\n this.syncWorkspaceFolders(runner);\n return runner.getStatus();\n });\n }\n\n public syncWorkspaceFolders(session: AgentRunner) {\n if (session.type === 'mock' || session.type === 'shell') return;\n const root = session.workspaceRoot || process.env.ORIGINAL_CWD || process.cwd();\n const currentWorkspaceFolders = getWorkspaceFileFolders(root);\n \n const lastSynced = session.lastSyncedWorkspaceFolders || [];\n \n // Check if the folders list from .code-workspace has changed since last sync\n const hasChanged = \n currentWorkspaceFolders.length !== lastSynced.length || \n currentWorkspaceFolders.some(f => !lastSynced.includes(f)) ||\n lastSynced.some(f => !currentWorkspaceFolders.includes(f));\n \n if (hasChanged) {\n console.log(`[SessionManager] Code workspace folders changed for session ${session.id}. Re-syncing...`);\n \n if (!session.scopedDirs) session.scopedDirs = [];\n \n // 1. Remove folders that were in the previous sync but are no longer in .code-workspace\n session.scopedDirs = session.scopedDirs.filter(dir => {\n if (lastSynced.includes(dir) && !currentWorkspaceFolders.includes(dir)) {\n return false;\n }\n return true;\n });\n \n // 2. Add new folders that are in .code-workspace\n for (const dir of currentWorkspaceFolders) {\n if (!session.scopedDirs.includes(dir)) {\n session.scopedDirs.push(dir);\n }\n }\n \n // 3. Update last synced flag\n session.lastSyncedWorkspaceFolders = currentWorkspaceFolders;\n \n // 4. Save session status\n SessionPersister.saveSession(session, true);\n \n // 5. Re-compile context\n ContextManager.compileSessionContext(root, session.scopedDirs);\n \n // 6. Auto-inject mount context command if active\n if (session.status === 'running') {\n this.injectCommand(session.id, \"/ccc\");\n }\n }\n }\n\n public async startSession(id: string, resume?: boolean): Promise<boolean> {\n const runner = this.sessions.get(id);\n if (!runner) return false;\n runner.resetInitialStateAnalysis();\n await runner.start(resume);\n SessionPersister.saveSession(runner, true);\n return true;\n }\n\n public async stopSession(id: string): Promise<boolean> {\n const runner = this.sessions.get(id);\n if (!runner) return false;\n await runner.stop();\n SessionPersister.saveSession(runner, true);\n return true;\n }\n\n public async deleteSession(id: string): Promise<boolean> {\n const runner = this.sessions.get(id);\n if (runner) {\n await runner.stop();\n }\n SessionPersister.deleteSession(id);\n return this.sessions.delete(id);\n }\n\n public async injectCommand(id: string, command: string): Promise<boolean> {\n const runner = this.sessions.get(id);\n if (!runner || runner.status !== 'running') return false;\n\n const root = runner.workspaceRoot || process.env.ORIGINAL_CWD || process.cwd();\n\n if (command === '/ccc' || command === '/ccp') {\n ContextManager.compileSessionContext(root, runner.scopedDirs);\n }\n\n let finalCommand = command;\n if (runner.type === 'aider' || runner.type === 'aider-docker') {\n if (command === '/ccc') {\n finalCommand = \"/read .ai/neural-loom/ccontext.md\";\n } else if (command === '/ccp') {\n finalCommand = \"/read .ai/neural-loom/cprompt.md\";\n }\n }\n\n // Inject Ctrl+U to clear input, then command, then Enter (\\r)\n await runner.sendInput(\"\\x15\" + finalCommand + \"\\r\", true);\n return true;\n }\n}\n"],"names":["SessionManager","instance","sessions","Map","initializeStaging","compileGlobalRules","shellRunner","start","set","id","saved","loadAllSessions","data","runner","type","name","workspaceRoot","status","createdAt","logs","scopedDirs","lastSyncedWorkspaceFolders","err","console","error","getInstance","globalThis","sessionManager","wsPort","Number","process","env","WS_PORT","getSession","generateId","randomUUID","createSession","parentSessionId","resetInitialStateAnalysis","saveSession","get","syncWorkspaceFolders","listSessions","Array","from","values","map","getStatus","session","root","ORIGINAL_CWD","cwd","currentWorkspaceFolders","lastSynced","hasChanged","length","some","f","includes","log","filter","dir","push","compileSessionContext","injectCommand","startSession","resume","stopSession","stop","deleteSession","delete","command","finalCommand","sendInput"],"mappings":"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"}},
|
|
18
|
+
{"offset": {"line": 2296, "column": 0}, "map": {"version":3,"sources":["turbopack:///package.json"],"sourcesContent":["{\"name\":\"neural-loom\",\"version\":\"0.2.70\",\"bin\":{\"neural-loom\":\"./bin/cli.js\"},\"files\":[\"bin\",\"public\",\".next\",\"src\",\"next.config.ts\",\"tsconfig.json\",\"README.md\"],\"scripts\":{\"dev\":\"next dev\",\"build\":\"next build\",\"start\":\"next start\",\"lint\":\"eslint\"},\"dependencies\":{\"@monaco-editor/react\":\"^4.7.0\",\"@xterm/addon-search\":\"^0.16.0\",\"mssql\":\"^12.5.5\",\"next\":\"16.2.6\",\"node-pty\":\"^1.1.0\",\"react\":\"19.2.4\",\"react-dom\":\"19.2.4\",\"ws\":\"^8.21.0\",\"xterm\":\"^5.3.0\",\"xterm-addon-fit\":\"^0.8.0\"},\"devDependencies\":{\"@types/node\":\"^20\",\"@types/react\":\"^19\",\"@types/react-dom\":\"^19\",\"@types/ws\":\"^8.18.1\",\"eslint\":\"^9\",\"eslint-config-next\":\"16.2.6\",\"typescript\":\"^5\"}}"],"names":[],"mappings":""}},
|
|
19
|
+
{"offset": {"line": 2343, "column": 0}, "map": {"version":3,"sources":["file:///C:/Users/Dave/OneDrive/Projects/JS/neural-loom/src/app/api/sessions/route.ts"],"sourcesContent":["import { NextResponse } from \"next/server\";\nimport { SessionManager } from \"@/lib/agents/SessionManager\";\nimport pkg from \"../../../../package.json\";\n\ndeclare global {\n var wsPort: number | undefined;\n}\n\nexport async function GET(request: Request) {\n try {\n const { searchParams } = new URL(request.url);\n const id = searchParams.get(\"id\");\n const manager = SessionManager.getInstance();\n\n if (id) {\n const session = manager.getSession(id);\n if (!session) {\n return NextResponse.json({ error: \"Session not found\" }, { status: 404 });\n }\n return NextResponse.json({\n ...session.getStatus(),\n logs: session.logs,\n wsPort: global.wsPort || 9601,\n version: pkg.version,\n });\n }\n\n const sessions = manager.listSessions();\n const originalCwd = process.env.ORIGINAL_CWD || process.cwd();\n const wsPort = global.wsPort || 9601;\n return NextResponse.json({ sessions, originalCwd, wsPort, version: pkg.version });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n return NextResponse.json({ error: errorMessage }, { status: 500 });\n }\n}\n\n"],"names":["GET","request","searchParams","URL","url","id","get","manager","getInstance","session","getSession","json","error","status","getStatus","logs","wsPort","version","sessions","listSessions","originalCwd","process","env","ORIGINAL_CWD","cwd","errorMessage","Error","message"],"mappings":";;;;AAAA;AACA;AACA;;;;AAMO,eAAeA,IAAIC,OAAgB;IACxC,IAAI;QACF,MAAM,EAAEC,YAAY,EAAE,GAAG,IAAIC,IAAIF,QAAQG,GAAG;QAC5C,MAAMC,KAAKH,aAAaI,GAAG,CAAC;QAC5B,MAAMC,UAAU,0JAAc,CAACC,WAAW;QAE1C,IAAIH,IAAI;YACN,MAAMI,UAAUF,QAAQG,UAAU,CAACL;YACnC,IAAI,CAACI,SAAS;gBACZ,OAAO,gJAAY,CAACE,IAAI,CAAC;oBAAEC,OAAO;gBAAoB,GAAG;oBAAEC,QAAQ;gBAAI;YACzE;YACA,OAAO,gJAAY,CAACF,IAAI,CAAC;gBACvB,GAAGF,QAAQK,SAAS,EAAE;gBACtBC,MAAMN,QAAQM,IAAI;gBAClBC,QAAQ,yDAAOA,MAAM,IAAI;gBACzBC,SAAS,yIAAG,CAACA,OAAO;YACtB;QACF;QAEA,MAAMC,WAAWX,QAAQY,YAAY;QACrC,MAAMC,cAAcC,QAAQC,GAAG,CAACC,YAAY,IAAIF,QAAQG,GAAG;QAC3D,MAAMR,SAAS,yDAAOA,MAAM,IAAI;QAChC,OAAO,gJAAY,CAACL,IAAI,CAAC;YAAEO;YAAUE;YAAaJ;YAAQC,SAAS,yIAAG,CAACA,OAAO;QAAC;IACjF,EAAE,OAAOL,OAAO;QACd,MAAMa,eAAeb,iBAAiBc,QAAQd,MAAMe,OAAO,GAAG;QAC9D,OAAO,gJAAY,CAAChB,IAAI,CAAC;YAAEC,OAAOa;QAAa,GAAG;YAAEZ,QAAQ;QAAI;IAClE;AACF"}}]
|
|
20
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module.exports = [
|
|
2
|
+
"[externals]/react/jsx-runtime [external] (react/jsx-runtime, cjs)", ((__turbopack_context__, module, exports) => {
|
|
3
|
+
|
|
4
|
+
const mod = __turbopack_context__.x("react/jsx-runtime", () => require("react/jsx-runtime"));
|
|
5
|
+
|
|
6
|
+
module.exports = mod;
|
|
7
|
+
}),
|
|
8
|
+
"[externals]/react [external] (react, cjs)", ((__turbopack_context__, module, exports) => {
|
|
9
|
+
|
|
10
|
+
const mod = __turbopack_context__.x("react", () => require("react"));
|
|
11
|
+
|
|
12
|
+
module.exports = mod;
|
|
13
|
+
}),
|
|
14
|
+
"[externals]/path [external] (path, cjs)", ((__turbopack_context__, module, exports) => {
|
|
15
|
+
|
|
16
|
+
const mod = __turbopack_context__.x("path", () => require("path"));
|
|
17
|
+
|
|
18
|
+
module.exports = mod;
|
|
19
|
+
}),
|
|
20
|
+
"[externals]/next/dist/compiled/next-server/pages-turbo.runtime.dev.js [external] (next/dist/compiled/next-server/pages-turbo.runtime.dev.js, cjs)", ((__turbopack_context__, module, exports) => {
|
|
21
|
+
|
|
22
|
+
const mod = __turbopack_context__.x("next/dist/compiled/next-server/pages-turbo.runtime.dev.js", () => require("next/dist/compiled/next-server/pages-turbo.runtime.dev.js"));
|
|
23
|
+
|
|
24
|
+
module.exports = mod;
|
|
25
|
+
}),
|
|
26
|
+
"[externals]/next/dist/compiled/@opentelemetry/api [external] (next/dist/compiled/@opentelemetry/api, cjs)", ((__turbopack_context__, module, exports) => {
|
|
27
|
+
|
|
28
|
+
const mod = __turbopack_context__.x("next/dist/compiled/@opentelemetry/api", () => require("next/dist/compiled/@opentelemetry/api"));
|
|
29
|
+
|
|
30
|
+
module.exports = mod;
|
|
31
|
+
}),
|
|
32
|
+
];
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
module.exports = [
|
|
2
|
+
"[externals]/next/dist/shared/lib/no-fallback-error.external.js [external] (next/dist/shared/lib/no-fallback-error.external.js, cjs)", ((__turbopack_context__, module, exports) => {
|
|
3
|
+
|
|
4
|
+
const mod = __turbopack_context__.x("next/dist/shared/lib/no-fallback-error.external.js", () => require("next/dist/shared/lib/no-fallback-error.external.js"));
|
|
5
|
+
|
|
6
|
+
module.exports = mod;
|
|
7
|
+
}),
|
|
8
|
+
];
|