@xopcai/xopc 0.0.138 → 0.0.139
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CIsGDJzd.js → agent-avatar-dicebear-DaKR5VFJ.js} +1 -1
- package/dist/gateway/static/root/assets/{agents-fX97A6iN.js → agents-BWPLvVAX.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-ByM4Bzwm.js → app-management-settings-panel-C1yCcfAr.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-BF_poRd3.js → appearance-settings-C7epTkvN.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-BssdA5Qc.js → apps-page-C7RhWR_g.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-DJaYoyGn.js → archive-plugin-uYiq_pCm.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-xx6dBaZU.js → attachment-load-tTRlOS85.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-suggestion-card-BMvGqYob.js → automation-suggestion-card-CrsQD0rW.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-Dip8ZFmx.js → automations-page-Ceq-gjQY.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-CuPLWibr.js → binary-plugins-C48c9Gom.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-bzfvlJnh.js → block-editor-otkTsVAj.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-settings-page-lbx_8Dku.js → browser-settings-page-DfTmJ6vD.js} +1 -1
- package/dist/gateway/static/root/assets/{capability-presets-api-X4Imbf8n.js → capability-presets-api-DcsHBLTW.js} +1 -1
- package/dist/gateway/static/root/assets/{capability-presets-settings-panel-v9JgKjJu.js → capability-presets-settings-panel-APCDv5lF.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-CED7Oy5Y.js → channels-settings-DiffHkSo.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-page-BMfp0jWL.js → connectors-page-BtpP4slN.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-oTig6qFO.js → desktop-pet-CFOzVp9k.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-DXJiPL_H.js → desktop-pet-settings-B_n2hP1Y.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-CltkXSR2.js → directory-picker-path-field-D70qdEFn.js} +1 -1
- package/dist/gateway/static/root/assets/{dreaming-settings-CYrZQxoL.js → dreaming-settings-Cf1djhWv.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-C-4BOy1R.js → extension-debug-page-vq1KzRUr.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-C8nMpXqh.js → extension-page-76tQc0Em.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-CXWYOwka.js → extension-settings-page-Dd9rQaPO.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-B3TGdim5.js → gateway-config-api-BUE3TEuI.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-D7tOnGAJ.js → gateway-settings-Csn16qoE.js} +1 -1
- package/dist/gateway/static/root/assets/{goal-create-dialog-BL_cRshf.js → goal-create-dialog-DSqSnAl7.js} +1 -1
- package/dist/gateway/static/root/assets/{goal-detail-page-T1vg6Ng_.js → goal-detail-page-CMCq_woY.js} +1 -1
- package/dist/gateway/static/root/assets/{goals-config-api-D-WZWhP2.js → goals-config-api-nJpdQNoE.js} +1 -1
- package/dist/gateway/static/root/assets/{goals-page-1vzWXl5W.js → goals-page-D6Vpf5-E.js} +1 -1
- package/dist/gateway/static/root/assets/{goals-settings-DgGwvLVC.js → goals-settings-jrmfg0HO.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-yh0bEIwQ.js → heartbeat-settings-KL9DRMjL.js} +1 -1
- package/dist/gateway/static/root/assets/{index-NwiCnzI-.js → index-YWf7ByKE.js} +6 -6
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CnxRFbgA.js → keyboard-shortcuts-settings-pIQ37X35.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-DebnvTpD.js → logs-page-BmdFLgTD.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-split-BU69Nof8.js → markdown-split-DnZL-Ckh.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-CDs7OvWt.js → media-plugins-MxdJOcLY.js} +1 -1
- package/dist/gateway/static/root/assets/{models-hub-panel-Ca_jy26S.js → models-hub-panel-DnQ03TQ8.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-DTpeaI65.js → notes-page-BDuJYhFX.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-workbench-uKMYsjUU.js → notes-workbench-DzPGnk2x.js} +2 -2
- package/dist/gateway/static/root/assets/{page-tabs-CROo8Vgz.js → page-tabs-CH8nMJUm.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-BxsS9i1G.js → preview-open-alternatives-Dob0DX_p.js} +1 -1
- package/dist/gateway/static/root/assets/{project-detail-page-BWKOhshy.js → project-detail-page-CyChMpWm.js} +1 -1
- package/dist/gateway/static/root/assets/{projects-page-CoowiCLe.js → projects-page-eqKeClp0.js} +1 -1
- package/dist/gateway/static/root/assets/{remote-access-hub-CiOaX1wd.js → remote-access-hub-DYUBreXP.js} +1 -1
- package/dist/gateway/static/root/assets/{save-bar-controls-B4N17dMG.js → save-bar-controls-C1Rb4FUZ.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-ClJzQ2vz.js → schedule-field-Fjw3-jca.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-oZvQUfDg.js → schema-form-B3mv0qnM.js} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-Sx9Gc0cv.js → sessions-page-DROyxOSO.js} +1 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-Cir7UEDe.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-B0kOLXUf.js → settings-collapsible-section-TNRY46vl.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-DoVPlVFd.js → settings-form-section-SlP81d-d.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-C7J96bLc.js → settings-loading-skeleton-hhP-2fj4.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-CXiAByF0.js → settings-page-B064FDr_.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-R-6ArlMI.js → settings-page-layout-CLxmpeP0.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-Drz23n9l.js → setup-status-panel-D2vFjWe1.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-Bn1umseg.js → share-preview-page-CFKOGhyl.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-settings-Bb-pcMWg.js → shares-settings-B8Yx9E_Z.js} +1 -1
- package/dist/gateway/static/root/assets/skill-reload-api-loLlXXAj.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-B6cDPqkk.js → skills-page-C23qF1by.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-CtEddAy-.js → system-settings-panel-CA97ApVu.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-BkhSnYq7.js → typed-models-lib-D2qodBzJ.js} +1 -1
- package/dist/gateway/static/root/assets/{user-profile-settings-panel-BssTVOBS.js → user-profile-settings-panel-BRfmfG5A.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-CI3ywKLT.js → utils-ClF36Dfd.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-DXMEGw9O.js → voice-api-key-field-DBy_63L1.js} +1 -1
- package/dist/gateway/static/root/assets/{work-item-detail-page-DsFqU0tK.js → work-item-detail-page-DiZzNQOW.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-DImBi-m6.js → workflow-run-setup-panel-BVC8Pt1v.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-start-dialog-DuPpKAAc.js → workflow-start-dialog-B2ErVQ-D.js} +1 -1
- package/dist/gateway/static/root/assets/{workflows-page-DfTVzTNY.js → workflows-page-VmWTqyyW.js} +1 -1
- package/dist/gateway/static/root/index.html +1 -1
- package/dist/package.js +1 -1
- package/dist/src/agent/code-intelligence/binary.d.ts +13 -0
- package/dist/src/agent/code-intelligence/binary.js +153 -2
- package/dist/src/agent/code-intelligence/binary.js.map +1 -1
- package/dist/src/agent/code-intelligence/index.d.ts +1 -1
- package/dist/src/agent/code-intelligence/index.js +2 -2
- package/dist/src/agent/code-intelligence/runtime.js +2 -2
- package/dist/src/agent/code-intelligence/runtime.js.map +1 -1
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/gateway/agents-admin.js +1 -1
- package/package.json +2 -2
- package/dist/gateway/static/root/assets/settings-advanced-gate-CnbVdze4.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DE9HCHct.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binary.js","names":[],"sources":["../../../../src/agent/code-intelligence/binary.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { accessSync, constants, existsSync, realpathSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\n\nconst require = createRequire(import.meta.url);\n\nfunction binaryName(): string {\n return process.platform === 'win32' ? 'codebase-memory-mcp.exe' : 'codebase-memory-mcp';\n}\n\nfunction isUsableBinary(path: string): boolean {\n if (!existsSync(path)) return false;\n try {\n accessSync(path, process.platform === 'win32' ? constants.F_OK : constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction packageBinaryPath(): string | undefined {\n try {\n const packageJson = require.resolve('codebase-memory-mcp/package.json');\n return join(dirname(packageJson), 'bin', binaryName());\n } catch {\n return undefined;\n }\n}\n\nexport function resolveCodebaseMemoryBinary(explicitPath?: string): string {\n const resourcesPath = (process as NodeJS.Process & { resourcesPath?: string }).resourcesPath;\n const candidates = [\n explicitPath,\n process.env.XOPC_CBM_BINARY,\n resourcesPath ? join(resourcesPath, 'bin', binaryName()) : undefined,\n packageBinaryPath(),\n ].filter((value): value is string => Boolean(value?.trim()));\n\n for (const candidate of candidates) {\n const absolute = resolve(candidate);\n if (isUsableBinary(absolute)) {\n return realpathSync(absolute);\n }\n }\n\n throw new Error(\n `codebase-memory-mcp binary is unavailable; checked ${candidates.join(', ') || 'no candidate paths'}`,\n );\n}\n"],"mappings":";;;;AAIA,MAAM,UAAU,cAAc,OAAO,KAAK,IAAI;AAE9C,SAAS,aAAqB;AAC5B,QAAO,QAAQ,aAAa,UAAU,4BAA4B;;AAGpE,SAAS,eAAe,MAAuB;AAC7C,KAAI,CAAC,WAAW,KAAK,CAAE,QAAO;AAC9B,KAAI;AACF,aAAW,MAAM,QAAQ,aAAa,UAAU,UAAU,OAAO,UAAU,KAAK;AAChF,SAAO;SACD;AACN,SAAO;;;AAIX,SAAS,oBAAwC;AAC/C,KAAI;AAEF,SAAO,KAAK,QADQ,QAAQ,QAAQ,mCACL,CAAC,EAAE,OAAO,YAAY,CAAC;SAChD;AACN;;;AAIJ,SAAgB,4BAA4B,cAA+B;CACzE,MAAM,gBAAiB,QAAwD;CAC/E,MAAM,aAAa;EACjB;EACA,QAAQ,IAAI;EACZ,gBAAgB,KAAK,eAAe,OAAO,YAAY,CAAC,GAAG,KAAA;EAC3D,mBAAmB;EACpB,CAAC,QAAQ,UAA2B,QAAQ,OAAO,MAAM,CAAC,CAAC;AAE5D,MAAK,MAAM,aAAa,YAAY;EAClC,MAAM,WAAW,QAAQ,UAAU;AACnC,MAAI,eAAe,SAAS,CAC1B,QAAO,aAAa,SAAS;;AAIjC,OAAM,IAAI,MACR,sDAAsD,WAAW,KAAK,KAAK,IAAI,uBAChF"}
|
|
1
|
+
{"version":3,"file":"binary.js","names":[],"sources":["../../../../src/agent/code-intelligence/binary.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport {\n accessSync,\n chmodSync,\n constants,\n copyFileSync,\n createReadStream,\n createWriteStream,\n existsSync,\n mkdirSync,\n mkdtempSync,\n realpathSync,\n renameSync,\n rmSync,\n} from 'node:fs';\nimport { execFile } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { tmpdir } from 'node:os';\nimport { pipeline } from 'node:stream/promises';\nimport { Readable } from 'node:stream';\nimport { dirname, join, resolve } from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { resolveStateDir } from '../../config/paths.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst require = createRequire(import.meta.url);\nconst log = createLogger('CodeIntelligenceBinary');\n\nconst CBM_VERSION = '0.9.0';\nconst DOWNLOAD_TIMEOUT_MS = 2 * 60_000;\nconst RELEASE_BASE_URL = `https://github.com/DeusData/codebase-memory-mcp/releases/download/v${CBM_VERSION}`;\nconst execFileAsync = promisify(execFile);\n\ntype FetchImplementation = typeof fetch;\n\nexport interface DownloadCodebaseMemoryBinaryOptions {\n fetchImplementation?: FetchImplementation;\n timeoutMs?: number;\n}\n\nfunction binaryName(): string {\n return process.platform === 'win32' ? 'codebase-memory-mcp.exe' : 'codebase-memory-mcp';\n}\n\nfunction platformName(): string {\n switch (process.platform) {\n case 'darwin':\n return 'darwin';\n case 'linux':\n return 'linux';\n case 'win32':\n return 'windows';\n default:\n throw new Error(`Code intelligence is not supported on ${process.platform}`);\n }\n}\n\nfunction architectureName(): string {\n switch (process.arch) {\n case 'arm64':\n return 'arm64';\n case 'x64':\n return 'amd64';\n default:\n throw new Error(`Code intelligence is not supported on ${process.arch}`);\n }\n}\n\nfunction releaseUrl(): string {\n return `${RELEASE_BASE_URL}/${archiveName()}`;\n}\n\nfunction archiveName(): string {\n const platform = platformName();\n const extension = platform === 'windows' ? 'zip' : 'tar.gz';\n const linuxPortable = platform === 'linux' ? '-portable' : '';\n return `codebase-memory-mcp-${platform}-${architectureName()}${linuxPortable}.${extension}`;\n}\n\nfunction archiveExtension(): 'zip' | 'tar.gz' {\n return platformName() === 'windows' ? 'zip' : 'tar.gz';\n}\n\nfunction expectedSha256(checksums: string, filename: string): string {\n for (const line of checksums.split(/\\r?\\n/)) {\n const match = /^([a-f0-9]{64})\\s+\\*?(.+)$/i.exec(line.trim());\n if (match?.[2] === filename) return match[1].toLowerCase();\n }\n throw new Error(`checksums.txt does not contain ${filename}`);\n}\n\nasync function sha256(path: string): Promise<string> {\n const hash = createHash('sha256');\n await new Promise<void>((resolvePromise, reject) => {\n const input = createReadStream(path);\n input.on('data', (chunk: Buffer) => hash.update(chunk));\n input.once('error', reject);\n input.once('end', resolvePromise);\n });\n return hash.digest('hex');\n}\n\nfunction managedBinaryPath(stateDir = resolveStateDir()): string {\n return join(\n stateDir,\n 'code-intelligence',\n 'bin',\n `v${CBM_VERSION}`,\n `${platformName()}-${architectureName()}`,\n binaryName(),\n );\n}\n\nfunction isUsableBinary(path: string): boolean {\n if (!existsSync(path)) return false;\n try {\n accessSync(path, process.platform === 'win32' ? constants.F_OK : constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction packageBinaryPath(): string | undefined {\n try {\n const packageJson = require.resolve('codebase-memory-mcp/package.json');\n return join(dirname(packageJson), 'bin', binaryName());\n } catch {\n return undefined;\n }\n}\n\nexport function resolveCodebaseMemoryBinary(explicitPath?: string): string {\n const resourcesPath = (process as NodeJS.Process & { resourcesPath?: string }).resourcesPath;\n const candidates = [\n explicitPath,\n process.env.XOPC_CBM_BINARY,\n resourcesPath ? join(resourcesPath, 'bin', binaryName()) : undefined,\n packageBinaryPath(),\n ].filter((value): value is string => Boolean(value?.trim()));\n\n for (const candidate of candidates) {\n const absolute = resolve(candidate);\n if (isUsableBinary(absolute)) {\n return realpathSync(absolute);\n }\n }\n\n throw new Error(\n `codebase-memory-mcp binary is unavailable; checked ${candidates.join(', ') || 'no candidate paths'}`,\n );\n}\n\n/** Download the CBM executable into its final path atomically. */\nexport async function downloadCodebaseMemoryBinary(\n destination: string,\n options: DownloadCodebaseMemoryBinaryOptions = {},\n): Promise<string> {\n const fetchImplementation = options.fetchImplementation ?? fetch;\n const timeoutMs = options.timeoutMs ?? DOWNLOAD_TIMEOUT_MS;\n const temporaryPath = `${destination}.${process.pid}.part`;\n const abortController = new AbortController();\n const tempDir = mkdtempSync(join(tmpdir(), 'xopc-cbm-'));\n const archivePath = join(tempDir, `cbm.${archiveExtension()}`);\n let timedOut = false;\n let rejectTimeout: ((error: Error) => void) | undefined;\n const timeoutPromise = new Promise<never>((_resolve, reject) => {\n rejectTimeout = reject;\n });\n const timer = setTimeout(() => {\n timedOut = true;\n abortController.abort();\n rejectTimeout?.(new Error(`download timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n try {\n mkdirSync(dirname(destination), { recursive: true });\n rmSync(temporaryPath, { force: true });\n await Promise.race([\n (async () => {\n const checksumsResponse = await fetchImplementation(`${RELEASE_BASE_URL}/checksums.txt`, {\n redirect: 'follow',\n signal: abortController.signal,\n });\n if (!checksumsResponse.ok) {\n throw new Error(`GitHub Releases returned HTTP ${checksumsResponse.status} for checksums.txt`);\n }\n const expectedChecksum = expectedSha256(await checksumsResponse.text(), archiveName());\n const response = await fetchImplementation(releaseUrl(), {\n redirect: 'follow',\n signal: abortController.signal,\n });\n if (!response.ok) {\n throw new Error(`GitHub Releases returned HTTP ${response.status}`);\n }\n if (!response.body) {\n throw new Error('GitHub Releases returned an empty response body');\n }\n\n await pipeline(\n Readable.fromWeb(response.body as import('node:stream/web').ReadableStream),\n createWriteStream(archivePath, { mode: 0o600 }),\n );\n const actualChecksum = await sha256(archivePath);\n if (actualChecksum !== expectedChecksum) {\n throw new Error(\n `checksum mismatch for ${archiveName()}: expected ${expectedChecksum}, got ${actualChecksum}`,\n );\n }\n if (archiveExtension() === 'tar.gz') {\n await execFileAsync('tar', ['-xzf', archivePath, '-C', tempDir, '--no-same-owner']);\n } else {\n await execFileAsync('powershell', [\n '-NoProfile',\n '-Command',\n `Expand-Archive -Path '${archivePath}' -DestinationPath '${tempDir}' -Force`,\n ]);\n }\n\n const extracted = join(tempDir, binaryName());\n if (!isUsableBinary(extracted)) {\n throw new Error(`binary was not present after extracting ${archiveExtension()} archive`);\n }\n copyFileSync(extracted, temporaryPath);\n })(),\n timeoutPromise,\n ]);\n if (timedOut) throw new Error(`download timed out after ${timeoutMs}ms`);\n if (process.platform !== 'win32') chmodSync(temporaryPath, 0o755);\n renameSync(temporaryPath, destination);\n return realpathSync(destination);\n } catch (error) {\n const reason = timedOut\n ? `download timed out after ${timeoutMs}ms`\n : error instanceof Error\n ? error.message\n : String(error);\n throw new Error(\n `Unable to download codebase-memory-mcp from GitHub Releases: ${reason}. ` +\n 'Check network access or set XOPC_CBM_BINARY to a trusted executable.',\n );\n } finally {\n clearTimeout(timer);\n rmSync(temporaryPath, { force: true });\n rmSync(tempDir, { recursive: true, force: true });\n }\n}\n\n/**\n * Resolve a bundled or explicit binary first, then lazily download one for npm installs.\n * This deliberately keeps large GitHub Release downloads out of npm lifecycle scripts.\n */\nexport async function ensureCodebaseMemoryBinary(explicitPath?: string): Promise<string> {\n try {\n return resolveCodebaseMemoryBinary(explicitPath);\n } catch {\n const destination = managedBinaryPath();\n if (isUsableBinary(destination)) return realpathSync(destination);\n\n log.info(\n { destination, version: CBM_VERSION, timeoutMs: DOWNLOAD_TIMEOUT_MS },\n 'Downloading code intelligence binary on demand',\n );\n return downloadCodebaseMemoryBinary(destination);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { resolveCodebaseMemoryBinary } from './binary.js';
|
|
1
|
+
export { downloadCodebaseMemoryBinary, ensureCodebaseMemoryBinary, resolveCodebaseMemoryBinary, } from './binary.js';
|
|
2
2
|
export { CodeIntelligenceRuntime } from './runtime.js';
|
|
3
3
|
export { createCodeIntelligenceTools, type CodeIntelligenceToolDeps } from './tools.js';
|
|
4
4
|
export type { CodeIntelligenceRuntimeLike, CodeIntelligenceState, CodeIntelligenceStatus, CodeIntelligenceToolResult, } from './types.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { createCodeIntelligenceTools } from "./tools.js";
|
|
2
|
-
import { resolveCodebaseMemoryBinary } from "./binary.js";
|
|
2
|
+
import { downloadCodebaseMemoryBinary, ensureCodebaseMemoryBinary, resolveCodebaseMemoryBinary } from "./binary.js";
|
|
3
3
|
import { CodeIntelligenceRuntime } from "./runtime.js";
|
|
4
|
-
export { CodeIntelligenceRuntime, createCodeIntelligenceTools, resolveCodebaseMemoryBinary };
|
|
4
|
+
export { CodeIntelligenceRuntime, createCodeIntelligenceTools, downloadCodebaseMemoryBinary, ensureCodebaseMemoryBinary, resolveCodebaseMemoryBinary };
|
|
@@ -3,7 +3,7 @@ import { createLogger } from "../../utils/logger/index.js";
|
|
|
3
3
|
import { init_logger } from "../../utils/logger.js";
|
|
4
4
|
import { init_paths } from "../../config/paths.js";
|
|
5
5
|
import { XopcStdioClientTransport } from "../mcp/mcp-stdio-transport.js";
|
|
6
|
-
import {
|
|
6
|
+
import { ensureCodebaseMemoryBinary } from "./binary.js";
|
|
7
7
|
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
8
8
|
import { mkdirSync } from "node:fs";
|
|
9
9
|
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
@@ -132,7 +132,7 @@ var CodeIntelligenceRuntime = class {
|
|
|
132
132
|
this.connectionPromise = (async () => {
|
|
133
133
|
this.state = "connecting";
|
|
134
134
|
const config = this.getConfig().codeIntelligence;
|
|
135
|
-
const binary =
|
|
135
|
+
const binary = await ensureCodebaseMemoryBinary(config.binaryPath);
|
|
136
136
|
const cacheDir = join(resolveStateDir(), "code-intelligence", "cbm");
|
|
137
137
|
mkdirSync(cacheDir, { recursive: true });
|
|
138
138
|
const transport = new XopcStdioClientTransport({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","names":[],"sources":["../../../../src/agent/code-intelligence/runtime.ts"],"sourcesContent":["import { mkdirSync } from 'node:fs';\nimport { isAbsolute, join, relative, resolve, sep } from 'node:path';\n\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\nimport type { Config } from '../../config/schema.js';\nimport { resolveStateDir } from '../../config/paths.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { XopcStdioClientTransport } from '../mcp/mcp-stdio-transport.js';\nimport { resolveCodebaseMemoryBinary } from './binary.js';\nimport type {\n CodeIntelligenceRuntimeLike,\n CodeIntelligenceState,\n CodeIntelligenceStatus,\n CodeIntelligenceToolResult,\n} from './types.js';\n\nconst log = createLogger('CodeIntelligence');\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction deriveProjectName(workspace: string): string {\n return workspace\n .replace(/^[\\\\/]+/, '')\n .replace(/[\\\\/:]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\nfunction timeout<T>(promise: Promise<T>, timeoutMs: number, operation: string): Promise<T> {\n return new Promise<T>((resolvePromise, reject) => {\n const timer = setTimeout(\n () => reject(new Error(`${operation} timed out after ${timeoutMs}ms`)),\n timeoutMs,\n );\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolvePromise(value);\n },\n (error) => {\n clearTimeout(timer);\n reject(error);\n },\n );\n });\n}\n\nfunction resultText(result: CallToolResult): string {\n const parts: string[] = [];\n for (const item of result.content ?? []) {\n if (item.type === 'text' && typeof item.text === 'string') {\n parts.push(item.text);\n }\n }\n return parts.join('\\n').trim();\n}\n\nfunction parseJsonRecord(text: string): JsonRecord | undefined {\n try {\n const parsed = JSON.parse(text) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? parsed as JsonRecord\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction abortError(): Error {\n return new DOMException('Code intelligence operation aborted', 'AbortError');\n}\n\nexport class CodeIntelligenceRuntime implements CodeIntelligenceRuntimeLike {\n private readonly workspace: string;\n private readonly project: string;\n private readonly getConfig: () => Config;\n private state: CodeIntelligenceState = 'idle';\n private coverage: CodeIntelligenceStatus['coverage'] = 'unknown';\n private indexedAt: string | undefined;\n private errorMessage: string | undefined;\n private dirtyPaths = new Set<string>();\n private dirtyVersion = 0;\n private refreshTimer: ReturnType<typeof setTimeout> | undefined;\n private connectionPromise: Promise<void> | undefined;\n private indexPromise: Promise<void> | undefined;\n private client: Client | undefined;\n private transport: XopcStdioClientTransport | undefined;\n private availableTools = new Set<string>();\n private disposed = false;\n\n constructor(options: { workspace: string; getConfig: () => Config }) {\n this.workspace = resolve(options.workspace);\n this.project = deriveProjectName(this.workspace);\n this.getConfig = options.getConfig;\n }\n\n getStatus(): CodeIntelligenceStatus {\n return {\n state: this.state,\n workspace: this.workspace,\n project: this.project,\n indexedAt: this.indexedAt,\n dirtyPaths: [...this.dirtyPaths].toSorted(),\n coverage: this.coverage,\n errorMessage: this.errorMessage,\n };\n }\n\n supportsTool(name: string): boolean {\n return this.availableTools.has(name);\n }\n\n async prime(): Promise<void> {\n const config = this.getConfig().codeIntelligence;\n if (!config.enabled || !config.autoIndex || this.disposed) return;\n if (this.indexPromise) return this.indexPromise;\n if (this.indexedAt && this.dirtyPaths.size === 0) return;\n await this.refreshIndex();\n }\n\n markDirty(paths: readonly string[]): void {\n const config = this.getConfig().codeIntelligence;\n if (!config.enabled || !config.autoRefresh || this.disposed) return;\n\n let changed = false;\n for (const input of paths) {\n if (!input?.trim()) continue;\n const absolute = isAbsolute(input) ? resolve(input) : resolve(this.workspace, input);\n const rel = relative(this.workspace, absolute);\n if (!rel || rel === '..' || rel.startsWith(`..${sep}`) || isAbsolute(rel)) continue;\n this.dirtyPaths.add(rel.split(sep).join('/'));\n changed = true;\n }\n if (!changed) return;\n\n this.dirtyVersion += 1;\n if (this.state === 'ready' || this.state === 'degraded') {\n this.state = 'dirty';\n }\n if (this.refreshTimer) clearTimeout(this.refreshTimer);\n this.refreshTimer = setTimeout(() => {\n this.refreshTimer = undefined;\n void this.refreshIndex().catch(() => {});\n }, config.refreshDebounceMs);\n this.refreshTimer.unref?.();\n }\n\n async callTool(\n toolNames: string | readonly string[],\n input: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<CodeIntelligenceToolResult> {\n if (signal?.aborted) throw abortError();\n const config = this.getConfig().codeIntelligence;\n if (!config.enabled) {\n throw new Error('Code intelligence is disabled');\n }\n\n if (\n config.autoIndex &&\n (this.indexedAt === undefined || this.state === 'idle' || this.dirtyPaths.size > 0)\n ) {\n await this.refreshIndex();\n } else {\n await this.ensureConnected();\n }\n if (signal?.aborted) throw abortError();\n\n const names = typeof toolNames === 'string' ? [toolNames] : [...toolNames];\n const toolName = names.find((name) => this.availableTools.has(name));\n if (!toolName) {\n throw new Error(`CBM does not expose a supported tool: ${names.join(' or ')}`);\n }\n const result = await this.callRaw(toolName, input, config.queryTimeoutMs);\n const text = resultText(result);\n if (result.isError) {\n throw new Error(text || `CBM ${toolName} failed`);\n }\n return { text, status: this.getStatus() };\n }\n\n private async ensureConnected(): Promise<void> {\n if (this.disposed) throw new Error('Code intelligence runtime is disposed');\n if (this.client && this.transport) return;\n if (this.connectionPromise) return this.connectionPromise;\n\n this.connectionPromise = (async () => {\n this.state = 'connecting';\n const config = this.getConfig().codeIntelligence;\n const binary = resolveCodebaseMemoryBinary(config.binaryPath);\n const cacheDir = join(resolveStateDir(), 'code-intelligence', 'cbm');\n mkdirSync(cacheDir, { recursive: true });\n const transport = new XopcStdioClientTransport({\n command: binary,\n cwd: this.workspace,\n env: {\n CBM_ALLOWED_ROOT: this.workspace,\n CBM_CACHE_DIR: cacheDir,\n CBM_LOG_LEVEL: process.env.XOPC_LOG_LEVEL === 'debug' ? 'debug' : 'warn',\n },\n stderr: 'pipe',\n });\n const client = new Client({ name: 'xopc-code-intelligence', version: '1.0.0' });\n transport.stderr?.on('data', (chunk: Buffer | string) => {\n for (const line of String(chunk).split(/\\r?\\n/)) {\n if (line.trim()) log.debug({ workspace: this.workspace }, `CBM: ${line.trim()}`);\n }\n });\n\n try {\n await timeout(client.connect(transport), 30_000, 'CBM connection');\n const toolNames = new Set<string>();\n let cursor: string | undefined;\n do {\n const page = await timeout(\n client.listTools(cursor ? { cursor } : undefined),\n 20_000,\n 'CBM tool discovery',\n );\n for (const tool of page.tools) toolNames.add(tool.name);\n cursor = page.nextCursor;\n } while (cursor);\n this.client = client;\n this.transport = transport;\n this.availableTools = toolNames;\n this.state = this.dirtyPaths.size > 0 ? 'dirty' : 'idle';\n this.errorMessage = undefined;\n log.info(\n { workspace: this.workspace, project: this.project, toolCount: this.availableTools.size },\n 'Code intelligence runtime connected',\n );\n } catch (error) {\n await transport.close().catch(() => {});\n await client.close().catch(() => {});\n throw error;\n }\n })();\n\n try {\n await this.connectionPromise;\n } catch (error) {\n this.state = 'unavailable';\n this.errorMessage = error instanceof Error ? error.message : String(error);\n log.warn(\n { err: error, workspace: this.workspace, project: this.project },\n `Code intelligence unavailable: ${this.errorMessage}`,\n );\n throw error;\n } finally {\n this.connectionPromise = undefined;\n }\n }\n\n private async refreshIndex(): Promise<void> {\n if (this.disposed) throw new Error('Code intelligence runtime is disposed');\n if (this.indexPromise) return this.indexPromise;\n\n const versionAtStart = this.dirtyVersion;\n this.indexPromise = (async () => {\n await this.ensureConnected();\n const config = this.getConfig().codeIntelligence;\n this.state = 'indexing';\n const result = await this.callRaw(\n 'index_repository',\n {\n repo_path: this.workspace,\n name: this.project,\n mode: config.indexMode,\n persistence: false,\n },\n config.indexTimeoutMs,\n );\n const text = resultText(result);\n const parsed = parseJsonRecord(text);\n const resultStatus = typeof parsed?.status === 'string' ? parsed.status : 'indexed';\n if (result.isError || resultStatus === 'error') {\n throw new Error(text || 'CBM indexing failed');\n }\n\n this.indexedAt = new Date().toISOString();\n this.coverage = resultStatus === 'degraded' ? 'partial' : 'unknown';\n this.errorMessage = undefined;\n if (versionAtStart === this.dirtyVersion) {\n this.dirtyPaths.clear();\n this.state = resultStatus === 'degraded' ? 'degraded' : 'ready';\n } else {\n this.state = 'dirty';\n }\n log.info(\n {\n workspace: this.workspace,\n project: this.project,\n indexMode: config.indexMode,\n status: resultStatus,\n dirtyPaths: this.dirtyPaths.size,\n },\n 'Code intelligence index refreshed',\n );\n })();\n\n try {\n await this.indexPromise;\n } catch (error) {\n this.state = 'degraded';\n this.coverage = 'unknown';\n this.errorMessage = error instanceof Error ? error.message : String(error);\n log.warn(\n { err: error, workspace: this.workspace, project: this.project },\n `Code intelligence indexing failed: ${this.errorMessage}`,\n );\n throw error;\n } finally {\n this.indexPromise = undefined;\n if (!this.disposed && this.dirtyPaths.size > 0 && versionAtStart !== this.dirtyVersion) {\n queueMicrotask(() => void this.refreshIndex().catch(() => {}));\n }\n }\n }\n\n private async callRaw(\n toolName: string,\n input: Record<string, unknown>,\n timeoutMs: number,\n ): Promise<CallToolResult> {\n await this.ensureConnected();\n if (!this.client) throw new Error('CBM client is not connected');\n if (!this.availableTools.has(toolName)) {\n throw new Error(`CBM tool is unavailable: ${toolName}`);\n }\n try {\n return await timeout(\n this.client.callTool({ name: toolName, arguments: input }) as Promise<CallToolResult>,\n timeoutMs,\n `CBM ${toolName}`,\n );\n } catch (error) {\n this.state = 'unavailable';\n this.errorMessage = error instanceof Error ? error.message : String(error);\n await this.resetConnection();\n throw error;\n }\n }\n\n private async resetConnection(): Promise<void> {\n const transport = this.transport;\n const client = this.client;\n this.transport = undefined;\n this.client = undefined;\n this.availableTools.clear();\n await client?.close().catch(() => {});\n await transport?.close().catch(() => {});\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n this.state = 'disposed';\n if (this.refreshTimer) clearTimeout(this.refreshTimer);\n this.refreshTimer = undefined;\n await this.resetConnection();\n }\n}\n"],"mappings":";;;;;;;;;;YAOwD;aACH;AAUrD,MAAM,MAAM,aAAa,mBAAmB;AAI5C,SAAS,kBAAkB,WAA2B;AACpD,QAAO,UACJ,QAAQ,WAAW,GAAG,CACtB,QAAQ,YAAY,IAAI,CACxB,QAAQ,OAAO,IAAI,CACnB,QAAQ,UAAU,GAAG;;AAG1B,SAAS,QAAW,SAAqB,WAAmB,WAA+B;AACzF,QAAO,IAAI,SAAY,gBAAgB,WAAW;EAChD,MAAM,QAAQ,iBACN,uBAAO,IAAI,MAAM,GAAG,UAAU,mBAAmB,UAAU,IAAI,CAAC,EACtE,UACD;AACD,UAAQ,MACL,UAAU;AACT,gBAAa,MAAM;AACnB,kBAAe,MAAM;MAEtB,UAAU;AACT,gBAAa,MAAM;AACnB,UAAO,MAAM;IAEhB;GACD;;AAGJ,SAAS,WAAW,QAAgC;CAClD,MAAM,QAAkB,EAAE;AAC1B,MAAK,MAAM,QAAQ,OAAO,WAAW,EAAE,CACrC,KAAI,KAAK,SAAS,UAAU,OAAO,KAAK,SAAS,SAC/C,OAAM,KAAK,KAAK,KAAK;AAGzB,QAAO,MAAM,KAAK,KAAK,CAAC,MAAM;;AAGhC,SAAS,gBAAgB,MAAsC;AAC7D,KAAI;EACF,MAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,SAAO,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,OAAO,GACjE,SACA,KAAA;SACE;AACN;;;AAIJ,SAAS,aAAoB;AAC3B,QAAO,IAAI,aAAa,uCAAuC,aAAa;;AAG9E,IAAa,0BAAb,MAA4E;CAC1E;CACA;CACA;CACA,QAAuC;CACvC,WAAuD;CACvD;CACA;CACA,6BAAqB,IAAI,KAAa;CACtC,eAAuB;CACvB;CACA;CACA;CACA;CACA;CACA,iCAAyB,IAAI,KAAa;CAC1C,WAAmB;CAEnB,YAAY,SAAyD;AACnE,OAAK,YAAY,QAAQ,QAAQ,UAAU;AAC3C,OAAK,UAAU,kBAAkB,KAAK,UAAU;AAChD,OAAK,YAAY,QAAQ;;CAG3B,YAAoC;AAClC,SAAO;GACL,OAAO,KAAK;GACZ,WAAW,KAAK;GAChB,SAAS,KAAK;GACd,WAAW,KAAK;GAChB,YAAY,CAAC,GAAG,KAAK,WAAW,CAAC,UAAU;GAC3C,UAAU,KAAK;GACf,cAAc,KAAK;GACpB;;CAGH,aAAa,MAAuB;AAClC,SAAO,KAAK,eAAe,IAAI,KAAK;;CAGtC,MAAM,QAAuB;EAC3B,MAAM,SAAS,KAAK,WAAW,CAAC;AAChC,MAAI,CAAC,OAAO,WAAW,CAAC,OAAO,aAAa,KAAK,SAAU;AAC3D,MAAI,KAAK,aAAc,QAAO,KAAK;AACnC,MAAI,KAAK,aAAa,KAAK,WAAW,SAAS,EAAG;AAClD,QAAM,KAAK,cAAc;;CAG3B,UAAU,OAAgC;EACxC,MAAM,SAAS,KAAK,WAAW,CAAC;AAChC,MAAI,CAAC,OAAO,WAAW,CAAC,OAAO,eAAe,KAAK,SAAU;EAE7D,IAAI,UAAU;AACd,OAAK,MAAM,SAAS,OAAO;AACzB,OAAI,CAAC,OAAO,MAAM,CAAE;GACpB,MAAM,WAAW,WAAW,MAAM,GAAG,QAAQ,MAAM,GAAG,QAAQ,KAAK,WAAW,MAAM;GACpF,MAAM,MAAM,SAAS,KAAK,WAAW,SAAS;AAC9C,OAAI,CAAC,OAAO,QAAQ,QAAQ,IAAI,WAAW,KAAK,MAAM,IAAI,WAAW,IAAI,CAAE;AAC3E,QAAK,WAAW,IAAI,IAAI,MAAM,IAAI,CAAC,KAAK,IAAI,CAAC;AAC7C,aAAU;;AAEZ,MAAI,CAAC,QAAS;AAEd,OAAK,gBAAgB;AACrB,MAAI,KAAK,UAAU,WAAW,KAAK,UAAU,WAC3C,MAAK,QAAQ;AAEf,MAAI,KAAK,aAAc,cAAa,KAAK,aAAa;AACtD,OAAK,eAAe,iBAAiB;AACnC,QAAK,eAAe,KAAA;AACf,QAAK,cAAc,CAAC,YAAY,GAAG;KACvC,OAAO,kBAAkB;AAC5B,OAAK,aAAa,SAAS;;CAG7B,MAAM,SACJ,WACA,OACA,QACqC;AACrC,MAAI,QAAQ,QAAS,OAAM,YAAY;EACvC,MAAM,SAAS,KAAK,WAAW,CAAC;AAChC,MAAI,CAAC,OAAO,QACV,OAAM,IAAI,MAAM,gCAAgC;AAGlD,MACE,OAAO,cACN,KAAK,cAAc,KAAA,KAAa,KAAK,UAAU,UAAU,KAAK,WAAW,OAAO,GAEjF,OAAM,KAAK,cAAc;MAEzB,OAAM,KAAK,iBAAiB;AAE9B,MAAI,QAAQ,QAAS,OAAM,YAAY;EAEvC,MAAM,QAAQ,OAAO,cAAc,WAAW,CAAC,UAAU,GAAG,CAAC,GAAG,UAAU;EAC1E,MAAM,WAAW,MAAM,MAAM,SAAS,KAAK,eAAe,IAAI,KAAK,CAAC;AACpE,MAAI,CAAC,SACH,OAAM,IAAI,MAAM,yCAAyC,MAAM,KAAK,OAAO,GAAG;EAEhF,MAAM,SAAS,MAAM,KAAK,QAAQ,UAAU,OAAO,OAAO,eAAe;EACzE,MAAM,OAAO,WAAW,OAAO;AAC/B,MAAI,OAAO,QACT,OAAM,IAAI,MAAM,QAAQ,OAAO,SAAS,SAAS;AAEnD,SAAO;GAAE;GAAM,QAAQ,KAAK,WAAW;GAAE;;CAG3C,MAAc,kBAAiC;AAC7C,MAAI,KAAK,SAAU,OAAM,IAAI,MAAM,wCAAwC;AAC3E,MAAI,KAAK,UAAU,KAAK,UAAW;AACnC,MAAI,KAAK,kBAAmB,QAAO,KAAK;AAExC,OAAK,qBAAqB,YAAY;AACpC,QAAK,QAAQ;GACb,MAAM,SAAS,KAAK,WAAW,CAAC;GAChC,MAAM,SAAS,4BAA4B,OAAO,WAAW;GAC7D,MAAM,WAAW,KAAK,iBAAiB,EAAE,qBAAqB,MAAM;AACpE,aAAU,UAAU,EAAE,WAAW,MAAM,CAAC;GACxC,MAAM,YAAY,IAAI,yBAAyB;IAC7C,SAAS;IACT,KAAK,KAAK;IACV,KAAK;KACH,kBAAkB,KAAK;KACvB,eAAe;KACf,eAAe,QAAQ,IAAI,mBAAmB,UAAU,UAAU;KACnE;IACD,QAAQ;IACT,CAAC;GACF,MAAM,SAAS,IAAI,OAAO;IAAE,MAAM;IAA0B,SAAS;IAAS,CAAC;AAC/E,aAAU,QAAQ,GAAG,SAAS,UAA2B;AACvD,SAAK,MAAM,QAAQ,OAAO,MAAM,CAAC,MAAM,QAAQ,CAC7C,KAAI,KAAK,MAAM,CAAE,KAAI,MAAM,EAAE,WAAW,KAAK,WAAW,EAAE,QAAQ,KAAK,MAAM,GAAG;KAElF;AAEF,OAAI;AACF,UAAM,QAAQ,OAAO,QAAQ,UAAU,EAAE,KAAQ,iBAAiB;IAClE,MAAM,4BAAY,IAAI,KAAa;IACnC,IAAI;AACJ,OAAG;KACD,MAAM,OAAO,MAAM,QACjB,OAAO,UAAU,SAAS,EAAE,QAAQ,GAAG,KAAA,EAAU,EACjD,KACA,qBACD;AACD,UAAK,MAAM,QAAQ,KAAK,MAAO,WAAU,IAAI,KAAK,KAAK;AACvD,cAAS,KAAK;aACP;AACT,SAAK,SAAS;AACd,SAAK,YAAY;AACjB,SAAK,iBAAiB;AACtB,SAAK,QAAQ,KAAK,WAAW,OAAO,IAAI,UAAU;AAClD,SAAK,eAAe,KAAA;AACpB,QAAI,KACF;KAAE,WAAW,KAAK;KAAW,SAAS,KAAK;KAAS,WAAW,KAAK,eAAe;KAAM,EACzF,sCACD;YACM,OAAO;AACd,UAAM,UAAU,OAAO,CAAC,YAAY,GAAG;AACvC,UAAM,OAAO,OAAO,CAAC,YAAY,GAAG;AACpC,UAAM;;MAEN;AAEJ,MAAI;AACF,SAAM,KAAK;WACJ,OAAO;AACd,QAAK,QAAQ;AACb,QAAK,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC1E,OAAI,KACF;IAAE,KAAK;IAAO,WAAW,KAAK;IAAW,SAAS,KAAK;IAAS,EAChE,kCAAkC,KAAK,eACxC;AACD,SAAM;YACE;AACR,QAAK,oBAAoB,KAAA;;;CAI7B,MAAc,eAA8B;AAC1C,MAAI,KAAK,SAAU,OAAM,IAAI,MAAM,wCAAwC;AAC3E,MAAI,KAAK,aAAc,QAAO,KAAK;EAEnC,MAAM,iBAAiB,KAAK;AAC5B,OAAK,gBAAgB,YAAY;AAC/B,SAAM,KAAK,iBAAiB;GAC5B,MAAM,SAAS,KAAK,WAAW,CAAC;AAChC,QAAK,QAAQ;GACb,MAAM,SAAS,MAAM,KAAK,QACxB,oBACA;IACE,WAAW,KAAK;IAChB,MAAM,KAAK;IACX,MAAM,OAAO;IACb,aAAa;IACd,EACD,OAAO,eACR;GACD,MAAM,OAAO,WAAW,OAAO;GAC/B,MAAM,SAAS,gBAAgB,KAAK;GACpC,MAAM,eAAe,OAAO,QAAQ,WAAW,WAAW,OAAO,SAAS;AAC1E,OAAI,OAAO,WAAW,iBAAiB,QACrC,OAAM,IAAI,MAAM,QAAQ,sBAAsB;AAGhD,QAAK,6BAAY,IAAI,MAAM,EAAC,aAAa;AACzC,QAAK,WAAW,iBAAiB,aAAa,YAAY;AAC1D,QAAK,eAAe,KAAA;AACpB,OAAI,mBAAmB,KAAK,cAAc;AACxC,SAAK,WAAW,OAAO;AACvB,SAAK,QAAQ,iBAAiB,aAAa,aAAa;SAExD,MAAK,QAAQ;AAEf,OAAI,KACF;IACE,WAAW,KAAK;IAChB,SAAS,KAAK;IACd,WAAW,OAAO;IAClB,QAAQ;IACR,YAAY,KAAK,WAAW;IAC7B,EACD,oCACD;MACC;AAEJ,MAAI;AACF,SAAM,KAAK;WACJ,OAAO;AACd,QAAK,QAAQ;AACb,QAAK,WAAW;AAChB,QAAK,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC1E,OAAI,KACF;IAAE,KAAK;IAAO,WAAW,KAAK;IAAW,SAAS,KAAK;IAAS,EAChE,sCAAsC,KAAK,eAC5C;AACD,SAAM;YACE;AACR,QAAK,eAAe,KAAA;AACpB,OAAI,CAAC,KAAK,YAAY,KAAK,WAAW,OAAO,KAAK,mBAAmB,KAAK,aACxE,sBAAqB,KAAK,KAAK,cAAc,CAAC,YAAY,GAAG,CAAC;;;CAKpE,MAAc,QACZ,UACA,OACA,WACyB;AACzB,QAAM,KAAK,iBAAiB;AAC5B,MAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,8BAA8B;AAChE,MAAI,CAAC,KAAK,eAAe,IAAI,SAAS,CACpC,OAAM,IAAI,MAAM,4BAA4B,WAAW;AAEzD,MAAI;AACF,UAAO,MAAM,QACX,KAAK,OAAO,SAAS;IAAE,MAAM;IAAU,WAAW;IAAO,CAAC,EAC1D,WACA,OAAO,WACR;WACM,OAAO;AACd,QAAK,QAAQ;AACb,QAAK,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC1E,SAAM,KAAK,iBAAiB;AAC5B,SAAM;;;CAIV,MAAc,kBAAiC;EAC7C,MAAM,YAAY,KAAK;EACvB,MAAM,SAAS,KAAK;AACpB,OAAK,YAAY,KAAA;AACjB,OAAK,SAAS,KAAA;AACd,OAAK,eAAe,OAAO;AAC3B,QAAM,QAAQ,OAAO,CAAC,YAAY,GAAG;AACrC,QAAM,WAAW,OAAO,CAAC,YAAY,GAAG;;CAG1C,MAAM,UAAyB;AAC7B,MAAI,KAAK,SAAU;AACnB,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,MAAI,KAAK,aAAc,cAAa,KAAK,aAAa;AACtD,OAAK,eAAe,KAAA;AACpB,QAAM,KAAK,iBAAiB"}
|
|
1
|
+
{"version":3,"file":"runtime.js","names":[],"sources":["../../../../src/agent/code-intelligence/runtime.ts"],"sourcesContent":["import { mkdirSync } from 'node:fs';\nimport { isAbsolute, join, relative, resolve, sep } from 'node:path';\n\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\nimport type { Config } from '../../config/schema.js';\nimport { resolveStateDir } from '../../config/paths.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { XopcStdioClientTransport } from '../mcp/mcp-stdio-transport.js';\nimport { ensureCodebaseMemoryBinary } from './binary.js';\nimport type {\n CodeIntelligenceRuntimeLike,\n CodeIntelligenceState,\n CodeIntelligenceStatus,\n CodeIntelligenceToolResult,\n} from './types.js';\n\nconst log = createLogger('CodeIntelligence');\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction deriveProjectName(workspace: string): string {\n return workspace\n .replace(/^[\\\\/]+/, '')\n .replace(/[\\\\/:]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\nfunction timeout<T>(promise: Promise<T>, timeoutMs: number, operation: string): Promise<T> {\n return new Promise<T>((resolvePromise, reject) => {\n const timer = setTimeout(\n () => reject(new Error(`${operation} timed out after ${timeoutMs}ms`)),\n timeoutMs,\n );\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolvePromise(value);\n },\n (error) => {\n clearTimeout(timer);\n reject(error);\n },\n );\n });\n}\n\nfunction resultText(result: CallToolResult): string {\n const parts: string[] = [];\n for (const item of result.content ?? []) {\n if (item.type === 'text' && typeof item.text === 'string') {\n parts.push(item.text);\n }\n }\n return parts.join('\\n').trim();\n}\n\nfunction parseJsonRecord(text: string): JsonRecord | undefined {\n try {\n const parsed = JSON.parse(text) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? parsed as JsonRecord\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction abortError(): Error {\n return new DOMException('Code intelligence operation aborted', 'AbortError');\n}\n\nexport class CodeIntelligenceRuntime implements CodeIntelligenceRuntimeLike {\n private readonly workspace: string;\n private readonly project: string;\n private readonly getConfig: () => Config;\n private state: CodeIntelligenceState = 'idle';\n private coverage: CodeIntelligenceStatus['coverage'] = 'unknown';\n private indexedAt: string | undefined;\n private errorMessage: string | undefined;\n private dirtyPaths = new Set<string>();\n private dirtyVersion = 0;\n private refreshTimer: ReturnType<typeof setTimeout> | undefined;\n private connectionPromise: Promise<void> | undefined;\n private indexPromise: Promise<void> | undefined;\n private client: Client | undefined;\n private transport: XopcStdioClientTransport | undefined;\n private availableTools = new Set<string>();\n private disposed = false;\n\n constructor(options: { workspace: string; getConfig: () => Config }) {\n this.workspace = resolve(options.workspace);\n this.project = deriveProjectName(this.workspace);\n this.getConfig = options.getConfig;\n }\n\n getStatus(): CodeIntelligenceStatus {\n return {\n state: this.state,\n workspace: this.workspace,\n project: this.project,\n indexedAt: this.indexedAt,\n dirtyPaths: [...this.dirtyPaths].toSorted(),\n coverage: this.coverage,\n errorMessage: this.errorMessage,\n };\n }\n\n supportsTool(name: string): boolean {\n return this.availableTools.has(name);\n }\n\n async prime(): Promise<void> {\n const config = this.getConfig().codeIntelligence;\n if (!config.enabled || !config.autoIndex || this.disposed) return;\n if (this.indexPromise) return this.indexPromise;\n if (this.indexedAt && this.dirtyPaths.size === 0) return;\n await this.refreshIndex();\n }\n\n markDirty(paths: readonly string[]): void {\n const config = this.getConfig().codeIntelligence;\n if (!config.enabled || !config.autoRefresh || this.disposed) return;\n\n let changed = false;\n for (const input of paths) {\n if (!input?.trim()) continue;\n const absolute = isAbsolute(input) ? resolve(input) : resolve(this.workspace, input);\n const rel = relative(this.workspace, absolute);\n if (!rel || rel === '..' || rel.startsWith(`..${sep}`) || isAbsolute(rel)) continue;\n this.dirtyPaths.add(rel.split(sep).join('/'));\n changed = true;\n }\n if (!changed) return;\n\n this.dirtyVersion += 1;\n if (this.state === 'ready' || this.state === 'degraded') {\n this.state = 'dirty';\n }\n if (this.refreshTimer) clearTimeout(this.refreshTimer);\n this.refreshTimer = setTimeout(() => {\n this.refreshTimer = undefined;\n void this.refreshIndex().catch(() => {});\n }, config.refreshDebounceMs);\n this.refreshTimer.unref?.();\n }\n\n async callTool(\n toolNames: string | readonly string[],\n input: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<CodeIntelligenceToolResult> {\n if (signal?.aborted) throw abortError();\n const config = this.getConfig().codeIntelligence;\n if (!config.enabled) {\n throw new Error('Code intelligence is disabled');\n }\n\n if (\n config.autoIndex &&\n (this.indexedAt === undefined || this.state === 'idle' || this.dirtyPaths.size > 0)\n ) {\n await this.refreshIndex();\n } else {\n await this.ensureConnected();\n }\n if (signal?.aborted) throw abortError();\n\n const names = typeof toolNames === 'string' ? [toolNames] : [...toolNames];\n const toolName = names.find((name) => this.availableTools.has(name));\n if (!toolName) {\n throw new Error(`CBM does not expose a supported tool: ${names.join(' or ')}`);\n }\n const result = await this.callRaw(toolName, input, config.queryTimeoutMs);\n const text = resultText(result);\n if (result.isError) {\n throw new Error(text || `CBM ${toolName} failed`);\n }\n return { text, status: this.getStatus() };\n }\n\n private async ensureConnected(): Promise<void> {\n if (this.disposed) throw new Error('Code intelligence runtime is disposed');\n if (this.client && this.transport) return;\n if (this.connectionPromise) return this.connectionPromise;\n\n this.connectionPromise = (async () => {\n this.state = 'connecting';\n const config = this.getConfig().codeIntelligence;\n const binary = await ensureCodebaseMemoryBinary(config.binaryPath);\n const cacheDir = join(resolveStateDir(), 'code-intelligence', 'cbm');\n mkdirSync(cacheDir, { recursive: true });\n const transport = new XopcStdioClientTransport({\n command: binary,\n cwd: this.workspace,\n env: {\n CBM_ALLOWED_ROOT: this.workspace,\n CBM_CACHE_DIR: cacheDir,\n CBM_LOG_LEVEL: process.env.XOPC_LOG_LEVEL === 'debug' ? 'debug' : 'warn',\n },\n stderr: 'pipe',\n });\n const client = new Client({ name: 'xopc-code-intelligence', version: '1.0.0' });\n transport.stderr?.on('data', (chunk: Buffer | string) => {\n for (const line of String(chunk).split(/\\r?\\n/)) {\n if (line.trim()) log.debug({ workspace: this.workspace }, `CBM: ${line.trim()}`);\n }\n });\n\n try {\n await timeout(client.connect(transport), 30_000, 'CBM connection');\n const toolNames = new Set<string>();\n let cursor: string | undefined;\n do {\n const page = await timeout(\n client.listTools(cursor ? { cursor } : undefined),\n 20_000,\n 'CBM tool discovery',\n );\n for (const tool of page.tools) toolNames.add(tool.name);\n cursor = page.nextCursor;\n } while (cursor);\n this.client = client;\n this.transport = transport;\n this.availableTools = toolNames;\n this.state = this.dirtyPaths.size > 0 ? 'dirty' : 'idle';\n this.errorMessage = undefined;\n log.info(\n { workspace: this.workspace, project: this.project, toolCount: this.availableTools.size },\n 'Code intelligence runtime connected',\n );\n } catch (error) {\n await transport.close().catch(() => {});\n await client.close().catch(() => {});\n throw error;\n }\n })();\n\n try {\n await this.connectionPromise;\n } catch (error) {\n this.state = 'unavailable';\n this.errorMessage = error instanceof Error ? error.message : String(error);\n log.warn(\n { err: error, workspace: this.workspace, project: this.project },\n `Code intelligence unavailable: ${this.errorMessage}`,\n );\n throw error;\n } finally {\n this.connectionPromise = undefined;\n }\n }\n\n private async refreshIndex(): Promise<void> {\n if (this.disposed) throw new Error('Code intelligence runtime is disposed');\n if (this.indexPromise) return this.indexPromise;\n\n const versionAtStart = this.dirtyVersion;\n this.indexPromise = (async () => {\n await this.ensureConnected();\n const config = this.getConfig().codeIntelligence;\n this.state = 'indexing';\n const result = await this.callRaw(\n 'index_repository',\n {\n repo_path: this.workspace,\n name: this.project,\n mode: config.indexMode,\n persistence: false,\n },\n config.indexTimeoutMs,\n );\n const text = resultText(result);\n const parsed = parseJsonRecord(text);\n const resultStatus = typeof parsed?.status === 'string' ? parsed.status : 'indexed';\n if (result.isError || resultStatus === 'error') {\n throw new Error(text || 'CBM indexing failed');\n }\n\n this.indexedAt = new Date().toISOString();\n this.coverage = resultStatus === 'degraded' ? 'partial' : 'unknown';\n this.errorMessage = undefined;\n if (versionAtStart === this.dirtyVersion) {\n this.dirtyPaths.clear();\n this.state = resultStatus === 'degraded' ? 'degraded' : 'ready';\n } else {\n this.state = 'dirty';\n }\n log.info(\n {\n workspace: this.workspace,\n project: this.project,\n indexMode: config.indexMode,\n status: resultStatus,\n dirtyPaths: this.dirtyPaths.size,\n },\n 'Code intelligence index refreshed',\n );\n })();\n\n try {\n await this.indexPromise;\n } catch (error) {\n this.state = 'degraded';\n this.coverage = 'unknown';\n this.errorMessage = error instanceof Error ? error.message : String(error);\n log.warn(\n { err: error, workspace: this.workspace, project: this.project },\n `Code intelligence indexing failed: ${this.errorMessage}`,\n );\n throw error;\n } finally {\n this.indexPromise = undefined;\n if (!this.disposed && this.dirtyPaths.size > 0 && versionAtStart !== this.dirtyVersion) {\n queueMicrotask(() => void this.refreshIndex().catch(() => {}));\n }\n }\n }\n\n private async callRaw(\n toolName: string,\n input: Record<string, unknown>,\n timeoutMs: number,\n ): Promise<CallToolResult> {\n await this.ensureConnected();\n if (!this.client) throw new Error('CBM client is not connected');\n if (!this.availableTools.has(toolName)) {\n throw new Error(`CBM tool is unavailable: ${toolName}`);\n }\n try {\n return await timeout(\n this.client.callTool({ name: toolName, arguments: input }) as Promise<CallToolResult>,\n timeoutMs,\n `CBM ${toolName}`,\n );\n } catch (error) {\n this.state = 'unavailable';\n this.errorMessage = error instanceof Error ? error.message : String(error);\n await this.resetConnection();\n throw error;\n }\n }\n\n private async resetConnection(): Promise<void> {\n const transport = this.transport;\n const client = this.client;\n this.transport = undefined;\n this.client = undefined;\n this.availableTools.clear();\n await client?.close().catch(() => {});\n await transport?.close().catch(() => {});\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n this.state = 'disposed';\n if (this.refreshTimer) clearTimeout(this.refreshTimer);\n this.refreshTimer = undefined;\n await this.resetConnection();\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { init_agent_scope, normalizeAgentId, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
|
|
2
1
|
import { resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
|
|
3
2
|
import "../agent-manifest/index.js";
|
|
3
|
+
import { init_agent_scope, normalizeAgentId, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
|
|
4
4
|
import { init_session_key, parseSessionKey } from "../routing/session-key.js";
|
|
5
5
|
import { agentExists, getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
6
6
|
//#region src/config/agent-profile.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, resolveUserPath, validateAgentIdForNewAgent } from "../agent/agent-scope.js";
|
|
2
1
|
import { resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
|
|
2
|
+
import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, resolveUserPath, validateAgentIdForNewAgent } from "../agent/agent-scope.js";
|
|
3
3
|
import { resolveEffectiveAgentProfile } from "../config/agent-profile.js";
|
|
4
4
|
import { WORKSPACE_FILES, init_paths, resolveUserProfilePath } from "../config/paths.js";
|
|
5
5
|
import { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES, REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET } from "../agent/context/workspace.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xopcai/xopc",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.139",
|
|
4
4
|
"description": "Local-first AI system that remembers context, coordinates AI, and sustains long-term progress.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -84,7 +84,6 @@
|
|
|
84
84
|
"chalk": "^5.6.2",
|
|
85
85
|
"chokidar": "^5.0.0",
|
|
86
86
|
"cli-table3": "^0.6.5",
|
|
87
|
-
"codebase-memory-mcp": "0.9.0",
|
|
88
87
|
"commander": "^14.0.3",
|
|
89
88
|
"cron-parser": "^5.5.0",
|
|
90
89
|
"dotenv": "^17.4.2",
|
|
@@ -122,6 +121,7 @@
|
|
|
122
121
|
"@types/ws": "^8.18.1",
|
|
123
122
|
"@vitejs/plugin-react-swc": "^4.3.1",
|
|
124
123
|
"cross-env": "^10.1.0",
|
|
124
|
+
"codebase-memory-mcp": "0.9.0",
|
|
125
125
|
"dependency-cruiser": "^17.4.3",
|
|
126
126
|
"electron": "^42.4.1",
|
|
127
127
|
"electron-builder": "^26.12.1",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{hr as e}from"./index-NwiCnzI-.js";function t(t){let{children:n,fallback:r}=t,i=r===void 0?null:r;return e()?n:i}export{t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-aKtaBQYM.js";import{o as t,t as n}from"./fetch-BID89uCH.js";import{pr as r}from"./index-NwiCnzI-.js";var i=e({reloadSkills:()=>a});async function a(){let e=await n(t(`/api/skills/reload`),{method:`POST`});if(!e.ok)throw Error(await r(e))}export{i as n,a as t};
|