@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,276 @@
1
+ /**
2
+ * ensureRuntime — the one lifecycle primitive.
3
+ *
4
+ * Every surface that needs the Decibel runtime (MCP adapters, the CLI, the
5
+ * VS Code extension, shell hooks) calls this. None of them should carry their
6
+ * own "is the daemon up? should I start it?" logic — that duplication is how
7
+ * five subtly different startup behaviours end up in one codebase.
8
+ *
9
+ * Two things this deliberately does NOT do:
10
+ *
11
+ * 1. It does not use the PID file as the source of truth. `~/.decibel/daemon.pid`
12
+ * goes stale — an unclean exit leaves a pid pointing at nothing, or worse,
13
+ * at a recycled pid belonging to an unrelated process. A successful
14
+ * `/health` response is the only proof the runtime is actually serving.
15
+ *
16
+ * 2. It does not check-then-spawn. When six clients start at once, six
17
+ * "is it running? no → start it" sequences race and you get six daemons
18
+ * fighting over one port. Startup is arbitrated by an atomic O_EXCL lock
19
+ * file: exactly one caller wins the right to spawn, and the losers wait
20
+ * for the winner's daemon rather than starting their own.
21
+ */
22
+ import { spawn } from 'child_process';
23
+ import { openSync, closeSync, writeSync, unlinkSync, statSync, mkdirSync } from 'fs';
24
+ import { join, dirname } from 'path';
25
+ import { homedir } from 'os';
26
+ import { fileURLToPath } from 'url';
27
+ import { RUNTIME_PROTOCOL_VERSION, isProtocolCompatible } from './protocol.js';
28
+ import { localJson } from './localHttp.js';
29
+ import { advertisedPort } from './daemonMeta.js';
30
+ const DECIBEL_HOME = join(homedir(), '.decibel');
31
+ const META_PATH = join(DECIBEL_HOME, 'daemon.meta');
32
+ const LOCK_PATH = join(DECIBEL_HOME, 'runtime.lock');
33
+ /** Default port the daemon binds. Overridden by daemon.meta or DECIBEL_DAEMON_PORT. */
34
+ export const DEFAULT_RUNTIME_PORT = 4888;
35
+ /** A lock older than this is presumed abandoned (holder crashed mid-spawn). */
36
+ const LOCK_STALE_MS = 30_000;
37
+ /** How long to wait for a runtime — ours or someone else's — to become healthy. */
38
+ const DEFAULT_STARTUP_TIMEOUT_MS = 15_000;
39
+ /** Gap between `/health` polls while waiting for startup. */
40
+ const POLL_INTERVAL_MS = 150;
41
+ /** Per-probe HTTP timeout. Short: a healthy local daemon answers in single-digit ms. */
42
+ const PROBE_TIMEOUT_MS = 1_500;
43
+ /** Thrown when a runtime is serving but speaks an incompatible protocol. */
44
+ export class RuntimeProtocolMismatchError extends Error {
45
+ serverVersion;
46
+ clientVersion;
47
+ constructor(serverVersion, clientVersion, reason) {
48
+ super(`Decibel runtime protocol mismatch: ${reason}. ` +
49
+ `Restart the runtime so it matches this client (\`decibel-tools --daemon restart\`), ` +
50
+ `or upgrade the client to match the running runtime.`);
51
+ this.serverVersion = serverVersion;
52
+ this.clientVersion = clientVersion;
53
+ this.name = 'RuntimeProtocolMismatchError';
54
+ }
55
+ }
56
+ /** Thrown when no runtime is serving and one could not be started. */
57
+ export class RuntimeUnavailableError extends Error {
58
+ constructor(port, detail) {
59
+ super(`Decibel runtime is not available on 127.0.0.1:${port}: ${detail}. ` +
60
+ `Start it manually with \`decibel-tools --daemon\` and check ` +
61
+ `~/.decibel/logs/daemon.log for why it did not come up.`);
62
+ this.name = 'RuntimeUnavailableError';
63
+ }
64
+ }
65
+ // ============================================================================
66
+ // Port discovery
67
+ // ============================================================================
68
+ /**
69
+ * Resolve the port to talk to, in precedence order:
70
+ * explicit option → DECIBEL_DAEMON_PORT → daemon.meta → default.
71
+ *
72
+ * daemon.meta is a *hint*, not proof of life — it records the port the daemon
73
+ * last bound. We still confirm with /health before trusting anything.
74
+ */
75
+ export function resolveRuntimePort(explicit) {
76
+ if (explicit)
77
+ return explicit;
78
+ const fromEnv = process.env.DECIBEL_DAEMON_PORT;
79
+ if (fromEnv) {
80
+ const parsed = Number(fromEnv);
81
+ if (Number.isInteger(parsed) && parsed > 0 && parsed < 65536)
82
+ return parsed;
83
+ }
84
+ // An advertisement whose pid is dead is treated as absent, not followed —
85
+ // falling back to the default beats dialling a corpse (ISS-0179).
86
+ return advertisedPort() ?? DEFAULT_RUNTIME_PORT;
87
+ }
88
+ // ============================================================================
89
+ // Health probe
90
+ // ============================================================================
91
+ /**
92
+ * GET /health. Returns null when nothing is listening or the response is not a
93
+ * usable health payload — callers treat null as "no runtime here", never as an
94
+ * error worth surfacing.
95
+ */
96
+ export async function probeRuntime(port) {
97
+ try {
98
+ const res = await localJson(`http://127.0.0.1:${port}/health`, {
99
+ timeoutMs: PROBE_TIMEOUT_MS,
100
+ });
101
+ if (!res.ok)
102
+ return null;
103
+ if (typeof res.body?.status !== 'string')
104
+ return null;
105
+ return res.body;
106
+ }
107
+ catch {
108
+ return null;
109
+ }
110
+ }
111
+ // ============================================================================
112
+ // Startup arbitration
113
+ // ============================================================================
114
+ /**
115
+ * Try to become the process responsible for spawning the runtime.
116
+ *
117
+ * `wx` is O_EXCL: the create either succeeds atomically or fails because
118
+ * someone else holds it. That is the whole arbitration mechanism — no
119
+ * read-then-write window for a second caller to slip through.
120
+ *
121
+ * A lock whose mtime is older than LOCK_STALE_MS is presumed abandoned (its
122
+ * holder crashed between acquiring and spawning) and is removed so startup can
123
+ * proceed. Without that, one crashed spawn would wedge every future client.
124
+ */
125
+ function tryAcquireStartupLock() {
126
+ mkdirSync(DECIBEL_HOME, { recursive: true });
127
+ try {
128
+ const fd = openSync(LOCK_PATH, 'wx');
129
+ writeSync(fd, JSON.stringify({ pid: process.pid, at: new Date().toISOString() }));
130
+ closeSync(fd);
131
+ return true;
132
+ }
133
+ catch (err) {
134
+ if (err.code !== 'EEXIST')
135
+ throw err;
136
+ }
137
+ // Held by someone. Abandoned?
138
+ try {
139
+ const age = Date.now() - statSync(LOCK_PATH).mtimeMs;
140
+ if (age > LOCK_STALE_MS) {
141
+ unlinkSync(LOCK_PATH);
142
+ return tryAcquireStartupLock();
143
+ }
144
+ }
145
+ catch {
146
+ // Vanished between our EEXIST and the stat — the holder finished. Retry once.
147
+ try {
148
+ const fd = openSync(LOCK_PATH, 'wx');
149
+ writeSync(fd, JSON.stringify({ pid: process.pid, at: new Date().toISOString() }));
150
+ closeSync(fd);
151
+ return true;
152
+ }
153
+ catch {
154
+ return false;
155
+ }
156
+ }
157
+ return false;
158
+ }
159
+ function releaseStartupLock() {
160
+ try {
161
+ unlinkSync(LOCK_PATH);
162
+ }
163
+ catch {
164
+ // Already gone (stolen as stale, or cleaned up elsewhere). Nothing to do.
165
+ }
166
+ }
167
+ /** Default runtime entry point: dist/server.js in this package. */
168
+ function defaultServerEntry() {
169
+ // src/runtime/ensureRuntime.ts → dist/runtime/ensureRuntime.js at runtime,
170
+ // so ../server.js resolves to dist/server.js in both layouts.
171
+ return join(dirname(fileURLToPath(import.meta.url)), '..', 'server.js');
172
+ }
173
+ /**
174
+ * Spawn the daemon fully detached so it outlives this client. A runtime that
175
+ * dies when the terminal that happened to start it closes is not a shared
176
+ * runtime.
177
+ */
178
+ function spawnRuntime(port, serverEntry) {
179
+ const child = spawn(process.execPath, [serverEntry, '--daemon', '--port', String(port)], {
180
+ detached: true,
181
+ stdio: 'ignore',
182
+ env: process.env,
183
+ });
184
+ child.unref();
185
+ }
186
+ /** Poll /health until it answers compatibly, or the deadline passes. */
187
+ async function waitForHealthy(port, clientProtocol, deadline) {
188
+ while (Date.now() < deadline) {
189
+ const health = await probeRuntime(port);
190
+ if (health) {
191
+ const compat = isProtocolCompatible(health.protocol_version, clientProtocol);
192
+ if (!compat.compatible) {
193
+ throw new RuntimeProtocolMismatchError(health.protocol_version, clientProtocol, compat.reason);
194
+ }
195
+ return health;
196
+ }
197
+ await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
198
+ }
199
+ return null;
200
+ }
201
+ // ============================================================================
202
+ // Entry point
203
+ // ============================================================================
204
+ /**
205
+ * Return a handle to a healthy, protocol-compatible runtime, starting one if
206
+ * needed.
207
+ *
208
+ * Throws rather than degrading:
209
+ * - RuntimeProtocolMismatchError when something is serving but speaks a
210
+ * contract this client does not understand.
211
+ * - RuntimeUnavailableError when nothing is serving and none could be started.
212
+ *
213
+ * Callers must not silently fall back to doing the work in-process. A client
214
+ * that quietly becomes a second writer is exactly the failure this runtime
215
+ * exists to prevent.
216
+ */
217
+ export async function ensureRuntime(options = {}) {
218
+ const clientProtocol = options.protocolVersion ?? RUNTIME_PROTOCOL_VERSION;
219
+ const port = resolveRuntimePort(options.port);
220
+ const autoStart = options.autoStart !== false;
221
+ const timeoutMs = options.timeoutMs ?? DEFAULT_STARTUP_TIMEOUT_MS;
222
+ // Fast path: something is already serving.
223
+ const existing = await probeRuntime(port);
224
+ if (existing) {
225
+ const compat = isProtocolCompatible(existing.protocol_version, clientProtocol);
226
+ if (!compat.compatible) {
227
+ throw new RuntimeProtocolMismatchError(existing.protocol_version, clientProtocol, compat.reason);
228
+ }
229
+ return toHandle(existing, port, false);
230
+ }
231
+ if (!autoStart) {
232
+ throw new RuntimeUnavailableError(port, 'nothing is listening and autoStart is disabled');
233
+ }
234
+ const deadline = Date.now() + timeoutMs;
235
+ // Arbitrate. Exactly one caller spawns; the rest wait for that one.
236
+ const isSpawner = tryAcquireStartupLock();
237
+ if (!isSpawner) {
238
+ const health = await waitForHealthy(port, clientProtocol, deadline);
239
+ if (health)
240
+ return toHandle(health, port, false);
241
+ throw new RuntimeUnavailableError(port, 'another process holds the startup lock but no runtime became healthy before the timeout');
242
+ }
243
+ try {
244
+ // Re-probe under the lock. Between our first probe and acquiring the lock,
245
+ // a previous holder may have finished starting one.
246
+ const raced = await probeRuntime(port);
247
+ if (raced) {
248
+ const compat = isProtocolCompatible(raced.protocol_version, clientProtocol);
249
+ if (!compat.compatible) {
250
+ throw new RuntimeProtocolMismatchError(raced.protocol_version, clientProtocol, compat.reason);
251
+ }
252
+ return toHandle(raced, port, false);
253
+ }
254
+ spawnRuntime(port, options.serverEntry ?? defaultServerEntry());
255
+ const health = await waitForHealthy(port, clientProtocol, deadline);
256
+ if (health)
257
+ return toHandle(health, port, true);
258
+ throw new RuntimeUnavailableError(port, `spawned a runtime but it did not report healthy within ${timeoutMs}ms`);
259
+ }
260
+ finally {
261
+ releaseStartupLock();
262
+ }
263
+ }
264
+ function toHandle(health, port, spawned) {
265
+ return {
266
+ url: `http://127.0.0.1:${port}`,
267
+ port,
268
+ pid: health.pid,
269
+ version: health.version,
270
+ protocolVersion: health.protocol_version ?? 'unknown',
271
+ licenseTier: health.license_tier,
272
+ spawned,
273
+ health,
274
+ };
275
+ }
276
+ //# sourceMappingURL=ensureRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensureRuntime.js","sourceRoot":"","sources":["../../src/runtime/ensureRuntime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAgB,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACnG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACjD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AACpD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;AAErD,uFAAuF;AACvF,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAEzC,+EAA+E;AAC/E,MAAM,aAAa,GAAG,MAAM,CAAC;AAE7B,mFAAmF;AACnF,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAE1C,6DAA6D;AAC7D,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B,wFAAwF;AACxF,MAAM,gBAAgB,GAAG,KAAK,CAAC;AA8C/B,4EAA4E;AAC5E,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IAE1C;IACA;IAFX,YACW,aAAiC,EACjC,aAAqB,EAC9B,MAAc;QAEd,KAAK,CACH,sCAAsC,MAAM,IAAI;YAC9C,sFAAsF;YACtF,qDAAqD,CACxD,CAAC;QARO,kBAAa,GAAb,aAAa,CAAoB;QACjC,kBAAa,GAAb,aAAa,CAAQ;QAQ9B,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAC7C,CAAC;CACF;AAED,sEAAsE;AACtE,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD,YAAY,IAAY,EAAE,MAAc;QACtC,KAAK,CACH,iDAAiD,IAAI,KAAK,MAAM,IAAI;YAClE,8DAA8D;YAC9D,wDAAwD,CAC3D,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAiB;IAClD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAChD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,KAAK;YAAE,OAAO,MAAM,CAAC;IAC9E,CAAC;IAED,0EAA0E;IAC1E,kEAAkE;IAClE,OAAO,cAAc,EAAE,IAAI,oBAAoB,CAAC;AAClD,CAAC;AAED,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAgB,oBAAoB,IAAI,SAAS,EAAE;YAC5E,SAAS,EAAE,gBAAgB;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,IAAI,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACtD,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E;;;;;;;;;;GAUG;AACH,SAAS,qBAAqB;IAC5B,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACrC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;QAClF,SAAS,CAAC,EAAE,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,GAAG,CAAC;IAClE,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;QACrD,IAAI,GAAG,GAAG,aAAa,EAAE,CAAC;YACxB,UAAU,CAAC,SAAS,CAAC,CAAC;YACtB,OAAO,qBAAqB,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,8EAA8E;QAC9E,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACrC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;YAClF,SAAS,CAAC,EAAE,CAAC,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,UAAU,CAAC,SAAS,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;IAC5E,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,SAAS,kBAAkB;IACzB,2EAA2E;IAC3E,8DAA8D;IAC9D,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AAC1E,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,IAAY,EAAE,WAAmB;IACrD,MAAM,KAAK,GAAG,KAAK,CACjB,OAAO,CAAC,QAAQ,EAChB,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,EACjD;QACE,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ;QACf,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CACF,CAAC;IACF,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,wEAAwE;AACxE,KAAK,UAAU,cAAc,CAC3B,IAAY,EACZ,cAAsB,EACtB,QAAgB;IAEhB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;YAC7E,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACvB,MAAM,IAAI,4BAA4B,CACpC,MAAM,CAAC,gBAAgB,EACvB,cAAc,EACd,MAAM,CAAC,MAAM,CACd,CAAC;YACJ,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAgC,EAAE;IAElC,MAAM,cAAc,GAAG,OAAO,CAAC,eAAe,IAAI,wBAAwB,CAAC;IAC3E,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;IAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,0BAA0B,CAAC;IAElE,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;QAC/E,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACvB,MAAM,IAAI,4BAA4B,CACpC,QAAQ,CAAC,gBAAgB,EACzB,cAAc,EACd,MAAM,CAAC,MAAM,CACd,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,uBAAuB,CAAC,IAAI,EAAE,gDAAgD,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAExC,oEAAoE;IACpE,MAAM,SAAS,GAAG,qBAAqB,EAAE,CAAC;IAE1C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;QACpE,IAAI,MAAM;YAAE,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,IAAI,uBAAuB,CAC/B,IAAI,EACJ,yFAAyF,CAC1F,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,2EAA2E;QAC3E,oDAAoD;QACpD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;YAC5E,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACvB,MAAM,IAAI,4BAA4B,CACpC,KAAK,CAAC,gBAAgB,EACtB,cAAc,EACd,MAAM,CAAC,MAAM,CACd,CAAC;YACJ,CAAC;YACD,OAAO,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC;QAED,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,IAAI,kBAAkB,EAAE,CAAC,CAAC;QAEhE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;QACpE,IAAI,MAAM;YAAE,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAEhD,MAAM,IAAI,uBAAuB,CAC/B,IAAI,EACJ,0DAA0D,SAAS,IAAI,CACxE,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,kBAAkB,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,MAAqB,EAAE,IAAY,EAAE,OAAgB;IACrE,OAAO;QACL,GAAG,EAAE,oBAAoB,IAAI,EAAE;QAC/B,IAAI;QACJ,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,eAAe,EAAE,MAAM,CAAC,gBAAgB,IAAI,SAAS;QACrD,WAAW,EAAE,MAAM,CAAC,YAAY;QAChC,OAAO;QACP,MAAM;KACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,57 @@
1
+ import type { FacadeSpec } from '../facades/types.js';
2
+ import type { ToolSpec } from '../tools/types.js';
3
+ export interface DecibelExtensionManifest {
4
+ /** Facade-style identifier, e.g. "senken". Must not collide with a core facade. */
5
+ name: string;
6
+ /** The extension's own version, independent of the runtime's. */
7
+ version: string;
8
+ /** Runtime wire contract this extension was built against. See protocol.ts. */
9
+ protocolVersion: string;
10
+ /** Extensions are never core — core is what ships in the package. */
11
+ tier: 'pro' | 'apps';
12
+ }
13
+ export interface DecibelExtension {
14
+ manifest: DecibelExtensionManifest;
15
+ facades: FacadeSpec[];
16
+ tools: ToolSpec[];
17
+ }
18
+ export interface RejectedExtension {
19
+ /** The allowlist entry as written, so the owner can find it in their config. */
20
+ entry: string;
21
+ reason: string;
22
+ }
23
+ export interface ExtensionLoadResult {
24
+ extensions: DecibelExtension[];
25
+ facades: FacadeSpec[];
26
+ tools: ToolSpec[];
27
+ rejected: RejectedExtension[];
28
+ }
29
+ /**
30
+ * Read the extension allowlist from ~/.decibel/config.yaml.
31
+ *
32
+ * Deliberately config-only. Reading a path from the environment would let
33
+ * anything that can set an env var — a plist, a shell profile, a parent
34
+ * process — choose code that runs in-process with full access, which is
35
+ * exactly the property the allowlist exists to provide.
36
+ */
37
+ export declare function readAllowlist(): string[];
38
+ /** Path rules, split out so the test suite can exercise them without a filesystem. */
39
+ export declare function checkAllowlistEntry(entry: string): {
40
+ ok: true;
41
+ path: string;
42
+ } | {
43
+ ok: false;
44
+ reason: string;
45
+ };
46
+ /**
47
+ * Load every allowlisted extension.
48
+ *
49
+ * Never throws. A broken extension is reported in `rejected` and the runtime
50
+ * boots without it — one bad private module must not take down core. Callers
51
+ * that care (the daemon's startup log, /health) surface the rejections.
52
+ *
53
+ * @param reservedNames Facade names already registered. An extension may not
54
+ * shadow one; that would let a private module silently replace `sentinel`.
55
+ */
56
+ export declare function loadExtensions(reservedNames?: ReadonlySet<string>): Promise<ExtensionLoadResult>;
57
+ //# sourceMappingURL=extensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../src/runtime/extensions.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AASlD,MAAM,WAAW,wBAAwB;IACvC,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,eAAe,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,wBAAwB,CAAC;IACnC,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AA6FD;;;;;;;GAOG;AACH,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAKxC;AAED,sFAAsF;AACtF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAsB7G;AAMD;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,aAAa,GAAE,WAAW,CAAC,MAAM,CAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAyDjH"}
@@ -0,0 +1,216 @@
1
+ // ============================================================================
2
+ // Extension Loader — EPIC-0038 Phase 7
3
+ // ============================================================================
4
+ // Private facades are not compiled into the published package. They arrive at
5
+ // boot as extensions: modules named by absolute path in an allowlist under
6
+ // ~/.decibel/config.yaml, registered into the same registry core facades use.
7
+ //
8
+ // The security model is registration, not permission. A facade that was never
9
+ // registered cannot be dispatched to, cannot appear in tools/list, and cannot
10
+ // be reached by a name-prefix trick — there is nothing on the other end. That
11
+ // is a stronger guarantee than a runtime tier check, which is one missed branch
12
+ // away from failing open. It replaces the DECIBEL_APPS env gate, which had the
13
+ // opposite failure mode: the flag lived in a launchd plist, so regenerating the
14
+ // plist silently dropped four facades with no error anywhere.
15
+ //
16
+ // TRUST BOUNDARY — read before changing anything here.
17
+ // An extension runs in-process with the runtime's full filesystem and database
18
+ // access. There is no sandbox and this loader does not pretend to be one. The
19
+ // allowlist is what makes that proportionate: for single-user private use,
20
+ // "the owner named this exact file" is a real boundary. It stops being one the
21
+ // moment a path can come from somewhere other than the owner's config, so:
22
+ //
23
+ // - Only absolute paths are accepted. A bare specifier ("senken") would be
24
+ // resolved by Node against node_modules, which makes the allowlist
25
+ // decorative — anything that can write a package into the tree chooses
26
+ // what runs.
27
+ // - The path is never read from the environment. Config file only.
28
+ // - An extension may not shadow an already-registered facade name.
29
+ // ============================================================================
30
+ import { existsSync } from 'fs';
31
+ import { isAbsolute, normalize } from 'path';
32
+ import { pathToFileURL } from 'url';
33
+ import { loadConfig } from '../daemonConfig.js';
34
+ import { log } from '../config.js';
35
+ import { RUNTIME_PROTOCOL_VERSION, isProtocolCompatible } from './protocol.js';
36
+ const EMPTY_RESULT = {
37
+ extensions: [],
38
+ facades: [],
39
+ tools: [],
40
+ rejected: [],
41
+ };
42
+ /** Facade names must look like facade names — this is also what the kernel keys on. */
43
+ const NAME_PATTERN = /^[a-z][a-z0-9-]*$/;
44
+ // ============================================================================
45
+ // Manifest validation
46
+ // ============================================================================
47
+ function validateManifest(value) {
48
+ if (!value || typeof value !== 'object') {
49
+ return { ok: false, reason: 'manifest is missing or not an object' };
50
+ }
51
+ const m = value;
52
+ if (typeof m.name !== 'string' || !NAME_PATTERN.test(m.name)) {
53
+ return { ok: false, reason: `manifest.name must match ${NAME_PATTERN} (got ${JSON.stringify(m.name)})` };
54
+ }
55
+ if (typeof m.version !== 'string' || m.version.length === 0) {
56
+ return { ok: false, reason: 'manifest.version must be a non-empty string' };
57
+ }
58
+ if (m.tier !== 'pro' && m.tier !== 'apps') {
59
+ return { ok: false, reason: `manifest.tier must be "pro" or "apps" (got ${JSON.stringify(m.tier)}) — "core" is what ships in the package, so it cannot be an extension` };
60
+ }
61
+ if (typeof m.protocolVersion !== 'string') {
62
+ return { ok: false, reason: 'manifest.protocolVersion must be a string' };
63
+ }
64
+ // The extension is a client of the runtime's wire contract, so the runtime is
65
+ // the "server" side of the comparison. A stale extension fails here with a
66
+ // version mismatch rather than later with a missing endpoint.
67
+ const compat = isProtocolCompatible(RUNTIME_PROTOCOL_VERSION, m.protocolVersion);
68
+ if (!compat.compatible) {
69
+ return { ok: false, reason: `protocol mismatch — ${compat.reason}` };
70
+ }
71
+ return {
72
+ ok: true,
73
+ manifest: {
74
+ name: m.name,
75
+ version: m.version,
76
+ protocolVersion: m.protocolVersion,
77
+ tier: m.tier,
78
+ },
79
+ };
80
+ }
81
+ function validateShape(value) {
82
+ if (!value || typeof value !== 'object') {
83
+ return { ok: false, reason: 'module does not export `extension`' };
84
+ }
85
+ const ext = value;
86
+ const manifestResult = validateManifest(ext.manifest);
87
+ if (!manifestResult.ok)
88
+ return manifestResult;
89
+ if (!Array.isArray(ext.facades) || ext.facades.length === 0) {
90
+ return { ok: false, reason: 'extension.facades must be a non-empty array' };
91
+ }
92
+ if (!Array.isArray(ext.tools) || ext.tools.length === 0) {
93
+ return { ok: false, reason: 'extension.tools must be a non-empty array' };
94
+ }
95
+ const manifest = manifestResult.manifest;
96
+ // Every facade the extension declares must carry the manifest's tier. An
97
+ // extension cannot smuggle a facade in at a laxer tier than it was allowed at.
98
+ for (const facade of ext.facades) {
99
+ if (!facade || typeof facade.name !== 'string' || !NAME_PATTERN.test(facade.name)) {
100
+ return { ok: false, reason: 'every entry in extension.facades must be a FacadeSpec with a valid name' };
101
+ }
102
+ if (facade.tier !== manifest.tier) {
103
+ return {
104
+ ok: false,
105
+ reason: `facade "${facade.name}" declares tier "${facade.tier}" but the manifest declares "${manifest.tier}"`,
106
+ };
107
+ }
108
+ }
109
+ return { ok: true, extension: ext };
110
+ }
111
+ // ============================================================================
112
+ // Allowlist
113
+ // ============================================================================
114
+ /**
115
+ * Read the extension allowlist from ~/.decibel/config.yaml.
116
+ *
117
+ * Deliberately config-only. Reading a path from the environment would let
118
+ * anything that can set an env var — a plist, a shell profile, a parent
119
+ * process — choose code that runs in-process with full access, which is
120
+ * exactly the property the allowlist exists to provide.
121
+ */
122
+ export function readAllowlist() {
123
+ const config = loadConfig();
124
+ const entries = config.extensions?.allow;
125
+ if (!Array.isArray(entries))
126
+ return [];
127
+ return entries.filter((e) => typeof e === 'string');
128
+ }
129
+ /** Path rules, split out so the test suite can exercise them without a filesystem. */
130
+ export function checkAllowlistEntry(entry) {
131
+ const trimmed = entry.trim();
132
+ if (trimmed.length === 0) {
133
+ return { ok: false, reason: 'empty allowlist entry' };
134
+ }
135
+ if (!isAbsolute(trimmed)) {
136
+ return {
137
+ ok: false,
138
+ reason: 'not an absolute path — a bare specifier would be resolved against node_modules, which makes the allowlist decorative',
139
+ };
140
+ }
141
+ // normalize() collapses any ".." segments. Compare against the original so a
142
+ // path that only *looks* like the allowed one is rejected rather than quietly
143
+ // rewritten into something else.
144
+ const normalized = normalize(trimmed);
145
+ if (normalized !== trimmed) {
146
+ return { ok: false, reason: `path is not normalized (resolves to ${normalized})` };
147
+ }
148
+ return { ok: true, path: normalized };
149
+ }
150
+ // ============================================================================
151
+ // Loader
152
+ // ============================================================================
153
+ /**
154
+ * Load every allowlisted extension.
155
+ *
156
+ * Never throws. A broken extension is reported in `rejected` and the runtime
157
+ * boots without it — one bad private module must not take down core. Callers
158
+ * that care (the daemon's startup log, /health) surface the rejections.
159
+ *
160
+ * @param reservedNames Facade names already registered. An extension may not
161
+ * shadow one; that would let a private module silently replace `sentinel`.
162
+ */
163
+ export async function loadExtensions(reservedNames = new Set()) {
164
+ const entries = readAllowlist();
165
+ if (entries.length === 0)
166
+ return EMPTY_RESULT;
167
+ const extensions = [];
168
+ const facades = [];
169
+ const tools = [];
170
+ const rejected = [];
171
+ const claimed = new Set(reservedNames);
172
+ for (const entry of entries) {
173
+ const pathCheck = checkAllowlistEntry(entry);
174
+ if (!pathCheck.ok) {
175
+ rejected.push({ entry, reason: pathCheck.reason });
176
+ continue;
177
+ }
178
+ if (!existsSync(pathCheck.path)) {
179
+ rejected.push({ entry, reason: 'file does not exist' });
180
+ continue;
181
+ }
182
+ let mod;
183
+ try {
184
+ mod = (await import(pathToFileURL(pathCheck.path).href));
185
+ }
186
+ catch (error) {
187
+ rejected.push({ entry, reason: `import failed — ${error instanceof Error ? error.message : String(error)}` });
188
+ continue;
189
+ }
190
+ const shape = validateShape(mod.extension);
191
+ if (!shape.ok) {
192
+ rejected.push({ entry, reason: shape.reason });
193
+ continue;
194
+ }
195
+ const extension = shape.extension;
196
+ const collision = extension.facades.find(f => claimed.has(f.name));
197
+ if (collision) {
198
+ rejected.push({ entry, reason: `facade "${collision.name}" is already registered — an extension may not shadow it` });
199
+ continue;
200
+ }
201
+ for (const facade of extension.facades)
202
+ claimed.add(facade.name);
203
+ extensions.push(extension);
204
+ facades.push(...extension.facades);
205
+ tools.push(...extension.tools);
206
+ }
207
+ for (const r of rejected) {
208
+ log(`Extensions: rejected ${r.entry} — ${r.reason}`);
209
+ }
210
+ if (extensions.length > 0) {
211
+ const names = extensions.map(e => `${e.manifest.name}@${e.manifest.version}`).join(', ');
212
+ log(`Extensions: loaded ${extensions.length} (${names}) — ${facades.length} facades, ${tools.length} tools`);
213
+ }
214
+ return { extensions, facades, tools, rejected };
215
+ }
216
+ //# sourceMappingURL=extensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../src/runtime/extensions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface LocalResponse {
2
+ status: number;
3
+ ok: boolean;
4
+ text: string;
5
+ }
6
+ export interface LocalRequestOptions {
7
+ method?: string;
8
+ headers?: Record<string, string>;
9
+ body?: string;
10
+ timeoutMs: number;
11
+ }
12
+ /**
13
+ * Perform one loopback HTTP request. Rejects on transport failure (nothing
14
+ * listening, socket closed, timeout); resolves with the status for any
15
+ * response the server actually sent, including 4xx and 5xx.
16
+ */
17
+ export declare function localRequest(url: string, opts: LocalRequestOptions): Promise<LocalResponse>;
18
+ /** localRequest + JSON.parse, with the status preserved for the caller. */
19
+ export declare function localJson<T = unknown>(url: string, opts: LocalRequestOptions): Promise<{
20
+ status: number;
21
+ ok: boolean;
22
+ body: T;
23
+ }>;
24
+ //# sourceMappingURL=localHttp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localHttp.d.ts","sourceRoot":"","sources":["../../src/runtime/localHttp.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAoD3F;AAED,2EAA2E;AAC3E,wBAAsB,SAAS,CAAC,CAAC,GAAG,OAAO,EACzC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,CAWnD"}