@ken-jo/agent-connector 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +6 -0
- package/README.md +348 -0
- package/dist/amp-QSFH2V7Y.js +217 -0
- package/dist/amp-QSFH2V7Y.js.map +1 -0
- package/dist/amp-TULUPXXL.js +237 -0
- package/dist/amp-TULUPXXL.js.map +1 -0
- package/dist/antigravity-CX2YLSY7.js +17 -0
- package/dist/antigravity-CX2YLSY7.js.map +1 -0
- package/dist/antigravity-STHZWMP3.js +171 -0
- package/dist/antigravity-STHZWMP3.js.map +1 -0
- package/dist/antigravity-cli-P6HADOAO.js +121 -0
- package/dist/antigravity-cli-P6HADOAO.js.map +1 -0
- package/dist/antigravity-cli-YQDFVV4U.js +86 -0
- package/dist/antigravity-cli-YQDFVV4U.js.map +1 -0
- package/dist/chunk-54EMKTTX.js +191 -0
- package/dist/chunk-54EMKTTX.js.map +1 -0
- package/dist/chunk-7L6ITC4T.js +54 -0
- package/dist/chunk-7L6ITC4T.js.map +1 -0
- package/dist/chunk-7MSDGHJW.js +316 -0
- package/dist/chunk-7MSDGHJW.js.map +1 -0
- package/dist/chunk-BCHWFTV4.js +196 -0
- package/dist/chunk-BCHWFTV4.js.map +1 -0
- package/dist/chunk-DBQMX75U.js +36 -0
- package/dist/chunk-DBQMX75U.js.map +1 -0
- package/dist/chunk-EXLS7BSI.js +29 -0
- package/dist/chunk-EXLS7BSI.js.map +1 -0
- package/dist/chunk-JNM3TPLX.js +593 -0
- package/dist/chunk-JNM3TPLX.js.map +1 -0
- package/dist/chunk-JWNT5KW7.js +197 -0
- package/dist/chunk-JWNT5KW7.js.map +1 -0
- package/dist/chunk-KHO5WNTP.js +30 -0
- package/dist/chunk-KHO5WNTP.js.map +1 -0
- package/dist/chunk-LTT56GI3.js +155 -0
- package/dist/chunk-LTT56GI3.js.map +1 -0
- package/dist/chunk-MEH7GC7R.js +111 -0
- package/dist/chunk-MEH7GC7R.js.map +1 -0
- package/dist/chunk-MQPNU2CY.js +64 -0
- package/dist/chunk-MQPNU2CY.js.map +1 -0
- package/dist/chunk-OPXAP3AC.js +12 -0
- package/dist/chunk-OPXAP3AC.js.map +1 -0
- package/dist/chunk-RK6VBLXP.js +50 -0
- package/dist/chunk-RK6VBLXP.js.map +1 -0
- package/dist/chunk-TIIP3RG2.js +420 -0
- package/dist/chunk-TIIP3RG2.js.map +1 -0
- package/dist/chunk-TRKWUNO4.js +702 -0
- package/dist/chunk-TRKWUNO4.js.map +1 -0
- package/dist/chunk-TRQKHP7D.js +93 -0
- package/dist/chunk-TRQKHP7D.js.map +1 -0
- package/dist/chunk-WCETQWWK.js +59 -0
- package/dist/chunk-WCETQWWK.js.map +1 -0
- package/dist/chunk-WV63X7IK.js +357 -0
- package/dist/chunk-WV63X7IK.js.map +1 -0
- package/dist/chunk-XD7MY6HB.js +343 -0
- package/dist/chunk-XD7MY6HB.js.map +1 -0
- package/dist/chunk-XNAM7F35.js +276 -0
- package/dist/chunk-XNAM7F35.js.map +1 -0
- package/dist/chunk-XUCWLJY5.js +238 -0
- package/dist/chunk-XUCWLJY5.js.map +1 -0
- package/dist/chunk-YNZU6PAV.js +800 -0
- package/dist/chunk-YNZU6PAV.js.map +1 -0
- package/dist/chunk-YT43MUSJ.js +146 -0
- package/dist/chunk-YT43MUSJ.js.map +1 -0
- package/dist/claude-code-HKDV7T32.js +637 -0
- package/dist/claude-code-HKDV7T32.js.map +1 -0
- package/dist/claude-code-W74MNTAC.js +652 -0
- package/dist/claude-code-W74MNTAC.js.map +1 -0
- package/dist/cli/sdk.d.ts +54 -0
- package/dist/cli/sdk.js +82 -0
- package/dist/cli/sdk.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +15 -0
- package/dist/cli.js.map +1 -0
- package/dist/codebuff-3PMZJJHP.js +307 -0
- package/dist/codebuff-3PMZJJHP.js.map +1 -0
- package/dist/codebuff-QX57FJDN.js +220 -0
- package/dist/codebuff-QX57FJDN.js.map +1 -0
- package/dist/codex-JFQTS6LU.js +593 -0
- package/dist/codex-JFQTS6LU.js.map +1 -0
- package/dist/codex-Q3ATRRX3.js +364 -0
- package/dist/codex-Q3ATRRX3.js.map +1 -0
- package/dist/copilot-cli-MTCGHZ2T.js +622 -0
- package/dist/copilot-cli-MTCGHZ2T.js.map +1 -0
- package/dist/copilot-cli-SJGIXVSD.js +369 -0
- package/dist/copilot-cli-SJGIXVSD.js.map +1 -0
- package/dist/crush-I7PK3FGI.js +360 -0
- package/dist/crush-I7PK3FGI.js.map +1 -0
- package/dist/crush-LN5QFFR2.js +183 -0
- package/dist/crush-LN5QFFR2.js.map +1 -0
- package/dist/cursor-4TMXKJOZ.js +603 -0
- package/dist/cursor-4TMXKJOZ.js.map +1 -0
- package/dist/cursor-QZ6MTO74.js +194 -0
- package/dist/cursor-QZ6MTO74.js.map +1 -0
- package/dist/detect-WIAGVYS4.js +68 -0
- package/dist/detect-WIAGVYS4.js.map +1 -0
- package/dist/doctor-EZW2K4NI.js +372 -0
- package/dist/doctor-EZW2K4NI.js.map +1 -0
- package/dist/droid-KN6VRMMT.js +424 -0
- package/dist/droid-KN6VRMMT.js.map +1 -0
- package/dist/droid-W5WF5XEX.js +224 -0
- package/dist/droid-W5WF5XEX.js.map +1 -0
- package/dist/gemini-cli-CIRW37TU.js +369 -0
- package/dist/gemini-cli-CIRW37TU.js.map +1 -0
- package/dist/gemini-cli-Y35FFK4M.js +705 -0
- package/dist/gemini-cli-Y35FFK4M.js.map +1 -0
- package/dist/goose-A3M5GODH.js +212 -0
- package/dist/goose-A3M5GODH.js.map +1 -0
- package/dist/goose-ZTGTSUFJ.js +480 -0
- package/dist/goose-ZTGTSUFJ.js.map +1 -0
- package/dist/hermes-H2KV44GK.js +470 -0
- package/dist/hermes-H2KV44GK.js.map +1 -0
- package/dist/hermes-ZYLMOFLZ.js +196 -0
- package/dist/hermes-ZYLMOFLZ.js.map +1 -0
- package/dist/hook-YVDILAMZ.js +75 -0
- package/dist/hook-YVDILAMZ.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/install-HQRYZOQ2.js +60 -0
- package/dist/install-HQRYZOQ2.js.map +1 -0
- package/dist/jetbrains-copilot-HWA3DMH7.js +633 -0
- package/dist/jetbrains-copilot-HWA3DMH7.js.map +1 -0
- package/dist/kilo-NSWAVP6P.js +235 -0
- package/dist/kilo-NSWAVP6P.js.map +1 -0
- package/dist/kilo-QXJRCSLT.js +384 -0
- package/dist/kilo-QXJRCSLT.js.map +1 -0
- package/dist/kilo-cli-EAQTHXUW.js +587 -0
- package/dist/kilo-cli-EAQTHXUW.js.map +1 -0
- package/dist/kilo-cli-EVBKUODA.js +160 -0
- package/dist/kilo-cli-EVBKUODA.js.map +1 -0
- package/dist/kimi-EI3UM3ZV.js +155 -0
- package/dist/kimi-EI3UM3ZV.js.map +1 -0
- package/dist/kimi-GQ7VXNYT.js +423 -0
- package/dist/kimi-GQ7VXNYT.js.map +1 -0
- package/dist/kiro-UCLSLBW2.js +217 -0
- package/dist/kiro-UCLSLBW2.js.map +1 -0
- package/dist/kiro-VQTT6LO2.js +451 -0
- package/dist/kiro-VQTT6LO2.js.map +1 -0
- package/dist/leaderboard-K6ON3SWW.js +137 -0
- package/dist/leaderboard-K6ON3SWW.js.map +1 -0
- package/dist/mux-T2TV4CIQ.js +211 -0
- package/dist/mux-T2TV4CIQ.js.map +1 -0
- package/dist/mux-ZMLVAXOO.js +96 -0
- package/dist/mux-ZMLVAXOO.js.map +1 -0
- package/dist/omp-PB4VDKS6.js +586 -0
- package/dist/omp-PB4VDKS6.js.map +1 -0
- package/dist/openclaw-ETN2M63O.js +751 -0
- package/dist/openclaw-ETN2M63O.js.map +1 -0
- package/dist/openclaw-IYA7ASL6.js +150 -0
- package/dist/openclaw-IYA7ASL6.js.map +1 -0
- package/dist/opencode-FZ33JKUZ.js +734 -0
- package/dist/opencode-FZ33JKUZ.js.map +1 -0
- package/dist/opencode-HWT3RSMN.js +216 -0
- package/dist/opencode-HWT3RSMN.js.map +1 -0
- package/dist/package-DLOVE2E4.js +1132 -0
- package/dist/package-DLOVE2E4.js.map +1 -0
- package/dist/pi-CIU2QHT4.js +208 -0
- package/dist/pi-CIU2QHT4.js.map +1 -0
- package/dist/pi-UFX2OYFV.js +139 -0
- package/dist/pi-UFX2OYFV.js.map +1 -0
- package/dist/qwen-code-5POCNU6P.js +573 -0
- package/dist/qwen-code-5POCNU6P.js.map +1 -0
- package/dist/qwen-code-W7NUCDEN.js +134 -0
- package/dist/qwen-code-W7NUCDEN.js.map +1 -0
- package/dist/roo-code-IOIUXRDE.js +242 -0
- package/dist/roo-code-IOIUXRDE.js.map +1 -0
- package/dist/roo-code-ZLKH4A7N.js +229 -0
- package/dist/roo-code-ZLKH4A7N.js.map +1 -0
- package/dist/runtime/index.d.ts +157 -0
- package/dist/runtime/index.js +20 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/serve-HVWWY4B6.js +65 -0
- package/dist/serve-HVWWY4B6.js.map +1 -0
- package/dist/status-FE7TECZD.js +128 -0
- package/dist/status-FE7TECZD.js.map +1 -0
- package/dist/synthetic-UKR6SMGS.js +178 -0
- package/dist/synthetic-UKR6SMGS.js.map +1 -0
- package/dist/telemetry-36GESKQQ.js +349 -0
- package/dist/telemetry-36GESKQQ.js.map +1 -0
- package/dist/trae-JSNDZFKL.js +204 -0
- package/dist/trae-JSNDZFKL.js.map +1 -0
- package/dist/trae-PA26DPBW.js +157 -0
- package/dist/trae-PA26DPBW.js.map +1 -0
- package/dist/types-CYUB1OTr.d.ts +427 -0
- package/dist/uninstall-IGCKNOSF.js +72 -0
- package/dist/uninstall-IGCKNOSF.js.map +1 -0
- package/dist/upgrade-JV2VK242.js +104 -0
- package/dist/upgrade-JV2VK242.js.map +1 -0
- package/dist/usage-6ER6EMEY.js +324 -0
- package/dist/usage-6ER6EMEY.js.map +1 -0
- package/dist/usage-event-JKBI6XCF.js +48 -0
- package/dist/usage-event-JKBI6XCF.js.map +1 -0
- package/dist/vscode-copilot-CK3NO54M.js +715 -0
- package/dist/vscode-copilot-CK3NO54M.js.map +1 -0
- package/dist/warp-JNQA7PBU.js +126 -0
- package/dist/warp-JNQA7PBU.js.map +1 -0
- package/dist/warp-QNVDXOG4.js +199 -0
- package/dist/warp-QNVDXOG4.js.map +1 -0
- package/dist/zed-NNNX5MNT.js +272 -0
- package/dist/zed-NNNX5MNT.js.map +1 -0
- package/dist/zed-VRJKWYUR.js +209 -0
- package/dist/zed-VRJKWYUR.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/usage/readers/codebuff.ts"],"sourcesContent":["/**\n * usage/readers/codebuff — Codebuff (formerly Manicode) native session reader.\n *\n * Faithful port of tokscale sessions/codebuff.rs. Codebuff persists chat history\n * under ~/.config/manicode/projects/<project>/chats/<chatId>/chat-messages.json,\n * with parallel \"dev\" and \"staging\" channels under manicode-dev / manicode-staging.\n * Each file is a JSON array of ChatMessage objects; only assistant messages\n * (variant/role ∈ {ai, agent, assistant}) carry token usage, which can live in\n * THREE places (tried in order, each merged as a fallback for missing fields):\n *\n * 1. metadata.usage\n * 2. metadata.codebuff.usage\n * 3. the stashed RunState message history —\n * metadata.runState.sessionState.mainAgentState.messageHistory[].providerOptions\n * (.usage / .codebuff.usage / .codebuff.model), where OpenRouter-routed calls\n * land their final token counts. We scan that history newest-first and merge\n * each assistant entry as a fallback.\n *\n * Token fields accept BOTH camelCase and snake_case (matching the @ccusage/codebuff\n * valibot schema): input ← inputTokens|input_tokens|promptTokens|prompt_tokens;\n * output ← outputTokens|output_tokens|completionTokens|completion_tokens;\n * cacheRead ← cacheReadInputTokens|cache_read_input_tokens|cachedTokensCreated|\n * cached_tokens_created, or promptTokensDetails.cachedTokens|prompt_tokens_details.cached_tokens;\n * cacheWrite ← cacheCreationInputTokens|cache_creation_input_tokens|\n * cacheCreationTokens|cache_creation_tokens. reasoning is always 0. A `credits`\n * field (on the usage object or the message) becomes cost. A message with no\n * token signal at all (and no credits) is skipped.\n *\n * Attribution comes from the path: sessionId = \"<channel>/<project>/<chatId>\"\n * (e.g. \"manicode/sandbox/2025-12-14T10-00-00.000Z\"); projectKey/projectLabel\n * derive from the <project> ancestor. Timestamp resolution: message.timestamp |\n * message.createdAt | metadata.timestamp, else the chatId parsed back to ms\n * (the filesystem-safe ISO form 2025-12-14T10-00-00.000Z has its two TIME\n * separators restored to ':' WITHOUT touching the date '-'), else file mtime.\n *\n * Dedup: the upstream ChatMessage.id when present (stable across re-imports), else\n * a deterministic composite codebuff:<session>:<ts>:<model>:<ordinal>:<i>:<o>:<cr>:<cw>.\n * Provider is inferred from the model (default \"codebuff-unknown\" → \"unknown\").\n * Confidence is \"host-reported\" (real host token counts).\n *\n * Fail-open: no root → []; unreadable/malformed file → skipped (never throws).\n * Read-only.\n */\n\nimport { basename, dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nimport type { TokenBreakdown, UsageReader, UsageRecord } from \"../types.js\";\nimport { emptyTokens } from \"../aggregate.js\";\nimport { fileMtimeMs, readJsonFile } from \"../jsonl.js\";\nimport { inferProvider, workspaceFromPath } from \"../normalize.js\";\nimport { expandHome, walkFiles } from \"../paths.js\";\n\nconst PLATFORM_ID = \"codebuff\" as const;\nconst DEFAULT_MODEL = \"codebuff-unknown\";\nconst DEFAULT_PROVIDER = \"unknown\";\n\n/** The three Codebuff release channels, each its own ~/.config/<channel> root. */\nconst CHANNELS = [\"manicode\", \"manicode-dev\", \"manicode-staging\"] as const;\n\n// ─────────────────────────────────────────────────────────────────────────\n// Root resolution\n//\n// codebuff is not in paths.ts hostRoots(), so we resolve its channel roots\n// here, mirroring the paths.ts convention exactly: an explicit non-empty\n// AGENT_CONNECTOR_CODEBUFF_DIR override wins (treated as the projects dir),\n// otherwise the OS config dir per channel. Read-only; never created.\n// ─────────────────────────────────────────────────────────────────────────\n\n/** $XDG_CONFIG_HOME (when set & non-empty) else ~/.config — matches paths.ts. */\nfunction xdgConfigHome(): string {\n const xdg = process.env.XDG_CONFIG_HOME;\n if (xdg !== undefined && xdg.trim() !== \"\") return resolve(expandHome(xdg.trim()));\n return join(homedir(), \".config\");\n}\n\n/**\n * Env override, treating empty/blank as unset (paths.ts envOverride contract):\n * relative paths resolve against CWD; \"~\" expands. Returns undefined when unset.\n */\nfunction envOverride(name: string): string | undefined {\n const raw = process.env[name];\n if (raw == null || raw.trim() === \"\") return undefined;\n const expanded = expandHome(raw.trim());\n return isAbsolute(expanded) ? expanded : resolve(expanded);\n}\n\n/**\n * Candidate `projects` roots, most-preferred first. The override (when present)\n * is the projects dir for the default channel; otherwise one root per channel\n * under the config home. Readers walk each existing root.\n */\nfunction codebuffProjectRoots(): string[] {\n const out: string[] = [];\n const override = envOverride(\"AGENT_CONNECTOR_CODEBUFF_DIR\");\n if (override !== undefined) out.push(override);\n const config = xdgConfigHome();\n for (const channel of CHANNELS) {\n out.push(join(config, channel, \"projects\"));\n }\n return out;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Raw value helpers (everything off a parsed JSON value is unknown)\n// ─────────────────────────────────────────────────────────────────────────\n\nfunction asRecord(v: unknown): Record<string, unknown> | undefined {\n return typeof v === \"object\" && v !== null && !Array.isArray(v)\n ? (v as Record<string, unknown>)\n : undefined;\n}\n\nfunction asString(v: unknown): string | undefined {\n return typeof v === \"string\" ? v : undefined;\n}\n\n/** Coerce to a finite number (i64/u64/f64 in Rust), or null. */\nfunction asNumber(v: unknown): number | null {\n if (typeof v === \"number\") return Number.isFinite(v) ? v : null;\n return null;\n}\n\n/**\n * pick_number: first key whose value coerces to a positive integer wins (>0,\n * truncated). Mirrors the Rust as_i64/as_u64/as_f64 chain with its `n > 0` gate.\n */\nfunction pickNumber(obj: Record<string, unknown>, keys: readonly string[]): number | null {\n for (const key of keys) {\n const num = asNumber(obj[key]);\n if (num !== null) {\n const n = Math.trunc(num);\n if (n > 0) return n;\n }\n }\n return null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Timestamp parsing (port of utils.rs parse_timestamp_str / parse_timestamp_value)\n// ─────────────────────────────────────────────────────────────────────────\n\n/** RFC3339 / numeric-string → epoch ms; null when unusable (port of parse_timestamp_str). */\nfunction parseTimestampStr(value: string): number | null {\n const ms = Date.parse(value);\n if (!Number.isNaN(ms)) return ms;\n // Pure-integer string fallback (Rust value.parse::<i64>()).\n if (/^-?\\d+$/.test(value)) {\n const numeric = Number(value);\n if (!Number.isFinite(numeric) || numeric <= 0) return null;\n return numeric >= 1_000_000_000_000 ? numeric : numeric * 1000;\n }\n return null;\n}\n\n/** JSON value (string or positive number) → epoch ms (port of parse_timestamp_value). */\nfunction parseTimestampValue(value: unknown): number | null {\n if (typeof value === \"string\") return parseTimestampStr(value);\n const numeric = asNumber(value);\n if (numeric === null) return null;\n const n = Math.trunc(numeric);\n if (n <= 0) return null;\n return n >= 1_000_000_000_000 ? n : n * 1000;\n}\n\n/**\n * Convert a filesystem-safe chatId back to epoch ms. Codebuff's chatId is the\n * chat's ISO-8601 timestamp with the two TIME separators (HH-MM-SS) flipped to\n * '-' for filesystem safety (e.g. 2025-12-14T10-00-00.000Z). Restore ONLY the\n * first two '-' AFTER the 'T' back to ':'; a naive global replace would corrupt\n * the date to 2025:12:14T... and break parsing. Trailing '-' (ms/timezone) stay.\n */\nfunction parseChatIdToMillis(chatId: string): number | null {\n const tIndex = chatId.indexOf(\"T\");\n if (tIndex < 0) return null;\n const date = chatId.slice(0, tIndex);\n const timeWithSeparator = chatId.slice(tIndex); // starts with 'T'\n const rebuilt = date + replaceFirst(timeWithSeparator, \"-\", \":\", 2);\n return parseTimestampStr(rebuilt);\n}\n\n/** Replace the first `count` occurrences of `from` with `to` (Rust replacen). */\nfunction replaceFirst(s: string, from: string, to: string, count: number): string {\n let result = s;\n let done = 0;\n let idx = result.indexOf(from);\n while (idx >= 0 && done < count) {\n result = result.slice(0, idx) + to + result.slice(idx + from.length);\n done++;\n idx = result.indexOf(from, idx + to.length);\n }\n return result;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Path → (channel, project, chatId) and session id\n// ─────────────────────────────────────────────────────────────────────────\n\n/**\n * Walk up a chat-messages.json path → (channel, project, chatId). Layout:\n * <channel>/projects/<project>/chats/<chatId>/chat-messages.json. Missing\n * ancestors fall back to deterministic defaults (lossy, never throws).\n */\nfunction deriveContextFromPath(path: string): { channel: string; project: string; chatId: string } {\n const chatDir = dirname(path); // .../chats/<chatId>\n const chatId = basename(chatDir) || \"unknown\";\n\n const chatsDir = dirname(chatDir); // .../<project>/chats\n const projectDir = dirname(chatsDir); // .../<project>\n const project = basename(projectDir) || \"unknown\";\n\n const projectsDir = dirname(projectDir); // .../projects\n const channelDir = dirname(projectsDir); // .../<channel>\n const channel = basename(channelDir) || \"manicode\";\n\n return { channel, project, chatId };\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Assistant role + timestamp\n// ─────────────────────────────────────────────────────────────────────────\n\nfunction isAssistantRole(msg: Record<string, unknown>): boolean {\n const variant = asString(msg.variant) ?? asString(msg.role) ?? \"\";\n return variant === \"ai\" || variant === \"agent\" || variant === \"assistant\";\n}\n\n/** message.timestamp | message.createdAt | metadata.timestamp → ms, else null. */\nfunction messageTimestamp(msg: Record<string, unknown>): number | null {\n for (const key of [\"timestamp\", \"createdAt\"] as const) {\n if (key in msg) {\n const ts = parseTimestampValue(msg[key]);\n if (ts !== null) return ts;\n }\n }\n const meta = asRecord(msg.metadata);\n if (meta !== undefined && \"timestamp\" in meta) {\n return parseTimestampValue(meta.timestamp);\n }\n return null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Usage extraction (port of AssistantUsage + extract_assistant_usage)\n// ─────────────────────────────────────────────────────────────────────────\n\ninterface AssistantUsage {\n model?: string;\n credits: number;\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n}\n\nfunction newUsage(): AssistantUsage {\n return { credits: 0, input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n}\n\nfunction hasSignal(u: AssistantUsage): boolean {\n return u.input > 0 || u.output > 0 || u.cacheRead > 0 || u.cacheWrite > 0 || u.credits > 0;\n}\n\n/** Fill any unset (<=0 / undefined) field of `self` from `other` (merge_fallback). */\nfunction mergeFallback(self: AssistantUsage, other: AssistantUsage): void {\n if (self.input <= 0) self.input = other.input;\n if (self.output <= 0) self.output = other.output;\n if (self.cacheRead <= 0) self.cacheRead = other.cacheRead;\n if (self.cacheWrite <= 0) self.cacheWrite = other.cacheWrite;\n if (self.model === undefined) self.model = other.model;\n if (self.credits <= 0) self.credits = other.credits;\n}\n\n/** Parse a usage object, accepting camelCase and snake_case (parse_usage_object). */\nfunction parseUsageObject(value: unknown): AssistantUsage {\n const usage = newUsage();\n const obj = asRecord(value);\n if (obj === undefined) return usage;\n\n const input = pickNumber(obj, [\"inputTokens\", \"input_tokens\", \"promptTokens\", \"prompt_tokens\"]);\n const output = pickNumber(obj, [\n \"outputTokens\",\n \"output_tokens\",\n \"completionTokens\",\n \"completion_tokens\",\n ]);\n let cacheRead = pickNumber(obj, [\n \"cacheReadInputTokens\",\n \"cache_read_input_tokens\",\n \"cachedTokensCreated\",\n \"cached_tokens_created\",\n ]);\n if (cacheRead === null) {\n const details = asRecord(obj.promptTokensDetails) ?? asRecord(obj.prompt_tokens_details);\n if (details !== undefined) {\n const cached = asNumber(details.cachedTokens ?? details.cached_tokens);\n if (cached !== null) cacheRead = Math.trunc(cached);\n }\n }\n const cacheWrite = pickNumber(obj, [\n \"cacheCreationInputTokens\",\n \"cache_creation_input_tokens\",\n \"cacheCreationTokens\",\n \"cache_creation_tokens\",\n ]);\n\n usage.input = input ?? 0;\n usage.output = output ?? 0;\n usage.cacheRead = cacheRead ?? 0;\n usage.cacheWrite = cacheWrite ?? 0;\n\n const credits = asNumber(obj.credits);\n if (credits !== null) usage.credits = credits;\n const model = asString(obj.model);\n if (model !== undefined) usage.model = model;\n\n return usage;\n}\n\n/**\n * Last assistant entry in metadata.runState.sessionState.mainAgentState.\n * messageHistory, pulling providerOptions.usage / providerOptions.codebuff.usage\n * (+ .codebuff.model). Scans newest-first, merging each as a fallback. Returns\n * undefined when no usable entry is found (port of extract_usage_from_run_state).\n */\nfunction extractUsageFromRunState(metadata: Record<string, unknown>): AssistantUsage | undefined {\n const history = asRecord(asRecord(asRecord(asRecord(metadata.runState)?.sessionState)?.mainAgentState));\n const rawHistory = history?.messageHistory;\n if (!Array.isArray(rawHistory)) return undefined;\n\n const accumulator = newUsage();\n let foundAny = false;\n for (let i = rawHistory.length - 1; i >= 0; i--) {\n const entry = asRecord(rawHistory[i]);\n if (entry === undefined) continue;\n if (asString(entry.role) !== \"assistant\") continue;\n const providerOptions = asRecord(entry.providerOptions);\n if (providerOptions === undefined) continue;\n\n const entryUsage = newUsage();\n if (\"usage\" in providerOptions) {\n mergeFallback(entryUsage, parseUsageObject(providerOptions.usage));\n }\n const codebuff = asRecord(providerOptions.codebuff);\n if (codebuff !== undefined && \"usage\" in codebuff) {\n mergeFallback(entryUsage, parseUsageObject(codebuff.usage));\n }\n const cbModel = codebuff !== undefined ? asString(codebuff.model) : undefined;\n if (cbModel !== undefined) entryUsage.model = cbModel;\n\n if (hasSignal(entryUsage) || entryUsage.model !== undefined) foundAny = true;\n mergeFallback(accumulator, entryUsage);\n }\n return foundAny ? accumulator : undefined;\n}\n\n/**\n * Extract assistant usage, trying in order metadata.usage, metadata.codebuff.usage,\n * then the RunState message history; each is merged as a fallback. A top-level\n * `credits` fills cost when the usage objects carry none (extract_assistant_usage).\n */\nfunction extractAssistantUsage(msg: Record<string, unknown>): AssistantUsage {\n const usage = newUsage();\n const metadata = asRecord(msg.metadata);\n\n if (metadata !== undefined) {\n const model = asString(metadata.model);\n if (model !== undefined) usage.model = model;\n if (\"usage\" in metadata) {\n mergeFallback(usage, parseUsageObject(metadata.usage));\n }\n const codebuff = asRecord(metadata.codebuff);\n if (codebuff !== undefined && \"usage\" in codebuff) {\n mergeFallback(usage, parseUsageObject(codebuff.usage));\n }\n const runStateUsage = extractUsageFromRunState(metadata);\n if (runStateUsage !== undefined) mergeFallback(usage, runStateUsage);\n }\n\n const credits = asNumber(msg.credits);\n if (credits !== null && credits > 0 && usage.credits <= 0) usage.credits = credits;\n\n return usage;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Dedup\n// ─────────────────────────────────────────────────────────────────────────\n\n/** Upstream ChatMessage.id when a non-empty string (stable across re-imports). */\nfunction upstreamMessageId(msg: Record<string, unknown>): string | undefined {\n const id = asString(msg.id);\n return id !== undefined && id !== \"\" ? id : undefined;\n}\n\n/** Deterministic fallback dedup key (derive_dedup_key). */\nfunction deriveDedupKey(\n sessionId: string,\n ts: number,\n model: string,\n usage: AssistantUsage,\n ordinal: number,\n): string {\n const i = Math.max(0, usage.input);\n const o = Math.max(0, usage.output);\n const cr = Math.max(0, usage.cacheRead);\n const cw = Math.max(0, usage.cacheWrite);\n return `codebuff:${sessionId}:${ts}:${model}:${ordinal}:${i}:${o}:${cr}:${cw}`;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// File parse\n// ─────────────────────────────────────────────────────────────────────────\n\n/** Parse one chat-messages.json into usage records (port of parse_codebuff_file). */\nfunction parseCodebuffFile(path: string): UsageRecord[] {\n const root = readJsonFile(path);\n if (!Array.isArray(root)) return []; // missing / malformed / non-array → no rows\n\n const { channel, project, chatId } = deriveContextFromPath(path);\n const sessionId = `${channel}/${project}/${chatId}`;\n const { projectKey, projectLabel } = workspaceFromPath(project);\n\n const chatIdTs = parseChatIdToMillis(chatId); // null when unparseable\n const mtime = fileMtimeMs(path);\n\n const out: UsageRecord[] = [];\n for (let ordinal = 0; ordinal < root.length; ordinal++) {\n const msg = asRecord(root[ordinal]);\n if (msg === undefined) continue;\n if (!isAssistantRole(msg)) continue;\n\n const usage = extractAssistantUsage(msg);\n if (!hasSignal(usage)) continue;\n\n const ts = messageTimestamp(msg) ?? (chatIdTs !== null && chatIdTs > 0 ? chatIdTs : mtime);\n const modelId = usage.model ?? DEFAULT_MODEL;\n const providerId = inferProvider(modelId) ?? DEFAULT_PROVIDER;\n const dedupKey =\n upstreamMessageId(msg) ?? deriveDedupKey(sessionId, ts, modelId, usage, ordinal);\n\n const tokens: TokenBreakdown = emptyTokens();\n tokens.input = Math.max(0, usage.input);\n tokens.output = Math.max(0, usage.output);\n tokens.cacheRead = Math.max(0, usage.cacheRead);\n tokens.cacheWrite = Math.max(0, usage.cacheWrite);\n // reasoning stays 0 (Codebuff does not report it).\n\n const record: UsageRecord = {\n platformId: PLATFORM_ID,\n modelId,\n providerId,\n sessionId,\n tokens,\n ts,\n messageCount: 1,\n dedupKey,\n confidence: \"host-reported\",\n };\n const cost = Math.max(0, usage.credits);\n if (cost > 0) record.cost = cost;\n if (projectKey !== undefined) record.projectKey = projectKey;\n if (projectLabel !== undefined) record.projectLabel = projectLabel;\n out.push(record);\n }\n\n return out;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Reader\n// ─────────────────────────────────────────────────────────────────────────\n\n/** The Codebuff (Manicode) usage reader singleton. */\nconst codebuffReader: UsageReader = {\n platformId: PLATFORM_ID,\n kind: \"local\",\n async read({ sinceMs }: { sinceMs?: number }): Promise<UsageRecord[]> {\n const records: UsageRecord[] = [];\n\n // Scan each channel's projects root that exists.\n // <root>/<project>/chats/<chatId>/chat-messages.json\n for (const root of codebuffProjectRoots()) {\n const files = walkFiles(root, (name, abs) => {\n return (\n name === \"chat-messages.json\" &&\n /[\\\\/]chats[\\\\/][^\\\\/]+[\\\\/]chat-messages\\.json$/.test(abs)\n );\n });\n for (const file of files) {\n for (const row of parseCodebuffFile(file)) {\n if (sinceMs !== undefined && row.ts < sinceMs) continue;\n records.push(row);\n }\n }\n }\n\n return records;\n },\n};\n\nexport default codebuffReader;\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
rewriteEnvRefs
|
|
4
|
+
} from "./chunk-DBQMX75U.js";
|
|
5
|
+
import {
|
|
6
|
+
BaseAdapter
|
|
7
|
+
} from "./chunk-TIIP3RG2.js";
|
|
8
|
+
import "./chunk-7L6ITC4T.js";
|
|
9
|
+
import {
|
|
10
|
+
buildServeWrapperCommand,
|
|
11
|
+
shouldWrapForTelemetry
|
|
12
|
+
} from "./chunk-MEH7GC7R.js";
|
|
13
|
+
import "./chunk-TRQKHP7D.js";
|
|
14
|
+
|
|
15
|
+
// src/adapters/codebuff/index.ts
|
|
16
|
+
import { existsSync } from "fs";
|
|
17
|
+
import { homedir } from "os";
|
|
18
|
+
import { join } from "path";
|
|
19
|
+
var HOST = "codebuff";
|
|
20
|
+
var MCP_ROOT_KEY = "mcpServers";
|
|
21
|
+
var toNativeRef = (name, def) => {
|
|
22
|
+
if (def !== void 0) {
|
|
23
|
+
const v = process.env[name];
|
|
24
|
+
return v != null && v !== "" ? v : def;
|
|
25
|
+
}
|
|
26
|
+
return `$${name}`;
|
|
27
|
+
};
|
|
28
|
+
function rewriteEnvRefsDeep(value) {
|
|
29
|
+
if (typeof value === "string") {
|
|
30
|
+
return rewriteEnvRefs(value, toNativeRef);
|
|
31
|
+
}
|
|
32
|
+
if (Array.isArray(value)) {
|
|
33
|
+
return value.map((v) => rewriteEnvRefsDeep(v));
|
|
34
|
+
}
|
|
35
|
+
if (value && typeof value === "object") {
|
|
36
|
+
const out = {};
|
|
37
|
+
for (const [k, v] of Object.entries(value)) out[k] = rewriteEnvRefsDeep(v);
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
var CodebuffAdapter = class extends BaseAdapter {
|
|
43
|
+
id = HOST;
|
|
44
|
+
name = "Codebuff";
|
|
45
|
+
paradigm = "mcp-only";
|
|
46
|
+
capabilities = {
|
|
47
|
+
// Codebuff has no lifecycle hook system — every hook capability is false.
|
|
48
|
+
preToolUse: false,
|
|
49
|
+
postToolUse: false,
|
|
50
|
+
preCompact: false,
|
|
51
|
+
sessionStart: false,
|
|
52
|
+
sessionEnd: false,
|
|
53
|
+
userPromptSubmit: false,
|
|
54
|
+
stop: false,
|
|
55
|
+
notification: false,
|
|
56
|
+
canModifyArgs: false,
|
|
57
|
+
canModifyOutput: false,
|
|
58
|
+
canInjectSessionContext: false,
|
|
59
|
+
// Codebuff registers stdio and Streamable HTTP MCP servers.
|
|
60
|
+
transports: ["stdio", "http"]
|
|
61
|
+
};
|
|
62
|
+
// ── Detection ────────────────────────────────────────────────────────────
|
|
63
|
+
detectInstalled(projectDir) {
|
|
64
|
+
const userDir = join(homedir(), ".agents");
|
|
65
|
+
const userMcp = join(userDir, "mcp.json");
|
|
66
|
+
const projDir = join(projectDir, ".agents");
|
|
67
|
+
const projMcp = join(projDir, "mcp.json");
|
|
68
|
+
const userInstalled = existsSync(userDir) || existsSync(userMcp);
|
|
69
|
+
const projInstalled = existsSync(projDir) || existsSync(projMcp);
|
|
70
|
+
const installed = userInstalled || projInstalled;
|
|
71
|
+
const scope = projInstalled && !userInstalled ? "project" : "user";
|
|
72
|
+
const configPath = scope === "project" ? projMcp : userMcp;
|
|
73
|
+
return {
|
|
74
|
+
id: this.id,
|
|
75
|
+
name: this.name,
|
|
76
|
+
installed,
|
|
77
|
+
paradigm: this.paradigm,
|
|
78
|
+
capabilities: this.capabilities,
|
|
79
|
+
configPath,
|
|
80
|
+
scope,
|
|
81
|
+
reason: installed ? `found Codebuff config (${scope})` : `no .agents config dir at ${userDir} or ${projDir}`,
|
|
82
|
+
confidence: installed ? "high" : "low"
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// ── Native paths ─────────────────────────────────────────────────────────
|
|
86
|
+
getConfigDir(ctx) {
|
|
87
|
+
return ctx.scope === "project" ? join(ctx.projectDir, ".agents") : join(homedir(), ".agents");
|
|
88
|
+
}
|
|
89
|
+
getServerConfigPath(ctx) {
|
|
90
|
+
return join(this.getConfigDir(ctx), "mcp.json");
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Codebuff has no hook file — hooks are not a thing here. The hook "config
|
|
94
|
+
* path" is the same mcp.json so the generic doctor/backup behave sensibly.
|
|
95
|
+
*/
|
|
96
|
+
getHookConfigPath(ctx) {
|
|
97
|
+
return this.getServerConfigPath(ctx);
|
|
98
|
+
}
|
|
99
|
+
// ── MCP server install / uninstall ───────────────────────────────────────
|
|
100
|
+
installServer(ctx) {
|
|
101
|
+
const { connector } = ctx;
|
|
102
|
+
const override = connector.platforms[HOST]?.server;
|
|
103
|
+
if (!connector.server || override === false) {
|
|
104
|
+
return [
|
|
105
|
+
{
|
|
106
|
+
platform: this.id,
|
|
107
|
+
action: "skip",
|
|
108
|
+
detail: connector.server ? "server registration disabled for codebuff" : "connector declares no MCP server"
|
|
109
|
+
}
|
|
110
|
+
];
|
|
111
|
+
}
|
|
112
|
+
const server = override && typeof override === "object" ? { ...connector.server, ...override } : connector.server;
|
|
113
|
+
const serverPath = this.getServerConfigPath(ctx);
|
|
114
|
+
const entry = this.renderServerEntry(ctx, server);
|
|
115
|
+
return [
|
|
116
|
+
this.upsertServerInJson(serverPath, MCP_ROOT_KEY, connector.id, entry, ctx.dryRun)
|
|
117
|
+
];
|
|
118
|
+
}
|
|
119
|
+
uninstallServer(ctx) {
|
|
120
|
+
const serverPath = this.getServerConfigPath(ctx);
|
|
121
|
+
return [
|
|
122
|
+
this.removeServerFromJson(serverPath, MCP_ROOT_KEY, ctx.connector.id, ctx.dryRun)
|
|
123
|
+
];
|
|
124
|
+
}
|
|
125
|
+
/** Render a normalized ServerDef into Codebuff's native mcpServers entry. */
|
|
126
|
+
renderServerEntry(ctx, server) {
|
|
127
|
+
const transport = server.transport;
|
|
128
|
+
if (transport === "stdio") {
|
|
129
|
+
let command = server.command ?? "";
|
|
130
|
+
let args = [...server.args ?? []];
|
|
131
|
+
if (shouldWrapForTelemetry(server, ctx.connector.telemetry)) {
|
|
132
|
+
const wrapped = buildServeWrapperCommand(
|
|
133
|
+
ctx.homeBinPath,
|
|
134
|
+
ctx.connector.id,
|
|
135
|
+
command,
|
|
136
|
+
args,
|
|
137
|
+
ctx.scope,
|
|
138
|
+
this.id
|
|
139
|
+
);
|
|
140
|
+
command = wrapped.command;
|
|
141
|
+
args = wrapped.args;
|
|
142
|
+
}
|
|
143
|
+
const entry2 = {
|
|
144
|
+
type: "stdio",
|
|
145
|
+
command: rewriteEnvRefsDeep(command)
|
|
146
|
+
};
|
|
147
|
+
if (args.length > 0) entry2.args = rewriteEnvRefsDeep(args);
|
|
148
|
+
const env = this.renderEnv(server.env);
|
|
149
|
+
if (env) entry2.env = env;
|
|
150
|
+
return entry2;
|
|
151
|
+
}
|
|
152
|
+
const entry = {
|
|
153
|
+
type: "http",
|
|
154
|
+
url: rewriteEnvRefsDeep(server.url ?? "")
|
|
155
|
+
};
|
|
156
|
+
const headers = this.renderEnv(server.headers);
|
|
157
|
+
if (headers) entry.headers = headers;
|
|
158
|
+
return entry;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Render env/header values. Codebuff supports native `$VAR` interpolation, so
|
|
162
|
+
* rewrite `${env:VAR}` references to `$VAR` rather than resolving to literals.
|
|
163
|
+
*/
|
|
164
|
+
renderEnv(env) {
|
|
165
|
+
if (!env || Object.keys(env).length === 0) return void 0;
|
|
166
|
+
return rewriteEnvRefsDeep({ ...env });
|
|
167
|
+
}
|
|
168
|
+
// ── Hooks (unavailable — Codebuff is mcp-only) ────────────────────────────
|
|
169
|
+
installHooks(_ctx) {
|
|
170
|
+
return [
|
|
171
|
+
{
|
|
172
|
+
platform: this.id,
|
|
173
|
+
action: "skip",
|
|
174
|
+
detail: "hooks unavailable (Codebuff is mcp-only)"
|
|
175
|
+
}
|
|
176
|
+
];
|
|
177
|
+
}
|
|
178
|
+
uninstallHooks(_ctx) {
|
|
179
|
+
return [
|
|
180
|
+
{
|
|
181
|
+
platform: this.id,
|
|
182
|
+
action: "skip",
|
|
183
|
+
detail: "hooks unavailable (Codebuff is mcp-only)"
|
|
184
|
+
}
|
|
185
|
+
];
|
|
186
|
+
}
|
|
187
|
+
// ── Diagnostics ──────────────────────────────────────────────────────────
|
|
188
|
+
getHealthChecks(ctx) {
|
|
189
|
+
const mcpPath = this.getServerConfigPath(ctx);
|
|
190
|
+
const connectorId = ctx.connector.id;
|
|
191
|
+
return [
|
|
192
|
+
{
|
|
193
|
+
name: `${this.name}: mcp.json present`,
|
|
194
|
+
check: () => existsSync(mcpPath) ? { status: "OK", detail: mcpPath } : { status: "FAIL", detail: `not found: ${mcpPath}` }
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
name: `${this.name}: server entry registered`,
|
|
198
|
+
check: () => {
|
|
199
|
+
const cfg = this.readJson(mcpPath);
|
|
200
|
+
const bucket = cfg?.[MCP_ROOT_KEY];
|
|
201
|
+
if (!cfg || !bucket) {
|
|
202
|
+
return { status: "FAIL", detail: `no ${MCP_ROOT_KEY} in ${mcpPath}` };
|
|
203
|
+
}
|
|
204
|
+
return connectorId in bucket ? { status: "OK", detail: `${MCP_ROOT_KEY}.${connectorId} present` } : {
|
|
205
|
+
status: "FAIL",
|
|
206
|
+
detail: `no ${MCP_ROOT_KEY}.${connectorId} in ${mcpPath}`
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
];
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
var adapter = new CodebuffAdapter();
|
|
214
|
+
var codebuff_default = adapter;
|
|
215
|
+
export {
|
|
216
|
+
CodebuffAdapter,
|
|
217
|
+
adapter,
|
|
218
|
+
codebuff_default as default
|
|
219
|
+
};
|
|
220
|
+
//# sourceMappingURL=codebuff-QX57FJDN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/codebuff/index.ts"],"sourcesContent":["/**\n * adapters/codebuff — Codebuff platform adapter for agent-connector.\n *\n * Codebuff is an **mcp-only** host: it exposes no lifecycle hook system, and MCP\n * is its extensibility mechanism. This adapter therefore installs only the MCP\n * server and reports hooks as unavailable (mirrors the Warp reference path that\n * validates the `mcp-only` paradigm end-to-end).\n *\n * MCP config (SPEC):\n * - project scope (preferred) → <projectDir>/.agents/mcp.json\n * - user scope → ~/.agents/mcp.json\n * Both are JSON, root key \"mcpServers\". There is no separate hook file — the\n * hook \"config path\" is the same mcp.json so the generic doctor/backup behave\n * sensibly.\n *\n * A stdio server entry is the standard `{ type:\"stdio\", command, args, env }`\n * shape. Codebuff supports native `$VAR` interpolation, so `${env:VAR}` refs are\n * rewritten to Codebuff's native `$VAR` token (rewriteEnvRefs) rather than being\n * resolved to literals — secrets are never baked into the config file.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { BaseAdapter } from \"../base.js\";\nimport type { Adapter, InstallContext } from \"../spi.js\";\nimport type {\n ChangeRecord,\n DetectedPlatform,\n HealthCheck,\n HookParadigm,\n PlatformCapabilities,\n PlatformId,\n ServerDef,\n Transport,\n} from \"../../core/types.js\";\nimport { rewriteEnvRefs } from \"../../core/interpolate.js\";\nimport {\n buildServeWrapperCommand,\n shouldWrapForTelemetry,\n} from \"../../core/spawn.js\";\n\nconst HOST: PlatformId = \"codebuff\";\nconst MCP_ROOT_KEY = \"mcpServers\";\n\n/**\n * Render `${env:VAR}`/`${env:VAR:-default}` into Codebuff's native `$VAR` token.\n *\n * When the portable ref carried a default (`${env:VAR:-fallback}`), Codebuff's\n * native `$VAR` token cannot express it — so a bare native token would silently\n * DROP the default. Instead, resolve the default at install time: emit the live\n * value when VAR is set and non-empty, else the literal fallback. The native\n * token is only emitted when there is no default to preserve.\n */\nconst toNativeRef = (name: string, def?: string): string => {\n if (def !== undefined) {\n const v = process.env[name];\n return v != null && v !== \"\" ? v : def;\n }\n return `$${name}`;\n};\n\n/** Recursively rewrite every `${env:VAR}` ref in a JSON-ish value to `$VAR`. */\nfunction rewriteEnvRefsDeep<T>(value: T): T {\n if (typeof value === \"string\") {\n return rewriteEnvRefs(value, toNativeRef) as unknown as T;\n }\n if (Array.isArray(value)) {\n return value.map((v) => rewriteEnvRefsDeep(v)) as unknown as T;\n }\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) out[k] = rewriteEnvRefsDeep(v);\n return out as T;\n }\n return value;\n}\n\n/**\n * Native MCP server entry shapes Codebuff accepts under `mcpServers`.\n * A stdio entry is tagged with `type:\"stdio\"`; remote transports carry a `url`.\n */\ninterface CodebuffStdioServer {\n type: \"stdio\";\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\ninterface CodebuffHttpServer {\n type: \"http\";\n url: string;\n headers?: Record<string, string>;\n}\n\nexport class CodebuffAdapter extends BaseAdapter implements Adapter {\n readonly id: PlatformId = HOST;\n readonly name = \"Codebuff\";\n readonly paradigm: HookParadigm = \"mcp-only\";\n\n readonly capabilities: PlatformCapabilities = {\n // Codebuff has no lifecycle hook system — every hook capability is false.\n preToolUse: false,\n postToolUse: false,\n preCompact: false,\n sessionStart: false,\n sessionEnd: false,\n userPromptSubmit: false,\n stop: false,\n notification: false,\n canModifyArgs: false,\n canModifyOutput: false,\n canInjectSessionContext: false,\n // Codebuff registers stdio and Streamable HTTP MCP servers.\n transports: [\"stdio\", \"http\"],\n };\n\n // ── Detection ────────────────────────────────────────────────────────────\n\n detectInstalled(projectDir: string): DetectedPlatform {\n const userDir = join(homedir(), \".agents\");\n const userMcp = join(userDir, \"mcp.json\");\n const projDir = join(projectDir, \".agents\");\n const projMcp = join(projDir, \"mcp.json\");\n\n const userInstalled = existsSync(userDir) || existsSync(userMcp);\n const projInstalled = existsSync(projDir) || existsSync(projMcp);\n const installed = userInstalled || projInstalled;\n // Project is the preferred scope; fall back to user when only that matched.\n const scope = projInstalled && !userInstalled ? \"project\" : \"user\";\n const configPath = scope === \"project\" ? projMcp : userMcp;\n\n return {\n id: this.id,\n name: this.name,\n installed,\n paradigm: this.paradigm,\n capabilities: this.capabilities,\n configPath,\n scope,\n reason: installed\n ? `found Codebuff config (${scope})`\n : `no .agents config dir at ${userDir} or ${projDir}`,\n confidence: installed ? \"high\" : \"low\",\n };\n }\n\n // ── Native paths ─────────────────────────────────────────────────────────\n\n getConfigDir(ctx: InstallContext): string {\n return ctx.scope === \"project\"\n ? join(ctx.projectDir, \".agents\")\n : join(homedir(), \".agents\");\n }\n\n getServerConfigPath(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"mcp.json\");\n }\n\n /**\n * Codebuff has no hook file — hooks are not a thing here. The hook \"config\n * path\" is the same mcp.json so the generic doctor/backup behave sensibly.\n */\n getHookConfigPath(ctx: InstallContext): string {\n return this.getServerConfigPath(ctx);\n }\n\n // ── MCP server install / uninstall ───────────────────────────────────────\n\n installServer(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n const override = connector.platforms[HOST]?.server;\n if (!connector.server || override === false) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: connector.server\n ? \"server registration disabled for codebuff\"\n : \"connector declares no MCP server\",\n },\n ];\n }\n\n // Shallow-merge any per-platform server override into the base ServerDef.\n const server: ServerDef =\n override && typeof override === \"object\"\n ? { ...connector.server, ...override }\n : connector.server;\n\n const serverPath = this.getServerConfigPath(ctx);\n const entry = this.renderServerEntry(ctx, server);\n\n return [\n this.upsertServerInJson(serverPath, MCP_ROOT_KEY, connector.id, entry, ctx.dryRun),\n ];\n }\n\n uninstallServer(ctx: InstallContext): ChangeRecord[] {\n const serverPath = this.getServerConfigPath(ctx);\n return [\n this.removeServerFromJson(serverPath, MCP_ROOT_KEY, ctx.connector.id, ctx.dryRun),\n ];\n }\n\n /** Render a normalized ServerDef into Codebuff's native mcpServers entry. */\n private renderServerEntry(\n ctx: InstallContext,\n server: ServerDef,\n ): CodebuffStdioServer | CodebuffHttpServer {\n const transport: Transport = server.transport;\n\n if (transport === \"stdio\") {\n let command = server.command ?? \"\";\n let args = [...(server.args ?? [])];\n\n // Transparent telemetry wrapping: route the real command through\n // `<homeBin> serve --connector <id> -- <command> <args...>`.\n if (shouldWrapForTelemetry(server, ctx.connector.telemetry)) {\n const wrapped = buildServeWrapperCommand(\n ctx.homeBinPath,\n ctx.connector.id,\n command,\n args,\n ctx.scope,\n this.id,\n );\n command = wrapped.command;\n args = wrapped.args;\n }\n\n // Codebuff supports native `$VAR` interpolation, so rewrite every\n // ${env:VAR} ref to `$VAR` rather than baking literals into the config.\n const entry: CodebuffStdioServer = {\n type: \"stdio\",\n command: rewriteEnvRefsDeep(command),\n };\n if (args.length > 0) entry.args = rewriteEnvRefsDeep(args);\n const env = this.renderEnv(server.env);\n if (env) entry.env = env;\n return entry;\n }\n\n // http (and any other remote transport) — Codebuff registers a URL.\n const entry: CodebuffHttpServer = {\n type: \"http\",\n url: rewriteEnvRefsDeep(server.url ?? \"\"),\n };\n const headers = this.renderEnv(server.headers);\n if (headers) entry.headers = headers;\n return entry;\n }\n\n /**\n * Render env/header values. Codebuff supports native `$VAR` interpolation, so\n * rewrite `${env:VAR}` references to `$VAR` rather than resolving to literals.\n */\n private renderEnv(\n env: Record<string, string> | undefined,\n ): Record<string, string> | undefined {\n if (!env || Object.keys(env).length === 0) return undefined;\n return rewriteEnvRefsDeep({ ...env });\n }\n\n // ── Hooks (unavailable — Codebuff is mcp-only) ────────────────────────────\n\n installHooks(_ctx: InstallContext): ChangeRecord[] {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: \"hooks unavailable (Codebuff is mcp-only)\",\n },\n ];\n }\n\n uninstallHooks(_ctx: InstallContext): ChangeRecord[] {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: \"hooks unavailable (Codebuff is mcp-only)\",\n },\n ];\n }\n\n // ── Diagnostics ──────────────────────────────────────────────────────────\n\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\n const mcpPath = this.getServerConfigPath(ctx);\n const connectorId = ctx.connector.id;\n return [\n {\n name: `${this.name}: mcp.json present`,\n check: () =>\n existsSync(mcpPath)\n ? { status: \"OK\", detail: mcpPath }\n : { status: \"FAIL\", detail: `not found: ${mcpPath}` },\n },\n {\n name: `${this.name}: server entry registered`,\n check: () => {\n const cfg = this.readJson<{ [k: string]: Record<string, unknown> }>(mcpPath);\n const bucket = cfg?.[MCP_ROOT_KEY];\n if (!cfg || !bucket) {\n return { status: \"FAIL\", detail: `no ${MCP_ROOT_KEY} in ${mcpPath}` };\n }\n return connectorId in bucket\n ? { status: \"OK\", detail: `${MCP_ROOT_KEY}.${connectorId} present` }\n : {\n status: \"FAIL\",\n detail: `no ${MCP_ROOT_KEY}.${connectorId} in ${mcpPath}`,\n };\n },\n },\n ];\n }\n}\n\nexport const adapter = new CodebuffAdapter();\nexport default adapter;\n"],"mappings":"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","names":["entry"]}
|