toolnet-memory 0.2.1 → 0.2.3

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,360 +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 collectStrings(value, output, depth = 0) {
22
- if (depth >
23
- 6) {
24
- return;
25
- }
26
- if (typeof value ===
27
- "string") {
28
- output.push(value);
29
- return;
30
- }
31
- if (Array.isArray(value)) {
32
- for (const item of value.slice(0, 50)) {
33
- collectStrings(item, output, depth + 1);
34
- }
35
- return;
36
- }
37
- if (!value ||
38
- typeof value !==
39
- "object") {
40
- return;
41
- }
42
- for (const [key, child,] of Object.entries(value)) {
43
- if (TEXT_KEYS.has(key) ||
44
- [
45
- "data",
46
- "payload",
47
- "parts",
48
- "messages",
49
- ].includes(key)) {
50
- collectStrings(child, output, depth + 1);
51
- }
52
- }
53
- }
54
- function observation(identity, event, kind, value, scope, confidence = 0.95) {
55
- const clean = normalize(value);
56
- const id = sha256([
57
- identity
58
- .projectId,
59
- kind,
60
- scope.type,
61
- scope.key ??
62
- "",
63
- clean
64
- .toLowerCase(),
65
- event.id,
66
- ].join("|")).slice(0, 32);
67
- return {
68
- version: 1,
69
- id,
70
- projectId: identity
71
- .projectId,
72
- kind,
73
- value: clean,
74
- scope: scope.type,
75
- scopeKey: scope.key,
76
- scopeOrder: scope.order,
77
- confidence,
78
- evidence: {
79
- agent: identity.agent,
80
- nativeSessionId: identity
81
- .nativeSessionId,
82
- sessionKey: identity
83
- .sessionKey,
84
- eventId: event.id,
85
- sourceEventId: event
86
- .sourceEventId,
87
- sequence: event.sequence,
88
- occurredAt: event.timestamp,
89
- },
90
- };
91
- }
92
- function fieldValue(line, labels) {
93
- const lower = line.toLowerCase();
94
- for (const label of labels) {
95
- const normalizedLabel = label.toLowerCase();
96
- if (lower.startsWith(`${normalizedLabel}:`) ||
97
- lower.startsWith(`${normalizedLabel} -`) ||
98
- lower.startsWith(`${normalizedLabel} —`)) {
99
- return normalize(line.slice(label.length + 1));
100
- }
101
- }
102
- return null;
103
- }
104
- function isBullet(raw) {
105
- const line = raw.trimStart();
106
- return (line.startsWith("- ") ||
107
- line.startsWith("* ") ||
108
- /^\d+[.)]\s+/u.test(line));
109
- }
110
- function bulletValue(raw) {
111
- return normalize(raw
112
- .trim()
113
- .replace(/^[-*]\s+/u, "")
114
- .replace(/^\d+[.)]\s+/u, ""));
115
- }
116
- export function extractSemanticObservations(identity, events) {
117
- const output = [];
118
- const seen = new Set();
119
- function push(item) {
120
- if (!item.value ||
121
- item.value.length <
122
- 3 ||
123
- seen.has(item.id)) {
124
- return;
125
- }
126
- seen.add(item.id);
127
- output.push(item);
128
- }
129
- for (const event of events) {
130
- const blocks = [];
131
- collectStrings(event.data, blocks);
132
- for (const block of blocks) {
133
- let scope = {
134
- type: "project",
135
- };
136
- let listMode = null;
137
- for (const raw of block.split(/\r?\n/u)) {
138
- const line = normalize(raw);
139
- if (!line) {
140
- listMode =
141
- null;
142
- continue;
143
- }
144
- const phase = line.match(/^(?:phase|giai đoạn|giai doan|stage)\s*(\d+)\s*(?:[:\-–—]\s*)?(.*)$/iu);
145
- if (phase) {
146
- const order = Number(phase[1]);
147
- scope = {
148
- type: "phase",
149
- key: `phase:${order}`,
150
- order,
151
- title: normalize(phase[2] ??
152
- ""),
153
- };
154
- listMode =
155
- null;
156
- continue;
157
- }
158
- const task = line.match(/^(?:todo|task|việc)\s*(\d+)\s*(?:[:\-–—]\s*)?(.*)$/iu);
159
- if (task) {
160
- const order = Number(task[1]);
161
- scope = {
162
- type: "task",
163
- key: `task:${order}`,
164
- order,
165
- title: normalize(task[2] ??
166
- ""),
167
- };
168
- listMode =
169
- null;
170
- continue;
171
- }
172
- const mission = fieldValue(line, [
173
- "mission",
174
- "sứ mệnh",
175
- "mục tiêu tổng thể",
176
- "mục tiêu project",
177
- "project goal",
178
- ]);
179
- if (mission) {
180
- push(observation(identity, event, "mission", mission, {
181
- type: "project",
182
- }, 0.99));
183
- listMode =
184
- null;
185
- continue;
186
- }
187
- const activeObjective = fieldValue(line, [
188
- "current objective",
189
- "active objective",
190
- "mục tiêu hiện tại",
191
- "objective",
192
- "mục tiêu",
193
- "mục đích",
194
- ]);
195
- if (activeObjective) {
196
- push(observation(identity, event, scope.type ===
197
- "phase"
198
- ? "phase_objective"
199
- : "objective", activeObjective, scope, 0.98));
200
- listMode =
201
- null;
202
- continue;
203
- }
204
- const why = fieldValue(line, [
205
- "why",
206
- "why this",
207
- "why this phase",
208
- "reason",
209
- "rationale",
210
- "vì sao",
211
- "lý do",
212
- "tại sao",
213
- "ý nghĩa",
214
- ]);
215
- if (why) {
216
- push(observation(identity, event, scope.type ===
217
- "phase"
218
- ? "phase_why"
219
- : "why", why, scope, 0.98));
220
- listMode =
221
- null;
222
- continue;
223
- }
224
- const outcome = fieldValue(line, [
225
- "desired outcome",
226
- "final outcome",
227
- "kết quả cuối",
228
- "kết quả mong muốn",
229
- "mục tiêu cuối",
230
- ]);
231
- if (outcome) {
232
- push(observation(identity, event, "desired_outcome", outcome, {
233
- type: "project",
234
- }, 0.98));
235
- listMode =
236
- null;
237
- continue;
238
- }
239
- const planRationale = fieldValue(line, [
240
- "plan rationale",
241
- "approach rationale",
242
- "why this approach",
243
- "tại sao chọn hướng này",
244
- "lý do chọn hướng này",
245
- "lý do chọn kiến trúc",
246
- ]);
247
- if (planRationale) {
248
- push(observation(identity, event, "plan_rationale", planRationale, {
249
- type: "project",
250
- }, 0.98));
251
- listMode =
252
- null;
253
- continue;
254
- }
255
- const deliverable = fieldValue(line, [
256
- "deliverable",
257
- "output",
258
- "kết quả cần đạt",
259
- "phải tạo ra",
260
- "đầu ra",
261
- ]);
262
- if (deliverable) {
263
- push(observation(identity, event, "phase_deliverable", deliverable, scope, 0.97));
264
- listMode =
265
- null;
266
- continue;
267
- }
268
- const acceptance = fieldValue(line, [
269
- "acceptance criteria",
270
- "definition of done",
271
- "done khi",
272
- "hoàn thành khi",
273
- "tiêu chí hoàn thành",
274
- ]);
275
- if (acceptance) {
276
- push(observation(identity, event, "acceptance_criterion", acceptance, scope, 0.98));
277
- listMode =
278
- "acceptance_criterion";
279
- continue;
280
- }
281
- const dependency = fieldValue(line, [
282
- "depends on",
283
- "dependency",
284
- "dependencies",
285
- "phụ thuộc",
286
- "cần có trước",
287
- ]);
288
- if (dependency) {
289
- push(observation(identity, event, "dependency", dependency, scope, 0.97));
290
- listMode =
291
- "dependency";
292
- continue;
293
- }
294
- const openQuestion = fieldValue(line, [
295
- "open question",
296
- "open questions",
297
- "câu hỏi mở",
298
- "chưa quyết định",
299
- "chưa rõ",
300
- ]);
301
- if (openQuestion) {
302
- push(observation(identity, event, "open_question", openQuestion, scope, 0.95));
303
- listMode =
304
- "open_question";
305
- continue;
306
- }
307
- const constraint = fieldValue(line, [
308
- "constraint",
309
- "constraints",
310
- "ràng buộc",
311
- "giới hạn",
312
- ]);
313
- if (constraint) {
314
- push(observation(identity, event, "constraint", constraint, scope, 0.97));
315
- listMode =
316
- "constraint";
317
- continue;
318
- }
319
- if (/^(?:acceptance criteria|definition of done|done khi|tiêu chí hoàn thành)\s*:?\s*$/iu
320
- .test(line)) {
321
- listMode =
322
- "acceptance_criterion";
323
- continue;
324
- }
325
- if (/^(?:dependencies|dependency|phụ thuộc)\s*:?\s*$/iu
326
- .test(line)) {
327
- listMode =
328
- "dependency";
329
- continue;
330
- }
331
- if (/^(?:open questions|open question|câu hỏi mở)\s*:?\s*$/iu
332
- .test(line)) {
333
- listMode =
334
- "open_question";
335
- continue;
336
- }
337
- if (/^(?:constraints|constraint|ràng buộc)\s*:?\s*$/iu
338
- .test(line)) {
339
- listMode =
340
- "constraint";
341
- continue;
342
- }
343
- if (listMode &&
344
- isBullet(raw)) {
345
- push(observation(identity, event, listMode, bulletValue(raw), scope, 0.96));
346
- continue;
347
- }
348
- /*
349
- * No implicit "why" inference here.
350
- *
351
- * If the previous session never recorded WHY,
352
- * ToolNet deliberately leaves it unknown.
353
- */
354
- listMode =
355
- null;
356
- }
357
- }
358
- }
359
- return output;
360
- }
@@ -1,55 +0,0 @@
1
- import { sha256, } from "../session/utils.js";
2
- function pad(value) {
3
- return String(value).padStart(12, "0");
4
- }
5
- export class SemanticObservationJournal {
6
- storage;
7
- constructor(storage) {
8
- this.storage = storage;
9
- }
10
- async write(identity, observations) {
11
- if (observations.length ===
12
- 0) {
13
- return null;
14
- }
15
- const firstSequence = Math.min(...observations.map(item => item.evidence
16
- .sequence));
17
- const lastSequence = Math.max(...observations.map(item => item.evidence
18
- .sequence));
19
- const batch = {
20
- version: 1,
21
- projectId: identity
22
- .projectId,
23
- agent: identity.agent,
24
- nativeSessionId: identity
25
- .nativeSessionId,
26
- sessionKey: identity
27
- .sessionKey,
28
- firstSequence,
29
- lastSequence,
30
- createdAt: new Date()
31
- .toISOString(),
32
- observations,
33
- };
34
- const digest = sha256(observations
35
- .map(item => item.id)
36
- .sort()
37
- .join("|")).slice(0, 16);
38
- const key = [
39
- `projects/${identity.projectId}`,
40
- "work",
41
- "semantic",
42
- "observations",
43
- identity.agent,
44
- identity.nativeSessionId,
45
- `${pad(firstSequence)}-${pad(lastSequence)}-${digest}.json`,
46
- ].join("/");
47
- if (!await this.storage
48
- .exists(key)) {
49
- await this.storage
50
- .put(key, JSON.stringify(batch, null, 2) +
51
- "\n", "application/json");
52
- }
53
- return key;
54
- }
55
- }
@@ -1,125 +0,0 @@
1
- import { closeSync, existsSync, openSync, readSync, statSync, } from "node:fs";
2
- import { extractSemanticObservations, } from "./semantic-extractor.js";
3
- import { SemanticObservationJournal, } from "./semantic-journal.js";
4
- import { reconcileSemanticWorkState, } from "./semantic-reducer.js";
5
- function readEvents(filePath, offset) {
6
- if (!existsSync(filePath)) {
7
- return {
8
- events: [],
9
- nextOffset: offset,
10
- };
11
- }
12
- const size = statSync(filePath).size;
13
- let start = Number.isFinite(offset)
14
- ? Math.max(0, offset)
15
- : 0;
16
- if (start >
17
- size) {
18
- start =
19
- 0;
20
- }
21
- if (start ===
22
- size) {
23
- return {
24
- events: [],
25
- nextOffset: size,
26
- };
27
- }
28
- const buffer = Buffer.alloc(size -
29
- start);
30
- const fd = openSync(filePath, "r");
31
- try {
32
- readSync(fd, buffer, 0, buffer.length, start);
33
- }
34
- finally {
35
- closeSync(fd);
36
- }
37
- const text = buffer.toString("utf8");
38
- const lastNewline = text.lastIndexOf("\n");
39
- if (lastNewline <
40
- 0) {
41
- return {
42
- events: [],
43
- nextOffset: start,
44
- };
45
- }
46
- const complete = text.slice(0, lastNewline +
47
- 1);
48
- return {
49
- events: complete
50
- .split("\n")
51
- .filter(Boolean)
52
- .flatMap(line => {
53
- try {
54
- return [
55
- JSON.parse(line),
56
- ];
57
- }
58
- catch {
59
- return [];
60
- }
61
- }),
62
- nextOffset: start +
63
- Buffer.byteLength(complete, "utf8"),
64
- };
65
- }
66
- export class SemanticWorkLearner {
67
- options;
68
- journal;
69
- constructor(options) {
70
- this.options = options;
71
- this.journal =
72
- new SemanticObservationJournal(options.storage);
73
- }
74
- async learnNew() {
75
- const state = this.options
76
- .wal
77
- .loadState();
78
- const rawOffset = Number(state.sourceCursors["work.semantic.offset"] ??
79
- 0);
80
- const read = readEvents(this.options
81
- .wal
82
- .eventsFile, Number.isFinite(rawOffset)
83
- ? rawOffset
84
- : 0);
85
- if (read.events.length ===
86
- 0) {
87
- return {
88
- scannedEvents: 0,
89
- observations: 0,
90
- journalWritten: false,
91
- reconciled: false,
92
- nextOffset: read.nextOffset,
93
- };
94
- }
95
- const observations = extractSemanticObservations(this.options
96
- .identity, read.events);
97
- let journalWritten = false;
98
- let reconciled = false;
99
- if (observations.length >
100
- 0) {
101
- const key = await this.journal
102
- .write(this.options
103
- .identity, observations);
104
- journalWritten =
105
- Boolean(key);
106
- if (journalWritten) {
107
- await reconcileSemanticWorkState(this.options
108
- .project, this.options
109
- .storage);
110
- reconciled =
111
- true;
112
- }
113
- }
114
- this.options
115
- .wal
116
- .setSourceCursor("work.semantic.offset", read.nextOffset);
117
- return {
118
- scannedEvents: read.events.length,
119
- observations: observations.length,
120
- journalWritten,
121
- reconciled,
122
- nextOffset: read.nextOffset,
123
- };
124
- }
125
- }