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,256 @@
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 play_forward_exports = {};
29
+ __export(play_forward_exports, {
30
+ buildPlayForward: () => buildPlayForward,
31
+ decisionsFor: () => decisionsFor,
32
+ playForwardOf: () => playForwardOf
33
+ });
34
+ module.exports = __toCommonJS(play_forward_exports);
35
+ var import_node_crypto = require("node:crypto");
36
+ var import_plan_dependencies = require("./plan-dependencies");
37
+ var import_stack_service = require("./stack-service");
38
+ var import_plan_item_service = require("./plan-item-service");
39
+ var import_database = require("./database");
40
+ var import_confined_fs = require("./confined-fs");
41
+ var import_node_fs = __toESM(require("node:fs"));
42
+ var import_node_path = __toESM(require("node:path"));
43
+ const plural = (n, one, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;
44
+ function list(names) {
45
+ if (names.length <= 1) return names.join("");
46
+ return `${names.slice(0, -1).join(", ")} and ${names[names.length - 1]}`;
47
+ }
48
+ const idOf = (kind, subject, plans) => (0, import_node_crypto.createHash)("sha256").update(`${kind}\0${subject}\0${[...plans].sort().join("\0")}`).digest("hex").slice(0, 16);
49
+ function sequencing(plans, itemOf) {
50
+ const waits = (a, b) => a.tasks.some((t) => (itemOf(t.uid)?.dependencies ?? []).some((d) => b.tasks.some((o) => o.uid === d)));
51
+ let all = true;
52
+ let words = null;
53
+ for (let i = 0; i < plans.length; i++) {
54
+ for (let j = i + 1; j < plans.length; j++) {
55
+ const ab = waits(plans[i], plans[j]);
56
+ const ba = waits(plans[j], plans[i]);
57
+ if (!ab && !ba) all = false;
58
+ else if (plans.length === 2) words = ab ? `${plans[i].label} waits on ${plans[j].label}` : `${plans[j].label} waits on ${plans[i].label}`;
59
+ }
60
+ }
61
+ return { sequenced: all, words: all ? words ?? "each waits on another" : null };
62
+ }
63
+ function playForwardOf(project, plans, existingFiles, materialsOf) {
64
+ const items = /* @__PURE__ */ new Map();
65
+ for (const p of plans) for (const i of p.items) items.set(i.uid, i);
66
+ const itemOf = (uid) => items.get(uid);
67
+ const files = /* @__PURE__ */ new Map();
68
+ const touch = (path2, by, change) => {
69
+ const f = files.get(path2) ?? { path: path2, change: "modify", by: [] };
70
+ if (!f.by.some((b) => b.taskUid === by.taskUid && b.change === change)) f.by.push({ ...by, change });
71
+ files.set(path2, f);
72
+ };
73
+ const newEdges = /* @__PURE__ */ new Map();
74
+ const removedEdges = /* @__PURE__ */ new Map();
75
+ const symbols = /* @__PURE__ */ new Map();
76
+ const summary = [];
77
+ for (const plan of plans) {
78
+ const ahead = plan.items.filter((i) => i.kind === "action" && !(0, import_plan_dependencies.isSettled)(i));
79
+ summary.push({ uid: plan.uid, label: plan.label, ahead: ahead.length });
80
+ for (const item of ahead) {
81
+ const by = { planUid: plan.uid, planLabel: plan.label, taskUid: item.uid, taskTitle: item.title };
82
+ for (const spec of item.fileSpecs ?? []) {
83
+ if (spec.isDir || !spec.path) continue;
84
+ if (spec.action === "move") {
85
+ touch(spec.path, by, "move");
86
+ if (spec.moveTo) touch(spec.moveTo, by, "create");
87
+ } else {
88
+ touch(spec.path, by, spec.action ?? "modify");
89
+ }
90
+ }
91
+ for (const s of item.symbolSpecs ?? []) {
92
+ if (!s.name) continue;
93
+ const key = s.filePath ? `${s.filePath}#${s.name}` : s.name;
94
+ const entry = symbols.get(key) ?? { name: s.name, file: s.filePath ?? null, by: /* @__PURE__ */ new Map() };
95
+ entry.by.set(plan.uid, [...entry.by.get(plan.uid) ?? [], by]);
96
+ symbols.set(key, entry);
97
+ if (s.filePath) touch(s.filePath, by, "modify");
98
+ }
99
+ for (const c of item.newConnections ?? []) newEdges.set(`${c.from}\0${c.to}`, { from: c.from, to: c.to, taskUid: item.uid });
100
+ for (const c of item.removedConnections ?? []) removedEdges.set(`${c.from}\0${c.to}`, { from: c.from, to: c.to, taskUid: item.uid });
101
+ }
102
+ }
103
+ const projection = { ghostFiles: [], modifiedFiles: [], removedFiles: [], newEdges: [...newEdges.values()], removedEdges: [...removedEdges.values()] };
104
+ for (const f of files.values()) {
105
+ const first = f.by[0];
106
+ if (f.by.some((b) => b.change === "delete" || b.change === "move")) {
107
+ f.change = "delete";
108
+ projection.removedFiles.push({ path: f.path, taskUid: first.taskUid });
109
+ } else if (f.by.some((b) => b.change === "create") || !existingFiles.has(f.path)) {
110
+ f.change = "create";
111
+ projection.ghostFiles.push({ path: f.path, taskUid: first.taskUid, taskDescription: first.taskTitle });
112
+ } else {
113
+ projection.modifiedFiles.push({ path: f.path, taskUid: first.taskUid });
114
+ }
115
+ }
116
+ const overlaps = [];
117
+ const plansOf = (by) => {
118
+ const out = /* @__PURE__ */ new Map();
119
+ for (const b of by) {
120
+ const p = out.get(b.planUid) ?? { uid: b.planUid, label: b.planLabel, tasks: [] };
121
+ if (!p.tasks.some((t) => t.uid === b.taskUid)) p.tasks.push({ uid: b.taskUid, title: b.taskTitle, change: b.change ?? null });
122
+ out.set(b.planUid, p);
123
+ }
124
+ return [...out.values()];
125
+ };
126
+ const finish = (o, words2) => {
127
+ const seq = sequencing(o.plans, itemOf);
128
+ return {
129
+ ...o,
130
+ id: idOf(o.kind, o.subject, o.plans.map((p) => p.uid)),
131
+ decisions: [],
132
+ left: false,
133
+ sequenced: seq.sequenced,
134
+ words: `\u25C7 planned overlap: ${words2}${seq.words ? ` \xB7 sequenced: ${seq.words}` : ""}`
135
+ };
136
+ };
137
+ const both = (n2) => n2 === 2 ? "both" : "all";
138
+ const symbolFiles = /* @__PURE__ */ new Set();
139
+ for (const [key, s] of symbols) {
140
+ if (s.by.size < 2) continue;
141
+ const plansHere = plansOf([...s.by.values()].flat());
142
+ const where = s.file ? ` in ${s.file}` : "";
143
+ if (s.file) symbolFiles.add(`${s.file}\0${plansHere.map((p) => p.uid).sort().join("\0")}`);
144
+ overlaps.push(finish(
145
+ { kind: "symbol", subject: key, file: s.file, plans: plansHere, serious: true },
146
+ `${list(plansHere.map((p) => p.label))} ${both(plansHere.length)} plan to change ${s.name}${where}`
147
+ ));
148
+ }
149
+ for (const f of files.values()) {
150
+ const plansHere = plansOf(f.by);
151
+ if (plansHere.length < 2) continue;
152
+ if (symbolFiles.has(`${f.path}\0${plansHere.map((p) => p.uid).sort().join("\0")}`)) continue;
153
+ const removers = plansHere.filter((p) => p.tasks.some((t) => t.change === "delete" || t.change === "move"));
154
+ const others = plansHere.filter((p) => !removers.includes(p));
155
+ let words2;
156
+ let serious = false;
157
+ if (removers.length && others.length) {
158
+ serious = true;
159
+ const verb = removers[0].tasks.some((t) => t.change === "delete") ? "delete" : "move";
160
+ words2 = `${list(removers.map((p) => p.label))} ${removers.length === 1 ? "plans" : "plan"} to ${verb} ${f.path}, which ${list(others.map((p) => p.label))} ${others.length === 1 ? "plans" : "plan"} to change`;
161
+ } else {
162
+ words2 = `${list(plansHere.map((p) => p.label))} ${both(plansHere.length)} plan to ${f.change === "create" ? "create" : "change"} ${f.path}`;
163
+ }
164
+ overlaps.push(finish({ kind: "file", subject: f.path, file: f.path, plans: plansHere, serious }, words2));
165
+ }
166
+ const briefItems = plans.flatMap((p) => p.items.some((i) => i.kind === "action" && !(0, import_plan_dependencies.isSettled)(i)) ? p.items.filter((i) => i.kind === "object" || i.kind === "action" && !(0, import_plan_dependencies.isSettled)(i)).map((i) => i.uid) : []);
167
+ const declared = materialsOf(briefItems);
168
+ const material = /* @__PURE__ */ new Map();
169
+ const planOfItem = /* @__PURE__ */ new Map();
170
+ for (const p of plans) for (const i of p.items) planOfItem.set(i.uid, p);
171
+ const inBrief = new Set(briefItems);
172
+ for (const [itemUid, paths] of declared) {
173
+ if (!inBrief.has(itemUid)) continue;
174
+ const plan = planOfItem.get(itemUid);
175
+ const item = itemOf(itemUid);
176
+ if (!plan || !item) continue;
177
+ for (const path2 of paths) {
178
+ material.set(path2, [...material.get(path2) ?? [], { planUid: plan.uid, planLabel: plan.label, taskUid: item.uid, taskTitle: item.title, change: null }]);
179
+ }
180
+ }
181
+ for (const [path2, by] of material) {
182
+ const plansHere = plansOf(by);
183
+ if (plansHere.length < 2) continue;
184
+ overlaps.push(finish(
185
+ { kind: "material", subject: path2, file: null, plans: plansHere, serious: false },
186
+ `${list(plansHere.map((p) => p.label))} ${both(plansHere.length)} rely on ${path2}`
187
+ ));
188
+ }
189
+ overlaps.sort((a, b) => Number(b.serious) - Number(a.serious) || Number(a.sequenced) - Number(b.sequenced) || a.subject.localeCompare(b.subject));
190
+ const fileList = [...files.values()].sort((a, b) => a.path.localeCompare(b.path));
191
+ const n = (c) => fileList.filter((f) => f.change === c).length;
192
+ const open = overlaps.filter((o) => !o.sequenced).length;
193
+ const parts = [
194
+ n("modify") ? `${plural(n("modify"), "file")} to change` : null,
195
+ n("create") ? `${n("create")} to create` : null,
196
+ n("delete") ? `${n("delete")} to remove` : null
197
+ ].filter(Boolean);
198
+ const words = plans.length === 0 ? "No active plans: nothing is planned." : fileList.length === 0 && overlaps.length === 0 ? `Planned by ${plural(plans.length, "active plan")} \xB7 none of their tasks name a file or a material yet` : [
199
+ `Planned by ${plural(plans.length, "active plan")}`,
200
+ parts.length ? parts.join(", ") : null,
201
+ overlaps.length ? `${plural(overlaps.length, "planned overlap")}${open < overlaps.length ? ` (${overlaps.length - open} sequenced)` : ""}` : "no planned overlaps"
202
+ ].filter(Boolean).join(" \xB7 ");
203
+ return { project, plans: summary, files: fileList, projection, overlaps, words };
204
+ }
205
+ function decisionsFor(projectRoot) {
206
+ const out = /* @__PURE__ */ new Map();
207
+ for (const r of (0, import_database.getDb)().exec(
208
+ "SELECT overlap_id, action, words, by_name, by_type, at FROM planned_overlap_decisions WHERE project_root = ? ORDER BY at, id",
209
+ [projectRoot]
210
+ )[0]?.values ?? []) {
211
+ const id = String(r[0]);
212
+ out.set(id, [...out.get(id) ?? [], { action: r[1], words: String(r[2]), by: String(r[3]), byType: String(r[4]), at: Number(r[5]) }]);
213
+ }
214
+ return out;
215
+ }
216
+ function materialsFromDb(itemUids) {
217
+ const out = /* @__PURE__ */ new Map();
218
+ if (!itemUids.length) return out;
219
+ const res = (0, import_database.getDb)().exec(
220
+ `SELECT target_uid, value FROM attachments WHERE role = 'material' AND target_uid IN (${itemUids.map(() => "?").join(",")})`,
221
+ [...itemUids]
222
+ );
223
+ for (const [uid, value] of res[0]?.values ?? []) out.set(String(uid), [.../* @__PURE__ */ new Set([...out.get(String(uid)) ?? [], String(value)])]);
224
+ return out;
225
+ }
226
+ function existingOf(projectPath, paths) {
227
+ const out = /* @__PURE__ */ new Set();
228
+ for (const rel of paths) {
229
+ try {
230
+ if (import_node_fs.default.lstatSync((0, import_confined_fs.resolveWithin)(projectPath, import_node_path.default.join(projectPath, rel), "planned file")).isFile()) out.add(rel);
231
+ } catch {
232
+ }
233
+ }
234
+ return out;
235
+ }
236
+ function buildPlayForward(projectPath) {
237
+ const stack = (0, import_stack_service.buildStack)(projectPath);
238
+ const plans = stack.plans.map((p) => ({ uid: p.uid, label: p.label, items: (0, import_plan_item_service.listAllItems)(p.uid) }));
239
+ const planned = plans.flatMap((p) => p.items.flatMap((i) => [
240
+ ...(i.fileSpecs ?? []).flatMap((f) => [f.path, f.moveTo]),
241
+ ...(i.symbolSpecs ?? []).map((s) => s.filePath)
242
+ ])).filter((x) => !!x);
243
+ const forward = playForwardOf(projectPath, plans, existingOf(projectPath, new Set(planned)), materialsFromDb);
244
+ const decided = decisionsFor(projectPath);
245
+ for (const o of forward.overlaps) {
246
+ o.decisions = decided.get(o.id) ?? [];
247
+ o.left = o.decisions[o.decisions.length - 1]?.action === "leave";
248
+ }
249
+ return forward;
250
+ }
251
+ // Annotate the CommonJS export names for ESM import in node:
252
+ 0 && (module.exports = {
253
+ buildPlayForward,
254
+ decisionsFor,
255
+ playForwardOf
256
+ });
@@ -0,0 +1,117 @@
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 playback_service_exports = {};
19
+ __export(playback_service_exports, {
20
+ buildPlaybackSequence: () => buildPlaybackSequence
21
+ });
22
+ module.exports = __toCommonJS(playback_service_exports);
23
+ var import_node_child_process = require("node:child_process");
24
+ var import_snapshot_compare_service = require("./snapshot-compare-service");
25
+ var import_diff_engine = require("./diff-engine");
26
+ const MAX_FILES_PER_FRAME = 200;
27
+ function commitTimes(projectPath, limit) {
28
+ const times = /* @__PURE__ */ new Map();
29
+ try {
30
+ const out = (0, import_node_child_process.execFileSync)("git", ["log", `-${limit}`, "--format=%h %ct"], {
31
+ cwd: projectPath,
32
+ encoding: "utf-8"
33
+ });
34
+ for (const line of out.split("\n")) {
35
+ const [sha, ts] = line.split(" ");
36
+ if (sha && ts) times.set(`commit:${sha}`, Number(ts) * 1e3);
37
+ }
38
+ } catch {
39
+ }
40
+ return times;
41
+ }
42
+ function buildPlaybackSequence(params) {
43
+ const limit = Math.min(Math.max(params.limit ?? 20, 2), 100);
44
+ const notes = [];
45
+ const comparands = (0, import_snapshot_compare_service.listComparands)(params.projectPath, limit);
46
+ const times = commitTimes(params.projectPath, limit);
47
+ const points = comparands.filter((c) => {
48
+ if (c.kind === "commit") return true;
49
+ if (c.kind === "checkpoint") return params.includeCheckpoints !== false;
50
+ return false;
51
+ }).map((c) => ({ ...c, timestamp: times.get(c.spec) ?? c.timestamp ?? null }));
52
+ points.sort((a, b) => (a.timestamp ?? 0) - (b.timestamp ?? 0));
53
+ const commits = points.filter((p) => p.kind === "commit");
54
+ const keptCommits = new Set(commits.slice(-limit).map((p) => p.spec));
55
+ const kept = points.filter((p) => p.kind !== "commit" || keptCommits.has(p.spec));
56
+ if (commits.length > keptCommits.size) {
57
+ notes.push(
58
+ `Showing the ${keptCommits.size} most recent commits of ${commits.length}; raise \`limit\` for more.`
59
+ );
60
+ }
61
+ const ordered = [...kept, { spec: "live", label: "Live (working tree)", kind: "live", timestamp: null }];
62
+ const frames = [];
63
+ let previous = null;
64
+ for (const point of ordered) {
65
+ const resolved = (0, import_snapshot_compare_service.resolveComparand)(point.spec, params.projectPath);
66
+ if (!resolved) {
67
+ notes.push(`Skipped ${point.spec}: could not be resolved.`);
68
+ continue;
69
+ }
70
+ let delta = null;
71
+ let changedFiles = [];
72
+ let truncated = false;
73
+ if (previous) {
74
+ const diff = (0, import_diff_engine.diffSnapshots)(previous.snapshot, resolved.snapshot);
75
+ const edgesComparable = previous.edgesKnown && resolved.edgesKnown;
76
+ delta = {
77
+ added: diff.addedFiles.length,
78
+ removed: diff.removedFiles.length,
79
+ modified: diff.modifiedFiles.length,
80
+ // Null rather than zero: a commit whose edges could not be built
81
+ // (too many files differ to parse) contributes none, and
82
+ // reporting "0 edges changed" for a comparison that never looked
83
+ // at edges would read as a finding rather than an absence.
84
+ edgesAdded: edgesComparable ? diff.addedEdges.length : null,
85
+ edgesRemoved: edgesComparable ? diff.removedEdges.length : null
86
+ };
87
+ const all = [...diff.addedFiles, ...diff.modifiedFiles, ...diff.removedFiles];
88
+ truncated = all.length > MAX_FILES_PER_FRAME;
89
+ changedFiles = all.slice(0, MAX_FILES_PER_FRAME);
90
+ }
91
+ frames.push({
92
+ spec: point.spec,
93
+ label: resolved.label,
94
+ kind: point.kind,
95
+ timestamp: point.timestamp,
96
+ delta,
97
+ changedFiles,
98
+ truncated
99
+ });
100
+ previous = resolved;
101
+ }
102
+ if (frames.length < 2) {
103
+ notes.push(
104
+ "Not enough history to play back. A repository needs at least two points \u2014 commits or checkpoints \u2014 before there is anything to scrub through."
105
+ );
106
+ }
107
+ if (frames.some((f) => f.delta?.edgesAdded === null)) {
108
+ notes.push(
109
+ "Edge counts are omitted for some commit frames: too many files differ from the working tree at those commits to parse for their dependencies."
110
+ );
111
+ }
112
+ return { frames, notes };
113
+ }
114
+ // Annotate the CommonJS export names for ESM import in node:
115
+ 0 && (module.exports = {
116
+ buildPlaybackSequence
117
+ });
@@ -0,0 +1,167 @@
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 power_service_exports = {};
19
+ __export(power_service_exports, {
20
+ evaluatePower: () => evaluatePower,
21
+ getCurrentPowerStatus: () => getCurrentPowerStatus,
22
+ notifyPowerSettingsChanged: () => notifyPowerSettingsChanged,
23
+ onPowerStatusChange: () => onPowerStatusChange,
24
+ setAcState: () => setAcState,
25
+ setAgentActive: () => setAgentActive,
26
+ setMobileConnected: () => setMobileConnected,
27
+ startPowerService: () => startPowerService,
28
+ stopPowerService: () => stopPowerService
29
+ });
30
+ module.exports = __toCommonJS(power_service_exports);
31
+ var import_settings_service = require("./settings-service");
32
+ const DEBOUNCE_MS = 5e3;
33
+ let mobileConnected = false;
34
+ let agentActive = false;
35
+ let acState = "unknown";
36
+ const listeners = /* @__PURE__ */ new Set();
37
+ let lastEmitted = null;
38
+ let pendingEval = null;
39
+ function detectPlatform() {
40
+ if (!process.versions.electron) return "web";
41
+ switch (process.platform) {
42
+ case "darwin":
43
+ return "darwin";
44
+ case "win32":
45
+ return "win32";
46
+ case "linux":
47
+ return "linux";
48
+ default:
49
+ return "web";
50
+ }
51
+ }
52
+ const PLATFORM = detectPlatform();
53
+ function evaluatePower(inputs) {
54
+ const { settings, mobileConnected: mob, agentActive: agt, ac, platform } = inputs;
55
+ let reason = null;
56
+ if (settings.triggers.always) {
57
+ reason = "always";
58
+ } else if (settings.triggers.whileMobileConnected && mob) {
59
+ reason = "mobile-connected";
60
+ } else if (settings.triggers.whileAgentActive && agt) {
61
+ reason = "agent-active";
62
+ }
63
+ let shouldBlock = reason !== null;
64
+ if (shouldBlock && settings.onlyWhenOnAC && ac === "battery") {
65
+ shouldBlock = false;
66
+ reason = null;
67
+ }
68
+ return {
69
+ shouldBlock,
70
+ reason,
71
+ ac,
72
+ platform,
73
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
74
+ };
75
+ }
76
+ function evaluate() {
77
+ return evaluatePower({
78
+ settings: (0, import_settings_service.getSettings)().power,
79
+ mobileConnected,
80
+ agentActive,
81
+ ac: acState,
82
+ platform: PLATFORM
83
+ });
84
+ }
85
+ function statusEqual(a, b) {
86
+ if (!a) return false;
87
+ return a.shouldBlock === b.shouldBlock && a.reason === b.reason && a.ac === b.ac && a.platform === b.platform;
88
+ }
89
+ function emit(status) {
90
+ lastEmitted = status;
91
+ for (const cb of listeners) {
92
+ try {
93
+ cb(status);
94
+ } catch (err) {
95
+ console.warn("[Power] subscriber error:", err);
96
+ }
97
+ }
98
+ }
99
+ function scheduleEvaluate() {
100
+ if (pendingEval) clearTimeout(pendingEval);
101
+ pendingEval = setTimeout(() => {
102
+ pendingEval = null;
103
+ const next = evaluate();
104
+ if (!statusEqual(lastEmitted, next)) {
105
+ emit(next);
106
+ }
107
+ }, DEBOUNCE_MS);
108
+ }
109
+ function setMobileConnected(value) {
110
+ if (mobileConnected === value) return;
111
+ mobileConnected = value;
112
+ scheduleEvaluate();
113
+ }
114
+ function setAgentActive(value) {
115
+ if (agentActive === value) return;
116
+ agentActive = value;
117
+ scheduleEvaluate();
118
+ }
119
+ function setAcState(value) {
120
+ if (acState === value) return;
121
+ acState = value;
122
+ scheduleEvaluate();
123
+ }
124
+ function notifyPowerSettingsChanged() {
125
+ scheduleEvaluate();
126
+ }
127
+ function getCurrentPowerStatus() {
128
+ return lastEmitted ?? evaluate();
129
+ }
130
+ function onPowerStatusChange(cb) {
131
+ listeners.add(cb);
132
+ if (lastEmitted) {
133
+ try {
134
+ cb(lastEmitted);
135
+ } catch (err) {
136
+ console.warn("[Power] subscriber error:", err);
137
+ }
138
+ }
139
+ return () => {
140
+ listeners.delete(cb);
141
+ };
142
+ }
143
+ function startPowerService() {
144
+ if (lastEmitted) return;
145
+ const initial = evaluate();
146
+ emit(initial);
147
+ }
148
+ function stopPowerService() {
149
+ if (pendingEval) {
150
+ clearTimeout(pendingEval);
151
+ pendingEval = null;
152
+ }
153
+ listeners.clear();
154
+ lastEmitted = null;
155
+ }
156
+ // Annotate the CommonJS export names for ESM import in node:
157
+ 0 && (module.exports = {
158
+ evaluatePower,
159
+ getCurrentPowerStatus,
160
+ notifyPowerSettingsChanged,
161
+ onPowerStatusChange,
162
+ setAcState,
163
+ setAgentActive,
164
+ setMobileConnected,
165
+ startPowerService,
166
+ stopPowerService
167
+ });
@@ -0,0 +1,81 @@
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 power_signals_exports = {};
19
+ __export(power_signals_exports, {
20
+ startPowerSignals: () => startPowerSignals,
21
+ stopPowerSignals: () => stopPowerSignals
22
+ });
23
+ module.exports = __toCommonJS(power_signals_exports);
24
+ var import_webrtc_service = require("./webrtc-service");
25
+ var import_power_service = require("./power-service");
26
+ var import_server = require("../server");
27
+ const AGENT_ACTIVE_WINDOW_MS = 5 * 60 * 1e3;
28
+ let teardowns = [];
29
+ let running = false;
30
+ function wireMobileConnected() {
31
+ const recompute = () => {
32
+ (0, import_power_service.setMobileConnected)((0, import_webrtc_service.connectedPeerCount)() > 0);
33
+ };
34
+ recompute();
35
+ return (0, import_webrtc_service.onConnectionStateChange)(() => recompute());
36
+ }
37
+ function wireAgentActive() {
38
+ let resetTimer = null;
39
+ const unsub = (0, import_server.addBroadcastTarget)(({ type, payload }) => {
40
+ if (type !== "agent-event") return;
41
+ const evt = payload;
42
+ if (!evt || evt.type !== "tool_call" && evt.type !== "tool_error") return;
43
+ (0, import_power_service.setAgentActive)(true);
44
+ if (resetTimer) clearTimeout(resetTimer);
45
+ resetTimer = setTimeout(() => {
46
+ (0, import_power_service.setAgentActive)(false);
47
+ resetTimer = null;
48
+ }, AGENT_ACTIVE_WINDOW_MS);
49
+ });
50
+ return () => {
51
+ unsub();
52
+ if (resetTimer) {
53
+ clearTimeout(resetTimer);
54
+ resetTimer = null;
55
+ }
56
+ (0, import_power_service.setAgentActive)(false);
57
+ };
58
+ }
59
+ function startPowerSignals() {
60
+ if (running) return;
61
+ running = true;
62
+ teardowns.push(wireMobileConnected());
63
+ teardowns.push(wireAgentActive());
64
+ }
65
+ function stopPowerSignals() {
66
+ if (!running) return;
67
+ running = false;
68
+ for (const fn of teardowns) {
69
+ try {
70
+ fn();
71
+ } catch (err) {
72
+ console.warn("[PowerSignals] teardown error:", err);
73
+ }
74
+ }
75
+ teardowns = [];
76
+ }
77
+ // Annotate the CommonJS export names for ESM import in node:
78
+ 0 && (module.exports = {
79
+ startPowerSignals,
80
+ stopPowerSignals
81
+ });