@calltelemetry/cli 0.6.12 → 0.6.13

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 (100) hide show
  1. package/dist/commands/appliance.d.ts +3 -0
  2. package/dist/commands/appliance.d.ts.map +1 -0
  3. package/dist/commands/appliance.js +99 -0
  4. package/dist/commands/appliance.js.map +1 -0
  5. package/dist/commands/update.d.ts.map +1 -1
  6. package/dist/commands/update.js +19 -17
  7. package/dist/commands/update.js.map +1 -1
  8. package/dist/index.js +2 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/lib/migration-001-cgnat.d.ts +2 -0
  11. package/dist/lib/migration-001-cgnat.d.ts.map +1 -0
  12. package/dist/lib/migration-001-cgnat.js +59 -0
  13. package/dist/lib/migration-001-cgnat.js.map +1 -0
  14. package/dist/lib/migration-002-swap.d.ts +12 -0
  15. package/dist/lib/migration-002-swap.d.ts.map +1 -0
  16. package/dist/lib/migration-002-swap.js +103 -0
  17. package/dist/lib/migration-002-swap.js.map +1 -0
  18. package/dist/lib/migration-003-nm-heal.d.ts +12 -0
  19. package/dist/lib/migration-003-nm-heal.d.ts.map +1 -0
  20. package/dist/lib/migration-003-nm-heal.js +75 -0
  21. package/dist/lib/migration-003-nm-heal.js.map +1 -0
  22. package/dist/lib/migration-004-systemd-docker.d.ts +13 -0
  23. package/dist/lib/migration-004-systemd-docker.d.ts.map +1 -0
  24. package/dist/lib/migration-004-systemd-docker.js +48 -0
  25. package/dist/lib/migration-004-systemd-docker.js.map +1 -0
  26. package/dist/lib/migration-005-ssh-keys.d.ts +13 -0
  27. package/dist/lib/migration-005-ssh-keys.d.ts.map +1 -0
  28. package/dist/lib/migration-005-ssh-keys.js +49 -0
  29. package/dist/lib/migration-005-ssh-keys.js.map +1 -0
  30. package/dist/lib/migration-006-console-loglevel.d.ts +10 -0
  31. package/dist/lib/migration-006-console-loglevel.d.ts.map +1 -0
  32. package/dist/lib/migration-006-console-loglevel.js +27 -0
  33. package/dist/lib/migration-006-console-loglevel.js.map +1 -0
  34. package/dist/lib/migration-007-nm-keyfile.d.ts +10 -0
  35. package/dist/lib/migration-007-nm-keyfile.d.ts.map +1 -0
  36. package/dist/lib/migration-007-nm-keyfile.js +30 -0
  37. package/dist/lib/migration-007-nm-keyfile.js.map +1 -0
  38. package/dist/lib/migration-008-systemd-restart.d.ts +13 -0
  39. package/dist/lib/migration-008-systemd-restart.d.ts.map +1 -0
  40. package/dist/lib/migration-008-systemd-restart.js +41 -0
  41. package/dist/lib/migration-008-systemd-restart.js.map +1 -0
  42. package/dist/lib/migration-009-bind-mount-files.d.ts +11 -0
  43. package/dist/lib/migration-009-bind-mount-files.d.ts.map +1 -0
  44. package/dist/lib/migration-009-bind-mount-files.js +86 -0
  45. package/dist/lib/migration-009-bind-mount-files.js.map +1 -0
  46. package/dist/lib/migration-010-jtapi-state.d.ts +11 -0
  47. package/dist/lib/migration-010-jtapi-state.d.ts.map +1 -0
  48. package/dist/lib/migration-010-jtapi-state.js +61 -0
  49. package/dist/lib/migration-010-jtapi-state.js.map +1 -0
  50. package/dist/lib/migration-011-docker-memory-limit.d.ts +13 -0
  51. package/dist/lib/migration-011-docker-memory-limit.d.ts.map +1 -0
  52. package/dist/lib/migration-011-docker-memory-limit.js +45 -0
  53. package/dist/lib/migration-011-docker-memory-limit.js.map +1 -0
  54. package/dist/lib/migration-012-db-pool-sizes.d.ts +12 -0
  55. package/dist/lib/migration-012-db-pool-sizes.d.ts.map +1 -0
  56. package/dist/lib/migration-012-db-pool-sizes.js +64 -0
  57. package/dist/lib/migration-012-db-pool-sizes.js.map +1 -0
  58. package/dist/lib/migrations.d.ts +34 -0
  59. package/dist/lib/migrations.d.ts.map +1 -0
  60. package/dist/lib/migrations.js +179 -0
  61. package/dist/lib/migrations.js.map +1 -0
  62. package/dist/lib/update-steps.d.ts.map +1 -1
  63. package/dist/lib/update-steps.js +12 -0
  64. package/dist/lib/update-steps.js.map +1 -1
  65. package/dist/lib/version.d.ts +1 -1
  66. package/dist/lib/version.js +1 -1
  67. package/dist/shell/commands/appliance-performance.d.ts +36 -0
  68. package/dist/shell/commands/appliance-performance.d.ts.map +1 -0
  69. package/dist/shell/commands/appliance-performance.js +221 -0
  70. package/dist/shell/commands/appliance-performance.js.map +1 -0
  71. package/dist/shell/commands/registry.d.ts.map +1 -1
  72. package/dist/shell/commands/registry.js +19 -0
  73. package/dist/shell/commands/registry.js.map +1 -1
  74. package/dist/shell/commands/users.d.ts.map +1 -1
  75. package/dist/shell/commands/users.js +42 -1
  76. package/dist/shell/commands/users.js.map +1 -1
  77. package/dist/shell/network-onboarding.d.ts +29 -7
  78. package/dist/shell/network-onboarding.d.ts.map +1 -1
  79. package/dist/shell/network-onboarding.js +332 -81
  80. package/dist/shell/network-onboarding.js.map +1 -1
  81. package/dist/ui/views/JtapiDisableView.d.ts +6 -0
  82. package/dist/ui/views/JtapiDisableView.d.ts.map +1 -0
  83. package/dist/ui/views/JtapiDisableView.js +52 -0
  84. package/dist/ui/views/JtapiDisableView.js.map +1 -0
  85. package/dist/ui/views/JtapiEnableView.d.ts +6 -0
  86. package/dist/ui/views/JtapiEnableView.d.ts.map +1 -0
  87. package/dist/ui/views/JtapiEnableView.js +40 -0
  88. package/dist/ui/views/JtapiEnableView.js.map +1 -0
  89. package/dist/ui/views/JtapiStatusView.d.ts +6 -0
  90. package/dist/ui/views/JtapiStatusView.d.ts.map +1 -0
  91. package/dist/ui/views/JtapiStatusView.js +11 -0
  92. package/dist/ui/views/JtapiStatusView.js.map +1 -0
  93. package/dist/ui/views/JtapiTroubleshootView.d.ts +6 -0
  94. package/dist/ui/views/JtapiTroubleshootView.d.ts.map +1 -0
  95. package/dist/ui/views/JtapiTroubleshootView.js +114 -0
  96. package/dist/ui/views/JtapiTroubleshootView.js.map +1 -0
  97. package/dist/ui/views/MainMenu.d.ts.map +1 -1
  98. package/dist/ui/views/MainMenu.js +11 -0
  99. package/dist/ui/views/MainMenu.js.map +1 -1
  100. package/package.json +1 -1
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Appliance migration framework.
3
+ *
4
+ * Tracks which system-level migrations have been applied on this appliance
5
+ * and runs any pending ones. State is persisted in ~/.ct/migrations.json.
6
+ */
7
+ import { join } from 'node:path';
8
+ import { homedir } from 'node:os';
9
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
10
+ const CT_DIR = join(homedir(), '.ct');
11
+ const MIGRATIONS_FILE = join(CT_DIR, 'migrations.json');
12
+ // Import migrations
13
+ import { migrateCgnatSubnets } from './migration-001-cgnat.js';
14
+ import { migrateSwapFile } from './migration-002-swap.js';
15
+ import { migrateNmHeal } from './migration-003-nm-heal.js';
16
+ import { migrateSystemdDocker } from './migration-004-systemd-docker.js';
17
+ import { migrateSshKeys } from './migration-005-ssh-keys.js';
18
+ import { migrateConsoleLoglevel } from './migration-006-console-loglevel.js';
19
+ import { migrateNmKeyfile } from './migration-007-nm-keyfile.js';
20
+ import { migrateSystemdRestart } from './migration-008-systemd-restart.js';
21
+ import { migrateBindMountFiles } from './migration-009-bind-mount-files.js';
22
+ import { migrateDockerMemoryLimit } from './migration-011-docker-memory-limit.js';
23
+ import { migrateJtapiState } from './migration-010-jtapi-state.js';
24
+ import { migrateDbPoolSizes } from './migration-012-db-pool-sizes.js';
25
+ export const MIGRATIONS = [
26
+ {
27
+ id: '001_cgnat_docker_subnets',
28
+ description: 'Move Docker subnets to CGNAT space (100.64.x)',
29
+ run: migrateCgnatSubnets,
30
+ },
31
+ {
32
+ id: '002_swap_file',
33
+ description: 'Configure swap file (50% of RAM)',
34
+ run: migrateSwapFile,
35
+ },
36
+ {
37
+ id: '003_nm_connection_heal',
38
+ description: 'Fix NetworkManager connection profiles (autoconnect, Docker bridges)',
39
+ run: migrateNmHeal,
40
+ },
41
+ {
42
+ id: '004_systemd_docker_boot',
43
+ description: 'Docker boot ordering (After=firewalld)',
44
+ run: migrateSystemdDocker,
45
+ },
46
+ {
47
+ id: '005_ssh_host_keys',
48
+ description: 'Regenerate SSH host keys (OVA clone safety)',
49
+ run: migrateSshKeys,
50
+ },
51
+ {
52
+ id: '006_console_loglevel',
53
+ description: 'Suppress nft_compat/ip_set kernel console warnings',
54
+ run: migrateConsoleLoglevel,
55
+ },
56
+ {
57
+ id: '007_nm_keyfile_migration',
58
+ description: 'Migrate legacy ifcfg network configs to NM keyfile format',
59
+ run: migrateNmKeyfile,
60
+ },
61
+ {
62
+ id: '008_systemd_restart_policy',
63
+ description: 'Add restart-on-failure and network-online.target to systemd service',
64
+ run: migrateSystemdRestart,
65
+ },
66
+ {
67
+ id: '009_bind_mount_files',
68
+ description: 'Fix alertmanager.yml and tempo.yaml created as directories by Docker',
69
+ run: migrateBindMountFiles,
70
+ },
71
+ {
72
+ id: '010_jtapi_state_to_env',
73
+ description: 'Migrate .jtapi-enabled sentinel to .env COMPOSE_PROFILES=jtapi',
74
+ run: migrateJtapiState,
75
+ },
76
+ {
77
+ id: '011_docker_memory_limit',
78
+ description: 'Cap Docker daemon at 90% RAM (reserve 10% for OS)',
79
+ run: migrateDockerMemoryLimit,
80
+ },
81
+ {
82
+ id: '012_db_pool_sizes',
83
+ description: 'Set small DB pool profile (44 connections instead of 95)',
84
+ run: migrateDbPoolSizes,
85
+ },
86
+ ];
87
+ export function loadMigrationState() {
88
+ try {
89
+ if (!existsSync(MIGRATIONS_FILE)) {
90
+ return { completed: {}, errors: {} };
91
+ }
92
+ const raw = readFileSync(MIGRATIONS_FILE, 'utf-8');
93
+ const parsed = JSON.parse(raw);
94
+ return {
95
+ completed: parsed.completed ?? {},
96
+ errors: parsed.errors ?? {},
97
+ };
98
+ }
99
+ catch {
100
+ return { completed: {}, errors: {} };
101
+ }
102
+ }
103
+ export function saveMigrationState(state) {
104
+ mkdirSync(CT_DIR, { recursive: true });
105
+ writeFileSync(MIGRATIONS_FILE, JSON.stringify(state, null, 2) + '\n', 'utf-8');
106
+ }
107
+ export function isMigrationCompleted(id) {
108
+ const state = loadMigrationState();
109
+ return id in state.completed;
110
+ }
111
+ export async function runPendingMigrations(log) {
112
+ const state = loadMigrationState();
113
+ const ran = [];
114
+ const skipped = [];
115
+ for (const migration of MIGRATIONS) {
116
+ if (migration.id in state.completed) {
117
+ skipped.push(migration.id);
118
+ continue;
119
+ }
120
+ log?.(`Running migration: ${migration.description}`);
121
+ try {
122
+ const changed = await migration.run();
123
+ state.completed[migration.id] = {
124
+ at: new Date().toISOString(),
125
+ result: changed ? 'applied' : 'skipped',
126
+ };
127
+ // Clear any previous error for this migration
128
+ delete state.errors[migration.id];
129
+ if (changed) {
130
+ ran.push(migration.id);
131
+ log?.(` Applied: ${migration.id}`);
132
+ }
133
+ else {
134
+ skipped.push(migration.id);
135
+ log?.(` Skipped (already correct): ${migration.id}`);
136
+ }
137
+ }
138
+ catch (err) {
139
+ const message = err instanceof Error ? err.message : String(err);
140
+ state.errors[migration.id] = {
141
+ at: new Date().toISOString(),
142
+ error: message,
143
+ };
144
+ log?.(` Error: ${migration.id} — ${message}`);
145
+ }
146
+ saveMigrationState(state);
147
+ }
148
+ return { ran, skipped };
149
+ }
150
+ export function getMigrationStatus() {
151
+ const state = loadMigrationState();
152
+ return MIGRATIONS.map((m) => {
153
+ const completed = state.completed[m.id];
154
+ const errRecord = state.errors[m.id];
155
+ if (completed) {
156
+ return {
157
+ id: m.id,
158
+ description: m.description,
159
+ status: completed.result,
160
+ at: completed.at,
161
+ };
162
+ }
163
+ if (errRecord) {
164
+ return {
165
+ id: m.id,
166
+ description: m.description,
167
+ status: 'error',
168
+ at: errRecord.at,
169
+ error: errRecord.error,
170
+ };
171
+ }
172
+ return {
173
+ id: m.id,
174
+ description: m.description,
175
+ status: 'pending',
176
+ };
177
+ });
178
+ }
179
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/lib/migrations.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"update-steps.d.ts","sourceRoot":"","sources":["../../src/lib/update-steps.ts"],"names":[],"mappings":"AAaA,oEAAoE;AACpE,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,sEAAsE;AACtE,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACpD;AAID,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,EAAE,CAyClE;AAID,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,EAAE,CAsIhE;AAID;;;GAGG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAepE"}
1
+ {"version":3,"file":"update-steps.d.ts","sourceRoot":"","sources":["../../src/lib/update-steps.ts"],"names":[],"mappings":"AAaA,oEAAoE;AACpE,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,sEAAsE;AACtE,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACpD;AAID,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,EAAE,CAyClE;AAID,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,EAAE,CAgJhE;AAID;;;GAGG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAepE"}
@@ -164,6 +164,18 @@ export function executeSteps(targetVersion) {
164
164
  return 'already correct';
165
165
  },
166
166
  },
167
+ {
168
+ label: 'Run appliance migrations',
169
+ run: async (ctx) => {
170
+ const { runPendingMigrations } = await import('./migrations.js');
171
+ const result = await runPendingMigrations((msg) => ctx?.log(msg));
172
+ for (const id of result.ran)
173
+ ctx?.log(` Applied: ${id}`);
174
+ if (result.ran.length === 0)
175
+ return 'all up to date';
176
+ return `${result.ran.length} migration(s) applied`;
177
+ },
178
+ },
167
179
  {
168
180
  label: 'Apply IPv6 configuration',
169
181
  run: async (ctx) => {
@@ -1 +1 @@
1
- {"version":3,"file":"update-steps.js","sourceRoot":"","sources":["../../src/lib/update-steps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-steps.js","sourceRoot":"","sources":["../../src/lib/update-steps.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  /** Single source of truth for the CLI version. */
2
- export declare const VERSION = "0.6.12";
2
+ export declare const VERSION = "0.6.13";
3
3
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  /** Single source of truth for the CLI version. */
2
- export const VERSION = '0.6.12';
2
+ export const VERSION = '0.6.13';
3
3
  //# sourceMappingURL=version.js.map
@@ -0,0 +1,36 @@
1
+ import type { ShellContext } from '../context.js';
2
+ import type { CommandNode } from '../parser.js';
3
+ export type ProfileName = 'small' | 'medium' | 'large';
4
+ export interface ProfileDefinition {
5
+ minRamMb: number;
6
+ minCpus: number;
7
+ description: string;
8
+ capacity: string;
9
+ hardware: string;
10
+ env: Record<string, string>;
11
+ }
12
+ export declare const PROFILES: Record<ProfileName, ProfileDefinition>;
13
+ /** All env keys managed by performance profiles. */
14
+ export declare const PROFILE_ENV_KEYS: string[];
15
+ /** Read total system RAM in MB from /proc/meminfo. Returns 0 on failure. */
16
+ export declare function getSystemRamMb(): number;
17
+ /** Count CPU cores from /proc/cpuinfo. Returns 0 on failure. */
18
+ export declare function getSystemCpuCount(): number;
19
+ /**
20
+ * Recommend a profile based on available RAM.
21
+ * Uses 10% tolerance — 7200 MB counts as 8 GB (covers VM overhead).
22
+ */
23
+ export declare function recommendedProfile(ramMb: number): ProfileName;
24
+ /**
25
+ * Check if a profile's RAM requirement is met with 10% tolerance.
26
+ * Returns true if the system has enough RAM.
27
+ */
28
+ export declare function meetsRamRequirement(ramMb: number, profile: ProfileName): boolean;
29
+ /** Detect current profile by matching .env values against profile definitions. */
30
+ export declare function detectCurrentProfile(): ProfileName | null;
31
+ /** Apply a profile by writing all env vars atomically. */
32
+ export declare function applyProfile(name: ProfileName): Promise<void>;
33
+ export declare function handleAppliancePerformance(args: string[], _opts: Record<string, string>, _ctx: ShellContext): Promise<void>;
34
+ export declare function showAppliancePerformance(_args: string[], _opts: Record<string, string>, _ctx: ShellContext): Promise<void>;
35
+ export declare function wireApplianceHandlers(applianceNode: CommandNode): void;
36
+ //# sourceMappingURL=appliance-performance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appliance-performance.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/appliance-performance.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,iBAAiB,CAgE3D,CAAC;AAIF,oDAAoD;AACpD,eAAO,MAAM,gBAAgB,UAAkC,CAAC;AAIhE,4EAA4E;AAC5E,wBAAgB,cAAc,IAAI,MAAM,CASvC;AAED,gEAAgE;AAChE,wBAAgB,iBAAiB,IAAI,MAAM,CAQ1C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAM7D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAGhF;AAED,kFAAkF;AAClF,wBAAgB,oBAAoB,IAAI,WAAW,GAAG,IAAI,CAUzD;AAED,0DAA0D;AAC1D,wBAAsB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGnE;AAID,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CA2Cf;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAuCf;AAID,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,WAAW,GAAG,IAAI,CAQtE"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Shell command handlers for the `appliance performance` command group.
3
+ *
4
+ * Manages t-shirt-sized performance profiles (small/medium/large) that
5
+ * atomically set PostgreSQL tuning, Ecto pool sizes, and Docker memory limits.
6
+ */
7
+ import { readFileSync } from 'node:fs';
8
+ import { readEnvKeys, updateEnvKeys } from '../../lib/env.js';
9
+ import { banner, statusLine, kv } from '../formatter.js';
10
+ export const PROFILES = {
11
+ small: {
12
+ minRamMb: 8 * 1024, // 8 GB
13
+ minCpus: 2,
14
+ description: 'Small',
15
+ capacity: 'Up to 5,000 phones, 100 calls/sec',
16
+ hardware: '8 GB RAM, 2 vCPUs, 40 GB disk',
17
+ env: {
18
+ PG_SHARED_BUFFERS: '512MB',
19
+ PG_EFFECTIVE_CACHE_SIZE: '1536MB',
20
+ PG_WORK_MEM: '8MB',
21
+ PG_MAINTENANCE_WORK_MEM: '128MB',
22
+ PG_SHM_SIZE: '1gb',
23
+ PG_MAX_CONNECTIONS: '100',
24
+ DB_POOL_SIZE: '30',
25
+ DB_BACKGROUND_POOL_SIZE: '10',
26
+ DB_DISCOVERY_POOL_SIZE: '10',
27
+ DB_OBAN_POOL_SIZE: '10',
28
+ DB_MEM_LIMIT: '3g',
29
+ WEB_MEM_LIMIT: '4g',
30
+ },
31
+ },
32
+ medium: {
33
+ minRamMb: 16 * 1024, // 16 GB
34
+ minCpus: 4,
35
+ description: 'Medium',
36
+ capacity: 'Up to 25,000 phones, 300 calls/sec',
37
+ hardware: '16 GB RAM, 4 vCPUs, 100 GB disk',
38
+ env: {
39
+ PG_SHARED_BUFFERS: '2GB',
40
+ PG_EFFECTIVE_CACHE_SIZE: '6GB',
41
+ PG_WORK_MEM: '16MB',
42
+ PG_MAINTENANCE_WORK_MEM: '256MB',
43
+ PG_SHM_SIZE: '3gb',
44
+ PG_MAX_CONNECTIONS: '200',
45
+ DB_POOL_SIZE: '45',
46
+ DB_BACKGROUND_POOL_SIZE: '18',
47
+ DB_DISCOVERY_POOL_SIZE: '18',
48
+ DB_OBAN_POOL_SIZE: '14',
49
+ DB_MEM_LIMIT: '6g',
50
+ WEB_MEM_LIMIT: '4g',
51
+ },
52
+ },
53
+ large: {
54
+ minRamMb: 32 * 1024, // 32 GB
55
+ minCpus: 8,
56
+ description: 'Large',
57
+ capacity: '50,000+ phones, 600 calls/sec',
58
+ hardware: '32 GB RAM, 8 vCPUs, 200 GB disk',
59
+ env: {
60
+ PG_SHARED_BUFFERS: '4GB',
61
+ PG_EFFECTIVE_CACHE_SIZE: '12GB',
62
+ PG_WORK_MEM: '32MB',
63
+ PG_MAINTENANCE_WORK_MEM: '512MB',
64
+ PG_SHM_SIZE: '5gb',
65
+ PG_MAX_CONNECTIONS: '300',
66
+ DB_POOL_SIZE: '60',
67
+ DB_BACKGROUND_POOL_SIZE: '25',
68
+ DB_DISCOVERY_POOL_SIZE: '25',
69
+ DB_OBAN_POOL_SIZE: '20',
70
+ DB_MEM_LIMIT: '10g',
71
+ WEB_MEM_LIMIT: '8g',
72
+ },
73
+ },
74
+ };
75
+ const PROFILE_NAMES = ['small', 'medium', 'large'];
76
+ /** All env keys managed by performance profiles. */
77
+ export const PROFILE_ENV_KEYS = Object.keys(PROFILES.small.env);
78
+ // ── System detection ────────────────────────────────────────────────────────
79
+ /** Read total system RAM in MB from /proc/meminfo. Returns 0 on failure. */
80
+ export function getSystemRamMb() {
81
+ try {
82
+ const content = readFileSync('/proc/meminfo', 'utf-8');
83
+ const match = content.match(/MemTotal:\s+(\d+)\s+kB/);
84
+ if (!match)
85
+ return 0;
86
+ return Math.round(parseInt(match[1], 10) / 1024);
87
+ }
88
+ catch {
89
+ return 0;
90
+ }
91
+ }
92
+ /** Count CPU cores from /proc/cpuinfo. Returns 0 on failure. */
93
+ export function getSystemCpuCount() {
94
+ try {
95
+ const content = readFileSync('/proc/cpuinfo', 'utf-8');
96
+ const matches = content.match(/^processor\s*:/gm);
97
+ return matches ? matches.length : 0;
98
+ }
99
+ catch {
100
+ return 0;
101
+ }
102
+ }
103
+ /**
104
+ * Recommend a profile based on available RAM.
105
+ * Uses 10% tolerance — 7200 MB counts as 8 GB (covers VM overhead).
106
+ */
107
+ export function recommendedProfile(ramMb) {
108
+ // Apply 10% tolerance for matching
109
+ const effective = ramMb * (1 / 0.9); // What "full" RAM would be
110
+ if (effective >= 32 * 1024)
111
+ return 'large';
112
+ if (effective >= 16 * 1024)
113
+ return 'medium';
114
+ return 'small';
115
+ }
116
+ /**
117
+ * Check if a profile's RAM requirement is met with 10% tolerance.
118
+ * Returns true if the system has enough RAM.
119
+ */
120
+ export function meetsRamRequirement(ramMb, profile) {
121
+ const required = PROFILES[profile].minRamMb;
122
+ return ramMb >= required * 0.9;
123
+ }
124
+ /** Detect current profile by matching .env values against profile definitions. */
125
+ export function detectCurrentProfile() {
126
+ const env = readEnvKeys();
127
+ for (const name of PROFILE_NAMES) {
128
+ const profileEnv = PROFILES[name].env;
129
+ const allMatch = Object.entries(profileEnv).every(([key, value]) => env[key] === value);
130
+ if (allMatch)
131
+ return name;
132
+ }
133
+ return null;
134
+ }
135
+ /** Apply a profile by writing all env vars atomically. */
136
+ export async function applyProfile(name) {
137
+ const profile = PROFILES[name];
138
+ await updateEnvKeys({ ...profile.env });
139
+ }
140
+ // ── Command handlers ────────────────────────────────────────────────────────
141
+ export async function handleAppliancePerformance(args, _opts, _ctx) {
142
+ const profileArg = args[0]?.toLowerCase();
143
+ if (!profileArg) {
144
+ console.log('% Usage: appliance performance <small|medium|large>');
145
+ console.log('');
146
+ for (const name of PROFILE_NAMES) {
147
+ const p = PROFILES[name];
148
+ console.log(` ${name.padEnd(8)} ${p.capacity}`);
149
+ console.log(` ${' '.repeat(8)} Minimum: ${p.hardware}`);
150
+ }
151
+ console.log('');
152
+ console.log(' Use "show appliance performance" to see current profile.');
153
+ return;
154
+ }
155
+ if (!PROFILE_NAMES.includes(profileArg)) {
156
+ console.log(statusLine(`Unknown profile '${profileArg}'`, 'fail', 'valid: small, medium, large'));
157
+ return;
158
+ }
159
+ const name = profileArg;
160
+ const profile = PROFILES[name];
161
+ // Check system RAM
162
+ const ramMb = getSystemRamMb();
163
+ if (ramMb > 0 && !meetsRamRequirement(ramMb, name)) {
164
+ const ramGb = (ramMb / 1024).toFixed(1);
165
+ console.log(statusLine(`Warning: System has ${ramGb} GB RAM but ${profile.description} requires ${profile.hardware}`, 'warn', 'performance may suffer'));
166
+ }
167
+ try {
168
+ await applyProfile(name);
169
+ console.log(statusLine(`Performance profile set to ${profile.description}`, 'ok', 'restart services to apply'));
170
+ console.log(statusLine(profile.capacity, 'info'));
171
+ }
172
+ catch (err) {
173
+ const msg = err instanceof Error ? err.message : String(err);
174
+ console.log(statusLine(`Failed to apply profile: ${msg}`, 'fail'));
175
+ }
176
+ }
177
+ export async function showAppliancePerformance(_args, _opts, _ctx) {
178
+ console.log(banner('Appliance Performance'));
179
+ const current = detectCurrentProfile();
180
+ const ramMb = getSystemRamMb();
181
+ const cpus = getSystemCpuCount();
182
+ const kvPairs = [];
183
+ if (ramMb > 0 || cpus > 0) {
184
+ const ramStr = ramMb > 0 ? `${(ramMb / 1024).toFixed(1)} GB` : 'unknown';
185
+ const cpuStr = cpus > 0 ? `${cpus} vCPUs` : 'unknown';
186
+ kvPairs.push(['Hardware', `${ramStr} RAM, ${cpuStr}`]);
187
+ }
188
+ if (current) {
189
+ const profile = PROFILES[current];
190
+ kvPairs.push(['Active Profile', profile.description]);
191
+ kvPairs.push(['Capacity', profile.capacity]);
192
+ }
193
+ else {
194
+ kvPairs.push(['Active Profile', 'Custom / not set']);
195
+ }
196
+ if (ramMb > 0) {
197
+ const rec = recommendedProfile(ramMb);
198
+ kvPairs.push(['Recommended', PROFILES[rec].description]);
199
+ }
200
+ console.log(kv(kvPairs));
201
+ console.log('');
202
+ console.log(' Available profiles:');
203
+ for (const name of PROFILE_NAMES) {
204
+ const p = PROFILES[name];
205
+ const marker = name === current ? ' (active)' : '';
206
+ console.log(` ${name.padEnd(8)} ${p.capacity}${marker}`);
207
+ console.log(` ${' '.repeat(8)} Minimum: ${p.hardware}`);
208
+ }
209
+ console.log('');
210
+ }
211
+ // ── Wire handlers into command tree ─────────────────────────────────────────
212
+ export function wireApplianceHandlers(applianceNode) {
213
+ if (!applianceNode.children)
214
+ return;
215
+ for (const child of applianceNode.children) {
216
+ if (child.name === 'performance') {
217
+ child.handler = handleAppliancePerformance;
218
+ }
219
+ }
220
+ }
221
+ //# sourceMappingURL=appliance-performance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appliance-performance.js","sourceRoot":"","sources":["../../../src/shell/commands/appliance-performance.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AA+ChD;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,WAiYzB,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAgDhD;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,WAiZzB,CAAC"}
@@ -6,6 +6,7 @@ import { wireSystemHandlers } from './system.js';
6
6
  import { wireDebugHandlers } from './debug.js';
7
7
  import { wireTestHandlers } from './test.js';
8
8
  import { wireDockerHandlers, wireNetworkHandlers, wireK8sHandlers, wireJtapiHandlers, wireLoadtestHandlers, } from './diag.js';
9
+ import { wireApplianceHandlers, showAppliancePerformance } from './appliance-performance.js';
9
10
  /**
10
11
  * Full command tree for the ct shell.
11
12
  * Handlers are wired to implementations in show.ts, services.ts, db.ts, config.ts, and system.ts.
@@ -14,6 +15,14 @@ export const commandTree = {
14
15
  name: 'root',
15
16
  description: 'CallTelemetry Voice OS',
16
17
  children: [
18
+ // ── appliance ─────────────────────────────────────────
19
+ {
20
+ name: 'appliance',
21
+ description: 'Appliance management',
22
+ children: [
23
+ { name: 'performance', description: 'Set performance profile <small|medium|large>', positionalArgs: ['<profile>'] },
24
+ ],
25
+ },
17
26
  // ── config ───────────────────────────────────────────
18
27
  {
19
28
  name: 'config',
@@ -210,6 +219,13 @@ export const commandTree = {
210
219
  name: 'show',
211
220
  description: 'Display system information',
212
221
  children: [
222
+ {
223
+ name: 'appliance',
224
+ description: 'Appliance information',
225
+ children: [
226
+ { name: 'performance', description: 'Current performance profile', handler: showAppliancePerformance },
227
+ ],
228
+ },
213
229
  {
214
230
  name: 'cdr',
215
231
  description: 'Call detail records',
@@ -414,4 +430,7 @@ if (jtapiNode)
414
430
  const loadtestNode = findChild('loadtest');
415
431
  if (loadtestNode)
416
432
  wireLoadtestHandlers(loadtestNode);
433
+ const applianceNode = findChild('appliance');
434
+ if (applianceNode)
435
+ wireApplianceHandlers(applianceNode);
417
436
  //# sourceMappingURL=registry.js.map