spidersan 0.10.0 → 0.20.2

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 (430) hide show
  1. package/CHANGELOG.md +171 -0
  2. package/README.md +39 -280
  3. package/dist/bin/command-registry.d.ts +25 -0
  4. package/dist/bin/command-registry.d.ts.map +1 -0
  5. package/dist/bin/command-registry.js +29 -0
  6. package/dist/bin/command-registry.js.map +1 -0
  7. package/dist/bin/spidersan.d.ts +7 -0
  8. package/dist/bin/spidersan.d.ts.map +1 -1
  9. package/dist/bin/spidersan.js +38 -57
  10. package/dist/bin/spidersan.js.map +1 -1
  11. package/dist/commands/cleanup.d.ts.map +1 -1
  12. package/dist/commands/cleanup.js +17 -3
  13. package/dist/commands/cleanup.js.map +1 -1
  14. package/dist/commands/config.d.ts.map +1 -1
  15. package/dist/commands/config.js +11 -39
  16. package/dist/commands/config.js.map +1 -1
  17. package/dist/commands/conflicts.d.ts +22 -0
  18. package/dist/commands/conflicts.d.ts.map +1 -1
  19. package/dist/commands/conflicts.js +459 -256
  20. package/dist/commands/conflicts.js.map +1 -1
  21. package/dist/commands/cross-conflicts.d.ts.map +1 -1
  22. package/dist/commands/cross-conflicts.js +7 -8
  23. package/dist/commands/cross-conflicts.js.map +1 -1
  24. package/dist/commands/depends.d.ts +4 -1
  25. package/dist/commands/depends.d.ts.map +1 -1
  26. package/dist/commands/depends.js +35 -8
  27. package/dist/commands/depends.js.map +1 -1
  28. package/dist/commands/doctor.d.ts.map +1 -1
  29. package/dist/commands/doctor.js +25 -7
  30. package/dist/commands/doctor.js.map +1 -1
  31. package/dist/commands/git-watch.d.ts +1 -1
  32. package/dist/commands/git-watch.js +1 -1
  33. package/dist/commands/github-sync.d.ts +33 -0
  34. package/dist/commands/github-sync.d.ts.map +1 -1
  35. package/dist/commands/github-sync.js +68 -57
  36. package/dist/commands/github-sync.js.map +1 -1
  37. package/dist/commands/index.d.ts +2 -13
  38. package/dist/commands/index.d.ts.map +1 -1
  39. package/dist/commands/index.js +5 -20
  40. package/dist/commands/index.js.map +1 -1
  41. package/dist/commands/merge-order.d.ts.map +1 -1
  42. package/dist/commands/merge-order.js +8 -4
  43. package/dist/commands/merge-order.js.map +1 -1
  44. package/dist/commands/merged.d.ts.map +1 -1
  45. package/dist/commands/merged.js +5 -1
  46. package/dist/commands/merged.js.map +1 -1
  47. package/dist/commands/pr-check.d.ts +24 -0
  48. package/dist/commands/pr-check.d.ts.map +1 -0
  49. package/dist/commands/pr-check.js +85 -0
  50. package/dist/commands/pr-check.js.map +1 -0
  51. package/dist/commands/ready-check.d.ts.map +1 -1
  52. package/dist/commands/ready-check.js +6 -3
  53. package/dist/commands/ready-check.js.map +1 -1
  54. package/dist/commands/register.d.ts +5 -0
  55. package/dist/commands/register.d.ts.map +1 -1
  56. package/dist/commands/register.js +14 -1
  57. package/dist/commands/register.js.map +1 -1
  58. package/dist/commands/registry-sync.d.ts.map +1 -1
  59. package/dist/commands/registry-sync.js +12 -46
  60. package/dist/commands/registry-sync.js.map +1 -1
  61. package/dist/commands/stale.d.ts.map +1 -1
  62. package/dist/commands/stale.js +8 -3
  63. package/dist/commands/stale.js.map +1 -1
  64. package/dist/commands/sync.d.ts +14 -1
  65. package/dist/commands/sync.d.ts.map +1 -1
  66. package/dist/commands/sync.js +49 -31
  67. package/dist/commands/sync.js.map +1 -1
  68. package/dist/commands/verify-trunk.d.ts +18 -0
  69. package/dist/commands/verify-trunk.d.ts.map +1 -0
  70. package/dist/commands/verify-trunk.js +77 -0
  71. package/dist/commands/verify-trunk.js.map +1 -0
  72. package/dist/commands/watch.d.ts +0 -1
  73. package/dist/commands/watch.d.ts.map +1 -1
  74. package/dist/commands/watch.js +50 -77
  75. package/dist/commands/watch.js.map +1 -1
  76. package/dist/index.d.ts +0 -3
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +0 -3
  79. package/dist/index.js.map +1 -1
  80. package/dist/lib/activity.d.ts.map +1 -1
  81. package/dist/lib/activity.js +6 -2
  82. package/dist/lib/activity.js.map +1 -1
  83. package/dist/lib/ai/context-builder.d.ts.map +1 -1
  84. package/dist/lib/ai/context-builder.js +19 -6
  85. package/dist/lib/ai/context-builder.js.map +1 -1
  86. package/dist/lib/ai/event-handler.d.ts.map +1 -1
  87. package/dist/lib/ai/event-handler.js +15 -2
  88. package/dist/lib/ai/event-handler.js.map +1 -1
  89. package/dist/lib/ai/reasoner.d.ts.map +1 -1
  90. package/dist/lib/ai/reasoner.js +63 -82
  91. package/dist/lib/ai/reasoner.js.map +1 -1
  92. package/dist/lib/ai/setup.d.ts +1 -1
  93. package/dist/lib/ai/setup.d.ts.map +1 -1
  94. package/dist/lib/ai/types.d.ts.map +1 -1
  95. package/dist/lib/ai/types.js +5 -2
  96. package/dist/lib/ai/types.js.map +1 -1
  97. package/dist/lib/ast.d.ts +10 -2
  98. package/dist/lib/ast.d.ts.map +1 -1
  99. package/dist/lib/ast.js +52 -27
  100. package/dist/lib/ast.js.map +1 -1
  101. package/dist/lib/carries.d.ts +22 -0
  102. package/dist/lib/carries.d.ts.map +1 -0
  103. package/dist/lib/carries.js +56 -0
  104. package/dist/lib/carries.js.map +1 -0
  105. package/dist/lib/colony-subscriber.d.ts +1 -1
  106. package/dist/lib/colony-subscriber.js +1 -1
  107. package/dist/lib/config.d.ts +2 -2
  108. package/dist/lib/config.d.ts.map +1 -1
  109. package/dist/lib/config.js +13 -8
  110. package/dist/lib/config.js.map +1 -1
  111. package/dist/lib/conflict-renderer.d.ts.map +1 -1
  112. package/dist/lib/conflict-renderer.js +17 -34
  113. package/dist/lib/conflict-renderer.js.map +1 -1
  114. package/dist/lib/ecosystem-env.d.ts +33 -0
  115. package/dist/lib/ecosystem-env.d.ts.map +1 -0
  116. package/dist/lib/ecosystem-env.js +62 -0
  117. package/dist/lib/ecosystem-env.js.map +1 -0
  118. package/dist/lib/git-events-subscriber.d.ts +27 -0
  119. package/dist/lib/git-events-subscriber.d.ts.map +1 -1
  120. package/dist/lib/git-events-subscriber.js +149 -58
  121. package/dist/lib/git-events-subscriber.js.map +1 -1
  122. package/dist/lib/git-merge-analyzer.d.ts +38 -0
  123. package/dist/lib/git-merge-analyzer.d.ts.map +1 -0
  124. package/dist/lib/git-merge-analyzer.js +23 -0
  125. package/dist/lib/git-merge-analyzer.js.map +1 -0
  126. package/dist/lib/git.d.ts +88 -0
  127. package/dist/lib/git.d.ts.map +1 -1
  128. package/dist/lib/git.js +499 -9
  129. package/dist/lib/git.js.map +1 -1
  130. package/dist/lib/github.d.ts +69 -1
  131. package/dist/lib/github.d.ts.map +1 -1
  132. package/dist/lib/github.js +230 -16
  133. package/dist/lib/github.js.map +1 -1
  134. package/dist/lib/graph.d.ts +15 -0
  135. package/dist/lib/graph.d.ts.map +1 -1
  136. package/dist/lib/graph.js +31 -0
  137. package/dist/lib/graph.js.map +1 -1
  138. package/dist/lib/machine.d.ts +14 -0
  139. package/dist/lib/machine.d.ts.map +1 -0
  140. package/dist/lib/machine.js +38 -0
  141. package/dist/lib/machine.js.map +1 -0
  142. package/dist/lib/notify.d.ts +68 -0
  143. package/dist/lib/notify.d.ts.map +1 -0
  144. package/dist/lib/notify.js +111 -0
  145. package/dist/lib/notify.js.map +1 -0
  146. package/dist/lib/outline.d.ts +6 -0
  147. package/dist/lib/outline.d.ts.map +1 -0
  148. package/dist/lib/outline.js +60 -0
  149. package/dist/lib/outline.js.map +1 -0
  150. package/dist/lib/push-registry.d.ts +22 -0
  151. package/dist/lib/push-registry.d.ts.map +1 -0
  152. package/dist/lib/push-registry.js +21 -0
  153. package/dist/lib/push-registry.js.map +1 -0
  154. package/dist/lib/reconcile.d.ts +100 -0
  155. package/dist/lib/reconcile.d.ts.map +1 -0
  156. package/dist/lib/reconcile.js +121 -0
  157. package/dist/lib/reconcile.js.map +1 -0
  158. package/dist/lib/security.d.ts +1 -6
  159. package/dist/lib/security.d.ts.map +1 -1
  160. package/dist/lib/security.js +1 -11
  161. package/dist/lib/security.js.map +1 -1
  162. package/dist/lib/semantic-analysis.d.ts +31 -0
  163. package/dist/lib/semantic-analysis.d.ts.map +1 -0
  164. package/dist/lib/semantic-analysis.js +120 -0
  165. package/dist/lib/semantic-analysis.js.map +1 -0
  166. package/dist/lib/supabase-credentials.d.ts +36 -0
  167. package/dist/lib/supabase-credentials.d.ts.map +1 -0
  168. package/dist/lib/supabase-credentials.js +43 -0
  169. package/dist/lib/supabase-credentials.js.map +1 -0
  170. package/dist/lib/trunk.d.ts +39 -0
  171. package/dist/lib/trunk.d.ts.map +1 -0
  172. package/dist/lib/trunk.js +116 -0
  173. package/dist/lib/trunk.js.map +1 -0
  174. package/dist/storage/adapter.d.ts +20 -1
  175. package/dist/storage/adapter.d.ts.map +1 -1
  176. package/dist/storage/branch-registry-store.d.ts +1 -1
  177. package/dist/storage/branch-registry-store.d.ts.map +1 -1
  178. package/dist/storage/factory.d.ts +0 -4
  179. package/dist/storage/factory.d.ts.map +1 -1
  180. package/dist/storage/factory.js +2 -26
  181. package/dist/storage/factory.js.map +1 -1
  182. package/dist/storage/json-branch-registry-store.d.ts +1 -1
  183. package/dist/storage/json-branch-registry-store.d.ts.map +1 -1
  184. package/dist/storage/json-branch-registry-store.js +33 -7
  185. package/dist/storage/json-branch-registry-store.js.map +1 -1
  186. package/dist/storage/local.d.ts +1 -1
  187. package/dist/storage/local.d.ts.map +1 -1
  188. package/dist/storage/local.js +2 -2
  189. package/dist/storage/local.js.map +1 -1
  190. package/dist/storage/memory-branch-registry-store.d.ts +1 -1
  191. package/dist/storage/memory-branch-registry-store.d.ts.map +1 -1
  192. package/dist/storage/memory-branch-registry-store.js +4 -1
  193. package/dist/storage/memory-branch-registry-store.js.map +1 -1
  194. package/dist/storage/supabase-registry-sync-client-impl.d.ts +1 -7
  195. package/dist/storage/supabase-registry-sync-client-impl.d.ts.map +1 -1
  196. package/dist/storage/supabase-registry-sync-client-impl.js +17 -61
  197. package/dist/storage/supabase-registry-sync-client-impl.js.map +1 -1
  198. package/dist/storage/supabase-registry-sync-client.d.ts +1 -1
  199. package/dist/storage/supabase-registry-sync-client.d.ts.map +1 -1
  200. package/dist/storage/supabase.d.ts +3 -9
  201. package/dist/storage/supabase.d.ts.map +1 -1
  202. package/dist/storage/supabase.js +4 -22
  203. package/dist/storage/supabase.js.map +1 -1
  204. package/dist/types/cloud.d.ts +1 -0
  205. package/dist/types/cloud.d.ts.map +1 -1
  206. package/package.json +88 -90
  207. package/dist/commands/activate.d.ts +0 -9
  208. package/dist/commands/activate.d.ts.map +0 -1
  209. package/dist/commands/activate.js +0 -45
  210. package/dist/commands/activate.js.map +0 -1
  211. package/dist/commands/active-windows.d.ts +0 -16
  212. package/dist/commands/active-windows.d.ts.map +0 -1
  213. package/dist/commands/active-windows.js +0 -373
  214. package/dist/commands/active-windows.js.map +0 -1
  215. package/dist/commands/ai.d.ts +0 -15
  216. package/dist/commands/ai.d.ts.map +0 -1
  217. package/dist/commands/ai.js +0 -498
  218. package/dist/commands/ai.js.map +0 -1
  219. package/dist/commands/audit-mark.d.ts +0 -12
  220. package/dist/commands/audit-mark.d.ts.map +0 -1
  221. package/dist/commands/audit-mark.js +0 -204
  222. package/dist/commands/audit-mark.js.map +0 -1
  223. package/dist/commands/auto.d.ts +0 -8
  224. package/dist/commands/auto.d.ts.map +0 -1
  225. package/dist/commands/auto.js +0 -207
  226. package/dist/commands/auto.js.map +0 -1
  227. package/dist/commands/bot.d.ts +0 -16
  228. package/dist/commands/bot.d.ts.map +0 -1
  229. package/dist/commands/bot.js +0 -416
  230. package/dist/commands/bot.js.map +0 -1
  231. package/dist/commands/close.d.ts +0 -9
  232. package/dist/commands/close.d.ts.map +0 -1
  233. package/dist/commands/close.js +0 -129
  234. package/dist/commands/close.js.map +0 -1
  235. package/dist/commands/collab-sync.d.ts +0 -14
  236. package/dist/commands/collab-sync.d.ts.map +0 -1
  237. package/dist/commands/collab-sync.js +0 -264
  238. package/dist/commands/collab-sync.js.map +0 -1
  239. package/dist/commands/collab.d.ts +0 -6
  240. package/dist/commands/collab.d.ts.map +0 -1
  241. package/dist/commands/collab.js +0 -103
  242. package/dist/commands/collab.js.map +0 -1
  243. package/dist/commands/completions.d.ts +0 -8
  244. package/dist/commands/completions.d.ts.map +0 -1
  245. package/dist/commands/completions.js +0 -83
  246. package/dist/commands/completions.js.map +0 -1
  247. package/dist/commands/daily.d.ts +0 -7
  248. package/dist/commands/daily.d.ts.map +0 -1
  249. package/dist/commands/daily.js +0 -171
  250. package/dist/commands/daily.js.map +0 -1
  251. package/dist/commands/dashboard.d.ts +0 -22
  252. package/dist/commands/dashboard.d.ts.map +0 -1
  253. package/dist/commands/dashboard.js +0 -401
  254. package/dist/commands/dashboard.js.map +0 -1
  255. package/dist/commands/demo.d.ts +0 -3
  256. package/dist/commands/demo.d.ts.map +0 -1
  257. package/dist/commands/demo.js +0 -118
  258. package/dist/commands/demo.js.map +0 -1
  259. package/dist/commands/ecosystem-loader.d.ts +0 -14
  260. package/dist/commands/ecosystem-loader.d.ts.map +0 -1
  261. package/dist/commands/ecosystem-loader.js +0 -90
  262. package/dist/commands/ecosystem-loader.js.map +0 -1
  263. package/dist/commands/fleet-status.d.ts +0 -14
  264. package/dist/commands/fleet-status.d.ts.map +0 -1
  265. package/dist/commands/fleet-status.js +0 -127
  266. package/dist/commands/fleet-status.js.map +0 -1
  267. package/dist/commands/inbox.d.ts +0 -3
  268. package/dist/commands/inbox.d.ts.map +0 -1
  269. package/dist/commands/inbox.js +0 -120
  270. package/dist/commands/inbox.js.map +0 -1
  271. package/dist/commands/intent-scan.d.ts +0 -17
  272. package/dist/commands/intent-scan.d.ts.map +0 -1
  273. package/dist/commands/intent-scan.js +0 -336
  274. package/dist/commands/intent-scan.js.map +0 -1
  275. package/dist/commands/key-import.d.ts +0 -3
  276. package/dist/commands/key-import.d.ts.map +0 -1
  277. package/dist/commands/key-import.js +0 -54
  278. package/dist/commands/key-import.js.map +0 -1
  279. package/dist/commands/keygen.d.ts +0 -3
  280. package/dist/commands/keygen.d.ts.map +0 -1
  281. package/dist/commands/keygen.js +0 -53
  282. package/dist/commands/keygen.js.map +0 -1
  283. package/dist/commands/keys.d.ts +0 -3
  284. package/dist/commands/keys.d.ts.map +0 -1
  285. package/dist/commands/keys.js +0 -56
  286. package/dist/commands/keys.js.map +0 -1
  287. package/dist/commands/lock.d.ts +0 -11
  288. package/dist/commands/lock.d.ts.map +0 -1
  289. package/dist/commands/lock.js +0 -257
  290. package/dist/commands/lock.js.map +0 -1
  291. package/dist/commands/mcp-health.d.ts +0 -3
  292. package/dist/commands/mcp-health.d.ts.map +0 -1
  293. package/dist/commands/mcp-health.js +0 -305
  294. package/dist/commands/mcp-health.js.map +0 -1
  295. package/dist/commands/mcp-restart.d.ts +0 -3
  296. package/dist/commands/mcp-restart.d.ts.map +0 -1
  297. package/dist/commands/mcp-restart.js +0 -176
  298. package/dist/commands/mcp-restart.js.map +0 -1
  299. package/dist/commands/monitor.d.ts +0 -3
  300. package/dist/commands/monitor.d.ts.map +0 -1
  301. package/dist/commands/monitor.js +0 -153
  302. package/dist/commands/monitor.js.map +0 -1
  303. package/dist/commands/msg-read.d.ts +0 -3
  304. package/dist/commands/msg-read.d.ts.map +0 -1
  305. package/dist/commands/msg-read.js +0 -95
  306. package/dist/commands/msg-read.js.map +0 -1
  307. package/dist/commands/pulse.d.ts +0 -13
  308. package/dist/commands/pulse.d.ts.map +0 -1
  309. package/dist/commands/pulse.js +0 -174
  310. package/dist/commands/pulse.js.map +0 -1
  311. package/dist/commands/queen.d.ts +0 -25
  312. package/dist/commands/queen.d.ts.map +0 -1
  313. package/dist/commands/queen.js +0 -326
  314. package/dist/commands/queen.js.map +0 -1
  315. package/dist/commands/radar.d.ts +0 -3
  316. package/dist/commands/radar.d.ts.map +0 -1
  317. package/dist/commands/radar.js +0 -147
  318. package/dist/commands/radar.js.map +0 -1
  319. package/dist/commands/rescue.d.ts +0 -11
  320. package/dist/commands/rescue.d.ts.map +0 -1
  321. package/dist/commands/rescue.js +0 -147
  322. package/dist/commands/rescue.js.map +0 -1
  323. package/dist/commands/semantic.d.ts +0 -3
  324. package/dist/commands/semantic.d.ts.map +0 -1
  325. package/dist/commands/semantic.js +0 -62
  326. package/dist/commands/semantic.js.map +0 -1
  327. package/dist/commands/send.d.ts +0 -3
  328. package/dist/commands/send.d.ts.map +0 -1
  329. package/dist/commands/send.js +0 -121
  330. package/dist/commands/send.js.map +0 -1
  331. package/dist/commands/status.d.ts +0 -9
  332. package/dist/commands/status.d.ts.map +0 -1
  333. package/dist/commands/status.js +0 -41
  334. package/dist/commands/status.js.map +0 -1
  335. package/dist/commands/sync-advisor.d.ts +0 -14
  336. package/dist/commands/sync-advisor.d.ts.map +0 -1
  337. package/dist/commands/sync-advisor.js +0 -110
  338. package/dist/commands/sync-advisor.js.map +0 -1
  339. package/dist/commands/tension.d.ts +0 -12
  340. package/dist/commands/tension.d.ts.map +0 -1
  341. package/dist/commands/tension.js +0 -262
  342. package/dist/commands/tension.js.map +0 -1
  343. package/dist/commands/torrent.d.ts +0 -9
  344. package/dist/commands/torrent.d.ts.map +0 -1
  345. package/dist/commands/torrent.js +0 -470
  346. package/dist/commands/torrent.js.map +0 -1
  347. package/dist/commands/tui.d.ts +0 -8
  348. package/dist/commands/tui.d.ts.map +0 -1
  349. package/dist/commands/tui.js +0 -15
  350. package/dist/commands/tui.js.map +0 -1
  351. package/dist/commands/wake.d.ts +0 -9
  352. package/dist/commands/wake.d.ts.map +0 -1
  353. package/dist/commands/wake.js +0 -188
  354. package/dist/commands/wake.js.map +0 -1
  355. package/dist/commands/welcome.d.ts +0 -8
  356. package/dist/commands/welcome.d.ts.map +0 -1
  357. package/dist/commands/welcome.js +0 -85
  358. package/dist/commands/welcome.js.map +0 -1
  359. package/dist/commands/who-owns.d.ts +0 -3
  360. package/dist/commands/who-owns.d.ts.map +0 -1
  361. package/dist/commands/who-owns.js +0 -68
  362. package/dist/commands/who-owns.js.map +0 -1
  363. package/dist/commands/who-touched.d.ts +0 -9
  364. package/dist/commands/who-touched.d.ts.map +0 -1
  365. package/dist/commands/who-touched.js +0 -198
  366. package/dist/commands/who-touched.js.map +0 -1
  367. package/dist/lib/crdt.d.ts +0 -83
  368. package/dist/lib/crdt.d.ts.map +0 -1
  369. package/dist/lib/crdt.js +0 -160
  370. package/dist/lib/crdt.js.map +0 -1
  371. package/dist/lib/daily-bridge.d.ts +0 -41
  372. package/dist/lib/daily-bridge.d.ts.map +0 -1
  373. package/dist/lib/daily-bridge.js +0 -186
  374. package/dist/lib/daily-bridge.js.map +0 -1
  375. package/dist/lib/hub.d.ts +0 -31
  376. package/dist/lib/hub.d.ts.map +0 -1
  377. package/dist/lib/hub.js +0 -92
  378. package/dist/lib/hub.js.map +0 -1
  379. package/dist/lib/license.d.ts +0 -61
  380. package/dist/lib/license.d.ts.map +0 -1
  381. package/dist/lib/license.js +0 -171
  382. package/dist/lib/license.js.map +0 -1
  383. package/dist/lib/pulse-renderer.d.ts +0 -19
  384. package/dist/lib/pulse-renderer.d.ts.map +0 -1
  385. package/dist/lib/pulse-renderer.js +0 -108
  386. package/dist/lib/pulse-renderer.js.map +0 -1
  387. package/dist/lib/repo-scanner.d.ts +0 -32
  388. package/dist/lib/repo-scanner.d.ts.map +0 -1
  389. package/dist/lib/repo-scanner.js +0 -160
  390. package/dist/lib/repo-scanner.js.map +0 -1
  391. package/dist/lib/salvage-analyzer.d.ts +0 -29
  392. package/dist/lib/salvage-analyzer.d.ts.map +0 -1
  393. package/dist/lib/salvage-analyzer.js +0 -121
  394. package/dist/lib/salvage-analyzer.js.map +0 -1
  395. package/dist/lib/session-logger.d.ts +0 -54
  396. package/dist/lib/session-logger.d.ts.map +0 -1
  397. package/dist/lib/session-logger.js +0 -136
  398. package/dist/lib/session-logger.js.map +0 -1
  399. package/dist/lib/symbol-extractor.d.ts +0 -41
  400. package/dist/lib/symbol-extractor.d.ts.map +0 -1
  401. package/dist/lib/symbol-extractor.js +0 -78
  402. package/dist/lib/symbol-extractor.js.map +0 -1
  403. package/dist/storage/git-messages.d.ts +0 -53
  404. package/dist/storage/git-messages.d.ts.map +0 -1
  405. package/dist/storage/git-messages.js +0 -376
  406. package/dist/storage/git-messages.js.map +0 -1
  407. package/dist/storage/local-messages.d.ts +0 -37
  408. package/dist/storage/local-messages.d.ts.map +0 -1
  409. package/dist/storage/local-messages.js +0 -151
  410. package/dist/storage/local-messages.js.map +0 -1
  411. package/dist/storage/message-adapter.d.ts +0 -86
  412. package/dist/storage/message-adapter.d.ts.map +0 -1
  413. package/dist/storage/message-adapter.js +0 -28
  414. package/dist/storage/message-adapter.js.map +0 -1
  415. package/dist/storage/message-factory.d.ts +0 -36
  416. package/dist/storage/message-factory.d.ts.map +0 -1
  417. package/dist/storage/message-factory.js +0 -99
  418. package/dist/storage/message-factory.js.map +0 -1
  419. package/dist/storage/mycmail-adapter.d.ts +0 -38
  420. package/dist/storage/mycmail-adapter.d.ts.map +0 -1
  421. package/dist/storage/mycmail-adapter.js +0 -300
  422. package/dist/storage/mycmail-adapter.js.map +0 -1
  423. package/dist/tui/dashboard.d.ts +0 -35
  424. package/dist/tui/dashboard.d.ts.map +0 -1
  425. package/dist/tui/dashboard.js +0 -199
  426. package/dist/tui/dashboard.js.map +0 -1
  427. package/dist/tui/screen.d.ts +0 -14
  428. package/dist/tui/screen.d.ts.map +0 -1
  429. package/dist/tui/screen.js +0 -138
  430. package/dist/tui/screen.js.map +0 -1
@@ -0,0 +1,68 @@
1
+ /**
2
+ * notify — the delivery seam for git-watch alerts.
3
+ *
4
+ * Every alert in git-events-subscriber.ts used to inline its own transport:
5
+ * `execFile('envoak', ['hive','signal',...], cb)` with the callback discarding
6
+ * the result. When `envoak hive signal` was removed (Envoak#148, ADR-0002) all
7
+ * five sites died at once, and because no site inspected its own result the
8
+ * daemon went on logging success for a month (sp-8iqm).
9
+ *
10
+ * So the transport lives behind one interface, and that interface returns a
11
+ * RESULT rather than swallowing it. A caller cannot accidentally claim success:
12
+ * there is a value it has to look at.
13
+ *
14
+ * Adapters are selected by env, so swapping transports is config, not code:
15
+ * SPIDERSAN_ROOM_TOKEN — post to a toak.me room (POST /api/chat/send).
16
+ * Name matches the vault secret toak/SPIDERSAN_ROOM_TOKEN,
17
+ * so `envoak vault inject` supplies it directly.
18
+ * unset — nullNotifier: reports undelivered, never pretends
19
+ */
20
+ export type Delivered = {
21
+ ok: true;
22
+ } | {
23
+ ok: false;
24
+ reason: string;
25
+ };
26
+ export interface NotifyEvent {
27
+ repo: string;
28
+ branch: string;
29
+ /** Conflict tier. Callers gate on this themselves — policy is not ours. */
30
+ tier: number;
31
+ /** Human-readable line. May be LLM-generated — never key off this. */
32
+ message: string;
33
+ /**
34
+ * Stable identity of the underlying event, for deduplication. MUST be
35
+ * built only from deterministic facts (repo, branch, sha, action) — the
36
+ * tier>=2 path escalates to an LLM, so `message` differs between two
37
+ * deliveries of the same event and cannot be used here.
38
+ */
39
+ dedupe: string;
40
+ /** GitHub login or agent that triggered it, when known. */
41
+ agent?: string;
42
+ files?: string[];
43
+ /** Extra fields passed through to the room as structured metadata. */
44
+ details?: Record<string, unknown>;
45
+ }
46
+ /**
47
+ * A transport. One function — nothing here needs a class.
48
+ *
49
+ * CONTRACT: a Notifier MUST NOT throw. It reports failure by returning
50
+ * `{ok:false, reason}`. Call sites sit inside `catch` blocks that swallow
51
+ * AI-layer errors, so a thrown transport error would be misread as an AI
52
+ * failure and vanish — the same silence this module exists to remove.
53
+ */
54
+ export type Notifier = (event: NotifyEvent) => Promise<Delivered>;
55
+ /** Post to a toak.me room. The room join token is a read+write secret. */
56
+ export declare function toakRoomNotifier(token: string, fetchImpl?: typeof fetch): Notifier;
57
+ /**
58
+ * No transport configured. Reports undelivered rather than pretending — the
59
+ * whole point of sp-8iqm is that a severed channel must be visible.
60
+ */
61
+ export declare const nullNotifier: Notifier;
62
+ export declare function createNotifier(): Notifier;
63
+ /**
64
+ * Deliver, then log the real outcome. This is the ONLY place allowed to say a
65
+ * notification was sent, and it says so only after looking at the result.
66
+ */
67
+ export declare function deliver(notifier: Notifier, event: NotifyEvent, log: (m: string) => void): Promise<Delivered>;
68
+ //# sourceMappingURL=notify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/lib/notify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,MAAM,MAAM,SAAS,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AAmClE,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,OAAO,KAAa,GAAG,QAAQ,CAiCzF;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,QAGzB,CAAC;AAEH,wBAAgB,cAAc,IAAI,QAAQ,CAGzC;AAED;;;GAGG;AACH,wBAAsB,OAAO,CACzB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GACzB,OAAO,CAAC,SAAS,CAAC,CAKpB"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * notify — the delivery seam for git-watch alerts.
3
+ *
4
+ * Every alert in git-events-subscriber.ts used to inline its own transport:
5
+ * `execFile('envoak', ['hive','signal',...], cb)` with the callback discarding
6
+ * the result. When `envoak hive signal` was removed (Envoak#148, ADR-0002) all
7
+ * five sites died at once, and because no site inspected its own result the
8
+ * daemon went on logging success for a month (sp-8iqm).
9
+ *
10
+ * So the transport lives behind one interface, and that interface returns a
11
+ * RESULT rather than swallowing it. A caller cannot accidentally claim success:
12
+ * there is a value it has to look at.
13
+ *
14
+ * Adapters are selected by env, so swapping transports is config, not code:
15
+ * SPIDERSAN_ROOM_TOKEN — post to a toak.me room (POST /api/chat/send).
16
+ * Name matches the vault secret toak/SPIDERSAN_ROOM_TOKEN,
17
+ * so `envoak vault inject` supplies it directly.
18
+ * unset — nullNotifier: reports undelivered, never pretends
19
+ */
20
+ import { createHash } from 'crypto';
21
+ import { hostname } from 'os';
22
+ const TOAK_URL = process.env.TOAK_CHAT_URL || 'https://toak.me/api/chat/send';
23
+ // Bare name, no `agent:` prefix. Room allowlists match the sender string
24
+ // EXACTLY — the `agent:<id>` form in toak's send route governs verification
25
+ // upgrade, not allowlist matching, and conflating the two means an approved
26
+ // `spidersan` would not admit a sender of `agent:spidersan`. The machine goes
27
+ // in metadata instead, so one approval covers every host.
28
+ const SENDER = process.env.SPIDERSAN_AGENT || 'spidersan';
29
+ const MACHINE = process.env.TREEBIRD_MACHINE || hostname();
30
+ /**
31
+ * Stable per event, so a catch-up poll that replays an event minutes later
32
+ * does not post it twice. The server's own default is a ~5s time bucket, far
33
+ * shorter than our reconnect window.
34
+ */
35
+ function idempotencyKey(e) {
36
+ return createHash('sha256')
37
+ .update([e.repo, e.branch, e.tier, e.dedupe].join(' '))
38
+ .digest('hex');
39
+ }
40
+ /**
41
+ * The original emits were fire-and-forget with `{ timeout: 10000 }`. These are
42
+ * awaited inside the event handlers, so an unbounded fetch would stall the
43
+ * handler and queue every event behind it. Same budget as before.
44
+ */
45
+ const TIMEOUT_MS = 10_000;
46
+ function format(e) {
47
+ const who = e.agent ? ` by ${e.agent}` : '';
48
+ const files = e.files?.length ? `\nfiles: ${e.files.slice(0, 10).join(', ')}` : '';
49
+ return `TIER ${e.tier} conflict - ${e.repo}/${e.branch}${who}\n${e.message}${files}`;
50
+ }
51
+ /** Post to a toak.me room. The room join token is a read+write secret. */
52
+ export function toakRoomNotifier(token, fetchImpl = fetch) {
53
+ return async (event) => {
54
+ try {
55
+ const res = await fetchImpl(TOAK_URL, {
56
+ method: 'POST',
57
+ headers: { 'Content-Type': 'application/json' },
58
+ signal: AbortSignal.timeout(TIMEOUT_MS),
59
+ body: JSON.stringify({
60
+ token,
61
+ sender: SENDER,
62
+ content: format(event),
63
+ idempotency_key: idempotencyKey(event),
64
+ metadata: {
65
+ machine: MACHINE,
66
+ repo: event.repo,
67
+ branch: event.branch,
68
+ tier: event.tier,
69
+ agent: event.agent,
70
+ files: event.files,
71
+ ...event.details,
72
+ },
73
+ }),
74
+ });
75
+ // The POST response IS the call-time liveness check — no probe needed.
76
+ if (!res.ok) {
77
+ const body = await res.text().catch(() => '');
78
+ return { ok: false, reason: `${res.status} ${body.slice(0, 120)}`.trim() };
79
+ }
80
+ return { ok: true };
81
+ }
82
+ catch (err) {
83
+ return { ok: false, reason: err instanceof Error ? err.message : String(err) };
84
+ }
85
+ };
86
+ }
87
+ /**
88
+ * No transport configured. Reports undelivered rather than pretending — the
89
+ * whole point of sp-8iqm is that a severed channel must be visible.
90
+ */
91
+ export const nullNotifier = async () => ({
92
+ ok: false,
93
+ reason: 'no transport configured (set SPIDERSAN_ROOM_TOKEN)',
94
+ });
95
+ export function createNotifier() {
96
+ const token = process.env.SPIDERSAN_ROOM_TOKEN;
97
+ return token ? toakRoomNotifier(token) : nullNotifier;
98
+ }
99
+ /**
100
+ * Deliver, then log the real outcome. This is the ONLY place allowed to say a
101
+ * notification was sent, and it says so only after looking at the result.
102
+ */
103
+ export async function deliver(notifier, event, log) {
104
+ const result = await notifier(event);
105
+ if (result.ok)
106
+ log(`notified: TIER ${event.tier} ${event.repo}/${event.branch}`);
107
+ else
108
+ log(`NOT NOTIFIED (TIER ${event.tier} ${event.repo}/${event.branch}): ${result.reason}`);
109
+ return result;
110
+ }
111
+ //# sourceMappingURL=notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/lib/notify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type SymbolConflict, type SymbolInfo } from './ast.js';
2
+ /** ext includes the dot, e.g. '.py'. Only function/class/method symbols are kept. */
3
+ export declare function outlineSymbols(content: string, ext: string): SymbolInfo[] | null;
4
+ /** Same contract as ASTParser.findSymbolConflicts, for any language ast-grep outlines. null = unavailable. */
5
+ export declare function findOutlineConflicts(ext: string, contentA: string, labelA: string, contentB: string, labelB: string, baseContent?: string): SymbolConflict[] | null;
6
+ //# sourceMappingURL=outline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outline.d.ts","sourceRoot":"","sources":["../../src/lib/outline.ts"],"names":[],"mappings":"AAUA,OAAO,EAAkB,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAShF,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,EAAE,GAAG,IAAI,CAiChF;AAED,8GAA8G;AAC9G,wBAAgB,oBAAoB,CAChC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAChC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAChC,WAAW,CAAC,EAAE,MAAM,GACrB,cAAc,EAAE,GAAG,IAAI,CAMzB"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * outline.ts — spike: symbol extraction for non-TS languages via `ast-grep outline`.
3
+ *
4
+ * Optional: needs the `ast-grep` binary on PATH. Returns null when it is missing
5
+ * or fails, so callers can skip (never conclude "no conflicts" from null).
6
+ */
7
+ import { execFileSync } from 'child_process';
8
+ import { mkdtempSync, writeFileSync, rmSync } from 'fs';
9
+ import { tmpdir } from 'os';
10
+ import { join } from 'path';
11
+ import { compareSymbols } from './ast.js';
12
+ /** ext includes the dot, e.g. '.py'. Only function/class/method symbols are kept. */
13
+ export function outlineSymbols(content, ext) {
14
+ const dir = mkdtempSync(join(tmpdir(), 'spidersan-outline-'));
15
+ try {
16
+ const file = join(dir, `f${ext}`);
17
+ writeFileSync(file, content);
18
+ const out = execFileSync('ast-grep', ['outline', '--json=compact', file], {
19
+ encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'],
20
+ });
21
+ const files = JSON.parse(out);
22
+ // `[]` = ast-grep doesn't know this file type; that is "unknown", not "no symbols"
23
+ if (!Array.isArray(files) || files.length === 0)
24
+ return null;
25
+ const items = files[0].items ?? [];
26
+ const bytes = Buffer.from(content);
27
+ const symbols = [];
28
+ const add = (it, parent) => {
29
+ const type = it.symbolType;
30
+ if (type !== 'function' && type !== 'class' && type !== 'method')
31
+ return;
32
+ symbols.push({
33
+ name: it.name, type,
34
+ startLine: it.range.start.line + 1, endLine: it.range.end.line + 1,
35
+ ...(parent ? { parent } : {}),
36
+ // byteOffset, not line slicing: exact text of the symbol
37
+ content: bytes.subarray(it.range.byteOffset.start, it.range.byteOffset.end).toString('utf-8'),
38
+ });
39
+ it.members?.forEach(m => add(m, it.name));
40
+ };
41
+ items.forEach(it => add(it));
42
+ return symbols;
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ finally {
48
+ rmSync(dir, { recursive: true, force: true });
49
+ }
50
+ }
51
+ /** Same contract as ASTParser.findSymbolConflicts, for any language ast-grep outlines. null = unavailable. */
52
+ export function findOutlineConflicts(ext, contentA, labelA, contentB, labelB, baseContent) {
53
+ const a = outlineSymbols(contentA, ext);
54
+ const b = outlineSymbols(contentB, ext);
55
+ const base = baseContent === undefined ? undefined : outlineSymbols(baseContent, ext);
56
+ if (!a || !b || base === null)
57
+ return null;
58
+ return compareSymbols(a, labelA, b, labelB, base);
59
+ }
60
+ //# sourceMappingURL=outline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outline.js","sourceRoot":"","sources":["../../src/lib/outline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Pushed-branch rows in spider_registries — the reader side.
3
+ *
4
+ * The `spidersan-webhook` edge function (treebird repo) registers every branch pushed
5
+ * to a watched repo, whoever pushed it (Codex, Copilot, a cloud agent, the web editor,
6
+ * a person), under one virtual machine, `github-push`. The write stays server-side:
7
+ * GitHub's HMAC proves the event and the service key never leaves Supabase.
8
+ *
9
+ * Such a row is shadowed — dropped on read — whenever a real machine has the same
10
+ * branch, so a branch registered by the machine that pushed it never shows twice or
11
+ * conflicts with itself (see dropShadowedPushRows).
12
+ */
13
+ import type { MachineRegistryView } from '../types/cloud.js';
14
+ export declare const PUSH_MACHINE_ID = "github-push";
15
+ /**
16
+ * Drop pushed-branch rows a real registration already covers. Applied on every read
17
+ * (pull) BEFORE the caller's own machine is excluded, so a branch the caller itself
18
+ * registered doesn't come back as "github/<branch>" and conflict with itself.
19
+ * `ownBranches` covers the race where the webhook beats the pusher's own registry-sync.
20
+ */
21
+ export declare function dropShadowedPushRows(views: MachineRegistryView[], ownBranches?: Iterable<string>): MachineRegistryView[];
22
+ //# sourceMappingURL=push-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-registry.d.ts","sourceRoot":"","sources":["../../src/lib/push-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAE7C;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE,WAAW,GAAE,QAAQ,CAAC,MAAM,CAAM,GAAG,mBAAmB,EAAE,CAS5H"}
@@ -0,0 +1,21 @@
1
+ export const PUSH_MACHINE_ID = 'github-push';
2
+ /**
3
+ * Drop pushed-branch rows a real registration already covers. Applied on every read
4
+ * (pull) BEFORE the caller's own machine is excluded, so a branch the caller itself
5
+ * registered doesn't come back as "github/<branch>" and conflict with itself.
6
+ * `ownBranches` covers the race where the webhook beats the pusher's own registry-sync.
7
+ */
8
+ export function dropShadowedPushRows(views, ownBranches = []) {
9
+ const covered = new Set(ownBranches);
10
+ for (const v of views) {
11
+ if (v.machine_id === PUSH_MACHINE_ID)
12
+ continue;
13
+ for (const b of v.branches)
14
+ if (b.status === 'active')
15
+ covered.add(b.name);
16
+ }
17
+ return views
18
+ .map(v => v.machine_id !== PUSH_MACHINE_ID ? v : { ...v, branches: v.branches.filter(b => !covered.has(b.name)) })
19
+ .filter(v => v.machine_id !== PUSH_MACHINE_ID || v.branches.length > 0);
20
+ }
21
+ //# sourceMappingURL=push-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-registry.js","sourceRoot":"","sources":["../../src/lib/push-registry.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAA4B,EAAE,cAAgC,EAAE;IACjG,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,WAAW,CAAC,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,CAAC,UAAU,KAAK,eAAe;YAAE,SAAS;QAC/C,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ;YAAE,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,KAAK;SACP,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;SACjH,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,eAAe,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Reconcile-on-read (tb-8sa.1 step 2)
3
+ *
4
+ * The registry's `status` field is only as fresh as the last `spidersan merged`
5
+ * / `sync` call — and a committed registry snapshot can carry an `active` entry
6
+ * for a branch that has since merged. Trusting that stale status is what
7
+ * produced the phantom-conflict incident (a fully-merged branch still flagged
8
+ * as conflicting from a stale worktree).
9
+ *
10
+ * Reconcile-on-read folds git truth in BEFORE conflicts / ready-check /
11
+ * merge-order answer:
12
+ * - ref gone from local AND remote → orphaned (drop)
13
+ * - tip is an ancestor of trunk → merged (drop)
14
+ * - trunk has a patch-id-equivalent squash → merged (drop, tb-tr1z)
15
+ * - otherwise → live (keep)
16
+ *
17
+ * It only consults git for entries the registry still calls `active`; entries
18
+ * already marked `completed` / `abandoned` are honoured without a git probe.
19
+ */
20
+ import type { Branch } from '../storage/adapter.js';
21
+ export interface ReconcileResult {
22
+ /** Branches still genuinely in flight — the set readers should act on. */
23
+ live: Branch[];
24
+ /** Names detected as merged into trunk (by status or by is-ancestor). */
25
+ merged: string[];
26
+ /** Names whose ref is gone from both local and remote. */
27
+ orphaned: string[];
28
+ }
29
+ /**
30
+ * Injectable git probes so reconcile is unit-testable without a real repo.
31
+ * Defaults wire to the real `git.ts` helpers via {@link defaultReconcileDeps}.
32
+ */
33
+ export interface ReconcileDeps {
34
+ /** Resolve a branch name to a usable ref, or `null` if no ref exists. */
35
+ resolveRef: (name: string) => string | null;
36
+ /**
37
+ * Resolve the LOCAL ref (`refs/heads/<name>`), or `null` if none. When the
38
+ * primary ref is the remote-tracking one, a stale `origin/<name>` can be an
39
+ * ancestor of trunk while fresh unpushed local commits are not — both must
40
+ * be merged before the branch is reconciled away. Optional for injectors.
41
+ */
42
+ resolveLocalRef?: (name: string) => string | null;
43
+ /** True if `ref` is fully merged into `trunkRef`. */
44
+ isMerged: (ref: string, trunkRef: string) => boolean;
45
+ /**
46
+ * True if `ref`'s content landed in trunk via a SQUASH merge (tb-tr1z) —
47
+ * consulted only when `isMerged` says no, since squash merges never make
48
+ * the tip an ancestor. Optional for injectors.
49
+ */
50
+ isSquashMerged?: (ref: string, trunkRef: string) => boolean;
51
+ /**
52
+ * Branch names that exist on the remote now, or `null` if it can't be asked.
53
+ * {@link activeBranches} drops an orphan only when this confirms it is gone.
54
+ * Absent (injectors) behaves like `null`: orphans are kept.
55
+ */
56
+ remoteHeads?: () => Set<string> | null;
57
+ /** Bare trunk branch name (e.g. `main`) — never reconciled away. */
58
+ trunkName: string;
59
+ /** Ref used as the merge target for is-ancestor (prefers `origin/main`). */
60
+ trunkRef: string;
61
+ }
62
+ export declare function defaultReconcileDeps(): ReconcileDeps;
63
+ /**
64
+ * Partition registered branches into live / merged / orphaned using git truth.
65
+ *
66
+ * @param branches the raw registry entries (e.g. `await storage.list()`)
67
+ * @param deps git probes; defaults to the real repo
68
+ */
69
+ export declare function reconcileBranches(branches: Branch[], deps?: ReconcileDeps): ReconcileResult;
70
+ /**
71
+ * Read-path convenience for conflict detection: registered `active` branches
72
+ * minus those PROVEN merged into trunk (is-ancestor / squash-equivalent, or
73
+ * status `completed`) and those PROVEN deleted.
74
+ *
75
+ * An orphan (no local or tracking ref) is ambiguous: deleted, or live on
76
+ * another machine and never fetched here. A squash-merged, deleted branch is
77
+ * never an ancestor of trunk, so it only ever reads as orphaned — keeping every
78
+ * orphan made those phantom-conflict forever. So an orphan is dropped only when
79
+ * `git ls-remote` confirms the branch is gone from the remote; if the remote
80
+ * can't be asked, orphans are kept (a phantom beats a missed conflict). This
81
+ * matters most for ready-check, which gets no cross-machine registry pull.
82
+ *
83
+ * Read-side filter only — nothing is deleted. This is what conflicts /
84
+ * ready-check / merge-order should call; `sync` uses {@link reconcileBranches}
85
+ * directly to actually prune merged and orphaned entries.
86
+ */
87
+ export declare function activeBranches(branches: Branch[], deps?: ReconcileDeps): Branch[];
88
+ /**
89
+ * Split orphans (no local or tracking ref) into those the remote confirms are
90
+ * `gone` and those to `kept` — still on the remote (unfetched here), or every
91
+ * one of them when the remote can't be asked (`remoteChecked: false`). Shared by
92
+ * {@link activeBranches} (read side) and `sync` (which deletes `gone` only, sp-slemub).
93
+ * Only hits the network when there is an orphan to decide.
94
+ */
95
+ export declare function splitOrphans(orphaned: string[], deps?: Pick<ReconcileDeps, 'remoteHeads'>): {
96
+ gone: string[];
97
+ kept: string[];
98
+ remoteChecked: boolean;
99
+ };
100
+ //# sourceMappingURL=reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../src/lib/reconcile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC5B,0EAA0E;IAC1E,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,yEAAyE;IACzE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC1B,yEAAyE;IACzE,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC5C;;;;;OAKG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAClD,qDAAqD;IACrD,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IACrD;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5D;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACvC,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,oBAAoB,IAAI,aAAa,CAapD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC7B,QAAQ,EAAE,MAAM,EAAE,EAClB,IAAI,GAAE,aAAsC,GAC7C,eAAe,CA+CjB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,aAAsC,GAAG,MAAM,EAAE,CAIzG;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CACxB,QAAQ,EAAE,MAAM,EAAE,EAClB,IAAI,GAAE,IAAI,CAAC,aAAa,EAAE,aAAa,CAA4C,GACpF;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,OAAO,CAAA;CAAE,CAK5D"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Reconcile-on-read (tb-8sa.1 step 2)
3
+ *
4
+ * The registry's `status` field is only as fresh as the last `spidersan merged`
5
+ * / `sync` call — and a committed registry snapshot can carry an `active` entry
6
+ * for a branch that has since merged. Trusting that stale status is what
7
+ * produced the phantom-conflict incident (a fully-merged branch still flagged
8
+ * as conflicting from a stale worktree).
9
+ *
10
+ * Reconcile-on-read folds git truth in BEFORE conflicts / ready-check /
11
+ * merge-order answer:
12
+ * - ref gone from local AND remote → orphaned (drop)
13
+ * - tip is an ancestor of trunk → merged (drop)
14
+ * - trunk has a patch-id-equivalent squash → merged (drop, tb-tr1z)
15
+ * - otherwise → live (keep)
16
+ *
17
+ * It only consults git for entries the registry still calls `active`; entries
18
+ * already marked `completed` / `abandoned` are honoured without a git probe.
19
+ */
20
+ import { resolveBranchRef, resolveLocalBranchRef, isMergedInto, isSquashMergedInto, listRemoteHeads } from './git.js';
21
+ import { getTrunkBranch } from './trunk.js';
22
+ export function defaultReconcileDeps() {
23
+ const trunkName = getTrunkBranch();
24
+ // Prefer the remote trunk ref so a stale local `main` can't mask merges.
25
+ const trunkRef = resolveBranchRef(trunkName) ?? trunkName;
26
+ return {
27
+ resolveRef: (name) => resolveBranchRef(name),
28
+ resolveLocalRef: (name) => resolveLocalBranchRef(name),
29
+ isMerged: (ref, trunk) => isMergedInto(ref, trunk),
30
+ isSquashMerged: (ref, trunk) => isSquashMergedInto(ref, trunk),
31
+ remoteHeads: () => listRemoteHeads(),
32
+ trunkName,
33
+ trunkRef,
34
+ };
35
+ }
36
+ /**
37
+ * Partition registered branches into live / merged / orphaned using git truth.
38
+ *
39
+ * @param branches the raw registry entries (e.g. `await storage.list()`)
40
+ * @param deps git probes; defaults to the real repo
41
+ */
42
+ export function reconcileBranches(branches, deps = defaultReconcileDeps()) {
43
+ const live = [];
44
+ const merged = [];
45
+ const orphaned = [];
46
+ for (const branch of branches) {
47
+ // The trunk itself is never "in flight" but also never reconciled away —
48
+ // pass it through unchanged so readers keep their existing handling.
49
+ if (branch.name === deps.trunkName) {
50
+ live.push(branch);
51
+ continue;
52
+ }
53
+ // Honour terminal registry status without a git probe.
54
+ if (branch.status === 'completed') {
55
+ merged.push(branch.name);
56
+ continue;
57
+ }
58
+ if (branch.status === 'abandoned') {
59
+ orphaned.push(branch.name);
60
+ continue;
61
+ }
62
+ // status === 'active' — fold in git truth. Squash merges never make
63
+ // the tip an ancestor, so fall back to patch-id equivalence (tb-tr1z).
64
+ const provenMerged = (r) => deps.isMerged(r, deps.trunkRef) || (deps.isSquashMerged?.(r, deps.trunkRef) ?? false);
65
+ const ref = deps.resolveRef(branch.name);
66
+ if (ref === null) {
67
+ orphaned.push(branch.name);
68
+ continue;
69
+ }
70
+ if (provenMerged(ref)) {
71
+ // The primary ref may be a stale origin/<name> while unpushed local
72
+ // commits exist — only reconcile away if the local tip (when it
73
+ // exists and differs) is merged too.
74
+ const localRef = deps.resolveLocalRef?.(branch.name) ?? null;
75
+ if (localRef === null || localRef === ref || provenMerged(localRef)) {
76
+ merged.push(branch.name);
77
+ continue;
78
+ }
79
+ }
80
+ live.push(branch);
81
+ }
82
+ return { live, merged, orphaned };
83
+ }
84
+ /**
85
+ * Read-path convenience for conflict detection: registered `active` branches
86
+ * minus those PROVEN merged into trunk (is-ancestor / squash-equivalent, or
87
+ * status `completed`) and those PROVEN deleted.
88
+ *
89
+ * An orphan (no local or tracking ref) is ambiguous: deleted, or live on
90
+ * another machine and never fetched here. A squash-merged, deleted branch is
91
+ * never an ancestor of trunk, so it only ever reads as orphaned — keeping every
92
+ * orphan made those phantom-conflict forever. So an orphan is dropped only when
93
+ * `git ls-remote` confirms the branch is gone from the remote; if the remote
94
+ * can't be asked, orphans are kept (a phantom beats a missed conflict). This
95
+ * matters most for ready-check, which gets no cross-machine registry pull.
96
+ *
97
+ * Read-side filter only — nothing is deleted. This is what conflicts /
98
+ * ready-check / merge-order should call; `sync` uses {@link reconcileBranches}
99
+ * directly to actually prune merged and orphaned entries.
100
+ */
101
+ export function activeBranches(branches, deps = defaultReconcileDeps()) {
102
+ const { live, orphaned } = reconcileBranches(branches, deps);
103
+ const keep = new Set([...live.map(b => b.name), ...splitOrphans(orphaned, deps).kept]);
104
+ return branches.filter(b => b.status === 'active' && keep.has(b.name));
105
+ }
106
+ /**
107
+ * Split orphans (no local or tracking ref) into those the remote confirms are
108
+ * `gone` and those to `kept` — still on the remote (unfetched here), or every
109
+ * one of them when the remote can't be asked (`remoteChecked: false`). Shared by
110
+ * {@link activeBranches} (read side) and `sync` (which deletes `gone` only, sp-slemub).
111
+ * Only hits the network when there is an orphan to decide.
112
+ */
113
+ export function splitOrphans(orphaned, deps = { remoteHeads: () => listRemoteHeads() }) {
114
+ if (orphaned.length === 0)
115
+ return { gone: [], kept: [], remoteChecked: true };
116
+ const heads = deps.remoteHeads?.() ?? null;
117
+ if (heads === null)
118
+ return { gone: [], kept: orphaned, remoteChecked: false };
119
+ return { gone: orphaned.filter(n => !heads.has(n)), kept: orphaned.filter(n => heads.has(n)), remoteChecked: true };
120
+ }
121
+ //# sourceMappingURL=reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../src/lib/reconcile.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Validate agent ID (e.g., "sherlocksan", "watsan-1", "agent_01")
2
+ * Validate agent ID (e.g., "sherlock", "watsan-1", "agent_01")
3
3
  * @throws Error if invalid
4
4
  */
5
5
  export declare function validateAgentId(agentId: string): string;
@@ -64,11 +64,6 @@ export declare function isValidMessageId(messageId: string): boolean;
64
64
  * @throws Error if path is outside rootDir
65
65
  */
66
66
  export declare function validateRepoPath(filePath: string, rootDir?: string): string;
67
- /**
68
- * Escape text for blessed TUI to prevent markup injection.
69
- * Replaces '{' with '{open}' and '}' with '{close}'.
70
- */
71
- export declare function escapeBlessed(text: string): string;
72
67
  /**
73
68
  * Safely resolves the CLI entry point path.
74
69
  * Replaces insecure usage of process.argv[1] which can be manipulated.
@@ -1 +1 @@
1
- {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/lib/security.ts"],"names":[],"mappings":"AAsBA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAMlE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQrD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYzD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAU3D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGrD;AAGD,eAAO,MAAM,QAAQ;;;;;;CAMpB,CAAA;AAGD,eAAO,MAAM,eAAe,wBAAkB,CAAC;AAC/C,eAAO,MAAM,kBAAkB,2BAAqB,CAAC;AACrD,eAAO,MAAM,gBAAgB,yBAAmB,CAAC;AACjD,eAAO,MAAM,gBAAgB,yBAAmB,CAAC;AAIjD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,MAAsB,GAAG,MAAM,CAgB1F;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAKnC"}
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/lib/security.ts"],"names":[],"mappings":"AAsBA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAMlE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQrD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYzD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAU3D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGrD;AAGD,eAAO,MAAM,QAAQ;;;;;;CAMpB,CAAA;AAGD,eAAO,MAAM,eAAe,wBAAkB,CAAC;AAC/C,eAAO,MAAM,kBAAkB,2BAAqB,CAAC;AACrD,eAAO,MAAM,gBAAgB,yBAAmB,CAAC;AACjD,eAAO,MAAM,gBAAgB,yBAAmB,CAAC;AAIjD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,MAAsB,GAAG,MAAM,CAgB1F;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAKnC"}
@@ -17,7 +17,7 @@ const VALID_FILE_PATH = /^[./a-zA-Z0-9][a-zA-Z0-9/_.@\- ]{0,200}$/;
17
17
  // Shell metacharacters to remove from text
18
18
  const SHELL_METACHARACTERS = /[`$(){}[\]|;&<>\\]/g;
19
19
  /**
20
- * Validate agent ID (e.g., "sherlocksan", "watsan-1", "agent_01")
20
+ * Validate agent ID (e.g., "sherlock", "watsan-1", "agent_01")
21
21
  * @throws Error if invalid
22
22
  */
23
23
  export function validateAgentId(agentId) {
@@ -167,16 +167,6 @@ export function validateRepoPath(filePath, rootDir = process.cwd()) {
167
167
  }
168
168
  return resolved;
169
169
  }
170
- /**
171
- * Escape text for blessed TUI to prevent markup injection.
172
- * Replaces '{' with '{open}' and '}' with '{close}'.
173
- */
174
- export function escapeBlessed(text) {
175
- if (!text || typeof text !== 'string') {
176
- return '';
177
- }
178
- return text.replace(/[{}]/g, (char) => char === '{' ? '{open}' : '{close}');
179
- }
180
170
  /**
181
171
  * Safely resolves the CLI entry point path.
182
172
  * Replaces insecure usage of process.argv[1] which can be manipulated.
@@ -1 +1 @@
1
- {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/lib/security.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/lib/security.ts"],"names":[],"mappings":"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"}