@tom2012/cc-web 1.5.77 → 1.5.78

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.
Files changed (65) hide show
  1. package/README.md +1 -1
  2. package/backend/dist/adapters/claude-adapter.d.ts +19 -0
  3. package/backend/dist/adapters/claude-adapter.d.ts.map +1 -0
  4. package/backend/dist/adapters/claude-adapter.js +244 -0
  5. package/backend/dist/adapters/claude-adapter.js.map +1 -0
  6. package/backend/dist/adapters/codex-adapter.d.ts +19 -0
  7. package/backend/dist/adapters/codex-adapter.d.ts.map +1 -0
  8. package/backend/dist/adapters/codex-adapter.js +28 -0
  9. package/backend/dist/adapters/codex-adapter.js.map +1 -0
  10. package/backend/dist/adapters/index.d.ts +5 -0
  11. package/backend/dist/adapters/index.d.ts.map +1 -0
  12. package/backend/dist/adapters/index.js +17 -0
  13. package/backend/dist/adapters/index.js.map +1 -0
  14. package/backend/dist/adapters/opencode-adapter.d.ts +19 -0
  15. package/backend/dist/adapters/opencode-adapter.d.ts.map +1 -0
  16. package/backend/dist/adapters/opencode-adapter.js +28 -0
  17. package/backend/dist/adapters/opencode-adapter.js.map +1 -0
  18. package/backend/dist/adapters/qwen-adapter.d.ts +19 -0
  19. package/backend/dist/adapters/qwen-adapter.d.ts.map +1 -0
  20. package/backend/dist/adapters/qwen-adapter.js +26 -0
  21. package/backend/dist/adapters/qwen-adapter.js.map +1 -0
  22. package/backend/dist/adapters/types.d.ts +44 -0
  23. package/backend/dist/adapters/types.d.ts.map +1 -0
  24. package/backend/dist/adapters/types.js +3 -0
  25. package/backend/dist/adapters/types.js.map +1 -0
  26. package/backend/dist/hooks-manager.d.ts +7 -3
  27. package/backend/dist/hooks-manager.d.ts.map +1 -1
  28. package/backend/dist/hooks-manager.js +55 -47
  29. package/backend/dist/hooks-manager.js.map +1 -1
  30. package/backend/dist/index.d.ts.map +1 -1
  31. package/backend/dist/index.js +21 -1
  32. package/backend/dist/index.js.map +1 -1
  33. package/backend/dist/routes/claude.d.ts.map +1 -1
  34. package/backend/dist/routes/claude.js +20 -58
  35. package/backend/dist/routes/claude.js.map +1 -1
  36. package/backend/dist/routes/projects.d.ts.map +1 -1
  37. package/backend/dist/routes/projects.js +7 -5
  38. package/backend/dist/routes/projects.js.map +1 -1
  39. package/backend/dist/session-manager.d.ts +4 -5
  40. package/backend/dist/session-manager.d.ts.map +1 -1
  41. package/backend/dist/session-manager.js +16 -108
  42. package/backend/dist/session-manager.js.map +1 -1
  43. package/backend/dist/terminal-manager.d.ts.map +1 -1
  44. package/backend/dist/terminal-manager.js +9 -18
  45. package/backend/dist/terminal-manager.js.map +1 -1
  46. package/bin/ccweb.js +8 -0
  47. package/frontend/dist/assets/{GraphPreview-BsCfScZY.js → GraphPreview-CbT5pCcQ.js} +1 -1
  48. package/frontend/dist/assets/{OfficePreview-DZcYVDW8.js → OfficePreview-BwicFngo.js} +3 -3
  49. package/frontend/dist/assets/{ProjectPage-DqyRyuGy.js → ProjectPage-Y29o2kYj.js} +54 -54
  50. package/frontend/dist/assets/SettingsPage-Dhjkah0F.js +41 -0
  51. package/frontend/dist/assets/{ShareViewPage-BfltjUod.js → ShareViewPage-DABRMtrZ.js} +1 -1
  52. package/frontend/dist/assets/{SkillHubPage-BuCfJoFJ.js → SkillHubPage-LTCxXWis.js} +2 -2
  53. package/frontend/dist/assets/{bot-BX6StWTe.js → bot-BqV-yyzX.js} +1 -1
  54. package/frontend/dist/assets/{chevron-down-X-5t7_tL.js → chevron-down-DrT-QkYc.js} +1 -1
  55. package/frontend/dist/assets/{download-Bil13d6m.js → download-CTHOCPFs.js} +1 -1
  56. package/frontend/dist/assets/index-Cko3_F0X.css +1 -0
  57. package/frontend/dist/assets/{index-BhyoV38M.js → index-DJq0tcnY.js} +45 -45
  58. package/frontend/dist/assets/{index-CPD5Wb59.js → index-SnUUkWGd.js} +1 -1
  59. package/frontend/dist/assets/{jszip.min-CxKrPvTL.js → jszip.min-DEJqf7Np.js} +1 -1
  60. package/frontend/dist/assets/{save-p2K0zXBn.js → save-Dx5NU5qc.js} +1 -1
  61. package/frontend/dist/assets/{user-Dl8SCDzt.js → user-CLQL20UM.js} +1 -1
  62. package/frontend/dist/index.html +2 -2
  63. package/package.json +1 -1
  64. package/frontend/dist/assets/SettingsPage-DibjvDz7.js +0 -36
  65. package/frontend/dist/assets/index-DgHvs3fU.css +0 -1
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  A self-hosted web application (distributed as npm package) that provides a browser-based interface for [Claude Code](https://docs.anthropic.com/en/docs/claude-code) CLI sessions. Create projects, each with a persistent terminal running Claude Code, and interact with them through a real-time terminal UI.
4
4
 
5
- **Current version**: v1.5.77 | [GitHub](https://github.com/zbc0315/cc-web) | MIT License
5
+ **Current version**: v1.5.78 | [GitHub](https://github.com/zbc0315/cc-web) | MIT License
6
6
 
7
7
  ## Features
8
8
 
@@ -0,0 +1,19 @@
1
+ import type { CliToolAdapter, ToolModel, ToolSkillsData, UsageInfo } from './types';
2
+ import type { SessionMessage, ChatBlock } from '../session-manager';
3
+ export declare class ClaudeAdapter implements CliToolAdapter {
4
+ readonly tool = "claude";
5
+ buildCommand(permissionMode: 'limited' | 'unlimited', continueSession: boolean): string;
6
+ supportsContinue(): boolean;
7
+ getSessionDir(folderPath: string): string | null;
8
+ parseLine(line: string): SessionMessage | null;
9
+ parseLineBlocks(line: string): ChatBlock | null;
10
+ getHooksSettingsPath(): string | null;
11
+ getHookEvents(): string[];
12
+ buildHookCommand(event: string, portFile: string): string | null;
13
+ getCurrentModel(): string | null;
14
+ getAvailableModels(): ToolModel[];
15
+ getSkills(): ToolSkillsData | null;
16
+ queryUsage(): Promise<UsageInfo>;
17
+ clearUsageCache(): void;
18
+ }
19
+ //# sourceMappingURL=claude-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/claude-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAiB,MAAM,oBAAoB,CAAC;AAgDnF,qBAAa,aAAc,YAAW,cAAc;IAClD,QAAQ,CAAC,IAAI,YAAY;IAGzB,YAAY,CAAC,cAAc,EAAE,SAAS,GAAG,WAAW,EAAE,eAAe,EAAE,OAAO,GAAG,MAAM;IAOvF,gBAAgB,IAAI,OAAO;IAK3B,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIhD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAmB9C,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAyC/C,oBAAoB,IAAI,MAAM,GAAG,IAAI;IAIrC,aAAa,IAAI,MAAM,EAAE;IAIzB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAkBhE,eAAe,IAAI,MAAM,GAAG,IAAI;IAWhC,kBAAkB,IAAI,SAAS,EAAE;IAQjC,SAAS,IAAI,cAAc,GAAG,IAAI;IAkD5B,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;IAItC,eAAe,IAAI,IAAI;CAGxB"}
@@ -0,0 +1,244 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ClaudeAdapter = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ const usage_terminal_1 = require("../usage-terminal");
41
+ // ── Helpers ──────────────────────────────────────────────────────────────────
42
+ function encodeProjectPath(folderPath) {
43
+ return folderPath.replace(/[\/ _]/g, '-');
44
+ }
45
+ function extractText(content) {
46
+ if (!content)
47
+ return '';
48
+ if (typeof content === 'string')
49
+ return content.trim();
50
+ return content
51
+ .filter((b) => b.type === 'text' && b.text)
52
+ .map((b) => b.text.trim())
53
+ .join('\n')
54
+ .trim();
55
+ }
56
+ function isInternalUserMessage(content) {
57
+ return content.startsWith('<command-') || content.startsWith('/');
58
+ }
59
+ const CCWEB_MARKER = '# ccweb-hook';
60
+ // ── Adapter ──────────────────────────────────────────────────────────────────
61
+ class ClaudeAdapter {
62
+ constructor() {
63
+ this.tool = 'claude';
64
+ }
65
+ // ── Command ─────────────────────────────────────────────────────────────
66
+ buildCommand(permissionMode, continueSession) {
67
+ const cont = continueSession ? ' --continue' : '';
68
+ return permissionMode === 'unlimited'
69
+ ? `claude --dangerously-skip-permissions${cont}`
70
+ : `claude${cont}`;
71
+ }
72
+ supportsContinue() {
73
+ return true;
74
+ }
75
+ // ── Session ─────────────────────────────────────────────────────────────
76
+ getSessionDir(folderPath) {
77
+ return path.join(os.homedir(), '.claude', 'projects', encodeProjectPath(folderPath));
78
+ }
79
+ parseLine(line) {
80
+ let record;
81
+ try {
82
+ record = JSON.parse(line);
83
+ }
84
+ catch {
85
+ return null;
86
+ }
87
+ if (record.type === 'user' && record.message?.role === 'user') {
88
+ const text = extractText(record.message.content);
89
+ if (!text || isInternalUserMessage(text))
90
+ return null;
91
+ return { role: 'user', content: text, timestamp: record.timestamp ?? new Date().toISOString() };
92
+ }
93
+ if (record.type === 'assistant' && record.message?.role === 'assistant') {
94
+ const text = extractText(record.message.content);
95
+ if (!text || text.length < 5)
96
+ return null;
97
+ return { role: 'assistant', content: text, timestamp: record.timestamp ?? new Date().toISOString() };
98
+ }
99
+ return null;
100
+ }
101
+ parseLineBlocks(line) {
102
+ let record;
103
+ try {
104
+ record = JSON.parse(line);
105
+ }
106
+ catch {
107
+ return null;
108
+ }
109
+ const ts = record.timestamp ?? new Date().toISOString();
110
+ if (record.type === 'user' && record.message?.role === 'user') {
111
+ const text = extractText(record.message.content);
112
+ if (!text || isInternalUserMessage(text))
113
+ return null;
114
+ return { role: 'user', timestamp: ts, blocks: [{ type: 'text', content: text }] };
115
+ }
116
+ if (record.type === 'assistant' && record.message?.role === 'assistant') {
117
+ const content = record.message.content;
118
+ if (!content)
119
+ return null;
120
+ if (typeof content === 'string') {
121
+ const trimmed = content.trim();
122
+ return trimmed ? { role: 'assistant', timestamp: ts, blocks: [{ type: 'text', content: trimmed }] } : null;
123
+ }
124
+ const blocks = [];
125
+ for (const b of content) {
126
+ if (b.type === 'text' && b.text?.trim()) {
127
+ blocks.push({ type: 'text', content: b.text.trim() });
128
+ }
129
+ else if (b.type === 'thinking') {
130
+ const text = b.thinking ?? b.text;
131
+ if (text?.trim())
132
+ blocks.push({ type: 'thinking', content: text.trim() });
133
+ }
134
+ else if (b.type === 'tool_use') {
135
+ const name = b.name ?? 'tool';
136
+ const input = b.input ? JSON.stringify(b.input).slice(0, 200) : '';
137
+ blocks.push({ type: 'tool_use', content: `${name}(${input})` });
138
+ }
139
+ else if (b.type === 'tool_result') {
140
+ const text = b.content ?? b.text;
141
+ if (text?.trim())
142
+ blocks.push({ type: 'tool_result', content: typeof text === 'string' ? text.trim() : JSON.stringify(text).slice(0, 200) });
143
+ }
144
+ }
145
+ return blocks.length > 0 ? { role: 'assistant', timestamp: ts, blocks } : null;
146
+ }
147
+ return null;
148
+ }
149
+ // ── Hooks ───────────────────────────────────────────────────────────────
150
+ getHooksSettingsPath() {
151
+ return path.join(os.homedir(), '.claude', 'settings.json');
152
+ }
153
+ getHookEvents() {
154
+ return ['PreToolUse', 'PostToolUse', 'Stop'];
155
+ }
156
+ buildHookCommand(event, portFile) {
157
+ const baseBody = [
158
+ `\\"event\\":\\"${event}\\"`,
159
+ `\\"dir\\":\\"$CLAUDE_PROJECT_DIR\\"`,
160
+ ];
161
+ if (event === 'PreToolUse' || event === 'PostToolUse') {
162
+ baseBody.push(`\\"tool\\":\\"$CLAUDE_TOOL_NAME\\"`);
163
+ baseBody.push(`\\"session\\":\\"$CLAUDE_SESSION_ID\\"`);
164
+ }
165
+ const body = baseBody.join(',');
166
+ return (`curl -sf -X POST "http://localhost:$(cat ${portFile})/api/hooks"` +
167
+ ` -H "Content-Type: application/json"` +
168
+ ` -d "{${body}}" || true ${CCWEB_MARKER}`);
169
+ }
170
+ // ── Model & skills ──────────────────────────────────────────────────────
171
+ getCurrentModel() {
172
+ try {
173
+ const settingsPath = path.join(os.homedir(), '.claude', 'settings.json');
174
+ const raw = fs.readFileSync(settingsPath, 'utf-8');
175
+ const settings = JSON.parse(raw);
176
+ return settings.model || 'opus';
177
+ }
178
+ catch {
179
+ return 'opus';
180
+ }
181
+ }
182
+ getAvailableModels() {
183
+ return [
184
+ { key: 'sonnet', label: 'Sonnet' },
185
+ { key: 'opus', label: 'Opus' },
186
+ { key: 'haiku', label: 'Haiku' },
187
+ ];
188
+ }
189
+ getSkills() {
190
+ const builtin = [
191
+ { command: '/help', description: 'Show available commands and usage' },
192
+ { command: '/clear', description: 'Clear conversation history and free context' },
193
+ { command: '/memory', description: 'Edit CLAUDE.md memory files' },
194
+ { command: '/model', description: 'Switch AI model (sonnet/opus/haiku)' },
195
+ { command: '/cost', description: 'Show token usage and cost for this session' },
196
+ { command: '/status', description: 'Show account and system status' },
197
+ { command: '/doctor', description: 'Check Claude Code installation health' },
198
+ { command: '/review', description: 'Request code review' },
199
+ { command: '/terminal', description: 'Run a bash command in the terminal' },
200
+ { command: '/vim', description: 'Open file in vim-like editor mode' },
201
+ { command: '/init', description: 'Initialize project CLAUDE.md' },
202
+ { command: '/bug', description: 'Report a bug to Anthropic' },
203
+ { command: '/release-notes', description: 'View recent release notes' },
204
+ { command: '/pr_comments', description: 'View PR review comments' },
205
+ { command: '/logout', description: 'Sign out of Claude account' },
206
+ { command: '/login', description: 'Sign in to Claude account' },
207
+ ];
208
+ const custom = [];
209
+ const mcp = [];
210
+ try {
211
+ const commandsDir = path.join(os.homedir(), '.claude', 'commands');
212
+ const files = fs.readdirSync(commandsDir);
213
+ for (const file of files) {
214
+ if (file.endsWith('.md')) {
215
+ const name = file.replace(/\.md$/, '');
216
+ const content = fs.readFileSync(path.join(commandsDir, file), 'utf-8');
217
+ const firstLine = content.split('\n').find((l) => l.trim())?.replace(/^#+\s*/, '').trim() || name;
218
+ custom.push({ command: `/${name}`, description: firstLine });
219
+ }
220
+ }
221
+ }
222
+ catch { /* no commands dir */ }
223
+ try {
224
+ const settingsPath = path.join(os.homedir(), '.claude', 'settings.json');
225
+ const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
226
+ if (settings.mcpServers && typeof settings.mcpServers === 'object') {
227
+ for (const name of Object.keys(settings.mcpServers)) {
228
+ mcp.push({ command: name, description: 'MCP Server' });
229
+ }
230
+ }
231
+ }
232
+ catch { /* no settings */ }
233
+ return { builtin, custom, mcp };
234
+ }
235
+ // ── Usage ──────────────────────────────────────────────────────────────
236
+ async queryUsage() {
237
+ return (0, usage_terminal_1.queryUsage)();
238
+ }
239
+ clearUsageCache() {
240
+ (0, usage_terminal_1.clearUsageCache)();
241
+ }
242
+ }
243
+ exports.ClaudeAdapter = ClaudeAdapter;
244
+ //# sourceMappingURL=claude-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-adapter.js","sourceRoot":"","sources":["../../src/adapters/claude-adapter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAGzB,sDAA6G;AAuB7G,gFAAgF;AAEhF,SAAS,iBAAiB,CAAC,UAAkB;IAC3C,OAAO,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,WAAW,CAAC,OAA4C;IAC/D,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;IACvD,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC;SAC1C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAK,CAAC,IAAI,EAAE,CAAC;SAC1B,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe;IAC5C,OAAO,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,YAAY,GAAG,cAAc,CAAC;AAEpC,gFAAgF;AAEhF,MAAa,aAAa;IAA1B;QACW,SAAI,GAAG,QAAQ,CAAC;IAqL3B,CAAC;IAnLC,2EAA2E;IAC3E,YAAY,CAAC,cAAuC,EAAE,eAAwB;QAC5E,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO,cAAc,KAAK,WAAW;YACnC,CAAC,CAAC,wCAAwC,IAAI,EAAE;YAChD,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2EAA2E;IAC3E,aAAa,CAAC,UAAkB;QAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,IAAI,MAAoB,CAAC;QACzB,IAAI,CAAC;YAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;QAEzE,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YAC9D,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI,IAAI,qBAAqB,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACtD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QAClG,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;YACxE,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC1C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QACvG,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,eAAe,CAAC,IAAY;QAC1B,IAAI,MAAoB,CAAC;QACzB,IAAI,CAAC;YAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;QACzE,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAExD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YAC9D,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI,IAAI,qBAAqB,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACtD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACpF,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;YACxE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;YACvC,IAAI,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC;YAC1B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAChC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC/B,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7G,CAAC;YACD,MAAM,MAAM,GAAoB,EAAE,CAAC;YACnC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;oBACxC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACxD,CAAC;qBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBACjC,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC;oBAClC,IAAI,IAAI,EAAE,IAAI,EAAE;wBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC5E,CAAC;qBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBACjC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC;oBAC9B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACnE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;gBAClE,CAAC;qBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oBACpC,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC;oBACjC,IAAI,IAAI,EAAE,IAAI,EAAE;wBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC/I,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACjF,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2EAA2E;IAC3E,oBAAoB;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAC7D,CAAC;IAED,aAAa;QACX,OAAO,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,gBAAgB,CAAC,KAAa,EAAE,QAAgB;QAC9C,MAAM,QAAQ,GAAG;YACf,kBAAkB,KAAK,KAAK;YAC5B,qCAAqC;SACtC,CAAC;QACF,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;YACtD,QAAQ,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACpD,QAAQ,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,CACL,4CAA4C,QAAQ,cAAc;YAClE,sCAAsC;YACtC,SAAS,IAAI,eAAe,YAAY,EAAE,CAC3C,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,eAAe;QACb,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;YACzE,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACjC,OAAO,QAAQ,CAAC,KAAK,IAAI,MAAM,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED,kBAAkB;QAChB,OAAO;YACL,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;YAClC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;YAC9B,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;SACjC,CAAC;IACJ,CAAC;IAED,SAAS;QACP,MAAM,OAAO,GAAG;YACd,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,mCAAmC,EAAE;YACtE,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,6CAA6C,EAAE;YACjF,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,6BAA6B,EAAE;YAClE,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,qCAAqC,EAAE;YACzE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,4CAA4C,EAAE;YAC/E,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,gCAAgC,EAAE;YACrE,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,uCAAuC,EAAE;YAC5E,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,qBAAqB,EAAE;YAC1D,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,oCAAoC,EAAE;YAC3E,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,mCAAmC,EAAE;YACrE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,8BAA8B,EAAE;YACjE,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,2BAA2B,EAAE;YAC7D,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,2BAA2B,EAAE;YACvE,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,yBAAyB,EAAE;YACnE,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,4BAA4B,EAAE;YACjE,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE;SAChE,CAAC;QAEF,MAAM,MAAM,GAA+C,EAAE,CAAC;QAC9D,MAAM,GAAG,GAA+C,EAAE,CAAC;QAE3D,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YACnE,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACvC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;oBACvE,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;oBAClG,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC;QAEjC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;YACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;YACpE,IAAI,QAAQ,CAAC,UAAU,IAAI,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;gBACnE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAqC,CAAC,EAAE,CAAC;oBAC/E,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAE7B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAClC,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,UAAU;QACd,OAAO,IAAA,2BAAgB,GAAE,CAAC;IAC5B,CAAC;IAED,eAAe;QACb,IAAA,gCAAqB,GAAE,CAAC;IAC1B,CAAC;CACF;AAtLD,sCAsLC"}
@@ -0,0 +1,19 @@
1
+ import type { CliToolAdapter, ToolModel, ToolSkillsData, UsageInfo } from './types';
2
+ import type { SessionMessage, ChatBlock } from '../session-manager';
3
+ export declare class CodexAdapter implements CliToolAdapter {
4
+ readonly tool = "codex";
5
+ buildCommand(permissionMode: 'limited' | 'unlimited', _continueSession: boolean): string;
6
+ supportsContinue(): boolean;
7
+ getSessionDir(): string | null;
8
+ parseLine(): SessionMessage | null;
9
+ parseLineBlocks(): ChatBlock | null;
10
+ getHooksSettingsPath(): string | null;
11
+ getHookEvents(): string[];
12
+ buildHookCommand(): string | null;
13
+ getCurrentModel(): string | null;
14
+ getAvailableModels(): ToolModel[];
15
+ getSkills(): ToolSkillsData | null;
16
+ queryUsage(): Promise<UsageInfo>;
17
+ clearUsageCache(): void;
18
+ }
19
+ //# sourceMappingURL=codex-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/codex-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpE,qBAAa,YAAa,YAAW,cAAc;IACjD,QAAQ,CAAC,IAAI,WAAW;IAExB,YAAY,CAAC,cAAc,EAAE,SAAS,GAAG,WAAW,EAAE,gBAAgB,EAAE,OAAO,GAAG,MAAM;IAOxF,gBAAgB,IAAI,OAAO;IAE3B,aAAa,IAAI,MAAM,GAAG,IAAI;IAC9B,SAAS,IAAI,cAAc,GAAG,IAAI;IAClC,eAAe,IAAI,SAAS,GAAG,IAAI;IAEnC,oBAAoB,IAAI,MAAM,GAAG,IAAI;IACrC,aAAa,IAAI,MAAM,EAAE;IACzB,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAEjC,eAAe,IAAI,MAAM,GAAG,IAAI;IAChC,kBAAkB,IAAI,SAAS,EAAE;IACjC,SAAS,IAAI,cAAc,GAAG,IAAI;IAE5B,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;IACtC,eAAe,IAAI,IAAI;CACxB"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodexAdapter = void 0;
4
+ class CodexAdapter {
5
+ constructor() {
6
+ this.tool = 'codex';
7
+ }
8
+ buildCommand(permissionMode, _continueSession) {
9
+ // Codex does not support --continue
10
+ return permissionMode === 'unlimited'
11
+ ? 'codex --ask-for-approval never --sandbox danger-full-access'
12
+ : 'codex';
13
+ }
14
+ supportsContinue() { return false; }
15
+ getSessionDir() { return null; }
16
+ parseLine() { return null; }
17
+ parseLineBlocks() { return null; }
18
+ getHooksSettingsPath() { return null; }
19
+ getHookEvents() { return []; }
20
+ buildHookCommand() { return null; }
21
+ getCurrentModel() { return null; }
22
+ getAvailableModels() { return []; }
23
+ getSkills() { return null; }
24
+ async queryUsage() { return {}; }
25
+ clearUsageCache() { }
26
+ }
27
+ exports.CodexAdapter = CodexAdapter;
28
+ //# sourceMappingURL=codex-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-adapter.js","sourceRoot":"","sources":["../../src/adapters/codex-adapter.ts"],"names":[],"mappings":";;;AAGA,MAAa,YAAY;IAAzB;QACW,SAAI,GAAG,OAAO,CAAC;IAyB1B,CAAC;IAvBC,YAAY,CAAC,cAAuC,EAAE,gBAAyB;QAC7E,oCAAoC;QACpC,OAAO,cAAc,KAAK,WAAW;YACnC,CAAC,CAAC,6DAA6D;YAC/D,CAAC,CAAC,OAAO,CAAC;IACd,CAAC;IAED,gBAAgB,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IAE7C,aAAa,KAAoB,OAAO,IAAI,CAAC,CAAC,CAAC;IAC/C,SAAS,KAA4B,OAAO,IAAI,CAAC,CAAC,CAAC;IACnD,eAAe,KAAuB,OAAO,IAAI,CAAC,CAAC,CAAC;IAEpD,oBAAoB,KAAoB,OAAO,IAAI,CAAC,CAAC,CAAC;IACtD,aAAa,KAAe,OAAO,EAAE,CAAC,CAAC,CAAC;IACxC,gBAAgB,KAAoB,OAAO,IAAI,CAAC,CAAC,CAAC;IAElD,eAAe,KAAoB,OAAO,IAAI,CAAC,CAAC,CAAC;IACjD,kBAAkB,KAAkB,OAAO,EAAE,CAAC,CAAC,CAAC;IAChD,SAAS,KAA4B,OAAO,IAAI,CAAC,CAAC,CAAC;IAEnD,KAAK,CAAC,UAAU,KAAyB,OAAO,EAAE,CAAC,CAAC,CAAC;IACrD,eAAe,KAAU,CAAC;CAC3B;AA1BD,oCA0BC"}
@@ -0,0 +1,5 @@
1
+ import { CliTool } from '../types';
2
+ import { CliToolAdapter } from './types';
3
+ export declare function getAdapter(tool: CliTool): CliToolAdapter;
4
+ export type { CliToolAdapter, ToolModel, ToolSkillsData, ToolSkillItem, UsageInfo, UsageBucket } from './types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAazC,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAExD;AAED,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAdapter = getAdapter;
4
+ const claude_adapter_1 = require("./claude-adapter");
5
+ const opencode_adapter_1 = require("./opencode-adapter");
6
+ const codex_adapter_1 = require("./codex-adapter");
7
+ const qwen_adapter_1 = require("./qwen-adapter");
8
+ const adapters = {
9
+ claude: new claude_adapter_1.ClaudeAdapter(),
10
+ opencode: new opencode_adapter_1.OpencodeAdapter(),
11
+ codex: new codex_adapter_1.CodexAdapter(),
12
+ qwen: new qwen_adapter_1.QwenAdapter(),
13
+ };
14
+ function getAdapter(tool) {
15
+ return adapters[tool] ?? adapters.claude;
16
+ }
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":";;AAcA,gCAEC;AAdD,qDAAiD;AACjD,yDAAqD;AACrD,mDAA+C;AAC/C,iDAA6C;AAE7C,MAAM,QAAQ,GAAoC;IAChD,MAAM,EAAE,IAAI,8BAAa,EAAE;IAC3B,QAAQ,EAAE,IAAI,kCAAe,EAAE;IAC/B,KAAK,EAAE,IAAI,4BAAY,EAAE;IACzB,IAAI,EAAE,IAAI,0BAAW,EAAE;CACxB,CAAC;AAEF,SAAgB,UAAU,CAAC,IAAa;IACtC,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { CliToolAdapter, ToolModel, ToolSkillsData, UsageInfo } from './types';
2
+ import type { SessionMessage, ChatBlock } from '../session-manager';
3
+ export declare class OpencodeAdapter implements CliToolAdapter {
4
+ readonly tool = "opencode";
5
+ buildCommand(permissionMode: 'limited' | 'unlimited', _continueSession: boolean): string;
6
+ supportsContinue(): boolean;
7
+ getSessionDir(): string | null;
8
+ parseLine(): SessionMessage | null;
9
+ parseLineBlocks(): ChatBlock | null;
10
+ getHooksSettingsPath(): string | null;
11
+ getHookEvents(): string[];
12
+ buildHookCommand(): string | null;
13
+ getCurrentModel(): string | null;
14
+ getAvailableModels(): ToolModel[];
15
+ getSkills(): ToolSkillsData | null;
16
+ queryUsage(): Promise<UsageInfo>;
17
+ clearUsageCache(): void;
18
+ }
19
+ //# sourceMappingURL=opencode-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/opencode-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpE,qBAAa,eAAgB,YAAW,cAAc;IACpD,QAAQ,CAAC,IAAI,cAAc;IAE3B,YAAY,CAAC,cAAc,EAAE,SAAS,GAAG,WAAW,EAAE,gBAAgB,EAAE,OAAO,GAAG,MAAM;IAKxF,gBAAgB,IAAI,OAAO;IAG3B,aAAa,IAAI,MAAM,GAAG,IAAI;IAC9B,SAAS,IAAI,cAAc,GAAG,IAAI;IAClC,eAAe,IAAI,SAAS,GAAG,IAAI;IAGnC,oBAAoB,IAAI,MAAM,GAAG,IAAI;IACrC,aAAa,IAAI,MAAM,EAAE;IACzB,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAEjC,eAAe,IAAI,MAAM,GAAG,IAAI;IAChC,kBAAkB,IAAI,SAAS,EAAE;IACjC,SAAS,IAAI,cAAc,GAAG,IAAI;IAE5B,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;IACtC,eAAe,IAAI,IAAI;CACxB"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpencodeAdapter = void 0;
4
+ class OpencodeAdapter {
5
+ constructor() {
6
+ this.tool = 'opencode';
7
+ }
8
+ buildCommand(permissionMode, _continueSession) {
9
+ // opencode does not support --continue or --dangerously-skip-permissions
10
+ return permissionMode === 'unlimited' ? 'opencode --yolo' : 'opencode';
11
+ }
12
+ supportsContinue() { return false; }
13
+ // OpenCode uses SQLite — session reading not yet supported
14
+ getSessionDir() { return null; }
15
+ parseLine() { return null; }
16
+ parseLineBlocks() { return null; }
17
+ // Hooks: not yet investigated for opencode
18
+ getHooksSettingsPath() { return null; }
19
+ getHookEvents() { return []; }
20
+ buildHookCommand() { return null; }
21
+ getCurrentModel() { return null; }
22
+ getAvailableModels() { return []; }
23
+ getSkills() { return null; }
24
+ async queryUsage() { return {}; }
25
+ clearUsageCache() { }
26
+ }
27
+ exports.OpencodeAdapter = OpencodeAdapter;
28
+ //# sourceMappingURL=opencode-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-adapter.js","sourceRoot":"","sources":["../../src/adapters/opencode-adapter.ts"],"names":[],"mappings":";;;AAGA,MAAa,eAAe;IAA5B;QACW,SAAI,GAAG,UAAU,CAAC;IAyB7B,CAAC;IAvBC,YAAY,CAAC,cAAuC,EAAE,gBAAyB;QAC7E,yEAAyE;QACzE,OAAO,cAAc,KAAK,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC;IACzE,CAAC;IAED,gBAAgB,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IAE7C,2DAA2D;IAC3D,aAAa,KAAoB,OAAO,IAAI,CAAC,CAAC,CAAC;IAC/C,SAAS,KAA4B,OAAO,IAAI,CAAC,CAAC,CAAC;IACnD,eAAe,KAAuB,OAAO,IAAI,CAAC,CAAC,CAAC;IAEpD,2CAA2C;IAC3C,oBAAoB,KAAoB,OAAO,IAAI,CAAC,CAAC,CAAC;IACtD,aAAa,KAAe,OAAO,EAAE,CAAC,CAAC,CAAC;IACxC,gBAAgB,KAAoB,OAAO,IAAI,CAAC,CAAC,CAAC;IAElD,eAAe,KAAoB,OAAO,IAAI,CAAC,CAAC,CAAC;IACjD,kBAAkB,KAAkB,OAAO,EAAE,CAAC,CAAC,CAAC;IAChD,SAAS,KAA4B,OAAO,IAAI,CAAC,CAAC,CAAC;IAEnD,KAAK,CAAC,UAAU,KAAyB,OAAO,EAAE,CAAC,CAAC,CAAC;IACrD,eAAe,KAAU,CAAC;CAC3B;AA1BD,0CA0BC"}
@@ -0,0 +1,19 @@
1
+ import type { CliToolAdapter, ToolModel, ToolSkillsData, UsageInfo } from './types';
2
+ import type { SessionMessage, ChatBlock } from '../session-manager';
3
+ export declare class QwenAdapter implements CliToolAdapter {
4
+ readonly tool = "qwen";
5
+ buildCommand(permissionMode: 'limited' | 'unlimited', _continueSession: boolean): string;
6
+ supportsContinue(): boolean;
7
+ getSessionDir(): string | null;
8
+ parseLine(): SessionMessage | null;
9
+ parseLineBlocks(): ChatBlock | null;
10
+ getHooksSettingsPath(): string | null;
11
+ getHookEvents(): string[];
12
+ buildHookCommand(): string | null;
13
+ getCurrentModel(): string | null;
14
+ getAvailableModels(): ToolModel[];
15
+ getSkills(): ToolSkillsData | null;
16
+ queryUsage(): Promise<UsageInfo>;
17
+ clearUsageCache(): void;
18
+ }
19
+ //# sourceMappingURL=qwen-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qwen-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/qwen-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpE,qBAAa,WAAY,YAAW,cAAc;IAChD,QAAQ,CAAC,IAAI,UAAU;IAEvB,YAAY,CAAC,cAAc,EAAE,SAAS,GAAG,WAAW,EAAE,gBAAgB,EAAE,OAAO,GAAG,MAAM;IAKxF,gBAAgB,IAAI,OAAO;IAE3B,aAAa,IAAI,MAAM,GAAG,IAAI;IAC9B,SAAS,IAAI,cAAc,GAAG,IAAI;IAClC,eAAe,IAAI,SAAS,GAAG,IAAI;IAEnC,oBAAoB,IAAI,MAAM,GAAG,IAAI;IACrC,aAAa,IAAI,MAAM,EAAE;IACzB,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAEjC,eAAe,IAAI,MAAM,GAAG,IAAI;IAChC,kBAAkB,IAAI,SAAS,EAAE;IACjC,SAAS,IAAI,cAAc,GAAG,IAAI;IAE5B,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;IACtC,eAAe,IAAI,IAAI;CACxB"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QwenAdapter = void 0;
4
+ class QwenAdapter {
5
+ constructor() {
6
+ this.tool = 'qwen';
7
+ }
8
+ buildCommand(permissionMode, _continueSession) {
9
+ // qwen-code does not support --continue
10
+ return permissionMode === 'unlimited' ? 'qwen-code --yolo' : 'qwen-code';
11
+ }
12
+ supportsContinue() { return false; }
13
+ getSessionDir() { return null; }
14
+ parseLine() { return null; }
15
+ parseLineBlocks() { return null; }
16
+ getHooksSettingsPath() { return null; }
17
+ getHookEvents() { return []; }
18
+ buildHookCommand() { return null; }
19
+ getCurrentModel() { return null; }
20
+ getAvailableModels() { return []; }
21
+ getSkills() { return null; }
22
+ async queryUsage() { return {}; }
23
+ clearUsageCache() { }
24
+ }
25
+ exports.QwenAdapter = QwenAdapter;
26
+ //# sourceMappingURL=qwen-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qwen-adapter.js","sourceRoot":"","sources":["../../src/adapters/qwen-adapter.ts"],"names":[],"mappings":";;;AAGA,MAAa,WAAW;IAAxB;QACW,SAAI,GAAG,MAAM,CAAC;IAuBzB,CAAC;IArBC,YAAY,CAAC,cAAuC,EAAE,gBAAyB;QAC7E,wCAAwC;QACxC,OAAO,cAAc,KAAK,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC;IAC3E,CAAC;IAED,gBAAgB,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IAE7C,aAAa,KAAoB,OAAO,IAAI,CAAC,CAAC,CAAC;IAC/C,SAAS,KAA4B,OAAO,IAAI,CAAC,CAAC,CAAC;IACnD,eAAe,KAAuB,OAAO,IAAI,CAAC,CAAC,CAAC;IAEpD,oBAAoB,KAAoB,OAAO,IAAI,CAAC,CAAC,CAAC;IACtD,aAAa,KAAe,OAAO,EAAE,CAAC,CAAC,CAAC;IACxC,gBAAgB,KAAoB,OAAO,IAAI,CAAC,CAAC,CAAC;IAElD,eAAe,KAAoB,OAAO,IAAI,CAAC,CAAC,CAAC;IACjD,kBAAkB,KAAkB,OAAO,EAAE,CAAC,CAAC,CAAC;IAChD,SAAS,KAA4B,OAAO,IAAI,CAAC,CAAC,CAAC;IAEnD,KAAK,CAAC,UAAU,KAAyB,OAAO,EAAE,CAAC,CAAC,CAAC;IACrD,eAAe,KAAU,CAAC;CAC3B;AAxBD,kCAwBC"}
@@ -0,0 +1,44 @@
1
+ import type { ChatBlock, SessionMessage } from '../session-manager';
2
+ export interface UsageBucket {
3
+ utilization?: number;
4
+ resetAt?: string;
5
+ }
6
+ export interface UsageInfo {
7
+ planName?: string;
8
+ fiveHour?: UsageBucket;
9
+ sevenDay?: UsageBucket;
10
+ sevenDaySonnet?: UsageBucket;
11
+ sevenDayOpus?: UsageBucket;
12
+ }
13
+ export interface ToolModel {
14
+ key: string;
15
+ label: string;
16
+ }
17
+ export interface ToolSkillItem {
18
+ command: string;
19
+ description: string;
20
+ }
21
+ export interface ToolSkillsData {
22
+ builtin: ToolSkillItem[];
23
+ custom: ToolSkillItem[];
24
+ mcp: ToolSkillItem[];
25
+ }
26
+ export interface CliToolAdapter {
27
+ readonly tool: string;
28
+ buildCommand(permissionMode: 'limited' | 'unlimited', continueSession: boolean): string;
29
+ supportsContinue(): boolean;
30
+ /** Directory where this tool stores session logs for a project, or null if unsupported */
31
+ getSessionDir(folderPath: string): string | null;
32
+ parseLine(line: string): SessionMessage | null;
33
+ parseLineBlocks(line: string): ChatBlock | null;
34
+ /** Settings file path where hooks should be installed, or null if unsupported */
35
+ getHooksSettingsPath(): string | null;
36
+ getHookEvents(): string[];
37
+ buildHookCommand(event: string, portFile: string): string | null;
38
+ getCurrentModel(): string | null;
39
+ getAvailableModels(): ToolModel[];
40
+ getSkills(): ToolSkillsData | null;
41
+ queryUsage(): Promise<UsageInfo>;
42
+ clearUsageCache(): void;
43
+ }
44
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAiB,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEnF,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,YAAY,CAAC,EAAE,WAAW,CAAC;CAC5B;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,GAAG,EAAE,aAAa,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAGtB,YAAY,CAAC,cAAc,EAAE,SAAS,GAAG,WAAW,EAAE,eAAe,EAAE,OAAO,GAAG,MAAM,CAAC;IACxF,gBAAgB,IAAI,OAAO,CAAC;IAG5B,0FAA0F;IAC1F,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACjD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAC;IAC/C,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAGhD,iFAAiF;IACjF,oBAAoB,IAAI,MAAM,GAAG,IAAI,CAAC;IACtC,aAAa,IAAI,MAAM,EAAE,CAAC;IAC1B,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAGjE,eAAe,IAAI,MAAM,GAAG,IAAI,CAAC;IACjC,kBAAkB,IAAI,SAAS,EAAE,CAAC;IAClC,SAAS,IAAI,cAAc,GAAG,IAAI,CAAC;IAGnC,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IACjC,eAAe,IAAI,IAAI,CAAC;CACzB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":""}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * HooksManager — manages ccweb entries in ~/.claude/settings.json
2
+ * HooksManager — manages ccweb entries in CLI tool settings files
3
3
  *
4
4
  * install() is idempotent: always calls uninstall() first, then adds fresh hooks.
5
5
  * This handles the crash-without-cleanup scenario correctly.
@@ -10,9 +10,13 @@
10
10
  declare class HooksManager {
11
11
  private portFile;
12
12
  constructor(portFile: string);
13
- /** Remove all ccweb hook entries (identified by CCWEB_MARKER) */
13
+ /** Remove all ccweb hook entries (identified by CCWEB_MARKER) for a specific adapter */
14
+ private uninstallForAdapter;
15
+ /** Install hooks for a specific adapter */
16
+ private installForAdapter;
17
+ /** Remove all ccweb hook entries from all supported tools */
14
18
  uninstall(): void;
15
- /** Idempotent install: remove stale entries first, then add fresh hooks */
19
+ /** Idempotent install: remove stale entries first, then add fresh hooks for all supported tools */
16
20
  install(): void;
17
21
  isInstalled(): boolean;
18
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hooks-manager.d.ts","sourceRoot":"","sources":["../src/hooks-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAuDH,cAAM,YAAY;IAChB,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAI5B,iEAAiE;IACjE,SAAS,IAAI,IAAI;IA4BjB,2EAA2E;IAC3E,OAAO,IAAI,IAAI;IAkBf,WAAW,IAAI,OAAO;CAOvB;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"hooks-manager.d.ts","sourceRoot":"","sources":["../src/hooks-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA4BH,cAAM,YAAY;IAChB,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAI5B,wFAAwF;IACxF,OAAO,CAAC,mBAAmB;IA+B3B,2CAA2C;IAC3C,OAAO,CAAC,iBAAiB;IAuBzB,6DAA6D;IAC7D,SAAS,IAAI,IAAI;IAMjB,mGAAmG;IACnG,OAAO,IAAI,IAAI;IAMf,WAAW,IAAI,OAAO;CAavB;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}