@telora/mcp-products 0.22.2 → 0.22.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.
@@ -1,333 +0,0 @@
1
- // ---------------------------------------------------------------------------
2
- // Save point MCP tool handler (consolidated):
3
- // telora_save_point (create | list | get | delete | view | close)
4
- // ---------------------------------------------------------------------------
5
- import { execFileSync } from "node:child_process";
6
- import { existsSync, mkdirSync, rmSync } from "node:fs";
7
- import { join } from "node:path";
8
- import { z } from "zod";
9
- import { callProductApi, successResult, validationError, wrapHandler, } from "../shared.js";
10
- // ---------------------------------------------------------------------------
11
- // Git helpers (local operations for worktree management)
12
- // ---------------------------------------------------------------------------
13
- function getRepoPath() {
14
- const repoPath = process.env.TELORA_REPO_PATH || process.cwd();
15
- return repoPath;
16
- }
17
- function runGit(args, cwd) {
18
- try {
19
- const output = execFileSync("git", args, {
20
- cwd,
21
- encoding: "utf-8",
22
- stdio: ["pipe", "pipe", "pipe"],
23
- timeout: 30_000,
24
- });
25
- return { success: true, output: output.trim() };
26
- }
27
- catch (err) {
28
- const e = err;
29
- return { success: false, output: "", error: e.stderr || e.message || String(err) };
30
- }
31
- }
32
- function createSavePointWorktree(repoPath, commitSha, savePointId) {
33
- const worktreeDir = join(repoPath, ".telora", "save-point-worktrees");
34
- if (!existsSync(worktreeDir)) {
35
- mkdirSync(worktreeDir, { recursive: true });
36
- }
37
- const worktreePath = join(worktreeDir, `sp-${savePointId.slice(0, 8)}`);
38
- // Clean up if already exists
39
- if (existsSync(worktreePath)) {
40
- runGit(["worktree", "remove", "--force", worktreePath], repoPath);
41
- }
42
- // Prune stale entries
43
- runGit(["worktree", "prune"], repoPath);
44
- // Create worktree with detached HEAD at the commit SHA
45
- const result = runGit(["worktree", "add", "--detach", worktreePath, commitSha], repoPath);
46
- if (!result.success) {
47
- throw new Error(`Failed to create worktree: ${result.error}`);
48
- }
49
- return worktreePath;
50
- }
51
- function removeSavePointWorktree(repoPath, worktreePath) {
52
- if (!existsSync(worktreePath)) {
53
- runGit(["worktree", "prune"], repoPath);
54
- return;
55
- }
56
- const result = runGit(["worktree", "remove", "--force", worktreePath], repoPath);
57
- if (!result.success) {
58
- // Fallback: manual removal
59
- rmSync(worktreePath, { recursive: true, force: true });
60
- runGit(["worktree", "prune"], repoPath);
61
- }
62
- }
63
- const restoreTokens = new Map();
64
- const RESTORE_TOKEN_TTL_MS = 5 * 60 * 1000; // 5 minutes
65
- function generateRestoreToken(savePointId, commitSha, productId) {
66
- // Clean expired tokens
67
- const now = Date.now();
68
- for (const [key, token] of restoreTokens) {
69
- if (now - token.createdAt > RESTORE_TOKEN_TTL_MS) {
70
- restoreTokens.delete(key);
71
- }
72
- }
73
- const token = `rst_${savePointId.slice(0, 8)}_${Date.now().toString(36)}`;
74
- restoreTokens.set(token, { savePointId, commitSha, productId, createdAt: now });
75
- return token;
76
- }
77
- function validateRestoreToken(token, savePointId) {
78
- const entry = restoreTokens.get(token);
79
- if (!entry)
80
- return null;
81
- if (entry.savePointId !== savePointId)
82
- return null;
83
- if (Date.now() - entry.createdAt > RESTORE_TOKEN_TTL_MS) {
84
- restoreTokens.delete(token);
85
- return null;
86
- }
87
- return entry;
88
- }
89
- function consumeRestoreToken(token) {
90
- restoreTokens.delete(token);
91
- }
92
- // ---------------------------------------------------------------------------
93
- // Tool registration
94
- // ---------------------------------------------------------------------------
95
- export function registerSavePointTools(server, getCreds) {
96
- server.tool("telora_save_point", "Product save points: named snapshots of git commits at meaningful moments. " +
97
- "Save points capture a commit SHA with metadata (name, description) so you can revisit, " +
98
- "view in a worktree, or restore to that point later. " +
99
- "Actions: create, list, get, delete, view (create worktree), close (remove worktree), " +
100
- "restore_preflight (check safety, get token), restore_confirm (execute restore with token).", {
101
- action: z.enum(["create", "list", "get", "delete", "view", "close", "restore_preflight", "restore_confirm"]).describe("Action to perform"),
102
- productId: z.string().uuid().optional().describe("Product UUID (required for create, list)"),
103
- savePointId: z.string().uuid().optional().describe("Save point UUID (required for get, delete, view, close, restore_preflight, restore_confirm)"),
104
- name: z.string().max(200).optional().describe("Human-readable label, e.g. 'Before auth refactor' (required for create)"),
105
- commitSha: z.string().regex(/^[0-9a-f]{7,40}$/i, "Must be a valid git SHA (7-40 hex chars)").optional().describe("Full 40-char git SHA (required for create)"),
106
- description: z.string().max(2000).nullable().optional().describe("Optional longer notes about what this save point captures"),
107
- restoreToken: z.string().max(100).optional().describe("Token from restore_preflight (required for restore_confirm)"),
108
- autoSaveCurrent: z.boolean().optional().describe("Create a save point of current HEAD before restoring (restore_confirm)"),
109
- limit: z.number().int().min(1).max(500).optional().describe("Max results (default 50)"),
110
- offset: z.number().int().min(0).optional().describe("Skip N results (default 0)"),
111
- }, wrapHandler(async (params) => {
112
- switch (params.action) {
113
- case "create": {
114
- if (!params.productId)
115
- return validationError("productId required for create");
116
- if (!params.name)
117
- return validationError("name required for create");
118
- if (!params.commitSha)
119
- return validationError("commitSha required for create");
120
- const fields = {
121
- name: params.name,
122
- commitSha: params.commitSha,
123
- };
124
- if (params.description !== undefined)
125
- fields.description = params.description;
126
- const result = await callProductApi(getCreds(), {
127
- action: "save_point_create",
128
- productId: params.productId,
129
- fields,
130
- });
131
- return successResult(result.savePoint);
132
- }
133
- case "list": {
134
- if (!params.productId)
135
- return validationError("productId required for list");
136
- const body = {
137
- action: "save_point_list",
138
- productId: params.productId,
139
- };
140
- if (params.limit !== undefined)
141
- body.limit = params.limit;
142
- if (params.offset !== undefined)
143
- body.offset = params.offset;
144
- const result = await callProductApi(getCreds(), body);
145
- return successResult({ items: result.savePoints, totalCount: result.totalCount });
146
- }
147
- case "get": {
148
- if (!params.savePointId)
149
- return validationError("savePointId required for get");
150
- const result = await callProductApi(getCreds(), {
151
- action: "save_point_get",
152
- savePointId: params.savePointId,
153
- });
154
- return successResult(result.savePoint);
155
- }
156
- case "delete": {
157
- if (!params.savePointId)
158
- return validationError("savePointId required for delete");
159
- await callProductApi(getCreds(), {
160
- action: "save_point_delete",
161
- savePointId: params.savePointId,
162
- });
163
- return successResult({ deleted: true });
164
- }
165
- case "view": {
166
- if (!params.savePointId)
167
- return validationError("savePointId required for view");
168
- // Fetch save point to get commit SHA
169
- const getResult = await callProductApi(getCreds(), {
170
- action: "save_point_get",
171
- savePointId: params.savePointId,
172
- });
173
- const sp = getResult.savePoint;
174
- if (sp.worktreePath) {
175
- return successResult({
176
- ...sp,
177
- message: "Worktree already active",
178
- });
179
- }
180
- // Create worktree locally
181
- const repoPath = getRepoPath();
182
- const worktreePath = createSavePointWorktree(repoPath, sp.commitSha, params.savePointId);
183
- // Update DB with worktree path
184
- const updateResult = await callProductApi(getCreds(), {
185
- action: "save_point_update_worktree",
186
- savePointId: params.savePointId,
187
- fields: { worktreePath },
188
- });
189
- return successResult({
190
- ...updateResult.savePoint,
191
- message: `Worktree created at ${worktreePath}`,
192
- });
193
- }
194
- case "close": {
195
- if (!params.savePointId)
196
- return validationError("savePointId required for close");
197
- // Fetch save point to get worktree path
198
- const getResult = await callProductApi(getCreds(), {
199
- action: "save_point_get",
200
- savePointId: params.savePointId,
201
- });
202
- const sp = getResult.savePoint;
203
- if (!sp.worktreePath) {
204
- return successResult({ ...sp, message: "No active worktree" });
205
- }
206
- // Remove worktree locally
207
- const repoPath = getRepoPath();
208
- removeSavePointWorktree(repoPath, sp.worktreePath);
209
- // Clear worktree path in DB
210
- const updateResult = await callProductApi(getCreds(), {
211
- action: "save_point_update_worktree",
212
- savePointId: params.savePointId,
213
- fields: { worktreePath: null },
214
- });
215
- return successResult({
216
- ...updateResult.savePoint,
217
- message: "Worktree removed",
218
- });
219
- }
220
- case "restore_preflight": {
221
- if (!params.savePointId)
222
- return validationError("savePointId required for restore_preflight");
223
- // Get preflight info from API (active sessions, focuses, worktrees)
224
- const preflightResult = await callProductApi(getCreds(), {
225
- action: "save_point_restore_preflight",
226
- savePointId: params.savePointId,
227
- });
228
- const pf = preflightResult.preflight;
229
- // Generate a restore token
230
- const token = generateRestoreToken(pf.savePointId, pf.commitSha, pf.productId);
231
- return successResult({
232
- ...pf,
233
- restoreToken: token,
234
- tokenExpiresInSeconds: Math.floor(RESTORE_TOKEN_TTL_MS / 1000),
235
- message: pf.warnings.length > 0
236
- ? `WARNING: ${pf.warnings.join("; ")}. Pass restoreToken to restore_confirm to proceed.`
237
- : "No active sessions or agents detected. Pass restoreToken to restore_confirm to proceed.",
238
- });
239
- }
240
- case "restore_confirm": {
241
- if (!params.savePointId)
242
- return validationError("savePointId required for restore_confirm");
243
- if (!params.restoreToken)
244
- return validationError("restoreToken required for restore_confirm");
245
- // Validate the restore token
246
- const tokenData = validateRestoreToken(params.restoreToken, params.savePointId);
247
- if (!tokenData) {
248
- return validationError("Invalid or expired restore token. Run restore_preflight again.");
249
- }
250
- const repoPath = getRepoPath();
251
- const targetSha = tokenData.commitSha;
252
- // Optionally auto-save current HEAD before restoring
253
- if (params.autoSaveCurrent) {
254
- const headResult = runGit(["rev-parse", "HEAD"], repoPath);
255
- if (headResult.success && headResult.output !== targetSha) {
256
- try {
257
- await callProductApi(getCreds(), {
258
- action: "save_point_create",
259
- productId: tokenData.productId,
260
- fields: {
261
- name: `Auto-save before restore to ${params.savePointId.slice(0, 8)}`,
262
- commitSha: headResult.output,
263
- description: `Automatic save of main HEAD before restoring to save point ${params.savePointId}`,
264
- },
265
- });
266
- }
267
- catch {
268
- // Non-fatal: auto-save failure should not block restore
269
- // (may fail if this SHA already has a save point)
270
- }
271
- }
272
- }
273
- // Execute restore: reset main to target SHA
274
- // 1. Fetch the target commit to ensure it exists locally
275
- const fetchResult = runGit(["fetch", "origin"], repoPath);
276
- if (!fetchResult.success) {
277
- return validationError(`Failed to fetch from origin: ${fetchResult.error}`);
278
- }
279
- // 2. Checkout main
280
- const checkoutResult = runGit(["checkout", "main"], repoPath);
281
- if (!checkoutResult.success) {
282
- return validationError(`Failed to checkout main: ${checkoutResult.error}`);
283
- }
284
- // 3. Reset main to target SHA
285
- const resetResult = runGit(["reset", "--hard", targetSha], repoPath);
286
- if (!resetResult.success) {
287
- return validationError(`Failed to reset main to ${targetSha}: ${resetResult.error}`);
288
- }
289
- // 4. Force push main
290
- const pushResult = runGit(["push", "--force-with-lease", "origin", "main"], repoPath);
291
- if (!pushResult.success) {
292
- return validationError(`Failed to push main: ${pushResult.error}`);
293
- }
294
- // 5. Sync integration branch to match new main
295
- const integrationBranch = "integration";
296
- const intBranchResult = runGit(["branch", "-f", integrationBranch, targetSha], repoPath);
297
- const intPushResult = intBranchResult.success
298
- ? runGit(["push", "--force-with-lease", "origin", integrationBranch], repoPath)
299
- : intBranchResult;
300
- const integrationWarning = !intBranchResult.success || !intPushResult.success
301
- ? `WARNING: Integration branch sync failed: ${intBranchResult.error || intPushResult.error}. Main was restored but integration needs manual sync.`
302
- : null;
303
- // Consume the token so it can't be reused
304
- consumeRestoreToken(params.restoreToken);
305
- // Record restore completion in DB for audit trail
306
- try {
307
- await callProductApi(getCreds(), {
308
- action: "daemon_update_save_point_restore_status",
309
- savePointId: params.savePointId,
310
- fields: {
311
- restoreStatus: "done",
312
- restoreCompletedAt: new Date().toISOString(),
313
- ...(integrationWarning ? { restoreError: integrationWarning } : {}),
314
- },
315
- });
316
- }
317
- catch {
318
- // Non-fatal: audit trail failure should not mask a successful restore
319
- }
320
- return successResult({
321
- restored: true,
322
- commitSha: targetSha,
323
- message: integrationWarning
324
- ? `Main branch restored to ${targetSha}. ${integrationWarning}`
325
- : `Main branch restored to ${targetSha}. Integration branch synced.`,
326
- });
327
- }
328
- default:
329
- return validationError(`Unknown action: ${params.action}`);
330
- }
331
- }));
332
- }
333
- //# sourceMappingURL=savePointHandlers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"savePointHandlers.js","sourceRoot":"","sources":["../../src/handlers/savePointHandlers.ts"],"names":[],"mappings":"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"}