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,70 +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 quote(value) {
5
- return `'${value.replace(/'/g, `'\\''`)}'`;
6
- }
7
- export function installCodexContextHook(options = {}) {
8
- const hooksFile = options.hooksFile ??
9
- join(process.env.CODEX_HOME ??
10
- join(homedir(), ".codex"), "hooks.json");
11
- mkdirSync(dirname(hooksFile), {
12
- recursive: true,
13
- });
14
- let root = {};
15
- if (existsSync(hooksFile)) {
16
- try {
17
- root =
18
- JSON.parse(readFileSync(hooksFile, "utf8"));
19
- }
20
- catch (error) {
21
- throw new Error(`Invalid existing Codex hooks.json: ${error instanceof Error
22
- ? error.message
23
- : String(error)}`);
24
- }
25
- }
26
- const hooks = root.hooks &&
27
- typeof root.hooks ===
28
- "object" &&
29
- !Array.isArray(root.hooks)
30
- ? root.hooks
31
- : {};
32
- root.hooks =
33
- hooks;
34
- const current = Array.isArray(hooks.SessionStart)
35
- ? hooks.SessionStart
36
- : [];
37
- /*
38
- * Remove only ToolNet's previous SessionStart entry.
39
- * Every unrelated Codex hook is preserved.
40
- */
41
- const cleaned = current.filter(item => {
42
- try {
43
- return !JSON.stringify(item).includes("session:codex-context");
44
- }
45
- catch {
46
- return true;
47
- }
48
- });
49
- const binary = options.binary ??
50
- "toolnet-memory";
51
- cleaned.push({
52
- matcher: "startup|resume|clear|compact",
53
- hooks: [
54
- {
55
- type: "command",
56
- command: `${quote(binary)} session:codex-context`,
57
- timeout: 15,
58
- additionalContextLimit: 1000,
59
- statusMessage: "Loading ToolNet project continuity",
60
- },
61
- ],
62
- });
63
- hooks.SessionStart =
64
- cleaned;
65
- writeFileSync(hooksFile, JSON.stringify(root, null, 2) + "\n", {
66
- encoding: "utf8",
67
- mode: 0o600,
68
- });
69
- return hooksFile;
70
- }
@@ -1,69 +0,0 @@
1
- import { loadConfig, } from "../../core/index.js";
2
- import { createStorageProvider, ProjectScopedStorageProvider, withStorageRetry, } from "../../storage/index.js";
3
- import { buildCodexSessionStartOutput, } from "../../work-continuity/index.js";
4
- import { findCodexToolNetProject, } from "./project-resolver.js";
5
- async function readInput() {
6
- let raw = "";
7
- for await (const chunk of process.stdin) {
8
- raw +=
9
- chunk.toString();
10
- }
11
- if (!raw.trim()) {
12
- return {};
13
- }
14
- try {
15
- return JSON.parse(raw);
16
- }
17
- catch {
18
- return {};
19
- }
20
- }
21
- async function main() {
22
- const input = await readInput();
23
- if (input.hook_event_name !==
24
- "SessionStart") {
25
- process.stdout.write("{}");
26
- return;
27
- }
28
- const cwd = typeof input.cwd ===
29
- "string"
30
- ? input.cwd
31
- : "";
32
- if (!cwd) {
33
- process.stdout.write("{}");
34
- return;
35
- }
36
- const project = findCodexToolNetProject(cwd);
37
- if (!project) {
38
- process.stdout.write("{}");
39
- return;
40
- }
41
- try {
42
- const config = loadConfig();
43
- const raw = withStorageRetry(createStorageProvider({
44
- provider: config.storage
45
- .provider,
46
- huggingface: config.storage
47
- .huggingface,
48
- localRoot: config.storage
49
- .localRoot,
50
- }), {
51
- attempts: 2,
52
- });
53
- const storage = new ProjectScopedStorageProvider(raw, project.id, project.name, project.remote ??
54
- project.name);
55
- const output = await buildCodexSessionStartOutput({
56
- project,
57
- storage,
58
- });
59
- process.stdout.write(JSON.stringify(output));
60
- }
61
- catch {
62
- process.stdout.write("{}");
63
- }
64
- }
65
- main().catch(() => {
66
- process.stdout.write("{}");
67
- process.exitCode =
68
- 0;
69
- });
@@ -1,138 +0,0 @@
1
- import { existsSync, readFileSync, readdirSync, statSync, } from "node:fs";
2
- import { homedir, } from "node:os";
3
- import { join, resolve, } from "node:path";
4
- function object(value) {
5
- return (value &&
6
- typeof value ===
7
- "object" &&
8
- !Array.isArray(value))
9
- ? value
10
- : {};
11
- }
12
- export function codexHome() {
13
- return (process.env
14
- .CODEX_HOME ??
15
- join(homedir(), ".codex"));
16
- }
17
- export function inspectCodexRollout(file) {
18
- let content = "";
19
- try {
20
- const fd = readFileSync(file, "utf8");
21
- content =
22
- fd.slice(0, 128 * 1024);
23
- }
24
- catch {
25
- return {
26
- raw: {},
27
- };
28
- }
29
- for (const line of content.split("\n")) {
30
- if (!line) {
31
- continue;
32
- }
33
- try {
34
- const row = object(JSON.parse(line));
35
- if (row.type !==
36
- "session_meta") {
37
- continue;
38
- }
39
- const payload = object(row.payload);
40
- const threadId = [
41
- payload.id,
42
- payload.thread_id,
43
- payload.threadId,
44
- payload.session_id,
45
- payload.sessionId,
46
- ].find(item => typeof item ===
47
- "string");
48
- const cwd = typeof payload.cwd ===
49
- "string"
50
- ? payload.cwd
51
- : undefined;
52
- return {
53
- threadId,
54
- cwd,
55
- raw: payload,
56
- };
57
- }
58
- catch {
59
- // continue
60
- }
61
- }
62
- return {
63
- raw: {},
64
- };
65
- }
66
- function walk(directory, output) {
67
- if (!existsSync(directory)) {
68
- return;
69
- }
70
- let entries;
71
- try {
72
- entries =
73
- readdirSync(directory, {
74
- withFileTypes: true,
75
- });
76
- }
77
- catch {
78
- return;
79
- }
80
- for (const entry of entries) {
81
- const path = join(directory, entry.name);
82
- if (entry.isDirectory()) {
83
- walk(path, output);
84
- continue;
85
- }
86
- if (entry.isFile() &&
87
- entry.name.endsWith(".jsonl")) {
88
- output.push(path);
89
- }
90
- }
91
- }
92
- export function listCodexRollouts() {
93
- const home = codexHome();
94
- const files = [];
95
- walk(join(home, "sessions"), files);
96
- walk(join(home, "archived_sessions"), files);
97
- return files.sort((left, right) => {
98
- try {
99
- return (statSync(right).mtimeMs -
100
- statSync(left).mtimeMs);
101
- }
102
- catch {
103
- return 0;
104
- }
105
- });
106
- }
107
- export function findCodexRollout(threadId) {
108
- const files = listCodexRollouts();
109
- /*
110
- * Official rollout filenames contain the UUID.
111
- * Cheap path first.
112
- */
113
- const direct = files.find(file => file.includes(threadId));
114
- if (direct) {
115
- return direct;
116
- }
117
- /*
118
- * Fallback for future filename layouts:
119
- * read session_meta.
120
- */
121
- for (const file of files) {
122
- const meta = inspectCodexRollout(file);
123
- if (meta.threadId ===
124
- threadId) {
125
- return file;
126
- }
127
- }
128
- return null;
129
- }
130
- export function pathBelongsToProject(projectRoot, cwd) {
131
- const root = resolve(projectRoot);
132
- const candidate = resolve(cwd);
133
- return (candidate === root ||
134
- candidate.startsWith(root +
135
- "/") ||
136
- root.startsWith(candidate +
137
- "/"));
138
- }
@@ -1,6 +0,0 @@
1
- export * from "./rollout.js";
2
- export * from "./discovery.js";
3
- export * from "./adapter.js";
4
- export * from "./project-resolver.js";
5
- export * from "./recovery.js";
6
- export * from "./notify-installer.js";
@@ -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
- }