@clauderecallhq/cli 0.12.5 → 0.61.3

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 (218) hide show
  1. package/LICENSE +37 -17
  2. package/README.md +110 -22
  3. package/dist/cli.js +1641 -353
  4. package/dist/daemon/entrypoint.js +1872 -54
  5. package/dist/mcp-server.js +930 -0
  6. package/dist/share/fonts/Inter-Bold.woff +0 -0
  7. package/dist/share/fonts/Inter-Regular.woff +0 -0
  8. package/dist/share/fonts/JetBrainsMono-Regular.woff +0 -0
  9. package/dist/web/assets/_brand-Bw9uSB4O.js +1 -0
  10. package/dist/web/assets/captureNode-9CVj9vYC.js +2 -0
  11. package/dist/web/assets/card-a-minimal-ujNERzX7.js +1 -0
  12. package/dist/web/assets/card-b-terminal-DpJ_tVpg.js +1 -0
  13. package/dist/web/assets/card-c-gradient-CZXVGuNd.js +1 -0
  14. package/dist/web/assets/card-d-dashboard-CHKD-PnB.js +1 -0
  15. package/dist/web/assets/dist-CWaokT35.js +56 -0
  16. package/dist/web/assets/index-B-HrjaDy.css +1 -0
  17. package/dist/web/assets/index-BZYcD76T.js +633 -0
  18. package/dist/web/assets/jetbrains-mono-latin-700-normal-D3wTyLJW.woff +0 -0
  19. package/dist/web/assets/patterns-BPeZb9N0.js +1 -0
  20. package/dist/web/assets/stats-BSwqSiFU.js +1 -0
  21. package/dist/web/assets/thread-D2AXyhOx.js +1 -0
  22. package/dist/web/index.html +8 -2
  23. package/package.json +58 -18
  24. package/scripts/postinstall.mjs +38 -0
  25. package/dist/cli.js.map +0 -1
  26. package/dist/commands/activate.js +0 -69
  27. package/dist/commands/activate.js.map +0 -1
  28. package/dist/commands/audit-secrets.js +0 -103
  29. package/dist/commands/audit-secrets.js.map +0 -1
  30. package/dist/commands/blame.js +0 -35
  31. package/dist/commands/blame.js.map +0 -1
  32. package/dist/commands/config-verification.js +0 -18
  33. package/dist/commands/config-verification.js.map +0 -1
  34. package/dist/commands/context.js +0 -144
  35. package/dist/commands/context.js.map +0 -1
  36. package/dist/commands/correlate.js +0 -70
  37. package/dist/commands/correlate.js.map +0 -1
  38. package/dist/commands/digest.js +0 -78
  39. package/dist/commands/digest.js.map +0 -1
  40. package/dist/commands/health.js +0 -62
  41. package/dist/commands/health.js.map +0 -1
  42. package/dist/commands/index.js +0 -247
  43. package/dist/commands/index.js.map +0 -1
  44. package/dist/commands/install-extension.js +0 -138
  45. package/dist/commands/install-extension.js.map +0 -1
  46. package/dist/commands/license.js +0 -39
  47. package/dist/commands/license.js.map +0 -1
  48. package/dist/commands/list.js +0 -47
  49. package/dist/commands/list.js.map +0 -1
  50. package/dist/commands/mcp.js +0 -29
  51. package/dist/commands/mcp.js.map +0 -1
  52. package/dist/commands/open.js +0 -28
  53. package/dist/commands/open.js.map +0 -1
  54. package/dist/commands/paste.js +0 -154
  55. package/dist/commands/paste.js.map +0 -1
  56. package/dist/commands/projects.js +0 -36
  57. package/dist/commands/projects.js.map +0 -1
  58. package/dist/commands/search.js +0 -67
  59. package/dist/commands/search.js.map +0 -1
  60. package/dist/commands/semantic.js +0 -173
  61. package/dist/commands/semantic.js.map +0 -1
  62. package/dist/commands/show.js +0 -121
  63. package/dist/commands/show.js.map +0 -1
  64. package/dist/commands/start.js +0 -47
  65. package/dist/commands/start.js.map +0 -1
  66. package/dist/commands/stats.js +0 -133
  67. package/dist/commands/stats.js.map +0 -1
  68. package/dist/commands/status.js +0 -45
  69. package/dist/commands/status.js.map +0 -1
  70. package/dist/commands/stop.js +0 -29
  71. package/dist/commands/stop.js.map +0 -1
  72. package/dist/commands/thread.js +0 -396
  73. package/dist/commands/thread.js.map +0 -1
  74. package/dist/context/formatter.js +0 -103
  75. package/dist/context/formatter.js.map +0 -1
  76. package/dist/daemon/auto-tag-config.js +0 -103
  77. package/dist/daemon/auto-tag-config.js.map +0 -1
  78. package/dist/daemon/auto-tag-config.test.js +0 -72
  79. package/dist/daemon/auto-tag-config.test.js.map +0 -1
  80. package/dist/daemon/auto-title-config.js +0 -70
  81. package/dist/daemon/auto-title-config.js.map +0 -1
  82. package/dist/daemon/bulk-title-jobs.js +0 -170
  83. package/dist/daemon/bulk-title-jobs.js.map +0 -1
  84. package/dist/daemon/correlator.js +0 -320
  85. package/dist/daemon/correlator.js.map +0 -1
  86. package/dist/daemon/discover.js +0 -316
  87. package/dist/daemon/discover.js.map +0 -1
  88. package/dist/daemon/editor-detection.js +0 -186
  89. package/dist/daemon/editor-detection.js.map +0 -1
  90. package/dist/daemon/entrypoint.js.map +0 -1
  91. package/dist/daemon/git-correlator.js +0 -256
  92. package/dist/daemon/git-correlator.js.map +0 -1
  93. package/dist/daemon/mcp-installer.js +0 -108
  94. package/dist/daemon/mcp-installer.js.map +0 -1
  95. package/dist/daemon/onboarding-state.js +0 -140
  96. package/dist/daemon/onboarding-state.js.map +0 -1
  97. package/dist/daemon/pidfile.js +0 -57
  98. package/dist/daemon/pidfile.js.map +0 -1
  99. package/dist/daemon/ports.js +0 -48
  100. package/dist/daemon/ports.js.map +0 -1
  101. package/dist/daemon/scanProgressRegistry.js +0 -62
  102. package/dist/daemon/scanProgressRegistry.js.map +0 -1
  103. package/dist/daemon/server.js +0 -2010
  104. package/dist/daemon/server.js.map +0 -1
  105. package/dist/daemon/tag-scanner/anthropic-client.js +0 -40
  106. package/dist/daemon/tag-scanner/anthropic-client.js.map +0 -1
  107. package/dist/daemon/tag-scanner/autopilot.js +0 -131
  108. package/dist/daemon/tag-scanner/autopilot.js.map +0 -1
  109. package/dist/daemon/tag-scanner/claude-cli-driver.js +0 -250
  110. package/dist/daemon/tag-scanner/claude-cli-driver.js.map +0 -1
  111. package/dist/daemon/tag-scanner/orchestrator.js +0 -88
  112. package/dist/daemon/tag-scanner/orchestrator.js.map +0 -1
  113. package/dist/daemon/tag-scanner/prompt.js +0 -46
  114. package/dist/daemon/tag-scanner/prompt.js.map +0 -1
  115. package/dist/daemon/tag-scanner/prompt.test.js +0 -48
  116. package/dist/daemon/tag-scanner/prompt.test.js.map +0 -1
  117. package/dist/daemon/tag-scanner/scan-state.js +0 -49
  118. package/dist/daemon/tag-scanner/scan-state.js.map +0 -1
  119. package/dist/daemon/tag-scanner/session-fetcher.js +0 -82
  120. package/dist/daemon/tag-scanner/session-fetcher.js.map +0 -1
  121. package/dist/daemon/tag-scanner/session-fetcher.test.js +0 -34
  122. package/dist/daemon/tag-scanner/session-fetcher.test.js.map +0 -1
  123. package/dist/daemon/tag-scanner/validator.js +0 -50
  124. package/dist/daemon/tag-scanner/validator.js.map +0 -1
  125. package/dist/daemon/tag-scanner/validator.test.js +0 -41
  126. package/dist/daemon/tag-scanner/validator.test.js.map +0 -1
  127. package/dist/daemon/terminal-registry.js +0 -443
  128. package/dist/daemon/terminal-registry.js.map +0 -1
  129. package/dist/daemon/ui.js +0 -64
  130. package/dist/daemon/ui.js.map +0 -1
  131. package/dist/daemon/watcher.js +0 -256
  132. package/dist/daemon/watcher.js.map +0 -1
  133. package/dist/db/client.js +0 -22
  134. package/dist/db/client.js.map +0 -1
  135. package/dist/db/schema.js +0 -496
  136. package/dist/db/schema.js.map +0 -1
  137. package/dist/license/api-base.js +0 -13
  138. package/dist/license/api-base.js.map +0 -1
  139. package/dist/license/manager.js +0 -43
  140. package/dist/license/manager.js.map +0 -1
  141. package/dist/license/public-key.js +0 -19
  142. package/dist/license/public-key.js.map +0 -1
  143. package/dist/license/storage.js +0 -27
  144. package/dist/license/storage.js.map +0 -1
  145. package/dist/license/verify.js +0 -23
  146. package/dist/license/verify.js.map +0 -1
  147. package/dist/mcp/audit.js +0 -126
  148. package/dist/mcp/audit.js.map +0 -1
  149. package/dist/mcp/prompts.js +0 -180
  150. package/dist/mcp/prompts.js.map +0 -1
  151. package/dist/mcp/server.js +0 -502
  152. package/dist/mcp/server.js.map +0 -1
  153. package/dist/mcp/thread-tools.js +0 -363
  154. package/dist/mcp/thread-tools.js.map +0 -1
  155. package/dist/mcp/write-tools.js +0 -239
  156. package/dist/mcp/write-tools.js.map +0 -1
  157. package/dist/parser/jsonl.js +0 -150
  158. package/dist/parser/jsonl.js.map +0 -1
  159. package/dist/semantic/chunker.js +0 -47
  160. package/dist/semantic/chunker.js.map +0 -1
  161. package/dist/semantic/config.js +0 -74
  162. package/dist/semantic/config.js.map +0 -1
  163. package/dist/semantic/embedder.js +0 -54
  164. package/dist/semantic/embedder.js.map +0 -1
  165. package/dist/semantic/fusion.js +0 -38
  166. package/dist/semantic/fusion.js.map +0 -1
  167. package/dist/semantic/model-download.js +0 -69
  168. package/dist/semantic/model-download.js.map +0 -1
  169. package/dist/semantic/pipeline.js +0 -375
  170. package/dist/semantic/pipeline.js.map +0 -1
  171. package/dist/semantic/query.js +0 -42
  172. package/dist/semantic/query.js.map +0 -1
  173. package/dist/semantic/worker.js +0 -78
  174. package/dist/semantic/worker.js.map +0 -1
  175. package/dist/stats/backfill.js +0 -151
  176. package/dist/stats/backfill.js.map +0 -1
  177. package/dist/stats/health.js +0 -102
  178. package/dist/stats/health.js.map +0 -1
  179. package/dist/stats/query.js +0 -385
  180. package/dist/stats/query.js.map +0 -1
  181. package/dist/utils/aliases.js +0 -107
  182. package/dist/utils/aliases.js.map +0 -1
  183. package/dist/utils/autoCollections.js +0 -635
  184. package/dist/utils/autoCollections.js.map +0 -1
  185. package/dist/utils/autoTitle.js +0 -348
  186. package/dist/utils/autoTitle.js.map +0 -1
  187. package/dist/utils/collections.js +0 -446
  188. package/dist/utils/collections.js.map +0 -1
  189. package/dist/utils/format.js +0 -46
  190. package/dist/utils/format.js.map +0 -1
  191. package/dist/utils/notes.js +0 -270
  192. package/dist/utils/notes.js.map +0 -1
  193. package/dist/utils/paths.js +0 -50
  194. package/dist/utils/paths.js.map +0 -1
  195. package/dist/utils/pricing.js +0 -257
  196. package/dist/utils/pricing.js.map +0 -1
  197. package/dist/utils/secret-scanner.js +0 -166
  198. package/dist/utils/secret-scanner.js.map +0 -1
  199. package/dist/utils/sessionLabel.js +0 -64
  200. package/dist/utils/sessionLabel.js.map +0 -1
  201. package/dist/utils/tags.js +0 -97
  202. package/dist/utils/tags.js.map +0 -1
  203. package/dist/utils/thread-context.js +0 -129
  204. package/dist/utils/thread-context.js.map +0 -1
  205. package/dist/utils/threadFilter.js +0 -18
  206. package/dist/utils/threadFilter.js.map +0 -1
  207. package/dist/utils/threads-titler.js +0 -298
  208. package/dist/utils/threads-titler.js.map +0 -1
  209. package/dist/utils/threads.js +0 -383
  210. package/dist/utils/threads.js.map +0 -1
  211. package/dist/utils/usage.js +0 -76
  212. package/dist/utils/usage.js.map +0 -1
  213. package/dist/verification/compute.js +0 -88
  214. package/dist/verification/compute.js.map +0 -1
  215. package/dist/verification/config.js +0 -34
  216. package/dist/verification/config.js.map +0 -1
  217. package/dist/web/assets/index-CIr6J4Fw.js +0 -1201
  218. package/dist/web/assets/index-Ctc8g9Jw.css +0 -1
@@ -1,363 +0,0 @@
1
- import { z } from 'zod';
2
- import { addSessionToThread, archiveThread, closeThread, createThread, getThread, listThreads, mergeThreads, removeSessionFromThread, renameThread, reopenThread, setParent, splitThread, threadsForSession, } from '../utils/threads.js';
3
- import { generateThreadTitles } from '../utils/threads-titler.js';
4
- import { RateLimitError, RateLimiter, withAudit } from './audit.js';
5
- function json(data) {
6
- return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
7
- }
8
- function error(message) {
9
- return { content: [{ type: 'text', text: message }], isError: true };
10
- }
11
- function mapError(err) {
12
- if (err instanceof RateLimitError)
13
- return error(err.message);
14
- if (err instanceof z.ZodError)
15
- return error(`invalid input: ${err.message}`);
16
- return error(err instanceof Error ? err.message : String(err));
17
- }
18
- /**
19
- * MCP SDK's `registerTool` consumes a `ZodRawShape` for input validation,
20
- * which (via default zod behavior) strips unknown keys instead of rejecting
21
- * them. To satisfy the v0.13 write-tool contract ("Reject unknown fields"),
22
- * we re-parse each handler's args through a `.strict()` ZodObject built from
23
- * the same shape.
24
- */
25
- function strictParse(shape, args) {
26
- return z.object(shape).strict().parse(args);
27
- }
28
- // ---------- schemas --------------------------------------------------------
29
- const UUID = z.string().uuid();
30
- const ThreadId = UUID.describe('Thread id (UUID).');
31
- const SessionId = UUID.describe('Session UUID (exact, not a prefix).');
32
- const ListShape = {
33
- include_archived: z.boolean().optional().describe('Include archived threads (default false).'),
34
- };
35
- const GetShape = { id: ThreadId };
36
- const ForSessionShape = { session_id: SessionId };
37
- const CreateShape = {
38
- name: z.string().min(1).max(200).describe('Human-readable thread name.'),
39
- summary: z.string().max(4000).optional().describe('Optional short description.'),
40
- origin_session_id: SessionId.optional().describe('Seed the thread with this session as its origin.'),
41
- };
42
- const AddSessionShape = {
43
- thread_id: ThreadId,
44
- session_id: SessionId,
45
- parent_session_id: SessionId.optional().describe('If present, the edge is role=child with this parent; otherwise role=origin.'),
46
- role: z.enum(['origin', 'child']).optional(),
47
- };
48
- const SetParentShape = {
49
- thread_id: ThreadId,
50
- session_id: SessionId,
51
- parent_session_id: SessionId.nullable().describe('New parent (null to clear and promote the edge back to role=origin).'),
52
- };
53
- const RemoveSessionShape = { thread_id: ThreadId, session_id: SessionId };
54
- const RenameShape = { thread_id: ThreadId, name: z.string().min(1).max(200) };
55
- const ThreadOnlyShape = { thread_id: ThreadId };
56
- const MergeShape = {
57
- source_id: ThreadId.describe('Thread to dissolve — its edges move into dest_id.'),
58
- dest_id: ThreadId.describe('Thread that absorbs source_id.'),
59
- };
60
- const SplitShape = {
61
- thread_id: ThreadId,
62
- session_ids: z.array(SessionId).min(1).max(500),
63
- new_thread_name: z.string().min(1).max(200),
64
- };
65
- const GenerateTitlesShape = {
66
- thread_id: ThreadId,
67
- force: z
68
- .boolean()
69
- .optional()
70
- .describe('When true, regenerate titles for sessions that already have an agent-sourced title. Default false skips them.'),
71
- };
72
- // ---------- read -----------------------------------------------------------
73
- export function registerThreadReadTools(server) {
74
- server.registerTool('thread_list', {
75
- title: 'List threads',
76
- description: 'All threads (v0.15a intent groups), newest first. Excludes archived threads unless include_archived is true.',
77
- inputSchema: ListShape,
78
- }, async (args) => {
79
- try {
80
- const { include_archived } = strictParse(ListShape, args);
81
- return json(listThreads({ includeArchived: include_archived ?? false }));
82
- }
83
- catch (err) {
84
- return mapError(err);
85
- }
86
- });
87
- server.registerTool('thread_get', {
88
- title: 'Get thread with edges',
89
- description: 'Full thread detail including every session edge (origin + children).',
90
- inputSchema: GetShape,
91
- }, async (args) => {
92
- try {
93
- const { id } = strictParse(GetShape, args);
94
- const detail = getThread(id);
95
- if (!detail)
96
- return error(`thread not found: ${id}`);
97
- return json(detail);
98
- }
99
- catch (err) {
100
- return mapError(err);
101
- }
102
- });
103
- server.registerTool('thread_for_session', {
104
- title: 'List threads containing a session',
105
- description: 'Return non-archived threads that reference this session (as origin or child).',
106
- inputSchema: ForSessionShape,
107
- }, async (args) => {
108
- try {
109
- const { session_id } = strictParse(ForSessionShape, args);
110
- return json(threadsForSession(session_id));
111
- }
112
- catch (err) {
113
- return mapError(err);
114
- }
115
- });
116
- }
117
- export function registerThreadWriteTools(server, opts = {}) {
118
- const limiter = opts.limiter ?? new RateLimiter();
119
- server.registerTool('thread_create', {
120
- title: 'Create a thread',
121
- description: 'Create a new thread. Optionally seed it with an origin session. Name is required; summary is optional.',
122
- inputSchema: CreateShape,
123
- }, async (args) => {
124
- try {
125
- const parsed = strictParse(CreateShape, args);
126
- const result = await withAudit({
127
- tool: 'thread_create',
128
- args: parsed,
129
- limiter,
130
- run: () => createThread({
131
- name: parsed.name,
132
- summary: parsed.summary ?? null,
133
- originSessionId: parsed.origin_session_id,
134
- }),
135
- });
136
- return json(result);
137
- }
138
- catch (err) {
139
- return mapError(err);
140
- }
141
- });
142
- server.registerTool('thread_add_session', {
143
- title: 'Add session to thread',
144
- description: 'Attach a session to a thread. If parent_session_id is provided the edge is role=child; otherwise role=origin. Upsert: re-adding updates the edge.',
145
- inputSchema: AddSessionShape,
146
- }, async (args) => {
147
- try {
148
- const parsed = strictParse(AddSessionShape, args);
149
- const result = await withAudit({
150
- tool: 'thread_add_session',
151
- args: parsed,
152
- limiter,
153
- run: () => addSessionToThread({
154
- threadId: parsed.thread_id,
155
- sessionId: parsed.session_id,
156
- parentSessionId: parsed.parent_session_id ?? null,
157
- role: parsed.role,
158
- source: 'manual',
159
- confidence: 1.0,
160
- }),
161
- });
162
- return json(result);
163
- }
164
- catch (err) {
165
- return mapError(err);
166
- }
167
- });
168
- server.registerTool('thread_set_parent', {
169
- title: 'Set edge parent within thread',
170
- description: 'Change the parent session of an existing thread edge. Pass null to clear the parent and promote the edge to role=origin.',
171
- inputSchema: SetParentShape,
172
- }, async (args) => {
173
- try {
174
- const parsed = strictParse(SetParentShape, args);
175
- const result = await withAudit({
176
- tool: 'thread_set_parent',
177
- args: parsed,
178
- limiter,
179
- run: () => setParent(parsed.thread_id, parsed.session_id, parsed.parent_session_id),
180
- });
181
- return json(result);
182
- }
183
- catch (err) {
184
- return mapError(err);
185
- }
186
- });
187
- server.registerTool('thread_remove_session', {
188
- title: 'Remove session from thread',
189
- description: 'Detach a session from a thread. The session itself is untouched; only the edge is removed. The updated thread is re-mirrored to disk.',
190
- inputSchema: RemoveSessionShape,
191
- }, async (args) => {
192
- try {
193
- const parsed = strictParse(RemoveSessionShape, args);
194
- const result = await withAudit({
195
- tool: 'thread_remove_session',
196
- args: parsed,
197
- limiter,
198
- run: () => removeSessionFromThread(parsed.thread_id, parsed.session_id),
199
- });
200
- return json({ thread_id: parsed.thread_id, session_id: parsed.session_id, ...result });
201
- }
202
- catch (err) {
203
- return mapError(err);
204
- }
205
- });
206
- server.registerTool('thread_rename', {
207
- title: 'Rename thread',
208
- description: 'Change the display name of a thread.',
209
- inputSchema: RenameShape,
210
- }, async (args) => {
211
- try {
212
- const parsed = strictParse(RenameShape, args);
213
- const result = await withAudit({
214
- tool: 'thread_rename',
215
- args: parsed,
216
- limiter,
217
- run: () => renameThread(parsed.thread_id, parsed.name),
218
- });
219
- return json(result);
220
- }
221
- catch (err) {
222
- return mapError(err);
223
- }
224
- });
225
- server.registerTool('thread_close', {
226
- title: 'Close thread',
227
- description: 'Mark the thread as closed (sets closed_at). Thread remains listed; reopen to clear.',
228
- inputSchema: ThreadOnlyShape,
229
- }, async (args) => {
230
- try {
231
- const parsed = strictParse(ThreadOnlyShape, args);
232
- const result = await withAudit({
233
- tool: 'thread_close',
234
- args: parsed,
235
- limiter,
236
- run: () => closeThread(parsed.thread_id),
237
- });
238
- return json(result);
239
- }
240
- catch (err) {
241
- return mapError(err);
242
- }
243
- });
244
- server.registerTool('thread_reopen', {
245
- title: 'Reopen thread',
246
- description: 'Clear closed_at on a closed thread.',
247
- inputSchema: ThreadOnlyShape,
248
- }, async (args) => {
249
- try {
250
- const parsed = strictParse(ThreadOnlyShape, args);
251
- const result = await withAudit({
252
- tool: 'thread_reopen',
253
- args: parsed,
254
- limiter,
255
- run: () => reopenThread(parsed.thread_id),
256
- });
257
- return json(result);
258
- }
259
- catch (err) {
260
- return mapError(err);
261
- }
262
- });
263
- server.registerTool('thread_archive', {
264
- title: 'Archive thread',
265
- description: 'Soft-delete a thread by setting archived=1. Archived threads are hidden from thread_list by default but never hard-deleted; data is preserved in SQLite and the JSON mirror.',
266
- inputSchema: ThreadOnlyShape,
267
- }, async (args) => {
268
- try {
269
- const parsed = strictParse(ThreadOnlyShape, args);
270
- const result = await withAudit({
271
- tool: 'thread_archive',
272
- args: parsed,
273
- limiter,
274
- run: () => archiveThread(parsed.thread_id),
275
- });
276
- return json(result);
277
- }
278
- catch (err) {
279
- return mapError(err);
280
- }
281
- });
282
- server.registerTool('thread_merge', {
283
- title: 'Merge two threads',
284
- description: 'Move every edge from source_id into dest_id, then delete source_id. Origin roles are preserved when present on either side.',
285
- inputSchema: MergeShape,
286
- }, async (args) => {
287
- try {
288
- const parsed = strictParse(MergeShape, args);
289
- const result = await withAudit({
290
- tool: 'thread_merge',
291
- args: parsed,
292
- limiter,
293
- run: () => mergeThreads(parsed.source_id, parsed.dest_id),
294
- });
295
- return json(result);
296
- }
297
- catch (err) {
298
- return mapError(err);
299
- }
300
- });
301
- server.registerTool('thread_split', {
302
- title: 'Split sessions into a new thread',
303
- description: 'Peel the specified session_ids out of thread_id into a brand-new thread named new_thread_name. Non-member session_ids are silently skipped.',
304
- inputSchema: SplitShape,
305
- }, async (args) => {
306
- try {
307
- const parsed = strictParse(SplitShape, args);
308
- const result = await withAudit({
309
- tool: 'thread_split',
310
- args: parsed,
311
- limiter,
312
- run: () => splitThread({
313
- threadId: parsed.thread_id,
314
- sessionIds: parsed.session_ids,
315
- newThreadName: parsed.new_thread_name,
316
- }),
317
- });
318
- return json(result);
319
- }
320
- catch (err) {
321
- return mapError(err);
322
- }
323
- });
324
- server.registerTool('generate_thread_titles', {
325
- title: 'Generate titles for every session in a thread',
326
- description: 'Walk a thread DAG in topology order (origins first by added_at, then children breadth-first) and generate a coherent agent title for each session. Each successive title sees already-titled ancestors and earlier siblings as strong context so a naming pattern emerges. Set force=true to regenerate already-titled sessions; default false skips them. Returns the final {generated, skipped, failed} summary after the whole walk completes.',
327
- inputSchema: GenerateTitlesShape,
328
- }, async (args) => {
329
- try {
330
- const parsed = strictParse(GenerateTitlesShape, args);
331
- const result = await withAudit({
332
- tool: 'generate_thread_titles',
333
- args: parsed,
334
- limiter,
335
- run: () => generateThreadTitles(parsed.thread_id, {
336
- force: parsed.force ?? false,
337
- }),
338
- });
339
- return json(result);
340
- }
341
- catch (err) {
342
- return mapError(err);
343
- }
344
- });
345
- }
346
- export const THREAD_READ_TOOL_NAMES = [
347
- 'thread_list',
348
- 'thread_get',
349
- 'thread_for_session',
350
- ];
351
- export const THREAD_WRITE_TOOL_NAMES = [
352
- 'thread_create',
353
- 'thread_add_session',
354
- 'thread_set_parent',
355
- 'thread_remove_session',
356
- 'thread_rename',
357
- 'thread_close',
358
- 'thread_reopen',
359
- 'thread_archive',
360
- 'thread_merge',
361
- 'thread_split',
362
- ];
363
- //# sourceMappingURL=thread-tools.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"thread-tools.js","sourceRoot":"","sources":["../../src/mcp/thread-tools.ts"],"names":[],"mappings":"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"}
@@ -1,239 +0,0 @@
1
- import { z } from 'zod';
2
- import { getDb } from '../db/client.js';
3
- import { addTag, normalizeTag, removeTag } from '../utils/tags.js';
4
- import { setAlias } from '../utils/aliases.js';
5
- import { getNote, setNote } from '../utils/notes.js';
6
- import { addSessionToCollection, createCollection, removeSessionFromCollection, } from '../utils/collections.js';
7
- import { RateLimitError, RateLimiter, withAudit } from './audit.js';
8
- function json(data) {
9
- return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
10
- }
11
- function error(message) {
12
- return { content: [{ type: 'text', text: message }], isError: true };
13
- }
14
- /**
15
- * Resolve a user-supplied id or short prefix to a canonical session UUID.
16
- * Returns null if no match OR if a non-UUID prefix is ambiguous.
17
- */
18
- export function resolveSessionId(raw) {
19
- const trimmed = raw.trim();
20
- if (trimmed.length < 4)
21
- return null;
22
- const db = getDb();
23
- if (trimmed.length >= 32) {
24
- const row = db.prepare('SELECT id FROM sessions WHERE id = ?').get(trimmed);
25
- return row?.id ?? null;
26
- }
27
- const matches = db
28
- .prepare('SELECT id FROM sessions WHERE id LIKE ? LIMIT 2')
29
- .all(`${trimmed}%`);
30
- if (matches.length === 1)
31
- return matches[0].id;
32
- return null;
33
- }
34
- const NOTE_SEPARATOR = '\n\n---\n\n';
35
- /** Map any thrown value (including RateLimitError) to a CallToolResult. */
36
- function mapError(err) {
37
- if (err instanceof RateLimitError)
38
- return error(err.message);
39
- if (err instanceof z.ZodError)
40
- return error(`invalid input: ${err.message}`);
41
- return error(err instanceof Error ? err.message : String(err));
42
- }
43
- export function registerWriteTools(server, opts = {}) {
44
- const limiter = opts.limiter ?? new RateLimiter();
45
- server.registerTool('add_tag', {
46
- title: 'Add tag to a session',
47
- description: 'Apply a single tag to a session. Tags are normalized server-side (lowercase, hyphens, strip #). Idempotent.',
48
- inputSchema: {
49
- sessionId: z.string().describe('Full session UUID or 8+-character prefix.'),
50
- tag: z.string().min(1).describe('Tag to add. Normalized: lowercase, dashes, max 40 chars.'),
51
- },
52
- }, async (args) => {
53
- try {
54
- const resolved = resolveSessionId(args.sessionId);
55
- if (!resolved)
56
- return error(`session not found or prefix ambiguous: ${args.sessionId}`);
57
- const result = await withAudit({
58
- tool: 'add_tag',
59
- args: { sessionId: resolved, tag: args.tag },
60
- limiter,
61
- run: () => addTag(resolved, args.tag),
62
- });
63
- return json({ sessionId: resolved, ...result });
64
- }
65
- catch (err) {
66
- return mapError(err);
67
- }
68
- });
69
- server.registerTool('remove_tag', {
70
- title: 'Remove tag from a session',
71
- description: 'Remove a single tag from a session. The removal is recorded in tag_events (append-only) so history is preserved.',
72
- inputSchema: {
73
- sessionId: z.string().describe('Full session UUID or 8+-character prefix.'),
74
- tag: z.string().min(1).describe('Tag to remove (normalized server-side).'),
75
- },
76
- }, async (args) => {
77
- try {
78
- const resolved = resolveSessionId(args.sessionId);
79
- if (!resolved)
80
- return error(`session not found or prefix ambiguous: ${args.sessionId}`);
81
- const normalized = normalizeTag(args.tag);
82
- if (!normalized)
83
- return error('tag must contain at least one alphanumeric character');
84
- const result = await withAudit({
85
- tool: 'remove_tag',
86
- args: { sessionId: resolved, tag: normalized },
87
- limiter,
88
- run: () => removeTag(resolved, normalized),
89
- });
90
- return json({ sessionId: resolved, ...result });
91
- }
92
- catch (err) {
93
- return mapError(err);
94
- }
95
- });
96
- server.registerTool('set_alias', {
97
- title: 'Set session alias',
98
- description: 'Set a human-friendly alias for a session. Previous alias is archived to previous_aliases (never destroyed). Session UUID remains the immutable primary key.',
99
- inputSchema: {
100
- sessionId: z.string().describe('Full session UUID or 8+-character prefix.'),
101
- alias: z.string().min(1).max(120).describe('New alias (non-empty, max 120 chars).'),
102
- },
103
- }, async (args) => {
104
- try {
105
- const resolved = resolveSessionId(args.sessionId);
106
- if (!resolved)
107
- return error(`session not found or prefix ambiguous: ${args.sessionId}`);
108
- const result = await withAudit({
109
- tool: 'set_alias',
110
- args: { sessionId: resolved, alias: args.alias },
111
- limiter,
112
- run: () => setAlias(resolved, args.alias),
113
- });
114
- return json(result);
115
- }
116
- catch (err) {
117
- return mapError(err);
118
- }
119
- });
120
- server.registerTool('append_note', {
121
- title: 'Append to session note',
122
- description: 'Append markdown to a session note. If a note already exists, the new content is added below a `---` separator. Previous version is archived in previous_versions.',
123
- inputSchema: {
124
- sessionId: z.string().describe('Full session UUID or 8+-character prefix.'),
125
- markdown: z.string().min(1).max(50_000).describe('Markdown to append.'),
126
- },
127
- }, async (args) => {
128
- try {
129
- const resolved = resolveSessionId(args.sessionId);
130
- if (!resolved)
131
- return error(`session not found or prefix ambiguous: ${args.sessionId}`);
132
- const result = await withAudit({
133
- tool: 'append_note',
134
- args: { sessionId: resolved, length: args.markdown.length },
135
- limiter,
136
- run: () => {
137
- const existing = getNote(resolved);
138
- const next = existing && existing.content.length > 0
139
- ? `${existing.content}${NOTE_SEPARATOR}${args.markdown}`
140
- : args.markdown;
141
- return setNote(resolved, next);
142
- },
143
- });
144
- return json(result);
145
- }
146
- catch (err) {
147
- return mapError(err);
148
- }
149
- });
150
- server.registerTool('create_collection', {
151
- title: 'Create a collection',
152
- description: 'Create a new collection for grouping sessions. Optionally nest under a parent. Soft-deletion only.',
153
- inputSchema: {
154
- name: z.string().min(1).max(120),
155
- parent_id: z.string().optional().describe('Parent collection id (omit for root).'),
156
- icon: z.string().max(32).optional(),
157
- color: z.string().max(32).optional(),
158
- description: z.string().max(2000).optional(),
159
- },
160
- }, async (args) => {
161
- try {
162
- const result = await withAudit({
163
- tool: 'create_collection',
164
- args,
165
- limiter,
166
- run: () => createCollection({
167
- name: args.name,
168
- parent_id: args.parent_id ?? null,
169
- icon: args.icon ?? null,
170
- color: args.color ?? null,
171
- description: args.description ?? null,
172
- }),
173
- });
174
- return json(result);
175
- }
176
- catch (err) {
177
- return mapError(err);
178
- }
179
- });
180
- server.registerTool('add_session_to_collection', {
181
- title: 'Add session to collection',
182
- description: 'Add a session to a collection. Idempotent: re-adding returns added=false.',
183
- inputSchema: {
184
- collectionId: z.string().min(1),
185
- sessionId: z.string().describe('Full session UUID or 8+-character prefix.'),
186
- note: z.string().max(2000).optional(),
187
- },
188
- }, async (args) => {
189
- try {
190
- const resolved = resolveSessionId(args.sessionId);
191
- if (!resolved)
192
- return error(`session not found or prefix ambiguous: ${args.sessionId}`);
193
- const result = await withAudit({
194
- tool: 'add_session_to_collection',
195
- args: { collectionId: args.collectionId, sessionId: resolved, note: args.note ?? null },
196
- limiter,
197
- run: () => addSessionToCollection(args.collectionId, resolved, args.note ?? null),
198
- });
199
- return json({ collectionId: args.collectionId, sessionId: resolved, ...result });
200
- }
201
- catch (err) {
202
- return mapError(err);
203
- }
204
- });
205
- server.registerTool('remove_session_from_collection', {
206
- title: 'Remove session from collection',
207
- description: 'Remove a session from a collection. The removal is recorded in collection_events (append-only); the underlying session is untouched.',
208
- inputSchema: {
209
- collectionId: z.string().min(1),
210
- sessionId: z.string().describe('Full session UUID or 8+-character prefix.'),
211
- },
212
- }, async (args) => {
213
- try {
214
- const resolved = resolveSessionId(args.sessionId);
215
- if (!resolved)
216
- return error(`session not found or prefix ambiguous: ${args.sessionId}`);
217
- const result = await withAudit({
218
- tool: 'remove_session_from_collection',
219
- args: { collectionId: args.collectionId, sessionId: resolved },
220
- limiter,
221
- run: () => removeSessionFromCollection(args.collectionId, resolved),
222
- });
223
- return json({ collectionId: args.collectionId, sessionId: resolved, ...result });
224
- }
225
- catch (err) {
226
- return mapError(err);
227
- }
228
- });
229
- }
230
- export const WRITE_TOOL_NAMES = [
231
- 'add_tag',
232
- 'remove_tag',
233
- 'set_alias',
234
- 'append_note',
235
- 'create_collection',
236
- 'add_session_to_collection',
237
- 'remove_session_from_collection',
238
- ];
239
- //# sourceMappingURL=write-tools.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"write-tools.js","sourceRoot":"","sources":["../../src/mcp/write-tools.ts"],"names":[],"mappings":"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"}