codetrellis 0.0.0-stage → 0.3.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 (448) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +27 -2
  3. package/bin/codetrellis.mjs +4 -0
  4. package/package.json +41 -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/cli-install.js +249 -0
  102. package/src/backend/services/clock.js +57 -0
  103. package/src/backend/services/cloud-files.js +191 -0
  104. package/src/backend/services/coalesce.js +50 -0
  105. package/src/backend/services/code-breakpoints.js +291 -0
  106. package/src/backend/services/comment-service.js +168 -0
  107. package/src/backend/services/commit-attribution.js +134 -0
  108. package/src/backend/services/commit-edges.js +99 -0
  109. package/src/backend/services/confined-fs.js +241 -0
  110. package/src/backend/services/conformity-gate.js +132 -0
  111. package/src/backend/services/contribution-service.js +409 -0
  112. package/src/backend/services/coverage-service.js +173 -0
  113. package/src/backend/services/criteria-service.js +721 -0
  114. package/src/backend/services/criterion-checks.js +387 -0
  115. package/src/backend/services/criterion-loop-service.js +411 -0
  116. package/src/backend/services/cross-system-service.js +231 -0
  117. package/src/backend/services/database.js +916 -0
  118. package/src/backend/services/db-schema.js +1358 -0
  119. package/src/backend/services/deviation-service.js +344 -0
  120. package/src/backend/services/diff-engine.js +168 -0
  121. package/src/backend/services/evidence.js +363 -0
  122. package/src/backend/services/external-intake-service.js +269 -0
  123. package/src/backend/services/external-pointer-service.js +195 -0
  124. package/src/backend/services/external-refs-service.js +214 -0
  125. package/src/backend/services/file-history.js +158 -0
  126. package/src/backend/services/file-watcher.js +193 -0
  127. package/src/backend/services/folder-requests.js +118 -0
  128. package/src/backend/services/freeze-service.js +189 -0
  129. package/src/backend/services/gemini-cli-hook.js +172 -0
  130. package/src/backend/services/git-activity-service.js +325 -0
  131. package/src/backend/services/git-blobs.js +70 -0
  132. package/src/backend/services/git-branches.js +357 -0
  133. package/src/backend/services/git-checkout.js +153 -0
  134. package/src/backend/services/git-commit-service.js +91 -0
  135. package/src/backend/services/git-env.js +121 -0
  136. package/src/backend/services/git-identity.js +84 -0
  137. package/src/backend/services/git-refs.js +386 -0
  138. package/src/backend/services/git-safety.js +58 -0
  139. package/src/backend/services/grant-guard.js +67 -0
  140. package/src/backend/services/html-view-policy.js +135 -0
  141. package/src/backend/services/human-decision.js +55 -0
  142. package/src/backend/services/importers.js +159 -0
  143. package/src/backend/services/intent-service.js +105 -0
  144. package/src/backend/services/ipc-dispatcher.js +164 -0
  145. package/src/backend/services/item-git-state.js +208 -0
  146. package/src/backend/services/line-changes.js +232 -0
  147. package/src/backend/services/line-history.js +174 -0
  148. package/src/backend/services/local-api-changes.js +40 -0
  149. package/src/backend/services/logger.js +217 -0
  150. package/src/backend/services/material-footprints.js +203 -0
  151. package/src/backend/services/material-place.js +82 -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/reader-host.js +202 -0
  156. package/src/backend/services/material-signals.js +141 -0
  157. package/src/backend/services/mcp-capabilities.js +390 -0
  158. package/src/backend/services/mdns-service.js +304 -0
  159. package/src/backend/services/mobile-api-server.js +281 -0
  160. package/src/backend/services/mobile-approvals.js +306 -0
  161. package/src/backend/services/mobile-awareness.js +180 -0
  162. package/src/backend/services/mobile-breakpoints.js +115 -0
  163. package/src/backend/services/mobile-budget.js +98 -0
  164. package/src/backend/services/mobile-freeze.js +106 -0
  165. package/src/backend/services/mobile-proposals.js +100 -0
  166. package/src/backend/services/mobile-rpc-service.js +1289 -0
  167. package/src/backend/services/mobile-workstreams.js +160 -0
  168. package/src/backend/services/monorepo-detector.js +131 -0
  169. package/src/backend/services/other-work.js +45 -0
  170. package/src/backend/services/pack-seal.js +129 -0
  171. package/src/backend/services/paired-device-service.js +192 -0
  172. package/src/backend/services/pairing-server.js +323 -0
  173. package/src/backend/services/pairing-service.js +200 -0
  174. package/src/backend/services/pantry-resolution-service.js +166 -0
  175. package/src/backend/services/parsers/base.js +124 -0
  176. package/src/backend/services/parsers/csharp.js +224 -0
  177. package/src/backend/services/parsers/go.js +180 -0
  178. package/src/backend/services/parsers/index.js +101 -0
  179. package/src/backend/services/parsers/java.js +103 -0
  180. package/src/backend/services/parsers/kotlin.js +252 -0
  181. package/src/backend/services/parsers/php.js +113 -0
  182. package/src/backend/services/parsers/python.js +189 -0
  183. package/src/backend/services/parsers/ruby.js +212 -0
  184. package/src/backend/services/parsers/rust.js +97 -0
  185. package/src/backend/services/parsers/swift.js +221 -0
  186. package/src/backend/services/parsers/typescript.js +235 -0
  187. package/src/backend/services/pattern-scan.js +65 -0
  188. package/src/backend/services/patterns.js +281 -0
  189. package/src/backend/services/peer-audit-service.js +123 -0
  190. package/src/backend/services/peer-auth.js +153 -0
  191. package/src/backend/services/peer-capabilities.js +209 -0
  192. package/src/backend/services/peer-connection-service.js +450 -0
  193. package/src/backend/services/peer-grants.js +33 -0
  194. package/src/backend/services/persistence.js +116 -0
  195. package/src/backend/services/personal-sync-service.js +232 -0
  196. package/src/backend/services/pipeline-approvals.js +72 -0
  197. package/src/backend/services/pipeline.js +232 -0
  198. package/src/backend/services/plan-arrivals.js +68 -0
  199. package/src/backend/services/plan-changes-service.js +273 -0
  200. package/src/backend/services/plan-conflict-service.js +288 -0
  201. package/src/backend/services/plan-dependencies.js +91 -0
  202. package/src/backend/services/plan-doc-guard.js +90 -0
  203. package/src/backend/services/plan-documents-service.js +275 -0
  204. package/src/backend/services/plan-event-service.js +154 -0
  205. package/src/backend/services/plan-file-refs.js +106 -0
  206. package/src/backend/services/plan-file-service.js +1564 -0
  207. package/src/backend/services/plan-history-service.js +156 -0
  208. package/src/backend/services/plan-import-service.js +261 -0
  209. package/src/backend/services/plan-item-service.js +1223 -0
  210. package/src/backend/services/plan-migrate-service.js +395 -0
  211. package/src/backend/services/plan-overlay-service.js +173 -0
  212. package/src/backend/services/plan-phases-service.js +182 -0
  213. package/src/backend/services/plan-progress-service.js +134 -0
  214. package/src/backend/services/plan-review-service.js +262 -0
  215. package/src/backend/services/plan-service.js +682 -0
  216. package/src/backend/services/plan-status.js +113 -0
  217. package/src/backend/services/plan-template-publish-service.js +217 -0
  218. package/src/backend/services/plan-templates-service.js +242 -0
  219. package/src/backend/services/plan-templates.js +1164 -0
  220. package/src/backend/services/planned-overlap-actions.js +200 -0
  221. package/src/backend/services/plans-home.js +224 -0
  222. package/src/backend/services/play-forward.js +256 -0
  223. package/src/backend/services/playback-service.js +117 -0
  224. package/src/backend/services/power-service.js +167 -0
  225. package/src/backend/services/power-signals.js +81 -0
  226. package/src/backend/services/pr-draft-service.js +142 -0
  227. package/src/backend/services/presence-service.js +122 -0
  228. package/src/backend/services/pricing.js +60 -0
  229. package/src/backend/services/project-config-service.js +474 -0
  230. package/src/backend/services/project-scanner.js +184 -0
  231. package/src/backend/services/projection-service.js +69 -0
  232. package/src/backend/services/push-notification-service.js +288 -0
  233. package/src/backend/services/recent-projects-service.js +204 -0
  234. package/src/backend/services/record-chain.js +162 -0
  235. package/src/backend/services/recurrence-rule.js +63 -0
  236. package/src/backend/services/recurring-agent.js +89 -0
  237. package/src/backend/services/recurring-scheduler.js +77 -0
  238. package/src/backend/services/recurring-service.js +276 -0
  239. package/src/backend/services/reference-service.js +169 -0
  240. package/src/backend/services/release-public-key.js +30 -0
  241. package/src/backend/services/release-signature.js +64 -0
  242. package/src/backend/services/remote-audio-service.js +224 -0
  243. package/src/backend/services/remote-interaction-service.js +275 -0
  244. package/src/backend/services/remote-terminal-service.js +324 -0
  245. package/src/backend/services/rendition/child/main.js +76 -0
  246. package/src/backend/services/rendition/engine-host.js +249 -0
  247. package/src/backend/services/rendition/engine-lock.js +39 -0
  248. package/src/backend/services/rendition/engine-lock.json +14 -0
  249. package/src/backend/services/rendition/engine-manifest.js +97 -0
  250. package/src/backend/services/rendition/network-proof.js +73 -0
  251. package/src/backend/services/rendition/rendition-service.js +175 -0
  252. package/src/backend/services/replay-frames.js +387 -0
  253. package/src/backend/services/replay-state.js +201 -0
  254. package/src/backend/services/resolvers/base.js +108 -0
  255. package/src/backend/services/resolvers/csharp.js +109 -0
  256. package/src/backend/services/resolvers/go.js +105 -0
  257. package/src/backend/services/resolvers/index.js +60 -0
  258. package/src/backend/services/resolvers/java.js +63 -0
  259. package/src/backend/services/resolvers/kotlin.js +109 -0
  260. package/src/backend/services/resolvers/php.js +89 -0
  261. package/src/backend/services/resolvers/python.js +154 -0
  262. package/src/backend/services/resolvers/ruby.js +103 -0
  263. package/src/backend/services/resolvers/rust.js +77 -0
  264. package/src/backend/services/resolvers/swift.js +98 -0
  265. package/src/backend/services/resolvers/typescript.js +71 -0
  266. package/src/backend/services/retention.js +54 -0
  267. package/src/backend/services/review-architecture.js +236 -0
  268. package/src/backend/services/review-attest.js +68 -0
  269. package/src/backend/services/review-bundle.js +226 -0
  270. package/src/backend/services/review-graduation.js +93 -0
  271. package/src/backend/services/review-host/bitbucket.js +79 -0
  272. package/src/backend/services/review-host/detect.js +80 -0
  273. package/src/backend/services/review-host/github.js +97 -0
  274. package/src/backend/services/review-host/gitlab.js +77 -0
  275. package/src/backend/services/review-host/host-state.js +103 -0
  276. package/src/backend/services/review-host/http.js +58 -0
  277. package/src/backend/services/review-host/switch.js +120 -0
  278. package/src/backend/services/review-marks.js +72 -0
  279. package/src/backend/services/review-notes.js +169 -0
  280. package/src/backend/services/review-other-work.js +90 -0
  281. package/src/backend/services/review-queue-service.js +147 -0
  282. package/src/backend/services/review-risk.js +127 -0
  283. package/src/backend/services/review-task.js +121 -0
  284. package/src/backend/services/rule-approvals.js +275 -0
  285. package/src/backend/services/rule-baseline.js +134 -0
  286. package/src/backend/services/rule-changes.js +162 -0
  287. package/src/backend/services/rule-preview.js +47 -0
  288. package/src/backend/services/rule-proposals.js +104 -0
  289. package/src/backend/services/rule-scope.js +76 -0
  290. package/src/backend/services/rulebook.js +286 -0
  291. package/src/backend/services/rules-at.js +56 -0
  292. package/src/backend/services/rules-overview.js +88 -0
  293. package/src/backend/services/schema-reconciler.js +250 -0
  294. package/src/backend/services/secret-store.js +119 -0
  295. package/src/backend/services/section-workstreams.js +95 -0
  296. package/src/backend/services/self-write-tracker.js +75 -0
  297. package/src/backend/services/sensor-bridge-service.js +285 -0
  298. package/src/backend/services/session-service.js +192 -0
  299. package/src/backend/services/settings-service.js +324 -0
  300. package/src/backend/services/signal-breakpoints.js +172 -0
  301. package/src/backend/services/signed-approval-record.js +86 -0
  302. package/src/backend/services/signed-approvals.js +244 -0
  303. package/src/backend/services/signoff-pack.js +328 -0
  304. package/src/backend/services/signoff-rows.js +114 -0
  305. package/src/backend/services/skill-arrival-service.js +138 -0
  306. package/src/backend/services/skill-model.js +193 -0
  307. package/src/backend/services/skill-use-service.js +140 -0
  308. package/src/backend/services/skills-service.js +150 -0
  309. package/src/backend/services/snapshot-compare-service.js +397 -0
  310. package/src/backend/services/source-control.js +189 -0
  311. package/src/backend/services/spec-links-service.js +123 -0
  312. package/src/backend/services/spec-proposal-withdraw.js +50 -0
  313. package/src/backend/services/spec-proposals-service.js +470 -0
  314. package/src/backend/services/sql/embedded.js +95 -0
  315. package/src/backend/services/sql/index.js +63 -0
  316. package/src/backend/services/sql/refs.js +357 -0
  317. package/src/backend/services/sql/schema.js +312 -0
  318. package/src/backend/services/sql/tokenizer.js +195 -0
  319. package/src/backend/services/stack-overlaps.js +117 -0
  320. package/src/backend/services/stack-service.js +225 -0
  321. package/src/backend/services/state-sync-service.js +384 -0
  322. package/src/backend/services/stuck-sensor-service.js +200 -0
  323. package/src/backend/services/system-discovery.js +481 -0
  324. package/src/backend/services/system-docs-service.js +701 -0
  325. package/src/backend/services/task-attachments-service.js +340 -0
  326. package/src/backend/services/task-grounding.js +60 -0
  327. package/src/backend/services/task-records/check-run-record.js +146 -0
  328. package/src/backend/services/task-records/check-runs.js +115 -0
  329. package/src/backend/services/task-records/heads.js +88 -0
  330. package/src/backend/services/task-records/material-reads.js +225 -0
  331. package/src/backend/services/task-records/read-record.js +100 -0
  332. package/src/backend/services/task-records/record.js +173 -0
  333. package/src/backend/services/task-records/run-record.js +136 -0
  334. package/src/backend/services/task-records/shared-state.js +548 -0
  335. package/src/backend/services/task-records/signing.js +140 -0
  336. package/src/backend/services/task-records/split-signals.js +52 -0
  337. package/src/backend/services/task-records/test-runs.js +164 -0
  338. package/src/backend/services/task-records/trust.js +243 -0
  339. package/src/backend/services/task-rules.js +81 -0
  340. package/src/backend/services/task-workstreams.js +90 -0
  341. package/src/backend/services/terminal-history-service.js +266 -0
  342. package/src/backend/services/terminal-service.js +267 -0
  343. package/src/backend/services/test-clock.js +53 -0
  344. package/src/backend/services/tests/grounding.js +266 -0
  345. package/src/backend/services/tests/junit.js +104 -0
  346. package/src/backend/services/tests/teammate-runs.js +134 -0
  347. package/src/backend/services/tests/test-results.js +234 -0
  348. package/src/backend/services/tree-watcher.js +204 -0
  349. package/src/backend/services/trellis-service.js +204 -0
  350. package/src/backend/services/trusted-roots.js +186 -0
  351. package/src/backend/services/update-download-service.js +342 -0
  352. package/src/backend/services/update-service.js +266 -0
  353. package/src/backend/services/watch-ignore.js +76 -0
  354. package/src/backend/services/webhook-egress.js +206 -0
  355. package/src/backend/services/webrtc-service.js +413 -0
  356. package/src/backend/services/work-changes.js +59 -0
  357. package/src/backend/services/workstream-binding.js +82 -0
  358. package/src/backend/services/workstream-commits.js +116 -0
  359. package/src/backend/services/workstream-imports.js +177 -0
  360. package/src/backend/services/workstream-service.js +335 -0
  361. package/src/backend/services/workstream-symbols.js +223 -0
  362. package/src/backend/services/workstream-watch-service.js +391 -0
  363. package/src/backend/services/worktree-service.js +235 -0
  364. package/src/cli/agent.js +100 -0
  365. package/src/cli/args.js +209 -0
  366. package/src/cli/conformity.js +106 -0
  367. package/src/cli/desktop.js +91 -0
  368. package/src/cli/main.js +411 -0
  369. package/src/cli/pipeline.js +109 -0
  370. package/src/cli/plan-verbs.js +259 -0
  371. package/src/cli/review-adapters.js +220 -0
  372. package/src/cli/review-output.js +93 -0
  373. package/src/cli/review-post.js +89 -0
  374. package/src/cli/review-sink.js +183 -0
  375. package/src/cli/review-skill.js +44 -0
  376. package/src/cli/review-verify.js +104 -0
  377. package/src/cli/review.js +386 -0
  378. package/src/cli/sarif.js +148 -0
  379. package/src/cli/verbs.js +360 -0
  380. package/src/shared/build-info.js +39 -0
  381. package/src/shared/lib/agent-review.js +199 -0
  382. package/src/shared/lib/agent-turns.js +140 -0
  383. package/src/shared/lib/awareness-digest.js +120 -0
  384. package/src/shared/lib/branch-name.js +45 -0
  385. package/src/shared/lib/breakpoint-words.js +118 -0
  386. package/src/shared/lib/budget-words.js +56 -0
  387. package/src/shared/lib/burst.js +69 -0
  388. package/src/shared/lib/call-entry.js +105 -0
  389. package/src/shared/lib/check-compare.js +42 -0
  390. package/src/shared/lib/check-words.js +216 -0
  391. package/src/shared/lib/csv.js +62 -0
  392. package/src/shared/lib/folder-entry.js +87 -0
  393. package/src/shared/lib/freeze-words.js +60 -0
  394. package/src/shared/lib/fuzzy.js +84 -0
  395. package/src/shared/lib/git-state-words.js +80 -0
  396. package/src/shared/lib/grep-entry.js +86 -0
  397. package/src/shared/lib/grounding-line.js +61 -0
  398. package/src/shared/lib/import-line.js +71 -0
  399. package/src/shared/lib/item-status.js +249 -0
  400. package/src/shared/lib/line-changes.js +53 -0
  401. package/src/shared/lib/locator.js +71 -0
  402. package/src/shared/lib/matcher.js +120 -0
  403. package/src/shared/lib/merge-order.js +65 -0
  404. package/src/shared/lib/open-findings.js +68 -0
  405. package/src/shared/lib/other-work.js +108 -0
  406. package/src/shared/lib/package-entry.js +142 -0
  407. package/src/shared/lib/plan-vocab.js +40 -0
  408. package/src/shared/lib/pptx-xml.js +86 -0
  409. package/src/shared/lib/proposal-words.js +61 -0
  410. package/src/shared/lib/recurrence.js +183 -0
  411. package/src/shared/lib/references.js +72 -0
  412. package/src/shared/lib/rule-pattern.js +56 -0
  413. package/src/shared/lib/sdp-fingerprint.js +115 -0
  414. package/src/shared/lib/sdp-minimal.js +123 -0
  415. package/src/shared/lib/secret-paths.js +34 -0
  416. package/src/shared/lib/signal-words.js +172 -0
  417. package/src/shared/lib/signoff.js +56 -0
  418. package/src/shared/lib/skills-note.js +60 -0
  419. package/src/shared/lib/spec-sections.js +78 -0
  420. package/src/shared/lib/symbol-entry.js +60 -0
  421. package/src/shared/lib/tool-phrasing.js +338 -0
  422. package/src/shared/lib/turn-gap.js +27 -0
  423. package/src/shared/lib/workstream-words.js +38 -0
  424. package/src/shared/lib/xlsx-xml.js +144 -0
  425. package/src/shared/lib/zip-reader.js +99 -0
  426. package/src/shared/types/agent.js +27 -0
  427. package/src/shared/types/architecture-rules.js +30 -0
  428. package/src/shared/types/ast.js +15 -0
  429. package/src/shared/types/breakpoint.js +33 -0
  430. package/src/shared/types/channel.js +41 -0
  431. package/src/shared/types/criteria.js +15 -0
  432. package/src/shared/types/graph.js +15 -0
  433. package/src/shared/types/index.js +53 -0
  434. package/src/shared/types/peer.js +36 -0
  435. package/src/shared/types/pipeline.js +15 -0
  436. package/src/shared/types/plan.js +15 -0
  437. package/src/shared/types/play-forward.js +15 -0
  438. package/src/shared/types/power.js +15 -0
  439. package/src/shared/types/presence.js +15 -0
  440. package/src/shared/types/project-config.js +35 -0
  441. package/src/shared/types/project.js +15 -0
  442. package/src/shared/types/record.js +15 -0
  443. package/src/shared/types/recurring.js +15 -0
  444. package/src/shared/types/review.js +15 -0
  445. package/src/shared/types/settings.js +114 -0
  446. package/src/shared/types/stack.js +15 -0
  447. package/src/shared/types/system-doc.js +15 -0
  448. package/src/shared/types/system.js +15 -0
@@ -0,0 +1,411 @@
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 criterion_loop_service_exports = {};
29
+ __export(criterion_loop_service_exports, {
30
+ checkCriterion: () => checkCriterion,
31
+ describeSinceLast: () => describeSinceLast,
32
+ getWorklist: () => getWorklist,
33
+ listCheckRuns: () => listCheckRuns,
34
+ runCheckRun: () => runCheckRun,
35
+ submitChecked: () => submitChecked,
36
+ testsOlderThanCode: () => testsOlderThanCode
37
+ });
38
+ module.exports = __toCommonJS(criterion_loop_service_exports);
39
+ var import_test_results = require("./tests/test-results");
40
+ var import_agent_event_log = require("./agent-event-log");
41
+ var import_node_fs = __toESM(require("node:fs"));
42
+ var import_node_path = __toESM(require("node:path"));
43
+ var import_node_crypto = require("node:crypto");
44
+ var import_database = require("./database");
45
+ var import_persistence = require("./persistence");
46
+ var criteria = __toESM(require("./criteria-service"));
47
+ var import_artefact_service = require("./artefact-service");
48
+ var import_criterion_checks = require("./criterion-checks");
49
+ var import_plan_item_service = require("./plan-item-service");
50
+ var import_plan_review_service = require("./plan-review-service");
51
+ var import_project_config_service = require("./project-config-service");
52
+ var import_confined_fs = require("./confined-fs");
53
+ var import_references = require("../../shared/lib/references");
54
+ var import_sensor_bridge_service = require("./sensor-bridge-service");
55
+ const rows = (sql, params = []) => (0, import_database.getDb)().exec(sql, params)[0]?.values ?? [];
56
+ function rootOf(itemUid) {
57
+ try {
58
+ return (0, import_artefact_service.projectRootForItem)(itemUid);
59
+ } catch {
60
+ return null;
61
+ }
62
+ }
63
+ function itemStartedAt(item) {
64
+ const started = rows(
65
+ `SELECT MIN(created_at) FROM plan_events
66
+ WHERE item_uid = ? AND event_type = 'status_changed' AND after_state LIKE '%in_progress%'`,
67
+ [item.uid]
68
+ )[0]?.[0];
69
+ if (typeof started === "number") return started;
70
+ const created = typeof item.createdAt === "number" ? item.createdAt : Date.parse(String(item.createdAt));
71
+ return Number.isFinite(created) ? created : 0;
72
+ }
73
+ function materialsReadSince(itemUid, since) {
74
+ const read = /* @__PURE__ */ new Set();
75
+ for (const r of rows(
76
+ `SELECT after_state FROM plan_events WHERE item_uid = ? AND event_type = 'material_read' AND created_at >= ?`,
77
+ [itemUid, since]
78
+ )) {
79
+ try {
80
+ const uid = JSON.parse(String(r[0])).attachmentUid;
81
+ if (typeof uid === "string") read.add(uid);
82
+ } catch {
83
+ }
84
+ }
85
+ return read;
86
+ }
87
+ function lastTargetChangeAt(item, root) {
88
+ if (!root) return null;
89
+ let newest = null;
90
+ for (const spec of item.fileSpecs ?? []) {
91
+ if (!spec?.path) continue;
92
+ const rel = item.scopePath && !import_node_path.default.isAbsolute(spec.path) ? import_node_path.default.join(item.scopePath, spec.path) : spec.path;
93
+ try {
94
+ const st = import_node_fs.default.lstatSync((0, import_confined_fs.resolveWithin)(root, rel, "target"));
95
+ if (st.isFile()) newest = Math.max(newest ?? 0, Math.round(st.mtimeMs));
96
+ } catch {
97
+ }
98
+ }
99
+ return newest;
100
+ }
101
+ function codeVerdicts(planUid) {
102
+ const projectPath = rows(`SELECT project_path FROM plans WHERE uid = ?`, [planUid])[0]?.[0];
103
+ if (typeof projectPath !== "string" || !projectPath) return { unavailable: "the plan has no project" };
104
+ try {
105
+ const r = (0, import_plan_review_service.reviewPlan)({ planUid, projectPath });
106
+ if (!r.ok) return { unavailable: r.error };
107
+ const verdicts = new Map(r.review.items.map((i) => [i.uid, { verdict: i.verdict, missing: i.missing }]));
108
+ if ((0, import_project_config_service.getEffectiveSensorConfig)(projectPath).awareness.holdSignOffOnHighSignals) {
109
+ verdicts.openHighSignals = (r.review.otherWork?.entries ?? []).filter((e) => e.outcome === "open" && e.severity === "high").map((e) => ({ heading: e.heading, words: [...e.sides.map((s) => s.words), e.merge].filter(Boolean).join(" ") }));
110
+ }
111
+ return verdicts;
112
+ } catch (err) {
113
+ return { unavailable: err.message };
114
+ }
115
+ }
116
+ function evidenceFacts(criterion, offered) {
117
+ const list = offered ? offered.map((e) => ({ attachmentUid: e.attachmentUid, locator: e.locator ?? null })) : criterion.latestSubmission.map((e) => ({ attachmentUid: e.attachmentUid, locator: e.locator }));
118
+ return list.map((e) => {
119
+ const artefact = e.attachmentUid ? (0, import_artefact_service.getArtefact)(e.attachmentUid) : null;
120
+ return {
121
+ attachmentUid: e.attachmentUid,
122
+ locator: e.locator,
123
+ // Evidence from another item is a claim about somewhere else.
124
+ artefact: artefact && artefact.itemUid === criterion.itemUid ? artefact : null
125
+ };
126
+ });
127
+ }
128
+ function check(criterion, item, offered, verdicts) {
129
+ const root = rootOf(item.uid);
130
+ let code;
131
+ let openHighSignals;
132
+ if (criterion.kind === "code") {
133
+ const v = verdicts();
134
+ code = "unavailable" in v && typeof v.unavailable === "string" ? { unavailable: v.unavailable } : v.get(item.uid) ?? { unavailable: "the item is not in the plan review" };
135
+ if (v instanceof Map) openHighSignals = v.openHighSignals;
136
+ }
137
+ const startedAt = itemStartedAt(item);
138
+ return (0, import_criterion_checks.runChecks)({
139
+ criterion: { uid: criterion.uid, itemUid: criterion.itemUid, kind: criterion.kind },
140
+ root,
141
+ itemStartedAt: startedAt,
142
+ lastTargetChangeAt: lastTargetChangeAt(item, root),
143
+ evidence: evidenceFacts(criterion, offered),
144
+ itemArtefacts: (0, import_artefact_service.listArtefacts)(item.uid),
145
+ materialsRead: criterion.kind === "citation" ? materialsReadSince(item.uid, startedAt) : void 0,
146
+ code,
147
+ openHighSignals,
148
+ // B8.1: a JUnit report read by a test check keeps each test's result.
149
+ onTestReport: criterion.kind === "test" && root ? (a) => {
150
+ (0, import_test_results.ingestTestReport)(root, a.path, { author: a.recordedBy, authorType: a.recordedByType });
151
+ } : void 0
152
+ });
153
+ }
154
+ function once(fn) {
155
+ let done = false;
156
+ let value;
157
+ return () => {
158
+ if (!done) {
159
+ value = fn();
160
+ done = true;
161
+ }
162
+ return value;
163
+ };
164
+ }
165
+ function requireCriterion(uid) {
166
+ const criterion = criteria.getCriterion(uid);
167
+ if (!criterion) throw new criteria.CriterionError("Criterion not found", 404);
168
+ const item = (0, import_plan_item_service.getItem)(criterion.itemUid);
169
+ if (!item) throw new criteria.CriterionError("Item not found", 404);
170
+ return { criterion, item };
171
+ }
172
+ async function checkCriterion(uid, offered) {
173
+ const { criterion: before, item } = requireCriterion(uid);
174
+ await (0, import_artefact_service.refreshArtefactHashes)(before.itemUid).catch(() => []);
175
+ const criterion = criteria.getCriterion(uid);
176
+ return check(criterion, item, offered, once(() => codeVerdicts(item.planUid)));
177
+ }
178
+ async function testsOlderThanCode(itemUid) {
179
+ const out = [];
180
+ for (const c of criteria.listCriteria(itemUid)) {
181
+ if (c.kind !== "test") continue;
182
+ const r = await checkCriterion(c.uid).catch(() => null);
183
+ const older = r?.findings.find((f) => f.status === "fail" && f.reason === "tests_older");
184
+ if (older) out.push({ criterionUid: c.uid, text: c.text, why: older.message });
185
+ }
186
+ return out;
187
+ }
188
+ async function submitChecked(uid, input, actor) {
189
+ const result = await checkCriterion(uid, input.evidence ?? []);
190
+ if (!result.ok) {
191
+ const failures = result.findings.filter((f) => f.status === "fail").map((f) => `- ${f.message}`);
192
+ throw new criteria.CriterionError(
193
+ `Not submitted \u2014 fix these and check again (check_criterion), then submit:
194
+ ${failures.join("\n")}`,
195
+ 422
196
+ );
197
+ }
198
+ const criterion = criteria.submitCriterion(uid, input, actor);
199
+ if (criterion.state === "submitted") {
200
+ const item = (0, import_plan_item_service.getItem)(criterion.itemUid);
201
+ if (item) {
202
+ (0, import_sensor_bridge_service.postCriterionNotice)({
203
+ planUid: item.planUid,
204
+ itemUid: item.uid,
205
+ criterionUid: criterion.uid,
206
+ reason: "submitted",
207
+ message: `${actor.author} submitted "${criterion.text}" on ${item.title} \u2014 approve it or send it back.`
208
+ });
209
+ }
210
+ }
211
+ return { criterion, check: result };
212
+ }
213
+ function pathOf(attachmentUid) {
214
+ return attachmentUid ? (0, import_artefact_service.getArtefact)(attachmentUid)?.path ?? null : null;
215
+ }
216
+ function changedEvidenceFiles(c) {
217
+ const recorded = c.latestSignoff?.evidenceHashes ?? {};
218
+ const uids = Object.keys(recorded);
219
+ const now = (0, import_artefact_service.currentHashes)(uids);
220
+ return uids.filter((u) => recorded[u] !== now[u]).map((u) => pathOf(u) ?? u);
221
+ }
222
+ function refOf(item) {
223
+ return (0, import_references.formatReference)(item.kind === "object" ? "page" : "task", item.uid);
224
+ }
225
+ const REASON_ORDER = { sent_back: 0, stale: 1, failing: 2, open: 3 };
226
+ async function getWorklist(planUid) {
227
+ const items = (0, import_plan_item_service.listAllItems)(planUid);
228
+ const verdicts = once(() => codeVerdicts(planUid));
229
+ const entries = [];
230
+ let waitingForPerson = 0;
231
+ let met = 0;
232
+ let total = 0;
233
+ for (const [itemIndex, item] of items.entries()) {
234
+ await (0, import_artefact_service.refreshArtefactHashes)(item.uid).catch(() => []);
235
+ for (const c of criteria.listCriteria(item.uid)) {
236
+ total++;
237
+ const base = {
238
+ criterionUid: c.uid,
239
+ itemUid: item.uid,
240
+ itemTitle: item.title,
241
+ itemRef: refOf(item),
242
+ text: c.text,
243
+ kind: c.kind,
244
+ policy: c.policy
245
+ };
246
+ const anchors = c.latestSubmission.filter((e) => e.attachmentUid || e.locator).map((e) => ({ attachmentUid: e.attachmentUid, path: pathOf(e.attachmentUid), locator: e.locator }));
247
+ const order = itemIndex * 1e4 + c.sortOrder;
248
+ if (c.state === "met") {
249
+ met++;
250
+ continue;
251
+ }
252
+ if (c.state === "sent_back") {
253
+ const at = c.latestSignoff?.anchor;
254
+ const pointed = at ? [{ attachmentUid: at.attachmentUid, path: pathOf(at.attachmentUid), locator: at.locator }] : [];
255
+ entries.push({
256
+ ...base,
257
+ reason: "sent_back",
258
+ note: c.latestSignoff?.note ?? null,
259
+ anchors: [...pointed, ...anchors],
260
+ details: [],
261
+ order
262
+ });
263
+ } else if (c.state === "stale") {
264
+ const files = changedEvidenceFiles(c);
265
+ entries.push({
266
+ ...base,
267
+ reason: "stale",
268
+ note: null,
269
+ anchors,
270
+ details: files.map((f) => `${f} changed after it was approved`),
271
+ order
272
+ });
273
+ } else if (c.state === "submitted") {
274
+ const result = check(c, item, void 0, verdicts);
275
+ if (result.ok) {
276
+ waitingForPerson++;
277
+ continue;
278
+ }
279
+ entries.push({
280
+ ...base,
281
+ reason: "failing",
282
+ note: null,
283
+ anchors,
284
+ details: result.findings.filter((f) => f.status === "fail").map((f) => f.message),
285
+ order
286
+ });
287
+ } else {
288
+ entries.push({ ...base, reason: "open", note: null, anchors: [], details: [], order });
289
+ }
290
+ }
291
+ }
292
+ entries.sort((a, b) => REASON_ORDER[a.reason] - REASON_ORDER[b.reason] || a.order - b.order);
293
+ return {
294
+ planUid,
295
+ entries: entries.map(({ order: _order, ...e }) => e),
296
+ waitingForPerson,
297
+ met,
298
+ total
299
+ };
300
+ }
301
+ const when = (ms) => new Date(ms).toISOString().slice(0, 16).replace("T", " ");
302
+ function toRun(r) {
303
+ const parse = (v, fallback) => {
304
+ try {
305
+ return typeof v === "string" ? JSON.parse(v) : fallback;
306
+ } catch {
307
+ return fallback;
308
+ }
309
+ };
310
+ return {
311
+ uid: r[0],
312
+ planUid: r[1],
313
+ trigger: r[2],
314
+ by: r[3],
315
+ byType: r[4],
316
+ outcomes: parse(r[5], []),
317
+ sinceLast: parse(r[6], []),
318
+ startedAt: r[7],
319
+ finishedAt: r[8]
320
+ };
321
+ }
322
+ const RUN_COLS = "uid, plan_uid, trigger, by_actor, by_type, outcomes, since_last, started_at, finished_at";
323
+ function listCheckRuns(planUid, limit = 10) {
324
+ return rows(
325
+ `SELECT ${RUN_COLS} FROM check_runs WHERE plan_uid = ? ORDER BY started_at DESC, rowid DESC LIMIT ?`,
326
+ [planUid, limit]
327
+ ).map(toRun);
328
+ }
329
+ function describeSinceLast(outcomes, previousRuns) {
330
+ const previous = previousRuns[0];
331
+ if (!previous) return ["First check run on this plan."];
332
+ const before = /* @__PURE__ */ new Map();
333
+ for (const run of previousRuns) {
334
+ for (const o of run.outcomes) if (!before.has(o.criterionUid)) before.set(o.criterionUid, o);
335
+ }
336
+ const since = `since ${when(previous.startedAt)}`;
337
+ const lines = [];
338
+ const wentStale = outcomes.filter((o) => o.state === "stale" && before.get(o.criterionUid) && before.get(o.criterionUid).state !== "stale");
339
+ if (wentStale.length) {
340
+ const files = [...new Set(wentStale.flatMap((o) => o.changedFiles))];
341
+ lines.push(`${wentStale.length} went stale ${since}${files.length ? ` \u2014 ${files.join(", ")} changed` : ""}.`);
342
+ }
343
+ const nowFailing = outcomes.filter((o) => !o.ok && before.get(o.criterionUid)?.ok);
344
+ if (nowFailing.length) {
345
+ lines.push(`${nowFailing.length} now fail${nowFailing.length === 1 ? "s" : ""} ${nowFailing.length === 1 ? "its" : "their"} checks: ${nowFailing.map((o) => `"${o.text}"`).join(", ")}.`);
346
+ }
347
+ const fixed = outcomes.filter((o) => o.ok && before.get(o.criterionUid) && !before.get(o.criterionUid).ok);
348
+ if (fixed.length) lines.push(`${fixed.length} pass${fixed.length === 1 ? "es" : ""} again.`);
349
+ const newlyMet = outcomes.filter((o) => o.state === "met" && before.get(o.criterionUid) && before.get(o.criterionUid).state !== "met");
350
+ if (newlyMet.length) lines.push(`${newlyMet.length} met ${since}.`);
351
+ const added = outcomes.filter((o) => !before.has(o.criterionUid));
352
+ if (added.length) lines.push(`${added.length} new since the last run.`);
353
+ if (lines.length === 0) lines.push(`Nothing changed ${since}.`);
354
+ return lines;
355
+ }
356
+ async function runCheckRun(input) {
357
+ const startedAt = Date.now();
358
+ const scope = input.itemUids ? new Set(input.itemUids) : null;
359
+ const items = (0, import_plan_item_service.listAllItems)(input.planUid).filter((i) => !scope || scope.has(i.uid));
360
+ const verdicts = once(() => codeVerdicts(input.planUid));
361
+ const outcomes = [];
362
+ for (const item of items) {
363
+ await (0, import_artefact_service.refreshArtefactHashes)(item.uid).catch(() => []);
364
+ for (const c of criteria.listCriteria(item.uid)) {
365
+ const result = check(c, item, void 0, verdicts);
366
+ outcomes.push({
367
+ criterionUid: c.uid,
368
+ itemUid: item.uid,
369
+ text: c.text,
370
+ state: c.state,
371
+ ok: result.ok,
372
+ failures: result.findings.filter((f) => f.status === "fail").map((f) => f.message),
373
+ changedFiles: c.state === "stale" ? changedEvidenceFiles(c) : []
374
+ });
375
+ }
376
+ }
377
+ const sinceLast = describeSinceLast(outcomes, listCheckRuns(input.planUid, 20));
378
+ const uid = (0, import_node_crypto.randomUUID)();
379
+ const finishedAt = Math.max(Date.now(), startedAt);
380
+ (0, import_database.getDb)().run(
381
+ `INSERT INTO check_runs (uid, plan_uid, trigger, by_actor, by_type, scope, outcomes, since_last, started_at, finished_at)
382
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
383
+ [
384
+ uid,
385
+ input.planUid,
386
+ input.trigger,
387
+ input.by,
388
+ input.byType,
389
+ scope ? JSON.stringify([...scope]) : null,
390
+ JSON.stringify(outcomes),
391
+ JSON.stringify(sinceLast),
392
+ startedAt,
393
+ finishedAt
394
+ ]
395
+ );
396
+ (0, import_persistence.markDirty)();
397
+ if (outcomes.length) {
398
+ (0, import_agent_event_log.recordCheckRun)({ runUid: uid, planUid: input.planUid, trigger: input.trigger, by: input.by, byType: input.byType, outcomes });
399
+ }
400
+ return { uid, planUid: input.planUid, trigger: input.trigger, by: input.by, byType: input.byType, startedAt, finishedAt, outcomes, sinceLast };
401
+ }
402
+ // Annotate the CommonJS export names for ESM import in node:
403
+ 0 && (module.exports = {
404
+ checkCriterion,
405
+ describeSinceLast,
406
+ getWorklist,
407
+ listCheckRuns,
408
+ runCheckRun,
409
+ submitChecked,
410
+ testsOlderThanCode
411
+ });
@@ -0,0 +1,231 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var cross_system_service_exports = {};
19
+ __export(cross_system_service_exports, {
20
+ getCrossSystemStats: () => getCrossSystemStats,
21
+ listCrossSystemEdges: () => listCrossSystemEdges,
22
+ matchEntryEdges: () => matchEntryEdges,
23
+ recomputeCrossSystemEdges: () => recomputeCrossSystemEdges
24
+ });
25
+ module.exports = __toCommonJS(cross_system_service_exports);
26
+ var import_database = require("./database");
27
+ function recomputeCrossSystemEdges() {
28
+ const db = (0, import_database.getDb)();
29
+ let result;
30
+ try {
31
+ result = db.exec(`
32
+ SELECT c.file_id, f.path, f.relative_path, c.kind, c.protocol, c.method, c.url_pattern, c.line,
33
+ f.language
34
+ FROM callsites c
35
+ JOIN files f ON c.file_id = f.id
36
+ `);
37
+ } catch {
38
+ return { added: 0 };
39
+ }
40
+ const rows = (result[0]?.values ?? []).map((r) => ({
41
+ fileId: r[0],
42
+ filePath: r[1],
43
+ fileRel: r[2],
44
+ kind: r[3],
45
+ protocol: r[4],
46
+ method: r[5] ?? null,
47
+ urlPattern: r[6] ?? null,
48
+ line: r[7] ?? null,
49
+ language: r[8] ?? null
50
+ }));
51
+ const httpRoutes = rows.filter((r) => r.kind === "http_route");
52
+ const httpCalls = rows.filter((r) => r.kind === "http_call");
53
+ const routesByKey = /* @__PURE__ */ new Map();
54
+ for (const r of httpRoutes) {
55
+ if (!r.method || !r.urlPattern) continue;
56
+ const key = `${r.method} ${r.urlPattern}`;
57
+ const bucket = routesByKey.get(key) ?? [];
58
+ bucket.push(r);
59
+ routesByKey.set(key, bucket);
60
+ }
61
+ const inserts = [];
62
+ for (const call of httpCalls) {
63
+ if (!call.method || !call.urlPattern) continue;
64
+ const exact = [
65
+ ...routesByKey.get(`${call.method} ${call.urlPattern}`) ?? [],
66
+ ...routesByKey.get(`ANY ${call.urlPattern}`) ?? []
67
+ ];
68
+ if (exact.length > 0) {
69
+ for (const route of exact) {
70
+ if (route.fileId === call.fileId) continue;
71
+ inserts.push({ source: call, target: route, label: `${call.method} ${call.urlPattern}` });
72
+ }
73
+ continue;
74
+ }
75
+ }
76
+ const sqlInserts = matchSqlEdges(db, rows);
77
+ const entryInserts = matchEntryEdges(rows);
78
+ db.run(`DELETE FROM cross_system_edges`);
79
+ for (const { source, target, label } of inserts) {
80
+ db.run(
81
+ `INSERT INTO cross_system_edges (source_file_id, target_file_id, protocol, label, confidence)
82
+ VALUES (?, ?, ?, ?, ?)`,
83
+ [source.fileId, target.fileId, "http", label, 1]
84
+ );
85
+ }
86
+ for (const edge of sqlInserts) {
87
+ db.run(
88
+ `INSERT INTO cross_system_edges (source_file_id, target_file_id, protocol, label, confidence)
89
+ VALUES (?, ?, ?, ?, ?)`,
90
+ [edge.sourceFileId, edge.targetFileId, "sql", edge.label, edge.confidence]
91
+ );
92
+ }
93
+ for (const edge of entryInserts) {
94
+ db.run(
95
+ `INSERT INTO cross_system_edges (source_file_id, target_file_id, protocol, label, confidence)
96
+ VALUES (?, ?, ?, ?, ?)`,
97
+ [edge.sourceFileId, edge.targetFileId, edge.protocol, edge.label, 1]
98
+ );
99
+ }
100
+ const total = inserts.length + sqlInserts.length + entryInserts.length;
101
+ console.log(
102
+ `[XS] Cross-system edges: ${inserts.length} HTTP pair${inserts.length === 1 ? "" : "s"}, ${sqlInserts.length} SQL reference${sqlInserts.length === 1 ? "" : "s"}, ${entryInserts.length} pair${entryInserts.length === 1 ? "" : "s"} of the team's own kinds matched`
103
+ );
104
+ return { added: total };
105
+ }
106
+ function matchEntryEdges(rows) {
107
+ const sides = /* @__PURE__ */ new Map();
108
+ for (const r of rows) {
109
+ if (r.kind !== "entry" || !r.urlPattern || r.method !== "SEND" && r.method !== "RECEIVE") continue;
110
+ let s = sides.get(r.urlPattern);
111
+ if (!s) sides.set(r.urlPattern, s = { send: /* @__PURE__ */ new Set(), receive: /* @__PURE__ */ new Set() });
112
+ (r.method === "SEND" ? s.send : s.receive).add(r.fileId);
113
+ }
114
+ const out = [];
115
+ for (const [entry, s] of [...sides].sort(([a], [b]) => a.localeCompare(b))) {
116
+ const protocol = entry.slice(0, entry.indexOf(":"));
117
+ for (const from of [...s.send].sort((a, b) => a - b)) {
118
+ for (const to of [...s.receive].sort((a, b) => a - b)) {
119
+ if (from !== to) out.push({ sourceFileId: from, targetFileId: to, protocol, label: entry });
120
+ }
121
+ }
122
+ }
123
+ return out;
124
+ }
125
+ function matchSqlEdges(db, rows) {
126
+ const refs = rows.filter((r) => r.kind === "sql_query" && r.urlPattern);
127
+ if (refs.length === 0) return [];
128
+ let symbolResult;
129
+ try {
130
+ symbolResult = db.exec(`
131
+ SELECT s.name, s.modifiers, f.id
132
+ FROM symbols s
133
+ JOIN files f ON s.file_id = f.id
134
+ WHERE f.language = 'sql'
135
+ `);
136
+ } catch {
137
+ return [];
138
+ }
139
+ const definers = /* @__PURE__ */ new Map();
140
+ for (const row of symbolResult[0]?.values ?? []) {
141
+ const name = String(row[0] ?? "");
142
+ let modifiers = [];
143
+ try {
144
+ modifiers = JSON.parse(String(row[1] ?? "[]"));
145
+ } catch {
146
+ }
147
+ if (!modifiers.includes("table") && !modifiers.includes("view")) continue;
148
+ const bare = name.split(".").pop().toLowerCase();
149
+ const bucket = definers.get(bare) ?? [];
150
+ bucket.push(row[2]);
151
+ definers.set(bare, bucket);
152
+ }
153
+ if (definers.size === 0) return [];
154
+ const seen = /* @__PURE__ */ new Set();
155
+ const edges = [];
156
+ for (const ref of refs) {
157
+ const table = ref.urlPattern.toLowerCase();
158
+ const candidates = definers.get(table);
159
+ if (!candidates || candidates.length !== 1) continue;
160
+ const targetFileId = candidates[0];
161
+ if (targetFileId === ref.fileId) continue;
162
+ const op = (ref.method ?? "READ").toUpperCase();
163
+ const key = `${ref.fileId}:${targetFileId}:${op}:${table}`;
164
+ if (seen.has(key)) continue;
165
+ seen.add(key);
166
+ edges.push({
167
+ sourceFileId: ref.fileId,
168
+ targetFileId,
169
+ label: `${op} ${table}`,
170
+ confidence: 1
171
+ });
172
+ }
173
+ return edges;
174
+ }
175
+ function listCrossSystemEdges() {
176
+ const db = (0, import_database.getDb)();
177
+ let result;
178
+ try {
179
+ result = db.exec(`
180
+ SELECT
181
+ sf.path, tf.path, sf.relative_path, tf.relative_path,
182
+ e.protocol, e.label, e.confidence
183
+ FROM cross_system_edges e
184
+ JOIN files sf ON e.source_file_id = sf.id
185
+ JOIN files tf ON e.target_file_id = tf.id
186
+ ORDER BY e.protocol, sf.relative_path
187
+ `);
188
+ } catch {
189
+ return [];
190
+ }
191
+ if (!result[0]) return [];
192
+ return result[0].values.map((r) => ({
193
+ source: r[0],
194
+ target: r[1],
195
+ sourceRelative: r[2],
196
+ targetRelative: r[3],
197
+ protocol: r[4],
198
+ label: r[5],
199
+ confidence: r[6] ?? 1
200
+ }));
201
+ }
202
+ function getCrossSystemStats() {
203
+ const db = (0, import_database.getDb)();
204
+ const empty = { callsiteCount: 0, routeCount: 0, edgeCount: 0, byProtocol: {} };
205
+ try {
206
+ const cs = db.exec(`SELECT COUNT(*), SUM(CASE WHEN kind = 'http_route' THEN 1 ELSE 0 END) FROM callsites`);
207
+ const callsiteCount = cs[0]?.values[0]?.[0] ?? 0;
208
+ const routeCount = cs[0]?.values[0]?.[1] ?? 0;
209
+ const eg = db.exec(`SELECT COUNT(*), protocol FROM cross_system_edges GROUP BY protocol`);
210
+ const byProtocol = {};
211
+ let total = 0;
212
+ if (eg[0]) {
213
+ for (const row of eg[0].values) {
214
+ const n = row[0];
215
+ const p = row[1];
216
+ byProtocol[p] = n;
217
+ total += n;
218
+ }
219
+ }
220
+ return { callsiteCount, routeCount, edgeCount: total, byProtocol };
221
+ } catch {
222
+ return empty;
223
+ }
224
+ }
225
+ // Annotate the CommonJS export names for ESM import in node:
226
+ 0 && (module.exports = {
227
+ getCrossSystemStats,
228
+ listCrossSystemEdges,
229
+ matchEntryEdges,
230
+ recomputeCrossSystemEdges
231
+ });