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,305 @@
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 artefact_service_exports = {};
29
+ __export(artefact_service_exports, {
30
+ ARTEFACT_EXTS: () => ARTEFACT_EXTS,
31
+ ARTEFACT_ROLES: () => ARTEFACT_ROLES,
32
+ ArtefactError: () => ArtefactError,
33
+ artefactPathsForProject: () => artefactPathsForProject,
34
+ currentHashes: () => currentHashes,
35
+ getArtefact: () => getArtefact,
36
+ itemsWithArtefactAt: () => itemsWithArtefactAt,
37
+ listArtefacts: () => listArtefacts,
38
+ projectRootForItem: () => projectRootForItem,
39
+ recordArtefact: () => recordArtefact,
40
+ refreshArtefactHashes: () => refreshArtefactHashes
41
+ });
42
+ module.exports = __toCommonJS(artefact_service_exports);
43
+ var import_node_fs = __toESM(require("node:fs"));
44
+ var import_node_path = __toESM(require("node:path"));
45
+ var import_node_crypto = require("node:crypto");
46
+ var import_database = require("./database");
47
+ var import_persistence = require("./persistence");
48
+ var import_confined_fs = require("./confined-fs");
49
+ var import_trusted_roots = require("./trusted-roots");
50
+ var import_sha256_file = require("../lib/sha256-file");
51
+ var import_cloud_files = require("./cloud-files");
52
+ var import_material_place = require("./material-place");
53
+ const ARTEFACT_ROLES = ["material", "output", "evidence"];
54
+ const ARTEFACT_EXTS = /* @__PURE__ */ new Set([
55
+ "pdf",
56
+ "png",
57
+ "jpg",
58
+ "jpeg",
59
+ "gif",
60
+ "webp",
61
+ "svg",
62
+ "mp4",
63
+ "webm",
64
+ "mov",
65
+ "xlsx",
66
+ "xls",
67
+ "xlsm",
68
+ "csv",
69
+ "docx",
70
+ "pptx",
71
+ "md",
72
+ "txt",
73
+ "json",
74
+ "log",
75
+ "xml",
76
+ // JUnit reports — the evidence a `test` criterion reads (§8.1)
77
+ "html",
78
+ "htm"
79
+ ]);
80
+ class ArtefactError extends Error {
81
+ constructor(message, status = 400) {
82
+ super(message);
83
+ this.status = status;
84
+ }
85
+ status;
86
+ }
87
+ const rows = (sql, params = []) => (0, import_database.getDb)().exec(sql, params)[0]?.values ?? [];
88
+ const ARTEFACT_COLS = "uid, target_uid, value, role, sha256, size, mtime, label, recorded_by, recorded_by_type, created_at";
89
+ function toArtefact(r) {
90
+ return {
91
+ uid: r[0],
92
+ itemUid: r[1],
93
+ path: r[2],
94
+ role: r[3],
95
+ sha256: r[4] ?? null,
96
+ size: r[5] ?? null,
97
+ mtime: r[6] ?? null,
98
+ label: r[7] ?? null,
99
+ recordedBy: r[8] ?? "",
100
+ recordedByType: r[9] ?? "",
101
+ createdAt: r[10]
102
+ };
103
+ }
104
+ function listArtefacts(itemUid) {
105
+ return rows(
106
+ `SELECT ${ARTEFACT_COLS} FROM attachments
107
+ WHERE target_type = 'item' AND target_uid = ? AND role IS NOT NULL ORDER BY created_at`,
108
+ [itemUid]
109
+ ).map(toArtefact);
110
+ }
111
+ function getArtefact(uid) {
112
+ const r = rows(`SELECT ${ARTEFACT_COLS} FROM attachments WHERE uid = ? AND role IS NOT NULL`, [uid])[0];
113
+ return r ? toArtefact(r) : null;
114
+ }
115
+ function currentHashes(attachmentUids) {
116
+ const out = {};
117
+ for (const uid of attachmentUids) {
118
+ const r = rows(`SELECT sha256 FROM attachments WHERE uid = ?`, [uid])[0];
119
+ out[uid] = r?.[0] ?? null;
120
+ }
121
+ return out;
122
+ }
123
+ function projectRootForItem(itemUid) {
124
+ const projectPath = rows(
125
+ `SELECT p.project_path FROM plan_items i JOIN plans p ON p.uid = i.plan_uid WHERE i.uid = ?`,
126
+ [itemUid]
127
+ )[0]?.[0];
128
+ if (!projectPath) throw new ArtefactError("Item not found, or its plan has no project", 404);
129
+ try {
130
+ return (0, import_trusted_roots.resolveTrustedProjectRoot)(projectPath, "artefact project");
131
+ } catch {
132
+ throw new ArtefactError("This item's project is not open in CodeTrellis \u2014 open it first", 409);
133
+ }
134
+ }
135
+ function toProjectRelative(root, input) {
136
+ if (typeof input !== "string" || !input.trim()) throw new ArtefactError("path is required");
137
+ const trimmed = input.trim();
138
+ const placed = (0, import_material_place.isPlacePath)(trimmed) ? trimmed : import_node_path.default.isAbsolute(trimmed) ? (0, import_material_place.placeOf)(import_node_path.default.resolve(trimmed), (0, import_confined_fs.canonicalRoot)(root)) ?? (0, import_material_place.placeOf)(import_node_path.default.resolve(trimmed), root) : null;
139
+ if (placed && (0, import_material_place.isPlacePath)(placed)) {
140
+ const loc = (0, import_material_place.locateStored)(placed, root);
141
+ if (!loc) throw new ArtefactError("This project has no plans folder linked on this device \u2014 Settings \u2192 Plans folder");
142
+ try {
143
+ (0, import_confined_fs.resolveWithin)(loc.root, loc.rel, "artefact");
144
+ } catch (err) {
145
+ if (err instanceof import_confined_fs.ConfinementError) throw new ArtefactError("The path must be a file inside the plans folder, reached without a symbolic link");
146
+ throw err;
147
+ }
148
+ return `${import_material_place.PLANS_PREFIX}${loc.rel.split(import_node_path.default.sep).join("/")}`;
149
+ }
150
+ const canonRoot = (0, import_confined_fs.canonicalRoot)(root);
151
+ let resolved;
152
+ try {
153
+ resolved = (0, import_confined_fs.resolveWithin)(canonRoot, input.trim(), "artefact");
154
+ } catch (err) {
155
+ if (err instanceof import_confined_fs.ConfinementError) {
156
+ throw new ArtefactError("The path must be a file inside this item's project, reached without a symbolic link");
157
+ }
158
+ throw err;
159
+ }
160
+ if (!(0, import_confined_fs.isInside)(canonRoot, resolved) || resolved === canonRoot) {
161
+ throw new ArtefactError("The path must be a file inside this item's project");
162
+ }
163
+ return import_node_path.default.relative(canonRoot, resolved).split(import_node_path.default.sep).join("/");
164
+ }
165
+ async function recordArtefact(input) {
166
+ if (!ARTEFACT_ROLES.includes(input.role)) {
167
+ throw new ArtefactError(`role must be one of: ${ARTEFACT_ROLES.join(", ")}`);
168
+ }
169
+ const role = input.role;
170
+ const root = projectRootForItem(input.itemUid);
171
+ const rel = toProjectRelative(root, input.path);
172
+ const ext = import_node_path.default.extname(rel).slice(1).toLowerCase();
173
+ if (!ARTEFACT_EXTS.has(ext)) {
174
+ throw new ArtefactError(
175
+ `.${ext || "(none)"} files cannot be recorded as artefacts \u2014 the viewer shows ${[...ARTEFACT_EXTS].join(", ")}`
176
+ );
177
+ }
178
+ let hashed;
179
+ const at = (0, import_material_place.locateStored)(rel, root) ?? { root, rel };
180
+ try {
181
+ hashed = await (0, import_sha256_file.sha256FileWithin)(at.root, at.rel);
182
+ } catch (err) {
183
+ if (err instanceof import_cloud_files.NotOnDeviceError) throw new ArtefactError(`${err.message}. Make it available on this device, then record it.`, 409);
184
+ if (err instanceof import_confined_fs.ConfinementError) throw new ArtefactError("The path must be a regular file inside this item's project, not a link or folder");
185
+ if (err.code === "ENOENT") throw new ArtefactError(`No file at ${rel}`, 404);
186
+ throw err;
187
+ }
188
+ const db = (0, import_database.getDb)();
189
+ const existing = rows(
190
+ `SELECT uid FROM attachments WHERE target_type = 'item' AND target_uid = ? AND value = ? AND kind = 'file_ref'`,
191
+ [input.itemUid, rel]
192
+ )[0];
193
+ const label = input.note?.trim() || import_node_path.default.basename(rel);
194
+ let uid;
195
+ if (existing) {
196
+ uid = existing[0];
197
+ db.run(
198
+ `UPDATE attachments SET role = ?, sha256 = ?, size = ?, mtime = ?, label = ?,
199
+ recorded_by = ?, recorded_by_type = ? WHERE uid = ?`,
200
+ [
201
+ role,
202
+ hashed.sha256,
203
+ hashed.size,
204
+ Math.round(hashed.mtimeMs),
205
+ label,
206
+ input.actor.author,
207
+ input.actor.authorType,
208
+ uid
209
+ ]
210
+ );
211
+ } else {
212
+ uid = (0, import_node_crypto.randomUUID)();
213
+ db.run(
214
+ `INSERT INTO attachments
215
+ (uid, target_type, target_uid, kind, value, label, content_type, author, author_type, created_at,
216
+ role, sha256, size, mtime, recorded_by, recorded_by_type)
217
+ VALUES (?, 'item', ?, 'file_ref', ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
218
+ [
219
+ uid,
220
+ input.itemUid,
221
+ rel,
222
+ label,
223
+ input.actor.author,
224
+ input.actor.authorType,
225
+ Date.now(),
226
+ role,
227
+ hashed.sha256,
228
+ hashed.size,
229
+ Math.round(hashed.mtimeMs),
230
+ input.actor.author,
231
+ input.actor.authorType
232
+ ]
233
+ );
234
+ }
235
+ (0, import_persistence.markDirty)();
236
+ return getArtefact(uid);
237
+ }
238
+ async function refreshArtefactHashes(itemUid) {
239
+ const artefacts = listArtefacts(itemUid);
240
+ if (artefacts.length === 0) return [];
241
+ let root;
242
+ try {
243
+ root = projectRootForItem(itemUid);
244
+ } catch {
245
+ return [];
246
+ }
247
+ const changed = [];
248
+ for (const a of artefacts) {
249
+ let next;
250
+ try {
251
+ const at = (0, import_material_place.locateStored)(a.path, root);
252
+ if (!at) throw new import_confined_fs.ConfinementError("not placed on this device");
253
+ const abs = (0, import_confined_fs.resolveWithin)(at.root, at.rel, "artefact");
254
+ const st = import_node_fs.default.lstatSync(abs);
255
+ if (!st.isFile()) throw new import_confined_fs.ConfinementError("not a file");
256
+ if (st.size === a.size && Math.round(st.mtimeMs) === a.mtime && a.sha256) continue;
257
+ const h = await (0, import_sha256_file.sha256FileWithin)(at.root, at.rel);
258
+ next = { sha256: h.sha256, size: h.size, mtime: Math.round(h.mtimeMs) };
259
+ } catch (err) {
260
+ if (err instanceof import_cloud_files.NotOnDeviceError) continue;
261
+ next = { sha256: null, size: null, mtime: null };
262
+ }
263
+ if (next.sha256 !== a.sha256 || next.size !== a.size || next.mtime !== a.mtime) {
264
+ (0, import_database.getDb)().run(
265
+ `UPDATE attachments SET sha256 = ?, size = ?, mtime = ? WHERE uid = ?`,
266
+ [next.sha256, next.size, next.mtime, a.uid]
267
+ );
268
+ if (next.sha256 !== a.sha256) changed.push(a.uid);
269
+ }
270
+ }
271
+ if (changed.length) (0, import_persistence.markDirty)();
272
+ return changed;
273
+ }
274
+ function itemsWithArtefactAt(projectPath, rel) {
275
+ return rows(
276
+ `SELECT DISTINCT a.target_uid FROM attachments a
277
+ JOIN plan_items i ON i.uid = a.target_uid
278
+ JOIN plans p ON p.uid = i.plan_uid
279
+ WHERE a.role IS NOT NULL AND a.value = ? AND p.project_path = ?`,
280
+ [rel, projectPath]
281
+ ).map((r) => r[0]);
282
+ }
283
+ function artefactPathsForProject(projectPath) {
284
+ return rows(
285
+ `SELECT DISTINCT a.value FROM attachments a
286
+ JOIN plan_items i ON i.uid = a.target_uid
287
+ JOIN plans p ON p.uid = i.plan_uid
288
+ WHERE a.role IS NOT NULL AND p.project_path = ?`,
289
+ [projectPath]
290
+ ).map((r) => r[0]);
291
+ }
292
+ // Annotate the CommonJS export names for ESM import in node:
293
+ 0 && (module.exports = {
294
+ ARTEFACT_EXTS,
295
+ ARTEFACT_ROLES,
296
+ ArtefactError,
297
+ artefactPathsForProject,
298
+ currentHashes,
299
+ getArtefact,
300
+ itemsWithArtefactAt,
301
+ listArtefacts,
302
+ projectRootForItem,
303
+ recordArtefact,
304
+ refreshArtefactHashes
305
+ });
@@ -0,0 +1,167 @@
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 artefact_watcher_exports = {};
29
+ __export(artefact_watcher_exports, {
30
+ startArtefactWatcherForProject: () => startArtefactWatcherForProject,
31
+ startArtefactWatching: () => startArtefactWatching,
32
+ stopArtefactWatchers: () => stopArtefactWatchers,
33
+ watchPlanArtefacts: () => watchPlanArtefacts
34
+ });
35
+ module.exports = __toCommonJS(artefact_watcher_exports);
36
+ var _lazy____server = __toESM(require("../server"));
37
+ var import_node_path = __toESM(require("node:path"));
38
+ var import_chokidar = __toESM(require("chokidar"));
39
+ var import_artefact_service = require("./artefact-service");
40
+ var import_criteria_service = require("./criteria-service");
41
+ var import_criterion_loop_service = require("./criterion-loop-service");
42
+ var import_sensor_bridge_service = require("./sensor-bridge-service");
43
+ var import_database = require("./database");
44
+ var import_trusted_roots = require("./trusted-roots");
45
+ var awareness = __toESM(require("./awareness-service"));
46
+ var import_material_place = require("./material-place");
47
+ const watches = /* @__PURE__ */ new Map();
48
+ function planUidOf(itemUid) {
49
+ return (0, import_database.getDb)().exec(`SELECT plan_uid FROM plan_items WHERE uid = ?`, [itemUid])[0]?.values[0]?.[0] ?? null;
50
+ }
51
+ function projectPathOf(itemUid) {
52
+ return (0, import_database.getDb)().exec(
53
+ `SELECT p.project_path FROM plan_items i JOIN plans p ON p.uid = i.plan_uid WHERE i.uid = ?`,
54
+ [itemUid]
55
+ )[0]?.values[0]?.[0] ?? null;
56
+ }
57
+ async function onArtefactChanged(w, absPath) {
58
+ const rel = (0, import_material_place.placeOf)(absPath, w.root) ?? import_node_path.default.relative(w.root, absPath).split(import_node_path.default.sep).join("/");
59
+ let anyChanged = false;
60
+ try {
61
+ for (const itemUid of (0, import_artefact_service.itemsWithArtefactAt)(w.projectPath, rel)) {
62
+ const moved = await onItemArtefactChanged(itemUid, rel);
63
+ anyChanged ||= moved;
64
+ }
65
+ } finally {
66
+ if (anyChanged) {
67
+ await awareness.refreshSignals(w.projectPath).catch((err) => console.warn("[Artefacts] Signal refresh failed:", err));
68
+ }
69
+ }
70
+ }
71
+ async function onItemArtefactChanged(itemUid, rel) {
72
+ const wasMet = new Set((0, import_criteria_service.listCriteria)(itemUid).filter((c) => c.state === "met").map((c) => c.uid));
73
+ const changed = await (0, import_artefact_service.refreshArtefactHashes)(itemUid);
74
+ if (changed.length === 0) return false;
75
+ const nowStale = (0, import_criteria_service.listCriteria)(itemUid).filter((c) => c.state === "stale" && wasMet.has(c.uid));
76
+ try {
77
+ _lazy____server.broadcast("plan-item-criteria-changed", { planUid: planUidOf(itemUid), itemUid });
78
+ } catch {
79
+ }
80
+ const planUid = planUidOf(itemUid);
81
+ if (!planUid) return true;
82
+ try {
83
+ const run = await (0, import_criterion_loop_service.runCheckRun)({
84
+ planUid,
85
+ trigger: "material_changed",
86
+ by: "codetrellis",
87
+ byType: "system",
88
+ itemUids: [itemUid]
89
+ });
90
+ _lazy____server.broadcast("plan-check-run", { planUid, runUid: run.uid });
91
+ } catch (err) {
92
+ console.warn("[Artefacts] Check run after a change failed:", err);
93
+ }
94
+ for (const c of nowStale) {
95
+ (0, import_sensor_bridge_service.postCriterionNotice)({
96
+ planUid,
97
+ itemUid,
98
+ criterionUid: c.uid,
99
+ reason: "stale",
100
+ message: `"${c.text}" was approved, and ${rel} has changed since. Is it still met?`
101
+ });
102
+ }
103
+ return true;
104
+ }
105
+ function startArtefactWatcherForProject(projectPath) {
106
+ if (watches.has(projectPath)) return;
107
+ let root;
108
+ try {
109
+ root = (0, import_trusted_roots.resolveTrustedProjectRoot)(projectPath, "artefact watcher");
110
+ } catch {
111
+ return;
112
+ }
113
+ const watcher = import_chokidar.default.watch([], {
114
+ ignoreInitial: true,
115
+ persistent: true,
116
+ awaitWriteFinish: { stabilityThreshold: 200, pollInterval: 50 },
117
+ followSymlinks: false
118
+ });
119
+ const w = { watcher, projectPath, root };
120
+ watcher.on("all", (event, file) => {
121
+ if (event !== "change" && event !== "add" && event !== "unlink") return;
122
+ void onArtefactChanged(w, file).catch((err) => console.warn("[Artefacts] Refresh failed:", err));
123
+ });
124
+ watcher.on("error", (err) => console.warn("[Artefacts] Watcher error:", err));
125
+ for (const rel of (0, import_artefact_service.artefactPathsForProject)(projectPath)) {
126
+ const at = (0, import_material_place.locateStored)(rel, root);
127
+ if (at) watcher.add(import_node_path.default.join(at.root, at.rel));
128
+ }
129
+ watches.set(projectPath, w);
130
+ }
131
+ function startArtefactWatching(artefact) {
132
+ const projectPath = projectPathOf(artefact.itemUid);
133
+ if (!projectPath) return;
134
+ if (!watches.has(projectPath)) startArtefactWatcherForProject(projectPath);
135
+ const w = watches.get(projectPath);
136
+ if (!w) return;
137
+ try {
138
+ const at = (0, import_material_place.locateStored)(artefact.path, (0, import_artefact_service.projectRootForItem)(artefact.itemUid));
139
+ if (at) w.watcher.add(import_node_path.default.join(at.root, at.rel));
140
+ } catch {
141
+ }
142
+ }
143
+ function watchPlanArtefacts(projectPath, planUid) {
144
+ if (!watches.has(projectPath)) startArtefactWatcherForProject(projectPath);
145
+ const w = watches.get(projectPath);
146
+ if (!w) return;
147
+ const values = ((0, import_database.getDb)().exec(
148
+ `SELECT DISTINCT a.value FROM attachments a JOIN plan_items i ON i.uid = a.target_uid
149
+ WHERE i.plan_uid = ? AND a.target_type = 'item' AND a.kind = 'file_ref' AND a.role IS NOT NULL`,
150
+ [planUid]
151
+ )[0]?.values ?? []).map((r) => String(r[0]));
152
+ for (const v of values) {
153
+ const at = (0, import_material_place.locateStored)(v, w.root);
154
+ if (at) w.watcher.add(import_node_path.default.join(at.root, at.rel));
155
+ }
156
+ }
157
+ function stopArtefactWatchers() {
158
+ for (const w of watches.values()) void w.watcher.close();
159
+ watches.clear();
160
+ }
161
+ // Annotate the CommonJS export names for ESM import in node:
162
+ 0 && (module.exports = {
163
+ startArtefactWatcherForProject,
164
+ startArtefactWatching,
165
+ stopArtefactWatchers,
166
+ watchPlanArtefacts
167
+ });