@moxxy/core 0.3.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 (332) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -0
  3. package/dist/events/factory.d.ts +6 -0
  4. package/dist/events/factory.d.ts.map +1 -0
  5. package/dist/events/factory.js +14 -0
  6. package/dist/events/factory.js.map +1 -0
  7. package/dist/events/log.d.ts +92 -0
  8. package/dist/events/log.d.ts.map +1 -0
  9. package/dist/events/log.js +244 -0
  10. package/dist/events/log.js.map +1 -0
  11. package/dist/index.d.ts +40 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +41 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/logger.d.ts +16 -0
  16. package/dist/logger.d.ts.map +1 -0
  17. package/dist/logger.js +27 -0
  18. package/dist/logger.js.map +1 -0
  19. package/dist/permissions/engine.d.ts +94 -0
  20. package/dist/permissions/engine.d.ts.map +1 -0
  21. package/dist/permissions/engine.js +203 -0
  22. package/dist/permissions/engine.js.map +1 -0
  23. package/dist/permissions/resolvers.d.ts +8 -0
  24. package/dist/permissions/resolvers.d.ts.map +1 -0
  25. package/dist/permissions/resolvers.js +8 -0
  26. package/dist/permissions/resolvers.js.map +1 -0
  27. package/dist/plugins/discovery.d.ts +9 -0
  28. package/dist/plugins/discovery.d.ts.map +1 -0
  29. package/dist/plugins/discovery.js +112 -0
  30. package/dist/plugins/discovery.js.map +1 -0
  31. package/dist/plugins/host-options.d.ts +72 -0
  32. package/dist/plugins/host-options.d.ts.map +1 -0
  33. package/dist/plugins/host-options.js +2 -0
  34. package/dist/plugins/host-options.js.map +1 -0
  35. package/dist/plugins/host.d.ts +53 -0
  36. package/dist/plugins/host.d.ts.map +1 -0
  37. package/dist/plugins/host.js +269 -0
  38. package/dist/plugins/host.js.map +1 -0
  39. package/dist/plugins/lifecycle.d.ts +31 -0
  40. package/dist/plugins/lifecycle.d.ts.map +1 -0
  41. package/dist/plugins/lifecycle.js +100 -0
  42. package/dist/plugins/lifecycle.js.map +1 -0
  43. package/dist/plugins/loader.d.ts +7 -0
  44. package/dist/plugins/loader.d.ts.map +1 -0
  45. package/dist/plugins/loader.js +68 -0
  46. package/dist/plugins/loader.js.map +1 -0
  47. package/dist/plugins/package-requirements.d.ts +16 -0
  48. package/dist/plugins/package-requirements.d.ts.map +1 -0
  49. package/dist/plugins/package-requirements.js +52 -0
  50. package/dist/plugins/package-requirements.js.map +1 -0
  51. package/dist/plugins/registry-kinds.d.ts +58 -0
  52. package/dist/plugins/registry-kinds.d.ts.map +1 -0
  53. package/dist/plugins/registry-kinds.js +139 -0
  54. package/dist/plugins/registry-kinds.js.map +1 -0
  55. package/dist/plugins/toposort.d.ts +24 -0
  56. package/dist/plugins/toposort.d.ts.map +1 -0
  57. package/dist/plugins/toposort.js +67 -0
  58. package/dist/plugins/toposort.js.map +1 -0
  59. package/dist/preferences.d.ts +40 -0
  60. package/dist/preferences.d.ts.map +1 -0
  61. package/dist/preferences.js +58 -0
  62. package/dist/preferences.js.map +1 -0
  63. package/dist/registries/active-backend-registry.d.ts +65 -0
  64. package/dist/registries/active-backend-registry.d.ts.map +1 -0
  65. package/dist/registries/active-backend-registry.js +108 -0
  66. package/dist/registries/active-backend-registry.js.map +1 -0
  67. package/dist/registries/active-def-registry.d.ts +59 -0
  68. package/dist/registries/active-def-registry.d.ts.map +1 -0
  69. package/dist/registries/active-def-registry.js +63 -0
  70. package/dist/registries/active-def-registry.js.map +1 -0
  71. package/dist/registries/agents.d.ts +16 -0
  72. package/dist/registries/agents.d.ts.map +1 -0
  73. package/dist/registries/agents.js +17 -0
  74. package/dist/registries/agents.js.map +1 -0
  75. package/dist/registries/cache-strategies.d.ts +12 -0
  76. package/dist/registries/cache-strategies.d.ts.map +1 -0
  77. package/dist/registries/cache-strategies.js +13 -0
  78. package/dist/registries/cache-strategies.js.map +1 -0
  79. package/dist/registries/channels.d.ts +16 -0
  80. package/dist/registries/channels.d.ts.map +1 -0
  81. package/dist/registries/channels.js +35 -0
  82. package/dist/registries/channels.js.map +1 -0
  83. package/dist/registries/commands.d.ts +29 -0
  84. package/dist/registries/commands.d.ts.map +1 -0
  85. package/dist/registries/commands.js +72 -0
  86. package/dist/registries/commands.js.map +1 -0
  87. package/dist/registries/compactors.d.ts +12 -0
  88. package/dist/registries/compactors.d.ts.map +1 -0
  89. package/dist/registries/compactors.js +13 -0
  90. package/dist/registries/compactors.js.map +1 -0
  91. package/dist/registries/def-map-registry.d.ts +33 -0
  92. package/dist/registries/def-map-registry.d.ts.map +1 -0
  93. package/dist/registries/def-map-registry.js +36 -0
  94. package/dist/registries/def-map-registry.js.map +1 -0
  95. package/dist/registries/embedders.d.ts +16 -0
  96. package/dist/registries/embedders.d.ts.map +1 -0
  97. package/dist/registries/embedders.js +17 -0
  98. package/dist/registries/embedders.js.map +1 -0
  99. package/dist/registries/isolators.d.ts +21 -0
  100. package/dist/registries/isolators.d.ts.map +1 -0
  101. package/dist/registries/isolators.js +32 -0
  102. package/dist/registries/isolators.js.map +1 -0
  103. package/dist/registries/modes.d.ts +28 -0
  104. package/dist/registries/modes.d.ts.map +1 -0
  105. package/dist/registries/modes.js +81 -0
  106. package/dist/registries/modes.js.map +1 -0
  107. package/dist/registries/providers.d.ts +44 -0
  108. package/dist/registries/providers.d.ts.map +1 -0
  109. package/dist/registries/providers.js +95 -0
  110. package/dist/registries/providers.js.map +1 -0
  111. package/dist/registries/skills.d.ts +24 -0
  112. package/dist/registries/skills.d.ts.map +1 -0
  113. package/dist/registries/skills.js +81 -0
  114. package/dist/registries/skills.js.map +1 -0
  115. package/dist/registries/surfaces.d.ts +13 -0
  116. package/dist/registries/surfaces.d.ts.map +1 -0
  117. package/dist/registries/surfaces.js +14 -0
  118. package/dist/registries/surfaces.js.map +1 -0
  119. package/dist/registries/synthesizers.d.ts +26 -0
  120. package/dist/registries/synthesizers.d.ts.map +1 -0
  121. package/dist/registries/synthesizers.js +34 -0
  122. package/dist/registries/synthesizers.js.map +1 -0
  123. package/dist/registries/tools.d.ts +49 -0
  124. package/dist/registries/tools.d.ts.map +1 -0
  125. package/dist/registries/tools.js +98 -0
  126. package/dist/registries/tools.js.map +1 -0
  127. package/dist/registries/transcribers.d.ts +17 -0
  128. package/dist/registries/transcribers.d.ts.map +1 -0
  129. package/dist/registries/transcribers.js +18 -0
  130. package/dist/registries/transcribers.js.map +1 -0
  131. package/dist/registries/tunnel-providers.d.ts +12 -0
  132. package/dist/registries/tunnel-providers.d.ts.map +1 -0
  133. package/dist/registries/tunnel-providers.js +13 -0
  134. package/dist/registries/tunnel-providers.js.map +1 -0
  135. package/dist/registries/view-renderers.d.ts +13 -0
  136. package/dist/registries/view-renderers.d.ts.map +1 -0
  137. package/dist/registries/view-renderers.js +14 -0
  138. package/dist/registries/view-renderers.js.map +1 -0
  139. package/dist/registries/workflow-executors.d.ts +13 -0
  140. package/dist/registries/workflow-executors.d.ts.map +1 -0
  141. package/dist/registries/workflow-executors.js +14 -0
  142. package/dist/registries/workflow-executors.js.map +1 -0
  143. package/dist/requirements.d.ts +59 -0
  144. package/dist/requirements.d.ts.map +1 -0
  145. package/dist/requirements.js +149 -0
  146. package/dist/requirements.js.map +1 -0
  147. package/dist/run-turn.d.ts +6 -0
  148. package/dist/run-turn.d.ts.map +1 -0
  149. package/dist/run-turn.js +141 -0
  150. package/dist/run-turn.js.map +1 -0
  151. package/dist/session-runtime.d.ts +67 -0
  152. package/dist/session-runtime.d.ts.map +1 -0
  153. package/dist/session-runtime.js +2 -0
  154. package/dist/session-runtime.js.map +1 -0
  155. package/dist/session.d.ts +203 -0
  156. package/dist/session.d.ts.map +1 -0
  157. package/dist/session.js +399 -0
  158. package/dist/session.js.map +1 -0
  159. package/dist/sessions/persistence.d.ts +184 -0
  160. package/dist/sessions/persistence.d.ts.map +1 -0
  161. package/dist/sessions/persistence.js +442 -0
  162. package/dist/sessions/persistence.js.map +1 -0
  163. package/dist/setup-agent.d.ts +91 -0
  164. package/dist/setup-agent.d.ts.map +1 -0
  165. package/dist/setup-agent.js +138 -0
  166. package/dist/setup-agent.js.map +1 -0
  167. package/dist/skills/index.d.ts +4 -0
  168. package/dist/skills/index.d.ts.map +1 -0
  169. package/dist/skills/index.js +4 -0
  170. package/dist/skills/index.js.map +1 -0
  171. package/dist/skills/loader.d.ts +16 -0
  172. package/dist/skills/loader.d.ts.map +1 -0
  173. package/dist/skills/loader.js +99 -0
  174. package/dist/skills/loader.js.map +1 -0
  175. package/dist/skills/parse.d.ts +5 -0
  176. package/dist/skills/parse.d.ts.map +1 -0
  177. package/dist/skills/parse.js +8 -0
  178. package/dist/skills/parse.js.map +1 -0
  179. package/dist/skills/synthesize-draft.d.ts +8 -0
  180. package/dist/skills/synthesize-draft.d.ts.map +1 -0
  181. package/dist/skills/synthesize-draft.js +32 -0
  182. package/dist/skills/synthesize-draft.js.map +1 -0
  183. package/dist/skills/synthesize.d.ts +33 -0
  184. package/dist/skills/synthesize.d.ts.map +1 -0
  185. package/dist/skills/synthesize.js +241 -0
  186. package/dist/skills/synthesize.js.map +1 -0
  187. package/dist/subagents/events.d.ts +20 -0
  188. package/dist/subagents/events.d.ts.map +1 -0
  189. package/dist/subagents/events.js +146 -0
  190. package/dist/subagents/events.js.map +1 -0
  191. package/dist/subagents/registry.d.ts +40 -0
  192. package/dist/subagents/registry.d.ts.map +1 -0
  193. package/dist/subagents/registry.js +42 -0
  194. package/dist/subagents/registry.js.map +1 -0
  195. package/dist/subagents/run-child.d.ts +43 -0
  196. package/dist/subagents/run-child.d.ts.map +1 -0
  197. package/dist/subagents/run-child.js +276 -0
  198. package/dist/subagents/run-child.js.map +1 -0
  199. package/dist/subagents/spawn.d.ts +8 -0
  200. package/dist/subagents/spawn.d.ts.map +1 -0
  201. package/dist/subagents/spawn.js +8 -0
  202. package/dist/subagents/spawn.js.map +1 -0
  203. package/dist/subagents/tools.d.ts +4 -0
  204. package/dist/subagents/tools.d.ts.map +1 -0
  205. package/dist/subagents/tools.js +13 -0
  206. package/dist/subagents/tools.js.map +1 -0
  207. package/dist/subagents.d.ts +3 -0
  208. package/dist/subagents.d.ts.map +1 -0
  209. package/dist/subagents.js +3 -0
  210. package/dist/subagents.js.map +1 -0
  211. package/dist/surfaces/host.d.ts +53 -0
  212. package/dist/surfaces/host.d.ts.map +1 -0
  213. package/dist/surfaces/host.js +177 -0
  214. package/dist/surfaces/host.js.map +1 -0
  215. package/dist/tunnel/localhost.d.ts +7 -0
  216. package/dist/tunnel/localhost.d.ts.map +1 -0
  217. package/dist/tunnel/localhost.js +21 -0
  218. package/dist/tunnel/localhost.js.map +1 -0
  219. package/dist/usage-stats.d.ts +42 -0
  220. package/dist/usage-stats.d.ts.map +1 -0
  221. package/dist/usage-stats.js +83 -0
  222. package/dist/usage-stats.js.map +1 -0
  223. package/dist/view/default-renderer.d.ts +7 -0
  224. package/dist/view/default-renderer.d.ts.map +1 -0
  225. package/dist/view/default-renderer.js +14 -0
  226. package/dist/view/default-renderer.js.map +1 -0
  227. package/dist/view/parse.d.ts +7 -0
  228. package/dist/view/parse.d.ts.map +1 -0
  229. package/dist/view/parse.js +479 -0
  230. package/dist/view/parse.js.map +1 -0
  231. package/package.json +61 -0
  232. package/src/events/factory.ts +27 -0
  233. package/src/events/log.test.ts +470 -0
  234. package/src/events/log.ts +256 -0
  235. package/src/index.ts +102 -0
  236. package/src/logger.ts +46 -0
  237. package/src/permissions/engine.test.ts +206 -0
  238. package/src/permissions/engine.ts +247 -0
  239. package/src/permissions/resolvers.test.ts +40 -0
  240. package/src/permissions/resolvers.ts +17 -0
  241. package/src/plugins/discovery.test.ts +115 -0
  242. package/src/plugins/discovery.ts +124 -0
  243. package/src/plugins/host-options.ts +73 -0
  244. package/src/plugins/host-view-tunnel.test.ts +86 -0
  245. package/src/plugins/host.test.ts +434 -0
  246. package/src/plugins/host.ts +327 -0
  247. package/src/plugins/lifecycle.test.ts +187 -0
  248. package/src/plugins/lifecycle.ts +136 -0
  249. package/src/plugins/loader.ts +79 -0
  250. package/src/plugins/package-requirements.ts +50 -0
  251. package/src/plugins/registry-kinds.test.ts +162 -0
  252. package/src/plugins/registry-kinds.ts +210 -0
  253. package/src/plugins/toposort.test.ts +66 -0
  254. package/src/plugins/toposort.ts +69 -0
  255. package/src/preferences.test.ts +105 -0
  256. package/src/preferences.ts +84 -0
  257. package/src/registries/active-backend-registry.ts +142 -0
  258. package/src/registries/active-def-registry.test.ts +103 -0
  259. package/src/registries/active-def-registry.ts +97 -0
  260. package/src/registries/agents.ts +18 -0
  261. package/src/registries/cache-strategies.ts +14 -0
  262. package/src/registries/channels.ts +42 -0
  263. package/src/registries/commands.test.ts +71 -0
  264. package/src/registries/commands.ts +78 -0
  265. package/src/registries/compactors.ts +14 -0
  266. package/src/registries/def-map-registry.test.ts +67 -0
  267. package/src/registries/def-map-registry.ts +59 -0
  268. package/src/registries/embedders.test.ts +54 -0
  269. package/src/registries/embedders.ts +18 -0
  270. package/src/registries/isolators.test.ts +43 -0
  271. package/src/registries/isolators.ts +38 -0
  272. package/src/registries/modes.test.ts +66 -0
  273. package/src/registries/modes.ts +80 -0
  274. package/src/registries/providers.test.ts +50 -0
  275. package/src/registries/providers.ts +97 -0
  276. package/src/registries/semantics.test.ts +117 -0
  277. package/src/registries/skills.ts +87 -0
  278. package/src/registries/surfaces.ts +18 -0
  279. package/src/registries/synthesizers.test.ts +63 -0
  280. package/src/registries/synthesizers.ts +36 -0
  281. package/src/registries/tools.test.ts +142 -0
  282. package/src/registries/tools.ts +145 -0
  283. package/src/registries/transcribers.test.ts +70 -0
  284. package/src/registries/transcribers.ts +19 -0
  285. package/src/registries/tunnel-providers.test.ts +30 -0
  286. package/src/registries/tunnel-providers.ts +14 -0
  287. package/src/registries/view-renderers.test.ts +68 -0
  288. package/src/registries/view-renderers.ts +15 -0
  289. package/src/registries/workflow-executors.test.ts +53 -0
  290. package/src/registries/workflow-executors.ts +15 -0
  291. package/src/requirements.targetinfo.test.ts +70 -0
  292. package/src/requirements.test.ts +111 -0
  293. package/src/requirements.ts +262 -0
  294. package/src/run-turn.test.ts +178 -0
  295. package/src/run-turn.ts +156 -0
  296. package/src/session-runtime.ts +75 -0
  297. package/src/session.test.ts +216 -0
  298. package/src/session.ts +491 -0
  299. package/src/sessions/persistence.flush.test.ts +100 -0
  300. package/src/sessions/persistence.ready.test.ts +91 -0
  301. package/src/sessions/persistence.test.ts +274 -0
  302. package/src/sessions/persistence.ts +498 -0
  303. package/src/setup-agent.test.ts +72 -0
  304. package/src/setup-agent.ts +189 -0
  305. package/src/skills/index.ts +14 -0
  306. package/src/skills/loader.test.ts +102 -0
  307. package/src/skills/loader.ts +114 -0
  308. package/src/skills/parse.test.ts +59 -0
  309. package/src/skills/parse.ts +11 -0
  310. package/src/skills/synthesize-draft.test.ts +79 -0
  311. package/src/skills/synthesize-draft.ts +46 -0
  312. package/src/skills/synthesize.test.ts +170 -0
  313. package/src/skills/synthesize.ts +304 -0
  314. package/src/subagents/events.test.ts +56 -0
  315. package/src/subagents/events.ts +194 -0
  316. package/src/subagents/registry.ts +62 -0
  317. package/src/subagents/run-child.test.ts +185 -0
  318. package/src/subagents/run-child.ts +425 -0
  319. package/src/subagents/spawn.ts +12 -0
  320. package/src/subagents/tools.ts +19 -0
  321. package/src/subagents.ts +2 -0
  322. package/src/surfaces/host.test.ts +330 -0
  323. package/src/surfaces/host.ts +192 -0
  324. package/src/tunnel/localhost.test.ts +22 -0
  325. package/src/tunnel/localhost.ts +21 -0
  326. package/src/usage-stats.test.ts +77 -0
  327. package/src/usage-stats.ts +119 -0
  328. package/src/view/default-renderer.test.ts +29 -0
  329. package/src/view/default-renderer.ts +14 -0
  330. package/src/view/parse-extended.test.ts +255 -0
  331. package/src/view/parse.test.ts +232 -0
  332. package/src/view/parse.ts +520 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modes.d.ts","sourceRoot":"","sources":["../../src/registries/modes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAE3D,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IAEzD;;8EAE0E;IAC1E,cAAc,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAK1C;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAQ7B,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAe5B;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK9B,IAAI,IAAI,aAAa,CAAC,OAAO,CAAC;IAI9B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAU7B,SAAS,IAAI,OAAO;IAOpB,OAAO,CAAC,QAAQ;CAKjB"}
@@ -0,0 +1,81 @@
1
+ import { migrateModeName } from '@moxxy/sdk';
2
+ export class ModeRegistry {
3
+ modes = new Map();
4
+ active = null;
5
+ changeListeners = new Set();
6
+ /** Observe active-mode changes — used by the runner to broadcast
7
+ * InfoChanged so remote clients track a mode switch (whether it came from
8
+ * a `setMode` RPC or a mode handing off to another mode mid-session). */
9
+ onActiveChange(fn) {
10
+ this.changeListeners.add(fn);
11
+ return () => this.changeListeners.delete(fn);
12
+ }
13
+ /**
14
+ * Register a mode. Throws on duplicate — use `replace()` for
15
+ * overwrite. Auto-activates on first registration (modes need a default
16
+ * for any session to work).
17
+ */
18
+ register(mode) {
19
+ if (this.modes.has(mode.name)) {
20
+ throw new Error(`Mode already registered: ${mode.name}`);
21
+ }
22
+ this.modes.set(mode.name, mode);
23
+ if (!this.active)
24
+ this.activate(mode);
25
+ }
26
+ replace(mode) {
27
+ this.modes.set(mode.name, mode);
28
+ if (!this.active) {
29
+ this.activate(mode);
30
+ }
31
+ else if (this.active === mode.name) {
32
+ // The active mode's def was swapped in place (e.g. a hot-reloaded mode
33
+ // plugin). `getActive()` already returns the new def, but observers of
34
+ // `onActiveChange` (the runner broadcasting InfoChanged) must be told the
35
+ // active behaviour changed under them, or remote clients keep driving the
36
+ // stale def. `activate()` would early-return on the name match, so notify
37
+ // directly.
38
+ for (const fn of this.changeListeners)
39
+ fn();
40
+ }
41
+ }
42
+ /**
43
+ * Remove a mode. If it was active, the active slot is cleared —
44
+ * callers must `setActive()` explicitly rather than silently picking
45
+ * some arbitrary "next" mode.
46
+ */
47
+ unregister(name) {
48
+ this.modes.delete(name);
49
+ if (this.active === name)
50
+ this.active = null;
51
+ }
52
+ list() {
53
+ return [...this.modes.values()];
54
+ }
55
+ setActive(name) {
56
+ // Prefer the literal name; only when it isn't registered fall back to the
57
+ // legacy-name map (e.g. a persisted "tool-use" → "default"). This never
58
+ // overrides a validly-registered name and keeps an old config / preference
59
+ // / setMode RPC value from crashing a session with "Mode not registered".
60
+ const mode = this.modes.get(name) ?? this.modes.get(migrateModeName(name));
61
+ if (!mode)
62
+ throw new Error(`Mode not registered: ${name}`);
63
+ this.activate(mode);
64
+ }
65
+ getActive() {
66
+ if (!this.active)
67
+ throw new Error('No active mode registered.');
68
+ const mode = this.modes.get(this.active);
69
+ if (!mode)
70
+ throw new Error(`Active mode missing: ${this.active}`);
71
+ return mode;
72
+ }
73
+ activate(mode) {
74
+ if (this.active === mode.name)
75
+ return;
76
+ this.active = mode.name;
77
+ for (const fn of this.changeListeners)
78
+ fn();
79
+ }
80
+ }
81
+ //# sourceMappingURL=modes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modes.js","sourceRoot":"","sources":["../../src/registries/modes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { LLMProvider, ProviderDef } from '@moxxy/sdk';
2
+ export declare class ProviderRegistry {
3
+ private readonly defs;
4
+ private readonly instances;
5
+ private active;
6
+ /**
7
+ * Names the user disabled. Kept name-based (not def-based) so it can be
8
+ * seeded from preferences BEFORE the plugins register their defs — boot
9
+ * order doesn't matter. A disabled provider stays registered/listable but
10
+ * can't be activated.
11
+ */
12
+ private readonly disabled;
13
+ /**
14
+ * Register a provider def. Throws on duplicate — use `replace()` for
15
+ * explicit overwrite. Matches the semantics of `tools` and `channels`.
16
+ */
17
+ register(def: ProviderDef, instance?: LLMProvider): void;
18
+ /**
19
+ * Overwrite an existing def (also drops the cached instance so the new
20
+ * createClient gets called).
21
+ *
22
+ * Invariant: replacing the ACTIVE provider's def leaves `active` pointing at
23
+ * it but with no cached instance, so `getActive()` throws until the caller
24
+ * rebuilds the instance. Callers replacing the active provider MUST follow
25
+ * with `setActive(name, config)` (replace can't rebuild itself — it has no
26
+ * config). The sole production caller does exactly that.
27
+ */
28
+ replace(def: ProviderDef, instance?: LLMProvider): void;
29
+ unregister(name: string): void;
30
+ list(): ReadonlyArray<ProviderDef>;
31
+ /**
32
+ * Enable/disable a provider by name. Disabling the ACTIVE provider is
33
+ * refused — switch first, then disable — so a session never ends up with an
34
+ * active-but-disabled provider. Unknown names are accepted (the set seeds
35
+ * from preferences before plugins register), except when disabling via a
36
+ * live toggle is meaningless because the provider is active.
37
+ */
38
+ setEnabled(name: string, enabled: boolean): void;
39
+ isEnabled(name: string): boolean;
40
+ setActive(name: string, config?: Record<string, unknown>): LLMProvider;
41
+ getActive(): LLMProvider;
42
+ getActiveName(): string | null;
43
+ }
44
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/registries/providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkC;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAC5D,OAAO,CAAC,MAAM,CAAuB;IACrC;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAE9C;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI;IAQxD;;;;;;;;;OASG;IACH,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI;IAMvD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM9B,IAAI,IAAI,aAAa,CAAC,WAAW,CAAC;IAIlC;;;;;;OAMG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAQhD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAetE,SAAS,IAAI,WAAW;IAOxB,aAAa,IAAI,MAAM,GAAG,IAAI;CAG/B"}
@@ -0,0 +1,95 @@
1
+ export class ProviderRegistry {
2
+ defs = new Map();
3
+ instances = new Map();
4
+ active = null;
5
+ /**
6
+ * Names the user disabled. Kept name-based (not def-based) so it can be
7
+ * seeded from preferences BEFORE the plugins register their defs — boot
8
+ * order doesn't matter. A disabled provider stays registered/listable but
9
+ * can't be activated.
10
+ */
11
+ disabled = new Set();
12
+ /**
13
+ * Register a provider def. Throws on duplicate — use `replace()` for
14
+ * explicit overwrite. Matches the semantics of `tools` and `channels`.
15
+ */
16
+ register(def, instance) {
17
+ if (this.defs.has(def.name)) {
18
+ throw new Error(`Provider already registered: ${def.name}`);
19
+ }
20
+ this.defs.set(def.name, def);
21
+ if (instance)
22
+ this.instances.set(def.name, instance);
23
+ }
24
+ /**
25
+ * Overwrite an existing def (also drops the cached instance so the new
26
+ * createClient gets called).
27
+ *
28
+ * Invariant: replacing the ACTIVE provider's def leaves `active` pointing at
29
+ * it but with no cached instance, so `getActive()` throws until the caller
30
+ * rebuilds the instance. Callers replacing the active provider MUST follow
31
+ * with `setActive(name, config)` (replace can't rebuild itself — it has no
32
+ * config). The sole production caller does exactly that.
33
+ */
34
+ replace(def, instance) {
35
+ this.defs.set(def.name, def);
36
+ this.instances.delete(def.name);
37
+ if (instance)
38
+ this.instances.set(def.name, instance);
39
+ }
40
+ unregister(name) {
41
+ this.defs.delete(name);
42
+ this.instances.delete(name);
43
+ if (this.active === name)
44
+ this.active = null;
45
+ }
46
+ list() {
47
+ return [...this.defs.values()];
48
+ }
49
+ /**
50
+ * Enable/disable a provider by name. Disabling the ACTIVE provider is
51
+ * refused — switch first, then disable — so a session never ends up with an
52
+ * active-but-disabled provider. Unknown names are accepted (the set seeds
53
+ * from preferences before plugins register), except when disabling via a
54
+ * live toggle is meaningless because the provider is active.
55
+ */
56
+ setEnabled(name, enabled) {
57
+ if (!enabled && this.active === name) {
58
+ throw new Error(`Cannot disable the active provider "${name}" — switch providers first.`);
59
+ }
60
+ if (enabled)
61
+ this.disabled.delete(name);
62
+ else
63
+ this.disabled.add(name);
64
+ }
65
+ isEnabled(name) {
66
+ return !this.disabled.has(name);
67
+ }
68
+ setActive(name, config) {
69
+ const def = this.defs.get(name);
70
+ if (!def)
71
+ throw new Error(`Provider not registered: ${name}`);
72
+ if (this.disabled.has(name)) {
73
+ throw new Error(`Provider "${name}" is disabled — enable it first.`);
74
+ }
75
+ let instance = this.instances.get(name);
76
+ if (!instance) {
77
+ instance = def.createClient(config ?? {});
78
+ this.instances.set(name, instance);
79
+ }
80
+ this.active = name;
81
+ return instance;
82
+ }
83
+ getActive() {
84
+ if (!this.active)
85
+ throw new Error('No active provider. Call setActive(name) first.');
86
+ const inst = this.instances.get(this.active);
87
+ if (!inst)
88
+ throw new Error(`Active provider has no instance: ${this.active}`);
89
+ return inst;
90
+ }
91
+ getActiveName() {
92
+ return this.active;
93
+ }
94
+ }
95
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/registries/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Skill, SkillRegistry } from '@moxxy/sdk';
2
+ export declare class SkillRegistryImpl implements SkillRegistry {
3
+ private readonly byId;
4
+ private readonly byNameIdx;
5
+ list(): ReadonlyArray<Skill>;
6
+ get(id: string): Skill | undefined;
7
+ byName(name: string): Skill | undefined;
8
+ filterByTriggers(prompt: string): ReadonlyArray<Skill>;
9
+ /**
10
+ * Register a skill. Throws on duplicate id — use `replace()` for
11
+ * overwrite (or `replaceAll()` for atomic bulk swap).
12
+ */
13
+ register(skill: Skill): void;
14
+ replace(skill: Skill): void;
15
+ unregister(id: string): void;
16
+ clear(): void;
17
+ /**
18
+ * Replace the registry's entire contents atomically (no observable empty
19
+ * window). Used by `reload_skills` so a concurrent lookup never sees
20
+ * zero skills while a rescan is in flight.
21
+ */
22
+ replaceAll(skills: ReadonlyArray<Skill>): void;
23
+ }
24
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/registries/skills.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEvD,qBAAa,iBAAkB,YAAW,aAAa;IACrD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;IAEtD,IAAI,IAAI,aAAa,CAAC,KAAK,CAAC;IAI5B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAIlC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAIvC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC;IAUtD;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAQ5B,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAc3B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAO5B,KAAK,IAAI,IAAI;IAKb;;;;OAIG;IACH,UAAU,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,IAAI;CAe/C"}
@@ -0,0 +1,81 @@
1
+ export class SkillRegistryImpl {
2
+ byId = new Map();
3
+ byNameIdx = new Map();
4
+ list() {
5
+ return [...this.byId.values()];
6
+ }
7
+ get(id) {
8
+ return this.byId.get(id);
9
+ }
10
+ byName(name) {
11
+ return this.byNameIdx.get(name);
12
+ }
13
+ filterByTriggers(prompt) {
14
+ const lower = prompt.toLowerCase();
15
+ const matches = [];
16
+ for (const skill of this.byId.values()) {
17
+ const triggers = skill.frontmatter.triggers ?? [];
18
+ if (triggers.some((t) => lower.includes(t.toLowerCase())))
19
+ matches.push(skill);
20
+ }
21
+ return matches;
22
+ }
23
+ /**
24
+ * Register a skill. Throws on duplicate id — use `replace()` for
25
+ * overwrite (or `replaceAll()` for atomic bulk swap).
26
+ */
27
+ register(skill) {
28
+ if (this.byId.has(skill.id)) {
29
+ throw new Error(`Skill already registered: ${skill.id}`);
30
+ }
31
+ this.byId.set(skill.id, skill);
32
+ this.byNameIdx.set(skill.frontmatter.name, skill);
33
+ }
34
+ replace(skill) {
35
+ // Drop the prior definition's name from the index when it changed —
36
+ // otherwise an edited skill re-registered under the same id but a new
37
+ // frontmatter.name leaves the OLD name pointing at the stale skill
38
+ // forever (two live names for one id). Mirrors CommandRegistry.replace's
39
+ // alias cleanup.
40
+ const prior = this.byId.get(skill.id);
41
+ if (prior && prior.frontmatter.name !== skill.frontmatter.name) {
42
+ this.byNameIdx.delete(prior.frontmatter.name);
43
+ }
44
+ this.byId.set(skill.id, skill);
45
+ this.byNameIdx.set(skill.frontmatter.name, skill);
46
+ }
47
+ unregister(id) {
48
+ const skill = this.byId.get(id);
49
+ if (!skill)
50
+ return;
51
+ this.byId.delete(id);
52
+ this.byNameIdx.delete(skill.frontmatter.name);
53
+ }
54
+ clear() {
55
+ this.byId.clear();
56
+ this.byNameIdx.clear();
57
+ }
58
+ /**
59
+ * Replace the registry's entire contents atomically (no observable empty
60
+ * window). Used by `reload_skills` so a concurrent lookup never sees
61
+ * zero skills while a rescan is in flight.
62
+ */
63
+ replaceAll(skills) {
64
+ const nextById = new Map();
65
+ const nextByName = new Map();
66
+ for (const s of skills) {
67
+ nextById.set(s.id, s);
68
+ nextByName.set(s.frontmatter.name, s);
69
+ }
70
+ // Synchronous swap: callers between these lines still see the OLD
71
+ // registry (Maps aren't replaced, only repopulated). Clear+set is the
72
+ // shortest synchronous window we can achieve in JS for Map fields.
73
+ this.byId.clear();
74
+ this.byNameIdx.clear();
75
+ for (const [k, v] of nextById)
76
+ this.byId.set(k, v);
77
+ for (const [k, v] of nextByName)
78
+ this.byNameIdx.set(k, v);
79
+ }
80
+ }
81
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/registries/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { SurfaceDef, SurfaceKind, SurfaceRegistry } from '@moxxy/sdk';
2
+ import { DefMapRegistry } from './def-map-registry.js';
3
+ /**
4
+ * Registry of surface defs contributed by plugins (terminal, browser, …),
5
+ * keyed by `kind`. A flat name→def map ({@link DefMapRegistry}) with
6
+ * register/unregister so the PluginHost can add and remove a plugin's
7
+ * surfaces on load/unload. The live, open instances are managed separately by
8
+ * the {@link SurfaceHostImpl}; this registry only knows the available kinds.
9
+ */
10
+ export declare class SurfaceRegistryImpl extends DefMapRegistry<SurfaceDef, SurfaceKind> implements SurfaceRegistry {
11
+ constructor();
12
+ }
13
+ //# sourceMappingURL=surfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surfaces.d.ts","sourceRoot":"","sources":["../../src/registries/surfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;;;;GAMG;AACH,qBAAa,mBACX,SAAQ,cAAc,CAAC,UAAU,EAAE,WAAW,CAC9C,YAAW,eAAe;;CAK3B"}
@@ -0,0 +1,14 @@
1
+ import { DefMapRegistry } from './def-map-registry.js';
2
+ /**
3
+ * Registry of surface defs contributed by plugins (terminal, browser, …),
4
+ * keyed by `kind`. A flat name→def map ({@link DefMapRegistry}) with
5
+ * register/unregister so the PluginHost can add and remove a plugin's
6
+ * surfaces on load/unload. The live, open instances are managed separately by
7
+ * the {@link SurfaceHostImpl}; this registry only knows the available kinds.
8
+ */
9
+ export class SurfaceRegistryImpl extends DefMapRegistry {
10
+ constructor() {
11
+ super({ noun: 'Surface', keyOf: (def) => def.kind });
12
+ }
13
+ }
14
+ //# sourceMappingURL=surfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surfaces.js","sourceRoot":"","sources":["../../src/registries/surfaces.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,OAAO,mBACX,SAAQ,cAAuC;IAG/C;QACE,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ import type { Synthesizer, SynthesizerDef } from '@moxxy/sdk';
2
+ import { ActiveBackendRegistry } from './active-backend-registry.js';
3
+ /**
4
+ * Registry of text-to-speech backends:
5
+ * - plugins call `register(def)` at load time
6
+ * - read-aloud surfaces read `tryGetActive()` to turn text into audio
7
+ * - the agent switches/deactivates via the `set_voice` tool
8
+ *
9
+ * Unlike transcribers/embedders (where the host picks a backend explicitly),
10
+ * TTS has a sensible default: the first synthesizer registered auto-becomes
11
+ * active (`autoAdoptFirst`), so a user who asks the agent to author an
12
+ * ElevenLabs plugin gets read-aloud through it immediately — no extra activate
13
+ * step. Because `active` can thus be set without a built instance, the active
14
+ * synthesizer is (re)built lazily on read (`buildOnRead`). `getActive()` throws
15
+ * when none is active so the desktop falls back to the OS `speechSynthesis`.
16
+ *
17
+ * `secretResolver` is the vault-backed `getSecret` (the same one wired into
18
+ * tool contexts), handed to each synthesizer's `create(ctx)` so a TTS plugin
19
+ * can read its API key without touching `process.env`.
20
+ */
21
+ export declare class SynthesizerRegistry extends ActiveBackendRegistry<SynthesizerDef, Synthesizer> {
22
+ constructor(opts?: {
23
+ secretResolver?: (name: string) => Promise<string | null>;
24
+ });
25
+ }
26
+ //# sourceMappingURL=synthesizers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synthesizers.d.ts","sourceRoot":"","sources":["../../src/registries/synthesizers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,mBAAoB,SAAQ,qBAAqB,CAAC,cAAc,EAAE,WAAW,CAAC;gBAC7E,IAAI,GAAE;QAAE,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;KAAO;CAarF"}
@@ -0,0 +1,34 @@
1
+ import { ActiveBackendRegistry } from './active-backend-registry.js';
2
+ /**
3
+ * Registry of text-to-speech backends:
4
+ * - plugins call `register(def)` at load time
5
+ * - read-aloud surfaces read `tryGetActive()` to turn text into audio
6
+ * - the agent switches/deactivates via the `set_voice` tool
7
+ *
8
+ * Unlike transcribers/embedders (where the host picks a backend explicitly),
9
+ * TTS has a sensible default: the first synthesizer registered auto-becomes
10
+ * active (`autoAdoptFirst`), so a user who asks the agent to author an
11
+ * ElevenLabs plugin gets read-aloud through it immediately — no extra activate
12
+ * step. Because `active` can thus be set without a built instance, the active
13
+ * synthesizer is (re)built lazily on read (`buildOnRead`). `getActive()` throws
14
+ * when none is active so the desktop falls back to the OS `speechSynthesis`.
15
+ *
16
+ * `secretResolver` is the vault-backed `getSecret` (the same one wired into
17
+ * tool contexts), handed to each synthesizer's `create(ctx)` so a TTS plugin
18
+ * can read its API key without touching `process.env`.
19
+ */
20
+ export class SynthesizerRegistry extends ActiveBackendRegistry {
21
+ constructor(opts = {}) {
22
+ const { secretResolver } = opts;
23
+ super({
24
+ noun: 'Synthesizer',
25
+ autoAdoptFirst: true,
26
+ buildOnRead: true,
27
+ build: (def, config) => def.create({
28
+ config,
29
+ ...(secretResolver ? { getSecret: secretResolver } : {}),
30
+ }),
31
+ });
32
+ }
33
+ }
34
+ //# sourceMappingURL=synthesizers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synthesizers.js","sourceRoot":"","sources":["../../src/registries/synthesizers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,mBAAoB,SAAQ,qBAAkD;IACzF,YAAY,OAAsE,EAAE;QAClF,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;QAChC,KAAK,CAAC;YACJ,IAAI,EAAE,aAAa;YACnB,cAAc,EAAE,IAAI;YACpB,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CACrB,GAAG,CAAC,MAAM,CAAC;gBACT,MAAM;gBACN,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACzD,CAAC;SACL,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,49 @@
1
+ import type { EventLogReader, SubagentSpawner, ToolDef } from '@moxxy/sdk';
2
+ import type { Logger } from '../logger.js';
3
+ export interface ToolRegistry {
4
+ list(): ReadonlyArray<ToolDef>;
5
+ get(name: string): ToolDef | undefined;
6
+ has(name: string): boolean;
7
+ register(tool: ToolDef): void;
8
+ unregister(name: string): void;
9
+ execute(name: string, input: unknown, signal: AbortSignal, opts?: ExecuteOptions): Promise<unknown>;
10
+ }
11
+ interface ExecuteOptions {
12
+ readonly callId?: string;
13
+ readonly sessionId?: string;
14
+ readonly turnId?: string;
15
+ readonly log?: EventLogReader;
16
+ readonly logger?: Logger;
17
+ readonly cwd?: string;
18
+ /**
19
+ * Optional spawner — passed by run-turn so multi-agent tools (e.g.
20
+ * `dispatch_agent`) can fan work out from inside the tool-use loop.
21
+ * Plain `tools.execute()` callers (tests, one-off scripts) may omit it.
22
+ */
23
+ readonly subagents?: SubagentSpawner;
24
+ }
25
+ export declare class ToolRegistryImpl implements ToolRegistry {
26
+ private readonly tools;
27
+ private readonly defaultLogger;
28
+ private readonly defaultCwd;
29
+ /**
30
+ * Vault-backed secret resolver, when the host wires one. Surfaced to
31
+ * every tool handler as `ctx.getSecret(name)` so plugins can read an
32
+ * API key at call time without the value ever entering the model's
33
+ * context or `process.env`.
34
+ */
35
+ private readonly secretResolver?;
36
+ constructor(opts: {
37
+ logger: Logger;
38
+ cwd: string;
39
+ secretResolver?: (name: string) => Promise<string | null>;
40
+ });
41
+ list(): ReadonlyArray<ToolDef>;
42
+ get(name: string): ToolDef | undefined;
43
+ has(name: string): boolean;
44
+ register(tool: ToolDef): void;
45
+ unregister(name: string): void;
46
+ execute(name: string, input: unknown, signal: AbortSignal, opts?: ExecuteOptions): Promise<unknown>;
47
+ }
48
+ export {};
49
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/registries/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAe,OAAO,EAAE,MAAM,YAAY,CAAC;AACxF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,MAAM,WAAW,YAAY;IAC3B,IAAI,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACvC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrG;AAED,UAAU,cAAc;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,eAAe,CAAC;CACtC;AAED,qBAAa,gBAAiB,YAAW,YAAY;IACnD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAA2C;gBAE/D,IAAI,EAAE;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;KAC3D;IAMD,IAAI,IAAI,aAAa,CAAC,OAAO,CAAC;IAI9B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAItC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAO7B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxB,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,OAAO,CAAC;CAyCpB"}
@@ -0,0 +1,98 @@
1
+ import { asToolCallId, asSessionId, asTurnId } from '@moxxy/sdk';
2
+ export class ToolRegistryImpl {
3
+ tools = new Map();
4
+ defaultLogger;
5
+ defaultCwd;
6
+ /**
7
+ * Vault-backed secret resolver, when the host wires one. Surfaced to
8
+ * every tool handler as `ctx.getSecret(name)` so plugins can read an
9
+ * API key at call time without the value ever entering the model's
10
+ * context or `process.env`.
11
+ */
12
+ secretResolver;
13
+ constructor(opts) {
14
+ this.defaultLogger = opts.logger;
15
+ this.defaultCwd = opts.cwd;
16
+ this.secretResolver = opts.secretResolver;
17
+ }
18
+ list() {
19
+ return [...this.tools.values()];
20
+ }
21
+ get(name) {
22
+ return this.tools.get(name);
23
+ }
24
+ has(name) {
25
+ return this.tools.has(name);
26
+ }
27
+ register(tool) {
28
+ if (this.tools.has(tool.name)) {
29
+ throw new Error(`Tool already registered: ${tool.name}`);
30
+ }
31
+ this.tools.set(tool.name, tool);
32
+ }
33
+ unregister(name) {
34
+ this.tools.delete(name);
35
+ }
36
+ async execute(name, input, signal, opts = {}) {
37
+ const tool = this.tools.get(name);
38
+ if (!tool)
39
+ throw new Error(`Unknown tool: ${name}`);
40
+ // Use safeParse so a validation failure surfaces as a clean,
41
+ // single-line error in the tool_result instead of the raw ZodError
42
+ // (which JSON-stringifies into 20+ lines of red noise — observed
43
+ // with memory_save and synthesize_skill). The formatted message tells
44
+ // the model exactly which fields are off and why, so it can retry.
45
+ const parseResult = tool.inputSchema.safeParse(input);
46
+ if (!parseResult.success) {
47
+ throw new Error(`Invalid input for ${name}: ${formatZodIssues(parseResult.error)}`);
48
+ }
49
+ const parsed = parseResult.data;
50
+ const ctx = {
51
+ sessionId: asSessionId(opts.sessionId ?? 'no-session'),
52
+ turnId: asTurnId(opts.turnId ?? 'no-turn'),
53
+ callId: asToolCallId(opts.callId ?? 'no-call'),
54
+ cwd: opts.cwd ?? this.defaultCwd,
55
+ signal,
56
+ log: opts.log ?? emptyLog(),
57
+ logger: opts.logger ?? this.defaultLogger,
58
+ ...(opts.subagents ? { subagents: opts.subagents } : {}),
59
+ ...(this.secretResolver ? { getSecret: this.secretResolver } : {}),
60
+ };
61
+ const result = await tool.handler(parsed, ctx);
62
+ if (tool.outputSchema) {
63
+ // Mirror the input path: format an output-schema mismatch (a plugin bug)
64
+ // into the same single-line message instead of letting the raw 20-line
65
+ // ZodError surface, and name the offending tool + fields.
66
+ const outResult = tool.outputSchema.safeParse(result);
67
+ if (!outResult.success) {
68
+ throw new Error(`Tool ${name} produced invalid output: ${formatZodIssues(outResult.error)}`);
69
+ }
70
+ return outResult.data;
71
+ }
72
+ return result;
73
+ }
74
+ }
75
+ /**
76
+ * Format a ZodError's issues into a single-line, model-friendly string
77
+ * (`path: message; path: message`). Used by both input and output validation
78
+ * so the raw multi-line ZodError JSON noise never reaches the model.
79
+ */
80
+ function formatZodIssues(error) {
81
+ return error.issues
82
+ .map((iss) => {
83
+ const path = iss.path.length ? iss.path.join('.') : '(root)';
84
+ return `${path}: ${iss.message}`;
85
+ })
86
+ .join('; ');
87
+ }
88
+ function emptyLog() {
89
+ return {
90
+ length: 0,
91
+ at: () => undefined,
92
+ slice: () => [],
93
+ ofType: () => [],
94
+ byTurn: () => [],
95
+ toJSON: () => [],
96
+ };
97
+ }
98
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/registries/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Transcriber, TranscriberDef } from '@moxxy/sdk';
2
+ import { ActiveBackendRegistry } from './active-backend-registry.js';
3
+ /**
4
+ * Registry of speech-to-text backends:
5
+ * - plugins call `register(def)` at load time
6
+ * - the host/CLI calls `setActive(name, config)` once a backend is chosen
7
+ * - channels with audio input read `getActive()` to transcribe bytes
8
+ *
9
+ * At most one transcriber is *active* at a time, selected explicitly (no
10
+ * auto-adopt). `getActive()` throws when none is active, so call sites can
11
+ * degrade gracefully (e.g. Telegram falls back to "you sent a voice note but no
12
+ * transcriber is configured").
13
+ */
14
+ export declare class TranscriberRegistry extends ActiveBackendRegistry<TranscriberDef, Transcriber> {
15
+ constructor();
16
+ }
17
+ //# sourceMappingURL=transcribers.d.ts.map