@automagik/omni 2.260409.6 → 2.260410.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.
@@ -8,13 +8,15 @@
8
8
  * mismatch or an auth failure after a restart.
9
9
  *
10
10
  * Checks performed, in order:
11
- * 1. pm2-env-drift — pm2-stored env for omni-api vs. buildRuntimeEnv()
12
- * 2. cli-key-valid — stored CLI key still validates against the server
13
- * 3. pgserve-reachable — TCP connect to localhost:PGSERVE_PORT
14
- * 4. omni-db-exists — `omni` database exists on the embedded pgserve
15
- * 5. orphaned-data-dirs — `.pgserve-data/` directories under cwd
16
- * 6. version-match — CLI version vs. /api/v2/health `version` field
17
- * 7. pm2-status — omni-api and omni-nats both `online` in pm2
11
+ * 1. pm2-env-drift — pm2-stored env for omni-api vs. buildRuntimeEnv()
12
+ * 2. cli-key-valid — stored CLI key still validates against the server
13
+ * 3. pgserve-reachable — TCP connect to localhost:PGSERVE_PORT
14
+ * 4. omni-db-exists — `omni` database exists on the embedded pgserve
15
+ * 5. orphaned-data-dirs — `.pgserve-data/` directories under cwd
16
+ * 6. version-match — CLI version vs. /api/v2/health `version` field
17
+ * 7. pm2-status — omni-api and omni-nats both `online` in pm2
18
+ * 8. pm2-max-restarts — omni-api has bounded restarts (not 0 or >= 1000)
19
+ * 9. pm2-logrotate-installed — pm2-logrotate module configured correctly
18
20
  *
19
21
  * Each check returns OK / WARN / FAIL with a one-line detail. `--fix`
20
22
  * attempts repair for checks with a known repair path. The fix flow
@@ -22,20 +24,24 @@
22
24
  * load-bearing and has a dedicated mutation-safety test.
23
25
  *
24
26
  * Repair paths:
25
- * - pm2-env-drift: `pm2 delete omni-api` + re-launch via the same code
26
- * path used by `omni start`, with a sanitized env.
27
- * - cli-key-valid: Delete `__primary__` from api_keys, restart with a
28
- * freshly generated OMNI_API_KEY, re-validate, write
29
- * the new key to `~/.omni/config.json`.
30
- * - orphaned-data-dirs: Print `rm -rf` commands for the user to review
31
- * (we never auto-delete data directories).
27
+ * - pm2-env-drift: `pm2 delete omni-api` + re-launch with a
28
+ * sanitized env via `buildPm2StartArgs()`.
29
+ * - cli-key-valid: Delete `__primary__` from api_keys, restart
30
+ * with a freshly generated OMNI_API_KEY, re-
31
+ * validate, write new key to ~/.omni/config.json.
32
+ * - orphaned-data-dirs: Print `rm -rf` commands for the user to review
33
+ * (we never auto-delete data directories).
34
+ * - pm2-max-restarts: `pm2 delete` + re-launch via `buildPm2StartArgs()`
35
+ * so the hardened `--max-restarts` flag takes effect.
36
+ * - pm2-logrotate-installed: Re-run `pm2 install pm2-logrotate` + the four
37
+ * `pm2 set pm2-logrotate:*` commands.
32
38
  */
33
39
  import { Command } from 'commander';
34
40
  import { type Config, type ServerConfig } from '../config.js';
35
41
  /** Severity levels reported by each check. */
36
42
  export type CheckLevel = 'OK' | 'WARN' | 'FAIL';
37
43
  /** Identifier used in tests and --json output. */
38
- export type CheckId = 'pm2-env-drift' | 'cli-key-valid' | 'pgserve-reachable' | 'omni-db-exists' | 'orphaned-data-dirs' | 'version-match' | 'pm2-status';
44
+ export type CheckId = 'pm2-env-drift' | 'cli-key-valid' | 'pgserve-reachable' | 'omni-db-exists' | 'orphaned-data-dirs' | 'version-match' | 'pm2-status' | 'pm2-max-restarts' | 'pm2-logrotate-installed';
39
45
  export interface CheckResult {
40
46
  id: CheckId;
41
47
  level: CheckLevel;
@@ -68,6 +74,7 @@ interface Pm2Entry {
68
74
  pm_exec_path?: string;
69
75
  args?: string[];
70
76
  interpreter?: string;
77
+ max_restarts?: number;
71
78
  OMNI_API_KEY?: string;
72
79
  DATABASE_URL?: string;
73
80
  PGSERVE_DATA?: string;
@@ -108,6 +115,8 @@ export interface DoctorDeps {
108
115
  generateApiKey: () => string;
109
116
  /** Sleep briefly after a pm2 restart. Tests stub to zero-delay. */
110
117
  sleepMs: (ms: number) => Promise<void>;
118
+ /** Capture `pm2 conf` stdout (or null on error). Used by pm2-logrotate check. */
119
+ capturePm2Conf: () => Promise<string | null>;
111
120
  }
112
121
  /**
113
122
  * Run all checks and optionally apply fixes. Returns a structured
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAMH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,YAAY,EAA4C,MAAM,cAAc,CAAC;AAcxG,8CAA8C;AAC9C,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhD,kDAAkD;AAClD,MAAM,MAAM,OAAO,GACf,eAAe,GACf,eAAe,GACf,mBAAmB,GACnB,gBAAgB,GAChB,oBAAoB,GACpB,eAAe,GACf,YAAY,GACZ,kBAAkB,GAClB,yBAAyB,CAAC;AAE9B,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,UAAU,QAAQ;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;QACzC,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7B;AAoCD,uEAAuE;AACvE,MAAM,WAAW,UAAU;IACzB,mDAAmD;IACnD,eAAe,EAAE,MAAM,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC;IAClD,+DAA+D;IAC/D,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,uEAAuE;IACvE,YAAY,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,oEAAoE;IACpE,oBAAoB,EAAE,MAAM,MAAM,EAAE,CAAC;IACrC,qDAAqD;IACrD,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAChE,8DAA8D;IAC9D,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,6CAA6C;IAC7C,SAAS,EAAE,MAAM;QAAE,YAAY,EAAE,YAAY,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE;;;OAGG;IACH,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1E,oEAAoE;IACpE,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,2DAA2D;IAC3D,eAAe,EAAE,MAAM,MAAM,CAAC;IAC9B,0DAA0D;IAC1D,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,mEAAmE;IACnE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,iFAAiF;IACjF,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC9C;AAseD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAkBxG;AA2BD,wBAAgB,mBAAmB,IAAI,OAAO,CA+C7C"}
@@ -1,43 +1,42 @@
1
1
  /**
2
2
  * Install Command
3
3
  *
4
- * omni install [--non-interactive] [--systemd] [--port <port>]
4
+ * omni install [--port <port>] [--database-url <url>] [--api-key <key>]
5
+ * [--systemd] [--force-cleanup] [--non-interactive]
5
6
  *
6
- * Interactive setup wizard that bootstraps a full Omni server from zero:
7
- * 1. Banner + version
8
- * 2. System check (bun, port availability)
9
- * 3. NATS download (if not present)
10
- * 4. Process manager choice (PM2 or systemd or manual)
11
- * 5. Config (port, data dir)
12
- * 6. API key (generate or provide)
13
- * 7. Start services via PM2 (or write systemd unit)
14
- * 8. Health check
15
- * 9. Write ~/.omni/config.json
16
- * 10. Done banner + next steps
7
+ * Non-interactive, reinstall-safe bootstrapper. Rewritten from an interactive
8
+ * wizard in 2026-04 (WISH: omni-install-resilience). Flow:
9
+ *
10
+ * 1. Detect reinstall (config, pm2 process, or non-empty data dir).
11
+ * 2. Preserve ALL user data on reinstall — never regenerate keys or config.
12
+ * 3. Install pm2-logrotate (best-effort, idempotent).
13
+ * 4. Start services via pm2 with hardened flags (max-restarts, log rotation).
14
+ * 5. Health check.
15
+ * 6. Print an agent handoff block addressed TO the AI agent running this.
17
16
  */
18
17
  import { Command } from 'commander';
19
18
  /**
20
- * Compute the default database URL for the install wizard.
21
- *
22
- * Embedded mode is the default and derives the URL from the configured
23
- * pgserve port (never from the calling shell, which has historically
24
- * leaked foreign databases into omni-api via pm2's stored env). If an
25
- * operator wants to point omni at an external PostgreSQL they must pass
26
- * `--database-url <url>` explicitly — an opt-in signal that the external
27
- * URL is intentional and not an accidental shell export.
28
- *
29
- * Exported so `install-env-leak.test.ts` can assert hermeticity.
19
+ * Compute the default database URL. Embedded-mode derives from the pgserve
20
+ * port — NEVER from the calling shell. Exported so install-env-leak tests
21
+ * can assert hermeticity.
30
22
  */
31
23
  export declare function computeDefaultDatabaseUrl(): string;
32
- /**
33
- * Resolve the `databaseUrl` that will be written to `~/.omni/config.json`.
34
- * Exported for hermeticity tests. Never reads the calling shell's env.
35
- *
36
- * @param options.databaseUrlFlag — the explicit `--database-url` value, if
37
- * the operator passed one. Opt-in external-DB mode.
38
- */
24
+ /** Resolve the effective databaseUrl, honoring an explicit flag over the embedded default. */
39
25
  export declare function resolveInstallDatabaseUrl(options: {
40
26
  databaseUrlFlag?: string;
41
27
  }): string;
28
+ interface ResolvedConfig {
29
+ port: number;
30
+ dataDir: string;
31
+ databaseUrl: string;
32
+ apiKey: string;
33
+ }
34
+ /**
35
+ * Agent handoff banner. Plain text, no ANSI, no ASCII art, no interactive
36
+ * prompts. An agent reading stdout can act on this block directly.
37
+ * Exported for tests that assert the block's structure.
38
+ */
39
+ export declare function buildAgentHandoffBlock(cfg: ResolvedConfig, apiKeyDisplay: string): string;
42
40
  export declare function createInstallCommand(): Command;
41
+ export {};
43
42
  //# sourceMappingURL=install.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IAAE,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAMvF;AA0kBD,wBAAgB,oBAAoB,IAAI,OAAO,CAQ9C"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAED,8FAA8F;AAC9F,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IAAE,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAIvF;AAYD,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAyLD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAmCzF;AA2DD,wBAAgB,oBAAoB,IAAI,OAAO,CAU9C"}
@@ -1 +1 @@
1
- {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0EpC,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C"}
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyFpC,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C"}