@zhixuan92/multi-model-agent 3.1.7 → 3.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/README.md +1 -1
- package/dist/cli/install-skill.d.ts +4 -84
- package/dist/cli/install-skill.d.ts.map +1 -1
- package/dist/cli/install-skill.js +6 -177
- package/dist/cli/install-skill.js.map +1 -1
- package/dist/http/execution-context.d.ts +3 -6
- package/dist/http/execution-context.d.ts.map +1 -1
- package/dist/http/execution-context.js +7 -22
- package/dist/http/execution-context.js.map +1 -1
- package/dist/http/handlers/control/batch-slice.d.ts +4 -0
- package/dist/http/handlers/control/batch-slice.d.ts.map +1 -0
- package/dist/http/handlers/control/batch-slice.js +40 -0
- package/dist/http/handlers/control/batch-slice.js.map +1 -0
- package/dist/http/handlers/control/retry.d.ts +4 -0
- package/dist/http/handlers/control/retry.d.ts.map +1 -0
- package/dist/http/handlers/control/retry.js +60 -0
- package/dist/http/handlers/control/retry.js.map +1 -0
- package/dist/http/handlers/tools/audit.d.ts.map +1 -1
- package/dist/http/handlers/tools/audit.js +2 -0
- package/dist/http/handlers/tools/audit.js.map +1 -1
- package/dist/http/handlers/tools/debug.d.ts.map +1 -1
- package/dist/http/handlers/tools/debug.js +2 -0
- package/dist/http/handlers/tools/debug.js.map +1 -1
- package/dist/http/handlers/tools/delegate.d.ts.map +1 -1
- package/dist/http/handlers/tools/delegate.js +2 -0
- package/dist/http/handlers/tools/delegate.js.map +1 -1
- package/dist/http/handlers/tools/execute-plan.d.ts.map +1 -1
- package/dist/http/handlers/tools/execute-plan.js +2 -0
- package/dist/http/handlers/tools/execute-plan.js.map +1 -1
- package/dist/http/handlers/tools/review.d.ts.map +1 -1
- package/dist/http/handlers/tools/review.js +2 -0
- package/dist/http/handlers/tools/review.js.map +1 -1
- package/dist/http/handlers/tools/verify.d.ts.map +1 -1
- package/dist/http/handlers/tools/verify.js +2 -0
- package/dist/http/handlers/tools/verify.js.map +1 -1
- package/dist/http/request-observability.d.ts +9 -0
- package/dist/http/request-observability.d.ts.map +1 -0
- package/dist/http/request-observability.js +36 -0
- package/dist/http/request-observability.js.map +1 -0
- package/dist/http/request-pipeline.d.ts +10 -0
- package/dist/http/request-pipeline.d.ts.map +1 -0
- package/dist/http/request-pipeline.js +87 -0
- package/dist/http/request-pipeline.js.map +1 -0
- package/dist/http/router.d.ts +5 -0
- package/dist/http/router.d.ts.map +1 -1
- package/dist/http/router.js +10 -0
- package/dist/http/router.js.map +1 -1
- package/dist/http/server.d.ts.map +1 -1
- package/dist/http/server.js +69 -102
- package/dist/http/server.js.map +1 -1
- package/dist/install/discover.d.ts +19 -0
- package/dist/install/discover.d.ts.map +1 -0
- package/dist/install/discover.js +52 -0
- package/dist/install/discover.js.map +1 -0
- package/dist/install/manifest-resolve.d.ts +11 -0
- package/dist/install/manifest-resolve.d.ts.map +1 -0
- package/dist/install/manifest-resolve.js +54 -0
- package/dist/install/manifest-resolve.js.map +1 -0
- package/dist/install/orchestrate.d.ts +35 -0
- package/dist/install/orchestrate.d.ts.map +1 -0
- package/dist/install/orchestrate.js +53 -0
- package/dist/install/orchestrate.js.map +1 -0
- package/dist/openapi.d.ts.map +1 -1
- package/dist/openapi.js +21 -114
- package/dist/openapi.js.map +1 -1
- package/dist/skills/mma-audit/SKILL.md +1 -1
- package/dist/skills/mma-clarifications/SKILL.md +1 -1
- package/dist/skills/mma-context-blocks/SKILL.md +1 -1
- package/dist/skills/mma-debug/SKILL.md +1 -1
- package/dist/skills/mma-delegate/SKILL.md +7 -1
- package/dist/skills/mma-execute-plan/SKILL.md +7 -1
- package/dist/skills/mma-retry/SKILL.md +1 -1
- package/dist/skills/mma-review/SKILL.md +1 -1
- package/dist/skills/mma-verify/SKILL.md +1 -1
- package/dist/skills/multi-model-agent/SKILL.md +1 -1
- package/package.json +2 -2
package/dist/http/server.js
CHANGED
|
@@ -3,11 +3,9 @@ import { readFileSync } from 'node:fs';
|
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
import { join, dirname } from 'node:path';
|
|
5
5
|
import { Router } from './router.js';
|
|
6
|
-
import { sendError } from './errors.js';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { validateCwd } from './cwd-validator.js';
|
|
10
|
-
import { isLoopbackAddress } from './loopback.js';
|
|
6
|
+
import { sendError, sendJson } from './errors.js';
|
|
7
|
+
import { loadToken } from './auth.js';
|
|
8
|
+
import { handleRequest } from './request-pipeline.js';
|
|
11
9
|
/** Server package version — read once at module load time from package.json. */
|
|
12
10
|
function readServerVersion() {
|
|
13
11
|
try {
|
|
@@ -28,8 +26,8 @@ const LOOPBACK_ONLY_PATHS = new Set(['/health', '/status']);
|
|
|
28
26
|
const AUTH_EXEMPT_PATHS = new Set(['/health']);
|
|
29
27
|
/** Routes that require a `cwd` query parameter (validated by cwd-validator middleware). */
|
|
30
28
|
const CWD_REQUIRED_PATHS = new Set([
|
|
31
|
-
'/delegate', '/audit', '/review', '/verify', '/debug', '/execute-plan', '/retry',
|
|
32
|
-
'/context-blocks',
|
|
29
|
+
'/delegate', '/tools/delegate', '/audit', '/review', '/verify', '/debug', '/execute-plan', '/retry',
|
|
30
|
+
'/control/retry', '/control/batch-slice', '/context-blocks',
|
|
33
31
|
]);
|
|
34
32
|
/**
|
|
35
33
|
* Registers tool handlers (POST /delegate, /audit, /review, /verify, /debug, /execute-plan, /retry).
|
|
@@ -44,7 +42,6 @@ async function registerToolHandlers(router, config, batchRegistry, projectRegist
|
|
|
44
42
|
const { buildExecutePlanHandler } = await import('./handlers/tools/execute-plan.js');
|
|
45
43
|
const { buildRetryHandler } = await import('./handlers/tools/retry.js');
|
|
46
44
|
const { createDiagnosticLogger } = await import('@zhixuan92/multi-model-agent-core');
|
|
47
|
-
const logger = createDiagnosticLogger({ enabled: false });
|
|
48
45
|
// For tool handlers, we need MultiModelConfig which is part of ServerConfig only
|
|
49
46
|
// when the full mmagent.config.json is loaded. In test/minimal configs that only
|
|
50
47
|
// have `server:`, we create a stub config. Real CLI startup will load full config.
|
|
@@ -64,19 +61,31 @@ async function registerToolHandlers(router, config, batchRegistry, projectRegist
|
|
|
64
61
|
}
|
|
65
62
|
return;
|
|
66
63
|
}
|
|
64
|
+
const logger = createDiagnosticLogger({
|
|
65
|
+
enabled: multiModelConfig.diagnostics?.log ?? false,
|
|
66
|
+
...(multiModelConfig.diagnostics?.logDir ? { logDir: multiModelConfig.diagnostics.logDir } : {}),
|
|
67
|
+
});
|
|
67
68
|
const deps = {
|
|
68
69
|
config: multiModelConfig,
|
|
69
70
|
logger,
|
|
70
71
|
projectRegistry,
|
|
71
72
|
batchRegistry,
|
|
72
73
|
};
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
74
|
+
const delegateHandler = buildDelegateHandler(deps);
|
|
75
|
+
const auditHandler = buildAuditHandler(deps);
|
|
76
|
+
const reviewHandler = buildReviewHandler(deps);
|
|
77
|
+
const verifyHandler = buildVerifyHandler(deps);
|
|
78
|
+
const debugHandler = buildDebugHandler(deps);
|
|
79
|
+
const executePlanHandler = buildExecutePlanHandler(deps);
|
|
80
|
+
const retryHandler = buildRetryHandler(deps);
|
|
81
|
+
router.register('POST', '/delegate', delegateHandler);
|
|
82
|
+
router.register('POST', '/tools/delegate', delegateHandler);
|
|
83
|
+
router.register('POST', '/audit', auditHandler);
|
|
84
|
+
router.register('POST', '/review', reviewHandler);
|
|
85
|
+
router.register('POST', '/verify', verifyHandler);
|
|
86
|
+
router.register('POST', '/debug', debugHandler);
|
|
87
|
+
router.register('POST', '/execute-plan', executePlanHandler);
|
|
88
|
+
router.register('POST', '/retry', retryHandler);
|
|
80
89
|
}
|
|
81
90
|
/**
|
|
82
91
|
* Registers control handlers (GET /batch/:batchId, POST/DELETE /context-blocks,
|
|
@@ -84,9 +93,36 @@ async function registerToolHandlers(router, config, batchRegistry, projectRegist
|
|
|
84
93
|
*/
|
|
85
94
|
async function registerControlHandlers(router, config, batchRegistry, projectRegistry) {
|
|
86
95
|
const { buildBatchHandler } = await import('./handlers/control/batch.js');
|
|
96
|
+
const { buildRetryHandler } = await import('./handlers/control/retry.js');
|
|
97
|
+
const { buildBatchSliceHandler } = await import('./handlers/control/batch-slice.js');
|
|
87
98
|
const { buildCreateContextBlockHandler, buildDeleteContextBlockHandler } = await import('./handlers/control/context-blocks.js');
|
|
88
99
|
const { buildClarificationsHandler } = await import('./handlers/control/clarifications.js');
|
|
100
|
+
const { createDiagnosticLogger } = await import('@zhixuan92/multi-model-agent-core');
|
|
101
|
+
const multiModelConfig = config.agents
|
|
102
|
+
? config
|
|
103
|
+
: undefined;
|
|
89
104
|
router.register('GET', '/batch/:batchId', buildBatchHandler({ batchRegistry }));
|
|
105
|
+
if (multiModelConfig) {
|
|
106
|
+
const deps = {
|
|
107
|
+
config: multiModelConfig,
|
|
108
|
+
logger: createDiagnosticLogger({
|
|
109
|
+
enabled: multiModelConfig.diagnostics?.log ?? false,
|
|
110
|
+
...(multiModelConfig.diagnostics?.logDir ? { logDir: multiModelConfig.diagnostics.logDir } : {}),
|
|
111
|
+
}),
|
|
112
|
+
projectRegistry,
|
|
113
|
+
batchRegistry,
|
|
114
|
+
};
|
|
115
|
+
router.register('POST', '/control/retry', buildRetryHandler(deps));
|
|
116
|
+
router.register('POST', '/control/batch-slice', buildBatchSliceHandler(deps));
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
router.register('POST', '/control/retry', (_req, res) => {
|
|
120
|
+
sendError(res, 503, 'no_agent_config', 'Server started without agent configuration; provide a full mmagent.config.json');
|
|
121
|
+
});
|
|
122
|
+
router.register('POST', '/control/batch-slice', (_req, res) => {
|
|
123
|
+
sendError(res, 503, 'no_agent_config', 'Server started without agent configuration; provide a full mmagent.config.json');
|
|
124
|
+
});
|
|
125
|
+
}
|
|
90
126
|
router.register('POST', '/context-blocks', buildCreateContextBlockHandler({ projectRegistry, config }));
|
|
91
127
|
router.register('DELETE', '/context-blocks/:blockId', buildDeleteContextBlockHandler({ projectRegistry }));
|
|
92
128
|
router.register('POST', '/clarifications/confirm', buildClarificationsHandler({ batchRegistry }));
|
|
@@ -127,8 +163,17 @@ export async function startServer(config) {
|
|
|
127
163
|
// GET /tools — OpenAPI 3.0 document (auth required, NOT loopback-gated)
|
|
128
164
|
const { buildToolsHandler } = await import('./handlers/introspection/tools-list.js');
|
|
129
165
|
router.register('GET', '/tools', buildToolsHandler());
|
|
166
|
+
// Test-only: enumerates registered routes. Guarded by env; zero impact on production.
|
|
167
|
+
if (process.env.MMAGENT_TEST_INTROSPECTION === '1') {
|
|
168
|
+
router.register('GET', '/__routes', (_req, res) => {
|
|
169
|
+
sendJson(res, 200, router.listRoutes().map((route) => ({
|
|
170
|
+
method: route.method.toUpperCase(),
|
|
171
|
+
path: route.path,
|
|
172
|
+
})));
|
|
173
|
+
});
|
|
174
|
+
}
|
|
130
175
|
const server = createServer((req, res) => {
|
|
131
|
-
void handleRequest(router, token, req, res, config);
|
|
176
|
+
void handleRequest(router, token, req, res, config, PIPELINE_CFG);
|
|
132
177
|
});
|
|
133
178
|
await new Promise((resolve) => {
|
|
134
179
|
server.listen(config.server.port, config.server.bind, resolve);
|
|
@@ -145,90 +190,12 @@ export async function startServer(config) {
|
|
|
145
190
|
serverStartedAt,
|
|
146
191
|
};
|
|
147
192
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
if (!result.ok) {
|
|
157
|
-
// Send 413 then close; include Connection: close so the client knows
|
|
158
|
-
res.writeHead(413, { 'content-type': 'application/json', 'connection': 'close' });
|
|
159
|
-
res.end(JSON.stringify({ error: { code: 'payload_too_large', message: `Request body exceeds the ${cfg.server.limits.maxBodyBytes}-byte limit` } }), () => { req.socket?.destroy(); });
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
rawBody = result.body;
|
|
163
|
-
}
|
|
164
|
-
// ── Step 2: Route match (404 not_found / 405 method_not_allowed) ──────────
|
|
165
|
-
const match = router.match(method, rawUrl);
|
|
166
|
-
if (!match) {
|
|
167
|
-
const allowed = router.methodsFor(rawUrl);
|
|
168
|
-
if (allowed.length > 0) {
|
|
169
|
-
sendError(res, 405, 'method_not_allowed', `Method ${method} not allowed`, { allowed });
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
sendError(res, 404, 'not_found', `Unknown path ${rawUrl.split('?')[0]}`);
|
|
173
|
-
}
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
// ── Step 3: Loopback guard for /health and /status ────────────────────────
|
|
177
|
-
const pathname = rawUrl.split('?')[0];
|
|
178
|
-
if (LOOPBACK_ONLY_PATHS.has(pathname)) {
|
|
179
|
-
const remoteAddr = req.socket?.remoteAddress;
|
|
180
|
-
if (!isLoopbackAddress(remoteAddr)) {
|
|
181
|
-
sendError(res, 403, 'loopback_only', 'This endpoint is only accessible from the loopback interface');
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
// ── Step 4: Auth (bearer token) — skip for /health ───────────────────────
|
|
186
|
-
if (!AUTH_EXEMPT_PATHS.has(pathname)) {
|
|
187
|
-
const header = req.headers['authorization'];
|
|
188
|
-
const authResult = validateAuthHeader(header, token);
|
|
189
|
-
if (!authResult.ok) {
|
|
190
|
-
sendError(res, 401, 'unauthorized', 'Valid Bearer token required');
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
// ── Step 5: JSON parse → ctx.body ────────────────────────────────────────
|
|
195
|
-
let parsedBody;
|
|
196
|
-
if (rawBody !== undefined && rawBody.length > 0) {
|
|
197
|
-
try {
|
|
198
|
-
parsedBody = JSON.parse(rawBody.toString('utf8'));
|
|
199
|
-
}
|
|
200
|
-
catch {
|
|
201
|
-
sendError(res, 400, 'invalid_json', 'Request body is not valid JSON');
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
// ── Step 6: cwd query param → validate → ctx.cwd ─────────────────────────
|
|
206
|
-
// cwd is required for tool routes and context-block routes.
|
|
207
|
-
// /batch/:batchId and /clarifications/confirm do NOT require cwd.
|
|
208
|
-
let cwdValue;
|
|
209
|
-
const urlObj = new URL(rawUrl, 'http://localhost');
|
|
210
|
-
// Match against pathname prefix patterns for cwd-required routes
|
|
211
|
-
const requiresCwd = CWD_REQUIRED_PATHS.has(pathname) ||
|
|
212
|
-
pathname === '/context-blocks' ||
|
|
213
|
-
/^\/context-blocks\//.test(pathname);
|
|
214
|
-
if (requiresCwd) {
|
|
215
|
-
const cwdParam = urlObj.searchParams.get('cwd') ?? undefined;
|
|
216
|
-
const cwdResult = validateCwd(cwdParam);
|
|
217
|
-
if (!cwdResult.ok) {
|
|
218
|
-
const statusCode = cwdResult.error === 'forbidden_cwd' ? 403 : 400;
|
|
219
|
-
sendError(res, statusCode, cwdResult.error, cwdResult.message);
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
cwdValue = cwdResult.canonicalCwd;
|
|
223
|
-
}
|
|
224
|
-
// ── Steps 7-9: Zod validation, project registry, and handler run ──────────
|
|
225
|
-
// These happen inside each handler (Phase 6+).
|
|
226
|
-
const ctx = {
|
|
227
|
-
url: urlObj,
|
|
228
|
-
cwd: cwdValue,
|
|
229
|
-
body: parsedBody,
|
|
230
|
-
authed: !AUTH_EXEMPT_PATHS.has(pathname),
|
|
231
|
-
};
|
|
232
|
-
await match.handler(req, res, match.params, ctx);
|
|
233
|
-
}
|
|
193
|
+
// Per-request pipeline lives in request-pipeline.ts. server.ts owns routing
|
|
194
|
+
// table + bootstrap; the pipeline owns body-cap → route → loopback → auth →
|
|
195
|
+
// JSON parse → cwd → dispatch.
|
|
196
|
+
const PIPELINE_CFG = {
|
|
197
|
+
loopbackOnlyPaths: LOOPBACK_ONLY_PATHS,
|
|
198
|
+
authExemptPaths: AUTH_EXEMPT_PATHS,
|
|
199
|
+
cwdRequiredPaths: CWD_REQUIRED_PATHS,
|
|
200
|
+
};
|
|
234
201
|
//# sourceMappingURL=server.js.map
|
package/dist/http/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/http/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/http/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const SUPPORTED_SKILLS: readonly ["multi-model-agent", "mma-delegate", "mma-audit", "mma-review", "mma-verify", "mma-debug", "mma-execute-plan", "mma-retry", "mma-context-blocks", "mma-clarifications"];
|
|
2
|
+
/** Thrown when a skill's SKILL.md cannot be read from the bundled skills directory. */
|
|
3
|
+
export declare class SkillNotFoundError extends Error {
|
|
4
|
+
readonly code: "skill_not_found";
|
|
5
|
+
constructor(skillName: string, checkedPath: string);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Return the absolute path to the skills root directory. Production: the
|
|
9
|
+
* bundled `packages/server/src/skills/` (or its dist mirror). Tests pass
|
|
10
|
+
* a fixture path explicitly.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getSkillsRoot(skillsRoot?: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Read the content of a skill's SKILL.md file. Returns null if the file
|
|
15
|
+
* does not exist; propagates other I/O errors so callers can distinguish
|
|
16
|
+
* "skill not found" from "can't access skill".
|
|
17
|
+
*/
|
|
18
|
+
export declare function readSkillContent(skillName: string, skillsRoot?: string): string | null;
|
|
19
|
+
//# sourceMappingURL=discover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/install/discover.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,gBAAgB,mLAWnB,CAAC;AAEX,uFAAuF;AACvF,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAG,iBAAiB,CAAU;gBAC/B,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CAOnD;AAQD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQtF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Skill discovery — locates packaged SKILL.md files on disk and reads them.
|
|
2
|
+
// Extracted from cli/install-skill.ts as part of Ch 7 Task 39.
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
export const SUPPORTED_SKILLS = [
|
|
7
|
+
'multi-model-agent',
|
|
8
|
+
'mma-delegate',
|
|
9
|
+
'mma-audit',
|
|
10
|
+
'mma-review',
|
|
11
|
+
'mma-verify',
|
|
12
|
+
'mma-debug',
|
|
13
|
+
'mma-execute-plan',
|
|
14
|
+
'mma-retry',
|
|
15
|
+
'mma-context-blocks',
|
|
16
|
+
'mma-clarifications',
|
|
17
|
+
];
|
|
18
|
+
/** Thrown when a skill's SKILL.md cannot be read from the bundled skills directory. */
|
|
19
|
+
export class SkillNotFoundError extends Error {
|
|
20
|
+
code = 'skill_not_found';
|
|
21
|
+
constructor(skillName, checkedPath) {
|
|
22
|
+
super(`Skill '${skillName}' not found. ` +
|
|
23
|
+
`Checked: ${checkedPath}. ` +
|
|
24
|
+
`Available skills: ${SUPPORTED_SKILLS.join(', ')}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const DEFAULT_SKILLS_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', 'skills');
|
|
28
|
+
/**
|
|
29
|
+
* Return the absolute path to the skills root directory. Production: the
|
|
30
|
+
* bundled `packages/server/src/skills/` (or its dist mirror). Tests pass
|
|
31
|
+
* a fixture path explicitly.
|
|
32
|
+
*/
|
|
33
|
+
export function getSkillsRoot(skillsRoot) {
|
|
34
|
+
return skillsRoot ?? DEFAULT_SKILLS_ROOT;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Read the content of a skill's SKILL.md file. Returns null if the file
|
|
38
|
+
* does not exist; propagates other I/O errors so callers can distinguish
|
|
39
|
+
* "skill not found" from "can't access skill".
|
|
40
|
+
*/
|
|
41
|
+
export function readSkillContent(skillName, skillsRoot) {
|
|
42
|
+
const skillFile = path.join(getSkillsRoot(skillsRoot), skillName, 'SKILL.md');
|
|
43
|
+
try {
|
|
44
|
+
return fs.readFileSync(skillFile, 'utf-8');
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
if (err.code === 'ENOENT')
|
|
48
|
+
return null;
|
|
49
|
+
throw err;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=discover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/install/discover.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,+DAA+D;AAC/D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,mBAAmB;IACnB,cAAc;IACd,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,kBAAkB;IAClB,WAAW;IACX,oBAAoB;IACpB,oBAAoB;CACZ,CAAC;AAEX,uFAAuF;AACvF,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,GAAG,iBAA0B,CAAC;IAC3C,YAAY,SAAiB,EAAE,WAAmB;QAChD,KAAK,CACH,UAAU,SAAS,eAAe;YAClC,YAAY,WAAW,IAAI;YAC3B,qBAAqB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnD,CAAC;IACJ,CAAC;CACF;AAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CACtC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAC5C,IAAI,EACJ,QAAQ,CACT,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,UAAmB;IAC/C,OAAO,UAAU,IAAI,mBAAmB,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,UAAmB;IACrE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC9E,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Client } from './manifest.js';
|
|
2
|
+
/** Thrown when a passed `--target` value is not a known client. */
|
|
3
|
+
export declare class UnknownTargetError extends Error {
|
|
4
|
+
readonly code: "unknown_target";
|
|
5
|
+
constructor(target: string, valid: readonly Client[]);
|
|
6
|
+
}
|
|
7
|
+
/** Dispatch a write to the appropriate per-client installer. */
|
|
8
|
+
export declare function writeSkillToClient(skillName: string, content: string, target: Client, homeDir: string, skillsRoot: string, version?: string, cwd?: string, force?: boolean): void;
|
|
9
|
+
/** Dispatch an uninstall to the appropriate per-client remover. */
|
|
10
|
+
export declare function removeSkillFromClient(skillName: string, target: Client, homeDir: string, cwd?: string): void;
|
|
11
|
+
//# sourceMappingURL=manifest-resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-resolve.d.ts","sourceRoot":"","sources":["../../src/install/manifest-resolve.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAM5C,mEAAmE;AACnE,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAG,gBAAgB,CAAU;gBAC9B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE;CAGrD;AAED,gEAAgE;AAChE,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,MAAgB,EACzB,GAAG,GAAE,MAAsB,EAC3B,KAAK,GAAE,OAAe,GACrB,IAAI,CAmBN;AAED,mEAAmE;AACnE,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,MAAsB,GAC1B,IAAI,CAmBN"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { installClaudeCode, uninstallClaudeCode } from './claude-code.js';
|
|
2
|
+
import { installGeminiCli, uninstallGeminiCli } from './gemini-cli.js';
|
|
3
|
+
import { installCodexCli, uninstallCodexCli } from './codex-cli.js';
|
|
4
|
+
import { installCursor, uninstallCursor } from './cursor.js';
|
|
5
|
+
/** Thrown when a passed `--target` value is not a known client. */
|
|
6
|
+
export class UnknownTargetError extends Error {
|
|
7
|
+
code = 'unknown_target';
|
|
8
|
+
constructor(target, valid) {
|
|
9
|
+
super(`Unknown target: ${target}. Valid: ${valid.join(', ')}`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** Dispatch a write to the appropriate per-client installer. */
|
|
13
|
+
export function writeSkillToClient(skillName, content, target, homeDir, skillsRoot, version = '0.0.0', cwd = process.cwd(), force = false) {
|
|
14
|
+
switch (target) {
|
|
15
|
+
case 'claude-code':
|
|
16
|
+
installClaudeCode({ skillName, content, homeDir, skillsRoot });
|
|
17
|
+
break;
|
|
18
|
+
case 'gemini':
|
|
19
|
+
installGeminiCli({ skillName, content, skillVersion: version, homeDir, skillsRoot });
|
|
20
|
+
break;
|
|
21
|
+
case 'codex':
|
|
22
|
+
installCodexCli({ skillName, content, homeDir, skillsRoot });
|
|
23
|
+
break;
|
|
24
|
+
case 'cursor':
|
|
25
|
+
installCursor({ content, cwd, homeDir, skillsRoot, force });
|
|
26
|
+
break;
|
|
27
|
+
default: {
|
|
28
|
+
const _exhaustive = target;
|
|
29
|
+
throw new Error(`install-skill: unknown target: ${_exhaustive}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** Dispatch an uninstall to the appropriate per-client remover. */
|
|
34
|
+
export function removeSkillFromClient(skillName, target, homeDir, cwd = process.cwd()) {
|
|
35
|
+
switch (target) {
|
|
36
|
+
case 'claude-code':
|
|
37
|
+
uninstallClaudeCode(skillName, homeDir);
|
|
38
|
+
break;
|
|
39
|
+
case 'gemini':
|
|
40
|
+
uninstallGeminiCli(homeDir);
|
|
41
|
+
break;
|
|
42
|
+
case 'codex':
|
|
43
|
+
uninstallCodexCli(homeDir);
|
|
44
|
+
break;
|
|
45
|
+
case 'cursor':
|
|
46
|
+
uninstallCursor(cwd);
|
|
47
|
+
break;
|
|
48
|
+
default: {
|
|
49
|
+
const _exhaustive = target;
|
|
50
|
+
throw new Error(`install-skill: unknown target: ${_exhaustive}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=manifest-resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-resolve.js","sourceRoot":"","sources":["../../src/install/manifest-resolve.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7D,mEAAmE;AACnE,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,GAAG,gBAAyB,CAAC;IAC1C,YAAY,MAAc,EAAE,KAAwB;QAClD,KAAK,CAAC,mBAAmB,MAAM,YAAY,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;CACF;AAED,gEAAgE;AAChE,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,OAAe,EACf,MAAc,EACd,OAAe,EACf,UAAkB,EAClB,UAAkB,OAAO,EACzB,MAAc,OAAO,CAAC,GAAG,EAAE,EAC3B,QAAiB,KAAK;IAEtB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,aAAa;YAChB,iBAAiB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;YAC/D,MAAM;QACR,KAAK,QAAQ;YACX,gBAAgB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;YACrF,MAAM;QACR,KAAK,OAAO;YACV,eAAe,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;YAC7D,MAAM;QACR,KAAK,QAAQ;YACX,aAAa,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5D,MAAM;QACR,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,MAAM,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,kCAAkC,WAAqB,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,qBAAqB,CACnC,SAAiB,EACjB,MAAc,EACd,OAAe,EACf,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,aAAa;YAChB,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACxC,MAAM;QACR,KAAK,QAAQ;YACX,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM;QACR,KAAK,OAAO;YACV,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC3B,MAAM;QACR,KAAK,QAAQ;YACX,eAAe,CAAC,GAAG,CAAC,CAAC;YACrB,MAAM;QACR,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,MAAM,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,kCAAkC,WAAqB,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Client } from './manifest.js';
|
|
2
|
+
export interface InstallResult {
|
|
3
|
+
skill: string;
|
|
4
|
+
action: 'installed' | 'uninstalled';
|
|
5
|
+
/** Targets for which the operation succeeded. */
|
|
6
|
+
targets: Client[];
|
|
7
|
+
/** Targets that were skipped (dry-run, unknown, or not applicable). */
|
|
8
|
+
skipped: Client[];
|
|
9
|
+
/** Files would be written but were not (dry-run mode). */
|
|
10
|
+
dryRun: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Install a skill to the specified client targets.
|
|
14
|
+
* - dryRun=true: checks skill existence; does NOT write files or update manifest.
|
|
15
|
+
* - dryRun=false: writes files via the per-client writers.
|
|
16
|
+
*/
|
|
17
|
+
export declare function doInstall(skillName: string, targets: Client[], opts: {
|
|
18
|
+
dryRun: boolean;
|
|
19
|
+
homeDir: string;
|
|
20
|
+
skillsRoot?: string;
|
|
21
|
+
version?: string;
|
|
22
|
+
cwd?: string;
|
|
23
|
+
force?: boolean;
|
|
24
|
+
}): InstallResult;
|
|
25
|
+
/**
|
|
26
|
+
* Uninstall a skill from the specified client targets.
|
|
27
|
+
* - dryRun=true: resolves targets; does NOT remove files or update manifest.
|
|
28
|
+
* - dryRun=false: removes files via the per-client removers.
|
|
29
|
+
*/
|
|
30
|
+
export declare function doUninstall(skillName: string, targets: Client[], opts: {
|
|
31
|
+
dryRun: boolean;
|
|
32
|
+
homeDir: string;
|
|
33
|
+
cwd?: string;
|
|
34
|
+
}): InstallResult;
|
|
35
|
+
//# sourceMappingURL=orchestrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrate.d.ts","sourceRoot":"","sources":["../../src/install/orchestrate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAI5C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,GAAG,aAAa,CAAC;IACpC,iDAAiD;IACjD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,uEAAuE;IACvE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0DAA0D;IAC1D,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE;IACJ,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GACA,aAAa,CAwBf;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACvD,aAAa,CAef"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// Install/uninstall orchestration. Pure logic — no CLI/argv handling.
|
|
2
|
+
// Extracted from cli/install-skill.ts as part of Ch 7 Task 39.
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { SkillNotFoundError, getSkillsRoot, readSkillContent } from './discover.js';
|
|
5
|
+
import { writeSkillToClient, removeSkillFromClient } from './manifest-resolve.js';
|
|
6
|
+
/**
|
|
7
|
+
* Install a skill to the specified client targets.
|
|
8
|
+
* - dryRun=true: checks skill existence; does NOT write files or update manifest.
|
|
9
|
+
* - dryRun=false: writes files via the per-client writers.
|
|
10
|
+
*/
|
|
11
|
+
export function doInstall(skillName, targets, opts) {
|
|
12
|
+
const checkedPath = path.join(getSkillsRoot(opts.skillsRoot), skillName, 'SKILL.md');
|
|
13
|
+
const content = readSkillContent(skillName, opts.skillsRoot);
|
|
14
|
+
if (!content) {
|
|
15
|
+
throw new SkillNotFoundError(skillName, checkedPath);
|
|
16
|
+
}
|
|
17
|
+
const skillsRoot = getSkillsRoot(opts.skillsRoot);
|
|
18
|
+
const version = opts.version ?? '0.0.0';
|
|
19
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
20
|
+
const installed = [];
|
|
21
|
+
const skipped = [];
|
|
22
|
+
for (const target of targets) {
|
|
23
|
+
if (opts.dryRun) {
|
|
24
|
+
skipped.push(target);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
writeSkillToClient(skillName, content, target, opts.homeDir, skillsRoot, version, cwd, opts.force);
|
|
28
|
+
installed.push(target);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return { skill: skillName, action: 'installed', targets: installed, skipped, dryRun: opts.dryRun };
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Uninstall a skill from the specified client targets.
|
|
35
|
+
* - dryRun=true: resolves targets; does NOT remove files or update manifest.
|
|
36
|
+
* - dryRun=false: removes files via the per-client removers.
|
|
37
|
+
*/
|
|
38
|
+
export function doUninstall(skillName, targets, opts) {
|
|
39
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
40
|
+
const installed = [];
|
|
41
|
+
const skipped = [];
|
|
42
|
+
for (const target of targets) {
|
|
43
|
+
if (opts.dryRun) {
|
|
44
|
+
skipped.push(target);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
removeSkillFromClient(skillName, target, opts.homeDir, cwd);
|
|
48
|
+
installed.push(target);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return { skill: skillName, action: 'uninstalled', targets: installed, skipped, dryRun: opts.dryRun };
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=orchestrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrate.js","sourceRoot":"","sources":["../../src/install/orchestrate.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,+DAA+D;AAC/D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAalF;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACvB,SAAiB,EACjB,OAAiB,EACjB,IAOC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACrF,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEtC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACnG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACrG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,SAAiB,EACjB,OAAiB,EACjB,IAAwD;IAExD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC5D,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACvG,CAAC"}
|
package/dist/openapi.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"AAgDA,qEAAqE;AACrE,QAAA,MAAM,aAAa;;;;;;;;CAMlB,CAAC;
|
|
1
|
+
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"AAgDA,qEAAqE;AACrE,QAAA,MAAM,aAAa;;;;;;;;CAMlB,CAAC;AA+CF,wBAAgB,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyIzD;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAExE;AAGD,OAAO,EAAE,aAAa,EAAE,CAAC"}
|