codetrellis 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (449) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +27 -2
  3. package/bin/codetrellis.mjs +4 -0
  4. package/package.json +43 -4
  5. package/reader/material-reader.mjs +130346 -0
  6. package/resources/tree-sitter/README.md +150 -0
  7. package/resources/tree-sitter/tree-sitter-c-sharp.wasm +0 -0
  8. package/resources/tree-sitter/tree-sitter-go.wasm +0 -0
  9. package/resources/tree-sitter/tree-sitter-java.wasm +0 -0
  10. package/resources/tree-sitter/tree-sitter-javascript.wasm +0 -0
  11. package/resources/tree-sitter/tree-sitter-kotlin.wasm +0 -0
  12. package/resources/tree-sitter/tree-sitter-php.wasm +0 -0
  13. package/resources/tree-sitter/tree-sitter-python.wasm +0 -0
  14. package/resources/tree-sitter/tree-sitter-ruby.wasm +0 -0
  15. package/resources/tree-sitter/tree-sitter-rust.wasm +0 -0
  16. package/resources/tree-sitter/tree-sitter-swift.wasm +0 -0
  17. package/resources/tree-sitter/tree-sitter-tsx.wasm +0 -0
  18. package/resources/tree-sitter/tree-sitter-typescript.wasm +0 -0
  19. package/resources/tree-sitter/tree-sitter.wasm +0 -0
  20. package/src/backend/agent/claude-code-watcher.js +270 -0
  21. package/src/backend/index.js +8 -0
  22. package/src/backend/lib/sha256-file.js +39 -0
  23. package/src/backend/lib/zip-entries.js +98 -0
  24. package/src/backend/lifecycle.js +102 -0
  25. package/src/backend/mcp/binding-headers.js +54 -0
  26. package/src/backend/mcp/client-identity.js +44 -0
  27. package/src/backend/mcp/connector/command.js +110 -0
  28. package/src/backend/mcp/connector/core.js +278 -0
  29. package/src/backend/mcp/connector/files.js +121 -0
  30. package/src/backend/mcp/connector/hook.js +284 -0
  31. package/src/backend/mcp/connector/main.js +126 -0
  32. package/src/backend/mcp/connector/sse-upstream.js +152 -0
  33. package/src/backend/mcp/helpers.js +43 -0
  34. package/src/backend/mcp/prompt-builders.js +104 -0
  35. package/src/backend/mcp/resources.js +197 -0
  36. package/src/backend/mcp/server.js +813 -0
  37. package/src/backend/mcp/skill-guide.js +1528 -0
  38. package/src/backend/mcp/tools/architecture-tools.js +273 -0
  39. package/src/backend/mcp/tools/audio-tools.js +117 -0
  40. package/src/backend/mcp/tools/awareness-tools.js +623 -0
  41. package/src/backend/mcp/tools/budget-tools.js +185 -0
  42. package/src/backend/mcp/tools/channel-tools.js +205 -0
  43. package/src/backend/mcp/tools/contribution-tools.js +181 -0
  44. package/src/backend/mcp/tools/drift-tools.js +252 -0
  45. package/src/backend/mcp/tools/git-tools.js +316 -0
  46. package/src/backend/mcp/tools/governance-tools.js +175 -0
  47. package/src/backend/mcp/tools/graph-tools.js +181 -0
  48. package/src/backend/mcp/tools/intake-tools.js +244 -0
  49. package/src/backend/mcp/tools/mobile-tools.js +118 -0
  50. package/src/backend/mcp/tools/peer-tools.js +330 -0
  51. package/src/backend/mcp/tools/plan-item-tools.js +1601 -0
  52. package/src/backend/mcp/tools/plan-tools.js +680 -0
  53. package/src/backend/mcp/tools/presence-tools.js +185 -0
  54. package/src/backend/mcp/tools/project-config-tools.js +150 -0
  55. package/src/backend/mcp/tools/review-tools.js +172 -0
  56. package/src/backend/mcp/tools/session-tools.js +554 -0
  57. package/src/backend/mcp/tools/system-docs-tools.js +168 -0
  58. package/src/backend/mcp/tools/terminal-tools.js +186 -0
  59. package/src/backend/mcp/tools/test-tools.js +117 -0
  60. package/src/backend/mcp/tools/ui-tools.js +356 -0
  61. package/src/backend/mcp/types.js +15 -0
  62. package/src/backend/middleware/local-auth.js +116 -0
  63. package/src/backend/server.js +5951 -0
  64. package/src/backend/services/agent-event-log.js +350 -0
  65. package/src/backend/services/architecture-rule.js +584 -0
  66. package/src/backend/services/architecture-rules.js +275 -0
  67. package/src/backend/services/artefact-content-service.js +181 -0
  68. package/src/backend/services/artefact-service.js +305 -0
  69. package/src/backend/services/artefact-watcher.js +167 -0
  70. package/src/backend/services/ast-parser.js +327 -0
  71. package/src/backend/services/audio-buffer-service.js +152 -0
  72. package/src/backend/services/awareness-notices.js +139 -0
  73. package/src/backend/services/awareness-replies.js +194 -0
  74. package/src/backend/services/awareness-service.js +344 -0
  75. package/src/backend/services/awareness-signals.js +267 -0
  76. package/src/backend/services/baseline-store.js +83 -0
  77. package/src/backend/services/branch-workstreams.js +341 -0
  78. package/src/backend/services/breakpoint-service.js +584 -0
  79. package/src/backend/services/brief-service.js +299 -0
  80. package/src/backend/services/budget-service.js +528 -0
  81. package/src/backend/services/callsites/base.js +15 -0
  82. package/src/backend/services/callsites/csharp.js +148 -0
  83. package/src/backend/services/callsites/go.js +163 -0
  84. package/src/backend/services/callsites/index.js +53 -0
  85. package/src/backend/services/callsites/kotlin.js +123 -0
  86. package/src/backend/services/callsites/process-env.js +125 -0
  87. package/src/backend/services/callsites/python.js +91 -0
  88. package/src/backend/services/callsites/ruby.js +164 -0
  89. package/src/backend/services/callsites/shared.js +198 -0
  90. package/src/backend/services/callsites/swift.js +115 -0
  91. package/src/backend/services/callsites/typescript.js +87 -0
  92. package/src/backend/services/capability-token.js +108 -0
  93. package/src/backend/services/change-check.js +156 -0
  94. package/src/backend/services/channel-dispatcher-service.js +235 -0
  95. package/src/backend/services/channel-event-file-service.js +125 -0
  96. package/src/backend/services/channel-event-service.js +297 -0
  97. package/src/backend/services/check-runs.js +177 -0
  98. package/src/backend/services/checkout-identity.js +73 -0
  99. package/src/backend/services/claude-code-parallel.js +221 -0
  100. package/src/backend/services/claude-desktop-config.js +186 -0
  101. package/src/backend/services/clock.js +57 -0
  102. package/src/backend/services/cloud-files.js +191 -0
  103. package/src/backend/services/coalesce.js +50 -0
  104. package/src/backend/services/code-breakpoints.js +291 -0
  105. package/src/backend/services/comment-service.js +168 -0
  106. package/src/backend/services/commit-attribution.js +134 -0
  107. package/src/backend/services/commit-edges.js +99 -0
  108. package/src/backend/services/confined-fs.js +241 -0
  109. package/src/backend/services/conformity-gate.js +132 -0
  110. package/src/backend/services/contribution-service.js +409 -0
  111. package/src/backend/services/coverage-service.js +173 -0
  112. package/src/backend/services/criteria-service.js +721 -0
  113. package/src/backend/services/criterion-checks.js +387 -0
  114. package/src/backend/services/criterion-loop-service.js +411 -0
  115. package/src/backend/services/cross-system-service.js +231 -0
  116. package/src/backend/services/database.js +916 -0
  117. package/src/backend/services/db-schema.js +1358 -0
  118. package/src/backend/services/deviation-service.js +344 -0
  119. package/src/backend/services/diff-engine.js +168 -0
  120. package/src/backend/services/evidence.js +363 -0
  121. package/src/backend/services/external-intake-service.js +269 -0
  122. package/src/backend/services/external-pointer-service.js +195 -0
  123. package/src/backend/services/external-refs-service.js +214 -0
  124. package/src/backend/services/file-history.js +158 -0
  125. package/src/backend/services/file-watcher.js +193 -0
  126. package/src/backend/services/folder-requests.js +118 -0
  127. package/src/backend/services/freeze-service.js +189 -0
  128. package/src/backend/services/gemini-cli-hook.js +172 -0
  129. package/src/backend/services/git-activity-service.js +325 -0
  130. package/src/backend/services/git-blobs.js +70 -0
  131. package/src/backend/services/git-branches.js +357 -0
  132. package/src/backend/services/git-checkout.js +153 -0
  133. package/src/backend/services/git-commit-service.js +91 -0
  134. package/src/backend/services/git-env.js +121 -0
  135. package/src/backend/services/git-identity.js +84 -0
  136. package/src/backend/services/git-refs.js +386 -0
  137. package/src/backend/services/git-safety.js +58 -0
  138. package/src/backend/services/grant-guard.js +67 -0
  139. package/src/backend/services/html-view-policy.js +135 -0
  140. package/src/backend/services/human-decision.js +55 -0
  141. package/src/backend/services/importers.js +159 -0
  142. package/src/backend/services/intent-service.js +105 -0
  143. package/src/backend/services/ipc-dispatcher.js +164 -0
  144. package/src/backend/services/item-git-state.js +208 -0
  145. package/src/backend/services/line-changes.js +232 -0
  146. package/src/backend/services/line-history.js +174 -0
  147. package/src/backend/services/local-api-changes.js +40 -0
  148. package/src/backend/services/logger.js +217 -0
  149. package/src/backend/services/material-footprints.js +203 -0
  150. package/src/backend/services/material-place.js +82 -0
  151. package/src/backend/services/material-reader/child.js +4 -0
  152. package/src/backend/services/material-reader/docx-markdown.js +198 -0
  153. package/src/backend/services/material-reader/fixtures.test-helper.js +169 -0
  154. package/src/backend/services/material-reader/quote.js +44 -0
  155. package/src/backend/services/material-reader/read.js +430 -0
  156. package/src/backend/services/material-reader/reader-host.js +202 -0
  157. package/src/backend/services/material-signals.js +141 -0
  158. package/src/backend/services/mcp-capabilities.js +390 -0
  159. package/src/backend/services/mdns-service.js +304 -0
  160. package/src/backend/services/mobile-api-server.js +281 -0
  161. package/src/backend/services/mobile-approvals.js +306 -0
  162. package/src/backend/services/mobile-awareness.js +180 -0
  163. package/src/backend/services/mobile-breakpoints.js +115 -0
  164. package/src/backend/services/mobile-budget.js +98 -0
  165. package/src/backend/services/mobile-freeze.js +106 -0
  166. package/src/backend/services/mobile-proposals.js +100 -0
  167. package/src/backend/services/mobile-rpc-service.js +1289 -0
  168. package/src/backend/services/mobile-workstreams.js +160 -0
  169. package/src/backend/services/monorepo-detector.js +131 -0
  170. package/src/backend/services/other-work.js +45 -0
  171. package/src/backend/services/pack-seal.js +129 -0
  172. package/src/backend/services/paired-device-service.js +192 -0
  173. package/src/backend/services/pairing-server.js +323 -0
  174. package/src/backend/services/pairing-service.js +200 -0
  175. package/src/backend/services/pantry-resolution-service.js +166 -0
  176. package/src/backend/services/parsers/base.js +124 -0
  177. package/src/backend/services/parsers/csharp.js +224 -0
  178. package/src/backend/services/parsers/go.js +180 -0
  179. package/src/backend/services/parsers/index.js +101 -0
  180. package/src/backend/services/parsers/java.js +103 -0
  181. package/src/backend/services/parsers/kotlin.js +252 -0
  182. package/src/backend/services/parsers/php.js +113 -0
  183. package/src/backend/services/parsers/python.js +189 -0
  184. package/src/backend/services/parsers/ruby.js +212 -0
  185. package/src/backend/services/parsers/rust.js +97 -0
  186. package/src/backend/services/parsers/swift.js +221 -0
  187. package/src/backend/services/parsers/typescript.js +235 -0
  188. package/src/backend/services/pattern-scan.js +65 -0
  189. package/src/backend/services/patterns.js +281 -0
  190. package/src/backend/services/peer-audit-service.js +123 -0
  191. package/src/backend/services/peer-auth.js +153 -0
  192. package/src/backend/services/peer-capabilities.js +209 -0
  193. package/src/backend/services/peer-connection-service.js +450 -0
  194. package/src/backend/services/peer-grants.js +33 -0
  195. package/src/backend/services/persistence.js +116 -0
  196. package/src/backend/services/personal-sync-service.js +232 -0
  197. package/src/backend/services/pipeline-approvals.js +72 -0
  198. package/src/backend/services/pipeline.js +232 -0
  199. package/src/backend/services/plan-arrivals.js +68 -0
  200. package/src/backend/services/plan-changes-service.js +273 -0
  201. package/src/backend/services/plan-conflict-service.js +288 -0
  202. package/src/backend/services/plan-dependencies.js +91 -0
  203. package/src/backend/services/plan-doc-guard.js +90 -0
  204. package/src/backend/services/plan-documents-service.js +275 -0
  205. package/src/backend/services/plan-event-service.js +154 -0
  206. package/src/backend/services/plan-file-refs.js +106 -0
  207. package/src/backend/services/plan-file-service.js +1564 -0
  208. package/src/backend/services/plan-history-service.js +156 -0
  209. package/src/backend/services/plan-import-service.js +261 -0
  210. package/src/backend/services/plan-item-service.js +1223 -0
  211. package/src/backend/services/plan-migrate-service.js +395 -0
  212. package/src/backend/services/plan-overlay-service.js +173 -0
  213. package/src/backend/services/plan-phases-service.js +182 -0
  214. package/src/backend/services/plan-progress-service.js +134 -0
  215. package/src/backend/services/plan-review-service.js +262 -0
  216. package/src/backend/services/plan-service.js +682 -0
  217. package/src/backend/services/plan-status.js +113 -0
  218. package/src/backend/services/plan-template-publish-service.js +217 -0
  219. package/src/backend/services/plan-templates-service.js +242 -0
  220. package/src/backend/services/plan-templates.js +1164 -0
  221. package/src/backend/services/planned-overlap-actions.js +200 -0
  222. package/src/backend/services/plans-home.js +224 -0
  223. package/src/backend/services/play-forward.js +256 -0
  224. package/src/backend/services/playback-service.js +117 -0
  225. package/src/backend/services/power-service.js +167 -0
  226. package/src/backend/services/power-signals.js +81 -0
  227. package/src/backend/services/pr-draft-service.js +142 -0
  228. package/src/backend/services/presence-service.js +122 -0
  229. package/src/backend/services/pricing.js +60 -0
  230. package/src/backend/services/project-config-service.js +474 -0
  231. package/src/backend/services/project-scanner.js +184 -0
  232. package/src/backend/services/projection-service.js +69 -0
  233. package/src/backend/services/push-notification-service.js +288 -0
  234. package/src/backend/services/recent-projects-service.js +204 -0
  235. package/src/backend/services/record-chain.js +162 -0
  236. package/src/backend/services/recurrence-rule.js +63 -0
  237. package/src/backend/services/recurring-agent.js +89 -0
  238. package/src/backend/services/recurring-scheduler.js +77 -0
  239. package/src/backend/services/recurring-service.js +276 -0
  240. package/src/backend/services/reference-service.js +169 -0
  241. package/src/backend/services/release-public-key.js +30 -0
  242. package/src/backend/services/release-signature.js +64 -0
  243. package/src/backend/services/remote-audio-service.js +224 -0
  244. package/src/backend/services/remote-interaction-service.js +275 -0
  245. package/src/backend/services/remote-terminal-service.js +324 -0
  246. package/src/backend/services/rendition/child/main.js +76 -0
  247. package/src/backend/services/rendition/engine-host.js +249 -0
  248. package/src/backend/services/rendition/engine-lock.js +39 -0
  249. package/src/backend/services/rendition/engine-lock.json +14 -0
  250. package/src/backend/services/rendition/engine-manifest.js +97 -0
  251. package/src/backend/services/rendition/network-proof.js +73 -0
  252. package/src/backend/services/rendition/rendition-service.js +175 -0
  253. package/src/backend/services/replay-frames.js +387 -0
  254. package/src/backend/services/replay-state.js +201 -0
  255. package/src/backend/services/resolvers/base.js +108 -0
  256. package/src/backend/services/resolvers/csharp.js +109 -0
  257. package/src/backend/services/resolvers/go.js +105 -0
  258. package/src/backend/services/resolvers/index.js +60 -0
  259. package/src/backend/services/resolvers/java.js +63 -0
  260. package/src/backend/services/resolvers/kotlin.js +109 -0
  261. package/src/backend/services/resolvers/php.js +89 -0
  262. package/src/backend/services/resolvers/python.js +154 -0
  263. package/src/backend/services/resolvers/ruby.js +103 -0
  264. package/src/backend/services/resolvers/rust.js +77 -0
  265. package/src/backend/services/resolvers/swift.js +98 -0
  266. package/src/backend/services/resolvers/typescript.js +71 -0
  267. package/src/backend/services/retention.js +54 -0
  268. package/src/backend/services/review-architecture.js +236 -0
  269. package/src/backend/services/review-attest.js +68 -0
  270. package/src/backend/services/review-bundle.js +226 -0
  271. package/src/backend/services/review-graduation.js +93 -0
  272. package/src/backend/services/review-host/bitbucket.js +79 -0
  273. package/src/backend/services/review-host/detect.js +80 -0
  274. package/src/backend/services/review-host/github.js +97 -0
  275. package/src/backend/services/review-host/gitlab.js +77 -0
  276. package/src/backend/services/review-host/host-state.js +103 -0
  277. package/src/backend/services/review-host/http.js +58 -0
  278. package/src/backend/services/review-host/switch.js +120 -0
  279. package/src/backend/services/review-marks.js +72 -0
  280. package/src/backend/services/review-notes.js +169 -0
  281. package/src/backend/services/review-other-work.js +90 -0
  282. package/src/backend/services/review-queue-service.js +147 -0
  283. package/src/backend/services/review-risk.js +127 -0
  284. package/src/backend/services/review-task.js +121 -0
  285. package/src/backend/services/rule-approvals.js +268 -0
  286. package/src/backend/services/rule-baseline.js +134 -0
  287. package/src/backend/services/rule-changes.js +162 -0
  288. package/src/backend/services/rule-preview.js +47 -0
  289. package/src/backend/services/rule-proposals.js +104 -0
  290. package/src/backend/services/rule-scope.js +76 -0
  291. package/src/backend/services/rulebook.js +286 -0
  292. package/src/backend/services/rules-at.js +56 -0
  293. package/src/backend/services/rules-overview.js +88 -0
  294. package/src/backend/services/schema-reconciler.js +250 -0
  295. package/src/backend/services/secret-store.js +119 -0
  296. package/src/backend/services/section-workstreams.js +95 -0
  297. package/src/backend/services/self-write-tracker.js +75 -0
  298. package/src/backend/services/sensor-bridge-service.js +285 -0
  299. package/src/backend/services/session-service.js +192 -0
  300. package/src/backend/services/settings-service.js +324 -0
  301. package/src/backend/services/signal-breakpoints.js +172 -0
  302. package/src/backend/services/signed-approval-record.js +86 -0
  303. package/src/backend/services/signed-approvals.js +244 -0
  304. package/src/backend/services/signoff-pack.js +328 -0
  305. package/src/backend/services/signoff-rows.js +114 -0
  306. package/src/backend/services/skill-arrival-service.js +138 -0
  307. package/src/backend/services/skill-model.js +193 -0
  308. package/src/backend/services/skill-use-service.js +140 -0
  309. package/src/backend/services/skills-service.js +150 -0
  310. package/src/backend/services/snapshot-compare-service.js +397 -0
  311. package/src/backend/services/source-control.js +189 -0
  312. package/src/backend/services/spec-links-service.js +123 -0
  313. package/src/backend/services/spec-proposal-withdraw.js +50 -0
  314. package/src/backend/services/spec-proposals-service.js +470 -0
  315. package/src/backend/services/sql/embedded.js +95 -0
  316. package/src/backend/services/sql/index.js +63 -0
  317. package/src/backend/services/sql/refs.js +357 -0
  318. package/src/backend/services/sql/schema.js +312 -0
  319. package/src/backend/services/sql/tokenizer.js +195 -0
  320. package/src/backend/services/stack-overlaps.js +117 -0
  321. package/src/backend/services/stack-service.js +225 -0
  322. package/src/backend/services/state-sync-service.js +384 -0
  323. package/src/backend/services/stuck-sensor-service.js +200 -0
  324. package/src/backend/services/system-discovery.js +481 -0
  325. package/src/backend/services/system-docs-service.js +701 -0
  326. package/src/backend/services/task-attachments-service.js +340 -0
  327. package/src/backend/services/task-grounding.js +60 -0
  328. package/src/backend/services/task-records/check-run-record.js +146 -0
  329. package/src/backend/services/task-records/check-runs.js +115 -0
  330. package/src/backend/services/task-records/heads.js +88 -0
  331. package/src/backend/services/task-records/material-reads.js +225 -0
  332. package/src/backend/services/task-records/read-record.js +100 -0
  333. package/src/backend/services/task-records/record.js +173 -0
  334. package/src/backend/services/task-records/run-record.js +136 -0
  335. package/src/backend/services/task-records/shared-state.js +548 -0
  336. package/src/backend/services/task-records/signing.js +140 -0
  337. package/src/backend/services/task-records/split-signals.js +52 -0
  338. package/src/backend/services/task-records/test-runs.js +164 -0
  339. package/src/backend/services/task-records/trust.js +243 -0
  340. package/src/backend/services/task-rules.js +81 -0
  341. package/src/backend/services/task-workstreams.js +90 -0
  342. package/src/backend/services/terminal-history-service.js +266 -0
  343. package/src/backend/services/terminal-service.js +267 -0
  344. package/src/backend/services/test-clock.js +53 -0
  345. package/src/backend/services/tests/grounding.js +266 -0
  346. package/src/backend/services/tests/junit.js +104 -0
  347. package/src/backend/services/tests/teammate-runs.js +134 -0
  348. package/src/backend/services/tests/test-results.js +234 -0
  349. package/src/backend/services/tree-watcher.js +204 -0
  350. package/src/backend/services/trellis-service.js +204 -0
  351. package/src/backend/services/trusted-roots.js +186 -0
  352. package/src/backend/services/update-download-service.js +342 -0
  353. package/src/backend/services/update-service.js +266 -0
  354. package/src/backend/services/watch-ignore.js +76 -0
  355. package/src/backend/services/webhook-egress.js +206 -0
  356. package/src/backend/services/webrtc-service.js +413 -0
  357. package/src/backend/services/work-changes.js +59 -0
  358. package/src/backend/services/workstream-binding.js +82 -0
  359. package/src/backend/services/workstream-commits.js +116 -0
  360. package/src/backend/services/workstream-imports.js +177 -0
  361. package/src/backend/services/workstream-service.js +335 -0
  362. package/src/backend/services/workstream-symbols.js +223 -0
  363. package/src/backend/services/workstream-watch-service.js +391 -0
  364. package/src/backend/services/worktree-service.js +235 -0
  365. package/src/cli/agent.js +100 -0
  366. package/src/cli/args.js +201 -0
  367. package/src/cli/conformity.js +106 -0
  368. package/src/cli/desktop.js +91 -0
  369. package/src/cli/main.js +409 -0
  370. package/src/cli/pipeline.js +109 -0
  371. package/src/cli/plan-verbs.js +259 -0
  372. package/src/cli/review-adapters.js +218 -0
  373. package/src/cli/review-output.js +93 -0
  374. package/src/cli/review-post.js +89 -0
  375. package/src/cli/review-sink.js +183 -0
  376. package/src/cli/review-skill.js +44 -0
  377. package/src/cli/review-verify.js +104 -0
  378. package/src/cli/review.js +386 -0
  379. package/src/cli/sarif.js +148 -0
  380. package/src/cli/verbs.js +359 -0
  381. package/src/shared/build-info.js +39 -0
  382. package/src/shared/lib/agent-review.js +199 -0
  383. package/src/shared/lib/agent-turns.js +140 -0
  384. package/src/shared/lib/awareness-digest.js +120 -0
  385. package/src/shared/lib/branch-name.js +45 -0
  386. package/src/shared/lib/breakpoint-words.js +118 -0
  387. package/src/shared/lib/budget-words.js +56 -0
  388. package/src/shared/lib/burst.js +69 -0
  389. package/src/shared/lib/call-entry.js +105 -0
  390. package/src/shared/lib/check-compare.js +42 -0
  391. package/src/shared/lib/check-words.js +216 -0
  392. package/src/shared/lib/csv.js +62 -0
  393. package/src/shared/lib/folder-entry.js +87 -0
  394. package/src/shared/lib/freeze-words.js +60 -0
  395. package/src/shared/lib/fuzzy.js +84 -0
  396. package/src/shared/lib/git-state-words.js +80 -0
  397. package/src/shared/lib/grep-entry.js +86 -0
  398. package/src/shared/lib/grounding-line.js +61 -0
  399. package/src/shared/lib/import-line.js +71 -0
  400. package/src/shared/lib/item-status.js +249 -0
  401. package/src/shared/lib/line-changes.js +53 -0
  402. package/src/shared/lib/locator.js +71 -0
  403. package/src/shared/lib/matcher.js +120 -0
  404. package/src/shared/lib/merge-order.js +65 -0
  405. package/src/shared/lib/open-findings.js +68 -0
  406. package/src/shared/lib/other-work.js +108 -0
  407. package/src/shared/lib/package-entry.js +142 -0
  408. package/src/shared/lib/plan-vocab.js +40 -0
  409. package/src/shared/lib/pptx-xml.js +86 -0
  410. package/src/shared/lib/proposal-words.js +61 -0
  411. package/src/shared/lib/recurrence.js +183 -0
  412. package/src/shared/lib/references.js +72 -0
  413. package/src/shared/lib/rule-pattern.js +56 -0
  414. package/src/shared/lib/sdp-fingerprint.js +115 -0
  415. package/src/shared/lib/sdp-minimal.js +123 -0
  416. package/src/shared/lib/secret-paths.js +34 -0
  417. package/src/shared/lib/signal-words.js +172 -0
  418. package/src/shared/lib/signoff.js +56 -0
  419. package/src/shared/lib/skills-note.js +60 -0
  420. package/src/shared/lib/spec-sections.js +78 -0
  421. package/src/shared/lib/symbol-entry.js +60 -0
  422. package/src/shared/lib/tool-phrasing.js +338 -0
  423. package/src/shared/lib/turn-gap.js +27 -0
  424. package/src/shared/lib/workstream-words.js +38 -0
  425. package/src/shared/lib/xlsx-xml.js +144 -0
  426. package/src/shared/lib/zip-reader.js +99 -0
  427. package/src/shared/types/agent.js +27 -0
  428. package/src/shared/types/architecture-rules.js +30 -0
  429. package/src/shared/types/ast.js +15 -0
  430. package/src/shared/types/breakpoint.js +33 -0
  431. package/src/shared/types/channel.js +41 -0
  432. package/src/shared/types/criteria.js +15 -0
  433. package/src/shared/types/graph.js +15 -0
  434. package/src/shared/types/index.js +53 -0
  435. package/src/shared/types/peer.js +36 -0
  436. package/src/shared/types/pipeline.js +15 -0
  437. package/src/shared/types/plan.js +15 -0
  438. package/src/shared/types/play-forward.js +15 -0
  439. package/src/shared/types/power.js +15 -0
  440. package/src/shared/types/presence.js +15 -0
  441. package/src/shared/types/project-config.js +35 -0
  442. package/src/shared/types/project.js +15 -0
  443. package/src/shared/types/record.js +15 -0
  444. package/src/shared/types/recurring.js +15 -0
  445. package/src/shared/types/review.js +15 -0
  446. package/src/shared/types/settings.js +114 -0
  447. package/src/shared/types/stack.js +15 -0
  448. package/src/shared/types/system-doc.js +15 -0
  449. package/src/shared/types/system.js +15 -0
@@ -0,0 +1,413 @@
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 webrtc_service_exports = {};
19
+ __export(webrtc_service_exports, {
20
+ broadcastToAllPeers: () => broadcastToAllPeers,
21
+ connectWithAnswer: () => connectWithAnswer,
22
+ connectedPeerCount: () => connectedPeerCount,
23
+ createAnswer: () => createAnswer,
24
+ createOffer: () => createOffer,
25
+ discardPendingOffer: () => discardPendingOffer,
26
+ disconnectAllPeers: () => disconnectAllPeers,
27
+ disconnectPeer: () => disconnectPeer,
28
+ getPeerConnection: () => getPeerConnection,
29
+ getPeerConnections: () => getPeerConnections,
30
+ onChannelMessage: () => onChannelMessage,
31
+ onConnectionStateChange: () => onConnectionStateChange,
32
+ sendToPeer: () => sendToPeer
33
+ });
34
+ module.exports = __toCommonJS(webrtc_service_exports);
35
+ var import_werift = require("werift");
36
+ var import_node_crypto = require("node:crypto");
37
+ var import_types = require("../../shared/types");
38
+ const DEFAULT_STUN_SERVERS = [
39
+ "stun:stun.l.google.com:19302",
40
+ "stun:stun1.l.google.com:19302"
41
+ ];
42
+ const HEARTBEAT_INTERVAL_MS = 1e4;
43
+ const MAX_MISSED_HEARTBEATS = 3;
44
+ const STALE_PEER_MS = 4 * HEARTBEAT_INTERVAL_MS;
45
+ const ICE_GATHERING_TIMEOUT_MS = 1e4;
46
+ const peers = /* @__PURE__ */ new Map();
47
+ const connectionListeners = /* @__PURE__ */ new Set();
48
+ const messageListeners = /* @__PURE__ */ new Map();
49
+ let pendingOfferPc = null;
50
+ async function discardPendingOffer() {
51
+ if (pendingOfferPc) {
52
+ try {
53
+ await pendingOfferPc.close();
54
+ } catch {
55
+ }
56
+ pendingOfferPc = null;
57
+ }
58
+ }
59
+ async function createOffer() {
60
+ await discardPendingOffer();
61
+ const pc = new import_werift.RTCPeerConnection({
62
+ iceServers: DEFAULT_STUN_SERVERS.map((url) => ({ urls: url }))
63
+ });
64
+ pc.createDataChannel("_init");
65
+ const offer = await pc.createOffer();
66
+ await pc.setLocalDescription(offer);
67
+ const candidates = await gatherIceCandidates(pc);
68
+ const finalOfferSdp = pc.localDescription?.sdp ?? offer.sdp;
69
+ const fingerprint = extractFingerprint(pc);
70
+ pendingOfferPc = pc;
71
+ return {
72
+ offer: finalOfferSdp,
73
+ iceCandidates: candidates,
74
+ fingerprint
75
+ };
76
+ }
77
+ async function connectWithAnswer(offerSdp, answerSdp, peerIceCandidates, peerFingerprint, alias, deviceType) {
78
+ let pc;
79
+ let reusingPending = false;
80
+ if (pendingOfferPc) {
81
+ pc = pendingOfferPc;
82
+ pendingOfferPc = null;
83
+ reusingPending = true;
84
+ console.log("[WebRTC] Reusing pending offer PC (same DTLS certificate)");
85
+ } else {
86
+ console.warn("[WebRTC] No pending offer PC \u2014 creating fresh connection (fingerprint may differ)");
87
+ pc = new import_werift.RTCPeerConnection({
88
+ iceServers: DEFAULT_STUN_SERVERS.map((url) => ({ urls: url }))
89
+ });
90
+ }
91
+ const entry = {
92
+ fingerprint: peerFingerprint,
93
+ alias,
94
+ deviceType,
95
+ pc,
96
+ channels: /* @__PURE__ */ new Map(),
97
+ state: "connecting",
98
+ connectedAt: null,
99
+ lastHeartbeat: Date.now(),
100
+ missedHeartbeats: 0,
101
+ heartbeatTimer: null
102
+ };
103
+ peers.set(peerFingerprint, entry);
104
+ emitConnectionState(peerFingerprint, "connecting");
105
+ for (const channelName of Object.values(import_types.DATA_CHANNELS)) {
106
+ createChannel(entry, channelName);
107
+ }
108
+ if (!reusingPending) {
109
+ await pc.setLocalDescription(
110
+ new import_werift.RTCSessionDescription(offerSdp, "offer")
111
+ );
112
+ }
113
+ await pc.setRemoteDescription(
114
+ new import_werift.RTCSessionDescription(answerSdp, "answer")
115
+ );
116
+ if (peerIceCandidates.length > 0) {
117
+ console.log(`[WebRTC] Adding ${peerIceCandidates.length} remote ICE candidates`);
118
+ for (const candidateJson of peerIceCandidates) {
119
+ try {
120
+ const candidate = typeof candidateJson === "string" ? JSON.parse(candidateJson) : candidateJson;
121
+ if (candidate.candidate) {
122
+ await pc.addIceCandidate(candidate);
123
+ }
124
+ } catch (err) {
125
+ console.warn("[WebRTC] Failed to add remote ICE candidate:", err);
126
+ }
127
+ }
128
+ }
129
+ pc.connectionStateChange.subscribe((state) => {
130
+ handleConnectionStateChange(entry, state);
131
+ });
132
+ startHeartbeat(entry);
133
+ return entry;
134
+ }
135
+ async function createAnswer(offerSdp, _offerIceCandidates) {
136
+ const pc = new import_werift.RTCPeerConnection({
137
+ iceServers: DEFAULT_STUN_SERVERS.map((url) => ({ urls: url }))
138
+ });
139
+ await pc.setRemoteDescription(
140
+ new import_werift.RTCSessionDescription(offerSdp, "offer")
141
+ );
142
+ const answer = await pc.createAnswer();
143
+ await pc.setLocalDescription(answer);
144
+ const candidates = await gatherIceCandidates(pc);
145
+ const fingerprint = extractFingerprint(pc);
146
+ await pc.close();
147
+ return {
148
+ answer: answer.sdp,
149
+ iceCandidates: candidates,
150
+ fingerprint
151
+ };
152
+ }
153
+ function sendToPeer(fingerprint, channelName, data) {
154
+ const entry = peers.get(fingerprint);
155
+ if (!entry || entry.state !== "connected") {
156
+ if (channelName === "ui") {
157
+ console.warn(`[WebRTC] sendToPeer(ui): peer ${fingerprint.slice(0, 12)}\u2026 not found or not connected (entry=${!!entry}, state=${entry?.state})`);
158
+ }
159
+ return false;
160
+ }
161
+ const wrapper = entry.channels.get(channelName);
162
+ if (!wrapper) {
163
+ if (channelName === "ui") {
164
+ console.warn(`[WebRTC] sendToPeer(ui): no channel wrapper for ${channelName}`);
165
+ }
166
+ return false;
167
+ }
168
+ if (wrapper.channel.readyState !== "open") {
169
+ console.warn(`[WebRTC] Channel ${channelName} not open (state=${wrapper.channel.readyState}) for ${fingerprint.slice(0, 12)}\u2026`);
170
+ return false;
171
+ }
172
+ try {
173
+ if (typeof data === "string") {
174
+ wrapper.channel.send(Buffer.from(data, "utf-8"));
175
+ } else {
176
+ wrapper.channel.send(data);
177
+ }
178
+ return true;
179
+ } catch (err) {
180
+ console.warn(`[WebRTC] Failed to send on ${channelName} to ${fingerprint.slice(0, 12)}:`, err);
181
+ return false;
182
+ }
183
+ }
184
+ function broadcastToAllPeers(channelName, data) {
185
+ let sent = 0;
186
+ for (const [fp] of peers) {
187
+ if (sendToPeer(fp, channelName, data)) sent++;
188
+ }
189
+ return sent;
190
+ }
191
+ function onChannelMessage(channelName, cb) {
192
+ let set = messageListeners.get(channelName);
193
+ if (!set) {
194
+ set = /* @__PURE__ */ new Set();
195
+ messageListeners.set(channelName, set);
196
+ }
197
+ set.add(cb);
198
+ return () => {
199
+ set.delete(cb);
200
+ };
201
+ }
202
+ function onConnectionStateChange(cb) {
203
+ connectionListeners.add(cb);
204
+ return () => {
205
+ connectionListeners.delete(cb);
206
+ };
207
+ }
208
+ function getPeerConnections() {
209
+ return Array.from(peers.values()).map((entry) => {
210
+ const channelStates = {};
211
+ for (const [name, wrapper] of entry.channels) {
212
+ channelStates[name] = wrapper.channel.readyState;
213
+ }
214
+ return {
215
+ fingerprint: entry.fingerprint,
216
+ alias: entry.alias,
217
+ state: entry.state,
218
+ deviceType: entry.deviceType,
219
+ connectedAt: entry.connectedAt?.toISOString() ?? null,
220
+ latencyMs: null,
221
+ openChannels: Array.from(entry.channels.keys()),
222
+ channelStates
223
+ };
224
+ });
225
+ }
226
+ function getPeerConnection(fingerprint) {
227
+ const entry = peers.get(fingerprint);
228
+ if (!entry) return void 0;
229
+ return {
230
+ fingerprint: entry.fingerprint,
231
+ alias: entry.alias,
232
+ state: entry.state,
233
+ deviceType: entry.deviceType,
234
+ connectedAt: entry.connectedAt?.toISOString() ?? null,
235
+ latencyMs: null,
236
+ openChannels: Array.from(entry.channels.keys())
237
+ };
238
+ }
239
+ async function disconnectPeer(fingerprint) {
240
+ const entry = peers.get(fingerprint);
241
+ if (!entry) return;
242
+ stopHeartbeat(entry);
243
+ try {
244
+ await entry.pc.close();
245
+ } catch {
246
+ }
247
+ entry.state = "disconnected";
248
+ emitConnectionState(fingerprint, "disconnected");
249
+ peers.delete(fingerprint);
250
+ console.log(`[WebRTC] Disconnected peer: ${entry.alias} (${fingerprint.slice(0, 12)}\u2026)`);
251
+ }
252
+ async function disconnectAllPeers() {
253
+ const fingerprints = Array.from(peers.keys());
254
+ await Promise.all(fingerprints.map((fp) => disconnectPeer(fp)));
255
+ }
256
+ function connectedPeerCount() {
257
+ let count = 0;
258
+ for (const entry of peers.values()) {
259
+ if (entry.state === "connected") count++;
260
+ }
261
+ return count;
262
+ }
263
+ function createChannel(entry, name) {
264
+ const channel = entry.pc.createDataChannel(name, {
265
+ ordered: true
266
+ });
267
+ const wrapper = {
268
+ name,
269
+ channel,
270
+ onMessage: /* @__PURE__ */ new Set()
271
+ };
272
+ channel.onMessage.subscribe((data) => {
273
+ entry.lastHeartbeat = Date.now();
274
+ entry.missedHeartbeats = 0;
275
+ const listeners = messageListeners.get(name);
276
+ if (listeners) {
277
+ for (const cb of listeners) {
278
+ try {
279
+ cb(entry.fingerprint, data);
280
+ } catch {
281
+ }
282
+ }
283
+ }
284
+ for (const cb of wrapper.onMessage) {
285
+ try {
286
+ cb(data);
287
+ } catch {
288
+ }
289
+ }
290
+ });
291
+ channel.stateChanged.subscribe((state) => {
292
+ if (state === "open") {
293
+ console.log(`[WebRTC] Channel ${name} opened for ${entry.alias}`);
294
+ emitConnectionState(entry.fingerprint, "connected");
295
+ }
296
+ });
297
+ entry.channels.set(name, wrapper);
298
+ }
299
+ function handleConnectionStateChange(entry, state) {
300
+ const prevState = entry.state;
301
+ const prevConnectedAt = entry.connectedAt;
302
+ const fp = entry.fingerprint.slice(0, 12);
303
+ const heldFor = prevConnectedAt && prevState === "connected" ? Math.round((Date.now() - prevConnectedAt.getTime()) / 1e3) : null;
304
+ const heldStr = heldFor !== null ? ` heldFor=${heldFor}s` : "";
305
+ switch (state) {
306
+ case "connected":
307
+ entry.state = "connected";
308
+ entry.connectedAt = /* @__PURE__ */ new Date();
309
+ console.log(`[WebRTC][Lifecycle] connected peer=${entry.alias} (${fp}\u2026) prev=${prevState}`);
310
+ break;
311
+ case "disconnected":
312
+ case "closed":
313
+ entry.state = "disconnected";
314
+ stopHeartbeat(entry);
315
+ console.log(`[WebRTC][Lifecycle] disconnected peer=${entry.alias} (${fp}\u2026) prev=${prevState}${heldStr} missedHeartbeats=${entry.missedHeartbeats} ice=${state}`);
316
+ break;
317
+ case "failed":
318
+ entry.state = "failed";
319
+ stopHeartbeat(entry);
320
+ console.log(`[WebRTC][Lifecycle] failed peer=${entry.alias} (${fp}\u2026) prev=${prevState}${heldStr} missedHeartbeats=${entry.missedHeartbeats}`);
321
+ break;
322
+ }
323
+ emitConnectionState(entry.fingerprint, entry.state);
324
+ }
325
+ function startHeartbeat(entry) {
326
+ stopHeartbeat(entry);
327
+ entry.heartbeatTimer = setInterval(() => {
328
+ if (entry.state !== "connected" && entry.state !== "connecting") {
329
+ stopHeartbeat(entry);
330
+ return;
331
+ }
332
+ if (Date.now() - entry.lastHeartbeat > STALE_PEER_MS) {
333
+ console.warn(`[WebRTC] ${entry.alias}: no inbound for ${Math.round(STALE_PEER_MS / 1e3)}s \u2014 reaping dead peer`);
334
+ void disconnectPeer(entry.fingerprint);
335
+ return;
336
+ }
337
+ const pingId = (0, import_node_crypto.randomBytes)(4).toString("hex");
338
+ const sent = sendToPeer(
339
+ entry.fingerprint,
340
+ import_types.DATA_CHANNELS.CONTROL,
341
+ JSON.stringify({ type: "ping", id: pingId, ts: Date.now() })
342
+ );
343
+ if (!sent) {
344
+ entry.missedHeartbeats++;
345
+ }
346
+ if (entry.missedHeartbeats >= MAX_MISSED_HEARTBEATS) {
347
+ console.warn(`[WebRTC] ${entry.alias}: ${MAX_MISSED_HEARTBEATS} heartbeats missed \u2014 connection presumed dead`);
348
+ void disconnectPeer(entry.fingerprint);
349
+ }
350
+ }, HEARTBEAT_INTERVAL_MS);
351
+ }
352
+ function stopHeartbeat(entry) {
353
+ if (entry.heartbeatTimer) {
354
+ clearInterval(entry.heartbeatTimer);
355
+ entry.heartbeatTimer = null;
356
+ }
357
+ }
358
+ function emitConnectionState(fingerprint, state) {
359
+ for (const cb of connectionListeners) {
360
+ try {
361
+ cb(fingerprint, state);
362
+ } catch {
363
+ }
364
+ }
365
+ }
366
+ async function gatherIceCandidates(pc) {
367
+ const candidates = [];
368
+ return new Promise((resolve) => {
369
+ const timeout = setTimeout(() => {
370
+ resolve(candidates);
371
+ }, ICE_GATHERING_TIMEOUT_MS);
372
+ pc.onIceCandidate.subscribe((candidate) => {
373
+ if (candidate) {
374
+ candidates.push(JSON.stringify(candidate));
375
+ }
376
+ });
377
+ const checkComplete = () => {
378
+ if (pc.iceGatheringState === "complete") {
379
+ clearTimeout(timeout);
380
+ resolve(candidates);
381
+ }
382
+ };
383
+ const interval = setInterval(checkComplete, 100);
384
+ setTimeout(() => clearInterval(interval), ICE_GATHERING_TIMEOUT_MS);
385
+ });
386
+ }
387
+ function extractFingerprint(pc) {
388
+ try {
389
+ const desc = pc.localDescription;
390
+ if (desc?.sdp) {
391
+ const match = desc.sdp.match(/a=fingerprint:sha-256\s+([0-9A-Fa-f:]+)/);
392
+ if (match) return match[1];
393
+ }
394
+ } catch {
395
+ }
396
+ return (0, import_node_crypto.randomBytes)(32).toString("hex").replace(/(.{2})/g, "$1:").slice(0, -1).toUpperCase();
397
+ }
398
+ // Annotate the CommonJS export names for ESM import in node:
399
+ 0 && (module.exports = {
400
+ broadcastToAllPeers,
401
+ connectWithAnswer,
402
+ connectedPeerCount,
403
+ createAnswer,
404
+ createOffer,
405
+ discardPendingOffer,
406
+ disconnectAllPeers,
407
+ disconnectPeer,
408
+ getPeerConnection,
409
+ getPeerConnections,
410
+ onChannelMessage,
411
+ onConnectionStateChange,
412
+ sendToPeer
413
+ });
@@ -0,0 +1,59 @@
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 work_changes_exports = {};
19
+ __export(work_changes_exports, {
20
+ baseRef: () => baseRef,
21
+ changedFiles: () => changedFiles
22
+ });
23
+ module.exports = __toCommonJS(work_changes_exports);
24
+ var import_node_child_process = require("node:child_process");
25
+ const git = (root, args) => {
26
+ try {
27
+ return (0, import_node_child_process.execFileSync)("git", ["-C", root, ...args], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
28
+ } catch {
29
+ return null;
30
+ }
31
+ };
32
+ const lines = (s) => (s ?? "").split("\n").map((x) => x.trim()).filter(Boolean);
33
+ function baseRef(root, given, env) {
34
+ const exists = (ref) => git(root, ["rev-parse", "--verify", "--quiet", `${ref}^{commit}`]) !== null;
35
+ if (given) return exists(given) ? given : null;
36
+ if (env.GITHUB_BASE_REF && exists(`origin/${env.GITHUB_BASE_REF}`)) return `origin/${env.GITHUB_BASE_REF}`;
37
+ const head = git(root, ["symbolic-ref", "--quiet", "--short", "refs/remotes/origin/HEAD"])?.trim();
38
+ if (head && exists(head)) return head;
39
+ for (const ref of ["origin/main", "origin/master"]) if (exists(ref)) return ref;
40
+ return null;
41
+ }
42
+ function changedFiles(root, given, env) {
43
+ if (given && baseRef(root, given, env) === null) throw new Error(`${given} is not a commit in this repository (a shallow clone? use fetch-depth: 0)`);
44
+ const base = baseRef(root, given, env);
45
+ const since = base ? git(root, ["merge-base", base, "HEAD"])?.trim() || null : null;
46
+ const out = /* @__PURE__ */ new Set([
47
+ ...since ? lines(git(root, ["diff", "--name-only", since, "HEAD"])) : [],
48
+ ...lines(git(root, ["diff", "--name-only", "HEAD"])),
49
+ ...lines(git(root, ["ls-files", "--others", "--exclude-standard"]))
50
+ ]);
51
+ const files = [...out].filter((f) => !f.startsWith(".codetrellis/")).sort();
52
+ const rulebook = [...out].some((f) => f.startsWith(".codetrellis/rules/") || f === ".codetrellis/config.json" || f === ".codetrellis/pipeline.yaml");
53
+ return { base, since, files, rulebook };
54
+ }
55
+ // Annotate the CommonJS export names for ESM import in node:
56
+ 0 && (module.exports = {
57
+ baseRef,
58
+ changedFiles
59
+ });
@@ -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 workstream_binding_exports = {};
29
+ __export(workstream_binding_exports, {
30
+ candidateWorkstreamRoots: () => candidateWorkstreamRoots,
31
+ firstWorkstreamRoot: () => firstWorkstreamRoot,
32
+ matchWorkstreamRoot: () => matchWorkstreamRoot
33
+ });
34
+ module.exports = __toCommonJS(workstream_binding_exports);
35
+ var import_node_fs = __toESM(require("node:fs"));
36
+ var import_node_path = __toESM(require("node:path"));
37
+ var import_trusted_roots = require("./trusted-roots");
38
+ var import_worktree_service = require("./worktree-service");
39
+ function matchWorkstreamRoot(reported, candidates, realpath = import_node_fs.default.realpathSync.native) {
40
+ if (typeof reported !== "string" || !reported || reported.includes("\0") || !import_node_path.default.isAbsolute(reported)) return null;
41
+ let target;
42
+ try {
43
+ target = realpath(reported);
44
+ } catch {
45
+ return null;
46
+ }
47
+ let best = null;
48
+ for (const listed of candidates) {
49
+ let canonical;
50
+ try {
51
+ canonical = realpath(listed);
52
+ } catch {
53
+ continue;
54
+ }
55
+ const inside = target === canonical || target.startsWith(canonical.endsWith(import_node_path.default.sep) ? canonical : canonical + import_node_path.default.sep);
56
+ if (inside && (!best || canonical.length > best.canonical.length)) best = { listed, canonical };
57
+ }
58
+ return best?.listed ?? null;
59
+ }
60
+ function candidateWorkstreamRoots() {
61
+ const roots = /* @__PURE__ */ new Set();
62
+ for (const root of (0, import_trusted_roots.listTrustedRoots)()) {
63
+ roots.add(root);
64
+ for (const w of (0, import_worktree_service.listWorktrees)(root)) {
65
+ if (!w.bare && !w.prunable) roots.add(w.path);
66
+ }
67
+ }
68
+ return [...roots];
69
+ }
70
+ function firstWorkstreamRoot(reported, candidates = candidateWorkstreamRoots()) {
71
+ for (const r of reported) {
72
+ const hit = matchWorkstreamRoot(r, candidates);
73
+ if (hit) return hit;
74
+ }
75
+ return null;
76
+ }
77
+ // Annotate the CommonJS export names for ESM import in node:
78
+ 0 && (module.exports = {
79
+ candidateWorkstreamRoots,
80
+ firstWorkstreamRoot,
81
+ matchWorkstreamRoot
82
+ });
@@ -0,0 +1,116 @@
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 workstream_commits_exports = {};
19
+ __export(workstream_commits_exports, {
20
+ MAX_COMMITS: () => MAX_COMMITS,
21
+ commitsByWorkstream: () => commitsByWorkstream,
22
+ commitsOf: () => commitsOf,
23
+ forgetKeptCommits: () => forgetKeptCommits,
24
+ parseCommits: () => parseCommits
25
+ });
26
+ module.exports = __toCommonJS(workstream_commits_exports);
27
+ var import_node_child_process = require("node:child_process");
28
+ var import_git_safety = require("./git-safety");
29
+ const MAX_COMMITS = 50;
30
+ const SHA = /^[0-9a-f]{40}$/;
31
+ const RS = "";
32
+ const US = "";
33
+ const FORMAT = `--format=%H${US}%P${US}%cI${US}%aN${US}%s${US}%b${RS}`;
34
+ function git(folder, args) {
35
+ try {
36
+ return (0, import_node_child_process.execFileSync)("git", ["-C", folder, ...args], {
37
+ encoding: "utf-8",
38
+ stdio: ["ignore", "pipe", "ignore"],
39
+ timeout: 5e3,
40
+ maxBuffer: 4 * 1024 * 1024
41
+ });
42
+ } catch {
43
+ return null;
44
+ }
45
+ }
46
+ function parseCommits(raw) {
47
+ return raw.split(RS).map((r) => r.replace(/^\n+/, "")).filter(Boolean).flatMap((record) => {
48
+ const [sha, parents, at, author, subject, body = ""] = record.split(US);
49
+ if (!sha || !SHA.test(sha.trim())) return [];
50
+ const agent = body.match(/^agent:\s*(\S+)/m)?.[1] ?? null;
51
+ return [{
52
+ sha: sha.trim(),
53
+ at: Date.parse(at),
54
+ author: author ?? "",
55
+ subject: subject ?? "",
56
+ merge: (parents ?? "").trim().split(/\s+/).filter(Boolean).length > 1,
57
+ agent
58
+ }];
59
+ });
60
+ }
61
+ function commitsOf(w, mainPath, sinceMs) {
62
+ const since = `--since=@${Math.floor(sinceMs / 1e3)}`;
63
+ const common = [since, `--max-count=${MAX_COMMITS}`, FORMAT];
64
+ let raw;
65
+ if (w.main) {
66
+ raw = git(w.root, ["log", "HEAD", ...common]);
67
+ } else if (w.root.startsWith("branch:")) {
68
+ const head = w.head && SHA.test(w.head) ? w.head : null;
69
+ const base = w.changes?.base && SHA.test(w.changes.base) ? w.changes.base : null;
70
+ if (!head) {
71
+ if (!w.ref || !(0, import_git_safety.isSafeGitRef)(w.ref)) return [];
72
+ raw = git(mainPath, ["log", w.ref, ...common]);
73
+ } else {
74
+ raw = git(mainPath, ["log", base ? `${base}..${head}` : head, ...common]);
75
+ }
76
+ } else {
77
+ const base = w.changes?.base && SHA.test(w.changes.base) ? w.changes.base : null;
78
+ raw = git(w.root, ["log", base ? `${base}..HEAD` : "HEAD", ...common]);
79
+ }
80
+ return raw ? parseCommits(raw) : [];
81
+ }
82
+ const KEEP_MS = 6e4;
83
+ const kept = /* @__PURE__ */ new Map();
84
+ function keyOf(w) {
85
+ const head = w.head && SHA.test(w.head) ? w.head : null;
86
+ return head ? `${w.root}\0${head}\0${w.changes?.base ?? ""}` : null;
87
+ }
88
+ function commitsByWorkstream(workstreams, sinceMs, now = Date.now()) {
89
+ const main = workstreams.find((w) => w.main);
90
+ const out = {};
91
+ if (!main) return out;
92
+ for (const w of workstreams) {
93
+ const key = keyOf(w);
94
+ const hit = key ? kept.get(key) : void 0;
95
+ if (hit && now - hit.at < KEEP_MS && hit.sinceMs <= sinceMs) {
96
+ out[w.root] = hit.commits.filter((c) => c.at >= sinceMs);
97
+ continue;
98
+ }
99
+ const commits = commitsOf(w, main.root, sinceMs);
100
+ if (key) kept.set(key, { at: now, sinceMs, commits });
101
+ out[w.root] = commits;
102
+ }
103
+ if (kept.size > 500) kept.clear();
104
+ return out;
105
+ }
106
+ function forgetKeptCommits() {
107
+ kept.clear();
108
+ }
109
+ // Annotate the CommonJS export names for ESM import in node:
110
+ 0 && (module.exports = {
111
+ MAX_COMMITS,
112
+ commitsByWorkstream,
113
+ commitsOf,
114
+ forgetKeptCommits,
115
+ parseCommits
116
+ });