@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":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;CAClD;AAID,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,aAAkB,GAAG,MAAM,CAmB7D;AAED,eAAO,MAAM,YAAY,EAAE,MAM1B,CAAC"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const levelRank = { debug: 10, info: 20, warn: 30, error: 40 };
|
|
2
|
+
export function createLogger(opts = {}) {
|
|
3
|
+
const minLevel = opts.minLevel ?? 'info';
|
|
4
|
+
const sink = opts.sink ?? ((line) => process.stderr.write(line + '\n'));
|
|
5
|
+
const bindings = opts.bindings ?? {};
|
|
6
|
+
const emit = (level, msg, meta) => {
|
|
7
|
+
if (levelRank[level] < levelRank[minLevel])
|
|
8
|
+
return;
|
|
9
|
+
const payload = { ts: new Date().toISOString(), level, msg, ...bindings, ...(meta ?? {}) };
|
|
10
|
+
sink(JSON.stringify(payload));
|
|
11
|
+
};
|
|
12
|
+
return {
|
|
13
|
+
debug: (msg, meta) => emit('debug', msg, meta),
|
|
14
|
+
info: (msg, meta) => emit('info', msg, meta),
|
|
15
|
+
warn: (msg, meta) => emit('warn', msg, meta),
|
|
16
|
+
error: (msg, meta) => emit('error', msg, meta),
|
|
17
|
+
child: (extra) => createLogger({ minLevel, sink, bindings: { ...bindings, ...extra } }),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export const silentLogger = {
|
|
21
|
+
debug: () => { },
|
|
22
|
+
info: () => { },
|
|
23
|
+
warn: () => { },
|
|
24
|
+
error: () => { },
|
|
25
|
+
child: () => silentLogger,
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAUA,MAAM,SAAS,GAA6B,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAQzF,MAAM,UAAU,YAAY,CAAC,OAAsB,EAAE;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IAErC,MAAM,IAAI,GAAG,CAAC,KAAe,EAAE,GAAW,EAAE,IAA8B,EAAQ,EAAE;QAClF,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC;YAAE,OAAO;QACnD,MAAM,OAAO,GAAG,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;QAC3F,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC;QAC9C,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;QAC5C,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;QAC5C,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC;QAC9C,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,YAAY,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC;KACxE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAW;IAClC,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;IACf,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;IACf,KAAK,EAAE,GAAG,EAAE,CAAC,YAAY;CAC1B,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { type PendingToolCall, type PermissionDecision } from '@moxxy/sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
/**
|
|
4
|
+
* Flat shape used by the policy file and the engine's mutator API.
|
|
5
|
+
* Different from SDK's `PermissionRule` (which uses a nested `pattern`).
|
|
6
|
+
* The engine has its own type because the persisted format is intentionally
|
|
7
|
+
* simple and stable.
|
|
8
|
+
*/
|
|
9
|
+
export interface PolicyRule {
|
|
10
|
+
readonly name: string;
|
|
11
|
+
/**
|
|
12
|
+
* Map of tool-input field name → regex source string. Each value is compiled
|
|
13
|
+
* with `new RegExp(value)` and tested with `.test(candidate)`, which is an
|
|
14
|
+
* UNANCHORED (substring / partial) match by design: the pattern matches if it
|
|
15
|
+
* occurs anywhere in the field's string form, not only when it spans the whole
|
|
16
|
+
* value. This is a deliberate, stable contract — existing user permission
|
|
17
|
+
* files rely on it, so it is never silently anchored.
|
|
18
|
+
*
|
|
19
|
+
* Consequence: an allow rule like `{ Read: { path: 'config' } }` matches
|
|
20
|
+
* `/etc/passwd#config` and `~/.ssh/config-backup` too. A rule that wants a
|
|
21
|
+
* FULL match must supply its own anchors, e.g. `'^/safe/dir/.*$'`. (Note this
|
|
22
|
+
* differs from {@link nameMatches}, which anchors its glob with `^...$`
|
|
23
|
+
* because a glob is a whole-name convention, not an author-supplied regex.)
|
|
24
|
+
*/
|
|
25
|
+
readonly inputMatches?: Record<string, string>;
|
|
26
|
+
readonly reason?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare const permissionPolicySchema: z.ZodObject<{
|
|
29
|
+
allow: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
30
|
+
name: z.ZodString;
|
|
31
|
+
inputMatches: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
32
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
33
|
+
}, "strip", z.ZodTypeAny, {
|
|
34
|
+
name: string;
|
|
35
|
+
reason?: string | undefined;
|
|
36
|
+
inputMatches?: Record<string, string> | undefined;
|
|
37
|
+
}, {
|
|
38
|
+
name: string;
|
|
39
|
+
reason?: string | undefined;
|
|
40
|
+
inputMatches?: Record<string, string> | undefined;
|
|
41
|
+
}>, "many">>;
|
|
42
|
+
deny: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
43
|
+
name: z.ZodString;
|
|
44
|
+
inputMatches: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
45
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
46
|
+
}, "strip", z.ZodTypeAny, {
|
|
47
|
+
name: string;
|
|
48
|
+
reason?: string | undefined;
|
|
49
|
+
inputMatches?: Record<string, string> | undefined;
|
|
50
|
+
}, {
|
|
51
|
+
name: string;
|
|
52
|
+
reason?: string | undefined;
|
|
53
|
+
inputMatches?: Record<string, string> | undefined;
|
|
54
|
+
}>, "many">>;
|
|
55
|
+
}, "strip", z.ZodTypeAny, {
|
|
56
|
+
allow: {
|
|
57
|
+
name: string;
|
|
58
|
+
reason?: string | undefined;
|
|
59
|
+
inputMatches?: Record<string, string> | undefined;
|
|
60
|
+
}[];
|
|
61
|
+
deny: {
|
|
62
|
+
name: string;
|
|
63
|
+
reason?: string | undefined;
|
|
64
|
+
inputMatches?: Record<string, string> | undefined;
|
|
65
|
+
}[];
|
|
66
|
+
}, {
|
|
67
|
+
allow?: {
|
|
68
|
+
name: string;
|
|
69
|
+
reason?: string | undefined;
|
|
70
|
+
inputMatches?: Record<string, string> | undefined;
|
|
71
|
+
}[] | undefined;
|
|
72
|
+
deny?: {
|
|
73
|
+
name: string;
|
|
74
|
+
reason?: string | undefined;
|
|
75
|
+
inputMatches?: Record<string, string> | undefined;
|
|
76
|
+
}[] | undefined;
|
|
77
|
+
}>;
|
|
78
|
+
export type PermissionPolicy = z.infer<typeof permissionPolicySchema>;
|
|
79
|
+
export declare class PermissionEngine {
|
|
80
|
+
private policy;
|
|
81
|
+
private policyPath;
|
|
82
|
+
private mutex;
|
|
83
|
+
constructor(policy?: PermissionPolicy, policyPath?: string | null);
|
|
84
|
+
static load(policyPath: string): Promise<PermissionEngine>;
|
|
85
|
+
check(call: PendingToolCall): PermissionDecision | null;
|
|
86
|
+
addAllow(rule: PolicyRule): Promise<void>;
|
|
87
|
+
addDeny(rule: PolicyRule): Promise<void>;
|
|
88
|
+
/** Remove every rule (allow + deny) whose name matches exactly. Returns the count removed. */
|
|
89
|
+
removeByName(name: string): Promise<number>;
|
|
90
|
+
clear(): Promise<void>;
|
|
91
|
+
private persist;
|
|
92
|
+
get policySnapshot(): PermissionPolicy;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/permissions/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGpG,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAItE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,UAAU,CAAgB;IAIlC,OAAO,CAAC,KAAK,CAAwB;gBAEzB,MAAM,GAAE,gBAA8B,EAAE,UAAU,GAAE,MAAM,GAAG,IAAW;WAKvE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAahE,KAAK,CAAC,IAAI,EAAE,eAAe,GAAG,kBAAkB,GAAG,IAAI;IAcjD,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzC,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAU9C,8FAA8F;IACxF,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAc3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAOd,OAAO;IAKrB,IAAI,cAAc,IAAI,gBAAgB,CAErC;CACF"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { createMutex } from '@moxxy/sdk';
|
|
2
|
+
import { writeFileAtomic } from '@moxxy/sdk/server';
|
|
3
|
+
import { promises as fs } from 'node:fs';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
export const permissionPolicySchema = z.object({
|
|
6
|
+
allow: z.array(z.object({
|
|
7
|
+
name: z.string(),
|
|
8
|
+
inputMatches: z.record(z.string(), z.string()).optional(),
|
|
9
|
+
reason: z.string().optional(),
|
|
10
|
+
})).default([]),
|
|
11
|
+
deny: z.array(z.object({
|
|
12
|
+
name: z.string(),
|
|
13
|
+
inputMatches: z.record(z.string(), z.string()).optional(),
|
|
14
|
+
reason: z.string().optional(),
|
|
15
|
+
})).default([]),
|
|
16
|
+
});
|
|
17
|
+
const emptyPolicy = { allow: [], deny: [] };
|
|
18
|
+
export class PermissionEngine {
|
|
19
|
+
policy;
|
|
20
|
+
policyPath;
|
|
21
|
+
// Per-instance mutex. Mutators read-modify-write `this.policy` then persist;
|
|
22
|
+
// without serialization two overlapping calls both read the same snapshot,
|
|
23
|
+
// each append one rule, and the second write clobbers the first's rule.
|
|
24
|
+
mutex = createMutex();
|
|
25
|
+
constructor(policy = emptyPolicy, policyPath = null) {
|
|
26
|
+
this.policy = policy;
|
|
27
|
+
this.policyPath = policyPath;
|
|
28
|
+
}
|
|
29
|
+
static async load(policyPath) {
|
|
30
|
+
try {
|
|
31
|
+
const raw = await fs.readFile(policyPath, 'utf8');
|
|
32
|
+
const parsed = permissionPolicySchema.parse(JSON.parse(raw));
|
|
33
|
+
return new PermissionEngine(parsed, policyPath);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
if (isNodeError(err) && err.code === 'ENOENT') {
|
|
37
|
+
return new PermissionEngine(emptyPolicy, policyPath);
|
|
38
|
+
}
|
|
39
|
+
throw err;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
check(call) {
|
|
43
|
+
for (const rule of this.policy.deny) {
|
|
44
|
+
if (matchRule(rule, call, 'deny')) {
|
|
45
|
+
return { mode: 'deny', reason: rule.reason ?? `Denied by policy: ${rule.name}` };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
for (const rule of this.policy.allow) {
|
|
49
|
+
if (matchRule(rule, call, 'allow')) {
|
|
50
|
+
return { mode: 'allow', reason: rule.reason ?? `Allowed by policy: ${rule.name}` };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
async addAllow(rule) {
|
|
56
|
+
return this.mutex.run(async () => {
|
|
57
|
+
this.policy = {
|
|
58
|
+
...this.policy,
|
|
59
|
+
allow: [...this.policy.allow, sanitizeRule(rule)],
|
|
60
|
+
};
|
|
61
|
+
await this.persist();
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async addDeny(rule) {
|
|
65
|
+
return this.mutex.run(async () => {
|
|
66
|
+
this.policy = {
|
|
67
|
+
...this.policy,
|
|
68
|
+
deny: [...this.policy.deny, sanitizeRule(rule)],
|
|
69
|
+
};
|
|
70
|
+
await this.persist();
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/** Remove every rule (allow + deny) whose name matches exactly. Returns the count removed. */
|
|
74
|
+
async removeByName(name) {
|
|
75
|
+
return this.mutex.run(async () => {
|
|
76
|
+
const allowBefore = this.policy.allow.length;
|
|
77
|
+
const denyBefore = this.policy.deny.length;
|
|
78
|
+
this.policy = {
|
|
79
|
+
allow: this.policy.allow.filter((r) => r.name !== name),
|
|
80
|
+
deny: this.policy.deny.filter((r) => r.name !== name),
|
|
81
|
+
};
|
|
82
|
+
const removed = allowBefore - this.policy.allow.length + (denyBefore - this.policy.deny.length);
|
|
83
|
+
if (removed > 0)
|
|
84
|
+
await this.persist();
|
|
85
|
+
return removed;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async clear() {
|
|
89
|
+
return this.mutex.run(async () => {
|
|
90
|
+
this.policy = { allow: [], deny: [] };
|
|
91
|
+
await this.persist();
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
async persist() {
|
|
95
|
+
if (!this.policyPath)
|
|
96
|
+
return;
|
|
97
|
+
await writeFileAtomic(this.policyPath, JSON.stringify(this.policy, null, 2));
|
|
98
|
+
}
|
|
99
|
+
get policySnapshot() {
|
|
100
|
+
return this.policy;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** Strip undefined fields and copy `inputMatches` through so persistence preserves it. */
|
|
104
|
+
function sanitizeRule(rule) {
|
|
105
|
+
const out = { name: rule.name };
|
|
106
|
+
if (rule.inputMatches && Object.keys(rule.inputMatches).length > 0) {
|
|
107
|
+
out.inputMatches = { ...rule.inputMatches };
|
|
108
|
+
}
|
|
109
|
+
if (rule.reason !== undefined) {
|
|
110
|
+
out.reason = rule.reason;
|
|
111
|
+
}
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Evaluate a rule against a call. `intent` is the list the rule lives on so we
|
|
116
|
+
* can fail in the safe direction when a pattern is uncompilable:
|
|
117
|
+
*
|
|
118
|
+
* - A DENY rule with an invalid `inputMatches` regex fails CLOSED — the bad
|
|
119
|
+
* pattern is treated as a match so a malformed deny rule (e.g. an unbalanced
|
|
120
|
+
* bracket like `rm -rf [`) keeps denying instead of silently becoming a no-op
|
|
121
|
+
* that lets dangerous commands through.
|
|
122
|
+
* - An ALLOW rule with an invalid regex fails to match — it never over-grants.
|
|
123
|
+
*
|
|
124
|
+
* Either way the bad pattern is surfaced on stderr so the misconfiguration is
|
|
125
|
+
* visible rather than silent.
|
|
126
|
+
*/
|
|
127
|
+
function matchRule(rule, call, intent) {
|
|
128
|
+
if (!nameMatches(rule.name, call.name))
|
|
129
|
+
return false;
|
|
130
|
+
if (rule.inputMatches) {
|
|
131
|
+
const input = call.input;
|
|
132
|
+
if (!input || typeof input !== 'object')
|
|
133
|
+
return false;
|
|
134
|
+
for (const [k, v] of Object.entries(rule.inputMatches)) {
|
|
135
|
+
const candidate = stringifyCandidate(input[k]);
|
|
136
|
+
let re;
|
|
137
|
+
try {
|
|
138
|
+
// `inputMatches` values are UNANCHORED regexes by design: `.test` does a
|
|
139
|
+
// substring/partial match, so the pattern matches if it occurs anywhere
|
|
140
|
+
// in `candidate`. This is the documented, stable contract (see
|
|
141
|
+
// PolicyRule.inputMatches) — never wrap it in `^(?:…)$`, as that would
|
|
142
|
+
// silently break existing permission files. Authors who need a full
|
|
143
|
+
// match anchor their own pattern with `^…$`.
|
|
144
|
+
re = new RegExp(v);
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
warnBadPattern(rule.name, k, v, intent, err);
|
|
148
|
+
// Uncompilable pattern: a deny rule must still deny (fail closed),
|
|
149
|
+
// an allow rule must not grant (this field fails to match).
|
|
150
|
+
if (intent === 'deny')
|
|
151
|
+
continue;
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
if (!re.test(candidate))
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Coerce a tool-input field to the string an `inputMatches` regex tests against.
|
|
162
|
+
* Primitives use their natural string form (unchanged behaviour); a
|
|
163
|
+
* structured field (object/array) is JSON-serialized so a rule can match its
|
|
164
|
+
* shape (e.g. `inputMatches: { args: '"--force"' }`) instead of silently
|
|
165
|
+
* seeing `[object Object]` and never matching. `null`/`undefined` → `''`.
|
|
166
|
+
*/
|
|
167
|
+
function stringifyCandidate(value) {
|
|
168
|
+
if (value === null || value === undefined)
|
|
169
|
+
return '';
|
|
170
|
+
if (typeof value === 'object') {
|
|
171
|
+
try {
|
|
172
|
+
return JSON.stringify(value) ?? '';
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return String(value);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return String(value);
|
|
179
|
+
}
|
|
180
|
+
function warnBadPattern(ruleName, field, pattern, intent, err) {
|
|
181
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
182
|
+
const resolution = intent === 'deny'
|
|
183
|
+
? 'failing closed (rule still denies)'
|
|
184
|
+
: 'this field cannot match (rule will not grant)';
|
|
185
|
+
process.stderr.write(`moxxy: invalid regex in ${intent} permission rule "${ruleName}" ` +
|
|
186
|
+
`(inputMatches.${field} = ${JSON.stringify(pattern)}): ${detail} — ${resolution}\n`);
|
|
187
|
+
}
|
|
188
|
+
function nameMatches(pattern, candidate) {
|
|
189
|
+
if (pattern === candidate)
|
|
190
|
+
return true;
|
|
191
|
+
if (pattern.includes('*')) {
|
|
192
|
+
const re = new RegExp('^' + pattern.split('*').map(escapeRe).join('.*') + '$');
|
|
193
|
+
return re.test(candidate);
|
|
194
|
+
}
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
function escapeRe(s) {
|
|
198
|
+
return s.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
|
|
199
|
+
}
|
|
200
|
+
function isNodeError(e) {
|
|
201
|
+
return e instanceof Error && 'code' in e;
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/permissions/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA6D,MAAM,YAAY,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA4BxB,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACzD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC9B,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACf,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACzD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC9B,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAChB,CAAC,CAAC;AAIH,MAAM,WAAW,GAAqB,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAE9D,MAAM,OAAO,gBAAgB;IACnB,MAAM,CAAmB;IACzB,UAAU,CAAgB;IAClC,6EAA6E;IAC7E,2EAA2E;IAC3E,wEAAwE;IAChE,KAAK,GAAU,WAAW,EAAE,CAAC;IAErC,YAAY,SAA2B,WAAW,EAAE,aAA4B,IAAI;QAClF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAkB;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7D,OAAO,IAAI,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC9C,OAAO,IAAI,gBAAgB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YACvD,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAqB;QACzB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACpC,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;gBAClC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,qBAAqB,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACnF,CAAC;QACH,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACrC,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;gBACnC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,sBAAsB,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACrF,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAgB;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YAC/B,IAAI,CAAC,MAAM,GAAG;gBACZ,GAAG,IAAI,CAAC,MAAM;gBACd,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;aAClD,CAAC;YACF,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAgB;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YAC/B,IAAI,CAAC,MAAM,GAAG;gBACZ,GAAG,IAAI,CAAC,MAAM;gBACd,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;aAChD,CAAC;YACF,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,8FAA8F;IAC9F,KAAK,CAAC,YAAY,CAAC,IAAY;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;YAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YAC3C,IAAI,CAAC,MAAM,GAAG;gBACZ,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;gBACvD,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;aACtD,CAAC;YACF,MAAM,OAAO,GAAG,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChG,IAAI,OAAO,GAAG,CAAC;gBAAE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACtC,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YAC/B,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAC7B,MAAM,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAED,0FAA0F;AAC1F,SAAS,YAAY,CAAC,IAAgB;IACpC,MAAM,GAAG,GAAe,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,GAA4D,CAAC,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;IACxG,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7B,GAA4D,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACrF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,SAAS,CAAC,IAAgB,EAAE,IAAqB,EAAE,MAAwB;IAClF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAuC,CAAC;QAC3D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACtD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YACvD,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/C,IAAI,EAAU,CAAC;YACf,IAAI,CAAC;gBACH,yEAAyE;gBACzE,wEAAwE;gBACxE,+DAA+D;gBAC/D,uEAAuE;gBACvE,oEAAoE;gBACpE,6CAA6C;gBAC7C,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;gBAC7C,mEAAmE;gBACnE,4DAA4D;gBAC5D,IAAI,MAAM,KAAK,MAAM;oBAAE,SAAS;gBAChC,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;gBAAE,OAAO,KAAK,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,cAAc,CACrB,QAAgB,EAChB,KAAa,EACb,OAAe,EACf,MAAwB,EACxB,GAAY;IAEZ,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChE,MAAM,UAAU,GACd,MAAM,KAAK,MAAM;QACf,CAAC,CAAC,oCAAoC;QACtC,CAAC,CAAC,+CAA+C,CAAC;IACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,2BAA2B,MAAM,qBAAqB,QAAQ,IAAI;QAChE,iBAAiB,KAAK,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,MAAM,MAAM,UAAU,IAAI,CACtF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,SAAiB;IACrD,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QAC/E,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS;IACzB,OAAO,CAAC,CAAC,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,WAAW,CAAC,CAAU;IAC7B,OAAO,CAAC,YAAY,KAAK,IAAI,MAAM,IAAI,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The reusable PermissionResolver factories now live in `@moxxy/sdk` (they have
|
|
3
|
+
* zero core internals, and channel plugins — which may only depend on the SDK —
|
|
4
|
+
* need them). Re-exported here for back-compat so existing `@moxxy/core`
|
|
5
|
+
* importers keep working.
|
|
6
|
+
*/
|
|
7
|
+
export { autoAllowResolver, denyByDefaultResolver, createCallbackResolver, createAllowListResolver, createDeferredPermissionResolver, type CallbackResolverOptions, type PermissionPromptHandler, type DeferredPermissionResolver, type DeferredPermissionResolverOptions, } from '@moxxy/sdk';
|
|
8
|
+
//# sourceMappingURL=resolvers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolvers.d.ts","sourceRoot":"","sources":["../../src/permissions/resolvers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,gCAAgC,EAChC,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,EAC/B,KAAK,iCAAiC,GACvC,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The reusable PermissionResolver factories now live in `@moxxy/sdk` (they have
|
|
3
|
+
* zero core internals, and channel plugins — which may only depend on the SDK —
|
|
4
|
+
* need them). Re-exported here for back-compat so existing `@moxxy/core`
|
|
5
|
+
* importers keep working.
|
|
6
|
+
*/
|
|
7
|
+
export { autoAllowResolver, denyByDefaultResolver, createCallbackResolver, createAllowListResolver, createDeferredPermissionResolver, } from '@moxxy/sdk';
|
|
8
|
+
//# sourceMappingURL=resolvers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolvers.js","sourceRoot":"","sources":["../../src/permissions/resolvers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,gCAAgC,GAKjC,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ResolvedPluginManifest } from '@moxxy/sdk';
|
|
2
|
+
import type { Logger } from '../logger.js';
|
|
3
|
+
export interface DiscoveryOptions {
|
|
4
|
+
readonly cwd: string;
|
|
5
|
+
readonly logger: Logger;
|
|
6
|
+
readonly extraPaths?: ReadonlyArray<string>;
|
|
7
|
+
}
|
|
8
|
+
export declare function discoverPlugins(opts: DiscoveryOptions): Promise<ReadonlyArray<ResolvedPluginManifest>>;
|
|
9
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/plugins/discovery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAS3C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC7C;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC,CAgC5G"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { moxxyPackageSchema } from '@moxxy/sdk';
|
|
4
|
+
/**
|
|
5
|
+
* Maximum number of directory levels to climb when collecting `node_modules`
|
|
6
|
+
* roots from the cwd upward. Bounds the walk so discovery never traverses all
|
|
7
|
+
* the way to the filesystem root on a deeply-nested cwd.
|
|
8
|
+
*/
|
|
9
|
+
const MAX_NODE_MODULES_WALK_DEPTH = 8;
|
|
10
|
+
export async function discoverPlugins(opts) {
|
|
11
|
+
const seen = new Set();
|
|
12
|
+
const out = [];
|
|
13
|
+
const roots = await candidateRoots(opts.cwd);
|
|
14
|
+
for (const extra of opts.extraPaths ?? [])
|
|
15
|
+
roots.push(extra);
|
|
16
|
+
for (const root of roots) {
|
|
17
|
+
let pkgsDirs;
|
|
18
|
+
try {
|
|
19
|
+
pkgsDirs = await listPackageDirs(root);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
opts.logger.debug('discovery: failed to list packages in root', { root, err: String(err) });
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
// Dedupe by path FIRST (cheap, order-preserving), then read the unique
|
|
26
|
+
// manifests in parallel — the reads are independent fs.readFile + parse.
|
|
27
|
+
// Promise.all preserves array order, so the emitted order is identical to
|
|
28
|
+
// the prior sequential loop.
|
|
29
|
+
const uniquePaths = pkgsDirs.filter((pkgPath) => {
|
|
30
|
+
if (seen.has(pkgPath))
|
|
31
|
+
return false;
|
|
32
|
+
seen.add(pkgPath);
|
|
33
|
+
return true;
|
|
34
|
+
});
|
|
35
|
+
const manifests = await Promise.all(uniquePaths.map((pkgPath) => readPluginManifest(pkgPath, opts.logger)));
|
|
36
|
+
for (const manifest of manifests) {
|
|
37
|
+
if (manifest)
|
|
38
|
+
out.push(manifest);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
async function candidateRoots(cwd) {
|
|
44
|
+
const out = [];
|
|
45
|
+
let cursor = path.resolve(cwd);
|
|
46
|
+
for (let i = 0; i < MAX_NODE_MODULES_WALK_DEPTH; i++) {
|
|
47
|
+
out.push(path.join(cursor, 'node_modules'));
|
|
48
|
+
const parent = path.dirname(cursor);
|
|
49
|
+
if (parent === cursor)
|
|
50
|
+
break;
|
|
51
|
+
cursor = parent;
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
async function listPackageDirs(root) {
|
|
56
|
+
const entries = await fs
|
|
57
|
+
.readdir(root, { withFileTypes: true })
|
|
58
|
+
.catch(() => []);
|
|
59
|
+
// Resolve each top-level entry to its contributed package dirs in parallel
|
|
60
|
+
// (scoped `@org` dirs need their own readdir), then flatten in entry order so
|
|
61
|
+
// the result matches the prior sequential walk.
|
|
62
|
+
const perEntry = await Promise.all(entries.map(async (entry) => {
|
|
63
|
+
if (!entry.isDirectory() && !entry.isSymbolicLink())
|
|
64
|
+
return [];
|
|
65
|
+
const full = path.join(root, entry.name);
|
|
66
|
+
if (entry.name.startsWith('@')) {
|
|
67
|
+
const sub = await fs
|
|
68
|
+
.readdir(full, { withFileTypes: true })
|
|
69
|
+
.catch(() => []);
|
|
70
|
+
return sub
|
|
71
|
+
.filter((s) => s.isDirectory() || s.isSymbolicLink())
|
|
72
|
+
.map((s) => path.join(full, s.name));
|
|
73
|
+
}
|
|
74
|
+
if (entry.name !== '.bin' && entry.name !== '.pnpm')
|
|
75
|
+
return [full];
|
|
76
|
+
return [];
|
|
77
|
+
}));
|
|
78
|
+
return perEntry.flat();
|
|
79
|
+
}
|
|
80
|
+
async function readPluginManifest(packagePath, logger) {
|
|
81
|
+
const pkgJsonPath = path.join(packagePath, 'package.json');
|
|
82
|
+
let pkg;
|
|
83
|
+
try {
|
|
84
|
+
pkg = JSON.parse(await fs.readFile(pkgJsonPath, 'utf8'));
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
if (!pkg.moxxy)
|
|
90
|
+
return null;
|
|
91
|
+
if (!pkg.name)
|
|
92
|
+
return null;
|
|
93
|
+
const parsedMoxxy = moxxyPackageSchema.safeParse(pkg.moxxy);
|
|
94
|
+
if (!parsedMoxxy.success) {
|
|
95
|
+
logger.warn('discovery: invalid moxxy package config, skipping', {
|
|
96
|
+
package: pkg.name,
|
|
97
|
+
issues: parsedMoxxy.error.issues,
|
|
98
|
+
});
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
const { plugin, requirements } = parsedMoxxy.data;
|
|
102
|
+
if (!plugin)
|
|
103
|
+
return null;
|
|
104
|
+
return {
|
|
105
|
+
...plugin,
|
|
106
|
+
packageName: pkg.name,
|
|
107
|
+
packageVersion: pkg.version ?? '0.0.0',
|
|
108
|
+
packagePath,
|
|
109
|
+
...(requirements ? { requirements } : {}),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/plugins/discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared option/loader types for {@link PluginHost}. Extracted into this leaf
|
|
3
|
+
* module so both `host.ts` and the registry-kind table (`registry-kinds.ts`)
|
|
4
|
+
* can depend on `PluginHostOptions` without forming an import cycle
|
|
5
|
+
* (`host.ts` → `registry-kinds.ts` → `host.ts`). Re-exported from `host.ts`
|
|
6
|
+
* for back-compat, so existing `import { PluginHostOptions } from './host.js'`
|
|
7
|
+
* call sites keep working.
|
|
8
|
+
*/
|
|
9
|
+
import type { Plugin, ResolvedPluginManifest } from '@moxxy/sdk';
|
|
10
|
+
import type { Logger } from '../logger.js';
|
|
11
|
+
import type { AgentRegistry } from '../registries/agents.js';
|
|
12
|
+
import type { CommandRegistry } from '../registries/commands.js';
|
|
13
|
+
import type { ChannelRegistryImpl } from '../registries/channels.js';
|
|
14
|
+
import type { SurfaceRegistryImpl } from '../registries/surfaces.js';
|
|
15
|
+
import type { CacheStrategyRegistry } from '../registries/cache-strategies.js';
|
|
16
|
+
import type { ViewRendererRegistry } from '../registries/view-renderers.js';
|
|
17
|
+
import type { TunnelProviderRegistry } from '../registries/tunnel-providers.js';
|
|
18
|
+
import type { CompactorRegistry } from '../registries/compactors.js';
|
|
19
|
+
import type { ModeRegistry } from '../registries/modes.js';
|
|
20
|
+
import type { ProviderRegistry } from '../registries/providers.js';
|
|
21
|
+
import type { ToolRegistry } from '../registries/tools.js';
|
|
22
|
+
import type { TranscriberRegistry } from '../registries/transcribers.js';
|
|
23
|
+
import type { SynthesizerRegistry } from '../registries/synthesizers.js';
|
|
24
|
+
import type { EmbedderRegistry } from '../registries/embedders.js';
|
|
25
|
+
import type { IsolatorRegistry } from '../registries/isolators.js';
|
|
26
|
+
import type { WorkflowExecutorRegistry } from '../registries/workflow-executors.js';
|
|
27
|
+
import type { HookDispatcherImpl } from './lifecycle.js';
|
|
28
|
+
import type { RequirementRegistry } from '../requirements.js';
|
|
29
|
+
export interface PluginHostOptions {
|
|
30
|
+
readonly cwd: string;
|
|
31
|
+
readonly logger: Logger;
|
|
32
|
+
readonly tools: ToolRegistry;
|
|
33
|
+
readonly providers: ProviderRegistry;
|
|
34
|
+
readonly modes: ModeRegistry;
|
|
35
|
+
readonly compactors: CompactorRegistry;
|
|
36
|
+
readonly cacheStrategies: CacheStrategyRegistry;
|
|
37
|
+
readonly viewRenderers: ViewRendererRegistry;
|
|
38
|
+
readonly tunnelProviders: TunnelProviderRegistry;
|
|
39
|
+
readonly channels: ChannelRegistryImpl;
|
|
40
|
+
readonly surfaces: SurfaceRegistryImpl;
|
|
41
|
+
readonly agents: AgentRegistry;
|
|
42
|
+
readonly commands: CommandRegistry;
|
|
43
|
+
readonly transcribers: TranscriberRegistry;
|
|
44
|
+
readonly synthesizers: SynthesizerRegistry;
|
|
45
|
+
readonly embedders: EmbedderRegistry;
|
|
46
|
+
readonly isolators: IsolatorRegistry;
|
|
47
|
+
readonly workflowExecutors: WorkflowExecutorRegistry;
|
|
48
|
+
readonly requirements: RequirementRegistry;
|
|
49
|
+
readonly dispatcher: HookDispatcherImpl;
|
|
50
|
+
readonly loader?: PluginLoader;
|
|
51
|
+
/**
|
|
52
|
+
* Extra discovery roots beyond the cwd-rooted `node_modules` walk (e.g.
|
|
53
|
+
* `~/.moxxy/plugins` and its `node_modules`). Stored so `reload()` reuses
|
|
54
|
+
* them — otherwise a reload would compute its "wanted" set without these
|
|
55
|
+
* paths and unload every user plugin, then fail to rediscover them.
|
|
56
|
+
*/
|
|
57
|
+
readonly userPaths?: ReadonlyArray<string>;
|
|
58
|
+
/**
|
|
59
|
+
* Predicate consulted (by PACKAGE name) for discovered plugins on every
|
|
60
|
+
* `discoverAndLoad`/`reload`. Returning `true` keeps the package out of the
|
|
61
|
+
* "wanted" set, so a plugin the user disabled (config `plugins[name].enabled
|
|
62
|
+
* = false`) is never re-loaded by a reload and, if currently loaded, is
|
|
63
|
+
* unloaded. Boot-time builtins are filtered separately by register-plugins;
|
|
64
|
+
* this closes the runtime-toggle / reload hole. Reads live state, so a
|
|
65
|
+
* runtime enable/disable takes effect on the next reload without a restart.
|
|
66
|
+
*/
|
|
67
|
+
readonly isDisabled?: (packageName: string) => boolean;
|
|
68
|
+
}
|
|
69
|
+
export interface PluginLoader {
|
|
70
|
+
load(manifest: ResolvedPluginManifest): Promise<Plugin>;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=host-options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-options.d.ts","sourceRoot":"","sources":["../../src/plugins/host-options.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-options.js","sourceRoot":"","sources":["../../src/plugins/host-options.ts"],"names":[],"mappings":""}
|