codetrellis 0.0.0-stage → 0.2.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 (449) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +27 -2
  3. package/bin/codetrellis.mjs +4 -0
  4. package/package.json +43 -4
  5. package/reader/material-reader.mjs +130346 -0
  6. package/resources/tree-sitter/README.md +150 -0
  7. package/resources/tree-sitter/tree-sitter-c-sharp.wasm +0 -0
  8. package/resources/tree-sitter/tree-sitter-go.wasm +0 -0
  9. package/resources/tree-sitter/tree-sitter-java.wasm +0 -0
  10. package/resources/tree-sitter/tree-sitter-javascript.wasm +0 -0
  11. package/resources/tree-sitter/tree-sitter-kotlin.wasm +0 -0
  12. package/resources/tree-sitter/tree-sitter-php.wasm +0 -0
  13. package/resources/tree-sitter/tree-sitter-python.wasm +0 -0
  14. package/resources/tree-sitter/tree-sitter-ruby.wasm +0 -0
  15. package/resources/tree-sitter/tree-sitter-rust.wasm +0 -0
  16. package/resources/tree-sitter/tree-sitter-swift.wasm +0 -0
  17. package/resources/tree-sitter/tree-sitter-tsx.wasm +0 -0
  18. package/resources/tree-sitter/tree-sitter-typescript.wasm +0 -0
  19. package/resources/tree-sitter/tree-sitter.wasm +0 -0
  20. package/src/backend/agent/claude-code-watcher.js +270 -0
  21. package/src/backend/index.js +8 -0
  22. package/src/backend/lib/sha256-file.js +39 -0
  23. package/src/backend/lib/zip-entries.js +98 -0
  24. package/src/backend/lifecycle.js +102 -0
  25. package/src/backend/mcp/binding-headers.js +54 -0
  26. package/src/backend/mcp/client-identity.js +44 -0
  27. package/src/backend/mcp/connector/command.js +110 -0
  28. package/src/backend/mcp/connector/core.js +278 -0
  29. package/src/backend/mcp/connector/files.js +121 -0
  30. package/src/backend/mcp/connector/hook.js +284 -0
  31. package/src/backend/mcp/connector/main.js +126 -0
  32. package/src/backend/mcp/connector/sse-upstream.js +152 -0
  33. package/src/backend/mcp/helpers.js +43 -0
  34. package/src/backend/mcp/prompt-builders.js +104 -0
  35. package/src/backend/mcp/resources.js +197 -0
  36. package/src/backend/mcp/server.js +813 -0
  37. package/src/backend/mcp/skill-guide.js +1528 -0
  38. package/src/backend/mcp/tools/architecture-tools.js +273 -0
  39. package/src/backend/mcp/tools/audio-tools.js +117 -0
  40. package/src/backend/mcp/tools/awareness-tools.js +623 -0
  41. package/src/backend/mcp/tools/budget-tools.js +185 -0
  42. package/src/backend/mcp/tools/channel-tools.js +205 -0
  43. package/src/backend/mcp/tools/contribution-tools.js +181 -0
  44. package/src/backend/mcp/tools/drift-tools.js +252 -0
  45. package/src/backend/mcp/tools/git-tools.js +316 -0
  46. package/src/backend/mcp/tools/governance-tools.js +175 -0
  47. package/src/backend/mcp/tools/graph-tools.js +181 -0
  48. package/src/backend/mcp/tools/intake-tools.js +244 -0
  49. package/src/backend/mcp/tools/mobile-tools.js +118 -0
  50. package/src/backend/mcp/tools/peer-tools.js +330 -0
  51. package/src/backend/mcp/tools/plan-item-tools.js +1601 -0
  52. package/src/backend/mcp/tools/plan-tools.js +680 -0
  53. package/src/backend/mcp/tools/presence-tools.js +185 -0
  54. package/src/backend/mcp/tools/project-config-tools.js +150 -0
  55. package/src/backend/mcp/tools/review-tools.js +172 -0
  56. package/src/backend/mcp/tools/session-tools.js +554 -0
  57. package/src/backend/mcp/tools/system-docs-tools.js +168 -0
  58. package/src/backend/mcp/tools/terminal-tools.js +186 -0
  59. package/src/backend/mcp/tools/test-tools.js +117 -0
  60. package/src/backend/mcp/tools/ui-tools.js +356 -0
  61. package/src/backend/mcp/types.js +15 -0
  62. package/src/backend/middleware/local-auth.js +116 -0
  63. package/src/backend/server.js +5951 -0
  64. package/src/backend/services/agent-event-log.js +350 -0
  65. package/src/backend/services/architecture-rule.js +584 -0
  66. package/src/backend/services/architecture-rules.js +275 -0
  67. package/src/backend/services/artefact-content-service.js +181 -0
  68. package/src/backend/services/artefact-service.js +305 -0
  69. package/src/backend/services/artefact-watcher.js +167 -0
  70. package/src/backend/services/ast-parser.js +327 -0
  71. package/src/backend/services/audio-buffer-service.js +152 -0
  72. package/src/backend/services/awareness-notices.js +139 -0
  73. package/src/backend/services/awareness-replies.js +194 -0
  74. package/src/backend/services/awareness-service.js +344 -0
  75. package/src/backend/services/awareness-signals.js +267 -0
  76. package/src/backend/services/baseline-store.js +83 -0
  77. package/src/backend/services/branch-workstreams.js +341 -0
  78. package/src/backend/services/breakpoint-service.js +584 -0
  79. package/src/backend/services/brief-service.js +299 -0
  80. package/src/backend/services/budget-service.js +528 -0
  81. package/src/backend/services/callsites/base.js +15 -0
  82. package/src/backend/services/callsites/csharp.js +148 -0
  83. package/src/backend/services/callsites/go.js +163 -0
  84. package/src/backend/services/callsites/index.js +53 -0
  85. package/src/backend/services/callsites/kotlin.js +123 -0
  86. package/src/backend/services/callsites/process-env.js +125 -0
  87. package/src/backend/services/callsites/python.js +91 -0
  88. package/src/backend/services/callsites/ruby.js +164 -0
  89. package/src/backend/services/callsites/shared.js +198 -0
  90. package/src/backend/services/callsites/swift.js +115 -0
  91. package/src/backend/services/callsites/typescript.js +87 -0
  92. package/src/backend/services/capability-token.js +108 -0
  93. package/src/backend/services/change-check.js +156 -0
  94. package/src/backend/services/channel-dispatcher-service.js +235 -0
  95. package/src/backend/services/channel-event-file-service.js +125 -0
  96. package/src/backend/services/channel-event-service.js +297 -0
  97. package/src/backend/services/check-runs.js +177 -0
  98. package/src/backend/services/checkout-identity.js +73 -0
  99. package/src/backend/services/claude-code-parallel.js +221 -0
  100. package/src/backend/services/claude-desktop-config.js +186 -0
  101. package/src/backend/services/clock.js +57 -0
  102. package/src/backend/services/cloud-files.js +191 -0
  103. package/src/backend/services/coalesce.js +50 -0
  104. package/src/backend/services/code-breakpoints.js +291 -0
  105. package/src/backend/services/comment-service.js +168 -0
  106. package/src/backend/services/commit-attribution.js +134 -0
  107. package/src/backend/services/commit-edges.js +99 -0
  108. package/src/backend/services/confined-fs.js +241 -0
  109. package/src/backend/services/conformity-gate.js +132 -0
  110. package/src/backend/services/contribution-service.js +409 -0
  111. package/src/backend/services/coverage-service.js +173 -0
  112. package/src/backend/services/criteria-service.js +721 -0
  113. package/src/backend/services/criterion-checks.js +387 -0
  114. package/src/backend/services/criterion-loop-service.js +411 -0
  115. package/src/backend/services/cross-system-service.js +231 -0
  116. package/src/backend/services/database.js +916 -0
  117. package/src/backend/services/db-schema.js +1358 -0
  118. package/src/backend/services/deviation-service.js +344 -0
  119. package/src/backend/services/diff-engine.js +168 -0
  120. package/src/backend/services/evidence.js +363 -0
  121. package/src/backend/services/external-intake-service.js +269 -0
  122. package/src/backend/services/external-pointer-service.js +195 -0
  123. package/src/backend/services/external-refs-service.js +214 -0
  124. package/src/backend/services/file-history.js +158 -0
  125. package/src/backend/services/file-watcher.js +193 -0
  126. package/src/backend/services/folder-requests.js +118 -0
  127. package/src/backend/services/freeze-service.js +189 -0
  128. package/src/backend/services/gemini-cli-hook.js +172 -0
  129. package/src/backend/services/git-activity-service.js +325 -0
  130. package/src/backend/services/git-blobs.js +70 -0
  131. package/src/backend/services/git-branches.js +357 -0
  132. package/src/backend/services/git-checkout.js +153 -0
  133. package/src/backend/services/git-commit-service.js +91 -0
  134. package/src/backend/services/git-env.js +121 -0
  135. package/src/backend/services/git-identity.js +84 -0
  136. package/src/backend/services/git-refs.js +386 -0
  137. package/src/backend/services/git-safety.js +58 -0
  138. package/src/backend/services/grant-guard.js +67 -0
  139. package/src/backend/services/html-view-policy.js +135 -0
  140. package/src/backend/services/human-decision.js +55 -0
  141. package/src/backend/services/importers.js +159 -0
  142. package/src/backend/services/intent-service.js +105 -0
  143. package/src/backend/services/ipc-dispatcher.js +164 -0
  144. package/src/backend/services/item-git-state.js +208 -0
  145. package/src/backend/services/line-changes.js +232 -0
  146. package/src/backend/services/line-history.js +174 -0
  147. package/src/backend/services/local-api-changes.js +40 -0
  148. package/src/backend/services/logger.js +217 -0
  149. package/src/backend/services/material-footprints.js +203 -0
  150. package/src/backend/services/material-place.js +82 -0
  151. package/src/backend/services/material-reader/child.js +4 -0
  152. package/src/backend/services/material-reader/docx-markdown.js +198 -0
  153. package/src/backend/services/material-reader/fixtures.test-helper.js +169 -0
  154. package/src/backend/services/material-reader/quote.js +44 -0
  155. package/src/backend/services/material-reader/read.js +430 -0
  156. package/src/backend/services/material-reader/reader-host.js +202 -0
  157. package/src/backend/services/material-signals.js +141 -0
  158. package/src/backend/services/mcp-capabilities.js +390 -0
  159. package/src/backend/services/mdns-service.js +304 -0
  160. package/src/backend/services/mobile-api-server.js +281 -0
  161. package/src/backend/services/mobile-approvals.js +306 -0
  162. package/src/backend/services/mobile-awareness.js +180 -0
  163. package/src/backend/services/mobile-breakpoints.js +115 -0
  164. package/src/backend/services/mobile-budget.js +98 -0
  165. package/src/backend/services/mobile-freeze.js +106 -0
  166. package/src/backend/services/mobile-proposals.js +100 -0
  167. package/src/backend/services/mobile-rpc-service.js +1289 -0
  168. package/src/backend/services/mobile-workstreams.js +160 -0
  169. package/src/backend/services/monorepo-detector.js +131 -0
  170. package/src/backend/services/other-work.js +45 -0
  171. package/src/backend/services/pack-seal.js +129 -0
  172. package/src/backend/services/paired-device-service.js +192 -0
  173. package/src/backend/services/pairing-server.js +323 -0
  174. package/src/backend/services/pairing-service.js +200 -0
  175. package/src/backend/services/pantry-resolution-service.js +166 -0
  176. package/src/backend/services/parsers/base.js +124 -0
  177. package/src/backend/services/parsers/csharp.js +224 -0
  178. package/src/backend/services/parsers/go.js +180 -0
  179. package/src/backend/services/parsers/index.js +101 -0
  180. package/src/backend/services/parsers/java.js +103 -0
  181. package/src/backend/services/parsers/kotlin.js +252 -0
  182. package/src/backend/services/parsers/php.js +113 -0
  183. package/src/backend/services/parsers/python.js +189 -0
  184. package/src/backend/services/parsers/ruby.js +212 -0
  185. package/src/backend/services/parsers/rust.js +97 -0
  186. package/src/backend/services/parsers/swift.js +221 -0
  187. package/src/backend/services/parsers/typescript.js +235 -0
  188. package/src/backend/services/pattern-scan.js +65 -0
  189. package/src/backend/services/patterns.js +281 -0
  190. package/src/backend/services/peer-audit-service.js +123 -0
  191. package/src/backend/services/peer-auth.js +153 -0
  192. package/src/backend/services/peer-capabilities.js +209 -0
  193. package/src/backend/services/peer-connection-service.js +450 -0
  194. package/src/backend/services/peer-grants.js +33 -0
  195. package/src/backend/services/persistence.js +116 -0
  196. package/src/backend/services/personal-sync-service.js +232 -0
  197. package/src/backend/services/pipeline-approvals.js +72 -0
  198. package/src/backend/services/pipeline.js +232 -0
  199. package/src/backend/services/plan-arrivals.js +68 -0
  200. package/src/backend/services/plan-changes-service.js +273 -0
  201. package/src/backend/services/plan-conflict-service.js +288 -0
  202. package/src/backend/services/plan-dependencies.js +91 -0
  203. package/src/backend/services/plan-doc-guard.js +90 -0
  204. package/src/backend/services/plan-documents-service.js +275 -0
  205. package/src/backend/services/plan-event-service.js +154 -0
  206. package/src/backend/services/plan-file-refs.js +106 -0
  207. package/src/backend/services/plan-file-service.js +1564 -0
  208. package/src/backend/services/plan-history-service.js +156 -0
  209. package/src/backend/services/plan-import-service.js +261 -0
  210. package/src/backend/services/plan-item-service.js +1223 -0
  211. package/src/backend/services/plan-migrate-service.js +395 -0
  212. package/src/backend/services/plan-overlay-service.js +173 -0
  213. package/src/backend/services/plan-phases-service.js +182 -0
  214. package/src/backend/services/plan-progress-service.js +134 -0
  215. package/src/backend/services/plan-review-service.js +262 -0
  216. package/src/backend/services/plan-service.js +682 -0
  217. package/src/backend/services/plan-status.js +113 -0
  218. package/src/backend/services/plan-template-publish-service.js +217 -0
  219. package/src/backend/services/plan-templates-service.js +242 -0
  220. package/src/backend/services/plan-templates.js +1164 -0
  221. package/src/backend/services/planned-overlap-actions.js +200 -0
  222. package/src/backend/services/plans-home.js +224 -0
  223. package/src/backend/services/play-forward.js +256 -0
  224. package/src/backend/services/playback-service.js +117 -0
  225. package/src/backend/services/power-service.js +167 -0
  226. package/src/backend/services/power-signals.js +81 -0
  227. package/src/backend/services/pr-draft-service.js +142 -0
  228. package/src/backend/services/presence-service.js +122 -0
  229. package/src/backend/services/pricing.js +60 -0
  230. package/src/backend/services/project-config-service.js +474 -0
  231. package/src/backend/services/project-scanner.js +184 -0
  232. package/src/backend/services/projection-service.js +69 -0
  233. package/src/backend/services/push-notification-service.js +288 -0
  234. package/src/backend/services/recent-projects-service.js +204 -0
  235. package/src/backend/services/record-chain.js +162 -0
  236. package/src/backend/services/recurrence-rule.js +63 -0
  237. package/src/backend/services/recurring-agent.js +89 -0
  238. package/src/backend/services/recurring-scheduler.js +77 -0
  239. package/src/backend/services/recurring-service.js +276 -0
  240. package/src/backend/services/reference-service.js +169 -0
  241. package/src/backend/services/release-public-key.js +30 -0
  242. package/src/backend/services/release-signature.js +64 -0
  243. package/src/backend/services/remote-audio-service.js +224 -0
  244. package/src/backend/services/remote-interaction-service.js +275 -0
  245. package/src/backend/services/remote-terminal-service.js +324 -0
  246. package/src/backend/services/rendition/child/main.js +76 -0
  247. package/src/backend/services/rendition/engine-host.js +249 -0
  248. package/src/backend/services/rendition/engine-lock.js +39 -0
  249. package/src/backend/services/rendition/engine-lock.json +14 -0
  250. package/src/backend/services/rendition/engine-manifest.js +97 -0
  251. package/src/backend/services/rendition/network-proof.js +73 -0
  252. package/src/backend/services/rendition/rendition-service.js +175 -0
  253. package/src/backend/services/replay-frames.js +387 -0
  254. package/src/backend/services/replay-state.js +201 -0
  255. package/src/backend/services/resolvers/base.js +108 -0
  256. package/src/backend/services/resolvers/csharp.js +109 -0
  257. package/src/backend/services/resolvers/go.js +105 -0
  258. package/src/backend/services/resolvers/index.js +60 -0
  259. package/src/backend/services/resolvers/java.js +63 -0
  260. package/src/backend/services/resolvers/kotlin.js +109 -0
  261. package/src/backend/services/resolvers/php.js +89 -0
  262. package/src/backend/services/resolvers/python.js +154 -0
  263. package/src/backend/services/resolvers/ruby.js +103 -0
  264. package/src/backend/services/resolvers/rust.js +77 -0
  265. package/src/backend/services/resolvers/swift.js +98 -0
  266. package/src/backend/services/resolvers/typescript.js +71 -0
  267. package/src/backend/services/retention.js +54 -0
  268. package/src/backend/services/review-architecture.js +236 -0
  269. package/src/backend/services/review-attest.js +68 -0
  270. package/src/backend/services/review-bundle.js +226 -0
  271. package/src/backend/services/review-graduation.js +93 -0
  272. package/src/backend/services/review-host/bitbucket.js +79 -0
  273. package/src/backend/services/review-host/detect.js +80 -0
  274. package/src/backend/services/review-host/github.js +97 -0
  275. package/src/backend/services/review-host/gitlab.js +77 -0
  276. package/src/backend/services/review-host/host-state.js +103 -0
  277. package/src/backend/services/review-host/http.js +58 -0
  278. package/src/backend/services/review-host/switch.js +120 -0
  279. package/src/backend/services/review-marks.js +72 -0
  280. package/src/backend/services/review-notes.js +169 -0
  281. package/src/backend/services/review-other-work.js +90 -0
  282. package/src/backend/services/review-queue-service.js +147 -0
  283. package/src/backend/services/review-risk.js +127 -0
  284. package/src/backend/services/review-task.js +121 -0
  285. package/src/backend/services/rule-approvals.js +268 -0
  286. package/src/backend/services/rule-baseline.js +134 -0
  287. package/src/backend/services/rule-changes.js +162 -0
  288. package/src/backend/services/rule-preview.js +47 -0
  289. package/src/backend/services/rule-proposals.js +104 -0
  290. package/src/backend/services/rule-scope.js +76 -0
  291. package/src/backend/services/rulebook.js +286 -0
  292. package/src/backend/services/rules-at.js +56 -0
  293. package/src/backend/services/rules-overview.js +88 -0
  294. package/src/backend/services/schema-reconciler.js +250 -0
  295. package/src/backend/services/secret-store.js +119 -0
  296. package/src/backend/services/section-workstreams.js +95 -0
  297. package/src/backend/services/self-write-tracker.js +75 -0
  298. package/src/backend/services/sensor-bridge-service.js +285 -0
  299. package/src/backend/services/session-service.js +192 -0
  300. package/src/backend/services/settings-service.js +324 -0
  301. package/src/backend/services/signal-breakpoints.js +172 -0
  302. package/src/backend/services/signed-approval-record.js +86 -0
  303. package/src/backend/services/signed-approvals.js +244 -0
  304. package/src/backend/services/signoff-pack.js +328 -0
  305. package/src/backend/services/signoff-rows.js +114 -0
  306. package/src/backend/services/skill-arrival-service.js +138 -0
  307. package/src/backend/services/skill-model.js +193 -0
  308. package/src/backend/services/skill-use-service.js +140 -0
  309. package/src/backend/services/skills-service.js +150 -0
  310. package/src/backend/services/snapshot-compare-service.js +397 -0
  311. package/src/backend/services/source-control.js +189 -0
  312. package/src/backend/services/spec-links-service.js +123 -0
  313. package/src/backend/services/spec-proposal-withdraw.js +50 -0
  314. package/src/backend/services/spec-proposals-service.js +470 -0
  315. package/src/backend/services/sql/embedded.js +95 -0
  316. package/src/backend/services/sql/index.js +63 -0
  317. package/src/backend/services/sql/refs.js +357 -0
  318. package/src/backend/services/sql/schema.js +312 -0
  319. package/src/backend/services/sql/tokenizer.js +195 -0
  320. package/src/backend/services/stack-overlaps.js +117 -0
  321. package/src/backend/services/stack-service.js +225 -0
  322. package/src/backend/services/state-sync-service.js +384 -0
  323. package/src/backend/services/stuck-sensor-service.js +200 -0
  324. package/src/backend/services/system-discovery.js +481 -0
  325. package/src/backend/services/system-docs-service.js +701 -0
  326. package/src/backend/services/task-attachments-service.js +340 -0
  327. package/src/backend/services/task-grounding.js +60 -0
  328. package/src/backend/services/task-records/check-run-record.js +146 -0
  329. package/src/backend/services/task-records/check-runs.js +115 -0
  330. package/src/backend/services/task-records/heads.js +88 -0
  331. package/src/backend/services/task-records/material-reads.js +225 -0
  332. package/src/backend/services/task-records/read-record.js +100 -0
  333. package/src/backend/services/task-records/record.js +173 -0
  334. package/src/backend/services/task-records/run-record.js +136 -0
  335. package/src/backend/services/task-records/shared-state.js +548 -0
  336. package/src/backend/services/task-records/signing.js +140 -0
  337. package/src/backend/services/task-records/split-signals.js +52 -0
  338. package/src/backend/services/task-records/test-runs.js +164 -0
  339. package/src/backend/services/task-records/trust.js +243 -0
  340. package/src/backend/services/task-rules.js +81 -0
  341. package/src/backend/services/task-workstreams.js +90 -0
  342. package/src/backend/services/terminal-history-service.js +266 -0
  343. package/src/backend/services/terminal-service.js +267 -0
  344. package/src/backend/services/test-clock.js +53 -0
  345. package/src/backend/services/tests/grounding.js +266 -0
  346. package/src/backend/services/tests/junit.js +104 -0
  347. package/src/backend/services/tests/teammate-runs.js +134 -0
  348. package/src/backend/services/tests/test-results.js +234 -0
  349. package/src/backend/services/tree-watcher.js +204 -0
  350. package/src/backend/services/trellis-service.js +204 -0
  351. package/src/backend/services/trusted-roots.js +186 -0
  352. package/src/backend/services/update-download-service.js +342 -0
  353. package/src/backend/services/update-service.js +266 -0
  354. package/src/backend/services/watch-ignore.js +76 -0
  355. package/src/backend/services/webhook-egress.js +206 -0
  356. package/src/backend/services/webrtc-service.js +413 -0
  357. package/src/backend/services/work-changes.js +59 -0
  358. package/src/backend/services/workstream-binding.js +82 -0
  359. package/src/backend/services/workstream-commits.js +116 -0
  360. package/src/backend/services/workstream-imports.js +177 -0
  361. package/src/backend/services/workstream-service.js +335 -0
  362. package/src/backend/services/workstream-symbols.js +223 -0
  363. package/src/backend/services/workstream-watch-service.js +391 -0
  364. package/src/backend/services/worktree-service.js +235 -0
  365. package/src/cli/agent.js +100 -0
  366. package/src/cli/args.js +201 -0
  367. package/src/cli/conformity.js +106 -0
  368. package/src/cli/desktop.js +91 -0
  369. package/src/cli/main.js +409 -0
  370. package/src/cli/pipeline.js +109 -0
  371. package/src/cli/plan-verbs.js +259 -0
  372. package/src/cli/review-adapters.js +218 -0
  373. package/src/cli/review-output.js +93 -0
  374. package/src/cli/review-post.js +89 -0
  375. package/src/cli/review-sink.js +183 -0
  376. package/src/cli/review-skill.js +44 -0
  377. package/src/cli/review-verify.js +104 -0
  378. package/src/cli/review.js +386 -0
  379. package/src/cli/sarif.js +148 -0
  380. package/src/cli/verbs.js +359 -0
  381. package/src/shared/build-info.js +39 -0
  382. package/src/shared/lib/agent-review.js +199 -0
  383. package/src/shared/lib/agent-turns.js +140 -0
  384. package/src/shared/lib/awareness-digest.js +120 -0
  385. package/src/shared/lib/branch-name.js +45 -0
  386. package/src/shared/lib/breakpoint-words.js +118 -0
  387. package/src/shared/lib/budget-words.js +56 -0
  388. package/src/shared/lib/burst.js +69 -0
  389. package/src/shared/lib/call-entry.js +105 -0
  390. package/src/shared/lib/check-compare.js +42 -0
  391. package/src/shared/lib/check-words.js +216 -0
  392. package/src/shared/lib/csv.js +62 -0
  393. package/src/shared/lib/folder-entry.js +87 -0
  394. package/src/shared/lib/freeze-words.js +60 -0
  395. package/src/shared/lib/fuzzy.js +84 -0
  396. package/src/shared/lib/git-state-words.js +80 -0
  397. package/src/shared/lib/grep-entry.js +86 -0
  398. package/src/shared/lib/grounding-line.js +61 -0
  399. package/src/shared/lib/import-line.js +71 -0
  400. package/src/shared/lib/item-status.js +249 -0
  401. package/src/shared/lib/line-changes.js +53 -0
  402. package/src/shared/lib/locator.js +71 -0
  403. package/src/shared/lib/matcher.js +120 -0
  404. package/src/shared/lib/merge-order.js +65 -0
  405. package/src/shared/lib/open-findings.js +68 -0
  406. package/src/shared/lib/other-work.js +108 -0
  407. package/src/shared/lib/package-entry.js +142 -0
  408. package/src/shared/lib/plan-vocab.js +40 -0
  409. package/src/shared/lib/pptx-xml.js +86 -0
  410. package/src/shared/lib/proposal-words.js +61 -0
  411. package/src/shared/lib/recurrence.js +183 -0
  412. package/src/shared/lib/references.js +72 -0
  413. package/src/shared/lib/rule-pattern.js +56 -0
  414. package/src/shared/lib/sdp-fingerprint.js +115 -0
  415. package/src/shared/lib/sdp-minimal.js +123 -0
  416. package/src/shared/lib/secret-paths.js +34 -0
  417. package/src/shared/lib/signal-words.js +172 -0
  418. package/src/shared/lib/signoff.js +56 -0
  419. package/src/shared/lib/skills-note.js +60 -0
  420. package/src/shared/lib/spec-sections.js +78 -0
  421. package/src/shared/lib/symbol-entry.js +60 -0
  422. package/src/shared/lib/tool-phrasing.js +338 -0
  423. package/src/shared/lib/turn-gap.js +27 -0
  424. package/src/shared/lib/workstream-words.js +38 -0
  425. package/src/shared/lib/xlsx-xml.js +144 -0
  426. package/src/shared/lib/zip-reader.js +99 -0
  427. package/src/shared/types/agent.js +27 -0
  428. package/src/shared/types/architecture-rules.js +30 -0
  429. package/src/shared/types/ast.js +15 -0
  430. package/src/shared/types/breakpoint.js +33 -0
  431. package/src/shared/types/channel.js +41 -0
  432. package/src/shared/types/criteria.js +15 -0
  433. package/src/shared/types/graph.js +15 -0
  434. package/src/shared/types/index.js +53 -0
  435. package/src/shared/types/peer.js +36 -0
  436. package/src/shared/types/pipeline.js +15 -0
  437. package/src/shared/types/plan.js +15 -0
  438. package/src/shared/types/play-forward.js +15 -0
  439. package/src/shared/types/power.js +15 -0
  440. package/src/shared/types/presence.js +15 -0
  441. package/src/shared/types/project-config.js +35 -0
  442. package/src/shared/types/project.js +15 -0
  443. package/src/shared/types/record.js +15 -0
  444. package/src/shared/types/recurring.js +15 -0
  445. package/src/shared/types/review.js +15 -0
  446. package/src/shared/types/settings.js +114 -0
  447. package/src/shared/types/stack.js +15 -0
  448. package/src/shared/types/system-doc.js +15 -0
  449. package/src/shared/types/system.js +15 -0
@@ -0,0 +1,916 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var database_exports = {};
29
+ __export(database_exports, {
30
+ clearAstData: () => clearAstData,
31
+ exportDatabase: () => exportDatabase,
32
+ getAllFileHashes: () => getAllFileHashes,
33
+ getAllGraphEdges: () => getAllGraphEdges,
34
+ getArchitectureSummary: () => getArchitectureSummary,
35
+ getCallEdges: () => getCallEdges,
36
+ getDb: () => getDb,
37
+ getDbStats: () => getDbStats,
38
+ getDependencyEdges: () => getDependencyEdges,
39
+ getFileDependencies: () => getFileDependencies,
40
+ getFileFacts: () => getFileFacts,
41
+ getFileHash: () => getFileHash,
42
+ getFileSymbols: () => getFileSymbols,
43
+ getFileSymbolsWithMembers: () => getFileSymbolsWithMembers,
44
+ getImportResolutionContext: () => getImportResolutionContext,
45
+ getPackageEdges: () => getPackageEdges,
46
+ hasPatternCallsites: () => hasPatternCallsites,
47
+ initDatabase: () => initDatabase,
48
+ removeStaleFiles: () => removeStaleFiles,
49
+ replacePatternCallsites: () => replacePatternCallsites,
50
+ resolutionContextRoot: () => resolutionContextRoot,
51
+ resolveImports: () => resolveImports,
52
+ resolvePendingImports: () => resolvePendingImports,
53
+ searchSymbols: () => searchSymbols,
54
+ setImportResolutionContext: () => setImportResolutionContext,
55
+ storeParsedFile: () => storeParsedFile
56
+ });
57
+ module.exports = __toCommonJS(database_exports);
58
+ var import_node_fs = __toESM(require("node:fs"));
59
+ var import_node_path = __toESM(require("node:path"));
60
+ var import_persistence = require("./persistence");
61
+ var import_resolvers = require("./resolvers");
62
+ var import_package_entry = require("../../shared/lib/package-entry");
63
+ var import_call_entry = require("../../shared/lib/call-entry");
64
+ var import_folder_entry = require("../../shared/lib/folder-entry");
65
+ var import_schema_reconciler = require("./schema-reconciler");
66
+ var import_importers = require("./importers");
67
+ var import_db_schema = require("./db-schema");
68
+ const BetterSqlite3 = require("better-sqlite3");
69
+ let bdb = null;
70
+ let db = null;
71
+ function makeShim(conn) {
72
+ return {
73
+ run(sql, params) {
74
+ if (params && params.length) {
75
+ conn.prepare(sql).run(...params);
76
+ } else {
77
+ conn.exec(sql);
78
+ }
79
+ },
80
+ exec(sql, params) {
81
+ const stmt = conn.prepare(sql);
82
+ if (!stmt.reader) {
83
+ stmt.run(...params ?? []);
84
+ return [];
85
+ }
86
+ stmt.raw(true);
87
+ const values = stmt.all(...params ?? []);
88
+ if (values.length === 0) return [];
89
+ const columns = stmt.columns().map((c) => c.name);
90
+ return [{ columns, values }];
91
+ },
92
+ export() {
93
+ return conn.serialize();
94
+ },
95
+ close() {
96
+ conn.close();
97
+ }
98
+ };
99
+ }
100
+ function isDatabaseCorrupt(conn) {
101
+ try {
102
+ const result = conn.pragma("quick_check", { simple: true });
103
+ return result !== "ok";
104
+ } catch (err) {
105
+ const msg = err instanceof Error ? err.message : String(err);
106
+ return /malformed|not a database|corrupt|disk image|encrypted/i.test(msg);
107
+ }
108
+ }
109
+ function quarantineCorruptDatabase(dbPath) {
110
+ const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
111
+ for (const suffix of ["", "-wal", "-shm"]) {
112
+ const src = `${dbPath}${suffix}`;
113
+ if (!import_node_fs.default.existsSync(src)) continue;
114
+ const dest = `${dbPath}.corrupt-${stamp}${suffix}`;
115
+ try {
116
+ import_node_fs.default.renameSync(src, dest);
117
+ console.error(`[DB] Quarantined ${src} -> ${dest}`);
118
+ } catch {
119
+ try {
120
+ import_node_fs.default.unlinkSync(src);
121
+ } catch {
122
+ }
123
+ }
124
+ }
125
+ }
126
+ async function initDatabase() {
127
+ if (db) return;
128
+ (0, import_persistence.ensureDataDir)();
129
+ const dbPath = import_node_path.default.join((0, import_persistence.getDataDir)(), "data.db");
130
+ try {
131
+ bdb = new BetterSqlite3(dbPath);
132
+ } catch (err) {
133
+ const msg = err instanceof Error ? err.message : String(err);
134
+ console.error(`[DB] Could not open data.db (${msg}) \u2014 quarantining and starting fresh`);
135
+ quarantineCorruptDatabase(dbPath);
136
+ bdb = new BetterSqlite3(dbPath);
137
+ console.warn("[DB] Recovered with an empty database \u2014 a scan will rebuild AST data, and plans re-import from .codetrellis/");
138
+ }
139
+ if (isDatabaseCorrupt(bdb)) {
140
+ console.error("[DB] Integrity check FAILED \u2014 quarantining corrupt data.db and rebuilding from scratch");
141
+ try {
142
+ bdb.close();
143
+ } catch {
144
+ }
145
+ quarantineCorruptDatabase(dbPath);
146
+ bdb = new BetterSqlite3(dbPath);
147
+ }
148
+ bdb.pragma("journal_mode = WAL");
149
+ bdb.pragma("synchronous = NORMAL");
150
+ bdb.pragma("busy_timeout = 5000");
151
+ db = makeShim(bdb);
152
+ console.log(`[DB] Opened native SQLite (better-sqlite3) at ${dbPath}`);
153
+ db.run(import_db_schema.SCHEMA_AST);
154
+ db.run(import_db_schema.SCHEMA_PLANS_CORE);
155
+ try {
156
+ db.run(`ALTER TABLE plans ADD COLUMN base_ref TEXT`);
157
+ } catch {
158
+ }
159
+ try {
160
+ db.run(`ALTER TABLE plans ADD COLUMN target_branch TEXT`);
161
+ } catch {
162
+ }
163
+ try {
164
+ db.run(`ALTER TABLE plans ADD COLUMN target_worktree TEXT`);
165
+ } catch {
166
+ }
167
+ try {
168
+ db.run(`ALTER TABLE plans ADD COLUMN auto_create_branch INTEGER DEFAULT 0`);
169
+ } catch {
170
+ }
171
+ try {
172
+ db.run(`ALTER TABLE tasks ADD COLUMN parent_task_uid TEXT`);
173
+ } catch {
174
+ }
175
+ try {
176
+ db.run(`ALTER TABLE tasks ADD COLUMN body TEXT`);
177
+ } catch {
178
+ }
179
+ try {
180
+ db.run(`ALTER TABLE tasks ADD COLUMN prompt TEXT`);
181
+ } catch {
182
+ }
183
+ try {
184
+ db.run(`ALTER TABLE tasks ADD COLUMN scope_path TEXT`);
185
+ } catch {
186
+ }
187
+ try {
188
+ db.run(`ALTER TABLE tasks ADD COLUMN file_specs TEXT DEFAULT '[]'`);
189
+ } catch {
190
+ }
191
+ try {
192
+ db.run(`ALTER TABLE tasks ADD COLUMN progress_percent INTEGER`);
193
+ } catch {
194
+ }
195
+ try {
196
+ db.run(`ALTER TABLE tasks ADD COLUMN blocked_reason TEXT`);
197
+ } catch {
198
+ }
199
+ try {
200
+ db.run(`ALTER TABLE tasks ADD COLUMN phase_uid TEXT`);
201
+ } catch {
202
+ }
203
+ try {
204
+ db.run(`CREATE INDEX IF NOT EXISTS idx_tasks_parent ON tasks(parent_task_uid)`);
205
+ } catch {
206
+ }
207
+ try {
208
+ db.run(`ALTER TABLE comments ADD COLUMN kind TEXT`);
209
+ } catch {
210
+ }
211
+ try {
212
+ db.run(`ALTER TABLE comments ADD COLUMN source TEXT`);
213
+ } catch {
214
+ }
215
+ try {
216
+ db.run(`ALTER TABLE comments ADD COLUMN metadata TEXT`);
217
+ } catch {
218
+ }
219
+ db.run(import_db_schema.SCHEMA_ATTACHMENTS);
220
+ db.run(import_db_schema.SCHEMA_PLAN_ITEMS);
221
+ try {
222
+ db.run(`ALTER TABLE plan_items ADD COLUMN skills TEXT NOT NULL DEFAULT '[]'`);
223
+ } catch {
224
+ }
225
+ try {
226
+ db.run(`ALTER TABLE plan_items ADD COLUMN skills_mode TEXT DEFAULT 'inherit'`);
227
+ } catch {
228
+ }
229
+ try {
230
+ db.run(`ALTER TABLE plan_items ADD COLUMN claim_policy TEXT DEFAULT NULL`);
231
+ } catch {
232
+ }
233
+ try {
234
+ db.run(`ALTER TABLE plan_items ADD COLUMN claim_policy_mode TEXT DEFAULT 'inherit'`);
235
+ } catch {
236
+ }
237
+ try {
238
+ db.run(`ALTER TABLE plan_items ADD COLUMN execution_config TEXT DEFAULT NULL`);
239
+ } catch {
240
+ }
241
+ try {
242
+ db.run(`ALTER TABLE plan_items ADD COLUMN execution_config_mode TEXT DEFAULT 'inherit'`);
243
+ } catch {
244
+ }
245
+ try {
246
+ db.run(`ALTER TABLE plan_items ADD COLUMN constraints TEXT DEFAULT NULL`);
247
+ } catch {
248
+ }
249
+ try {
250
+ db.run(`ALTER TABLE plan_items ADD COLUMN constraints_mode TEXT DEFAULT 'inherit'`);
251
+ } catch {
252
+ }
253
+ try {
254
+ db.run(`ALTER TABLE plan_items ADD COLUMN requires_approval INTEGER NOT NULL DEFAULT 0`);
255
+ } catch {
256
+ }
257
+ try {
258
+ db.run(`ALTER TABLE agent_sessions ADD COLUMN capabilities TEXT NOT NULL DEFAULT '[]'`);
259
+ } catch {
260
+ }
261
+ try {
262
+ db.run(`ALTER TABLE agent_sessions ADD COLUMN host_terminal_id TEXT DEFAULT NULL`);
263
+ } catch {
264
+ }
265
+ try {
266
+ db.run(`ALTER TABLE agent_sessions ADD COLUMN brief_item_uid TEXT DEFAULT NULL`);
267
+ } catch {
268
+ }
269
+ try {
270
+ db.run(`ALTER TABLE agent_sessions ADD COLUMN brief_bound_at INTEGER DEFAULT NULL`);
271
+ } catch {
272
+ }
273
+ try {
274
+ db.run(`ALTER TABLE deviations ADD COLUMN file_path TEXT DEFAULT NULL`);
275
+ } catch {
276
+ }
277
+ try {
278
+ db.run(`ALTER TABLE recent_projects ADD COLUMN origin_url TEXT DEFAULT NULL`);
279
+ } catch {
280
+ }
281
+ try {
282
+ db.run(`CREATE INDEX IF NOT EXISTS idx_recent_projects_origin ON recent_projects(origin_url)`);
283
+ } catch {
284
+ }
285
+ try {
286
+ db.run(`ALTER TABLE plan_items ADD COLUMN visibility TEXT NOT NULL DEFAULT 'shared'`);
287
+ } catch {
288
+ }
289
+ try {
290
+ db.run(`ALTER TABLE plan_items ADD COLUMN visibility_override INTEGER NOT NULL DEFAULT 0`);
291
+ } catch {
292
+ }
293
+ try {
294
+ db.run(`ALTER TABLE plans ADD COLUMN home_repo TEXT DEFAULT NULL`);
295
+ } catch {
296
+ }
297
+ try {
298
+ db.run(`ALTER TABLE plans ADD COLUMN scope TEXT NOT NULL DEFAULT '[]'`);
299
+ } catch {
300
+ }
301
+ try {
302
+ db.run(`CREATE INDEX IF NOT EXISTS idx_plans_home_repo ON plans(home_repo)`);
303
+ } catch {
304
+ }
305
+ db.run(import_db_schema.SCHEMA_SYSTEM_DOCS);
306
+ db.run(import_db_schema.SCHEMA_EXTERNAL_REFS);
307
+ const reconcile = (0, import_schema_reconciler.reconcileSchemaFromSql)(db, import_db_schema.RECONCILED_SCHEMA_SQL, {
308
+ skipTables: import_db_schema.EPHEMERAL_TABLES
309
+ });
310
+ if (reconcile.columnsAdded.length > 0) {
311
+ console.log(
312
+ `[DB] Schema reconciler added ${reconcile.columnsAdded.length} column(s):`,
313
+ reconcile.columnsAdded.map((c) => `${c.table}.${c.column}`).join(", ")
314
+ );
315
+ }
316
+ if (reconcile.errors.length > 0) {
317
+ for (const e of reconcile.errors) {
318
+ console.warn(`[DB] Schema reconciler failed for ${e.table}.${e.column}: ${e.error}`);
319
+ }
320
+ }
321
+ console.log("[DB] SQLite initialized");
322
+ }
323
+ function getDb() {
324
+ if (!db) throw new Error("Database not initialized");
325
+ return db;
326
+ }
327
+ function exportDatabase() {
328
+ return getDb().export();
329
+ }
330
+ function clearAstData() {
331
+ const d = getDb();
332
+ d.run("BEGIN");
333
+ try {
334
+ try {
335
+ d.run(`DELETE FROM cross_system_edges`);
336
+ } catch {
337
+ }
338
+ try {
339
+ d.run(`DELETE FROM callsites`);
340
+ } catch {
341
+ }
342
+ d.run(`DELETE FROM imports`);
343
+ d.run(`DELETE FROM symbols`);
344
+ d.run(`DELETE FROM files`);
345
+ d.run("COMMIT");
346
+ } catch (err) {
347
+ try {
348
+ d.run("ROLLBACK");
349
+ } catch {
350
+ }
351
+ throw err;
352
+ }
353
+ }
354
+ function storeParsedFile(parsed, projectRoot) {
355
+ const d = getDb();
356
+ d.run("BEGIN");
357
+ try {
358
+ const relativePath = import_node_path.default.relative(projectRoot, parsed.path);
359
+ d.run(`DELETE FROM files WHERE path = ?`, [parsed.path]);
360
+ d.run(
361
+ `INSERT INTO files (path, relative_path, language, content_hash, last_parsed) VALUES (?, ?, ?, ?, ?)`,
362
+ [parsed.path, relativePath, parsed.language, parsed.contentHash, Date.now()]
363
+ );
364
+ const fileIdResult = d.exec(`SELECT last_insert_rowid() as id`);
365
+ const fileId = fileIdResult[0]?.values[0]?.[0];
366
+ for (const sym of parsed.symbols) {
367
+ insertSymbol(d, fileId, null, sym);
368
+ }
369
+ for (const imp of parsed.imports) {
370
+ d.run(
371
+ `INSERT INTO imports (file_id, source_path, specifiers, is_default, is_namespace, is_relative, is_reexport) VALUES (?, ?, ?, ?, ?, ?, ?)`,
372
+ [fileId, imp.source, JSON.stringify(imp.specifiers), imp.isDefault ? 1 : 0, imp.isNamespace ? 1 : 0, imp.isRelative ? 1 : 0, imp.isReexport ? 1 : 0]
373
+ );
374
+ }
375
+ d.run(`DELETE FROM callsites WHERE file_id = ?`, [fileId]);
376
+ for (const cs of parsed.callsites ?? []) {
377
+ d.run(
378
+ `INSERT INTO callsites (file_id, kind, protocol, method, url_pattern, sql_text, line, context, host)
379
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
380
+ [
381
+ fileId,
382
+ cs.kind,
383
+ cs.protocol,
384
+ cs.method ?? null,
385
+ cs.urlPattern ?? null,
386
+ cs.sqlText ?? null,
387
+ cs.line ?? null,
388
+ cs.context ?? null,
389
+ cs.host ?? null
390
+ ]
391
+ );
392
+ }
393
+ d.run("COMMIT");
394
+ } catch (err) {
395
+ try {
396
+ d.run("ROLLBACK");
397
+ } catch {
398
+ }
399
+ throw err;
400
+ }
401
+ }
402
+ function insertSymbol(d, fileId, parentId, sym) {
403
+ d.run(
404
+ `INSERT INTO symbols (file_id, parent_symbol_id, name, kind, start_line, end_line, modifiers) VALUES (?, ?, ?, ?, ?, ?, ?)`,
405
+ [fileId, parentId, sym.name, sym.kind, sym.startLine, sym.endLine, JSON.stringify(sym.modifiers)]
406
+ );
407
+ if (sym.children.length > 0) {
408
+ const symIdResult = d.exec(`SELECT last_insert_rowid() as id`);
409
+ const symId = symIdResult[0]?.values[0]?.[0];
410
+ for (const child of sym.children) {
411
+ insertSymbol(d, fileId, symId, child);
412
+ }
413
+ }
414
+ }
415
+ function searchSymbols(query) {
416
+ const d = getDb();
417
+ const results = d.exec(
418
+ `SELECT s.name, s.kind, f.path, f.relative_path, s.start_line, s.end_line
419
+ FROM symbols s
420
+ JOIN files f ON s.file_id = f.id
421
+ WHERE s.name LIKE ?
422
+ ORDER BY s.name
423
+ LIMIT 50`,
424
+ [`%${query}%`]
425
+ );
426
+ if (!results[0]) return [];
427
+ return results[0].values.map((row) => ({
428
+ name: row[0],
429
+ kind: row[1],
430
+ filePath: row[2],
431
+ relativePath: row[3],
432
+ startLine: row[4],
433
+ endLine: row[5]
434
+ }));
435
+ }
436
+ function getFileSymbolsWithMembers(filePath) {
437
+ const d = getDb();
438
+ const results = d.exec(
439
+ `SELECT CASE WHEN p.name IS NOT NULL THEN p.name || '.' || s.name ELSE s.name END,
440
+ s.kind, s.start_line, s.end_line, s.modifiers
441
+ FROM symbols s
442
+ JOIN files f ON s.file_id = f.id
443
+ LEFT JOIN symbols p ON s.parent_symbol_id = p.id
444
+ WHERE f.path = ?
445
+ ORDER BY s.start_line`,
446
+ [filePath]
447
+ );
448
+ return (results[0]?.values ?? []).map((r) => ({
449
+ name: r[0],
450
+ kind: r[1],
451
+ startLine: r[2],
452
+ endLine: r[3],
453
+ modifiers: r[4] ? JSON.parse(r[4]) : []
454
+ }));
455
+ }
456
+ function getFileSymbols(filePath) {
457
+ const d = getDb();
458
+ const results = d.exec(
459
+ `SELECT s.name, s.kind, s.start_line, s.end_line, s.modifiers
460
+ FROM symbols s
461
+ JOIN files f ON s.file_id = f.id
462
+ WHERE f.path = ? AND s.parent_symbol_id IS NULL
463
+ ORDER BY s.start_line`,
464
+ [filePath]
465
+ );
466
+ if (!results[0]) return [];
467
+ return results[0].values.map((row) => ({
468
+ name: row[0],
469
+ kind: row[1],
470
+ startLine: row[2],
471
+ endLine: row[3],
472
+ modifiers: JSON.parse(row[4] || "[]")
473
+ }));
474
+ }
475
+ function getFileHash(filePath) {
476
+ const d = getDb();
477
+ const results = d.exec(`SELECT content_hash FROM files WHERE path = ?`, [filePath]);
478
+ if (!results[0]?.values[0]) return null;
479
+ return results[0].values[0][0];
480
+ }
481
+ function getAllFileHashes() {
482
+ const d = getDb();
483
+ const results = d.exec(`SELECT path, content_hash FROM files`);
484
+ const map = /* @__PURE__ */ new Map();
485
+ if (results[0]) {
486
+ for (const row of results[0].values) {
487
+ map.set(row[0], row[1]);
488
+ }
489
+ }
490
+ return map;
491
+ }
492
+ function removeStaleFiles(stalePaths) {
493
+ if (stalePaths.length === 0) return;
494
+ const d = getDb();
495
+ d.run("BEGIN");
496
+ try {
497
+ for (const p of stalePaths) {
498
+ try {
499
+ d.run(
500
+ `DELETE FROM cross_system_edges WHERE source_file_id IN (SELECT id FROM files WHERE path = ?) OR target_file_id IN (SELECT id FROM files WHERE path = ?)`,
501
+ [p, p]
502
+ );
503
+ } catch {
504
+ }
505
+ try {
506
+ d.run(`DELETE FROM callsites WHERE file_id IN (SELECT id FROM files WHERE path = ?)`, [p]);
507
+ } catch {
508
+ }
509
+ d.run(`DELETE FROM imports WHERE file_id IN (SELECT id FROM files WHERE path = ?)`, [p]);
510
+ d.run(`DELETE FROM symbols WHERE file_id IN (SELECT id FROM files WHERE path = ?)`, [p]);
511
+ d.run(`DELETE FROM files WHERE path = ?`, [p]);
512
+ }
513
+ d.run("COMMIT");
514
+ } catch (err) {
515
+ try {
516
+ d.run("ROLLBACK");
517
+ } catch {
518
+ }
519
+ throw err;
520
+ }
521
+ }
522
+ let resolutionContext = null;
523
+ function setImportResolutionContext(projectRoot, aliasMap, systems) {
524
+ resolutionContext = { projectRoot, aliasMap, systems };
525
+ }
526
+ function resolutionContextRoot() {
527
+ return resolutionContext?.projectRoot ?? null;
528
+ }
529
+ function getImportResolutionContext(projectRoot) {
530
+ const ctx = resolutionContext?.projectRoot === projectRoot ? resolutionContext : null;
531
+ return { aliasMap: ctx?.aliasMap ?? [], systems: ctx?.systems ?? [] };
532
+ }
533
+ function resolvePendingImports(projectRoot) {
534
+ const ctx = resolutionContext?.projectRoot === projectRoot ? resolutionContext : null;
535
+ resolveImports(projectRoot, ctx?.aliasMap ?? [], ctx?.systems ?? [], { onlyUnresolved: true });
536
+ }
537
+ function resolveImports(projectRoot, aliasMap = [], systems = [], opts = {}) {
538
+ const d = getDb();
539
+ const filesResult = d.exec(`SELECT id, path, language FROM files`);
540
+ if (!filesResult[0]) return;
541
+ const filePathSet = /* @__PURE__ */ new Set();
542
+ const fileLangByPath = /* @__PURE__ */ new Map();
543
+ for (const row of filesResult[0].values) {
544
+ const fp = row[1];
545
+ filePathSet.add(fp);
546
+ fileLangByPath.set(fp, row[2]);
547
+ }
548
+ try {
549
+ d.run(`ALTER TABLE imports ADD COLUMN resolved_path TEXT`);
550
+ } catch {
551
+ }
552
+ try {
553
+ d.run(`CREATE INDEX IF NOT EXISTS idx_imports_resolved ON imports(resolved_path)`);
554
+ } catch {
555
+ }
556
+ try {
557
+ d.run(`ALTER TABLE plan_documents ADD COLUMN order_hint TEXT`);
558
+ } catch {
559
+ }
560
+ try {
561
+ d.run(`ALTER TABLE plan_documents ADD COLUMN parent_doc_uid TEXT`);
562
+ } catch {
563
+ }
564
+ try {
565
+ d.run(`CREATE INDEX IF NOT EXISTS idx_plan_docs_parent ON plan_documents(parent_doc_uid)`);
566
+ } catch {
567
+ }
568
+ try {
569
+ d.run(`
570
+ CREATE TABLE IF NOT EXISTS plan_phases (
571
+ uid TEXT PRIMARY KEY,
572
+ plan_uid TEXT NOT NULL REFERENCES plans(uid),
573
+ phase_number INTEGER NOT NULL,
574
+ title TEXT NOT NULL,
575
+ scope TEXT NOT NULL DEFAULT '',
576
+ prerequisites TEXT NOT NULL DEFAULT '',
577
+ git_checkpoint TEXT,
578
+ acceptance_criteria TEXT NOT NULL DEFAULT '',
579
+ status TEXT NOT NULL DEFAULT 'pending',
580
+ created_at INTEGER NOT NULL,
581
+ updated_at INTEGER NOT NULL
582
+ )
583
+ `);
584
+ d.run(`CREATE INDEX IF NOT EXISTS idx_plan_phases_plan ON plan_phases(plan_uid)`);
585
+ d.run(`CREATE UNIQUE INDEX IF NOT EXISTS idx_plan_phases_unique ON plan_phases(plan_uid, phase_number)`);
586
+ } catch {
587
+ }
588
+ try {
589
+ d.run(`ALTER TABLE tasks ADD COLUMN phase_uid TEXT`);
590
+ } catch {
591
+ }
592
+ const importsResult = d.exec(
593
+ `SELECT i.id, i.source_path, f.path, i.is_relative FROM imports i JOIN files f ON i.file_id = f.id` + (opts.onlyUnresolved ? " WHERE i.resolved_path IS NULL" : "")
594
+ );
595
+ if (!importsResult[0]) return;
596
+ let resolved = 0;
597
+ for (const row of importsResult[0].values) {
598
+ const importId = row[0];
599
+ const sourcePath = row[1];
600
+ const importerPath = row[2];
601
+ const isRelative = Boolean(row[3]);
602
+ const language = fileLangByPath.get(importerPath);
603
+ const resolver = language ? (0, import_resolvers.getResolverForLanguage)(language) : null;
604
+ const resolvedPath = resolver ? resolver.resolve({
605
+ importSource: sourcePath,
606
+ importerPath,
607
+ projectRoot,
608
+ knownFiles: filePathSet,
609
+ aliasMap,
610
+ systems,
611
+ isRelative
612
+ }) : null;
613
+ if (resolvedPath && resolvedPath !== importerPath) {
614
+ d.run(`UPDATE imports SET resolved_path = ? WHERE id = ?`, [resolvedPath, importId]);
615
+ resolved++;
616
+ }
617
+ }
618
+ if (!opts.onlyUnresolved) console.log(`[DB] Resolved ${resolved} import paths`);
619
+ }
620
+ function getDependencyEdges() {
621
+ const d = getDb();
622
+ let results;
623
+ try {
624
+ results = d.exec(`
625
+ SELECT f1.path, f2.path, f1.relative_path, f2.relative_path, i.specifiers
626
+ FROM imports i
627
+ JOIN files f1 ON i.file_id = f1.id
628
+ JOIN files f2 ON i.resolved_path = f2.path
629
+ WHERE i.resolved_path IS NOT NULL
630
+ ORDER BY f1.path
631
+ `);
632
+ } catch {
633
+ return [];
634
+ }
635
+ if (!results[0]) return [];
636
+ return results[0].values.map((row) => ({
637
+ source: row[0],
638
+ target: row[1],
639
+ sourceRelative: row[2],
640
+ targetRelative: row[3],
641
+ specifiers: JSON.parse(row[4] || "[]")
642
+ }));
643
+ }
644
+ function getFileFacts() {
645
+ let files;
646
+ let symbols;
647
+ try {
648
+ files = getDb().exec(`SELECT id, relative_path, language FROM files`);
649
+ symbols = getDb().exec(`SELECT file_id, name, modifiers FROM symbols WHERE parent_symbol_id IS NULL`);
650
+ } catch {
651
+ return [];
652
+ }
653
+ const byFile = /* @__PURE__ */ new Map();
654
+ for (const [fileId, name, mods] of symbols[0]?.values ?? []) {
655
+ const list = byFile.get(Number(fileId)) ?? [];
656
+ list.push({ name: String(name), modifiers: JSON.parse(mods || "[]") });
657
+ byFile.set(Number(fileId), list);
658
+ }
659
+ return (files[0]?.values ?? []).map(([id, rel, lang]) => ({
660
+ sourceRelative: String(rel),
661
+ targetRelative: (0, import_folder_entry.fileFact)(String(rel), (0, import_folder_entry.exportCount)(String(lang ?? ""), byFile.get(Number(id)) ?? []))
662
+ }));
663
+ }
664
+ function replacePatternCallsites(found) {
665
+ const d = getDb();
666
+ let n = 0;
667
+ d.run("BEGIN");
668
+ try {
669
+ for (const f of found) {
670
+ const row = d.exec(`SELECT id FROM files WHERE path = ?`, [f.path])[0]?.values?.[0];
671
+ if (!row) continue;
672
+ const fileId = Number(row[0]);
673
+ d.run(`DELETE FROM callsites WHERE file_id = ? AND context LIKE 'pattern:%'`, [fileId]);
674
+ for (const cs of f.callsites) {
675
+ d.run(
676
+ `INSERT INTO callsites (file_id, kind, protocol, method, url_pattern, sql_text, line, context, host) VALUES (?,?,?,?,?,?,?,?,?)`,
677
+ [fileId, cs.kind, cs.protocol, cs.method ?? null, cs.urlPattern ?? null, cs.sqlText ?? null, cs.line ?? null, cs.context ?? null, cs.host ?? null]
678
+ );
679
+ n++;
680
+ }
681
+ }
682
+ d.run("COMMIT");
683
+ } catch (err) {
684
+ d.run("ROLLBACK");
685
+ throw err;
686
+ }
687
+ return n;
688
+ }
689
+ function hasPatternCallsites() {
690
+ try {
691
+ return (getDb().exec(`SELECT 1 FROM callsites WHERE context LIKE 'pattern:%' LIMIT 1`)[0]?.values?.length ?? 0) > 0;
692
+ } catch {
693
+ return false;
694
+ }
695
+ }
696
+ function getCallEdges() {
697
+ let results;
698
+ try {
699
+ results = getDb().exec(`
700
+ SELECT DISTINCT f.relative_path, c.kind, c.url_pattern, c.host
701
+ FROM callsites c
702
+ JOIN files f ON c.file_id = f.id
703
+ WHERE c.kind IN ('http_call', 'sql_query', 'entry', 'subprocess', 'env_lookup')
704
+ ORDER BY f.relative_path
705
+ `);
706
+ } catch {
707
+ return [];
708
+ }
709
+ const out = [];
710
+ const seen = /* @__PURE__ */ new Set();
711
+ for (const row of results[0]?.values ?? []) {
712
+ const entry = (0, import_call_entry.callEntry)({ kind: String(row[1]), urlPattern: row[2], host: row[3] });
713
+ const key = `${row[0]}\0${entry}`;
714
+ if (!entry || seen.has(key)) continue;
715
+ seen.add(key);
716
+ out.push({ sourceRelative: String(row[0]), targetRelative: entry });
717
+ }
718
+ return out;
719
+ }
720
+ function getPackageEdges() {
721
+ let results;
722
+ try {
723
+ results = getDb().exec(`
724
+ SELECT DISTINCT f.relative_path, f.language, i.source_path, i.is_relative
725
+ FROM imports i
726
+ JOIN files f ON i.file_id = f.id
727
+ WHERE i.resolved_path IS NULL
728
+ ORDER BY f.relative_path
729
+ `);
730
+ } catch {
731
+ return [];
732
+ }
733
+ const out = [];
734
+ const seen = /* @__PURE__ */ new Set();
735
+ for (const row of results[0]?.values ?? []) {
736
+ const entry = (0, import_package_entry.packageEntry)(String(row[1]), String(row[2]), Number(row[3]) === 1);
737
+ const key = `${row[0]}\0${entry}`;
738
+ if (!entry || seen.has(key)) continue;
739
+ seen.add(key);
740
+ out.push({ sourceRelative: String(row[0]), targetRelative: entry });
741
+ }
742
+ return out;
743
+ }
744
+ function getAllGraphEdges() {
745
+ const imports = getDependencyEdges().map((e) => ({ ...e, kind: "import" }));
746
+ const d = getDb();
747
+ let xs;
748
+ try {
749
+ xs = d.exec(`
750
+ SELECT sf.path, tf.path, sf.relative_path, tf.relative_path, e.protocol, e.label
751
+ FROM cross_system_edges e
752
+ JOIN files sf ON e.source_file_id = sf.id
753
+ JOIN files tf ON e.target_file_id = tf.id
754
+ `);
755
+ } catch {
756
+ return imports;
757
+ }
758
+ if (!xs[0]) return imports;
759
+ const crossSystem = xs[0].values.map((row) => ({
760
+ source: row[0],
761
+ target: row[1],
762
+ sourceRelative: row[2],
763
+ targetRelative: row[3],
764
+ specifiers: [],
765
+ kind: "cross_system",
766
+ protocol: row[4],
767
+ label: row[5]
768
+ }));
769
+ return [...imports, ...crossSystem];
770
+ }
771
+ function getFileDependencies(filePath) {
772
+ const d = getDb();
773
+ const row = d.exec(
774
+ `SELECT path FROM files WHERE path = ? OR relative_path = ? LIMIT 1`,
775
+ [filePath, filePath.replace(/^\.\//, "")]
776
+ );
777
+ filePath = row[0]?.values[0]?.[0] ?? filePath;
778
+ const importsResult = d.exec(`
779
+ SELECT f2.path, f2.relative_path, i.specifiers, i.is_reexport
780
+ FROM imports i
781
+ JOIN files f1 ON i.file_id = f1.id
782
+ JOIN files f2 ON i.resolved_path = f2.path
783
+ WHERE f1.path = ?
784
+ `, [filePath]);
785
+ const importedByResult = d.exec(`
786
+ SELECT f1.path, f1.relative_path, i.specifiers, i.is_reexport
787
+ FROM imports i
788
+ JOIN files f1 ON i.file_id = f1.id
789
+ WHERE i.resolved_path = ?
790
+ `, [filePath]);
791
+ const toDep = (r) => ({
792
+ path: r[0],
793
+ relativePath: r[1],
794
+ specifiers: JSON.parse(r[2] || "[]"),
795
+ // `export … from` (Phase 32 A2.2): passes the names on rather than using them.
796
+ ...r[3] === 1 ? { reexport: true } : {}
797
+ });
798
+ return {
799
+ imports: (importsResult[0]?.values || []).map(toDep),
800
+ importedBy: (importedByResult[0]?.values || []).map(toDep),
801
+ // Files that reach this one through a barrel's re-exports, and which barrels.
802
+ throughReexports: (0, import_importers.importersOf)(filePath).filter((i) => i.via.length > 0).map((i) => ({ path: i.path, relativePath: i.relativePath, specifiers: i.names, via: i.via, ...i.possibly ? { possibly: true } : {} }))
803
+ };
804
+ }
805
+ function getArchitectureSummary() {
806
+ const d = getDb();
807
+ const fileCount = d.exec(`SELECT COUNT(*) FROM files`)[0]?.values[0]?.[0] || 0;
808
+ const symbolCount = d.exec(`SELECT COUNT(*) FROM symbols`)[0]?.values[0]?.[0] || 0;
809
+ const importCount = d.exec(`SELECT COUNT(*) FROM imports`)[0]?.values[0]?.[0] || 0;
810
+ const topDirs = [];
811
+ try {
812
+ const r = d.exec(`
813
+ SELECT
814
+ CASE
815
+ WHEN INSTR(relative_path, '/') > 0
816
+ THEN SUBSTR(relative_path, 1, INSTR(relative_path, '/') - 1)
817
+ ELSE '(root)'
818
+ END AS dir,
819
+ COUNT(*) AS cnt
820
+ FROM files
821
+ GROUP BY dir
822
+ ORDER BY cnt DESC
823
+ LIMIT 15
824
+ `);
825
+ for (const row of r[0]?.values ?? []) {
826
+ topDirs.push({ dir: row[0], fileCount: row[1] });
827
+ }
828
+ } catch {
829
+ }
830
+ const langs = [];
831
+ try {
832
+ const r = d.exec(`SELECT language, COUNT(*) AS cnt FROM files GROUP BY language ORDER BY cnt DESC`);
833
+ for (const row of r[0]?.values ?? []) {
834
+ langs.push({ language: row[0], count: row[1] });
835
+ }
836
+ } catch {
837
+ }
838
+ const kindBreakdown = [];
839
+ try {
840
+ const r = d.exec(`SELECT kind, COUNT(*) AS cnt FROM symbols GROUP BY kind ORDER BY cnt DESC`);
841
+ for (const row of r[0]?.values ?? []) {
842
+ kindBreakdown.push({ kind: row[0], count: row[1] });
843
+ }
844
+ } catch {
845
+ }
846
+ const mostImported = [];
847
+ try {
848
+ const r = d.exec(`
849
+ SELECT i.source_path, COUNT(DISTINCT i.file_id) AS cnt
850
+ FROM imports i
851
+ GROUP BY i.source_path
852
+ ORDER BY cnt DESC
853
+ LIMIT 10
854
+ `);
855
+ for (const row of r[0]?.values ?? []) {
856
+ mostImported.push({ path: row[0], importerCount: row[1] });
857
+ }
858
+ } catch {
859
+ }
860
+ return {
861
+ fileCount,
862
+ symbolCount,
863
+ importCount,
864
+ topDirectories: topDirs,
865
+ languageBreakdown: langs,
866
+ symbolsByKind: kindBreakdown,
867
+ mostImported
868
+ };
869
+ }
870
+ function getDbStats() {
871
+ const d = getDb();
872
+ const files = d.exec(`SELECT COUNT(*) FROM files`);
873
+ const symbols = d.exec(`SELECT COUNT(*) FROM symbols`);
874
+ const imports = d.exec(`SELECT COUNT(*) FROM imports`);
875
+ let resolvedImports = 0;
876
+ try {
877
+ const resolved = d.exec(`SELECT COUNT(*) FROM imports WHERE resolved_path IS NOT NULL`);
878
+ resolvedImports = resolved[0]?.values[0]?.[0] || 0;
879
+ } catch {
880
+ }
881
+ return {
882
+ fileCount: files[0]?.values[0]?.[0] || 0,
883
+ symbolCount: symbols[0]?.values[0]?.[0] || 0,
884
+ importCount: imports[0]?.values[0]?.[0] || 0,
885
+ resolvedImports
886
+ };
887
+ }
888
+ // Annotate the CommonJS export names for ESM import in node:
889
+ 0 && (module.exports = {
890
+ clearAstData,
891
+ exportDatabase,
892
+ getAllFileHashes,
893
+ getAllGraphEdges,
894
+ getArchitectureSummary,
895
+ getCallEdges,
896
+ getDb,
897
+ getDbStats,
898
+ getDependencyEdges,
899
+ getFileDependencies,
900
+ getFileFacts,
901
+ getFileHash,
902
+ getFileSymbols,
903
+ getFileSymbolsWithMembers,
904
+ getImportResolutionContext,
905
+ getPackageEdges,
906
+ hasPatternCallsites,
907
+ initDatabase,
908
+ removeStaleFiles,
909
+ replacePatternCallsites,
910
+ resolutionContextRoot,
911
+ resolveImports,
912
+ resolvePendingImports,
913
+ searchSymbols,
914
+ setImportResolutionContext,
915
+ storeParsedFile
916
+ });