contextpro-mcp 0.0.0-stage → 1.5.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 (466) hide show
  1. package/CHANGELOG.md +425 -0
  2. package/INSTALL.md +218 -0
  3. package/INSTRUCTIONS.md +33 -0
  4. package/LICENSE +21 -0
  5. package/NOTICE +12 -0
  6. package/README.md +89 -2
  7. package/SECURITY.md +29 -0
  8. package/agent-guide.md +354 -0
  9. package/agent-instructions.md +1 -0
  10. package/build/core/agent-setup.d.ts +5 -0
  11. package/build/core/agent-setup.d.ts.map +1 -0
  12. package/build/core/agent-setup.js +95 -0
  13. package/build/core/agent-setup.js.map +1 -0
  14. package/build/core/artifacts.d.ts +64 -0
  15. package/build/core/artifacts.d.ts.map +1 -0
  16. package/build/core/artifacts.js +370 -0
  17. package/build/core/artifacts.js.map +1 -0
  18. package/build/core/bounded-source.d.ts +15 -0
  19. package/build/core/bounded-source.d.ts.map +1 -0
  20. package/build/core/bounded-source.js +78 -0
  21. package/build/core/bounded-source.js.map +1 -0
  22. package/build/core/changed-since.d.ts +20 -0
  23. package/build/core/changed-since.d.ts.map +1 -0
  24. package/build/core/changed-since.js +43 -0
  25. package/build/core/changed-since.js.map +1 -0
  26. package/build/core/chat-model.d.ts +8 -0
  27. package/build/core/chat-model.d.ts.map +1 -0
  28. package/build/core/chat-model.js +135 -0
  29. package/build/core/chat-model.js.map +1 -0
  30. package/build/core/clustering.d.ts +6 -0
  31. package/build/core/clustering.d.ts.map +1 -0
  32. package/build/core/clustering.js +201 -0
  33. package/build/core/clustering.js.map +1 -0
  34. package/build/core/context-metadata.d.ts +50 -0
  35. package/build/core/context-metadata.d.ts.map +1 -0
  36. package/build/core/context-metadata.js +118 -0
  37. package/build/core/context-metadata.js.map +1 -0
  38. package/build/core/data-dir.d.ts +5 -0
  39. package/build/core/data-dir.d.ts.map +1 -0
  40. package/build/core/data-dir.js +61 -0
  41. package/build/core/data-dir.js.map +1 -0
  42. package/build/core/db-native.d.ts +28 -0
  43. package/build/core/db-native.d.ts.map +1 -0
  44. package/build/core/db-native.js +120 -0
  45. package/build/core/db-native.js.map +1 -0
  46. package/build/core/db.d.ts +294 -0
  47. package/build/core/db.d.ts.map +1 -0
  48. package/build/core/db.js +1047 -0
  49. package/build/core/db.js.map +1 -0
  50. package/build/core/doctor.d.ts +13 -0
  51. package/build/core/doctor.d.ts.map +1 -0
  52. package/build/core/doctor.js +55 -0
  53. package/build/core/doctor.js.map +1 -0
  54. package/build/core/efficiency.d.ts +16 -0
  55. package/build/core/efficiency.d.ts.map +1 -0
  56. package/build/core/efficiency.js +170 -0
  57. package/build/core/efficiency.js.map +1 -0
  58. package/build/core/embedding-tracker.d.ts +25 -0
  59. package/build/core/embedding-tracker.d.ts.map +1 -0
  60. package/build/core/embedding-tracker.js +228 -0
  61. package/build/core/embedding-tracker.js.map +1 -0
  62. package/build/core/embeddings.d.ts +90 -0
  63. package/build/core/embeddings.d.ts.map +1 -0
  64. package/build/core/embeddings.js +693 -0
  65. package/build/core/embeddings.js.map +1 -0
  66. package/build/core/evidence-state.d.ts +42 -0
  67. package/build/core/evidence-state.d.ts.map +1 -0
  68. package/build/core/evidence-state.js +153 -0
  69. package/build/core/evidence-state.js.map +1 -0
  70. package/build/core/extractor-stamp.d.ts +10 -0
  71. package/build/core/extractor-stamp.d.ts.map +1 -0
  72. package/build/core/extractor-stamp.js +51 -0
  73. package/build/core/extractor-stamp.js.map +1 -0
  74. package/build/core/feature-brief-cache.d.ts +37 -0
  75. package/build/core/feature-brief-cache.d.ts.map +1 -0
  76. package/build/core/feature-brief-cache.js +100 -0
  77. package/build/core/feature-brief-cache.js.map +1 -0
  78. package/build/core/file-fingerprint.d.ts +15 -0
  79. package/build/core/file-fingerprint.d.ts.map +1 -0
  80. package/build/core/file-fingerprint.js +24 -0
  81. package/build/core/file-fingerprint.js.map +1 -0
  82. package/build/core/graph-analytics.d.ts +46 -0
  83. package/build/core/graph-analytics.d.ts.map +1 -0
  84. package/build/core/graph-analytics.js +371 -0
  85. package/build/core/graph-analytics.js.map +1 -0
  86. package/build/core/hub.d.ts +23 -0
  87. package/build/core/hub.d.ts.map +1 -0
  88. package/build/core/hub.js +123 -0
  89. package/build/core/hub.js.map +1 -0
  90. package/build/core/ignore-dirs.d.ts +7 -0
  91. package/build/core/ignore-dirs.d.ts.map +1 -0
  92. package/build/core/ignore-dirs.js +84 -0
  93. package/build/core/ignore-dirs.js.map +1 -0
  94. package/build/core/index-freshness.d.ts +15 -0
  95. package/build/core/index-freshness.d.ts.map +1 -0
  96. package/build/core/index-freshness.js +96 -0
  97. package/build/core/index-freshness.js.map +1 -0
  98. package/build/core/index-reconcile.d.ts +28 -0
  99. package/build/core/index-reconcile.d.ts.map +1 -0
  100. package/build/core/index-reconcile.js +129 -0
  101. package/build/core/index-reconcile.js.map +1 -0
  102. package/build/core/local-daemon.d.ts +5 -0
  103. package/build/core/local-daemon.d.ts.map +1 -0
  104. package/build/core/local-daemon.js +282 -0
  105. package/build/core/local-daemon.js.map +1 -0
  106. package/build/core/memory-graph.d.ts +68 -0
  107. package/build/core/memory-graph.d.ts.map +1 -0
  108. package/build/core/memory-graph.js +152 -0
  109. package/build/core/memory-graph.js.map +1 -0
  110. package/build/core/native-repair.d.ts +12 -0
  111. package/build/core/native-repair.d.ts.map +1 -0
  112. package/build/core/native-repair.js +167 -0
  113. package/build/core/native-repair.js.map +1 -0
  114. package/build/core/native-runtime.d.ts +12 -0
  115. package/build/core/native-runtime.d.ts.map +1 -0
  116. package/build/core/native-runtime.js +38 -0
  117. package/build/core/native-runtime.js.map +1 -0
  118. package/build/core/pagerank.d.ts +29 -0
  119. package/build/core/pagerank.d.ts.map +1 -0
  120. package/build/core/pagerank.js +90 -0
  121. package/build/core/pagerank.js.map +1 -0
  122. package/build/core/parser-process.d.ts +21 -0
  123. package/build/core/parser-process.d.ts.map +1 -0
  124. package/build/core/parser-process.js +103 -0
  125. package/build/core/parser-process.js.map +1 -0
  126. package/build/core/parser-worker.d.ts +2 -0
  127. package/build/core/parser-worker.d.ts.map +1 -0
  128. package/build/core/parser-worker.js +17 -0
  129. package/build/core/parser-worker.js.map +1 -0
  130. package/build/core/parser.d.ts +66 -0
  131. package/build/core/parser.d.ts.map +1 -0
  132. package/build/core/parser.js +750 -0
  133. package/build/core/parser.js.map +1 -0
  134. package/build/core/path-guard.d.ts +6 -0
  135. package/build/core/path-guard.d.ts.map +1 -0
  136. package/build/core/path-guard.js +55 -0
  137. package/build/core/path-guard.js.map +1 -0
  138. package/build/core/process-lifecycle.d.ts +30 -0
  139. package/build/core/process-lifecycle.d.ts.map +1 -0
  140. package/build/core/process-lifecycle.js +129 -0
  141. package/build/core/process-lifecycle.js.map +1 -0
  142. package/build/core/project-config.d.ts +83 -0
  143. package/build/core/project-config.d.ts.map +1 -0
  144. package/build/core/project-config.js +302 -0
  145. package/build/core/project-config.js.map +1 -0
  146. package/build/core/project-graph.d.ts +69 -0
  147. package/build/core/project-graph.d.ts.map +1 -0
  148. package/build/core/project-graph.js +874 -0
  149. package/build/core/project-graph.js.map +1 -0
  150. package/build/core/provider-config.d.ts +15 -0
  151. package/build/core/provider-config.d.ts.map +1 -0
  152. package/build/core/provider-config.js +67 -0
  153. package/build/core/provider-config.js.map +1 -0
  154. package/build/core/provider-usage.d.ts +21 -0
  155. package/build/core/provider-usage.d.ts.map +1 -0
  156. package/build/core/provider-usage.js +52 -0
  157. package/build/core/provider-usage.js.map +1 -0
  158. package/build/core/python-language-server.d.ts +23 -0
  159. package/build/core/python-language-server.d.ts.map +1 -0
  160. package/build/core/python-language-server.js +217 -0
  161. package/build/core/python-language-server.js.map +1 -0
  162. package/build/core/python-runtime-identity.d.ts +3 -0
  163. package/build/core/python-runtime-identity.d.ts.map +1 -0
  164. package/build/core/python-runtime-identity.js +53 -0
  165. package/build/core/python-runtime-identity.js.map +1 -0
  166. package/build/core/reconcile-scheduler.d.ts +20 -0
  167. package/build/core/reconcile-scheduler.d.ts.map +1 -0
  168. package/build/core/reconcile-scheduler.js +58 -0
  169. package/build/core/reconcile-scheduler.js.map +1 -0
  170. package/build/core/request-context.d.ts +7 -0
  171. package/build/core/request-context.d.ts.map +1 -0
  172. package/build/core/request-context.js +17 -0
  173. package/build/core/request-context.js.map +1 -0
  174. package/build/core/request-root.d.ts +19 -0
  175. package/build/core/request-root.d.ts.map +1 -0
  176. package/build/core/request-root.js +26 -0
  177. package/build/core/request-root.js.map +1 -0
  178. package/build/core/root-guard.d.ts +9 -0
  179. package/build/core/root-guard.d.ts.map +1 -0
  180. package/build/core/root-guard.js +64 -0
  181. package/build/core/root-guard.js.map +1 -0
  182. package/build/core/roots-detect.d.ts +17 -0
  183. package/build/core/roots-detect.d.ts.map +1 -0
  184. package/build/core/roots-detect.js +63 -0
  185. package/build/core/roots-detect.js.map +1 -0
  186. package/build/core/runtime-session.d.ts +5 -0
  187. package/build/core/runtime-session.d.ts.map +1 -0
  188. package/build/core/runtime-session.js +10 -0
  189. package/build/core/runtime-session.js.map +1 -0
  190. package/build/core/scip-index.d.ts +71 -0
  191. package/build/core/scip-index.d.ts.map +1 -0
  192. package/build/core/scip-index.js +343 -0
  193. package/build/core/scip-index.js.map +1 -0
  194. package/build/core/semantic-diff.d.ts +32 -0
  195. package/build/core/semantic-diff.d.ts.map +1 -0
  196. package/build/core/semantic-diff.js +259 -0
  197. package/build/core/semantic-diff.js.map +1 -0
  198. package/build/core/source-context.d.ts +3 -0
  199. package/build/core/source-context.d.ts.map +1 -0
  200. package/build/core/source-context.js +86 -0
  201. package/build/core/source-context.js.map +1 -0
  202. package/build/core/source-mask.d.ts +8 -0
  203. package/build/core/source-mask.d.ts.map +1 -0
  204. package/build/core/source-mask.js +156 -0
  205. package/build/core/source-mask.js.map +1 -0
  206. package/build/core/source-mutation.d.ts +16 -0
  207. package/build/core/source-mutation.d.ts.map +1 -0
  208. package/build/core/source-mutation.js +193 -0
  209. package/build/core/source-mutation.js.map +1 -0
  210. package/build/core/sql-schema.d.ts +59 -0
  211. package/build/core/sql-schema.d.ts.map +1 -0
  212. package/build/core/sql-schema.js +218 -0
  213. package/build/core/sql-schema.js.map +1 -0
  214. package/build/core/startup-health.d.ts +40 -0
  215. package/build/core/startup-health.d.ts.map +1 -0
  216. package/build/core/startup-health.js +132 -0
  217. package/build/core/startup-health.js.map +1 -0
  218. package/build/core/team-ledger.d.ts +60 -0
  219. package/build/core/team-ledger.d.ts.map +1 -0
  220. package/build/core/team-ledger.js +171 -0
  221. package/build/core/team-ledger.js.map +1 -0
  222. package/build/core/test-impact.d.ts +23 -0
  223. package/build/core/test-impact.d.ts.map +1 -0
  224. package/build/core/test-impact.js +131 -0
  225. package/build/core/test-impact.js.map +1 -0
  226. package/build/core/tool-metrics.d.ts +29 -0
  227. package/build/core/tool-metrics.d.ts.map +1 -0
  228. package/build/core/tool-metrics.js +74 -0
  229. package/build/core/tool-metrics.js.map +1 -0
  230. package/build/core/tool-profile.d.ts +12 -0
  231. package/build/core/tool-profile.d.ts.map +1 -0
  232. package/build/core/tool-profile.js +102 -0
  233. package/build/core/tool-profile.js.map +1 -0
  234. package/build/core/tool-trace.d.ts +8 -0
  235. package/build/core/tool-trace.d.ts.map +1 -0
  236. package/build/core/tool-trace.js +70 -0
  237. package/build/core/tool-trace.js.map +1 -0
  238. package/build/core/tree-sitter-runtime.d.ts +20 -0
  239. package/build/core/tree-sitter-runtime.d.ts.map +1 -0
  240. package/build/core/tree-sitter-runtime.js +324 -0
  241. package/build/core/tree-sitter-runtime.js.map +1 -0
  242. package/build/core/tree-sitter.d.ts +6 -0
  243. package/build/core/tree-sitter.d.ts.map +1 -0
  244. package/build/core/tree-sitter.js +24 -0
  245. package/build/core/tree-sitter.js.map +1 -0
  246. package/build/core/typescript-reference-process.d.ts +30 -0
  247. package/build/core/typescript-reference-process.d.ts.map +1 -0
  248. package/build/core/typescript-reference-process.js +124 -0
  249. package/build/core/typescript-reference-process.js.map +1 -0
  250. package/build/core/typescript-reference-worker.d.ts +2 -0
  251. package/build/core/typescript-reference-worker.d.ts.map +1 -0
  252. package/build/core/typescript-reference-worker.js +14 -0
  253. package/build/core/typescript-reference-worker.js.map +1 -0
  254. package/build/core/typescript-references.d.ts +71 -0
  255. package/build/core/typescript-references.d.ts.map +1 -0
  256. package/build/core/typescript-references.js +392 -0
  257. package/build/core/typescript-references.js.map +1 -0
  258. package/build/core/typescript-skeleton.d.ts +5 -0
  259. package/build/core/typescript-skeleton.d.ts.map +1 -0
  260. package/build/core/typescript-skeleton.js +49 -0
  261. package/build/core/typescript-skeleton.js.map +1 -0
  262. package/build/core/walker.d.ts +16 -0
  263. package/build/core/walker.d.ts.map +1 -0
  264. package/build/core/walker.js +152 -0
  265. package/build/core/walker.js.map +1 -0
  266. package/build/core/workspace-router.d.ts +28 -0
  267. package/build/core/workspace-router.d.ts.map +1 -0
  268. package/build/core/workspace-router.js +93 -0
  269. package/build/core/workspace-router.js.map +1 -0
  270. package/build/core/worktree-gc.d.ts +16 -0
  271. package/build/core/worktree-gc.d.ts.map +1 -0
  272. package/build/core/worktree-gc.js +69 -0
  273. package/build/core/worktree-gc.js.map +1 -0
  274. package/build/core/worktree-overlay.d.ts +22 -0
  275. package/build/core/worktree-overlay.d.ts.map +1 -0
  276. package/build/core/worktree-overlay.js +84 -0
  277. package/build/core/worktree-overlay.js.map +1 -0
  278. package/build/core/worktree-root-guard.d.ts +8 -0
  279. package/build/core/worktree-root-guard.d.ts.map +1 -0
  280. package/build/core/worktree-root-guard.js +82 -0
  281. package/build/core/worktree-root-guard.js.map +1 -0
  282. package/build/core/worktree-seed.d.ts +14 -0
  283. package/build/core/worktree-seed.d.ts.map +1 -0
  284. package/build/core/worktree-seed.js +98 -0
  285. package/build/core/worktree-seed.js.map +1 -0
  286. package/build/git/shadow.d.ts +40 -0
  287. package/build/git/shadow.d.ts.map +1 -0
  288. package/build/git/shadow.js +298 -0
  289. package/build/git/shadow.js.map +1 -0
  290. package/build/index.d.ts +3 -0
  291. package/build/index.d.ts.map +1 -0
  292. package/build/index.js +634 -0
  293. package/build/index.js.map +1 -0
  294. package/build/tools/agentic-context.d.ts +86 -0
  295. package/build/tools/agentic-context.d.ts.map +1 -0
  296. package/build/tools/agentic-context.js +1546 -0
  297. package/build/tools/agentic-context.js.map +1 -0
  298. package/build/tools/blast-radius.d.ts +24 -0
  299. package/build/tools/blast-radius.d.ts.map +1 -0
  300. package/build/tools/blast-radius.js +231 -0
  301. package/build/tools/blast-radius.js.map +1 -0
  302. package/build/tools/changed-since.d.ts +7 -0
  303. package/build/tools/changed-since.d.ts.map +1 -0
  304. package/build/tools/changed-since.js +68 -0
  305. package/build/tools/changed-since.js.map +1 -0
  306. package/build/tools/compiler-actions.d.ts +26 -0
  307. package/build/tools/compiler-actions.d.ts.map +1 -0
  308. package/build/tools/compiler-actions.js +121 -0
  309. package/build/tools/compiler-actions.js.map +1 -0
  310. package/build/tools/context-tree.d.ts +9 -0
  311. package/build/tools/context-tree.d.ts.map +1 -0
  312. package/build/tools/context-tree.js +131 -0
  313. package/build/tools/context-tree.js.map +1 -0
  314. package/build/tools/context.d.ts +37 -0
  315. package/build/tools/context.d.ts.map +1 -0
  316. package/build/tools/context.js +800 -0
  317. package/build/tools/context.js.map +1 -0
  318. package/build/tools/diff.d.ts +9 -0
  319. package/build/tools/diff.d.ts.map +1 -0
  320. package/build/tools/diff.js +176 -0
  321. package/build/tools/diff.js.map +1 -0
  322. package/build/tools/directory-prior.d.ts +16 -0
  323. package/build/tools/directory-prior.d.ts.map +1 -0
  324. package/build/tools/directory-prior.js +121 -0
  325. package/build/tools/directory-prior.js.map +1 -0
  326. package/build/tools/discovery-documents.d.ts +11 -0
  327. package/build/tools/discovery-documents.d.ts.map +1 -0
  328. package/build/tools/discovery-documents.js +71 -0
  329. package/build/tools/discovery-documents.js.map +1 -0
  330. package/build/tools/discovery-hints.d.ts +25 -0
  331. package/build/tools/discovery-hints.d.ts.map +1 -0
  332. package/build/tools/discovery-hints.js +329 -0
  333. package/build/tools/discovery-hints.js.map +1 -0
  334. package/build/tools/efficiency-report.d.ts +13 -0
  335. package/build/tools/efficiency-report.d.ts.map +1 -0
  336. package/build/tools/efficiency-report.js +78 -0
  337. package/build/tools/efficiency-report.js.map +1 -0
  338. package/build/tools/evidence-retrieval.d.ts +33 -0
  339. package/build/tools/evidence-retrieval.d.ts.map +1 -0
  340. package/build/tools/evidence-retrieval.js +200 -0
  341. package/build/tools/evidence-retrieval.js.map +1 -0
  342. package/build/tools/exact-references.d.ts +10 -0
  343. package/build/tools/exact-references.d.ts.map +1 -0
  344. package/build/tools/exact-references.js +351 -0
  345. package/build/tools/exact-references.js.map +1 -0
  346. package/build/tools/explain.d.ts +14 -0
  347. package/build/tools/explain.d.ts.map +1 -0
  348. package/build/tools/explain.js +370 -0
  349. package/build/tools/explain.js.map +1 -0
  350. package/build/tools/feature-brief.d.ts +7 -0
  351. package/build/tools/feature-brief.d.ts.map +1 -0
  352. package/build/tools/feature-brief.js +89 -0
  353. package/build/tools/feature-brief.js.map +1 -0
  354. package/build/tools/feature-hub.d.ts +15 -0
  355. package/build/tools/feature-hub.d.ts.map +1 -0
  356. package/build/tools/feature-hub.js +404 -0
  357. package/build/tools/feature-hub.js.map +1 -0
  358. package/build/tools/file-skeleton.d.ts +7 -0
  359. package/build/tools/file-skeleton.d.ts.map +1 -0
  360. package/build/tools/file-skeleton.js +190 -0
  361. package/build/tools/file-skeleton.js.map +1 -0
  362. package/build/tools/grep.d.ts +25 -0
  363. package/build/tools/grep.d.ts.map +1 -0
  364. package/build/tools/grep.js +341 -0
  365. package/build/tools/grep.js.map +1 -0
  366. package/build/tools/impact-delta.d.ts +7 -0
  367. package/build/tools/impact-delta.d.ts.map +1 -0
  368. package/build/tools/impact-delta.js +102 -0
  369. package/build/tools/impact-delta.js.map +1 -0
  370. package/build/tools/memory-tools.d.ts +69 -0
  371. package/build/tools/memory-tools.d.ts.map +1 -0
  372. package/build/tools/memory-tools.js +366 -0
  373. package/build/tools/memory-tools.js.map +1 -0
  374. package/build/tools/planning-helpers.d.ts +26 -0
  375. package/build/tools/planning-helpers.d.ts.map +1 -0
  376. package/build/tools/planning-helpers.js +269 -0
  377. package/build/tools/planning-helpers.js.map +1 -0
  378. package/build/tools/project-graph.d.ts +19 -0
  379. package/build/tools/project-graph.d.ts.map +1 -0
  380. package/build/tools/project-graph.js +259 -0
  381. package/build/tools/project-graph.js.map +1 -0
  382. package/build/tools/propose-commit.d.ts +9 -0
  383. package/build/tools/propose-commit.d.ts.map +1 -0
  384. package/build/tools/propose-commit.js +156 -0
  385. package/build/tools/propose-commit.js.map +1 -0
  386. package/build/tools/register-tools.d.ts +18 -0
  387. package/build/tools/register-tools.d.ts.map +1 -0
  388. package/build/tools/register-tools.js +1131 -0
  389. package/build/tools/register-tools.js.map +1 -0
  390. package/build/tools/reindex.d.ts +76 -0
  391. package/build/tools/reindex.d.ts.map +1 -0
  392. package/build/tools/reindex.js +871 -0
  393. package/build/tools/reindex.js.map +1 -0
  394. package/build/tools/related.d.ts +6 -0
  395. package/build/tools/related.d.ts.map +1 -0
  396. package/build/tools/related.js +143 -0
  397. package/build/tools/related.js.map +1 -0
  398. package/build/tools/repo-map.d.ts +59 -0
  399. package/build/tools/repo-map.d.ts.map +1 -0
  400. package/build/tools/repo-map.js +270 -0
  401. package/build/tools/repo-map.js.map +1 -0
  402. package/build/tools/resolve-symbol.d.ts +41 -0
  403. package/build/tools/resolve-symbol.d.ts.map +1 -0
  404. package/build/tools/resolve-symbol.js +250 -0
  405. package/build/tools/resolve-symbol.js.map +1 -0
  406. package/build/tools/retrieval-helpers.d.ts +35 -0
  407. package/build/tools/retrieval-helpers.d.ts.map +1 -0
  408. package/build/tools/retrieval-helpers.js +302 -0
  409. package/build/tools/retrieval-helpers.js.map +1 -0
  410. package/build/tools/scip-index.d.ts +12 -0
  411. package/build/tools/scip-index.d.ts.map +1 -0
  412. package/build/tools/scip-index.js +66 -0
  413. package/build/tools/scip-index.js.map +1 -0
  414. package/build/tools/scoped-discovery.d.ts +7 -0
  415. package/build/tools/scoped-discovery.d.ts.map +1 -0
  416. package/build/tools/scoped-discovery.js +89 -0
  417. package/build/tools/scoped-discovery.js.map +1 -0
  418. package/build/tools/search.d.ts +62 -0
  419. package/build/tools/search.d.ts.map +1 -0
  420. package/build/tools/search.js +419 -0
  421. package/build/tools/search.js.map +1 -0
  422. package/build/tools/semantic-diff.d.ts +7 -0
  423. package/build/tools/semantic-diff.d.ts.map +1 -0
  424. package/build/tools/semantic-diff.js +45 -0
  425. package/build/tools/semantic-diff.js.map +1 -0
  426. package/build/tools/semantic-identifiers.d.ts +51 -0
  427. package/build/tools/semantic-identifiers.d.ts.map +1 -0
  428. package/build/tools/semantic-identifiers.js +522 -0
  429. package/build/tools/semantic-identifiers.js.map +1 -0
  430. package/build/tools/semantic-navigate.d.ts +18 -0
  431. package/build/tools/semantic-navigate.d.ts.map +1 -0
  432. package/build/tools/semantic-navigate.js +413 -0
  433. package/build/tools/semantic-navigate.js.map +1 -0
  434. package/build/tools/semantic-search.d.ts +30 -0
  435. package/build/tools/semantic-search.d.ts.map +1 -0
  436. package/build/tools/semantic-search.js +466 -0
  437. package/build/tools/semantic-search.js.map +1 -0
  438. package/build/tools/sql-schema.d.ts +23 -0
  439. package/build/tools/sql-schema.d.ts.map +1 -0
  440. package/build/tools/sql-schema.js +155 -0
  441. package/build/tools/sql-schema.js.map +1 -0
  442. package/build/tools/static-analysis.d.ts +7 -0
  443. package/build/tools/static-analysis.d.ts.map +1 -0
  444. package/build/tools/static-analysis.js +331 -0
  445. package/build/tools/static-analysis.js.map +1 -0
  446. package/build/tools/status.d.ts +74 -0
  447. package/build/tools/status.d.ts.map +1 -0
  448. package/build/tools/status.js +227 -0
  449. package/build/tools/status.js.map +1 -0
  450. package/build/tools/symbolic-edit.d.ts +57 -0
  451. package/build/tools/symbolic-edit.d.ts.map +1 -0
  452. package/build/tools/symbolic-edit.js +500 -0
  453. package/build/tools/symbolic-edit.js.map +1 -0
  454. package/build/tools/test-impact.d.ts +7 -0
  455. package/build/tools/test-impact.d.ts.map +1 -0
  456. package/build/tools/test-impact.js +34 -0
  457. package/build/tools/test-impact.js.map +1 -0
  458. package/build/tools/test-map.d.ts +8 -0
  459. package/build/tools/test-map.d.ts.map +1 -0
  460. package/build/tools/test-map.js +75 -0
  461. package/build/tools/test-map.js.map +1 -0
  462. package/docs/README.md +35 -0
  463. package/docs/architecture.md +35 -0
  464. package/docs/configuration.md +207 -0
  465. package/docs/maintenance.md +77 -0
  466. package/package.json +80 -4
@@ -0,0 +1,218 @@
1
+ // SQL schema / RLS extractor for Postgres + Supabase migrations.
2
+ //
3
+ // FEATURE: Agents working on Supabase apps constantly need "what columns does X
4
+ // have / does role Y have a SELECT policy on Z / what's the body of function W" —
5
+ // today the only answer is dropping to psql. This parses migration SQL into
6
+ // tables (columns + types + CHECK), RLS state, policies (command/roles/predicate),
7
+ // and SECURITY DEFINER functions, so those questions are answerable from the index.
8
+ //
9
+ // A focused line/regex parser (not a full SQL grammar) keeps this dependency-free
10
+ // and covers the DDL constructs that matter for schema/RLS questions. It is
11
+ // deliberately lenient: unrecognized statements are skipped, never thrown.
12
+ /** A schema-qualified table key, e.g. "public.users" — distinguishes auth.users. */
13
+ export function qualifiedName(schema, name) {
14
+ return `${schema}.${name}`;
15
+ }
16
+ function stripSchemaPrefix(qualified) {
17
+ const cleaned = qualified.replace(/"/g, "").trim();
18
+ const parts = cleaned.split(".");
19
+ if (parts.length >= 2)
20
+ return { schema: parts[0], name: parts[parts.length - 1] };
21
+ return { schema: "public", name: cleaned };
22
+ }
23
+ function lineOf(source, index) {
24
+ let line = 1;
25
+ for (let i = 0; i < index && i < source.length; i++) {
26
+ if (source[i] === "\n")
27
+ line++;
28
+ }
29
+ return line;
30
+ }
31
+ /**
32
+ * Split a parenthesized column list on top-level commas only (so `numeric(10,2)`
33
+ * and `check (a > 0)` stay intact).
34
+ */
35
+ function splitTopLevel(body) {
36
+ const parts = [];
37
+ let depth = 0;
38
+ let current = "";
39
+ for (const ch of body) {
40
+ if (ch === "(")
41
+ depth++;
42
+ else if (ch === ")")
43
+ depth--;
44
+ if (ch === "," && depth === 0) {
45
+ parts.push(current);
46
+ current = "";
47
+ }
48
+ else {
49
+ current += ch;
50
+ }
51
+ }
52
+ if (current.trim())
53
+ parts.push(current);
54
+ return parts;
55
+ }
56
+ const TABLE_LEVEL_KEYWORDS = /^(primary\s+key|foreign\s+key|unique|check|constraint|exclude|like)\b/i;
57
+ function parseColumn(raw) {
58
+ const text = raw.trim();
59
+ if (!text || TABLE_LEVEL_KEYWORDS.test(text))
60
+ return null;
61
+ const nameMatch = text.match(/^("?[a-zA-Z_][\w]*"?)\s+(.+)$/s);
62
+ if (!nameMatch)
63
+ return null;
64
+ const name = nameMatch[1].replace(/"/g, "");
65
+ let rest = nameMatch[2].trim();
66
+ // The type runs from here until the first column-constraint keyword (or end).
67
+ // This captures multi-word types (`timestamp with time zone`, `double precision`,
68
+ // `character varying(255)`) and schema-qualified enums (`public.user_role`),
69
+ // including a trailing `(precision[, scale])` and `[]` array marker — instead of
70
+ // the old pattern that grabbed at most one extra word and no dot.
71
+ const CONSTRAINT_BOUNDARY = /\s+\b(not\s+null|null|default|check|references|unique|primary\s+key|generated|collate|constraint)\b/i;
72
+ const boundary = rest.search(CONSTRAINT_BOUNDARY);
73
+ const type = (boundary >= 0 ? rest.slice(0, boundary) : rest).trim().replace(/,$/, "");
74
+ const notNull = /\bnot\s+null\b/i.test(rest);
75
+ const defaultMatch = rest.match(/\bdefault\s+(.+?)(?=\s+(?:not\s+null|check|references|unique|primary)\b|$)/is);
76
+ const defaultValue = defaultMatch ? defaultMatch[1].trim() : null;
77
+ const checkMatch = rest.match(/\bcheck\s*\(([^)]*(?:\([^)]*\)[^)]*)*)\)/i);
78
+ const check = checkMatch ? checkMatch[1].trim() : null;
79
+ return { name, type, notNull, defaultValue, check };
80
+ }
81
+ function extractTables(source) {
82
+ const tables = [];
83
+ const re = /create\s+table\s+(?:if\s+not\s+exists\s+)?([\w."]+)\s*\(/gi;
84
+ let match;
85
+ while ((match = re.exec(source)) !== null) {
86
+ const { schema, name } = stripSchemaPrefix(match[1]);
87
+ // Find the matching close paren for the column list.
88
+ const start = re.lastIndex;
89
+ let depth = 1;
90
+ let i = start;
91
+ for (; i < source.length && depth > 0; i++) {
92
+ if (source[i] === "(")
93
+ depth++;
94
+ else if (source[i] === ")")
95
+ depth--;
96
+ }
97
+ const body = source.slice(start, i - 1);
98
+ const columns = splitTopLevel(body)
99
+ .map(parseColumn)
100
+ .filter((c) => c !== null);
101
+ tables.push({ name, schema, columns, rlsEnabled: false, line: lineOf(source, match.index) });
102
+ }
103
+ return tables;
104
+ }
105
+ function extractAlterAddColumns(source) {
106
+ const added = [];
107
+ // `ALTER TABLE [IF EXISTS] <tbl> ADD COLUMN [IF NOT EXISTS] <col> <type…>;`
108
+ const re = /alter\s+table\s+(?:if\s+exists\s+)?([\w."]+)\s+add\s+column\s+(?:if\s+not\s+exists\s+)?([^;]+);/gi;
109
+ let match;
110
+ while ((match = re.exec(source)) !== null) {
111
+ const { schema, name } = stripSchemaPrefix(match[1]);
112
+ const column = parseColumn(match[2].trim());
113
+ if (column)
114
+ added.push({ table: qualifiedName(schema, name), column });
115
+ }
116
+ return added;
117
+ }
118
+ function applyRlsFlags(source, tables) {
119
+ const enabled = [];
120
+ const re = /alter\s+table\s+(?:if\s+exists\s+)?([\w."]+)\s+enable\s+row\s+level\s+security/gi;
121
+ let match;
122
+ while ((match = re.exec(source)) !== null) {
123
+ const { schema, name } = stripSchemaPrefix(match[1]);
124
+ // Store SCHEMA-QUALIFIED so a later cross-file enable targets the right table
125
+ // (Supabase's auth.users must not be confused with an app's public.users).
126
+ enabled.push(qualifiedName(schema, name));
127
+ // Set the flag in-file when the CREATE TABLE is in the same file; otherwise the
128
+ // returned list lets the aggregator apply it across migration files.
129
+ const table = tables.find((t) => t.name === name && t.schema === schema);
130
+ if (table)
131
+ table.rlsEnabled = true;
132
+ }
133
+ return enabled;
134
+ }
135
+ function extractPolicies(source) {
136
+ const policies = [];
137
+ // Match through the optional clauses up to the statement terminator.
138
+ const re = /create\s+policy\s+("([^"]+)"|[\w]+)\s+on\s+([\w."]+)([\s\S]*?);/gi;
139
+ let match;
140
+ while ((match = re.exec(source)) !== null) {
141
+ const name = (match[2] ?? match[1]).replace(/"/g, "");
142
+ const { schema: tableSchema, name: table } = stripSchemaPrefix(match[3]);
143
+ const clause = match[4];
144
+ const commandMatch = clause.match(/\bfor\s+(all|select|insert|update|delete)\b/i);
145
+ const command = commandMatch ? commandMatch[1].toLowerCase() : "all";
146
+ const rolesMatch = clause.match(/\bto\s+([\w\s,]+?)(?=\s+(?:using|with\s+check)\b|$)/i);
147
+ const roles = rolesMatch
148
+ ? rolesMatch[1].split(",").map((r) => r.trim()).filter(Boolean)
149
+ : [];
150
+ const usingMatch = clause.match(/\busing\s*\(([\s\S]*?)\)(?=\s*(?:with\s+check|$))/i);
151
+ const withCheckMatch = clause.match(/\bwith\s+check\s*\(([\s\S]*?)\)\s*$/i);
152
+ policies.push({
153
+ name,
154
+ table,
155
+ schema: tableSchema,
156
+ command,
157
+ roles,
158
+ using: usingMatch ? usingMatch[1].trim() : null,
159
+ withCheck: withCheckMatch ? withCheckMatch[1].trim() : null,
160
+ line: lineOf(source, match.index),
161
+ });
162
+ }
163
+ return policies;
164
+ }
165
+ function extractFunctions(source) {
166
+ const functions = [];
167
+ const re = /create\s+(?:or\s+replace\s+)?function\s+([\w."]+)\s*\(/gi;
168
+ let match;
169
+ while ((match = re.exec(source)) !== null) {
170
+ const { schema, name } = stripSchemaPrefix(match[1]);
171
+ // The function definition runs until its dollar-quoted body closes, or to ';'.
172
+ const afterParen = source.slice(match.index);
173
+ const dollarTag = afterParen.match(/as\s+(\$[\w]*\$)/i);
174
+ let body = "";
175
+ // Options like LANGUAGE / SECURITY DEFINER can appear BEFORE the dollar body
176
+ // (`LANGUAGE sql SECURITY DEFINER AS $$…$$`) OR AFTER it
177
+ // (`AS $$…$$ LANGUAGE plpgsql SECURITY DEFINER;`). Scan the whole statement
178
+ // with the body content REMOVED, so both forms are detected.
179
+ let header = afterParen;
180
+ if (dollarTag) {
181
+ const tag = dollarTag[1];
182
+ const openIdx = afterParen.indexOf(tag, dollarTag.index);
183
+ const closeIdx = afterParen.indexOf(tag, openIdx + tag.length);
184
+ if (openIdx !== -1 && closeIdx !== -1) {
185
+ body = afterParen.slice(openIdx + tag.length, closeIdx).trim();
186
+ // header = everything before the body + everything after it (to end of stmt).
187
+ const afterBody = afterParen.slice(closeIdx + tag.length);
188
+ const stmtEnd = afterBody.indexOf(";");
189
+ header = afterParen.slice(0, openIdx) + " " + (stmtEnd >= 0 ? afterBody.slice(0, stmtEnd) : afterBody);
190
+ }
191
+ }
192
+ const securityDefiner = /\bsecurity\s+definer\b/i.test(header);
193
+ const langMatch = header.match(/\blanguage\s+([\w]+)/i);
194
+ functions.push({
195
+ name,
196
+ schema,
197
+ securityDefiner,
198
+ language: langMatch ? langMatch[1].toLowerCase() : null,
199
+ body,
200
+ line: lineOf(source, match.index),
201
+ });
202
+ }
203
+ return functions;
204
+ }
205
+ export function extractSqlSchema(path, source) {
206
+ const normalized = source.replace(/\r\n/g, "\n");
207
+ const tables = extractTables(normalized);
208
+ const rlsEnabledTables = applyRlsFlags(normalized, tables);
209
+ return {
210
+ path,
211
+ tables,
212
+ policies: extractPolicies(normalized),
213
+ functions: extractFunctions(normalized),
214
+ rlsEnabledTables,
215
+ alterAddColumns: extractAlterAddColumns(normalized),
216
+ };
217
+ }
218
+ //# sourceMappingURL=sql-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-schema.js","sourceRoot":"","sources":["../../src/core/sql-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { type NativeStorageProbe } from "./db.js";
2
+ declare const runtimeBuild: Readonly<{
3
+ serverVersion: string;
4
+ buildStamp: string;
5
+ }>;
6
+ export declare function getRuntimeBuildIdentity(): typeof runtimeBuild;
7
+ export interface StartupHealthReport {
8
+ status: "ok" | "degraded";
9
+ timestamp: string;
10
+ rootDir: string;
11
+ runtime: {
12
+ nodeVersion: string;
13
+ execPath: string;
14
+ parserBackend: string;
15
+ nodeAbi: string;
16
+ pid: number;
17
+ serverVersion: string;
18
+ buildStamp: string;
19
+ };
20
+ project: {
21
+ ok: boolean;
22
+ message: string;
23
+ projectId: string | null;
24
+ clientId: string | null;
25
+ gitRoot: string | null;
26
+ fingerprint: string | null;
27
+ };
28
+ storage: NativeStorageProbe & {
29
+ databaseOpen: {
30
+ ok: boolean;
31
+ message: string;
32
+ };
33
+ };
34
+ }
35
+ export declare function runStartupHealthCheck(rootDir: string, options?: {
36
+ autoRepair?: boolean;
37
+ }): Promise<StartupHealthReport>;
38
+ export declare function formatStartupHealthReport(report: StartupHealthReport): string;
39
+ export {};
40
+ //# sourceMappingURL=startup-health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-health.d.ts","sourceRoot":"","sources":["../../src/core/startup-health.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsC,KAAK,kBAAkB,EAAE,MAAM,SAAS,CAAC;AA+BtF,QAAA,MAAM,YAAY;;;EAAsF,CAAC;AACzG,wBAAgB,uBAAuB,IAAI,OAAO,YAAY,CAAyB;AAEvF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,IAAI,GAAG,UAAU,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;QACZ,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,OAAO,EAAE;QACP,EAAE,EAAE,OAAO,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,CAAC;IACF,OAAO,EAAE,kBAAkB,GAAG;QAC5B,YAAY,EAAE;YACZ,EAAE,EAAE,OAAO,CAAC;YACZ,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;CACH;AAyBD,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAsDjI;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAuB7E"}
@@ -0,0 +1,132 @@
1
+ // Startup health checks for project identity and native storage readiness
2
+ // FEATURE: Boot diagnostics — fail loud on root drift and native dependency breakage
3
+ import { closeDB, getDB, probeNativeStorage } from "./db.js";
4
+ import { attemptNativeAutoRepair } from "./native-repair.js";
5
+ import { verifyProjectContext } from "./project-config.js";
6
+ import { readFileSync, statSync } from "fs";
7
+ import { dirname, resolve } from "path";
8
+ import { fileURLToPath } from "url";
9
+ const HEALTH_PACKAGE_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
10
+ function readServerVersion() {
11
+ try {
12
+ const pkg = JSON.parse(readFileSync(resolve(HEALTH_PACKAGE_ROOT, "package.json"), "utf8"));
13
+ return typeof pkg.version === "string" ? pkg.version : "0.0.0";
14
+ }
15
+ catch {
16
+ return "unknown";
17
+ }
18
+ }
19
+ function readBuildStamp() {
20
+ // The mtime of the compiled entry point. Lets a user confirm — after a restart — that the
21
+ // running process is using a freshly-built artifact (different timestamp = new code loaded).
22
+ try {
23
+ const stat = statSync(resolve(HEALTH_PACKAGE_ROOT, "build/index.js"));
24
+ return stat.mtime.toISOString();
25
+ }
26
+ catch {
27
+ return "unknown";
28
+ }
29
+ }
30
+ // Capture identity when this module loads. Reading the artifact timestamp on
31
+ // every health request falsely labels an old process as a newly compiled build.
32
+ const runtimeBuild = Object.freeze({ serverVersion: readServerVersion(), buildStamp: readBuildStamp() });
33
+ export function getRuntimeBuildIdentity() { return runtimeBuild; }
34
+ function summarizeProjectContext(context, error) {
35
+ if (context) {
36
+ return {
37
+ ok: true,
38
+ message: "project context verified",
39
+ projectId: context.config.projectId,
40
+ clientId: context.config.clientId,
41
+ gitRoot: context.gitRoot,
42
+ fingerprint: context.config.repoFingerprint,
43
+ };
44
+ }
45
+ const message = error instanceof Error ? error.message : String(error);
46
+ return {
47
+ ok: false,
48
+ message,
49
+ projectId: null,
50
+ clientId: null,
51
+ gitRoot: null,
52
+ fingerprint: null,
53
+ };
54
+ }
55
+ export async function runStartupHealthCheck(rootDir, options = {}) {
56
+ const timestamp = new Date().toISOString();
57
+ let verifiedContext = null;
58
+ let projectError = null;
59
+ try {
60
+ verifiedContext = await verifyProjectContext(rootDir);
61
+ }
62
+ catch (error) {
63
+ projectError = error;
64
+ }
65
+ let storageProbe = probeNativeStorage();
66
+ if (!storageProbe.ok && options.autoRepair !== false) {
67
+ const repaired = await attemptNativeAutoRepair(storageProbe.diagnostic?.code);
68
+ if (repaired)
69
+ storageProbe = probeNativeStorage();
70
+ }
71
+ let databaseOpen = { ok: false, message: "native storage unavailable" };
72
+ if (storageProbe.ok) {
73
+ try {
74
+ const db = await getDB(rootDir);
75
+ db.getGraphStats();
76
+ databaseOpen = { ok: true, message: "database opened successfully" };
77
+ }
78
+ catch (error) {
79
+ databaseOpen = {
80
+ ok: false,
81
+ message: error instanceof Error ? error.message : String(error),
82
+ };
83
+ }
84
+ finally {
85
+ closeDB(rootDir);
86
+ }
87
+ }
88
+ const project = summarizeProjectContext(verifiedContext, projectError);
89
+ const status = project.ok && storageProbe.ok && databaseOpen.ok ? "ok" : "degraded";
90
+ return {
91
+ status,
92
+ timestamp,
93
+ rootDir,
94
+ runtime: {
95
+ nodeVersion: process.version,
96
+ execPath: process.execPath,
97
+ parserBackend: "isolated-process/liftoff",
98
+ nodeAbi: process.versions.modules ?? "unknown",
99
+ pid: process.pid,
100
+ ...getRuntimeBuildIdentity(),
101
+ },
102
+ project,
103
+ storage: {
104
+ ...storageProbe,
105
+ databaseOpen,
106
+ },
107
+ };
108
+ }
109
+ export function formatStartupHealthReport(report) {
110
+ const lines = [
111
+ `[contextpro/startup] status=${report.status} root=${report.rootDir}`,
112
+ `[contextpro/startup] version=${report.runtime.serverVersion} build=${report.runtime.buildStamp}`,
113
+ `[contextpro/startup] runtime node=${report.runtime.nodeVersion} abi=${report.runtime.nodeAbi} pid=${report.runtime.pid}`,
114
+ `[contextpro/startup] executable=${report.runtime.execPath} parser=${report.runtime.parserBackend}`,
115
+ `[contextpro/startup] project ok=${report.project.ok} projectId=${report.project.projectId ?? "unknown"} gitRoot=${report.project.gitRoot ?? "unknown"} fingerprint=${report.project.fingerprint ?? "unknown"}`,
116
+ `[contextpro/startup] storage ok=${report.storage.ok} dbOpen=${report.storage.databaseOpen.ok}`,
117
+ ];
118
+ if (!report.project.ok) {
119
+ lines.push(`[contextpro/startup] project_error ${report.project.message}`);
120
+ }
121
+ if (!report.storage.ok && report.storage.diagnostic) {
122
+ lines.push(`[contextpro/startup] storage_error [${report.storage.diagnostic.code}] ${report.storage.diagnostic.message}`);
123
+ for (const step of report.storage.diagnostic.remediation) {
124
+ lines.push(`[contextpro/startup] remediation ${step}`);
125
+ }
126
+ }
127
+ else if (!report.storage.databaseOpen.ok) {
128
+ lines.push(`[contextpro/startup] storage_error ${report.storage.databaseOpen.message}`);
129
+ }
130
+ return lines.join("\n");
131
+ }
132
+ //# sourceMappingURL=startup-health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-health.js","sourceRoot":"","sources":["../../src/core/startup-health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ type State = "queued" | "active" | "blocked" | "completed";
2
+ export interface TeamTaskOptions {
3
+ rootDir: string;
4
+ action: "create" | "update" | "claim" | "renew" | "release" | "block" | "complete" | "handoff";
5
+ taskId?: string;
6
+ title?: string;
7
+ dependencies?: string[];
8
+ owner?: string;
9
+ files?: string[];
10
+ note?: string;
11
+ handoffId?: string;
12
+ }
13
+ export declare function teamStatus(rootDir: string, now?: number, options?: {
14
+ taskId?: string;
15
+ beforeEventId?: number;
16
+ eventLimit?: number;
17
+ }): Promise<{
18
+ root: string;
19
+ advisory: boolean;
20
+ total: number;
21
+ omitted: number;
22
+ tasks: {
23
+ state: State;
24
+ leaseExpired: boolean;
25
+ dependencies: string[];
26
+ files: string[];
27
+ ready: boolean;
28
+ id: string;
29
+ title: string;
30
+ owner: string | null;
31
+ root: string;
32
+ expires: number;
33
+ handoff: string | null;
34
+ }[];
35
+ readyTaskIds: string[];
36
+ events: {
37
+ id: number;
38
+ }[];
39
+ olderEventsBefore: number | null;
40
+ }>;
41
+ export declare function teamTask(options: TeamTaskOptions, now?: number): Promise<{
42
+ task: {
43
+ state: State;
44
+ leaseExpired: boolean;
45
+ dependencies: string[];
46
+ files: string[];
47
+ ready: boolean;
48
+ id: string;
49
+ title: string;
50
+ owner: string | null;
51
+ root: string;
52
+ expires: number;
53
+ handoff: string | null;
54
+ };
55
+ warnings: string[];
56
+ advisory: boolean;
57
+ leaseMs: number;
58
+ }>;
59
+ export {};
60
+ //# sourceMappingURL=team-ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-ledger.d.ts","sourceRoot":"","sources":["../../src/core/team-ledger.ts"],"names":[],"mappings":"AAYA,KAAK,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IAChH,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC/H;AA2BD,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAa,EAAE,OAAO,GAAE;IAAC,MAAM,CAAC,EAAC,MAAM,CAAC;IAAA,aAAa,CAAC,EAAC,MAAM,CAAC;IAAA,UAAU,CAAC,EAAC,MAAM,CAAA;CAAM;;;;;;;;sBAJ1F,MAAM,EAAE;eAAmC,MAAM,EAAE;;YA3B/E,MAAM;eAAS,MAAM;eAA6C,MAAM,GAAG,IAAI;cAAQ,MAAM;iBAAW,MAAM;iBAA0B,MAAM,GAAG,IAAI;;;;YAsC7B,MAAM;;;GAKlJ;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,SAAa;;;;sBAlBxB,MAAM,EAAE;eAAmC,MAAM,EAAE;;YA3B/E,MAAM;eAAS,MAAM;eAA6C,MAAM,GAAG,IAAI;cAAQ,MAAM;iBAAW,MAAM;iBAA0B,MAAM,GAAG,IAAI;;;;;GAqHzK"}
@@ -0,0 +1,171 @@
1
+ // Local, advisory coordination. SQLite transactions arbitrate claims; no agent execution.
2
+ import { ensureNativeStorage, loadNativeStorageBindings } from "./db-native.js";
3
+ import { createHash, randomUUID } from "node:crypto";
4
+ import { homedir } from "node:os";
5
+ import { mkdir, realpath } from "node:fs/promises";
6
+ import { statSync } from "node:fs";
7
+ import { join, relative } from "node:path";
8
+ import { detectWorktreeInfo } from "./project-config.js";
9
+ import { resolveProjectPath, canonicalProjectPath } from "./path-guard.js";
10
+ import { readArtifact } from "./artifacts.js";
11
+ const LEASE_MS = 300_000;
12
+ async function ledger(rootDir) {
13
+ const root = await realpath(rootDir), worktree = await detectWorktreeInfo(root);
14
+ const identity = await realpath(worktree.gitCommonDir).catch(() => root);
15
+ const directory = join(process.env.CONTEXTPRO_TEAM_DIR ?? join(homedir(), ".contextpro", "teams"), createHash("sha256").update(identity).digest("hex").slice(0, 24));
16
+ await mkdir(directory, { recursive: true, mode: 0o700 });
17
+ await ensureNativeStorage();
18
+ const { Database } = loadNativeStorageBindings();
19
+ const db = new Database(join(directory, "tasks.db"));
20
+ db.pragma("journal_mode = WAL");
21
+ db.pragma("busy_timeout = 5000");
22
+ db.exec(`CREATE TABLE IF NOT EXISTS tasks (
23
+ id TEXT PRIMARY KEY, title TEXT NOT NULL, state TEXT NOT NULL CHECK(state IN ('queued','active','blocked','completed')),
24
+ dependencies TEXT NOT NULL, owner TEXT, root TEXT NOT NULL, expires INTEGER NOT NULL, files TEXT NOT NULL, handoff TEXT);
25
+ CREATE TABLE IF NOT EXISTS events (id INTEGER PRIMARY KEY, task_id TEXT NOT NULL, at INTEGER NOT NULL, action TEXT NOT NULL, owner TEXT, root TEXT NOT NULL, note TEXT NOT NULL, details TEXT NOT NULL DEFAULT '{}');`);
26
+ const hasDetails = () => db.prepare("PRAGMA table_info(events)").all().some(column => column.name === "details");
27
+ if (!hasDetails())
28
+ db.transaction(() => {
29
+ if (!hasDetails())
30
+ db.exec("ALTER TABLE events ADD COLUMN details TEXT NOT NULL DEFAULT '{}'");
31
+ }).immediate();
32
+ return { db, root };
33
+ }
34
+ const effectiveState = (task, now) => task.state === "active" && task.expires <= now ? "queued" : task.state;
35
+ const describe = (task, all, now) => ({ ...task, state: effectiveState(task, now),
36
+ leaseExpired: task.state === "active" && task.expires <= now,
37
+ dependencies: JSON.parse(task.dependencies), files: JSON.parse(task.files),
38
+ ready: effectiveState(task, now) === "queued" && JSON.parse(task.dependencies).every(id => all.some(item => item.id === id && item.state === "completed")),
39
+ });
40
+ export async function teamStatus(rootDir, now = Date.now(), options = {}) {
41
+ const { db, root } = await ledger(rootDir);
42
+ try {
43
+ const all = db.prepare("SELECT * FROM tasks ORDER BY id").all();
44
+ const selected = options.taskId ? all.filter(task => task.id === options.taskId) : all;
45
+ const limit = Math.max(1, Math.min(options.eventLimit ?? 20, 50));
46
+ const events = db.prepare("SELECT * FROM events WHERE (? IS NULL OR task_id=?) AND (? IS NULL OR id<?) ORDER BY id DESC LIMIT ?")
47
+ .all(options.taskId ?? null, options.taskId ?? null, options.beforeEventId ?? null, options.beforeEventId ?? null, limit);
48
+ return { root, advisory: true, total: selected.length, omitted: Math.max(0, selected.length - 100), tasks: selected.slice(0, 100).map(task => describe(task, all, now)),
49
+ readyTaskIds: selected.filter(task => describe(task, all, now).ready).slice(0, 100).map(task => task.id),
50
+ events, olderEventsBefore: events.length === limit ? events.at(-1).id : null };
51
+ }
52
+ finally {
53
+ db.close();
54
+ }
55
+ }
56
+ export async function teamTask(options, now = Date.now()) {
57
+ const { db, root } = await ledger(options.rootDir);
58
+ try {
59
+ const files = [...new Set((options.files ?? []).map(file => {
60
+ const path = relative(root, canonicalProjectPath(resolveProjectPath(root, file, "advisory lease"))).split("\\").join("/");
61
+ if (!path || path === ".")
62
+ throw new Error("Lease individual files, not an entire root.");
63
+ try {
64
+ if (statSync(resolveProjectPath(root, path)).isDirectory())
65
+ throw new Error("Lease individual files, not directories.");
66
+ }
67
+ catch (error) {
68
+ if (error.code !== "ENOENT")
69
+ throw error;
70
+ }
71
+ return path;
72
+ }))];
73
+ let handoff;
74
+ if (options.action === "handoff") {
75
+ const artifact = options.handoffId ? await readArtifact(root, options.handoffId) : null;
76
+ if (!artifact || artifact.kind !== "handoff" || await realpath(artifact.repoRoot) !== root)
77
+ throw new Error("A handoff artifact from this workspace is required.");
78
+ handoff = JSON.stringify({ id: artifact.id, root });
79
+ }
80
+ return db.transaction(() => {
81
+ const all = db.prepare("SELECT * FROM tasks").all();
82
+ const id = options.taskId ?? (options.action === "create" ? randomUUID() : "");
83
+ let task = all.find(item => item.id === id);
84
+ const dependencies = [...new Set(options.dependencies ?? [])];
85
+ if (options.action === "create") {
86
+ if (task)
87
+ throw new Error("Task already exists.");
88
+ if (!options.title?.trim())
89
+ throw new Error("Task title is required.");
90
+ task = { id, title: options.title, state: "queued", dependencies: JSON.stringify(dependencies), owner: null, root, expires: 0, files: "[]", handoff: null };
91
+ }
92
+ else if (!task)
93
+ throw new Error("Unknown task.");
94
+ else
95
+ task = { ...task };
96
+ const owned = task.expires > now && task.owner !== null;
97
+ if (owned && task.owner !== options.owner)
98
+ throw new Error(`Task is owned by ${task.owner}; renew or release through that owner.`);
99
+ if (options.action === "update") {
100
+ if (options.title !== undefined)
101
+ task.title = options.title;
102
+ if (options.dependencies !== undefined)
103
+ task.dependencies = JSON.stringify(dependencies);
104
+ }
105
+ const proposed = all.filter(item => item.id !== id).concat(task);
106
+ const visited = new Set();
107
+ const visit = (key, path) => {
108
+ if (path.has(key))
109
+ throw new Error("Task dependencies form a cycle.");
110
+ if (visited.has(key))
111
+ return;
112
+ const item = proposed.find(value => value.id === key);
113
+ if (!item)
114
+ throw new Error(`Unknown dependency: ${key}`);
115
+ const next = new Set(path);
116
+ next.add(key);
117
+ for (const dependency of JSON.parse(item.dependencies))
118
+ visit(dependency, next);
119
+ visited.add(key);
120
+ };
121
+ visit(id, new Set());
122
+ const warnings = [];
123
+ if (["claim", "renew"].includes(options.action)) {
124
+ if (!options.owner?.trim())
125
+ throw new Error("An explicit agent owner is required.");
126
+ if (options.action === "renew" && (!owned || task.owner !== options.owner || task.root !== root))
127
+ throw new Error("Cannot renew an expired or foreign lease; claim the task again.");
128
+ if (task.state === "completed" || task.state === "blocked")
129
+ throw new Error("Completed or blocked task cannot be claimed; update its dependencies or release it first.");
130
+ if (JSON.parse(task.dependencies).some(dep => !all.some(item => item.id === dep && item.state === "completed")))
131
+ throw new Error("Task dependencies are incomplete.");
132
+ const leased = options.action === "renew" && options.files === undefined ? JSON.parse(task.files) : files;
133
+ for (const other of all.filter(item => item.id !== id && item.expires > now)) {
134
+ const overlap = leased.filter(file => JSON.parse(other.files).includes(file));
135
+ if (!overlap.length)
136
+ continue;
137
+ if (other.root === root)
138
+ throw new Error(`File lease conflict with ${other.id}: ${overlap.join(", ")}`);
139
+ warnings.push(`Other worktree ${other.root} has overlapping work in ${other.id}: ${overlap.join(", ")}`);
140
+ }
141
+ task.state = "active";
142
+ task.owner = options.owner;
143
+ task.root = root;
144
+ task.files = JSON.stringify(leased);
145
+ task.expires = now + LEASE_MS;
146
+ }
147
+ else if (["release", "block", "complete", "handoff"].includes(options.action)) {
148
+ if (options.action !== "release" && (!owned || task.owner !== options.owner || task.root !== root))
149
+ throw new Error("An active claim in this worktree is required.");
150
+ if (options.action === "handoff")
151
+ task.handoff = handoff;
152
+ else {
153
+ task.state = options.action === "complete" ? "completed" : options.action === "block" ? "blocked" : "queued";
154
+ task.owner = null;
155
+ task.expires = 0;
156
+ task.files = "[]";
157
+ }
158
+ }
159
+ db.prepare("INSERT OR REPLACE INTO tasks VALUES (@id,@title,@state,@dependencies,@owner,@root,@expires,@files,@handoff)").run(task);
160
+ // Keep each handoff and claim snapshot even after a later owner replaces
161
+ // the task's current fields. Old schema rows remain valid empty details.
162
+ db.prepare("INSERT INTO events(task_id,at,action,owner,root,note,details) VALUES(?,?,?,?,?,?,?)")
163
+ .run(id, now, options.action, options.owner ?? null, root, options.note ?? "", JSON.stringify(task));
164
+ return { task: describe(task, proposed, now), warnings, advisory: true, leaseMs: LEASE_MS };
165
+ }).immediate();
166
+ }
167
+ finally {
168
+ db.close();
169
+ }
170
+ }
171
+ //# sourceMappingURL=team-ledger.js.map