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,168 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var comment_service_exports = {};
19
+ __export(comment_service_exports, {
20
+ addComment: () => addComment,
21
+ deleteComment: () => deleteComment,
22
+ getComments: () => getComments,
23
+ listCommentsFlat: () => listCommentsFlat,
24
+ listCommentsForPlanSince: () => listCommentsForPlanSince,
25
+ listItemComments: () => listItemComments
26
+ });
27
+ module.exports = __toCommonJS(comment_service_exports);
28
+ var import_node_crypto = require("node:crypto");
29
+ var import_database = require("./database");
30
+ var import_persistence = require("./persistence");
31
+ function inferSource(authorType, explicit) {
32
+ if (explicit) return explicit;
33
+ return authorType === "human" || authorType === "unverified" ? "human" : "agent";
34
+ }
35
+ function addComment(targetType, targetUid, author, authorType, body, commentTypeOrOpts = "comment", parentUidLegacy) {
36
+ const opts = typeof commentTypeOrOpts === "string" ? { commentType: commentTypeOrOpts, parentUid: parentUidLegacy } : commentTypeOrOpts;
37
+ const uid = (0, import_node_crypto.randomUUID)();
38
+ const now = Date.now();
39
+ const commentType = opts.commentType ?? "comment";
40
+ const kind = opts.kind ?? null;
41
+ const source = inferSource(authorType, opts.source);
42
+ const metadataJson = opts.metadata ? JSON.stringify(opts.metadata) : null;
43
+ (0, import_database.getDb)().run(
44
+ `INSERT INTO comments (uid, target_type, target_uid, parent_uid, author, author_type, body, comment_type, kind, source, metadata, created_at)
45
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
46
+ [uid, targetType, targetUid, opts.parentUid || null, author, authorType, body, commentType, kind, source, metadataJson, now]
47
+ );
48
+ (0, import_persistence.markDirty)();
49
+ return {
50
+ uid,
51
+ targetType,
52
+ targetUid,
53
+ parentUid: opts.parentUid || null,
54
+ author,
55
+ authorType,
56
+ body,
57
+ commentType,
58
+ kind: kind ?? void 0,
59
+ source,
60
+ metadata: opts.metadata,
61
+ createdAt: now
62
+ };
63
+ }
64
+ function rowToComment(r) {
65
+ let metadata;
66
+ try {
67
+ metadata = r[10] ? JSON.parse(r[10]) : void 0;
68
+ } catch {
69
+ metadata = void 0;
70
+ }
71
+ return {
72
+ uid: r[0],
73
+ targetType: r[1],
74
+ targetUid: r[2],
75
+ parentUid: r[3],
76
+ author: r[4],
77
+ authorType: r[5],
78
+ body: r[6],
79
+ commentType: r[7],
80
+ kind: r[8] ?? void 0,
81
+ source: r[9] ?? void 0,
82
+ metadata,
83
+ createdAt: r[11]
84
+ };
85
+ }
86
+ const COMMENT_COLUMNS = `uid, target_type, target_uid, parent_uid, author, author_type, body, comment_type, kind, source, metadata, created_at`;
87
+ function deleteComment(uid) {
88
+ const db = (0, import_database.getDb)();
89
+ const before = db.exec(`SELECT uid FROM comments WHERE uid = ?`, [uid]);
90
+ if (!before[0]?.values[0]) return false;
91
+ db.run(`DELETE FROM comments WHERE uid = ?`, [uid]);
92
+ (0, import_persistence.markDirty)();
93
+ return true;
94
+ }
95
+ function getComments(targetUid) {
96
+ const result = (0, import_database.getDb)().exec(
97
+ `SELECT ${COMMENT_COLUMNS}
98
+ FROM comments WHERE target_uid = ? ORDER BY created_at ASC`,
99
+ [targetUid]
100
+ );
101
+ if (!result[0]) return [];
102
+ const all = result[0].values.map((r) => ({
103
+ ...rowToComment(r),
104
+ replies: []
105
+ }));
106
+ const topLevel = [];
107
+ const byUid = /* @__PURE__ */ new Map();
108
+ for (const c of all) {
109
+ byUid.set(c.uid, c);
110
+ }
111
+ for (const c of all) {
112
+ if (c.parentUid && byUid.has(c.parentUid)) {
113
+ byUid.get(c.parentUid).replies.push(c);
114
+ } else {
115
+ topLevel.push(c);
116
+ }
117
+ }
118
+ return topLevel;
119
+ }
120
+ function listCommentsFlat(targetUid) {
121
+ const result = (0, import_database.getDb)().exec(
122
+ `SELECT ${COMMENT_COLUMNS}
123
+ FROM comments WHERE target_uid = ? ORDER BY created_at ASC`,
124
+ [targetUid]
125
+ );
126
+ if (!result[0]) return [];
127
+ return result[0].values.map((r) => rowToComment(r));
128
+ }
129
+ function listItemComments(itemUid) {
130
+ const result = (0, import_database.getDb)().exec(
131
+ `SELECT ${COMMENT_COLUMNS}
132
+ FROM comments
133
+ WHERE target_uid = ? AND target_type IN ('item', 'task')
134
+ ORDER BY created_at ASC`,
135
+ [itemUid]
136
+ );
137
+ if (!result[0]) return [];
138
+ return result[0].values.map((r) => rowToComment(r));
139
+ }
140
+ function listCommentsForPlanSince(planUid, since) {
141
+ const db = (0, import_database.getDb)();
142
+ const itemRows = db.exec(`SELECT uid FROM plan_items WHERE plan_uid = ?`, [planUid]);
143
+ let targetUids = (itemRows[0]?.values ?? []).map((r) => r[0]);
144
+ if (targetUids.length === 0) {
145
+ const taskRows = db.exec(`SELECT uid FROM tasks WHERE plan_uid = ?`, [planUid]);
146
+ targetUids = (taskRows[0]?.values ?? []).map((r) => r[0]);
147
+ }
148
+ if (targetUids.length === 0) return [];
149
+ const placeholders = targetUids.map(() => "?").join(", ");
150
+ const result = db.exec(
151
+ `SELECT ${COMMENT_COLUMNS}
152
+ FROM comments
153
+ WHERE target_uid IN (${placeholders}) AND created_at > ?
154
+ ORDER BY created_at ASC`,
155
+ [...targetUids, since]
156
+ );
157
+ if (!result[0]) return [];
158
+ return result[0].values.map((r) => rowToComment(r));
159
+ }
160
+ // Annotate the CommonJS export names for ESM import in node:
161
+ 0 && (module.exports = {
162
+ addComment,
163
+ deleteComment,
164
+ getComments,
165
+ listCommentsFlat,
166
+ listCommentsForPlanSince,
167
+ listItemComments
168
+ });
@@ -0,0 +1,134 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var commit_attribution_exports = {};
29
+ __export(commit_attribution_exports, {
30
+ NO_KNOWLEDGE: () => NO_KNOWLEDGE,
31
+ agentFromMessage: () => agentFromMessage,
32
+ attributeCommits: () => attributeCommits,
33
+ isProjectRelativePath: () => isProjectRelativePath,
34
+ recordedKnowledge: () => recordedKnowledge
35
+ });
36
+ module.exports = __toCommonJS(commit_attribution_exports);
37
+ var import_node_fs = __toESM(require("node:fs"));
38
+ var import_database = require("./database");
39
+ var import_replay_frames = require("./replay-frames");
40
+ const NO_KNOWLEDGE = { seenBy: () => /* @__PURE__ */ new Map(), sessionAt: () => null, taskOf: () => null };
41
+ const AGENT_NAMES = /\b(claude|codex|copilot|cursor|gemini|aider|devin|windsurf|amp)\b/i;
42
+ function agentFromMessage(body) {
43
+ const line = body.match(/^agent:\s*(\S+)/m);
44
+ if (line) return { agent: line[1], how: "commit message", words: `${line[1]}, from the commit message` };
45
+ for (const m of body.matchAll(/^Co-Authored-By:\s*([^<\n]+?)\s*<[^>\n]*>\s*$/gim)) {
46
+ const name = m[1].match(AGENT_NAMES);
47
+ if (name) {
48
+ const agent = name[1].toLowerCase();
49
+ return { agent, how: "commit message", words: `${agent}, from the commit's Co-Authored-By trailer (${m[1].trim()})` };
50
+ }
51
+ }
52
+ return null;
53
+ }
54
+ const basename = (p) => p.replace(/[\\/]+$/, "").split(/[\\/]/).pop() ?? p;
55
+ function attributeCommits(rows, checkoutRoot, know = NO_KNOWLEDGE) {
56
+ const out = /* @__PURE__ */ new Map();
57
+ const seen = know.seenBy(rows.map((r) => r.sha));
58
+ for (const r of rows) {
59
+ const frame = seen.get(r.sha);
60
+ const fromMessage = agentFromMessage(r.body);
61
+ let a = fromMessage ? { ...fromMessage, sessionId: frame?.sessionId ?? null } : null;
62
+ if (!a && frame?.agentType) {
63
+ a = {
64
+ agent: frame.agentType,
65
+ how: "seen",
66
+ sessionId: frame.sessionId,
67
+ words: `${frame.agentType}, seen: it landed while CodeTrellis recorded ${frame.agentType}'s session${frame.workstreamRoot ? ` in ${basename(frame.workstreamRoot)}` : ""}`
68
+ };
69
+ }
70
+ if (!a && checkoutRoot) {
71
+ const open = know.sessionAt(checkoutRoot, r.at);
72
+ if (open) {
73
+ a = {
74
+ agent: open.agentType,
75
+ how: "timing",
76
+ sessionId: open.sessionId,
77
+ words: `probably ${open.agentType}: committed while ${open.agentType}'s session was open in this checkout`
78
+ };
79
+ }
80
+ }
81
+ if (!a) continue;
82
+ if (a.sessionId) {
83
+ const t = know.taskOf(a.sessionId);
84
+ if (t) {
85
+ a.task = t.task;
86
+ a.plan = t.plan;
87
+ }
88
+ }
89
+ out.set(r.sha, a);
90
+ }
91
+ return out;
92
+ }
93
+ const SESSION_GRACE_MS = 10 * 6e4;
94
+ const trim = (p) => p.replace(/[\\/]+$/, "");
95
+ function recordedKnowledge(projectPath) {
96
+ return {
97
+ seenBy: (shas) => (0, import_replay_frames.framesByCommit)(projectPath, shas),
98
+ sessionAt: (checkoutRoot, at) => {
99
+ const spelled = trim(checkoutRoot);
100
+ let real = spelled;
101
+ try {
102
+ real = import_node_fs.default.realpathSync.native(spelled);
103
+ } catch {
104
+ }
105
+ const row = (0, import_database.getDb)().exec(
106
+ `SELECT session_id, agent_type FROM agent_sessions
107
+ WHERE workstream_root IN (?, ?) AND connected_at <= ? AND last_seen + ? >= ?
108
+ ORDER BY connected_at DESC LIMIT 1`,
109
+ // A commit's time is whole seconds: one made in the second the session started is in it.
110
+ [spelled, real, at + 999, SESSION_GRACE_MS, at]
111
+ )[0]?.values?.[0];
112
+ return row ? { sessionId: String(row[0]), agentType: String(row[1]) } : null;
113
+ },
114
+ taskOf: (sessionId) => {
115
+ const row = (0, import_database.getDb)().exec(
116
+ `SELECT i.uid, i.title, p.uid, p.title FROM plan_items i JOIN plans p ON p.uid = i.plan_uid
117
+ WHERE i.assignee_session = ? ORDER BY i.rowid DESC LIMIT 1`,
118
+ [sessionId]
119
+ )[0]?.values?.[0];
120
+ return row ? { task: { uid: String(row[0]), title: String(row[1]) }, plan: { uid: String(row[2]), title: String(row[3]) } } : null;
121
+ }
122
+ };
123
+ }
124
+ function isProjectRelativePath(rel) {
125
+ return typeof rel === "string" && rel.length > 0 && !rel.startsWith("-") && !rel.startsWith(":") && !rel.startsWith("/") && !/^[A-Za-z]:[\\/]/.test(rel) && !rel.split(/[\\/]/).includes("..");
126
+ }
127
+ // Annotate the CommonJS export names for ESM import in node:
128
+ 0 && (module.exports = {
129
+ NO_KNOWLEDGE,
130
+ agentFromMessage,
131
+ attributeCommits,
132
+ isProjectRelativePath,
133
+ recordedKnowledge
134
+ });
@@ -0,0 +1,99 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var commit_edges_exports = {};
29
+ __export(commit_edges_exports, {
30
+ MAX_PARSED: () => MAX_PARSED,
31
+ clearCommitEdgeCache: () => clearCommitEdgeCache,
32
+ commitEdges: () => commitEdges
33
+ });
34
+ module.exports = __toCommonJS(commit_edges_exports);
35
+ var import_node_path = __toESM(require("node:path"));
36
+ const MAX_PARSED = 400;
37
+ const IMPORT_CACHE_MAX = 2e4;
38
+ const importCache = /* @__PURE__ */ new Map();
39
+ function clearCommitEdgeCache() {
40
+ importCache.clear();
41
+ }
42
+ function commitEdges(input, deps) {
43
+ const { projectPath, files, oids, live } = input;
44
+ const liveOut = /* @__PURE__ */ new Map();
45
+ for (const e of live.edges) {
46
+ const i = e.indexOf("->");
47
+ if (i === -1) continue;
48
+ const src = e.slice(0, i);
49
+ const list = liveOut.get(src);
50
+ if (list) list.push(e.slice(i + 2));
51
+ else liveOut.set(src, [e.slice(i + 2)]);
52
+ }
53
+ const edges = /* @__PURE__ */ new Set();
54
+ const toParse = [];
55
+ for (const [rel, { hash }] of files) {
56
+ const same = live.files.get(rel)?.hash === hash;
57
+ const targets = liveOut.get(rel) ?? [];
58
+ if (same && targets.every((t) => files.has(t))) {
59
+ for (const t of targets) edges.add(`${rel}->${t}`);
60
+ } else {
61
+ toParse.push(rel);
62
+ }
63
+ }
64
+ if (toParse.length > MAX_PARSED) {
65
+ return {
66
+ ok: false,
67
+ reason: `${toParse.length} files differ from the working tree at this commit, more than the ${MAX_PARSED} parsed to find its dependencies.`
68
+ };
69
+ }
70
+ const uncached = [...new Set(toParse.map((rel) => oids.get(rel)).filter((o) => !!o && !importCache.has(o)))];
71
+ const blobs = uncached.length ? deps.readBlobs(uncached) : /* @__PURE__ */ new Map();
72
+ const knownFiles = new Set([...files.keys()].map((rel) => import_node_path.default.join(projectPath, rel)));
73
+ for (const rel of toParse) {
74
+ const oid = oids.get(rel);
75
+ if (!oid) continue;
76
+ const abs = import_node_path.default.join(projectPath, rel);
77
+ if (!importCache.has(oid)) {
78
+ const content = blobs.get(oid);
79
+ if (content === void 0) continue;
80
+ if (importCache.size >= IMPORT_CACHE_MAX) importCache.clear();
81
+ importCache.set(oid, deps.parseImports(abs, content));
82
+ }
83
+ const parsed = importCache.get(oid);
84
+ if (!parsed) continue;
85
+ for (const imp of parsed.imports) {
86
+ const target = deps.resolve(parsed.language, imp.source, abs, knownFiles, imp.isRelative);
87
+ if (!target || target === abs) continue;
88
+ const targetRel = deps.relative(target);
89
+ if (files.has(targetRel)) edges.add(`${rel}->${targetRel}`);
90
+ }
91
+ }
92
+ return { ok: true, edges, parsed: toParse.length };
93
+ }
94
+ // Annotate the CommonJS export names for ESM import in node:
95
+ 0 && (module.exports = {
96
+ MAX_PARSED,
97
+ clearCommitEdgeCache,
98
+ commitEdges
99
+ });
@@ -0,0 +1,241 @@
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 confined_fs_exports = {};
29
+ __export(confined_fs_exports, {
30
+ ConfinementError: () => ConfinementError,
31
+ canonicalRoot: () => canonicalRoot,
32
+ isInside: () => isInside,
33
+ isWithin: () => isWithin,
34
+ openReadStreamWithin: () => openReadStreamWithin,
35
+ readFileWithin: () => readFileWithin,
36
+ readTextWithin: () => readTextWithin,
37
+ removeWithin: () => removeWithin,
38
+ resolveWithin: () => resolveWithin,
39
+ writeFileWithin: () => writeFileWithin
40
+ });
41
+ module.exports = __toCommonJS(confined_fs_exports);
42
+ var fs = __toESM(require("node:fs"));
43
+ var path = __toESM(require("node:path"));
44
+ const HAS_NOFOLLOW = typeof fs.constants.O_NOFOLLOW === "number" && process.platform !== "win32";
45
+ class ConfinementError extends Error {
46
+ code = "EOUTSIDE_ROOT";
47
+ constructor(message) {
48
+ super(message);
49
+ this.name = "ConfinementError";
50
+ }
51
+ }
52
+ function canonicalRoot(root) {
53
+ if (!root || typeof root !== "string") {
54
+ throw new ConfinementError("A containment root is required");
55
+ }
56
+ try {
57
+ return fs.realpathSync.native(path.resolve(root));
58
+ } catch (err) {
59
+ throw new ConfinementError(
60
+ `Cannot canonicalise the containment root "${root}": ${err.message}`
61
+ );
62
+ }
63
+ }
64
+ function resolveWithin(root, candidate, label = "path") {
65
+ if (typeof candidate !== "string" || candidate.length === 0) {
66
+ throw new ConfinementError(`${label}: a path is required`);
67
+ }
68
+ if (candidate.includes("\0")) {
69
+ throw new ConfinementError(`${label}: path contains a NUL byte`);
70
+ }
71
+ const canonRoot = canonicalRoot(root);
72
+ const joined = path.resolve(canonRoot, candidate);
73
+ let existing = joined;
74
+ const missing = [];
75
+ while (!fs.existsSync(existing)) {
76
+ const parent = path.dirname(existing);
77
+ if (parent === existing) break;
78
+ missing.unshift(path.basename(existing));
79
+ existing = parent;
80
+ }
81
+ assertNoSymlinkOnPath(canonRoot, existing, label);
82
+ let canonExisting;
83
+ try {
84
+ canonExisting = fs.realpathSync.native(existing);
85
+ } catch (err) {
86
+ throw new ConfinementError(`${label}: cannot resolve "${candidate}": ${err.message}`);
87
+ }
88
+ if (!isInside(canonRoot, canonExisting)) {
89
+ throw new ConfinementError(
90
+ `${label}: resolves outside the permitted directory (resolved to ${canonExisting}, which is not inside ${canonRoot})`
91
+ );
92
+ }
93
+ return missing.length ? path.join(canonExisting, ...missing) : canonExisting;
94
+ }
95
+ function isInside(root, target) {
96
+ if (target === root) return true;
97
+ const rel = path.relative(root, target);
98
+ return rel.length > 0 && !rel.startsWith("..") && !path.isAbsolute(rel);
99
+ }
100
+ function assertNoSymlinkOnPath(root, target, label) {
101
+ let current = target;
102
+ while (current !== root && current.length > root.length) {
103
+ let st;
104
+ try {
105
+ st = fs.lstatSync(current);
106
+ } catch {
107
+ return;
108
+ }
109
+ if (st.isSymbolicLink()) {
110
+ throw new ConfinementError(
111
+ `${label}: "${current}" is a symbolic link. Links are not followed at this boundary.`
112
+ );
113
+ }
114
+ const parent = path.dirname(current);
115
+ if (parent === current) break;
116
+ current = parent;
117
+ }
118
+ }
119
+ function readFileWithin(root, candidate, label = "path") {
120
+ const target = resolveWithin(root, candidate, label);
121
+ const flags = HAS_NOFOLLOW ? fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW : fs.constants.O_RDONLY;
122
+ let fd = null;
123
+ try {
124
+ fd = fs.openSync(target, flags);
125
+ const st = fs.fstatSync(fd);
126
+ if (!st.isFile()) {
127
+ throw new ConfinementError(`${label}: not a regular file`);
128
+ }
129
+ return fs.readFileSync(fd);
130
+ } catch (err) {
131
+ if (err instanceof ConfinementError) throw err;
132
+ const e = err;
133
+ if (e.code === "ELOOP") {
134
+ throw new ConfinementError(`${label}: refused to follow a symbolic link`);
135
+ }
136
+ throw err;
137
+ } finally {
138
+ if (fd !== null) {
139
+ try {
140
+ fs.closeSync(fd);
141
+ } catch {
142
+ }
143
+ }
144
+ }
145
+ }
146
+ function openReadStreamWithin(root, candidate, opts = {}, label = "path") {
147
+ const target = resolveWithin(root, candidate, label);
148
+ const flags = HAS_NOFOLLOW ? fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW : fs.constants.O_RDONLY;
149
+ let fd = null;
150
+ try {
151
+ fd = fs.openSync(target, flags);
152
+ const st = fs.fstatSync(fd);
153
+ if (!st.isFile()) {
154
+ throw new ConfinementError(`${label}: not a regular file`);
155
+ }
156
+ const stream = fs.createReadStream("", { fd, start: opts.start, end: opts.end, autoClose: true });
157
+ fd = null;
158
+ return { stream, size: st.size, mtimeMs: st.mtimeMs };
159
+ } catch (err) {
160
+ if (err instanceof ConfinementError) throw err;
161
+ const e = err;
162
+ if (e.code === "ELOOP") {
163
+ throw new ConfinementError(`${label}: refused to follow a symbolic link`);
164
+ }
165
+ throw err;
166
+ } finally {
167
+ if (fd !== null) {
168
+ try {
169
+ fs.closeSync(fd);
170
+ } catch {
171
+ }
172
+ }
173
+ }
174
+ }
175
+ function readTextWithin(root, candidate, label = "path") {
176
+ return readFileWithin(root, candidate, label).toString("utf-8");
177
+ }
178
+ function writeFileWithin(root, candidate, data, label = "path") {
179
+ const target = resolveWithin(root, candidate, label);
180
+ const dir = path.dirname(target);
181
+ fs.mkdirSync(dir, { recursive: true });
182
+ const canonDir = resolveWithin(root, dir, `${label} (directory)`);
183
+ const tmp = path.join(canonDir, `.tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);
184
+ let fd = null;
185
+ try {
186
+ fd = fs.openSync(tmp, fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL, 384);
187
+ fs.writeFileSync(fd, data);
188
+ fs.fsyncSync(fd);
189
+ fs.closeSync(fd);
190
+ fd = null;
191
+ try {
192
+ const st = fs.lstatSync(target);
193
+ if (st.isSymbolicLink()) {
194
+ throw new ConfinementError(`${label}: destination is a symbolic link; refusing to write through it`);
195
+ }
196
+ } catch (err) {
197
+ if (err instanceof ConfinementError) throw err;
198
+ }
199
+ fs.renameSync(tmp, target);
200
+ return target;
201
+ } finally {
202
+ if (fd !== null) {
203
+ try {
204
+ fs.closeSync(fd);
205
+ } catch {
206
+ }
207
+ }
208
+ try {
209
+ if (fs.existsSync(tmp)) fs.unlinkSync(tmp);
210
+ } catch {
211
+ }
212
+ }
213
+ }
214
+ function removeWithin(root, candidate, opts = {}, label = "path") {
215
+ const target = resolveWithin(root, candidate, label);
216
+ if (target === canonicalRoot(root)) {
217
+ throw new ConfinementError(`${label}: refusing to delete the containment root itself`);
218
+ }
219
+ fs.rmSync(target, { recursive: opts.recursive === true, force: false });
220
+ }
221
+ function isWithin(root, candidate) {
222
+ try {
223
+ resolveWithin(root, candidate);
224
+ return true;
225
+ } catch {
226
+ return false;
227
+ }
228
+ }
229
+ // Annotate the CommonJS export names for ESM import in node:
230
+ 0 && (module.exports = {
231
+ ConfinementError,
232
+ canonicalRoot,
233
+ isInside,
234
+ isWithin,
235
+ openReadStreamWithin,
236
+ readFileWithin,
237
+ readTextWithin,
238
+ removeWithin,
239
+ resolveWithin,
240
+ writeFileWithin
241
+ });