opencode-telos 1.0.0

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 (568) hide show
  1. package/README.md +927 -0
  2. package/dist/code-intelligence/analyzer.d.ts +9 -0
  3. package/dist/code-intelligence/analyzer.d.ts.map +1 -0
  4. package/dist/code-intelligence/analyzer.js +321 -0
  5. package/dist/code-intelligence/analyzer.js.map +1 -0
  6. package/dist/code-intelligence/ast/cache.d.ts +16 -0
  7. package/dist/code-intelligence/ast/cache.d.ts.map +1 -0
  8. package/dist/code-intelligence/ast/cache.js +44 -0
  9. package/dist/code-intelligence/ast/cache.js.map +1 -0
  10. package/dist/code-intelligence/ast/common.d.ts +8 -0
  11. package/dist/code-intelligence/ast/common.d.ts.map +1 -0
  12. package/dist/code-intelligence/ast/common.js +42 -0
  13. package/dist/code-intelligence/ast/common.js.map +1 -0
  14. package/dist/code-intelligence/ast/component.d.ts +10 -0
  15. package/dist/code-intelligence/ast/component.d.ts.map +1 -0
  16. package/dist/code-intelligence/ast/component.js +38 -0
  17. package/dist/code-intelligence/ast/component.js.map +1 -0
  18. package/dist/code-intelligence/ast/fallback.d.ts +9 -0
  19. package/dist/code-intelligence/ast/fallback.d.ts.map +1 -0
  20. package/dist/code-intelligence/ast/fallback.js +38 -0
  21. package/dist/code-intelligence/ast/fallback.js.map +1 -0
  22. package/dist/code-intelligence/ast/index.d.ts +5 -0
  23. package/dist/code-intelligence/ast/index.d.ts.map +1 -0
  24. package/dist/code-intelligence/ast/index.js +5 -0
  25. package/dist/code-intelligence/ast/index.js.map +1 -0
  26. package/dist/code-intelligence/ast/ir.d.ts +72 -0
  27. package/dist/code-intelligence/ast/ir.d.ts.map +1 -0
  28. package/dist/code-intelligence/ast/ir.js +2 -0
  29. package/dist/code-intelligence/ast/ir.js.map +1 -0
  30. package/dist/code-intelligence/ast/metrics.d.ts +25 -0
  31. package/dist/code-intelligence/ast/metrics.d.ts.map +1 -0
  32. package/dist/code-intelligence/ast/metrics.js +38 -0
  33. package/dist/code-intelligence/ast/metrics.js.map +1 -0
  34. package/dist/code-intelligence/ast/registry.d.ts +5 -0
  35. package/dist/code-intelligence/ast/registry.d.ts.map +1 -0
  36. package/dist/code-intelligence/ast/registry.js +22 -0
  37. package/dist/code-intelligence/ast/registry.js.map +1 -0
  38. package/dist/code-intelligence/ast/tree-sitter.d.ts +8 -0
  39. package/dist/code-intelligence/ast/tree-sitter.d.ts.map +1 -0
  40. package/dist/code-intelligence/ast/tree-sitter.js +247 -0
  41. package/dist/code-intelligence/ast/tree-sitter.js.map +1 -0
  42. package/dist/code-intelligence/ast/typescript.d.ts +8 -0
  43. package/dist/code-intelligence/ast/typescript.d.ts.map +1 -0
  44. package/dist/code-intelligence/ast/typescript.js +147 -0
  45. package/dist/code-intelligence/ast/typescript.js.map +1 -0
  46. package/dist/index.d.ts +10 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +18 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/mcp/server.d.ts +27 -0
  51. package/dist/mcp/server.d.ts.map +1 -0
  52. package/dist/mcp/server.js +67 -0
  53. package/dist/mcp/server.js.map +1 -0
  54. package/dist/opencode/hooks.d.ts +9 -0
  55. package/dist/opencode/hooks.d.ts.map +1 -0
  56. package/dist/opencode/hooks.js +583 -0
  57. package/dist/opencode/hooks.js.map +1 -0
  58. package/dist/opencode/router/categories.d.ts +31 -0
  59. package/dist/opencode/router/categories.d.ts.map +1 -0
  60. package/dist/opencode/router/categories.js +165 -0
  61. package/dist/opencode/router/categories.js.map +1 -0
  62. package/dist/opencode/router/embeddings.d.ts +41 -0
  63. package/dist/opencode/router/embeddings.d.ts.map +1 -0
  64. package/dist/opencode/router/embeddings.js +136 -0
  65. package/dist/opencode/router/embeddings.js.map +1 -0
  66. package/dist/opencode/router/graph-state-snapshot.d.ts +35 -0
  67. package/dist/opencode/router/graph-state-snapshot.d.ts.map +1 -0
  68. package/dist/opencode/router/graph-state-snapshot.js +129 -0
  69. package/dist/opencode/router/graph-state-snapshot.js.map +1 -0
  70. package/dist/opencode/router/index.d.ts +21 -0
  71. package/dist/opencode/router/index.d.ts.map +1 -0
  72. package/dist/opencode/router/index.js +23 -0
  73. package/dist/opencode/router/index.js.map +1 -0
  74. package/dist/opencode/router/intent-classifier.d.ts +35 -0
  75. package/dist/opencode/router/intent-classifier.d.ts.map +1 -0
  76. package/dist/opencode/router/intent-classifier.js +108 -0
  77. package/dist/opencode/router/intent-classifier.js.map +1 -0
  78. package/dist/opencode/router/semantic-nudge.d.ts +42 -0
  79. package/dist/opencode/router/semantic-nudge.d.ts.map +1 -0
  80. package/dist/opencode/router/semantic-nudge.js +73 -0
  81. package/dist/opencode/router/semantic-nudge.js.map +1 -0
  82. package/dist/opencode/router/state-gate.d.ts +25 -0
  83. package/dist/opencode/router/state-gate.d.ts.map +1 -0
  84. package/dist/opencode/router/state-gate.js +178 -0
  85. package/dist/opencode/router/state-gate.js.map +1 -0
  86. package/dist/opencode/router/tool-embeddings.d.ts +36 -0
  87. package/dist/opencode/router/tool-embeddings.d.ts.map +1 -0
  88. package/dist/opencode/router/tool-embeddings.js +140 -0
  89. package/dist/opencode/router/tool-embeddings.js.map +1 -0
  90. package/dist/opencode/router/tool-registry.d.ts +45 -0
  91. package/dist/opencode/router/tool-registry.d.ts.map +1 -0
  92. package/dist/opencode/router/tool-registry.js +103 -0
  93. package/dist/opencode/router/tool-registry.js.map +1 -0
  94. package/dist/opencode/router/tool-taxonomy.d.ts +51 -0
  95. package/dist/opencode/router/tool-taxonomy.d.ts.map +1 -0
  96. package/dist/opencode/router/tool-taxonomy.js +250 -0
  97. package/dist/opencode/router/tool-taxonomy.js.map +1 -0
  98. package/dist/opencode/router/tools-composite.d.ts +21 -0
  99. package/dist/opencode/router/tools-composite.d.ts.map +1 -0
  100. package/dist/opencode/router/tools-composite.js +684 -0
  101. package/dist/opencode/router/tools-composite.js.map +1 -0
  102. package/dist/opencode/shell-hooks.d.ts +7 -0
  103. package/dist/opencode/shell-hooks.d.ts.map +1 -0
  104. package/dist/opencode/shell-hooks.js +96 -0
  105. package/dist/opencode/shell-hooks.js.map +1 -0
  106. package/dist/opencode/system-prompt.d.ts +10 -0
  107. package/dist/opencode/system-prompt.d.ts.map +1 -0
  108. package/dist/opencode/system-prompt.js +600 -0
  109. package/dist/opencode/system-prompt.js.map +1 -0
  110. package/dist/opencode/tools.d.ts +8 -0
  111. package/dist/opencode/tools.d.ts.map +1 -0
  112. package/dist/opencode/tools.js +3731 -0
  113. package/dist/opencode/tools.js.map +1 -0
  114. package/dist/opencode/workflows/chains.d.ts +52 -0
  115. package/dist/opencode/workflows/chains.d.ts.map +1 -0
  116. package/dist/opencode/workflows/chains.js +170 -0
  117. package/dist/opencode/workflows/chains.js.map +1 -0
  118. package/dist/opencode/workflows/executor.d.ts +52 -0
  119. package/dist/opencode/workflows/executor.d.ts.map +1 -0
  120. package/dist/opencode/workflows/executor.js +130 -0
  121. package/dist/opencode/workflows/executor.js.map +1 -0
  122. package/dist/opencode/workflows/index.d.ts +14 -0
  123. package/dist/opencode/workflows/index.d.ts.map +1 -0
  124. package/dist/opencode/workflows/index.js +15 -0
  125. package/dist/opencode/workflows/index.js.map +1 -0
  126. package/dist/opencode/workflows/tools-workflow.d.ts +24 -0
  127. package/dist/opencode/workflows/tools-workflow.d.ts.map +1 -0
  128. package/dist/opencode/workflows/tools-workflow.js +85 -0
  129. package/dist/opencode/workflows/tools-workflow.js.map +1 -0
  130. package/dist/opencode/workflows/types.d.ts +32 -0
  131. package/dist/opencode/workflows/types.d.ts.map +1 -0
  132. package/dist/opencode/workflows/types.js +13 -0
  133. package/dist/opencode/workflows/types.js.map +1 -0
  134. package/dist/sdd/analysis/compliance.d.ts +30 -0
  135. package/dist/sdd/analysis/compliance.d.ts.map +1 -0
  136. package/dist/sdd/analysis/compliance.js +251 -0
  137. package/dist/sdd/analysis/compliance.js.map +1 -0
  138. package/dist/sdd/analysis/scalability.d.ts +15 -0
  139. package/dist/sdd/analysis/scalability.d.ts.map +1 -0
  140. package/dist/sdd/analysis/scalability.js +72 -0
  141. package/dist/sdd/analysis/scalability.js.map +1 -0
  142. package/dist/sdd/analysis/security.d.ts +25 -0
  143. package/dist/sdd/analysis/security.d.ts.map +1 -0
  144. package/dist/sdd/analysis/security.js +94 -0
  145. package/dist/sdd/analysis/security.js.map +1 -0
  146. package/dist/sdd/brownfield/scanner.d.ts +31 -0
  147. package/dist/sdd/brownfield/scanner.d.ts.map +1 -0
  148. package/dist/sdd/brownfield/scanner.js +228 -0
  149. package/dist/sdd/brownfield/scanner.js.map +1 -0
  150. package/dist/sdd/cache/manager.d.ts +237 -0
  151. package/dist/sdd/cache/manager.d.ts.map +1 -0
  152. package/dist/sdd/cache/manager.js +770 -0
  153. package/dist/sdd/cache/manager.js.map +1 -0
  154. package/dist/sdd/cache/snapshot-store.d.ts +39 -0
  155. package/dist/sdd/cache/snapshot-store.d.ts.map +1 -0
  156. package/dist/sdd/cache/snapshot-store.js +156 -0
  157. package/dist/sdd/cache/snapshot-store.js.map +1 -0
  158. package/dist/sdd/changes/manager.d.ts +58 -0
  159. package/dist/sdd/changes/manager.d.ts.map +1 -0
  160. package/dist/sdd/changes/manager.js +235 -0
  161. package/dist/sdd/changes/manager.js.map +1 -0
  162. package/dist/sdd/cicd/generators.d.ts +16 -0
  163. package/dist/sdd/cicd/generators.d.ts.map +1 -0
  164. package/dist/sdd/cicd/generators.js +1042 -0
  165. package/dist/sdd/cicd/generators.js.map +1 -0
  166. package/dist/sdd/code-quality/complexity.d.ts +38 -0
  167. package/dist/sdd/code-quality/complexity.d.ts.map +1 -0
  168. package/dist/sdd/code-quality/complexity.js +161 -0
  169. package/dist/sdd/code-quality/complexity.js.map +1 -0
  170. package/dist/sdd/code-quality/conventions.d.ts +33 -0
  171. package/dist/sdd/code-quality/conventions.d.ts.map +1 -0
  172. package/dist/sdd/code-quality/conventions.js +193 -0
  173. package/dist/sdd/code-quality/conventions.js.map +1 -0
  174. package/dist/sdd/code-quality/dependencies.d.ts +27 -0
  175. package/dist/sdd/code-quality/dependencies.d.ts.map +1 -0
  176. package/dist/sdd/code-quality/dependencies.js +142 -0
  177. package/dist/sdd/code-quality/dependencies.js.map +1 -0
  178. package/dist/sdd/code-quality/import-analyzer.d.ts +49 -0
  179. package/dist/sdd/code-quality/import-analyzer.d.ts.map +1 -0
  180. package/dist/sdd/code-quality/import-analyzer.js +213 -0
  181. package/dist/sdd/code-quality/import-analyzer.js.map +1 -0
  182. package/dist/sdd/code-quality/metrics.d.ts +35 -0
  183. package/dist/sdd/code-quality/metrics.d.ts.map +1 -0
  184. package/dist/sdd/code-quality/metrics.js +172 -0
  185. package/dist/sdd/code-quality/metrics.js.map +1 -0
  186. package/dist/sdd/code-quality/smells.d.ts +38 -0
  187. package/dist/sdd/code-quality/smells.d.ts.map +1 -0
  188. package/dist/sdd/code-quality/smells.js +319 -0
  189. package/dist/sdd/code-quality/smells.js.map +1 -0
  190. package/dist/sdd/code-quality/symbol-parser.d.ts +28 -0
  191. package/dist/sdd/code-quality/symbol-parser.d.ts.map +1 -0
  192. package/dist/sdd/code-quality/symbol-parser.js +230 -0
  193. package/dist/sdd/code-quality/symbol-parser.js.map +1 -0
  194. package/dist/sdd/code-quality/usage-tracker.d.ts +59 -0
  195. package/dist/sdd/code-quality/usage-tracker.d.ts.map +1 -0
  196. package/dist/sdd/code-quality/usage-tracker.js +402 -0
  197. package/dist/sdd/code-quality/usage-tracker.js.map +1 -0
  198. package/dist/sdd/code-quality/utils.d.ts +6 -0
  199. package/dist/sdd/code-quality/utils.d.ts.map +1 -0
  200. package/dist/sdd/code-quality/utils.js +14 -0
  201. package/dist/sdd/code-quality/utils.js.map +1 -0
  202. package/dist/sdd/codegen/generator.d.ts +42 -0
  203. package/dist/sdd/codegen/generator.d.ts.map +1 -0
  204. package/dist/sdd/codegen/generator.js +1023 -0
  205. package/dist/sdd/codegen/generator.js.map +1 -0
  206. package/dist/sdd/constitution/validator.d.ts +37 -0
  207. package/dist/sdd/constitution/validator.d.ts.map +1 -0
  208. package/dist/sdd/constitution/validator.js +192 -0
  209. package/dist/sdd/constitution/validator.js.map +1 -0
  210. package/dist/sdd/cost/estimator.d.ts +31 -0
  211. package/dist/sdd/cost/estimator.d.ts.map +1 -0
  212. package/dist/sdd/cost/estimator.js +92 -0
  213. package/dist/sdd/cost/estimator.js.map +1 -0
  214. package/dist/sdd/coverage/tracker.d.ts +47 -0
  215. package/dist/sdd/coverage/tracker.d.ts.map +1 -0
  216. package/dist/sdd/coverage/tracker.js +251 -0
  217. package/dist/sdd/coverage/tracker.js.map +1 -0
  218. package/dist/sdd/disaster/recovery.d.ts +11 -0
  219. package/dist/sdd/disaster/recovery.d.ts.map +1 -0
  220. package/dist/sdd/disaster/recovery.js +55 -0
  221. package/dist/sdd/disaster/recovery.js.map +1 -0
  222. package/dist/sdd/discovery/adaptive.d.ts +14 -0
  223. package/dist/sdd/discovery/adaptive.d.ts.map +1 -0
  224. package/dist/sdd/discovery/adaptive.js +145 -0
  225. package/dist/sdd/discovery/adaptive.js.map +1 -0
  226. package/dist/sdd/discovery/briefing-analyzer.d.ts +66 -0
  227. package/dist/sdd/discovery/briefing-analyzer.d.ts.map +1 -0
  228. package/dist/sdd/discovery/briefing-analyzer.js +672 -0
  229. package/dist/sdd/discovery/briefing-analyzer.js.map +1 -0
  230. package/dist/sdd/discovery/briefing.d.ts +109 -0
  231. package/dist/sdd/discovery/briefing.d.ts.map +1 -0
  232. package/dist/sdd/discovery/briefing.js +617 -0
  233. package/dist/sdd/discovery/briefing.js.map +1 -0
  234. package/dist/sdd/discovery/graph-builder.d.ts +10 -0
  235. package/dist/sdd/discovery/graph-builder.d.ts.map +1 -0
  236. package/dist/sdd/discovery/graph-builder.js +510 -0
  237. package/dist/sdd/discovery/graph-builder.js.map +1 -0
  238. package/dist/sdd/documentation/generator.d.ts +7 -0
  239. package/dist/sdd/documentation/generator.d.ts.map +1 -0
  240. package/dist/sdd/documentation/generator.js +119 -0
  241. package/dist/sdd/documentation/generator.js.map +1 -0
  242. package/dist/sdd/domain/types.d.ts +460 -0
  243. package/dist/sdd/domain/types.d.ts.map +1 -0
  244. package/dist/sdd/domain/types.js +25 -0
  245. package/dist/sdd/domain/types.js.map +1 -0
  246. package/dist/sdd/drift/detector.d.ts +28 -0
  247. package/dist/sdd/drift/detector.d.ts.map +1 -0
  248. package/dist/sdd/drift/detector.js +379 -0
  249. package/dist/sdd/drift/detector.js.map +1 -0
  250. package/dist/sdd/drift/exclusion.d.ts +54 -0
  251. package/dist/sdd/drift/exclusion.d.ts.map +1 -0
  252. package/dist/sdd/drift/exclusion.js +179 -0
  253. package/dist/sdd/drift/exclusion.js.map +1 -0
  254. package/dist/sdd/drift/signals.d.ts +52 -0
  255. package/dist/sdd/drift/signals.d.ts.map +1 -0
  256. package/dist/sdd/drift/signals.js +470 -0
  257. package/dist/sdd/drift/signals.js.map +1 -0
  258. package/dist/sdd/enforcement/interceptor.d.ts +47 -0
  259. package/dist/sdd/enforcement/interceptor.d.ts.map +1 -0
  260. package/dist/sdd/enforcement/interceptor.js +365 -0
  261. package/dist/sdd/enforcement/interceptor.js.map +1 -0
  262. package/dist/sdd/enforcement/workflow-tracker.d.ts +66 -0
  263. package/dist/sdd/enforcement/workflow-tracker.d.ts.map +1 -0
  264. package/dist/sdd/enforcement/workflow-tracker.js +229 -0
  265. package/dist/sdd/enforcement/workflow-tracker.js.map +1 -0
  266. package/dist/sdd/graph/engine.d.ts +44 -0
  267. package/dist/sdd/graph/engine.d.ts.map +1 -0
  268. package/dist/sdd/graph/engine.js +203 -0
  269. package/dist/sdd/graph/engine.js.map +1 -0
  270. package/dist/sdd/graph/index.d.ts +160 -0
  271. package/dist/sdd/graph/index.d.ts.map +1 -0
  272. package/dist/sdd/graph/index.js +624 -0
  273. package/dist/sdd/graph/index.js.map +1 -0
  274. package/dist/sdd/graph/integrity-guard.d.ts +129 -0
  275. package/dist/sdd/graph/integrity-guard.d.ts.map +1 -0
  276. package/dist/sdd/graph/integrity-guard.js +263 -0
  277. package/dist/sdd/graph/integrity-guard.js.map +1 -0
  278. package/dist/sdd/graph/integrity.d.ts +79 -0
  279. package/dist/sdd/graph/integrity.d.ts.map +1 -0
  280. package/dist/sdd/graph/integrity.js +462 -0
  281. package/dist/sdd/graph/integrity.js.map +1 -0
  282. package/dist/sdd/graph/pruner.d.ts +27 -0
  283. package/dist/sdd/graph/pruner.d.ts.map +1 -0
  284. package/dist/sdd/graph/pruner.js +203 -0
  285. package/dist/sdd/graph/pruner.js.map +1 -0
  286. package/dist/sdd/graph/traverse.d.ts +43 -0
  287. package/dist/sdd/graph/traverse.d.ts.map +1 -0
  288. package/dist/sdd/graph/traverse.js +265 -0
  289. package/dist/sdd/graph/traverse.js.map +1 -0
  290. package/dist/sdd/incidents/manager.d.ts +10 -0
  291. package/dist/sdd/incidents/manager.d.ts.map +1 -0
  292. package/dist/sdd/incidents/manager.js +63 -0
  293. package/dist/sdd/incidents/manager.js.map +1 -0
  294. package/dist/sdd/knowledge/transfer.d.ts +24 -0
  295. package/dist/sdd/knowledge/transfer.d.ts.map +1 -0
  296. package/dist/sdd/knowledge/transfer.js +94 -0
  297. package/dist/sdd/knowledge/transfer.js.map +1 -0
  298. package/dist/sdd/migrations/fixes.d.ts +2 -0
  299. package/dist/sdd/migrations/fixes.d.ts.map +1 -0
  300. package/dist/sdd/migrations/fixes.js +159 -0
  301. package/dist/sdd/migrations/fixes.js.map +1 -0
  302. package/dist/sdd/migrations/index.d.ts +2 -0
  303. package/dist/sdd/migrations/index.d.ts.map +1 -0
  304. package/dist/sdd/migrations/index.js +5 -0
  305. package/dist/sdd/migrations/index.js.map +1 -0
  306. package/dist/sdd/migrations/migration-runner.d.ts +41 -0
  307. package/dist/sdd/migrations/migration-runner.d.ts.map +1 -0
  308. package/dist/sdd/migrations/migration-runner.js +91 -0
  309. package/dist/sdd/migrations/migration-runner.js.map +1 -0
  310. package/dist/sdd/monitoring/setup.d.ts +40 -0
  311. package/dist/sdd/monitoring/setup.d.ts.map +1 -0
  312. package/dist/sdd/monitoring/setup.js +177 -0
  313. package/dist/sdd/monitoring/setup.js.map +1 -0
  314. package/dist/sdd/monitoring/telemetry.d.ts +18 -0
  315. package/dist/sdd/monitoring/telemetry.d.ts.map +1 -0
  316. package/dist/sdd/monitoring/telemetry.js +37 -0
  317. package/dist/sdd/monitoring/telemetry.js.map +1 -0
  318. package/dist/sdd/patterns/anti-patterns.d.ts +21 -0
  319. package/dist/sdd/patterns/anti-patterns.d.ts.map +1 -0
  320. package/dist/sdd/patterns/anti-patterns.js +286 -0
  321. package/dist/sdd/patterns/anti-patterns.js.map +1 -0
  322. package/dist/sdd/patterns/ast-clones.d.ts +23 -0
  323. package/dist/sdd/patterns/ast-clones.d.ts.map +1 -0
  324. package/dist/sdd/patterns/ast-clones.js +171 -0
  325. package/dist/sdd/patterns/ast-clones.js.map +1 -0
  326. package/dist/sdd/patterns/config-drift.d.ts +16 -0
  327. package/dist/sdd/patterns/config-drift.d.ts.map +1 -0
  328. package/dist/sdd/patterns/config-drift.js +322 -0
  329. package/dist/sdd/patterns/config-drift.js.map +1 -0
  330. package/dist/sdd/patterns/contradictions.d.ts +38 -0
  331. package/dist/sdd/patterns/contradictions.d.ts.map +1 -0
  332. package/dist/sdd/patterns/contradictions.js +237 -0
  333. package/dist/sdd/patterns/contradictions.js.map +1 -0
  334. package/dist/sdd/patterns/learner.d.ts +49 -0
  335. package/dist/sdd/patterns/learner.d.ts.map +1 -0
  336. package/dist/sdd/patterns/learner.js +226 -0
  337. package/dist/sdd/patterns/learner.js.map +1 -0
  338. package/dist/sdd/permissions/access.d.ts +69 -0
  339. package/dist/sdd/permissions/access.d.ts.map +1 -0
  340. package/dist/sdd/permissions/access.js +333 -0
  341. package/dist/sdd/permissions/access.js.map +1 -0
  342. package/dist/sdd/persistence/repository.d.ts +60 -0
  343. package/dist/sdd/persistence/repository.d.ts.map +1 -0
  344. package/dist/sdd/persistence/repository.js +96 -0
  345. package/dist/sdd/persistence/repository.js.map +1 -0
  346. package/dist/sdd/persistence/sqlite.d.ts +122 -0
  347. package/dist/sdd/persistence/sqlite.d.ts.map +1 -0
  348. package/dist/sdd/persistence/sqlite.js +602 -0
  349. package/dist/sdd/persistence/sqlite.js.map +1 -0
  350. package/dist/sdd/persistence/yaml.d.ts +41 -0
  351. package/dist/sdd/persistence/yaml.d.ts.map +1 -0
  352. package/dist/sdd/persistence/yaml.js +382 -0
  353. package/dist/sdd/persistence/yaml.js.map +1 -0
  354. package/dist/sdd/promises/classifier.d.ts +48 -0
  355. package/dist/sdd/promises/classifier.d.ts.map +1 -0
  356. package/dist/sdd/promises/classifier.js +215 -0
  357. package/dist/sdd/promises/classifier.js.map +1 -0
  358. package/dist/sdd/promises/tracker.d.ts +20 -0
  359. package/dist/sdd/promises/tracker.d.ts.map +1 -0
  360. package/dist/sdd/promises/tracker.js +204 -0
  361. package/dist/sdd/promises/tracker.js.map +1 -0
  362. package/dist/sdd/quality/scorer.d.ts +44 -0
  363. package/dist/sdd/quality/scorer.d.ts.map +1 -0
  364. package/dist/sdd/quality/scorer.js +216 -0
  365. package/dist/sdd/quality/scorer.js.map +1 -0
  366. package/dist/sdd/rollback/manager.d.ts +45 -0
  367. package/dist/sdd/rollback/manager.d.ts.map +1 -0
  368. package/dist/sdd/rollback/manager.js +266 -0
  369. package/dist/sdd/rollback/manager.js.map +1 -0
  370. package/dist/sdd/session/handoff.d.ts +52 -0
  371. package/dist/sdd/session/handoff.d.ts.map +1 -0
  372. package/dist/sdd/session/handoff.js +264 -0
  373. package/dist/sdd/session/handoff.js.map +1 -0
  374. package/dist/sdd/sla/tracker.d.ts +11 -0
  375. package/dist/sdd/sla/tracker.d.ts.map +1 -0
  376. package/dist/sdd/sla/tracker.js +52 -0
  377. package/dist/sdd/sla/tracker.js.map +1 -0
  378. package/dist/sdd/sync/git-sync.d.ts +61 -0
  379. package/dist/sdd/sync/git-sync.d.ts.map +1 -0
  380. package/dist/sdd/sync/git-sync.js +297 -0
  381. package/dist/sdd/sync/git-sync.js.map +1 -0
  382. package/dist/sdd/toggle/state.d.ts +8 -0
  383. package/dist/sdd/toggle/state.d.ts.map +1 -0
  384. package/dist/sdd/toggle/state.js +32 -0
  385. package/dist/sdd/toggle/state.js.map +1 -0
  386. package/dist/sdd/transactions/manager.d.ts +12 -0
  387. package/dist/sdd/transactions/manager.d.ts.map +1 -0
  388. package/dist/sdd/transactions/manager.js +80 -0
  389. package/dist/sdd/transactions/manager.js.map +1 -0
  390. package/dist/sdd/validation/coverage-index.d.ts +117 -0
  391. package/dist/sdd/validation/coverage-index.d.ts.map +1 -0
  392. package/dist/sdd/validation/coverage-index.js +251 -0
  393. package/dist/sdd/validation/coverage-index.js.map +1 -0
  394. package/dist/sdd/validation/executable.d.ts +26 -0
  395. package/dist/sdd/validation/executable.d.ts.map +1 -0
  396. package/dist/sdd/validation/executable.js +122 -0
  397. package/dist/sdd/validation/executable.js.map +1 -0
  398. package/dist/sdd/validation/smart-validator.d.ts +53 -0
  399. package/dist/sdd/validation/smart-validator.d.ts.map +1 -0
  400. package/dist/sdd/validation/smart-validator.js +347 -0
  401. package/dist/sdd/validation/smart-validator.js.map +1 -0
  402. package/dist/sdd/validation/validator.d.ts +39 -0
  403. package/dist/sdd/validation/validator.d.ts.map +1 -0
  404. package/dist/sdd/validation/validator.js +512 -0
  405. package/dist/sdd/validation/validator.js.map +1 -0
  406. package/dist/sdd/workflow/exporter.d.ts +36 -0
  407. package/dist/sdd/workflow/exporter.d.ts.map +1 -0
  408. package/dist/sdd/workflow/exporter.js +112 -0
  409. package/dist/sdd/workflow/exporter.js.map +1 -0
  410. package/dist/sdd/workflows/ab-testing.d.ts +18 -0
  411. package/dist/sdd/workflows/ab-testing.d.ts.map +1 -0
  412. package/dist/sdd/workflows/ab-testing.js +67 -0
  413. package/dist/sdd/workflows/ab-testing.js.map +1 -0
  414. package/dist/sdd/workflows/bug-fix.d.ts +13 -0
  415. package/dist/sdd/workflows/bug-fix.d.ts.map +1 -0
  416. package/dist/sdd/workflows/bug-fix.js +65 -0
  417. package/dist/sdd/workflows/bug-fix.js.map +1 -0
  418. package/dist/sdd/workflows/data-migration.d.ts +14 -0
  419. package/dist/sdd/workflows/data-migration.d.ts.map +1 -0
  420. package/dist/sdd/workflows/data-migration.js +68 -0
  421. package/dist/sdd/workflows/data-migration.js.map +1 -0
  422. package/dist/sdd/workflows/deprecation.d.ts +15 -0
  423. package/dist/sdd/workflows/deprecation.d.ts.map +1 -0
  424. package/dist/sdd/workflows/deprecation.js +68 -0
  425. package/dist/sdd/workflows/deprecation.js.map +1 -0
  426. package/dist/sdd/workflows/feature-flags.d.ts +14 -0
  427. package/dist/sdd/workflows/feature-flags.d.ts.map +1 -0
  428. package/dist/sdd/workflows/feature-flags.js +73 -0
  429. package/dist/sdd/workflows/feature-flags.js.map +1 -0
  430. package/dist/sdd/workflows/hotfix.d.ts +13 -0
  431. package/dist/sdd/workflows/hotfix.d.ts.map +1 -0
  432. package/dist/sdd/workflows/hotfix.js +67 -0
  433. package/dist/sdd/workflows/hotfix.js.map +1 -0
  434. package/dist/sdd/workflows/multi-tenancy.d.ts +13 -0
  435. package/dist/sdd/workflows/multi-tenancy.d.ts.map +1 -0
  436. package/dist/sdd/workflows/multi-tenancy.js +68 -0
  437. package/dist/sdd/workflows/multi-tenancy.js.map +1 -0
  438. package/dist/sdd/workflows/onboarding.d.ts +7 -0
  439. package/dist/sdd/workflows/onboarding.d.ts.map +1 -0
  440. package/dist/sdd/workflows/onboarding.js +43 -0
  441. package/dist/sdd/workflows/onboarding.js.map +1 -0
  442. package/dist/sdd/workflows/refactoring.d.ts +14 -0
  443. package/dist/sdd/workflows/refactoring.d.ts.map +1 -0
  444. package/dist/sdd/workflows/refactoring.js +73 -0
  445. package/dist/sdd/workflows/refactoring.js.map +1 -0
  446. package/dist/server/events.d.ts +64 -0
  447. package/dist/server/events.d.ts.map +1 -0
  448. package/dist/server/events.js +149 -0
  449. package/dist/server/events.js.map +1 -0
  450. package/dist/server/server.d.ts +33 -0
  451. package/dist/server/server.d.ts.map +1 -0
  452. package/dist/server/server.js +1019 -0
  453. package/dist/server/server.js.map +1 -0
  454. package/marketplace.json +39 -0
  455. package/package.json +65 -0
  456. package/src/code-intelligence/analyzer.ts +350 -0
  457. package/src/code-intelligence/ast/cache.ts +61 -0
  458. package/src/code-intelligence/ast/common.ts +62 -0
  459. package/src/code-intelligence/ast/component.ts +39 -0
  460. package/src/code-intelligence/ast/fallback.ts +44 -0
  461. package/src/code-intelligence/ast/index.ts +4 -0
  462. package/src/code-intelligence/ast/ir.ts +91 -0
  463. package/src/code-intelligence/ast/metrics.ts +65 -0
  464. package/src/code-intelligence/ast/registry.ts +28 -0
  465. package/src/code-intelligence/ast/tree-sitter.ts +226 -0
  466. package/src/code-intelligence/ast/typescript.ts +140 -0
  467. package/src/index.ts +22 -0
  468. package/src/mcp/server.ts +77 -0
  469. package/src/opencode/hooks.ts +728 -0
  470. package/src/opencode/router/categories.ts +192 -0
  471. package/src/opencode/router/embeddings.ts +149 -0
  472. package/src/opencode/router/graph-state-snapshot.ts +163 -0
  473. package/src/opencode/router/index.ts +44 -0
  474. package/src/opencode/router/intent-classifier.ts +140 -0
  475. package/src/opencode/router/semantic-nudge.ts +89 -0
  476. package/src/opencode/router/state-gate.ts +192 -0
  477. package/src/opencode/router/tool-embeddings.ts +162 -0
  478. package/src/opencode/router/tool-registry.ts +135 -0
  479. package/src/opencode/router/tool-taxonomy.ts +284 -0
  480. package/src/opencode/router/tools-composite.ts +685 -0
  481. package/src/opencode/shell-hooks.ts +115 -0
  482. package/src/opencode/system-prompt.ts +617 -0
  483. package/src/opencode/tools.ts +4102 -0
  484. package/src/opencode/workflows/chains.ts +205 -0
  485. package/src/opencode/workflows/executor.ts +172 -0
  486. package/src/opencode/workflows/index.ts +21 -0
  487. package/src/opencode/workflows/tools-workflow.ts +91 -0
  488. package/src/opencode/workflows/types.ts +42 -0
  489. package/src/sdd/analysis/compliance.ts +279 -0
  490. package/src/sdd/analysis/scalability.ts +97 -0
  491. package/src/sdd/analysis/security.ts +135 -0
  492. package/src/sdd/brownfield/scanner.ts +276 -0
  493. package/src/sdd/cache/manager.ts +899 -0
  494. package/src/sdd/cache/snapshot-store.ts +185 -0
  495. package/src/sdd/changes/manager.ts +326 -0
  496. package/src/sdd/cicd/generators.ts +1095 -0
  497. package/src/sdd/code-quality/complexity.ts +235 -0
  498. package/src/sdd/code-quality/conventions.ts +220 -0
  499. package/src/sdd/code-quality/dependencies.ts +203 -0
  500. package/src/sdd/code-quality/import-analyzer.ts +294 -0
  501. package/src/sdd/code-quality/metrics.ts +232 -0
  502. package/src/sdd/code-quality/smells.ts +415 -0
  503. package/src/sdd/code-quality/symbol-parser.ts +335 -0
  504. package/src/sdd/code-quality/usage-tracker.ts +527 -0
  505. package/src/sdd/code-quality/utils.ts +13 -0
  506. package/src/sdd/codegen/generator.ts +1181 -0
  507. package/src/sdd/constitution/validator.ts +253 -0
  508. package/src/sdd/cost/estimator.ts +147 -0
  509. package/src/sdd/coverage/tracker.ts +342 -0
  510. package/src/sdd/disaster/recovery.ts +79 -0
  511. package/src/sdd/discovery/adaptive.ts +167 -0
  512. package/src/sdd/discovery/briefing-analyzer.ts +802 -0
  513. package/src/sdd/discovery/briefing.ts +770 -0
  514. package/src/sdd/discovery/graph-builder.ts +598 -0
  515. package/src/sdd/documentation/generator.ts +158 -0
  516. package/src/sdd/domain/types.ts +658 -0
  517. package/src/sdd/drift/detector.ts +465 -0
  518. package/src/sdd/drift/exclusion.ts +223 -0
  519. package/src/sdd/drift/signals.ts +577 -0
  520. package/src/sdd/enforcement/interceptor.ts +444 -0
  521. package/src/sdd/enforcement/workflow-tracker.ts +263 -0
  522. package/src/sdd/graph/engine.ts +277 -0
  523. package/src/sdd/graph/index.ts +700 -0
  524. package/src/sdd/graph/integrity-guard.ts +348 -0
  525. package/src/sdd/graph/integrity.ts +628 -0
  526. package/src/sdd/graph/pruner.ts +221 -0
  527. package/src/sdd/graph/traverse.ts +331 -0
  528. package/src/sdd/incidents/manager.ts +87 -0
  529. package/src/sdd/knowledge/transfer.ts +140 -0
  530. package/src/sdd/migrations/fixes.ts +154 -0
  531. package/src/sdd/migrations/index.ts +14 -0
  532. package/src/sdd/migrations/migration-runner.ts +118 -0
  533. package/src/sdd/monitoring/setup.ts +237 -0
  534. package/src/sdd/monitoring/telemetry.ts +44 -0
  535. package/src/sdd/patterns/anti-patterns.ts +333 -0
  536. package/src/sdd/patterns/ast-clones.ts +214 -0
  537. package/src/sdd/patterns/config-drift.ts +346 -0
  538. package/src/sdd/patterns/contradictions.ts +323 -0
  539. package/src/sdd/patterns/learner.ts +266 -0
  540. package/src/sdd/permissions/access.ts +478 -0
  541. package/src/sdd/persistence/repository.ts +166 -0
  542. package/src/sdd/persistence/sqlite.ts +703 -0
  543. package/src/sdd/persistence/yaml.ts +409 -0
  544. package/src/sdd/promises/classifier.ts +253 -0
  545. package/src/sdd/promises/tracker.ts +258 -0
  546. package/src/sdd/quality/scorer.ts +263 -0
  547. package/src/sdd/rollback/manager.ts +361 -0
  548. package/src/sdd/session/handoff.ts +354 -0
  549. package/src/sdd/sla/tracker.ts +68 -0
  550. package/src/sdd/sync/git-sync.ts +401 -0
  551. package/src/sdd/toggle/state.ts +38 -0
  552. package/src/sdd/transactions/manager.ts +93 -0
  553. package/src/sdd/validation/coverage-index.ts +339 -0
  554. package/src/sdd/validation/executable.ts +127 -0
  555. package/src/sdd/validation/smart-validator.ts +470 -0
  556. package/src/sdd/validation/validator.ts +641 -0
  557. package/src/sdd/workflow/exporter.ts +169 -0
  558. package/src/sdd/workflows/ab-testing.ts +90 -0
  559. package/src/sdd/workflows/bug-fix.ts +81 -0
  560. package/src/sdd/workflows/data-migration.ts +86 -0
  561. package/src/sdd/workflows/deprecation.ts +87 -0
  562. package/src/sdd/workflows/feature-flags.ts +91 -0
  563. package/src/sdd/workflows/hotfix.ts +83 -0
  564. package/src/sdd/workflows/multi-tenancy.ts +84 -0
  565. package/src/sdd/workflows/onboarding.ts +82 -0
  566. package/src/sdd/workflows/refactoring.ts +90 -0
  567. package/src/server/events.ts +184 -0
  568. package/src/server/server.ts +1088 -0
@@ -0,0 +1,770 @@
1
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from "fs";
2
+ import { join, dirname } from "path";
3
+ import { createHash } from "crypto";
4
+ import { PerTypeGraphCache, IncrementalGraphHash } from "../graph/index.js";
5
+ import { getGraphSnapshotStore } from "./snapshot-store.js";
6
+ // ── Main Cache Manager ───────────────────────────────────────────────
7
+ const TOOL_RESPONSE_TTL = 5 * 60 * 1000; // 5 minutes
8
+ const ANALYSIS_TTL = 3 * 60 * 1000; // 3 minutes
9
+ const PERSISTENT_CACHE_FILE = ".sdd/cache.json";
10
+ const INVALIDATION_FILE = ".sdd/cache-invalidated.json";
11
+ export class CacheManager {
12
+ projectDir;
13
+ // In-memory caches
14
+ toolResponses = new Map();
15
+ analysisResults = new Map();
16
+ // Granular invalidation tracker
17
+ invalidation = {
18
+ lastFullInvalidation: 0,
19
+ dirtyTypes: new Set(),
20
+ dirtyNodeIds: new Set(),
21
+ dirtyRelTypes: new Set(),
22
+ version: 0,
23
+ };
24
+ // Version counter for lazy revalidation (F)
25
+ invalidationVersionOnWrite = 0;
26
+ // Per-type graph cache
27
+ graphCache = new PerTypeGraphCache();
28
+ // Incremental graph hash
29
+ graphHash = new IncrementalGraphHash();
30
+ // Statistics
31
+ stats = {
32
+ toolHits: 0,
33
+ toolMisses: 0,
34
+ analysisHits: 0,
35
+ analysisMisses: 0,
36
+ invalidations: 0,
37
+ };
38
+ constructor(projectDir) {
39
+ this.projectDir = projectDir;
40
+ this.loadInvalidationTracker();
41
+ this.invalidationVersionOnWrite = this.invalidation.version;
42
+ }
43
+ // ── Tool Response Cache ───────────────────────────────────────────
44
+ /**
45
+ * Get cached tool response if valid.
46
+ * Checks: TTL (using lastAccess for freshness), graph version, invalidation status.
47
+ * F: Uses lazy revalidation — checks version before clearing.
48
+ */
49
+ getToolResponse(toolName, args, graphVersion) {
50
+ const key = this.toolCacheKey(toolName, args);
51
+ const entry = this.toolResponses.get(key);
52
+ if (!entry) {
53
+ this.stats.toolMisses++;
54
+ return null;
55
+ }
56
+ // F: Lazy revalidation — if invalidation version changed, check if this entry is affected
57
+ if (this.invalidation.version !== this.invalidationVersionOnWrite) {
58
+ if (this.isToolAffectedByInvalidation(toolName, entry.argsHash)) {
59
+ this.toolResponses.delete(key);
60
+ this.clearDirtyTypesForTool(toolName);
61
+ this.stats.toolMisses++;
62
+ return null;
63
+ }
64
+ }
65
+ // B: Check TTL using lastAccess (not timestamp) — entries accessed recently survive restore
66
+ const effectiveAge = Date.now() - (entry.lastAccess || entry.timestamp);
67
+ if (effectiveAge > TOOL_RESPONSE_TTL) {
68
+ this.toolResponses.delete(key);
69
+ this.stats.toolMisses++;
70
+ return null;
71
+ }
72
+ // Check graph version consistency
73
+ if (entry.graphVersion !== graphVersion) {
74
+ this.toolResponses.delete(key);
75
+ this.stats.toolMisses++;
76
+ return null;
77
+ }
78
+ // Update access stats — refresh lastAccess on hit
79
+ entry.lastAccess = Date.now();
80
+ this.stats.toolHits++;
81
+ return entry.response;
82
+ }
83
+ /**
84
+ * Cache a tool response.
85
+ */
86
+ setToolResponse(toolName, args, response, graphVersion) {
87
+ const key = this.toolCacheKey(toolName, args);
88
+ const now = Date.now();
89
+ this.toolResponses.set(key, {
90
+ response,
91
+ timestamp: now,
92
+ lastAccess: now,
93
+ toolName,
94
+ argsHash: this.toolCacheKey(toolName, args).split(':')[1] || '',
95
+ graphVersion,
96
+ });
97
+ // Evict old entries if cache is too large
98
+ if (this.toolResponses.size > 200) {
99
+ this.evictOldestToolEntries(50);
100
+ }
101
+ }
102
+ // ── Analysis Result Cache ─────────────────────────────────────────
103
+ /**
104
+ * Get cached analysis result (validate, drift, quality, etc.).
105
+ * Revalidates based on graph state.
106
+ * F: Uses lazy revalidation.
107
+ */
108
+ getAnalysisResult(type, graphVersion, nodeCount) {
109
+ const key = `analysis:${type}`;
110
+ const entry = this.analysisResults.get(key);
111
+ if (!entry) {
112
+ this.stats.analysisMisses++;
113
+ return null;
114
+ }
115
+ // F: Lazy revalidation
116
+ if (this.invalidation.version !== this.invalidationVersionOnWrite) {
117
+ if (this.isAnalysisAffectedByInvalidation(type)) {
118
+ this.analysisResults.delete(key);
119
+ this.clearDirtyTypesForAnalysis(type);
120
+ this.stats.analysisMisses++;
121
+ return null;
122
+ }
123
+ }
124
+ // B: Check TTL using lastAccess
125
+ const effectiveAge = Date.now() - (entry.lastAccess || entry.timestamp);
126
+ if (effectiveAge > ANALYSIS_TTL) {
127
+ this.analysisResults.delete(key);
128
+ this.stats.analysisMisses++;
129
+ return null;
130
+ }
131
+ // Revalidation: if graph changed since analysis, invalidate
132
+ if (entry.graphVersion !== graphVersion || entry.nodeCount !== nodeCount) {
133
+ this.analysisResults.delete(key);
134
+ this.stats.analysisMisses++;
135
+ return null;
136
+ }
137
+ // Update lastAccess
138
+ entry.lastAccess = Date.now();
139
+ this.stats.analysisHits++;
140
+ return entry.result;
141
+ }
142
+ /**
143
+ * Cache an analysis result.
144
+ */
145
+ setAnalysisResult(type, result, graphVersion, nodeCount) {
146
+ const key = `analysis:${type}`;
147
+ const now = Date.now();
148
+ this.analysisResults.set(key, {
149
+ result,
150
+ timestamp: now,
151
+ lastAccess: now,
152
+ graphVersion,
153
+ nodeCount,
154
+ type,
155
+ });
156
+ }
157
+ // ── Granular Invalidation ─────────────────────────────────────────
158
+ /**
159
+ * Mark specific node IDs as dirty.
160
+ */
161
+ invalidateNodeIds(ids) {
162
+ for (const id of ids) {
163
+ this.invalidation.dirtyNodeIds.add(id);
164
+ }
165
+ this.invalidation.version++;
166
+ this.saveInvalidationTracker();
167
+ }
168
+ /**
169
+ * Mark specific relationship types as dirty.
170
+ */
171
+ invalidateRelTypes(types) {
172
+ for (const type of types) {
173
+ this.invalidation.dirtyRelTypes.add(type);
174
+ }
175
+ this.invalidation.version++;
176
+ this.saveInvalidationTracker();
177
+ }
178
+ /**
179
+ * Full invalidation: clear everything.
180
+ * Now reserved only for explicit reset (H) or major structural changes.
181
+ */
182
+ invalidateAll() {
183
+ this.toolResponses.clear();
184
+ this.analysisResults.clear();
185
+ this.graphCache.invalidateAll();
186
+ this.invalidation.lastFullInvalidation = Date.now();
187
+ this.invalidation.dirtyTypes.clear();
188
+ this.invalidation.dirtyNodeIds.clear();
189
+ this.invalidation.dirtyRelTypes.clear();
190
+ this.invalidation.version++;
191
+ this.stats.invalidations++;
192
+ this.saveInvalidationTracker();
193
+ }
194
+ /**
195
+ * Partial invalidation: clear only affected caches.
196
+ * A: Much faster than full invalidation for targeted changes.
197
+ * Called by repositories after saveGraph() with the dirty types.
198
+ */
199
+ invalidatePartial(changedNodeTypes, changedRelTypes = []) {
200
+ // Invalidate tool responses that depend on changed types
201
+ for (const [key, entry] of this.toolResponses) {
202
+ if (this.doesToolDependOnTypes(key, changedNodeTypes, changedRelTypes)) {
203
+ this.toolResponses.delete(key);
204
+ }
205
+ }
206
+ // Invalidate analysis results that depend on changed types
207
+ for (const [key, entry] of this.analysisResults) {
208
+ if (this.doesAnalysisDependOnTypes(key, changedNodeTypes, changedRelTypes)) {
209
+ this.analysisResults.delete(key);
210
+ }
211
+ }
212
+ // Track dirty types
213
+ this.invalidateNodeTypes(changedNodeTypes);
214
+ this.invalidateRelTypes(changedRelTypes);
215
+ }
216
+ /**
217
+ * Invalidate specific node IDs (e.g., when a node is updated).
218
+ */
219
+ invalidateNodeId(nodeId, nodeType) {
220
+ // Invalidate tool responses that mention this node
221
+ for (const [key, entry] of this.toolResponses) {
222
+ if (entry.response.includes(nodeId)) {
223
+ this.toolResponses.delete(key);
224
+ }
225
+ }
226
+ // Invalidate analysis results for this node type
227
+ const analysisTypes = this.getAnalysisTypesForNodeType(nodeType);
228
+ for (const type of analysisTypes) {
229
+ this.analysisResults.delete(`analysis:${type}`);
230
+ }
231
+ this.invalidation.dirtyNodeIds.add(nodeId);
232
+ this.invalidation.dirtyTypes.add(nodeType);
233
+ this.invalidation.version++;
234
+ this.saveInvalidationTracker();
235
+ }
236
+ // ── Persistent Cache (Cross-Session) ──────────────────────────────
237
+ /**
238
+ * Load persistent cache from disk.
239
+ */
240
+ loadPersistentCache() {
241
+ const path = join(this.projectDir, PERSISTENT_CACHE_FILE);
242
+ if (!existsSync(path))
243
+ return null;
244
+ try {
245
+ const data = JSON.parse(readFileSync(path, "utf-8"));
246
+ // Check if persistent cache is too old (>1 hour)
247
+ if (Date.now() - (data.timestamp || 0) > 60 * 60 * 1000) {
248
+ return null;
249
+ }
250
+ return data;
251
+ }
252
+ catch {
253
+ return null;
254
+ }
255
+ }
256
+ /**
257
+ * Save persistent cache to disk.
258
+ */
259
+ savePersistentCache(data) {
260
+ const path = join(this.projectDir, PERSISTENT_CACHE_FILE);
261
+ const dir = dirname(path);
262
+ if (!existsSync(dir))
263
+ mkdirSync(dir, { recursive: true });
264
+ writeFileSync(path, JSON.stringify({ ...data, timestamp: Date.now() }, null, 2));
265
+ }
266
+ /**
267
+ * Restore tool responses from persistent cache.
268
+ * B: Uses lastAccess for TTL check so recently-accessed entries survive restore.
269
+ */
270
+ restoreFromPersistentCache() {
271
+ const persistent = this.loadPersistentCache();
272
+ if (!persistent)
273
+ return 0;
274
+ let restored = 0;
275
+ for (const [key, entry] of Object.entries(persistent.toolResponses)) {
276
+ // B: Use lastAccess for freshness check — entries accessed recently are valid
277
+ const effectiveAge = Date.now() - (entry.lastAccess || entry.timestamp);
278
+ if (effectiveAge < TOOL_RESPONSE_TTL) {
279
+ this.toolResponses.set(key, {
280
+ response: entry.response,
281
+ timestamp: entry.timestamp,
282
+ lastAccess: entry.lastAccess || entry.timestamp,
283
+ toolName: entry.toolName,
284
+ argsHash: entry.argsHash,
285
+ graphVersion: entry.graphVersion,
286
+ });
287
+ restored++;
288
+ }
289
+ }
290
+ for (const [key, entry] of Object.entries(persistent.analysisResults)) {
291
+ const effectiveAge = Date.now() - (entry.lastAccess || entry.timestamp);
292
+ if (effectiveAge < ANALYSIS_TTL) {
293
+ this.analysisResults.set(key, {
294
+ result: entry.result,
295
+ timestamp: entry.timestamp,
296
+ lastAccess: entry.lastAccess || entry.timestamp,
297
+ graphVersion: entry.graphVersion,
298
+ nodeCount: entry.nodeCount,
299
+ type: key.replace("analysis:", ""),
300
+ });
301
+ restored++;
302
+ }
303
+ }
304
+ return restored;
305
+ }
306
+ /**
307
+ * Persist current cache to disk.
308
+ */
309
+ persistToDisk() {
310
+ const toolResponses = {};
311
+ for (const [key, entry] of this.toolResponses) {
312
+ toolResponses[key] = {
313
+ response: entry.response,
314
+ timestamp: entry.timestamp,
315
+ lastAccess: entry.lastAccess,
316
+ toolName: entry.toolName,
317
+ argsHash: entry.argsHash,
318
+ graphVersion: entry.graphVersion,
319
+ };
320
+ }
321
+ const analysisResults = {};
322
+ for (const [key, entry] of this.analysisResults) {
323
+ analysisResults[key] = {
324
+ result: entry.result,
325
+ timestamp: entry.timestamp,
326
+ lastAccess: entry.lastAccess,
327
+ graphVersion: entry.graphVersion,
328
+ nodeCount: entry.nodeCount,
329
+ type: key.replace("analysis:", ""),
330
+ };
331
+ }
332
+ this.savePersistentCache({
333
+ version: 2,
334
+ toolResponses,
335
+ analysisResults,
336
+ graphSnapshot: null,
337
+ graphHash: this.graphHash.getHash(),
338
+ });
339
+ }
340
+ /**
341
+ * Save graph snapshot to disk (G).
342
+ * Called after graph mutations and on dispose.
343
+ */
344
+ saveGraphSnapshot(graph) {
345
+ try {
346
+ const store = getGraphSnapshotStore(this.projectDir);
347
+ store.save(graph, this.graphHash.getHash());
348
+ }
349
+ catch { }
350
+ }
351
+ /**
352
+ * Load graph snapshot from disk (G).
353
+ * Returns null if no valid snapshot exists.
354
+ */
355
+ loadGraphSnapshot() {
356
+ try {
357
+ const store = getGraphSnapshotStore(this.projectDir);
358
+ return store.load();
359
+ }
360
+ catch {
361
+ return null;
362
+ }
363
+ }
364
+ /**
365
+ * Invalidate graph snapshot on disk.
366
+ */
367
+ invalidateGraphSnapshot() {
368
+ try {
369
+ const store = getGraphSnapshotStore(this.projectDir);
370
+ store.invalidate();
371
+ }
372
+ catch { }
373
+ }
374
+ // ── Cross-Process Shared Cache ────────────────────────────────────
375
+ /**
376
+ * D: Check if another process has modified the graph since our last read.
377
+ * Uses file-based locking + PID liveness check for robust cross-process coordination.
378
+ */
379
+ checkCrossProcessInvalidation(graphPath) {
380
+ const lockPath = join(this.projectDir, ".sdd", ".cache-lock");
381
+ try {
382
+ if (existsSync(lockPath)) {
383
+ const lockData = JSON.parse(readFileSync(lockPath, "utf-8"));
384
+ // D: If lock is older than 30 seconds, check if the process is still alive
385
+ if (Date.now() - lockData.timestamp > 30000) {
386
+ // D: If the locking process is dead, treat as invalidation needed
387
+ if (lockData.pid && lockData.pid !== process.pid) {
388
+ try {
389
+ process.kill(lockData.pid, 0); // Signal 0 = check if alive
390
+ // Process is alive but lock is stale — another process is slow, ignore
391
+ return false;
392
+ }
393
+ catch {
394
+ // Process is dead — force invalidation
395
+ this.invalidation.lastFullInvalidation = Date.now();
396
+ this.invalidation.version++;
397
+ return true;
398
+ }
399
+ }
400
+ return false; // Stale lock from same process or no PID
401
+ }
402
+ // If another process wrote after our last read
403
+ if (lockData.timestamp > (this.invalidation.lastFullInvalidation || 0)) {
404
+ return true;
405
+ }
406
+ }
407
+ }
408
+ catch { }
409
+ return false;
410
+ }
411
+ /**
412
+ * Acquire cross-process lock before writing.
413
+ */
414
+ acquireWriteLock() {
415
+ const lockPath = join(this.projectDir, ".sdd", ".cache-lock");
416
+ const dir = dirname(lockPath);
417
+ if (!existsSync(dir))
418
+ mkdirSync(dir, { recursive: true });
419
+ try {
420
+ // Try to create lock file
421
+ if (existsSync(lockPath)) {
422
+ const existing = JSON.parse(readFileSync(lockPath, "utf-8"));
423
+ // If lock is stale (>30s), override it
424
+ if (Date.now() - existing.timestamp > 30000) {
425
+ // Stale lock, ok to override
426
+ }
427
+ else if (existing.pid !== process.pid) {
428
+ return false; // Another process holds the lock
429
+ }
430
+ }
431
+ writeFileSync(lockPath, JSON.stringify({
432
+ pid: process.pid,
433
+ timestamp: Date.now(),
434
+ }));
435
+ return true;
436
+ }
437
+ catch {
438
+ return false;
439
+ }
440
+ }
441
+ /**
442
+ * Release cross-process lock.
443
+ */
444
+ releaseWriteLock() {
445
+ const lockPath = join(this.projectDir, ".sdd", ".cache-lock");
446
+ try {
447
+ if (existsSync(lockPath)) {
448
+ const lockData = JSON.parse(readFileSync(lockPath, "utf-8"));
449
+ if (lockData.pid === process.pid) {
450
+ unlinkSync(lockPath);
451
+ }
452
+ }
453
+ }
454
+ catch { }
455
+ }
456
+ // ── Full Reset (H) ───────────────────────────────────────────────
457
+ /**
458
+ * H: Full cache reset — clears everything in memory and on disk.
459
+ * Used by /sdd cache reset command.
460
+ */
461
+ fullReset() {
462
+ // Clear in-memory
463
+ this.toolResponses.clear();
464
+ this.analysisResults.clear();
465
+ this.graphCache.invalidateAll();
466
+ // Reset invalidation tracker
467
+ this.invalidation.lastFullInvalidation = Date.now();
468
+ this.invalidation.dirtyTypes.clear();
469
+ this.invalidation.dirtyNodeIds.clear();
470
+ this.invalidation.dirtyRelTypes.clear();
471
+ this.invalidation.version++;
472
+ this.stats.invalidations++;
473
+ this.saveInvalidationTracker();
474
+ // Clear persistent cache on disk
475
+ let disk = false;
476
+ try {
477
+ const cachePath = join(this.projectDir, PERSISTENT_CACHE_FILE);
478
+ if (existsSync(cachePath)) {
479
+ unlinkSync(cachePath);
480
+ disk = true;
481
+ }
482
+ }
483
+ catch { }
484
+ // Clear graph snapshot (G)
485
+ let snapshot = false;
486
+ try {
487
+ const store = getGraphSnapshotStore(this.projectDir);
488
+ if (store.isValid()) {
489
+ store.invalidate();
490
+ snapshot = true;
491
+ }
492
+ }
493
+ catch { }
494
+ // Release lock
495
+ let lock = false;
496
+ try {
497
+ const lockPath = join(this.projectDir, ".sdd", ".cache-lock");
498
+ if (existsSync(lockPath)) {
499
+ this.releaseWriteLock();
500
+ lock = true;
501
+ }
502
+ }
503
+ catch { }
504
+ return { cleared: { memory: true, disk, snapshot, lock } };
505
+ }
506
+ /**
507
+ * Get current invalidation version (for external checks).
508
+ */
509
+ getInvalidationVersion() {
510
+ return this.invalidation.version;
511
+ }
512
+ /**
513
+ * Sync invalidation version after external write.
514
+ */
515
+ syncInvalidationVersion() {
516
+ this.invalidationVersionOnWrite = this.invalidation.version;
517
+ }
518
+ // ── Per-Type Graph Cache ──────────────────────────────────────────
519
+ /**
520
+ * Get cached nodes for a specific type.
521
+ * Only returns if the cache version matches.
522
+ */
523
+ getCachedNodesByType(type, graphVersion) {
524
+ return this.graphCache.getNodesByType(type, graphVersion);
525
+ }
526
+ /**
527
+ * Cache nodes for a specific type.
528
+ */
529
+ setCachedNodesByType(type, nodes, graphVersion) {
530
+ this.graphCache.setType(type, nodes, graphVersion);
531
+ }
532
+ /**
533
+ * Invalidate cache for a specific node type only.
534
+ * Other types remain cached.
535
+ */
536
+ invalidateNodeType(type) {
537
+ this.graphCache.invalidateType(type);
538
+ this.invalidateNodeTypes([type]);
539
+ }
540
+ /**
541
+ * Invalidate cache for multiple node types.
542
+ */
543
+ invalidateNodeTypes(types) {
544
+ for (const type of types) {
545
+ this.invalidation.dirtyTypes.add(type);
546
+ this.graphCache.invalidateType(type);
547
+ }
548
+ this.invalidation.version++;
549
+ this.saveInvalidationTracker();
550
+ }
551
+ /**
552
+ * Get cached relationships.
553
+ */
554
+ getCachedRelationships(graphVersion) {
555
+ return this.graphCache.getRelationships(graphVersion);
556
+ }
557
+ /**
558
+ * Cache relationships.
559
+ */
560
+ setCachedRelationships(rels, graphVersion) {
561
+ this.graphCache.setRelationships(rels, graphVersion);
562
+ }
563
+ // ── Incremental Graph Hash ────────────────────────────────────────
564
+ /**
565
+ * Initialize the incremental hash from graph state.
566
+ */
567
+ initGraphHash(nodeCount, relCount) {
568
+ this.graphHash.initialize(nodeCount, relCount);
569
+ }
570
+ /**
571
+ * Record a node mutation for incremental hash.
572
+ */
573
+ recordNodeMutation(delta = 0) {
574
+ this.graphHash.recordNodeCountChange(delta);
575
+ }
576
+ /**
577
+ * Record a relationship mutation for incremental hash.
578
+ */
579
+ recordRelMutation(delta = 0) {
580
+ this.graphHash.recordRelCountChange(delta);
581
+ }
582
+ /**
583
+ * Get current graph hash.
584
+ */
585
+ getGraphHash() {
586
+ return this.graphHash.getHash();
587
+ }
588
+ /**
589
+ * Check if graph hash matches.
590
+ */
591
+ isGraphHashValid(expectedHash) {
592
+ return this.graphHash.matches(expectedHash);
593
+ }
594
+ /**
595
+ * Get current node count from incremental hash.
596
+ */
597
+ getNodeCountFromHash() {
598
+ return this.graphHash.getNodeCount();
599
+ }
600
+ // ── Statistics ────────────────────────────────────────────────────
601
+ getStats() {
602
+ return {
603
+ ...this.stats,
604
+ toolCacheSize: this.toolResponses.size,
605
+ analysisCacheSize: this.analysisResults.size,
606
+ invalidationVersion: this.invalidation.version,
607
+ hitRate: this.stats.toolHits + this.stats.toolMisses > 0
608
+ ? (this.stats.toolHits / (this.stats.toolHits + this.stats.toolMisses) * 100).toFixed(1) + "%"
609
+ : "0%",
610
+ analysisHitRate: this.stats.analysisHits + this.stats.analysisMisses > 0
611
+ ? (this.stats.analysisHits / (this.stats.analysisHits + this.stats.analysisMisses) * 100).toFixed(1) + "%"
612
+ : "0%",
613
+ };
614
+ }
615
+ // ── Private Helpers ───────────────────────────────────────────────
616
+ toolCacheKey(toolName, args) {
617
+ const argsStr = JSON.stringify(args, Object.keys(args).sort());
618
+ const argsHash = createHash("md5").update(argsStr).digest("hex").slice(0, 8);
619
+ return `${toolName}:${argsHash}`;
620
+ }
621
+ isToolAffectedByInvalidation(toolName, argsHash) {
622
+ // Check if the tool's dependent types have been invalidated
623
+ const dependentTypes = this.getToolDependentTypes(toolName);
624
+ for (const type of dependentTypes) {
625
+ if (this.invalidation.dirtyTypes.has(type))
626
+ return true;
627
+ }
628
+ return false;
629
+ }
630
+ isAnalysisAffectedByInvalidation(analysisType) {
631
+ const dependentTypes = this.getAnalysisDependentTypes(analysisType);
632
+ for (const type of dependentTypes) {
633
+ if (this.invalidation.dirtyTypes.has(type))
634
+ return true;
635
+ }
636
+ return false;
637
+ }
638
+ /**
639
+ * Clear dirty types that are relevant to a specific analysis type.
640
+ * Called after the analysis cache entry has been invalidated due to dirty types.
641
+ * This allows the cache to work again after the analysis is recomputed.
642
+ */
643
+ clearDirtyTypesForAnalysis(analysisType) {
644
+ const dependentTypes = this.getAnalysisDependentTypes(analysisType);
645
+ for (const type of dependentTypes) {
646
+ this.invalidation.dirtyTypes.delete(type);
647
+ }
648
+ this.invalidation.version++;
649
+ }
650
+ /**
651
+ * Clear dirty types that are relevant to a specific tool.
652
+ */
653
+ clearDirtyTypesForTool(toolName) {
654
+ const dependentTypes = this.getToolDependentTypes(toolName);
655
+ for (const type of dependentTypes) {
656
+ this.invalidation.dirtyTypes.delete(type);
657
+ }
658
+ this.invalidation.version++;
659
+ }
660
+ getToolDependentTypes(toolName) {
661
+ const map = {
662
+ "sdd.query_graph": [], // depends on any type
663
+ "sdd.list_nodes": [], // depends on queried type
664
+ "sdd.get_nodes_by_status": [],
665
+ "sdd.count_nodes": [],
666
+ "sdd.inspect": [],
667
+ "sdd.validate": ["feature", "requirement", "entity", "api", "endpoint", "table", "task", "test", "change", "constitution", "business_rule"],
668
+ "sdd.detect_drift": ["file", "task", "change", "entity", "api"],
669
+ "sdd.quality": ["feature", "requirement", "entity", "api", "endpoint", "task", "test", "change", "constitution", "business_rule"],
670
+ "sdd.anti_patterns": ["feature", "requirement", "entity", "change", "task", "test"],
671
+ "sdd.contradictions": ["requirement", "business_rule", "constraint"],
672
+ "sdd.coverage": ["requirement", "test"],
673
+ "sdd.analyze_impact": [],
674
+ "sdd.get_context": [],
675
+ "sdd.pending_changes": ["change"],
676
+ "sdd.session_handoff": ["change", "decision"],
677
+ };
678
+ return map[toolName] || [];
679
+ }
680
+ getAnalysisDependentTypes(analysisType) {
681
+ const map = {
682
+ "validate": ["feature", "requirement", "entity", "api", "endpoint", "table", "task", "test", "change", "constitution", "business_rule"],
683
+ "drift": ["file", "task", "change", "entity", "api"],
684
+ "quality": ["feature", "requirement", "entity", "api", "endpoint", "task", "test", "change", "constitution", "business_rule"],
685
+ "anti_patterns": ["feature", "requirement", "entity", "change", "task", "test"],
686
+ "contradictions": ["requirement", "business_rule", "constraint"],
687
+ "coverage": ["requirement", "test"],
688
+ "constitution": ["constitution", "feature", "requirement", "entity", "business_rule"],
689
+ "promises": ["requirement", "business_rule"],
690
+ "integrity": [],
691
+ };
692
+ return map[analysisType] || [];
693
+ }
694
+ getAnalysisTypesForNodeType(nodeType) {
695
+ const map = {
696
+ "feature": ["validate", "quality", "anti_patterns"],
697
+ "requirement": ["validate", "quality", "coverage", "promises", "constitution"],
698
+ "entity": ["validate", "quality", "drift"],
699
+ "endpoint": ["validate", "quality"],
700
+ "api": ["validate", "quality"],
701
+ "business_rule": ["validate", "quality", "contradictions", "promises"],
702
+ "change": ["validate", "quality", "anti_patterns"],
703
+ "task": ["validate", "quality", "drift"],
704
+ "test": ["validate", "quality", "coverage"],
705
+ "file": ["drift"],
706
+ "constitution": ["validate", "constitution"],
707
+ "constraint": ["contradictions"],
708
+ };
709
+ return map[nodeType] || [];
710
+ }
711
+ doesToolDependOnTypes(key, types, relTypes) {
712
+ const toolName = key.split(":")[0];
713
+ const depTypes = this.getToolDependentTypes(toolName);
714
+ if (depTypes.length === 0)
715
+ return true; // Unknown dependency, invalidate to be safe
716
+ return types.some(t => depTypes.includes(t));
717
+ }
718
+ doesAnalysisDependOnTypes(key, types, relTypes) {
719
+ const analysisType = key.replace("analysis:", "");
720
+ const depTypes = this.getAnalysisDependentTypes(analysisType);
721
+ if (depTypes.length === 0)
722
+ return true;
723
+ return types.some(t => depTypes.includes(t));
724
+ }
725
+ evictOldestToolEntries(count) {
726
+ const entries = [...this.toolResponses.entries()]
727
+ .sort((a, b) => (a[1].lastAccess || a[1].timestamp) - (b[1].lastAccess || b[1].timestamp));
728
+ for (let i = 0; i < count && i < entries.length; i++) {
729
+ this.toolResponses.delete(entries[i][0]);
730
+ }
731
+ }
732
+ loadInvalidationTracker() {
733
+ const path = join(this.projectDir, INVALIDATION_FILE);
734
+ if (!existsSync(path))
735
+ return;
736
+ try {
737
+ const data = JSON.parse(readFileSync(path, "utf-8"));
738
+ this.invalidation.lastFullInvalidation = data.lastFullInvalidation || 0;
739
+ this.invalidation.version = data.version || 0;
740
+ this.invalidation.dirtyTypes = new Set(data.dirtyTypes || []);
741
+ this.invalidation.dirtyNodeIds = new Set(data.dirtyNodeIds || []);
742
+ this.invalidation.dirtyRelTypes = new Set(data.dirtyRelTypes || []);
743
+ }
744
+ catch { }
745
+ }
746
+ saveInvalidationTracker() {
747
+ const path = join(this.projectDir, INVALIDATION_FILE);
748
+ const dir = dirname(path);
749
+ if (!existsSync(dir))
750
+ mkdirSync(dir, { recursive: true });
751
+ writeFileSync(path, JSON.stringify({
752
+ lastFullInvalidation: this.invalidation.lastFullInvalidation,
753
+ version: this.invalidation.version,
754
+ dirtyTypes: [...this.invalidation.dirtyTypes],
755
+ dirtyNodeIds: [...this.invalidation.dirtyNodeIds],
756
+ dirtyRelTypes: [...this.invalidation.dirtyRelTypes],
757
+ }));
758
+ }
759
+ }
760
+ // ── Singleton per project ────────────────────────────────────────────
761
+ const instances = new Map();
762
+ export function getCacheManager(projectDir) {
763
+ let instance = instances.get(projectDir);
764
+ if (!instance) {
765
+ instance = new CacheManager(projectDir);
766
+ instances.set(projectDir, instance);
767
+ }
768
+ return instance;
769
+ }
770
+ //# sourceMappingURL=manager.js.map