cohvu 2.21.1 → 3.0.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.
Files changed (102) hide show
  1. package/README.md +37 -0
  2. package/cli.js +15501 -0
  3. package/package.json +15 -26
  4. package/dist/__tests__/instruction-file.unit.test.d.ts +0 -1
  5. package/dist/__tests__/instruction-file.unit.test.js +0 -296
  6. package/dist/__tests__/instruction-file.unit.test.js.map +0 -1
  7. package/dist/__tests__/teardown.unit.test.d.ts +0 -1
  8. package/dist/__tests__/teardown.unit.test.js +0 -196
  9. package/dist/__tests__/teardown.unit.test.js.map +0 -1
  10. package/dist/api.d.ts +0 -292
  11. package/dist/api.js +0 -337
  12. package/dist/api.js.map +0 -1
  13. package/dist/auth.d.ts +0 -4
  14. package/dist/auth.js +0 -96
  15. package/dist/auth.js.map +0 -1
  16. package/dist/constants.d.ts +0 -2
  17. package/dist/constants.js +0 -10
  18. package/dist/constants.js.map +0 -1
  19. package/dist/index.d.ts +0 -2
  20. package/dist/index.js +0 -259
  21. package/dist/index.js.map +0 -1
  22. package/dist/instructions.d.ts +0 -33
  23. package/dist/instructions.js +0 -238
  24. package/dist/instructions.js.map +0 -1
  25. package/dist/log.d.ts +0 -6
  26. package/dist/log.js +0 -51
  27. package/dist/log.js.map +0 -1
  28. package/dist/pause.d.ts +0 -3
  29. package/dist/pause.js +0 -24
  30. package/dist/pause.js.map +0 -1
  31. package/dist/platforms.d.ts +0 -22
  32. package/dist/platforms.js +0 -79
  33. package/dist/platforms.js.map +0 -1
  34. package/dist/postinstall.d.ts +0 -2
  35. package/dist/postinstall.js +0 -11
  36. package/dist/postinstall.js.map +0 -1
  37. package/dist/proxy.d.ts +0 -1
  38. package/dist/proxy.js +0 -371
  39. package/dist/proxy.js.map +0 -1
  40. package/dist/setup.d.ts +0 -15
  41. package/dist/setup.js +0 -295
  42. package/dist/setup.js.map +0 -1
  43. package/dist/teardown.d.ts +0 -15
  44. package/dist/teardown.js +0 -235
  45. package/dist/teardown.js.map +0 -1
  46. package/dist/tui/App.d.ts +0 -1
  47. package/dist/tui/App.js +0 -2245
  48. package/dist/tui/App.js.map +0 -1
  49. package/dist/tui/components/Banner.d.ts +0 -4
  50. package/dist/tui/components/Banner.js +0 -71
  51. package/dist/tui/components/Banner.js.map +0 -1
  52. package/dist/tui/components/Divider.d.ts +0 -1
  53. package/dist/tui/components/Divider.js +0 -8
  54. package/dist/tui/components/Divider.js.map +0 -1
  55. package/dist/tui/components/Footer.d.ts +0 -4
  56. package/dist/tui/components/Footer.js +0 -214
  57. package/dist/tui/components/Footer.js.map +0 -1
  58. package/dist/tui/components/Header.d.ts +0 -4
  59. package/dist/tui/components/Header.js +0 -126
  60. package/dist/tui/components/Header.js.map +0 -1
  61. package/dist/tui/components/LockCard.d.ts +0 -17
  62. package/dist/tui/components/LockCard.js +0 -37
  63. package/dist/tui/components/LockCard.js.map +0 -1
  64. package/dist/tui/components/Modal.d.ts +0 -5
  65. package/dist/tui/components/Modal.js +0 -195
  66. package/dist/tui/components/Modal.js.map +0 -1
  67. package/dist/tui/components/TabBar.d.ts +0 -4
  68. package/dist/tui/components/TabBar.js +0 -17
  69. package/dist/tui/components/TabBar.js.map +0 -1
  70. package/dist/tui/components/Toast.d.ts +0 -4
  71. package/dist/tui/components/Toast.js +0 -9
  72. package/dist/tui/components/Toast.js.map +0 -1
  73. package/dist/tui/index.d.ts +0 -1
  74. package/dist/tui/index.js +0 -20
  75. package/dist/tui/index.js.map +0 -1
  76. package/dist/tui/platform-detect.d.ts +0 -2
  77. package/dist/tui/platform-detect.js +0 -79
  78. package/dist/tui/platform-detect.js.map +0 -1
  79. package/dist/tui/state.d.ts +0 -414
  80. package/dist/tui/state.js +0 -397
  81. package/dist/tui/state.js.map +0 -1
  82. package/dist/tui/tabs/BillingTab.d.ts +0 -5
  83. package/dist/tui/tabs/BillingTab.js +0 -72
  84. package/dist/tui/tabs/BillingTab.js.map +0 -1
  85. package/dist/tui/tabs/KeysTab.d.ts +0 -5
  86. package/dist/tui/tabs/KeysTab.js +0 -87
  87. package/dist/tui/tabs/KeysTab.js.map +0 -1
  88. package/dist/tui/tabs/KnowledgeTab.d.ts +0 -5
  89. package/dist/tui/tabs/KnowledgeTab.js +0 -143
  90. package/dist/tui/tabs/KnowledgeTab.js.map +0 -1
  91. package/dist/tui/tabs/ProjectTab.d.ts +0 -5
  92. package/dist/tui/tabs/ProjectTab.js +0 -34
  93. package/dist/tui/tabs/ProjectTab.js.map +0 -1
  94. package/dist/tui/tabs/TeamTab.d.ts +0 -5
  95. package/dist/tui/tabs/TeamTab.js +0 -57
  96. package/dist/tui/tabs/TeamTab.js.map +0 -1
  97. package/dist/tui/tabs/YouTab.d.ts +0 -5
  98. package/dist/tui/tabs/YouTab.js +0 -25
  99. package/dist/tui/tabs/YouTab.js.map +0 -1
  100. package/dist/tui/utils.d.ts +0 -6
  101. package/dist/tui/utils.js +0 -58
  102. package/dist/tui/utils.js.map +0 -1
package/dist/setup.js DELETED
@@ -1,295 +0,0 @@
1
- // Setup orchestrator — writes MCP configs and instruction files for all detected platforms.
2
- // No plugins. Everything is auto-configured.
3
- import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync, } from "fs";
4
- import { homedir } from "os";
5
- import { join, dirname } from "path";
6
- import { detectPlatforms } from "./platforms.js";
7
- import { writeMarkdownInstructions, CURSOR_RULE } from "./instructions.js";
8
- // ---------------------------------------------------------------------------
9
- // MCP config writers
10
- //
11
- // Each platform's entry is `{ command: "cohvu", args: ["--agent", <slug>] }`.
12
- // The proxy reads the `--agent` value and forwards it as `X-Cohvu-Agent`
13
- // on every tool call so the backend can record which editor initiated the
14
- // contribution. We maintain two legacy migrations:
15
- // 1. npx-based entries → direct binary (old install pattern)
16
- // 2. direct-binary entries missing `args` → add the agent arg
17
- // Both are idempotent — running setup on an up-to-date config returns "skipped".
18
- // ---------------------------------------------------------------------------
19
- /** Resolve the canonical MCP invocation for this cohvu install.
20
- *
21
- * GUI-launched editors (Cursor, Windsurf, VS Code, Claude Desktop on macOS
22
- * and Linux) spawn MCP subprocesses with a MINIMAL PATH that excludes
23
- * Homebrew, nvm, pnpm, and volta locations. A bare `"cohvu"` command
24
- * can't be found. Worse, even an absolute path to the `cohvu` shim
25
- * fails — the shim is a JS file with a `#!/usr/bin/env node` shebang,
26
- * and `env` can't find `node` under the minimal PATH either.
27
- *
28
- * The bulletproof fix: invoke node DIRECTLY with the cohvu JS file as
29
- * its script arg. No shebang, no PATH resolution, no shim.
30
- *
31
- * - `command` = process.execPath — absolute path to the node binary
32
- * currently executing this setup code. Works regardless of how node
33
- * was installed (system, homebrew, nvm, volta, asdf, etc.).
34
- * - `args[0]` = process.argv[1] — absolute path to the cohvu JS entry
35
- * file this setup code is running from. Guaranteed to be on the same
36
- * node version that the user's shell just launched successfully.
37
- *
38
- * If the user later upgrades node and the old binary path disappears,
39
- * the MCP entry will fail with a clear "command not found" in editor
40
- * logs, and a single `cohvu` run from the user's terminal rewrites the
41
- * entry with the new node path. */
42
- function resolveMcpInvocation() {
43
- const nodePath = process.execPath;
44
- const scriptPath = process.argv[1];
45
- if (nodePath && scriptPath && scriptPath.startsWith("/")) {
46
- return { command: nodePath, args: [scriptPath] };
47
- }
48
- // Fallback — should never hit this in practice (setup runs via
49
- // `cohvu` which always gives us an absolute script path).
50
- return { command: "cohvu", args: [] };
51
- }
52
- function mcpEntry(agentSlug) {
53
- const base = resolveMcpInvocation();
54
- return { command: base.command, args: [...base.args, "--agent", agentSlug] };
55
- }
56
- function jsonEntryIsUpToDate(existing, agentSlug) {
57
- const canonical = mcpEntry(agentSlug);
58
- if (existing.command !== canonical.command)
59
- return false;
60
- const args = Array.isArray(existing.args) ? existing.args : null;
61
- if (!args || args.length !== canonical.args.length)
62
- return false;
63
- for (let i = 0; i < canonical.args.length; i++) {
64
- if (args[i] !== canonical.args[i])
65
- return false;
66
- }
67
- return true;
68
- }
69
- function writeJsonMcpConfig(filePath, rootKey, agentSlug) {
70
- try {
71
- let config = {};
72
- if (existsSync(filePath)) {
73
- const raw = readFileSync(filePath, "utf-8").trim();
74
- if (raw) {
75
- try {
76
- config = JSON.parse(raw);
77
- }
78
- catch {
79
- // Malformed JSON — back up and start fresh with just cohvu
80
- copyFileSync(filePath, `${filePath}.cohvu-backup`);
81
- config = { [rootKey]: { cohvu: mcpEntry(agentSlug) } };
82
- ensureDir(dirname(filePath));
83
- writeFileSync(filePath, JSON.stringify(config, null, 2) + "\n");
84
- return "ok";
85
- }
86
- }
87
- }
88
- const servers = (config[rootKey] ?? {});
89
- const existing = servers.cohvu;
90
- // Claude Code also stores project-scoped MCP configs under
91
- // `projects.<path>.mcpServers.cohvu`. Stale entries there (from
92
- // older CLI versions, pre-fix absolute paths, or pre-PATH-fix bare
93
- // names) override the top-level config for specific projects. Sweep
94
- // them into the current canonical shape too so the user's experience
95
- // is consistent whether they're global or in a specific project.
96
- let projectsChanged = false;
97
- const projects = config.projects;
98
- if (projects && typeof projects === "object") {
99
- for (const projKey of Object.keys(projects)) {
100
- const proj = projects[projKey];
101
- if (!proj || typeof proj !== "object")
102
- continue;
103
- const projServers = proj.mcpServers;
104
- if (!projServers)
105
- continue;
106
- const projCohvu = projServers.cohvu;
107
- if (!projCohvu)
108
- continue;
109
- if (!jsonEntryIsUpToDate(projCohvu, agentSlug)) {
110
- projServers.cohvu = mcpEntry(agentSlug);
111
- proj.mcpServers = projServers;
112
- projectsChanged = true;
113
- }
114
- }
115
- }
116
- if (existing && jsonEntryIsUpToDate(existing, agentSlug) && !projectsChanged) {
117
- return "skipped";
118
- }
119
- // Any mismatch (legacy npx, direct binary without args, wrong slug,
120
- // old command) gets overwritten with the current canonical shape.
121
- servers.cohvu = mcpEntry(agentSlug);
122
- config[rootKey] = servers;
123
- ensureDir(dirname(filePath));
124
- writeFileSync(filePath, JSON.stringify(config, null, 2) + "\n");
125
- return "ok";
126
- }
127
- catch (err) {
128
- const msg = err instanceof Error ? err.message : String(err);
129
- if (msg.includes("EACCES") || msg.includes("permission"))
130
- return { failed: "permission denied" };
131
- return { failed: msg.slice(0, 60) };
132
- }
133
- }
134
- function writeTomlMcpConfig(filePath, agentSlug) {
135
- try {
136
- let content = "";
137
- if (existsSync(filePath)) {
138
- content = readFileSync(filePath, "utf-8");
139
- }
140
- const canonical = mcpEntry(agentSlug);
141
- const argsToml = canonical.args.map((a) => `"${a.replace(/"/g, '\\"')}"`).join(", ");
142
- const canonicalSection = `[mcp_servers.cohvu]\ncommand = "${canonical.command}"\nargs = [${argsToml}]\n`;
143
- if (content.includes("[mcp_servers.cohvu]")) {
144
- // Check if the existing section matches the canonical form.
145
- const sectionRegex = /\[mcp_servers\.cohvu\]\n(?:[^\n\[]*\n?)*/;
146
- const match = content.match(sectionRegex);
147
- if (match && match[0].trim() === canonicalSection.trim()) {
148
- return "skipped";
149
- }
150
- // Replace the entire [mcp_servers.cohvu] block. We match from the
151
- // header up to the next section header or EOF.
152
- content = content.replace(/\[mcp_servers\.cohvu\][\s\S]*?(?=\n\[|\n*$)/, canonicalSection.trim());
153
- writeFileSync(filePath, content);
154
- return "ok";
155
- }
156
- ensureDir(dirname(filePath));
157
- writeFileSync(filePath, content + "\n" + canonicalSection);
158
- return "ok";
159
- }
160
- catch (err) {
161
- const msg = err instanceof Error ? err.message : String(err);
162
- if (msg.includes("EACCES") || msg.includes("permission"))
163
- return { failed: "permission denied" };
164
- return { failed: msg.slice(0, 60) };
165
- }
166
- }
167
- // ---------------------------------------------------------------------------
168
- // Instruction file writers
169
- // ---------------------------------------------------------------------------
170
- function writeMdcRule(filePath) {
171
- try {
172
- if (existsSync(filePath)) {
173
- const existing = readFileSync(filePath, "utf-8");
174
- if (existing === CURSOR_RULE)
175
- return "skipped";
176
- }
177
- ensureDir(dirname(filePath));
178
- writeFileSync(filePath, CURSOR_RULE);
179
- return "ok";
180
- }
181
- catch (err) {
182
- const msg = err instanceof Error ? err.message : String(err);
183
- if (msg.includes("EACCES") || msg.includes("permission"))
184
- return { failed: "permission denied" };
185
- return { failed: msg.slice(0, 60) };
186
- }
187
- }
188
- function writeInstructionFile(filePath, format) {
189
- if (format === "mdc")
190
- return writeMdcRule(filePath);
191
- return writeMarkdownInstructions(filePath);
192
- }
193
- // ---------------------------------------------------------------------------
194
- // Permissions writer
195
- // ---------------------------------------------------------------------------
196
- function writePermissions(filePath, allowRules) {
197
- try {
198
- let config = {};
199
- if (existsSync(filePath)) {
200
- const raw = readFileSync(filePath, "utf-8").trim();
201
- if (raw) {
202
- try {
203
- config = JSON.parse(raw);
204
- }
205
- catch {
206
- copyFileSync(filePath, `${filePath}.cohvu-backup`);
207
- config = {};
208
- }
209
- }
210
- }
211
- const permissions = (config.permissions ?? {});
212
- const allow = Array.isArray(permissions.allow) ? [...permissions.allow] : [];
213
- const newRules = allowRules.filter((rule) => !allow.includes(rule));
214
- if (newRules.length === 0)
215
- return "skipped";
216
- allow.push(...newRules);
217
- permissions.allow = allow;
218
- config.permissions = permissions;
219
- ensureDir(dirname(filePath));
220
- writeFileSync(filePath, JSON.stringify(config, null, 2) + "\n");
221
- return "ok";
222
- }
223
- catch (err) {
224
- const msg = err instanceof Error ? err.message : String(err);
225
- if (msg.includes("EACCES") || msg.includes("permission"))
226
- return { failed: "permission denied" };
227
- return { failed: msg.slice(0, 60) };
228
- }
229
- }
230
- // ---------------------------------------------------------------------------
231
- // Helpers
232
- // ---------------------------------------------------------------------------
233
- function ensureDir(dir) {
234
- if (!existsSync(dir)) {
235
- mkdirSync(dir, { recursive: true });
236
- }
237
- }
238
- function resolve(relativePath) {
239
- return join(homedir(), relativePath);
240
- }
241
- // ---------------------------------------------------------------------------
242
- // Orchestrator — all platforms auto-configured, no plugins
243
- // ---------------------------------------------------------------------------
244
- export async function runSetup() {
245
- const detected = detectPlatforms();
246
- const results = [];
247
- for (const { def } of detected) {
248
- const result = {
249
- name: def.name,
250
- mcp: null,
251
- instructions: null,
252
- permissions: null,
253
- };
254
- // Write MCP config
255
- if (def.mcp) {
256
- const filePath = resolve(def.mcp.path);
257
- if (def.mcp.format === "toml") {
258
- result.mcp = writeTomlMcpConfig(filePath, def.agentSlug);
259
- }
260
- else {
261
- result.mcp = writeJsonMcpConfig(filePath, def.mcp.rootKey, def.agentSlug);
262
- }
263
- }
264
- // Write instruction file
265
- if (def.instructions) {
266
- const filePath = resolve(def.instructions.path);
267
- result.instructions = writeInstructionFile(filePath, def.instructions.format);
268
- }
269
- // Write permissions
270
- if (def.permissions) {
271
- const filePath = resolve(def.permissions.path);
272
- result.permissions = writePermissions(filePath, def.permissions.allowRules);
273
- }
274
- results.push(result);
275
- }
276
- return { platforms: results };
277
- }
278
- // ---------------------------------------------------------------------------
279
- // Silent instruction refresh — called on proxy startup
280
- // ---------------------------------------------------------------------------
281
- export function refreshInstructions() {
282
- const detected = detectPlatforms();
283
- for (const { def } of detected) {
284
- if (!def.instructions)
285
- continue;
286
- const filePath = resolve(def.instructions.path);
287
- try {
288
- writeInstructionFile(filePath, def.instructions.format);
289
- }
290
- catch {
291
- // Silent — proxy startup shouldn't fail over this
292
- }
293
- }
294
- }
295
- //# sourceMappingURL=setup.js.map
package/dist/setup.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- type StepResult = "ok" | "skipped" | {
2
- failed: string;
3
- };
4
- interface PlatformResult {
5
- name: string;
6
- mcp: StepResult | null;
7
- instructions: StepResult | null;
8
- permissions: StepResult | null;
9
- }
10
- export interface TeardownResult {
11
- platforms: PlatformResult[];
12
- credentials: StepResult;
13
- }
14
- export declare function runTeardown(): Promise<TeardownResult>;
15
- export {};
package/dist/teardown.js DELETED
@@ -1,235 +0,0 @@
1
- // Teardown — reverses what setup.ts does.
2
- // Removes Cohvu from all detected agent configs, instruction files,
3
- // permissions, and local credentials. Preserves other MCP servers.
4
- import { existsSync, readFileSync, writeFileSync, unlinkSync, } from "fs";
5
- import { homedir } from "os";
6
- import { join } from "path";
7
- import { detectPlatforms } from "./platforms.js";
8
- import { removeMarkdownInstructions } from "./instructions.js";
9
- import { ApiClient } from "./api.js";
10
- import { getApiKey } from "./auth.js";
11
- // ---------------------------------------------------------------------------
12
- // MCP config removers
13
- // ---------------------------------------------------------------------------
14
- function removeJsonMcpEntry(filePath, rootKey) {
15
- try {
16
- if (!existsSync(filePath))
17
- return "skipped";
18
- const raw = readFileSync(filePath, "utf-8").trim();
19
- if (!raw)
20
- return "skipped";
21
- let config;
22
- try {
23
- config = JSON.parse(raw);
24
- }
25
- catch {
26
- return { failed: "could not parse JSON" };
27
- }
28
- // Remove the top-level cohvu entry.
29
- let removedAny = false;
30
- const servers = config[rootKey];
31
- if (servers && servers.cohvu) {
32
- delete servers.cohvu;
33
- config[rootKey] = servers;
34
- removedAny = true;
35
- }
36
- // Claude Code also stores project-scoped MCP configs under
37
- // `projects.<path>.mcpServers.cohvu`. These survive a top-level
38
- // removal and pollute future installs (stale commands after CLI
39
- // upgrades, stale absolute paths after node upgrades, etc.). Walk
40
- // every `projects.*` entry and strip cohvu from its mcpServers too.
41
- const projects = config.projects;
42
- if (projects && typeof projects === "object") {
43
- for (const projKey of Object.keys(projects)) {
44
- const proj = projects[projKey];
45
- if (!proj || typeof proj !== "object")
46
- continue;
47
- const projServers = proj.mcpServers;
48
- if (projServers && projServers.cohvu) {
49
- delete projServers.cohvu;
50
- proj.mcpServers = projServers;
51
- removedAny = true;
52
- }
53
- }
54
- }
55
- if (!removedAny)
56
- return "skipped";
57
- writeFileSync(filePath, JSON.stringify(config, null, 2) + "\n");
58
- return "ok";
59
- }
60
- catch (err) {
61
- return { failed: (err instanceof Error ? err.message : String(err)).slice(0, 60) };
62
- }
63
- }
64
- function removeTomlMcpEntry(filePath) {
65
- try {
66
- if (!existsSync(filePath))
67
- return "skipped";
68
- const content = readFileSync(filePath, "utf-8");
69
- // Match the base `[mcp_servers.cohvu]` section OR any nested section
70
- // like `[mcp_servers.cohvu.tools.understand]`. A previous setup may
71
- // have left per-tool approval sub-sections behind; those need to go
72
- // too so a fresh install doesn't inherit stale tool-level config.
73
- const hasCohvu = /\[mcp_servers\.cohvu(\.[^\]]*)?\]/.test(content);
74
- if (!hasCohvu)
75
- return "skipped";
76
- const lines = content.split("\n");
77
- const result = [];
78
- let skipping = false;
79
- for (const line of lines) {
80
- // Start skipping when we see any [mcp_servers.cohvu...] header.
81
- if (/^\[mcp_servers\.cohvu(\.[^\]]*)?\]\s*$/.test(line.trim())) {
82
- skipping = true;
83
- continue;
84
- }
85
- // Stop skipping when the next non-cohvu section starts.
86
- if (skipping && line.trim().startsWith("[") && !/^\[mcp_servers\.cohvu(\.[^\]]*)?\]/.test(line.trim())) {
87
- skipping = false;
88
- }
89
- if (!skipping) {
90
- result.push(line);
91
- }
92
- }
93
- const cleaned = result.join("\n").replace(/\n{3,}/g, "\n\n").trim() + "\n";
94
- writeFileSync(filePath, cleaned);
95
- return "ok";
96
- }
97
- catch (err) {
98
- return { failed: (err instanceof Error ? err.message : String(err)).slice(0, 60) };
99
- }
100
- }
101
- // ---------------------------------------------------------------------------
102
- // Instruction removers
103
- // ---------------------------------------------------------------------------
104
- function removeMdcRule(filePath) {
105
- try {
106
- if (!existsSync(filePath))
107
- return "skipped";
108
- unlinkSync(filePath);
109
- return "ok";
110
- }
111
- catch (err) {
112
- return { failed: (err instanceof Error ? err.message : String(err)).slice(0, 60) };
113
- }
114
- }
115
- function removeInstructions(filePath, format) {
116
- if (format === "mdc")
117
- return removeMdcRule(filePath);
118
- return removeMarkdownInstructions(filePath);
119
- }
120
- // ---------------------------------------------------------------------------
121
- // Permissions remover
122
- // ---------------------------------------------------------------------------
123
- function removePermissions(filePath) {
124
- try {
125
- if (!existsSync(filePath))
126
- return "skipped";
127
- const raw = readFileSync(filePath, "utf-8").trim();
128
- if (!raw)
129
- return "skipped";
130
- let config;
131
- try {
132
- config = JSON.parse(raw);
133
- }
134
- catch {
135
- return { failed: "could not parse JSON" };
136
- }
137
- const permissions = config.permissions;
138
- if (!permissions)
139
- return "skipped";
140
- const allow = Array.isArray(permissions.allow) ? [...permissions.allow] : [];
141
- const filtered = allow.filter((rule) => !rule.startsWith("mcp__cohvu__"));
142
- if (filtered.length === allow.length)
143
- return "skipped";
144
- permissions.allow = filtered;
145
- config.permissions = permissions;
146
- writeFileSync(filePath, JSON.stringify(config, null, 2) + "\n");
147
- return "ok";
148
- }
149
- catch (err) {
150
- return { failed: (err instanceof Error ? err.message : String(err)).slice(0, 60) };
151
- }
152
- }
153
- // ---------------------------------------------------------------------------
154
- // Local state
155
- // ---------------------------------------------------------------------------
156
- function deleteFile(path) {
157
- try {
158
- if (!existsSync(path))
159
- return false;
160
- unlinkSync(path);
161
- return true;
162
- }
163
- catch {
164
- return false;
165
- }
166
- }
167
- // ---------------------------------------------------------------------------
168
- // Orchestrator
169
- // ---------------------------------------------------------------------------
170
- function resolve(relativePath) {
171
- return join(homedir(), relativePath);
172
- }
173
- export async function runTeardown() {
174
- const detected = detectPlatforms();
175
- const results = [];
176
- for (const { def } of detected) {
177
- const result = {
178
- name: def.name,
179
- mcp: null,
180
- instructions: null,
181
- permissions: null,
182
- };
183
- if (def.mcp) {
184
- const filePath = resolve(def.mcp.path);
185
- if (def.mcp.format === "toml") {
186
- result.mcp = removeTomlMcpEntry(filePath);
187
- }
188
- else {
189
- result.mcp = removeJsonMcpEntry(filePath, def.mcp.rootKey);
190
- }
191
- }
192
- if (def.instructions) {
193
- const filePath = resolve(def.instructions.path);
194
- result.instructions = removeInstructions(filePath, def.instructions.format);
195
- }
196
- if (def.permissions) {
197
- const filePath = resolve(def.permissions.path);
198
- result.permissions = removePermissions(filePath);
199
- }
200
- results.push(result);
201
- }
202
- // Revoke the current session key server-side before deleting the local
203
- // credentials file. "Disconnected" should mean the server considers this
204
- // installation gone — not just the local bits cleaned up. Best effort:
205
- // if the server is unreachable, proceed with local cleanup. The key can
206
- // always be revoked later from another session.
207
- await revokeCurrentSessionKey();
208
- // Delete local state
209
- const home = homedir();
210
- deleteFile(join(home, ".cohvu", "credentials"));
211
- deleteFile(join(home, ".cohvu", "paused"));
212
- return {
213
- platforms: results,
214
- credentials: "ok",
215
- };
216
- }
217
- async function revokeCurrentSessionKey() {
218
- const rawKey = getApiKey();
219
- if (!rawKey || !rawKey.startsWith("chv_"))
220
- return;
221
- const prefix = rawKey.slice(4, 12);
222
- try {
223
- const client = new ApiClient();
224
- const keys = await client.listSessionKeys();
225
- const mine = keys.find((k) => k.key_prefix === prefix);
226
- if (mine) {
227
- await client.deleteApiKey(mine.id);
228
- }
229
- }
230
- catch {
231
- // Non-critical: server unreachable or auth failed. Local cleanup
232
- // continues; a returning user can revoke the key from the dashboard.
233
- }
234
- }
235
- //# sourceMappingURL=teardown.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"teardown.js","sourceRoot":"","sources":["../src/teardown.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,oEAAoE;AACpE,mEAAmE;AAEnE,OAAO,EACL,UAAU,EACV,YAAY,EACZ,aAAa,EACb,UAAU,GAEX,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAW,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAgBtC,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,SAAS,kBAAkB,CAAC,QAAgB,EAAE,OAAe;IAC3D,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,SAAS,CAAC;QAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAE3B,IAAI,MAA+B,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;QAC5C,CAAC;QAED,oCAAoC;QACpC,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAwC,CAAC;QACvE,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7B,OAAO,OAAO,CAAC,KAAK,CAAC;YACrB,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;YAC1B,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;QAED,2DAA2D;QAC3D,gEAAgE;QAChE,gEAAgE;QAChE,kEAAkE;QAClE,oEAAoE;QACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAA+C,CAAC;QACxE,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC7C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAwC,CAAC;gBACtE,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,SAAS;gBAChD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAiD,CAAC;gBAC3E,IAAI,WAAW,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;oBACrC,OAAO,WAAW,CAAC,KAAK,CAAC;oBACzB,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC;oBAC9B,UAAU,GAAG,IAAI,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,UAAU;YAAE,OAAO,SAAS,CAAC;QAElC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACrF,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,SAAS,CAAC;QAE5C,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,qEAAqE;QACrE,oEAAoE;QACpE,oEAAoE;QACpE,kEAAkE;QAClE,MAAM,QAAQ,GAAG,mCAAmC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QAEhC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,gEAAgE;YAChE,IAAI,wCAAwC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC/D,QAAQ,GAAG,IAAI,CAAC;gBAChB,SAAS;YACX,CAAC;YACD,wDAAwD;YACxD,IAAI,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBACvG,QAAQ,GAAG,KAAK,CAAC;YACnB,CAAC;YACD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;QAC3E,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACrF,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,SAAS,aAAa,CAAC,QAAgB;IACrC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,SAAS,CAAC;QAC5C,UAAU,CAAC,QAAQ,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACrF,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB,EAAE,MAA0B;IACtE,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC;IACrD,OAAO,0BAA0B,CAAC,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,SAAS,iBAAiB,CAAC,QAAgB;IACzC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,SAAS,CAAC;QAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAE3B,IAAI,MAA+B,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;QAC5C,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,WAAkD,CAAC;QAC9E,IAAI,CAAC,WAAW;YAAE,OAAO,SAAS,CAAC;QAEnC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QACzF,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;QAC1E,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAEvD,WAAW,CAAC,KAAK,GAAG,QAAQ,CAAC;QAC7B,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;QAEjC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACrF,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACpC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,SAAS,OAAO,CAAC,YAAoB;IACnC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,MAAM,OAAO,GAAqB,EAAE,CAAC;IAErC,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAmB;YAC7B,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,GAAG,EAAE,IAAI;YACT,YAAY,EAAE,IAAI;YAClB,WAAW,EAAE,IAAI;SAClB,CAAC;QAEF,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;YACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC9B,MAAM,CAAC,GAAG,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,GAAG,kBAAkB,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,CAAC,YAAY,GAAG,kBAAkB,CAAC,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,uEAAuE;IACvE,yEAAyE;IACzE,uEAAuE;IACvE,wEAAwE;IACxE,gDAAgD;IAChD,MAAM,uBAAuB,EAAE,CAAC;IAEhC,qBAAqB;IACrB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IAChD,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE3C,OAAO;QACL,SAAS,EAAE,OAAO;QAClB,WAAW,EAAE,IAAI;KAClB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,uBAAuB;IACpC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO;IAClD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC;QACvD,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;QACjE,qEAAqE;IACvE,CAAC;AACH,CAAC"}
package/dist/tui/App.d.ts DELETED
@@ -1 +0,0 @@
1
- export default function App(): import("react/jsx-runtime").JSX.Element;