@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.
- package/LICENSE +21 -0
- package/README.md +125 -0
- package/dist/events/factory.d.ts +6 -0
- package/dist/events/factory.d.ts.map +1 -0
- package/dist/events/factory.js +14 -0
- package/dist/events/factory.js.map +1 -0
- package/dist/events/log.d.ts +92 -0
- package/dist/events/log.d.ts.map +1 -0
- package/dist/events/log.js +244 -0
- package/dist/events/log.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +16 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +27 -0
- package/dist/logger.js.map +1 -0
- package/dist/permissions/engine.d.ts +94 -0
- package/dist/permissions/engine.d.ts.map +1 -0
- package/dist/permissions/engine.js +203 -0
- package/dist/permissions/engine.js.map +1 -0
- package/dist/permissions/resolvers.d.ts +8 -0
- package/dist/permissions/resolvers.d.ts.map +1 -0
- package/dist/permissions/resolvers.js +8 -0
- package/dist/permissions/resolvers.js.map +1 -0
- package/dist/plugins/discovery.d.ts +9 -0
- package/dist/plugins/discovery.d.ts.map +1 -0
- package/dist/plugins/discovery.js +112 -0
- package/dist/plugins/discovery.js.map +1 -0
- package/dist/plugins/host-options.d.ts +72 -0
- package/dist/plugins/host-options.d.ts.map +1 -0
- package/dist/plugins/host-options.js +2 -0
- package/dist/plugins/host-options.js.map +1 -0
- package/dist/plugins/host.d.ts +53 -0
- package/dist/plugins/host.d.ts.map +1 -0
- package/dist/plugins/host.js +269 -0
- package/dist/plugins/host.js.map +1 -0
- package/dist/plugins/lifecycle.d.ts +31 -0
- package/dist/plugins/lifecycle.d.ts.map +1 -0
- package/dist/plugins/lifecycle.js +100 -0
- package/dist/plugins/lifecycle.js.map +1 -0
- package/dist/plugins/loader.d.ts +7 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +68 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/package-requirements.d.ts +16 -0
- package/dist/plugins/package-requirements.d.ts.map +1 -0
- package/dist/plugins/package-requirements.js +52 -0
- package/dist/plugins/package-requirements.js.map +1 -0
- package/dist/plugins/registry-kinds.d.ts +58 -0
- package/dist/plugins/registry-kinds.d.ts.map +1 -0
- package/dist/plugins/registry-kinds.js +139 -0
- package/dist/plugins/registry-kinds.js.map +1 -0
- package/dist/plugins/toposort.d.ts +24 -0
- package/dist/plugins/toposort.d.ts.map +1 -0
- package/dist/plugins/toposort.js +67 -0
- package/dist/plugins/toposort.js.map +1 -0
- package/dist/preferences.d.ts +40 -0
- package/dist/preferences.d.ts.map +1 -0
- package/dist/preferences.js +58 -0
- package/dist/preferences.js.map +1 -0
- package/dist/registries/active-backend-registry.d.ts +65 -0
- package/dist/registries/active-backend-registry.d.ts.map +1 -0
- package/dist/registries/active-backend-registry.js +108 -0
- package/dist/registries/active-backend-registry.js.map +1 -0
- package/dist/registries/active-def-registry.d.ts +59 -0
- package/dist/registries/active-def-registry.d.ts.map +1 -0
- package/dist/registries/active-def-registry.js +63 -0
- package/dist/registries/active-def-registry.js.map +1 -0
- package/dist/registries/agents.d.ts +16 -0
- package/dist/registries/agents.d.ts.map +1 -0
- package/dist/registries/agents.js +17 -0
- package/dist/registries/agents.js.map +1 -0
- package/dist/registries/cache-strategies.d.ts +12 -0
- package/dist/registries/cache-strategies.d.ts.map +1 -0
- package/dist/registries/cache-strategies.js +13 -0
- package/dist/registries/cache-strategies.js.map +1 -0
- package/dist/registries/channels.d.ts +16 -0
- package/dist/registries/channels.d.ts.map +1 -0
- package/dist/registries/channels.js +35 -0
- package/dist/registries/channels.js.map +1 -0
- package/dist/registries/commands.d.ts +29 -0
- package/dist/registries/commands.d.ts.map +1 -0
- package/dist/registries/commands.js +72 -0
- package/dist/registries/commands.js.map +1 -0
- package/dist/registries/compactors.d.ts +12 -0
- package/dist/registries/compactors.d.ts.map +1 -0
- package/dist/registries/compactors.js +13 -0
- package/dist/registries/compactors.js.map +1 -0
- package/dist/registries/def-map-registry.d.ts +33 -0
- package/dist/registries/def-map-registry.d.ts.map +1 -0
- package/dist/registries/def-map-registry.js +36 -0
- package/dist/registries/def-map-registry.js.map +1 -0
- package/dist/registries/embedders.d.ts +16 -0
- package/dist/registries/embedders.d.ts.map +1 -0
- package/dist/registries/embedders.js +17 -0
- package/dist/registries/embedders.js.map +1 -0
- package/dist/registries/isolators.d.ts +21 -0
- package/dist/registries/isolators.d.ts.map +1 -0
- package/dist/registries/isolators.js +32 -0
- package/dist/registries/isolators.js.map +1 -0
- package/dist/registries/modes.d.ts +28 -0
- package/dist/registries/modes.d.ts.map +1 -0
- package/dist/registries/modes.js +81 -0
- package/dist/registries/modes.js.map +1 -0
- package/dist/registries/providers.d.ts +44 -0
- package/dist/registries/providers.d.ts.map +1 -0
- package/dist/registries/providers.js +95 -0
- package/dist/registries/providers.js.map +1 -0
- package/dist/registries/skills.d.ts +24 -0
- package/dist/registries/skills.d.ts.map +1 -0
- package/dist/registries/skills.js +81 -0
- package/dist/registries/skills.js.map +1 -0
- package/dist/registries/surfaces.d.ts +13 -0
- package/dist/registries/surfaces.d.ts.map +1 -0
- package/dist/registries/surfaces.js +14 -0
- package/dist/registries/surfaces.js.map +1 -0
- package/dist/registries/synthesizers.d.ts +26 -0
- package/dist/registries/synthesizers.d.ts.map +1 -0
- package/dist/registries/synthesizers.js +34 -0
- package/dist/registries/synthesizers.js.map +1 -0
- package/dist/registries/tools.d.ts +49 -0
- package/dist/registries/tools.d.ts.map +1 -0
- package/dist/registries/tools.js +98 -0
- package/dist/registries/tools.js.map +1 -0
- package/dist/registries/transcribers.d.ts +17 -0
- package/dist/registries/transcribers.d.ts.map +1 -0
- package/dist/registries/transcribers.js +18 -0
- package/dist/registries/transcribers.js.map +1 -0
- package/dist/registries/tunnel-providers.d.ts +12 -0
- package/dist/registries/tunnel-providers.d.ts.map +1 -0
- package/dist/registries/tunnel-providers.js +13 -0
- package/dist/registries/tunnel-providers.js.map +1 -0
- package/dist/registries/view-renderers.d.ts +13 -0
- package/dist/registries/view-renderers.d.ts.map +1 -0
- package/dist/registries/view-renderers.js +14 -0
- package/dist/registries/view-renderers.js.map +1 -0
- package/dist/registries/workflow-executors.d.ts +13 -0
- package/dist/registries/workflow-executors.d.ts.map +1 -0
- package/dist/registries/workflow-executors.js +14 -0
- package/dist/registries/workflow-executors.js.map +1 -0
- package/dist/requirements.d.ts +59 -0
- package/dist/requirements.d.ts.map +1 -0
- package/dist/requirements.js +149 -0
- package/dist/requirements.js.map +1 -0
- package/dist/run-turn.d.ts +6 -0
- package/dist/run-turn.d.ts.map +1 -0
- package/dist/run-turn.js +141 -0
- package/dist/run-turn.js.map +1 -0
- package/dist/session-runtime.d.ts +67 -0
- package/dist/session-runtime.d.ts.map +1 -0
- package/dist/session-runtime.js +2 -0
- package/dist/session-runtime.js.map +1 -0
- package/dist/session.d.ts +203 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +399 -0
- package/dist/session.js.map +1 -0
- package/dist/sessions/persistence.d.ts +184 -0
- package/dist/sessions/persistence.d.ts.map +1 -0
- package/dist/sessions/persistence.js +442 -0
- package/dist/sessions/persistence.js.map +1 -0
- package/dist/setup-agent.d.ts +91 -0
- package/dist/setup-agent.d.ts.map +1 -0
- package/dist/setup-agent.js +138 -0
- package/dist/setup-agent.js.map +1 -0
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +4 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/loader.d.ts +16 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +99 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/parse.d.ts +5 -0
- package/dist/skills/parse.d.ts.map +1 -0
- package/dist/skills/parse.js +8 -0
- package/dist/skills/parse.js.map +1 -0
- package/dist/skills/synthesize-draft.d.ts +8 -0
- package/dist/skills/synthesize-draft.d.ts.map +1 -0
- package/dist/skills/synthesize-draft.js +32 -0
- package/dist/skills/synthesize-draft.js.map +1 -0
- package/dist/skills/synthesize.d.ts +33 -0
- package/dist/skills/synthesize.d.ts.map +1 -0
- package/dist/skills/synthesize.js +241 -0
- package/dist/skills/synthesize.js.map +1 -0
- package/dist/subagents/events.d.ts +20 -0
- package/dist/subagents/events.d.ts.map +1 -0
- package/dist/subagents/events.js +146 -0
- package/dist/subagents/events.js.map +1 -0
- package/dist/subagents/registry.d.ts +40 -0
- package/dist/subagents/registry.d.ts.map +1 -0
- package/dist/subagents/registry.js +42 -0
- package/dist/subagents/registry.js.map +1 -0
- package/dist/subagents/run-child.d.ts +43 -0
- package/dist/subagents/run-child.d.ts.map +1 -0
- package/dist/subagents/run-child.js +276 -0
- package/dist/subagents/run-child.js.map +1 -0
- package/dist/subagents/spawn.d.ts +8 -0
- package/dist/subagents/spawn.d.ts.map +1 -0
- package/dist/subagents/spawn.js +8 -0
- package/dist/subagents/spawn.js.map +1 -0
- package/dist/subagents/tools.d.ts +4 -0
- package/dist/subagents/tools.d.ts.map +1 -0
- package/dist/subagents/tools.js +13 -0
- package/dist/subagents/tools.js.map +1 -0
- package/dist/subagents.d.ts +3 -0
- package/dist/subagents.d.ts.map +1 -0
- package/dist/subagents.js +3 -0
- package/dist/subagents.js.map +1 -0
- package/dist/surfaces/host.d.ts +53 -0
- package/dist/surfaces/host.d.ts.map +1 -0
- package/dist/surfaces/host.js +177 -0
- package/dist/surfaces/host.js.map +1 -0
- package/dist/tunnel/localhost.d.ts +7 -0
- package/dist/tunnel/localhost.d.ts.map +1 -0
- package/dist/tunnel/localhost.js +21 -0
- package/dist/tunnel/localhost.js.map +1 -0
- package/dist/usage-stats.d.ts +42 -0
- package/dist/usage-stats.d.ts.map +1 -0
- package/dist/usage-stats.js +83 -0
- package/dist/usage-stats.js.map +1 -0
- package/dist/view/default-renderer.d.ts +7 -0
- package/dist/view/default-renderer.d.ts.map +1 -0
- package/dist/view/default-renderer.js +14 -0
- package/dist/view/default-renderer.js.map +1 -0
- package/dist/view/parse.d.ts +7 -0
- package/dist/view/parse.d.ts.map +1 -0
- package/dist/view/parse.js +479 -0
- package/dist/view/parse.js.map +1 -0
- package/package.json +61 -0
- package/src/events/factory.ts +27 -0
- package/src/events/log.test.ts +470 -0
- package/src/events/log.ts +256 -0
- package/src/index.ts +102 -0
- package/src/logger.ts +46 -0
- package/src/permissions/engine.test.ts +206 -0
- package/src/permissions/engine.ts +247 -0
- package/src/permissions/resolvers.test.ts +40 -0
- package/src/permissions/resolvers.ts +17 -0
- package/src/plugins/discovery.test.ts +115 -0
- package/src/plugins/discovery.ts +124 -0
- package/src/plugins/host-options.ts +73 -0
- package/src/plugins/host-view-tunnel.test.ts +86 -0
- package/src/plugins/host.test.ts +434 -0
- package/src/plugins/host.ts +327 -0
- package/src/plugins/lifecycle.test.ts +187 -0
- package/src/plugins/lifecycle.ts +136 -0
- package/src/plugins/loader.ts +79 -0
- package/src/plugins/package-requirements.ts +50 -0
- package/src/plugins/registry-kinds.test.ts +162 -0
- package/src/plugins/registry-kinds.ts +210 -0
- package/src/plugins/toposort.test.ts +66 -0
- package/src/plugins/toposort.ts +69 -0
- package/src/preferences.test.ts +105 -0
- package/src/preferences.ts +84 -0
- package/src/registries/active-backend-registry.ts +142 -0
- package/src/registries/active-def-registry.test.ts +103 -0
- package/src/registries/active-def-registry.ts +97 -0
- package/src/registries/agents.ts +18 -0
- package/src/registries/cache-strategies.ts +14 -0
- package/src/registries/channels.ts +42 -0
- package/src/registries/commands.test.ts +71 -0
- package/src/registries/commands.ts +78 -0
- package/src/registries/compactors.ts +14 -0
- package/src/registries/def-map-registry.test.ts +67 -0
- package/src/registries/def-map-registry.ts +59 -0
- package/src/registries/embedders.test.ts +54 -0
- package/src/registries/embedders.ts +18 -0
- package/src/registries/isolators.test.ts +43 -0
- package/src/registries/isolators.ts +38 -0
- package/src/registries/modes.test.ts +66 -0
- package/src/registries/modes.ts +80 -0
- package/src/registries/providers.test.ts +50 -0
- package/src/registries/providers.ts +97 -0
- package/src/registries/semantics.test.ts +117 -0
- package/src/registries/skills.ts +87 -0
- package/src/registries/surfaces.ts +18 -0
- package/src/registries/synthesizers.test.ts +63 -0
- package/src/registries/synthesizers.ts +36 -0
- package/src/registries/tools.test.ts +142 -0
- package/src/registries/tools.ts +145 -0
- package/src/registries/transcribers.test.ts +70 -0
- package/src/registries/transcribers.ts +19 -0
- package/src/registries/tunnel-providers.test.ts +30 -0
- package/src/registries/tunnel-providers.ts +14 -0
- package/src/registries/view-renderers.test.ts +68 -0
- package/src/registries/view-renderers.ts +15 -0
- package/src/registries/workflow-executors.test.ts +53 -0
- package/src/registries/workflow-executors.ts +15 -0
- package/src/requirements.targetinfo.test.ts +70 -0
- package/src/requirements.test.ts +111 -0
- package/src/requirements.ts +262 -0
- package/src/run-turn.test.ts +178 -0
- package/src/run-turn.ts +156 -0
- package/src/session-runtime.ts +75 -0
- package/src/session.test.ts +216 -0
- package/src/session.ts +491 -0
- package/src/sessions/persistence.flush.test.ts +100 -0
- package/src/sessions/persistence.ready.test.ts +91 -0
- package/src/sessions/persistence.test.ts +274 -0
- package/src/sessions/persistence.ts +498 -0
- package/src/setup-agent.test.ts +72 -0
- package/src/setup-agent.ts +189 -0
- package/src/skills/index.ts +14 -0
- package/src/skills/loader.test.ts +102 -0
- package/src/skills/loader.ts +114 -0
- package/src/skills/parse.test.ts +59 -0
- package/src/skills/parse.ts +11 -0
- package/src/skills/synthesize-draft.test.ts +79 -0
- package/src/skills/synthesize-draft.ts +46 -0
- package/src/skills/synthesize.test.ts +170 -0
- package/src/skills/synthesize.ts +304 -0
- package/src/subagents/events.test.ts +56 -0
- package/src/subagents/events.ts +194 -0
- package/src/subagents/registry.ts +62 -0
- package/src/subagents/run-child.test.ts +185 -0
- package/src/subagents/run-child.ts +425 -0
- package/src/subagents/spawn.ts +12 -0
- package/src/subagents/tools.ts +19 -0
- package/src/subagents.ts +2 -0
- package/src/surfaces/host.test.ts +330 -0
- package/src/surfaces/host.ts +192 -0
- package/src/tunnel/localhost.test.ts +22 -0
- package/src/tunnel/localhost.ts +21 -0
- package/src/usage-stats.test.ts +77 -0
- package/src/usage-stats.ts +119 -0
- package/src/view/default-renderer.test.ts +29 -0
- package/src/view/default-renderer.ts +14 -0
- package/src/view/parse-extended.test.ts +255 -0
- package/src/view/parse.test.ts +232 -0
- 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
|