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,138 +0,0 @@
1
- import { SessionCore, } from "../core.js";
2
- import { inspectCodexRollout, pathBelongsToProject, } from "./discovery.js";
3
- import { readCodexRollout, } from "./rollout.js";
4
- export async function syncCodexSession(options) {
5
- const threadId = options.threadId
6
- .trim();
7
- if (!threadId) {
8
- throw new Error("Codex thread ID is required");
9
- }
10
- const meta = inspectCodexRollout(options.rolloutPath);
11
- const cwd = options.cwd ??
12
- meta.cwd;
13
- if (cwd &&
14
- !pathBelongsToProject(options.project
15
- .rootPath, cwd)) {
16
- throw new Error(`Codex thread does not belong to project: ${cwd}`);
17
- }
18
- if (meta.threadId &&
19
- meta.threadId !==
20
- threadId) {
21
- throw new Error(`Codex rollout thread mismatch: expected ${threadId}, got ${meta.threadId}`);
22
- }
23
- const core = new SessionCore({
24
- project: options.project,
25
- storage: options.storage,
26
- agent: "codex",
27
- nativeSessionId: threadId,
28
- metadata: {
29
- source: "codex-rollout",
30
- rolloutPath: options.rolloutPath,
31
- cwd,
32
- client: options.client,
33
- },
34
- });
35
- const state = core.status();
36
- const previousPath = state.sourceCursors["codex.rollout.path"];
37
- let offset = Number(state.sourceCursors["codex.rollout.offset"] ??
38
- 0);
39
- /*
40
- * Future Codex may rotate a resumed thread into another rollout.
41
- */
42
- if (previousPath &&
43
- previousPath !==
44
- options.rolloutPath) {
45
- offset =
46
- 0;
47
- }
48
- if (!Number.isFinite(offset) ||
49
- offset < 0) {
50
- offset =
51
- 0;
52
- }
53
- const rollout = readCodexRollout(options.rolloutPath, offset);
54
- const events = [];
55
- if (state.lastSequence ===
56
- 0) {
57
- events.push({
58
- type: "session_start",
59
- sourceEventId: `codex:${threadId}:start`,
60
- data: {
61
- threadId,
62
- cwd,
63
- rolloutPath: options.rolloutPath,
64
- sessionMeta: meta.raw,
65
- },
66
- provenance: {
67
- source: "codex-rollout",
68
- sourcePath: options.rolloutPath,
69
- },
70
- });
71
- }
72
- if (previousPath &&
73
- previousPath !==
74
- options.rolloutPath) {
75
- events.push({
76
- type: "custom",
77
- sourceEventId: `codex:${threadId}:rollout-rotation:${options.rolloutPath}`,
78
- data: {
79
- event: "rollout_rotation",
80
- previousPath,
81
- rolloutPath: options.rolloutPath,
82
- },
83
- provenance: {
84
- source: "codex-rollout",
85
- },
86
- });
87
- }
88
- if (rollout.reset) {
89
- events.push({
90
- type: "custom",
91
- sourceEventId: `codex:${threadId}:rollout-reset:${rollout.nextOffset}`,
92
- data: {
93
- event: "rollout_reset",
94
- },
95
- provenance: {
96
- source: "codex-rollout",
97
- sourcePath: options.rolloutPath,
98
- },
99
- });
100
- }
101
- events.push(...rollout.events);
102
- /*
103
- * AfterAgent/agent-turn-complete means this TURN is done.
104
- * The Codex thread may be resumed later.
105
- */
106
- if (options.idle &&
107
- options.turnId) {
108
- events.push({
109
- type: "session_idle",
110
- sourceEventId: `codex:${threadId}:turn:${options.turnId}:idle`,
111
- data: {
112
- turnId: options.turnId,
113
- client: options.client,
114
- },
115
- provenance: {
116
- source: "codex-notify",
117
- },
118
- });
119
- }
120
- const recorded = core.recordMany(events);
121
- core.setSourceCursor("codex.rollout.path", options.rolloutPath);
122
- core.setSourceCursor("codex.rollout.offset", rollout.nextOffset);
123
- if (options.turnId) {
124
- core.setSourceCursor("codex.last.turn", options.turnId);
125
- }
126
- const flushed = await core.flush();
127
- return {
128
- threadId,
129
- imported: recorded.length,
130
- rolloutEvents: rollout.events
131
- .length,
132
- eventCount: flushed.eventCount,
133
- chunkCount: flushed.chunkCount,
134
- status: flushed.status,
135
- rolloutOffset: rollout.nextOffset,
136
- reset: rollout.reset,
137
- };
138
- }
@@ -1,236 +0,0 @@
1
- import { existsSync, readFileSync, } from "node:fs";
2
- import { spawn, } from "node:child_process";
3
- import { homedir, } from "node:os";
4
- import { join, } from "node:path";
5
- import { loadConfig, ProjectManager, } from "../../core/index.js";
6
- import { createStorageProvider, ProjectScopedStorageProvider, withStorageRetry, } from "../../storage/index.js";
7
- import { syncCodexSession, } from "./adapter.js";
8
- import { findCodexRollout, } from "./discovery.js";
9
- import { findCodexToolNetProject, } from "./project-resolver.js";
10
- import { recoverCodexProject, } from "./recovery.js";
11
- import { installCodexNotify, } from "./notify-installer.js";
12
- import { installCodexContextHook, } from "./context-hook-installer.js";
13
- import { refreshStartupBriefCache, } from "../../work-continuity/brief-cache.js";
14
- function after(args, flag) {
15
- const index = args.indexOf(flag);
16
- return index >=
17
- 0
18
- ? args[index +
19
- 1]
20
- : undefined;
21
- }
22
- function storageFor(project) {
23
- const config = loadConfig();
24
- const raw = withStorageRetry(createStorageProvider({
25
- provider: config.storage
26
- .provider,
27
- huggingface: config.storage
28
- .huggingface,
29
- localRoot: config.storage
30
- .localRoot,
31
- }), {
32
- attempts: 3,
33
- });
34
- return new ProjectScopedStorageProvider(raw, project.id, project.name, project.remote ??
35
- project.name);
36
- }
37
- async function waitForRollout(threadId) {
38
- for (let attempt = 0; attempt <
39
- 10; attempt +=
40
- 1) {
41
- const file = findCodexRollout(threadId);
42
- if (file) {
43
- return file;
44
- }
45
- await new Promise(resolve => setTimeout(resolve, 150));
46
- }
47
- return null;
48
- }
49
- function runPreviousNotify(rawPayload) {
50
- const previousFile = join(homedir(), ".config", "toolnet-memory", "codex-notify-previous.json");
51
- if (!existsSync(previousFile)) {
52
- return;
53
- }
54
- try {
55
- const argv = JSON.parse(readFileSync(previousFile, "utf8"));
56
- if (!Array.isArray(argv) ||
57
- argv.length ===
58
- 0 ||
59
- !argv.every(item => typeof item ===
60
- "string")) {
61
- return;
62
- }
63
- const child = spawn(argv[0], [
64
- ...argv.slice(1),
65
- rawPayload,
66
- ], {
67
- detached: true,
68
- stdio: "ignore",
69
- });
70
- child.unref();
71
- }
72
- catch {
73
- // Existing notifier must never break Codex.
74
- }
75
- }
76
- async function notify(raw) {
77
- let payload;
78
- try {
79
- payload =
80
- JSON.parse(raw);
81
- }
82
- catch {
83
- return;
84
- }
85
- const type = payload.type;
86
- if (type !==
87
- "agent-turn-complete") {
88
- return;
89
- }
90
- const threadId = typeof payload["thread-id"] ===
91
- "string"
92
- ? payload["thread-id"]
93
- : "";
94
- const turnId = typeof payload["turn-id"] ===
95
- "string"
96
- ? payload["turn-id"]
97
- : "";
98
- const cwd = typeof payload.cwd ===
99
- "string"
100
- ? payload.cwd
101
- : "";
102
- const client = typeof payload.client ===
103
- "string"
104
- ? payload.client
105
- : undefined;
106
- if (!threadId ||
107
- !cwd) {
108
- return;
109
- }
110
- const project = findCodexToolNetProject(cwd);
111
- /*
112
- * Global Codex notify:
113
- * ignore non-ToolNet projects.
114
- */
115
- if (!project) {
116
- return;
117
- }
118
- const rolloutPath = await waitForRollout(threadId);
119
- if (!rolloutPath) {
120
- /*
121
- * Recovery command will backfill later.
122
- */
123
- return;
124
- }
125
- const storage = storageFor(project);
126
- await syncCodexSession({
127
- project,
128
- storage,
129
- threadId,
130
- rolloutPath,
131
- cwd,
132
- turnId,
133
- client,
134
- idle: true,
135
- });
136
- try {
137
- await refreshStartupBriefCache(project, storage, 900);
138
- }
139
- catch {
140
- // Derived cache must never break Codex notify.
141
- }
142
- }
143
- async function main() {
144
- const [command = "help", ...args] = process.argv.slice(2);
145
- if (command ===
146
- "install-notify") {
147
- const binary = after(args, "--bin");
148
- const result = installCodexNotify({
149
- binary,
150
- });
151
- const contextHooks = installCodexContextHook({
152
- binary,
153
- });
154
- console.log(`✅ Codex notify installed: ${result.configFile}`);
155
- if (result
156
- .preservedPrevious) {
157
- console.log(`✅ Previous notify preserved: ${result.previousFile}`);
158
- }
159
- console.log(`✅ Codex SessionStart context hook: ${contextHooks}`);
160
- return;
161
- }
162
- if (command ===
163
- "notify") {
164
- const raw = args[args.length -
165
- 1] ??
166
- "";
167
- try {
168
- await notify(raw);
169
- }
170
- finally {
171
- runPreviousNotify(raw);
172
- }
173
- return;
174
- }
175
- const projectPath = after(args, "--project") ??
176
- process.cwd();
177
- const project = new ProjectManager()
178
- .detect(projectPath);
179
- const storage = storageFor(project);
180
- if (command ===
181
- "sync") {
182
- const threadId = args[0];
183
- if (!threadId) {
184
- throw new Error("Usage: sync <thread-id>");
185
- }
186
- const rolloutPath = after(args, "--rollout") ??
187
- findCodexRollout(threadId);
188
- if (!rolloutPath) {
189
- throw new Error(`Codex rollout not found for ${threadId}`);
190
- }
191
- const result = await syncCodexSession({
192
- project,
193
- storage,
194
- threadId,
195
- rolloutPath,
196
- idle: args.includes("--idle"),
197
- });
198
- console.log(JSON.stringify(result, null, 2));
199
- return;
200
- }
201
- if (command ===
202
- "recover") {
203
- const rawLimit = Number(after(args, "--limit") ??
204
- 100);
205
- const results = await recoverCodexProject(project, storage, Number.isFinite(rawLimit)
206
- ? rawLimit
207
- : 100);
208
- console.log(JSON.stringify({
209
- project: project.name,
210
- sessions: results.length,
211
- imported: results.reduce((total, item) => total +
212
- item.imported, 0),
213
- }, null, 2));
214
- return;
215
- }
216
- console.log(`Codex Session Adapter
217
-
218
- Commands:
219
- install-notify
220
- sync <thread-id> [--project PATH]
221
- recover [--project PATH] [--limit N]
222
- `);
223
- }
224
- main().catch(error => {
225
- /*
226
- * notify must never make Codex fail.
227
- */
228
- if (process.argv[2] ===
229
- "notify") {
230
- process.exit(0);
231
- }
232
- console.error(error instanceof Error
233
- ? error.message
234
- : error);
235
- process.exit(1);
236
- });
@@ -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";