@kaitranntt/ccs 7.60.0 → 7.60.1-dev.1

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.
Files changed (82) hide show
  1. package/dist/commands/docker/config-subcommand.d.ts +2 -0
  2. package/dist/commands/docker/config-subcommand.d.ts.map +1 -0
  3. package/dist/commands/docker/config-subcommand.js +53 -0
  4. package/dist/commands/docker/config-subcommand.js.map +1 -0
  5. package/dist/commands/docker/down-subcommand.d.ts +2 -0
  6. package/dist/commands/docker/down-subcommand.d.ts.map +1 -0
  7. package/dist/commands/docker/down-subcommand.js +37 -0
  8. package/dist/commands/docker/down-subcommand.js.map +1 -0
  9. package/dist/commands/docker/help-subcommand.d.ts +2 -0
  10. package/dist/commands/docker/help-subcommand.d.ts.map +1 -0
  11. package/dist/commands/docker/help-subcommand.js +65 -0
  12. package/dist/commands/docker/help-subcommand.js.map +1 -0
  13. package/dist/commands/docker/index.d.ts +2 -0
  14. package/dist/commands/docker/index.d.ts.map +1 -0
  15. package/dist/commands/docker/index.js +58 -0
  16. package/dist/commands/docker/index.js.map +1 -0
  17. package/dist/commands/docker/logs-subcommand.d.ts +2 -0
  18. package/dist/commands/docker/logs-subcommand.d.ts.map +1 -0
  19. package/dist/commands/docker/logs-subcommand.js +50 -0
  20. package/dist/commands/docker/logs-subcommand.js.map +1 -0
  21. package/dist/commands/docker/options.d.ts +23 -0
  22. package/dist/commands/docker/options.d.ts.map +1 -0
  23. package/dist/commands/docker/options.js +101 -0
  24. package/dist/commands/docker/options.js.map +1 -0
  25. package/dist/commands/docker/status-subcommand.d.ts +2 -0
  26. package/dist/commands/docker/status-subcommand.d.ts.map +1 -0
  27. package/dist/commands/docker/status-subcommand.js +54 -0
  28. package/dist/commands/docker/status-subcommand.js.map +1 -0
  29. package/dist/commands/docker/up-subcommand.d.ts +2 -0
  30. package/dist/commands/docker/up-subcommand.d.ts.map +1 -0
  31. package/dist/commands/docker/up-subcommand.js +42 -0
  32. package/dist/commands/docker/up-subcommand.js.map +1 -0
  33. package/dist/commands/docker/update-subcommand.d.ts +2 -0
  34. package/dist/commands/docker/update-subcommand.d.ts.map +1 -0
  35. package/dist/commands/docker/update-subcommand.js +37 -0
  36. package/dist/commands/docker/update-subcommand.js.map +1 -0
  37. package/dist/commands/docker-command.d.ts +2 -0
  38. package/dist/commands/docker-command.d.ts.map +1 -0
  39. package/dist/commands/docker-command.js +6 -0
  40. package/dist/commands/docker-command.js.map +1 -0
  41. package/dist/commands/help-command.d.ts.map +1 -1
  42. package/dist/commands/help-command.js +9 -0
  43. package/dist/commands/help-command.js.map +1 -1
  44. package/dist/commands/index.d.ts +1 -0
  45. package/dist/commands/index.d.ts.map +1 -1
  46. package/dist/commands/index.js +3 -1
  47. package/dist/commands/index.js.map +1 -1
  48. package/dist/commands/root-command-router.d.ts.map +1 -1
  49. package/dist/commands/root-command-router.js +7 -0
  50. package/dist/commands/root-command-router.js.map +1 -1
  51. package/dist/docker/docker-assets.d.ts +25 -0
  52. package/dist/docker/docker-assets.d.ts.map +1 -0
  53. package/dist/docker/docker-assets.js +106 -0
  54. package/dist/docker/docker-assets.js.map +1 -0
  55. package/dist/docker/docker-bootstrap.d.ts +2 -0
  56. package/dist/docker/docker-bootstrap.d.ts.map +1 -0
  57. package/dist/docker/docker-bootstrap.js +51 -0
  58. package/dist/docker/docker-bootstrap.js.map +1 -0
  59. package/dist/docker/docker-executor.d.ts +42 -0
  60. package/dist/docker/docker-executor.d.ts.map +1 -0
  61. package/dist/docker/docker-executor.js +257 -0
  62. package/dist/docker/docker-executor.js.map +1 -0
  63. package/dist/docker/docker-types.d.ts +39 -0
  64. package/dist/docker/docker-types.d.ts.map +1 -0
  65. package/dist/docker/docker-types.js +3 -0
  66. package/dist/docker/docker-types.js.map +1 -0
  67. package/dist/docker/index.d.ts +4 -0
  68. package/dist/docker/index.d.ts.map +1 -0
  69. package/dist/docker/index.js +12 -0
  70. package/dist/docker/index.js.map +1 -0
  71. package/dist/web-server/routes/websearch-routes.d.ts.map +1 -1
  72. package/dist/web-server/routes/websearch-routes.js +22 -3
  73. package/dist/web-server/routes/websearch-routes.js.map +1 -1
  74. package/docker/Dockerfile +85 -0
  75. package/docker/Dockerfile.integrated +23 -0
  76. package/docker/README.md +260 -0
  77. package/docker/docker-compose.integrated.yml +32 -0
  78. package/docker/docker-compose.yml +53 -0
  79. package/docker/entrypoint-integrated.sh +9 -0
  80. package/docker/entrypoint.sh +34 -0
  81. package/docker/supervisord.conf +43 -0
  82. package/package.json +2 -1
@@ -0,0 +1,2 @@
1
+ export declare function handleConfig(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=config-subcommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-subcommand.d.ts","sourceRoot":"","sources":["../../../src/commands/docker/config-subcommand.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDhE"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleConfig = void 0;
4
+ const docker_1 = require("../../docker");
5
+ const ui_1 = require("../../utils/ui");
6
+ const options_1 = require("./options");
7
+ const KNOWN_FLAGS = ['--host'];
8
+ async function handleConfig(args) {
9
+ await (0, ui_1.initUI)();
10
+ const parsed = (0, options_1.parseDockerTarget)(args, KNOWN_FLAGS);
11
+ const errors = [
12
+ ...parsed.errors,
13
+ ...(0, options_1.collectUnexpectedDockerArgs)(parsed.remainingArgs, {
14
+ knownFlags: [],
15
+ maxPositionals: 0,
16
+ }),
17
+ ];
18
+ if (errors.length > 0) {
19
+ console.error((0, ui_1.box)((0, ui_1.fail)(errors.join('\n')), { title: 'Docker', padding: 1 }));
20
+ process.exitCode = 1;
21
+ return;
22
+ }
23
+ try {
24
+ const config = new docker_1.DockerExecutor().getConfig({ host: parsed.host });
25
+ const rows = [
26
+ ['Mode', config.remote ? `remote (${config.host})` : 'local'],
27
+ ['Local CCS Dir', config.ccsDir],
28
+ ['Bundled Docker Dir', config.dockerDir],
29
+ ['Compose File', config.composeFile],
30
+ ['Dockerfile', config.dockerfile],
31
+ ['Supervisor Config', config.supervisordConfig],
32
+ ['Entrypoint', config.entrypoint],
33
+ ['Remote Deploy Dir', config.remoteDeployDir],
34
+ ['Compose Service', config.composeService],
35
+ ['Container Name', config.containerName],
36
+ ['Dashboard Port', String(config.dashboardPort)],
37
+ ['CLIProxy Port', String(config.proxyPort)],
38
+ ];
39
+ console.log((0, ui_1.table)(rows.map(([key, value]) => [(0, ui_1.color)(key, 'primary'), value]), {
40
+ head: ['Setting', 'Value'],
41
+ style: 'ascii',
42
+ }));
43
+ }
44
+ catch (error) {
45
+ console.error((0, ui_1.box)((0, ui_1.fail)(error instanceof Error ? error.message : String(error)), {
46
+ title: 'Docker',
47
+ padding: 1,
48
+ }));
49
+ process.exitCode = 1;
50
+ }
51
+ }
52
+ exports.handleConfig = handleConfig;
53
+ //# sourceMappingURL=config-subcommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-subcommand.js","sourceRoot":"","sources":["../../../src/commands/docker/config-subcommand.ts"],"names":[],"mappings":";;;AAAA,yCAA8C;AAC9C,uCAAiE;AACjE,uCAA2E;AAE3E,MAAM,WAAW,GAAG,CAAC,QAAQ,CAAU,CAAC;AAEjC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,MAAM,IAAA,WAAM,GAAE,CAAC;IACf,MAAM,MAAM,GAAG,IAAA,2BAAiB,EAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG;QACb,GAAG,MAAM,CAAC,MAAM;QAChB,GAAG,IAAA,qCAA2B,EAAC,MAAM,CAAC,aAAa,EAAE;YACnD,UAAU,EAAE,EAAE;YACd,cAAc,EAAE,CAAC;SAClB,CAAC;KACH,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,IAAA,QAAG,EAAC,IAAA,SAAI,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,uBAAc,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG;YACX,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7D,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC;YAChC,CAAC,oBAAoB,EAAE,MAAM,CAAC,SAAS,CAAC;YACxC,CAAC,cAAc,EAAE,MAAM,CAAC,WAAW,CAAC;YACpC,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC;YACjC,CAAC,mBAAmB,EAAE,MAAM,CAAC,iBAAiB,CAAC;YAC/C,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC;YACjC,CAAC,mBAAmB,EAAE,MAAM,CAAC,eAAe,CAAC;YAC7C,CAAC,iBAAiB,EAAE,MAAM,CAAC,cAAc,CAAC;YAC1C,CAAC,gBAAgB,EAAE,MAAM,CAAC,aAAa,CAAC;YACxC,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAChD,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;SAC5C,CAAC;QAEF,OAAO,CAAC,GAAG,CACT,IAAA,UAAK,EACH,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAA,UAAK,EAAC,GAAG,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC,EAC1D;YACE,IAAI,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC;YAC1B,KAAK,EAAE,OAAO;SACf,CACF,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,IAAA,QAAG,EAAC,IAAA,SAAI,EAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;YAChE,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,CAAC;SACX,CAAC,CACH,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AApDD,oCAoDC"}
@@ -0,0 +1,2 @@
1
+ export declare function handleDown(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=down-subcommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"down-subcommand.d.ts","sourceRoot":"","sources":["../../../src/commands/docker/down-subcommand.ts"],"names":[],"mappings":"AAMA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B9D"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleDown = void 0;
4
+ const docker_1 = require("../../docker");
5
+ const ui_1 = require("../../utils/ui");
6
+ const options_1 = require("./options");
7
+ const KNOWN_FLAGS = ['--host'];
8
+ async function handleDown(args) {
9
+ await (0, ui_1.initUI)();
10
+ const parsed = (0, options_1.parseDockerTarget)(args, KNOWN_FLAGS);
11
+ const errors = [
12
+ ...parsed.errors,
13
+ ...(0, options_1.collectUnexpectedDockerArgs)(parsed.remainingArgs, {
14
+ knownFlags: [],
15
+ maxPositionals: 0,
16
+ }),
17
+ ];
18
+ if (errors.length > 0) {
19
+ console.error((0, ui_1.box)((0, ui_1.fail)(errors.join('\n')), { title: 'Docker', padding: 1 }));
20
+ process.exitCode = 1;
21
+ return;
22
+ }
23
+ console.log((0, ui_1.info)(`Stopping Docker stack${parsed.host ? ` on ${parsed.host}` : ''}...`));
24
+ try {
25
+ await new docker_1.DockerExecutor().down({ host: parsed.host });
26
+ console.log((0, ui_1.ok)(`Docker stack stopped${parsed.host ? ` on ${parsed.host}` : ''}.`));
27
+ }
28
+ catch (error) {
29
+ console.error((0, ui_1.box)((0, ui_1.fail)(error instanceof Error ? error.message : String(error)), {
30
+ title: 'Docker',
31
+ padding: 1,
32
+ }));
33
+ process.exitCode = 1;
34
+ }
35
+ }
36
+ exports.handleDown = handleDown;
37
+ //# sourceMappingURL=down-subcommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"down-subcommand.js","sourceRoot":"","sources":["../../../src/commands/docker/down-subcommand.ts"],"names":[],"mappings":";;;AAAA,yCAA8C;AAC9C,uCAA6D;AAC7D,uCAA2E;AAE3E,MAAM,WAAW,GAAG,CAAC,QAAQ,CAAU,CAAC;AAEjC,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,MAAM,IAAA,WAAM,GAAE,CAAC;IACf,MAAM,MAAM,GAAG,IAAA,2BAAiB,EAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG;QACb,GAAG,MAAM,CAAC,MAAM;QAChB,GAAG,IAAA,qCAA2B,EAAC,MAAM,CAAC,aAAa,EAAE;YACnD,UAAU,EAAE,EAAE;YACd,cAAc,EAAE,CAAC;SAClB,CAAC;KACH,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,IAAA,QAAG,EAAC,IAAA,SAAI,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAA,SAAI,EAAC,wBAAwB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACxF,IAAI,CAAC;QACH,MAAM,IAAI,uBAAc,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,IAAA,OAAE,EAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACrF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,IAAA,QAAG,EAAC,IAAA,SAAI,EAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;YAChE,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,CAAC;SACX,CAAC,CACH,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AA9BD,gCA8BC"}
@@ -0,0 +1,2 @@
1
+ export declare function showHelp(): Promise<void>;
2
+ //# sourceMappingURL=help-subcommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help-subcommand.d.ts","sourceRoot":"","sources":["../../../src/commands/docker/help-subcommand.ts"],"names":[],"mappings":"AAEA,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CA+D9C"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.showHelp = void 0;
4
+ const ui_1 = require("../../utils/ui");
5
+ async function showHelp() {
6
+ await (0, ui_1.initUI)();
7
+ console.log('');
8
+ console.log((0, ui_1.header)('Docker Deployment'));
9
+ console.log('');
10
+ console.log((0, ui_1.subheader)('Usage:'));
11
+ console.log(` ${(0, ui_1.color)('ccs docker', 'command')} <command> [options]`);
12
+ console.log('');
13
+ const sections = [
14
+ [
15
+ 'Commands:',
16
+ [
17
+ ['up', 'Build and start the integrated CCS + CLIProxy stack'],
18
+ ['down', 'Stop and remove the integrated stack'],
19
+ ['status', 'Show docker compose and supervisor status'],
20
+ ['update', 'Update CCS and CLIProxy inside the running container'],
21
+ ['logs', 'Show or follow container log output'],
22
+ ['config', 'Show bundled asset paths and deployment defaults'],
23
+ ],
24
+ ],
25
+ [
26
+ 'Common Options:',
27
+ [
28
+ ['--host <target>', 'Run command on a remote host over SSH (single target or SSH alias)'],
29
+ ['--help, -h', 'Show this help message'],
30
+ ],
31
+ ],
32
+ [
33
+ 'Per-Command Options:',
34
+ [
35
+ ['up --port <port>', 'Publish dashboard on a custom host port'],
36
+ ['up --proxy-port <port>', 'Publish CLIProxy on a custom host port'],
37
+ ['logs --follow', 'Stream logs continuously'],
38
+ ['logs --service <name>', 'Filter logs to ccs or cliproxy'],
39
+ ],
40
+ ],
41
+ [
42
+ 'Examples:',
43
+ [
44
+ ['ccs docker up', 'Start the stack locally on ports 3000 and 8317'],
45
+ ['ccs docker up --port 4000 --proxy-port 9317', 'Start locally with custom ports'],
46
+ ['ccs docker --host my-box status', 'Use the documented common-option ordering'],
47
+ ['ccs docker up --host my-box', 'Stage assets to ~/.ccs/docker and deploy remotely'],
48
+ ['ccs docker logs --follow --service ccs', 'Tail dashboard logs only'],
49
+ ['ccs docker update --host my-box', 'Update the running remote stack in place'],
50
+ ],
51
+ ],
52
+ ];
53
+ for (const [title, rows] of sections) {
54
+ console.log((0, ui_1.subheader)(title));
55
+ const width = Math.max(...rows.map(([command]) => command.length));
56
+ for (const [command, description] of rows) {
57
+ console.log(` ${(0, ui_1.color)(command.padEnd(width + 2), 'command')} ${description}`);
58
+ }
59
+ console.log('');
60
+ }
61
+ console.log((0, ui_1.dim)(' Remote deployments use ~/.ccs/docker on the target host to avoid root-only paths.'));
62
+ console.log('');
63
+ }
64
+ exports.showHelp = showHelp;
65
+ //# sourceMappingURL=help-subcommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help-subcommand.js","sourceRoot":"","sources":["../../../src/commands/docker/help-subcommand.ts"],"names":[],"mappings":";;;AAAA,uCAAuE;AAEhE,KAAK,UAAU,QAAQ;IAC5B,MAAM,IAAA,WAAM,GAAE,CAAC;IACf,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,IAAA,WAAM,EAAC,mBAAmB,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,IAAA,cAAS,EAAC,QAAQ,CAAC,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,UAAK,EAAC,YAAY,EAAE,SAAS,CAAC,sBAAsB,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,QAAQ,GAAmC;QAC/C;YACE,WAAW;YACX;gBACE,CAAC,IAAI,EAAE,qDAAqD,CAAC;gBAC7D,CAAC,MAAM,EAAE,sCAAsC,CAAC;gBAChD,CAAC,QAAQ,EAAE,2CAA2C,CAAC;gBACvD,CAAC,QAAQ,EAAE,sDAAsD,CAAC;gBAClE,CAAC,MAAM,EAAE,qCAAqC,CAAC;gBAC/C,CAAC,QAAQ,EAAE,kDAAkD,CAAC;aAC/D;SACF;QACD;YACE,iBAAiB;YACjB;gBACE,CAAC,iBAAiB,EAAE,oEAAoE,CAAC;gBACzF,CAAC,YAAY,EAAE,wBAAwB,CAAC;aACzC;SACF;QACD;YACE,sBAAsB;YACtB;gBACE,CAAC,kBAAkB,EAAE,yCAAyC,CAAC;gBAC/D,CAAC,wBAAwB,EAAE,wCAAwC,CAAC;gBACpE,CAAC,eAAe,EAAE,0BAA0B,CAAC;gBAC7C,CAAC,uBAAuB,EAAE,gCAAgC,CAAC;aAC5D;SACF;QACD;YACE,WAAW;YACX;gBACE,CAAC,eAAe,EAAE,gDAAgD,CAAC;gBACnE,CAAC,6CAA6C,EAAE,iCAAiC,CAAC;gBAClF,CAAC,iCAAiC,EAAE,2CAA2C,CAAC;gBAChF,CAAC,6BAA6B,EAAE,mDAAmD,CAAC;gBACpF,CAAC,wCAAwC,EAAE,0BAA0B,CAAC;gBACtE,CAAC,iCAAiC,EAAE,0CAA0C,CAAC;aAChF;SACF;KACF,CAAC;IAEF,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,IAAA,cAAS,EAAC,KAAK,CAAC,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACnE,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,UAAK,EAAC,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CACT,IAAA,QAAG,EAAC,qFAAqF,CAAC,CAC3F,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AA/DD,4BA+DC"}
@@ -0,0 +1,2 @@
1
+ export declare function handleDockerCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/docker/index.ts"],"names":[],"mappings":"AA8BA,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCvE"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleDockerCommand = void 0;
4
+ const arg_extractor_1 = require("../arg-extractor");
5
+ const config_subcommand_1 = require("./config-subcommand");
6
+ const down_subcommand_1 = require("./down-subcommand");
7
+ const help_subcommand_1 = require("./help-subcommand");
8
+ const logs_subcommand_1 = require("./logs-subcommand");
9
+ const status_subcommand_1 = require("./status-subcommand");
10
+ const up_subcommand_1 = require("./up-subcommand");
11
+ const update_subcommand_1 = require("./update-subcommand");
12
+ function normalizeLeadingHostArg(args) {
13
+ const firstToken = args[0];
14
+ if (!firstToken || (firstToken !== '--host' && !firstToken.startsWith('--host='))) {
15
+ return args;
16
+ }
17
+ const extracted = (0, arg_extractor_1.extractOption)(args, ['--host'], {
18
+ knownFlags: ['--host', '--help', '-h'],
19
+ });
20
+ if (extracted.missingValue || !extracted.value?.trim()) {
21
+ return args;
22
+ }
23
+ const command = extracted.remainingArgs[0];
24
+ if (!command || command.startsWith('-')) {
25
+ return args;
26
+ }
27
+ return [command, '--host', extracted.value.trim(), ...extracted.remainingArgs.slice(1)];
28
+ }
29
+ async function handleDockerCommand(args) {
30
+ const normalizedArgs = normalizeLeadingHostArg(args);
31
+ if ((0, arg_extractor_1.hasAnyFlag)(normalizedArgs, ['--help', '-h'])) {
32
+ await (0, help_subcommand_1.showHelp)();
33
+ return;
34
+ }
35
+ const command = normalizedArgs[0];
36
+ const commandHandlers = {
37
+ up: up_subcommand_1.handleUp,
38
+ down: down_subcommand_1.handleDown,
39
+ status: status_subcommand_1.handleStatus,
40
+ update: update_subcommand_1.handleUpdate,
41
+ logs: logs_subcommand_1.handleLogs,
42
+ config: config_subcommand_1.handleConfig,
43
+ help: async () => (0, help_subcommand_1.showHelp)(),
44
+ };
45
+ if (!command) {
46
+ await (0, help_subcommand_1.showHelp)();
47
+ return;
48
+ }
49
+ const handler = commandHandlers[command];
50
+ if (!handler) {
51
+ await (0, help_subcommand_1.showHelp)();
52
+ process.exitCode = 1;
53
+ return;
54
+ }
55
+ await handler(normalizedArgs.slice(1));
56
+ }
57
+ exports.handleDockerCommand = handleDockerCommand;
58
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/docker/index.ts"],"names":[],"mappings":";;;AAAA,oDAA6D;AAC7D,2DAAmD;AACnD,uDAA+C;AAC/C,uDAA6C;AAC7C,uDAA+C;AAC/C,2DAAmD;AACnD,mDAA2C;AAC3C,2DAAmD;AAEnD,SAAS,uBAAuB,CAAC,IAAc;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAClF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,IAAA,6BAAa,EAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE;QAChD,UAAU,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC;KACvC,CAAC,CAAC;IACH,IAAI,SAAS,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1F,CAAC;AAEM,KAAK,UAAU,mBAAmB,CAAC,IAAc;IACtD,MAAM,cAAc,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAErD,IAAI,IAAA,0BAAU,EAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAA,0BAAQ,GAAE,CAAC;QACjB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,eAAe,GAAyD;QAC5E,EAAE,EAAE,wBAAQ;QACZ,IAAI,EAAE,4BAAU;QAChB,MAAM,EAAE,gCAAY;QACpB,MAAM,EAAE,gCAAY;QACpB,IAAI,EAAE,4BAAU;QAChB,MAAM,EAAE,gCAAY;QACpB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAA,0BAAQ,GAAE;KAC7B,CAAC;IAEF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAA,0BAAQ,GAAE,CAAC;QACjB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAA,0BAAQ,GAAE,CAAC;QACjB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAhCD,kDAgCC"}
@@ -0,0 +1,2 @@
1
+ export declare function handleLogs(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=logs-subcommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs-subcommand.d.ts","sourceRoot":"","sources":["../../../src/commands/docker/logs-subcommand.ts"],"names":[],"mappings":"AAMA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4C9D"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleLogs = void 0;
4
+ const docker_1 = require("../../docker");
5
+ const ui_1 = require("../../utils/ui");
6
+ const options_1 = require("./options");
7
+ const KNOWN_FLAGS = ['--host', '--follow', '--service'];
8
+ async function handleLogs(args) {
9
+ await (0, ui_1.initUI)();
10
+ const parsed = (0, options_1.parseDockerLogsOptions)(args, KNOWN_FLAGS);
11
+ const errors = [
12
+ ...parsed.errors,
13
+ ...(0, options_1.collectUnexpectedDockerArgs)(parsed.remainingArgs, {
14
+ knownFlags: ['--follow'],
15
+ maxPositionals: 0,
16
+ }),
17
+ ];
18
+ if (errors.length > 0) {
19
+ console.error((0, ui_1.box)((0, ui_1.fail)(errors.join('\n')), { title: 'Docker', padding: 1 }));
20
+ process.exitCode = 1;
21
+ return;
22
+ }
23
+ const executor = new docker_1.DockerExecutor();
24
+ try {
25
+ if (parsed.follow) {
26
+ console.log((0, ui_1.info)(`Following Docker logs${parsed.host ? ` on ${parsed.host}` : ''}...`));
27
+ await executor.logs({
28
+ host: parsed.host,
29
+ follow: true,
30
+ service: parsed.service,
31
+ });
32
+ return;
33
+ }
34
+ const output = await executor.logs({
35
+ host: parsed.host,
36
+ follow: false,
37
+ service: parsed.service,
38
+ });
39
+ console.log(output ?? '');
40
+ }
41
+ catch (error) {
42
+ console.error((0, ui_1.box)((0, ui_1.fail)(error instanceof Error ? error.message : String(error)), {
43
+ title: 'Docker',
44
+ padding: 1,
45
+ }));
46
+ process.exitCode = 1;
47
+ }
48
+ }
49
+ exports.handleLogs = handleLogs;
50
+ //# sourceMappingURL=logs-subcommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs-subcommand.js","sourceRoot":"","sources":["../../../src/commands/docker/logs-subcommand.ts"],"names":[],"mappings":";;;AAAA,yCAA8C;AAC9C,uCAAyD;AACzD,uCAAgF;AAEhF,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAU,CAAC;AAE1D,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,MAAM,IAAA,WAAM,GAAE,CAAC;IACf,MAAM,MAAM,GAAG,IAAA,gCAAsB,EAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG;QACb,GAAG,MAAM,CAAC,MAAM;QAChB,GAAG,IAAA,qCAA2B,EAAC,MAAM,CAAC,aAAa,EAAE;YACnD,UAAU,EAAE,CAAC,UAAU,CAAC;YACxB,cAAc,EAAE,CAAC;SAClB,CAAC;KACH,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,IAAA,QAAG,EAAC,IAAA,SAAI,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,uBAAc,EAAE,CAAC;IACtC,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,IAAA,SAAI,EAAC,wBAAwB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YACxF,MAAM,QAAQ,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;YACjC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,IAAA,QAAG,EAAC,IAAA,SAAI,EAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;YAChE,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,CAAC;SACX,CAAC,CACH,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AA5CD,gCA4CC"}
@@ -0,0 +1,23 @@
1
+ import type { DockerLogService } from '../../docker';
2
+ export interface ParsedDockerTarget {
3
+ errors: string[];
4
+ remainingArgs: string[];
5
+ host?: string;
6
+ }
7
+ export interface ParsedDockerUpOptions extends ParsedDockerTarget {
8
+ port?: number;
9
+ proxyPort?: number;
10
+ }
11
+ export interface ParsedDockerLogsOptions extends ParsedDockerTarget {
12
+ follow: boolean;
13
+ service?: DockerLogService;
14
+ }
15
+ export declare function parseDockerTarget(args: string[], knownFlags: readonly string[]): ParsedDockerTarget;
16
+ export declare function parseDockerUpOptions(args: string[], knownFlags: readonly string[]): ParsedDockerUpOptions;
17
+ export declare function parseDockerLogsOptions(args: string[], knownFlags: readonly string[]): ParsedDockerLogsOptions;
18
+ export declare function collectUnexpectedDockerArgs(args: string[], options: {
19
+ knownFlags: readonly string[];
20
+ valueFlags?: readonly string[];
21
+ maxPositionals?: number;
22
+ }): string[];
23
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/commands/docker/options.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B;AAqBD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,kBAAkB,CAsBpB;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EAAE,EACd,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,qBAAqB,CAkBvB;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EAAE,EACd,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,uBAAuB,CAuBzB;AAED,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;IACP,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GACA,MAAM,EAAE,CAWV"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.collectUnexpectedDockerArgs = exports.parseDockerLogsOptions = exports.parseDockerUpOptions = exports.parseDockerTarget = void 0;
4
+ const arg_extractor_1 = require("../arg-extractor");
5
+ function parseNumberOption(args, flag, knownFlags) {
6
+ const extracted = (0, arg_extractor_1.extractOption)(args, [flag], { knownFlags });
7
+ if (!extracted.found) {
8
+ return { remainingArgs: args };
9
+ }
10
+ if (extracted.missingValue || !extracted.value) {
11
+ return { remainingArgs: extracted.remainingArgs, error: `Missing value for ${flag}` };
12
+ }
13
+ const value = Number.parseInt(extracted.value, 10);
14
+ if (Number.isNaN(value) || value <= 0 || value >= 65536) {
15
+ return { remainingArgs: extracted.remainingArgs, error: `Invalid value for ${flag}` };
16
+ }
17
+ return { value, remainingArgs: extracted.remainingArgs };
18
+ }
19
+ function parseDockerTarget(args, knownFlags) {
20
+ const extracted = (0, arg_extractor_1.extractOption)(args, ['--host'], { knownFlags });
21
+ if (!extracted.found) {
22
+ return { errors: [], remainingArgs: args };
23
+ }
24
+ if (extracted.missingValue || !extracted.value?.trim()) {
25
+ return { errors: ['Missing value for --host'], remainingArgs: extracted.remainingArgs };
26
+ }
27
+ const host = extracted.value.trim();
28
+ if (host.startsWith('-') || /\s/.test(host)) {
29
+ return {
30
+ errors: [
31
+ 'Invalid value for --host. Use a single SSH target or SSH config alias such as my-box or user@host.',
32
+ ],
33
+ remainingArgs: extracted.remainingArgs,
34
+ };
35
+ }
36
+ return {
37
+ errors: [],
38
+ remainingArgs: extracted.remainingArgs,
39
+ host,
40
+ };
41
+ }
42
+ exports.parseDockerTarget = parseDockerTarget;
43
+ function parseDockerUpOptions(args, knownFlags) {
44
+ const target = parseDockerTarget(args, knownFlags);
45
+ const port = parseNumberOption(target.remainingArgs, '--port', knownFlags);
46
+ const proxyPort = parseNumberOption(port.remainingArgs, '--proxy-port', knownFlags);
47
+ const errors = [...target.errors];
48
+ if (port.error) {
49
+ errors.push(port.error);
50
+ }
51
+ if (proxyPort.error) {
52
+ errors.push(proxyPort.error);
53
+ }
54
+ return {
55
+ ...target,
56
+ remainingArgs: proxyPort.remainingArgs,
57
+ port: port.value,
58
+ proxyPort: proxyPort.value,
59
+ errors,
60
+ };
61
+ }
62
+ exports.parseDockerUpOptions = parseDockerUpOptions;
63
+ function parseDockerLogsOptions(args, knownFlags) {
64
+ const target = parseDockerTarget(args, knownFlags);
65
+ const service = (0, arg_extractor_1.extractOption)(target.remainingArgs, ['--service'], { knownFlags });
66
+ let parsedService;
67
+ const errors = [...target.errors];
68
+ if (service.found) {
69
+ if (service.missingValue || !service.value) {
70
+ errors.push('Missing value for --service');
71
+ }
72
+ else if (service.value !== 'ccs' && service.value !== 'cliproxy') {
73
+ errors.push('Invalid value for --service. Use: ccs or cliproxy');
74
+ }
75
+ else {
76
+ parsedService = service.value;
77
+ }
78
+ }
79
+ return {
80
+ ...target,
81
+ remainingArgs: service.remainingArgs,
82
+ follow: (0, arg_extractor_1.hasAnyFlag)(service.remainingArgs, ['--follow']),
83
+ service: parsedService,
84
+ errors,
85
+ };
86
+ }
87
+ exports.parseDockerLogsOptions = parseDockerLogsOptions;
88
+ function collectUnexpectedDockerArgs(args, options) {
89
+ const scanned = (0, arg_extractor_1.scanCommandArgs)(args, {
90
+ knownFlags: options.knownFlags,
91
+ valueFlags: options.valueFlags,
92
+ });
93
+ const errors = scanned.unknownFlags.map((flag) => `Unknown option: ${flag}`);
94
+ const maxPositionals = options.maxPositionals ?? 0;
95
+ if (scanned.positionals.length > maxPositionals) {
96
+ errors.push(`Unexpected arguments: ${scanned.positionals.slice(maxPositionals).join(' ')}`);
97
+ }
98
+ return errors;
99
+ }
100
+ exports.collectUnexpectedDockerArgs = collectUnexpectedDockerArgs;
101
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/commands/docker/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function handleStatus(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=status-subcommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-subcommand.d.ts","sourceRoot":"","sources":["../../../src/commands/docker/status-subcommand.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDhE"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleStatus = void 0;
4
+ const docker_1 = require("../../docker");
5
+ const ui_1 = require("../../utils/ui");
6
+ const options_1 = require("./options");
7
+ const KNOWN_FLAGS = ['--host'];
8
+ async function handleStatus(args) {
9
+ await (0, ui_1.initUI)();
10
+ const parsed = (0, options_1.parseDockerTarget)(args, KNOWN_FLAGS);
11
+ const errors = [
12
+ ...parsed.errors,
13
+ ...(0, options_1.collectUnexpectedDockerArgs)(parsed.remainingArgs, {
14
+ knownFlags: [],
15
+ maxPositionals: 0,
16
+ }),
17
+ ];
18
+ if (errors.length > 0) {
19
+ console.error((0, ui_1.box)((0, ui_1.fail)(errors.join('\n')), { title: 'Docker', padding: 1 }));
20
+ process.exitCode = 1;
21
+ return;
22
+ }
23
+ try {
24
+ const status = await new docker_1.DockerExecutor().status({ host: parsed.host });
25
+ console.log((0, ui_1.ok)(`Docker status${parsed.host ? ` for ${parsed.host}` : ''}`));
26
+ console.log('');
27
+ console.log((0, ui_1.subheader)('Compose:'));
28
+ console.log(status.compose.stdout.trim() || (0, ui_1.info)('No docker compose output.'));
29
+ if (status.supervisor?.exitCode === 0 && status.supervisor.stdout.trim()) {
30
+ console.log('');
31
+ console.log((0, ui_1.subheader)('Supervisor:'));
32
+ console.log(status.supervisor.stdout.trim());
33
+ }
34
+ else if (status.supervisor) {
35
+ console.log('');
36
+ console.log((0, ui_1.subheader)('Supervisor:'));
37
+ const detail = (status.supervisor.stderr || status.supervisor.stdout).trim();
38
+ console.log((0, ui_1.info)(`Supervisor status check failed for ${(0, ui_1.color)('ccs-cliproxy', 'command')}.\n${detail || 'No additional detail provided.'}`));
39
+ }
40
+ else {
41
+ console.log('');
42
+ console.log((0, ui_1.info)(`Supervisor status unavailable for ${(0, ui_1.color)('ccs-cliproxy', 'command')}.`));
43
+ }
44
+ }
45
+ catch (error) {
46
+ console.error((0, ui_1.box)((0, ui_1.fail)(error instanceof Error ? error.message : String(error)), {
47
+ title: 'Docker',
48
+ padding: 1,
49
+ }));
50
+ process.exitCode = 1;
51
+ }
52
+ }
53
+ exports.handleStatus = handleStatus;
54
+ //# sourceMappingURL=status-subcommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-subcommand.js","sourceRoot":"","sources":["../../../src/commands/docker/status-subcommand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function handleUp(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=up-subcommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"up-subcommand.d.ts","sourceRoot":"","sources":["../../../src/commands/docker/up-subcommand.ts"],"names":[],"mappings":"AAUA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC5D"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleUp = void 0;
4
+ const docker_1 = require("../../docker");
5
+ const ui_1 = require("../../utils/ui");
6
+ const options_1 = require("./options");
7
+ const KNOWN_FLAGS = ['--host', '--port', '--proxy-port'];
8
+ async function handleUp(args) {
9
+ await (0, ui_1.initUI)();
10
+ const parsed = (0, options_1.parseDockerUpOptions)(args, KNOWN_FLAGS);
11
+ const errors = [
12
+ ...parsed.errors,
13
+ ...(0, options_1.collectUnexpectedDockerArgs)(parsed.remainingArgs, {
14
+ knownFlags: [],
15
+ maxPositionals: 0,
16
+ }),
17
+ ];
18
+ if (errors.length > 0) {
19
+ console.error((0, ui_1.box)((0, ui_1.fail)(errors.join('\n')), { title: 'Docker', padding: 1 }));
20
+ process.exitCode = 1;
21
+ return;
22
+ }
23
+ const executor = new docker_1.DockerExecutor();
24
+ const port = parsed.port ?? docker_1.DOCKER_DEFAULT_DASHBOARD_PORT;
25
+ const proxyPort = parsed.proxyPort ?? docker_1.DOCKER_DEFAULT_PROXY_PORT;
26
+ console.log((0, ui_1.info)(`Starting integrated Docker stack${parsed.host ? ` on ${parsed.host}` : ''}...`));
27
+ try {
28
+ await executor.up({ host: parsed.host, port, proxyPort });
29
+ console.log((0, ui_1.ok)(`Docker stack is running${parsed.host ? ` on ${parsed.host}` : ' locally'}.`));
30
+ console.log((0, ui_1.info)(`Dashboard port: ${port}`));
31
+ console.log((0, ui_1.info)(`CLIProxy port: ${proxyPort}`));
32
+ }
33
+ catch (error) {
34
+ console.error((0, ui_1.box)((0, ui_1.fail)(error instanceof Error ? error.message : String(error)), {
35
+ title: 'Docker',
36
+ padding: 1,
37
+ }));
38
+ process.exitCode = 1;
39
+ }
40
+ }
41
+ exports.handleUp = handleUp;
42
+ //# sourceMappingURL=up-subcommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"up-subcommand.js","sourceRoot":"","sources":["../../../src/commands/docker/up-subcommand.ts"],"names":[],"mappings":";;;AAAA,yCAIsB;AACtB,uCAA6D;AAC7D,uCAA8E;AAE9E,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAU,CAAC;AAE3D,KAAK,UAAU,QAAQ,CAAC,IAAc;IAC3C,MAAM,IAAA,WAAM,GAAE,CAAC;IACf,MAAM,MAAM,GAAG,IAAA,8BAAoB,EAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG;QACb,GAAG,MAAM,CAAC,MAAM;QAChB,GAAG,IAAA,qCAA2B,EAAC,MAAM,CAAC,aAAa,EAAE;YACnD,UAAU,EAAE,EAAE;YACd,cAAc,EAAE,CAAC;SAClB,CAAC;KACH,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,IAAA,QAAG,EAAC,IAAA,SAAI,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,uBAAc,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,sCAA6B,CAAC;IAC1D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,kCAAyB,CAAC;IAEhE,OAAO,CAAC,GAAG,CACT,IAAA,SAAI,EAAC,mCAAmC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CACtF,CAAC;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,IAAA,OAAE,EAAC,0BAA0B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,GAAG,CAAC,IAAA,SAAI,EAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,IAAA,SAAI,EAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,IAAA,QAAG,EAAC,IAAA,SAAI,EAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;YAChE,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,CAAC;SACX,CAAC,CACH,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAtCD,4BAsCC"}
@@ -0,0 +1,2 @@
1
+ export declare function handleUpdate(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=update-subcommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-subcommand.d.ts","sourceRoot":"","sources":["../../../src/commands/docker/update-subcommand.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BhE"}