@edgible-team/cli 1.2.13 ā 1.2.17
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 +5 -3
- package/dist/client/api-client.d.ts +13 -1
- package/dist/client/api-client.d.ts.map +1 -1
- package/dist/client/api-client.js +19 -0
- package/dist/commands/agent/install.d.ts +2 -1
- package/dist/commands/agent/install.d.ts.map +1 -1
- package/dist/commands/agent/install.js +24 -7
- package/dist/commands/agent/start.d.ts +5 -1
- package/dist/commands/agent/start.d.ts.map +1 -1
- package/dist/commands/agent/start.js +19 -280
- package/dist/commands/agent/uninstall.d.ts.map +1 -1
- package/dist/commands/agent/uninstall.js +14 -7
- package/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +3 -2
- package/dist/commands/ai/setup.d.ts +1 -1
- package/dist/commands/ai/setup.d.ts.map +1 -1
- package/dist/commands/ai.js +1 -1
- package/dist/commands/application/create-docker-compose.d.ts +3 -1
- package/dist/commands/application/create-docker-compose.d.ts.map +1 -1
- package/dist/commands/application/create-docker-compose.js +25 -69
- package/dist/commands/application/create-existing.d.ts +2 -2
- package/dist/commands/application/create-existing.d.ts.map +1 -1
- package/dist/commands/application/create-existing.js +27 -132
- package/dist/commands/application/create-managed-process.d.ts +3 -1
- package/dist/commands/application/create-managed-process.d.ts.map +1 -1
- package/dist/commands/application/create-managed-process.js +31 -75
- package/dist/commands/application/delete.d.ts +2 -1
- package/dist/commands/application/delete.d.ts.map +1 -1
- package/dist/commands/application/delete.js +19 -5
- package/dist/commands/application/update.d.ts +3 -0
- package/dist/commands/application/update.d.ts.map +1 -1
- package/dist/commands/application/update.js +45 -1
- package/dist/commands/application.d.ts.map +1 -1
- package/dist/commands/application.js +33 -19
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +44 -0
- package/dist/commands/debug.js +1 -1
- package/dist/commands/device/application-health.d.ts +7 -0
- package/dist/commands/device/application-health.d.ts.map +1 -0
- package/dist/commands/device/application-health.js +103 -0
- package/dist/commands/device/delete.d.ts +7 -0
- package/dist/commands/device/delete.d.ts.map +1 -0
- package/dist/commands/device/delete.js +69 -0
- package/dist/commands/device/health.d.ts +7 -0
- package/dist/commands/device/health.d.ts.map +1 -0
- package/dist/commands/device/health.js +78 -0
- package/dist/commands/device/list.d.ts +5 -0
- package/dist/commands/device/list.d.ts.map +1 -0
- package/dist/commands/device/list.js +46 -0
- package/dist/commands/device/telemetry.d.ts +8 -0
- package/dist/commands/device/telemetry.d.ts.map +1 -0
- package/dist/commands/device/telemetry.js +59 -0
- package/dist/commands/device.d.ts +6 -0
- package/dist/commands/device.d.ts.map +1 -0
- package/dist/commands/device.js +86 -0
- package/dist/commands/stack/deploy.d.ts +8 -0
- package/dist/commands/stack/deploy.d.ts.map +1 -0
- package/dist/commands/stack/deploy.js +61 -0
- package/dist/commands/stack/diff.d.ts +7 -0
- package/dist/commands/stack/diff.d.ts.map +1 -0
- package/dist/commands/stack/diff.js +66 -0
- package/dist/commands/stack/status.d.ts +9 -0
- package/dist/commands/stack/status.d.ts.map +1 -0
- package/dist/commands/stack/status.js +55 -0
- package/dist/commands/stack/teardown.d.ts +8 -0
- package/dist/commands/stack/teardown.d.ts.map +1 -0
- package/dist/commands/stack/teardown.js +107 -0
- package/dist/commands/stack/validate.d.ts +7 -0
- package/dist/commands/stack/validate.d.ts.map +1 -0
- package/dist/commands/stack/validate.js +44 -0
- package/dist/commands/stack.d.ts +10 -0
- package/dist/commands/stack.d.ts.map +1 -0
- package/dist/commands/stack.js +117 -0
- package/dist/commands/utils/auth-prompt.d.ts +25 -0
- package/dist/commands/utils/auth-prompt.d.ts.map +1 -0
- package/dist/commands/utils/auth-prompt.js +115 -0
- package/dist/commands/utils/device-prompt.d.ts +18 -0
- package/dist/commands/utils/device-prompt.d.ts.map +1 -0
- package/dist/commands/utils/device-prompt.js +58 -0
- package/dist/commands/utils/output-formatter.d.ts +13 -0
- package/dist/commands/utils/output-formatter.d.ts.map +1 -1
- package/dist/commands/utils/output-formatter.js +21 -0
- package/dist/index.js +4 -0
- package/dist/services/LocalAgentManager.d.ts +2 -1
- package/dist/services/LocalAgentManager.d.ts.map +1 -1
- package/dist/services/LocalAgentManager.js +6 -4
- package/dist/services/application/ApplicationService.d.ts +19 -0
- package/dist/services/application/ApplicationService.d.ts.map +1 -1
- package/dist/services/application/ApplicationService.js +14 -1
- package/dist/services/device/DeviceService.d.ts +62 -0
- package/dist/services/device/DeviceService.d.ts.map +1 -0
- package/dist/services/device/DeviceService.js +235 -0
- package/dist/services/edgible.d.ts +3 -1
- package/dist/services/edgible.d.ts.map +1 -1
- package/dist/services/edgible.js +5 -4
- package/dist/services/instances.d.ts +27 -1
- package/dist/services/instances.d.ts.map +1 -1
- package/dist/services/instances.js +53 -4
- package/dist/services/stack/DependencyGraphManager.d.ts +69 -0
- package/dist/services/stack/DependencyGraphManager.d.ts.map +1 -0
- package/dist/services/stack/DependencyGraphManager.js +204 -0
- package/dist/services/stack/DeviceResolver.d.ts +63 -0
- package/dist/services/stack/DeviceResolver.d.ts.map +1 -0
- package/dist/services/stack/DeviceResolver.js +147 -0
- package/dist/services/stack/GatewayResolver.d.ts +84 -0
- package/dist/services/stack/GatewayResolver.d.ts.map +1 -0
- package/dist/services/stack/GatewayResolver.js +179 -0
- package/dist/services/stack/StackParser.d.ts +38 -0
- package/dist/services/stack/StackParser.d.ts.map +1 -0
- package/dist/services/stack/StackParser.js +234 -0
- package/dist/services/stack/StackService.d.ts +76 -0
- package/dist/services/stack/StackService.d.ts.map +1 -0
- package/dist/services/stack/StackService.js +476 -0
- package/dist/types/AgentConfig.d.ts +26 -0
- package/dist/types/AgentConfig.d.ts.map +1 -1
- package/dist/types/ApiRequests.d.ts +5 -1
- package/dist/types/ApiRequests.d.ts.map +1 -1
- package/dist/types/ApiResponses.d.ts +5 -0
- package/dist/types/ApiResponses.d.ts.map +1 -1
- package/dist/types/JobTypes.d.ts +103 -0
- package/dist/types/JobTypes.d.ts.map +1 -0
- package/dist/types/JobTypes.js +80 -0
- package/dist/types/WebSocketMessages.d.ts +89 -0
- package/dist/types/WebSocketMessages.d.ts.map +1 -0
- package/dist/types/WebSocketMessages.js +5 -0
- package/dist/types/backendJobs.d.ts +102 -0
- package/dist/types/backendJobs.d.ts.map +1 -0
- package/dist/types/backendJobs.js +5 -0
- package/dist/types/models/ApplicationData.d.ts +1 -1
- package/dist/types/models/ApplicationData.d.ts.map +1 -1
- package/dist/types/models/DeviceData.d.ts +4 -0
- package/dist/types/models/DeviceData.d.ts.map +1 -1
- package/dist/types/stack.d.ts +191 -0
- package/dist/types/stack.d.ts.map +1 -0
- package/dist/types/stack.js +5 -0
- package/dist/types/validation/schemas.d.ts +20 -20
- package/dist/types/validation/schemas.js +1 -1
- package/dist/utils/stack-errors.d.ts +103 -0
- package/dist/utils/stack-errors.d.ts.map +1 -0
- package/dist/utils/stack-errors.js +158 -0
- package/dist/utils/stack-file.d.ts +11 -0
- package/dist/utils/stack-file.d.ts.map +1 -0
- package/dist/utils/stack-file.js +66 -0
- package/dist/validation/stack-schemas.d.ts +535 -0
- package/dist/validation/stack-schemas.d.ts.map +1 -0
- package/dist/validation/stack-schemas.js +178 -0
- package/package.json +4 -2
- package/dist/commands/agent/agent-handlers.d.ts +0 -45
- package/dist/commands/agent/agent-handlers.d.ts.map +0 -1
- package/dist/commands/agent/agent-handlers.js +0 -1159
- package/dist/commands/application/api-keys.d.ts +0 -3
- package/dist/commands/application/api-keys.d.ts.map +0 -1
- package/dist/commands/application/api-keys.js +0 -227
- package/dist/commands/application/create-compose.d.ts +0 -3
- package/dist/commands/application/create-compose.d.ts.map +0 -1
- package/dist/commands/application/create-compose.js +0 -381
- package/dist/commands/application/create-interactive.d.ts +0 -3
- package/dist/commands/application/create-interactive.d.ts.map +0 -1
- package/dist/commands/application/create-interactive.js +0 -326
- package/dist/commands/application/create-workload.d.ts +0 -5
- package/dist/commands/application/create-workload.d.ts.map +0 -1
- package/dist/commands/application/create-workload.js +0 -48
- package/dist/commands/application/short-codes.d.ts +0 -3
- package/dist/commands/application/short-codes.d.ts.map +0 -1
- package/dist/commands/application/short-codes.js +0 -226
- package/dist/commands/application/toggle.d.ts +0 -2
- package/dist/commands/application/toggle.d.ts.map +0 -1
- package/dist/commands/application/toggle.js +0 -78
- package/dist/commands/examples/migrated-command-example.d.ts +0 -31
- package/dist/commands/examples/migrated-command-example.d.ts.map +0 -1
- package/dist/commands/examples/migrated-command-example.js +0 -180
- package/dist/commands/managedGateway/create.d.ts +0 -6
- package/dist/commands/managedGateway/create.d.ts.map +0 -1
- package/dist/commands/managedGateway/create.js +0 -50
- package/dist/commands/managedGateway/delete.d.ts +0 -5
- package/dist/commands/managedGateway/delete.d.ts.map +0 -1
- package/dist/commands/managedGateway/delete.js +0 -57
- package/dist/commands/managedGateway/get.d.ts +0 -4
- package/dist/commands/managedGateway/get.d.ts.map +0 -1
- package/dist/commands/managedGateway/get.js +0 -71
- package/dist/commands/managedGateway/haproxy-stats.d.ts +0 -6
- package/dist/commands/managedGateway/haproxy-stats.d.ts.map +0 -1
- package/dist/commands/managedGateway/haproxy-stats.js +0 -131
- package/dist/commands/managedGateway/list.d.ts +0 -4
- package/dist/commands/managedGateway/list.d.ts.map +0 -1
- package/dist/commands/managedGateway/list.js +0 -50
- package/dist/commands/managedGateway/logs.d.ts +0 -10
- package/dist/commands/managedGateway/logs.d.ts.map +0 -1
- package/dist/commands/managedGateway/logs.js +0 -100
- package/dist/commands/managedGateway/reboot.d.ts +0 -5
- package/dist/commands/managedGateway/reboot.d.ts.map +0 -1
- package/dist/commands/managedGateway/reboot.js +0 -95
- package/dist/commands/managedGateway/resync.d.ts +0 -10
- package/dist/commands/managedGateway/resync.d.ts.map +0 -1
- package/dist/commands/managedGateway/resync.js +0 -69
- package/dist/commands/managedGateway/ssh.d.ts +0 -4
- package/dist/commands/managedGateway/ssh.d.ts.map +0 -1
- package/dist/commands/managedGateway/ssh.js +0 -130
- package/dist/commands/managedGateway/wipe-logs.d.ts +0 -4
- package/dist/commands/managedGateway/wipe-logs.d.ts.map +0 -1
- package/dist/commands/managedGateway/wipe-logs.js +0 -67
- package/dist/commands/managedGateway/wireguard.d.ts +0 -4
- package/dist/commands/managedGateway/wireguard.d.ts.map +0 -1
- package/dist/commands/managedGateway/wireguard.js +0 -68
- package/dist/di/bindings.d.ts +0 -15
- package/dist/di/bindings.d.ts.map +0 -1
- package/dist/di/bindings.js +0 -99
- package/dist/di/container.d.ts +0 -44
- package/dist/di/container.d.ts.map +0 -1
- package/dist/di/container.js +0 -88
- package/dist/di/types.d.ts +0 -23
- package/dist/di/types.d.ts.map +0 -1
- package/dist/di/types.js +0 -32
- package/dist/repositories/config-repository.d.ts +0 -46
- package/dist/repositories/config-repository.d.ts.map +0 -1
- package/dist/repositories/config-repository.js +0 -62
- package/dist/repositories/gateway-repository.d.ts +0 -37
- package/dist/repositories/gateway-repository.d.ts.map +0 -1
- package/dist/repositories/gateway-repository.js +0 -35
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoJzD"}
|
package/dist/commands/agent.js
CHANGED
|
@@ -29,7 +29,8 @@ function setupAgentCommands(program) {
|
|
|
29
29
|
.option('--type <type>', 'Installation type (systemd|launchd|windows-service)')
|
|
30
30
|
.option('--dev', 'Run in development mode (foreground, no daemon)')
|
|
31
31
|
.option('--local', 'Use local agent build from agent-v2/dist/ (development only)')
|
|
32
|
-
.option('--
|
|
32
|
+
.option('--non-interactive', 'Non-interactive mode for CI/VMs: use config, --device-name to create a device, or --device-id/--device-password, skip prompts')
|
|
33
|
+
.option('--device-name <name>', 'Create a new serving device with this name (non-interactive); alternative to --device-id/--device-password')
|
|
33
34
|
.option('--device-id <id>', 'Serving device ID (non-interactive); can use EDGIBLE_DEVICE_ID')
|
|
34
35
|
.option('--device-password <password>', 'Serving device password (non-interactive); can use EDGIBLE_DEVICE_PASSWORD')
|
|
35
36
|
.option('--auto-install-deps', 'Install missing dependencies (WireGuard, Caddy, etc.) without prompting')
|
|
@@ -41,7 +42,7 @@ function setupAgentCommands(program) {
|
|
|
41
42
|
}));
|
|
42
43
|
agentCommand
|
|
43
44
|
.command('start')
|
|
44
|
-
.description('Start the local agent')
|
|
45
|
+
.description('Start the local agent (uses the device configured during install)')
|
|
45
46
|
.option('--passthrough', 'Run agent with interactive output (required for sudo password prompt)')
|
|
46
47
|
.option('--debug', 'Enable debug logging')
|
|
47
48
|
.option('--docker', 'Run agent in Docker container')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/commands/ai/setup.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/commands/ai/setup.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CAgFhB"}
|
package/dist/commands/ai.js
CHANGED
|
@@ -25,7 +25,7 @@ function setupAiCommands(program) {
|
|
|
25
25
|
.option('--webui-device-id <id>', 'Serving device ID for Open WebUI')
|
|
26
26
|
.option('--gateway-ids <ids>', 'Comma-separated gateway device IDs')
|
|
27
27
|
.option('--webui-deployment <type>', 'WebUI deployment: local or remote')
|
|
28
|
-
.option('--
|
|
28
|
+
.option('--non-interactive', 'Run in non-interactive mode')
|
|
29
29
|
.action((0, command_wrapper_1.wrapCommand)(async (options) => {
|
|
30
30
|
await (0, setup_1.handleAiSetup)(options);
|
|
31
31
|
}, {
|
|
@@ -5,6 +5,8 @@ export declare function handleApplicationCreateDockerCompose(options: {
|
|
|
5
5
|
deviceId?: string;
|
|
6
6
|
gatewayIds?: string;
|
|
7
7
|
hostnames?: string;
|
|
8
|
-
|
|
8
|
+
authModes?: string;
|
|
9
|
+
allowedOrgs?: string;
|
|
10
|
+
nonInteractive?: boolean;
|
|
9
11
|
}): Promise<void>;
|
|
10
12
|
//# sourceMappingURL=create-docker-compose.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-docker-compose.d.ts","sourceRoot":"","sources":["../../../src/commands/application/create-docker-compose.ts"],"names":[],"mappings":"AAYA,wBAAsB,oCAAoC,CAAC,OAAO,EAAE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,
|
|
1
|
+
{"version":3,"file":"create-docker-compose.d.ts","sourceRoot":"","sources":["../../../src/commands/application/create-docker-compose.ts"],"names":[],"mappings":"AAYA,wBAAsB,oCAAoC,CAAC,OAAO,EAAE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CA+PhB"}
|
|
@@ -44,6 +44,7 @@ const path = __importStar(require("path"));
|
|
|
44
44
|
const instances_1 = require("../../services/instances");
|
|
45
45
|
const config_validator_1 = require("../utils/config-validator");
|
|
46
46
|
const input_parser_1 = require("../utils/input-parser");
|
|
47
|
+
const auth_prompt_1 = require("../utils/auth-prompt");
|
|
47
48
|
const sudo_checker_1 = require("../../utils/sudo-checker");
|
|
48
49
|
const docker_compose_parser_1 = require("../../utils/docker-compose-parser");
|
|
49
50
|
async function handleApplicationCreateDockerCompose(options) {
|
|
@@ -51,6 +52,7 @@ async function handleApplicationCreateDockerCompose(options) {
|
|
|
51
52
|
requireAuth: true,
|
|
52
53
|
requireOrganization: true,
|
|
53
54
|
});
|
|
55
|
+
const isInteractive = options.nonInteractive !== true;
|
|
54
56
|
// Check sudo permissions
|
|
55
57
|
if (!(0, sudo_checker_1.checkSudoPermissions)()) {
|
|
56
58
|
console.log(chalk_1.default.yellow('ā Warning: Not running as sudo. Docker commands may fail without proper permissions.'));
|
|
@@ -94,7 +96,7 @@ async function handleApplicationCreateDockerCompose(options) {
|
|
|
94
96
|
}
|
|
95
97
|
// Get application name
|
|
96
98
|
let appName = options.name;
|
|
97
|
-
if (!appName &&
|
|
99
|
+
if (!appName && isInteractive) {
|
|
98
100
|
const { name } = await inquirer_1.default.prompt([
|
|
99
101
|
{
|
|
100
102
|
type: 'input',
|
|
@@ -111,7 +113,7 @@ async function handleApplicationCreateDockerCompose(options) {
|
|
|
111
113
|
// Select port
|
|
112
114
|
let selectedPort;
|
|
113
115
|
let selectedContainer;
|
|
114
|
-
if (
|
|
116
|
+
if (isInteractive) {
|
|
115
117
|
const { selected } = await inquirer_1.default.prompt([
|
|
116
118
|
{
|
|
117
119
|
type: 'list',
|
|
@@ -130,16 +132,26 @@ async function handleApplicationCreateDockerCompose(options) {
|
|
|
130
132
|
}
|
|
131
133
|
// Description
|
|
132
134
|
const description = options.description || `Application for ${appName} (docker-compose: ${selectedContainer})`;
|
|
133
|
-
// Device IDs and Gateway IDs
|
|
135
|
+
// Device IDs and Gateway IDs. If --gateway-ids provided, use own gateways; else Edgible managed (default).
|
|
134
136
|
let deviceId = options.deviceId;
|
|
135
137
|
let gatewayIds = (0, input_parser_1.parseGatewayIds)(options.gatewayIds);
|
|
138
|
+
const useManagedGateway = gatewayIds.length === 0;
|
|
136
139
|
let hostnames = Array.isArray(options.hostnames)
|
|
137
140
|
? options.hostnames
|
|
138
141
|
: (typeof options.hostnames === 'string' && options.hostnames.trim().length > 0
|
|
139
142
|
? options.hostnames.split(',').map(s => s.trim()).filter(Boolean)
|
|
140
143
|
: []);
|
|
141
|
-
|
|
142
|
-
|
|
144
|
+
// Auth: use authModes (none | org | api-key | org+api-key)
|
|
145
|
+
const authModesFromFlag = (0, auth_prompt_1.parseAuthModes)(options.authModes);
|
|
146
|
+
const allowedOrgsFromFlag = options.allowedOrgs
|
|
147
|
+
? options.allowedOrgs.split(',').map(s => s.trim()).filter(Boolean)
|
|
148
|
+
: [];
|
|
149
|
+
const { authModes, allowedOrganizations } = await (0, auth_prompt_1.promptAuthModes)({
|
|
150
|
+
authModesFromFlag: authModesFromFlag ?? undefined,
|
|
151
|
+
allowedOrgsFromFlag: allowedOrgsFromFlag.length > 0 ? allowedOrgsFromFlag : undefined,
|
|
152
|
+
nonInteractive: !isInteractive,
|
|
153
|
+
});
|
|
154
|
+
if (isInteractive) {
|
|
143
155
|
// Optional: prompt for additional hostnames
|
|
144
156
|
const { addHostnames } = await inquirer_1.default.prompt([
|
|
145
157
|
{
|
|
@@ -152,70 +164,6 @@ async function handleApplicationCreateDockerCompose(options) {
|
|
|
152
164
|
if (addHostnames && typeof addHostnames === 'string') {
|
|
153
165
|
hostnames = addHostnames.split(',').map((s) => s.trim()).filter((s) => s.length > 0);
|
|
154
166
|
}
|
|
155
|
-
// Prompt for managed gateway option
|
|
156
|
-
if (gatewayIds.length === 0) {
|
|
157
|
-
const { useManaged } = await inquirer_1.default.prompt([
|
|
158
|
-
{
|
|
159
|
-
type: 'confirm',
|
|
160
|
-
name: 'useManaged',
|
|
161
|
-
message: 'Use Edgible managed gateway?',
|
|
162
|
-
default: false,
|
|
163
|
-
},
|
|
164
|
-
]);
|
|
165
|
-
useManagedGateway = useManaged;
|
|
166
|
-
if (!useManagedGateway) {
|
|
167
|
-
// Ask if they want to assign a gateway at all
|
|
168
|
-
const { assignGateway } = await inquirer_1.default.prompt([
|
|
169
|
-
{
|
|
170
|
-
type: 'confirm',
|
|
171
|
-
name: 'assignGateway',
|
|
172
|
-
message: 'Assign a gateway to this application? (No = local/internal access only)',
|
|
173
|
-
default: true,
|
|
174
|
-
},
|
|
175
|
-
]);
|
|
176
|
-
if (assignGateway) {
|
|
177
|
-
// Try to offer a list of gateways (via service), else fallback to manual input
|
|
178
|
-
try {
|
|
179
|
-
const gatewaysResp = await instances_1.gatewayService.listGateways();
|
|
180
|
-
const gatewayChoices = gatewaysResp.gateways.map((g) => ({
|
|
181
|
-
name: `${g.device.name} (${g.device.id})`,
|
|
182
|
-
value: g.device.id,
|
|
183
|
-
}));
|
|
184
|
-
if (gatewayChoices.length > 0) {
|
|
185
|
-
const { selectedGateways } = await inquirer_1.default.prompt([
|
|
186
|
-
{
|
|
187
|
-
type: 'checkbox',
|
|
188
|
-
name: 'selectedGateways',
|
|
189
|
-
message: 'Select gateway device(s):',
|
|
190
|
-
choices: gatewayChoices,
|
|
191
|
-
validate: (vals) => vals.length > 0 ? true : 'Select at least one gateway',
|
|
192
|
-
},
|
|
193
|
-
]);
|
|
194
|
-
gatewayIds = selectedGateways;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
catch (error) {
|
|
198
|
-
instances_1.logger.warn('Failed to list gateways', error);
|
|
199
|
-
}
|
|
200
|
-
if (gatewayIds.length === 0) {
|
|
201
|
-
const ans2 = await inquirer_1.default.prompt([
|
|
202
|
-
{
|
|
203
|
-
type: 'input',
|
|
204
|
-
name: 'gatewayIds',
|
|
205
|
-
message: 'Enter comma-separated gateway device IDs (or leave empty for no gateway):',
|
|
206
|
-
validate: (v) => true, // Allow empty input
|
|
207
|
-
},
|
|
208
|
-
]);
|
|
209
|
-
if (ans2.gatewayIds && ans2.gatewayIds.trim()) {
|
|
210
|
-
gatewayIds = (0, input_parser_1.parseGatewayIds)(ans2.gatewayIds);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
instances_1.logger.info('Application will be created without gateway assignment (local/internal access only)');
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
167
|
// Serving device selection
|
|
220
168
|
if (!deviceId) {
|
|
221
169
|
try {
|
|
@@ -309,6 +257,12 @@ async function handleApplicationCreateDockerCompose(options) {
|
|
|
309
257
|
if (hostnames.length > 0) {
|
|
310
258
|
console.log(chalk_1.default.gray(`Additional hostnames: ${hostnames.join(', ')}`));
|
|
311
259
|
}
|
|
260
|
+
if (authModes.length > 0 && !authModes.every((m) => m === 'none')) {
|
|
261
|
+
console.log(chalk_1.default.gray(`Auth modes: ${authModes.join(', ')}`));
|
|
262
|
+
if (allowedOrganizations && allowedOrganizations.length > 0) {
|
|
263
|
+
console.log(chalk_1.default.gray(`Allowed organizations: ${allowedOrganizations.join(', ')}`));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
312
266
|
const result = await instances_1.applicationService.createApplicationProgrammatically({
|
|
313
267
|
name: appName,
|
|
314
268
|
description,
|
|
@@ -319,6 +273,8 @@ async function handleApplicationCreateDockerCompose(options) {
|
|
|
319
273
|
gatewayIds: useManagedGateway ? undefined : gatewayIds,
|
|
320
274
|
useManagedGateway,
|
|
321
275
|
subtype: 'docker-compose',
|
|
276
|
+
authModes,
|
|
277
|
+
allowedOrganizations: allowedOrganizations && allowedOrganizations.length > 0 ? allowedOrganizations : undefined,
|
|
322
278
|
});
|
|
323
279
|
console.log(chalk_1.default.green('\nā Application created successfully!'));
|
|
324
280
|
console.log(chalk_1.default.blue('\nš Application Details:'));
|
|
@@ -7,8 +7,8 @@ export declare function handleApplicationCreateExisting(options: {
|
|
|
7
7
|
deviceId?: string;
|
|
8
8
|
gatewayIds?: string;
|
|
9
9
|
hostnames?: string;
|
|
10
|
-
|
|
10
|
+
authModes?: string;
|
|
11
11
|
allowedOrgs?: string;
|
|
12
|
-
|
|
12
|
+
nonInteractive?: boolean;
|
|
13
13
|
}): Promise<void>;
|
|
14
14
|
//# sourceMappingURL=create-existing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-existing.d.ts","sourceRoot":"","sources":["../../../src/commands/application/create-existing.ts"],"names":[],"mappings":"AASA,wBAAsB,+BAA+B,CAAC,OAAO,EAAE;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,
|
|
1
|
+
{"version":3,"file":"create-existing.d.ts","sourceRoot":"","sources":["../../../src/commands/application/create-existing.ts"],"names":[],"mappings":"AASA,wBAAsB,+BAA+B,CAAC,OAAO,EAAE;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CAuPhB"}
|
|
@@ -10,16 +10,17 @@ const WorkloadDetector_1 = require("../../detection/WorkloadDetector");
|
|
|
10
10
|
const instances_1 = require("../../services/instances");
|
|
11
11
|
const config_validator_1 = require("../utils/config-validator");
|
|
12
12
|
const input_parser_1 = require("../utils/input-parser");
|
|
13
|
+
const auth_prompt_1 = require("../utils/auth-prompt");
|
|
13
14
|
async function handleApplicationCreateExisting(options) {
|
|
14
15
|
(0, config_validator_1.validateConfig)(instances_1.configManager, {
|
|
15
16
|
requireAuth: true,
|
|
16
17
|
requireOrganization: true,
|
|
17
18
|
});
|
|
19
|
+
const isInteractive = options.nonInteractive !== true;
|
|
18
20
|
instances_1.logger.debug('Creating application', { name: options.name });
|
|
19
21
|
// Name
|
|
20
22
|
let appName = options.name;
|
|
21
|
-
|
|
22
|
-
if (!appName && !options.noInteractive) {
|
|
23
|
+
if (!appName && isInteractive) {
|
|
23
24
|
const { name } = await inquirer_1.default.prompt([
|
|
24
25
|
{
|
|
25
26
|
type: 'input',
|
|
@@ -37,41 +38,33 @@ async function handleApplicationCreateExisting(options) {
|
|
|
37
38
|
let description = options.description || `Application for ${appName}`;
|
|
38
39
|
// Port (may be overridden by workload selection in interactive mode)
|
|
39
40
|
let port = (0, input_parser_1.parsePort)(options.port);
|
|
40
|
-
// Protocol
|
|
41
|
-
let protocolUnion =
|
|
42
|
-
|
|
41
|
+
// Protocol: default HTTPS for HTTP(S) apps
|
|
42
|
+
let protocolUnion = options.protocol
|
|
43
|
+
? (0, input_parser_1.parseProtocol)(options.protocol)
|
|
44
|
+
: 'https';
|
|
43
45
|
if (options.httpsUpgrade && protocolUnion === 'http') {
|
|
44
46
|
protocolUnion = 'https';
|
|
45
47
|
}
|
|
46
|
-
// Device IDs (serving) and Gateway IDs
|
|
48
|
+
// Device IDs (serving) and Gateway IDs. If --gateway-ids provided, use own gateways; else Edgible managed (default).
|
|
47
49
|
let deviceId = options.deviceId;
|
|
48
50
|
let gatewayIds = (0, input_parser_1.parseGatewayIds)(options.gatewayIds);
|
|
51
|
+
const useManagedGateway = gatewayIds.length === 0;
|
|
49
52
|
let hostnames = Array.isArray(options.hostnames)
|
|
50
53
|
? options.hostnames
|
|
51
54
|
: (typeof options.hostnames === 'string' && options.hostnames.trim().length > 0
|
|
52
55
|
? options.hostnames.split(',').map(s => s.trim()).filter(Boolean)
|
|
53
56
|
: []);
|
|
54
|
-
//
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
type: 'confirm',
|
|
66
|
-
name: 'upgradeToHttps',
|
|
67
|
-
message: 'Upgrade protocol from HTTP to HTTPS?',
|
|
68
|
-
default: false,
|
|
69
|
-
},
|
|
70
|
-
]);
|
|
71
|
-
if (upgradeToHttps) {
|
|
72
|
-
protocolUnion = 'https';
|
|
73
|
-
}
|
|
74
|
-
}
|
|
57
|
+
// Auth: use authModes (none | org | api-key | org+api-key)
|
|
58
|
+
const authModesFromFlag = (0, auth_prompt_1.parseAuthModes)(options.authModes);
|
|
59
|
+
const allowedOrgsFromFlag = options.allowedOrgs
|
|
60
|
+
? options.allowedOrgs.split(',').map(s => s.trim()).filter(Boolean)
|
|
61
|
+
: [];
|
|
62
|
+
const { authModes, allowedOrganizations } = await (0, auth_prompt_1.promptAuthModes)({
|
|
63
|
+
authModesFromFlag: authModesFromFlag ?? undefined,
|
|
64
|
+
allowedOrgsFromFlag: allowedOrgsFromFlag.length > 0 ? allowedOrgsFromFlag : undefined,
|
|
65
|
+
nonInteractive: !isInteractive,
|
|
66
|
+
});
|
|
67
|
+
if (isInteractive) {
|
|
75
68
|
// Optional: prompt for additional hostnames
|
|
76
69
|
const { addHostnames } = await inquirer_1.default.prompt([
|
|
77
70
|
{
|
|
@@ -84,104 +77,6 @@ async function handleApplicationCreateExisting(options) {
|
|
|
84
77
|
if (addHostnames && typeof addHostnames === 'string') {
|
|
85
78
|
hostnames = addHostnames.split(',').map((s) => s.trim()).filter((s) => s.length > 0);
|
|
86
79
|
}
|
|
87
|
-
// Prompt for organization authentication
|
|
88
|
-
if (options.requireOrgAuth === undefined) {
|
|
89
|
-
const { enableOrgAuth } = await inquirer_1.default.prompt([
|
|
90
|
-
{
|
|
91
|
-
type: 'confirm',
|
|
92
|
-
name: 'enableOrgAuth',
|
|
93
|
-
message: 'Require organization authentication to access this application?',
|
|
94
|
-
default: false,
|
|
95
|
-
},
|
|
96
|
-
]);
|
|
97
|
-
requireOrgAuth = enableOrgAuth;
|
|
98
|
-
if (requireOrgAuth) {
|
|
99
|
-
const { allowOtherOrgs } = await inquirer_1.default.prompt([
|
|
100
|
-
{
|
|
101
|
-
type: 'confirm',
|
|
102
|
-
name: 'allowOtherOrgs',
|
|
103
|
-
message: 'Allow other organizations to access this application?',
|
|
104
|
-
default: false,
|
|
105
|
-
},
|
|
106
|
-
]);
|
|
107
|
-
if (allowOtherOrgs) {
|
|
108
|
-
const { orgIds } = await inquirer_1.default.prompt([
|
|
109
|
-
{
|
|
110
|
-
type: 'input',
|
|
111
|
-
name: 'orgIds',
|
|
112
|
-
message: 'Enter comma-separated organization IDs to allow access:',
|
|
113
|
-
},
|
|
114
|
-
]);
|
|
115
|
-
if (orgIds && typeof orgIds === 'string') {
|
|
116
|
-
allowedOrgs = orgIds.split(',').map((s) => s.trim()).filter((s) => s.length > 0);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
// Prompt for managed gateway option
|
|
122
|
-
if (gatewayIds.length === 0) {
|
|
123
|
-
const { useManaged } = await inquirer_1.default.prompt([
|
|
124
|
-
{
|
|
125
|
-
type: 'confirm',
|
|
126
|
-
name: 'useManaged',
|
|
127
|
-
message: 'Use Edgible managed gateway?',
|
|
128
|
-
default: false,
|
|
129
|
-
},
|
|
130
|
-
]);
|
|
131
|
-
useManagedGateway = useManaged;
|
|
132
|
-
if (!useManagedGateway) {
|
|
133
|
-
// Ask if they want to assign a gateway at all
|
|
134
|
-
const { assignGateway } = await inquirer_1.default.prompt([
|
|
135
|
-
{
|
|
136
|
-
type: 'confirm',
|
|
137
|
-
name: 'assignGateway',
|
|
138
|
-
message: 'Assign a gateway to this application? (No = local/internal access only)',
|
|
139
|
-
default: true,
|
|
140
|
-
},
|
|
141
|
-
]);
|
|
142
|
-
if (assignGateway) {
|
|
143
|
-
// Try to offer a list of gateways (via service), else fallback to manual input
|
|
144
|
-
try {
|
|
145
|
-
const gatewaysResp = await instances_1.gatewayService.listGateways();
|
|
146
|
-
const gatewayChoices = gatewaysResp.gateways.map((g) => ({
|
|
147
|
-
name: `${g.device.name} (${g.device.id})`,
|
|
148
|
-
value: g.device.id,
|
|
149
|
-
}));
|
|
150
|
-
if (gatewayChoices.length > 0) {
|
|
151
|
-
const { selectedGateways } = await inquirer_1.default.prompt([
|
|
152
|
-
{
|
|
153
|
-
type: 'checkbox',
|
|
154
|
-
name: 'selectedGateways',
|
|
155
|
-
message: 'Select gateway device(s):',
|
|
156
|
-
choices: gatewayChoices,
|
|
157
|
-
validate: (vals) => vals.length > 0 ? true : 'Select at least one gateway',
|
|
158
|
-
},
|
|
159
|
-
]);
|
|
160
|
-
gatewayIds = selectedGateways;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
catch (error) {
|
|
164
|
-
instances_1.logger.warn('Failed to list gateways', error);
|
|
165
|
-
}
|
|
166
|
-
if (gatewayIds.length === 0) {
|
|
167
|
-
const ans2 = await inquirer_1.default.prompt([
|
|
168
|
-
{
|
|
169
|
-
type: 'input',
|
|
170
|
-
name: 'gatewayIds',
|
|
171
|
-
message: 'Enter comma-separated gateway device IDs (or leave empty for no gateway):',
|
|
172
|
-
validate: (v) => true, // Allow empty input
|
|
173
|
-
},
|
|
174
|
-
]);
|
|
175
|
-
if (ans2.gatewayIds && ans2.gatewayIds.trim()) {
|
|
176
|
-
gatewayIds = (0, input_parser_1.parseGatewayIds)(ans2.gatewayIds);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
instances_1.logger.info('Application will be created without gateway assignment (local/internal access only)');
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
80
|
// Serving device selection - fetch available serving devices from organization
|
|
186
81
|
if (!deviceId) {
|
|
187
82
|
try {
|
|
@@ -239,7 +134,7 @@ async function handleApplicationCreateExisting(options) {
|
|
|
239
134
|
}
|
|
240
135
|
const subtype = 'local-preexisting';
|
|
241
136
|
// If interactive, allow choosing a local workload
|
|
242
|
-
if (
|
|
137
|
+
if (isInteractive) {
|
|
243
138
|
try {
|
|
244
139
|
const workloads = await WorkloadDetector_1.WorkloadDetector.detectWorkloads();
|
|
245
140
|
const running = workloads.filter((w) => w.status === 'running');
|
|
@@ -326,10 +221,10 @@ async function handleApplicationCreateExisting(options) {
|
|
|
326
221
|
if (hostnames.length > 0) {
|
|
327
222
|
console.log(chalk_1.default.gray(`Additional hostnames: ${hostnames.join(', ')}`));
|
|
328
223
|
}
|
|
329
|
-
if (
|
|
330
|
-
console.log(chalk_1.default.gray(`
|
|
331
|
-
if (
|
|
332
|
-
console.log(chalk_1.default.gray(`Allowed organizations: ${
|
|
224
|
+
if (authModes.length > 0 && !authModes.every((m) => m === 'none')) {
|
|
225
|
+
console.log(chalk_1.default.gray(`Auth modes: ${authModes.join(', ')}`));
|
|
226
|
+
if (allowedOrganizations && allowedOrganizations.length > 0) {
|
|
227
|
+
console.log(chalk_1.default.gray(`Allowed organizations: ${allowedOrganizations.join(', ')}`));
|
|
333
228
|
}
|
|
334
229
|
}
|
|
335
230
|
const result = await instances_1.applicationService.createApplicationProgrammatically({
|
|
@@ -342,8 +237,8 @@ async function handleApplicationCreateExisting(options) {
|
|
|
342
237
|
gatewayIds: useManagedGateway ? undefined : gatewayIds,
|
|
343
238
|
useManagedGateway,
|
|
344
239
|
subtype,
|
|
345
|
-
|
|
346
|
-
allowedOrganizations:
|
|
240
|
+
authModes,
|
|
241
|
+
allowedOrganizations: allowedOrganizations && allowedOrganizations.length > 0 ? allowedOrganizations : undefined,
|
|
347
242
|
});
|
|
348
243
|
console.log(chalk_1.default.green('\nā Application created successfully!'));
|
|
349
244
|
console.log(chalk_1.default.blue('\nš Application Details:'));
|
|
@@ -10,6 +10,8 @@ export declare function handleApplicationCreateManagedProcess(options: {
|
|
|
10
10
|
deviceId?: string;
|
|
11
11
|
gatewayIds?: string;
|
|
12
12
|
hostnames?: string;
|
|
13
|
-
|
|
13
|
+
authModes?: string;
|
|
14
|
+
allowedOrgs?: string;
|
|
15
|
+
nonInteractive?: boolean;
|
|
14
16
|
}): Promise<void>;
|
|
15
17
|
//# sourceMappingURL=create-managed-process.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-managed-process.d.ts","sourceRoot":"","sources":["../../../src/commands/application/create-managed-process.ts"],"names":[],"mappings":"AAQA,wBAAsB,qCAAqC,CAAC,OAAO,EAAE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,
|
|
1
|
+
{"version":3,"file":"create-managed-process.d.ts","sourceRoot":"","sources":["../../../src/commands/application/create-managed-process.ts"],"names":[],"mappings":"AAQA,wBAAsB,qCAAqC,CAAC,OAAO,EAAE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CAiVhB"}
|