@qodalis/cli-server-node 1.0.0-beta.1 → 1.0.0-beta.10
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 +1 -1
- package/README.md +348 -74
- package/dist/package.json +77 -0
- package/dist/src/abstractions/cli-command-author.d.ts +2 -0
- package/dist/src/abstractions/cli-command-author.d.ts.map +1 -0
- package/dist/src/abstractions/cli-command-author.js +7 -0
- package/dist/src/abstractions/cli-command-author.js.map +1 -0
- package/dist/src/abstractions/cli-command-parameter-descriptor.d.ts +2 -0
- package/dist/src/abstractions/cli-command-parameter-descriptor.d.ts.map +1 -0
- package/dist/src/abstractions/cli-command-parameter-descriptor.js +6 -0
- package/dist/src/abstractions/cli-command-parameter-descriptor.js.map +1 -0
- package/dist/src/abstractions/cli-command-processor.d.ts +2 -0
- package/dist/src/abstractions/cli-command-processor.d.ts.map +1 -0
- package/dist/src/abstractions/cli-command-processor.js +6 -0
- package/dist/src/abstractions/cli-command-processor.js.map +1 -0
- package/dist/src/abstractions/cli-process-command.d.ts +2 -0
- package/dist/src/abstractions/cli-process-command.d.ts.map +1 -0
- package/dist/src/abstractions/cli-process-command.js.map +1 -0
- package/dist/src/abstractions/index.d.ts +2 -0
- package/dist/src/abstractions/index.d.ts.map +1 -0
- package/dist/src/abstractions/index.js +18 -0
- package/dist/src/abstractions/index.js.map +1 -0
- package/dist/src/auth/cli-server-auth-gate.d.ts +33 -0
- package/dist/src/auth/cli-server-auth-gate.d.ts.map +1 -0
- package/dist/src/auth/cli-server-auth-gate.js +121 -0
- package/dist/src/auth/cli-server-auth-gate.js.map +1 -0
- package/dist/src/auth/cli-server-auth.d.ts +149 -0
- package/dist/src/auth/cli-server-auth.d.ts.map +1 -0
- package/dist/src/auth/cli-server-auth.js +143 -0
- package/dist/src/auth/cli-server-auth.js.map +1 -0
- package/dist/src/auth/index.d.ts +4 -0
- package/dist/src/auth/index.d.ts.map +1 -0
- package/dist/src/auth/index.js +19 -0
- package/dist/src/auth/index.js.map +1 -0
- package/dist/src/auth/ws-upgrade-auth.d.ts +30 -0
- package/dist/src/auth/ws-upgrade-auth.d.ts.map +1 -0
- package/dist/src/auth/ws-upgrade-auth.js +49 -0
- package/dist/src/auth/ws-upgrade-auth.js.map +1 -0
- package/dist/src/controllers/cli-controller.d.ts +11 -0
- package/dist/src/controllers/cli-controller.d.ts.map +1 -0
- package/dist/src/controllers/cli-controller.js +169 -0
- package/dist/src/controllers/cli-controller.js.map +1 -0
- package/dist/src/controllers/cli-version-controller.d.ts +18 -0
- package/dist/src/controllers/cli-version-controller.d.ts.map +1 -0
- package/dist/src/controllers/cli-version-controller.js +81 -0
- package/dist/src/controllers/cli-version-controller.js.map +1 -0
- package/dist/src/controllers/filesystem-controller.d.ts +9 -0
- package/dist/src/controllers/filesystem-controller.d.ts.map +1 -0
- package/dist/src/controllers/filesystem-controller.js +243 -0
- package/dist/src/controllers/filesystem-controller.js.map +1 -0
- package/dist/src/create-cli-server.d.ts +123 -0
- package/dist/src/create-cli-server.d.ts.map +1 -0
- package/dist/src/create-cli-server.js +201 -0
- package/dist/src/create-cli-server.js.map +1 -0
- package/dist/src/extensions/cli-builder.d.ts +54 -0
- package/dist/src/extensions/cli-builder.d.ts.map +1 -0
- package/dist/src/extensions/cli-builder.js +97 -0
- package/dist/src/extensions/cli-builder.js.map +1 -0
- package/dist/src/extensions/index.d.ts.map +1 -0
- package/dist/src/extensions/index.js.map +1 -0
- package/dist/src/filesystem/filesystem-options.d.ts +16 -0
- package/dist/src/filesystem/filesystem-options.d.ts.map +1 -0
- package/dist/src/filesystem/filesystem-options.js +6 -0
- package/dist/src/filesystem/filesystem-options.js.map +1 -0
- package/dist/src/filesystem/filesystem-path-validator.d.ts +15 -0
- package/dist/src/filesystem/filesystem-path-validator.d.ts.map +1 -0
- package/dist/src/filesystem/filesystem-path-validator.js +72 -0
- package/dist/src/filesystem/filesystem-path-validator.js.map +1 -0
- package/dist/src/filesystem/index.d.ts +3 -0
- package/dist/src/filesystem/index.d.ts.map +1 -0
- package/dist/src/filesystem/index.js +8 -0
- package/dist/src/filesystem/index.js.map +1 -0
- package/dist/src/index.d.ts +24 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +121 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mcp/index.d.ts +10 -0
- package/dist/src/mcp/index.d.ts.map +1 -0
- package/dist/src/mcp/index.js +34 -0
- package/dist/src/mcp/index.js.map +1 -0
- package/dist/src/mcp/mcp-controller.d.ts +54 -0
- package/dist/src/mcp/mcp-controller.d.ts.map +1 -0
- package/dist/src/mcp/mcp-controller.js +358 -0
- package/dist/src/mcp/mcp-controller.js.map +1 -0
- package/dist/src/mcp/mcp-render.d.ts +10 -0
- package/dist/src/mcp/mcp-render.d.ts.map +1 -0
- package/dist/src/mcp/mcp-render.js +66 -0
- package/dist/src/mcp/mcp-render.js.map +1 -0
- package/dist/src/mcp/mcp-schema.d.ts +8 -0
- package/dist/src/mcp/mcp-schema.d.ts.map +1 -0
- package/dist/src/mcp/mcp-schema.js +64 -0
- package/dist/src/mcp/mcp-schema.js.map +1 -0
- package/dist/src/mcp/mcp-types.d.ts +70 -0
- package/dist/src/mcp/mcp-types.d.ts.map +1 -0
- package/dist/src/mcp/mcp-types.js +21 -0
- package/dist/src/mcp/mcp-types.js.map +1 -0
- package/dist/src/mcp/providers/commands-provider.d.ts +30 -0
- package/dist/src/mcp/providers/commands-provider.d.ts.map +1 -0
- package/dist/src/mcp/providers/commands-provider.js +145 -0
- package/dist/src/mcp/providers/commands-provider.js.map +1 -0
- package/dist/src/mcp/providers/data-explorer-provider.d.ts +15 -0
- package/dist/src/mcp/providers/data-explorer-provider.d.ts.map +1 -0
- package/dist/src/mcp/providers/data-explorer-provider.js +83 -0
- package/dist/src/mcp/providers/data-explorer-provider.js.map +1 -0
- package/dist/src/mcp/providers/filesystem-provider.d.ts +15 -0
- package/dist/src/mcp/providers/filesystem-provider.d.ts.map +1 -0
- package/dist/src/mcp/providers/filesystem-provider.js +166 -0
- package/dist/src/mcp/providers/filesystem-provider.js.map +1 -0
- package/dist/src/mcp/providers/jobs-provider.d.ts +23 -0
- package/dist/src/mcp/providers/jobs-provider.d.ts.map +1 -0
- package/dist/src/mcp/providers/jobs-provider.js +121 -0
- package/dist/src/mcp/providers/jobs-provider.js.map +1 -0
- package/dist/src/mcp/providers/server-provider.d.ts +19 -0
- package/dist/src/mcp/providers/server-provider.d.ts.map +1 -0
- package/dist/src/mcp/providers/server-provider.js +73 -0
- package/dist/src/mcp/providers/server-provider.js.map +1 -0
- package/dist/{models → src/models}/cli-server-command-descriptor.d.ts +2 -0
- package/dist/src/models/cli-server-command-descriptor.d.ts.map +1 -0
- package/dist/src/models/cli-server-command-descriptor.js.map +1 -0
- package/dist/src/models/cli-server-output.d.ts +2 -0
- package/dist/src/models/cli-server-output.d.ts.map +1 -0
- package/dist/src/models/cli-server-output.js.map +1 -0
- package/dist/src/models/cli-server-response.d.ts +2 -0
- package/dist/src/models/cli-server-response.d.ts.map +1 -0
- package/dist/src/models/cli-server-response.js.map +1 -0
- package/dist/src/models/index.d.ts.map +1 -0
- package/dist/{models → src/models}/index.js.map +1 -1
- package/dist/{processors → src/processors}/cli-base64-command-processor.d.ts +1 -0
- package/dist/src/processors/cli-base64-command-processor.d.ts.map +1 -0
- package/dist/{processors → src/processors}/cli-base64-command-processor.js +8 -2
- package/dist/src/processors/cli-base64-command-processor.js.map +1 -0
- package/dist/{processors → src/processors}/cli-echo-command-processor.d.ts +2 -0
- package/dist/src/processors/cli-echo-command-processor.d.ts.map +1 -0
- package/dist/src/processors/cli-echo-command-processor.js +20 -0
- package/dist/src/processors/cli-echo-command-processor.js.map +1 -0
- package/dist/{processors → src/processors}/cli-hash-command-processor.d.ts +2 -0
- package/dist/src/processors/cli-hash-command-processor.d.ts.map +1 -0
- package/dist/{processors → src/processors}/cli-hash-command-processor.js +4 -1
- package/dist/src/processors/cli-hash-command-processor.js.map +1 -0
- package/dist/{processors → src/processors}/cli-http-command-processor.d.ts +1 -0
- package/dist/src/processors/cli-http-command-processor.d.ts.map +1 -0
- package/dist/src/processors/cli-http-command-processor.js +161 -0
- package/dist/src/processors/cli-http-command-processor.js.map +1 -0
- package/dist/{processors → src/processors}/cli-status-command-processor.d.ts +1 -0
- package/dist/src/processors/cli-status-command-processor.d.ts.map +1 -0
- package/dist/{processors → src/processors}/cli-status-command-processor.js +1 -0
- package/dist/src/processors/cli-status-command-processor.js.map +1 -0
- package/dist/{processors → src/processors}/cli-system-command-processor.d.ts +1 -0
- package/dist/src/processors/cli-system-command-processor.d.ts.map +1 -0
- package/dist/{processors → src/processors}/cli-system-command-processor.js +1 -0
- package/dist/src/processors/cli-system-command-processor.js.map +1 -0
- package/dist/{processors → src/processors}/index.d.ts +1 -2
- package/dist/src/processors/index.d.ts.map +1 -0
- package/dist/{processors → src/processors}/index.js +2 -3
- package/dist/src/processors/index.js.map +1 -0
- package/dist/{server.d.ts.map → src/server.d.ts.map} +1 -1
- package/dist/{server.js → src/server.js} +22 -7
- package/dist/src/server.js.map +1 -0
- package/dist/src/services/cli-command-executor-service.d.ts +33 -0
- package/dist/src/services/cli-command-executor-service.d.ts.map +1 -0
- package/dist/src/services/cli-command-executor-service.js +77 -0
- package/dist/src/services/cli-command-executor-service.js.map +1 -0
- package/dist/src/services/cli-command-registry.d.ts +25 -0
- package/dist/src/services/cli-command-registry.d.ts.map +1 -0
- package/dist/{services → src/services}/cli-command-registry.js +5 -0
- package/dist/src/services/cli-command-registry.js.map +1 -0
- package/dist/src/services/cli-event-socket-manager.d.ts +77 -0
- package/dist/src/services/cli-event-socket-manager.d.ts.map +1 -0
- package/dist/src/services/cli-event-socket-manager.js +246 -0
- package/dist/src/services/cli-event-socket-manager.js.map +1 -0
- package/dist/src/services/cli-log-socket-manager.d.ts +67 -0
- package/dist/src/services/cli-log-socket-manager.d.ts.map +1 -0
- package/dist/src/services/cli-log-socket-manager.js +225 -0
- package/dist/src/services/cli-log-socket-manager.js.map +1 -0
- package/dist/{services → src/services}/cli-response-builder.d.ts +9 -0
- package/dist/src/services/cli-response-builder.d.ts.map +1 -0
- package/dist/{services → src/services}/cli-response-builder.js +1 -0
- package/dist/src/services/cli-response-builder.js.map +1 -0
- package/dist/src/services/cli-shell-options.d.ts +107 -0
- package/dist/src/services/cli-shell-options.d.ts.map +1 -0
- package/dist/src/services/cli-shell-options.js +139 -0
- package/dist/src/services/cli-shell-options.js.map +1 -0
- package/dist/src/services/cli-shell-session-manager.d.ts +92 -0
- package/dist/src/services/cli-shell-session-manager.d.ts.map +1 -0
- package/dist/src/services/cli-shell-session-manager.js +588 -0
- package/dist/src/services/cli-shell-session-manager.js.map +1 -0
- package/dist/src/services/index.d.ts +8 -0
- package/dist/src/services/index.d.ts.map +1 -0
- package/dist/src/services/index.js +20 -0
- package/dist/src/services/index.js.map +1 -0
- package/dist/src/services/process-tree.d.ts +38 -0
- package/dist/src/services/process-tree.d.ts.map +1 -0
- package/dist/src/services/process-tree.js +249 -0
- package/dist/src/services/process-tree.js.map +1 -0
- package/dist/src/services/session-bound-sockets.d.ts +45 -0
- package/dist/src/services/session-bound-sockets.d.ts.map +1 -0
- package/dist/src/services/session-bound-sockets.js +129 -0
- package/dist/src/services/session-bound-sockets.js.map +1 -0
- package/dist/src/utils/logger.d.ts +11 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +13 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/package.json +37 -8
- package/dist/abstractions/cli-command-author.d.ts +0 -11
- package/dist/abstractions/cli-command-author.d.ts.map +0 -1
- package/dist/abstractions/cli-command-author.js +0 -14
- package/dist/abstractions/cli-command-author.js.map +0 -1
- package/dist/abstractions/cli-command-parameter-descriptor.d.ts +0 -18
- package/dist/abstractions/cli-command-parameter-descriptor.d.ts.map +0 -1
- package/dist/abstractions/cli-command-parameter-descriptor.js +0 -21
- package/dist/abstractions/cli-command-parameter-descriptor.js.map +0 -1
- package/dist/abstractions/cli-command-processor.d.ts +0 -26
- package/dist/abstractions/cli-command-processor.d.ts.map +0 -1
- package/dist/abstractions/cli-command-processor.js +0 -14
- package/dist/abstractions/cli-command-processor.js.map +0 -1
- package/dist/abstractions/cli-process-command.d.ts +0 -9
- package/dist/abstractions/cli-process-command.d.ts.map +0 -1
- package/dist/abstractions/cli-process-command.js.map +0 -1
- package/dist/abstractions/index.d.ts +0 -5
- package/dist/abstractions/index.d.ts.map +0 -1
- package/dist/abstractions/index.js +0 -11
- package/dist/abstractions/index.js.map +0 -1
- package/dist/controllers/cli-controller.d.ts +0 -4
- package/dist/controllers/cli-controller.d.ts.map +0 -1
- package/dist/controllers/cli-controller.js +0 -42
- package/dist/controllers/cli-controller.js.map +0 -1
- package/dist/create-cli-server.d.ts +0 -25
- package/dist/create-cli-server.d.ts.map +0 -1
- package/dist/create-cli-server.js +0 -35
- package/dist/create-cli-server.js.map +0 -1
- package/dist/extensions/cli-builder.d.ts +0 -9
- package/dist/extensions/cli-builder.d.ts.map +0 -1
- package/dist/extensions/cli-builder.js +0 -18
- package/dist/extensions/cli-builder.js.map +0 -1
- package/dist/extensions/index.d.ts.map +0 -1
- package/dist/extensions/index.js.map +0 -1
- package/dist/index.d.ts +0 -14
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -40
- package/dist/index.js.map +0 -1
- package/dist/models/cli-server-command-descriptor.d.ts.map +0 -1
- package/dist/models/cli-server-command-descriptor.js.map +0 -1
- package/dist/models/cli-server-output.d.ts +0 -23
- package/dist/models/cli-server-output.d.ts.map +0 -1
- package/dist/models/cli-server-output.js.map +0 -1
- package/dist/models/cli-server-response.d.ts +0 -6
- package/dist/models/cli-server-response.d.ts.map +0 -1
- package/dist/models/cli-server-response.js.map +0 -1
- package/dist/models/index.d.ts.map +0 -1
- package/dist/processors/cli-base64-command-processor.d.ts.map +0 -1
- package/dist/processors/cli-base64-command-processor.js.map +0 -1
- package/dist/processors/cli-echo-command-processor.d.ts.map +0 -1
- package/dist/processors/cli-echo-command-processor.js +0 -14
- package/dist/processors/cli-echo-command-processor.js.map +0 -1
- package/dist/processors/cli-hash-command-processor.d.ts.map +0 -1
- package/dist/processors/cli-hash-command-processor.js.map +0 -1
- package/dist/processors/cli-http-command-processor.d.ts.map +0 -1
- package/dist/processors/cli-http-command-processor.js +0 -79
- package/dist/processors/cli-http-command-processor.js.map +0 -1
- package/dist/processors/cli-status-command-processor.d.ts.map +0 -1
- package/dist/processors/cli-status-command-processor.js.map +0 -1
- package/dist/processors/cli-system-command-processor.d.ts.map +0 -1
- package/dist/processors/cli-system-command-processor.js.map +0 -1
- package/dist/processors/cli-uuid-command-processor.d.ts +0 -10
- package/dist/processors/cli-uuid-command-processor.d.ts.map +0 -1
- package/dist/processors/cli-uuid-command-processor.js +0 -27
- package/dist/processors/cli-uuid-command-processor.js.map +0 -1
- package/dist/processors/index.d.ts.map +0 -1
- package/dist/processors/index.js.map +0 -1
- package/dist/server.js.map +0 -1
- package/dist/services/cli-command-executor-service.d.ts +0 -12
- package/dist/services/cli-command-executor-service.d.ts.map +0 -1
- package/dist/services/cli-command-executor-service.js +0 -45
- package/dist/services/cli-command-executor-service.js.map +0 -1
- package/dist/services/cli-command-registry.d.ts +0 -14
- package/dist/services/cli-command-registry.d.ts.map +0 -1
- package/dist/services/cli-command-registry.js.map +0 -1
- package/dist/services/cli-event-socket-manager.d.ts +0 -15
- package/dist/services/cli-event-socket-manager.d.ts.map +0 -1
- package/dist/services/cli-event-socket-manager.js +0 -60
- package/dist/services/cli-event-socket-manager.js.map +0 -1
- package/dist/services/cli-response-builder.d.ts.map +0 -1
- package/dist/services/cli-response-builder.js.map +0 -1
- package/dist/services/index.d.ts +0 -5
- package/dist/services/index.d.ts.map +0 -1
- package/dist/services/index.js +0 -12
- package/dist/services/index.js.map +0 -1
- /package/dist/{abstractions → src/abstractions}/cli-process-command.js +0 -0
- /package/dist/{extensions → src/extensions}/index.d.ts +0 -0
- /package/dist/{extensions → src/extensions}/index.js +0 -0
- /package/dist/{models → src/models}/cli-server-command-descriptor.js +0 -0
- /package/dist/{models → src/models}/cli-server-output.js +0 -0
- /package/dist/{models → src/models}/cli-server-response.js +0 -0
- /package/dist/{models → src/models}/index.d.ts +0 -0
- /package/dist/{models → src/models}/index.js +0 -0
- /package/dist/{server.d.ts → src/server.d.ts} +0 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { Express, Router } from 'express';
|
|
2
|
+
import cors from 'cors';
|
|
3
|
+
import { CliCommandRegistry, CliCommandExecutorService, CliEventSocketManager, CliLogSocketManager } from './services';
|
|
4
|
+
import { CliBuilder } from './extensions';
|
|
5
|
+
import { ICliServerAuth } from './auth/cli-server-auth';
|
|
6
|
+
import { CliShellOptions } from './services/cli-shell-options';
|
|
7
|
+
import { CliMcpOptions, McpToolProvider } from './mcp';
|
|
8
|
+
/**
|
|
9
|
+
* Generic interface for plugin results that can be auto-mounted.
|
|
10
|
+
* Plugins expose a `prefix` and `router`; some also have a
|
|
11
|
+
* `dashboardPrefix` / `dashboardRouter` pair.
|
|
12
|
+
*/
|
|
13
|
+
export interface MountablePlugin {
|
|
14
|
+
prefix: string;
|
|
15
|
+
router: Router;
|
|
16
|
+
dashboardPrefix?: string;
|
|
17
|
+
dashboardRouter?: Router;
|
|
18
|
+
/**
|
|
19
|
+
* Auth provider exposed by the users plugin. Mounting such a plugin
|
|
20
|
+
* installs it: when `protectServer` is on, every server route and socket
|
|
21
|
+
* then requires a users session.
|
|
22
|
+
*/
|
|
23
|
+
serverAuth?: ICliServerAuth;
|
|
24
|
+
/** Routes that stay public under server protection, as `"METHOD /path"` (e.g. a plugin's login). */
|
|
25
|
+
publicRoutes?: string[];
|
|
26
|
+
/** MCP tool providers contributed by the plugin (used when the `mcp` option is on). */
|
|
27
|
+
mcpProviders?: McpToolProvider[];
|
|
28
|
+
/** Job scheduler (the jobs plugin): enables the `jobs_*` MCP tools. */
|
|
29
|
+
scheduler?: unknown;
|
|
30
|
+
}
|
|
31
|
+
/** MCP extension point of a server instance. */
|
|
32
|
+
export interface CliServerMcp {
|
|
33
|
+
/** True when the MCP endpoint is enabled. */
|
|
34
|
+
readonly enabled: boolean;
|
|
35
|
+
/** The endpoint path (`{basePath}/mcp`). */
|
|
36
|
+
readonly path: string;
|
|
37
|
+
/**
|
|
38
|
+
* Registers a tool provider. On a name collision built-in feature tools win,
|
|
39
|
+
* then providers in registration order, then command tools.
|
|
40
|
+
*/
|
|
41
|
+
addProvider(provider: McpToolProvider): void;
|
|
42
|
+
}
|
|
43
|
+
/** Options for creating a standalone CLI server instance. */
|
|
44
|
+
export interface CliServerOptions {
|
|
45
|
+
/** Base path for CLI routes. Defaults to '/api/qcli'. */
|
|
46
|
+
basePath?: string;
|
|
47
|
+
/**
|
|
48
|
+
* CORS configuration. `true` = permissive (any origin, no credentials),
|
|
49
|
+
* `false` = disabled, or a cors options object. When omitted, CORS is
|
|
50
|
+
* enabled only for `allowedOrigins` (disabled if none are set).
|
|
51
|
+
*/
|
|
52
|
+
cors?: boolean | cors.CorsOptions;
|
|
53
|
+
/**
|
|
54
|
+
* Origins allowed for CORS and WebSocket upgrades (exact match; `http://host:*`
|
|
55
|
+
* matches any port). Every WS upgrade with an `Origin` header is checked.
|
|
56
|
+
*/
|
|
57
|
+
allowedOrigins?: string[];
|
|
58
|
+
/**
|
|
59
|
+
* Accept interactive shell WebSocket sessions (default false). When enabled,
|
|
60
|
+
* access is decided by one mode: users plugin mounted (ticket +
|
|
61
|
+
* `shell:execute`), `shell.token`, `shell.authorize` or `shell.allowAnonymous`.
|
|
62
|
+
* With none of them the shell is locked (every connection closed with 4401).
|
|
63
|
+
*/
|
|
64
|
+
enableShell?: boolean;
|
|
65
|
+
/** Remote shell security: access mode, limits, timeouts, cwd, shell binary, environment. */
|
|
66
|
+
shell?: CliShellOptions;
|
|
67
|
+
/**
|
|
68
|
+
* Behind reverse proxies: the number of trusted proxy hops (`true` = 1,
|
|
69
|
+
* `false`/0 = none, the default). The client IP (Express `req.ip`, the
|
|
70
|
+
* shell's per-address limits) is the `X-Forwarded-For` entry at index
|
|
71
|
+
* `len - hops` (with one hop, the rightmost entry, appended by the trusted
|
|
72
|
+
* proxy); the leftmost entry when the list is shorter, the socket address
|
|
73
|
+
* when the header is absent. `X-Forwarded-Proto`/`-Host` are honoured too.
|
|
74
|
+
*/
|
|
75
|
+
trustProxy?: boolean | number;
|
|
76
|
+
/**
|
|
77
|
+
* Auth provider protecting the whole server (e.g. `usersPlugin.serverAuth`).
|
|
78
|
+
* Can also be installed later with `setAuth()` or by `mountPlugin(usersPlugin)`.
|
|
79
|
+
*/
|
|
80
|
+
auth?: ICliServerAuth;
|
|
81
|
+
/**
|
|
82
|
+
* MCP endpoint (`POST {basePath}/mcp`, off by default): AI clients call the
|
|
83
|
+
* registered commands as MCP tools. `true` enables it with defaults; the object
|
|
84
|
+
* form sets an allow/deny list of tools, a static bearer `token` (only without
|
|
85
|
+
* an auth provider) and `instructions` returned by `initialize`.
|
|
86
|
+
*/
|
|
87
|
+
mcp?: boolean | CliMcpOptions;
|
|
88
|
+
/** Configure processors via the builder. */
|
|
89
|
+
configure?: (builder: CliBuilder) => void;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Creates a fully configured Express app with CLI routes mounted.
|
|
93
|
+
*
|
|
94
|
+
* Use this for standalone server mode. For integration into an existing
|
|
95
|
+
* Express app, use `createCliController` directly instead.
|
|
96
|
+
*/
|
|
97
|
+
export interface CliServerResult {
|
|
98
|
+
app: Express;
|
|
99
|
+
registry: CliCommandRegistry;
|
|
100
|
+
builder: CliBuilder;
|
|
101
|
+
executor: CliCommandExecutorService;
|
|
102
|
+
eventSocketManager: CliEventSocketManager;
|
|
103
|
+
logSocketManager: CliLogSocketManager;
|
|
104
|
+
/**
|
|
105
|
+
* Mount a plugin using its built-in prefix.
|
|
106
|
+
* Reads `prefix` and `router` from the plugin result, and optionally
|
|
107
|
+
* `dashboardPrefix` / `dashboardRouter` for plugins that serve a UI.
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```ts
|
|
111
|
+
* const result = createCliServer();
|
|
112
|
+
* result.mountPlugin(jobsPlugin);
|
|
113
|
+
* result.mountPlugin(adminPlugin);
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
mountPlugin(plugin: MountablePlugin): void;
|
|
117
|
+
/** Installs (or removes) the auth provider protecting server routes and sockets. */
|
|
118
|
+
setAuth(auth: ICliServerAuth | undefined): void;
|
|
119
|
+
/** MCP endpoint: register tool providers (`mcp.addProvider(p)`). */
|
|
120
|
+
mcp: CliServerMcp;
|
|
121
|
+
}
|
|
122
|
+
export declare function createCliServer(options?: CliServerOptions): CliServerResult;
|
|
123
|
+
//# sourceMappingURL=create-cli-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-cli-server.d.ts","sourceRoot":"","sources":["../../src/create-cli-server.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACvH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAO1C,OAAO,EAAE,cAAc,EAAmD,MAAM,wBAAwB,CAAC;AAEzG,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EACH,aAAa,EAKb,eAAe,EAOlB,MAAM,OAAO,CAAC;AAGf;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,oGAAoG;IACpG,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,uFAAuF;IACvF,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;IACjC,uEAAuE;IACvE,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,gDAAgD;AAChD,MAAM,WAAW,YAAY;IACzB,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;CAChD;AAID,6DAA6D;AAC7D,MAAM,WAAW,gBAAgB;IAC7B,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;IAClC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4FAA4F;IAC5F,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B;;;OAGG;IACH,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;IAC9B,4CAA4C;IAC5C,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;CAC7C;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,OAAO,CAAC;IACb,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,yBAAyB,CAAC;IACpC,kBAAkB,EAAE,qBAAqB,CAAC;IAC1C,gBAAgB,EAAE,mBAAmB,CAAC;IACtC;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC3C,oFAAoF;IACpF,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,CAAC;IAChD,oEAAoE;IACpE,GAAG,EAAE,YAAY,CAAC;CACrB;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,eAAe,CAmM/E"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createCliServer = createCliServer;
|
|
7
|
+
const express_1 = __importDefault(require("express"));
|
|
8
|
+
const cors_1 = __importDefault(require("cors"));
|
|
9
|
+
const services_1 = require("./services");
|
|
10
|
+
const extensions_1 = require("./extensions");
|
|
11
|
+
const cli_controller_1 = require("./controllers/cli-controller");
|
|
12
|
+
const cli_version_controller_1 = require("./controllers/cli-version-controller");
|
|
13
|
+
const filesystem_controller_1 = require("./controllers/filesystem-controller");
|
|
14
|
+
const cli_server_plugin_filesystem_1 = require("@qodalis/cli-server-plugin-filesystem");
|
|
15
|
+
const cli_server_plugin_data_explorer_1 = require("@qodalis/cli-server-plugin-data-explorer");
|
|
16
|
+
const logger_1 = require("./utils/logger");
|
|
17
|
+
const cli_server_auth_1 = require("./auth/cli-server-auth");
|
|
18
|
+
const cli_server_auth_gate_1 = require("./auth/cli-server-auth-gate");
|
|
19
|
+
const mcp_1 = require("./mcp");
|
|
20
|
+
const logger = (0, logger_1.createLogger)('Server');
|
|
21
|
+
function createCliServer(options = {}) {
|
|
22
|
+
const { basePath = '/api/qcli', cors: corsOption, configure, allowedOrigins, enableShell = false, shell, trustProxy = false } = options;
|
|
23
|
+
if (shell && !enableShell) {
|
|
24
|
+
logger.warn('shell options are set but enableShell is false: the shell stays disabled');
|
|
25
|
+
}
|
|
26
|
+
const app = (0, express_1.default)();
|
|
27
|
+
const proxyHops = (0, cli_server_auth_1.trustedProxyHops)(trustProxy);
|
|
28
|
+
if (proxyHops > 0) {
|
|
29
|
+
app.set('trust proxy', proxyHops);
|
|
30
|
+
}
|
|
31
|
+
if (corsOption === true) {
|
|
32
|
+
app.use((0, cors_1.default)());
|
|
33
|
+
}
|
|
34
|
+
else if (corsOption && typeof corsOption === 'object') {
|
|
35
|
+
app.use((0, cors_1.default)(corsOption));
|
|
36
|
+
}
|
|
37
|
+
else if (corsOption === undefined && allowedOrigins && allowedOrigins.length > 0) {
|
|
38
|
+
// Same-origin requests (e.g. the bundled admin dashboard) are always allowed.
|
|
39
|
+
app.use((0, cors_1.default)((req, callback) => {
|
|
40
|
+
const origin = req.headers.origin;
|
|
41
|
+
callback(null, {
|
|
42
|
+
origin: (0, cli_server_auth_1.isOriginAllowed)(origin, allowedOrigins) || (0, cli_server_auth_1.isSameOrigin)(origin, req),
|
|
43
|
+
});
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
const mcpOptions = (0, mcp_1.resolveMcpOptions)(options.mcp);
|
|
47
|
+
const mcpPath = `${(0, cli_server_auth_gate_1.normalizePath)(basePath)}/mcp`;
|
|
48
|
+
if (mcpOptions?.token && options.auth?.protectServer) {
|
|
49
|
+
logger.warn('mcp.token is ignored: the auth provider protects the MCP endpoint');
|
|
50
|
+
}
|
|
51
|
+
if (mcpOptions) {
|
|
52
|
+
// DNS-rebinding protection and 405s come first, before authentication
|
|
53
|
+
app.use(mcpPath, (0, mcp_1.createMcpPreGate)({ allowedOrigins, trustProxy }));
|
|
54
|
+
}
|
|
55
|
+
// The MCP endpoint reads its own body (JSON-RPC parse errors are JSON-RPC responses)
|
|
56
|
+
const jsonParser = express_1.default.json({ limit: '1mb' });
|
|
57
|
+
app.use((req, res, next) => {
|
|
58
|
+
if (mcpOptions && (0, cli_server_auth_gate_1.normalizePath)(req.path) === mcpPath) {
|
|
59
|
+
next();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
jsonParser(req, res, next);
|
|
63
|
+
});
|
|
64
|
+
// Render body-parser failures (malformed JSON, too large) as JSON `{ error }`
|
|
65
|
+
app.use((err, _req, res, next) => {
|
|
66
|
+
if (err && (err.type === 'entity.parse.failed' || err.type === 'entity.too.large')) {
|
|
67
|
+
const status = err.type === 'entity.too.large' ? 413 : 400;
|
|
68
|
+
res.status(status).json({ error: status === 413 ? 'request body too large' : 'invalid JSON body' });
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
next(err);
|
|
72
|
+
});
|
|
73
|
+
const registry = new services_1.CliCommandRegistry();
|
|
74
|
+
const builder = new extensions_1.CliBuilder(registry);
|
|
75
|
+
// Server-wide auth gate (no-op until an auth provider is installed)
|
|
76
|
+
let serverAuth;
|
|
77
|
+
const publicRoutes = new Set();
|
|
78
|
+
app.use((0, cli_server_auth_gate_1.createServerAuthGate)(() => serverAuth, {
|
|
79
|
+
registry,
|
|
80
|
+
cliPrefixes: Array.from(new Set(['/api/v1/qcli', (0, cli_server_auth_gate_1.normalizePath)(basePath)])),
|
|
81
|
+
publicRoutes,
|
|
82
|
+
mcpPaths: mcpOptions ? [mcpPath] : [],
|
|
83
|
+
}));
|
|
84
|
+
if (configure) {
|
|
85
|
+
configure(builder);
|
|
86
|
+
}
|
|
87
|
+
const executor = new services_1.CliCommandExecutorService(registry);
|
|
88
|
+
const eventSocketManager = new services_1.CliEventSocketManager({ enableShell, shell, allowedOrigins, trustProxy });
|
|
89
|
+
const logSocketManager = new services_1.CliLogSocketManager({ allowedOrigins, trustProxy });
|
|
90
|
+
const shellCapabilities = () => {
|
|
91
|
+
const mode = eventSocketManager.shellAuthMode;
|
|
92
|
+
return mode ? { shell: true, shellAuth: mode } : { shell: false };
|
|
93
|
+
};
|
|
94
|
+
// MCP tool providers, in priority order: built-in features, plugins/host (registration order), then commands
|
|
95
|
+
const mcpFeatureProviders = [];
|
|
96
|
+
const commandsMcpProvider = new mcp_1.CommandsMcpToolProvider(registry, executor);
|
|
97
|
+
const mcpFeatures = new Set(['commands']);
|
|
98
|
+
if (mcpOptions) {
|
|
99
|
+
mcpFeatures.add('mcp');
|
|
100
|
+
mcpFeatureProviders.push(new mcp_1.ServerMcpToolProvider({
|
|
101
|
+
registry,
|
|
102
|
+
serverName: mcp_1.MCP_SERVER_NAME,
|
|
103
|
+
version: mcp_1.MCP_SERVER_VERSION,
|
|
104
|
+
capabilities: () => ({ ...shellCapabilities() }),
|
|
105
|
+
features: () => {
|
|
106
|
+
const features = [...mcpFeatures];
|
|
107
|
+
if (eventSocketManager.shellAuthMode)
|
|
108
|
+
features.push('shell');
|
|
109
|
+
if (serverAuth?.protectServer)
|
|
110
|
+
features.push('users');
|
|
111
|
+
return features;
|
|
112
|
+
},
|
|
113
|
+
}));
|
|
114
|
+
app.use(mcpPath, (0, mcp_1.createMcpController)({
|
|
115
|
+
providers: () => [...mcpFeatureProviders, ...builder.mcpToolProviders, commandsMcpProvider],
|
|
116
|
+
mcp: mcpOptions,
|
|
117
|
+
getAuth: () => serverAuth,
|
|
118
|
+
allowedOrigins,
|
|
119
|
+
trustProxy,
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
// Version discovery endpoint
|
|
123
|
+
app.use('/api/qcli', (0, cli_version_controller_1.createCliVersionController)({ shellCapabilities }));
|
|
124
|
+
// API v1 routes
|
|
125
|
+
app.use('/api/v1/qcli', (0, cli_controller_1.createCliController)(registry, executor, { shellCapabilities }));
|
|
126
|
+
// Custom basePath fallback (when user overrides the default)
|
|
127
|
+
if (basePath !== '/api/v1/qcli') {
|
|
128
|
+
app.use(basePath, (0, cli_controller_1.createCliController)(registry, executor, { shellCapabilities }));
|
|
129
|
+
}
|
|
130
|
+
// Filesystem API — provider-based
|
|
131
|
+
let fsProvider = builder.fileStorageProvider;
|
|
132
|
+
if (!fsProvider && builder.fileSystemOptions) {
|
|
133
|
+
// Backward compatibility: create OsFileStorageProvider from old-style options
|
|
134
|
+
fsProvider = new cli_server_plugin_filesystem_1.OsFileStorageProvider(builder.fileSystemOptions);
|
|
135
|
+
}
|
|
136
|
+
if (fsProvider) {
|
|
137
|
+
app.use('/api/qcli/fs', (0, filesystem_controller_1.createFilesystemRouter)(fsProvider, builder.fileSystemApiOptions));
|
|
138
|
+
mcpFeatureProviders.push(new mcp_1.FilesystemMcpToolProvider(fsProvider));
|
|
139
|
+
mcpFeatures.add('filesystem');
|
|
140
|
+
}
|
|
141
|
+
// Data Explorer API
|
|
142
|
+
const deBuilder = builder.dataExplorerBuilder;
|
|
143
|
+
if (deBuilder && deBuilder.registry.size > 0) {
|
|
144
|
+
const deExecutor = new cli_server_plugin_data_explorer_1.DataExplorerExecutor(deBuilder.registry);
|
|
145
|
+
app.use('/api/qcli/data-explorer', (0, cli_server_plugin_data_explorer_1.createDataExplorerController)(deBuilder.registry, deExecutor));
|
|
146
|
+
mcpFeatureProviders.push(new mcp_1.DataExplorerMcpToolProvider(deBuilder.registry, deExecutor));
|
|
147
|
+
mcpFeatures.add('data-explorer');
|
|
148
|
+
}
|
|
149
|
+
logger.info('CLI server created with %d processors', registry.processors.length);
|
|
150
|
+
const setAuth = (auth) => {
|
|
151
|
+
serverAuth = auth;
|
|
152
|
+
eventSocketManager.setAuth(auth);
|
|
153
|
+
logSocketManager.setAuth(auth);
|
|
154
|
+
auth?.attachToServer?.({
|
|
155
|
+
allowedOrigins,
|
|
156
|
+
broadcast: (msg) => eventSocketManager.broadcastMessage(msg),
|
|
157
|
+
});
|
|
158
|
+
};
|
|
159
|
+
if (options.auth) {
|
|
160
|
+
setAuth(options.auth);
|
|
161
|
+
}
|
|
162
|
+
const mountPlugin = (plugin) => {
|
|
163
|
+
for (const route of plugin.publicRoutes ?? []) {
|
|
164
|
+
const [method, ...rest] = route.trim().split(/\s+/);
|
|
165
|
+
publicRoutes.add(`${method.toUpperCase()} ${(0, cli_server_auth_gate_1.normalizePath)(rest.join(' '))}`);
|
|
166
|
+
}
|
|
167
|
+
if (plugin.serverAuth && plugin.serverAuth !== serverAuth) {
|
|
168
|
+
setAuth(plugin.serverAuth);
|
|
169
|
+
}
|
|
170
|
+
app.use(plugin.prefix, plugin.router);
|
|
171
|
+
if (plugin.dashboardPrefix && plugin.dashboardRouter) {
|
|
172
|
+
app.use(plugin.dashboardPrefix, plugin.dashboardRouter);
|
|
173
|
+
}
|
|
174
|
+
if (isJobScheduler(plugin.scheduler) && !mcpFeatures.has('jobs')) {
|
|
175
|
+
mcpFeatureProviders.push(new mcp_1.JobsMcpToolProvider(plugin.scheduler));
|
|
176
|
+
mcpFeatures.add('jobs');
|
|
177
|
+
}
|
|
178
|
+
for (const provider of plugin.mcpProviders ?? []) {
|
|
179
|
+
builder.addMcpToolProvider(provider);
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
const mcp = {
|
|
183
|
+
enabled: !!mcpOptions,
|
|
184
|
+
path: mcpPath,
|
|
185
|
+
addProvider: (provider) => {
|
|
186
|
+
builder.addMcpToolProvider(provider);
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
return { app, registry, builder, executor, eventSocketManager, logSocketManager, mountPlugin, setAuth, mcp };
|
|
190
|
+
}
|
|
191
|
+
/** Duck-typed check (the jobs plugin may be a different package copy than the server's). */
|
|
192
|
+
function isJobScheduler(value) {
|
|
193
|
+
const s = value;
|
|
194
|
+
return (!!s &&
|
|
195
|
+
typeof s.getAll === 'function' &&
|
|
196
|
+
typeof s.get === 'function' &&
|
|
197
|
+
typeof s.getRegistration === 'function' &&
|
|
198
|
+
typeof s.triggerAsync === 'function' &&
|
|
199
|
+
typeof s.cancelCurrentAsync === 'function');
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=create-cli-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-cli-server.js","sourceRoot":"","sources":["../../src/create-cli-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ICliCommandProcessor, ICliModule, IDataExplorerProvider, DataExplorerProviderOptions } from '../abstractions';
|
|
2
|
+
import { FileSystemApiOptions, FileSystemOptions } from '../filesystem';
|
|
3
|
+
import { IFileStorageProvider } from '@qodalis/cli-server-plugin-filesystem';
|
|
4
|
+
import { DataExplorerBuilder, DataExplorerProviderFactory } from '@qodalis/cli-server-plugin-data-explorer';
|
|
5
|
+
import { CliCommandRegistry } from '../services';
|
|
6
|
+
import type { McpToolProvider } from '../mcp/mcp-types';
|
|
7
|
+
/**
|
|
8
|
+
* Fluent builder for configuring CLI server processors, modules, filesystem, and data explorer providers.
|
|
9
|
+
* Passed to the `configure` callback in {@link CliServerOptions}.
|
|
10
|
+
*/
|
|
11
|
+
export declare class CliBuilder {
|
|
12
|
+
private readonly _registry;
|
|
13
|
+
private readonly _modules;
|
|
14
|
+
private _fileSystemOptions?;
|
|
15
|
+
private _fileStorageProvider?;
|
|
16
|
+
private _fileSystemApiOptions;
|
|
17
|
+
private _dataExplorerBuilder?;
|
|
18
|
+
private readonly _mcpToolProviders;
|
|
19
|
+
constructor(registry: CliCommandRegistry);
|
|
20
|
+
/** Registers a single command processor. */
|
|
21
|
+
addProcessor(processor: ICliCommandProcessor): CliBuilder;
|
|
22
|
+
/** Registers a module and all of its command processors. */
|
|
23
|
+
addModule(module: ICliModule): CliBuilder;
|
|
24
|
+
/** Returns all registered modules. */
|
|
25
|
+
get modules(): ReadonlyArray<ICliModule>;
|
|
26
|
+
/** Configures the filesystem API with path-based access control (and `maxUploadBytes`). */
|
|
27
|
+
addFileSystem(options: FileSystemOptions): CliBuilder;
|
|
28
|
+
/** Returns the underlying command registry. */
|
|
29
|
+
get registry(): CliCommandRegistry;
|
|
30
|
+
/**
|
|
31
|
+
* Sets a custom file storage provider for the filesystem API. `options`
|
|
32
|
+
* configures the HTTP API (e.g. `maxUploadBytes`, default 100 MiB).
|
|
33
|
+
*/
|
|
34
|
+
setFileStorageProvider(provider: IFileStorageProvider, options?: FileSystemApiOptions): CliBuilder;
|
|
35
|
+
/** Options of the filesystem HTTP API (`maxUploadBytes`). */
|
|
36
|
+
get fileSystemApiOptions(): FileSystemApiOptions;
|
|
37
|
+
/** Returns the configured filesystem options, if any. */
|
|
38
|
+
get fileSystemOptions(): FileSystemOptions | undefined;
|
|
39
|
+
/** Returns the configured file storage provider, if any. */
|
|
40
|
+
get fileStorageProvider(): IFileStorageProvider | undefined;
|
|
41
|
+
/** Registers a data explorer provider with its configuration options. */
|
|
42
|
+
addDataExplorerProvider(providerOrFactory: IDataExplorerProvider | DataExplorerProviderFactory, options: DataExplorerProviderOptions): CliBuilder;
|
|
43
|
+
/** Returns the data explorer builder, if any providers have been registered. */
|
|
44
|
+
get dataExplorerBuilder(): DataExplorerBuilder | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Registers an MCP tool provider (used when the server's `mcp` option is on).
|
|
47
|
+
* On a name collision built-in feature tools win, then providers in registration
|
|
48
|
+
* order, then command tools.
|
|
49
|
+
*/
|
|
50
|
+
addMcpToolProvider(provider: McpToolProvider): CliBuilder;
|
|
51
|
+
/** MCP tool providers registered by plugins and the host, in registration order. */
|
|
52
|
+
get mcpToolProviders(): ReadonlyArray<McpToolProvider>;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=cli-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-builder.d.ts","sourceRoot":"","sources":["../../../src/extensions/cli-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AACvH,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;AAC5G,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;GAGG;AACH,qBAAa,UAAU;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,kBAAkB,CAAC,CAAoB;IAC/C,OAAO,CAAC,oBAAoB,CAAC,CAAuB;IACpD,OAAO,CAAC,qBAAqB,CAA4B;IACzD,OAAO,CAAC,oBAAoB,CAAC,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyB;gBAE/C,QAAQ,EAAE,kBAAkB;IAIxC,4CAA4C;IAC5C,YAAY,CAAC,SAAS,EAAE,oBAAoB,GAAG,UAAU;IAKzD,4DAA4D;IAC5D,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU;IAQzC,sCAAsC;IACtC,IAAI,OAAO,IAAI,aAAa,CAAC,UAAU,CAAC,CAEvC;IAED,2FAA2F;IAC3F,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU;IAMrD,+CAA+C;IAC/C,IAAI,QAAQ,IAAI,kBAAkB,CAEjC;IAED;;;OAGG;IACH,sBAAsB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,UAAU;IAQlG,6DAA6D;IAC7D,IAAI,oBAAoB,IAAI,oBAAoB,CAE/C;IAED,yDAAyD;IACzD,IAAI,iBAAiB,IAAI,iBAAiB,GAAG,SAAS,CAErD;IAED,4DAA4D;IAC5D,IAAI,mBAAmB,IAAI,oBAAoB,GAAG,SAAS,CAE1D;IAED,yEAAyE;IACzE,uBAAuB,CACnB,iBAAiB,EAAE,qBAAqB,GAAG,2BAA2B,EACtE,OAAO,EAAE,2BAA2B,GACrC,UAAU;IAQb,gFAAgF;IAChF,IAAI,mBAAmB,IAAI,mBAAmB,GAAG,SAAS,CAEzD;IAED;;;;OAIG;IACH,kBAAkB,CAAC,QAAQ,EAAE,eAAe,GAAG,UAAU;IAKzD,oFAAoF;IACpF,IAAI,gBAAgB,IAAI,aAAa,CAAC,eAAe,CAAC,CAErD;CACJ"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CliBuilder = void 0;
|
|
4
|
+
const cli_server_plugin_data_explorer_1 = require("@qodalis/cli-server-plugin-data-explorer");
|
|
5
|
+
/**
|
|
6
|
+
* Fluent builder for configuring CLI server processors, modules, filesystem, and data explorer providers.
|
|
7
|
+
* Passed to the `configure` callback in {@link CliServerOptions}.
|
|
8
|
+
*/
|
|
9
|
+
class CliBuilder {
|
|
10
|
+
_registry;
|
|
11
|
+
_modules = [];
|
|
12
|
+
_fileSystemOptions;
|
|
13
|
+
_fileStorageProvider;
|
|
14
|
+
_fileSystemApiOptions = {};
|
|
15
|
+
_dataExplorerBuilder;
|
|
16
|
+
_mcpToolProviders = [];
|
|
17
|
+
constructor(registry) {
|
|
18
|
+
this._registry = registry;
|
|
19
|
+
}
|
|
20
|
+
/** Registers a single command processor. */
|
|
21
|
+
addProcessor(processor) {
|
|
22
|
+
this._registry.register(processor);
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
/** Registers a module and all of its command processors. */
|
|
26
|
+
addModule(module) {
|
|
27
|
+
this._modules.push(module);
|
|
28
|
+
for (const processor of module.processors) {
|
|
29
|
+
this._registry.register(processor);
|
|
30
|
+
}
|
|
31
|
+
return this;
|
|
32
|
+
}
|
|
33
|
+
/** Returns all registered modules. */
|
|
34
|
+
get modules() {
|
|
35
|
+
return this._modules;
|
|
36
|
+
}
|
|
37
|
+
/** Configures the filesystem API with path-based access control (and `maxUploadBytes`). */
|
|
38
|
+
addFileSystem(options) {
|
|
39
|
+
this._fileSystemOptions = options;
|
|
40
|
+
this._fileSystemApiOptions = { maxUploadBytes: options.maxUploadBytes };
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
/** Returns the underlying command registry. */
|
|
44
|
+
get registry() {
|
|
45
|
+
return this._registry;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Sets a custom file storage provider for the filesystem API. `options`
|
|
49
|
+
* configures the HTTP API (e.g. `maxUploadBytes`, default 100 MiB).
|
|
50
|
+
*/
|
|
51
|
+
setFileStorageProvider(provider, options) {
|
|
52
|
+
this._fileStorageProvider = provider;
|
|
53
|
+
if (options) {
|
|
54
|
+
this._fileSystemApiOptions = { ...options };
|
|
55
|
+
}
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
/** Options of the filesystem HTTP API (`maxUploadBytes`). */
|
|
59
|
+
get fileSystemApiOptions() {
|
|
60
|
+
return this._fileSystemApiOptions;
|
|
61
|
+
}
|
|
62
|
+
/** Returns the configured filesystem options, if any. */
|
|
63
|
+
get fileSystemOptions() {
|
|
64
|
+
return this._fileSystemOptions;
|
|
65
|
+
}
|
|
66
|
+
/** Returns the configured file storage provider, if any. */
|
|
67
|
+
get fileStorageProvider() {
|
|
68
|
+
return this._fileStorageProvider;
|
|
69
|
+
}
|
|
70
|
+
/** Registers a data explorer provider with its configuration options. */
|
|
71
|
+
addDataExplorerProvider(providerOrFactory, options) {
|
|
72
|
+
if (!this._dataExplorerBuilder) {
|
|
73
|
+
this._dataExplorerBuilder = new cli_server_plugin_data_explorer_1.DataExplorerBuilder();
|
|
74
|
+
}
|
|
75
|
+
this._dataExplorerBuilder.addProvider(providerOrFactory, options);
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
/** Returns the data explorer builder, if any providers have been registered. */
|
|
79
|
+
get dataExplorerBuilder() {
|
|
80
|
+
return this._dataExplorerBuilder;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Registers an MCP tool provider (used when the server's `mcp` option is on).
|
|
84
|
+
* On a name collision built-in feature tools win, then providers in registration
|
|
85
|
+
* order, then command tools.
|
|
86
|
+
*/
|
|
87
|
+
addMcpToolProvider(provider) {
|
|
88
|
+
this._mcpToolProviders.push(provider);
|
|
89
|
+
return this;
|
|
90
|
+
}
|
|
91
|
+
/** MCP tool providers registered by plugins and the host, in registration order. */
|
|
92
|
+
get mcpToolProviders() {
|
|
93
|
+
return this._mcpToolProviders;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.CliBuilder = CliBuilder;
|
|
97
|
+
//# sourceMappingURL=cli-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-builder.js","sourceRoot":"","sources":["../../../src/extensions/cli-builder.ts"],"names":[],"mappings":";;;AAGA,8FAA4G;AAI5G;;;GAGG;AACH,MAAa,UAAU;IACF,SAAS,CAAqB;IAC9B,QAAQ,GAAiB,EAAE,CAAC;IACrC,kBAAkB,CAAqB;IACvC,oBAAoB,CAAwB;IAC5C,qBAAqB,GAAyB,EAAE,CAAC;IACjD,oBAAoB,CAAuB;IAClC,iBAAiB,GAAsB,EAAE,CAAC;IAE3D,YAAY,QAA4B;QACpC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAED,4CAA4C;IAC5C,YAAY,CAAC,SAA+B;QACxC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,4DAA4D;IAC5D,SAAS,CAAC,MAAkB;QACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACxC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,sCAAsC;IACtC,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,2FAA2F;IAC3F,aAAa,CAAC,OAA0B;QACpC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;QAClC,IAAI,CAAC,qBAAqB,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;QACxE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,+CAA+C;IAC/C,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,sBAAsB,CAAC,QAA8B,EAAE,OAA8B;QACjF,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC;QACrC,IAAI,OAAO,EAAE,CAAC;YACV,IAAI,CAAC,qBAAqB,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,6DAA6D;IAC7D,IAAI,oBAAoB;QACpB,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACtC,CAAC;IAED,yDAAyD;IACzD,IAAI,iBAAiB;QACjB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED,4DAA4D;IAC5D,IAAI,mBAAmB;QACnB,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAED,yEAAyE;IACzE,uBAAuB,CACnB,iBAAsE,EACtE,OAAoC;QAEpC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC7B,IAAI,CAAC,oBAAoB,GAAG,IAAI,qDAAmB,EAAE,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,gFAAgF;IAChF,IAAI,mBAAmB;QACnB,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,QAAyB;QACxC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,oFAAoF;IACpF,IAAI,gBAAgB;QAChB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;CACJ;AAvGD,gCAuGC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/index.ts"],"names":[],"mappings":";;;AAAA,6CAA2C;AAAlC,yGAAA,UAAU,OAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Default largest accepted upload: 100 MiB. */
|
|
2
|
+
export declare const DEFAULT_MAX_UPLOAD_BYTES: number;
|
|
3
|
+
/** Options of the filesystem HTTP API (`/api/qcli/fs`). */
|
|
4
|
+
export interface FileSystemApiOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Largest file accepted by `POST /upload`, in bytes (default 100 MiB,
|
|
7
|
+
* {@link DEFAULT_MAX_UPLOAD_BYTES}). Larger uploads are refused with `413`.
|
|
8
|
+
*/
|
|
9
|
+
maxUploadBytes?: number;
|
|
10
|
+
}
|
|
11
|
+
/** Configuration for the filesystem API access control. */
|
|
12
|
+
export interface FileSystemOptions extends FileSystemApiOptions {
|
|
13
|
+
/** Absolute paths that the filesystem API is allowed to access. */
|
|
14
|
+
allowedPaths: string[];
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=filesystem-options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem-options.d.ts","sourceRoot":"","sources":["../../../src/filesystem/filesystem-options.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,eAAO,MAAM,wBAAwB,QAAoB,CAAC;AAE1D,2DAA2D;AAC3D,MAAM,WAAW,oBAAoB;IACjC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,2DAA2D;AAC3D,MAAM,WAAW,iBAAkB,SAAQ,oBAAoB;IAC3D,mEAAmE;IACnE,YAAY,EAAE,MAAM,EAAE,CAAC;CAC1B"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_MAX_UPLOAD_BYTES = void 0;
|
|
4
|
+
/** Default largest accepted upload: 100 MiB. */
|
|
5
|
+
exports.DEFAULT_MAX_UPLOAD_BYTES = 100 * 1024 * 1024;
|
|
6
|
+
//# sourceMappingURL=filesystem-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem-options.js","sourceRoot":"","sources":["../../../src/filesystem/filesystem-options.ts"],"names":[],"mappings":";;;AAAA,gDAAgD;AACnC,QAAA,wBAAwB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { FileSystemOptions } from './filesystem-options';
|
|
2
|
+
/**
|
|
3
|
+
* Validates that requested filesystem paths fall within the configured
|
|
4
|
+
* allowed directories. Blocks path-traversal attempts and resolves symlinks.
|
|
5
|
+
*/
|
|
6
|
+
export declare class FileSystemPathValidator {
|
|
7
|
+
private readonly allowedPaths;
|
|
8
|
+
constructor(options: FileSystemOptions);
|
|
9
|
+
/**
|
|
10
|
+
* Returns `true` when `requestedPath` resolves to a location inside one
|
|
11
|
+
* of the allowed directories.
|
|
12
|
+
*/
|
|
13
|
+
isPathAllowed(requestedPath: string): boolean;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=filesystem-path-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem-path-validator.d.ts","sourceRoot":"","sources":["../../../src/filesystem/filesystem-path-validator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD;;;GAGG;AACH,qBAAa,uBAAuB;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAW;gBAE5B,OAAO,EAAE,iBAAiB;IAItC;;;OAGG;IACH,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;CAuBhD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.FileSystemPathValidator = void 0;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
/**
|
|
40
|
+
* Validates that requested filesystem paths fall within the configured
|
|
41
|
+
* allowed directories. Blocks path-traversal attempts and resolves symlinks.
|
|
42
|
+
*/
|
|
43
|
+
class FileSystemPathValidator {
|
|
44
|
+
allowedPaths;
|
|
45
|
+
constructor(options) {
|
|
46
|
+
this.allowedPaths = options.allowedPaths.map((p) => path.resolve(p));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Returns `true` when `requestedPath` resolves to a location inside one
|
|
50
|
+
* of the allowed directories.
|
|
51
|
+
*/
|
|
52
|
+
isPathAllowed(requestedPath) {
|
|
53
|
+
const resolved = path.resolve(requestedPath);
|
|
54
|
+
// Block explicit traversal in the normalised path
|
|
55
|
+
if (resolved.includes('..')) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
// Attempt to resolve symlinks so a link outside allowed dirs is caught
|
|
59
|
+
let realPath;
|
|
60
|
+
try {
|
|
61
|
+
realPath = fs.realpathSync(resolved);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Path does not exist yet (e.g. mkdir/upload target) — fall back
|
|
65
|
+
// to the normalised form which is safe enough for the check.
|
|
66
|
+
realPath = resolved;
|
|
67
|
+
}
|
|
68
|
+
return this.allowedPaths.some((allowed) => realPath === allowed || realPath.startsWith(allowed + path.sep));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
exports.FileSystemPathValidator = FileSystemPathValidator;
|
|
72
|
+
//# sourceMappingURL=filesystem-path-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem-path-validator.js","sourceRoot":"","sources":["../../../src/filesystem/filesystem-path-validator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAC7B,uCAAyB;AAGzB;;;GAGG;AACH,MAAa,uBAAuB;IACf,YAAY,CAAW;IAExC,YAAY,OAA0B;QAClC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,aAAqB;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAE7C,kDAAkD;QAClD,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,uEAAuE;QACvE,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACD,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACL,iEAAiE;YACjE,6DAA6D;YAC7D,QAAQ,GAAG,QAAQ,CAAC;QACxB,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CACzB,CAAC,OAAO,EAAE,EAAE,CACR,QAAQ,KAAK,OAAO,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CACtE,CAAC;IACN,CAAC;CACJ;AAlCD,0DAkCC"}
|