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,112 +0,0 @@
1
- import { existsSync, } from "node:fs";
2
- import { homedir, } from "node:os";
3
- import { join, resolve, } from "node:path";
4
- import { DatabaseSync, } from "node:sqlite";
5
- import { defaultAgyTranscript, syncAgySession, } from "./adapter.js";
6
- function uriToPath(value) {
7
- if (value.startsWith("file://")) {
8
- try {
9
- return decodeURIComponent(new URL(value).pathname);
10
- }
11
- catch {
12
- return value;
13
- }
14
- }
15
- return value;
16
- }
17
- function workspaceList(value) {
18
- if (typeof value !==
19
- "string" ||
20
- !value) {
21
- return [];
22
- }
23
- try {
24
- const parsed = JSON.parse(value);
25
- if (Array.isArray(parsed)) {
26
- return parsed
27
- .filter(item => typeof item ===
28
- "string")
29
- .map(uriToPath);
30
- }
31
- }
32
- catch {
33
- // continue
34
- }
35
- return [
36
- uriToPath(value),
37
- ];
38
- }
39
- function belongs(project, workspaces) {
40
- const root = resolve(project.rootPath);
41
- return workspaces.some(workspace => {
42
- const path = resolve(workspace);
43
- return (path === root ||
44
- path.startsWith(root +
45
- "/") ||
46
- root.startsWith(path +
47
- "/"));
48
- });
49
- }
50
- export async function recoverAgyProject(project, storage, limit = 100) {
51
- const summaryDb = process.env
52
- .AGY_SUMMARY_DB ??
53
- join(homedir(), ".gemini", "antigravity-cli", "conversation_summaries.db");
54
- if (!existsSync(summaryDb)) {
55
- throw new Error(`Agy summary database not found: ${summaryDb}`);
56
- }
57
- const db = new DatabaseSync(summaryDb, {
58
- readOnly: true,
59
- });
60
- db.exec("PRAGMA query_only = ON");
61
- const rows = db.prepare(`
62
- SELECT
63
- conversation_id,
64
- title,
65
- workspace_uris,
66
- agent_name,
67
- last_user_input_time
68
- FROM conversation_summaries
69
- ORDER BY
70
- last_user_input_time DESC
71
- `).all();
72
- db.close();
73
- const results = [];
74
- for (const row of rows) {
75
- const id = typeof row
76
- .conversation_id ===
77
- "string"
78
- ? row
79
- .conversation_id
80
- : "";
81
- if (!id) {
82
- continue;
83
- }
84
- const workspaces = workspaceList(row.workspace_uris);
85
- if (!belongs(project, workspaces)) {
86
- continue;
87
- }
88
- const transcriptPath = defaultAgyTranscript(id);
89
- if (!existsSync(transcriptPath)) {
90
- continue;
91
- }
92
- results.push(await syncAgySession({
93
- project,
94
- storage,
95
- conversationId: id,
96
- transcriptPath,
97
- workspacePaths: workspaces,
98
- modelName: typeof row
99
- .agent_name ===
100
- "string"
101
- ? row
102
- .agent_name
103
- : undefined,
104
- phase: "recover",
105
- }));
106
- if (results.length >=
107
- limit) {
108
- break;
109
- }
110
- }
111
- return results;
112
- }
@@ -1,191 +0,0 @@
1
- import { existsSync, openSync, closeSync, readSync, statSync, } from "node:fs";
2
- function classify(value) {
3
- const role = typeof value.role ===
4
- "string"
5
- ? value.role
6
- : "";
7
- const type = typeof value.type ===
8
- "string"
9
- ? value.type
10
- .toLowerCase()
11
- : "";
12
- if (role === "user" ||
13
- type.includes("user")) {
14
- return "user_prompt";
15
- }
16
- if (role ===
17
- "assistant" ||
18
- type.includes("assistant") ||
19
- type.includes("model")) {
20
- return "assistant_message";
21
- }
22
- if (type.includes("tool") ||
23
- "toolCall" in
24
- value ||
25
- "tool_call" in
26
- value) {
27
- return "tool_call";
28
- }
29
- if (type.includes("error")) {
30
- return "error";
31
- }
32
- return "message";
33
- }
34
- function timestampOf(value) {
35
- const candidates = [
36
- value.timestamp,
37
- value.createdAt,
38
- value.time,
39
- value.created_at,
40
- ];
41
- for (const candidate of candidates) {
42
- if (typeof candidate ===
43
- "string") {
44
- const date = new Date(candidate);
45
- if (!Number.isNaN(date.getTime())) {
46
- return date.toISOString();
47
- }
48
- }
49
- if (typeof candidate ===
50
- "number") {
51
- let time = candidate;
52
- if (time <
53
- 100_000_000_000) {
54
- time *= 1000;
55
- }
56
- const date = new Date(time);
57
- if (!Number.isNaN(date.getTime())) {
58
- return date.toISOString();
59
- }
60
- }
61
- }
62
- return new Date()
63
- .toISOString();
64
- }
65
- export function readAgyTranscript(transcriptPath, cursor = {
66
- offset: 0,
67
- }) {
68
- if (!existsSync(transcriptPath)) {
69
- return {
70
- events: [],
71
- nextOffset: cursor.offset,
72
- reset: false,
73
- };
74
- }
75
- const size = statSync(transcriptPath).size;
76
- /*
77
- * Transcript was truncated/rewritten.
78
- * Start a new source epoch.
79
- */
80
- const reset = cursor.offset >
81
- size;
82
- const start = reset
83
- ? 0
84
- : cursor.offset;
85
- if (start === size) {
86
- return {
87
- events: [],
88
- nextOffset: size,
89
- reset,
90
- };
91
- }
92
- const length = size -
93
- start;
94
- const buffer = Buffer.alloc(length);
95
- const fd = openSync(transcriptPath, "r");
96
- try {
97
- readSync(fd, buffer, 0, length, start);
98
- }
99
- finally {
100
- closeSync(fd);
101
- }
102
- const text = buffer.toString("utf8");
103
- /*
104
- * Do not consume an incomplete final line while Agy
105
- * is still appending to transcript.jsonl.
106
- */
107
- const lastNewline = text.lastIndexOf("\n");
108
- if (lastNewline <
109
- 0) {
110
- return {
111
- events: [],
112
- nextOffset: start,
113
- reset,
114
- };
115
- }
116
- const complete = text.slice(0, lastNewline +
117
- 1);
118
- const consumedBytes = Buffer.byteLength(complete, "utf8");
119
- const events = [];
120
- let relativeOffset = 0;
121
- for (const rawLine of complete
122
- .split("\n")) {
123
- if (!rawLine) {
124
- continue;
125
- }
126
- const lineBytes = Buffer.byteLength(rawLine +
127
- "\n", "utf8");
128
- const absoluteOffset = start +
129
- relativeOffset;
130
- relativeOffset +=
131
- lineBytes;
132
- let parsed;
133
- try {
134
- parsed =
135
- JSON.parse(rawLine);
136
- }
137
- catch {
138
- /*
139
- * Preserve malformed but readable trajectory lines.
140
- */
141
- events.push({
142
- type: "custom",
143
- sourceEventId: `transcript:${absoluteOffset}`,
144
- sourceSequence: absoluteOffset,
145
- data: {
146
- format: "raw-line",
147
- content: rawLine,
148
- },
149
- provenance: {
150
- source: "agy-transcript",
151
- sourcePath: transcriptPath,
152
- sourceOffset: absoluteOffset,
153
- },
154
- });
155
- continue;
156
- }
157
- const data = parsed &&
158
- typeof parsed ===
159
- "object" &&
160
- !Array.isArray(parsed)
161
- ? parsed
162
- : {
163
- value: parsed,
164
- };
165
- events.push({
166
- type: classify(data),
167
- timestamp: timestampOf(data),
168
- role: typeof data.role ===
169
- "string"
170
- ? data.role
171
- : undefined,
172
- /*
173
- * Offset + original payload gives stable provenance.
174
- */
175
- sourceEventId: `transcript:${absoluteOffset}`,
176
- sourceSequence: absoluteOffset,
177
- data,
178
- provenance: {
179
- source: "agy-transcript",
180
- sourcePath: transcriptPath,
181
- sourceOffset: absoluteOffset,
182
- },
183
- });
184
- }
185
- return {
186
- events,
187
- nextOffset: start +
188
- consumedBytes,
189
- reset,
190
- };
191
- }
@@ -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
- });