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,217 @@
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 logger_exports = {};
29
+ __export(logger_exports, {
30
+ LOG_DAILY_CAP_BYTES: () => LOG_DAILY_CAP_BYTES,
31
+ LOG_RETENTION_DAYS: () => LOG_RETENTION_DAYS,
32
+ getCurrentLogPath: () => getCurrentLogPath,
33
+ getLogDir: () => getLogDir,
34
+ installFileLogger: () => installFileLogger,
35
+ isWritingLogFile: () => isWritingLogFile,
36
+ pruneOldLogs: () => pruneOldLogs,
37
+ setLogRetention: () => setLogRetention,
38
+ tailLog: () => tailLog
39
+ });
40
+ module.exports = __toCommonJS(logger_exports);
41
+ var import_node_fs = __toESM(require("node:fs"));
42
+ var import_node_path = __toESM(require("node:path"));
43
+ var import_persistence = require("./persistence");
44
+ let installed = false;
45
+ let logStream = null;
46
+ let currentLogPath = null;
47
+ let currentBytes = 0;
48
+ let capNoticeWritten = false;
49
+ const LOG_RETENTION_DAYS = 14;
50
+ let logRetentionDays = LOG_RETENTION_DAYS;
51
+ function setLogRetention(days) {
52
+ logRetentionDays = days;
53
+ }
54
+ const LOG_DAILY_CAP_BYTES = 50 * 1024 * 1024;
55
+ function installFileLogger() {
56
+ if (installed) return;
57
+ installed = true;
58
+ try {
59
+ rotateIfNeeded();
60
+ } catch (err) {
61
+ console.warn("[Logger] Failed to open log file \u2014 console only:", err);
62
+ return;
63
+ }
64
+ const origLog = console.log.bind(console);
65
+ const origWarn = console.warn.bind(console);
66
+ const origError = console.error.bind(console);
67
+ const origInfo = console.info.bind(console);
68
+ const writeLine = (level, args) => {
69
+ try {
70
+ rotateIfNeeded();
71
+ const ts = (/* @__PURE__ */ new Date()).toISOString();
72
+ const line = `${ts} [${level}] ${formatArgs(args)}
73
+ `;
74
+ if (currentBytes >= LOG_DAILY_CAP_BYTES) {
75
+ if (!capNoticeWritten) {
76
+ capNoticeWritten = true;
77
+ logStream?.write(`${ts} [warn] [Logger] Daily cap of ${LOG_DAILY_CAP_BYTES} bytes reached; further lines today go to the console only.
78
+ `);
79
+ }
80
+ return;
81
+ }
82
+ currentBytes += Buffer.byteLength(line);
83
+ logStream?.write(line);
84
+ } catch {
85
+ }
86
+ };
87
+ console.log = (...args) => {
88
+ origLog(...args);
89
+ writeLine("info", args);
90
+ };
91
+ console.info = (...args) => {
92
+ origInfo(...args);
93
+ writeLine("info", args);
94
+ };
95
+ console.warn = (...args) => {
96
+ origWarn(...args);
97
+ writeLine("warn", args);
98
+ };
99
+ console.error = (...args) => {
100
+ origError(...args);
101
+ writeLine("error", args);
102
+ };
103
+ process.on("uncaughtException", (err) => {
104
+ writeLine("uncaught", [err?.stack || String(err)]);
105
+ });
106
+ process.on("unhandledRejection", (reason) => {
107
+ writeLine("unhandled", [reason instanceof Error ? reason.stack : String(reason)]);
108
+ });
109
+ console.log(`[Logger] File logging enabled at ${currentLogPath}`);
110
+ }
111
+ function getCurrentLogPath() {
112
+ if (!installed) return import_node_path.default.join(logDir(), `${ymd(/* @__PURE__ */ new Date())}.log`);
113
+ rotateIfNeeded();
114
+ return currentLogPath || import_node_path.default.join(logDir(), `${ymd(/* @__PURE__ */ new Date())}.log`);
115
+ }
116
+ function isWritingLogFile() {
117
+ return installed;
118
+ }
119
+ function getLogDir() {
120
+ return logDir();
121
+ }
122
+ function tailLog(maxBytes = 64 * 1024) {
123
+ try {
124
+ const p = getCurrentLogPath();
125
+ if (!import_node_fs.default.existsSync(p)) return "";
126
+ const stat = import_node_fs.default.statSync(p);
127
+ if (stat.size <= maxBytes) {
128
+ return import_node_fs.default.readFileSync(p, "utf-8");
129
+ }
130
+ const fd = import_node_fs.default.openSync(p, "r");
131
+ try {
132
+ const buf = Buffer.alloc(maxBytes);
133
+ import_node_fs.default.readSync(fd, buf, 0, maxBytes, stat.size - maxBytes);
134
+ const text = buf.toString("utf-8");
135
+ const firstNewline = text.indexOf("\n");
136
+ return firstNewline >= 0 ? text.slice(firstNewline + 1) : text;
137
+ } finally {
138
+ import_node_fs.default.closeSync(fd);
139
+ }
140
+ } catch {
141
+ return "";
142
+ }
143
+ }
144
+ function logDir() {
145
+ return import_node_path.default.join((0, import_persistence.getDataDir)(), "logs");
146
+ }
147
+ function ymd(d) {
148
+ return d.toISOString().slice(0, 10);
149
+ }
150
+ function rotateIfNeeded() {
151
+ const targetPath = import_node_path.default.join(logDir(), `${ymd(/* @__PURE__ */ new Date())}.log`);
152
+ if (currentLogPath === targetPath && logStream) return;
153
+ if (logStream) {
154
+ try {
155
+ logStream.end();
156
+ } catch {
157
+ }
158
+ logStream = null;
159
+ }
160
+ if (!import_node_fs.default.existsSync(logDir())) {
161
+ import_node_fs.default.mkdirSync(logDir(), { recursive: true });
162
+ }
163
+ logStream = import_node_fs.default.createWriteStream(targetPath, { flags: "a", encoding: "utf-8" });
164
+ currentLogPath = targetPath;
165
+ try {
166
+ currentBytes = import_node_fs.default.statSync(targetPath).size;
167
+ } catch {
168
+ currentBytes = 0;
169
+ }
170
+ capNoticeWritten = false;
171
+ if (logRetentionDays !== null) pruneOldLogs(logDir(), /* @__PURE__ */ new Date(), logRetentionDays);
172
+ }
173
+ function pruneOldLogs(dir, now, keepDays = LOG_RETENTION_DAYS) {
174
+ const removed = [];
175
+ const cutoff = new Date(now);
176
+ cutoff.setUTCDate(cutoff.getUTCDate() - keepDays);
177
+ const cutoffYmd = ymd(cutoff);
178
+ let names = [];
179
+ try {
180
+ names = import_node_fs.default.readdirSync(dir);
181
+ } catch {
182
+ return removed;
183
+ }
184
+ for (const name of names) {
185
+ const m = /^(\d{4}-\d{2}-\d{2})\.log$/.exec(name);
186
+ if (!m || m[1] >= cutoffYmd) continue;
187
+ try {
188
+ import_node_fs.default.unlinkSync(import_node_path.default.join(dir, name));
189
+ removed.push(name);
190
+ } catch {
191
+ }
192
+ }
193
+ return removed;
194
+ }
195
+ function formatArgs(args) {
196
+ return args.map((a) => {
197
+ if (a instanceof Error) return a.stack || a.message;
198
+ if (typeof a === "string") return a;
199
+ try {
200
+ return JSON.stringify(a);
201
+ } catch {
202
+ return String(a);
203
+ }
204
+ }).join(" ");
205
+ }
206
+ // Annotate the CommonJS export names for ESM import in node:
207
+ 0 && (module.exports = {
208
+ LOG_DAILY_CAP_BYTES,
209
+ LOG_RETENTION_DAYS,
210
+ getCurrentLogPath,
211
+ getLogDir,
212
+ installFileLogger,
213
+ isWritingLogFile,
214
+ pruneOldLogs,
215
+ setLogRetention,
216
+ tailLog
217
+ });
@@ -0,0 +1,203 @@
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_footprints_exports = {};
19
+ __export(material_footprints_exports, {
20
+ locatorKey: () => locatorKey,
21
+ materialInputsOf: () => materialInputsOf,
22
+ partWords: () => partWords,
23
+ readSoFar: () => readSoFar,
24
+ recordMaterialRead: () => recordMaterialRead,
25
+ taskFootprint: () => taskFootprint
26
+ });
27
+ module.exports = __toCommonJS(material_footprints_exports);
28
+ var import_database = require("./database");
29
+ var import_persistence = require("./persistence");
30
+ var import_task_workstreams = require("./task-workstreams");
31
+ function rowsOf(sql, params = []) {
32
+ const res = (0, import_database.getDb)().exec(sql, params);
33
+ if (!res.length) return [];
34
+ const { columns, values } = res[0];
35
+ return values.map((v) => Object.fromEntries(columns.map((c, i) => [c, v[i]])));
36
+ }
37
+ function locatorKey(locator) {
38
+ if (!locator) return null;
39
+ const keys = ["sheet", "range", "page", "lines", "text"].filter((k) => locator[k] !== void 0 && locator[k] !== "");
40
+ if (!keys.length) return null;
41
+ return JSON.stringify(Object.fromEntries(keys.map((k) => [k, locator[k]])));
42
+ }
43
+ function recordMaterialRead(input) {
44
+ const att = rowsOf(
45
+ "SELECT target_uid, value, sha256 FROM attachments WHERE uid = ?",
46
+ [input.attachmentUid]
47
+ )[0];
48
+ if (!att) return null;
49
+ const brief = input.sessionId ? rowsOf("SELECT brief_item_uid FROM agent_sessions WHERE session_id = ?", [input.sessionId])[0]?.brief_item_uid ?? null : null;
50
+ const itemUid = brief ?? att.target_uid;
51
+ (0, import_database.getDb)().run(
52
+ "INSERT INTO material_reads (item_uid, session_id, attachment_uid, path, sha256, locator, at) VALUES (?, ?, ?, ?, ?, ?, ?)",
53
+ [itemUid, input.sessionId, input.attachmentUid, att.value, att.sha256, locatorKey(input.locator), input.at ?? Date.now()]
54
+ );
55
+ (0, import_persistence.markDirty)();
56
+ return itemUid;
57
+ }
58
+ const verifiedOf = (verdict) => {
59
+ try {
60
+ return JSON.parse(verdict ?? "{}").verified === true;
61
+ } catch {
62
+ return false;
63
+ }
64
+ };
65
+ const attachmentHere = (uid) => rowsOf("SELECT 1 FROM attachments WHERE uid = ?", [uid]).length > 0;
66
+ const parseLocator = (s) => {
67
+ if (!s) return null;
68
+ try {
69
+ return JSON.parse(s);
70
+ } catch {
71
+ return null;
72
+ }
73
+ };
74
+ function taskFootprint(itemUid) {
75
+ const reads = rowsOf(
76
+ `SELECT * FROM (
77
+ SELECT r.session_id, s.agent_type, r.attachment_uid, r.path, r.sha256, r.locator, r.at, NULL AS reader, NULL AS name, NULL AS verdict, 0 AS src, r.rowid AS n
78
+ FROM material_reads r LEFT JOIN agent_sessions s ON s.session_id = r.session_id
79
+ WHERE r.item_uid = ?
80
+ UNION ALL
81
+ SELECT NULL, NULL, t.attachment_uid, t.path, t.sha256, NULL, t.at, t.reader, t.name, t.verdict, 1, t.counter
82
+ FROM teammate_material_reads t
83
+ WHERE t.item_uid = ?
84
+ ) ORDER BY at, src, n`,
85
+ [itemUid, itemUid]
86
+ );
87
+ const byPath = /* @__PURE__ */ new Map();
88
+ for (const r of reads) {
89
+ const m = byPath.get(r.path) ?? byPath.set(r.path, { path: r.path, attachmentUid: r.attachment_uid ?? "", reads: [], lastSha256: null, parts: [] }).get(r.path);
90
+ const locator = parseLocator(r.locator);
91
+ const teammate = r.reader ? { reader: r.reader, name: r.name ?? "someone", verified: verifiedOf(r.verdict) } : null;
92
+ const attachmentUid = r.attachment_uid && (!teammate || attachmentHere(r.attachment_uid)) ? r.attachment_uid : m.attachmentUid;
93
+ m.reads.push({ sessionId: r.session_id, agent: r.agent_type, teammate, attachmentUid, sha256: r.sha256, locator, at: Number(r.at) });
94
+ m.attachmentUid = attachmentUid;
95
+ m.lastSha256 = r.sha256;
96
+ if (r.locator && !m.parts.some((p) => locatorKey(p) === r.locator)) m.parts.push(locator);
97
+ }
98
+ const outputs = rowsOf(
99
+ `SELECT uid, value, sha256 FROM attachments WHERE target_type = 'item' AND target_uid = ? AND role = 'output' ORDER BY created_at`,
100
+ [itemUid]
101
+ ).map((r) => ({ attachmentUid: r.uid, path: r.value, sha256: r.sha256 }));
102
+ const cited = /* @__PURE__ */ new Map();
103
+ for (const r of rowsOf(
104
+ `SELECT e.criterion_uid, e.attachment_uid, a.value, a.sha256, e.locator, e.sha256_at_submit AS at_cite,
105
+ (SELECT s.decision FROM criterion_signoffs s WHERE s.criterion_uid = e.criterion_uid ORDER BY s.created_at DESC, s.rowid DESC LIMIT 1) AS decision
106
+ FROM criterion_evidence e
107
+ JOIN item_criteria c ON c.uid = e.criterion_uid
108
+ JOIN attachments a ON a.uid = e.attachment_uid
109
+ WHERE c.item_uid = ? AND e.attachment_uid IS NOT NULL
110
+ ORDER BY e.submitted_at, e.rowid`,
111
+ [itemUid]
112
+ )) {
113
+ const locator = parseLocator(r.locator);
114
+ const key = `${r.value}
115
+ ${locatorKey(locator) ?? ""}`;
116
+ cited.delete(key);
117
+ cited.set(key, {
118
+ attachmentUid: r.attachment_uid,
119
+ path: r.value,
120
+ sha256: r.sha256,
121
+ locator,
122
+ criterionUid: r.criterion_uid,
123
+ sha256AtCite: r.at_cite,
124
+ signedOff: r.decision === "approved"
125
+ });
126
+ }
127
+ return { itemUid, read: [...byPath.values()], outputs, cited: [...cited.values()] };
128
+ }
129
+ function partWords(l) {
130
+ if (!l) return "the whole file";
131
+ if (l.sheet || l.range) return l.sheet && l.range ? `${l.sheet}!${l.range}` : l.sheet ?? l.range;
132
+ if (l.page !== void 0) return /[-–]/.test(String(l.page)) ? `pages ${String(l.page).replace("-", "\u2013")}` : `page ${l.page}`;
133
+ if (l.lines !== void 0) return /[-–]/.test(String(l.lines)) ? `lines ${String(l.lines).replace("-", "\u2013")}` : `line ${l.lines}`;
134
+ if (l.text) return `where it says \u201C${l.text.length > 40 ? `${l.text.slice(0, 40)}\u2026` : l.text}\u201D`;
135
+ return "the whole file";
136
+ }
137
+ function readSoFar(itemUid) {
138
+ return taskFootprint(itemUid).read.map((m) => ({
139
+ path: m.path,
140
+ attachment_uid: m.attachmentUid,
141
+ reads: m.reads.length,
142
+ parts: [...new Set(m.reads.map((r) => partWords(r.locator)))],
143
+ by: [...new Set(m.reads.map((r) => r.teammate ? `${r.teammate.reader}${r.teammate.verified ? "" : " (unverified)"}` : r.agent ?? "an agent"))],
144
+ sha256: m.lastSha256,
145
+ last_read_at: new Date(m.reads[m.reads.length - 1].at).toISOString()
146
+ }));
147
+ }
148
+ function materialInputsOf(projectRoot) {
149
+ const trimmed = projectRoot.replace(/[\\/]+$/, "");
150
+ const inProject = `SELECT i.uid FROM plan_items i JOIN plans p ON p.uid = i.plan_uid WHERE p.project_path = ? OR p.project_path = ?`;
151
+ const uids = rowsOf(
152
+ `SELECT DISTINCT uid FROM (
153
+ SELECT item_uid AS uid FROM material_reads
154
+ UNION SELECT item_uid FROM teammate_material_reads
155
+ UNION SELECT target_uid FROM attachments WHERE role = 'output'
156
+ UNION SELECT c.item_uid FROM criterion_evidence e JOIN item_criteria c ON c.uid = e.criterion_uid WHERE e.attachment_uid IS NOT NULL
157
+ ) WHERE uid IN (${inProject}) ORDER BY uid`,
158
+ [projectRoot, trimmed]
159
+ ).map((r) => r.uid);
160
+ const titleOf = (uid) => rowsOf("SELECT title FROM plan_items WHERE uid = ?", [uid])[0]?.title ?? uid;
161
+ const ownerOf = (attachmentUid) => rowsOf("SELECT target_uid FROM attachments WHERE uid = ?", [attachmentUid])[0]?.target_uid ?? null;
162
+ const tasks = uids.map((uid) => {
163
+ const f = taskFootprint(uid);
164
+ const brief = rowsOf(
165
+ `SELECT a.value FROM attachments a WHERE a.target_uid = ? AND a.role IS NOT NULL
166
+ UNION SELECT a.value FROM attachments a JOIN plan_items pg ON pg.uid = a.target_uid
167
+ WHERE a.role = 'material' AND pg.kind = 'object' AND pg.plan_uid = (SELECT plan_uid FROM plan_items WHERE uid = ?)`,
168
+ [uid, uid]
169
+ ).map((r) => r.value);
170
+ return {
171
+ id: (0, import_task_workstreams.taskWorkstreamId)(uid),
172
+ title: titleOf(uid),
173
+ brief,
174
+ reads: f.read.map((m) => {
175
+ const owner = (m.attachmentUid ? ownerOf(m.attachmentUid) : null) ?? uid;
176
+ const last = m.reads[m.reads.length - 1]?.teammate;
177
+ const by = last ? `${last.name}${last.verified ? "" : ", unverified"}` : null;
178
+ return { path: m.path, sha256: m.lastSha256, owner: (0, import_task_workstreams.taskWorkstreamId)(owner), ownerTitle: titleOf(owner), ...by ? { by } : {} };
179
+ }),
180
+ outputs: f.outputs.map((o) => o.path),
181
+ cited: f.cited.map((c) => ({ path: c.path, part: partWords(c.locator), sha256: c.sha256AtCite, signedOff: c.signedOff }))
182
+ };
183
+ });
184
+ const current = {};
185
+ const paths = new Set(tasks.flatMap((t) => [...t.reads.map((r) => r.path), ...t.cited.map((c) => c.path)]));
186
+ for (const p of paths) {
187
+ current[p] = rowsOf(
188
+ `SELECT a.sha256 FROM attachments a WHERE a.value = ? AND a.role IS NOT NULL AND a.target_uid IN (${inProject})
189
+ ORDER BY COALESCE(a.mtime, 0) DESC, a.created_at DESC LIMIT 1`,
190
+ [p, projectRoot, trimmed]
191
+ )[0]?.sha256 ?? null;
192
+ }
193
+ return { tasks, current };
194
+ }
195
+ // Annotate the CommonJS export names for ESM import in node:
196
+ 0 && (module.exports = {
197
+ locatorKey,
198
+ materialInputsOf,
199
+ partWords,
200
+ readSoFar,
201
+ recordMaterialRead,
202
+ taskFootprint
203
+ });
@@ -0,0 +1,82 @@
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 material_place_exports = {};
29
+ __export(material_place_exports, {
30
+ PLANS_PREFIX: () => PLANS_PREFIX,
31
+ isPlacePath: () => isPlacePath,
32
+ isStoredPlace: () => isStoredPlace,
33
+ locateStored: () => locateStored,
34
+ placeOf: () => placeOf
35
+ });
36
+ module.exports = __toCommonJS(material_place_exports);
37
+ var import_node_path = __toESM(require("node:path"));
38
+ var import_plans_home = require("./plans-home");
39
+ const PLANS_PREFIX = "plans://";
40
+ function isPlacePath(value) {
41
+ return value.startsWith(PLANS_PREFIX);
42
+ }
43
+ function safeRel(rel) {
44
+ return rel.length > 0 && !import_node_path.default.isAbsolute(rel) && !/^[a-z]:/i.test(rel) && !rel.split(/[\\/]/).some((seg) => seg === ".." || seg === "");
45
+ }
46
+ function isStoredPlace(value) {
47
+ if (typeof value !== "string" || !value) return false;
48
+ const rel = isPlacePath(value) ? value.slice(PLANS_PREFIX.length) : value;
49
+ if (!isPlacePath(value) && /^[a-z][a-z0-9+.-]*:/i.test(value)) return false;
50
+ return safeRel(rel);
51
+ }
52
+ function locateStored(value, projectRoot) {
53
+ if (typeof value !== "string" || !value) return null;
54
+ if (isPlacePath(value)) {
55
+ const rel = value.slice(PLANS_PREFIX.length);
56
+ const home = (0, import_plans_home.plansHome)(projectRoot);
57
+ if (!home || !safeRel(rel)) return null;
58
+ return { root: home, rel };
59
+ }
60
+ if (import_node_path.default.isAbsolute(value) || /^[a-z][a-z0-9+.-]*:/i.test(value)) return null;
61
+ return { root: projectRoot, rel: value };
62
+ }
63
+ function placeOf(absPath, projectRoot) {
64
+ const inside = (root) => {
65
+ const rel = import_node_path.default.relative(root, absPath);
66
+ return rel && !rel.startsWith("..") && !import_node_path.default.isAbsolute(rel) ? rel.split(import_node_path.default.sep).join("/") : null;
67
+ };
68
+ const inProject = inside(projectRoot);
69
+ if (inProject) return inProject;
70
+ const home = (0, import_plans_home.plansHome)(projectRoot);
71
+ if (!home || home === projectRoot) return null;
72
+ const inFolder = inside(home);
73
+ return inFolder ? `${PLANS_PREFIX}${inFolder}` : null;
74
+ }
75
+ // Annotate the CommonJS export names for ESM import in node:
76
+ 0 && (module.exports = {
77
+ PLANS_PREFIX,
78
+ isPlacePath,
79
+ isStoredPlace,
80
+ locateStored,
81
+ placeOf
82
+ });
@@ -0,0 +1,198 @@
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 docx_markdown_exports = {};
19
+ __export(docx_markdown_exports, {
20
+ docxHtmlToMarkdown: () => docxHtmlToMarkdown
21
+ });
22
+ module.exports = __toCommonJS(docx_markdown_exports);
23
+ const ENTITIES = { amp: "&", lt: "<", gt: ">", quot: '"', apos: "'", nbsp: " " };
24
+ function decode(s) {
25
+ return s.replace(/&(#x[0-9a-f]+|#\d+|[a-z]+);/gi, (m, e) => {
26
+ if (e[0] === "#") {
27
+ const n = e[1] === "x" || e[1] === "X" ? parseInt(e.slice(2), 16) : Number(e.slice(1));
28
+ return Number.isFinite(n) && n > 0 && n <= 1114111 ? String.fromCodePoint(n) : m;
29
+ }
30
+ return ENTITIES[e.toLowerCase()] ?? m;
31
+ });
32
+ }
33
+ function docxHtmlToMarkdown(html) {
34
+ const out = [];
35
+ const lists = [];
36
+ const tables = [];
37
+ let line = "";
38
+ let prefix = "";
39
+ const links = [];
40
+ const write = (s) => {
41
+ const t = tables[tables.length - 1];
42
+ if (t && t.cell !== null) t.cell += s;
43
+ else line += s;
44
+ };
45
+ const flush = (blank) => {
46
+ const text = line.replace(/[ \t]+/g, " ").trim();
47
+ if (text) out.push(prefix + text);
48
+ if (blank && out.length && out[out.length - 1] !== "") out.push("");
49
+ line = "";
50
+ prefix = "";
51
+ };
52
+ for (const m of html.matchAll(/<(\/?)([a-z][a-z0-9]*)\b([^>]*?)\/?>|([^<]+)/gi)) {
53
+ if (m[4] !== void 0) {
54
+ write(decode(m[4]));
55
+ continue;
56
+ }
57
+ const closing = m[1] === "/";
58
+ const tag = m[2].toLowerCase();
59
+ const attrs = m[3] ?? "";
60
+ const inCell = tables.length > 0 && tables[tables.length - 1].cell !== null;
61
+ switch (tag) {
62
+ case "h1":
63
+ case "h2":
64
+ case "h3":
65
+ case "h4":
66
+ case "h5":
67
+ case "h6":
68
+ if (inCell) {
69
+ if (closing) write(" ");
70
+ break;
71
+ }
72
+ if (closing) flush(true);
73
+ else {
74
+ flush(false);
75
+ prefix = `${"#".repeat(Number(tag[1]))} `;
76
+ }
77
+ break;
78
+ case "p":
79
+ if (inCell) {
80
+ if (closing) write(" ");
81
+ break;
82
+ }
83
+ if (closing) flush(lists.length === 0);
84
+ else if (lists.length === 0) flush(false);
85
+ break;
86
+ case "ul":
87
+ case "ol":
88
+ if (inCell) break;
89
+ if (closing) {
90
+ flush(false);
91
+ lists.pop();
92
+ if (lists.length === 0 && out.length && out[out.length - 1] !== "") out.push("");
93
+ } else {
94
+ flush(false);
95
+ lists.push({ ordered: tag === "ol", n: 0 });
96
+ }
97
+ break;
98
+ case "li": {
99
+ if (inCell) {
100
+ write(closing ? "; " : "");
101
+ break;
102
+ }
103
+ if (closing) {
104
+ flush(false);
105
+ break;
106
+ }
107
+ flush(false);
108
+ const l = lists[lists.length - 1];
109
+ const depth = Math.max(0, lists.length - 1);
110
+ prefix = `${" ".repeat(depth)}${l?.ordered ? `${++l.n}.` : "-"} `;
111
+ break;
112
+ }
113
+ case "table":
114
+ if (!closing) {
115
+ if (!inCell) flush(true);
116
+ tables.push({ rows: [], row: null, cell: null });
117
+ } else {
118
+ const t = tables.pop();
119
+ if (!t) break;
120
+ if (tables.length > 0) {
121
+ write(t.rows.map((r) => r.join(", ")).join("; "));
122
+ } else {
123
+ out.push(...gfmTable(t.rows), "");
124
+ }
125
+ }
126
+ break;
127
+ case "tr": {
128
+ const t = tables[tables.length - 1];
129
+ if (!t) break;
130
+ if (closing) {
131
+ if (t.row) t.rows.push(t.row);
132
+ t.row = null;
133
+ } else t.row = [];
134
+ break;
135
+ }
136
+ case "td":
137
+ case "th": {
138
+ const t = tables[tables.length - 1];
139
+ if (!t) break;
140
+ if (closing) {
141
+ (t.row ??= []).push((t.cell ?? "").replace(/\s+/g, " ").trim());
142
+ t.cell = null;
143
+ } else t.cell = "";
144
+ break;
145
+ }
146
+ case "strong":
147
+ case "b":
148
+ write("**");
149
+ break;
150
+ case "em":
151
+ case "i":
152
+ write("_");
153
+ break;
154
+ case "s":
155
+ case "del":
156
+ write("~~");
157
+ break;
158
+ case "br":
159
+ if (inCell) write(" ");
160
+ else {
161
+ flush(false);
162
+ }
163
+ break;
164
+ case "a": {
165
+ if (!closing) {
166
+ const href = attrs.match(/\bhref="([^"]*)"/)?.[1];
167
+ links.push(href ? decode(href) : null);
168
+ if (href) write("[");
169
+ } else {
170
+ const href = links.pop();
171
+ if (href) write(`](${href})`);
172
+ }
173
+ break;
174
+ }
175
+ case "img": {
176
+ const alt = attrs.match(/\balt="([^"]*)"/)?.[1];
177
+ write(alt ? `[image: ${decode(alt)}]` : "[image]");
178
+ break;
179
+ }
180
+ default:
181
+ break;
182
+ }
183
+ }
184
+ flush(false);
185
+ while (out.length && out[out.length - 1] === "") out.pop();
186
+ return out.join("\n");
187
+ }
188
+ function gfmTable(rows) {
189
+ if (rows.length === 0) return [];
190
+ const width = Math.max(...rows.map((r) => r.length));
191
+ const cell = (s) => (s ?? "").replace(/\|/g, "\\|");
192
+ const line = (r) => `| ${Array.from({ length: width }, (_, i) => cell(r[i])).join(" | ")} |`;
193
+ return [line(rows[0]), `| ${Array.from({ length: width }, () => "---").join(" | ")} |`, ...rows.slice(1).map(line)];
194
+ }
195
+ // Annotate the CommonJS export names for ESM import in node:
196
+ 0 && (module.exports = {
197
+ docxHtmlToMarkdown
198
+ });