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,90 @@
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 plan_doc_guard_exports = {};
19
+ __export(plan_doc_guard_exports, {
20
+ DISK_TOOL: () => DISK_TOOL,
21
+ guardDiskEdit: () => guardDiskEdit,
22
+ settleDiskHold: () => settleDiskHold
23
+ });
24
+ module.exports = __toCommonJS(plan_doc_guard_exports);
25
+ var import_node_crypto = require("node:crypto");
26
+ var import_database = require("./database");
27
+ var import_persistence = require("./persistence");
28
+ var import_breakpoint_service = require("./breakpoint-service");
29
+ var import_agent_event_log = require("./agent-event-log");
30
+ var import_push_notification_service = require("./push-notification-service");
31
+ var import_plan_documents_service = require("./plan-documents-service");
32
+ const DISK_TOOL = "plan-file";
33
+ function waitingHold(docUid) {
34
+ return (0, import_breakpoint_service.rowsOf)(
35
+ `SELECT ref FROM breakpoint_hits WHERE item_uid = ? AND action = 'disk' AND answered_at IS NULL ORDER BY hit_at LIMIT 1`,
36
+ [docUid]
37
+ )[0]?.ref ?? null;
38
+ }
39
+ function guardDiskEdit(docUid, incoming, now = Date.now()) {
40
+ const doc = (0, import_plan_documents_service.getPlanDocument)(docUid);
41
+ if (!doc) return "pass";
42
+ const title = incoming.title ?? doc.title;
43
+ if (title === doc.title && incoming.body === doc.body) return "pass";
44
+ const bp = (0, import_breakpoint_service.docBreakpoint)(docUid);
45
+ if (!bp) return "pass";
46
+ const db = (0, import_database.getDb)();
47
+ const open = waitingHold(docUid);
48
+ if (open) {
49
+ db.run("UPDATE plan_doc_disk_holds SET title = ?, body = ?, updated_at = ? WHERE ref = ?", [title, incoming.body, now, open]);
50
+ (0, import_persistence.markDirty)();
51
+ return "held";
52
+ }
53
+ const ref = `bp-${(0, import_node_crypto.randomBytes)(5).toString("hex")}`;
54
+ db.run(
55
+ `INSERT INTO breakpoint_hits (ref, breakpoint_id, tool, action, item_uid, plan_uid, agent, session_id, workstream_root, hit_at)
56
+ VALUES (?, ?, ?, 'disk', ?, ?, NULL, NULL, NULL, ?)`,
57
+ [ref, bp.id, DISK_TOOL, docUid, doc.planUid, now]
58
+ );
59
+ db.run(
60
+ "INSERT INTO plan_doc_disk_holds (ref, doc_uid, title, body, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)",
61
+ [ref, docUid, title, incoming.body, now, now]
62
+ );
63
+ (0, import_persistence.markDirty)();
64
+ const hit = (0, import_breakpoint_service.getHit)(ref);
65
+ (0, import_agent_event_log.recordBreakpointEvent)("breakpoint_hit", { ...(0, import_breakpoint_service.hitPayload)(hit), breakpointId: bp.id, on: bp.target, onTitle: bp.targetTitle }, null);
66
+ void (0, import_push_notification_service.pushForBreakpoint)(hit).catch(() => {
67
+ });
68
+ return "held";
69
+ }
70
+ function settleDiskHold(hit) {
71
+ if (hit.action !== "disk" || hit.answeredAt === null) return null;
72
+ const held = (0, import_breakpoint_service.rowsOf)("SELECT title, body FROM plan_doc_disk_holds WHERE ref = ?", [hit.ref])[0];
73
+ (0, import_database.getDb)().run("DELETE FROM plan_doc_disk_holds WHERE ref = ?", [hit.ref]);
74
+ (0, import_persistence.markDirty)();
75
+ if (hit.decision === "stop" || !held) return "restore";
76
+ const doc = (0, import_plan_documents_service.updatePlanDocument)(hit.itemUid, {
77
+ title: held.title,
78
+ body: held.body,
79
+ changeSummary: "The file's version, applied from disk when a person continued at the breakpoint",
80
+ author: hit.answeredBy ?? void 0,
81
+ authorType: hit.answeredByType ?? void 0
82
+ });
83
+ return doc ? "applied" : "restore";
84
+ }
85
+ // Annotate the CommonJS export names for ESM import in node:
86
+ 0 && (module.exports = {
87
+ DISK_TOOL,
88
+ guardDiskEdit,
89
+ settleDiskHold
90
+ });
@@ -0,0 +1,275 @@
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 plan_documents_service_exports = {};
29
+ __export(plan_documents_service_exports, {
30
+ createPlanDocument: () => createPlanDocument,
31
+ deletePlanDocument: () => deletePlanDocument,
32
+ getPlanDocument: () => getPlanDocument,
33
+ getPlanDocumentByType: () => getPlanDocumentByType,
34
+ getPlanDocumentVersions: () => getPlanDocumentVersions,
35
+ listPlanDocumentSummaries: () => listPlanDocumentSummaries,
36
+ listPlanDocuments: () => listPlanDocuments,
37
+ searchPlanDocuments: () => searchPlanDocuments,
38
+ updatePlanDocument: () => updatePlanDocument
39
+ });
40
+ module.exports = __toCommonJS(plan_documents_service_exports);
41
+ var _lazy___plan_file_service = __toESM(require("./plan-file-service"));
42
+ var import_node_crypto = require("node:crypto");
43
+ var import_database = require("./database");
44
+ var import_persistence = require("./persistence");
45
+ var import_agent_event_log = require("./agent-event-log");
46
+ function notifyMutation(planUid) {
47
+ try {
48
+ const { scheduleWriteThrough } = _lazy___plan_file_service;
49
+ scheduleWriteThrough(planUid);
50
+ } catch {
51
+ }
52
+ }
53
+ function createPlanDocument(input) {
54
+ const db = (0, import_database.getDb)();
55
+ const uid = (0, import_node_crypto.randomUUID)();
56
+ const now = Date.now();
57
+ const authorType = input.authorType ?? "human";
58
+ const orderHint = input.orderHint ?? null;
59
+ const parentDocUid = input.parentDocUid ?? null;
60
+ db.run(
61
+ `INSERT INTO plan_documents (uid, plan_uid, doc_type, title, body, version, author, author_type, order_hint, parent_doc_uid, created_at, updated_at)
62
+ VALUES (?, ?, ?, ?, ?, 1, ?, ?, ?, ?, ?, ?)`,
63
+ [uid, input.planUid, input.docType, input.title, input.body, input.author, authorType, orderHint, parentDocUid, now, now]
64
+ );
65
+ db.run(
66
+ `INSERT INTO plan_document_versions (doc_uid, version, body, change_summary, author, author_type, created_at)
67
+ VALUES (?, 1, ?, 'Created', ?, ?, ?)`,
68
+ [uid, input.body, input.author, authorType, now]
69
+ );
70
+ (0, import_persistence.markDirty)();
71
+ notifyMutation(input.planUid);
72
+ return {
73
+ uid,
74
+ planUid: input.planUid,
75
+ docType: input.docType,
76
+ title: input.title,
77
+ body: input.body,
78
+ version: 1,
79
+ author: input.author,
80
+ authorType,
81
+ orderHint,
82
+ parentDocUid,
83
+ createdAt: now,
84
+ updatedAt: now
85
+ };
86
+ }
87
+ function getPlanDocument(docUid) {
88
+ const result = (0, import_database.getDb)().exec(
89
+ `SELECT uid, plan_uid, doc_type, title, body, version, author, author_type, order_hint, parent_doc_uid, created_at, updated_at
90
+ FROM plan_documents WHERE uid = ?`,
91
+ [docUid]
92
+ );
93
+ if (!result[0]?.values[0]) return null;
94
+ return rowToDoc(result[0].values[0]);
95
+ }
96
+ function getPlanDocumentByType(planUid, docType) {
97
+ const result = (0, import_database.getDb)().exec(
98
+ `SELECT uid, plan_uid, doc_type, title, body, version, author, author_type, order_hint, parent_doc_uid, created_at, updated_at
99
+ FROM plan_documents WHERE plan_uid = ? AND doc_type = ?
100
+ ORDER BY updated_at DESC LIMIT 1`,
101
+ [planUid, docType]
102
+ );
103
+ if (!result[0]?.values[0]) return null;
104
+ return rowToDoc(result[0].values[0]);
105
+ }
106
+ function listPlanDocuments(planUid) {
107
+ const result = (0, import_database.getDb)().exec(
108
+ `SELECT uid, plan_uid, doc_type, title, body, version, author, author_type, order_hint, parent_doc_uid, created_at, updated_at
109
+ FROM plan_documents WHERE plan_uid = ?
110
+ ORDER BY
111
+ CASE WHEN parent_doc_uid IS NULL THEN 0 ELSE 1 END,
112
+ COALESCE(order_hint, '~'),
113
+ doc_type,
114
+ updated_at DESC`,
115
+ [planUid]
116
+ );
117
+ if (!result[0]) return [];
118
+ return result[0].values.map(rowToDoc);
119
+ }
120
+ function listPlanDocumentSummaries(planUid) {
121
+ const result = (0, import_database.getDb)().exec(
122
+ `SELECT uid, doc_type, title, version, length(body), order_hint, parent_doc_uid, updated_at
123
+ FROM plan_documents WHERE plan_uid = ?
124
+ ORDER BY
125
+ CASE WHEN parent_doc_uid IS NULL THEN 0 ELSE 1 END,
126
+ COALESCE(order_hint, '~'),
127
+ doc_type,
128
+ updated_at DESC`,
129
+ [planUid]
130
+ );
131
+ if (!result[0]) return [];
132
+ return result[0].values.map((r) => ({
133
+ uid: r[0],
134
+ docType: r[1],
135
+ title: r[2],
136
+ version: r[3],
137
+ bodyLength: r[4] || 0,
138
+ orderHint: r[5] ?? null,
139
+ parentDocUid: r[6] ?? null,
140
+ updatedAt: r[7]
141
+ }));
142
+ }
143
+ function updatePlanDocument(docUid, updates) {
144
+ const db = (0, import_database.getDb)();
145
+ const existing = getPlanDocument(docUid);
146
+ if (!existing) return null;
147
+ const now = Date.now();
148
+ const sets = ["updated_at = ?"];
149
+ const params = [now];
150
+ const bodyChanged = updates.body !== void 0 && updates.body !== existing.body;
151
+ if (updates.title !== void 0) {
152
+ sets.push("title = ?");
153
+ params.push(updates.title);
154
+ }
155
+ if (updates.docType !== void 0) {
156
+ sets.push("doc_type = ?");
157
+ params.push(updates.docType);
158
+ }
159
+ if (updates.orderHint !== void 0) {
160
+ sets.push("order_hint = ?");
161
+ params.push(updates.orderHint);
162
+ }
163
+ if (updates.parentDocUid !== void 0) {
164
+ sets.push("parent_doc_uid = ?");
165
+ params.push(updates.parentDocUid);
166
+ }
167
+ if (bodyChanged) {
168
+ sets.push("body = ?");
169
+ params.push(updates.body);
170
+ sets.push("version = version + 1");
171
+ }
172
+ params.push(docUid);
173
+ db.run(`UPDATE plan_documents SET ${sets.join(", ")} WHERE uid = ?`, params);
174
+ if (bodyChanged) {
175
+ const author = updates.author ?? existing.author;
176
+ const authorType = updates.author !== void 0 ? updates.authorType ?? null : existing.authorType ?? null;
177
+ db.run(
178
+ `INSERT INTO plan_document_versions (doc_uid, version, body, change_summary, author, author_type, created_at)
179
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,
180
+ [docUid, existing.version + 1, updates.body, updates.changeSummary ?? "Updated", author, authorType, now]
181
+ );
182
+ (0, import_agent_event_log.recordBodyEdit)({
183
+ kind: "document",
184
+ planUid: existing.planUid,
185
+ uid: docUid,
186
+ title: updates.title ?? existing.title,
187
+ version: existing.version + 1,
188
+ author: updates.author !== void 0 ? updates.author ?? null : null,
189
+ // No author: the plan file was re-read from disk.
190
+ authorType: updates.author !== void 0 ? updates.authorType ?? null : "file",
191
+ changeSummary: updates.changeSummary ?? null
192
+ });
193
+ }
194
+ (0, import_persistence.markDirty)();
195
+ notifyMutation(existing.planUid);
196
+ return getPlanDocument(docUid);
197
+ }
198
+ function deletePlanDocument(docUid) {
199
+ const db = (0, import_database.getDb)();
200
+ const before = getPlanDocument(docUid);
201
+ db.run(`DELETE FROM plan_document_versions WHERE doc_uid = ?`, [docUid]);
202
+ db.run(`DELETE FROM plan_documents WHERE uid = ?`, [docUid]);
203
+ (0, import_persistence.markDirty)();
204
+ if (before) notifyMutation(before.planUid);
205
+ }
206
+ function searchPlanDocuments(planUid, query) {
207
+ if (!query.trim()) return [];
208
+ const result = (0, import_database.getDb)().exec(
209
+ `SELECT uid, plan_uid, doc_type, title, body, version, author, author_type, order_hint, parent_doc_uid, created_at, updated_at
210
+ FROM plan_documents
211
+ WHERE plan_uid = ? AND (title LIKE ? OR body LIKE ?)
212
+ ORDER BY updated_at DESC LIMIT 25`,
213
+ [planUid, `%${query}%`, `%${query}%`]
214
+ );
215
+ if (!result[0]) return [];
216
+ return result[0].values.map((r) => {
217
+ const doc = rowToDoc(r);
218
+ return { doc, excerpt: makeExcerpt(doc.body, query) };
219
+ });
220
+ }
221
+ function getPlanDocumentVersions(docUid) {
222
+ const result = (0, import_database.getDb)().exec(
223
+ `SELECT id, doc_uid, version, body, change_summary, author, created_at, author_type
224
+ FROM plan_document_versions WHERE doc_uid = ?
225
+ ORDER BY version DESC`,
226
+ [docUid]
227
+ );
228
+ if (!result[0]) return [];
229
+ return result[0].values.map((r) => ({
230
+ id: r[0],
231
+ docUid: r[1],
232
+ version: r[2],
233
+ body: r[3],
234
+ changeSummary: r[4] ?? null,
235
+ author: r[5],
236
+ createdAt: r[6],
237
+ authorType: r[7] ?? null
238
+ }));
239
+ }
240
+ function rowToDoc(r) {
241
+ return {
242
+ uid: r[0],
243
+ planUid: r[1],
244
+ docType: r[2],
245
+ title: r[3],
246
+ body: r[4],
247
+ version: r[5],
248
+ author: r[6],
249
+ authorType: r[7],
250
+ orderHint: r[8] ?? null,
251
+ parentDocUid: r[9] ?? null,
252
+ createdAt: r[10],
253
+ updatedAt: r[11]
254
+ };
255
+ }
256
+ function makeExcerpt(body, query, radius = 80) {
257
+ if (!body) return "";
258
+ const idx = body.toLowerCase().indexOf(query.toLowerCase());
259
+ if (idx === -1) return body.slice(0, radius * 2) + (body.length > radius * 2 ? "\u2026" : "");
260
+ const start = Math.max(0, idx - radius);
261
+ const end = Math.min(body.length, idx + query.length + radius);
262
+ return (start > 0 ? "\u2026" : "") + body.slice(start, end) + (end < body.length ? "\u2026" : "");
263
+ }
264
+ // Annotate the CommonJS export names for ESM import in node:
265
+ 0 && (module.exports = {
266
+ createPlanDocument,
267
+ deletePlanDocument,
268
+ getPlanDocument,
269
+ getPlanDocumentByType,
270
+ getPlanDocumentVersions,
271
+ listPlanDocumentSummaries,
272
+ listPlanDocuments,
273
+ searchPlanDocuments,
274
+ updatePlanDocument
275
+ });
@@ -0,0 +1,154 @@
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 plan_event_service_exports = {};
19
+ __export(plan_event_service_exports, {
20
+ appendPlanEvent: () => appendPlanEvent,
21
+ getNewestEventTimestamp: () => getNewestEventTimestamp,
22
+ listItemEvents: () => listItemEvents,
23
+ listPlanEvents: () => listPlanEvents,
24
+ setPlanEventListener: () => setPlanEventListener
25
+ });
26
+ module.exports = __toCommonJS(plan_event_service_exports);
27
+ var import_database = require("./database");
28
+ var import_persistence = require("./persistence");
29
+ let eventListener = null;
30
+ function setPlanEventListener(fn) {
31
+ eventListener = fn;
32
+ }
33
+ function appendPlanEvent(input) {
34
+ const db = (0, import_database.getDb)();
35
+ const now = input.createdAt ?? Date.now();
36
+ const beforeJson = input.beforeState !== void 0 ? JSON.stringify(input.beforeState) : null;
37
+ const afterJson = input.afterState !== void 0 ? JSON.stringify(input.afterState) : null;
38
+ db.run(
39
+ `INSERT INTO plan_events
40
+ (plan_uid, item_uid, event_type, before_state, after_state, summary, author, author_type, created_at)
41
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
42
+ [
43
+ input.planUid,
44
+ input.itemUid ?? null,
45
+ input.eventType,
46
+ beforeJson,
47
+ afterJson,
48
+ input.summary,
49
+ input.author,
50
+ input.authorType,
51
+ now
52
+ ]
53
+ );
54
+ const idResult = db.exec(`SELECT last_insert_rowid()`);
55
+ const id = idResult[0]?.values[0]?.[0] ?? -1;
56
+ (0, import_persistence.markDirty)();
57
+ const event = {
58
+ id,
59
+ planUid: input.planUid,
60
+ itemUid: input.itemUid ?? null,
61
+ eventType: input.eventType,
62
+ beforeState: input.beforeState,
63
+ afterState: input.afterState,
64
+ summary: input.summary,
65
+ author: input.author,
66
+ authorType: input.authorType,
67
+ createdAt: now
68
+ };
69
+ try {
70
+ eventListener?.(event);
71
+ } catch {
72
+ }
73
+ return event;
74
+ }
75
+ function listPlanEvents(planUid, options = {}) {
76
+ const db = (0, import_database.getDb)();
77
+ const params = [planUid];
78
+ let where = `plan_uid = ?`;
79
+ if (options.sinceMs !== void 0) {
80
+ where += ` AND created_at >= ?`;
81
+ params.push(options.sinceMs);
82
+ }
83
+ if (options.eventTypes && options.eventTypes.length > 0) {
84
+ where += ` AND event_type IN (${options.eventTypes.map(() => "?").join(", ")})`;
85
+ for (const t of options.eventTypes) params.push(t);
86
+ }
87
+ const limit = options.limit ?? 500;
88
+ const offset = options.offset ?? 0;
89
+ params.push(limit, offset);
90
+ const result = db.exec(
91
+ `SELECT id, plan_uid, item_uid, event_type, before_state, after_state, summary, author, author_type, created_at
92
+ FROM plan_events
93
+ WHERE ${where}
94
+ ORDER BY created_at DESC
95
+ LIMIT ? OFFSET ?`,
96
+ params
97
+ );
98
+ if (!result[0]) return [];
99
+ return result[0].values.map(rowToEvent);
100
+ }
101
+ function listItemEvents(itemUid, options = {}) {
102
+ const db = (0, import_database.getDb)();
103
+ const limit = options.limit ?? 200;
104
+ const offset = options.offset ?? 0;
105
+ const result = db.exec(
106
+ `SELECT id, plan_uid, item_uid, event_type, before_state, after_state, summary, author, author_type, created_at
107
+ FROM plan_events
108
+ WHERE item_uid = ?
109
+ ORDER BY created_at DESC
110
+ LIMIT ? OFFSET ?`,
111
+ [itemUid, limit, offset]
112
+ );
113
+ if (!result[0]) return [];
114
+ return result[0].values.map(rowToEvent);
115
+ }
116
+ function getNewestEventTimestamp(planUid) {
117
+ const db = (0, import_database.getDb)();
118
+ const result = db.exec(
119
+ `SELECT MAX(created_at) FROM plan_events WHERE plan_uid = ?`,
120
+ [planUid]
121
+ );
122
+ const v = result[0]?.values[0]?.[0];
123
+ return typeof v === "number" ? v : null;
124
+ }
125
+ function rowToEvent(r) {
126
+ return {
127
+ id: r[0],
128
+ planUid: r[1],
129
+ itemUid: r[2] ?? null,
130
+ eventType: r[3],
131
+ beforeState: parseJsonSafe(r[4]),
132
+ afterState: parseJsonSafe(r[5]),
133
+ summary: r[6],
134
+ author: r[7],
135
+ authorType: r[8],
136
+ createdAt: r[9]
137
+ };
138
+ }
139
+ function parseJsonSafe(s) {
140
+ if (!s) return void 0;
141
+ try {
142
+ return JSON.parse(s);
143
+ } catch {
144
+ return void 0;
145
+ }
146
+ }
147
+ // Annotate the CommonJS export names for ESM import in node:
148
+ 0 && (module.exports = {
149
+ appendPlanEvent,
150
+ getNewestEventTimestamp,
151
+ listItemEvents,
152
+ listPlanEvents,
153
+ setPlanEventListener
154
+ });
@@ -0,0 +1,106 @@
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 plan_file_refs_exports = {};
19
+ __export(plan_file_refs_exports, {
20
+ cleanRefs: () => cleanRefs,
21
+ importItemRefs: () => importItemRefs,
22
+ importPlanRefs: () => importPlanRefs,
23
+ refsForItem: () => refsForItem,
24
+ refsForPlan: () => refsForPlan
25
+ });
26
+ module.exports = __toCommonJS(plan_file_refs_exports);
27
+ var import_external_intake_service = require("./external-intake-service");
28
+ var import_external_refs_service = require("./external-refs-service");
29
+ const MAX_REFS = 50;
30
+ const KINDS = /* @__PURE__ */ new Set(["github_issue", "github_pr", "github_commit", "jira", "linear", "figma", "notion", "slack", "url"]);
31
+ const KEY = /^[A-Za-z0-9][A-Za-z0-9_.#/-]{0,99}$/;
32
+ const IMPORTED = { author: "file-import", authorType: "system" };
33
+ function cleanRefs(raw) {
34
+ if (!Array.isArray(raw)) return [];
35
+ const out = [];
36
+ for (const r of raw.slice(0, MAX_REFS)) {
37
+ if (!r || typeof r !== "object") continue;
38
+ const { url, key, kind, title } = r;
39
+ if (typeof url !== "string" || url.length > 2048) continue;
40
+ let parsed;
41
+ try {
42
+ parsed = new URL(url);
43
+ } catch {
44
+ continue;
45
+ }
46
+ if (parsed.protocol !== "https:" && parsed.protocol !== "http:") continue;
47
+ if (out.some((o) => (0, import_external_intake_service.sameUrl)(o.url, url))) continue;
48
+ out.push({
49
+ url,
50
+ key: typeof key === "string" && KEY.test(key) ? key : null,
51
+ kind: typeof kind === "string" && KINDS.has(kind) ? kind : (0, import_external_refs_service.inferKind)(url),
52
+ title: typeof title === "string" && title.trim() ? title.trim().slice(0, 200) : null
53
+ });
54
+ }
55
+ return out;
56
+ }
57
+ const fileRef = (r) => ({
58
+ url: r.url,
59
+ ...r.externalKey ? { key: r.externalKey } : {},
60
+ kind: r.kind,
61
+ ...r.title && r.title !== r.url && r.title !== r.externalKey ? { title: r.title } : {}
62
+ });
63
+ function refsForPlan(planUid) {
64
+ try {
65
+ return (0, import_external_intake_service.getPlanExternalRefs)(planUid).map(fileRef);
66
+ } catch {
67
+ return [];
68
+ }
69
+ }
70
+ function refsForItem(itemUid) {
71
+ try {
72
+ return (0, import_external_refs_service.getExternalRefs)(itemUid).map(fileRef);
73
+ } catch {
74
+ return [];
75
+ }
76
+ }
77
+ function importPlanRefs(planUid, raw) {
78
+ let n = 0;
79
+ for (const r of cleanRefs(raw)) {
80
+ (0, import_external_intake_service.setPlanExternalRef)({ planUid, url: r.url, key: r.key, kind: r.kind, ...r.title ? { title: r.title } : {}, ...IMPORTED });
81
+ n++;
82
+ }
83
+ return n;
84
+ }
85
+ function importItemRefs(itemUid, raw) {
86
+ const have = (0, import_external_refs_service.getExternalRefs)(itemUid);
87
+ let n = 0;
88
+ for (const r of cleanRefs(raw)) {
89
+ const existing = have.find((h) => (0, import_external_intake_service.sameUrl)(h.url, r.url));
90
+ if (existing) {
91
+ if (r.title && r.title !== existing.title) (0, import_external_refs_service.updateExternalRef)(existing.uid, { title: r.title });
92
+ continue;
93
+ }
94
+ (0, import_external_refs_service.createExternalRef)({ itemUid, url: r.url, kind: r.kind, externalKey: r.key, ...r.title ? { title: r.title } : {}, ...IMPORTED });
95
+ n++;
96
+ }
97
+ return n;
98
+ }
99
+ // Annotate the CommonJS export names for ESM import in node:
100
+ 0 && (module.exports = {
101
+ cleanRefs,
102
+ importItemRefs,
103
+ importPlanRefs,
104
+ refsForItem,
105
+ refsForPlan
106
+ });