remodex-cli 1.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 (99) hide show
  1. package/LICENSE +12 -0
  2. package/README.md +105 -0
  3. package/dist/archive-store.d.ts +28 -0
  4. package/dist/archive-store.js +68 -0
  5. package/dist/archive-store.js.map +1 -0
  6. package/dist/cli.d.ts +2 -0
  7. package/dist/cli.js +88 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/codex-process.d.ts +186 -0
  10. package/dist/codex-process.js +2111 -0
  11. package/dist/codex-process.js.map +1 -0
  12. package/dist/debug-trace-store.d.ts +15 -0
  13. package/dist/debug-trace-store.js +78 -0
  14. package/dist/debug-trace-store.js.map +1 -0
  15. package/dist/doctor.d.ts +58 -0
  16. package/dist/doctor.js +670 -0
  17. package/dist/doctor.js.map +1 -0
  18. package/dist/firebase-auth.d.ts +35 -0
  19. package/dist/firebase-auth.js +132 -0
  20. package/dist/firebase-auth.js.map +1 -0
  21. package/dist/gallery-store.d.ts +67 -0
  22. package/dist/gallery-store.js +333 -0
  23. package/dist/gallery-store.js.map +1 -0
  24. package/dist/git-assist.d.ts +7 -0
  25. package/dist/git-assist.js +51 -0
  26. package/dist/git-assist.js.map +1 -0
  27. package/dist/git-operations.d.ts +63 -0
  28. package/dist/git-operations.js +292 -0
  29. package/dist/git-operations.js.map +1 -0
  30. package/dist/image-store.d.ts +23 -0
  31. package/dist/image-store.js +142 -0
  32. package/dist/image-store.js.map +1 -0
  33. package/dist/index.d.ts +1 -0
  34. package/dist/index.js +198 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/mdns.d.ts +7 -0
  37. package/dist/mdns.js +49 -0
  38. package/dist/mdns.js.map +1 -0
  39. package/dist/parser.d.ts +620 -0
  40. package/dist/parser.js +423 -0
  41. package/dist/parser.js.map +1 -0
  42. package/dist/path-utils.d.ts +4 -0
  43. package/dist/path-utils.js +34 -0
  44. package/dist/path-utils.js.map +1 -0
  45. package/dist/project-history.d.ts +10 -0
  46. package/dist/project-history.js +73 -0
  47. package/dist/project-history.js.map +1 -0
  48. package/dist/prompt-history-backup.d.ts +15 -0
  49. package/dist/prompt-history-backup.js +46 -0
  50. package/dist/prompt-history-backup.js.map +1 -0
  51. package/dist/proxy.d.ts +15 -0
  52. package/dist/proxy.js +95 -0
  53. package/dist/proxy.js.map +1 -0
  54. package/dist/push-i18n.d.ts +7 -0
  55. package/dist/push-i18n.js +75 -0
  56. package/dist/push-i18n.js.map +1 -0
  57. package/dist/push-relay.d.ts +29 -0
  58. package/dist/push-relay.js +70 -0
  59. package/dist/push-relay.js.map +1 -0
  60. package/dist/recording-store.d.ts +51 -0
  61. package/dist/recording-store.js +158 -0
  62. package/dist/recording-store.js.map +1 -0
  63. package/dist/screenshot.d.ts +28 -0
  64. package/dist/screenshot.js +98 -0
  65. package/dist/screenshot.js.map +1 -0
  66. package/dist/sdk-process.d.ts +180 -0
  67. package/dist/sdk-process.js +960 -0
  68. package/dist/sdk-process.js.map +1 -0
  69. package/dist/session.d.ts +144 -0
  70. package/dist/session.js +687 -0
  71. package/dist/session.js.map +1 -0
  72. package/dist/sessions-index.d.ts +130 -0
  73. package/dist/sessions-index.js +1817 -0
  74. package/dist/sessions-index.js.map +1 -0
  75. package/dist/setup-launchd.d.ts +9 -0
  76. package/dist/setup-launchd.js +115 -0
  77. package/dist/setup-launchd.js.map +1 -0
  78. package/dist/setup-systemd.d.ts +9 -0
  79. package/dist/setup-systemd.js +122 -0
  80. package/dist/setup-systemd.js.map +1 -0
  81. package/dist/startup-info.d.ts +9 -0
  82. package/dist/startup-info.js +116 -0
  83. package/dist/startup-info.js.map +1 -0
  84. package/dist/usage.d.ts +69 -0
  85. package/dist/usage.js +545 -0
  86. package/dist/usage.js.map +1 -0
  87. package/dist/version.d.ts +13 -0
  88. package/dist/version.js +43 -0
  89. package/dist/version.js.map +1 -0
  90. package/dist/websocket.d.ts +132 -0
  91. package/dist/websocket.js +3551 -0
  92. package/dist/websocket.js.map +1 -0
  93. package/dist/worktree-store.d.ts +26 -0
  94. package/dist/worktree-store.js +61 -0
  95. package/dist/worktree-store.js.map +1 -0
  96. package/dist/worktree.d.ts +47 -0
  97. package/dist/worktree.js +330 -0
  98. package/dist/worktree.js.map +1 -0
  99. package/package.json +62 -0
package/dist/parser.js ADDED
@@ -0,0 +1,423 @@
1
+ // ---- Helpers ----
2
+ /** Normalize tool_result content: may be string or array of content blocks. */
3
+ export function normalizeToolResultContent(content) {
4
+ if (Array.isArray(content)) {
5
+ return content
6
+ .filter((c) => c.type === "text")
7
+ .map((c) => c.text)
8
+ .join("\n");
9
+ }
10
+ return typeof content === "string" ? content : String(content ?? "");
11
+ }
12
+ // ---- Parser ----
13
+ export function parseClientMessage(data) {
14
+ try {
15
+ const msg = JSON.parse(data);
16
+ if (!msg.type || typeof msg.type !== "string")
17
+ return null;
18
+ const hasOnlyKeys = (allowedKeys) => {
19
+ const allowed = new Set(allowedKeys);
20
+ return Object.keys(msg).every((key) => allowed.has(key));
21
+ };
22
+ switch (msg.type) {
23
+ case "start":
24
+ if (typeof msg.projectPath !== "string")
25
+ return null;
26
+ if (msg.model !== undefined && typeof msg.model !== "string")
27
+ return null;
28
+ if (msg.effort !== undefined &&
29
+ !["low", "medium", "high", "max"].includes(String(msg.effort)))
30
+ return null;
31
+ if (msg.maxTurns !== undefined &&
32
+ (!Number.isInteger(msg.maxTurns) || Number(msg.maxTurns) < 1))
33
+ return null;
34
+ if (msg.maxBudgetUsd !== undefined &&
35
+ (typeof msg.maxBudgetUsd !== "number" ||
36
+ !Number.isFinite(msg.maxBudgetUsd) ||
37
+ msg.maxBudgetUsd < 0))
38
+ return null;
39
+ if (msg.fallbackModel !== undefined &&
40
+ typeof msg.fallbackModel !== "string")
41
+ return null;
42
+ if (msg.forkSession !== undefined &&
43
+ typeof msg.forkSession !== "boolean")
44
+ return null;
45
+ if (msg.persistSession !== undefined &&
46
+ typeof msg.persistSession !== "boolean")
47
+ return null;
48
+ if (msg.networkAccessEnabled !== undefined &&
49
+ typeof msg.networkAccessEnabled !== "boolean")
50
+ return null;
51
+ if (msg.modelReasoningEffort !== undefined &&
52
+ !["minimal", "low", "medium", "high", "xhigh"].includes(String(msg.modelReasoningEffort)))
53
+ return null;
54
+ if (msg.executionMode !== undefined &&
55
+ !["default", "acceptEdits", "fullAccess"].includes(String(msg.executionMode)))
56
+ return null;
57
+ if (msg.approvalPolicy !== undefined &&
58
+ !["untrusted", "on-request", "on-failure", "never"].includes(String(msg.approvalPolicy)))
59
+ return null;
60
+ if (msg.planMode !== undefined && typeof msg.planMode !== "boolean")
61
+ return null;
62
+ if (msg.webSearchMode !== undefined &&
63
+ !["disabled", "cached", "live"].includes(String(msg.webSearchMode)))
64
+ return null;
65
+ break;
66
+ case "input":
67
+ if (typeof msg.text !== "string")
68
+ return null;
69
+ // Validate images array if provided
70
+ if (msg.images !== undefined) {
71
+ if (!Array.isArray(msg.images))
72
+ return null;
73
+ for (const img of msg.images) {
74
+ if (typeof img?.base64 !== "string" ||
75
+ typeof img?.mimeType !== "string")
76
+ return null;
77
+ }
78
+ }
79
+ // Legacy: imageBase64 requires mimeType
80
+ if (msg.imageBase64 && typeof msg.mimeType !== "string")
81
+ return null;
82
+ break;
83
+ case "push_register":
84
+ if (typeof msg.token !== "string")
85
+ return null;
86
+ if (msg.platform !== "ios" &&
87
+ msg.platform !== "android" &&
88
+ msg.platform !== "web")
89
+ return null;
90
+ break;
91
+ case "push_unregister":
92
+ if (typeof msg.token !== "string")
93
+ return null;
94
+ break;
95
+ case "set_permission_mode":
96
+ if (typeof msg.mode !== "string" ||
97
+ !["default", "acceptEdits", "bypassPermissions", "plan"].includes(msg.mode))
98
+ return null;
99
+ if (msg.executionMode !== undefined &&
100
+ !["default", "acceptEdits", "fullAccess"].includes(String(msg.executionMode)))
101
+ return null;
102
+ if (msg.approvalPolicy !== undefined &&
103
+ !["untrusted", "on-request", "on-failure", "never"].includes(String(msg.approvalPolicy)))
104
+ return null;
105
+ if (msg.planMode !== undefined && typeof msg.planMode !== "boolean")
106
+ return null;
107
+ break;
108
+ case "set_sandbox_mode":
109
+ if (typeof msg.sandboxMode !== "string")
110
+ return null;
111
+ break;
112
+ case "approve":
113
+ if (typeof msg.id !== "string")
114
+ return null;
115
+ break;
116
+ case "approve_always":
117
+ if (typeof msg.id !== "string")
118
+ return null;
119
+ break;
120
+ case "reject":
121
+ if (typeof msg.id !== "string")
122
+ return null;
123
+ break;
124
+ case "answer":
125
+ if (typeof msg.toolUseId !== "string" || typeof msg.result !== "string")
126
+ return null;
127
+ break;
128
+ case "list_sessions":
129
+ break;
130
+ case "stop_session":
131
+ if (typeof msg.sessionId !== "string")
132
+ return null;
133
+ break;
134
+ case "rename_session":
135
+ if (typeof msg.sessionId !== "string")
136
+ return null;
137
+ break;
138
+ case "get_history":
139
+ if (typeof msg.sessionId !== "string")
140
+ return null;
141
+ break;
142
+ case "list_recent_sessions":
143
+ break;
144
+ case "resume_session":
145
+ if (typeof msg.sessionId !== "string" ||
146
+ typeof msg.projectPath !== "string")
147
+ return null;
148
+ if (msg.provider &&
149
+ msg.provider !== "claude" &&
150
+ msg.provider !== "codex")
151
+ return null;
152
+ if (msg.model !== undefined && typeof msg.model !== "string")
153
+ return null;
154
+ if (msg.effort !== undefined &&
155
+ !["low", "medium", "high", "max"].includes(String(msg.effort)))
156
+ return null;
157
+ if (msg.maxTurns !== undefined &&
158
+ (!Number.isInteger(msg.maxTurns) || Number(msg.maxTurns) < 1))
159
+ return null;
160
+ if (msg.maxBudgetUsd !== undefined &&
161
+ (typeof msg.maxBudgetUsd !== "number" ||
162
+ !Number.isFinite(msg.maxBudgetUsd) ||
163
+ msg.maxBudgetUsd < 0))
164
+ return null;
165
+ if (msg.fallbackModel !== undefined &&
166
+ typeof msg.fallbackModel !== "string")
167
+ return null;
168
+ if (msg.forkSession !== undefined &&
169
+ typeof msg.forkSession !== "boolean")
170
+ return null;
171
+ if (msg.persistSession !== undefined &&
172
+ typeof msg.persistSession !== "boolean")
173
+ return null;
174
+ if (msg.networkAccessEnabled !== undefined &&
175
+ typeof msg.networkAccessEnabled !== "boolean")
176
+ return null;
177
+ if (msg.modelReasoningEffort !== undefined &&
178
+ !["minimal", "low", "medium", "high", "xhigh"].includes(String(msg.modelReasoningEffort)))
179
+ return null;
180
+ if (msg.executionMode !== undefined &&
181
+ !["default", "acceptEdits", "fullAccess"].includes(String(msg.executionMode)))
182
+ return null;
183
+ if (msg.approvalPolicy !== undefined &&
184
+ !["untrusted", "on-request", "on-failure", "never"].includes(String(msg.approvalPolicy)))
185
+ return null;
186
+ if (msg.planMode !== undefined && typeof msg.planMode !== "boolean")
187
+ return null;
188
+ if (msg.webSearchMode !== undefined &&
189
+ !["disabled", "cached", "live"].includes(String(msg.webSearchMode)))
190
+ return null;
191
+ break;
192
+ case "list_gallery":
193
+ break;
194
+ case "read_file":
195
+ if (typeof msg.projectPath !== "string")
196
+ return null;
197
+ if (typeof msg.filePath !== "string")
198
+ return null;
199
+ break;
200
+ case "list_files":
201
+ if (typeof msg.projectPath !== "string")
202
+ return null;
203
+ break;
204
+ case "get_diff":
205
+ if (typeof msg.projectPath !== "string")
206
+ return null;
207
+ break;
208
+ case "get_diff_image":
209
+ if (typeof msg.projectPath !== "string")
210
+ return null;
211
+ if (typeof msg.filePath !== "string")
212
+ return null;
213
+ if (msg.version !== "old" &&
214
+ msg.version !== "new" &&
215
+ msg.version !== "both")
216
+ return null;
217
+ break;
218
+ case "interrupt":
219
+ break;
220
+ case "list_project_history":
221
+ break;
222
+ case "remove_project_history":
223
+ if (typeof msg.projectPath !== "string")
224
+ return null;
225
+ break;
226
+ case "list_worktrees":
227
+ if (typeof msg.projectPath !== "string")
228
+ return null;
229
+ break;
230
+ case "remove_worktree":
231
+ if (typeof msg.projectPath !== "string" ||
232
+ typeof msg.worktreePath !== "string")
233
+ return null;
234
+ break;
235
+ case "rewind":
236
+ if (typeof msg.sessionId !== "string" ||
237
+ typeof msg.targetUuid !== "string")
238
+ return null;
239
+ if (msg.mode !== "conversation" &&
240
+ msg.mode !== "code" &&
241
+ msg.mode !== "both")
242
+ return null;
243
+ break;
244
+ case "rewind_dry_run":
245
+ if (typeof msg.sessionId !== "string" ||
246
+ typeof msg.targetUuid !== "string")
247
+ return null;
248
+ break;
249
+ case "list_windows":
250
+ break;
251
+ case "take_screenshot":
252
+ if (msg.mode !== "fullscreen" && msg.mode !== "window")
253
+ return null;
254
+ if (msg.mode === "window" && typeof msg.windowId !== "number")
255
+ return null;
256
+ if (typeof msg.projectPath !== "string")
257
+ return null;
258
+ break;
259
+ case "get_debug_bundle":
260
+ if (typeof msg.sessionId !== "string")
261
+ return null;
262
+ if (msg.traceLimit !== undefined && typeof msg.traceLimit !== "number")
263
+ return null;
264
+ if (msg.includeDiff !== undefined &&
265
+ typeof msg.includeDiff !== "boolean")
266
+ return null;
267
+ break;
268
+ case "get_usage":
269
+ break;
270
+ case "list_recordings":
271
+ break;
272
+ case "get_recording":
273
+ if (typeof msg.sessionId !== "string")
274
+ return null;
275
+ break;
276
+ case "get_message_images":
277
+ if (typeof msg.claudeSessionId !== "string" ||
278
+ typeof msg.messageUuid !== "string")
279
+ return null;
280
+ break;
281
+ case "backup_prompt_history":
282
+ if (typeof msg.data !== "string")
283
+ return null;
284
+ if (typeof msg.appVersion !== "string")
285
+ return null;
286
+ if (typeof msg.dbVersion !== "number" ||
287
+ !Number.isInteger(msg.dbVersion))
288
+ return null;
289
+ break;
290
+ case "restore_prompt_history":
291
+ break;
292
+ case "get_prompt_history_backup_info":
293
+ break;
294
+ case "refresh_branch":
295
+ if (typeof msg.sessionId !== "string")
296
+ return null;
297
+ break;
298
+ // ---- Git Operations (Phase 1-3) ----
299
+ case "git_stage":
300
+ if (typeof msg.projectPath !== "string")
301
+ return null;
302
+ if (!Array.isArray(msg.files) && !Array.isArray(msg.hunks))
303
+ return null;
304
+ if (msg.hunks !== undefined) {
305
+ if (!Array.isArray(msg.hunks))
306
+ return null;
307
+ for (const h of msg.hunks) {
308
+ const hunk = h;
309
+ if (typeof hunk?.file !== "string" ||
310
+ typeof hunk?.hunkIndex !== "number")
311
+ return null;
312
+ }
313
+ }
314
+ break;
315
+ case "git_unstage":
316
+ if (typeof msg.projectPath !== "string")
317
+ return null;
318
+ break;
319
+ case "git_unstage_hunks":
320
+ if (typeof msg.projectPath !== "string")
321
+ return null;
322
+ if (!Array.isArray(msg.hunks) || msg.hunks.length === 0)
323
+ return null;
324
+ for (const h of msg.hunks) {
325
+ const hunk = h;
326
+ if (typeof hunk?.file !== "string" ||
327
+ typeof hunk?.hunkIndex !== "number")
328
+ return null;
329
+ }
330
+ break;
331
+ case "git_commit":
332
+ if (!hasOnlyKeys([
333
+ "type",
334
+ "projectPath",
335
+ "sessionId",
336
+ "message",
337
+ "autoGenerate",
338
+ ]))
339
+ return null;
340
+ if (typeof msg.projectPath !== "string")
341
+ return null;
342
+ if (msg.sessionId !== undefined && typeof msg.sessionId !== "string")
343
+ return null;
344
+ if (msg.message !== undefined && typeof msg.message !== "string")
345
+ return null;
346
+ if (msg.autoGenerate !== undefined &&
347
+ typeof msg.autoGenerate !== "boolean")
348
+ return null;
349
+ break;
350
+ case "git_push":
351
+ if (!hasOnlyKeys(["type", "projectPath"]))
352
+ return null;
353
+ if (typeof msg.projectPath !== "string")
354
+ return null;
355
+ break;
356
+ case "git_branches":
357
+ if (!hasOnlyKeys(["type", "projectPath"]))
358
+ return null;
359
+ if (typeof msg.projectPath !== "string")
360
+ return null;
361
+ break;
362
+ case "git_create_branch":
363
+ if (typeof msg.projectPath !== "string")
364
+ return null;
365
+ if (typeof msg.name !== "string")
366
+ return null;
367
+ if (msg.checkout !== undefined && typeof msg.checkout !== "boolean")
368
+ return null;
369
+ break;
370
+ case "git_checkout_branch":
371
+ if (typeof msg.projectPath !== "string")
372
+ return null;
373
+ if (typeof msg.branch !== "string")
374
+ return null;
375
+ break;
376
+ case "git_revert_file":
377
+ if (typeof msg.projectPath !== "string")
378
+ return null;
379
+ if (!Array.isArray(msg.files))
380
+ return null;
381
+ break;
382
+ case "git_revert_hunks":
383
+ if (typeof msg.projectPath !== "string")
384
+ return null;
385
+ if (!Array.isArray(msg.hunks) || msg.hunks.length === 0)
386
+ return null;
387
+ for (const h of msg.hunks) {
388
+ const hunk = h;
389
+ if (typeof hunk?.file !== "string" ||
390
+ typeof hunk?.hunkIndex !== "number")
391
+ return null;
392
+ }
393
+ break;
394
+ case "git_fetch":
395
+ if (typeof msg.projectPath !== "string")
396
+ return null;
397
+ break;
398
+ case "git_pull":
399
+ if (typeof msg.projectPath !== "string")
400
+ return null;
401
+ break;
402
+ case "git_remote_status":
403
+ if (typeof msg.projectPath !== "string")
404
+ return null;
405
+ break;
406
+ case "archive_session":
407
+ if (typeof msg.sessionId !== "string")
408
+ return null;
409
+ if (msg.provider !== "claude" && msg.provider !== "codex")
410
+ return null;
411
+ if (typeof msg.projectPath !== "string")
412
+ return null;
413
+ break;
414
+ default:
415
+ return null;
416
+ }
417
+ return msg;
418
+ }
419
+ catch {
420
+ return null;
421
+ }
422
+ }
423
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function stripWindowsExtendedPathPrefix(input: string): string;
2
+ export declare function normalizePlatformPath(input: string, platform?: NodeJS.Platform): string;
3
+ export declare function resolvePlatformPath(input: string, platform?: NodeJS.Platform): string;
4
+ export declare function isPathWithinAllowedDirectory(targetPath: string, allowedDir: string, platform?: NodeJS.Platform): boolean;
@@ -0,0 +1,34 @@
1
+ import { posix, win32 } from "node:path";
2
+ function getPathApi(platform) {
3
+ return platform === "win32" ? win32 : posix;
4
+ }
5
+ export function stripWindowsExtendedPathPrefix(input) {
6
+ if (!input.startsWith("\\\\?\\"))
7
+ return input;
8
+ if (input.startsWith("\\\\?\\UNC\\")) {
9
+ return `\\\\${input.slice("\\\\?\\UNC\\".length)}`;
10
+ }
11
+ const trimmed = input.slice("\\\\?\\".length);
12
+ return /^[A-Za-z]:[\\/]/.test(trimmed) ? trimmed : input;
13
+ }
14
+ export function normalizePlatformPath(input, platform = process.platform) {
15
+ const pathApi = getPathApi(platform);
16
+ const value = platform === "win32" ? stripWindowsExtendedPathPrefix(input) : input;
17
+ return pathApi.normalize(value);
18
+ }
19
+ export function resolvePlatformPath(input, platform = process.platform) {
20
+ const pathApi = getPathApi(platform);
21
+ return pathApi.resolve(normalizePlatformPath(input, platform));
22
+ }
23
+ export function isPathWithinAllowedDirectory(targetPath, allowedDir, platform = process.platform) {
24
+ const pathApi = getPathApi(platform);
25
+ const resolvedTarget = resolvePlatformPath(targetPath, platform);
26
+ const resolvedAllowedDir = resolvePlatformPath(allowedDir, platform);
27
+ if (resolvedTarget === resolvedAllowedDir)
28
+ return true;
29
+ const relativePath = pathApi.relative(resolvedAllowedDir, resolvedTarget);
30
+ return (relativePath !== "" &&
31
+ !relativePath.startsWith("..") &&
32
+ !pathApi.isAbsolute(relativePath));
33
+ }
34
+ //# sourceMappingURL=path-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../src/path-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAEzC,SAAS,UAAU,CAAC,QAAyB;IAC3C,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,KAAa;IAC1D,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAE/C,IAAI,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACrC,OAAO,OAAO,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;IACrD,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAAa,EACb,WAA4B,OAAO,CAAC,QAAQ;IAE5C,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,KAAK,GACT,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACvE,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,KAAa,EACb,WAA4B,OAAO,CAAC,QAAQ;IAE5C,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,UAAkB,EAClB,UAAkB,EAClB,WAA4B,OAAO,CAAC,QAAQ;IAE5C,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,cAAc,GAAG,mBAAmB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACjE,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAErE,IAAI,cAAc,KAAK,kBAAkB;QAAE,OAAO,IAAI,CAAC;IAEvD,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;IAC1E,OAAO,CACL,YAAY,KAAK,EAAE;QACnB,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC;QAC9B,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAClC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare class ProjectHistory {
2
+ private projects;
3
+ private readonly filePath;
4
+ constructor(filePath?: string);
5
+ init(): Promise<void>;
6
+ addProject(path: string): void;
7
+ getProjects(): string[];
8
+ removeProject(path: string): void;
9
+ private saveIndex;
10
+ }
@@ -0,0 +1,73 @@
1
+ import { readFile, writeFile, mkdir } from "node:fs/promises";
2
+ import { join, dirname } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { normalizeWorktreePath } from "./sessions-index.js";
5
+ const DEFAULT_HISTORY_FILE = join(homedir(), ".remodex", "project-history.json");
6
+ const MAX_PROJECTS = 20;
7
+ /** Minimum path depth to be considered a valid project path (e.g. /Users/name/project = 3). */
8
+ const MIN_PATH_SEGMENTS = 3;
9
+ function isValidProjectPath(path) {
10
+ if (!path.startsWith("/"))
11
+ return false;
12
+ const segments = path.split("/").filter(Boolean);
13
+ return segments.length >= MIN_PATH_SEGMENTS;
14
+ }
15
+ export class ProjectHistory {
16
+ projects = [];
17
+ filePath;
18
+ constructor(filePath) {
19
+ this.filePath = filePath ?? DEFAULT_HISTORY_FILE;
20
+ }
21
+ async init() {
22
+ await mkdir(dirname(this.filePath), { recursive: true });
23
+ try {
24
+ const data = await readFile(this.filePath, "utf-8");
25
+ const parsed = JSON.parse(data);
26
+ if (Array.isArray(parsed)) {
27
+ const raw = parsed.filter((p) => typeof p === "string");
28
+ // Normalize worktree paths and deduplicate (keep first occurrence)
29
+ const seen = new Set();
30
+ this.projects = raw
31
+ .map(normalizeWorktreePath)
32
+ .filter(isValidProjectPath)
33
+ .filter((p) => seen.has(p) ? false : (seen.add(p), true));
34
+ // Persist cleaned data if invalid entries were removed
35
+ if (this.projects.length < raw.length) {
36
+ this.saveIndex().catch(() => { });
37
+ }
38
+ }
39
+ }
40
+ catch {
41
+ // File doesn't exist or is corrupt — start fresh
42
+ this.projects = [];
43
+ }
44
+ }
45
+ addProject(path) {
46
+ const normalized = normalizeWorktreePath(path);
47
+ if (!isValidProjectPath(normalized))
48
+ return;
49
+ // Remove existing entry (if any) and add to front
50
+ this.projects = this.projects.filter((p) => p !== normalized);
51
+ this.projects.unshift(normalized);
52
+ // Enforce max limit
53
+ if (this.projects.length > MAX_PROJECTS) {
54
+ this.projects = this.projects.slice(0, MAX_PROJECTS);
55
+ }
56
+ this.saveIndex().catch((err) => {
57
+ console.error("[project-history] Failed to save:", err);
58
+ });
59
+ }
60
+ getProjects() {
61
+ return [...this.projects];
62
+ }
63
+ removeProject(path) {
64
+ this.projects = this.projects.filter((p) => p !== path);
65
+ this.saveIndex().catch((err) => {
66
+ console.error("[project-history] Failed to save:", err);
67
+ });
68
+ }
69
+ async saveIndex() {
70
+ await writeFile(this.filePath, JSON.stringify(this.projects, null, 2), "utf-8");
71
+ }
72
+ }
73
+ //# sourceMappingURL=project-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-history.js","sourceRoot":"","sources":["../src/project-history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface BackupMeta {
2
+ appVersion: string;
3
+ dbVersion: number;
4
+ backedUpAt: string;
5
+ sizeBytes: number;
6
+ }
7
+ export declare class PromptHistoryBackupStore {
8
+ init(): Promise<void>;
9
+ save(data: Buffer, appVersion: string, dbVersion: number): Promise<BackupMeta>;
10
+ load(): Promise<{
11
+ data: Buffer;
12
+ meta: BackupMeta;
13
+ } | null>;
14
+ getMeta(): Promise<BackupMeta | null>;
15
+ }
@@ -0,0 +1,46 @@
1
+ import { readFile, writeFile, mkdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ const BACKUP_DIR = join(homedir(), ".remodex", "prompt-history-backup");
5
+ const BACKUP_FILE = join(BACKUP_DIR, "backup.db");
6
+ const META_FILE = join(BACKUP_DIR, "meta.json");
7
+ export class PromptHistoryBackupStore {
8
+ async init() {
9
+ await mkdir(BACKUP_DIR, { recursive: true });
10
+ }
11
+ async save(data, appVersion, dbVersion) {
12
+ await mkdir(BACKUP_DIR, { recursive: true });
13
+ await writeFile(BACKUP_FILE, data);
14
+ const meta = {
15
+ appVersion,
16
+ dbVersion,
17
+ backedUpAt: new Date().toISOString(),
18
+ sizeBytes: data.length,
19
+ };
20
+ await writeFile(META_FILE, JSON.stringify(meta, null, 2), "utf-8");
21
+ return meta;
22
+ }
23
+ async load() {
24
+ try {
25
+ const [data, metaRaw] = await Promise.all([
26
+ readFile(BACKUP_FILE),
27
+ readFile(META_FILE, "utf-8"),
28
+ ]);
29
+ const meta = JSON.parse(metaRaw);
30
+ return { data, meta };
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ async getMeta() {
37
+ try {
38
+ const metaRaw = await readFile(META_FILE, "utf-8");
39
+ return JSON.parse(metaRaw);
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ }
46
+ //# sourceMappingURL=prompt-history-backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-history-backup.js","sourceRoot":"","sources":["../src/prompt-history-backup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AASlC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,uBAAuB,CAAC,CAAC;AACxE,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAEhD,MAAM,OAAO,wBAAwB;IACnC,KAAK,CAAC,IAAI;QACR,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,UAAkB,EAAE,SAAiB;QAC5D,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACnC,MAAM,IAAI,GAAe;YACvB,UAAU;YACV,SAAS;YACT,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,SAAS,EAAE,IAAI,CAAC,MAAM;SACvB,CAAC;QACF,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACxC,QAAQ,CAAC,WAAW,CAAC;gBACrB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;aAC7B,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;YAC/C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}