@decibelsystems/tools 2.2.0-beta.0 → 3.1.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 (435) hide show
  1. package/CHANGELOG.md +226 -0
  2. package/dist/agentCommands.d.ts +0 -1
  3. package/dist/agentCommands.d.ts.map +1 -1
  4. package/dist/agentCommands.js +19 -8
  5. package/dist/agentCommands.js.map +1 -1
  6. package/dist/agentPresence.d.ts +82 -0
  7. package/dist/agentPresence.d.ts.map +1 -1
  8. package/dist/agentPresence.js +194 -26
  9. package/dist/agentPresence.js.map +1 -1
  10. package/dist/agentic/index.d.ts +18 -8
  11. package/dist/agentic/index.d.ts.map +1 -1
  12. package/dist/agentic/index.js +18 -144
  13. package/dist/agentic/index.js.map +1 -1
  14. package/dist/agentic/types.d.ts +106 -0
  15. package/dist/agentic/types.d.ts.map +1 -1
  16. package/dist/agentic/types.js +77 -1
  17. package/dist/agentic/types.js.map +1 -1
  18. package/dist/architectAdrs.d.ts +27 -3
  19. package/dist/architectAdrs.d.ts.map +1 -1
  20. package/dist/architectAdrs.js +92 -4
  21. package/dist/architectAdrs.js.map +1 -1
  22. package/dist/artifacts.d.ts +60 -0
  23. package/dist/artifacts.d.ts.map +1 -0
  24. package/dist/artifacts.js +208 -0
  25. package/dist/artifacts.js.map +1 -0
  26. package/dist/asks.d.ts +93 -0
  27. package/dist/asks.d.ts.map +1 -0
  28. package/dist/asks.js +383 -0
  29. package/dist/asks.js.map +1 -0
  30. package/dist/chat.d.ts +47 -0
  31. package/dist/chat.d.ts.map +1 -0
  32. package/dist/chat.js +288 -0
  33. package/dist/chat.js.map +1 -0
  34. package/dist/client/transports.d.ts.map +1 -1
  35. package/dist/client/transports.js +13 -3
  36. package/dist/client/transports.js.map +1 -1
  37. package/dist/daemon.d.ts +33 -3
  38. package/dist/daemon.d.ts.map +1 -1
  39. package/dist/daemon.js +225 -52
  40. package/dist/daemon.js.map +1 -1
  41. package/dist/daemonConfig.d.ts +46 -0
  42. package/dist/daemonConfig.d.ts.map +1 -1
  43. package/dist/daemonConfig.js +57 -12
  44. package/dist/daemonConfig.js.map +1 -1
  45. package/dist/decibelPaths.d.ts.map +1 -1
  46. package/dist/decibelPaths.js +39 -6
  47. package/dist/decibelPaths.js.map +1 -1
  48. package/dist/domain/issue.d.ts +81 -0
  49. package/dist/domain/issue.d.ts.map +1 -0
  50. package/dist/domain/issue.js +106 -0
  51. package/dist/domain/issue.js.map +1 -0
  52. package/dist/domain/issueCodec.d.ts +39 -0
  53. package/dist/domain/issueCodec.d.ts.map +1 -0
  54. package/dist/domain/issueCodec.js +308 -0
  55. package/dist/domain/issueCodec.js.map +1 -0
  56. package/dist/domain/issueRepository.d.ts +124 -0
  57. package/dist/domain/issueRepository.d.ts.map +1 -0
  58. package/dist/domain/issueRepository.js +296 -0
  59. package/dist/domain/issueRepository.js.map +1 -0
  60. package/dist/domain/uid.d.ts +16 -0
  61. package/dist/domain/uid.d.ts.map +1 -0
  62. package/dist/domain/uid.js +43 -0
  63. package/dist/domain/uid.js.map +1 -0
  64. package/dist/facades/definitions.d.ts +0 -1
  65. package/dist/facades/definitions.d.ts.map +1 -1
  66. package/dist/facades/definitions.js +140 -116
  67. package/dist/facades/definitions.js.map +1 -1
  68. package/dist/facades/index.d.ts +2 -1
  69. package/dist/facades/index.d.ts.map +1 -1
  70. package/dist/facades/index.js +1 -1
  71. package/dist/facades/index.js.map +1 -1
  72. package/dist/facades/types.d.ts +17 -0
  73. package/dist/facades/types.d.ts.map +1 -1
  74. package/dist/hq/defineAgent.d.ts.map +1 -1
  75. package/dist/hq/defineAgent.js +7 -11
  76. package/dist/hq/defineAgent.js.map +1 -1
  77. package/dist/httpArgs.d.ts +11 -0
  78. package/dist/httpArgs.d.ts.map +1 -0
  79. package/dist/httpArgs.js +39 -0
  80. package/dist/httpArgs.js.map +1 -0
  81. package/dist/httpServer.d.ts +1 -12
  82. package/dist/httpServer.d.ts.map +1 -1
  83. package/dist/httpServer.js +298 -144
  84. package/dist/httpServer.js.map +1 -1
  85. package/dist/identity.d.ts +123 -0
  86. package/dist/identity.d.ts.map +1 -0
  87. package/dist/identity.js +312 -0
  88. package/dist/identity.js.map +1 -0
  89. package/dist/kernel.d.ts +46 -1
  90. package/dist/kernel.d.ts.map +1 -1
  91. package/dist/kernel.js +334 -26
  92. package/dist/kernel.js.map +1 -1
  93. package/dist/killSwitch.d.ts +117 -0
  94. package/dist/killSwitch.d.ts.map +1 -0
  95. package/dist/killSwitch.js +161 -0
  96. package/dist/killSwitch.js.map +1 -0
  97. package/dist/lib/agent-services/assumptions.d.ts.map +1 -1
  98. package/dist/lib/agent-services/assumptions.js +8 -2
  99. package/dist/lib/agent-services/assumptions.js.map +1 -1
  100. package/dist/lib/atomicWrite.d.ts +49 -0
  101. package/dist/lib/atomicWrite.d.ts.map +1 -0
  102. package/dist/lib/atomicWrite.js +157 -0
  103. package/dist/lib/atomicWrite.js.map +1 -0
  104. package/dist/lib/envelope.d.ts +31 -0
  105. package/dist/lib/envelope.d.ts.map +1 -0
  106. package/dist/lib/envelope.js +80 -0
  107. package/dist/lib/envelope.js.map +1 -0
  108. package/dist/lib/fileLock.d.ts +38 -0
  109. package/dist/lib/fileLock.d.ts.map +1 -0
  110. package/dist/lib/fileLock.js +124 -0
  111. package/dist/lib/fileLock.js.map +1 -0
  112. package/dist/lib/recordIdAllocator.d.ts +102 -0
  113. package/dist/lib/recordIdAllocator.d.ts.map +1 -0
  114. package/dist/lib/recordIdAllocator.js +179 -0
  115. package/dist/lib/recordIdAllocator.js.map +1 -0
  116. package/dist/orgId.d.ts +23 -0
  117. package/dist/orgId.d.ts.map +1 -0
  118. package/dist/orgId.js +73 -0
  119. package/dist/orgId.js.map +1 -0
  120. package/dist/pairCli.d.ts +2 -0
  121. package/dist/pairCli.d.ts.map +1 -0
  122. package/dist/pairCli.js +97 -0
  123. package/dist/pairCli.js.map +1 -0
  124. package/dist/peerBroker.d.ts +40 -0
  125. package/dist/peerBroker.d.ts.map +1 -0
  126. package/dist/peerBroker.js +70 -0
  127. package/dist/peerBroker.js.map +1 -0
  128. package/dist/peerBrokerSupervisor.d.ts +21 -0
  129. package/dist/peerBrokerSupervisor.d.ts.map +1 -0
  130. package/dist/peerBrokerSupervisor.js +131 -0
  131. package/dist/peerBrokerSupervisor.js.map +1 -0
  132. package/dist/projectPaths.d.ts.map +1 -1
  133. package/dist/projectPaths.js +1 -19
  134. package/dist/projectPaths.js.map +1 -1
  135. package/dist/projectRegistry.d.ts +22 -0
  136. package/dist/projectRegistry.d.ts.map +1 -1
  137. package/dist/projectRegistry.js +69 -2
  138. package/dist/projectRegistry.js.map +1 -1
  139. package/dist/pty/boundary.d.ts +39 -0
  140. package/dist/pty/boundary.d.ts.map +1 -0
  141. package/dist/pty/boundary.js +100 -0
  142. package/dist/pty/boundary.js.map +1 -0
  143. package/dist/pty/errors.d.ts +6 -0
  144. package/dist/pty/errors.d.ts.map +1 -0
  145. package/dist/pty/errors.js +12 -0
  146. package/dist/pty/errors.js.map +1 -0
  147. package/dist/pty/fleet.d.ts +159 -0
  148. package/dist/pty/fleet.d.ts.map +1 -0
  149. package/dist/pty/fleet.js +543 -0
  150. package/dist/pty/fleet.js.map +1 -0
  151. package/dist/pty/launchProfile.d.ts +45 -0
  152. package/dist/pty/launchProfile.d.ts.map +1 -0
  153. package/dist/pty/launchProfile.js +149 -0
  154. package/dist/pty/launchProfile.js.map +1 -0
  155. package/dist/pty/openTerminal.d.ts +48 -0
  156. package/dist/pty/openTerminal.d.ts.map +1 -0
  157. package/dist/pty/openTerminal.js +185 -0
  158. package/dist/pty/openTerminal.js.map +1 -0
  159. package/dist/pty/pairDialog.d.ts +16 -0
  160. package/dist/pty/pairDialog.d.ts.map +1 -0
  161. package/dist/pty/pairDialog.js +121 -0
  162. package/dist/pty/pairDialog.js.map +1 -0
  163. package/dist/pty/pairing.d.ts +86 -0
  164. package/dist/pty/pairing.d.ts.map +1 -0
  165. package/dist/pty/pairing.js +351 -0
  166. package/dist/pty/pairing.js.map +1 -0
  167. package/dist/pty/routes.d.ts +49 -0
  168. package/dist/pty/routes.d.ts.map +1 -0
  169. package/dist/pty/routes.js +624 -0
  170. package/dist/pty/routes.js.map +1 -0
  171. package/dist/pty/sessions.d.ts +167 -0
  172. package/dist/pty/sessions.d.ts.map +1 -0
  173. package/dist/pty/sessions.js +513 -0
  174. package/dist/pty/sessions.js.map +1 -0
  175. package/dist/pty/tmux.d.ts +109 -0
  176. package/dist/pty/tmux.d.ts.map +1 -0
  177. package/dist/pty/tmux.js +271 -0
  178. package/dist/pty/tmux.js.map +1 -0
  179. package/dist/roster.d.ts +37 -0
  180. package/dist/roster.d.ts.map +1 -0
  181. package/dist/roster.js +126 -0
  182. package/dist/roster.js.map +1 -0
  183. package/dist/runtime/circuitBreaker.d.ts +95 -0
  184. package/dist/runtime/circuitBreaker.d.ts.map +1 -0
  185. package/dist/runtime/circuitBreaker.js +178 -0
  186. package/dist/runtime/circuitBreaker.js.map +1 -0
  187. package/dist/runtime/daemonMeta.d.ts +53 -0
  188. package/dist/runtime/daemonMeta.d.ts.map +1 -0
  189. package/dist/runtime/daemonMeta.js +121 -0
  190. package/dist/runtime/daemonMeta.js.map +1 -0
  191. package/dist/runtime/ensureRuntime.d.ts +103 -0
  192. package/dist/runtime/ensureRuntime.d.ts.map +1 -0
  193. package/dist/runtime/ensureRuntime.js +276 -0
  194. package/dist/runtime/ensureRuntime.js.map +1 -0
  195. package/dist/runtime/extensions.d.ts +57 -0
  196. package/dist/runtime/extensions.d.ts.map +1 -0
  197. package/dist/runtime/extensions.js +216 -0
  198. package/dist/runtime/extensions.js.map +1 -0
  199. package/dist/runtime/localHttp.d.ts +24 -0
  200. package/dist/runtime/localHttp.d.ts.map +1 -0
  201. package/dist/runtime/localHttp.js +84 -0
  202. package/dist/runtime/localHttp.js.map +1 -0
  203. package/dist/runtime/projectResolution.d.ts +29 -0
  204. package/dist/runtime/projectResolution.d.ts.map +1 -0
  205. package/dist/runtime/projectResolution.js +67 -0
  206. package/dist/runtime/projectResolution.js.map +1 -0
  207. package/dist/runtime/protocol.d.ts +62 -0
  208. package/dist/runtime/protocol.d.ts.map +1 -0
  209. package/dist/runtime/protocol.js +74 -0
  210. package/dist/runtime/protocol.js.map +1 -0
  211. package/dist/sentinelIssues.d.ts +42 -2
  212. package/dist/sentinelIssues.d.ts.map +1 -1
  213. package/dist/sentinelIssues.js +167 -65
  214. package/dist/sentinelIssues.js.map +1 -1
  215. package/dist/server.js +123 -15
  216. package/dist/server.js.map +1 -1
  217. package/dist/toolConfig.d.ts.map +1 -1
  218. package/dist/toolConfig.js +12 -0
  219. package/dist/toolConfig.js.map +1 -1
  220. package/dist/tools/agentic/agentQueue.d.ts.map +1 -1
  221. package/dist/tools/agentic/agentQueue.js +4 -0
  222. package/dist/tools/agentic/agentQueue.js.map +1 -1
  223. package/dist/tools/agentic/index.d.ts.map +1 -1
  224. package/dist/tools/agentic/index.js +28 -2
  225. package/dist/tools/agentic/index.js.map +1 -1
  226. package/dist/tools/architect/index.d.ts +1 -0
  227. package/dist/tools/architect/index.d.ts.map +1 -1
  228. package/dist/tools/architect/index.js +52 -3
  229. package/dist/tools/architect/index.js.map +1 -1
  230. package/dist/tools/architect.d.ts.map +1 -1
  231. package/dist/tools/architect.js +59 -8
  232. package/dist/tools/architect.js.map +1 -1
  233. package/dist/tools/artifacts.d.ts +5 -0
  234. package/dist/tools/artifacts.d.ts.map +1 -0
  235. package/dist/tools/artifacts.js +89 -0
  236. package/dist/tools/artifacts.js.map +1 -0
  237. package/dist/tools/asks.d.ts +6 -0
  238. package/dist/tools/asks.d.ts.map +1 -0
  239. package/dist/tools/asks.js +104 -0
  240. package/dist/tools/asks.js.map +1 -0
  241. package/dist/tools/context.d.ts +10 -5
  242. package/dist/tools/context.d.ts.map +1 -1
  243. package/dist/tools/context.js +45 -18
  244. package/dist/tools/context.js.map +1 -1
  245. package/dist/tools/coordinator/coordinator.d.ts.map +1 -1
  246. package/dist/tools/coordinator/coordinator.js +48 -19
  247. package/dist/tools/coordinator/coordinator.js.map +1 -1
  248. package/dist/tools/coordinator/index.d.ts +1 -0
  249. package/dist/tools/coordinator/index.d.ts.map +1 -1
  250. package/dist/tools/coordinator/index.js +42 -2
  251. package/dist/tools/coordinator/index.js.map +1 -1
  252. package/dist/tools/crit.d.ts +2 -1
  253. package/dist/tools/crit.d.ts.map +1 -1
  254. package/dist/tools/crit.js +19 -4
  255. package/dist/tools/crit.js.map +1 -1
  256. package/dist/tools/data-inspector.d.ts +1 -1
  257. package/dist/tools/data-inspector.d.ts.map +1 -1
  258. package/dist/tools/data-inspector.js +1 -1
  259. package/dist/tools/data-inspector.js.map +1 -1
  260. package/dist/tools/designer/index.d.ts.map +1 -1
  261. package/dist/tools/designer/index.js +4 -3
  262. package/dist/tools/designer/index.js.map +1 -1
  263. package/dist/tools/designer/lateral-tools.d.ts.map +1 -1
  264. package/dist/tools/designer/lateral-tools.js +4 -2
  265. package/dist/tools/designer/lateral-tools.js.map +1 -1
  266. package/dist/tools/designer.d.ts +2 -1
  267. package/dist/tools/designer.d.ts.map +1 -1
  268. package/dist/tools/designer.js +24 -12
  269. package/dist/tools/designer.js.map +1 -1
  270. package/dist/tools/dojo/index.d.ts.map +1 -1
  271. package/dist/tools/dojo/index.js +52 -3
  272. package/dist/tools/dojo/index.js.map +1 -1
  273. package/dist/tools/dojo.d.ts +65 -3
  274. package/dist/tools/dojo.d.ts.map +1 -1
  275. package/dist/tools/dojo.js +148 -23
  276. package/dist/tools/dojo.js.map +1 -1
  277. package/dist/tools/friction.d.ts.map +1 -1
  278. package/dist/tools/friction.js +16 -6
  279. package/dist/tools/friction.js.map +1 -1
  280. package/dist/tools/guardian.d.ts +7 -0
  281. package/dist/tools/guardian.d.ts.map +1 -1
  282. package/dist/tools/guardian.js +152 -11
  283. package/dist/tools/guardian.js.map +1 -1
  284. package/dist/tools/hygiene/oracle-hygiene.d.ts.map +1 -1
  285. package/dist/tools/hygiene/oracle-hygiene.js +8 -2
  286. package/dist/tools/hygiene/oracle-hygiene.js.map +1 -1
  287. package/dist/tools/index.d.ts.map +1 -1
  288. package/dist/tools/index.js +33 -18
  289. package/dist/tools/index.js.map +1 -1
  290. package/dist/tools/killswitch/index.d.ts +13 -0
  291. package/dist/tools/killswitch/index.d.ts.map +1 -0
  292. package/dist/tools/killswitch/index.js +138 -0
  293. package/dist/tools/killswitch/index.js.map +1 -0
  294. package/dist/tools/learnings.d.ts +2 -1
  295. package/dist/tools/learnings.d.ts.map +1 -1
  296. package/dist/tools/learnings.js +31 -15
  297. package/dist/tools/learnings.js.map +1 -1
  298. package/dist/tools/oracle/index.d.ts.map +1 -1
  299. package/dist/tools/oracle/index.js +8 -0
  300. package/dist/tools/oracle/index.js.map +1 -1
  301. package/dist/tools/oracle.d.ts +7 -0
  302. package/dist/tools/oracle.d.ts.map +1 -1
  303. package/dist/tools/oracle.js +41 -12
  304. package/dist/tools/oracle.js.map +1 -1
  305. package/dist/tools/policy.d.ts +2 -1
  306. package/dist/tools/policy.d.ts.map +1 -1
  307. package/dist/tools/policy.js +28 -9
  308. package/dist/tools/policy.js.map +1 -1
  309. package/dist/tools/postoffice/index.d.ts +10 -0
  310. package/dist/tools/postoffice/index.d.ts.map +1 -0
  311. package/dist/tools/postoffice/index.js +218 -0
  312. package/dist/tools/postoffice/index.js.map +1 -0
  313. package/dist/tools/postoffice.d.ts +78 -0
  314. package/dist/tools/postoffice.d.ts.map +1 -0
  315. package/dist/tools/postoffice.js +199 -0
  316. package/dist/tools/postoffice.js.map +1 -0
  317. package/dist/tools/provenance.d.ts +18 -2
  318. package/dist/tools/provenance.d.ts.map +1 -1
  319. package/dist/tools/provenance.js +68 -40
  320. package/dist/tools/provenance.js.map +1 -1
  321. package/dist/tools/registry/index.d.ts.map +1 -1
  322. package/dist/tools/registry/index.js +24 -0
  323. package/dist/tools/registry/index.js.map +1 -1
  324. package/dist/tools/sentinel/index.d.ts +1 -0
  325. package/dist/tools/sentinel/index.d.ts.map +1 -1
  326. package/dist/tools/sentinel/index.js +142 -6
  327. package/dist/tools/sentinel/index.js.map +1 -1
  328. package/dist/tools/sentinel.d.ts +152 -1
  329. package/dist/tools/sentinel.d.ts.map +1 -1
  330. package/dist/tools/sentinel.js +609 -328
  331. package/dist/tools/sentinel.js.map +1 -1
  332. package/dist/tools/shared/index.d.ts +2 -1
  333. package/dist/tools/shared/index.d.ts.map +1 -1
  334. package/dist/tools/shared/index.js +2 -1
  335. package/dist/tools/shared/index.js.map +1 -1
  336. package/dist/tools/shared/response.d.ts +24 -0
  337. package/dist/tools/shared/response.d.ts.map +1 -1
  338. package/dist/tools/shared/response.js +61 -7
  339. package/dist/tools/shared/response.js.map +1 -1
  340. package/dist/tools/shared/runTracker.d.ts +2 -0
  341. package/dist/tools/shared/runTracker.d.ts.map +1 -1
  342. package/dist/tools/shared/runTracker.js +38 -0
  343. package/dist/tools/shared/runTracker.js.map +1 -1
  344. package/dist/tools/shared/storeRead.d.ts +153 -0
  345. package/dist/tools/shared/storeRead.d.ts.map +1 -0
  346. package/dist/tools/shared/storeRead.js +242 -0
  347. package/dist/tools/shared/storeRead.js.map +1 -0
  348. package/dist/tools/swarm.d.ts +3 -1
  349. package/dist/tools/swarm.d.ts.map +1 -1
  350. package/dist/tools/swarm.js +6 -12
  351. package/dist/tools/swarm.js.map +1 -1
  352. package/dist/tools/testSpec.d.ts +3 -2
  353. package/dist/tools/testSpec.d.ts.map +1 -1
  354. package/dist/tools/testSpec.js +51 -14
  355. package/dist/tools/testSpec.js.map +1 -1
  356. package/dist/tools/vector.d.ts +33 -1
  357. package/dist/tools/vector.d.ts.map +1 -1
  358. package/dist/tools/vector.js +31 -5
  359. package/dist/tools/vector.js.map +1 -1
  360. package/dist/tools/voice/index.d.ts +1 -0
  361. package/dist/tools/voice/index.d.ts.map +1 -1
  362. package/dist/tools/voice/index.js +33 -2
  363. package/dist/tools/voice/index.js.map +1 -1
  364. package/dist/tools/voice.d.ts +48 -1
  365. package/dist/tools/voice.d.ts.map +1 -1
  366. package/dist/tools/voice.js +63 -3
  367. package/dist/tools/voice.js.map +1 -1
  368. package/dist/tools/zoom/index.d.ts +15 -0
  369. package/dist/tools/zoom/index.d.ts.map +1 -0
  370. package/dist/tools/zoom/index.js +174 -0
  371. package/dist/tools/zoom/index.js.map +1 -0
  372. package/dist/tools/zoom.d.ts +234 -0
  373. package/dist/tools/zoom.d.ts.map +1 -0
  374. package/dist/tools/zoom.js +627 -0
  375. package/dist/tools/zoom.js.map +1 -0
  376. package/dist/transports/bridge.d.ts +1 -1
  377. package/dist/transports/bridge.d.ts.map +1 -1
  378. package/dist/transports/bridge.js +4 -1
  379. package/dist/transports/bridge.js.map +1 -1
  380. package/dist/transports/http.d.ts +1 -1
  381. package/dist/transports/http.d.ts.map +1 -1
  382. package/dist/transports/http.js +3 -1
  383. package/dist/transports/http.js.map +1 -1
  384. package/dist/transports/index.d.ts +1 -0
  385. package/dist/transports/index.d.ts.map +1 -1
  386. package/dist/transports/index.js +1 -0
  387. package/dist/transports/index.js.map +1 -1
  388. package/dist/transports/mcp.d.ts +1 -1
  389. package/dist/transports/mcp.d.ts.map +1 -1
  390. package/dist/transports/mcp.js +9 -4
  391. package/dist/transports/mcp.js.map +1 -1
  392. package/dist/transports/stdio.d.ts +1 -1
  393. package/dist/transports/stdio.d.ts.map +1 -1
  394. package/dist/transports/stdio.js +2 -0
  395. package/dist/transports/stdio.js.map +1 -1
  396. package/dist/transports/thinStdio.d.ts +22 -0
  397. package/dist/transports/thinStdio.d.ts.map +1 -0
  398. package/dist/transports/thinStdio.js +218 -0
  399. package/dist/transports/thinStdio.js.map +1 -0
  400. package/dist/transports/types.d.ts +8 -1
  401. package/dist/transports/types.d.ts.map +1 -1
  402. package/dist/types/agent-services.d.ts +7 -0
  403. package/dist/types/agent-services.d.ts.map +1 -1
  404. package/dist/version.d.ts +5 -0
  405. package/dist/version.d.ts.map +1 -0
  406. package/dist/version.js +23 -0
  407. package/dist/version.js.map +1 -0
  408. package/package.json +20 -4
  409. package/templates/AGENT.md +3 -0
  410. package/templates/CLAUDE-decibel.md +11 -0
  411. package/templates/com.decibel.daemon.plist +6 -1
  412. package/dist/tools/deck.d.ts +0 -11
  413. package/dist/tools/deck.d.ts.map +0 -1
  414. package/dist/tools/deck.js +0 -1656
  415. package/dist/tools/deck.js.map +0 -1
  416. package/dist/tools/mother.d.ts +0 -11
  417. package/dist/tools/mother.d.ts.map +0 -1
  418. package/dist/tools/mother.js +0 -503
  419. package/dist/tools/mother.js.map +0 -1
  420. package/dist/tools/registry.d.ts +0 -3
  421. package/dist/tools/registry.d.ts.map +0 -1
  422. package/dist/tools/registry.js +0 -189
  423. package/dist/tools/registry.js.map +0 -1
  424. package/dist/tools/senken.d.ts +0 -11
  425. package/dist/tools/senken.d.ts.map +0 -1
  426. package/dist/tools/senken.js +0 -482
  427. package/dist/tools/senken.js.map +0 -1
  428. package/dist/tools/terminal.d.ts +0 -17
  429. package/dist/tools/terminal.d.ts.map +0 -1
  430. package/dist/tools/terminal.js +0 -968
  431. package/dist/tools/terminal.js.map +0 -1
  432. package/dist/tools/toolsIndex.d.ts +0 -5
  433. package/dist/tools/toolsIndex.d.ts.map +0 -1
  434. package/dist/tools/toolsIndex.js +0 -37
  435. package/dist/tools/toolsIndex.js.map +0 -1
@@ -0,0 +1,308 @@
1
+ // ============================================================================
2
+ // Issue codec — EPIC-0038 Phase 3
3
+ // ============================================================================
4
+ // Translates between on-disk records and the canonical Issue model. This is the
5
+ // only place that knows there are two formats.
6
+ //
7
+ // Two rules shape the whole file:
8
+ //
9
+ // 1. DECODE IS LOSSLESS. Every frontmatter key survives a decode/encode round
10
+ // trip, whether or not the model has a field for it. Records in this store
11
+ // carry keys no interface declares — `repo`, `closed_reason`, `degraded`,
12
+ // `source`, `projectId` alongside `project` — and a codec that emitted only
13
+ // the fields it recognized would silently delete them on the first write.
14
+ // The precedent is real: update_issue once rewrote markdown records as bare
15
+ // YAML and dropped the delimiters, the heading and the body.
16
+ //
17
+ // 2. THE BODY MIRROR IS OUTPUT, NEVER INPUT. Markdown records repeat status and
18
+ // severity in the body as `**Status:** x` for human readers. Decode ignores
19
+ // those lines entirely and reads frontmatter; encode regenerates them from
20
+ // the model. That asymmetry is the point — it makes the drift that hit
21
+ // sixteen records structurally impossible rather than merely fixed. There is
22
+ // no code path that can write a mirror disagreeing with its frontmatter.
23
+ // ============================================================================
24
+ import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
25
+ import { isUid, normalizeStatus, } from './issue.js';
26
+ const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/;
27
+ /** Keys the model owns. Everything else is preserved verbatim in raw.data. */
28
+ const MODEL_KEYS = new Set([
29
+ 'uid',
30
+ 'id',
31
+ 'title',
32
+ 'status',
33
+ 'severity',
34
+ 'priority',
35
+ 'assignee',
36
+ 'team',
37
+ 'tags',
38
+ 'epic_id',
39
+ 'epicId',
40
+ 'project',
41
+ 'description',
42
+ 'details',
43
+ 'resolution',
44
+ 'created_at',
45
+ 'updated_at',
46
+ 'closed_at',
47
+ ]);
48
+ function normalizeTags(v) {
49
+ if (!Array.isArray(v))
50
+ return undefined;
51
+ const tags = v.filter((t) => typeof t === 'string' && t.trim() !== '');
52
+ return tags.length > 0 ? tags : undefined;
53
+ }
54
+ function str(v) {
55
+ return typeof v === 'string' && v.trim() !== '' ? v : undefined;
56
+ }
57
+ /**
58
+ * Split a bare-YAML record into its YAML head and any markdown tail at column 0.
59
+ *
60
+ * The column-0 anchor is load-bearing and must not gain `\s*`: headings indented
61
+ * inside a `description:` block scalar are body text, not a tail, and matching
62
+ * them would truncate the record at parse time. Phase 2 verified no record in
63
+ * the store relies on the difference, but nothing else pins it, so it is pinned
64
+ * by test here.
65
+ */
66
+ export function splitBareYaml(content) {
67
+ const lines = content.split('\n');
68
+ const idx = lines.findIndex((l) => /^#{1,6}\s/.test(l));
69
+ if (idx < 0)
70
+ return { head: content, tail: '' };
71
+ return { head: lines.slice(0, idx).join('\n'), tail: lines.slice(idx).join('\n') };
72
+ }
73
+ /**
74
+ * Prose under `## Details`, which is where the markdown format keeps the body.
75
+ *
76
+ * This used to stop at the next `##` heading of any kind, which quietly made
77
+ * the format unable to hold a structured issue. Authors write `## Problem`,
78
+ * `## Root Cause`, `## Fix` — 44 records in this store did, and every one read
79
+ * back truncated at the first of them, in two cases from 107 characters to 30.
80
+ *
81
+ * Only ONE trailing section is not the author's: `## Resolution`, which
82
+ * encodeIssue regenerates from `issue.resolution` and which decode reads from
83
+ * frontmatter. Including it here would duplicate it into details and then
84
+ * re-append it on every write. Everything else belongs to the body.
85
+ *
86
+ * The trailing occurrence is the one stripped, not the first — an issue whose
87
+ * prose discusses a resolution mid-body keeps it.
88
+ */
89
+ function extractDetails(body) {
90
+ const m = body.match(/^##\s+Details\s*\n([\s\S]*)$/m);
91
+ if (!m)
92
+ return undefined;
93
+ let rest = m[1];
94
+ const headings = [...rest.matchAll(/\n##\s+Resolution\s*(?:\n|$)/g)];
95
+ const last = headings[headings.length - 1];
96
+ if (last?.index !== undefined)
97
+ rest = rest.slice(0, last.index);
98
+ return rest.trim() || undefined;
99
+ }
100
+ export function decodeIssue(filename, content) {
101
+ const warnings = [];
102
+ const fm = FRONTMATTER_RE.exec(content);
103
+ let data;
104
+ let body;
105
+ let format;
106
+ if (fm) {
107
+ format = 'md';
108
+ body = fm[2];
109
+ try {
110
+ data = parseYaml(fm[1]) ?? {};
111
+ }
112
+ catch (err) {
113
+ data = {};
114
+ warnings.push(`frontmatter did not parse: ${err instanceof Error ? err.message : String(err)}`);
115
+ }
116
+ }
117
+ else {
118
+ format = 'yaml';
119
+ const split = splitBareYaml(content);
120
+ body = split.tail;
121
+ if (split.tail.trim()) {
122
+ // Phase 2 repaired every instance of this. A new one means a writer is
123
+ // appending markdown to bare YAML again.
124
+ warnings.push('bare-YAML record has a markdown tail — a writer is appending prose outside the YAML');
125
+ }
126
+ try {
127
+ data = parseYaml(split.head) ?? {};
128
+ }
129
+ catch (err) {
130
+ data = {};
131
+ warnings.push(`YAML did not parse: ${err instanceof Error ? err.message : String(err)}`);
132
+ }
133
+ }
134
+ if (typeof data !== 'object' || data === null) {
135
+ data = {};
136
+ warnings.push('record did not parse to an object');
137
+ }
138
+ // ---- id: frontmatter ISS-NNNN, else the filename ------------------------
139
+ const fmId = str(data.id);
140
+ const id = (fmId && /^ISS-\d+$/i.test(fmId) ? fmId.toUpperCase() : undefined) ??
141
+ filename.match(/^(ISS-\d+)/i)?.[1]?.toUpperCase() ??
142
+ fmId ??
143
+ filename.replace(/\.(md|ya?ml)$/i, '');
144
+ // ---- title: frontmatter wins, then the heading, then the filename -------
145
+ //
146
+ // Frontmatter first, because the writer puts a title there ONLY when the
147
+ // body cannot hold it — no heading at all, or a title containing a newline,
148
+ // which a `# heading` truncates at the line break. Reading the heading first
149
+ // meant a multi-line title came back as its first line, from a record whose
150
+ // frontmatter held the whole thing: "first line\nsecond line" read back as
151
+ // "first line", with create_issue reporting success.
152
+ //
153
+ // Preferring frontmatter cannot regress a record that predates this, because
154
+ // the writer never emitted both: `title` went to frontmatter exactly when
155
+ // there was no heading to compete with it.
156
+ const heading = body.match(/^#\s+(.+)$/m)?.[1]?.trim();
157
+ const fmTitle = str(data.title);
158
+ const title = fmTitle ?? heading ?? filename.replace(/\.(md|ya?ml)$/i, '');
159
+ if (!heading && !fmTitle) {
160
+ warnings.push('no title in heading or frontmatter — fell back to the filename');
161
+ }
162
+ // ---- status: the whole reason this codec exists -------------------------
163
+ const norm = normalizeStatus(data.status);
164
+ if (norm.unrecognized) {
165
+ warnings.push(`unrecognized status ${JSON.stringify(data.status)} — read as ${norm.status}`);
166
+ }
167
+ else if (norm.normalizedFrom) {
168
+ warnings.push(`status ${JSON.stringify(norm.normalizedFrom)} normalized to ${norm.status}`);
169
+ }
170
+ const uid = isUid(data.uid) ? data.uid : undefined;
171
+ if (data.uid !== undefined && !uid) {
172
+ warnings.push(`uid ${JSON.stringify(data.uid)} is not a valid UUIDv7 — ignored`);
173
+ }
174
+ const issue = {
175
+ uid,
176
+ id,
177
+ title,
178
+ status: norm.status,
179
+ severity: str(data.severity),
180
+ priority: str(data.priority),
181
+ // An empty tag list and no tag list mean the same thing, and encode omits
182
+ // empty arrays — so decoding [] to [] would make the codec non-idempotent.
183
+ // Twelve records in the store carry `tags: []`; the corpus test caught it.
184
+ tags: normalizeTags(data.tags),
185
+ // EPIC-0040. Read leniently and warn, matching how this codec treats every
186
+ // other damaged value: a record whose assignee is malformed is still a
187
+ // record, and refusing to decode it would hide the rest of its content.
188
+ // The strict assertion lives at the write boundary.
189
+ assignee: str(data.assignee),
190
+ team: str(data.team),
191
+ epicId: str(data.epic_id) ?? str(data.epicId),
192
+ // Both spellings exist; `projectId` is the markdown writer's, `project` the
193
+ // YAML writer's. The model has one, and encode puts it back where it came from.
194
+ project: str(data.project) ?? str(data.projectId),
195
+ details: str(data.description) ?? extractDetails(body),
196
+ resolution: str(data.resolution),
197
+ created_at: str(data.created_at),
198
+ updated_at: str(data.updated_at),
199
+ closed_at: str(data.closed_at),
200
+ };
201
+ // Strip model-owned keys; whatever remains is carried through untouched.
202
+ const preserved = {};
203
+ for (const [k, v] of Object.entries(data)) {
204
+ if (!MODEL_KEYS.has(k) && k !== 'projectId')
205
+ preserved[k] = v;
206
+ }
207
+ return { issue, format, raw: { data: preserved, body }, warnings };
208
+ }
209
+ /**
210
+ * Rewrite the derived header lines in a markdown body from the model.
211
+ *
212
+ * Only lines that already exist are updated — this does not inject a mirror
213
+ * into a record that never had one, because the mirror is a convention of the
214
+ * markdown writer's layout, not a requirement of the format.
215
+ */
216
+ function syncBodyMirror(body, issue) {
217
+ let out = body;
218
+ out = out.replace(/^\*\*Status:\*\* .*$/m, `**Status:** ${issue.status}`);
219
+ if (issue.severity) {
220
+ out = out.replace(/^\*\*Severity:\*\* .*$/m, `**Severity:** ${issue.severity}`);
221
+ }
222
+ if (issue.epicId) {
223
+ out = out.replace(/^\*\*Epic:\*\* .*$/m, `**Epic:** ${issue.epicId}`);
224
+ }
225
+ // The heading is the title's home in this format; keep them in step.
226
+ //
227
+ // Only ever the FIRST LINE. Splicing a multi-line title into the heading
228
+ // line pushed its remaining lines into the body as loose prose — and since
229
+ // the writer had already put them there once, they appeared twice. The
230
+ // authoritative copy of such a title is in frontmatter (see encodeIssue);
231
+ // this is the human-readable rendering of it.
232
+ out = out.replace(/^#\s+.+$/m, `# ${issue.title.split(/\r?\n/)[0]}`);
233
+ // Resolution is rendered into the body for the same reason status is: a
234
+ // markdown record is read by people, and `## Resolution` is where they look.
235
+ // It is regenerated from the model rather than stored there, so it cannot
236
+ // drift from frontmatter the way the status mirror did. Writing it ONLY to
237
+ // frontmatter would have been the tidier data model and the worse record —
238
+ // the prose would have silently vanished from every closed issue.
239
+ if (issue.resolution) {
240
+ const section = `## Resolution\n\n${issue.resolution}\n`;
241
+ out = /^##\s+Resolution\s*$/m.test(out)
242
+ ? out.replace(/^##\s+Resolution\s*\n[\s\S]*?(?=\n##\s|$)/m, section)
243
+ : `${out.replace(/\s+$/, '')}\n\n${section}`;
244
+ }
245
+ return out;
246
+ }
247
+ export function encodeIssue(decoded) {
248
+ const { issue, format, raw } = decoded;
249
+ const data = {};
250
+ const put = (k, v) => {
251
+ if (v !== undefined && v !== null && !(Array.isArray(v) && v.length === 0))
252
+ data[k] = v;
253
+ };
254
+ // Field order is stable so diffs stay readable across writes.
255
+ put('uid', issue.uid);
256
+ put('id', issue.id);
257
+ // Markdown records normally carry the title in the `# heading`, and writing
258
+ // it to frontmatter as well would create a second copy to drift — the same
259
+ // mistake as the status mirror. But a record with no heading has nowhere else
260
+ // to keep it, and omitting it there means the title is silently replaced by
261
+ // the filename on the next read. So: frontmatter holds the title exactly when
262
+ // the body cannot.
263
+ //
264
+ // A MULTI-LINE TITLE IS A TITLE THE BODY CANNOT HOLD. A markdown heading ends
265
+ // at the newline, so `# first\nsecond` is a heading reading "first" followed
266
+ // by a stray paragraph, and the record came back a line long with no error
267
+ // anywhere in the chain (ISS-0155). YAML quotes and escapes it exactly, so
268
+ // frontmatter is the only container that round-trips one.
269
+ const bodyHasHeading = /^#\s+.+$/m.test(raw.body);
270
+ const titleFitsAHeading = !/[\r\n]/.test(issue.title);
271
+ if (format === 'yaml' || !bodyHasHeading || !titleFitsAHeading)
272
+ put('title', issue.title);
273
+ // The markdown writer spells it projectId; keep each format's own spelling so
274
+ // a rewrite is not a gratuitous diff on every record.
275
+ put(format === 'md' ? 'projectId' : 'project', issue.project);
276
+ put('severity', issue.severity);
277
+ put('status', issue.status);
278
+ put('priority', issue.priority);
279
+ put('assignee', issue.assignee);
280
+ put('team', issue.team);
281
+ put('epic_id', issue.epicId);
282
+ put('tags', issue.tags);
283
+ put('created_at', issue.created_at);
284
+ put('updated_at', issue.updated_at);
285
+ put('closed_at', issue.closed_at);
286
+ // Bare YAML keeps prose in `description`; markdown keeps it in the body.
287
+ if (format === 'yaml')
288
+ put('description', issue.details);
289
+ put('resolution', issue.resolution);
290
+ // Preserved unknown keys land after the model's, so they never displace a
291
+ // known field's position but are never lost either.
292
+ for (const [k, v] of Object.entries(raw.data))
293
+ if (!(k in data))
294
+ data[k] = v;
295
+ const yaml = stringifyYaml(data, { lineWidth: 0 });
296
+ if (format === 'md') {
297
+ const body = syncBodyMirror(raw.body, issue);
298
+ return `---\n${yaml}---\n${body}`;
299
+ }
300
+ // A bare-YAML tail should not exist post-Phase-2, but if one is present it is
301
+ // pre-existing prose and gets preserved rather than dropped.
302
+ return raw.body.trim() ? `${yaml}\n${raw.body}` : yaml;
303
+ }
304
+ /** Apply changes to a decoded record, keeping derived state consistent. */
305
+ export function applyIssueChanges(decoded, changes) {
306
+ return { ...decoded, issue: { ...decoded.issue, ...changes } };
307
+ }
308
+ //# sourceMappingURL=issueCodec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issueCodec.js","sourceRoot":"","sources":["../../src/domain/issueCodec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ import { Issue, IssuePriority, IssueSeverity, IssueStatus } from './issue.js';
2
+ import { IssueFormat } from './issueCodec.js';
3
+ /** An issue plus where it lives. The path is for diagnostics, not for callers to write through. */
4
+ /**
5
+ * What a close actually did. `preservedResolution` is the difference between a
6
+ * first close and a re-close that kept the original reasoning — without it the
7
+ * caller cannot tell the two apart, which is how ISS-0168 stayed silent.
8
+ */
9
+ export interface CloseResult {
10
+ stored: StoredIssue;
11
+ preservedResolution: boolean;
12
+ }
13
+ export interface StoredIssue {
14
+ issue: Issue;
15
+ filename: string;
16
+ path: string;
17
+ format: IssueFormat;
18
+ /** Integrity observations from decoding. Empty for a healthy record. */
19
+ warnings: string[];
20
+ }
21
+ export interface IssueListFilter {
22
+ status?: IssueStatus;
23
+ /** All non-terminal statuses. Distinct from status:'open', which is one value. */
24
+ liveOnly?: boolean;
25
+ epicId?: string;
26
+ }
27
+ export interface CreateIssueSpec {
28
+ title: string;
29
+ details: string;
30
+ severity: IssueSeverity;
31
+ priority?: IssuePriority;
32
+ epicId?: string;
33
+ tags?: string[];
34
+ project?: string;
35
+ /** Prefixed identity — user:/agent:/human:. Validated at the tool boundary. */
36
+ assignee?: string;
37
+ /** `team:<uuid>`. Validated at the tool boundary. */
38
+ team?: string;
39
+ }
40
+ /**
41
+ * Integrity state of the whole store, reported alongside a listing rather than
42
+ * discovered mid-incident.
43
+ *
44
+ * The distinction that matters: `malformed` records are invisible to callers,
45
+ * so a silent skip would make a broken store look like a shorter clean one.
46
+ * `degraded` records are readable but carry something the codec had to
47
+ * interpret. Both are repair queues, not cosmetics — a duplicate id makes an
48
+ * issue unwritable, because the repository refuses an ambiguous target.
49
+ */
50
+ export interface StoreIntegrity {
51
+ malformed: string[];
52
+ degraded: Array<{
53
+ filename: string;
54
+ warnings: string[];
55
+ }>;
56
+ duplicateIds: Record<string, string[]>;
57
+ }
58
+ export interface IssueRepository {
59
+ integrity(): Promise<StoreIntegrity>;
60
+ list(filter?: IssueListFilter): Promise<StoredIssue[]>;
61
+ get(idOrFilename: string): Promise<StoredIssue | null>;
62
+ create(spec: CreateIssueSpec): Promise<StoredIssue>;
63
+ update(idOrFilename: string, changes: Partial<Issue>): Promise<StoredIssue>;
64
+ close(idOrFilename: string, resolution: string, status?: 'closed' | 'wontfix'): Promise<CloseResult>;
65
+ }
66
+ export declare class AmbiguousIssueIdError extends Error {
67
+ readonly issueId: string;
68
+ readonly candidates: string[];
69
+ readonly code = "AMBIGUOUS_ISSUE_ID";
70
+ constructor(issueId: string, candidates: string[]);
71
+ }
72
+ export declare class IssueNotFoundError extends Error {
73
+ readonly issueId: string;
74
+ readonly code = "ISSUE_NOT_FOUND";
75
+ constructor(issueId: string);
76
+ }
77
+ export declare class FsIssueRepository implements IssueRepository {
78
+ private readonly issuesDir;
79
+ constructor(issuesDir: string);
80
+ private readAll;
81
+ /**
82
+ * Duplicate detection deliberately runs over EVERY record, never a filtered
83
+ * subset: a closed twin still makes an id ambiguous for writers, so filtering
84
+ * it out of a listing must not filter it out of the collision report.
85
+ */
86
+ integrity(): Promise<StoreIntegrity>;
87
+ list(filter?: IssueListFilter): Promise<StoredIssue[]>;
88
+ /**
89
+ * Resolve an id to exactly one record, in tiers of decreasing specificity.
90
+ *
91
+ * Only the first non-empty tier is considered, and ambiguity is reported
92
+ * within a tier rather than across tiers — so naming a record by its filename
93
+ * stays a reliable way to pick one member of a duplicate pair even while the
94
+ * shared ISS-NNNN remains ambiguous. uid is checked first because it is the
95
+ * only identifier guaranteed unique by construction.
96
+ */
97
+ private resolve;
98
+ get(idOrFilename: string): Promise<StoredIssue | null>;
99
+ private requireOne;
100
+ create(spec: CreateIssueSpec): Promise<StoredIssue>;
101
+ update(idOrFilename: string, changes: Partial<Issue>): Promise<StoredIssue>;
102
+ /**
103
+ * Close a record, or report that it was already closed without touching what
104
+ * the first close recorded.
105
+ *
106
+ * A re-close used to overwrite `resolution` and move `closed_at` forward
107
+ * (ISS-0168). That is data loss, and silent: the resolution field is the only
108
+ * place the reasoning behind a fix survives outside a commit message, and the
109
+ * caller was told "closed" either way. The trigger was operator error — a
110
+ * `Closes:` trailer naming an already-closed issue — but the failure mode is
111
+ * not: citing the issue a piece of follow-up work came from is normal, and
112
+ * every such citation destroyed the original reasoning.
113
+ *
114
+ * So a record that is already terminal AND already carries a resolution keeps
115
+ * both. A status move between closed and wontfix is still honoured, since
116
+ * that is a real decision; a missing `closed_at` is filled in, since that only
117
+ * adds. When nothing is left to change the file is not rewritten at all, so a
118
+ * re-close does not even bump `updated_at`.
119
+ *
120
+ * Amending a resolution on purpose is `update`, which says what it does.
121
+ */
122
+ close(idOrFilename: string, resolution: string, status?: 'closed' | 'wontfix'): Promise<CloseResult>;
123
+ }
124
+ //# sourceMappingURL=issueRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issueRepository.d.ts","sourceRoot":"","sources":["../../src/domain/issueRepository.ts"],"names":[],"mappings":"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"}