@nanocollective/nanocoder 1.17.3 → 1.19.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 (688) hide show
  1. package/README.md +178 -13
  2. package/assets/nanocoder-vscode.vsix +0 -0
  3. package/dist/ai-sdk-client-empty-message.spec.d.ts +2 -0
  4. package/dist/ai-sdk-client-empty-message.spec.d.ts.map +1 -0
  5. package/dist/ai-sdk-client-empty-message.spec.js +124 -0
  6. package/dist/ai-sdk-client-empty-message.spec.js.map +1 -0
  7. package/dist/ai-sdk-client.d.ts +19 -3
  8. package/dist/ai-sdk-client.d.ts.map +1 -1
  9. package/dist/ai-sdk-client.js +359 -211
  10. package/dist/ai-sdk-client.js.map +1 -1
  11. package/dist/app/utils/appUtils.d.ts +1 -1
  12. package/dist/app/utils/appUtils.d.ts.map +1 -1
  13. package/dist/app/utils/appUtils.js +80 -14
  14. package/dist/app/utils/appUtils.js.map +1 -1
  15. package/dist/app.d.ts +22 -1
  16. package/dist/app.d.ts.map +1 -1
  17. package/dist/app.js +369 -53
  18. package/dist/app.js.map +1 -1
  19. package/dist/cli.js +37 -2
  20. package/dist/cli.js.map +1 -1
  21. package/dist/cli.spec.d.ts +2 -0
  22. package/dist/cli.spec.d.ts.map +1 -0
  23. package/dist/cli.spec.js +101 -0
  24. package/dist/cli.spec.js.map +1 -0
  25. package/dist/client-factory.d.ts.map +1 -1
  26. package/dist/client-factory.js +2 -2
  27. package/dist/client-factory.js.map +1 -1
  28. package/dist/commands/checkpoint.d.ts +6 -0
  29. package/dist/commands/checkpoint.d.ts.map +1 -0
  30. package/dist/commands/checkpoint.js +277 -0
  31. package/dist/commands/checkpoint.js.map +1 -0
  32. package/dist/commands/clear.d.ts.map +1 -1
  33. package/dist/commands/clear.js +1 -1
  34. package/dist/commands/clear.js.map +1 -1
  35. package/dist/commands/custom-commands.d.ts.map +1 -1
  36. package/dist/commands/custom-commands.js +4 -4
  37. package/dist/commands/custom-commands.js.map +1 -1
  38. package/dist/commands/exit.d.ts.map +1 -1
  39. package/dist/commands/exit.js.map +1 -1
  40. package/dist/commands/export.d.ts.map +1 -1
  41. package/dist/commands/export.js +2 -2
  42. package/dist/commands/export.js.map +1 -1
  43. package/dist/commands/help.d.ts.map +1 -1
  44. package/dist/commands/help.js +5 -5
  45. package/dist/commands/help.js.map +1 -1
  46. package/dist/commands/index.d.ts +2 -2
  47. package/dist/commands/index.d.ts.map +1 -1
  48. package/dist/commands/index.js +2 -2
  49. package/dist/commands/index.js.map +1 -1
  50. package/dist/commands/init.d.ts.map +1 -1
  51. package/dist/commands/init.js +15 -14
  52. package/dist/commands/init.js.map +1 -1
  53. package/dist/commands/lsp.d.ts.map +1 -1
  54. package/dist/commands/lsp.js +6 -6
  55. package/dist/commands/lsp.js.map +1 -1
  56. package/dist/commands/mcp.d.ts +1 -1
  57. package/dist/commands/mcp.d.ts.map +1 -1
  58. package/dist/commands/mcp.js +6 -6
  59. package/dist/commands/mcp.js.map +1 -1
  60. package/dist/commands/model-database.d.ts +8 -0
  61. package/dist/commands/model-database.d.ts.map +1 -0
  62. package/dist/commands/model-database.js +193 -0
  63. package/dist/commands/model-database.js.map +1 -0
  64. package/dist/commands/model.d.ts.map +1 -1
  65. package/dist/commands/model.js.map +1 -1
  66. package/dist/commands/provider.d.ts.map +1 -1
  67. package/dist/commands/provider.js.map +1 -1
  68. package/dist/commands/setup-config.js +1 -1
  69. package/dist/commands/setup-config.js.map +1 -1
  70. package/dist/commands/status.d.ts.map +1 -1
  71. package/dist/commands/status.js.map +1 -1
  72. package/dist/commands/theme.d.ts.map +1 -1
  73. package/dist/commands/theme.js.map +1 -1
  74. package/dist/commands/update.d.ts.map +1 -1
  75. package/dist/commands/update.js +5 -5
  76. package/dist/commands/update.js.map +1 -1
  77. package/dist/commands/usage.d.ts.map +1 -1
  78. package/dist/commands/usage.js +4 -4
  79. package/dist/commands/usage.js.map +1 -1
  80. package/dist/commands.d.ts.map +1 -1
  81. package/dist/commands.js +1 -1
  82. package/dist/commands.js.map +1 -1
  83. package/dist/components/assistant-message.d.ts.map +1 -1
  84. package/dist/components/assistant-message.js +5 -4
  85. package/dist/components/assistant-message.js.map +1 -1
  86. package/dist/components/bash-execution-indicator.d.ts.map +1 -1
  87. package/dist/components/bash-execution-indicator.js +2 -2
  88. package/dist/components/bash-execution-indicator.js.map +1 -1
  89. package/dist/components/cancelling-indicator.js +3 -3
  90. package/dist/components/cancelling-indicator.js.map +1 -1
  91. package/dist/components/chat-queue.d.ts.map +1 -1
  92. package/dist/components/chat-queue.js +1 -1
  93. package/dist/components/chat-queue.js.map +1 -1
  94. package/dist/components/checkpoint-display.d.ts +8 -0
  95. package/dist/components/checkpoint-display.d.ts.map +1 -0
  96. package/dist/components/checkpoint-display.js +29 -0
  97. package/dist/components/checkpoint-display.js.map +1 -0
  98. package/dist/components/checkpoint-selector.d.ts +11 -0
  99. package/dist/components/checkpoint-selector.d.ts.map +1 -0
  100. package/dist/components/checkpoint-selector.js +55 -0
  101. package/dist/components/checkpoint-selector.js.map +1 -0
  102. package/dist/components/error-message.d.ts.map +1 -1
  103. package/dist/components/error-message.js +4 -4
  104. package/dist/components/error-message.js.map +1 -1
  105. package/dist/components/info-message.d.ts.map +1 -1
  106. package/dist/components/info-message.js +4 -4
  107. package/dist/components/info-message.js.map +1 -1
  108. package/dist/components/model-selector.d.ts.map +1 -1
  109. package/dist/components/model-selector.js +7 -7
  110. package/dist/components/model-selector.js.map +1 -1
  111. package/dist/components/provider-selector.d.ts.map +1 -1
  112. package/dist/components/provider-selector.js +6 -6
  113. package/dist/components/provider-selector.js.map +1 -1
  114. package/dist/components/security-disclaimer.d.ts.map +1 -1
  115. package/dist/components/security-disclaimer.js +4 -4
  116. package/dist/components/security-disclaimer.js.map +1 -1
  117. package/dist/components/status.d.ts +5 -0
  118. package/dist/components/status.d.ts.map +1 -1
  119. package/dist/components/status.js +36 -7
  120. package/dist/components/status.js.map +1 -1
  121. package/dist/components/success-message.d.ts.map +1 -1
  122. package/dist/components/success-message.js +4 -4
  123. package/dist/components/success-message.js.map +1 -1
  124. package/dist/components/theme-selector.d.ts.map +1 -1
  125. package/dist/components/theme-selector.js +8 -8
  126. package/dist/components/theme-selector.js.map +1 -1
  127. package/dist/components/tool-confirmation.d.ts.map +1 -1
  128. package/dist/components/tool-confirmation.js +7 -7
  129. package/dist/components/tool-confirmation.js.map +1 -1
  130. package/dist/components/tool-execution-indicator.d.ts.map +1 -1
  131. package/dist/components/tool-execution-indicator.js +2 -2
  132. package/dist/components/tool-execution-indicator.js.map +1 -1
  133. package/dist/components/tool-message.d.ts.map +1 -1
  134. package/dist/components/tool-message.js +4 -5
  135. package/dist/components/tool-message.js.map +1 -1
  136. package/dist/components/ui/titled-box.d.ts +16 -0
  137. package/dist/components/ui/titled-box.d.ts.map +1 -0
  138. package/dist/components/ui/titled-box.js +10 -0
  139. package/dist/components/ui/titled-box.js.map +1 -0
  140. package/dist/components/usage/progress-bar.d.ts.map +1 -1
  141. package/dist/components/usage/progress-bar.js +3 -0
  142. package/dist/components/usage/progress-bar.js.map +1 -1
  143. package/dist/components/usage/usage-display.d.ts.map +1 -1
  144. package/dist/components/usage/usage-display.js +7 -4
  145. package/dist/components/usage/usage-display.js.map +1 -1
  146. package/dist/components/user-input.d.ts.map +1 -1
  147. package/dist/components/user-input.js +9 -8
  148. package/dist/components/user-input.js.map +1 -1
  149. package/dist/components/user-message.d.ts.map +1 -1
  150. package/dist/components/user-message.js +1 -1
  151. package/dist/components/user-message.js.map +1 -1
  152. package/dist/components/vscode-extension-prompt.js +3 -3
  153. package/dist/components/vscode-extension-prompt.js.map +1 -1
  154. package/dist/components/warning-message.d.ts.map +1 -1
  155. package/dist/components/warning-message.js +4 -4
  156. package/dist/components/warning-message.js.map +1 -1
  157. package/dist/components/welcome-message.d.ts.map +1 -1
  158. package/dist/components/welcome-message.js +4 -4
  159. package/dist/components/welcome-message.js.map +1 -1
  160. package/dist/config/index.d.ts.map +1 -1
  161. package/dist/config/index.js +7 -7
  162. package/dist/config/index.js.map +1 -1
  163. package/dist/config/index.spec.js +4 -4
  164. package/dist/config/index.spec.js.map +1 -1
  165. package/dist/config/paths.spec.js +1 -1
  166. package/dist/config/paths.spec.js.map +1 -1
  167. package/dist/config/preferences.d.ts +0 -2
  168. package/dist/config/preferences.d.ts.map +1 -1
  169. package/dist/config/preferences.js +1 -11
  170. package/dist/config/preferences.js.map +1 -1
  171. package/dist/context/mode-context.d.ts +12 -0
  172. package/dist/context/mode-context.d.ts.map +1 -0
  173. package/dist/context/mode-context.js +21 -0
  174. package/dist/context/mode-context.js.map +1 -0
  175. package/dist/context/mode-context.spec.d.ts +2 -0
  176. package/dist/context/mode-context.spec.d.ts.map +1 -0
  177. package/dist/context/mode-context.spec.js +61 -0
  178. package/dist/context/mode-context.spec.js.map +1 -0
  179. package/dist/custom-commands/executor.d.ts.map +1 -1
  180. package/dist/custom-commands/executor.js.map +1 -1
  181. package/dist/custom-commands/loader.d.ts.map +1 -1
  182. package/dist/custom-commands/loader.js +1 -1
  183. package/dist/custom-commands/loader.js.map +1 -1
  184. package/dist/custom-commands/parser.d.ts.map +1 -1
  185. package/dist/custom-commands/parser.js.map +1 -1
  186. package/dist/hooks/useAppInitialization.d.ts +9 -5
  187. package/dist/hooks/useAppInitialization.d.ts.map +1 -1
  188. package/dist/hooks/useAppInitialization.js +119 -45
  189. package/dist/hooks/useAppInitialization.js.map +1 -1
  190. package/dist/hooks/useAppState.d.ts +28 -9
  191. package/dist/hooks/useAppState.d.ts.map +1 -1
  192. package/dist/hooks/useAppState.js +28 -8
  193. package/dist/hooks/useAppState.js.map +1 -1
  194. package/dist/hooks/useChatHandler.d.ts +5 -3
  195. package/dist/hooks/useChatHandler.d.ts.map +1 -1
  196. package/dist/hooks/useChatHandler.js +218 -118
  197. package/dist/hooks/useChatHandler.js.map +1 -1
  198. package/dist/hooks/useDirectoryTrust.js +1 -1
  199. package/dist/hooks/useDirectoryTrust.js.map +1 -1
  200. package/dist/hooks/useInputState.js +2 -2
  201. package/dist/hooks/useInputState.js.map +1 -1
  202. package/dist/hooks/useModeHandlers.d.ts +5 -5
  203. package/dist/hooks/useModeHandlers.d.ts.map +1 -1
  204. package/dist/hooks/useModeHandlers.js +12 -12
  205. package/dist/hooks/useModeHandlers.js.map +1 -1
  206. package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
  207. package/dist/hooks/useTerminalWidth.js +3 -3
  208. package/dist/hooks/useTerminalWidth.js.map +1 -1
  209. package/dist/hooks/useTheme.d.ts.map +1 -1
  210. package/dist/hooks/useTheme.js +1 -1
  211. package/dist/hooks/useTheme.js.map +1 -1
  212. package/dist/hooks/useToolHandler.d.ts +1 -1
  213. package/dist/hooks/useToolHandler.d.ts.map +1 -1
  214. package/dist/hooks/useToolHandler.js +4 -4
  215. package/dist/hooks/useToolHandler.js.map +1 -1
  216. package/dist/hooks/useUIState.d.ts +1 -1
  217. package/dist/hooks/useUIState.d.ts.map +1 -1
  218. package/dist/hooks/useUIState.js.map +1 -1
  219. package/dist/hooks/useVSCodeServer.js +2 -2
  220. package/dist/hooks/useVSCodeServer.js.map +1 -1
  221. package/dist/init/agents-template-generator.d.ts +1 -1
  222. package/dist/init/agents-template-generator.d.ts.map +1 -1
  223. package/dist/init/agents-template-generator.js.map +1 -1
  224. package/dist/init/existing-rules-extractor.js +1 -1
  225. package/dist/init/existing-rules-extractor.js.map +1 -1
  226. package/dist/init/file-scanner.js +2 -2
  227. package/dist/init/file-scanner.js.map +1 -1
  228. package/dist/init/framework-detector.js +1 -1
  229. package/dist/init/framework-detector.js.map +1 -1
  230. package/dist/init/project-analyzer.d.ts +1 -1
  231. package/dist/init/project-analyzer.d.ts.map +1 -1
  232. package/dist/init/project-analyzer.js +3 -3
  233. package/dist/init/project-analyzer.js.map +1 -1
  234. package/dist/lsp/lsp-client.d.ts +1 -1
  235. package/dist/lsp/lsp-client.d.ts.map +1 -1
  236. package/dist/lsp/lsp-client.js +1 -1
  237. package/dist/lsp/lsp-client.js.map +1 -1
  238. package/dist/lsp/lsp-client.spec.js +1 -2
  239. package/dist/lsp/lsp-client.spec.js.map +1 -1
  240. package/dist/lsp/lsp-manager.d.ts +1 -1
  241. package/dist/lsp/lsp-manager.d.ts.map +1 -1
  242. package/dist/lsp/lsp-manager.js.map +1 -1
  243. package/dist/lsp/lsp-manager.spec.js +1 -1
  244. package/dist/lsp/lsp-manager.spec.js.map +1 -1
  245. package/dist/lsp/protocol.spec.js +1 -1
  246. package/dist/lsp/protocol.spec.js.map +1 -1
  247. package/dist/lsp/server-discovery.spec.js +1 -1
  248. package/dist/lsp/server-discovery.spec.js.map +1 -1
  249. package/dist/markdown-parser/index.spec.js.map +1 -1
  250. package/dist/markdown-parser/table-parser.spec.js.map +1 -1
  251. package/dist/mcp/mcp-client.d.ts +3 -2
  252. package/dist/mcp/mcp-client.d.ts.map +1 -1
  253. package/dist/mcp/mcp-client.js +279 -96
  254. package/dist/mcp/mcp-client.js.map +1 -1
  255. package/dist/mcp/transport-factory.d.ts +1 -1
  256. package/dist/mcp/transport-factory.d.ts.map +1 -1
  257. package/dist/mcp/transport-factory.js +16 -3
  258. package/dist/mcp/transport-factory.js.map +1 -1
  259. package/dist/mcp/transport-factory.spec.js +30 -48
  260. package/dist/mcp/transport-factory.spec.js.map +1 -1
  261. package/dist/message-handler.d.ts +1 -1
  262. package/dist/message-handler.d.ts.map +1 -1
  263. package/dist/message-handler.js +1 -1
  264. package/dist/message-handler.js.map +1 -1
  265. package/dist/model-database/database-engine.d.ts +25 -0
  266. package/dist/model-database/database-engine.d.ts.map +1 -0
  267. package/dist/model-database/database-engine.js +37 -0
  268. package/dist/model-database/database-engine.js.map +1 -0
  269. package/dist/model-database/database-engine.spec.d.ts +2 -0
  270. package/dist/model-database/database-engine.spec.d.ts.map +1 -0
  271. package/dist/model-database/database-engine.spec.js +413 -0
  272. package/dist/model-database/database-engine.spec.js.map +1 -0
  273. package/dist/model-database/model-database.d.ts +30 -0
  274. package/dist/model-database/model-database.d.ts.map +1 -0
  275. package/dist/model-database/model-database.js +82 -0
  276. package/dist/model-database/model-database.js.map +1 -0
  277. package/dist/model-database/model-database.spec.d.ts +2 -0
  278. package/dist/model-database/model-database.spec.d.ts.map +1 -0
  279. package/dist/model-database/model-database.spec.js +322 -0
  280. package/dist/model-database/model-database.spec.js.map +1 -0
  281. package/dist/model-database/model-engine.d.ts +25 -0
  282. package/dist/model-database/model-engine.d.ts.map +1 -0
  283. package/dist/model-database/model-engine.js +49 -0
  284. package/dist/model-database/model-engine.js.map +1 -0
  285. package/dist/model-database/model-engine.spec.d.ts +2 -0
  286. package/dist/model-database/model-engine.spec.d.ts.map +1 -0
  287. package/dist/model-database/model-engine.spec.js +381 -0
  288. package/dist/model-database/model-engine.spec.js.map +1 -0
  289. package/dist/model-database/model-fetcher.d.ts +14 -0
  290. package/dist/model-database/model-fetcher.d.ts.map +1 -0
  291. package/dist/model-database/model-fetcher.js +249 -0
  292. package/dist/model-database/model-fetcher.js.map +1 -0
  293. package/dist/model-database/model-fetcher.spec.d.ts +2 -0
  294. package/dist/model-database/model-fetcher.spec.d.ts.map +1 -0
  295. package/dist/model-database/model-fetcher.spec.js +498 -0
  296. package/dist/model-database/model-fetcher.spec.js.map +1 -0
  297. package/dist/models/models-cache.d.ts +1 -1
  298. package/dist/models/models-cache.d.ts.map +1 -1
  299. package/dist/models/models-cache.js +1 -1
  300. package/dist/models/models-cache.js.map +1 -1
  301. package/dist/models/models-dev-client.d.ts.map +1 -1
  302. package/dist/models/models-dev-client.js +23 -7
  303. package/dist/models/models-dev-client.js.map +1 -1
  304. package/dist/prompt-history.js +2 -2
  305. package/dist/prompt-history.js.map +1 -1
  306. package/dist/services/checkpoint-manager.d.ts +68 -0
  307. package/dist/services/checkpoint-manager.d.ts.map +1 -0
  308. package/dist/services/checkpoint-manager.js +345 -0
  309. package/dist/services/checkpoint-manager.js.map +1 -0
  310. package/dist/services/checkpoint-manager.spec.d.ts +2 -0
  311. package/dist/services/checkpoint-manager.spec.d.ts.map +1 -0
  312. package/dist/services/checkpoint-manager.spec.js +353 -0
  313. package/dist/services/checkpoint-manager.spec.js.map +1 -0
  314. package/dist/services/file-snapshot.d.ts +32 -0
  315. package/dist/services/file-snapshot.d.ts.map +1 -0
  316. package/dist/services/file-snapshot.js +161 -0
  317. package/dist/services/file-snapshot.js.map +1 -0
  318. package/dist/services/file-snapshot.spec.d.ts +2 -0
  319. package/dist/services/file-snapshot.spec.d.ts.map +1 -0
  320. package/dist/services/file-snapshot.spec.js +285 -0
  321. package/dist/services/file-snapshot.spec.js.map +1 -0
  322. package/dist/test-utils/render-with-theme.d.ts +7 -0
  323. package/dist/test-utils/render-with-theme.d.ts.map +1 -0
  324. package/dist/test-utils/render-with-theme.js +38 -0
  325. package/dist/test-utils/render-with-theme.js.map +1 -0
  326. package/dist/tokenization/tokenizer-factory.js +2 -2
  327. package/dist/tokenization/tokenizer-factory.js.map +1 -1
  328. package/dist/tokenization/tokenizer-factory.spec.js +2 -2
  329. package/dist/tokenization/tokenizer-factory.spec.js.map +1 -1
  330. package/dist/tokenization/tokenizers/anthropic-tokenizer.d.ts +1 -1
  331. package/dist/tokenization/tokenizers/anthropic-tokenizer.d.ts.map +1 -1
  332. package/dist/tokenization/tokenizers/anthropic-tokenizer.js.map +1 -1
  333. package/dist/tokenization/tokenizers/anthropic-tokenizer.spec.js.map +1 -1
  334. package/dist/tokenization/tokenizers/fallback-tokenizer.d.ts +1 -1
  335. package/dist/tokenization/tokenizers/fallback-tokenizer.d.ts.map +1 -1
  336. package/dist/tokenization/tokenizers/fallback-tokenizer.spec.js.map +1 -1
  337. package/dist/tokenization/tokenizers/llama-tokenizer.d.ts +1 -1
  338. package/dist/tokenization/tokenizers/llama-tokenizer.d.ts.map +1 -1
  339. package/dist/tokenization/tokenizers/llama-tokenizer.js.map +1 -1
  340. package/dist/tokenization/tokenizers/llama-tokenizer.spec.js.map +1 -1
  341. package/dist/tokenization/tokenizers/openai-tokenizer.d.ts +1 -1
  342. package/dist/tokenization/tokenizers/openai-tokenizer.d.ts.map +1 -1
  343. package/dist/tokenization/tokenizers/openai-tokenizer.js.map +1 -1
  344. package/dist/tokenization/tokenizers/openai-tokenizer.spec.js.map +1 -1
  345. package/dist/tool-calling/json-parser.d.ts.map +1 -1
  346. package/dist/tool-calling/json-parser.js +12 -14
  347. package/dist/tool-calling/json-parser.js.map +1 -1
  348. package/dist/tool-calling/json-parser.spec.js +7 -7
  349. package/dist/tool-calling/json-parser.spec.js.map +1 -1
  350. package/dist/tool-calling/tool-parser.d.ts.map +1 -1
  351. package/dist/tool-calling/tool-parser.js +38 -10
  352. package/dist/tool-calling/tool-parser.js.map +1 -1
  353. package/dist/tool-calling/tool-parser.spec.js +82 -4
  354. package/dist/tool-calling/tool-parser.spec.js.map +1 -1
  355. package/dist/tool-calling/xml-parser.d.ts.map +1 -1
  356. package/dist/tool-calling/xml-parser.js +21 -23
  357. package/dist/tool-calling/xml-parser.js.map +1 -1
  358. package/dist/tool-calling/xml-parser.spec.js +23 -3
  359. package/dist/tool-calling/xml-parser.spec.js.map +1 -1
  360. package/dist/tools/create-file.d.ts +24 -2
  361. package/dist/tools/create-file.d.ts.map +1 -1
  362. package/dist/tools/create-file.js +20 -16
  363. package/dist/tools/create-file.js.map +1 -1
  364. package/dist/tools/delete-lines.d.ts +18 -2
  365. package/dist/tools/delete-lines.d.ts.map +1 -1
  366. package/dist/tools/delete-lines.js +22 -17
  367. package/dist/tools/delete-lines.js.map +1 -1
  368. package/dist/tools/execute-bash.d.ts +2 -2
  369. package/dist/tools/execute-bash.d.ts.map +1 -1
  370. package/dist/tools/execute-bash.js +13 -12
  371. package/dist/tools/execute-bash.js.map +1 -1
  372. package/dist/tools/execute-function.spec.d.ts +2 -0
  373. package/dist/tools/execute-function.spec.d.ts.map +1 -0
  374. package/dist/tools/execute-function.spec.js +141 -0
  375. package/dist/tools/execute-function.spec.js.map +1 -0
  376. package/dist/tools/fetch-url.d.ts +16 -2
  377. package/dist/tools/fetch-url.d.ts.map +1 -1
  378. package/dist/tools/fetch-url.js +13 -13
  379. package/dist/tools/fetch-url.js.map +1 -1
  380. package/dist/tools/find-files.d.ts +18 -2
  381. package/dist/tools/find-files.d.ts.map +1 -1
  382. package/dist/tools/find-files.js +13 -11
  383. package/dist/tools/find-files.js.map +1 -1
  384. package/dist/tools/index.d.ts +2 -3
  385. package/dist/tools/index.d.ts.map +1 -1
  386. package/dist/tools/index.js +35 -25
  387. package/dist/tools/index.js.map +1 -1
  388. package/dist/tools/insert-lines.d.ts +18 -2
  389. package/dist/tools/insert-lines.d.ts.map +1 -1
  390. package/dist/tools/insert-lines.js +21 -16
  391. package/dist/tools/insert-lines.js.map +1 -1
  392. package/dist/tools/lsp-get-diagnostics.d.ts +10 -2
  393. package/dist/tools/lsp-get-diagnostics.d.ts.map +1 -1
  394. package/dist/tools/lsp-get-diagnostics.js +13 -11
  395. package/dist/tools/lsp-get-diagnostics.js.map +1 -1
  396. package/dist/tools/needs-approval.spec.d.ts +2 -0
  397. package/dist/tools/needs-approval.spec.d.ts.map +1 -0
  398. package/dist/tools/needs-approval.spec.js +308 -0
  399. package/dist/tools/needs-approval.spec.js.map +1 -0
  400. package/dist/tools/read-file.d.ts +2 -2
  401. package/dist/tools/read-file.d.ts.map +1 -1
  402. package/dist/tools/read-file.js +16 -18
  403. package/dist/tools/read-file.js.map +1 -1
  404. package/dist/tools/replace-lines.d.ts +19 -2
  405. package/dist/tools/replace-lines.d.ts.map +1 -1
  406. package/dist/tools/replace-lines.js +21 -16
  407. package/dist/tools/replace-lines.js.map +1 -1
  408. package/dist/tools/search-file-contents.d.ts +20 -2
  409. package/dist/tools/search-file-contents.d.ts.map +1 -1
  410. package/dist/tools/search-file-contents.js +17 -14
  411. package/dist/tools/search-file-contents.js.map +1 -1
  412. package/dist/tools/tool-manager.d.ts +1 -1
  413. package/dist/tools/tool-manager.d.ts.map +1 -1
  414. package/dist/tools/tool-manager.js +1 -1
  415. package/dist/tools/tool-manager.js.map +1 -1
  416. package/dist/tools/tool-registry.d.ts +1 -1
  417. package/dist/tools/tool-registry.d.ts.map +1 -1
  418. package/dist/tools/web-search.d.ts +2 -2
  419. package/dist/tools/web-search.d.ts.map +1 -1
  420. package/dist/tools/web-search.js +14 -14
  421. package/dist/tools/web-search.js.map +1 -1
  422. package/dist/types/app.d.ts +7 -4
  423. package/dist/types/app.d.ts.map +1 -1
  424. package/dist/types/checkpoint.d.ts +43 -0
  425. package/dist/types/checkpoint.d.ts.map +1 -0
  426. package/dist/types/checkpoint.js +2 -0
  427. package/dist/types/checkpoint.js.map +1 -0
  428. package/dist/types/config.d.ts +0 -1
  429. package/dist/types/config.d.ts.map +1 -1
  430. package/dist/types/core-connection-status.spec.d.ts +2 -0
  431. package/dist/types/core-connection-status.spec.d.ts.map +1 -0
  432. package/dist/types/core-connection-status.spec.js +52 -0
  433. package/dist/types/core-connection-status.spec.js.map +1 -0
  434. package/dist/types/core.d.ts +34 -29
  435. package/dist/types/core.d.ts.map +1 -1
  436. package/dist/types/core.js +1 -1
  437. package/dist/types/core.js.map +1 -1
  438. package/dist/types/index.d.ts +1 -0
  439. package/dist/types/index.d.ts.map +1 -1
  440. package/dist/types/index.js +1 -0
  441. package/dist/types/index.js.map +1 -1
  442. package/dist/types/system.d.ts +5 -30
  443. package/dist/types/system.d.ts.map +1 -1
  444. package/dist/usage/calculator.spec.js +1 -1
  445. package/dist/usage/calculator.spec.js.map +1 -1
  446. package/dist/usage/storage.d.ts +1 -1
  447. package/dist/usage/storage.d.ts.map +1 -1
  448. package/dist/usage/storage.js +9 -3
  449. package/dist/usage/storage.js.map +1 -1
  450. package/dist/usage/storage.spec.js +3 -3
  451. package/dist/usage/storage.spec.js.map +1 -1
  452. package/dist/usage/tracker.d.ts.map +1 -1
  453. package/dist/usage/tracker.js +1 -1
  454. package/dist/usage/tracker.js.map +1 -1
  455. package/dist/usage/tracker.spec.js +4 -4
  456. package/dist/usage/tracker.spec.js.map +1 -1
  457. package/dist/utils/atomic-deletion.spec.js +1 -1
  458. package/dist/utils/atomic-deletion.spec.js.map +1 -1
  459. package/dist/utils/checkpoint-utils.d.ts +12 -0
  460. package/dist/utils/checkpoint-utils.d.ts.map +1 -0
  461. package/dist/utils/checkpoint-utils.js +85 -0
  462. package/dist/utils/checkpoint-utils.js.map +1 -0
  463. package/dist/utils/checkpoint-utils.spec.d.ts +2 -0
  464. package/dist/utils/checkpoint-utils.spec.d.ts.map +1 -0
  465. package/dist/utils/checkpoint-utils.spec.js +182 -0
  466. package/dist/utils/checkpoint-utils.spec.js.map +1 -0
  467. package/dist/utils/error-formatter.d.ts +35 -0
  468. package/dist/utils/error-formatter.d.ts.map +1 -1
  469. package/dist/utils/error-formatter.js +123 -0
  470. package/dist/utils/error-formatter.js.map +1 -1
  471. package/dist/utils/file-autocomplete.js +2 -2
  472. package/dist/utils/file-autocomplete.js.map +1 -1
  473. package/dist/utils/file-autocomplete.spec.js +1 -1
  474. package/dist/utils/file-autocomplete.spec.js.map +1 -1
  475. package/dist/utils/file-content-loader.js +1 -1
  476. package/dist/utils/file-content-loader.js.map +1 -1
  477. package/dist/utils/file-content-loader.spec.js +4 -4
  478. package/dist/utils/file-content-loader.spec.js.map +1 -1
  479. package/dist/utils/file-mention-handler.js.map +1 -1
  480. package/dist/utils/file-mention-handler.spec.js +4 -4
  481. package/dist/utils/file-mention-handler.spec.js.map +1 -1
  482. package/dist/utils/file-mention-parser.spec.js +2 -2
  483. package/dist/utils/file-mention-parser.spec.js.map +1 -1
  484. package/dist/utils/installation-detector.js +2 -2
  485. package/dist/utils/installation-detector.js.map +1 -1
  486. package/dist/utils/installation-detector.spec.js +10 -17
  487. package/dist/utils/installation-detector.spec.js.map +1 -1
  488. package/dist/utils/logging/config.d.ts +41 -0
  489. package/dist/utils/logging/config.d.ts.map +1 -0
  490. package/dist/utils/logging/config.js +188 -0
  491. package/dist/utils/logging/config.js.map +1 -0
  492. package/dist/utils/logging/config.spec.d.ts +2 -0
  493. package/dist/utils/logging/config.spec.d.ts.map +1 -0
  494. package/dist/utils/logging/config.spec.js +233 -0
  495. package/dist/utils/logging/config.spec.js.map +1 -0
  496. package/dist/utils/logging/console-facade.d.ts +93 -0
  497. package/dist/utils/logging/console-facade.d.ts.map +1 -0
  498. package/dist/utils/logging/console-facade.js +295 -0
  499. package/dist/utils/logging/console-facade.js.map +1 -0
  500. package/dist/utils/logging/console-facade.spec.d.ts +2 -0
  501. package/dist/utils/logging/console-facade.spec.d.ts.map +1 -0
  502. package/dist/utils/logging/console-facade.spec.js +143 -0
  503. package/dist/utils/logging/console-facade.spec.js.map +1 -0
  504. package/dist/utils/logging/correlation.d.ts +139 -0
  505. package/dist/utils/logging/correlation.d.ts.map +1 -0
  506. package/dist/utils/logging/correlation.js +410 -0
  507. package/dist/utils/logging/correlation.js.map +1 -0
  508. package/dist/utils/logging/correlation.spec.d.ts +2 -0
  509. package/dist/utils/logging/correlation.spec.d.ts.map +1 -0
  510. package/dist/utils/logging/correlation.spec.js +449 -0
  511. package/dist/utils/logging/correlation.spec.js.map +1 -0
  512. package/dist/utils/logging/formatters.d.ts +70 -0
  513. package/dist/utils/logging/formatters.d.ts.map +1 -0
  514. package/dist/utils/logging/formatters.js +186 -0
  515. package/dist/utils/logging/formatters.js.map +1 -0
  516. package/dist/utils/logging/formatters.spec.d.ts +2 -0
  517. package/dist/utils/logging/formatters.spec.d.ts.map +1 -0
  518. package/dist/utils/logging/formatters.spec.js +356 -0
  519. package/dist/utils/logging/formatters.spec.js.map +1 -0
  520. package/dist/utils/logging/health-monitor.d.ts +216 -0
  521. package/dist/utils/logging/health-monitor.d.ts.map +1 -0
  522. package/dist/utils/logging/health-monitor.js +760 -0
  523. package/dist/utils/logging/health-monitor.js.map +1 -0
  524. package/dist/utils/logging/health-monitor.spec.d.ts +2 -0
  525. package/dist/utils/logging/health-monitor.spec.d.ts.map +1 -0
  526. package/dist/utils/logging/health-monitor.spec.js +305 -0
  527. package/dist/utils/logging/health-monitor.spec.js.map +1 -0
  528. package/dist/utils/logging/index.d.ts +100 -0
  529. package/dist/utils/logging/index.d.ts.map +1 -0
  530. package/dist/utils/logging/index.js +186 -0
  531. package/dist/utils/logging/index.js.map +1 -0
  532. package/dist/utils/logging/index.spec.d.ts +2 -0
  533. package/dist/utils/logging/index.spec.d.ts.map +1 -0
  534. package/dist/utils/logging/index.spec.js +214 -0
  535. package/dist/utils/logging/index.spec.js.map +1 -0
  536. package/dist/utils/logging/integration.spec.d.ts +2 -0
  537. package/dist/utils/logging/integration.spec.d.ts.map +1 -0
  538. package/dist/utils/logging/integration.spec.js +312 -0
  539. package/dist/utils/logging/integration.spec.js.map +1 -0
  540. package/dist/utils/logging/log-method-factory.d.ts +43 -0
  541. package/dist/utils/logging/log-method-factory.d.ts.map +1 -0
  542. package/dist/utils/logging/log-method-factory.js +176 -0
  543. package/dist/utils/logging/log-method-factory.js.map +1 -0
  544. package/dist/utils/logging/log-method-factory.spec.d.ts +2 -0
  545. package/dist/utils/logging/log-method-factory.spec.d.ts.map +1 -0
  546. package/dist/utils/logging/log-method-factory.spec.js +428 -0
  547. package/dist/utils/logging/log-method-factory.spec.js.map +1 -0
  548. package/dist/utils/logging/log-query.d.ts +275 -0
  549. package/dist/utils/logging/log-query.d.ts.map +1 -0
  550. package/dist/utils/logging/log-query.js +621 -0
  551. package/dist/utils/logging/log-query.js.map +1 -0
  552. package/dist/utils/logging/log-query.spec.d.ts +2 -0
  553. package/dist/utils/logging/log-query.spec.d.ts.map +1 -0
  554. package/dist/utils/logging/log-query.spec.js +737 -0
  555. package/dist/utils/logging/log-query.spec.js.map +1 -0
  556. package/dist/utils/logging/logger-provider.d.ts +73 -0
  557. package/dist/utils/logging/logger-provider.d.ts.map +1 -0
  558. package/dist/utils/logging/logger-provider.js +298 -0
  559. package/dist/utils/logging/logger-provider.js.map +1 -0
  560. package/dist/utils/logging/logger-provider.spec.d.ts +2 -0
  561. package/dist/utils/logging/logger-provider.spec.d.ts.map +1 -0
  562. package/dist/utils/logging/logger-provider.spec.js +204 -0
  563. package/dist/utils/logging/logger-provider.spec.js.map +1 -0
  564. package/dist/utils/logging/performance.d.ts +147 -0
  565. package/dist/utils/logging/performance.d.ts.map +1 -0
  566. package/dist/utils/logging/performance.js +520 -0
  567. package/dist/utils/logging/performance.js.map +1 -0
  568. package/dist/utils/logging/performance.spec.d.ts +2 -0
  569. package/dist/utils/logging/performance.spec.d.ts.map +1 -0
  570. package/dist/utils/logging/performance.spec.js +139 -0
  571. package/dist/utils/logging/performance.spec.js.map +1 -0
  572. package/dist/utils/logging/pino-logger.d.ts +22 -0
  573. package/dist/utils/logging/pino-logger.d.ts.map +1 -0
  574. package/dist/utils/logging/pino-logger.js +372 -0
  575. package/dist/utils/logging/pino-logger.js.map +1 -0
  576. package/dist/utils/logging/pino-logger.spec.d.ts +2 -0
  577. package/dist/utils/logging/pino-logger.spec.d.ts.map +1 -0
  578. package/dist/utils/logging/pino-logger.spec.js +294 -0
  579. package/dist/utils/logging/pino-logger.spec.js.map +1 -0
  580. package/dist/utils/logging/redaction.d.ts +38 -0
  581. package/dist/utils/logging/redaction.d.ts.map +1 -0
  582. package/dist/utils/logging/redaction.js +210 -0
  583. package/dist/utils/logging/redaction.js.map +1 -0
  584. package/dist/utils/logging/redaction.spec.d.ts +2 -0
  585. package/dist/utils/logging/redaction.spec.d.ts.map +1 -0
  586. package/dist/utils/logging/redaction.spec.js +338 -0
  587. package/dist/utils/logging/redaction.spec.js.map +1 -0
  588. package/dist/utils/logging/request-tracker.d.ts +189 -0
  589. package/dist/utils/logging/request-tracker.d.ts.map +1 -0
  590. package/dist/utils/logging/request-tracker.js +569 -0
  591. package/dist/utils/logging/request-tracker.js.map +1 -0
  592. package/dist/utils/logging/request-tracker.spec.d.ts +2 -0
  593. package/dist/utils/logging/request-tracker.spec.d.ts.map +1 -0
  594. package/dist/utils/logging/request-tracker.spec.js +868 -0
  595. package/dist/utils/logging/request-tracker.spec.js.map +1 -0
  596. package/dist/utils/logging/transports.d.ts +55 -0
  597. package/dist/utils/logging/transports.d.ts.map +1 -0
  598. package/dist/utils/logging/transports.js +252 -0
  599. package/dist/utils/logging/transports.js.map +1 -0
  600. package/dist/utils/logging/transports.spec.d.ts +2 -0
  601. package/dist/utils/logging/transports.spec.d.ts.map +1 -0
  602. package/dist/utils/logging/transports.spec.js +390 -0
  603. package/dist/utils/logging/transports.spec.js.map +1 -0
  604. package/dist/utils/logging/types.d.ts +173 -0
  605. package/dist/utils/logging/types.d.ts.map +1 -0
  606. package/dist/utils/logging/types.js +5 -0
  607. package/dist/utils/logging/types.js.map +1 -0
  608. package/dist/utils/message-queue.d.ts +64 -4
  609. package/dist/utils/message-queue.d.ts.map +1 -1
  610. package/dist/utils/message-queue.js +282 -28
  611. package/dist/utils/message-queue.js.map +1 -1
  612. package/dist/utils/paste-utils.spec.js +1 -1
  613. package/dist/utils/paste-utils.spec.js.map +1 -1
  614. package/dist/utils/prompt-processor.d.ts +2 -3
  615. package/dist/utils/prompt-processor.d.ts.map +1 -1
  616. package/dist/utils/prompt-processor.js +4 -52
  617. package/dist/utils/prompt-processor.js.map +1 -1
  618. package/dist/utils/tool-cancellation.spec.js.map +1 -1
  619. package/dist/utils/tool-result-display.d.ts +2 -2
  620. package/dist/utils/tool-result-display.d.ts.map +1 -1
  621. package/dist/utils/tool-result-display.js +3 -3
  622. package/dist/utils/tool-result-display.js.map +1 -1
  623. package/dist/utils/update-checker.d.ts.map +1 -1
  624. package/dist/utils/update-checker.js +1 -1
  625. package/dist/utils/update-checker.js.map +1 -1
  626. package/dist/utils/update-checker.spec.js +2 -2
  627. package/dist/utils/update-checker.spec.js.map +1 -1
  628. package/dist/vscode/extension-installer.js +1 -1
  629. package/dist/vscode/extension-installer.js.map +1 -1
  630. package/dist/vscode/extension-installer.spec.js +1 -1
  631. package/dist/vscode/extension-installer.spec.js.map +1 -1
  632. package/dist/vscode/protocol.spec.js +1 -1
  633. package/dist/vscode/protocol.spec.js.map +1 -1
  634. package/dist/vscode/vscode-server.d.ts.map +1 -1
  635. package/dist/vscode/vscode-server.js +2 -2
  636. package/dist/vscode/vscode-server.js.map +1 -1
  637. package/dist/vscode/vscode-server.spec.js.map +1 -1
  638. package/dist/wizard/config-wizard.d.ts.map +1 -1
  639. package/dist/wizard/config-wizard.js +16 -12
  640. package/dist/wizard/config-wizard.js.map +1 -1
  641. package/dist/wizard/steps/location-step.js +4 -4
  642. package/dist/wizard/steps/location-step.js.map +1 -1
  643. package/dist/wizard/steps/mcp-step.d.ts.map +1 -1
  644. package/dist/wizard/steps/mcp-step.js +4 -4
  645. package/dist/wizard/steps/mcp-step.js.map +1 -1
  646. package/dist/wizard/steps/provider-step.d.ts.map +1 -1
  647. package/dist/wizard/steps/provider-step.js +4 -4
  648. package/dist/wizard/steps/provider-step.js.map +1 -1
  649. package/dist/wizard/steps/summary-step.d.ts.map +1 -1
  650. package/dist/wizard/steps/summary-step.js +2 -2
  651. package/dist/wizard/steps/summary-step.js.map +1 -1
  652. package/dist/wizard/templates/provider-templates.d.ts.map +1 -1
  653. package/dist/wizard/templates/provider-templates.js +66 -2
  654. package/dist/wizard/templates/provider-templates.js.map +1 -1
  655. package/dist/wizard/validation-array.spec.js +1 -1
  656. package/dist/wizard/validation-array.spec.js.map +1 -1
  657. package/dist/wizard/validation.spec.js +1 -1
  658. package/dist/wizard/validation.spec.js.map +1 -1
  659. package/package.json +28 -26
  660. package/source/app/prompts/main-prompt.md +29 -96
  661. package/dist/commands/recommendations.d.ts +0 -8
  662. package/dist/commands/recommendations.d.ts.map +0 -1
  663. package/dist/commands/recommendations.js +0 -311
  664. package/dist/commands/recommendations.js.map +0 -1
  665. package/dist/commands/streaming.d.ts +0 -3
  666. package/dist/commands/streaming.d.ts.map +0 -1
  667. package/dist/commands/streaming.js +0 -23
  668. package/dist/commands/streaming.js.map +0 -1
  669. package/dist/components/thinking-indicator.d.ts +0 -3
  670. package/dist/components/thinking-indicator.d.ts.map +0 -1
  671. package/dist/components/thinking-indicator.js +0 -69
  672. package/dist/components/thinking-indicator.js.map +0 -1
  673. package/dist/recommendations/model-database.d.ts +0 -8
  674. package/dist/recommendations/model-database.d.ts.map +0 -1
  675. package/dist/recommendations/model-database.js +0 -514
  676. package/dist/recommendations/model-database.js.map +0 -1
  677. package/dist/recommendations/model-engine.d.ts +0 -16
  678. package/dist/recommendations/model-engine.d.ts.map +0 -1
  679. package/dist/recommendations/model-engine.js +0 -185
  680. package/dist/recommendations/model-engine.js.map +0 -1
  681. package/dist/recommendations/recommendation-engine.d.ts +0 -39
  682. package/dist/recommendations/recommendation-engine.d.ts.map +0 -1
  683. package/dist/recommendations/recommendation-engine.js +0 -144
  684. package/dist/recommendations/recommendation-engine.js.map +0 -1
  685. package/dist/system/detector.d.ts +0 -18
  686. package/dist/system/detector.d.ts.map +0 -1
  687. package/dist/system/detector.js +0 -140
  688. package/dist/system/detector.js.map +0 -1
@@ -0,0 +1,353 @@
1
+ import { existsSync } from 'fs';
2
+ import * as path from 'path';
3
+ import test from 'ava';
4
+ import * as fs from 'fs/promises';
5
+ import { CheckpointManager } from './checkpoint-manager.js';
6
+ // Helper to create a temporary directory for tests
7
+ async function createTempDir() {
8
+ const tempDir = path.join(process.cwd(), '.test-temp', `checkpoint-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
9
+ await fs.mkdir(tempDir, { recursive: true });
10
+ return tempDir;
11
+ }
12
+ // Helper to clean up temp directory
13
+ async function cleanupTempDir(dir) {
14
+ try {
15
+ await fs.rm(dir, { recursive: true, force: true });
16
+ }
17
+ catch {
18
+ // Ignore cleanup errors
19
+ }
20
+ }
21
+ // Helper to create mock messages
22
+ function createMockMessages(count) {
23
+ const messages = [];
24
+ for (let i = 0; i < count; i++) {
25
+ messages.push({
26
+ role: i % 2 === 0 ? 'user' : 'assistant',
27
+ content: `Message ${i + 1}`,
28
+ });
29
+ }
30
+ return messages;
31
+ }
32
+ test.serial('CheckpointManager creates checkpoints directory on save', async (t) => {
33
+ const tempDir = await createTempDir();
34
+ try {
35
+ const manager = new CheckpointManager(tempDir);
36
+ const messages = createMockMessages(2);
37
+ await manager.saveCheckpoint('test-checkpoint', messages, 'TestProvider', 'test-model');
38
+ const checkpointsDir = path.join(tempDir, '.nanocoder', 'checkpoints');
39
+ t.true(existsSync(checkpointsDir));
40
+ }
41
+ finally {
42
+ await cleanupTempDir(tempDir);
43
+ }
44
+ });
45
+ test.serial('CheckpointManager saves checkpoint with provided name', async (t) => {
46
+ const tempDir = await createTempDir();
47
+ try {
48
+ const manager = new CheckpointManager(tempDir);
49
+ const messages = createMockMessages(2);
50
+ const metadata = await manager.saveCheckpoint('my-checkpoint', messages, 'TestProvider', 'test-model');
51
+ t.is(metadata.name, 'my-checkpoint');
52
+ t.true(manager.checkpointExists('my-checkpoint'));
53
+ }
54
+ finally {
55
+ await cleanupTempDir(tempDir);
56
+ }
57
+ });
58
+ test.serial('CheckpointManager generates timestamp-based name when not provided', async (t) => {
59
+ const tempDir = await createTempDir();
60
+ try {
61
+ const manager = new CheckpointManager(tempDir);
62
+ const messages = createMockMessages(2);
63
+ const metadata = await manager.saveCheckpoint(undefined, messages, 'TestProvider', 'test-model');
64
+ t.true(metadata.name.startsWith('checkpoint-'));
65
+ t.true(manager.checkpointExists(metadata.name));
66
+ }
67
+ finally {
68
+ await cleanupTempDir(tempDir);
69
+ }
70
+ });
71
+ test.serial('CheckpointManager saves correct metadata', async (t) => {
72
+ const tempDir = await createTempDir();
73
+ try {
74
+ const manager = new CheckpointManager(tempDir);
75
+ const messages = createMockMessages(4);
76
+ const metadata = await manager.saveCheckpoint('test', messages, 'MyProvider', 'my-model');
77
+ t.is(metadata.messageCount, 4);
78
+ t.is(metadata.provider.name, 'MyProvider');
79
+ t.is(metadata.provider.model, 'my-model');
80
+ t.truthy(metadata.timestamp);
81
+ }
82
+ finally {
83
+ await cleanupTempDir(tempDir);
84
+ }
85
+ });
86
+ test.serial('CheckpointManager throws error for duplicate checkpoint name', async (t) => {
87
+ const tempDir = await createTempDir();
88
+ try {
89
+ const manager = new CheckpointManager(tempDir);
90
+ const messages = createMockMessages(2);
91
+ await manager.saveCheckpoint('duplicate', messages, 'Provider', 'model');
92
+ await t.throwsAsync(async () => {
93
+ await manager.saveCheckpoint('duplicate', messages, 'Provider', 'model');
94
+ }, { message: /already exists/ });
95
+ }
96
+ finally {
97
+ await cleanupTempDir(tempDir);
98
+ }
99
+ });
100
+ test.serial('CheckpointManager throws error for invalid checkpoint name', async (t) => {
101
+ const tempDir = await createTempDir();
102
+ try {
103
+ const manager = new CheckpointManager(tempDir);
104
+ const messages = createMockMessages(2);
105
+ await t.throwsAsync(async () => {
106
+ await manager.saveCheckpoint('invalid/name', messages, 'Provider', 'model');
107
+ }, { message: /invalid characters/ });
108
+ }
109
+ finally {
110
+ await cleanupTempDir(tempDir);
111
+ }
112
+ });
113
+ test.serial('CheckpointManager loads saved checkpoint', async (t) => {
114
+ const tempDir = await createTempDir();
115
+ try {
116
+ const manager = new CheckpointManager(tempDir);
117
+ const messages = createMockMessages(3);
118
+ await manager.saveCheckpoint('loadable', messages, 'Provider', 'model');
119
+ const loaded = await manager.loadCheckpoint('loadable');
120
+ t.is(loaded.metadata.name, 'loadable');
121
+ t.is(loaded.conversation.messages.length, 3);
122
+ t.is(loaded.conversation.messages[0].content, 'Message 1');
123
+ }
124
+ finally {
125
+ await cleanupTempDir(tempDir);
126
+ }
127
+ });
128
+ test.serial('CheckpointManager throws error loading non-existent checkpoint', async (t) => {
129
+ const tempDir = await createTempDir();
130
+ try {
131
+ const manager = new CheckpointManager(tempDir);
132
+ await t.throwsAsync(async () => {
133
+ await manager.loadCheckpoint('non-existent');
134
+ }, { message: /does not exist/ });
135
+ }
136
+ finally {
137
+ await cleanupTempDir(tempDir);
138
+ }
139
+ });
140
+ test.serial('CheckpointManager lists checkpoints', async (t) => {
141
+ const tempDir = await createTempDir();
142
+ try {
143
+ const manager = new CheckpointManager(tempDir);
144
+ const messages = createMockMessages(2);
145
+ await manager.saveCheckpoint('checkpoint-1', messages, 'Provider', 'model');
146
+ await manager.saveCheckpoint('checkpoint-2', messages, 'Provider', 'model');
147
+ await manager.saveCheckpoint('checkpoint-3', messages, 'Provider', 'model');
148
+ const list = await manager.listCheckpoints();
149
+ t.is(list.length, 3);
150
+ const names = list.map(c => c.name);
151
+ t.true(names.includes('checkpoint-1'));
152
+ t.true(names.includes('checkpoint-2'));
153
+ t.true(names.includes('checkpoint-3'));
154
+ }
155
+ finally {
156
+ await cleanupTempDir(tempDir);
157
+ }
158
+ });
159
+ test.serial('CheckpointManager lists checkpoints sorted by timestamp (newest first)', async (t) => {
160
+ const tempDir = await createTempDir();
161
+ try {
162
+ const manager = new CheckpointManager(tempDir);
163
+ const messages = createMockMessages(2);
164
+ await manager.saveCheckpoint('oldest', messages, 'Provider', 'model');
165
+ await new Promise(resolve => setTimeout(resolve, 10)); // Small delay
166
+ await manager.saveCheckpoint('middle', messages, 'Provider', 'model');
167
+ await new Promise(resolve => setTimeout(resolve, 10));
168
+ await manager.saveCheckpoint('newest', messages, 'Provider', 'model');
169
+ const list = await manager.listCheckpoints();
170
+ t.is(list[0].name, 'newest');
171
+ t.is(list[2].name, 'oldest');
172
+ }
173
+ finally {
174
+ await cleanupTempDir(tempDir);
175
+ }
176
+ });
177
+ test.serial('CheckpointManager returns empty list when no checkpoints', async (t) => {
178
+ const tempDir = await createTempDir();
179
+ try {
180
+ const manager = new CheckpointManager(tempDir);
181
+ const list = await manager.listCheckpoints();
182
+ t.is(list.length, 0);
183
+ }
184
+ finally {
185
+ await cleanupTempDir(tempDir);
186
+ }
187
+ });
188
+ test.serial('CheckpointManager deletes checkpoint', async (t) => {
189
+ const tempDir = await createTempDir();
190
+ try {
191
+ const manager = new CheckpointManager(tempDir);
192
+ const messages = createMockMessages(2);
193
+ await manager.saveCheckpoint('to-delete', messages, 'Provider', 'model');
194
+ t.true(manager.checkpointExists('to-delete'));
195
+ await manager.deleteCheckpoint('to-delete');
196
+ t.false(manager.checkpointExists('to-delete'));
197
+ }
198
+ finally {
199
+ await cleanupTempDir(tempDir);
200
+ }
201
+ });
202
+ test.serial('CheckpointManager throws error deleting non-existent checkpoint', async (t) => {
203
+ const tempDir = await createTempDir();
204
+ try {
205
+ const manager = new CheckpointManager(tempDir);
206
+ await t.throwsAsync(async () => {
207
+ await manager.deleteCheckpoint('non-existent');
208
+ }, { message: /does not exist/ });
209
+ }
210
+ finally {
211
+ await cleanupTempDir(tempDir);
212
+ }
213
+ });
214
+ test.serial('CheckpointManager validates checkpoint integrity', async (t) => {
215
+ const tempDir = await createTempDir();
216
+ try {
217
+ const manager = new CheckpointManager(tempDir);
218
+ const messages = createMockMessages(2);
219
+ await manager.saveCheckpoint('valid', messages, 'Provider', 'model');
220
+ const validation = await manager.validateCheckpoint('valid');
221
+ t.true(validation.valid);
222
+ t.is(validation.errors.length, 0);
223
+ }
224
+ finally {
225
+ await cleanupTempDir(tempDir);
226
+ }
227
+ });
228
+ test.serial('CheckpointManager detects invalid checkpoint (missing metadata)', async (t) => {
229
+ const tempDir = await createTempDir();
230
+ try {
231
+ const manager = new CheckpointManager(tempDir);
232
+ // Create a checkpoint directory without metadata
233
+ const checkpointDir = path.join(tempDir, '.nanocoder', 'checkpoints', 'broken');
234
+ await fs.mkdir(checkpointDir, { recursive: true });
235
+ const validation = await manager.validateCheckpoint('broken');
236
+ t.false(validation.valid);
237
+ t.true(validation.errors.some(e => e.includes('metadata')));
238
+ }
239
+ finally {
240
+ await cleanupTempDir(tempDir);
241
+ }
242
+ });
243
+ test.serial('CheckpointManager checkpointExists returns true for existing checkpoint', async (t) => {
244
+ const tempDir = await createTempDir();
245
+ try {
246
+ const manager = new CheckpointManager(tempDir);
247
+ const messages = createMockMessages(2);
248
+ await manager.saveCheckpoint('exists', messages, 'Provider', 'model');
249
+ t.true(manager.checkpointExists('exists'));
250
+ }
251
+ finally {
252
+ await cleanupTempDir(tempDir);
253
+ }
254
+ });
255
+ test.serial('CheckpointManager checkpointExists returns false for non-existing checkpoint', async (t) => {
256
+ const tempDir = await createTempDir();
257
+ try {
258
+ const manager = new CheckpointManager(tempDir);
259
+ t.false(manager.checkpointExists('does-not-exist'));
260
+ }
261
+ finally {
262
+ await cleanupTempDir(tempDir);
263
+ }
264
+ });
265
+ test.serial('CheckpointManager getCheckpointMetadata returns metadata', async (t) => {
266
+ const tempDir = await createTempDir();
267
+ try {
268
+ const manager = new CheckpointManager(tempDir);
269
+ const messages = createMockMessages(5);
270
+ await manager.saveCheckpoint('meta-test', messages, 'MetaProvider', 'meta-model');
271
+ const metadata = await manager.getCheckpointMetadata('meta-test');
272
+ t.is(metadata.name, 'meta-test');
273
+ t.is(metadata.messageCount, 5);
274
+ t.is(metadata.provider.name, 'MetaProvider');
275
+ }
276
+ finally {
277
+ await cleanupTempDir(tempDir);
278
+ }
279
+ });
280
+ test.serial('CheckpointManager generates description from first user message', async (t) => {
281
+ const tempDir = await createTempDir();
282
+ try {
283
+ const manager = new CheckpointManager(tempDir);
284
+ const messages = [
285
+ { role: 'user', content: 'This is my first message' },
286
+ { role: 'assistant', content: 'Hello!' },
287
+ ];
288
+ const metadata = await manager.saveCheckpoint('desc-test', messages, 'Provider', 'model');
289
+ t.is(metadata.description, 'This is my first message');
290
+ }
291
+ finally {
292
+ await cleanupTempDir(tempDir);
293
+ }
294
+ });
295
+ test.serial('CheckpointManager truncates long descriptions', async (t) => {
296
+ const tempDir = await createTempDir();
297
+ try {
298
+ const manager = new CheckpointManager(tempDir);
299
+ const longMessage = 'A'.repeat(150);
300
+ const messages = [{ role: 'user', content: longMessage }];
301
+ const metadata = await manager.saveCheckpoint('long-desc', messages, 'Provider', 'model');
302
+ t.true(metadata.description.length <= 103); // 100 chars + "..."
303
+ t.true(metadata.description.endsWith('...'));
304
+ }
305
+ finally {
306
+ await cleanupTempDir(tempDir);
307
+ }
308
+ });
309
+ test.serial('CheckpointManager handles empty messages for description', async (t) => {
310
+ const tempDir = await createTempDir();
311
+ try {
312
+ const manager = new CheckpointManager(tempDir);
313
+ const messages = [
314
+ { role: 'assistant', content: 'No user messages' },
315
+ ];
316
+ const metadata = await manager.saveCheckpoint('no-user', messages, 'Provider', 'model');
317
+ t.is(metadata.description, 'Empty conversation');
318
+ }
319
+ finally {
320
+ await cleanupTempDir(tempDir);
321
+ }
322
+ });
323
+ test.serial('CheckpointManager loadCheckpoint with validateIntegrity option', async (t) => {
324
+ const tempDir = await createTempDir();
325
+ try {
326
+ const manager = new CheckpointManager(tempDir);
327
+ const messages = createMockMessages(2);
328
+ await manager.saveCheckpoint('validate-test', messages, 'Provider', 'model');
329
+ const loaded = await manager.loadCheckpoint('validate-test', {
330
+ validateIntegrity: true,
331
+ });
332
+ t.truthy(loaded);
333
+ t.is(loaded.metadata.name, 'validate-test');
334
+ }
335
+ finally {
336
+ await cleanupTempDir(tempDir);
337
+ }
338
+ });
339
+ test.serial('CheckpointManager list includes size information', async (t) => {
340
+ const tempDir = await createTempDir();
341
+ try {
342
+ const manager = new CheckpointManager(tempDir);
343
+ const messages = createMockMessages(2);
344
+ await manager.saveCheckpoint('size-test', messages, 'Provider', 'model');
345
+ const list = await manager.listCheckpoints();
346
+ t.truthy(list[0].sizeBytes);
347
+ t.true(list[0].sizeBytes > 0);
348
+ }
349
+ finally {
350
+ await cleanupTempDir(tempDir);
351
+ }
352
+ });
353
+ //# sourceMappingURL=checkpoint-manager.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-manager.spec.js","sourceRoot":"","sources":["../../source/services/checkpoint-manager.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Service for capturing and restoring file snapshots for checkpoints
3
+ */
4
+ export declare class FileSnapshotService {
5
+ private readonly workspaceRoot;
6
+ constructor(workspaceRoot?: string);
7
+ /**
8
+ * Capture the contents of specified files
9
+ */
10
+ captureFiles(filePaths: string[]): Promise<Map<string, string>>;
11
+ /**
12
+ * Restore files from snapshots
13
+ */
14
+ restoreFiles(snapshots: Map<string, string>): Promise<void>;
15
+ /**
16
+ * Get list of modified files in the workspace
17
+ * Uses git to detect modified files if available, otherwise returns empty array
18
+ */
19
+ getModifiedFiles(): string[];
20
+ /**
21
+ * Get the size of a file snapshot
22
+ */
23
+ getSnapshotSize(snapshots: Map<string, string>): number;
24
+ /**
25
+ * Validate that all files in the snapshot can be written to their locations
26
+ */
27
+ validateRestorePath(snapshots: Map<string, string>): Promise<{
28
+ valid: boolean;
29
+ errors: string[];
30
+ }>;
31
+ }
32
+ //# sourceMappingURL=file-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-snapshot.d.ts","sourceRoot":"","sources":["../../source/services/file-snapshot.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,qBAAa,mBAAmB;IAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,aAAa,GAAE,MAAsB;IAIjD;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAsBrE;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBjE;;;OAGG;IACH,gBAAgB,IAAI,MAAM,EAAE;IAyE5B;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM;IAQvD;;OAEG;IACG,mBAAmB,CACxB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAC,CAAC;CA6B9C"}
@@ -0,0 +1,161 @@
1
+ import { execSync } from 'child_process';
2
+ import { existsSync } from 'fs';
3
+ import * as path from 'path';
4
+ import { logWarning } from '../utils/message-queue.js';
5
+ import * as fs from 'fs/promises';
6
+ /**
7
+ * Maximum number of files to capture in a checkpoint.
8
+ * This limit prevents excessive memory usage and storage for large workspaces.
9
+ */
10
+ const MAX_CHECKPOINT_FILES = 50;
11
+ /**
12
+ * Service for capturing and restoring file snapshots for checkpoints
13
+ */
14
+ export class FileSnapshotService {
15
+ workspaceRoot;
16
+ constructor(workspaceRoot = process.cwd()) {
17
+ this.workspaceRoot = workspaceRoot;
18
+ }
19
+ /**
20
+ * Capture the contents of specified files
21
+ */
22
+ async captureFiles(filePaths) {
23
+ const snapshots = new Map();
24
+ for (const filePath of filePaths) {
25
+ try {
26
+ const absolutePath = path.resolve(this.workspaceRoot, filePath);
27
+ const content = await fs.readFile(absolutePath, 'utf-8');
28
+ const relativePath = path.relative(this.workspaceRoot, absolutePath);
29
+ snapshots.set(relativePath, content);
30
+ }
31
+ catch (error) {
32
+ logWarning('Could not capture file', true, {
33
+ context: {
34
+ filePath,
35
+ error: error instanceof Error ? error.message : 'Unknown error',
36
+ },
37
+ });
38
+ }
39
+ }
40
+ return snapshots;
41
+ }
42
+ /**
43
+ * Restore files from snapshots
44
+ */
45
+ async restoreFiles(snapshots) {
46
+ const errors = [];
47
+ for (const [relativePath, content] of snapshots) {
48
+ try {
49
+ const absolutePath = path.resolve(this.workspaceRoot, relativePath);
50
+ const directory = path.dirname(absolutePath);
51
+ await fs.mkdir(directory, { recursive: true });
52
+ await fs.writeFile(absolutePath, content, 'utf-8');
53
+ }
54
+ catch (error) {
55
+ errors.push(`Failed to restore ${relativePath}: ${error instanceof Error ? error.message : 'Unknown error'}`);
56
+ }
57
+ }
58
+ if (errors.length > 0) {
59
+ throw new Error(`Failed to restore some files:\n${errors.join('\n')}`);
60
+ }
61
+ }
62
+ /**
63
+ * Get list of modified files in the workspace
64
+ * Uses git to detect modified files if available, otherwise returns empty array
65
+ */
66
+ getModifiedFiles() {
67
+ try {
68
+ const modifiedOutput = execSync('git diff --name-only HEAD', {
69
+ cwd: this.workspaceRoot,
70
+ encoding: 'utf-8',
71
+ stdio: ['pipe', 'pipe', 'pipe'],
72
+ }).trim();
73
+ const untrackedOutput = execSync('git ls-files --others --exclude-standard', {
74
+ cwd: this.workspaceRoot,
75
+ encoding: 'utf-8',
76
+ stdio: ['pipe', 'pipe', 'pipe'],
77
+ }).trim();
78
+ const modifiedFiles = modifiedOutput
79
+ ? modifiedOutput.split('\n').filter(Boolean)
80
+ : [];
81
+ const untrackedFiles = untrackedOutput
82
+ ? untrackedOutput.split('\n').filter(Boolean)
83
+ : [];
84
+ const allFiles = [...new Set([...modifiedFiles, ...untrackedFiles])];
85
+ const filtered = allFiles.filter(file => {
86
+ const ignorePatterns = [
87
+ 'node_modules/',
88
+ 'dist/',
89
+ 'build/',
90
+ '.git/',
91
+ '.nanocoder/',
92
+ 'coverage/',
93
+ '*.log',
94
+ ];
95
+ return !ignorePatterns.some(pattern => {
96
+ if (pattern.endsWith('/')) {
97
+ return file.startsWith(pattern);
98
+ }
99
+ if (pattern.startsWith('*.')) {
100
+ return file.endsWith(pattern.slice(1));
101
+ }
102
+ return file.includes(pattern);
103
+ });
104
+ });
105
+ if (filtered.length > MAX_CHECKPOINT_FILES) {
106
+ logWarning('Too many modified files detected, limiting to maximum', true, {
107
+ context: {
108
+ fileCount: filtered.length,
109
+ maxFiles: MAX_CHECKPOINT_FILES,
110
+ },
111
+ });
112
+ return filtered.slice(0, MAX_CHECKPOINT_FILES);
113
+ }
114
+ return filtered;
115
+ }
116
+ catch {
117
+ logWarning('Git not available for file tracking', true, {
118
+ context: {
119
+ workspaceRoot: this.workspaceRoot,
120
+ },
121
+ });
122
+ return [];
123
+ }
124
+ }
125
+ /**
126
+ * Get the size of a file snapshot
127
+ */
128
+ getSnapshotSize(snapshots) {
129
+ let totalSize = 0;
130
+ for (const content of snapshots.values()) {
131
+ totalSize += Buffer.byteLength(content, 'utf-8');
132
+ }
133
+ return totalSize;
134
+ }
135
+ /**
136
+ * Validate that all files in the snapshot can be written to their locations
137
+ */
138
+ async validateRestorePath(snapshots) {
139
+ const errors = [];
140
+ for (const relativePath of snapshots.keys()) {
141
+ try {
142
+ const absolutePath = path.resolve(this.workspaceRoot, relativePath);
143
+ const directory = path.dirname(absolutePath);
144
+ await fs.access(directory, fs.constants.W_OK).catch(async () => {
145
+ await fs.mkdir(directory, { recursive: true });
146
+ });
147
+ if (existsSync(absolutePath)) {
148
+ await fs.access(absolutePath, fs.constants.W_OK);
149
+ }
150
+ }
151
+ catch (error) {
152
+ errors.push(`Cannot write to ${relativePath}: ${error instanceof Error ? error.message : 'Unknown error'}`);
153
+ }
154
+ }
155
+ return {
156
+ valid: errors.length === 0,
157
+ errors,
158
+ };
159
+ }
160
+ }
161
+ //# sourceMappingURL=file-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-snapshot.js","sourceRoot":"","sources":["../../source/services/file-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AACvC,OAAO,EAAC,UAAU,EAAC,MAAM,IAAI,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAElC;;;GAGG;AACH,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC;;GAEG;AACH,MAAM,OAAO,mBAAmB;IACd,aAAa,CAAS;IAEvC,YAAY,gBAAwB,OAAO,CAAC,GAAG,EAAE;QAChD,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,SAAmB;QACrC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE5C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC;gBACJ,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;gBAChE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBACzD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;gBACrE,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,UAAU,CAAC,wBAAwB,EAAE,IAAI,EAAE;oBAC1C,OAAO,EAAE;wBACR,QAAQ;wBACR,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;qBAC/D;iBACD,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,SAA8B;QAChD,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,KAAK,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,SAAS,EAAE,CAAC;YACjD,IAAI,CAAC;gBACJ,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;gBACpE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;gBAE7C,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;gBAC7C,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CACV,qBAAqB,YAAY,KAChC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAC1C,EAAE,CACF,CAAC;YACH,CAAC;QACF,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;IACF,CAAC;IAED;;;OAGG;IACH,gBAAgB;QACf,IAAI,CAAC;YACJ,MAAM,cAAc,GAAG,QAAQ,CAAC,2BAA2B,EAAE;gBAC5D,GAAG,EAAE,IAAI,CAAC,aAAa;gBACvB,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAC/B,CAAC,CAAC,IAAI,EAAE,CAAC;YAEV,MAAM,eAAe,GAAG,QAAQ,CAC/B,0CAA0C,EAC1C;gBACC,GAAG,EAAE,IAAI,CAAC,aAAa;gBACvB,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAC/B,CACD,CAAC,IAAI,EAAE,CAAC;YAET,MAAM,aAAa,GAAG,cAAc;gBACnC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC5C,CAAC,CAAC,EAAE,CAAC;YACN,MAAM,cAAc,GAAG,eAAe;gBACrC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC7C,CAAC,CAAC,EAAE,CAAC;YAEN,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;YAErE,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;gBACvC,MAAM,cAAc,GAAG;oBACtB,eAAe;oBACf,OAAO;oBACP,QAAQ;oBACR,OAAO;oBACP,aAAa;oBACb,WAAW;oBACX,OAAO;iBACP,CAAC;gBAEF,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;oBACrC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC3B,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;oBACjC,CAAC;oBACD,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBACxC,CAAC;oBACD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC/B,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;gBAC5C,UAAU,CACT,uDAAuD,EACvD,IAAI,EACJ;oBACC,OAAO,EAAE;wBACR,SAAS,EAAE,QAAQ,CAAC,MAAM;wBAC1B,QAAQ,EAAE,oBAAoB;qBAC9B;iBACD,CACD,CAAC;gBACF,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;YAChD,CAAC;YAED,OAAO,QAAQ,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACR,UAAU,CAAC,qCAAqC,EAAE,IAAI,EAAE;gBACvD,OAAO,EAAE;oBACR,aAAa,EAAE,IAAI,CAAC,aAAa;iBACjC;aACD,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;QACX,CAAC;IACF,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,SAA8B;QAC7C,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CACxB,SAA8B;QAE9B,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,KAAK,MAAM,YAAY,IAAI,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACJ,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;gBACpE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;gBAE7C,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;oBAC9D,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;gBAC9C,CAAC,CAAC,CAAC;gBAEH,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC9B,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAClD,CAAC;YACF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CACV,mBAAmB,YAAY,KAC9B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAC1C,EAAE,CACF,CAAC;YACH,CAAC;QACF,CAAC;QAED,OAAO;YACN,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM;SACN,CAAC;IACH,CAAC;CACD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=file-snapshot.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-snapshot.spec.d.ts","sourceRoot":"","sources":["../../source/services/file-snapshot.spec.ts"],"names":[],"mappings":""}