@calltelemetry/cli 0.12.11 → 0.12.12

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 (145) hide show
  1. package/dist/commands/config.d.ts +25 -0
  2. package/dist/commands/config.d.ts.map +1 -1
  3. package/dist/commands/config.js +42 -3
  4. package/dist/commands/config.js.map +1 -1
  5. package/dist/commands/db.d.ts +24 -0
  6. package/dist/commands/db.d.ts.map +1 -1
  7. package/dist/commands/db.js +43 -4
  8. package/dist/commands/db.js.map +1 -1
  9. package/dist/commands/go-parity.d.ts +32 -0
  10. package/dist/commands/go-parity.d.ts.map +1 -0
  11. package/dist/commands/go-parity.js +359 -0
  12. package/dist/commands/go-parity.js.map +1 -0
  13. package/dist/commands/jtapi.d.ts.map +1 -1
  14. package/dist/commands/jtapi.js +2 -0
  15. package/dist/commands/jtapi.js.map +1 -1
  16. package/dist/commands/migrate.d.ts.map +1 -1
  17. package/dist/commands/migrate.js +2 -0
  18. package/dist/commands/migrate.js.map +1 -1
  19. package/dist/commands/network.d.ts.map +1 -1
  20. package/dist/commands/network.js +63 -50
  21. package/dist/commands/network.js.map +1 -1
  22. package/dist/commands/offline.d.ts.map +1 -1
  23. package/dist/commands/offline.js +2 -0
  24. package/dist/commands/offline.js.map +1 -1
  25. package/dist/commands/seed.d.ts.map +1 -1
  26. package/dist/commands/seed.js +2 -0
  27. package/dist/commands/seed.js.map +1 -1
  28. package/dist/commands/ship-certs.d.ts +7 -0
  29. package/dist/commands/ship-certs.d.ts.map +1 -0
  30. package/dist/commands/ship-certs.js +105 -0
  31. package/dist/commands/ship-certs.js.map +1 -0
  32. package/dist/commands/ship-db.d.ts +8 -0
  33. package/dist/commands/ship-db.d.ts.map +1 -0
  34. package/dist/commands/ship-db.js +358 -0
  35. package/dist/commands/ship-db.js.map +1 -0
  36. package/dist/commands/ship-diag.d.ts +10 -0
  37. package/dist/commands/ship-diag.d.ts.map +1 -0
  38. package/dist/commands/ship-diag.js +73 -0
  39. package/dist/commands/ship-diag.js.map +1 -0
  40. package/dist/commands/ship-ipv6.d.ts +6 -0
  41. package/dist/commands/ship-ipv6.d.ts.map +1 -0
  42. package/dist/commands/ship-ipv6.js +59 -0
  43. package/dist/commands/ship-ipv6.js.map +1 -0
  44. package/dist/commands/ship-logging.d.ts +7 -0
  45. package/dist/commands/ship-logging.d.ts.map +1 -0
  46. package/dist/commands/ship-logging.js +71 -0
  47. package/dist/commands/ship-logging.js.map +1 -0
  48. package/dist/commands/ship-migrate.d.ts +6 -0
  49. package/dist/commands/ship-migrate.d.ts.map +1 -0
  50. package/dist/commands/ship-migrate.js +152 -0
  51. package/dist/commands/ship-migrate.js.map +1 -0
  52. package/dist/commands/ship-os-updates.d.ts +6 -0
  53. package/dist/commands/ship-os-updates.d.ts.map +1 -0
  54. package/dist/commands/ship-os-updates.js +116 -0
  55. package/dist/commands/ship-os-updates.js.map +1 -0
  56. package/dist/commands/ship-postgres.d.ts +6 -0
  57. package/dist/commands/ship-postgres.d.ts.map +1 -0
  58. package/dist/commands/ship-postgres.js +84 -0
  59. package/dist/commands/ship-postgres.js.map +1 -0
  60. package/dist/commands/ship-services.d.ts +7 -0
  61. package/dist/commands/ship-services.d.ts.map +1 -0
  62. package/dist/commands/ship-services.js +127 -0
  63. package/dist/commands/ship-services.js.map +1 -0
  64. package/dist/commands/ship-sql-monitor.d.ts +6 -0
  65. package/dist/commands/ship-sql-monitor.d.ts.map +1 -0
  66. package/dist/commands/ship-sql-monitor.js +89 -0
  67. package/dist/commands/ship-sql-monitor.js.map +1 -0
  68. package/dist/commands/ship-status.d.ts +6 -0
  69. package/dist/commands/ship-status.d.ts.map +1 -0
  70. package/dist/commands/ship-status.js +21 -0
  71. package/dist/commands/ship-status.js.map +1 -0
  72. package/dist/commands/ship-update.d.ts +31 -0
  73. package/dist/commands/ship-update.d.ts.map +1 -0
  74. package/dist/commands/ship-update.js +234 -0
  75. package/dist/commands/ship-update.js.map +1 -0
  76. package/dist/commands/ship-users.d.ts +7 -0
  77. package/dist/commands/ship-users.d.ts.map +1 -0
  78. package/dist/commands/ship-users.js +118 -0
  79. package/dist/commands/ship-users.js.map +1 -0
  80. package/dist/commands/update.d.ts +45 -0
  81. package/dist/commands/update.d.ts.map +1 -1
  82. package/dist/commands/update.js +74 -3
  83. package/dist/commands/update.js.map +1 -1
  84. package/dist/commands/users.d.ts.map +1 -1
  85. package/dist/commands/users.js +51 -0
  86. package/dist/commands/users.js.map +1 -1
  87. package/dist/index.js +3 -72
  88. package/dist/index.js.map +1 -1
  89. package/dist/lib/network-apply.d.ts +102 -0
  90. package/dist/lib/network-apply.d.ts.map +1 -0
  91. package/dist/lib/network-apply.js +472 -0
  92. package/dist/lib/network-apply.js.map +1 -0
  93. package/dist/lib/ops-port.d.ts +205 -0
  94. package/dist/lib/ops-port.d.ts.map +1 -0
  95. package/dist/lib/ops-port.js +906 -0
  96. package/dist/lib/ops-port.js.map +1 -0
  97. package/dist/lib/public-doc.d.ts +37 -0
  98. package/dist/lib/public-doc.d.ts.map +1 -0
  99. package/dist/lib/public-doc.js +27 -0
  100. package/dist/lib/public-doc.js.map +1 -0
  101. package/dist/lib/ship-identity.d.ts +9 -0
  102. package/dist/lib/ship-identity.d.ts.map +1 -0
  103. package/dist/lib/ship-identity.js +12 -0
  104. package/dist/lib/ship-identity.js.map +1 -0
  105. package/dist/lib/ship-logo.d.ts +11 -0
  106. package/dist/lib/ship-logo.d.ts.map +1 -0
  107. package/dist/lib/ship-logo.js +17 -0
  108. package/dist/lib/ship-logo.js.map +1 -0
  109. package/dist/lib/ship-status.d.ts +21 -0
  110. package/dist/lib/ship-status.d.ts.map +1 -0
  111. package/dist/lib/ship-status.js +82 -0
  112. package/dist/lib/ship-status.js.map +1 -0
  113. package/dist/lib/version.d.ts +1 -1
  114. package/dist/lib/version.js +1 -1
  115. package/dist/program.d.ts +22 -0
  116. package/dist/program.d.ts.map +1 -0
  117. package/dist/program.js +124 -0
  118. package/dist/program.js.map +1 -0
  119. package/dist/shell/commands/diag.d.ts.map +1 -1
  120. package/dist/shell/commands/diag.js +47 -19
  121. package/dist/shell/commands/diag.js.map +1 -1
  122. package/dist/shell/commands/ops-mutates.d.ts +16 -0
  123. package/dist/shell/commands/ops-mutates.d.ts.map +1 -0
  124. package/dist/shell/commands/ops-mutates.js +62 -0
  125. package/dist/shell/commands/ops-mutates.js.map +1 -0
  126. package/dist/shell/commands/registry.d.ts.map +1 -1
  127. package/dist/shell/commands/registry.js +43 -0
  128. package/dist/shell/commands/registry.js.map +1 -1
  129. package/dist/shell/commands/show.d.ts +12 -0
  130. package/dist/shell/commands/show.d.ts.map +1 -1
  131. package/dist/shell/commands/show.js +190 -10
  132. package/dist/shell/commands/show.js.map +1 -1
  133. package/dist/shell/commands/telemetry.d.ts +11 -0
  134. package/dist/shell/commands/telemetry.d.ts.map +1 -0
  135. package/dist/shell/commands/telemetry.js +49 -0
  136. package/dist/shell/commands/telemetry.js.map +1 -0
  137. package/dist/shell/network-onboarding.d.ts +7 -4
  138. package/dist/shell/network-onboarding.d.ts.map +1 -1
  139. package/dist/shell/network-onboarding.js +22 -38
  140. package/dist/shell/network-onboarding.js.map +1 -1
  141. package/dist/ship-entry.d.ts +3 -0
  142. package/dist/ship-entry.d.ts.map +1 -0
  143. package/dist/ship-entry.js +121 -0
  144. package/dist/ship-entry.js.map +1 -0
  145. package/package.json +9 -2
@@ -0,0 +1,84 @@
1
+ import { getPostgresVersion, getCurrentPostgresImage, setPostgresVersion, applyPgProfile, getPgProfileStatus, VALID_PROFILES, } from '../lib/postgres.js';
2
+ import { fetchPostgresPerformance, postgresPerformanceLines } from '../lib/postgres-performance.js';
3
+ import { getPaths } from '../lib/paths.js';
4
+ import * as out from '../utils/output.js';
5
+ export function registerShipPostgresCommand(program) {
6
+ const pg = program
7
+ .command('postgres [action] [version]')
8
+ .description('PostgreSQL version and connection profile management')
9
+ .action(async (action, version) => {
10
+ try {
11
+ const { postgresSupportedVersions } = getPaths();
12
+ if (!action || action === 'status') {
13
+ out.header('PostgreSQL Configuration');
14
+ console.log(`Configured version: ${getPostgresVersion()}`);
15
+ console.log(`Current image: ${getCurrentPostgresImage()}`);
16
+ console.log(`Supported versions: ${postgresSupportedVersions.join(', ')}`);
17
+ const { profile, settings } = getPgProfileStatus();
18
+ console.log(`Connection profile: ${profile}`);
19
+ for (const [key, value] of Object.entries(settings)) {
20
+ console.log(` ${key.padEnd(30)} ${value}`);
21
+ }
22
+ try {
23
+ const performance = await fetchPostgresPerformance();
24
+ console.log();
25
+ console.log('Timing and WAL performance:');
26
+ for (const line of postgresPerformanceLines(performance)) {
27
+ console.log(` ${line.label.padEnd(24)} ${line.value}`);
28
+ }
29
+ }
30
+ catch (err) {
31
+ console.log();
32
+ console.log(`Timing and WAL performance: unavailable (${err.message})`);
33
+ }
34
+ console.log();
35
+ console.log('Usage:');
36
+ console.log(' ct postgres set <version>');
37
+ console.log(` ct postgres profile <${VALID_PROFILES.join('|')}|show>`);
38
+ return;
39
+ }
40
+ if (action === 'profile') {
41
+ if (!version || version === 'show') {
42
+ const { profile, settings } = getPgProfileStatus();
43
+ out.header(`PostgreSQL Profile: ${profile}`);
44
+ for (const [key, value] of Object.entries(settings)) {
45
+ console.log(` ${key.padEnd(30)} ${value}`);
46
+ }
47
+ console.log(`Available: ${VALID_PROFILES.join(', ')}`);
48
+ return;
49
+ }
50
+ if (!VALID_PROFILES.includes(version)) {
51
+ out.fail(`Invalid profile '${version}'`);
52
+ console.log(`Available: ${VALID_PROFILES.join(', ')}`);
53
+ process.exitCode = 1;
54
+ return;
55
+ }
56
+ await applyPgProfile(version);
57
+ out.ok(`PostgreSQL profile set to: ${version}`);
58
+ out.info('Restart services to apply — ct restart or ct services restart db');
59
+ return;
60
+ }
61
+ if (action === 'set') {
62
+ if (!version) {
63
+ console.log('Usage: ct postgres set <version>');
64
+ console.log(`Supported: ${postgresSupportedVersions.join(', ')}`);
65
+ process.exitCode = 1;
66
+ return;
67
+ }
68
+ await setPostgresVersion(version);
69
+ out.ok(`PostgreSQL version set to ${version}`);
70
+ console.log("Note: Run 'ct update' to apply.");
71
+ return;
72
+ }
73
+ out.fail(`Unknown postgres command: ${action}`);
74
+ console.log('Usage: ct postgres status|set|profile');
75
+ process.exitCode = 1;
76
+ }
77
+ catch (err) {
78
+ out.fail(err instanceof Error ? err.message : String(err));
79
+ process.exitCode = 1;
80
+ }
81
+ });
82
+ void pg;
83
+ }
84
+ //# sourceMappingURL=ship-postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-postgres.js","sourceRoot":"","sources":["../../src/commands/ship-postgres.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Ship (no-Ink) service lifecycle: start | stop | restart | fix-service.
3
+ * Wave 1 customer-critical argv on the Bun ship binary.
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function registerShipServicesCommands(program: Command): void;
7
+ //# sourceMappingURL=ship-services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-services.d.ts","sourceRoot":"","sources":["../../src/commands/ship-services.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwGnE"}
@@ -0,0 +1,127 @@
1
+ import { execa } from 'execa';
2
+ import { existsSync, writeFileSync } from 'node:fs';
3
+ import { compose, composeUp } from '../lib/compose.js';
4
+ import { getPaths } from '../lib/paths.js';
5
+ import * as out from '../utils/output.js';
6
+ const UNIT = 'docker-compose-app.service';
7
+ async function systemctl(args) {
8
+ await execa('systemctl', args, { stdio: 'inherit' });
9
+ }
10
+ async function trySystemctl(args) {
11
+ try {
12
+ await execa('systemctl', args, { stdio: 'pipe' });
13
+ return true;
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ export function registerShipServicesCommands(program) {
20
+ program
21
+ .command('start')
22
+ .description('Start Call Telemetry services (compose unit or compose up)')
23
+ .action(async () => {
24
+ if (await trySystemctl(['start', UNIT])) {
25
+ out.ok(`Started ${UNIT}`);
26
+ return;
27
+ }
28
+ try {
29
+ await composeUp(['-d', '--remove-orphans'], { pipe: false });
30
+ out.ok('Started stack via docker compose up -d');
31
+ }
32
+ catch (e) {
33
+ out.fail(`start failed: ${e?.message ?? e}`);
34
+ process.exitCode = 1;
35
+ }
36
+ });
37
+ program
38
+ .command('stop')
39
+ .description('Stop Call Telemetry services')
40
+ .action(async () => {
41
+ if (await trySystemctl(['stop', UNIT])) {
42
+ out.ok(`Stopped ${UNIT}`);
43
+ return;
44
+ }
45
+ try {
46
+ await compose(['stop'], { pipe: false });
47
+ out.ok('Stopped stack via docker compose stop');
48
+ }
49
+ catch (e) {
50
+ out.fail(`stop failed: ${e?.message ?? e}`);
51
+ process.exitCode = 1;
52
+ }
53
+ });
54
+ program
55
+ .command('restart')
56
+ .description('Restart Call Telemetry services')
57
+ .action(async () => {
58
+ if (await trySystemctl(['restart', UNIT])) {
59
+ out.ok(`Restarted ${UNIT}`);
60
+ return;
61
+ }
62
+ try {
63
+ await compose(['restart'], { pipe: false });
64
+ out.ok('Restarted stack via docker compose restart');
65
+ }
66
+ catch (e) {
67
+ // Fall back to up if restart unavailable
68
+ try {
69
+ await composeUp(['-d', '--force-recreate', '--remove-orphans'], { pipe: false });
70
+ out.ok('Recreated stack via docker compose up -d --force-recreate');
71
+ }
72
+ catch (e2) {
73
+ out.fail(`restart failed: ${e2?.message ?? e2}`);
74
+ process.exitCode = 1;
75
+ }
76
+ }
77
+ });
78
+ program
79
+ .command('fix-service')
80
+ .description('Repair docker-compose-app.service unit (WorkingDirectory + daemon-reload)')
81
+ .action(async () => {
82
+ const { installDir, composeFile } = getPaths();
83
+ if (!existsSync(composeFile)) {
84
+ out.fail(`No docker-compose.yml under ${installDir}`);
85
+ process.exitCode = 1;
86
+ return;
87
+ }
88
+ const unitPath = `/etc/systemd/system/${UNIT}`;
89
+ const unitBody = `[Unit]
90
+ Description=CallTelemetry Docker Compose Application
91
+ Requires=docker.service
92
+ After=docker.service network-online.target
93
+ Wants=network-online.target
94
+
95
+ [Service]
96
+ Type=oneshot
97
+ RemainAfterExit=yes
98
+ WorkingDirectory=${installDir}
99
+ ExecStart=/usr/bin/docker compose -f docker-compose.yml up -d --remove-orphans
100
+ ExecStop=/usr/bin/docker compose -f docker-compose.yml stop
101
+ TimeoutStartSec=0
102
+ TimeoutStopSec=120
103
+
104
+ [Install]
105
+ WantedBy=multi-user.target
106
+ `;
107
+ try {
108
+ // Prefer root write; fall back to sudo tee
109
+ try {
110
+ writeFileSync(unitPath, unitBody, { mode: 0o644 });
111
+ }
112
+ catch {
113
+ await execa('sudo', ['tee', unitPath], { input: unitBody, stdio: ['pipe', 'inherit', 'inherit'] });
114
+ }
115
+ await execa('sudo', ['systemctl', 'daemon-reload'], { stdio: 'inherit' }).catch(async () => {
116
+ await systemctl(['daemon-reload']);
117
+ });
118
+ out.ok(`Service file updated at ${unitPath}`);
119
+ out.info(`Restart with: sudo systemctl restart ${UNIT}`);
120
+ }
121
+ catch (e) {
122
+ out.fail(`fix-service failed: ${e?.message ?? e}`);
123
+ process.exitCode = 1;
124
+ }
125
+ });
126
+ }
127
+ //# sourceMappingURL=ship-services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-services.js","sourceRoot":"","sources":["../../src/commands/ship-services.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAE1C,MAAM,IAAI,GAAG,4BAA4B,CAAC;AAE1C,KAAK,UAAU,SAAS,CAAC,IAAc;IACrC,MAAM,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAc;IACxC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,OAAgB;IAC3D,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,MAAM,YAAY,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YACxC,GAAG,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,CAAC,IAAI,EAAE,kBAAkB,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7D,GAAG,CAAC,EAAE,CAAC,wCAAwC,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,MAAM,YAAY,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACzC,GAAG,CAAC,EAAE,CAAC,uCAAuC,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,MAAM,YAAY,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YAC1C,GAAG,CAAC,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5C,GAAG,CAAC,EAAE,CAAC,4CAA4C,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,yCAAyC;YACzC,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,CAAC,IAAI,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBACjF,GAAG,CAAC,EAAE,CAAC,2DAA2D,CAAC,CAAC;YACtE,CAAC;YAAC,OAAO,EAAO,EAAE,CAAC;gBACjB,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;gBACjD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,2EAA2E,CAAC;SACxF,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC/C,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,uBAAuB,IAAI,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG;;;;;;;;;mBASJ,UAAU;;;;;;;;CAQ5B,CAAC;QACI,IAAI,CAAC;YACH,2CAA2C;YAC3C,IAAI,CAAC;gBACH,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;YACrG,CAAC;YACD,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;gBACzF,MAAM,SAAS,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC,wCAAwC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Ship (no-Ink) sql-monitor: enable|disable|status + password helpers.
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function registerShipSqlMonitorCommand(program: Command): void;
6
+ //# sourceMappingURL=ship-sql-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-sql-monitor.d.ts","sourceRoot":"","sources":["../../src/commands/ship-sql-monitor.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8BzC,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgEpE"}
@@ -0,0 +1,89 @@
1
+ import { readEnvKeys, updateEnvKeys } from '../lib/env.js';
2
+ import { composeUp, compose } from '../lib/compose.js';
3
+ import { attachSqlMonitorPassword } from './go-parity.js';
4
+ import * as out from '../utils/output.js';
5
+ const PROFILE = 'sql-monitor';
6
+ const SERVICE = 'pghero';
7
+ function parseProfiles(raw) {
8
+ return (raw ?? '')
9
+ .split(',')
10
+ .map((p) => p.trim())
11
+ .filter(Boolean);
12
+ }
13
+ function isEnabled(raw) {
14
+ return parseProfiles(raw).includes(PROFILE);
15
+ }
16
+ function addProfile(raw) {
17
+ const p = parseProfiles(raw);
18
+ if (!p.includes(PROFILE))
19
+ p.push(PROFILE);
20
+ return p.join(',');
21
+ }
22
+ function removeProfile(raw) {
23
+ return parseProfiles(raw).filter((x) => x !== PROFILE).join(',');
24
+ }
25
+ export function registerShipSqlMonitorCommand(program) {
26
+ const sql = program
27
+ .command('sql-monitor')
28
+ .description('PgHero SQL-health dashboard (opt-in compose profile)');
29
+ attachSqlMonitorPassword(sql);
30
+ sql
31
+ .command('status')
32
+ .description('Show whether sql-monitor profile is enabled')
33
+ .action(() => {
34
+ const env = readEnvKeys();
35
+ const on = isEnabled(env.COMPOSE_PROFILES);
36
+ console.log(`sql-monitor profile: ${on ? 'enabled' : 'disabled'}`);
37
+ console.log(`COMPOSE_PROFILES=${env.COMPOSE_PROFILES ?? '(unset)'}`);
38
+ });
39
+ sql
40
+ .command('enable')
41
+ .description('Enable sql-monitor compose profile and start pghero')
42
+ .action(async () => {
43
+ try {
44
+ const env = readEnvKeys();
45
+ await updateEnvKeys({ COMPOSE_PROFILES: addProfile(env.COMPOSE_PROFILES) });
46
+ out.ok('sql-monitor profile enabled in .env');
47
+ try {
48
+ await composeUp(['-d', SERVICE]);
49
+ out.ok(`${SERVICE} started`);
50
+ }
51
+ catch {
52
+ out.info('Profile written. Recreate stack: ct restart');
53
+ }
54
+ }
55
+ catch (err) {
56
+ out.fail(err instanceof Error ? err.message : String(err));
57
+ process.exitCode = 1;
58
+ }
59
+ });
60
+ sql
61
+ .command('disable')
62
+ .description('Disable sql-monitor compose profile and stop pghero')
63
+ .action(async () => {
64
+ try {
65
+ const env = readEnvKeys();
66
+ const next = removeProfile(env.COMPOSE_PROFILES);
67
+ await updateEnvKeys({
68
+ COMPOSE_PROFILES: next.length > 0 ? next : undefined,
69
+ });
70
+ out.ok('sql-monitor profile removed from .env');
71
+ try {
72
+ await compose(['stop', SERVICE]);
73
+ await compose(['rm', '-f', SERVICE]);
74
+ out.ok(`${SERVICE} stopped`);
75
+ }
76
+ catch {
77
+ out.info('Profile cleared. Stop remaining containers if needed.');
78
+ }
79
+ }
80
+ catch (err) {
81
+ out.fail(err instanceof Error ? err.message : String(err));
82
+ process.exitCode = 1;
83
+ }
84
+ });
85
+ sql.action(() => {
86
+ console.log('Usage: ct sql-monitor status|enable|disable|password|rotate-password');
87
+ });
88
+ }
89
+ //# sourceMappingURL=ship-sql-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-sql-monitor.js","sourceRoot":"","sources":["../../src/commands/ship-sql-monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Slim non-Ink `ct status` for the multi-arch ship binary.
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function registerShipStatusCommand(program: Command): void;
6
+ //# sourceMappingURL=ship-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-status.d.ts","sourceRoot":"","sources":["../../src/commands/ship-status.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgBhE"}
@@ -0,0 +1,21 @@
1
+ import { collectShipStatus, formatShipStatus } from '../lib/ship-status.js';
2
+ import * as out from '../utils/output.js';
3
+ export function registerShipStatusCommand(program) {
4
+ program
5
+ .command('status')
6
+ .description('Show appliance status (compose, version, install dir)')
7
+ .action(async () => {
8
+ try {
9
+ const snapshot = await collectShipStatus();
10
+ console.log(formatShipStatus(snapshot));
11
+ if (snapshot.error && !snapshot.composeFileExists) {
12
+ process.exitCode = 1;
13
+ }
14
+ }
15
+ catch (err) {
16
+ out.fail(err?.message ?? String(err));
17
+ process.exitCode = 1;
18
+ }
19
+ });
20
+ }
21
+ //# sourceMappingURL=ship-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-status.js","sourceRoot":"","sources":["../../src/commands/ship-status.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAE1C,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxC,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;gBAClD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Slim non-Ink `ct update` for the multi-arch ship binary.
3
+ *
4
+ * Uses lib/update-steps (preflightSteps + executeSteps + runStepsCli) — the same
5
+ * pipeline as the full Node CLI, without Ink TUI or Node runtime self-upgrade.
6
+ */
7
+ import type { Command } from 'commander';
8
+ /**
9
+ * Resolve the operator's version argument / flags to a concrete release string.
10
+ * Fail-closed on unknown targets.
11
+ */
12
+ export declare function resolveShipUpdateTarget(versionArg: string | undefined, opts: {
13
+ latest?: boolean;
14
+ rc?: boolean;
15
+ stable?: boolean;
16
+ line?: string;
17
+ channel?: string;
18
+ }): Promise<string>;
19
+ /** Run the non-Ink update pipeline. Throws / sets exitCode on failure. */
20
+ export declare function runShipUpdate(versionArg: string | undefined, opts: {
21
+ latest?: boolean;
22
+ rc?: boolean;
23
+ stable?: boolean;
24
+ line?: string;
25
+ channel?: string;
26
+ forceUpgrade?: boolean;
27
+ cleanup?: boolean;
28
+ backupDb?: boolean;
29
+ }): Promise<void>;
30
+ export declare function registerShipUpdateCommand(program: Command): void;
31
+ //# sourceMappingURL=ship-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-update.d.ts","sourceRoot":"","sources":["../../src/commands/ship-update.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,IAAI,EAAE;IACJ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC,MAAM,CAAC,CAkGjB;AAED,0EAA0E;AAC1E,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,IAAI,EAAE;IACJ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GACA,OAAO,CAAC,IAAI,CAAC,CAmFf;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2ChE"}
@@ -0,0 +1,234 @@
1
+ import { fetchLatestVersion, fetchLatestForLine, fetchLatestForChannel } from '../lib/bundle.js';
2
+ import { detectTargetType, getPin, setPin } from '../lib/prefs.js';
3
+ import { getCurrentVersion } from '../lib/update.js';
4
+ import { createDatabaseBackup } from '../lib/db-backup.js';
5
+ import { preflightSteps, executeSteps, runStepsCli } from '../lib/update-steps.js';
6
+ import { capturePostUpgradeHealth } from '../lib/post-upgrade-health.js';
7
+ import { getDockerVersion } from '../lib/system.js';
8
+ import { updateService } from '../lib/ops-port.js';
9
+ import { reportOpsResult } from './go-parity.js';
10
+ import * as out from '../utils/output.js';
11
+ /**
12
+ * Resolve the operator's version argument / flags to a concrete release string.
13
+ * Fail-closed on unknown targets.
14
+ */
15
+ export async function resolveShipUpdateTarget(versionArg, opts) {
16
+ let version = versionArg;
17
+ let pinIntent = null;
18
+ if (opts.line) {
19
+ pinIntent = { type: 'line', value: opts.line };
20
+ version = opts.line;
21
+ }
22
+ else if (opts.channel) {
23
+ pinIntent = { type: 'channel', value: opts.channel };
24
+ version = opts.channel;
25
+ }
26
+ else if (versionArg) {
27
+ const detected = detectTargetType(versionArg);
28
+ if (detected === 'line')
29
+ pinIntent = { type: 'line', value: versionArg };
30
+ else if (detected === 'channel')
31
+ pinIntent = { type: 'channel', value: versionArg };
32
+ else if (detected === 'unknown') {
33
+ throw new Error(`Don't know how to interpret target '${versionArg}'. Accepted forms:\n` +
34
+ ` ct update # follow saved pin or global stable\n` +
35
+ ` ct update 0.8.6 # pin to the 0.8.6 line\n` +
36
+ ` ct update 0.8.6.5 # install exact version\n` +
37
+ ` ct update stable # follow the stable channel\n` +
38
+ ` ct update --line 0.8.6 # explicit line flag\n` +
39
+ ` ct update --channel stable # explicit channel flag`);
40
+ }
41
+ }
42
+ if (pinIntent) {
43
+ setPin(pinIntent);
44
+ console.log(`Pinned: ${pinIntent.type} = ${pinIntent.value}`);
45
+ console.log(`(saved to ~/.ct/preferences.json)`);
46
+ }
47
+ if (!version && !opts.latest && !opts.rc && !opts.stable) {
48
+ const saved = getPin();
49
+ if (saved) {
50
+ console.log(`Using saved pin: ${saved.type} = ${saved.value}`);
51
+ version = saved.value;
52
+ }
53
+ }
54
+ const targetType = detectTargetType(version);
55
+ if (targetType === 'line') {
56
+ console.log(`Fetching latest stable for line ${version}...`);
57
+ const resolved = await fetchLatestForLine(version);
58
+ console.log(`Latest ${version} stable: ${resolved}`);
59
+ return resolved;
60
+ }
61
+ if (targetType === 'channel') {
62
+ console.log(`Fetching latest on channel '${version}'...`);
63
+ const resolved = await fetchLatestForChannel(version);
64
+ console.log(`Latest on ${version}: ${resolved}`);
65
+ return resolved;
66
+ }
67
+ if (targetType === 'keyword') {
68
+ if (version === 'latest') {
69
+ console.log('Fetching latest version (including pre-releases)...');
70
+ const resolved = await fetchLatestVersion('latest');
71
+ console.log(`Latest version: ${resolved}`);
72
+ return resolved;
73
+ }
74
+ if (version === 'rc') {
75
+ console.log('Fetching latest release candidate...');
76
+ const resolved = await fetchLatestVersion('rc');
77
+ console.log(`Latest release candidate: ${resolved}`);
78
+ return resolved;
79
+ }
80
+ if (version === 'dev') {
81
+ console.log("Fetching latest on channel 'dev'...");
82
+ const resolved = await fetchLatestForChannel('dev');
83
+ console.log(`Latest on dev: ${resolved}`);
84
+ return resolved;
85
+ }
86
+ console.log('Fetching latest stable version...');
87
+ const resolved = await fetchLatestVersion('stable');
88
+ console.log(`Latest stable version: ${resolved}`);
89
+ return resolved;
90
+ }
91
+ if (!version && opts.latest) {
92
+ console.log('Fetching latest version (including pre-releases)...');
93
+ const resolved = await fetchLatestVersion('latest');
94
+ console.log(`Latest version: ${resolved}`);
95
+ return resolved;
96
+ }
97
+ if (!version && opts.rc) {
98
+ console.log('Fetching latest release candidate...');
99
+ const resolved = await fetchLatestVersion('rc');
100
+ console.log(`Latest release candidate: ${resolved}`);
101
+ return resolved;
102
+ }
103
+ if (!version || opts.stable) {
104
+ console.log('Fetching latest stable version...');
105
+ const resolved = await fetchLatestVersion('stable');
106
+ console.log(`Latest stable version: ${resolved}`);
107
+ return resolved;
108
+ }
109
+ // exact version
110
+ return version;
111
+ }
112
+ /** Run the non-Ink update pipeline. Throws / sets exitCode on failure. */
113
+ export async function runShipUpdate(versionArg, opts) {
114
+ const version = await resolveShipUpdateTarget(versionArg, opts);
115
+ const currentVersion = getCurrentVersion();
116
+ console.log(`Current version: ${currentVersion}`);
117
+ console.log(`Target version: ${version}`);
118
+ console.log();
119
+ if (!opts.forceUpgrade) {
120
+ try {
121
+ await runStepsCli(preflightSteps(version));
122
+ console.log();
123
+ }
124
+ catch {
125
+ out.fail('Pre-flight checks failed. Use --force-upgrade to proceed anyway.');
126
+ process.exitCode = 1;
127
+ return;
128
+ }
129
+ }
130
+ const dockerVer = await getDockerVersion();
131
+ if (dockerVer === null) {
132
+ out.warn('Docker not found or not responding');
133
+ }
134
+ else if (dockerVer < 26) {
135
+ out.warn(`Docker version ${dockerVer} detected — Docker 26+ is recommended`);
136
+ // Ship path: fail-closed when force not set (no automatic dnf upgrade here).
137
+ if (!opts.forceUpgrade) {
138
+ out.fail('Docker < 26. Use --force-upgrade to continue, or upgrade Docker first.');
139
+ process.exitCode = 1;
140
+ return;
141
+ }
142
+ }
143
+ else {
144
+ out.ok(`Docker version ${dockerVer} is supported`);
145
+ }
146
+ console.log();
147
+ console.log(`Upgrading from ${currentVersion} to ${version}`);
148
+ console.log('(ship binary — non-interactive step runner; no Ink TUI)');
149
+ let steps = executeSteps(version);
150
+ if (opts.forceUpgrade) {
151
+ steps = steps.filter((s) => s.label !== 'Check image availability');
152
+ }
153
+ if (opts.cleanup === false) {
154
+ steps = steps.filter((s) => s.label !== 'Cleanup unused resources');
155
+ }
156
+ if (opts.backupDb) {
157
+ steps = [
158
+ {
159
+ label: 'Database backup',
160
+ run: async (ctx) => {
161
+ ctx?.log('Creating database backup before update...');
162
+ const backup = await createDatabaseBackup();
163
+ return backup.filePath;
164
+ },
165
+ },
166
+ ...steps,
167
+ ];
168
+ }
169
+ console.log();
170
+ let stepError;
171
+ try {
172
+ await runStepsCli(steps);
173
+ }
174
+ catch (err) {
175
+ stepError = err;
176
+ }
177
+ console.log();
178
+ const anyFailed = await capturePostUpgradeHealth(`post-upgrade container health check (${version})`, { upgradeFailed: Boolean(stepError) });
179
+ if (stepError) {
180
+ out.fail(`Update failed: ${stepError instanceof Error ? stepError.message : String(stepError)}`);
181
+ process.exitCode = 1;
182
+ return;
183
+ }
184
+ if (anyFailed) {
185
+ out.warn('Update applied, but one or more containers are unhealthy — see captured logs above.');
186
+ process.exitCode = 1;
187
+ }
188
+ else {
189
+ out.successBox('Update complete!');
190
+ }
191
+ }
192
+ export function registerShipUpdateCommand(program) {
193
+ const update = program
194
+ .command('update [version]')
195
+ .description('Update to a version, line, channel, or latest stable (ship binary step runner)')
196
+ .option('--latest', 'Use latest build including pre-releases')
197
+ .option('--rc', 'Use latest release candidate')
198
+ .option('--stable', 'Use latest stable release (default)')
199
+ .option('--line <X.Y.Z>', 'Pin to a specific version line')
200
+ .option('--channel <name>', 'Pin to a customer-facing channel')
201
+ .option('--force-upgrade', 'Skip preflight / allow Docker < 26')
202
+ .option('--no-cleanup', 'Skip Docker cleanup after update')
203
+ .option('--backup-db', 'Create a database backup before update', false)
204
+ .option('--no-backup-db', 'Skip database backup before update')
205
+ .action(async (versionArg, opts) => {
206
+ try {
207
+ await runShipUpdate(versionArg, {
208
+ latest: opts.latest,
209
+ rc: opts.rc,
210
+ stable: opts.stable,
211
+ line: opts.line,
212
+ channel: opts.channel,
213
+ forceUpgrade: opts.forceUpgrade,
214
+ cleanup: opts.cleanup,
215
+ backupDb: opts.backupDb,
216
+ });
217
+ }
218
+ catch (err) {
219
+ out.fail(err?.message ?? String(err));
220
+ process.exitCode = 1;
221
+ }
222
+ });
223
+ // Dual-form: ct update service <svc> <tag> (also top-level update-service via go-parity)
224
+ update
225
+ .command('service <service> <tag>')
226
+ .description('Update ONE compose service image tag (atomic recreate)')
227
+ .option('-y, --yes', 'Confirm non-interactive apply')
228
+ .option('--dry-run', 'Show plan only')
229
+ .action(async (service, tag, opts) => {
230
+ const r = await updateService(service, tag, { yes: opts.yes, dryRun: opts.dryRun });
231
+ reportOpsResult(r);
232
+ });
233
+ }
234
+ //# sourceMappingURL=ship-update.js.map