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,88 +0,0 @@
1
- import { existsSync, } from "node:fs";
2
- import { dirname, join, resolve, } from "node:path";
3
- import { loadConfig, ProjectManager, } from "../core/index.js";
4
- import { createStorageProvider, ProjectScopedStorageProvider, withStorageRetry, } from "../storage/index.js";
5
- import { getStartupBriefForInjection, refreshStartupBriefCache, } from "./brief-cache.js";
6
- function after(args, flag) {
7
- const index = args.indexOf(flag);
8
- return index >=
9
- 0
10
- ? args[index + 1]
11
- : undefined;
12
- }
13
- function existingProjectRoot(start) {
14
- let current = resolve(start);
15
- while (true) {
16
- if (existsSync(join(current, ".toolnet", "project.json"))) {
17
- return current;
18
- }
19
- const parent = dirname(current);
20
- if (parent ===
21
- current) {
22
- return null;
23
- }
24
- current =
25
- parent;
26
- }
27
- }
28
- function storageFor(project) {
29
- const config = loadConfig();
30
- const raw = withStorageRetry(createStorageProvider({
31
- provider: config.storage
32
- .provider,
33
- huggingface: config.storage
34
- .huggingface,
35
- localRoot: config.storage
36
- .localRoot,
37
- }), {
38
- attempts: 2,
39
- });
40
- return new ProjectScopedStorageProvider(raw, project.id, project.name, project.remote ??
41
- project.name);
42
- }
43
- async function main() {
44
- const [command = "print", ...args] = process.argv.slice(2);
45
- const requested = after(args, "--project") ??
46
- process.cwd();
47
- const root = existingProjectRoot(requested);
48
- /*
49
- * Global agent integrations must silently ignore
50
- * projects which are not managed by ToolNet.
51
- */
52
- if (!root) {
53
- return;
54
- }
55
- const project = new ProjectManager()
56
- .detect(root);
57
- const storage = storageFor(project);
58
- const tokens = Number(after(args, "--tokens") ??
59
- 900);
60
- if (command ===
61
- "refresh") {
62
- const cache = await refreshStartupBriefCache(project, storage, Number.isFinite(tokens)
63
- ? tokens
64
- : 900);
65
- console.log(cache.text);
66
- return;
67
- }
68
- const cache = await getStartupBriefForInjection(project, storage, Number.isFinite(tokens)
69
- ? tokens
70
- : 900);
71
- if (!cache) {
72
- return;
73
- }
74
- if (command ===
75
- "sync") {
76
- console.log(cache.digest);
77
- return;
78
- }
79
- process.stdout.write(cache.text +
80
- "\n");
81
- }
82
- main().catch(() => {
83
- /*
84
- * Context integration must never break an agent.
85
- */
86
- process.exitCode =
87
- 0;
88
- });
@@ -1,339 +0,0 @@
1
- import { sha256, } from "../session/utils.js";
2
- const TEXT_KEYS = new Set([
3
- "content",
4
- "text",
5
- "message",
6
- "prompt",
7
- "summary",
8
- "description",
9
- "title",
10
- "reason",
11
- "last_assistant_message",
12
- "lastAssistantMessage",
13
- ]);
14
- function normalize(value) {
15
- return value
16
- .normalize("NFKC")
17
- .replace(/\s+/g, " ")
18
- .replace(/^[\s>*#•-]+/u, "")
19
- .trim();
20
- }
21
- function keyOf(value) {
22
- return normalize(value)
23
- .toLowerCase()
24
- .replace(/[^\p{L}\p{N}]+/gu, " ")
25
- .replace(/\s+/g, " ")
26
- .trim();
27
- }
28
- function collectStrings(value, output, depth = 0) {
29
- if (depth > 6) {
30
- return;
31
- }
32
- if (typeof value === "string") {
33
- output.push(value);
34
- return;
35
- }
36
- if (Array.isArray(value)) {
37
- for (const item of value.slice(0, 50)) {
38
- collectStrings(item, output, depth + 1);
39
- }
40
- return;
41
- }
42
- if (!value ||
43
- typeof value !== "object") {
44
- return;
45
- }
46
- for (const [key, child] of Object.entries(value)) {
47
- if (TEXT_KEYS.has(key) ||
48
- [
49
- "data",
50
- "payload",
51
- "parts",
52
- "messages",
53
- ].includes(key)) {
54
- collectStrings(child, output, depth + 1);
55
- }
56
- }
57
- }
58
- function statusFrom(text) {
59
- if (/\b(cancelled|canceled)\b|đã hủy|bỏ qua/iu
60
- .test(text)) {
61
- return "cancelled";
62
- }
63
- if (/\b(blocked|blocker)\b|đang vướng|bị vướng|đang kẹt|chưa thể/iu
64
- .test(text)) {
65
- return "blocked";
66
- }
67
- if (/\b(completed|complete|done|finished|passed)\b|hoàn thành|hoàn tất|đã xong|đã làm xong|\bxong\b/iu
68
- .test(text)) {
69
- return "completed";
70
- }
71
- if (/\bin[\s_-]*progress\b|working on|đang làm|đang thực hiện|đang xử lý|đang triển khai/iu
72
- .test(text)) {
73
- return "in_progress";
74
- }
75
- return "pending";
76
- }
77
- function isStatusOnly(value) {
78
- const text = normalize(value);
79
- return /^(?:đang\s+làm|đang\s+thực\s+hiện|đang\s+xử\s+lý|đang\s+triển\s+khai|hoàn\s+thành|hoàn\s+tất|đã\s+xong|đã\s+làm\s+xong|xong|pending|in[\s_-]*progress|completed|complete|done|finished|blocked|cancelled|canceled)[.!]*$/iu
80
- .test(text);
81
- }
82
- function makeObservation(identity, event, kind, text, options = {}) {
83
- const clean = normalize(text);
84
- const key = options.key ??
85
- keyOf(clean);
86
- /*
87
- * One agent message can contain both:
88
- *
89
- * Phase 1 - Setup
90
- * Phase 1 hoàn thành
91
- *
92
- * They share event.id + phase key but represent DIFFERENT
93
- * observations/state transitions.
94
- *
95
- * Include normalized content + status/order so only truly
96
- * identical observations inside the same event are deduped.
97
- */
98
- const id = sha256([
99
- identity.projectId,
100
- kind,
101
- key,
102
- event.id,
103
- clean,
104
- options.status ?? "",
105
- options.order ?? "",
106
- ].join("|")).slice(0, 32);
107
- return {
108
- version: 1,
109
- id,
110
- projectId: identity.projectId,
111
- kind,
112
- key,
113
- text: clean,
114
- status: options.status,
115
- order: options.order,
116
- confidence: options.confidence ??
117
- 0.85,
118
- occurredAt: event.timestamp,
119
- sequence: event.sequence,
120
- agent: identity.agent,
121
- nativeSessionId: identity.nativeSessionId,
122
- sessionKey: identity.sessionKey,
123
- eventId: event.id,
124
- sourceEventId: event.sourceEventId,
125
- };
126
- }
127
- function extractFromLine(identity, event, rawLine) {
128
- const line = normalize(rawLine);
129
- if (line.length < 5 ||
130
- line.length > 1200) {
131
- return [];
132
- }
133
- const result = [];
134
- /*
135
- * A next-action sentence may REFER to phases without
136
- * changing their current state.
137
- *
138
- * Example:
139
- * "Bước tiếp theo: hoàn tất Phase 3 rồi chuyển Phase 4"
140
- *
141
- * This means:
142
- * Phase 3 is still current/in-progress
143
- * Phase 4 is upcoming
144
- *
145
- * It must NOT be interpreted as "Phase 3 completed".
146
- */
147
- const isNextActionLine = /^(?:next|next action|next step|tiếp theo|bước tiếp theo|cần làm tiếp)\b/iu
148
- .test(line);
149
- const goal = line.match(/^(?:mục tiêu|goal|objective)\s*(?::|-)\s*(.+)$/iu);
150
- if (goal?.[1]) {
151
- result.push(makeObservation(identity, event, "goal", goal[1], {
152
- confidence: 0.97,
153
- }));
154
- }
155
- const plan = line.match(/^(?:kế hoạch|plan)\s*(?::|-)\s*(.+)$/iu);
156
- if (plan?.[1]) {
157
- result.push(makeObservation(identity, event, "plan", plan[1], {
158
- confidence: 0.95,
159
- }));
160
- }
161
- /*
162
- * Stable Phase identity.
163
- *
164
- * Phase 2 - Work Continuity
165
- * Phase 2 đang làm
166
- * Phase 2 hoàn thành
167
- *
168
- * => all become phase:2
169
- */
170
- const phasePattern = /\b(?:phase|giai đoạn|giai doan|stage)\s*(\d+)\s*(?:[:\-–—]\s*)?([^.;\n]{0,220})/giu;
171
- let phaseMatch;
172
- /*
173
- * Only explicit phase declarations/status lines mutate
174
- * WorkState. References inside "next action" are advisory.
175
- */
176
- while (!isNextActionLine &&
177
- (phaseMatch =
178
- phasePattern.exec(line))) {
179
- const number = Number(phaseMatch[1]);
180
- const suffix = normalize(phaseMatch[2] ??
181
- "");
182
- const title = suffix &&
183
- !isStatusOnly(suffix)
184
- ? `Phase ${number} - ${suffix}`
185
- : `Phase ${number}`;
186
- result.push(makeObservation(identity, event, "phase", title, {
187
- key: `phase:${number}`,
188
- order: number,
189
- status: statusFrom(line),
190
- confidence: 0.93,
191
- }));
192
- }
193
- const checkbox = rawLine.match(/^\s*[-*]\s*\[([ xX])\]\s*(.+)$/u);
194
- if (checkbox?.[2]) {
195
- result.push(makeObservation(identity, event, "task", checkbox[2], {
196
- status: checkbox[1].trim()
197
- ? "completed"
198
- : statusFrom(checkbox[2]),
199
- confidence: 0.96,
200
- }));
201
- }
202
- /*
203
- * Stable numbered TODO identity.
204
- *
205
- * TODO 2: Viết adapter
206
- * TODO 2 đang làm
207
- * TODO 2 hoàn thành
208
- *
209
- * => all become task:2
210
- */
211
- const todo = line.match(/^(?:todo|task|việc)\s*(\d+)?(?:\s*[:.\-–—]\s*|\s+)(.+)$/iu);
212
- if (todo?.[2]) {
213
- const order = todo[1]
214
- ? Number(todo[1])
215
- : undefined;
216
- const todoText = normalize(todo[2]);
217
- const statusOnly = isStatusOnly(todoText);
218
- result.push(makeObservation(identity, event, "task", statusOnly &&
219
- order !== undefined
220
- ? `TODO ${order}`
221
- : todoText, {
222
- key: order !== undefined
223
- ? `task:${order}`
224
- : keyOf(todoText),
225
- order,
226
- status: statusFrom(line),
227
- confidence: 0.93,
228
- }));
229
- }
230
- if (/^(?:next|next action|next step|tiếp theo|bước tiếp theo|cần làm tiếp)\b/iu
231
- .test(line)) {
232
- const cleaned = line.replace(/^(?:next|next action|next step|tiếp theo|bước tiếp theo|cần làm tiếp)\s*(?::|-)?\s*/iu, "");
233
- if (cleaned) {
234
- result.push(makeObservation(identity, event, "next_action", cleaned, {
235
- confidence: 0.9,
236
- }));
237
- }
238
- }
239
- if (/\b(blocker|blocked)\b|đang vướng|bị vướng|đang kẹt/iu
240
- .test(line)) {
241
- result.push(makeObservation(identity, event, "blocker", line, {
242
- confidence: 0.9,
243
- }));
244
- }
245
- if (/\b(chú ý|lưu ý|warning|attention|cẩn thận)\b/iu
246
- .test(line)) {
247
- result.push(makeObservation(identity, event, "warning", line, {
248
- confidence: 0.88,
249
- }));
250
- }
251
- if (/\b(chốt|quyết định|decided|decision)\b/iu
252
- .test(line)) {
253
- result.push(makeObservation(identity, event, "decision", line, {
254
- confidence: 0.9,
255
- }));
256
- }
257
- return result;
258
- }
259
- export function extractWorkObservations(identity, events) {
260
- if (events.length === 0) {
261
- return [];
262
- }
263
- const observations = [];
264
- const seen = new Set();
265
- function push(observation) {
266
- if (seen.has(observation.id)) {
267
- return;
268
- }
269
- seen.add(observation.id);
270
- observations.push(observation);
271
- }
272
- for (const event of events) {
273
- if (event.type ===
274
- "decision") {
275
- const raw = [];
276
- collectStrings(event.data, raw);
277
- for (const value of raw) {
278
- push(makeObservation(identity, event, "decision", value, {
279
- confidence: 1,
280
- }));
281
- }
282
- }
283
- if (event.type ===
284
- "todo") {
285
- const raw = [];
286
- collectStrings(event.data, raw);
287
- for (const value of raw) {
288
- push(makeObservation(identity, event, "task", value, {
289
- status: statusFrom(value),
290
- confidence: 1,
291
- }));
292
- }
293
- }
294
- if ([
295
- "file_write",
296
- "file_edit",
297
- ].includes(event.type)) {
298
- for (const key of [
299
- "filePath",
300
- "path",
301
- "file",
302
- ]) {
303
- const value = event.data[key];
304
- if (typeof value ===
305
- "string" &&
306
- value) {
307
- push(makeObservation(identity, event, "file", value, {
308
- confidence: 1,
309
- }));
310
- }
311
- }
312
- }
313
- if (event.type ===
314
- "test") {
315
- const raw = [];
316
- collectStrings(event.data, raw);
317
- for (const value of raw) {
318
- push(makeObservation(identity, event, "test", value, {
319
- confidence: 1,
320
- }));
321
- }
322
- }
323
- const blocks = [];
324
- collectStrings(event.data, blocks);
325
- for (const block of blocks) {
326
- for (const rawLine of block.split(/\n+/u)) {
327
- for (const observation of extractFromLine(identity, event, rawLine)) {
328
- push(observation);
329
- }
330
- }
331
- }
332
- }
333
- const last = events[events.length - 1];
334
- push(makeObservation(identity, last, "session", `${identity.agent}:${identity.nativeSessionId}`, {
335
- key: identity.sessionKey,
336
- confidence: 1,
337
- }));
338
- return observations;
339
- }
@@ -1,185 +0,0 @@
1
- import { mkdirSync, } from "node:fs";
2
- import { join, } from "node:path";
3
- import { sha256, writeJsonAtomic, } from "../session/utils.js";
4
- import { loadProjectManual, } from "../project-manual/manager.js";
5
- import { loadWorkState, reconcileWorkState, } from "./reducer.js";
6
- function substantiveState(state) {
7
- return {
8
- goal: state.goal,
9
- plan: state.plan,
10
- phases: state.phases.map(item => ({
11
- id: item.id,
12
- title: item.title,
13
- status: item.status,
14
- order: item.order,
15
- })),
16
- tasks: state.tasks.map(item => ({
17
- id: item.id,
18
- title: item.title,
19
- status: item.status,
20
- order: item.order,
21
- })),
22
- decisions: state.decisions,
23
- blockers: state.blockers,
24
- warnings: state.warnings,
25
- nextActions: state.nextActions,
26
- filesTouched: state.filesTouched,
27
- tests: state.tests,
28
- };
29
- }
30
- function hasUnfinishedWork(state) {
31
- return (state.phases.some(item => item.status ===
32
- "pending" ||
33
- item.status ===
34
- "in_progress" ||
35
- item.status ===
36
- "blocked") ||
37
- state.tasks.some(item => item.status ===
38
- "pending" ||
39
- item.status ===
40
- "in_progress" ||
41
- item.status ===
42
- "blocked") ||
43
- state.nextActions.length >
44
- 0 ||
45
- state.blockers.length >
46
- 0);
47
- }
48
- export class SmartHandoffManager {
49
- options;
50
- constructor(options) {
51
- this.options = options;
52
- }
53
- async capture(reason, sequence) {
54
- let state = await loadWorkState(this.options
55
- .project, this.options
56
- .storage);
57
- if (!state) {
58
- state =
59
- await reconcileWorkState(this.options
60
- .project, this.options
61
- .storage);
62
- }
63
- if (!hasUnfinishedWork(state)) {
64
- return null;
65
- }
66
- const manual = loadProjectManual(this.options
67
- .project, false);
68
- const enforceRules = manual
69
- ? manual.rules
70
- .filter(rule => rule.mode ===
71
- "enforce")
72
- .map(rule => rule.text)
73
- : [];
74
- const stateDigest = sha256(JSON.stringify(substantiveState(state)));
75
- /*
76
- * Stable handoff ID.
77
- *
78
- * Multiple idle/checkpoint events with no substantive
79
- * work-state change reuse the same handoff object.
80
- */
81
- const id = sha256([
82
- this.options
83
- .project.id,
84
- this.options
85
- .identity
86
- .sessionKey,
87
- stateDigest,
88
- ].join("|")).slice(0, 24);
89
- const createdAt = new Date()
90
- .toISOString();
91
- const handoff = {
92
- version: 1,
93
- id,
94
- projectId: this.options
95
- .project.id,
96
- projectName: this.options
97
- .project.name,
98
- createdAt,
99
- reason,
100
- sourceSession: {
101
- agent: this.options
102
- .identity.agent,
103
- nativeSessionId: this.options
104
- .identity
105
- .nativeSessionId,
106
- sessionKey: this.options
107
- .identity
108
- .sessionKey,
109
- sequence,
110
- },
111
- goal: state.goal,
112
- plan: state.plan,
113
- progress: state.progress,
114
- currentPhase: state.currentPhase,
115
- currentTask: state.currentTask,
116
- incompletePhases: state.phases.filter(item => item.status !==
117
- "completed" &&
118
- item.status !==
119
- "cancelled"),
120
- incompleteTasks: state.tasks.filter(item => item.status !==
121
- "completed" &&
122
- item.status !==
123
- "cancelled"),
124
- nextActions: state.nextActions
125
- .slice(0, 10),
126
- blockers: state.blockers
127
- .slice(0, 10),
128
- decisions: state.decisions
129
- .slice(-10),
130
- warnings: state.warnings
131
- .slice(-10),
132
- attention: [
133
- ...enforceRules,
134
- ...state.warnings,
135
- ].slice(0, 20),
136
- filesTouched: state.filesTouched
137
- .slice(-20),
138
- tests: state.tests
139
- .slice(-15),
140
- stateDigest,
141
- };
142
- const remoteKey = `projects/${this.options.project.id}/work/handoffs/${id}.json`;
143
- /*
144
- * Historical handoff is immutable.
145
- */
146
- if (!await this.options
147
- .storage
148
- .exists(remoteKey)) {
149
- await this.options
150
- .storage
151
- .put(remoteKey, JSON.stringify(handoff, null, 2) +
152
- "\n", "application/json");
153
- }
154
- /*
155
- * Latest pointer is intentionally mutable.
156
- */
157
- await this.options
158
- .storage
159
- .put(`projects/${this.options.project.id}/work/handoff-latest.json`, JSON.stringify(handoff, null, 2) +
160
- "\n", "application/json");
161
- const localDirectory = join(this.options
162
- .project
163
- .rootPath, ".toolnet", "work", "handoffs");
164
- mkdirSync(localDirectory, {
165
- recursive: true,
166
- });
167
- writeJsonAtomic(join(localDirectory, `${id}.json`), handoff);
168
- writeJsonAtomic(join(this.options
169
- .project
170
- .rootPath, ".toolnet", "work", "handoff-latest.json"), handoff);
171
- return handoff;
172
- }
173
- }
174
- export async function loadLatestHandoff(project, storage) {
175
- const text = await storage.getText(`projects/${project.id}/work/handoff-latest.json`);
176
- if (!text) {
177
- return null;
178
- }
179
- try {
180
- return JSON.parse(text);
181
- }
182
- catch {
183
- return null;
184
- }
185
- }
@@ -1,14 +0,0 @@
1
- export * from "./types.js";
2
- export * from "./extractor.js";
3
- export * from "./journal.js";
4
- export * from "./reducer.js";
5
- export * from "./learner.js";
6
- export * from "./handoff.js";
7
- export * from "./brief.js";
8
- export * from "./semantic-types.js";
9
- export * from "./semantic-extractor.js";
10
- export * from "./semantic-journal.js";
11
- export * from "./semantic-reducer.js";
12
- export * from "./semantic-learner.js";
13
- export * from "./brief-cache.js";
14
- export * from "./injection.js";
@@ -1,84 +0,0 @@
1
- import { existsSync, mkdirSync, readFileSync, } from "node:fs";
2
- import { homedir, } from "node:os";
3
- import { dirname, join, } from "node:path";
4
- import { writeJsonAtomic, } from "../session/utils.js";
5
- import { getStartupBriefForInjection, } from "./brief-cache.js";
6
- function markerFile(project, conversationId, overrideDirectory) {
7
- const base = overrideDirectory ??
8
- join(homedir(), ".config", "toolnet-memory", "injections", "agy");
9
- return join(base, `${project.id}-${conversationId}.json`);
10
- }
11
- function loadMarker(file) {
12
- if (!existsSync(file)) {
13
- return null;
14
- }
15
- try {
16
- return JSON.parse(readFileSync(file, "utf8"));
17
- }
18
- catch {
19
- return null;
20
- }
21
- }
22
- export async function buildAgyPreInvocationOutput(options) {
23
- const now = options.now ??
24
- Date.now();
25
- const resumeAfterMs = options.resumeAfterMs ??
26
- 6 * 60 * 60 * 1000;
27
- const markerPath = markerFile(options.project, options.conversationId, options.markerDirectory);
28
- const marker = loadMarker(markerPath);
29
- const markerTime = marker
30
- ? Date.parse(marker.injectedAt)
31
- : 0;
32
- const age = markerTime
33
- ? now -
34
- markerTime
35
- : Number.POSITIVE_INFINITY;
36
- /*
37
- * Avoid duplicate injection on immediate retry.
38
- */
39
- if (marker &&
40
- age <
41
- 60_000) {
42
- return {};
43
- }
44
- const firstInvocation = options.invocationNum ===
45
- 0;
46
- const resumedAfterPause = age >=
47
- resumeAfterMs;
48
- if (marker &&
49
- !firstInvocation &&
50
- !resumedAfterPause) {
51
- return {};
52
- }
53
- const cache = await getStartupBriefForInjection(options.project, options.storage, 900);
54
- if (!cache?.text) {
55
- return {};
56
- }
57
- mkdirSync(dirname(markerPath), {
58
- recursive: true,
59
- });
60
- writeJsonAtomic(markerPath, {
61
- digest: cache.digest,
62
- injectedAt: new Date(now)
63
- .toISOString(),
64
- });
65
- return {
66
- injectSteps: [
67
- {
68
- ephemeralMessage: cache.text,
69
- },
70
- ],
71
- };
72
- }
73
- export async function buildCodexSessionStartOutput(options) {
74
- const cache = await getStartupBriefForInjection(options.project, options.storage, 900);
75
- if (!cache?.text) {
76
- return {};
77
- }
78
- return {
79
- hookSpecificOutput: {
80
- hookEventName: "SessionStart",
81
- additionalContext: cache.text,
82
- },
83
- };
84
- }