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,50 @@
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 coalesce_exports = {};
19
+ __export(coalesce_exports, {
20
+ coalesced: () => coalesced
21
+ });
22
+ module.exports = __toCommonJS(coalesce_exports);
23
+ function coalesced(run) {
24
+ const state = /* @__PURE__ */ new Map();
25
+ const call = (key) => {
26
+ let s = state.get(key);
27
+ if (!s) state.set(key, s = { running: null, next: null });
28
+ const slot = s;
29
+ if (!slot.running) {
30
+ const started = (async () => run(key))();
31
+ slot.running = started;
32
+ started.then(() => {
33
+ if (slot.running === started) slot.running = null;
34
+ }, () => {
35
+ if (slot.running === started) slot.running = null;
36
+ });
37
+ return started;
38
+ }
39
+ slot.next ??= slot.running.then(() => void 0, () => void 0).then(() => {
40
+ slot.next = null;
41
+ return call(key);
42
+ });
43
+ return slot.next;
44
+ };
45
+ return Object.assign(call, { running: (key) => state.get(key)?.running ?? null });
46
+ }
47
+ // Annotate the CommonJS export names for ESM import in node:
48
+ 0 && (module.exports = {
49
+ coalesced
50
+ });
@@ -0,0 +1,291 @@
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 code_breakpoints_exports = {};
29
+ __export(code_breakpoints_exports, {
30
+ BREAKPOINT_MARKER: () => BREAKPOINT_MARKER,
31
+ HOOK_AGENT: () => HOOK_AGENT,
32
+ breachNoticeFor: () => breachNoticeFor,
33
+ breachText: () => breachText,
34
+ codeBreakpoints: () => codeBreakpoints,
35
+ codeSubject: () => codeSubject,
36
+ editTouches: () => editTouches,
37
+ editView: () => editView,
38
+ enforceEdit: () => enforceEdit,
39
+ functionOf: () => functionOf,
40
+ heldEditText: () => heldEditText,
41
+ nameMatches: () => nameMatches,
42
+ recordBreaches: () => recordBreaches,
43
+ resetBreachNotices: () => resetBreachNotices,
44
+ symbolRanges: () => symbolRanges,
45
+ untoldBreaches: () => untoldBreaches
46
+ });
47
+ module.exports = __toCommonJS(code_breakpoints_exports);
48
+ var import_node_fs = __toESM(require("node:fs"));
49
+ var import_node_path = __toESM(require("node:path"));
50
+ var import_node_crypto = require("node:crypto");
51
+ var import_database = require("./database");
52
+ var import_agent_event_log = require("./agent-event-log");
53
+ var import_session_service = require("./session-service");
54
+ var import_workstream_service = require("./workstream-service");
55
+ var import_breakpoint_service = require("./breakpoint-service");
56
+ var import_push_notification_service = require("./push-notification-service");
57
+ const HOOK_AGENT = "claude-code-hook";
58
+ function codeBreakpoints(projectRoot) {
59
+ return (0, import_breakpoint_service.rowsOf)(`${import_breakpoint_service.ACTIVE_SELECT} AND b.kind = 'code' AND b.project_root = ? ORDER BY b.created_at`, [projectRoot]).map(import_breakpoint_service.toBreakpointRow);
60
+ }
61
+ function functionOf(target) {
62
+ const i = target.indexOf("#");
63
+ return i === -1 ? null : target.slice(i + 1) || null;
64
+ }
65
+ const QUALIFIED = /[.#)]/;
66
+ const lastPart = (name) => name.split(/[.#)]/).filter(Boolean).pop() ?? name;
67
+ function nameMatches(symbol, wanted) {
68
+ if (symbol === wanted) return true;
69
+ return !QUALIFIED.test(wanted) && lastPart(symbol) === wanted;
70
+ }
71
+ function symbolRanges(symbols) {
72
+ const out = [];
73
+ const visit = (list, parent) => {
74
+ for (const s of list) {
75
+ const name = parent && !QUALIFIED.test(s.name) ? `${parent}.${s.name}` : s.name;
76
+ out.push({ name, start: s.startLine, end: s.endLine });
77
+ if (s.children?.length) visit(s.children, name);
78
+ }
79
+ };
80
+ visit(symbols, null);
81
+ return out;
82
+ }
83
+ function lineAt(content, offset) {
84
+ let n = 1;
85
+ for (let i = 0; i < offset && i < content.length; i++) if (content.charCodeAt(i) === 10) n++;
86
+ return n;
87
+ }
88
+ function editTouches(content, oldTexts, ranges, name) {
89
+ const targets = ranges.filter((r) => nameMatches(r.name, name));
90
+ if (!targets.length || !oldTexts?.length) return null;
91
+ for (const text of oldTexts) {
92
+ if (!text) return null;
93
+ let at = content.indexOf(text);
94
+ if (at === -1) return null;
95
+ while (at !== -1) {
96
+ const start = lineAt(content, at);
97
+ const end = lineAt(content, at + text.length - 1);
98
+ if (targets.some((r) => start <= r.end && end >= r.start)) return true;
99
+ at = content.indexOf(text, at + 1);
100
+ }
101
+ }
102
+ return false;
103
+ }
104
+ function touchesFunction(workstreamRoot, file, name, oldTexts) {
105
+ if (!oldTexts?.length) return null;
106
+ const parse = (0, import_workstream_service.getSymbolParser)();
107
+ const abs = insideFolder(workstreamRoot, file);
108
+ if (!parse || !abs) return null;
109
+ let content;
110
+ try {
111
+ content = import_node_fs.default.readFileSync(abs, "utf-8");
112
+ } catch {
113
+ return null;
114
+ }
115
+ const symbols = parse(file, content);
116
+ if (!symbols) return null;
117
+ return editTouches(content, oldTexts, symbolRanges(symbols), name);
118
+ }
119
+ function relOf(file) {
120
+ return file.replace(/\\/g, "/").replace(/^\.\/+/, "");
121
+ }
122
+ function newHit(input) {
123
+ const ref = `bp-${(0, import_node_crypto.randomBytes)(5).toString("hex")}`;
124
+ (0, import_database.getDb)().run(
125
+ `INSERT INTO breakpoint_hits (ref, breakpoint_id, tool, action, item_uid, path, breach, plan_uid, agent, session_id, workstream_root, hit_at)
126
+ VALUES (?, ?, ?, ?, '', ?, ?, NULL, ?, ?, ?, ?)`,
127
+ [ref, input.bp.id, input.tool, input.action, input.file, input.breach ? 1 : 0, input.caller.agent, input.caller.sessionId, input.caller.workstreamRoot, input.now]
128
+ );
129
+ const hit = (0, import_breakpoint_service.getHit)(ref);
130
+ (0, import_agent_event_log.recordBreakpointEvent)("breakpoint_hit", { ...(0, import_breakpoint_service.hitPayload)(hit), breakpointId: input.bp.id, on: input.bp.target }, input.caller.agent);
131
+ void (0, import_push_notification_service.pushForBreakpoint)(hit).catch(() => {
132
+ });
133
+ return hit;
134
+ }
135
+ function enforceEdit(projectRoot, rawFile, caller, now = Date.now(), oldTexts) {
136
+ if (!caller.workstreamRoot) return { kind: "pass" };
137
+ const file = relOf(rawFile);
138
+ let continued = null;
139
+ try {
140
+ for (const bp of codeBreakpoints(projectRoot).filter((b) => (0, import_breakpoint_service.codeCovers)(b.target, file))) {
141
+ const fn = functionOf(bp.target);
142
+ if (fn && touchesFunction(caller.workstreamRoot, file, fn, oldTexts) === false) continue;
143
+ const latest = (0, import_breakpoint_service.rowsOf)(
144
+ `${import_breakpoint_service.HIT_SELECT} WHERE h.breakpoint_id = ? AND h.path = ? AND h.workstream_root = ? AND h.action = 'edit_code' ORDER BY h.hit_at DESC LIMIT 1`,
145
+ [bp.id, file, caller.workstreamRoot]
146
+ ).map(import_breakpoint_service.toHitRow)[0];
147
+ if (!latest) return { kind: "paused", hit: newHit({ bp, tool: "check_breakpoint", action: "edit_code", file, caller, breach: false, now }), fresh: true };
148
+ if (latest.answeredAt === null) return { kind: "paused", hit: latest, fresh: false };
149
+ if (latest.decision === "stop") return { kind: "stop", hit: latest };
150
+ const untold = (0, import_breakpoint_service.rowsOf)("SELECT consumed_at FROM breakpoint_hits WHERE ref = ?", [latest.ref])[0]?.consumed_at === null;
151
+ if (untold) (0, import_database.getDb)().run("UPDATE breakpoint_hits SET consumed_at = ? WHERE ref = ?", [now, latest.ref]);
152
+ continued = { hit: latest, steer: untold ? latest.note : null };
153
+ }
154
+ } catch {
155
+ return { kind: "pass" };
156
+ }
157
+ return continued ? { kind: "continue", ...continued } : { kind: "pass" };
158
+ }
159
+ function insideFolder(folder, file) {
160
+ try {
161
+ const base = import_node_fs.default.realpathSync.native(folder);
162
+ const real = import_node_fs.default.realpathSync.native(import_node_path.default.join(folder, file));
163
+ return real === base || real.startsWith(base + import_node_path.default.sep) ? real : null;
164
+ } catch {
165
+ return null;
166
+ }
167
+ }
168
+ function recordBreaches(projectRoot, caller, changed, now = Date.now(), mtimeOf = (abs) => {
169
+ try {
170
+ return import_node_fs.default.statSync(abs).mtimeMs;
171
+ } catch {
172
+ return null;
173
+ }
174
+ }) {
175
+ if (!caller.workstreamRoot || caller.agent === HOOK_AGENT) return [];
176
+ const bps = codeBreakpoints(projectRoot);
177
+ if (!bps.length) return [];
178
+ const out = [];
179
+ for (const change of changed) {
180
+ if (change.status === "deleted") continue;
181
+ const file = relOf(change.path);
182
+ for (const bp of bps.filter((b) => (0, import_breakpoint_service.codeCovers)(b.target, file))) {
183
+ const fn = functionOf(bp.target);
184
+ if (fn && Array.isArray(change.symbols) && !change.symbols.some((x) => nameMatches(x.name, fn))) continue;
185
+ const known = (0, import_breakpoint_service.rowsOf)(
186
+ `SELECT COUNT(*) AS n FROM breakpoint_hits WHERE breakpoint_id = ? AND path = ? AND workstream_root = ?
187
+ AND (breach = 1 OR (action = 'edit_code' AND decision IN ('continue', 'steer')))`,
188
+ [bp.id, file, caller.workstreamRoot]
189
+ )[0];
190
+ if (Number(known?.n) > 0) continue;
191
+ const abs = insideFolder(caller.workstreamRoot, file);
192
+ const mtime = abs ? mtimeOf(abs) : null;
193
+ if (mtime === null || mtime <= bp.createdAt) continue;
194
+ out.push(newHit({ bp, tool: "edit", action: "breach", file, caller, breach: true, now }));
195
+ }
196
+ }
197
+ return out;
198
+ }
199
+ const told = /* @__PURE__ */ new Map();
200
+ function untoldBreaches(workstreamRoot, sessionId) {
201
+ const waiting = (0, import_breakpoint_service.rowsOf)(`${import_breakpoint_service.HIT_SELECT} WHERE h.breach = 1 AND h.workstream_root = ? AND h.answered_at IS NULL ORDER BY h.hit_at`, [workstreamRoot]).map(import_breakpoint_service.toHitRow);
202
+ const fresh = waiting.filter((h) => !told.get(h.ref)?.has(sessionId));
203
+ for (const h of fresh) told.set(h.ref, (told.get(h.ref) ?? /* @__PURE__ */ new Set()).add(sessionId));
204
+ return fresh;
205
+ }
206
+ function resetBreachNotices() {
207
+ told.clear();
208
+ }
209
+ const BREAKPOINT_MARKER = "\u2500\u2500 CodeTrellis breakpoint \u2500\u2500";
210
+ function codeSubject(hit) {
211
+ const fn = hit.breakpointTarget ? functionOf(hit.breakpointTarget) : null;
212
+ return fn ? `${fn} in ${hit.path}` : String(hit.path);
213
+ }
214
+ function breachText(hits) {
215
+ return [
216
+ BREAKPOINT_MARKER,
217
+ ...hits.map((h) => `You changed ${codeSubject(h)}, which has a breakpoint: a person asked to be asked before it changes. CodeTrellis could not pause your editor, so this is recorded as a breach. Stop changing it and call await_decision with ref "${h.ref}" for their answer.` + (h.breakpointNote ? ` Their note on the breakpoint: ${h.breakpointNote}` : "")),
218
+ "This is the person's request, not information about other work."
219
+ ].join("\n");
220
+ }
221
+ async function breachNoticeFor(sessionId, projectRoot) {
222
+ if (!projectRoot) return null;
223
+ try {
224
+ const session = (0, import_session_service.getActiveSessions)().find((s) => s.sessionId === sessionId);
225
+ if (!session?.workstreamRoot || session.agentType === HOOK_AGENT) return null;
226
+ if (!codeBreakpoints(projectRoot).length) return null;
227
+ const canon = (p) => {
228
+ try {
229
+ return import_node_fs.default.realpathSync.native(p);
230
+ } catch {
231
+ return import_node_path.default.resolve(p);
232
+ }
233
+ };
234
+ const mine = canon(session.workstreamRoot);
235
+ const w = (await (0, import_workstream_service.listWorkstreams)(projectRoot, { fresh: true })).find((x) => canon(x.root) === mine);
236
+ const caller = { agent: session.agentType ?? "mcp-agent", sessionId, workstreamRoot: session.workstreamRoot };
237
+ if (w) recordBreaches(projectRoot, caller, w.changes.files);
238
+ const hits = untoldBreaches(session.workstreamRoot, sessionId);
239
+ return hits.length ? breachText(hits) : null;
240
+ } catch (err) {
241
+ console.warn("[Breakpoints] breach check failed:", err instanceof Error ? err.message : err);
242
+ return null;
243
+ }
244
+ }
245
+ function heldEditText(result) {
246
+ const h = result.hit;
247
+ const on = h.breakpointNote ? ` Their note: ${h.breakpointNote}` : "";
248
+ if (result.kind === "stop") {
249
+ return [
250
+ BREAKPOINT_MARKER,
251
+ `A person answered the breakpoint on ${codeSubject(h)}: stop. The edit was not made. Do not change ${codeSubject(h)}.${h.note ? ` Their answer: ${h.note}` : ""}`,
252
+ "Tell the person what you will do instead."
253
+ ].join("\n");
254
+ }
255
+ return [
256
+ BREAKPOINT_MARKER,
257
+ `paused: waiting for a decision. A person set a breakpoint and wants to be asked before ${codeSubject(h)} changes.${on} The edit was not made.`,
258
+ `Call the CodeTrellis await_decision tool with ref "${h.ref}", and call it again while it says it is still waiting (this can take a long time; do not work around it). If they answer continue, make the edit again.`
259
+ ].join("\n");
260
+ }
261
+ function editView(result) {
262
+ switch (result.kind) {
263
+ case "pass":
264
+ return { status: "pass" };
265
+ case "continue":
266
+ return { status: "continue", ref: result.hit.ref, steer: result.steer };
267
+ case "stop":
268
+ return { status: "stop", ref: result.hit.ref, message: heldEditText(result) };
269
+ case "paused":
270
+ return { status: "paused", ref: result.hit.ref, message: heldEditText(result) };
271
+ }
272
+ }
273
+ // Annotate the CommonJS export names for ESM import in node:
274
+ 0 && (module.exports = {
275
+ BREAKPOINT_MARKER,
276
+ HOOK_AGENT,
277
+ breachNoticeFor,
278
+ breachText,
279
+ codeBreakpoints,
280
+ codeSubject,
281
+ editTouches,
282
+ editView,
283
+ enforceEdit,
284
+ functionOf,
285
+ heldEditText,
286
+ nameMatches,
287
+ recordBreaches,
288
+ resetBreachNotices,
289
+ symbolRanges,
290
+ untoldBreaches
291
+ });
@@ -0,0 +1,168 @@
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 comment_service_exports = {};
19
+ __export(comment_service_exports, {
20
+ addComment: () => addComment,
21
+ deleteComment: () => deleteComment,
22
+ getComments: () => getComments,
23
+ listCommentsFlat: () => listCommentsFlat,
24
+ listCommentsForPlanSince: () => listCommentsForPlanSince,
25
+ listItemComments: () => listItemComments
26
+ });
27
+ module.exports = __toCommonJS(comment_service_exports);
28
+ var import_node_crypto = require("node:crypto");
29
+ var import_database = require("./database");
30
+ var import_persistence = require("./persistence");
31
+ function inferSource(authorType, explicit) {
32
+ if (explicit) return explicit;
33
+ return authorType === "human" || authorType === "unverified" ? "human" : "agent";
34
+ }
35
+ function addComment(targetType, targetUid, author, authorType, body, commentTypeOrOpts = "comment", parentUidLegacy) {
36
+ const opts = typeof commentTypeOrOpts === "string" ? { commentType: commentTypeOrOpts, parentUid: parentUidLegacy } : commentTypeOrOpts;
37
+ const uid = (0, import_node_crypto.randomUUID)();
38
+ const now = Date.now();
39
+ const commentType = opts.commentType ?? "comment";
40
+ const kind = opts.kind ?? null;
41
+ const source = inferSource(authorType, opts.source);
42
+ const metadataJson = opts.metadata ? JSON.stringify(opts.metadata) : null;
43
+ (0, import_database.getDb)().run(
44
+ `INSERT INTO comments (uid, target_type, target_uid, parent_uid, author, author_type, body, comment_type, kind, source, metadata, created_at)
45
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
46
+ [uid, targetType, targetUid, opts.parentUid || null, author, authorType, body, commentType, kind, source, metadataJson, now]
47
+ );
48
+ (0, import_persistence.markDirty)();
49
+ return {
50
+ uid,
51
+ targetType,
52
+ targetUid,
53
+ parentUid: opts.parentUid || null,
54
+ author,
55
+ authorType,
56
+ body,
57
+ commentType,
58
+ kind: kind ?? void 0,
59
+ source,
60
+ metadata: opts.metadata,
61
+ createdAt: now
62
+ };
63
+ }
64
+ function rowToComment(r) {
65
+ let metadata;
66
+ try {
67
+ metadata = r[10] ? JSON.parse(r[10]) : void 0;
68
+ } catch {
69
+ metadata = void 0;
70
+ }
71
+ return {
72
+ uid: r[0],
73
+ targetType: r[1],
74
+ targetUid: r[2],
75
+ parentUid: r[3],
76
+ author: r[4],
77
+ authorType: r[5],
78
+ body: r[6],
79
+ commentType: r[7],
80
+ kind: r[8] ?? void 0,
81
+ source: r[9] ?? void 0,
82
+ metadata,
83
+ createdAt: r[11]
84
+ };
85
+ }
86
+ const COMMENT_COLUMNS = `uid, target_type, target_uid, parent_uid, author, author_type, body, comment_type, kind, source, metadata, created_at`;
87
+ function deleteComment(uid) {
88
+ const db = (0, import_database.getDb)();
89
+ const before = db.exec(`SELECT uid FROM comments WHERE uid = ?`, [uid]);
90
+ if (!before[0]?.values[0]) return false;
91
+ db.run(`DELETE FROM comments WHERE uid = ?`, [uid]);
92
+ (0, import_persistence.markDirty)();
93
+ return true;
94
+ }
95
+ function getComments(targetUid) {
96
+ const result = (0, import_database.getDb)().exec(
97
+ `SELECT ${COMMENT_COLUMNS}
98
+ FROM comments WHERE target_uid = ? ORDER BY created_at ASC`,
99
+ [targetUid]
100
+ );
101
+ if (!result[0]) return [];
102
+ const all = result[0].values.map((r) => ({
103
+ ...rowToComment(r),
104
+ replies: []
105
+ }));
106
+ const topLevel = [];
107
+ const byUid = /* @__PURE__ */ new Map();
108
+ for (const c of all) {
109
+ byUid.set(c.uid, c);
110
+ }
111
+ for (const c of all) {
112
+ if (c.parentUid && byUid.has(c.parentUid)) {
113
+ byUid.get(c.parentUid).replies.push(c);
114
+ } else {
115
+ topLevel.push(c);
116
+ }
117
+ }
118
+ return topLevel;
119
+ }
120
+ function listCommentsFlat(targetUid) {
121
+ const result = (0, import_database.getDb)().exec(
122
+ `SELECT ${COMMENT_COLUMNS}
123
+ FROM comments WHERE target_uid = ? ORDER BY created_at ASC`,
124
+ [targetUid]
125
+ );
126
+ if (!result[0]) return [];
127
+ return result[0].values.map((r) => rowToComment(r));
128
+ }
129
+ function listItemComments(itemUid) {
130
+ const result = (0, import_database.getDb)().exec(
131
+ `SELECT ${COMMENT_COLUMNS}
132
+ FROM comments
133
+ WHERE target_uid = ? AND target_type IN ('item', 'task')
134
+ ORDER BY created_at ASC`,
135
+ [itemUid]
136
+ );
137
+ if (!result[0]) return [];
138
+ return result[0].values.map((r) => rowToComment(r));
139
+ }
140
+ function listCommentsForPlanSince(planUid, since) {
141
+ const db = (0, import_database.getDb)();
142
+ const itemRows = db.exec(`SELECT uid FROM plan_items WHERE plan_uid = ?`, [planUid]);
143
+ let targetUids = (itemRows[0]?.values ?? []).map((r) => r[0]);
144
+ if (targetUids.length === 0) {
145
+ const taskRows = db.exec(`SELECT uid FROM tasks WHERE plan_uid = ?`, [planUid]);
146
+ targetUids = (taskRows[0]?.values ?? []).map((r) => r[0]);
147
+ }
148
+ if (targetUids.length === 0) return [];
149
+ const placeholders = targetUids.map(() => "?").join(", ");
150
+ const result = db.exec(
151
+ `SELECT ${COMMENT_COLUMNS}
152
+ FROM comments
153
+ WHERE target_uid IN (${placeholders}) AND created_at > ?
154
+ ORDER BY created_at ASC`,
155
+ [...targetUids, since]
156
+ );
157
+ if (!result[0]) return [];
158
+ return result[0].values.map((r) => rowToComment(r));
159
+ }
160
+ // Annotate the CommonJS export names for ESM import in node:
161
+ 0 && (module.exports = {
162
+ addComment,
163
+ deleteComment,
164
+ getComments,
165
+ listCommentsFlat,
166
+ listCommentsForPlanSince,
167
+ listItemComments
168
+ });
@@ -0,0 +1,134 @@
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 commit_attribution_exports = {};
29
+ __export(commit_attribution_exports, {
30
+ NO_KNOWLEDGE: () => NO_KNOWLEDGE,
31
+ agentFromMessage: () => agentFromMessage,
32
+ attributeCommits: () => attributeCommits,
33
+ isProjectRelativePath: () => isProjectRelativePath,
34
+ recordedKnowledge: () => recordedKnowledge
35
+ });
36
+ module.exports = __toCommonJS(commit_attribution_exports);
37
+ var import_node_fs = __toESM(require("node:fs"));
38
+ var import_database = require("./database");
39
+ var import_replay_frames = require("./replay-frames");
40
+ const NO_KNOWLEDGE = { seenBy: () => /* @__PURE__ */ new Map(), sessionAt: () => null, taskOf: () => null };
41
+ const AGENT_NAMES = /\b(claude|codex|copilot|cursor|gemini|aider|devin|windsurf|amp)\b/i;
42
+ function agentFromMessage(body) {
43
+ const line = body.match(/^agent:\s*(\S+)/m);
44
+ if (line) return { agent: line[1], how: "commit message", words: `${line[1]}, from the commit message` };
45
+ for (const m of body.matchAll(/^Co-Authored-By:\s*([^<\n]+?)\s*<[^>\n]*>\s*$/gim)) {
46
+ const name = m[1].match(AGENT_NAMES);
47
+ if (name) {
48
+ const agent = name[1].toLowerCase();
49
+ return { agent, how: "commit message", words: `${agent}, from the commit's Co-Authored-By trailer (${m[1].trim()})` };
50
+ }
51
+ }
52
+ return null;
53
+ }
54
+ const basename = (p) => p.replace(/[\\/]+$/, "").split(/[\\/]/).pop() ?? p;
55
+ function attributeCommits(rows, checkoutRoot, know = NO_KNOWLEDGE) {
56
+ const out = /* @__PURE__ */ new Map();
57
+ const seen = know.seenBy(rows.map((r) => r.sha));
58
+ for (const r of rows) {
59
+ const frame = seen.get(r.sha);
60
+ const fromMessage = agentFromMessage(r.body);
61
+ let a = fromMessage ? { ...fromMessage, sessionId: frame?.sessionId ?? null } : null;
62
+ if (!a && frame?.agentType) {
63
+ a = {
64
+ agent: frame.agentType,
65
+ how: "seen",
66
+ sessionId: frame.sessionId,
67
+ words: `${frame.agentType}, seen: it landed while CodeTrellis recorded ${frame.agentType}'s session${frame.workstreamRoot ? ` in ${basename(frame.workstreamRoot)}` : ""}`
68
+ };
69
+ }
70
+ if (!a && checkoutRoot) {
71
+ const open = know.sessionAt(checkoutRoot, r.at);
72
+ if (open) {
73
+ a = {
74
+ agent: open.agentType,
75
+ how: "timing",
76
+ sessionId: open.sessionId,
77
+ words: `probably ${open.agentType}: committed while ${open.agentType}'s session was open in this checkout`
78
+ };
79
+ }
80
+ }
81
+ if (!a) continue;
82
+ if (a.sessionId) {
83
+ const t = know.taskOf(a.sessionId);
84
+ if (t) {
85
+ a.task = t.task;
86
+ a.plan = t.plan;
87
+ }
88
+ }
89
+ out.set(r.sha, a);
90
+ }
91
+ return out;
92
+ }
93
+ const SESSION_GRACE_MS = 10 * 6e4;
94
+ const trim = (p) => p.replace(/[\\/]+$/, "");
95
+ function recordedKnowledge(projectPath) {
96
+ return {
97
+ seenBy: (shas) => (0, import_replay_frames.framesByCommit)(projectPath, shas),
98
+ sessionAt: (checkoutRoot, at) => {
99
+ const spelled = trim(checkoutRoot);
100
+ let real = spelled;
101
+ try {
102
+ real = import_node_fs.default.realpathSync.native(spelled);
103
+ } catch {
104
+ }
105
+ const row = (0, import_database.getDb)().exec(
106
+ `SELECT session_id, agent_type FROM agent_sessions
107
+ WHERE workstream_root IN (?, ?) AND connected_at <= ? AND last_seen + ? >= ?
108
+ ORDER BY connected_at DESC LIMIT 1`,
109
+ // A commit's time is whole seconds: one made in the second the session started is in it.
110
+ [spelled, real, at + 999, SESSION_GRACE_MS, at]
111
+ )[0]?.values?.[0];
112
+ return row ? { sessionId: String(row[0]), agentType: String(row[1]) } : null;
113
+ },
114
+ taskOf: (sessionId) => {
115
+ const row = (0, import_database.getDb)().exec(
116
+ `SELECT i.uid, i.title, p.uid, p.title FROM plan_items i JOIN plans p ON p.uid = i.plan_uid
117
+ WHERE i.assignee_session = ? ORDER BY i.rowid DESC LIMIT 1`,
118
+ [sessionId]
119
+ )[0]?.values?.[0];
120
+ return row ? { task: { uid: String(row[0]), title: String(row[1]) }, plan: { uid: String(row[2]), title: String(row[3]) } } : null;
121
+ }
122
+ };
123
+ }
124
+ function isProjectRelativePath(rel) {
125
+ return typeof rel === "string" && rel.length > 0 && !rel.startsWith("-") && !rel.startsWith(":") && !rel.startsWith("/") && !/^[A-Za-z]:[\\/]/.test(rel) && !rel.split(/[\\/]/).includes("..");
126
+ }
127
+ // Annotate the CommonJS export names for ESM import in node:
128
+ 0 && (module.exports = {
129
+ NO_KNOWLEDGE,
130
+ agentFromMessage,
131
+ attributeCommits,
132
+ isProjectRelativePath,
133
+ recordedKnowledge
134
+ });