@tom2012/cc-web 2026.4.19-u → 2026.4.19-w

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 (57) hide show
  1. package/README.md +1 -1
  2. package/backend/dist/adapters/claude-adapter.d.ts.map +1 -1
  3. package/backend/dist/adapters/claude-adapter.js +48 -5
  4. package/backend/dist/adapters/claude-adapter.js.map +1 -1
  5. package/backend/dist/crypto-at-rest.d.ts +8 -0
  6. package/backend/dist/crypto-at-rest.d.ts.map +1 -0
  7. package/backend/dist/crypto-at-rest.js +96 -0
  8. package/backend/dist/crypto-at-rest.js.map +1 -0
  9. package/backend/dist/hub-auth.d.ts +12 -0
  10. package/backend/dist/hub-auth.d.ts.map +1 -0
  11. package/backend/dist/hub-auth.js +123 -0
  12. package/backend/dist/hub-auth.js.map +1 -0
  13. package/backend/dist/index.d.ts.map +1 -1
  14. package/backend/dist/index.js +2 -0
  15. package/backend/dist/index.js.map +1 -1
  16. package/backend/dist/memory-prompts.d.ts +30 -0
  17. package/backend/dist/memory-prompts.d.ts.map +1 -0
  18. package/backend/dist/memory-prompts.js +163 -0
  19. package/backend/dist/memory-prompts.js.map +1 -0
  20. package/backend/dist/routes/claude.d.ts.map +1 -1
  21. package/backend/dist/routes/claude.js +98 -0
  22. package/backend/dist/routes/claude.js.map +1 -1
  23. package/backend/dist/routes/memory-prompts.d.ts +3 -0
  24. package/backend/dist/routes/memory-prompts.d.ts.map +1 -0
  25. package/backend/dist/routes/memory-prompts.js +49 -0
  26. package/backend/dist/routes/memory-prompts.js.map +1 -0
  27. package/backend/dist/routes/skillhub.d.ts.map +1 -1
  28. package/backend/dist/routes/skillhub.js +170 -0
  29. package/backend/dist/routes/skillhub.js.map +1 -1
  30. package/backend/dist/session-manager.d.ts +12 -0
  31. package/backend/dist/session-manager.d.ts.map +1 -1
  32. package/backend/dist/session-manager.js.map +1 -1
  33. package/backend/dist/sync-service.d.ts.map +1 -1
  34. package/backend/dist/sync-service.js +7 -2
  35. package/backend/dist/sync-service.js.map +1 -1
  36. package/frontend/dist/assets/AssistantMessageContent-ZKbU1jlC.js +13 -0
  37. package/frontend/dist/assets/{GraphPreview-UVA4ODDv.js → GraphPreview-FNlubgv_.js} +1 -1
  38. package/frontend/dist/assets/{MobilePage-8bMFdgD9.js → MobilePage-C0xGtLMa.js} +3 -3
  39. package/frontend/dist/assets/{OfficePreview-DFa568OD.js → OfficePreview-THZQ5px4.js} +2 -2
  40. package/frontend/dist/assets/{ProjectPage-D23Cx4LX.js → ProjectPage-CTEe2Tdp.js} +5 -5
  41. package/frontend/dist/assets/SettingsPage-DAflwmGB.js +13 -0
  42. package/frontend/dist/assets/{SkillHubPage-BBWaNxzY.js → SkillHubPage-PxI0FGcw.js} +3 -3
  43. package/frontend/dist/assets/{chevron-down-XjVVezAn.js → chevron-down-DtcZkqFf.js} +1 -1
  44. package/frontend/dist/assets/chevron-up-CUW9T6yb.js +13 -0
  45. package/frontend/dist/assets/{index-Qowsi3Ey.js → index-D1P-udhw.js} +2 -2
  46. package/frontend/dist/assets/index-DCiTw3F5.css +1 -0
  47. package/frontend/dist/assets/index-fJX6wxPU.js +75 -0
  48. package/frontend/dist/assets/{index-Cz7UGH1l.js → index-rGoP4nhR.js} +1 -1
  49. package/frontend/dist/assets/{jszip.min-BvfmA-CV.js → jszip.min-Dz4RfJJo.js} +1 -1
  50. package/frontend/dist/assets/{search-CdJtkP3F.js → search-28CWGQwO.js} +1 -1
  51. package/frontend/dist/index.html +2 -2
  52. package/package.json +1 -1
  53. package/frontend/dist/assets/AssistantMessageContent-DuOuKxgH.js +0 -13
  54. package/frontend/dist/assets/SettingsPage-CTTCafJA.js +0 -13
  55. package/frontend/dist/assets/chevron-up-BD4j4icv.js +0 -7
  56. package/frontend/dist/assets/index-BL3iZx_u.css +0 -1
  57. package/frontend/dist/assets/index-hLxTQaCY.js +0 -75
@@ -0,0 +1,163 @@
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.listMemoryPrompts = listMemoryPrompts;
37
+ exports.toggleMemoryPrompt = toggleMemoryPrompt;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const agent_prompts_1 = require("./agent-prompts");
41
+ function memoryDir(folderPath) {
42
+ return path.join(folderPath, '.ccweb', 'memory');
43
+ }
44
+ /** The START/END markers are emitted as plain-text lines — the user asked
45
+ * for this exact format so they remain easily searchable in CLAUDE.md. */
46
+ function markerStart(name) { return `START ${name}`; }
47
+ function markerEnd(name) { return `END ${name}`; }
48
+ /** Escape user-supplied memory name for use inside a RegExp. */
49
+ function reEscape(s) {
50
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
51
+ }
52
+ /** Regex matching one complete `START <name>\n<body>\nEND <name>` block,
53
+ * including any immediately surrounding blank lines, so removal collapses
54
+ * the space cleanly. */
55
+ function blockRegex(name) {
56
+ const n = reEscape(name);
57
+ // Eats: optional leading \n+, START <name> line, any body (non-greedy),
58
+ // END <name> line, optional trailing \n+.
59
+ return new RegExp(`\\n*^START ${n}$[\\s\\S]*?^END ${n}$\\n*`, 'm');
60
+ }
61
+ function previewOf(content) {
62
+ const line = content.split('\n').find((l) => l.trim()) ?? '';
63
+ return line.trim().slice(0, 200);
64
+ }
65
+ // ── Listing ─────────────────────────────────────────────────────────────────
66
+ function listMemoryPrompts(folderPath) {
67
+ const dir = memoryDir(folderPath);
68
+ let files = [];
69
+ try {
70
+ files = fs.readdirSync(dir).filter((f) => f.endsWith('.md'));
71
+ }
72
+ catch {
73
+ return []; // dir missing is normal
74
+ }
75
+ const claudeMd = (0, agent_prompts_1.readClaudeMd)(folderPath);
76
+ const out = [];
77
+ for (const filename of files) {
78
+ const name = filename.replace(/\.md$/, '');
79
+ const filePath = path.join(dir, filename);
80
+ // Skip symlinks to protect against a file in memory/ pointing at /etc etc.
81
+ let stat;
82
+ try {
83
+ stat = fs.lstatSync(filePath);
84
+ }
85
+ catch {
86
+ continue;
87
+ }
88
+ if (!stat || !stat.isFile())
89
+ continue;
90
+ let preview = '';
91
+ try {
92
+ const content = fs.readFileSync(filePath, 'utf-8');
93
+ preview = previewOf(content);
94
+ }
95
+ catch { /* unreadable — still list it with empty preview */ }
96
+ const inserted = blockRegex(name).test(claudeMd);
97
+ out.push({ filename, name, preview, inserted });
98
+ }
99
+ out.sort((a, b) => a.name.localeCompare(b.name));
100
+ return out;
101
+ }
102
+ function toggleMemoryPrompt(folderPath, filename, action) {
103
+ // Guard filename — reject anything that could escape memory/ via the name.
104
+ if (!filename || filename.includes('/') || filename.includes('\\') || filename.includes('\0')) {
105
+ return { ok: false, changed: false, inserted: false, reason: 'invalid-filename' };
106
+ }
107
+ if (!filename.endsWith('.md')) {
108
+ return { ok: false, changed: false, inserted: false, reason: 'not-md' };
109
+ }
110
+ const name = filename.replace(/\.md$/, '');
111
+ const filePath = path.join(memoryDir(folderPath), filename);
112
+ let claudeMd = (0, agent_prompts_1.readClaudeMd)(folderPath);
113
+ const re = blockRegex(name);
114
+ const currentlyInserted = re.test(claudeMd);
115
+ if (action === 'remove') {
116
+ if (!currentlyInserted) {
117
+ return { ok: true, changed: false, inserted: false, reason: 'not-present' };
118
+ }
119
+ claudeMd = claudeMd.replace(re, '\n\n');
120
+ // Collapse any runs of 3+ blank lines left behind into 2
121
+ claudeMd = claudeMd.replace(/\n{3,}/g, '\n\n');
122
+ (0, agent_prompts_1.writeClaudeMd)(folderPath, claudeMd);
123
+ return { ok: true, changed: true, inserted: false };
124
+ }
125
+ // Insert (or refresh in place). Symlink guard mirrors `listMemoryPrompts`
126
+ // so a client can't bypass the list's lstat filter by posting a filename
127
+ // not currently in the list — e.g. an attacker placing `evil.md → /etc/...`
128
+ // and toggling it directly would otherwise leak the target into CLAUDE.md.
129
+ let stat;
130
+ try {
131
+ stat = fs.lstatSync(filePath);
132
+ }
133
+ catch {
134
+ return { ok: false, changed: false, inserted: false, reason: 'file-not-found' };
135
+ }
136
+ if (!stat.isFile()) {
137
+ return { ok: false, changed: false, inserted: false, reason: 'not-regular-file' };
138
+ }
139
+ let content;
140
+ try {
141
+ content = fs.readFileSync(filePath, 'utf-8');
142
+ }
143
+ catch {
144
+ return { ok: false, changed: false, inserted: false, reason: 'file-not-found' };
145
+ }
146
+ // Always normalize trailing newline for clean substitution
147
+ const body = content.replace(/\r\n/g, '\n').replace(/\n+$/, '');
148
+ const block = `${markerStart(name)}\n${body}\n${markerEnd(name)}`;
149
+ if (currentlyInserted) {
150
+ // Refresh: replace existing block with fresh content (content file may
151
+ // have been edited since last insert).
152
+ claudeMd = claudeMd.replace(re, `\n\n${block}\n\n`);
153
+ claudeMd = claudeMd.replace(/\n{3,}/g, '\n\n');
154
+ (0, agent_prompts_1.writeClaudeMd)(folderPath, claudeMd);
155
+ return { ok: true, changed: true, inserted: true, reason: 'refreshed' };
156
+ }
157
+ // Append with separating blank line if CLAUDE.md doesn't already end with one
158
+ const sep = claudeMd.length === 0 ? '' : claudeMd.endsWith('\n\n') ? '' : claudeMd.endsWith('\n') ? '\n' : '\n\n';
159
+ claudeMd = claudeMd + sep + block + '\n';
160
+ (0, agent_prompts_1.writeClaudeMd)(folderPath, claudeMd);
161
+ return { ok: true, changed: true, inserted: true };
162
+ }
163
+ //# sourceMappingURL=memory-prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-prompts.js","sourceRoot":"","sources":["../src/memory-prompts.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/routes/claude.ts"],"names":[],"mappings":"AAcA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAuCxB,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/routes/claude.ts"],"names":[],"mappings":"AAkBA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAkGxB,eAAe,MAAM,CAAC"}
@@ -1,8 +1,45 @@
1
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
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  const express_1 = require("express");
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
4
40
  const adapters_1 = require("../adapters");
5
41
  const config_1 = require("../config");
42
+ const config_2 = require("../config");
6
43
  const VALID_TOOLS = ['claude', 'opencode', 'codex', 'qwen', 'gemini', 'terminal'];
7
44
  function parseTool(req) {
8
45
  const raw = req.query.tool;
@@ -16,6 +53,67 @@ router.get('/model', (req, res) => {
16
53
  const model = adapter.getCurrentModel();
17
54
  res.json({ model: model ?? null });
18
55
  });
56
+ /**
57
+ * PUT /model body: { model: string }
58
+ *
59
+ * Persists the model choice into `~/.claude/settings.json`'s top-level
60
+ * `model` field. In-session switching still happens via sending `/model <x>`
61
+ * to the TUI; this write guarantees that a subsequent `claude` invocation
62
+ * (restart / ccweb wake) picks up the chosen alias as the default.
63
+ *
64
+ * The existing settings.json is merged rather than replaced — hooks,
65
+ * mcpServers, and other user fields are preserved. Only applicable to the
66
+ * `claude` adapter; other tools have their own config files.
67
+ */
68
+ router.put('/model', (req, res) => {
69
+ const tool = parseTool(req);
70
+ if (tool !== 'claude') {
71
+ res.status(400).json({ error: 'Persisting model is only implemented for the claude adapter' });
72
+ return;
73
+ }
74
+ const body = (req.body ?? {});
75
+ const raw = typeof body.model === 'string' ? body.model.trim() : '';
76
+ // Whitelist: known aliases, `opus[1m]` / `sonnet[1m]` bracket forms, or a
77
+ // model-like ID `claude-<family>-<ver>`. Refusing arbitrary free-form text
78
+ // prevents injection via JSON-in-settings surprises.
79
+ const OK_RE = /^([a-z]+(\[[a-z0-9-]+\])?|claude-[a-z0-9]+-[a-z0-9-]+)$/i;
80
+ if (!raw || !OK_RE.test(raw) || raw.length > 64) {
81
+ res.status(400).json({ error: 'invalid model alias' });
82
+ return;
83
+ }
84
+ const settingsPath = path.join(os.homedir(), '.claude', 'settings.json');
85
+ let settings = {};
86
+ try {
87
+ if (fs.existsSync(settingsPath)) {
88
+ const parsed = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
89
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
90
+ settings = parsed;
91
+ }
92
+ else {
93
+ // Refuse to clobber a non-object settings.json (user error, malformed
94
+ // migration, test fixture, etc.) — better to bail than stringify
95
+ // `[...] + {model:...}` into something Claude Code can't parse.
96
+ res.status(500).json({ error: 'settings.json is not an object — refusing to write `model` field' });
97
+ return;
98
+ }
99
+ }
100
+ }
101
+ catch {
102
+ res.status(500).json({ error: 'Failed to read ~/.claude/settings.json' });
103
+ return;
104
+ }
105
+ settings.model = raw;
106
+ try {
107
+ const dir = path.dirname(settingsPath);
108
+ if (!fs.existsSync(dir))
109
+ fs.mkdirSync(dir, { recursive: true });
110
+ (0, config_2.atomicWriteSync)(settingsPath, JSON.stringify(settings, null, 2));
111
+ res.json({ ok: true, model: raw });
112
+ }
113
+ catch (err) {
114
+ res.status(500).json({ error: `Failed to write settings: ${err.message}` });
115
+ }
116
+ });
19
117
  router.get('/models', (req, res) => {
20
118
  const adapter = (0, adapters_1.getAdapter)(parseTool(req));
21
119
  res.json(adapter.getAvailableModels());
@@ -1 +1 @@
1
- {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/routes/claude.ts"],"names":[],"mappings":";;AAAA,qCAA2C;AAC3C,0CAAyC;AACzC,sCAAuD;AAIvD,MAAM,WAAW,GAAc,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAE7F,SAAS,SAAS,CAAC,GAAiC;IAClD,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,IAA0B,CAAC;IACjD,IAAI,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAc,CAAC;QAAE,OAAO,GAAc,CAAC;IACvE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAChC,MAAM,OAAO,GAAG,IAAA,qBAAU,EAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IACxC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,IAAA,qBAAU,EAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,wEAAwE;AACxE,2EAA2E;AAC3E,uEAAuE;AACvE,qEAAqE;AACrE,8DAA8D;AAC9D,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAgB,EAAE,GAAa,EAAE,EAAE;IACxD,MAAM,OAAO,GAAG,IAAA,qBAAU,EAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5F,IAAI,WAA+B,CAAC;IACpC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,IAAA,mBAAU,EAAC,SAAS,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,CAAC;YAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC/E,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QACpE,IAAI,CAAC,IAAA,uBAAc,EAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IACnC,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC9C,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEH,kBAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/routes/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=memory-prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-prompts.d.ts","sourceRoot":"","sources":["../../src/routes/memory-prompts.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,MAAM,4CAAW,CAAC;AA2CxB,eAAe,MAAM,CAAC"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const express_1 = require("express");
4
+ const config_1 = require("../config");
5
+ const memory_prompts_1 = require("../memory-prompts");
6
+ const router = (0, express_1.Router)();
7
+ /** Same permission gate as `routes/agent-prompts.ts` — admin, owner, or a
8
+ * share with `edit` permission may toggle CLAUDE.md state. */
9
+ function resolveProjectFolder(projectId, username, res) {
10
+ const project = (0, config_1.getProject)(projectId);
11
+ if (!project) {
12
+ res.status(404).json({ error: 'Project not found' });
13
+ return null;
14
+ }
15
+ if (!(0, config_1.isAdminUser)(username) &&
16
+ !(0, config_1.isProjectOwner)(project, username) &&
17
+ !project.shares?.some((s) => s.username === username && s.permission === 'edit')) {
18
+ res.status(403).json({ error: 'Access denied' });
19
+ return null;
20
+ }
21
+ return project.folderPath;
22
+ }
23
+ // GET /api/memory/project/:projectId
24
+ // → { items: MemoryPromptItem[] }
25
+ router.get('/project/:projectId', (req, res) => {
26
+ const folder = resolveProjectFolder(req.params.projectId, req.user?.username || '', res);
27
+ if (!folder)
28
+ return;
29
+ res.json({ items: (0, memory_prompts_1.listMemoryPrompts)(folder) });
30
+ });
31
+ // POST /api/memory/project/:projectId/toggle body: { filename, action }
32
+ router.post('/project/:projectId/toggle', (req, res) => {
33
+ const folder = resolveProjectFolder(req.params.projectId, req.user?.username || '', res);
34
+ if (!folder)
35
+ return;
36
+ const { filename, action } = (req.body ?? {});
37
+ if (typeof filename !== 'string' || !filename) {
38
+ res.status(400).json({ error: 'filename is required' });
39
+ return;
40
+ }
41
+ if (action !== 'insert' && action !== 'remove') {
42
+ res.status(400).json({ error: 'action must be "insert" or "remove"' });
43
+ return;
44
+ }
45
+ const result = (0, memory_prompts_1.toggleMemoryPrompt)(folder, filename, action);
46
+ res.json(result);
47
+ });
48
+ exports.default = router;
49
+ //# sourceMappingURL=memory-prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-prompts.js","sourceRoot":"","sources":["../../src/routes/memory-prompts.ts"],"names":[],"mappings":";;AAAA,qCAA2C;AAE3C,sCAAoE;AACpE,sDAA0E;AAE1E,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB;+DAC+D;AAC/D,SAAS,oBAAoB,CAAC,SAAiB,EAAE,QAAgB,EAAE,GAAa;IAC9E,MAAM,OAAO,GAAG,IAAA,mBAAU,EAAC,SAAS,CAAC,CAAC;IACtC,IAAI,CAAC,OAAO,EAAE,CAAC;QAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IACpF,IACE,CAAC,IAAA,oBAAW,EAAC,QAAQ,CAAC;QACtB,CAAC,IAAA,uBAAc,EAAC,OAAO,EAAE,QAAQ,CAAC;QAClC,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,EAChF,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,OAAO,CAAC,UAAU,CAAC;AAC5B,CAAC;AAED,qCAAqC;AACrC,kCAAkC;AAClC,MAAM,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,GAAgB,EAAE,GAAa,EAAQ,EAAE;IAC1E,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IACzF,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAA,kCAAiB,EAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,yEAAyE;AACzE,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,CAAC,GAAgB,EAAE,GAAa,EAAQ,EAAE;IAClF,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IACzF,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAA6C,CAAC;IAC1F,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;QACxD,OAAO;IACT,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC,CAAC;QACvE,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,IAAA,mCAAkB,EAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5D,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACnB,CAAC,CAAC,CAAC;AAEH,kBAAe,MAAM,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"skillhub.d.ts","sourceRoot":"","sources":["../../src/routes/skillhub.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AAEH,QAAA,MAAM,MAAM,4CAAW,CAAC;AAmDxB,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,GAAG,cAAc,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;CACd;AAiLD,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"skillhub.d.ts","sourceRoot":"","sources":["../../src/routes/skillhub.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;GAeG;AAEH,QAAA,MAAM,MAAM,4CAAW,CAAC;AAuFxB,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,GAAG,cAAc,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;CACd;AAgUD,eAAe,MAAM,CAAC"}
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  const express_1 = require("express");
37
37
  const https = __importStar(require("https"));
38
38
  const yaml = __importStar(require("js-yaml"));
39
+ const hub_auth_1 = require("../hub-auth");
39
40
  /**
40
41
  * CCWeb Hub proxy.
41
42
  *
@@ -96,6 +97,42 @@ function request(url, accept, maxRedirects = 5) {
96
97
  }
97
98
  const apiGet = (url) => request(url, 'application/vnd.github.v3+json');
98
99
  const rawGet = (url) => request(url, '*/*');
100
+ /** POST to GitHub API with an Authorization: Bearer token. Used for Issue
101
+ * creation under the caller's own PAT — the token never lives on the
102
+ * server beyond the duration of this call's Bearer header. */
103
+ function apiPost(urlPath, token, body) {
104
+ const url = new URL(`${API_BASE}${urlPath}`);
105
+ const postData = JSON.stringify(body);
106
+ return new Promise((resolve, reject) => {
107
+ const req = https.request({
108
+ hostname: url.hostname,
109
+ path: url.pathname + url.search,
110
+ method: 'POST',
111
+ headers: {
112
+ 'User-Agent': 'CCWeb',
113
+ 'Accept': 'application/vnd.github.v3+json',
114
+ 'Authorization': `Bearer ${token}`,
115
+ 'Content-Type': 'application/json',
116
+ 'Content-Length': Buffer.byteLength(postData),
117
+ },
118
+ }, (res) => {
119
+ let data = '';
120
+ res.on('data', (chunk) => { data += chunk; });
121
+ res.on('end', () => {
122
+ if (res.statusCode && res.statusCode >= 400) {
123
+ reject(new Error(`GitHub API ${res.statusCode}: ${data.slice(0, 300)}`));
124
+ }
125
+ else {
126
+ resolve(data);
127
+ }
128
+ });
129
+ res.on('error', reject);
130
+ });
131
+ req.on('error', reject);
132
+ req.write(postData);
133
+ req.end();
134
+ });
135
+ }
99
136
  function parseMarkdown(raw) {
100
137
  // Recognize `---\n<yaml>\n---\n<body>`; anything else → whole file is body.
101
138
  const match = raw.match(/^---\s*\n([\s\S]*?)\n---\s*\n?([\s\S]*)$/);
@@ -231,6 +268,139 @@ router.get('/skills', async (_req, res) => {
231
268
  res.status(502).json({ error: 'Failed to fetch ccweb-hub', detail: err.message });
232
269
  }
233
270
  });
271
+ // ── Hub auth (per-user GitHub PAT for one-click Issue submit) ──────────────
272
+ function requireUsername(req, res) {
273
+ const u = req.user?.username;
274
+ if (!u) {
275
+ res.status(401).json({ error: 'Unauthenticated' });
276
+ return null;
277
+ }
278
+ return u;
279
+ }
280
+ // GET /auth → { configured, needsReset }
281
+ router.get('/auth', (req, res) => {
282
+ const user = requireUsername(req, res);
283
+ if (!user)
284
+ return;
285
+ res.json((0, hub_auth_1.getHubTokenStatus)(user));
286
+ });
287
+ // PUT /auth body { token: string }
288
+ router.put('/auth', (req, res) => {
289
+ const user = requireUsername(req, res);
290
+ if (!user)
291
+ return;
292
+ const token = typeof req.body?.token === 'string'
293
+ ? req.body.token.trim()
294
+ : '';
295
+ if (!token) {
296
+ res.status(400).json({ error: 'token required' });
297
+ return;
298
+ }
299
+ // Light sanity check — GitHub PATs start with ghp_ / github_pat_ etc. and
300
+ // are ≥40 chars. Don't block unusual forms outright; GitHub will reject.
301
+ // Printable ASCII only — GitHub PATs live in this range; rejecting
302
+ // zero-width spaces / BOM / other invisibles prevents the common
303
+ // copy-paste-from-formatted-source bug that would otherwise store a
304
+ // token GitHub will silently 401 on forever.
305
+ if (token.length < 20 || token.length > 200 || !/^[\x21-\x7E]+$/.test(token)) {
306
+ res.status(400).json({ error: 'token contains whitespace / non-printable characters, or has an unexpected length' });
307
+ return;
308
+ }
309
+ (0, hub_auth_1.setHubToken)(user, token);
310
+ res.json({ ok: true, ...(0, hub_auth_1.getHubTokenStatus)(user) });
311
+ });
312
+ // DELETE /auth → wipe stored token
313
+ router.delete('/auth', (req, res) => {
314
+ const user = requireUsername(req, res);
315
+ if (!user)
316
+ return;
317
+ (0, hub_auth_1.clearHubToken)(user);
318
+ res.json({ ok: true });
319
+ });
320
+ // POST /submit body { kind, label, body, description?, tags?, author? }
321
+ // Posts an Issue to zbc0315/ccweb-hub using the caller's stored PAT.
322
+ router.post('/submit', async (req, res) => {
323
+ const user = requireUsername(req, res);
324
+ if (!user)
325
+ return;
326
+ const token = (0, hub_auth_1.getHubToken)(user);
327
+ if (!token) {
328
+ res.status(412).json({ error: 'Hub token not configured — set one in Settings → CCWeb Hub' });
329
+ return;
330
+ }
331
+ const b = (req.body ?? {});
332
+ if (b.kind !== 'quick-prompt' && b.kind !== 'agent-prompt') {
333
+ res.status(400).json({ error: 'kind must be "quick-prompt" or "agent-prompt"' });
334
+ return;
335
+ }
336
+ if (!b.label || typeof b.label !== 'string' || !b.body || typeof b.body !== 'string') {
337
+ res.status(400).json({ error: 'label and body are required strings' });
338
+ return;
339
+ }
340
+ // Newlines in GitHub Issue title get silently truncated; reject early so
341
+ // the submit flow doesn't produce a half-titled issue. Same-ish for the
342
+ // optional fields — keep them single-line, reasonable length.
343
+ if (/[\r\n]/.test(b.label) || b.label.length > 200) {
344
+ res.status(400).json({ error: 'label must be single-line and ≤ 200 chars' });
345
+ return;
346
+ }
347
+ if (typeof b.description === 'string' && (/[\r\n]/.test(b.description) || b.description.length > 300)) {
348
+ res.status(400).json({ error: 'description must be single-line and ≤ 300 chars' });
349
+ return;
350
+ }
351
+ if (typeof b.author === 'string' && (/[\r\n\s]/.test(b.author) || b.author.length > 64)) {
352
+ res.status(400).json({ error: 'author must be a single token (no whitespace), ≤ 64 chars' });
353
+ return;
354
+ }
355
+ const kindLabel = b.kind === 'quick-prompt' ? 'Quick Prompt' : 'Agent Prompt';
356
+ // Code-point-safe title slice to avoid splitting surrogate pairs
357
+ const titleRaw = `[${kindLabel}] ${b.label}`;
358
+ const title = Array.from(titleRaw).slice(0, 240).join('');
359
+ // Dynamic fence — user content containing backticks can't close the block
360
+ const backtickRuns = b.body.match(/`+/g) ?? [];
361
+ const maxRun = backtickRuns.reduce((m, r) => Math.max(m, r.length), 0);
362
+ const fence = '`'.repeat(Math.max(3, maxRun + 1));
363
+ const author = typeof b.author === 'string' && b.author.trim() ? b.author.trim() : 'anonymous';
364
+ const tagList = Array.isArray(b.tags)
365
+ ? b.tags.filter((t) => typeof t === 'string')
366
+ : [];
367
+ const bodyMd = `<!-- Submitted via ccweb. Review, then commit to ${b.kind}s/ as a .md file. -->\n\n` +
368
+ '```yaml\n' +
369
+ '---\n' +
370
+ `label: ${JSON.stringify(b.label)}\n` +
371
+ `kind: ${JSON.stringify(b.kind)}\n` +
372
+ `author: ${JSON.stringify(author)}\n` +
373
+ (tagList.length ? `tags: ${JSON.stringify(tagList)}\n` : '') +
374
+ (b.description && b.description.trim() ? `description: ${JSON.stringify(b.description.trim())}\n` : '') +
375
+ '---\n' +
376
+ '```\n\n' +
377
+ '## Body\n\n' +
378
+ `${fence}\n` +
379
+ b.body +
380
+ `\n${fence}\n`;
381
+ try {
382
+ const raw = await apiPost('/issues', token, {
383
+ title,
384
+ body: bodyMd,
385
+ labels: [b.kind],
386
+ });
387
+ const parsed = JSON.parse(raw);
388
+ res.json({ ok: true, issueNumber: parsed.number, issueUrl: parsed.html_url });
389
+ }
390
+ catch (err) {
391
+ const msg = err.message;
392
+ // Surface GitHub 401 / 403 distinctly so the UI can prompt for a fresh token
393
+ const is401 = /GitHub API 401/.test(msg);
394
+ const is403 = /GitHub API 403/.test(msg);
395
+ res.status(is401 || is403 ? 401 : 502).json({
396
+ error: is401
397
+ ? 'GitHub token invalid or expired — update in Settings'
398
+ : is403
399
+ ? 'GitHub rejected the request (token scope too narrow, or rate-limited)'
400
+ : `Failed to submit: ${msg}`,
401
+ });
402
+ }
403
+ });
234
404
  // ── Plugin Hub (unchanged — proxies plugins.json at hub repo root) ─────────
235
405
  let _pluginCache = null;
236
406
  let _pluginCacheTime = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"skillhub.js","sourceRoot":"","sources":["../../src/routes/skillhub.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skillhub.js","sourceRoot":"","sources":["../../src/routes/skillhub.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,19 @@ import { EventEmitter } from 'events';
9
9
  import type { CliTool } from './types';
10
10
  export interface ChatBlockItem {
11
11
  type: 'text' | 'thinking' | 'tool_use' | 'tool_result';
12
+ /** Legacy string form; always populated for backwards compat. For tool_use
13
+ * it's still `name(args-truncated)`. Rich renderers should prefer `tool` /
14
+ * `input` / `output` below when present. */
12
15
  content: string;
16
+ /** tool_use: tool name (`Bash`, `Edit`, `TodoWrite`, …). */
17
+ tool?: string;
18
+ /** tool_use: structured input with deep string values capped at ~4KB to
19
+ * protect WS payload size. Object shape preserved so the frontend can
20
+ * render tool-specific UIs (TodoWrite checklist, Edit diff, etc.). */
21
+ input?: unknown;
22
+ /** tool_result: full-ish text (up to ~4KB) — `content` keeps the short
23
+ * legacy truncation for callers that serialize to markdown fences. */
24
+ output?: string;
13
25
  }
14
26
  export interface ChatBlock {
15
27
  /** Stable block id for dedup between WS replay and HTTP history. Derived