toolnet-memory 0.2.1 → 0.2.2

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 (342) hide show
  1. package/README.md +55 -28
  2. package/bin/toolnet-memory +55 -55
  3. package/bundle/agy.js +88 -0
  4. package/bundle/codex.js +92 -0
  5. package/bundle/context-runtime.js +56 -0
  6. package/bundle/context.js +62 -0
  7. package/bundle/doctor.js +3 -0
  8. package/bundle/full-index.js +8 -0
  9. package/bundle/learner.js +8 -0
  10. package/bundle/mcp.js +7 -0
  11. package/bundle/opencode.js +314 -0
  12. package/bundle/project-manual.js +54 -0
  13. package/bundle/setup.js +31 -0
  14. package/bundle/snapshot.js +4 -0
  15. package/bundle/work-continuity.js +12 -0
  16. package/package.json +9 -6
  17. package/dist/packages/cli/commands.js +0 -1
  18. package/dist/packages/cli/index.js +0 -1
  19. package/dist/packages/sdk/client.js +0 -78
  20. package/dist/packages/sdk/index.js +0 -1
  21. package/dist/packages/sdk/types.js +0 -1
  22. package/dist/src/api/index.js +0 -1
  23. package/dist/src/api/routes/health.js +0 -1
  24. package/dist/src/api/routes/index.js +0 -1
  25. package/dist/src/api/routes/memory.js +0 -1
  26. package/dist/src/api/routes/projects.js +0 -1
  27. package/dist/src/api/routes/search.js +0 -1
  28. package/dist/src/api/server.js +0 -1
  29. package/dist/src/capture/activity-capture.js +0 -21
  30. package/dist/src/capture/command-capture.js +0 -12
  31. package/dist/src/capture/error-capture.js +0 -14
  32. package/dist/src/capture/event-deduplicator.js +0 -28
  33. package/dist/src/capture/event-queue.js +0 -20
  34. package/dist/src/capture/file-capture.js +0 -23
  35. package/dist/src/capture/index.js +0 -8
  36. package/dist/src/capture/session-capture.js +0 -18
  37. package/dist/src/capture/tool-capture.js +0 -13
  38. package/dist/src/code-intelligence/analysis/analysis-engine.js +0 -26
  39. package/dist/src/code-intelligence/analysis/dead-code-analyzer.js +0 -127
  40. package/dist/src/code-intelligence/analysis/dependency-analyzer.js +0 -66
  41. package/dist/src/code-intelligence/analysis/index.js +0 -4
  42. package/dist/src/code-intelligence/analysis/types.js +0 -1
  43. package/dist/src/code-intelligence/architecture/architecture-engine.js +0 -48
  44. package/dist/src/code-intelligence/architecture/clusters.js +0 -322
  45. package/dist/src/code-intelligence/architecture/entry-points.js +0 -150
  46. package/dist/src/code-intelligence/architecture/hotspots.js +0 -136
  47. package/dist/src/code-intelligence/architecture/index.js +0 -6
  48. package/dist/src/code-intelligence/architecture/layers.js +0 -197
  49. package/dist/src/code-intelligence/architecture/types.js +0 -1
  50. package/dist/src/code-intelligence/chunks/index.js +0 -2
  51. package/dist/src/code-intelligence/chunks/smart-chunker.js +0 -125
  52. package/dist/src/code-intelligence/chunks/types.js +0 -1
  53. package/dist/src/code-intelligence/git/git-diff.js +0 -109
  54. package/dist/src/code-intelligence/git/index.js +0 -1
  55. package/dist/src/code-intelligence/graph/architecture.js +0 -26
  56. package/dist/src/code-intelligence/graph/graph-builder.js +0 -213
  57. package/dist/src/code-intelligence/graph/graph-store.js +0 -57
  58. package/dist/src/code-intelligence/graph/index.js +0 -1
  59. package/dist/src/code-intelligence/graph/relationships.js +0 -1
  60. package/dist/src/code-intelligence/graph/trace.js +0 -65
  61. package/dist/src/code-intelligence/impact/blast-radius.js +0 -160
  62. package/dist/src/code-intelligence/impact/change-mapper.js +0 -69
  63. package/dist/src/code-intelligence/impact/edit-tool-detector.js +0 -92
  64. package/dist/src/code-intelligence/impact/impact-analyzer.js +0 -60
  65. package/dist/src/code-intelligence/impact/impact-guard.js +0 -33
  66. package/dist/src/code-intelligence/impact/index.js +0 -5
  67. package/dist/src/code-intelligence/incremental/file-hash.js +0 -8
  68. package/dist/src/code-intelligence/incremental/incremental-indexer.js +0 -106
  69. package/dist/src/code-intelligence/incremental/manifest-builder.js +0 -19
  70. package/dist/src/code-intelligence/incremental/manifest.js +0 -31
  71. package/dist/src/code-intelligence/index.js +0 -23
  72. package/dist/src/code-intelligence/indexer/file-watcher.js +0 -1
  73. package/dist/src/code-intelligence/indexer/incremental-indexer.js +0 -1
  74. package/dist/src/code-intelligence/indexer/index.js +0 -1
  75. package/dist/src/code-intelligence/indexer/repository-indexer.js +0 -31
  76. package/dist/src/code-intelligence/indexer/repository-scanner.js +0 -50
  77. package/dist/src/code-intelligence/parsers/index.js +0 -1
  78. package/dist/src/code-intelligence/parsers/tree-sitter/index.js +0 -1
  79. package/dist/src/code-intelligence/parsers/tree-sitter/languages.js +0 -1
  80. package/dist/src/code-intelligence/parsers/tree-sitter/parser.js +0 -1
  81. package/dist/src/code-intelligence/parsers/typescript-parser.js +0 -190
  82. package/dist/src/code-intelligence/query/graph-query-engine.js +0 -275
  83. package/dist/src/code-intelligence/query/index.js +0 -2
  84. package/dist/src/code-intelligence/query/types.js +0 -1
  85. package/dist/src/code-intelligence/resolution/index.js +0 -2
  86. package/dist/src/code-intelligence/resolution/types.js +0 -1
  87. package/dist/src/code-intelligence/resolution/typescript-resolver.js +0 -316
  88. package/dist/src/code-intelligence/rich/index.js +0 -1
  89. package/dist/src/code-intelligence/rich/rich-graph-enricher.js +0 -463
  90. package/dist/src/code-intelligence/semantic/index.js +0 -2
  91. package/dist/src/code-intelligence/semantic/semantic-code-engine.js +0 -213
  92. package/dist/src/code-intelligence/semantic/source-priority.js +0 -22
  93. package/dist/src/code-intelligence/symbols/index.js +0 -1
  94. package/dist/src/code-intelligence/symbols/reference-resolver.js +0 -21
  95. package/dist/src/code-intelligence/symbols/symbol-extractor.js +0 -1
  96. package/dist/src/code-intelligence/test-analysis.js +0 -72
  97. package/dist/src/code-intelligence/test-architecture.js +0 -67
  98. package/dist/src/code-intelligence/test-impact.js +0 -47
  99. package/dist/src/code-intelligence/test-incremental.js +0 -24
  100. package/dist/src/code-intelligence/test-index.js +0 -39
  101. package/dist/src/code-intelligence/test-resolution.js +0 -54
  102. package/dist/src/code-intelligence/test-rich-graph.js +0 -48
  103. package/dist/src/code-intelligence/test-semantic.js +0 -57
  104. package/dist/src/code-intelligence/test-visualization.js +0 -36
  105. package/dist/src/code-intelligence/types.js +0 -1
  106. package/dist/src/code-intelligence/visualization/index.js +0 -2
  107. package/dist/src/code-intelligence/visualization/types.js +0 -1
  108. package/dist/src/code-intelligence/visualization/visualization-builder.js +0 -104
  109. package/dist/src/core/config.js +0 -66
  110. package/dist/src/core/global-env.js +0 -70
  111. package/dist/src/core/importance.js +0 -30
  112. package/dist/src/core/index.js +0 -5
  113. package/dist/src/core/memory-engine.js +0 -183
  114. package/dist/src/core/project-manager.js +0 -243
  115. package/dist/src/core/types.js +0 -1
  116. package/dist/src/embeddings/batch-embedder.js +0 -1
  117. package/dist/src/embeddings/cache.js +0 -1
  118. package/dist/src/embeddings/embedder.js +0 -51
  119. package/dist/src/embeddings/index.js +0 -4
  120. package/dist/src/embeddings/local.js +0 -37
  121. package/dist/src/embeddings/provider.js +0 -1
  122. package/dist/src/embeddings/remote.js +0 -76
  123. package/dist/src/embeddings/test-connection.js +0 -16
  124. package/dist/src/hooks/after-edit.js +0 -3
  125. package/dist/src/hooks/after-tool.js +0 -3
  126. package/dist/src/hooks/auto-context.js +0 -68
  127. package/dist/src/hooks/auto-impact-guard.js +0 -94
  128. package/dist/src/hooks/auto-retrieval.js +0 -27
  129. package/dist/src/hooks/before-agent.js +0 -18
  130. package/dist/src/hooks/before-compact.js +0 -3
  131. package/dist/src/hooks/before-edit.js +0 -20
  132. package/dist/src/hooks/index.js +0 -11
  133. package/dist/src/hooks/runtime.js +0 -110
  134. package/dist/src/hooks/session-end.js +0 -3
  135. package/dist/src/hooks/session-start.js +0 -3
  136. package/dist/src/index.js +0 -22
  137. package/dist/src/mcp/bootstrap.js +0 -68
  138. package/dist/src/mcp/context.js +0 -1
  139. package/dist/src/mcp/index.js +0 -3
  140. package/dist/src/mcp/server.js +0 -45
  141. package/dist/src/mcp/tools/analyze-impact.js +0 -41
  142. package/dist/src/mcp/tools/dead-code.js +0 -55
  143. package/dist/src/mcp/tools/find-callers.js +0 -24
  144. package/dist/src/mcp/tools/find-dependencies.js +0 -57
  145. package/dist/src/mcp/tools/find-symbol.js +0 -7
  146. package/dist/src/mcp/tools/get-architecture.js +0 -11
  147. package/dist/src/mcp/tools/graph-dependents.js +0 -24
  148. package/dist/src/mcp/tools/graph-neighborhood.js +0 -58
  149. package/dist/src/mcp/tools/graph-path.js +0 -43
  150. package/dist/src/mcp/tools/graph-query-utils.js +0 -32
  151. package/dist/src/mcp/tools/impact-guard.js +0 -34
  152. package/dist/src/mcp/tools/index-repository.js +0 -1
  153. package/dist/src/mcp/tools/index.js +0 -20
  154. package/dist/src/mcp/tools/memory-decisions.js +0 -1
  155. package/dist/src/mcp/tools/memory-forget.js +0 -14
  156. package/dist/src/mcp/tools/memory-recent.js +0 -1
  157. package/dist/src/mcp/tools/memory-remember.js +0 -33
  158. package/dist/src/mcp/tools/memory-rules.js +0 -1
  159. package/dist/src/mcp/tools/memory-search.js +0 -18
  160. package/dist/src/mcp/tools/memory-todos.js +0 -1
  161. package/dist/src/mcp/tools/project-context.js +0 -25
  162. package/dist/src/mcp/tools/search-code.js +0 -21
  163. package/dist/src/mcp/tools/semantic-code-search.js +0 -33
  164. package/dist/src/mcp/tools/snapshot-create.js +0 -13
  165. package/dist/src/mcp/tools/snapshot-list.js +0 -7
  166. package/dist/src/mcp/tools/snapshot-restore.js +0 -13
  167. package/dist/src/mcp/tools/trace-calls.js +0 -37
  168. package/dist/src/memory/activity.js +0 -5
  169. package/dist/src/memory/conflict-detector.js +0 -105
  170. package/dist/src/memory/consolidator.js +0 -104
  171. package/dist/src/memory/decay.js +0 -59
  172. package/dist/src/memory/decisions.js +0 -3
  173. package/dist/src/memory/deduplicate.js +0 -25
  174. package/dist/src/memory/index.js +0 -11
  175. package/dist/src/memory/maintenance.js +0 -16
  176. package/dist/src/memory/remember.js +0 -3
  177. package/dist/src/memory/rules.js +0 -3
  178. package/dist/src/memory/search.js +0 -3
  179. package/dist/src/memory/summaries.js +0 -1
  180. package/dist/src/memory/todos.js +0 -3
  181. package/dist/src/processor/decision-extractor.js +0 -13
  182. package/dist/src/processor/importance-scorer.js +0 -22
  183. package/dist/src/processor/index.js +0 -7
  184. package/dist/src/processor/memory-extractor.js +0 -59
  185. package/dist/src/processor/memory-processor.js +0 -105
  186. package/dist/src/processor/rule-extractor.js +0 -13
  187. package/dist/src/processor/summarizer.js +0 -71
  188. package/dist/src/processor/todo-extractor.js +0 -12
  189. package/dist/src/production/config-check.js +0 -34
  190. package/dist/src/production/doctor.js +0 -58
  191. package/dist/src/production/full-index.js +0 -114
  192. package/dist/src/production/health.js +0 -58
  193. package/dist/src/production/index-pipeline.js +0 -151
  194. package/dist/src/production/index.js +0 -4
  195. package/dist/src/production/project-lock.js +0 -95
  196. package/dist/src/production/project-status.js +0 -16
  197. package/dist/src/production/recovery.js +0 -15
  198. package/dist/src/production/setup.js +0 -219
  199. package/dist/src/production/snapshot-cli.js +0 -58
  200. package/dist/src/project-manual/cli.js +0 -77
  201. package/dist/src/project-manual/index.js +0 -2
  202. package/dist/src/project-manual/manager.js +0 -147
  203. package/dist/src/project-manual/types.js +0 -1
  204. package/dist/src/retrieval/bm25/index.js +0 -1
  205. package/dist/src/retrieval/bm25/search.js +0 -1
  206. package/dist/src/retrieval/bm25.js +0 -30
  207. package/dist/src/retrieval/context-budget.js +0 -1
  208. package/dist/src/retrieval/context-builder.js +0 -22
  209. package/dist/src/retrieval/graph/index.js +0 -1
  210. package/dist/src/retrieval/graph/search.js +0 -1
  211. package/dist/src/retrieval/hybrid/hybrid-search.js +0 -1
  212. package/dist/src/retrieval/hybrid/index.js +0 -1
  213. package/dist/src/retrieval/hybrid-search.js +0 -68
  214. package/dist/src/retrieval/importance.js +0 -16
  215. package/dist/src/retrieval/index.js +0 -12
  216. package/dist/src/retrieval/query-analyzer.js +0 -32
  217. package/dist/src/retrieval/query-classifier.js +0 -1
  218. package/dist/src/retrieval/query-expansion.js +0 -1
  219. package/dist/src/retrieval/recency.js +0 -12
  220. package/dist/src/retrieval/reranker/index.js +0 -1
  221. package/dist/src/retrieval/reranker/reranker.js +0 -1
  222. package/dist/src/retrieval/retrieval-engine.js +0 -17
  223. package/dist/src/retrieval/tokenizer.js +0 -9
  224. package/dist/src/retrieval/type-priority.js +0 -10
  225. package/dist/src/retrieval/types.js +0 -1
  226. package/dist/src/retrieval/vector/index.js +0 -4
  227. package/dist/src/retrieval/vector/metadata-filter.js +0 -1
  228. package/dist/src/retrieval/vector/persistence.js +0 -67
  229. package/dist/src/retrieval/vector/search.js +0 -12
  230. package/dist/src/retrieval/vector/test-persistence.js +0 -36
  231. package/dist/src/retrieval/vector/upsert.js +0 -40
  232. package/dist/src/retrieval/vector/vector-store.js +0 -89
  233. package/dist/src/retrieval/vector-hybrid-engine.js +0 -91
  234. package/dist/src/runtime/bootstrap.js +0 -28
  235. package/dist/src/runtime/graceful.js +0 -17
  236. package/dist/src/runtime/index.js +0 -3
  237. package/dist/src/runtime/toolnet-memory-runtime.js +0 -156
  238. package/dist/src/security/encryption.js +0 -1
  239. package/dist/src/security/file-filter.js +0 -30
  240. package/dist/src/security/index.js +0 -3
  241. package/dist/src/security/sanitizer.js +0 -49
  242. package/dist/src/security/secret-scanner.js +0 -56
  243. package/dist/src/session/agy/adapter.js +0 -159
  244. package/dist/src/session/agy/cli.js +0 -87
  245. package/dist/src/session/agy/hook-installer.js +0 -62
  246. package/dist/src/session/agy/hook.js +0 -167
  247. package/dist/src/session/agy/index.js +0 -5
  248. package/dist/src/session/agy/project-resolver.js +0 -27
  249. package/dist/src/session/agy/recovery.js +0 -112
  250. package/dist/src/session/agy/transcript.js +0 -191
  251. package/dist/src/session/codex/adapter.js +0 -138
  252. package/dist/src/session/codex/cli.js +0 -236
  253. package/dist/src/session/codex/context-hook-installer.js +0 -70
  254. package/dist/src/session/codex/context-hook.js +0 -69
  255. package/dist/src/session/codex/discovery.js +0 -138
  256. package/dist/src/session/codex/index.js +0 -6
  257. package/dist/src/session/codex/notify-installer.js +0 -135
  258. package/dist/src/session/codex/project-resolver.js +0 -25
  259. package/dist/src/session/codex/recovery.js +0 -27
  260. package/dist/src/session/codex/rollout.js +0 -186
  261. package/dist/src/session/core.js +0 -239
  262. package/dist/src/session/identity.js +0 -57
  263. package/dist/src/session/index.js +0 -9
  264. package/dist/src/session/learner/cli.js +0 -62
  265. package/dist/src/session/learner/extractor.js +0 -461
  266. package/dist/src/session/learner/index.js +0 -4
  267. package/dist/src/session/learner/journal.js +0 -159
  268. package/dist/src/session/learner/learner.js +0 -124
  269. package/dist/src/session/learner/types.js +0 -1
  270. package/dist/src/session/opencode/adapter.js +0 -553
  271. package/dist/src/session/opencode/cli.js +0 -121
  272. package/dist/src/session/opencode/index.js +0 -2
  273. package/dist/src/session/opencode/plugin-installer.js +0 -230
  274. package/dist/src/session/store.js +0 -242
  275. package/dist/src/session/types.js +0 -1
  276. package/dist/src/session/utils.js +0 -47
  277. package/dist/src/session/wal.js +0 -303
  278. package/dist/src/snapshot/index.js +0 -2
  279. package/dist/src/snapshot/manager.js +0 -130
  280. package/dist/src/snapshot/test-snapshot.js +0 -28
  281. package/dist/src/snapshot/types.js +0 -1
  282. package/dist/src/storage/architecture-store.js +0 -37
  283. package/dist/src/storage/cleanup-health.js +0 -20
  284. package/dist/src/storage/code-analysis-store.js +0 -35
  285. package/dist/src/storage/code-chunk-store.js +0 -25
  286. package/dist/src/storage/code-graph-store.js +0 -24
  287. package/dist/src/storage/code-manifest-store.js +0 -24
  288. package/dist/src/storage/code-vector-store.js +0 -25
  289. package/dist/src/storage/github/client.js +0 -1
  290. package/dist/src/storage/github/index.js +0 -1
  291. package/dist/src/storage/google-drive/client.js +0 -1
  292. package/dist/src/storage/google-drive/index.js +0 -1
  293. package/dist/src/storage/huggingface/client.js +0 -116
  294. package/dist/src/storage/huggingface/index.js +0 -1
  295. package/dist/src/storage/index.js +0 -16
  296. package/dist/src/storage/list-bucket-raw.js +0 -14
  297. package/dist/src/storage/list-bucket-tree.js +0 -38
  298. package/dist/src/storage/local/client.js +0 -99
  299. package/dist/src/storage/local/index.js +0 -1
  300. package/dist/src/storage/memory-store.js +0 -30
  301. package/dist/src/storage/project/cleanup-layout-v1.js +0 -72
  302. package/dist/src/storage/project/folder.js +0 -15
  303. package/dist/src/storage/project/index.js +0 -3
  304. package/dist/src/storage/project/layout.js +0 -74
  305. package/dist/src/storage/project/migrate-layout-v2.js +0 -101
  306. package/dist/src/storage/project/migrate.js +0 -73
  307. package/dist/src/storage/project/scoped-provider.js +0 -165
  308. package/dist/src/storage/provider.js +0 -26
  309. package/dist/src/storage/retrying-provider.js +0 -23
  310. package/dist/src/storage/test-connection.js +0 -32
  311. package/dist/src/storage/type-resolution-store.js +0 -26
  312. package/dist/src/storage/types.js +0 -1
  313. package/dist/src/storage/vector-store.js +0 -30
  314. package/dist/src/storage/visualization-store.js +0 -25
  315. package/dist/src/sync/compressor.js +0 -1
  316. package/dist/src/sync/conflict-resolver.js +0 -1
  317. package/dist/src/sync/downloader.js +0 -1
  318. package/dist/src/sync/index.js +0 -1
  319. package/dist/src/sync/sync-engine.js +0 -1
  320. package/dist/src/sync/upload-queue.js +0 -1
  321. package/dist/src/utils/retry.js +0 -29
  322. package/dist/src/visualization/server.js +0 -270
  323. package/dist/src/work-continuity/brief-cache.js +0 -107
  324. package/dist/src/work-continuity/brief.js +0 -349
  325. package/dist/src/work-continuity/cli.js +0 -96
  326. package/dist/src/work-continuity/context-cli.js +0 -106
  327. package/dist/src/work-continuity/context-runtime-cli.js +0 -88
  328. package/dist/src/work-continuity/extractor.js +0 -339
  329. package/dist/src/work-continuity/handoff.js +0 -185
  330. package/dist/src/work-continuity/index.js +0 -14
  331. package/dist/src/work-continuity/injection.js +0 -84
  332. package/dist/src/work-continuity/journal.js +0 -49
  333. package/dist/src/work-continuity/learner.js +0 -127
  334. package/dist/src/work-continuity/reducer.js +0 -316
  335. package/dist/src/work-continuity/semantic-extractor.js +0 -360
  336. package/dist/src/work-continuity/semantic-journal.js +0 -55
  337. package/dist/src/work-continuity/semantic-learner.js +0 -125
  338. package/dist/src/work-continuity/semantic-reducer.js +0 -268
  339. package/dist/src/work-continuity/semantic-types.js +0 -1
  340. package/dist/src/work-continuity/types.js +0 -1
  341. package/dist/visualization/public/index.html +0 -2896
  342. package/dist/visualization/public/vendor/3d-force-graph.min.js +0 -5
@@ -1,303 +0,0 @@
1
- import { closeSync, existsSync, fsyncSync, mkdirSync, openSync, readSync, rmSync, statSync, writeSync, } from "node:fs";
2
- import { join, } from "node:path";
3
- import { readJsonFile, sha256, stableStringify, writeJsonAtomic, } from "./utils.js";
4
- const LOCK_STALE_MS = 120_000;
5
- const LOCK_ATTEMPTS = 80;
6
- const RECENT_EVENT_LIMIT = 2_000;
7
- function sleepSync(milliseconds) {
8
- Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, milliseconds);
9
- }
10
- export class SessionWal {
11
- identity;
12
- eventsFile;
13
- stateFile;
14
- lockFile;
15
- constructor(identity) {
16
- this.identity = identity;
17
- mkdirSync(identity.localDirectory, {
18
- recursive: true,
19
- });
20
- this.eventsFile =
21
- join(identity.localDirectory, "events.jsonl");
22
- this.stateFile =
23
- join(identity.localDirectory, "state.json");
24
- this.lockFile =
25
- join(identity.localDirectory, "journal.lock");
26
- }
27
- initialState() {
28
- const now = new Date()
29
- .toISOString();
30
- return {
31
- version: 1,
32
- projectId: this.identity
33
- .projectId,
34
- agent: this.identity
35
- .agent,
36
- nativeSessionId: this.identity
37
- .nativeSessionId,
38
- status: "idle",
39
- createdAt: now,
40
- updatedAt: now,
41
- lastSequence: 0,
42
- lastRemoteSequence: 0,
43
- remoteByteOffset: 0,
44
- sourceCursors: {},
45
- recentEventIds: [],
46
- };
47
- }
48
- loadStateUnsafe() {
49
- return (readJsonFile(this.stateFile) ??
50
- this.initialState());
51
- }
52
- loadState() {
53
- return this.withLock(() => this.loadStateUnsafe());
54
- }
55
- saveStateUnsafe(state) {
56
- writeJsonAtomic(this.stateFile, state);
57
- }
58
- acquireLock() {
59
- for (let attempt = 0; attempt <
60
- LOCK_ATTEMPTS; attempt += 1) {
61
- try {
62
- return openSync(this.lockFile, "wx", 0o600);
63
- }
64
- catch (error) {
65
- const code = error.code;
66
- if (code !==
67
- "EEXIST") {
68
- throw error;
69
- }
70
- try {
71
- const lockAge = Date.now() -
72
- statSync(this.lockFile).mtimeMs;
73
- if (lockAge >
74
- LOCK_STALE_MS) {
75
- rmSync(this.lockFile, {
76
- force: true,
77
- });
78
- continue;
79
- }
80
- }
81
- catch {
82
- // Lock disappeared between checks.
83
- }
84
- sleepSync(25);
85
- }
86
- }
87
- throw new Error(`Session journal is locked: ${this.lockFile}`);
88
- }
89
- withLock(run) {
90
- const fd = this.acquireLock();
91
- try {
92
- return run();
93
- }
94
- finally {
95
- closeSync(fd);
96
- rmSync(this.lockFile, {
97
- force: true,
98
- });
99
- }
100
- }
101
- append(inputs) {
102
- if (inputs.length ===
103
- 0) {
104
- return [];
105
- }
106
- return this.withLock(() => {
107
- const state = this.loadStateUnsafe();
108
- const recent = new Set(state.recentEventIds);
109
- let nextSequence = state.lastSequence;
110
- const normalized = [];
111
- for (const input of inputs) {
112
- const timestamp = input.timestamp ??
113
- new Date()
114
- .toISOString();
115
- const data = input.data ??
116
- {};
117
- const rawDigest = input.provenance
118
- ?.rawDigest ??
119
- sha256(stableStringify(data));
120
- const idSeed = input.sourceEventId
121
- ? [
122
- this.identity
123
- .projectId,
124
- this.identity
125
- .agent,
126
- this.identity
127
- .nativeSessionId,
128
- input
129
- .sourceEventId,
130
- ].join("|")
131
- : [
132
- this.identity
133
- .projectId,
134
- this.identity
135
- .agent,
136
- this.identity
137
- .nativeSessionId,
138
- nextSequence +
139
- 1,
140
- input.type,
141
- timestamp,
142
- rawDigest,
143
- ].join("|");
144
- const eventId = sha256(idSeed).slice(0, 32);
145
- /*
146
- * Fast bounded dedup.
147
- * Adapters will additionally use native source cursors.
148
- */
149
- if (recent.has(eventId)) {
150
- continue;
151
- }
152
- nextSequence +=
153
- 1;
154
- const event = {
155
- version: 1,
156
- id: eventId,
157
- sequence: nextSequence,
158
- projectId: this.identity
159
- .projectId,
160
- agent: this.identity
161
- .agent,
162
- nativeSessionId: this.identity
163
- .nativeSessionId,
164
- type: input.type,
165
- timestamp,
166
- data,
167
- provenance: {
168
- ...input.provenance,
169
- rawDigest,
170
- },
171
- };
172
- if (input.role !==
173
- undefined) {
174
- event.role =
175
- input.role;
176
- }
177
- if (input.sourceEventId !==
178
- undefined) {
179
- event.sourceEventId =
180
- input.sourceEventId;
181
- }
182
- if (input.sourceSequence !==
183
- undefined) {
184
- event.sourceSequence =
185
- input.sourceSequence;
186
- }
187
- normalized.push(event);
188
- recent.add(eventId);
189
- }
190
- if (normalized.length ===
191
- 0) {
192
- return [];
193
- }
194
- const content = normalized
195
- .map(item => JSON.stringify(item))
196
- .join("\n") +
197
- "\n";
198
- const fd = openSync(this.eventsFile, "a", 0o600);
199
- try {
200
- writeSync(fd, content, null, "utf8");
201
- fsyncSync(fd);
202
- }
203
- finally {
204
- closeSync(fd);
205
- }
206
- const last = normalized[normalized.length -
207
- 1];
208
- let status = "active";
209
- if ((last.type ===
210
- "session_end" ||
211
- last.type ===
212
- "session_idle")) {
213
- status =
214
- "idle";
215
- }
216
- else if (last.type ===
217
- "error") {
218
- status =
219
- "error";
220
- }
221
- const recentEventIds = Array.from(recent).slice(-RECENT_EVENT_LIMIT);
222
- this.saveStateUnsafe({
223
- ...state,
224
- status,
225
- updatedAt: last.timestamp,
226
- lastSequence: last.sequence,
227
- recentEventIds,
228
- });
229
- return normalized;
230
- });
231
- }
232
- readPending() {
233
- return this.withLock(() => {
234
- const state = this.loadStateUnsafe();
235
- if (!existsSync(this.eventsFile)) {
236
- return {
237
- events: [],
238
- startOffset: state.remoteByteOffset,
239
- endOffset: state.remoteByteOffset,
240
- };
241
- }
242
- const fileSize = statSync(this.eventsFile).size;
243
- const startOffset = Math.min(state.remoteByteOffset, fileSize);
244
- if (fileSize <=
245
- startOffset) {
246
- return {
247
- events: [],
248
- startOffset,
249
- endOffset: fileSize,
250
- };
251
- }
252
- const length = fileSize -
253
- startOffset;
254
- const buffer = Buffer.alloc(length);
255
- const fd = openSync(this.eventsFile, "r");
256
- try {
257
- readSync(fd, buffer, 0, length, startOffset);
258
- }
259
- finally {
260
- closeSync(fd);
261
- }
262
- const text = buffer.toString("utf8");
263
- const events = text
264
- .split("\n")
265
- .filter(Boolean)
266
- .map(line => JSON.parse(line));
267
- return {
268
- events,
269
- startOffset,
270
- endOffset: fileSize,
271
- };
272
- });
273
- }
274
- markRemote(sequence, byteOffset) {
275
- this.withLock(() => {
276
- const state = this.loadStateUnsafe();
277
- this.saveStateUnsafe({
278
- ...state,
279
- lastRemoteSequence: Math.max(state
280
- .lastRemoteSequence, sequence),
281
- remoteByteOffset: Math.max(state
282
- .remoteByteOffset, byteOffset),
283
- updatedAt: new Date()
284
- .toISOString(),
285
- });
286
- });
287
- }
288
- setSourceCursor(source, value) {
289
- this.withLock(() => {
290
- const state = this.loadStateUnsafe();
291
- this.saveStateUnsafe({
292
- ...state,
293
- sourceCursors: {
294
- ...state
295
- .sourceCursors,
296
- [source]: String(value),
297
- },
298
- updatedAt: new Date()
299
- .toISOString(),
300
- });
301
- });
302
- }
303
- }
@@ -1,2 +0,0 @@
1
- export * from "./types.js";
2
- export * from "./manager.js";
@@ -1,130 +0,0 @@
1
- const CURRENT_OBJECTS = [
2
- "memories/current.json",
3
- "vectors/current.json",
4
- "graph/current.json",
5
- "graph/manifest.json",
6
- "graph/resolution/current.json",
7
- "code/chunks/current.json",
8
- "code/vectors/current.json",
9
- "code/architecture/current.json",
10
- "code/architecture/entry-points.json",
11
- "code/architecture/hotspots.json",
12
- "code/architecture/layers.json",
13
- "code/architecture/clusters.json",
14
- "code/analysis/current.json",
15
- "code/analysis/dead-code.json",
16
- "code/analysis/dependencies.json",
17
- "code/visualization/graph.json",
18
- ];
19
- export class SnapshotManager {
20
- storage;
21
- constructor(storage) {
22
- this.storage = storage;
23
- }
24
- projectPrefix(projectId) {
25
- return `projects/${projectId}`;
26
- }
27
- snapshotPrefix(projectId, snapshotId) {
28
- return [
29
- this.projectPrefix(projectId),
30
- "snapshots",
31
- snapshotId,
32
- ].join("/");
33
- }
34
- async create(projectId, reason = "automatic", metadata) {
35
- const createdAt = new Date().toISOString();
36
- const id = createdAt
37
- .replace(/[:.]/g, "-");
38
- const base = this.projectPrefix(projectId);
39
- const snapshotBase = this.snapshotPrefix(projectId, id);
40
- const savedObjects = [];
41
- for (const relativeKey of CURRENT_OBJECTS) {
42
- const sourceKey = `${base}/${relativeKey}`;
43
- const data = await this.storage.get(sourceKey);
44
- if (!data) {
45
- continue;
46
- }
47
- await this.storage.put(`${snapshotBase}/${relativeKey}`, data, "application/json");
48
- savedObjects.push(relativeKey);
49
- }
50
- if (savedObjects.length === 0) {
51
- return null;
52
- }
53
- const manifest = {
54
- version: 1,
55
- id,
56
- projectId,
57
- createdAt,
58
- reason,
59
- objects: savedObjects,
60
- metadata,
61
- };
62
- await this.storage.put(`${snapshotBase}/snapshot.json`, JSON.stringify(manifest, null, 2), "application/json");
63
- return manifest;
64
- }
65
- async list(projectId) {
66
- const prefix = [
67
- this.projectPrefix(projectId),
68
- "snapshots",
69
- ].join("/");
70
- const files = await this.storage.list(prefix);
71
- const manifests = files.filter((file) => file.key.endsWith("/snapshot.json"));
72
- const output = [];
73
- for (const item of manifests) {
74
- const text = await this.storage.getText(item.key);
75
- if (!text) {
76
- continue;
77
- }
78
- try {
79
- output.push(JSON.parse(text));
80
- }
81
- catch {
82
- // Ignore damaged snapshot manifests.
83
- }
84
- }
85
- return output.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
86
- }
87
- async restore(projectId, snapshotId) {
88
- const snapshotBase = this.snapshotPrefix(projectId, snapshotId);
89
- const manifestText = await this.storage.getText(`${snapshotBase}/snapshot.json`);
90
- if (!manifestText) {
91
- throw new Error(`Snapshot not found: ${snapshotId}`);
92
- }
93
- const manifest = JSON.parse(manifestText);
94
- if (manifest.projectId !==
95
- projectId) {
96
- throw new Error("Snapshot project mismatch");
97
- }
98
- const base = this.projectPrefix(projectId);
99
- const restored = [];
100
- for (const relativeKey of manifest.objects) {
101
- const data = await this.storage.get(`${snapshotBase}/${relativeKey}`);
102
- if (!data) {
103
- continue;
104
- }
105
- await this.storage.put(`${base}/${relativeKey}`, data, "application/json");
106
- restored.push(relativeKey);
107
- }
108
- return {
109
- restored,
110
- };
111
- }
112
- async remove(projectId, snapshotId) {
113
- const prefix = this.snapshotPrefix(projectId, snapshotId);
114
- const objects = await this.storage.list(prefix);
115
- for (const object of objects) {
116
- await this.storage.delete(object.key);
117
- }
118
- return objects.length;
119
- }
120
- async prune(projectId, keep = 10) {
121
- const snapshots = await this.list(projectId);
122
- const remove = snapshots.slice(keep);
123
- let deleted = 0;
124
- for (const snapshot of remove) {
125
- await this.remove(projectId, snapshot.id);
126
- deleted++;
127
- }
128
- return deleted;
129
- }
130
- }
@@ -1,28 +0,0 @@
1
- import "dotenv/config";
2
- import { loadConfig, ProjectManager, } from "../core/index.js";
3
- import { createStorageProvider, ProjectScopedStorageProvider, } from "../storage/index.js";
4
- import { SnapshotManager, } from "./manager.js";
5
- async function main() {
6
- const config = loadConfig();
7
- const project = new ProjectManager()
8
- .detect();
9
- const rawStorage = createStorageProvider({
10
- provider: config.storage.provider,
11
- huggingface: config.storage.huggingface,
12
- localRoot: config.storage.localRoot,
13
- });
14
- const storage = new ProjectScopedStorageProvider(rawStorage, project.id, project.name, project.remote ?? project.name);
15
- const manager = new SnapshotManager(storage);
16
- const created = await manager.create(project.id, "manual-test");
17
- const list = await manager.list(project.id);
18
- console.log({
19
- ok: Boolean(created),
20
- created: created?.id,
21
- snapshots: list.length,
22
- latest: list[0]?.id,
23
- });
24
- }
25
- main().catch((error) => {
26
- console.error(error);
27
- process.exit(1);
28
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,37 +0,0 @@
1
- export class PersistentArchitectureStore {
2
- storage;
3
- constructor(storage) {
4
- this.storage = storage;
5
- }
6
- base(projectId) {
7
- return [
8
- "projects",
9
- projectId,
10
- "code",
11
- "architecture",
12
- ].join("/");
13
- }
14
- async load(projectId) {
15
- const text = await this.storage.getText(`${this.base(projectId)}/current.json`);
16
- if (!text) {
17
- return null;
18
- }
19
- return JSON.parse(text);
20
- }
21
- async save(snapshot) {
22
- const base = this.base(snapshot.projectId);
23
- const envelope = (data) => JSON.stringify({
24
- version: snapshot.version,
25
- projectId: snapshot.projectId,
26
- updatedAt: snapshot.updatedAt,
27
- data,
28
- }, null, 2);
29
- await Promise.all([
30
- this.storage.put(`${base}/current.json`, JSON.stringify(snapshot, null, 2), "application/json"),
31
- this.storage.put(`${base}/entry-points.json`, envelope(snapshot.entryPoints), "application/json"),
32
- this.storage.put(`${base}/hotspots.json`, envelope(snapshot.hotspots), "application/json"),
33
- this.storage.put(`${base}/layers.json`, envelope(snapshot.layers), "application/json"),
34
- this.storage.put(`${base}/clusters.json`, envelope(snapshot.clusters), "application/json"),
35
- ]);
36
- }
37
- }
@@ -1,20 +0,0 @@
1
- import "dotenv/config";
2
- import { loadConfig, } from "../core/index.js";
3
- import { createStorageProvider, withStorageRetry, } from "./index.js";
4
- const config = loadConfig();
5
- const storage = withStorageRetry(createStorageProvider({
6
- provider: config.storage.provider,
7
- huggingface: config.storage.huggingface,
8
- localRoot: config.storage.localRoot,
9
- }), {
10
- attempts: 3,
11
- });
12
- const objects = await storage.list("_health/");
13
- for (const object of objects) {
14
- await storage.delete(object.key);
15
- console.log(`deleted ${object.key}`);
16
- }
17
- console.log({
18
- ok: true,
19
- deleted: objects.length,
20
- });
@@ -1,35 +0,0 @@
1
- export class PersistentCodeAnalysisStore {
2
- storage;
3
- constructor(storage) {
4
- this.storage = storage;
5
- }
6
- base(projectId) {
7
- return [
8
- "projects",
9
- projectId,
10
- "code",
11
- "analysis",
12
- ].join("/");
13
- }
14
- async load(projectId) {
15
- const text = await this.storage.getText(`${this.base(projectId)}/current.json`);
16
- if (!text) {
17
- return null;
18
- }
19
- return JSON.parse(text);
20
- }
21
- async save(snapshot) {
22
- const base = this.base(snapshot.projectId);
23
- const envelope = (data) => JSON.stringify({
24
- version: snapshot.version,
25
- projectId: snapshot.projectId,
26
- updatedAt: snapshot.updatedAt,
27
- data,
28
- }, null, 2);
29
- await Promise.all([
30
- this.storage.put(`${base}/current.json`, JSON.stringify(snapshot, null, 2), "application/json"),
31
- this.storage.put(`${base}/dead-code.json`, envelope(snapshot.deadCode), "application/json"),
32
- this.storage.put(`${base}/dependencies.json`, envelope(snapshot.dependencies), "application/json"),
33
- ]);
34
- }
35
- }
@@ -1,25 +0,0 @@
1
- export class PersistentCodeChunkStore {
2
- storage;
3
- constructor(storage) {
4
- this.storage = storage;
5
- }
6
- key(projectId) {
7
- return [
8
- "projects",
9
- projectId,
10
- "code",
11
- "chunks",
12
- "current.json",
13
- ].join("/");
14
- }
15
- async load(projectId) {
16
- const text = await this.storage.getText(this.key(projectId));
17
- if (!text) {
18
- return null;
19
- }
20
- return JSON.parse(text);
21
- }
22
- async save(snapshot) {
23
- await this.storage.put(this.key(snapshot.projectId), JSON.stringify(snapshot), "application/json");
24
- }
25
- }
@@ -1,24 +0,0 @@
1
- export class PersistentCodeGraphStore {
2
- storage;
3
- constructor(storage) {
4
- this.storage = storage;
5
- }
6
- key(projectId) {
7
- return [
8
- "projects",
9
- projectId,
10
- "graph",
11
- "current.json",
12
- ].join("/");
13
- }
14
- async load(projectId) {
15
- const text = await this.storage.getText(this.key(projectId));
16
- if (!text) {
17
- return null;
18
- }
19
- return JSON.parse(text);
20
- }
21
- async save(snapshot) {
22
- await this.storage.put(this.key(snapshot.projectId), JSON.stringify(snapshot), "application/json");
23
- }
24
- }
@@ -1,24 +0,0 @@
1
- export class PersistentCodeManifestStore {
2
- storage;
3
- constructor(storage) {
4
- this.storage = storage;
5
- }
6
- key(projectId) {
7
- return [
8
- "projects",
9
- projectId,
10
- "graph",
11
- "manifest.json",
12
- ].join("/");
13
- }
14
- async load(projectId) {
15
- const text = await this.storage.getText(this.key(projectId));
16
- if (!text) {
17
- return null;
18
- }
19
- return JSON.parse(text);
20
- }
21
- async save(manifest) {
22
- await this.storage.put(this.key(manifest.projectId), JSON.stringify(manifest), "application/json");
23
- }
24
- }
@@ -1,25 +0,0 @@
1
- export class PersistentCodeVectorStore {
2
- storage;
3
- constructor(storage) {
4
- this.storage = storage;
5
- }
6
- key(projectId) {
7
- return [
8
- "projects",
9
- projectId,
10
- "code",
11
- "vectors",
12
- "current.json",
13
- ].join("/");
14
- }
15
- async load(projectId) {
16
- const text = await this.storage.getText(this.key(projectId));
17
- if (!text) {
18
- return null;
19
- }
20
- return JSON.parse(text);
21
- }
22
- async save(snapshot) {
23
- await this.storage.put(this.key(snapshot.projectId), JSON.stringify(snapshot), "application/json");
24
- }
25
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};