toolnet-memory 0.2.0 → 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 (341) hide show
  1. package/README.md +443 -70
  2. package/bin/toolnet-memory +66 -53
  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 +11 -5
  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/snapshot-cli.js +0 -58
  199. package/dist/src/project-manual/cli.js +0 -77
  200. package/dist/src/project-manual/index.js +0 -2
  201. package/dist/src/project-manual/manager.js +0 -147
  202. package/dist/src/project-manual/types.js +0 -1
  203. package/dist/src/retrieval/bm25/index.js +0 -1
  204. package/dist/src/retrieval/bm25/search.js +0 -1
  205. package/dist/src/retrieval/bm25.js +0 -30
  206. package/dist/src/retrieval/context-budget.js +0 -1
  207. package/dist/src/retrieval/context-builder.js +0 -22
  208. package/dist/src/retrieval/graph/index.js +0 -1
  209. package/dist/src/retrieval/graph/search.js +0 -1
  210. package/dist/src/retrieval/hybrid/hybrid-search.js +0 -1
  211. package/dist/src/retrieval/hybrid/index.js +0 -1
  212. package/dist/src/retrieval/hybrid-search.js +0 -68
  213. package/dist/src/retrieval/importance.js +0 -16
  214. package/dist/src/retrieval/index.js +0 -12
  215. package/dist/src/retrieval/query-analyzer.js +0 -32
  216. package/dist/src/retrieval/query-classifier.js +0 -1
  217. package/dist/src/retrieval/query-expansion.js +0 -1
  218. package/dist/src/retrieval/recency.js +0 -12
  219. package/dist/src/retrieval/reranker/index.js +0 -1
  220. package/dist/src/retrieval/reranker/reranker.js +0 -1
  221. package/dist/src/retrieval/retrieval-engine.js +0 -17
  222. package/dist/src/retrieval/tokenizer.js +0 -9
  223. package/dist/src/retrieval/type-priority.js +0 -10
  224. package/dist/src/retrieval/types.js +0 -1
  225. package/dist/src/retrieval/vector/index.js +0 -4
  226. package/dist/src/retrieval/vector/metadata-filter.js +0 -1
  227. package/dist/src/retrieval/vector/persistence.js +0 -67
  228. package/dist/src/retrieval/vector/search.js +0 -12
  229. package/dist/src/retrieval/vector/test-persistence.js +0 -36
  230. package/dist/src/retrieval/vector/upsert.js +0 -40
  231. package/dist/src/retrieval/vector/vector-store.js +0 -89
  232. package/dist/src/retrieval/vector-hybrid-engine.js +0 -91
  233. package/dist/src/runtime/bootstrap.js +0 -28
  234. package/dist/src/runtime/graceful.js +0 -17
  235. package/dist/src/runtime/index.js +0 -3
  236. package/dist/src/runtime/toolnet-memory-runtime.js +0 -156
  237. package/dist/src/security/encryption.js +0 -1
  238. package/dist/src/security/file-filter.js +0 -30
  239. package/dist/src/security/index.js +0 -3
  240. package/dist/src/security/sanitizer.js +0 -49
  241. package/dist/src/security/secret-scanner.js +0 -56
  242. package/dist/src/session/agy/adapter.js +0 -159
  243. package/dist/src/session/agy/cli.js +0 -87
  244. package/dist/src/session/agy/hook-installer.js +0 -62
  245. package/dist/src/session/agy/hook.js +0 -167
  246. package/dist/src/session/agy/index.js +0 -5
  247. package/dist/src/session/agy/project-resolver.js +0 -27
  248. package/dist/src/session/agy/recovery.js +0 -112
  249. package/dist/src/session/agy/transcript.js +0 -191
  250. package/dist/src/session/codex/adapter.js +0 -138
  251. package/dist/src/session/codex/cli.js +0 -236
  252. package/dist/src/session/codex/context-hook-installer.js +0 -70
  253. package/dist/src/session/codex/context-hook.js +0 -69
  254. package/dist/src/session/codex/discovery.js +0 -138
  255. package/dist/src/session/codex/index.js +0 -6
  256. package/dist/src/session/codex/notify-installer.js +0 -135
  257. package/dist/src/session/codex/project-resolver.js +0 -25
  258. package/dist/src/session/codex/recovery.js +0 -27
  259. package/dist/src/session/codex/rollout.js +0 -186
  260. package/dist/src/session/core.js +0 -239
  261. package/dist/src/session/identity.js +0 -57
  262. package/dist/src/session/index.js +0 -9
  263. package/dist/src/session/learner/cli.js +0 -62
  264. package/dist/src/session/learner/extractor.js +0 -461
  265. package/dist/src/session/learner/index.js +0 -4
  266. package/dist/src/session/learner/journal.js +0 -159
  267. package/dist/src/session/learner/learner.js +0 -124
  268. package/dist/src/session/learner/types.js +0 -1
  269. package/dist/src/session/opencode/adapter.js +0 -553
  270. package/dist/src/session/opencode/cli.js +0 -121
  271. package/dist/src/session/opencode/index.js +0 -2
  272. package/dist/src/session/opencode/plugin-installer.js +0 -230
  273. package/dist/src/session/store.js +0 -242
  274. package/dist/src/session/types.js +0 -1
  275. package/dist/src/session/utils.js +0 -47
  276. package/dist/src/session/wal.js +0 -303
  277. package/dist/src/snapshot/index.js +0 -2
  278. package/dist/src/snapshot/manager.js +0 -130
  279. package/dist/src/snapshot/test-snapshot.js +0 -28
  280. package/dist/src/snapshot/types.js +0 -1
  281. package/dist/src/storage/architecture-store.js +0 -37
  282. package/dist/src/storage/cleanup-health.js +0 -20
  283. package/dist/src/storage/code-analysis-store.js +0 -35
  284. package/dist/src/storage/code-chunk-store.js +0 -25
  285. package/dist/src/storage/code-graph-store.js +0 -24
  286. package/dist/src/storage/code-manifest-store.js +0 -24
  287. package/dist/src/storage/code-vector-store.js +0 -25
  288. package/dist/src/storage/github/client.js +0 -1
  289. package/dist/src/storage/github/index.js +0 -1
  290. package/dist/src/storage/google-drive/client.js +0 -1
  291. package/dist/src/storage/google-drive/index.js +0 -1
  292. package/dist/src/storage/huggingface/client.js +0 -116
  293. package/dist/src/storage/huggingface/index.js +0 -1
  294. package/dist/src/storage/index.js +0 -16
  295. package/dist/src/storage/list-bucket-raw.js +0 -14
  296. package/dist/src/storage/list-bucket-tree.js +0 -38
  297. package/dist/src/storage/local/client.js +0 -99
  298. package/dist/src/storage/local/index.js +0 -1
  299. package/dist/src/storage/memory-store.js +0 -30
  300. package/dist/src/storage/project/cleanup-layout-v1.js +0 -72
  301. package/dist/src/storage/project/folder.js +0 -15
  302. package/dist/src/storage/project/index.js +0 -3
  303. package/dist/src/storage/project/layout.js +0 -74
  304. package/dist/src/storage/project/migrate-layout-v2.js +0 -101
  305. package/dist/src/storage/project/migrate.js +0 -73
  306. package/dist/src/storage/project/scoped-provider.js +0 -165
  307. package/dist/src/storage/provider.js +0 -26
  308. package/dist/src/storage/retrying-provider.js +0 -23
  309. package/dist/src/storage/test-connection.js +0 -32
  310. package/dist/src/storage/type-resolution-store.js +0 -26
  311. package/dist/src/storage/types.js +0 -1
  312. package/dist/src/storage/vector-store.js +0 -30
  313. package/dist/src/storage/visualization-store.js +0 -25
  314. package/dist/src/sync/compressor.js +0 -1
  315. package/dist/src/sync/conflict-resolver.js +0 -1
  316. package/dist/src/sync/downloader.js +0 -1
  317. package/dist/src/sync/index.js +0 -1
  318. package/dist/src/sync/sync-engine.js +0 -1
  319. package/dist/src/sync/upload-queue.js +0 -1
  320. package/dist/src/utils/retry.js +0 -29
  321. package/dist/src/visualization/server.js +0 -270
  322. package/dist/src/work-continuity/brief-cache.js +0 -107
  323. package/dist/src/work-continuity/brief.js +0 -349
  324. package/dist/src/work-continuity/cli.js +0 -96
  325. package/dist/src/work-continuity/context-cli.js +0 -106
  326. package/dist/src/work-continuity/context-runtime-cli.js +0 -88
  327. package/dist/src/work-continuity/extractor.js +0 -339
  328. package/dist/src/work-continuity/handoff.js +0 -185
  329. package/dist/src/work-continuity/index.js +0 -14
  330. package/dist/src/work-continuity/injection.js +0 -84
  331. package/dist/src/work-continuity/journal.js +0 -49
  332. package/dist/src/work-continuity/learner.js +0 -127
  333. package/dist/src/work-continuity/reducer.js +0 -316
  334. package/dist/src/work-continuity/semantic-extractor.js +0 -360
  335. package/dist/src/work-continuity/semantic-journal.js +0 -55
  336. package/dist/src/work-continuity/semantic-learner.js +0 -125
  337. package/dist/src/work-continuity/semantic-reducer.js +0 -268
  338. package/dist/src/work-continuity/semantic-types.js +0 -1
  339. package/dist/src/work-continuity/types.js +0 -1
  340. package/dist/visualization/public/index.html +0 -2896
  341. package/dist/visualization/public/vendor/3d-force-graph.min.js +0 -5
@@ -1,135 +0,0 @@
1
- import { existsSync, mkdirSync, readFileSync, writeFileSync, } from "node:fs";
2
- import { homedir, } from "node:os";
3
- import { dirname, join, } from "node:path";
4
- function stringsFromTomlArray(value) {
5
- const result = [];
6
- const regex = /"((?:\\.|[^"\\])*)"|'([^']*)'/g;
7
- let match;
8
- while ((match =
9
- regex.exec(value))) {
10
- const raw = match[1] ??
11
- match[2] ??
12
- "";
13
- try {
14
- result.push(match[1] !==
15
- undefined
16
- ? JSON.parse(`"${raw}"`)
17
- : raw);
18
- }
19
- catch {
20
- result.push(raw);
21
- }
22
- }
23
- return result;
24
- }
25
- export function installCodexNotify(options = {}) {
26
- const configFile = options.configFile ??
27
- join(process.env
28
- .CODEX_HOME ??
29
- join(homedir(), ".codex"), "config.toml");
30
- const previousFile = options.previousFile ??
31
- join(homedir(), ".config", "toolnet-memory", "codex-notify-previous.json");
32
- mkdirSync(dirname(configFile), {
33
- recursive: true,
34
- });
35
- mkdirSync(dirname(previousFile), {
36
- recursive: true,
37
- });
38
- let content = existsSync(configFile)
39
- ? readFileSync(configFile, "utf8")
40
- : "";
41
- const binary = options.binary ??
42
- "toolnet-memory";
43
- const newLine = `notify = [${JSON.stringify(binary)}, "session:codex-notify"]`;
44
- /*
45
- * Root TOML keys occur before first table.
46
- */
47
- const lines = content.split("\n");
48
- let firstTable = lines.findIndex(line => /^\s*\[/.test(line));
49
- if (firstTable < 0) {
50
- firstTable =
51
- lines.length;
52
- }
53
- let notifyStart = -1;
54
- let notifyEnd = -1;
55
- for (let index = 0; index <
56
- firstTable; index += 1) {
57
- if (/^\s*notify\s*=/.test(lines[index])) {
58
- notifyStart =
59
- index;
60
- notifyEnd =
61
- index;
62
- /*
63
- * Handle multiline TOML array.
64
- */
65
- if (lines[index]
66
- .includes("[") &&
67
- !lines[index]
68
- .includes("]")) {
69
- while (notifyEnd +
70
- 1 <
71
- firstTable) {
72
- notifyEnd +=
73
- 1;
74
- if (lines[notifyEnd].includes("]")) {
75
- break;
76
- }
77
- }
78
- }
79
- break;
80
- }
81
- }
82
- let previous = [];
83
- if (notifyStart >=
84
- 0) {
85
- const oldBlock = lines
86
- .slice(notifyStart, notifyEnd +
87
- 1)
88
- .join("\n");
89
- previous =
90
- stringsFromTomlArray(oldBlock);
91
- lines.splice(notifyStart, notifyEnd -
92
- notifyStart +
93
- 1, newLine);
94
- }
95
- else {
96
- firstTable =
97
- lines.findIndex(line => /^\s*\[/.test(line));
98
- if (firstTable < 0) {
99
- firstTable =
100
- lines.length;
101
- }
102
- lines.splice(firstTable, 0, newLine);
103
- }
104
- const isToolNet = previous.length >=
105
- 2 &&
106
- previous[previous.length -
107
- 1] ===
108
- "session:codex-notify";
109
- if (previous.length >
110
- 0 &&
111
- !isToolNet) {
112
- writeFileSync(previousFile, JSON.stringify(previous, null, 2) +
113
- "\n", {
114
- encoding: "utf8",
115
- mode: 0o600,
116
- });
117
- }
118
- content =
119
- lines.join("\n");
120
- if (!content.endsWith("\n")) {
121
- content +=
122
- "\n";
123
- }
124
- writeFileSync(configFile, content, {
125
- encoding: "utf8",
126
- mode: 0o600,
127
- });
128
- return {
129
- configFile,
130
- previousFile,
131
- preservedPrevious: previous.length >
132
- 0 &&
133
- !isToolNet,
134
- };
135
- }
@@ -1,25 +0,0 @@
1
- import { existsSync, } from "node:fs";
2
- import { dirname, join, parse, resolve, } from "node:path";
3
- import { ProjectManager, } from "../../core/index.js";
4
- export function findCodexToolNetProject(cwd) {
5
- let current = resolve(cwd);
6
- const filesystemRoot = parse(current).root;
7
- while (true) {
8
- if (existsSync(join(current, ".toolnet", "project.json"))) {
9
- return new ProjectManager()
10
- .detect(current);
11
- }
12
- if (current ===
13
- filesystemRoot) {
14
- break;
15
- }
16
- const parent = dirname(current);
17
- if (parent ===
18
- current) {
19
- break;
20
- }
21
- current =
22
- parent;
23
- }
24
- return null;
25
- }
@@ -1,27 +0,0 @@
1
- import { inspectCodexRollout, listCodexRollouts, pathBelongsToProject, } from "./discovery.js";
2
- import { syncCodexSession, } from "./adapter.js";
3
- export async function recoverCodexProject(project, storage, limit = 100) {
4
- const results = [];
5
- for (const rolloutPath of listCodexRollouts()) {
6
- const meta = inspectCodexRollout(rolloutPath);
7
- if (!meta.threadId ||
8
- !meta.cwd) {
9
- continue;
10
- }
11
- if (!pathBelongsToProject(project.rootPath, meta.cwd)) {
12
- continue;
13
- }
14
- results.push(await syncCodexSession({
15
- project,
16
- storage,
17
- threadId: meta.threadId,
18
- rolloutPath,
19
- cwd: meta.cwd,
20
- }));
21
- if (results.length >=
22
- limit) {
23
- break;
24
- }
25
- }
26
- return results;
27
- }
@@ -1,186 +0,0 @@
1
- import { closeSync, existsSync, openSync, readSync, statSync, } from "node:fs";
2
- function object(value) {
3
- return (value &&
4
- typeof value ===
5
- "object" &&
6
- !Array.isArray(value))
7
- ? value
8
- : {};
9
- }
10
- function timestamp(row) {
11
- const raw = row.timestamp;
12
- if (typeof raw ===
13
- "string") {
14
- const date = new Date(raw);
15
- if (!Number.isNaN(date.getTime())) {
16
- return date.toISOString();
17
- }
18
- }
19
- return new Date()
20
- .toISOString();
21
- }
22
- function classify(row) {
23
- const outerType = typeof row.type ===
24
- "string"
25
- ? row.type
26
- .toLowerCase()
27
- : "";
28
- const payload = object(row.payload);
29
- const payloadType = typeof payload.type ===
30
- "string"
31
- ? payload.type
32
- .toLowerCase()
33
- : "";
34
- const role = typeof payload.role ===
35
- "string"
36
- ? payload.role
37
- .toLowerCase()
38
- : undefined;
39
- if (outerType ===
40
- "session_meta") {
41
- return {
42
- type: "custom",
43
- };
44
- }
45
- if (role ===
46
- "user" ||
47
- payloadType ===
48
- "user_message") {
49
- return {
50
- type: "user_prompt",
51
- role: "user",
52
- };
53
- }
54
- if (role ===
55
- "assistant" ||
56
- payloadType ===
57
- "agent_message" ||
58
- payloadType ===
59
- "assistant_message") {
60
- return {
61
- type: "assistant_message",
62
- role: "assistant",
63
- };
64
- }
65
- if (payloadType.includes("function_call") ||
66
- payloadType.includes("tool_call") ||
67
- payloadType.includes("exec_command_begin") ||
68
- payloadType.includes("exec_command_start")) {
69
- return {
70
- type: "tool_call",
71
- };
72
- }
73
- if (payloadType.includes("function_call_output") ||
74
- payloadType.includes("tool_result") ||
75
- payloadType.includes("exec_command_end") ||
76
- payloadType.includes("exec_command_complete")) {
77
- return {
78
- type: "tool_result",
79
- };
80
- }
81
- if (payloadType.includes("error")) {
82
- return {
83
- type: "error",
84
- };
85
- }
86
- if (outerType.includes("compacted") ||
87
- payloadType.includes("compacted")) {
88
- return {
89
- type: "session_compact",
90
- };
91
- }
92
- return {
93
- type: "custom",
94
- role,
95
- };
96
- }
97
- export function readCodexRollout(rolloutPath, offset = 0) {
98
- if (!existsSync(rolloutPath)) {
99
- return {
100
- events: [],
101
- nextOffset: offset,
102
- reset: false,
103
- };
104
- }
105
- const size = statSync(rolloutPath).size;
106
- const reset = offset >
107
- size;
108
- const start = reset
109
- ? 0
110
- : offset;
111
- if (start >= size) {
112
- return {
113
- events: [],
114
- nextOffset: size,
115
- reset,
116
- };
117
- }
118
- const length = size -
119
- start;
120
- const buffer = Buffer.alloc(length);
121
- const fd = openSync(rolloutPath, "r");
122
- try {
123
- readSync(fd, buffer, 0, length, start);
124
- }
125
- finally {
126
- closeSync(fd);
127
- }
128
- const text = buffer.toString("utf8");
129
- /*
130
- * Codex may still be appending.
131
- * Never consume half a JSONL line.
132
- */
133
- const lastNewline = text.lastIndexOf("\n");
134
- if (lastNewline <
135
- 0) {
136
- return {
137
- events: [],
138
- nextOffset: start,
139
- reset,
140
- };
141
- }
142
- const complete = text.slice(0, lastNewline +
143
- 1);
144
- let localOffset = 0;
145
- const events = [];
146
- for (const line of complete.split("\n")) {
147
- if (!line) {
148
- continue;
149
- }
150
- const lineBytes = Buffer.byteLength(line +
151
- "\n", "utf8");
152
- const absoluteOffset = start +
153
- localOffset;
154
- localOffset +=
155
- lineBytes;
156
- let parsed;
157
- try {
158
- parsed =
159
- JSON.parse(line);
160
- }
161
- catch {
162
- continue;
163
- }
164
- const row = object(parsed);
165
- const classification = classify(row);
166
- events.push({
167
- type: classification.type,
168
- timestamp: timestamp(row),
169
- role: classification.role,
170
- sourceEventId: `rollout:${absoluteOffset}`,
171
- sourceSequence: absoluteOffset,
172
- data: row,
173
- provenance: {
174
- source: "codex-rollout",
175
- sourcePath: rolloutPath,
176
- sourceOffset: absoluteOffset,
177
- },
178
- });
179
- }
180
- return {
181
- events,
182
- nextOffset: start +
183
- Buffer.byteLength(complete, "utf8"),
184
- reset,
185
- };
186
- }
@@ -1,239 +0,0 @@
1
- import { Sanitizer, } from "../security/sanitizer.js";
2
- import { createSessionIdentity, } from "./identity.js";
3
- import { RemoteSessionStore, } from "./store.js";
4
- import { SessionWal, } from "./wal.js";
5
- import { SessionMemoryLearner, } from "./learner/learner.js";
6
- import { WorkContinuityLearner, } from "../work-continuity/learner.js";
7
- import { SemanticWorkLearner, } from "../work-continuity/semantic-learner.js";
8
- import { SmartHandoffManager, } from "../work-continuity/handoff.js";
9
- export class SessionCore {
10
- identity;
11
- wal;
12
- remote;
13
- sanitizer = new Sanitizer();
14
- learner;
15
- continuity;
16
- semantic;
17
- handoff;
18
- title;
19
- metadata;
20
- constructor(options) {
21
- this.identity =
22
- createSessionIdentity(options.project, options.agent, options.nativeSessionId);
23
- this.title =
24
- options.title;
25
- this.metadata =
26
- (this.sanitizer
27
- .sanitizeValue(options.metadata ??
28
- {}));
29
- this.wal =
30
- new SessionWal(this.identity);
31
- this.remote =
32
- new RemoteSessionStore(options.storage, options.maxEventsPerChunk ??
33
- 100, options.maxChunkBytes ??
34
- 512 * 1024);
35
- this.learner =
36
- new SessionMemoryLearner({
37
- project: options.project,
38
- storage: options.storage,
39
- identity: this.identity,
40
- wal: this.wal,
41
- });
42
- this.continuity =
43
- new WorkContinuityLearner({
44
- project: options.project,
45
- storage: options.storage,
46
- identity: this.identity,
47
- wal: this.wal,
48
- });
49
- this.semantic =
50
- new SemanticWorkLearner({
51
- project: options.project,
52
- storage: options.storage,
53
- identity: this.identity,
54
- wal: this.wal,
55
- });
56
- this.handoff =
57
- new SmartHandoffManager({
58
- project: options.project,
59
- storage: options.storage,
60
- identity: this.identity,
61
- });
62
- }
63
- sanitizeEvent(event) {
64
- const provenance = event.provenance
65
- ? {
66
- ...event.provenance,
67
- metadata: this.sanitizer
68
- .sanitizeValue(event.provenance
69
- .metadata),
70
- }
71
- : undefined;
72
- return {
73
- ...event,
74
- data: this.sanitizer
75
- .sanitizeValue(event.data ??
76
- {}),
77
- provenance,
78
- };
79
- }
80
- start(data = {}) {
81
- const state = this.wal.loadState();
82
- return this.record({
83
- type: state.lastSequence ===
84
- 0
85
- ? "session_start"
86
- : "session_resume",
87
- data,
88
- provenance: {
89
- source: this.identity.agent,
90
- },
91
- });
92
- }
93
- record(event) {
94
- return this.wal.append([
95
- this.sanitizeEvent(event),
96
- ])[0];
97
- }
98
- recordMany(events) {
99
- return this.wal.append(events.map(event => this.sanitizeEvent(event)));
100
- }
101
- setSourceCursor(source, value) {
102
- this.wal
103
- .setSourceCursor(source, value);
104
- }
105
- async flush() {
106
- const pending = this.wal
107
- .readPending();
108
- const state = this.wal
109
- .loadState();
110
- const result = await this.remote.append(this.identity, pending.events, state.sourceCursors, {
111
- title: this.title,
112
- metadata: this.metadata,
113
- });
114
- if (pending.events.length >
115
- 0) {
116
- const last = pending.events[pending.events.length -
117
- 1];
118
- this.wal.markRemote(last.sequence, pending.endOffset);
119
- }
120
- /*
121
- * Long-term learning is deliberately downstream
122
- * of durable session persistence.
123
- *
124
- * A learner failure must NEVER destroy session capture.
125
- * Cursor is not advanced on learner failure,
126
- * so next flush retries.
127
- */
128
- if (process.env
129
- .TOOLNET_SESSION_LEARNING !==
130
- "0") {
131
- try {
132
- await this.learner
133
- .learnNew();
134
- }
135
- catch {
136
- // Retry automatically on a later flush.
137
- }
138
- }
139
- /*
140
- * Work continuity is a separate projection from
141
- * long-term memory.
142
- *
143
- * Failure here must never break session capture.
144
- */
145
- if (process.env
146
- .TOOLNET_WORK_CONTINUITY !==
147
- "0") {
148
- try {
149
- await this.continuity
150
- .learnNew();
151
- }
152
- catch {
153
- // Immutable session WAL allows retry later.
154
- }
155
- }
156
- /*
157
- * Semantic continuity learns meaning, rationale,
158
- * deliverables and completion criteria.
159
- *
160
- * It never invents missing rationale.
161
- */
162
- if (process.env
163
- .TOOLNET_SEMANTIC_CONTINUITY !==
164
- "0") {
165
- try {
166
- await this.semantic
167
- .learnNew();
168
- }
169
- catch {
170
- // Derived projection: session capture must continue.
171
- }
172
- }
173
- /*
174
- * Smart Handoff checkpoint.
175
- *
176
- * We checkpoint on every durable flush, not only graceful
177
- * session_end. This protects continuity when an agent hits
178
- * token limit, terminal disconnect, crash, or user stops
179
- * unexpectedly.
180
- *
181
- * Handoff IDs are state-digest based, so unchanged work
182
- * does not create endless duplicate snapshots.
183
- */
184
- if (process.env
185
- .TOOLNET_SMART_HANDOFF !==
186
- "0" &&
187
- pending.events.length >
188
- 0) {
189
- try {
190
- const lastEvent = pending.events[pending.events.length -
191
- 1];
192
- const explicitReason = [
193
- "session_idle",
194
- "session_end",
195
- "session_compact",
196
- ].includes(lastEvent.type)
197
- ? lastEvent.type
198
- : "checkpoint";
199
- await this.handoff
200
- .capture(explicitReason, lastEvent.sequence);
201
- }
202
- catch {
203
- /*
204
- * Handoff is a derived projection.
205
- * It must never break durable session capture.
206
- */
207
- }
208
- }
209
- return result;
210
- }
211
- async idle(data = {}) {
212
- this.record({
213
- type: "session_idle",
214
- data,
215
- provenance: {
216
- source: this.identity.agent,
217
- },
218
- });
219
- return this.flush();
220
- }
221
- async end(data = {}) {
222
- this.record({
223
- type: "session_end",
224
- data,
225
- provenance: {
226
- source: this.identity.agent,
227
- },
228
- });
229
- return this.flush();
230
- }
231
- status() {
232
- return this.wal
233
- .loadState();
234
- }
235
- recoverRemote() {
236
- return this.remote
237
- .recover(this.identity);
238
- }
239
- }
@@ -1,57 +0,0 @@
1
- import { join, } from "node:path";
2
- import { sha256, } from "./utils.js";
3
- function safeSegment(value, fallback) {
4
- const trimmed = value.trim();
5
- const readable = trimmed
6
- .replace(/\s+/g, "_")
7
- .replace(/[^A-Za-z0-9._-]/g, "_")
8
- .replace(/_+/g, "_")
9
- .replace(/^\.+|\.+$/g, "");
10
- const digest = sha256(trimmed).slice(0, 12);
11
- if (!readable ||
12
- readable === "." ||
13
- readable === "..") {
14
- return `${fallback}--${digest}`;
15
- }
16
- const limited = readable.slice(0, 100);
17
- /*
18
- * Preserve normal UUID/OpenCode IDs exactly.
19
- * Add hash only when sanitization changed the value.
20
- */
21
- if (limited ===
22
- trimmed &&
23
- trimmed.length <=
24
- 100) {
25
- return limited;
26
- }
27
- return `${limited.slice(0, 85)}--${digest}`;
28
- }
29
- export function createSessionIdentity(project, agent, nativeSessionId) {
30
- const cleanAgent = agent.trim();
31
- const cleanSessionId = nativeSessionId.trim();
32
- if (!cleanAgent) {
33
- throw new Error("Session agent is required");
34
- }
35
- if (!cleanSessionId) {
36
- throw new Error("Native session ID is required");
37
- }
38
- const agentFolder = safeSegment(cleanAgent
39
- .toLowerCase(), "agent");
40
- const sessionFolder = safeSegment(cleanSessionId, "session");
41
- return {
42
- projectId: project.id,
43
- projectName: project.name,
44
- projectRoot: project.rootPath,
45
- agent: cleanAgent,
46
- nativeSessionId: cleanSessionId,
47
- sessionKey: `${cleanAgent}:${cleanSessionId}`,
48
- remotePrefix: [
49
- "projects",
50
- project.id,
51
- "sessions",
52
- agentFolder,
53
- sessionFolder,
54
- ].join("/"),
55
- localDirectory: join(project.rootPath, ".toolnet", "sessions", agentFolder, sessionFolder),
56
- };
57
- }
@@ -1,9 +0,0 @@
1
- export * from "./types.js";
2
- export * from "./identity.js";
3
- export * from "./wal.js";
4
- export * from "./store.js";
5
- export * from "./core.js";
6
- export * from "./opencode/index.js";
7
- export * from "./agy/index.js";
8
- export * from "./codex/index.js";
9
- export * from "./learner/index.js";