@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 @@
1
+ {"version":3,"file":"killSwitch.d.ts","sourceRoot":"","sources":["../src/killSwitch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAMH,qDAAqD;AACrD,eAAO,MAAM,gBAAgB,QAAyD,CAAC;AAEvF,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4FAA4F;IAC5F,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,IAAI,eAAe,CAWhD;AAED,+CAA+C;AAC/C,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG;IAC3F,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB,CAkBA;AAED;;;;GAIG;AACH,wBAAgB,WAAW,IAAI;IAAE,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAA;CAAE,CAKlE;AAYD;;;;GAIG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,IAAI,yBAAyB;IACtC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;gBAEpB,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe;CAWtD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAGtD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI,CAG9E"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * The kill switch — one durable STOP for unattended work (ISS-0178).
3
+ *
4
+ * WHAT IT STOPS, AND WHAT IT DELIBERATELY DOES NOT. The metaphor is a machine
5
+ * tool's big red button: it halts the automation, it does not power down the
6
+ * panel. Unattended work — the agentic queue replaying remote writes, the dojo
7
+ * experiment runner spawning a script — refuses while stopped. Interactive
8
+ * calls keep working on purpose, because the first thing anyone does after
9
+ * hitting stop is ask what went wrong, and that takes sentinel, oracle and this
10
+ * module itself.
11
+ *
12
+ * THE SAFETY INVARIANT. You can never stop yourself out of resuming. That holds
13
+ * BY CONSTRUCTION rather than by an exception list: nothing in this file gates
14
+ * itself, and enforcement lives at the call sites of the work being stopped.
15
+ * There is no path where `resume` consults the flag it is trying to clear.
16
+ *
17
+ * WHY A FILE, AND WHY THIS FILE. State lives at ~/.decibel/killswitch.json:
18
+ *
19
+ * - machine-global, because a button on a desk is machine-global. Stopping
20
+ * "the project you happen to be in" is not what a red button means.
21
+ * - a file, so it survives a daemon restart, a crash, and a reboot. A stop
22
+ * that forgets itself is worse than no stop, because it teaches people the
23
+ * switch is unreliable.
24
+ * - plain JSON with no schema tricks, so a process that is not this one — a
25
+ * shell script, a microcontroller, a future physical button — can read and
26
+ * write it without linking anything.
27
+ *
28
+ * WHAT IT IS NOT. It is not a security control. Anything that can write to
29
+ * ~/.decibel can clear it. It is an operational brake for work you started, in
30
+ * the same spirit as the daemon's own PID file.
31
+ */
32
+ import fs from 'fs';
33
+ import path from 'path';
34
+ import os from 'os';
35
+ /** Machine-global, deliberately — see the header. */
36
+ export const KILL_SWITCH_PATH = path.join(os.homedir(), '.decibel', 'killswitch.json');
37
+ const RUNNING = { stopped: false };
38
+ /**
39
+ * Read the current state, treating every failure as RUNNING.
40
+ *
41
+ * FAIL-OPEN IS THE RIGHT CHOICE HERE and it is worth saying why, because the
42
+ * opposite is defensible and wrong for this case. A corrupt or unreadable
43
+ * killswitch file would, under fail-closed, halt all unattended work on the
44
+ * machine with no way to diagnose it except editing the very file that is
45
+ * broken — a brake that jams on is worse than one that does not engage. The
46
+ * stop is an operational convenience, not a safety interlock, and it says so in
47
+ * the header.
48
+ *
49
+ * Note this is the one place the module is deliberately quiet: a missing file
50
+ * is the overwhelmingly common case (nobody has ever pressed stop) and must not
51
+ * be noise.
52
+ */
53
+ export function readKillSwitch() {
54
+ try {
55
+ const raw = fs.readFileSync(KILL_SWITCH_PATH, 'utf-8');
56
+ const parsed = JSON.parse(raw);
57
+ // Anything other than an explicit `true` is running. A file containing
58
+ // `{"stopped":"yes"}` from a well-meaning script must not read as stopped,
59
+ // because a truthy-string check would make the brake depend on spelling.
60
+ return parsed.stopped === true ? parsed : RUNNING;
61
+ }
62
+ catch {
63
+ return RUNNING;
64
+ }
65
+ }
66
+ /** True when unattended work should refuse. */
67
+ export function isStopped() {
68
+ return readKillSwitch().stopped;
69
+ }
70
+ /**
71
+ * Engage the stop. Idempotent: a second press reports the FIRST stop rather
72
+ * than overwriting it, because a button will be pressed twice and the original
73
+ * reason and time are the ones worth keeping.
74
+ *
75
+ * @returns the state now in force, and whether this call is what engaged it
76
+ */
77
+ export function engageStop(opts = {}) {
78
+ const current = readKillSwitch();
79
+ if (current.stopped) {
80
+ return { state: current, already: true };
81
+ }
82
+ const state = {
83
+ stopped: true,
84
+ stopped_at: new Date().toISOString(),
85
+ ...(opts.reason ? { reason: opts.reason } : {}),
86
+ // An unattributed stop is allowed — a physical button cannot type — but it
87
+ // is recorded as unattributed rather than silently attributed to whoever
88
+ // happened to be running.
89
+ actor: opts.actor || 'unattributed',
90
+ ...(opts.source ? { source: opts.source } : {}),
91
+ };
92
+ writeState(state);
93
+ return { state, already: false };
94
+ }
95
+ /**
96
+ * Release the stop. Idempotent, and never gated — see the safety invariant.
97
+ *
98
+ * @returns the state that was cleared, when there was one
99
+ */
100
+ export function releaseStop() {
101
+ const current = readKillSwitch();
102
+ if (!current.stopped)
103
+ return { released: null };
104
+ writeState(RUNNING);
105
+ return { released: current };
106
+ }
107
+ function writeState(state) {
108
+ const dir = path.dirname(KILL_SWITCH_PATH);
109
+ fs.mkdirSync(dir, { recursive: true });
110
+ // Write-then-rename: a physical button may be pressed while something else is
111
+ // reading, and a half-written file must never be observable as either state.
112
+ const tmp = `${KILL_SWITCH_PATH}.${process.pid}.tmp`;
113
+ fs.writeFileSync(tmp, JSON.stringify(state, null, 2) + '\n', 'utf-8');
114
+ fs.renameSync(tmp, KILL_SWITCH_PATH);
115
+ }
116
+ /**
117
+ * Thrown at the gate. Carries the stop's own reason and time so the refusal can
118
+ * say WHY work stopped rather than merely that it did — the difference between
119
+ * a legible brake and a mystery.
120
+ */
121
+ export class KillSwitchEngagedError extends Error {
122
+ code = 'KILL_SWITCH_ENGAGED';
123
+ state;
124
+ constructor(operation, state) {
125
+ const when = state.stopped_at ? ` at ${state.stopped_at}` : '';
126
+ const who = state.actor && state.actor !== 'unattributed' ? ` by ${state.actor}` : '';
127
+ const why = state.reason ? ` — ${state.reason}` : '';
128
+ super(`Kill switch engaged${when}${who}${why}. Refusing: ${operation}. ` +
129
+ `Release it with killswitch.resume (never blocked), or delete ${KILL_SWITCH_PATH}.`);
130
+ this.name = 'KillSwitchEngagedError';
131
+ this.state = state;
132
+ }
133
+ }
134
+ /**
135
+ * The gate. Call at the top of anything that runs without someone watching.
136
+ *
137
+ * Takes the operation name so the refusal names what it refused — "agentic
138
+ * queue replay" is actionable, "operation failed" is not.
139
+ */
140
+ export function assertRunnable(operation) {
141
+ const state = readKillSwitch();
142
+ if (state.stopped)
143
+ throw new KillSwitchEngagedError(operation, state);
144
+ }
145
+ /**
146
+ * Non-throwing form of {@link assertRunnable}, for call sites whose contract is
147
+ * to RETURN an error rather than throw one.
148
+ *
149
+ * Both forms exist deliberately. `assertRunnable` suits functions that already
150
+ * throw (agentQueueSync throws for unconfigured Supabase, so a throw is in
151
+ * keeping); this suits functions that declare `Promise<Output | SomeError>`,
152
+ * where throwing would be a lie about the signature and would behave
153
+ * differently when called directly than when called through a handler that
154
+ * catches. That divergence between the direct and dispatched path is a bug
155
+ * shape this repo has been bitten by more than once.
156
+ */
157
+ export function checkRunnable(operation) {
158
+ const state = readKillSwitch();
159
+ return state.stopped ? new KillSwitchEngagedError(operation, state) : null;
160
+ }
161
+ //# sourceMappingURL=killSwitch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"killSwitch.js","sourceRoot":"","sources":["../src/killSwitch.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"assumptions.d.ts","sourceRoot":"","sources":["../../../src/lib/agent-services/assumptions.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAGV,0BAA0B,EAC1B,kBAAkB,EAEnB,MAAM,+BAA+B,CAAC;AA0IvC;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IACR,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,OAAO,CAAC,0BAA0B,CAAC,CAmErC;AA4FD;;GAEG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBnD"}
1
+ {"version":3,"file":"assumptions.d.ts","sourceRoot":"","sources":["../../../src/lib/agent-services/assumptions.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAGV,0BAA0B,EAC1B,kBAAkB,EAEnB,MAAM,+BAA+B,CAAC;AA2IvC;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IACR,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,OAAO,CAAC,0BAA0B,CAAC,CAyErC;AA4FD;;GAEG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBnD"}
@@ -5,6 +5,7 @@
5
5
  // and things the agent should always ask about rather than assume.
6
6
  // ============================================================================
7
7
  import { getRun, listRuns } from '../../tools/vector.js';
8
+ import { countedStoreMeta } from '../../tools/shared/storeRead.js';
8
9
  // ============================================================================
9
10
  // Constants
10
11
  // ============================================================================
@@ -129,10 +130,14 @@ export async function aggregateAssumptions(projectId, options) {
129
130
  const lookbackDays = options?.lookback_days || 30;
130
131
  const maxRuns = options?.max_runs || 100;
131
132
  // Get recent runs
132
- const { runs } = await listRuns({
133
+ const { runs, unreadable_count: runsUnreadable = 0 } = await listRuns({
133
134
  projectId,
134
135
  limit: maxRuns,
135
136
  });
137
+ // Runs listRuns could not describe, plus runs whose events this loop could
138
+ // not read. Both mean the same thing here: assumptions that were made and
139
+ // are not in the totals below.
140
+ let unreadable = runsUnreadable;
136
141
  // Filter by date
137
142
  const cutoff = new Date();
138
143
  cutoff.setDate(cutoff.getDate() - lookbackDays);
@@ -163,7 +168,7 @@ export async function aggregateAssumptions(projectId, options) {
163
168
  allAssumptions.push(...assumptions);
164
169
  }
165
170
  catch {
166
- // Skip runs we can't read
171
+ unreadable++;
167
172
  }
168
173
  }
169
174
  // Calculate stats
@@ -176,6 +181,7 @@ export async function aggregateAssumptions(projectId, options) {
176
181
  end: new Date().toISOString(),
177
182
  run_count: recentRuns.length,
178
183
  },
184
+ ...countedStoreMeta(recentRuns.length, unreadable),
179
185
  };
180
186
  }
181
187
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"assumptions.js","sourceRoot":"","sources":["../../../src/lib/agent-services/assumptions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assumptions.js","sourceRoot":"","sources":["../../../src/lib/agent-services/assumptions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Atomic file replacement.
3
+ *
4
+ * `fs.writeFile` truncates the target and then streams bytes into it. A crash,
5
+ * a full disk, or a killed process partway through leaves a truncated file —
6
+ * and for Decibel that means a half-written issue or epic that no longer
7
+ * parses. The store's own history has one class of corruption already
8
+ * (ISS-0129); a partial write is a second, and unlike the first it would not be
9
+ * recoverable by salvage, because there is nothing to salvage from.
10
+ *
11
+ * `rename(2)` within a filesystem is atomic: a concurrent reader sees either
12
+ * the complete old file or the complete new one, never a mixture. So we write
13
+ * a sibling temp file, flush it, and rename over the target.
14
+ *
15
+ * The temp file must live in the **same directory** as the target. `os.tmpdir()`
16
+ * is frequently a different filesystem, where rename degrades to copy+unlink
17
+ * and loses atomicity — silently, which is the worst way to lose it.
18
+ */
19
+ /**
20
+ * Replace `filePath` with `content` atomically.
21
+ *
22
+ * Preserves the existing file's permissions when there is one, so replacing a
23
+ * record does not quietly widen or narrow its mode.
24
+ */
25
+ export declare function writeFileAtomic(filePath: string, content: string, encoding?: BufferEncoding): Promise<void>;
26
+ /**
27
+ * Create `filePath` with `content`, atomically AND exclusively (ISS-0195).
28
+ *
29
+ * `writeFile(…, { flag: 'wx' })` is exclusive but not atomic: O_EXCL creates
30
+ * the file empty and the bytes follow, so a SIGKILL in between leaves a 0-byte
31
+ * record under a real id. Temp-and-rename is atomic but not exclusive: rename
32
+ * silently replaces an existing file. `link(2)` is both. It publishes a fully
33
+ * written, fsynced temp under the final name in one step, and fails with
34
+ * EEXIST when the name is taken, exactly like O_EXCL. A kill can only leave
35
+ * the dot-temp behind, which no record scan reads; see sweepAllocationTemps.
36
+ *
37
+ * Where hard links are unavailable (some FAT, exFAT and network mounts), this
38
+ * falls back to the O_EXCL write: still exclusive, and no worse than before.
39
+ */
40
+ export declare function createFileExclusive(filePath: string, content: string, encoding?: BufferEncoding): Promise<void>;
41
+ /** Suffix of createFileExclusive's temp files. */
42
+ export declare const ALLOC_TEMP_SUFFIX = ".alloc.tmp";
43
+ /**
44
+ * Remove createFileExclusive temps in `dir` older than `maxAgeMs`: the debris
45
+ * a killed writer leaves behind. The age floor keeps it from touching a temp
46
+ * a live writer is still filling. Never throws; this is housekeeping.
47
+ */
48
+ export declare function sweepAllocationTemps(dir: string, maxAgeMs?: number): Promise<number>;
49
+ //# sourceMappingURL=atomicWrite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomicWrite.d.ts","sourceRoot":"","sources":["../../src/lib/atomicWrite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,cAAwB,GACjC,OAAO,CAAC,IAAI,CAAC,CA2Cf;AAKD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,cAAwB,GACjC,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED,kDAAkD;AAClD,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAE9C;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB/F"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Atomic file replacement.
3
+ *
4
+ * `fs.writeFile` truncates the target and then streams bytes into it. A crash,
5
+ * a full disk, or a killed process partway through leaves a truncated file —
6
+ * and for Decibel that means a half-written issue or epic that no longer
7
+ * parses. The store's own history has one class of corruption already
8
+ * (ISS-0129); a partial write is a second, and unlike the first it would not be
9
+ * recoverable by salvage, because there is nothing to salvage from.
10
+ *
11
+ * `rename(2)` within a filesystem is atomic: a concurrent reader sees either
12
+ * the complete old file or the complete new one, never a mixture. So we write
13
+ * a sibling temp file, flush it, and rename over the target.
14
+ *
15
+ * The temp file must live in the **same directory** as the target. `os.tmpdir()`
16
+ * is frequently a different filesystem, where rename degrades to copy+unlink
17
+ * and loses atomicity — silently, which is the worst way to lose it.
18
+ */
19
+ import { promises as fs } from 'fs';
20
+ import path from 'path';
21
+ import { randomBytes } from 'crypto';
22
+ /**
23
+ * Replace `filePath` with `content` atomically.
24
+ *
25
+ * Preserves the existing file's permissions when there is one, so replacing a
26
+ * record does not quietly widen or narrow its mode.
27
+ */
28
+ export async function writeFileAtomic(filePath, content, encoding = 'utf-8') {
29
+ const dir = path.dirname(filePath);
30
+ const tmpPath = path.join(dir, `.${path.basename(filePath)}.${randomBytes(6).toString('hex')}.tmp`);
31
+ // Capture the current mode before writing so it can be carried over.
32
+ let mode;
33
+ try {
34
+ mode = (await fs.stat(filePath)).mode;
35
+ }
36
+ catch {
37
+ // New file — let the umask decide.
38
+ }
39
+ let handle;
40
+ try {
41
+ handle = await fs.open(tmpPath, 'wx', mode);
42
+ await handle.writeFile(content, encoding);
43
+ // Flush to disk before the rename. Without this the rename can be durable
44
+ // while the data behind it is not, which on a crash yields an atomically
45
+ // renamed empty file — a worse outcome than the partial write we set out
46
+ // to avoid.
47
+ await handle.sync();
48
+ await handle.close();
49
+ handle = undefined;
50
+ await fs.rename(tmpPath, filePath);
51
+ }
52
+ catch (err) {
53
+ if (handle) {
54
+ try {
55
+ await handle.close();
56
+ }
57
+ catch {
58
+ // Already closed or never opened cleanly.
59
+ }
60
+ }
61
+ // Never leave temp files behind for the next directory scan to trip over —
62
+ // the issue store is enumerated by readdir, and a stray .tmp would be
63
+ // treated as a record by anything with a loose filter.
64
+ try {
65
+ await fs.unlink(tmpPath);
66
+ }
67
+ catch {
68
+ // Nothing to clean up.
69
+ }
70
+ throw err;
71
+ }
72
+ }
73
+ /** Errors meaning "this filesystem cannot hard-link", not "the target exists". */
74
+ const LINK_UNSUPPORTED = new Set(['EPERM', 'ENOTSUP', 'EOPNOTSUPP', 'EXDEV', 'ENOSYS']);
75
+ /**
76
+ * Create `filePath` with `content`, atomically AND exclusively (ISS-0195).
77
+ *
78
+ * `writeFile(…, { flag: 'wx' })` is exclusive but not atomic: O_EXCL creates
79
+ * the file empty and the bytes follow, so a SIGKILL in between leaves a 0-byte
80
+ * record under a real id. Temp-and-rename is atomic but not exclusive: rename
81
+ * silently replaces an existing file. `link(2)` is both. It publishes a fully
82
+ * written, fsynced temp under the final name in one step, and fails with
83
+ * EEXIST when the name is taken, exactly like O_EXCL. A kill can only leave
84
+ * the dot-temp behind, which no record scan reads; see sweepAllocationTemps.
85
+ *
86
+ * Where hard links are unavailable (some FAT, exFAT and network mounts), this
87
+ * falls back to the O_EXCL write: still exclusive, and no worse than before.
88
+ */
89
+ export async function createFileExclusive(filePath, content, encoding = 'utf-8') {
90
+ const dir = path.dirname(filePath);
91
+ const tmpPath = path.join(dir, `.${path.basename(filePath)}.${randomBytes(6).toString('hex')}${ALLOC_TEMP_SUFFIX}`);
92
+ let handle;
93
+ try {
94
+ handle = await fs.open(tmpPath, 'wx');
95
+ await handle.writeFile(content, encoding);
96
+ await handle.sync();
97
+ await handle.close();
98
+ handle = undefined;
99
+ try {
100
+ await fs.link(tmpPath, filePath);
101
+ }
102
+ catch (err) {
103
+ const code = err.code ?? '';
104
+ if (!LINK_UNSUPPORTED.has(code))
105
+ throw err; // EEXIST included: the caller retries.
106
+ await fs.writeFile(filePath, content, { encoding, flag: 'wx' });
107
+ }
108
+ }
109
+ finally {
110
+ if (handle) {
111
+ try {
112
+ await handle.close();
113
+ }
114
+ catch {
115
+ // Already closed or never opened cleanly.
116
+ }
117
+ }
118
+ try {
119
+ await fs.unlink(tmpPath);
120
+ }
121
+ catch {
122
+ // Nothing to clean up.
123
+ }
124
+ }
125
+ }
126
+ /** Suffix of createFileExclusive's temp files. */
127
+ export const ALLOC_TEMP_SUFFIX = '.alloc.tmp';
128
+ /**
129
+ * Remove createFileExclusive temps in `dir` older than `maxAgeMs`: the debris
130
+ * a killed writer leaves behind. The age floor keeps it from touching a temp
131
+ * a live writer is still filling. Never throws; this is housekeeping.
132
+ */
133
+ export async function sweepAllocationTemps(dir, maxAgeMs = 10 * 60_000) {
134
+ let removed = 0;
135
+ try {
136
+ const now = Date.now();
137
+ for (const name of await fs.readdir(dir)) {
138
+ if (!name.startsWith('.') || !name.endsWith(ALLOC_TEMP_SUFFIX))
139
+ continue;
140
+ const full = path.join(dir, name);
141
+ try {
142
+ if (now - (await fs.stat(full)).mtimeMs > maxAgeMs) {
143
+ await fs.unlink(full);
144
+ removed++;
145
+ }
146
+ }
147
+ catch {
148
+ // Raced with another sweeper, or already gone.
149
+ }
150
+ }
151
+ }
152
+ catch {
153
+ // Directory unreadable or absent: nothing to sweep.
154
+ }
155
+ return removed;
156
+ }
157
+ //# sourceMappingURL=atomicWrite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomicWrite.js","sourceRoot":"","sources":["../../src/lib/atomicWrite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export interface StatusEnvelope {
2
+ status: 'executed' | 'error' | 'unavailable' | 'queued';
3
+ /** True when the call was carried out. Authoritative — payloads cannot overwrite it. */
4
+ ok?: boolean;
5
+ [key: string]: unknown;
6
+ }
7
+ export interface ErrorEnvelope extends StatusEnvelope {
8
+ status: 'error';
9
+ ok: false;
10
+ error: string;
11
+ code?: string;
12
+ }
13
+ /**
14
+ * Strip absolute paths out of an error before it goes on the wire.
15
+ * Preserves URLs, relative paths, and the `.decibel/` portion of a project
16
+ * path — that part is what makes an error actionable, the prefix is what
17
+ * leaks a home directory.
18
+ */
19
+ export declare function sanitizeErrorMessage(message: string): string;
20
+ /** Wrap a successful result. `ok` goes last so the payload cannot overwrite it. */
21
+ export declare function wrapSuccess(data: Record<string, unknown>): StatusEnvelope;
22
+ /** Wrap a failure. Both fields are explicit, so both are trustworthy here. */
23
+ export declare function wrapError(error: string, code?: string): ErrorEnvelope;
24
+ /**
25
+ * The one place that decides whether an envelope represents a failure.
26
+ * Handles both dialects so a new client can talk to an old runtime.
27
+ */
28
+ export declare function envelopeFailed(envelope: Record<string, unknown>): boolean;
29
+ /** HTTP status code for an envelope. 400 only when the call actually failed. */
30
+ export declare function envelopeHttpStatus(envelope: StatusEnvelope): number;
31
+ //# sourceMappingURL=envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/lib/envelope.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,UAAU,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,CAAC;IACxD,wFAAwF;IACxF,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAc,SAAQ,cAAc;IACnD,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA0B5D;AAED,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,CAEzE;AAED,8EAA8E;AAC9E,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,CAGrE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAGzE;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAEnE"}
@@ -0,0 +1,80 @@
1
+ // ============================================================================
2
+ // Wire envelope — EPIC-0038 Phase 4
3
+ // ============================================================================
4
+ // The shape every non-MCP surface returns: /call, /batch, the REST shorthands,
5
+ // and (from Phase 4) any adapter that speaks to the runtime over HTTP. It
6
+ // lives here rather than inside httpServer.ts because the envelope is a
7
+ // contract between processes, not a detail of one server — adapters, the
8
+ // client SDK and the tests all need to agree on it, and only one of those is
9
+ // an HTTP server.
10
+ //
11
+ // THE FIELD TO TEST IS `ok`.
12
+ //
13
+ // `status` predates it and is kept for compatibility, but it cannot be used to
14
+ // detect success. `wrapSuccess` spreads the tool's payload over the envelope,
15
+ // so any tool that returns its own `status` — every sentinel issue (`open`,
16
+ // `closed`), every epic (`in_progress`), every job — overwrites `'executed'`
17
+ // with a domain value. Failure was detectable only because `wrapError` builds
18
+ // the field explicitly, which is why every consumer independently arrived at
19
+ // the negative test `status === 'error'` and none could ask the direct
20
+ // question. HQ's client carries that exact workaround with a comment
21
+ // explaining why.
22
+ //
23
+ // `ok` is written last, so no payload can clobber it, and it is a boolean, so
24
+ // it cannot collide with a domain vocabulary. Consumers should read `ok` when
25
+ // present and fall back to `status === 'error'` only for a runtime old enough
26
+ // not to send it.
27
+ //
28
+ // Adding rather than replacing was the deliberate choice (Ben, 2026-08-30):
29
+ // HQ, the VS Code extension, the iOS app and senken.pro all read this envelope
30
+ // today and none of them has to change for this to land. Retiring the
31
+ // ambiguous `status` is a later cleanup, once consumers have moved to `ok`.
32
+ // ============================================================================
33
+ /**
34
+ * Strip absolute paths out of an error before it goes on the wire.
35
+ * Preserves URLs, relative paths, and the `.decibel/` portion of a project
36
+ * path — that part is what makes an error actionable, the prefix is what
37
+ * leaks a home directory.
38
+ */
39
+ export function sanitizeErrorMessage(message) {
40
+ let sanitized = message;
41
+ // Step 1: Preserve paths containing .decibel (keep the .decibel part, strip prefix)
42
+ // /home/user/project/.decibel/foo -> .decibel/foo
43
+ sanitized = sanitized.replace(/(?:\/[^\s:'"]+)?\/\.decibel\//g, '.decibel/');
44
+ sanitized = sanitized.replace(/(?:[A-Z]:\\[^\s:'"]+)?\\\.decibel\\/gi, '.decibel\\');
45
+ // Step 2: Remove absolute Unix paths (must start with / and have at least one more /)
46
+ // But exclude URLs (http://, https://, file://)
47
+ // Match: /home/user/file.txt, /var/log/app.log
48
+ // Don't match: http://example.com, ./relative/path
49
+ sanitized = sanitized.replace(/(?<!:)\/(?:home|Users|var|tmp|opt|usr|etc|media|mnt)\/[^\s:'"]+/g, '[path]');
50
+ // Step 3: Remove Windows absolute paths (C:\, D:\, etc.)
51
+ sanitized = sanitized.replace(/[A-Z]:\\[^\s:'"]+/gi, '[path]');
52
+ // Step 4: Sanitize any remaining usernames in paths that weren't caught
53
+ sanitized = sanitized.replace(/\/home\/[^\/\s]+\//g, '/home/[user]/');
54
+ sanitized = sanitized.replace(/\/Users\/[^\/\s]+\//g, '/Users/[user]/');
55
+ sanitized = sanitized.replace(/C:\\Users\\[^\\]+\\/gi, 'C:\\Users\\[user]\\');
56
+ return sanitized;
57
+ }
58
+ /** Wrap a successful result. `ok` goes last so the payload cannot overwrite it. */
59
+ export function wrapSuccess(data) {
60
+ return { status: 'executed', ...data, ok: true };
61
+ }
62
+ /** Wrap a failure. Both fields are explicit, so both are trustworthy here. */
63
+ export function wrapError(error, code) {
64
+ const sanitized = sanitizeErrorMessage(error);
65
+ return { status: 'error', ok: false, error: sanitized, ...(code && { code }) };
66
+ }
67
+ /**
68
+ * The one place that decides whether an envelope represents a failure.
69
+ * Handles both dialects so a new client can talk to an old runtime.
70
+ */
71
+ export function envelopeFailed(envelope) {
72
+ if (typeof envelope.ok === 'boolean')
73
+ return !envelope.ok;
74
+ return envelope.status === 'error';
75
+ }
76
+ /** HTTP status code for an envelope. 400 only when the call actually failed. */
77
+ export function envelopeHttpStatus(envelope) {
78
+ return envelope.ok === false ? 400 : 200;
79
+ }
80
+ //# sourceMappingURL=envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/lib/envelope.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,oCAAoC;AACpC,+EAA+E;AAC/E,+EAA+E;AAC/E,0EAA0E;AAC1E,wEAAwE;AACxE,yEAAyE;AACzE,6EAA6E;AAC7E,kBAAkB;AAClB,EAAE;AACF,6BAA6B;AAC7B,EAAE;AACF,+EAA+E;AAC/E,8EAA8E;AAC9E,4EAA4E;AAC5E,6EAA6E;AAC7E,8EAA8E;AAC9E,6EAA6E;AAC7E,uEAAuE;AACvE,qEAAqE;AACrE,kBAAkB;AAClB,EAAE;AACF,8EAA8E;AAC9E,8EAA8E;AAC9E,8EAA8E;AAC9E,kBAAkB;AAClB,EAAE;AACF,4EAA4E;AAC5E,+EAA+E;AAC/E,sEAAsE;AACtE,4EAA4E;AAC5E,+EAA+E;AAgB/E;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,IAAI,SAAS,GAAG,OAAO,CAAC;IAExB,oFAAoF;IACpF,kDAAkD;IAClD,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,gCAAgC,EAAE,WAAW,CAAC,CAAC;IAC7E,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,uCAAuC,EAAE,YAAY,CAAC,CAAC;IAErF,sFAAsF;IACtF,gDAAgD;IAChD,+CAA+C;IAC/C,mDAAmD;IACnD,SAAS,GAAG,SAAS,CAAC,OAAO,CAC3B,kEAAkE,EAClE,QAAQ,CACT,CAAC;IAEF,yDAAyD;IACzD,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;IAE/D,wEAAwE;IACxE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,qBAAqB,EAAE,eAAe,CAAC,CAAC;IACtE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,CAAC;IACxE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE,qBAAqB,CAAC,CAAC;IAE9E,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,WAAW,CAAC,IAA6B;IACvD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACnD,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,IAAa;IACpD,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACjF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAiC;IAC9D,IAAI,OAAO,QAAQ,CAAC,EAAE,KAAK,SAAS;QAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC1D,OAAO,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC;AACrC,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAAC,QAAwB;IACzD,OAAO,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Cross-process advisory file lock.
3
+ *
4
+ * Decibel's stores are plain files in `.decibel/`, written concurrently by
5
+ * every MCP client, CLI invocation, hook, and migration script on the machine.
6
+ * An in-process mutex is useless here — the contending writers are separate
7
+ * processes, often separate installs.
8
+ *
9
+ * Acquisition is `open(path, 'wx')`: O_EXCL, which either creates the file
10
+ * atomically or fails with EEXIST. There is no read-then-write window for a
11
+ * second caller to slip through, which is the property that makes this safe
12
+ * where a "does a lock exist?" check would not be.
13
+ *
14
+ * The lock is advisory: it only protects callers that take it. That is why the
15
+ * operations it guards should *also* be individually safe (e.g. creating a file
16
+ * with O_EXCL so a colliding write fails loudly). Old clients, one-off scripts,
17
+ * and migrations are part of the threat model and will not take the lock.
18
+ */
19
+ export interface FileLockOptions {
20
+ /** Give up acquiring after this long. */
21
+ timeoutMs?: number;
22
+ /** A lock older than this is presumed abandoned by a crashed holder. */
23
+ staleMs?: number;
24
+ /** Delay between acquisition attempts. */
25
+ retryIntervalMs?: number;
26
+ }
27
+ /** Thrown when the lock could not be acquired before the timeout. */
28
+ export declare class FileLockTimeoutError extends Error {
29
+ constructor(lockPath: string, timeoutMs: number, holder?: string);
30
+ }
31
+ /**
32
+ * Run `fn` while holding an exclusive cross-process lock.
33
+ *
34
+ * The lock is always released, including when `fn` throws — a failed write must
35
+ * not wedge every other writer on the machine.
36
+ */
37
+ export declare function withFileLock<T>(lockPath: string, fn: () => Promise<T>, options?: FileLockOptions): Promise<T>;
38
+ //# sourceMappingURL=fileLock.d.ts.map