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,169 @@
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 fixtures_test_helper_exports = {};
29
+ __export(fixtures_test_helper_exports, {
30
+ makeDeck: () => makeDeck,
31
+ makeDocx: () => makeDocx,
32
+ makePdf: () => makePdf,
33
+ makeWorkbook: () => makeWorkbook,
34
+ makeZip: () => makeZip
35
+ });
36
+ module.exports = __toCommonJS(fixtures_test_helper_exports);
37
+ var import_node_zlib = __toESM(require("node:zlib"));
38
+ function makeZip(entries) {
39
+ const locals = [];
40
+ const centrals = [];
41
+ let offset = 0;
42
+ Object.entries(entries).forEach(([name, content], i) => {
43
+ const raw = Buffer.isBuffer(content) ? content : Buffer.from(content, "utf8");
44
+ const method = i === 0 ? 0 : 8;
45
+ const data = method === 0 ? raw : import_node_zlib.default.deflateRawSync(raw);
46
+ const nameBuf = Buffer.from(name, "utf8");
47
+ const local = Buffer.alloc(30);
48
+ local.writeUInt32LE(67324752, 0);
49
+ local.writeUInt16LE(20, 4);
50
+ local.writeUInt16LE(method, 8);
51
+ local.writeUInt32LE(import_node_zlib.default.crc32(raw), 14);
52
+ local.writeUInt32LE(data.length, 18);
53
+ local.writeUInt32LE(raw.length, 22);
54
+ local.writeUInt16LE(nameBuf.length, 26);
55
+ const central = Buffer.alloc(46);
56
+ central.writeUInt32LE(33639248, 0);
57
+ central.writeUInt16LE(20, 4);
58
+ central.writeUInt16LE(20, 6);
59
+ central.writeUInt16LE(method, 10);
60
+ central.writeUInt32LE(import_node_zlib.default.crc32(raw), 16);
61
+ central.writeUInt32LE(data.length, 20);
62
+ central.writeUInt32LE(raw.length, 24);
63
+ central.writeUInt16LE(nameBuf.length, 28);
64
+ central.writeUInt32LE(offset, 42);
65
+ locals.push(local, nameBuf, data);
66
+ centrals.push(central, nameBuf);
67
+ offset += 30 + nameBuf.length + data.length;
68
+ });
69
+ const cd = Buffer.concat(centrals);
70
+ const eocd = Buffer.alloc(22);
71
+ eocd.writeUInt32LE(101010256, 0);
72
+ eocd.writeUInt16LE(Object.keys(entries).length, 8);
73
+ eocd.writeUInt16LE(Object.keys(entries).length, 10);
74
+ eocd.writeUInt32LE(cd.length, 12);
75
+ eocd.writeUInt32LE(offset, 16);
76
+ return Buffer.concat([...locals, cd, eocd]);
77
+ }
78
+ const esc = (s) => s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
79
+ function makeWorkbook(sheets, opts = {}) {
80
+ const shared = [];
81
+ const names = Object.keys(sheets);
82
+ const col = (n) => {
83
+ let s = "";
84
+ for (let x = n; x > 0; x = Math.floor((x - 1) / 26)) s = String.fromCharCode(65 + (x - 1) % 26) + s;
85
+ return s;
86
+ };
87
+ const parts = {
88
+ "xl/workbook.xml": `<workbook xmlns:r="r"><sheets>${names.map((n, i) => `<sheet name="${esc(n)}" sheetId="${i + 1}" r:id="rId${i + 1}"/>`).join("")}</sheets></workbook>`,
89
+ "xl/_rels/workbook.xml.rels": `<Relationships>${names.map((_, i) => `<Relationship Id="rId${i + 1}" Target="worksheets/sheet${i + 1}.xml"/>`).join("")}</Relationships>`
90
+ };
91
+ names.forEach((name, i) => {
92
+ const rows = sheets[name];
93
+ const width = Math.max(1, ...rows.map((r) => r.length));
94
+ const cells = rows.map((r, ri) => `<row r="${ri + 1}">${r.map((v, ci) => {
95
+ const ref = `${col(ci + 1)}${ri + 1}`;
96
+ if (typeof v === "number") return `<c r="${ref}"><v>${v}</v></c>`;
97
+ shared.push(v);
98
+ return `<c r="${ref}" t="s"><v>${shared.length - 1}</v></c>`;
99
+ }).join("")}</row>`).join("");
100
+ parts[`xl/worksheets/sheet${i + 1}.xml`] = `<worksheet><dimension ref="A1:${col(width)}${Math.max(1, rows.length)}"/><sheetData>${cells}</sheetData></worksheet>`;
101
+ });
102
+ parts["xl/sharedStrings.xml"] = `<sst>${shared.map((s) => `<si><t>${esc(s)}</t></si>`).join("")}</sst>`;
103
+ if (opts.macros) parts["xl/vbaProject.bin"] = Buffer.from("not really a macro");
104
+ return makeZip(parts);
105
+ }
106
+ function makeDocx(paragraphs, table) {
107
+ const p = (t) => t.startsWith("# ") ? `<w:p><w:pPr><w:pStyle w:val="Heading1"/></w:pPr><w:r><w:t>${esc(t.slice(2))}</w:t></w:r></w:p>` : `<w:p><w:r><w:t xml:space="preserve">${esc(t)}</w:t></w:r></w:p>`;
108
+ const tbl = table ? `<w:tbl>${table.map((r) => `<w:tr>${r.map((c) => `<w:tc><w:p><w:r><w:t>${esc(c)}</w:t></w:r></w:p></w:tc>`).join("")}</w:tr>`).join("")}</w:tbl>` : "";
109
+ return makeZip({
110
+ "[Content_Types].xml": '<?xml version="1.0"?><Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="xml" ContentType="application/xml"/><Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/></Types>',
111
+ "_rels/.rels": '<?xml version="1.0"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/></Relationships>',
112
+ "word/document.xml": `<?xml version="1.0"?><w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:body>${paragraphs.map(p).join("")}${tbl}</w:body></w:document>`
113
+ });
114
+ }
115
+ function makeDeck(slides) {
116
+ const parts = {
117
+ "ppt/presentation.xml": `<p:presentation><p:sldIdLst>${slides.map((_, i) => `<p:sldId id="${256 + i}" r:id="rId${i + 1}"/>`).join("")}</p:sldIdLst></p:presentation>`,
118
+ "ppt/_rels/presentation.xml.rels": `<Relationships>${slides.map((_, i) => `<Relationship Id="rId${i + 1}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide${i + 1}.xml"/>`).join("")}</Relationships>`
119
+ };
120
+ slides.forEach(([title, ...lines], i) => {
121
+ parts[`ppt/slides/slide${i + 1}.xml`] = `<p:sld><p:cSld><p:spTree><p:sp><p:nvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:txBody><a:p><a:r><a:t>${esc(title)}</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:txBody>${lines.map((l) => `<a:p><a:r><a:t>${esc(l)}</a:t></a:r></a:p>`).join("")}</p:txBody></p:sp></p:spTree></p:cSld></p:sld>`;
122
+ });
123
+ return makeZip(parts);
124
+ }
125
+ function makePdf(pages) {
126
+ const objects = [];
127
+ const kids = pages.map((_, i) => `${4 + i * 2} 0 R`).join(" ");
128
+ objects.push("<< /Type /Catalog /Pages 2 0 R >>");
129
+ objects.push(`<< /Type /Pages /Kids [${kids}] /Count ${pages.length} >>`);
130
+ objects.push("<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>");
131
+ pages.forEach((text, i) => {
132
+ const stream = `BT /F1 18 Tf 72 720 Td (${text.replace(/[\\()]/g, (c) => `\\${c}`)}) Tj ET`;
133
+ objects.push(`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Resources << /Font << /F1 3 0 R >> >> /Contents ${5 + i * 2} 0 R >>`);
134
+ objects.push(`<< /Length ${stream.length} >>
135
+ stream
136
+ ${stream}
137
+ endstream`);
138
+ });
139
+ let out = "%PDF-1.4\n";
140
+ const offsets = [];
141
+ objects.forEach((o, i) => {
142
+ offsets.push(out.length);
143
+ out += `${i + 1} 0 obj
144
+ ${o}
145
+ endobj
146
+ `;
147
+ });
148
+ const xref = out.length;
149
+ out += `xref
150
+ 0 ${objects.length + 1}
151
+ 0000000000 65535 f
152
+ ${offsets.map((o) => `${String(o).padStart(10, "0")} 00000 n
153
+ `).join("")}`;
154
+ out += `trailer
155
+ << /Size ${objects.length + 1} /Root 1 0 R >>
156
+ startxref
157
+ ${xref}
158
+ %%EOF
159
+ `;
160
+ return Buffer.from(out, "latin1");
161
+ }
162
+ // Annotate the CommonJS export names for ESM import in node:
163
+ 0 && (module.exports = {
164
+ makeDeck,
165
+ makeDocx,
166
+ makePdf,
167
+ makeWorkbook,
168
+ makeZip
169
+ });
@@ -0,0 +1,44 @@
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 quote_exports = {};
19
+ __export(quote_exports, {
20
+ fenceFor: () => fenceFor,
21
+ quoteMaterial: () => quoteMaterial
22
+ });
23
+ module.exports = __toCommonJS(quote_exports);
24
+ const LANG = { csv: "csv", markdown: "markdown", text: "text" };
25
+ function fenceFor(body) {
26
+ let longest = 0;
27
+ for (const m of body.matchAll(/`+/g)) longest = Math.max(longest, m[0].length);
28
+ return "`".repeat(Math.max(3, longest + 1));
29
+ }
30
+ function quoteMaterial(name, format, sections) {
31
+ if (sections.length === 0) return `Quoted from ${name}: (nothing in the part asked for)`;
32
+ return sections.map((s) => {
33
+ const fence = fenceFor(s.body);
34
+ return `Quoted from ${name} \u2014 ${s.heading}:
35
+ ${fence}${LANG[format] ?? "text"}
36
+ ${s.body}
37
+ ${fence}`;
38
+ }).join("\n\n");
39
+ }
40
+ // Annotate the CommonJS export names for ESM import in node:
41
+ 0 && (module.exports = {
42
+ fenceFor,
43
+ quoteMaterial
44
+ });
@@ -0,0 +1,202 @@
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 reader_host_exports = {};
29
+ __export(reader_host_exports, {
30
+ READER_HEAP_MB: () => READER_HEAP_MB,
31
+ READ_TIMEOUT_MS: () => READ_TIMEOUT_MS,
32
+ readMaterial: () => readMaterial,
33
+ readerLaunch: () => readerLaunch,
34
+ readerScript: () => readerScript,
35
+ runReader: () => runReader
36
+ });
37
+ module.exports = __toCommonJS(reader_host_exports);
38
+ var import_node_fs = __toESM(require("node:fs"));
39
+ var import_node_path = __toESM(require("node:path"));
40
+ var import_node_child_process = require("node:child_process");
41
+ var import_artefact_content_service = require("../artefact-content-service");
42
+ var import_rendition_service = require("../rendition/rendition-service");
43
+ var import_command = require("../../mcp/connector/command");
44
+ var import_confined_fs = require("../confined-fs");
45
+ var import_locator = require("../../../shared/lib/locator");
46
+ var import_cloud_files = require("../cloud-files");
47
+ const READ_CAPS = {
48
+ pdf: 100 * 1024 * 1024,
49
+ pptx: 100 * 1024 * 1024,
50
+ xlsx: 25 * 1024 * 1024,
51
+ xlsm: 25 * 1024 * 1024,
52
+ docx: 25 * 1024 * 1024
53
+ };
54
+ const TEXT_CAP = 20 * 1024 * 1024;
55
+ const IMAGE_CAP = 5 * 1024 * 1024;
56
+ const IMAGE_TYPES = {
57
+ png: { mimeType: "image/png", magic: (b) => b.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10])) },
58
+ jpg: { mimeType: "image/jpeg", magic: (b) => b[0] === 255 && b[1] === 216 && b[2] === 255 },
59
+ jpeg: { mimeType: "image/jpeg", magic: (b) => b[0] === 255 && b[1] === 216 && b[2] === 255 },
60
+ gif: { mimeType: "image/gif", magic: (b) => b.subarray(0, 4).toString("latin1") === "GIF8" },
61
+ webp: { mimeType: "image/webp", magic: (b) => b.subarray(0, 4).toString("latin1") === "RIFF" && b.subarray(8, 12).toString("latin1") === "WEBP" }
62
+ };
63
+ const VIDEO_EXTS = /* @__PURE__ */ new Set(["mp4", "webm", "mov"]);
64
+ const READ_TIMEOUT_MS = 3e4;
65
+ const READER_HEAP_MB = 768;
66
+ function readerScript() {
67
+ const resourcesPath = process.resourcesPath;
68
+ if ((0, import_command.isPackagedElectron)({ execPath: process.execPath, electronVersion: process.versions.electron }) && resourcesPath) {
69
+ return import_node_path.default.join(resourcesPath, "reader", "material-reader.mjs");
70
+ }
71
+ const source = import_node_path.default.join(__dirname, "child.ts");
72
+ if (__filename.endsWith(".ts") && import_node_fs.default.existsSync(source)) return source;
73
+ const inPackage = import_node_path.default.resolve(__dirname, "..", "..", "..", "..", "reader", "material-reader.mjs");
74
+ if (import_node_fs.default.existsSync(inPackage)) return inPackage;
75
+ return import_node_path.default.join(process.cwd(), "out", "reader", "material-reader.mjs");
76
+ }
77
+ function readerLaunch(script, opts = {}) {
78
+ const heap = `--max-old-space-size=${opts.heapMb ?? READER_HEAP_MB}`;
79
+ const env = process.versions.electron ? { ELECTRON_RUN_AS_NODE: "1" } : {};
80
+ if (script.endsWith(".ts")) {
81
+ return { execArgv: [heap, "--import", "tsx"], cwd: import_node_path.default.resolve(__dirname, "..", "..", "..", ".."), env };
82
+ }
83
+ return { execArgv: [heap, "--permission", `--allow-fs-read=${script}`], cwd: import_node_path.default.dirname(script), env };
84
+ }
85
+ function runReader(req, opts = {}) {
86
+ return new Promise((resolve) => {
87
+ let settled = false;
88
+ let stderr = "";
89
+ let outOfMemory = false;
90
+ let child;
91
+ try {
92
+ const script = (0, import_confined_fs.canonicalRoot)(opts.script ?? readerScript());
93
+ const launch = readerLaunch(script, opts);
94
+ child = (0, import_node_child_process.fork)(script, [], {
95
+ execPath: process.execPath,
96
+ execArgv: launch.execArgv,
97
+ cwd: launch.cwd,
98
+ env: launch.env,
99
+ // pdf.js warns on every load that it cannot draw, which a reader never
100
+ // asks it to: stdout is dropped, and stderr kept only to tell a heap
101
+ // limit from any other death.
102
+ stdio: ["ignore", "ignore", "pipe", "ipc"],
103
+ serialization: "advanced"
104
+ });
105
+ } catch (err) {
106
+ resolve({ ok: false, reason: `The reader could not start (${err.message})` });
107
+ return;
108
+ }
109
+ child.stderr?.on("data", (d) => {
110
+ const joined = stderr + d.toString();
111
+ if (/heap limit|out of memory/i.test(joined)) outOfMemory = true;
112
+ stderr = joined.slice(-4e3);
113
+ });
114
+ const timeoutMs = opts.timeoutMs ?? READ_TIMEOUT_MS;
115
+ const done = (r) => {
116
+ if (settled) return;
117
+ settled = true;
118
+ clearTimeout(timer);
119
+ if (child.exitCode === null && child.signalCode === null) child.kill("SIGKILL");
120
+ resolve(r);
121
+ };
122
+ const timer = setTimeout(() => done({
123
+ ok: false,
124
+ timedOut: true,
125
+ reason: `Reading ${req.name} took longer than ${Math.round(timeoutMs / 1e3)}s and was stopped. Ask for a smaller part of it.`
126
+ }), timeoutMs);
127
+ child.once("message", (reply) => done(reply));
128
+ child.once("error", (err) => done({ ok: false, reason: `${req.name} could not be read (${err.message})` }));
129
+ child.once("exit", (code, signal) => {
130
+ const judge = () => setImmediate(() => {
131
+ if (settled) return;
132
+ if (!outOfMemory) {
133
+ console.warn(`[reader] stopped without answering (code ${code}, signal ${signal}): ${stderr.trim().split("\n").slice(-5).join(" | ") || "no output"}`);
134
+ }
135
+ done({
136
+ ok: false,
137
+ reason: outOfMemory ? `${req.name} needs more memory to read than CodeTrellis allows. Ask for a smaller part of it.` : `${req.name} could not be read (the reader stopped)`
138
+ });
139
+ });
140
+ if (!child.connected) {
141
+ judge();
142
+ return;
143
+ }
144
+ const cap = setTimeout(judge, 2e3);
145
+ child.once("disconnect", () => {
146
+ clearTimeout(cap);
147
+ judge();
148
+ });
149
+ });
150
+ child.send({ ...req, bytes: req.bytes });
151
+ });
152
+ }
153
+ async function readBytes(file, cap) {
154
+ try {
155
+ return await (0, import_artefact_content_service.readServableCapped)(file, cap);
156
+ } catch (err) {
157
+ return err instanceof import_cloud_files.NotOnDeviceError ? "cloud" : "missing";
158
+ }
159
+ }
160
+ async function readMaterial(attachmentUid, locator, opts = {}) {
161
+ const file = await (0, import_artefact_content_service.resolveServable)(attachmentUid);
162
+ if (!file) return { ok: false, status: 404, reason: "No material with that uid is a file CodeTrellis can read" };
163
+ const name = import_node_path.default.basename(file.rel);
164
+ const ext = import_node_path.default.extname(file.rel).slice(1).toLowerCase();
165
+ const base = { name, itemUid: file.itemUid };
166
+ const hasLocator = !!locator && Object.values(locator).some((v) => v !== void 0);
167
+ if (VIDEO_EXTS.has(ext)) {
168
+ return { ok: false, status: 415, reason: `${name} is a video; it can be watched in CodeTrellis but not read as text`, ...base };
169
+ }
170
+ if (ext === "xls") {
171
+ return { ok: false, status: 415, reason: `${name} is an old-format Excel workbook, which is not read as text; saved as .xlsx it can be`, ...base };
172
+ }
173
+ const image = IMAGE_TYPES[ext];
174
+ if (image) {
175
+ if (hasLocator) return { ok: false, status: 422, reason: `${name} is an image; it is read whole, without a locator`, ...base };
176
+ const bytes2 = await readBytes(file, IMAGE_CAP);
177
+ if (bytes2 === "cloud") return { ok: false, status: 409, reason: `${name} is not on this device yet: it is still only in the cloud`, ...base };
178
+ if (bytes2 === "missing") return { ok: false, status: 404, reason: `${name} is not there, or is not a regular file in the project`, ...base };
179
+ if (!bytes2) return { ok: false, status: 413, reason: `${name} is larger than the ${IMAGE_CAP / 1024 / 1024} MB an image read returns`, ...base };
180
+ if (!image.magic(bytes2)) return { ok: false, status: 422, reason: `${name} is named .${ext} but is not that kind of image`, ...base };
181
+ return { ok: true, kind: "image", ...base, mimeType: image.mimeType, base64: bytes2.toString("base64"), bytes: bytes2.length };
182
+ }
183
+ const cap = READ_CAPS[ext] ?? (import_locator.TEXT_EXTS.has(ext) ? TEXT_CAP : 0);
184
+ if (!cap) return { ok: false, status: 415, reason: `.${ext} files are not read as text`, ...base };
185
+ const bytes = await readBytes(file, cap);
186
+ if (bytes === "cloud") return { ok: false, status: 409, reason: `${name} is not on this device yet: it is still only in the cloud`, ...base };
187
+ if (bytes === "missing") return { ok: false, status: 404, reason: `${name} is not there, or is not a regular file in the project`, ...base };
188
+ if (!bytes) return { ok: false, status: 413, reason: `${name} is larger than the ${Math.round(cap / 1024 / 1024)} MB CodeTrellis reads of a .${ext} file`, ...base };
189
+ const rendition = ext === "docx" || ext === "pptx" ? await (0, import_rendition_service.existingRendition)(bytes, ext, opts.engine) : null;
190
+ const reply = await runReader({ name, ext, bytes, locator, rendition }, opts);
191
+ if (!reply.ok) return { ok: false, status: "timedOut" in reply ? 504 : 422, reason: reply.reason, ...base };
192
+ return { ok: true, kind: "text", ...base, reply };
193
+ }
194
+ // Annotate the CommonJS export names for ESM import in node:
195
+ 0 && (module.exports = {
196
+ READER_HEAP_MB,
197
+ READ_TIMEOUT_MS,
198
+ readMaterial,
199
+ readerLaunch,
200
+ readerScript,
201
+ runReader
202
+ });
@@ -0,0 +1,141 @@
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 material_signals_exports = {};
19
+ __export(material_signals_exports, {
20
+ computeMaterialSignals: () => computeMaterialSignals
21
+ });
22
+ module.exports = __toCommonJS(material_signals_exports);
23
+ var import_awareness_signals = require("./awareness-signals");
24
+ const plural = (n, word) => `${n} ${word}${n === 1 ? "" : "s"}`;
25
+ const listed = (names, max = 3) => names.length <= max ? names.join(", ") : `${names.slice(0, max).join(", ")} and ${names.length - max} more`;
26
+ function computeMaterialSignals(tasks, current) {
27
+ const out = [];
28
+ const ordered = [...tasks].sort((a, b) => a.id.localeCompare(b.id));
29
+ const title = /* @__PURE__ */ new Map();
30
+ for (const t of ordered) for (const r of t.reads) title.set(r.owner, r.ownerTitle);
31
+ for (const t of ordered) title.set(t.id, t.title);
32
+ const labelsOf = (ids) => Object.fromEntries([...ids].sort().map((id) => [id, title.get(id) ?? id]));
33
+ const named = (ids) => listed(ids.map((id) => `\u201C${title.get(id) ?? id}\u201D`));
34
+ const withoutLabels = (subject) => {
35
+ const { labels: _labels, readBy: _readBy, ...rest } = subject;
36
+ return rest;
37
+ };
38
+ const emit = (kind, severity, key, subject, ids, summary) => out.push((0, import_awareness_signals.draft)(kind, severity, key, { ...subject, labels: labelsOf(ids) }, ids, summary, withoutLabels(subject)));
39
+ const readByOf = (m, ids) => {
40
+ const by = Object.fromEntries(ids.flatMap((id) => {
41
+ const who = ordered.find((t) => t.id === id)?.reads.find((r) => r.path === m)?.by;
42
+ return who ? [[id, who]] : [];
43
+ }));
44
+ return Object.keys(by).length ? { readBy: by } : {};
45
+ };
46
+ const materials = /* @__PURE__ */ new Set();
47
+ for (const t of ordered) {
48
+ for (const r of t.reads) materials.add(r.path);
49
+ for (const c of t.cited) materials.add(c.path);
50
+ }
51
+ for (const m of [...materials].sort()) {
52
+ const now = current[m] ?? null;
53
+ const readers = ordered.filter((t) => t.reads.some((r) => r.path === m));
54
+ const lastHash = (t) => t.reads.find((r) => r.path === m)?.sha256 ?? null;
55
+ const readersNamed = (ids) => listed(ids.map((id) => {
56
+ const by = ordered.find((t) => t.id === id)?.reads.find((r) => r.path === m)?.by;
57
+ return `\u201C${title.get(id) ?? id}\u201D${by ? ` (${by})` : ""}`;
58
+ }));
59
+ const changedCites = now === null ? [] : ordered.flatMap((t) => t.cited.filter((c) => c.path === m && c.sha256 !== null && c.sha256 !== now).map((c) => ({ task: t.id, ...c })));
60
+ const citers = [...new Set(changedCites.map((c) => c.task))];
61
+ const involved = [.../* @__PURE__ */ new Set([...citers, ...readers.map((t) => t.id)])].sort();
62
+ if (citers.length > 0 && involved.length >= 2) {
63
+ const parts = [...new Set(changedCites.map((c) => c.part))].sort();
64
+ const signedOff = [...new Set(changedCites.filter((c) => c.signedOff).map((c) => c.task))].sort();
65
+ const cites = `${citers.length === 1 ? `${named(citers)} cites` : `${plural(citers.length, "task")} cite`} ${listed(parts)}`;
66
+ const signed = signedOff.length === 0 ? "" : `; ${signedOff.length === citers.length && citers.length > 1 ? "all were" : signedOff.length === 1 && citers.length === 1 ? "it was" : `${signedOff.length} ${signedOff.length === 1 ? "was" : "were"}`} already signed off`;
67
+ const others = involved.filter((id) => !citers.includes(id));
68
+ const alsoUses = others.length ? `. ${named(others)} ${others.length === 1 ? "uses" : "use"} it too` : "";
69
+ emit(
70
+ "contract",
71
+ signedOff.length ? "high" : "medium",
72
+ `material:${m}`,
73
+ { material: m, parts, citedBy: citers.sort(), ...signedOff.length ? { signedOff } : {} },
74
+ involved,
75
+ `\`${m}\` changed. ${cites}${signed}${alsoUses}`
76
+ );
77
+ continue;
78
+ }
79
+ const hashes = new Set(readers.map(lastHash).filter((h) => h !== null));
80
+ if (readers.length >= 2 && hashes.size >= 2) {
81
+ const ids = readers.map((t) => t.id);
82
+ const readVersions = Object.fromEntries(readers.map((t) => [t.id, lastHash(t) === now ? "current" : "earlier"]));
83
+ const onCurrent = readers.filter((t) => lastHash(t) === now).map((t) => t.id);
84
+ const tail = onCurrent.length === 0 ? `; ${readers.length === 2 ? "neither" : "none"} has the current one` : `; ${named(onCurrent)} ${onCurrent.length === 1 ? "has" : "have"} the current one`;
85
+ emit(
86
+ "version-split",
87
+ "medium",
88
+ `material:${m}`,
89
+ { material: m, readVersions, ...readByOf(m, ids) },
90
+ ids,
91
+ `${readersNamed(ids)} read different versions of \`${m}\`${tail}`
92
+ );
93
+ continue;
94
+ }
95
+ if (now !== null && readers.length >= 2 && readers.every((t) => lastHash(t) !== null && lastHash(t) !== now)) {
96
+ const ids = readers.map((t) => t.id);
97
+ emit(
98
+ "stale-base",
99
+ "low",
100
+ `material:${m}`,
101
+ { material: m, ...readByOf(m, ids) },
102
+ ids,
103
+ `\`${m}\` changed after ${readersNamed(ids)} read it, and ${ids.length === 2 ? "neither" : "none"} has read it since`
104
+ );
105
+ }
106
+ }
107
+ const writers = /* @__PURE__ */ new Map();
108
+ for (const t of ordered) for (const o of new Set(t.outputs)) (writers.get(o) ?? writers.set(o, []).get(o)).push(t.id);
109
+ for (const [file, ids] of [...writers].sort(([a], [b]) => a.localeCompare(b))) {
110
+ if (ids.length < 2) continue;
111
+ emit(
112
+ "collision",
113
+ "medium",
114
+ `output:${file}`,
115
+ { material: file, file },
116
+ ids,
117
+ `${named(ids)} ${ids.length === 2 ? "both" : "all"} record \`${file}\` as their output`
118
+ );
119
+ }
120
+ for (const t of ordered) {
121
+ const brief = new Set(t.brief);
122
+ const outside = t.reads.filter((r) => !brief.has(r.path) && r.owner !== t.id);
123
+ if (outside.length === 0) continue;
124
+ const files = [...new Set(outside.map((r) => r.path))].sort();
125
+ const owners = [...new Set(outside.map((r) => r.owner))].filter((o) => o !== t.id).sort();
126
+ const ids = [t.id, ...owners];
127
+ emit(
128
+ "drift",
129
+ "low",
130
+ `material-drift:${t.id}`,
131
+ { material: files[0], files, by: t.id },
132
+ ids,
133
+ `${named([t.id])} read ${listed(files.map((f) => `\`${f}\``))}, which ${files.length === 1 ? "is" : "are"} not in its brief (given to ${named(owners)})`
134
+ );
135
+ }
136
+ return out;
137
+ }
138
+ // Annotate the CommonJS export names for ESM import in node:
139
+ 0 && (module.exports = {
140
+ computeMaterialSignals
141
+ });