codetrellis 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (449) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +27 -2
  3. package/bin/codetrellis.mjs +4 -0
  4. package/package.json +43 -4
  5. package/reader/material-reader.mjs +130346 -0
  6. package/resources/tree-sitter/README.md +150 -0
  7. package/resources/tree-sitter/tree-sitter-c-sharp.wasm +0 -0
  8. package/resources/tree-sitter/tree-sitter-go.wasm +0 -0
  9. package/resources/tree-sitter/tree-sitter-java.wasm +0 -0
  10. package/resources/tree-sitter/tree-sitter-javascript.wasm +0 -0
  11. package/resources/tree-sitter/tree-sitter-kotlin.wasm +0 -0
  12. package/resources/tree-sitter/tree-sitter-php.wasm +0 -0
  13. package/resources/tree-sitter/tree-sitter-python.wasm +0 -0
  14. package/resources/tree-sitter/tree-sitter-ruby.wasm +0 -0
  15. package/resources/tree-sitter/tree-sitter-rust.wasm +0 -0
  16. package/resources/tree-sitter/tree-sitter-swift.wasm +0 -0
  17. package/resources/tree-sitter/tree-sitter-tsx.wasm +0 -0
  18. package/resources/tree-sitter/tree-sitter-typescript.wasm +0 -0
  19. package/resources/tree-sitter/tree-sitter.wasm +0 -0
  20. package/src/backend/agent/claude-code-watcher.js +270 -0
  21. package/src/backend/index.js +8 -0
  22. package/src/backend/lib/sha256-file.js +39 -0
  23. package/src/backend/lib/zip-entries.js +98 -0
  24. package/src/backend/lifecycle.js +102 -0
  25. package/src/backend/mcp/binding-headers.js +54 -0
  26. package/src/backend/mcp/client-identity.js +44 -0
  27. package/src/backend/mcp/connector/command.js +110 -0
  28. package/src/backend/mcp/connector/core.js +278 -0
  29. package/src/backend/mcp/connector/files.js +121 -0
  30. package/src/backend/mcp/connector/hook.js +284 -0
  31. package/src/backend/mcp/connector/main.js +126 -0
  32. package/src/backend/mcp/connector/sse-upstream.js +152 -0
  33. package/src/backend/mcp/helpers.js +43 -0
  34. package/src/backend/mcp/prompt-builders.js +104 -0
  35. package/src/backend/mcp/resources.js +197 -0
  36. package/src/backend/mcp/server.js +813 -0
  37. package/src/backend/mcp/skill-guide.js +1528 -0
  38. package/src/backend/mcp/tools/architecture-tools.js +273 -0
  39. package/src/backend/mcp/tools/audio-tools.js +117 -0
  40. package/src/backend/mcp/tools/awareness-tools.js +623 -0
  41. package/src/backend/mcp/tools/budget-tools.js +185 -0
  42. package/src/backend/mcp/tools/channel-tools.js +205 -0
  43. package/src/backend/mcp/tools/contribution-tools.js +181 -0
  44. package/src/backend/mcp/tools/drift-tools.js +252 -0
  45. package/src/backend/mcp/tools/git-tools.js +316 -0
  46. package/src/backend/mcp/tools/governance-tools.js +175 -0
  47. package/src/backend/mcp/tools/graph-tools.js +181 -0
  48. package/src/backend/mcp/tools/intake-tools.js +244 -0
  49. package/src/backend/mcp/tools/mobile-tools.js +118 -0
  50. package/src/backend/mcp/tools/peer-tools.js +330 -0
  51. package/src/backend/mcp/tools/plan-item-tools.js +1601 -0
  52. package/src/backend/mcp/tools/plan-tools.js +680 -0
  53. package/src/backend/mcp/tools/presence-tools.js +185 -0
  54. package/src/backend/mcp/tools/project-config-tools.js +150 -0
  55. package/src/backend/mcp/tools/review-tools.js +172 -0
  56. package/src/backend/mcp/tools/session-tools.js +554 -0
  57. package/src/backend/mcp/tools/system-docs-tools.js +168 -0
  58. package/src/backend/mcp/tools/terminal-tools.js +186 -0
  59. package/src/backend/mcp/tools/test-tools.js +117 -0
  60. package/src/backend/mcp/tools/ui-tools.js +356 -0
  61. package/src/backend/mcp/types.js +15 -0
  62. package/src/backend/middleware/local-auth.js +116 -0
  63. package/src/backend/server.js +5951 -0
  64. package/src/backend/services/agent-event-log.js +350 -0
  65. package/src/backend/services/architecture-rule.js +584 -0
  66. package/src/backend/services/architecture-rules.js +275 -0
  67. package/src/backend/services/artefact-content-service.js +181 -0
  68. package/src/backend/services/artefact-service.js +305 -0
  69. package/src/backend/services/artefact-watcher.js +167 -0
  70. package/src/backend/services/ast-parser.js +327 -0
  71. package/src/backend/services/audio-buffer-service.js +152 -0
  72. package/src/backend/services/awareness-notices.js +139 -0
  73. package/src/backend/services/awareness-replies.js +194 -0
  74. package/src/backend/services/awareness-service.js +344 -0
  75. package/src/backend/services/awareness-signals.js +267 -0
  76. package/src/backend/services/baseline-store.js +83 -0
  77. package/src/backend/services/branch-workstreams.js +341 -0
  78. package/src/backend/services/breakpoint-service.js +584 -0
  79. package/src/backend/services/brief-service.js +299 -0
  80. package/src/backend/services/budget-service.js +528 -0
  81. package/src/backend/services/callsites/base.js +15 -0
  82. package/src/backend/services/callsites/csharp.js +148 -0
  83. package/src/backend/services/callsites/go.js +163 -0
  84. package/src/backend/services/callsites/index.js +53 -0
  85. package/src/backend/services/callsites/kotlin.js +123 -0
  86. package/src/backend/services/callsites/process-env.js +125 -0
  87. package/src/backend/services/callsites/python.js +91 -0
  88. package/src/backend/services/callsites/ruby.js +164 -0
  89. package/src/backend/services/callsites/shared.js +198 -0
  90. package/src/backend/services/callsites/swift.js +115 -0
  91. package/src/backend/services/callsites/typescript.js +87 -0
  92. package/src/backend/services/capability-token.js +108 -0
  93. package/src/backend/services/change-check.js +156 -0
  94. package/src/backend/services/channel-dispatcher-service.js +235 -0
  95. package/src/backend/services/channel-event-file-service.js +125 -0
  96. package/src/backend/services/channel-event-service.js +297 -0
  97. package/src/backend/services/check-runs.js +177 -0
  98. package/src/backend/services/checkout-identity.js +73 -0
  99. package/src/backend/services/claude-code-parallel.js +221 -0
  100. package/src/backend/services/claude-desktop-config.js +186 -0
  101. package/src/backend/services/clock.js +57 -0
  102. package/src/backend/services/cloud-files.js +191 -0
  103. package/src/backend/services/coalesce.js +50 -0
  104. package/src/backend/services/code-breakpoints.js +291 -0
  105. package/src/backend/services/comment-service.js +168 -0
  106. package/src/backend/services/commit-attribution.js +134 -0
  107. package/src/backend/services/commit-edges.js +99 -0
  108. package/src/backend/services/confined-fs.js +241 -0
  109. package/src/backend/services/conformity-gate.js +132 -0
  110. package/src/backend/services/contribution-service.js +409 -0
  111. package/src/backend/services/coverage-service.js +173 -0
  112. package/src/backend/services/criteria-service.js +721 -0
  113. package/src/backend/services/criterion-checks.js +387 -0
  114. package/src/backend/services/criterion-loop-service.js +411 -0
  115. package/src/backend/services/cross-system-service.js +231 -0
  116. package/src/backend/services/database.js +916 -0
  117. package/src/backend/services/db-schema.js +1358 -0
  118. package/src/backend/services/deviation-service.js +344 -0
  119. package/src/backend/services/diff-engine.js +168 -0
  120. package/src/backend/services/evidence.js +363 -0
  121. package/src/backend/services/external-intake-service.js +269 -0
  122. package/src/backend/services/external-pointer-service.js +195 -0
  123. package/src/backend/services/external-refs-service.js +214 -0
  124. package/src/backend/services/file-history.js +158 -0
  125. package/src/backend/services/file-watcher.js +193 -0
  126. package/src/backend/services/folder-requests.js +118 -0
  127. package/src/backend/services/freeze-service.js +189 -0
  128. package/src/backend/services/gemini-cli-hook.js +172 -0
  129. package/src/backend/services/git-activity-service.js +325 -0
  130. package/src/backend/services/git-blobs.js +70 -0
  131. package/src/backend/services/git-branches.js +357 -0
  132. package/src/backend/services/git-checkout.js +153 -0
  133. package/src/backend/services/git-commit-service.js +91 -0
  134. package/src/backend/services/git-env.js +121 -0
  135. package/src/backend/services/git-identity.js +84 -0
  136. package/src/backend/services/git-refs.js +386 -0
  137. package/src/backend/services/git-safety.js +58 -0
  138. package/src/backend/services/grant-guard.js +67 -0
  139. package/src/backend/services/html-view-policy.js +135 -0
  140. package/src/backend/services/human-decision.js +55 -0
  141. package/src/backend/services/importers.js +159 -0
  142. package/src/backend/services/intent-service.js +105 -0
  143. package/src/backend/services/ipc-dispatcher.js +164 -0
  144. package/src/backend/services/item-git-state.js +208 -0
  145. package/src/backend/services/line-changes.js +232 -0
  146. package/src/backend/services/line-history.js +174 -0
  147. package/src/backend/services/local-api-changes.js +40 -0
  148. package/src/backend/services/logger.js +217 -0
  149. package/src/backend/services/material-footprints.js +203 -0
  150. package/src/backend/services/material-place.js +82 -0
  151. package/src/backend/services/material-reader/child.js +4 -0
  152. package/src/backend/services/material-reader/docx-markdown.js +198 -0
  153. package/src/backend/services/material-reader/fixtures.test-helper.js +169 -0
  154. package/src/backend/services/material-reader/quote.js +44 -0
  155. package/src/backend/services/material-reader/read.js +430 -0
  156. package/src/backend/services/material-reader/reader-host.js +202 -0
  157. package/src/backend/services/material-signals.js +141 -0
  158. package/src/backend/services/mcp-capabilities.js +390 -0
  159. package/src/backend/services/mdns-service.js +304 -0
  160. package/src/backend/services/mobile-api-server.js +281 -0
  161. package/src/backend/services/mobile-approvals.js +306 -0
  162. package/src/backend/services/mobile-awareness.js +180 -0
  163. package/src/backend/services/mobile-breakpoints.js +115 -0
  164. package/src/backend/services/mobile-budget.js +98 -0
  165. package/src/backend/services/mobile-freeze.js +106 -0
  166. package/src/backend/services/mobile-proposals.js +100 -0
  167. package/src/backend/services/mobile-rpc-service.js +1289 -0
  168. package/src/backend/services/mobile-workstreams.js +160 -0
  169. package/src/backend/services/monorepo-detector.js +131 -0
  170. package/src/backend/services/other-work.js +45 -0
  171. package/src/backend/services/pack-seal.js +129 -0
  172. package/src/backend/services/paired-device-service.js +192 -0
  173. package/src/backend/services/pairing-server.js +323 -0
  174. package/src/backend/services/pairing-service.js +200 -0
  175. package/src/backend/services/pantry-resolution-service.js +166 -0
  176. package/src/backend/services/parsers/base.js +124 -0
  177. package/src/backend/services/parsers/csharp.js +224 -0
  178. package/src/backend/services/parsers/go.js +180 -0
  179. package/src/backend/services/parsers/index.js +101 -0
  180. package/src/backend/services/parsers/java.js +103 -0
  181. package/src/backend/services/parsers/kotlin.js +252 -0
  182. package/src/backend/services/parsers/php.js +113 -0
  183. package/src/backend/services/parsers/python.js +189 -0
  184. package/src/backend/services/parsers/ruby.js +212 -0
  185. package/src/backend/services/parsers/rust.js +97 -0
  186. package/src/backend/services/parsers/swift.js +221 -0
  187. package/src/backend/services/parsers/typescript.js +235 -0
  188. package/src/backend/services/pattern-scan.js +65 -0
  189. package/src/backend/services/patterns.js +281 -0
  190. package/src/backend/services/peer-audit-service.js +123 -0
  191. package/src/backend/services/peer-auth.js +153 -0
  192. package/src/backend/services/peer-capabilities.js +209 -0
  193. package/src/backend/services/peer-connection-service.js +450 -0
  194. package/src/backend/services/peer-grants.js +33 -0
  195. package/src/backend/services/persistence.js +116 -0
  196. package/src/backend/services/personal-sync-service.js +232 -0
  197. package/src/backend/services/pipeline-approvals.js +72 -0
  198. package/src/backend/services/pipeline.js +232 -0
  199. package/src/backend/services/plan-arrivals.js +68 -0
  200. package/src/backend/services/plan-changes-service.js +273 -0
  201. package/src/backend/services/plan-conflict-service.js +288 -0
  202. package/src/backend/services/plan-dependencies.js +91 -0
  203. package/src/backend/services/plan-doc-guard.js +90 -0
  204. package/src/backend/services/plan-documents-service.js +275 -0
  205. package/src/backend/services/plan-event-service.js +154 -0
  206. package/src/backend/services/plan-file-refs.js +106 -0
  207. package/src/backend/services/plan-file-service.js +1564 -0
  208. package/src/backend/services/plan-history-service.js +156 -0
  209. package/src/backend/services/plan-import-service.js +261 -0
  210. package/src/backend/services/plan-item-service.js +1223 -0
  211. package/src/backend/services/plan-migrate-service.js +395 -0
  212. package/src/backend/services/plan-overlay-service.js +173 -0
  213. package/src/backend/services/plan-phases-service.js +182 -0
  214. package/src/backend/services/plan-progress-service.js +134 -0
  215. package/src/backend/services/plan-review-service.js +262 -0
  216. package/src/backend/services/plan-service.js +682 -0
  217. package/src/backend/services/plan-status.js +113 -0
  218. package/src/backend/services/plan-template-publish-service.js +217 -0
  219. package/src/backend/services/plan-templates-service.js +242 -0
  220. package/src/backend/services/plan-templates.js +1164 -0
  221. package/src/backend/services/planned-overlap-actions.js +200 -0
  222. package/src/backend/services/plans-home.js +224 -0
  223. package/src/backend/services/play-forward.js +256 -0
  224. package/src/backend/services/playback-service.js +117 -0
  225. package/src/backend/services/power-service.js +167 -0
  226. package/src/backend/services/power-signals.js +81 -0
  227. package/src/backend/services/pr-draft-service.js +142 -0
  228. package/src/backend/services/presence-service.js +122 -0
  229. package/src/backend/services/pricing.js +60 -0
  230. package/src/backend/services/project-config-service.js +474 -0
  231. package/src/backend/services/project-scanner.js +184 -0
  232. package/src/backend/services/projection-service.js +69 -0
  233. package/src/backend/services/push-notification-service.js +288 -0
  234. package/src/backend/services/recent-projects-service.js +204 -0
  235. package/src/backend/services/record-chain.js +162 -0
  236. package/src/backend/services/recurrence-rule.js +63 -0
  237. package/src/backend/services/recurring-agent.js +89 -0
  238. package/src/backend/services/recurring-scheduler.js +77 -0
  239. package/src/backend/services/recurring-service.js +276 -0
  240. package/src/backend/services/reference-service.js +169 -0
  241. package/src/backend/services/release-public-key.js +30 -0
  242. package/src/backend/services/release-signature.js +64 -0
  243. package/src/backend/services/remote-audio-service.js +224 -0
  244. package/src/backend/services/remote-interaction-service.js +275 -0
  245. package/src/backend/services/remote-terminal-service.js +324 -0
  246. package/src/backend/services/rendition/child/main.js +76 -0
  247. package/src/backend/services/rendition/engine-host.js +249 -0
  248. package/src/backend/services/rendition/engine-lock.js +39 -0
  249. package/src/backend/services/rendition/engine-lock.json +14 -0
  250. package/src/backend/services/rendition/engine-manifest.js +97 -0
  251. package/src/backend/services/rendition/network-proof.js +73 -0
  252. package/src/backend/services/rendition/rendition-service.js +175 -0
  253. package/src/backend/services/replay-frames.js +387 -0
  254. package/src/backend/services/replay-state.js +201 -0
  255. package/src/backend/services/resolvers/base.js +108 -0
  256. package/src/backend/services/resolvers/csharp.js +109 -0
  257. package/src/backend/services/resolvers/go.js +105 -0
  258. package/src/backend/services/resolvers/index.js +60 -0
  259. package/src/backend/services/resolvers/java.js +63 -0
  260. package/src/backend/services/resolvers/kotlin.js +109 -0
  261. package/src/backend/services/resolvers/php.js +89 -0
  262. package/src/backend/services/resolvers/python.js +154 -0
  263. package/src/backend/services/resolvers/ruby.js +103 -0
  264. package/src/backend/services/resolvers/rust.js +77 -0
  265. package/src/backend/services/resolvers/swift.js +98 -0
  266. package/src/backend/services/resolvers/typescript.js +71 -0
  267. package/src/backend/services/retention.js +54 -0
  268. package/src/backend/services/review-architecture.js +236 -0
  269. package/src/backend/services/review-attest.js +68 -0
  270. package/src/backend/services/review-bundle.js +226 -0
  271. package/src/backend/services/review-graduation.js +93 -0
  272. package/src/backend/services/review-host/bitbucket.js +79 -0
  273. package/src/backend/services/review-host/detect.js +80 -0
  274. package/src/backend/services/review-host/github.js +97 -0
  275. package/src/backend/services/review-host/gitlab.js +77 -0
  276. package/src/backend/services/review-host/host-state.js +103 -0
  277. package/src/backend/services/review-host/http.js +58 -0
  278. package/src/backend/services/review-host/switch.js +120 -0
  279. package/src/backend/services/review-marks.js +72 -0
  280. package/src/backend/services/review-notes.js +169 -0
  281. package/src/backend/services/review-other-work.js +90 -0
  282. package/src/backend/services/review-queue-service.js +147 -0
  283. package/src/backend/services/review-risk.js +127 -0
  284. package/src/backend/services/review-task.js +121 -0
  285. package/src/backend/services/rule-approvals.js +268 -0
  286. package/src/backend/services/rule-baseline.js +134 -0
  287. package/src/backend/services/rule-changes.js +162 -0
  288. package/src/backend/services/rule-preview.js +47 -0
  289. package/src/backend/services/rule-proposals.js +104 -0
  290. package/src/backend/services/rule-scope.js +76 -0
  291. package/src/backend/services/rulebook.js +286 -0
  292. package/src/backend/services/rules-at.js +56 -0
  293. package/src/backend/services/rules-overview.js +88 -0
  294. package/src/backend/services/schema-reconciler.js +250 -0
  295. package/src/backend/services/secret-store.js +119 -0
  296. package/src/backend/services/section-workstreams.js +95 -0
  297. package/src/backend/services/self-write-tracker.js +75 -0
  298. package/src/backend/services/sensor-bridge-service.js +285 -0
  299. package/src/backend/services/session-service.js +192 -0
  300. package/src/backend/services/settings-service.js +324 -0
  301. package/src/backend/services/signal-breakpoints.js +172 -0
  302. package/src/backend/services/signed-approval-record.js +86 -0
  303. package/src/backend/services/signed-approvals.js +244 -0
  304. package/src/backend/services/signoff-pack.js +328 -0
  305. package/src/backend/services/signoff-rows.js +114 -0
  306. package/src/backend/services/skill-arrival-service.js +138 -0
  307. package/src/backend/services/skill-model.js +193 -0
  308. package/src/backend/services/skill-use-service.js +140 -0
  309. package/src/backend/services/skills-service.js +150 -0
  310. package/src/backend/services/snapshot-compare-service.js +397 -0
  311. package/src/backend/services/source-control.js +189 -0
  312. package/src/backend/services/spec-links-service.js +123 -0
  313. package/src/backend/services/spec-proposal-withdraw.js +50 -0
  314. package/src/backend/services/spec-proposals-service.js +470 -0
  315. package/src/backend/services/sql/embedded.js +95 -0
  316. package/src/backend/services/sql/index.js +63 -0
  317. package/src/backend/services/sql/refs.js +357 -0
  318. package/src/backend/services/sql/schema.js +312 -0
  319. package/src/backend/services/sql/tokenizer.js +195 -0
  320. package/src/backend/services/stack-overlaps.js +117 -0
  321. package/src/backend/services/stack-service.js +225 -0
  322. package/src/backend/services/state-sync-service.js +384 -0
  323. package/src/backend/services/stuck-sensor-service.js +200 -0
  324. package/src/backend/services/system-discovery.js +481 -0
  325. package/src/backend/services/system-docs-service.js +701 -0
  326. package/src/backend/services/task-attachments-service.js +340 -0
  327. package/src/backend/services/task-grounding.js +60 -0
  328. package/src/backend/services/task-records/check-run-record.js +146 -0
  329. package/src/backend/services/task-records/check-runs.js +115 -0
  330. package/src/backend/services/task-records/heads.js +88 -0
  331. package/src/backend/services/task-records/material-reads.js +225 -0
  332. package/src/backend/services/task-records/read-record.js +100 -0
  333. package/src/backend/services/task-records/record.js +173 -0
  334. package/src/backend/services/task-records/run-record.js +136 -0
  335. package/src/backend/services/task-records/shared-state.js +548 -0
  336. package/src/backend/services/task-records/signing.js +140 -0
  337. package/src/backend/services/task-records/split-signals.js +52 -0
  338. package/src/backend/services/task-records/test-runs.js +164 -0
  339. package/src/backend/services/task-records/trust.js +243 -0
  340. package/src/backend/services/task-rules.js +81 -0
  341. package/src/backend/services/task-workstreams.js +90 -0
  342. package/src/backend/services/terminal-history-service.js +266 -0
  343. package/src/backend/services/terminal-service.js +267 -0
  344. package/src/backend/services/test-clock.js +53 -0
  345. package/src/backend/services/tests/grounding.js +266 -0
  346. package/src/backend/services/tests/junit.js +104 -0
  347. package/src/backend/services/tests/teammate-runs.js +134 -0
  348. package/src/backend/services/tests/test-results.js +234 -0
  349. package/src/backend/services/tree-watcher.js +204 -0
  350. package/src/backend/services/trellis-service.js +204 -0
  351. package/src/backend/services/trusted-roots.js +186 -0
  352. package/src/backend/services/update-download-service.js +342 -0
  353. package/src/backend/services/update-service.js +266 -0
  354. package/src/backend/services/watch-ignore.js +76 -0
  355. package/src/backend/services/webhook-egress.js +206 -0
  356. package/src/backend/services/webrtc-service.js +413 -0
  357. package/src/backend/services/work-changes.js +59 -0
  358. package/src/backend/services/workstream-binding.js +82 -0
  359. package/src/backend/services/workstream-commits.js +116 -0
  360. package/src/backend/services/workstream-imports.js +177 -0
  361. package/src/backend/services/workstream-service.js +335 -0
  362. package/src/backend/services/workstream-symbols.js +223 -0
  363. package/src/backend/services/workstream-watch-service.js +391 -0
  364. package/src/backend/services/worktree-service.js +235 -0
  365. package/src/cli/agent.js +100 -0
  366. package/src/cli/args.js +201 -0
  367. package/src/cli/conformity.js +106 -0
  368. package/src/cli/desktop.js +91 -0
  369. package/src/cli/main.js +409 -0
  370. package/src/cli/pipeline.js +109 -0
  371. package/src/cli/plan-verbs.js +259 -0
  372. package/src/cli/review-adapters.js +218 -0
  373. package/src/cli/review-output.js +93 -0
  374. package/src/cli/review-post.js +89 -0
  375. package/src/cli/review-sink.js +183 -0
  376. package/src/cli/review-skill.js +44 -0
  377. package/src/cli/review-verify.js +104 -0
  378. package/src/cli/review.js +386 -0
  379. package/src/cli/sarif.js +148 -0
  380. package/src/cli/verbs.js +359 -0
  381. package/src/shared/build-info.js +39 -0
  382. package/src/shared/lib/agent-review.js +199 -0
  383. package/src/shared/lib/agent-turns.js +140 -0
  384. package/src/shared/lib/awareness-digest.js +120 -0
  385. package/src/shared/lib/branch-name.js +45 -0
  386. package/src/shared/lib/breakpoint-words.js +118 -0
  387. package/src/shared/lib/budget-words.js +56 -0
  388. package/src/shared/lib/burst.js +69 -0
  389. package/src/shared/lib/call-entry.js +105 -0
  390. package/src/shared/lib/check-compare.js +42 -0
  391. package/src/shared/lib/check-words.js +216 -0
  392. package/src/shared/lib/csv.js +62 -0
  393. package/src/shared/lib/folder-entry.js +87 -0
  394. package/src/shared/lib/freeze-words.js +60 -0
  395. package/src/shared/lib/fuzzy.js +84 -0
  396. package/src/shared/lib/git-state-words.js +80 -0
  397. package/src/shared/lib/grep-entry.js +86 -0
  398. package/src/shared/lib/grounding-line.js +61 -0
  399. package/src/shared/lib/import-line.js +71 -0
  400. package/src/shared/lib/item-status.js +249 -0
  401. package/src/shared/lib/line-changes.js +53 -0
  402. package/src/shared/lib/locator.js +71 -0
  403. package/src/shared/lib/matcher.js +120 -0
  404. package/src/shared/lib/merge-order.js +65 -0
  405. package/src/shared/lib/open-findings.js +68 -0
  406. package/src/shared/lib/other-work.js +108 -0
  407. package/src/shared/lib/package-entry.js +142 -0
  408. package/src/shared/lib/plan-vocab.js +40 -0
  409. package/src/shared/lib/pptx-xml.js +86 -0
  410. package/src/shared/lib/proposal-words.js +61 -0
  411. package/src/shared/lib/recurrence.js +183 -0
  412. package/src/shared/lib/references.js +72 -0
  413. package/src/shared/lib/rule-pattern.js +56 -0
  414. package/src/shared/lib/sdp-fingerprint.js +115 -0
  415. package/src/shared/lib/sdp-minimal.js +123 -0
  416. package/src/shared/lib/secret-paths.js +34 -0
  417. package/src/shared/lib/signal-words.js +172 -0
  418. package/src/shared/lib/signoff.js +56 -0
  419. package/src/shared/lib/skills-note.js +60 -0
  420. package/src/shared/lib/spec-sections.js +78 -0
  421. package/src/shared/lib/symbol-entry.js +60 -0
  422. package/src/shared/lib/tool-phrasing.js +338 -0
  423. package/src/shared/lib/turn-gap.js +27 -0
  424. package/src/shared/lib/workstream-words.js +38 -0
  425. package/src/shared/lib/xlsx-xml.js +144 -0
  426. package/src/shared/lib/zip-reader.js +99 -0
  427. package/src/shared/types/agent.js +27 -0
  428. package/src/shared/types/architecture-rules.js +30 -0
  429. package/src/shared/types/ast.js +15 -0
  430. package/src/shared/types/breakpoint.js +33 -0
  431. package/src/shared/types/channel.js +41 -0
  432. package/src/shared/types/criteria.js +15 -0
  433. package/src/shared/types/graph.js +15 -0
  434. package/src/shared/types/index.js +53 -0
  435. package/src/shared/types/peer.js +36 -0
  436. package/src/shared/types/pipeline.js +15 -0
  437. package/src/shared/types/plan.js +15 -0
  438. package/src/shared/types/play-forward.js +15 -0
  439. package/src/shared/types/power.js +15 -0
  440. package/src/shared/types/presence.js +15 -0
  441. package/src/shared/types/project-config.js +35 -0
  442. package/src/shared/types/project.js +15 -0
  443. package/src/shared/types/record.js +15 -0
  444. package/src/shared/types/recurring.js +15 -0
  445. package/src/shared/types/review.js +15 -0
  446. package/src/shared/types/settings.js +114 -0
  447. package/src/shared/types/stack.js +15 -0
  448. package/src/shared/types/system-doc.js +15 -0
  449. package/src/shared/types/system.js +15 -0
@@ -0,0 +1,160 @@
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 mobile_workstreams_exports = {};
29
+ __export(mobile_workstreams_exports, {
30
+ PHONE_TURNS: () => PHONE_TURNS,
31
+ WORKSTREAM_METHODS: () => WORKSTREAM_METHODS,
32
+ handleWorkstreamMethod: () => handleWorkstreamMethod,
33
+ phoneTaskWorkstreams: () => phoneTaskWorkstreams,
34
+ phoneWorkstream: () => phoneWorkstream,
35
+ phoneWorkstreams: () => phoneWorkstreams
36
+ });
37
+ module.exports = __toCommonJS(mobile_workstreams_exports);
38
+ var import_node_fs = __toESM(require("node:fs"));
39
+ var import_workstream_service = require("./workstream-service");
40
+ var import_task_workstreams = require("./task-workstreams");
41
+ var import_awareness_service = require("./awareness-service");
42
+ var import_agent_event_log = require("./agent-event-log");
43
+ var import_database = require("./database");
44
+ var import_workstream_words = require("../../shared/lib/workstream-words");
45
+ var import_agent_turns = require("../../shared/lib/agent-turns");
46
+ const WORKSTREAM_METHODS = ["workstreams.list", "workstreams.detail"];
47
+ const PHONE_TURNS = 10;
48
+ async function handleWorkstreamMethod(method, params, _peer, ctx) {
49
+ switch (method) {
50
+ case "workstreams.list":
51
+ return { projectRoot: ctx.projectRoot, workstreams: await phoneWorkstreams(ctx.projectRoot), tasks: phoneTaskWorkstreams(ctx.projectRoot) };
52
+ case "workstreams.detail": {
53
+ const id = params.id;
54
+ if (typeof id !== "string" || !id) throw new Error("id is required");
55
+ return { workstream: await phoneWorkstream(ctx.projectRoot, id) };
56
+ }
57
+ default:
58
+ throw new Error(`Unknown workstream method: ${method}`);
59
+ }
60
+ }
61
+ async function phoneWorkstreams(projectRoot) {
62
+ if (!projectRoot) return [];
63
+ return (await (0, import_workstream_service.listWorkstreams)(projectRoot)).map((w) => toPhone(projectRoot, w));
64
+ }
65
+ function phoneTaskWorkstreams(projectRoot) {
66
+ if (!projectRoot) return [];
67
+ return (0, import_task_workstreams.listTaskWorkstreams)(projectRoot).map((t) => {
68
+ const signals = (0, import_awareness_service.listSignals)(projectRoot, { workstream: t.id });
69
+ return {
70
+ id: t.id,
71
+ itemUid: t.itemUid,
72
+ name: (0, import_task_workstreams.taskLabel)(t),
73
+ planUid: t.planUid,
74
+ planTitle: t.planTitle,
75
+ status: t.status,
76
+ agents: t.agents.map((a) => ({ agentType: a.agentType, model: a.model, lastSeen: a.lastSeen })),
77
+ materials: t.materials,
78
+ outputs: t.outputs,
79
+ signals: signals.filter((s) => s.state !== "intended" && s.state !== "dismissed").length,
80
+ needsYou: signals.filter((s) => s.state === "open" && s.severity !== "low").length
81
+ };
82
+ });
83
+ }
84
+ async function phoneWorkstream(projectRoot, id) {
85
+ if (!projectRoot) throw new Error("No project is open on the desktop");
86
+ const w = (await (0, import_workstream_service.listWorkstreams)(projectRoot, { includeIdle: true })).find((x) => x.root === id);
87
+ if (!w) throw new Error("No such workstream in this project");
88
+ return {
89
+ ...toPhone(projectRoot, w),
90
+ files: w.changes.files.map((f) => ({
91
+ path: f.path,
92
+ status: f.status,
93
+ ...typeof f.added === "number" ? { added: f.added } : {},
94
+ ...typeof f.removed === "number" ? { removed: f.removed } : {}
95
+ })),
96
+ truncated: w.changes.truncated,
97
+ ...typeof w.changes.ahead === "number" ? { ahead: w.changes.ahead } : {},
98
+ ...typeof w.changes.behind === "number" ? { behind: w.changes.behind } : {},
99
+ turns: turnsIn(w)
100
+ };
101
+ }
102
+ function toPhone(projectRoot, w) {
103
+ const signals = w.root.startsWith("branch:") ? [] : (0, import_awareness_service.listSignals)(projectRoot, { workstream: w.root });
104
+ return {
105
+ id: w.root,
106
+ name: (0, import_workstream_words.chipLabel)(w),
107
+ branch: w.branch,
108
+ shape: w.shape,
109
+ main: w.main,
110
+ agents: w.agents.map((a) => ({ agentType: a.agentType, model: a.model, source: a.source, lastSeen: a.lastSeen })),
111
+ tasks: tasksOf(w),
112
+ changedFiles: w.changes.files.length,
113
+ signals: signals.filter((s) => s.state !== "intended" && s.state !== "dismissed").length,
114
+ needsYou: signals.filter((s) => s.state === "open" && s.severity !== "low").length
115
+ };
116
+ }
117
+ function tasksOf(w) {
118
+ const sessions = w.agents.map((a) => a.sessionId);
119
+ if (sessions.length === 0) return [];
120
+ const res = (0, import_database.getDb)().exec(
121
+ `SELECT uid, title, plan_uid, status FROM plan_items
122
+ WHERE assignee_session IN (${sessions.map(() => "?").join(",")}) AND status IN ('assigned', 'in_progress')
123
+ ORDER BY updated_at DESC`,
124
+ sessions
125
+ );
126
+ return (res[0]?.values ?? []).map(([uid, title, planUid, status]) => ({ uid, title, planUid, status }));
127
+ }
128
+ function turnsIn(w) {
129
+ if (w.root.startsWith("branch:")) return [];
130
+ const roots = /* @__PURE__ */ new Set([w.root]);
131
+ try {
132
+ roots.add(import_node_fs.default.realpathSync.native(w.root));
133
+ } catch {
134
+ }
135
+ const events = [...roots].flatMap((r) => (0, import_agent_event_log.listAgentEvents)({ workstreamRoot: r, limit: 300 }));
136
+ const seen = /* @__PURE__ */ new Set();
137
+ const unique = events.filter((e) => seen.has(e.id) ? false : (seen.add(e.id), true));
138
+ const withSession = unique.map((e) => ({ ...e, payload: { ...e.payload, sessionId: e.sessionId ?? e.payload.sessionId, agentType: e.agentType ?? e.payload.agentType } }));
139
+ const named = new Map(w.agents.map((a) => [a.sessionId, a.agentType]));
140
+ return (0, import_agent_turns.groupIntoTurns)(withSession).slice(-PHONE_TURNS).reverse().map((t) => ({
141
+ sessionId: t.sessionId,
142
+ agentType: t.sessionId && named.get(t.sessionId) || t.agentType,
143
+ startedAt: t.startedAt,
144
+ endedAt: t.endedAt,
145
+ summary: t.summary,
146
+ calls: t.events.length,
147
+ files: t.files,
148
+ hasError: t.hasError,
149
+ mutating: t.mutating
150
+ }));
151
+ }
152
+ // Annotate the CommonJS export names for ESM import in node:
153
+ 0 && (module.exports = {
154
+ PHONE_TURNS,
155
+ WORKSTREAM_METHODS,
156
+ handleWorkstreamMethod,
157
+ phoneTaskWorkstreams,
158
+ phoneWorkstream,
159
+ phoneWorkstreams
160
+ });
@@ -0,0 +1,131 @@
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 monorepo_detector_exports = {};
29
+ __export(monorepo_detector_exports, {
30
+ detectMonorepo: () => detectMonorepo
31
+ });
32
+ module.exports = __toCommonJS(monorepo_detector_exports);
33
+ var import_node_fs = __toESM(require("node:fs"));
34
+ var import_node_path = __toESM(require("node:path"));
35
+ function detectMonorepo(rootPath) {
36
+ const type = detectType(rootPath);
37
+ const packages = discoverPackages(rootPath, type);
38
+ const dependencyGraph = buildDependencyGraph(packages);
39
+ return { type, root: rootPath, packages, dependencyGraph };
40
+ }
41
+ function detectType(rootPath) {
42
+ if (import_node_fs.default.existsSync(import_node_path.default.join(rootPath, "pnpm-workspace.yaml"))) {
43
+ return "pnpm-workspaces";
44
+ }
45
+ if (import_node_fs.default.existsSync(import_node_path.default.join(rootPath, "nx.json"))) {
46
+ return "nx";
47
+ }
48
+ if (import_node_fs.default.existsSync(import_node_path.default.join(rootPath, "turbo.json"))) {
49
+ return "turborepo";
50
+ }
51
+ const pkgPath = import_node_path.default.join(rootPath, "package.json");
52
+ if (import_node_fs.default.existsSync(pkgPath)) {
53
+ try {
54
+ const pkg = JSON.parse(import_node_fs.default.readFileSync(pkgPath, "utf-8"));
55
+ if (pkg.workspaces) return "npm-workspaces";
56
+ } catch {
57
+ }
58
+ }
59
+ return "single";
60
+ }
61
+ function discoverPackages(rootPath, type) {
62
+ if (type === "single") {
63
+ return [readPackageInfo(rootPath)].filter(Boolean);
64
+ }
65
+ const patterns = getWorkspacePatterns(rootPath, type);
66
+ const packages = [];
67
+ for (const pattern of patterns) {
68
+ const basePath = pattern.replace(/\/?\*.*$/, "");
69
+ const fullBase = import_node_path.default.join(rootPath, basePath);
70
+ if (!import_node_fs.default.existsSync(fullBase)) continue;
71
+ const entries = import_node_fs.default.readdirSync(fullBase, { withFileTypes: true });
72
+ for (const entry of entries) {
73
+ if (!entry.isDirectory()) continue;
74
+ if (entry.name.startsWith(".")) continue;
75
+ const pkgDir = import_node_path.default.join(fullBase, entry.name);
76
+ const info = readPackageInfo(pkgDir);
77
+ if (info) packages.push(info);
78
+ }
79
+ }
80
+ return packages;
81
+ }
82
+ function getWorkspacePatterns(rootPath, type) {
83
+ if (type === "pnpm-workspaces") {
84
+ try {
85
+ const content = import_node_fs.default.readFileSync(import_node_path.default.join(rootPath, "pnpm-workspace.yaml"), "utf-8");
86
+ const matches = content.match(/- ['"]?([^'"]+)['"]?/g);
87
+ return matches?.map((m) => m.replace(/^- ['"]?/, "").replace(/['"]?$/, "")) || [];
88
+ } catch {
89
+ return [];
90
+ }
91
+ }
92
+ try {
93
+ const pkg = JSON.parse(import_node_fs.default.readFileSync(import_node_path.default.join(rootPath, "package.json"), "utf-8"));
94
+ const workspaces = Array.isArray(pkg.workspaces) ? pkg.workspaces : pkg.workspaces?.packages || [];
95
+ return workspaces;
96
+ } catch {
97
+ return [];
98
+ }
99
+ }
100
+ function readPackageInfo(pkgDir) {
101
+ const pkgPath = import_node_path.default.join(pkgDir, "package.json");
102
+ if (!import_node_fs.default.existsSync(pkgPath)) return null;
103
+ try {
104
+ const pkg = JSON.parse(import_node_fs.default.readFileSync(pkgPath, "utf-8"));
105
+ return {
106
+ name: pkg.name || import_node_path.default.basename(pkgDir),
107
+ path: pkgDir,
108
+ version: pkg.version || "0.0.0",
109
+ dependencies: pkg.dependencies || {},
110
+ devDependencies: pkg.devDependencies || {}
111
+ };
112
+ } catch {
113
+ return null;
114
+ }
115
+ }
116
+ function buildDependencyGraph(packages) {
117
+ const names = new Set(packages.map((p) => p.name));
118
+ const graph = /* @__PURE__ */ new Map();
119
+ for (const pkg of packages) {
120
+ const deps = [
121
+ ...Object.keys(pkg.dependencies),
122
+ ...Object.keys(pkg.devDependencies)
123
+ ].filter((d) => names.has(d));
124
+ graph.set(pkg.name, deps);
125
+ }
126
+ return graph;
127
+ }
128
+ // Annotate the CommonJS export names for ESM import in node:
129
+ 0 && (module.exports = {
130
+ detectMonorepo
131
+ });
@@ -0,0 +1,45 @@
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 other_work_exports = {};
19
+ __export(other_work_exports, {
20
+ affectedByOtherWork: () => affectedByOtherWork
21
+ });
22
+ module.exports = __toCommonJS(other_work_exports);
23
+ var import_awareness_service = require("./awareness-service");
24
+ var import_task_workstreams = require("./task-workstreams");
25
+ var import_signal_words = require("../../shared/lib/signal-words");
26
+ async function affectedByOtherWork(itemUid, projectRoot, opts = {}) {
27
+ if (!projectRoot) return [];
28
+ if (opts.refresh) {
29
+ await (0, import_awareness_service.refreshSignals)(projectRoot).catch(() => {
30
+ });
31
+ }
32
+ const id = (0, import_task_workstreams.taskWorkstreamId)(itemUid);
33
+ return (0, import_awareness_service.listSignals)(projectRoot).filter((s) => s.subject.material && s.workstreams.includes(id) && s.state !== "dismissed").map((s) => ({
34
+ signal_id: s.id,
35
+ kind: (0, import_signal_words.kindWords)(s),
36
+ severity: s.severity,
37
+ state: s.state,
38
+ says: (0, import_signal_words.briefLine)(s, id),
39
+ other_tasks: s.workstreams.filter((w) => w !== id).map((w) => s.subject.labels?.[w] ?? w)
40
+ }));
41
+ }
42
+ // Annotate the CommonJS export names for ESM import in node:
43
+ 0 && (module.exports = {
44
+ affectedByOtherWork
45
+ });
@@ -0,0 +1,129 @@
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 pack_seal_exports = {};
19
+ __export(pack_seal_exports, {
20
+ EVIDENCE_NAMESPACE: () => EVIDENCE_NAMESPACE,
21
+ PACK_NAMESPACE: () => PACK_NAMESPACE,
22
+ checkDocumentSeal: () => checkDocumentSeal,
23
+ checkSeal: () => checkSeal,
24
+ sealBytes: () => sealBytes,
25
+ sealDocument: () => sealDocument,
26
+ sealPack: () => sealPack
27
+ });
28
+ module.exports = __toCommonJS(pack_seal_exports);
29
+ var import_database = require("./database");
30
+ var import_signing = require("./task-records/signing");
31
+ var import_trust = require("./task-records/trust");
32
+ var import_record_chain = require("./record-chain");
33
+ const PACK_NAMESPACE = "codetrellis-signoff-pack";
34
+ const EVIDENCE_NAMESPACE = "codetrellis-evidence";
35
+ function sealBytes(pack, namespace = PACK_NAMESPACE) {
36
+ const { seal: _seal, ...rest } = pack;
37
+ return `${namespace}
38
+ ${(0, import_signing.canonicalJson)(JSON.parse(JSON.stringify(rest)))}`;
39
+ }
40
+ function sealDocument(namespace, doc) {
41
+ const key = (0, import_trust.deviceKey)();
42
+ const { seal: _old, ...rest } = doc;
43
+ const body = { ...rest, sealedRecord: (0, import_record_chain.recordHead)() };
44
+ const value = (0, import_signing.signWithDevice)(key, sealBytes(body, namespace)).value;
45
+ return { ...body, seal: { how: "device", key: key.fingerprint, publicKey: key.publicKey, value } };
46
+ }
47
+ function sealPack(pack) {
48
+ return sealDocument(PACK_NAMESPACE, pack);
49
+ }
50
+ function parseSeal(raw) {
51
+ if (!raw || typeof raw !== "object") return null;
52
+ const s = raw;
53
+ if (s.how !== "device" || typeof s.key !== "string" || typeof s.publicKey !== "string" || typeof s.value !== "string") return null;
54
+ if (s.publicKey.length > 200 || s.value.length > 200) return null;
55
+ return { how: "device", key: s.key, publicKey: s.publicKey, value: s.value };
56
+ }
57
+ function parseRecord(raw) {
58
+ const r = raw;
59
+ return r && Number.isInteger(r.seq) && r.seq >= 0 && typeof r.hash === "string" && /^[0-9a-f]{64}$/.test(r.hash) ? { seq: r.seq, hash: r.hash } : null;
60
+ }
61
+ function recordState(seq, hash) {
62
+ const db = (0, import_database.getDb)();
63
+ const link = db.exec("SELECT hash FROM record_chain WHERE seq = ?", [seq])[0]?.values[0];
64
+ if (link) return String(link[0]) === hash ? "matches" : "differs";
65
+ const anchor = db.exec("SELECT through_seq, hash FROM record_anchor WHERE id = 1")[0]?.values[0];
66
+ if (anchor && Number(anchor[0]) === seq) return String(anchor[1]) === hash ? "matches" : "differs";
67
+ if (anchor && Number(anchor[0]) > seq) return "trimmed";
68
+ return seq === 0 ? "matches" : "differs";
69
+ }
70
+ const RECORD_WORDS = {
71
+ matches: "the record it names is still here and unchanged",
72
+ trimmed: "the record it names has since been removed by retention",
73
+ differs: "but the record it names has changed since",
74
+ "not-here": "the record it names is on that computer"
75
+ };
76
+ function checkSeal(pack) {
77
+ return checkDocumentSeal(PACK_NAMESPACE, "pack", pack);
78
+ }
79
+ function checkDocumentSeal(namespace, noun, doc) {
80
+ const p = doc && typeof doc === "object" ? doc : {};
81
+ const seal = parseSeal(p.seal);
82
+ if (!seal) {
83
+ return { state: "unsigned", fingerprint: null, signer: null, record: null, words: noun === "pack" ? "This pack is not signed: it was made before packs were signed, or its signature was removed." : "This export is not signed: its signature was removed." };
84
+ }
85
+ const short = `${(0, import_signing.shortFingerprint)(seal.key)}\u2026`;
86
+ const record = parseRecord(p.sealedRecord);
87
+ const intact = record !== null && (0, import_signing.fingerprintOf)(seal.publicKey) === seal.key && (0, import_signing.verifyWithDevice)(seal.publicKey, sealBytes(p, namespace), seal.value);
88
+ if (!intact) {
89
+ return { state: "changed", fingerprint: seal.key, signer: null, record: null, words: `Changed after it was signed: this ${noun} no longer matches its signature (key ${short}).` };
90
+ }
91
+ const mine = (0, import_trust.deviceKey)().fingerprint === seal.key;
92
+ if (mine) {
93
+ const state = recordState(record.seq, record.hash);
94
+ return {
95
+ state: "this-computer",
96
+ fingerprint: seal.key,
97
+ signer: null,
98
+ record: { ...record, state },
99
+ words: record.seq === 0 ? `Signed by this computer (${short}), and unchanged since; the record was empty when it was signed.` : `Signed by this computer (${short}), and unchanged since; ${RECORD_WORDS[state]} (entry #${record.seq}).`
100
+ };
101
+ }
102
+ const teammate = (0, import_database.getDb)().exec("SELECT name FROM task_record_keys WHERE fingerprint = ? AND state = 'trusted' LIMIT 1", [seal.key])[0]?.values[0];
103
+ if (teammate) {
104
+ return {
105
+ state: "teammate",
106
+ fingerprint: seal.key,
107
+ signer: String(teammate[0]),
108
+ record: { ...record, state: "not-here" },
109
+ words: `Signed by ${String(teammate[0])}'s computer (${short}), a key you trust, and unchanged since; ${RECORD_WORDS["not-here"]} (entry #${record.seq}).`
110
+ };
111
+ }
112
+ return {
113
+ state: "unknown-key",
114
+ fingerprint: seal.key,
115
+ signer: null,
116
+ record: { ...record, state: "not-here" },
117
+ words: `Signed by a key this computer does not know (${short}): unchanged since it was signed, but who signed it is not proven. Check the fingerprint with whoever sent it.`
118
+ };
119
+ }
120
+ // Annotate the CommonJS export names for ESM import in node:
121
+ 0 && (module.exports = {
122
+ EVIDENCE_NAMESPACE,
123
+ PACK_NAMESPACE,
124
+ checkDocumentSeal,
125
+ checkSeal,
126
+ sealBytes,
127
+ sealDocument,
128
+ sealPack
129
+ });
@@ -0,0 +1,192 @@
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 paired_device_service_exports = {};
29
+ __export(paired_device_service_exports, {
30
+ _resetCache: () => _resetCache,
31
+ getPairedDevice: () => getPairedDevice,
32
+ linkInstanceId: () => linkInstanceId,
33
+ listPairedDevices: () => listPairedDevices,
34
+ onDeviceGrantsChanged: () => onDeviceGrantsChanged,
35
+ refreshDeviceFingerprint: () => refreshDeviceFingerprint,
36
+ removePairedDevice: () => removePairedDevice,
37
+ renamePairedDevice: () => renamePairedDevice,
38
+ setDeviceCapabilities: () => setDeviceCapabilities,
39
+ touchPairedDevice: () => touchPairedDevice,
40
+ upsertPairedDevice: () => upsertPairedDevice
41
+ });
42
+ module.exports = __toCommonJS(paired_device_service_exports);
43
+ var import_node_fs = __toESM(require("node:fs"));
44
+ var import_node_path = __toESM(require("node:path"));
45
+ var import_persistence = require("./persistence");
46
+ var import_peer_capabilities = require("./peer-capabilities");
47
+ var import_peer_audit_service = require("./peer-audit-service");
48
+ function getPairedDevicesPath() {
49
+ return import_node_path.default.join((0, import_persistence.getSettingsDir)(), "paired-devices.json");
50
+ }
51
+ let devices = null;
52
+ function ensureLoaded() {
53
+ if (devices) return devices;
54
+ const filePath = getPairedDevicesPath();
55
+ if (!import_node_fs.default.existsSync(filePath)) {
56
+ devices = [];
57
+ return devices;
58
+ }
59
+ try {
60
+ const raw = JSON.parse(import_node_fs.default.readFileSync(filePath, "utf-8"));
61
+ if (Array.isArray(raw)) {
62
+ devices = raw;
63
+ } else {
64
+ console.warn("[PairedDevices] Invalid format \u2014 starting fresh");
65
+ devices = [];
66
+ }
67
+ } catch (err) {
68
+ console.warn("[PairedDevices] Failed to read paired-devices.json:", err);
69
+ devices = [];
70
+ }
71
+ return devices;
72
+ }
73
+ function persist() {
74
+ const filePath = getPairedDevicesPath();
75
+ const dir = import_node_path.default.dirname(filePath);
76
+ if (!import_node_fs.default.existsSync(dir)) {
77
+ import_node_fs.default.mkdirSync(dir, { recursive: true });
78
+ }
79
+ try {
80
+ import_node_fs.default.writeFileSync(filePath, JSON.stringify(devices, null, 2), "utf-8");
81
+ } catch (err) {
82
+ console.error("[PairedDevices] Failed to write paired-devices.json:", err);
83
+ }
84
+ }
85
+ function listPairedDevices() {
86
+ return [...ensureLoaded()];
87
+ }
88
+ function getPairedDevice(fingerprint) {
89
+ return ensureLoaded().find((d) => d.fingerprint === fingerprint);
90
+ }
91
+ function upsertPairedDevice(device) {
92
+ const list = ensureLoaded();
93
+ const idx = list.findIndex((d) => d.fingerprint === device.fingerprint);
94
+ if (idx >= 0) {
95
+ list[idx] = device;
96
+ } else {
97
+ list.push(device);
98
+ }
99
+ persist();
100
+ console.log(`[PairedDevices] ${idx >= 0 ? "Updated" : "Added"} device: ${device.alias} (${device.fingerprint.slice(0, 12)}\u2026)`);
101
+ }
102
+ function removePairedDevice(fingerprint) {
103
+ const list = ensureLoaded();
104
+ const idx = list.findIndex((d) => d.fingerprint === fingerprint);
105
+ if (idx < 0) return false;
106
+ const removed = list.splice(idx, 1)[0];
107
+ persist();
108
+ console.log(`[PairedDevices] Removed device: ${removed.alias} (${fingerprint.slice(0, 12)}\u2026)`);
109
+ return true;
110
+ }
111
+ function touchPairedDevice(fingerprint) {
112
+ const device = ensureLoaded().find((d) => d.fingerprint === fingerprint);
113
+ if (device) {
114
+ device.lastConnected = (/* @__PURE__ */ new Date()).toISOString();
115
+ persist();
116
+ }
117
+ }
118
+ function renamePairedDevice(fingerprint, alias) {
119
+ const device = ensureLoaded().find((d) => d.fingerprint === fingerprint);
120
+ if (!device) return false;
121
+ device.alias = alias;
122
+ persist();
123
+ return true;
124
+ }
125
+ const grantsListeners = /* @__PURE__ */ new Set();
126
+ function onDeviceGrantsChanged(cb) {
127
+ grantsListeners.add(cb);
128
+ return () => {
129
+ grantsListeners.delete(cb);
130
+ };
131
+ }
132
+ function setDeviceCapabilities(fingerprint, capabilities) {
133
+ const device = ensureLoaded().find((d) => d.fingerprint === fingerprint);
134
+ if (!device) return null;
135
+ const valid = [...new Set(capabilities)].filter(
136
+ (c) => import_peer_capabilities.ALL_CAPABILITIES.includes(c)
137
+ );
138
+ const before = device.capabilities ?? [...import_peer_capabilities.DEFAULT_GRANTS];
139
+ const added = valid.filter((c) => !before.includes(c));
140
+ const removed = before.filter((c) => !valid.includes(c));
141
+ device.capabilities = valid;
142
+ persist();
143
+ if (added.length || removed.length) {
144
+ (0, import_peer_audit_service.recordPeerAudit)({
145
+ kind: "capability-change",
146
+ fingerprint,
147
+ alias: device.alias,
148
+ method: "settings.deviceCapabilities",
149
+ detail: [
150
+ added.length ? `granted ${added.join(", ")}` : "",
151
+ removed.length ? `revoked ${removed.join(", ")}` : ""
152
+ ].filter(Boolean).join("; ")
153
+ });
154
+ for (const cb of grantsListeners) {
155
+ try {
156
+ cb(fingerprint, added, removed);
157
+ } catch {
158
+ }
159
+ }
160
+ }
161
+ return valid;
162
+ }
163
+ function refreshDeviceFingerprint(pairingId, fingerprint) {
164
+ const device = ensureLoaded().find((d) => d.pairingId === pairingId);
165
+ if (!device || !fingerprint || device.fingerprint === fingerprint) return;
166
+ device.fingerprint = fingerprint;
167
+ persist();
168
+ }
169
+ function linkInstanceId(fingerprint, instanceId) {
170
+ const device = ensureLoaded().find((d) => d.fingerprint === fingerprint);
171
+ if (device) {
172
+ device.instanceId = instanceId;
173
+ persist();
174
+ }
175
+ }
176
+ function _resetCache() {
177
+ devices = null;
178
+ }
179
+ // Annotate the CommonJS export names for ESM import in node:
180
+ 0 && (module.exports = {
181
+ _resetCache,
182
+ getPairedDevice,
183
+ linkInstanceId,
184
+ listPairedDevices,
185
+ onDeviceGrantsChanged,
186
+ refreshDeviceFingerprint,
187
+ removePairedDevice,
188
+ renamePairedDevice,
189
+ setDeviceCapabilities,
190
+ touchPairedDevice,
191
+ upsertPairedDevice
192
+ });