@pleri/olam-cli 0.1.7

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 (196) hide show
  1. package/dist/__tests__/auth-status.test.d.ts +2 -0
  2. package/dist/__tests__/auth-status.test.d.ts.map +1 -0
  3. package/dist/__tests__/auth-status.test.js +290 -0
  4. package/dist/__tests__/auth-status.test.js.map +1 -0
  5. package/dist/__tests__/auth-upgrade.test.d.ts +9 -0
  6. package/dist/__tests__/auth-upgrade.test.d.ts.map +1 -0
  7. package/dist/__tests__/auth-upgrade.test.js +161 -0
  8. package/dist/__tests__/auth-upgrade.test.js.map +1 -0
  9. package/dist/__tests__/create-app-urls.test.d.ts +2 -0
  10. package/dist/__tests__/create-app-urls.test.d.ts.map +1 -0
  11. package/dist/__tests__/create-app-urls.test.js +102 -0
  12. package/dist/__tests__/create-app-urls.test.js.map +1 -0
  13. package/dist/__tests__/enter.test.d.ts +2 -0
  14. package/dist/__tests__/enter.test.d.ts.map +1 -0
  15. package/dist/__tests__/enter.test.js +90 -0
  16. package/dist/__tests__/enter.test.js.map +1 -0
  17. package/dist/__tests__/host-cp-gh-token.test.d.ts +9 -0
  18. package/dist/__tests__/host-cp-gh-token.test.d.ts.map +1 -0
  19. package/dist/__tests__/host-cp-gh-token.test.js +119 -0
  20. package/dist/__tests__/host-cp-gh-token.test.js.map +1 -0
  21. package/dist/__tests__/host-cp.test.d.ts +9 -0
  22. package/dist/__tests__/host-cp.test.d.ts.map +1 -0
  23. package/dist/__tests__/host-cp.test.js +254 -0
  24. package/dist/__tests__/host-cp.test.js.map +1 -0
  25. package/dist/__tests__/keys.test.d.ts +9 -0
  26. package/dist/__tests__/keys.test.d.ts.map +1 -0
  27. package/dist/__tests__/keys.test.js +145 -0
  28. package/dist/__tests__/keys.test.js.map +1 -0
  29. package/dist/__tests__/logs.test.d.ts +9 -0
  30. package/dist/__tests__/logs.test.d.ts.map +1 -0
  31. package/dist/__tests__/logs.test.js +124 -0
  32. package/dist/__tests__/logs.test.js.map +1 -0
  33. package/dist/__tests__/ps.test.d.ts +2 -0
  34. package/dist/__tests__/ps.test.d.ts.map +1 -0
  35. package/dist/__tests__/ps.test.js +172 -0
  36. package/dist/__tests__/ps.test.js.map +1 -0
  37. package/dist/__tests__/status-app-urls.test.d.ts +2 -0
  38. package/dist/__tests__/status-app-urls.test.d.ts.map +1 -0
  39. package/dist/__tests__/status-app-urls.test.js +125 -0
  40. package/dist/__tests__/status-app-urls.test.js.map +1 -0
  41. package/dist/__tests__/upgrade.test.d.ts +9 -0
  42. package/dist/__tests__/upgrade.test.d.ts.map +1 -0
  43. package/dist/__tests__/upgrade.test.js +262 -0
  44. package/dist/__tests__/upgrade.test.js.map +1 -0
  45. package/dist/commands/__tests__/carry-uncommitted.test.d.ts +14 -0
  46. package/dist/commands/__tests__/carry-uncommitted.test.d.ts.map +1 -0
  47. package/dist/commands/__tests__/carry-uncommitted.test.js +83 -0
  48. package/dist/commands/__tests__/carry-uncommitted.test.js.map +1 -0
  49. package/dist/commands/__tests__/openHostCpUrl.test.d.ts +2 -0
  50. package/dist/commands/__tests__/openHostCpUrl.test.d.ts.map +1 -0
  51. package/dist/commands/__tests__/openHostCpUrl.test.js +63 -0
  52. package/dist/commands/__tests__/openHostCpUrl.test.js.map +1 -0
  53. package/dist/commands/__tests__/refresh.test.d.ts +13 -0
  54. package/dist/commands/__tests__/refresh.test.d.ts.map +1 -0
  55. package/dist/commands/__tests__/refresh.test.js +170 -0
  56. package/dist/commands/__tests__/refresh.test.js.map +1 -0
  57. package/dist/commands/auth-status.d.ts +43 -0
  58. package/dist/commands/auth-status.d.ts.map +1 -0
  59. package/dist/commands/auth-status.js +208 -0
  60. package/dist/commands/auth-status.js.map +1 -0
  61. package/dist/commands/auth-upgrade.d.ts +47 -0
  62. package/dist/commands/auth-upgrade.d.ts.map +1 -0
  63. package/dist/commands/auth-upgrade.js +277 -0
  64. package/dist/commands/auth-upgrade.js.map +1 -0
  65. package/dist/commands/auth.d.ts +16 -0
  66. package/dist/commands/auth.d.ts.map +1 -0
  67. package/dist/commands/auth.js +283 -0
  68. package/dist/commands/auth.js.map +1 -0
  69. package/dist/commands/create.d.ts +8 -0
  70. package/dist/commands/create.d.ts.map +1 -0
  71. package/dist/commands/create.js +512 -0
  72. package/dist/commands/create.js.map +1 -0
  73. package/dist/commands/crystallize.d.ts +8 -0
  74. package/dist/commands/crystallize.d.ts.map +1 -0
  75. package/dist/commands/crystallize.js +101 -0
  76. package/dist/commands/crystallize.js.map +1 -0
  77. package/dist/commands/destroy.d.ts +6 -0
  78. package/dist/commands/destroy.d.ts.map +1 -0
  79. package/dist/commands/destroy.js +54 -0
  80. package/dist/commands/destroy.js.map +1 -0
  81. package/dist/commands/dispatch.d.ts +9 -0
  82. package/dist/commands/dispatch.d.ts.map +1 -0
  83. package/dist/commands/dispatch.js +94 -0
  84. package/dist/commands/dispatch.js.map +1 -0
  85. package/dist/commands/enter.d.ts +63 -0
  86. package/dist/commands/enter.d.ts.map +1 -0
  87. package/dist/commands/enter.js +206 -0
  88. package/dist/commands/enter.js.map +1 -0
  89. package/dist/commands/host-cp.d.ts +191 -0
  90. package/dist/commands/host-cp.d.ts.map +1 -0
  91. package/dist/commands/host-cp.js +797 -0
  92. package/dist/commands/host-cp.js.map +1 -0
  93. package/dist/commands/init.d.ts +9 -0
  94. package/dist/commands/init.d.ts.map +1 -0
  95. package/dist/commands/init.js +143 -0
  96. package/dist/commands/init.js.map +1 -0
  97. package/dist/commands/install.d.ts +22 -0
  98. package/dist/commands/install.d.ts.map +1 -0
  99. package/dist/commands/install.js +203 -0
  100. package/dist/commands/install.js.map +1 -0
  101. package/dist/commands/keys.d.ts +26 -0
  102. package/dist/commands/keys.d.ts.map +1 -0
  103. package/dist/commands/keys.js +151 -0
  104. package/dist/commands/keys.js.map +1 -0
  105. package/dist/commands/lanes.d.ts +18 -0
  106. package/dist/commands/lanes.d.ts.map +1 -0
  107. package/dist/commands/lanes.js +122 -0
  108. package/dist/commands/lanes.js.map +1 -0
  109. package/dist/commands/list.d.ts +6 -0
  110. package/dist/commands/list.d.ts.map +1 -0
  111. package/dist/commands/list.js +39 -0
  112. package/dist/commands/list.js.map +1 -0
  113. package/dist/commands/logs.d.ts +38 -0
  114. package/dist/commands/logs.d.ts.map +1 -0
  115. package/dist/commands/logs.js +177 -0
  116. package/dist/commands/logs.js.map +1 -0
  117. package/dist/commands/observe.d.ts +9 -0
  118. package/dist/commands/observe.d.ts.map +1 -0
  119. package/dist/commands/observe.js +34 -0
  120. package/dist/commands/observe.js.map +1 -0
  121. package/dist/commands/policy-check.d.ts +14 -0
  122. package/dist/commands/policy-check.d.ts.map +1 -0
  123. package/dist/commands/policy-check.js +76 -0
  124. package/dist/commands/policy-check.js.map +1 -0
  125. package/dist/commands/pr.d.ts +17 -0
  126. package/dist/commands/pr.d.ts.map +1 -0
  127. package/dist/commands/pr.js +148 -0
  128. package/dist/commands/pr.js.map +1 -0
  129. package/dist/commands/ps.d.ts +25 -0
  130. package/dist/commands/ps.d.ts.map +1 -0
  131. package/dist/commands/ps.js +164 -0
  132. package/dist/commands/ps.js.map +1 -0
  133. package/dist/commands/refresh-helpers.d.ts +25 -0
  134. package/dist/commands/refresh-helpers.d.ts.map +1 -0
  135. package/dist/commands/refresh-helpers.js +56 -0
  136. package/dist/commands/refresh-helpers.js.map +1 -0
  137. package/dist/commands/refresh.d.ts +23 -0
  138. package/dist/commands/refresh.d.ts.map +1 -0
  139. package/dist/commands/refresh.js +237 -0
  140. package/dist/commands/refresh.js.map +1 -0
  141. package/dist/commands/status.d.ts +6 -0
  142. package/dist/commands/status.d.ts.map +1 -0
  143. package/dist/commands/status.js +51 -0
  144. package/dist/commands/status.js.map +1 -0
  145. package/dist/commands/upgrade.d.ts +67 -0
  146. package/dist/commands/upgrade.d.ts.map +1 -0
  147. package/dist/commands/upgrade.js +358 -0
  148. package/dist/commands/upgrade.js.map +1 -0
  149. package/dist/commands/workspace.d.ts +23 -0
  150. package/dist/commands/workspace.d.ts.map +1 -0
  151. package/dist/commands/workspace.js +198 -0
  152. package/dist/commands/workspace.js.map +1 -0
  153. package/dist/commands/world-snapshot.d.ts +18 -0
  154. package/dist/commands/world-snapshot.d.ts.map +1 -0
  155. package/dist/commands/world-snapshot.js +327 -0
  156. package/dist/commands/world-snapshot.js.map +1 -0
  157. package/dist/context.d.ts +26 -0
  158. package/dist/context.d.ts.map +1 -0
  159. package/dist/context.js +51 -0
  160. package/dist/context.js.map +1 -0
  161. package/dist/index.d.ts +9 -0
  162. package/dist/index.d.ts.map +1 -0
  163. package/dist/index.js +18007 -0
  164. package/dist/index.js.map +1 -0
  165. package/dist/mcp-server.js +32236 -0
  166. package/dist/output.d.ts +10 -0
  167. package/dist/output.d.ts.map +1 -0
  168. package/dist/output.js +31 -0
  169. package/dist/output.js.map +1 -0
  170. package/host-cp/compose.yaml +126 -0
  171. package/host-cp/src/auth-secret-hint.mjs +45 -0
  172. package/host-cp/src/auth.mjs +155 -0
  173. package/host-cp/src/compose-worlds-sources.mjs +170 -0
  174. package/host-cp/src/container-secret-fetcher.mjs +163 -0
  175. package/host-cp/src/docker-events.mjs +184 -0
  176. package/host-cp/src/local-worlds-source.mjs +83 -0
  177. package/host-cp/src/plan-orchestrator.mjs +829 -0
  178. package/host-cp/src/plan-progress.mjs +282 -0
  179. package/host-cp/src/pr-cache.mjs +201 -0
  180. package/host-cp/src/pr-merge-poller.mjs +154 -0
  181. package/host-cp/src/process-poller.mjs +250 -0
  182. package/host-cp/src/proxy.mjs +245 -0
  183. package/host-cp/src/pylon-worlds-source.mjs +68 -0
  184. package/host-cp/src/redact.mjs +67 -0
  185. package/host-cp/src/secret-cache.mjs +104 -0
  186. package/host-cp/src/server.mjs +2215 -0
  187. package/host-cp/src/sse-gate.mjs +117 -0
  188. package/host-cp/src/version-status.mjs +209 -0
  189. package/host-cp/src/workspace-catalog.mjs +149 -0
  190. package/host-cp/src/world-names-store.mjs +176 -0
  191. package/host-cp/src/world-pr-state.mjs +97 -0
  192. package/host-cp/src/world-progress.mjs +322 -0
  193. package/host-cp/src/world-tunnel-manager.mjs +288 -0
  194. package/host-cp/src/worlds-db-source.mjs +191 -0
  195. package/host-cp/src/worlds-source.mjs +59 -0
  196. package/package.json +38 -0
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Unit tests for `olam refresh` command.
3
+ *
4
+ * Tests:
5
+ * 1. collectCpSourceFiles — mirrors build-devbox.sh:38-77 logic
6
+ * 2. validateServerMjsPresent — sanity-check gate
7
+ * 3. Command parser — arg/flag validation
8
+ * 4. Snapshot test — actual standalone dir matches expected structure
9
+ *
10
+ * Run: `cd packages/cli && npx vitest run src/commands/__tests__/refresh.test.ts`
11
+ */
12
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
13
+ import * as fs from 'node:fs';
14
+ import * as os from 'node:os';
15
+ import * as path from 'node:path';
16
+ import { Command } from 'commander';
17
+ import { collectCpSourceFiles, validateServerMjsPresent } from '../refresh-helpers.js';
18
+ // ── Helpers ─────────────────────────────────────────────────────────────────
19
+ function makeFakeStandalone(files) {
20
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-test-standalone-'));
21
+ for (const f of files) {
22
+ const fullPath = path.join(dir, f);
23
+ fs.mkdirSync(path.dirname(fullPath), { recursive: true });
24
+ fs.writeFileSync(fullPath, `// ${f}`);
25
+ }
26
+ return dir;
27
+ }
28
+ // ── collectCpSourceFiles ─────────────────────────────────────────────────────
29
+ describe('collectCpSourceFiles', () => {
30
+ let tmpDir;
31
+ beforeEach(() => {
32
+ tmpDir = '';
33
+ });
34
+ afterEach(() => {
35
+ if (tmpDir)
36
+ fs.rmSync(tmpDir, { recursive: true, force: true });
37
+ });
38
+ it('collects top-level *.mjs excluding *.test.mjs', () => {
39
+ tmpDir = makeFakeStandalone([
40
+ 'server.mjs',
41
+ 'stub.mjs',
42
+ 'stub.test.mjs', // should be excluded
43
+ 'api-files.mjs',
44
+ ]);
45
+ const entries = collectCpSourceFiles(tmpDir);
46
+ const destPaths = entries.map(e => e.destRelPath).sort();
47
+ expect(destPaths).toContain('server.mjs');
48
+ expect(destPaths).toContain('stub.mjs');
49
+ expect(destPaths).toContain('api-files.mjs');
50
+ expect(destPaths).not.toContain('stub.test.mjs');
51
+ });
52
+ it('includes lib/*.mjs excluding lib/*.test.mjs', () => {
53
+ tmpDir = makeFakeStandalone([
54
+ 'server.mjs',
55
+ 'lib/exec-with-status.mjs',
56
+ 'lib/exec-with-status.test.mjs', // should be excluded
57
+ ]);
58
+ const entries = collectCpSourceFiles(tmpDir);
59
+ const destPaths = entries.map(e => e.destRelPath).sort();
60
+ expect(destPaths).toContain('lib/exec-with-status.mjs');
61
+ expect(destPaths).not.toContain('lib/exec-with-status.test.mjs');
62
+ });
63
+ it('skips lib/ entirely when it does not exist', () => {
64
+ tmpDir = makeFakeStandalone(['server.mjs', 'stub.mjs']);
65
+ const entries = collectCpSourceFiles(tmpDir);
66
+ const destPaths = entries.map(e => e.destRelPath);
67
+ expect(destPaths.every(p => !p.startsWith('lib/'))).toBe(true);
68
+ });
69
+ it('returns srcPath values that exist on disk', () => {
70
+ tmpDir = makeFakeStandalone(['server.mjs', 'lib/exec-with-status.mjs']);
71
+ const entries = collectCpSourceFiles(tmpDir);
72
+ for (const { srcPath } of entries) {
73
+ expect(fs.existsSync(srcPath), `srcPath should exist: ${srcPath}`).toBe(true);
74
+ }
75
+ });
76
+ it('throws when standalone dir does not exist', () => {
77
+ expect(() => collectCpSourceFiles('/nonexistent/standalone')).toThrow(/not found/);
78
+ });
79
+ it('does not include non-.mjs files', () => {
80
+ tmpDir = makeFakeStandalone(['server.mjs', 'package.json', 'README.md']);
81
+ const entries = collectCpSourceFiles(tmpDir);
82
+ const destPaths = entries.map(e => e.destRelPath);
83
+ expect(destPaths).toContain('server.mjs');
84
+ expect(destPaths).not.toContain('package.json');
85
+ expect(destPaths).not.toContain('README.md');
86
+ });
87
+ });
88
+ // ── validateServerMjsPresent ─────────────────────────────────────────────────
89
+ describe('validateServerMjsPresent', () => {
90
+ it('throws when server.mjs is absent', () => {
91
+ const entries = [
92
+ { srcPath: '/fake/stub.mjs', destRelPath: 'stub.mjs' },
93
+ ];
94
+ expect(() => validateServerMjsPresent(entries)).toThrow(/server\.mjs/);
95
+ });
96
+ it('passes when server.mjs is present', () => {
97
+ const entries = [
98
+ { srcPath: '/fake/server.mjs', destRelPath: 'server.mjs' },
99
+ { srcPath: '/fake/stub.mjs', destRelPath: 'stub.mjs' },
100
+ ];
101
+ expect(() => validateServerMjsPresent(entries)).not.toThrow();
102
+ });
103
+ });
104
+ function parseRefreshArgs(argv) {
105
+ let result = { worldId: undefined, opts: {} };
106
+ const program = new Command();
107
+ program.exitOverride();
108
+ program
109
+ .command('refresh')
110
+ .argument('[world]', 'World ID')
111
+ .option('--all', 'Refresh every running world')
112
+ .option('--no-restart', 'Copy files but skip restart')
113
+ .option('--skip-build', 'Skip server.mjs check')
114
+ .action((worldId, opts) => {
115
+ result = { worldId, opts };
116
+ });
117
+ program.parse(['refresh', ...argv], { from: 'user' });
118
+ return result;
119
+ }
120
+ describe('olam refresh — command parser', () => {
121
+ it('parses a positional world ID', () => {
122
+ const { worldId, opts } = parseRefreshArgs(['gold-sky-9120']);
123
+ expect(worldId).toBe('gold-sky-9120');
124
+ expect(opts.all).toBeUndefined();
125
+ });
126
+ it('parses --all without positional arg', () => {
127
+ const { worldId, opts } = parseRefreshArgs(['--all']);
128
+ expect(worldId).toBeUndefined();
129
+ expect(opts.all).toBe(true);
130
+ });
131
+ it('--no-restart sets restart to false', () => {
132
+ const { opts } = parseRefreshArgs(['test-world', '--no-restart']);
133
+ expect(opts.restart).toBe(false);
134
+ });
135
+ it('--skip-build flag is recognised', () => {
136
+ const { opts } = parseRefreshArgs(['test-world', '--skip-build']);
137
+ expect(opts.skipBuild).toBe(true);
138
+ });
139
+ });
140
+ // ── Snapshot: actual standalone/ matches build-devbox.sh expectations ────────
141
+ describe('collectCpSourceFiles — actual standalone dir', () => {
142
+ it('collects the actual standalone/ dir without error', () => {
143
+ // This test is a canary: if it fails, the standalone dir is missing
144
+ // or server.mjs is not present — which means build-devbox.sh would
145
+ // also fail. File path is relative to this test file's compile-time
146
+ // location; adjust if the test runner CWD changes.
147
+ // Resolve relative to monorepo root from this file's location.
148
+ // vitest runs from the package root; use process.cwd() as the anchor.
149
+ const standaloneDir = path.resolve(process.cwd(), '../control-plane/standalone');
150
+ if (!fs.existsSync(standaloneDir)) {
151
+ // Skip gracefully when running in an environment without the full
152
+ // monorepo (e.g. isolated package publish tests).
153
+ console.warn(`SKIP: standalone dir not found at ${standaloneDir}`);
154
+ return;
155
+ }
156
+ const entries = collectCpSourceFiles(standaloneDir);
157
+ expect(entries.length).toBeGreaterThan(0);
158
+ // server.mjs must be present (sanity-checked by build-devbox.sh too)
159
+ const destPaths = entries.map(e => e.destRelPath);
160
+ expect(destPaths).toContain('server.mjs');
161
+ // No test files should sneak in
162
+ const testFiles = destPaths.filter(p => p.endsWith('.test.mjs'));
163
+ expect(testFiles, `test files leaked into source list: ${testFiles.join(', ')}`).toHaveLength(0);
164
+ // All srcPaths must exist
165
+ for (const { srcPath } of entries) {
166
+ expect(fs.existsSync(srcPath), `srcPath missing: ${srcPath}`).toBe(true);
167
+ }
168
+ });
169
+ });
170
+ //# sourceMappingURL=refresh.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/refresh.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Auth credential inspector — reads from auth-service (single source of truth).
3
+ *
4
+ * Falls back to local accounts.json only if needed for token redaction tests.
5
+ * Auth-service is always authoritative; reading local files risks showing
6
+ * phantom credentials that no longer exist in the live vault.
7
+ *
8
+ * Token security (T4): accessToken and refreshToken fields are NEVER read
9
+ * into variables used in output. Only safe fields are touched.
10
+ */
11
+ import { type CredentialState } from '@olam/auth-logic';
12
+ import type { AuthAccountSummary } from '@olam/core/src/auth/types.js';
13
+ interface AccountUsage {
14
+ readonly requestCount5h: number;
15
+ readonly last429At: string | null;
16
+ }
17
+ interface SafeAccount {
18
+ readonly id: string;
19
+ readonly accountLabel?: string;
20
+ readonly expiresAt?: number;
21
+ readonly rateLimited?: boolean;
22
+ readonly rateLimitResetsAt?: string;
23
+ readonly lastUsed?: string;
24
+ readonly state?: CredentialState;
25
+ readonly usage?: AccountUsage;
26
+ }
27
+ export declare function readAccountsFile(filePath: string): SafeAccount[];
28
+ export interface FormatResult {
29
+ output: string;
30
+ exitCode: 0 | 2;
31
+ }
32
+ export declare function formatAuthStatus(accounts: SafeAccount[], now?: number): FormatResult;
33
+ /**
34
+ * Run `olam auth status`.
35
+ *
36
+ * @param getStatus - Injectable status fetcher for tests; defaults to AuthClient.status().
37
+ */
38
+ export declare function runAuthStatus(getStatus?: () => Promise<{
39
+ reachable: boolean;
40
+ accounts: readonly AuthAccountSummary[];
41
+ }>): Promise<void>;
42
+ export {};
43
+ //# sourceMappingURL=auth-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-status.d.ts","sourceRoot":"","sources":["../../src/commands/auth-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,EAAqD,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAG3G,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,UAAU,YAAY;IACpB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAGD,UAAU,WAAW;IACnB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;CAC/B;AAcD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CAiChE;AA+CD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,WAAW,EAAE,EACvB,GAAG,GAAE,MAAmB,GACvB,YAAY,CAiFd;AAoBD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAA;CAAE,CAAC,GACzF,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Auth credential inspector — reads from auth-service (single source of truth).
3
+ *
4
+ * Falls back to local accounts.json only if needed for token redaction tests.
5
+ * Auth-service is always authoritative; reading local files risks showing
6
+ * phantom credentials that no longer exist in the live vault.
7
+ *
8
+ * Token security (T4): accessToken and refreshToken fields are NEVER read
9
+ * into variables used in output. Only safe fields are touched.
10
+ */
11
+ import * as fs from 'node:fs';
12
+ import * as os from 'node:os';
13
+ import * as path from 'node:path';
14
+ import pc from 'picocolors';
15
+ import { effectiveState, pickCredential, nextCooldownReset } from '@olam/auth-logic';
16
+ import { AuthClient } from '@olam/core/src/auth/index.js';
17
+ import { printError } from '../output.js';
18
+ // ----- file path (mirrors auth-service/src/store.ts) -------------------
19
+ const DOCKER_DATA_DIR = '/auth-data';
20
+ const LOCAL_DATA_DIR = path.join(os.homedir(), '.olam', 'auth-data');
21
+ function resolveAccountsPath() {
22
+ if (fs.existsSync(DOCKER_DATA_DIR)) {
23
+ return path.join(DOCKER_DATA_DIR, 'accounts.json');
24
+ }
25
+ return path.join(LOCAL_DATA_DIR, 'accounts.json');
26
+ }
27
+ export function readAccountsFile(filePath) {
28
+ if (!fs.existsSync(filePath))
29
+ return [];
30
+ try {
31
+ const raw = fs.readFileSync(filePath, 'utf-8');
32
+ const parsed = JSON.parse(raw);
33
+ if (!Array.isArray(parsed))
34
+ return [];
35
+ // Project only safe fields; accessToken / refreshToken are never extracted.
36
+ return parsed.map((r) => ({
37
+ id: String(r['id'] ?? ''),
38
+ accountLabel: r['accountLabel'] != null ? String(r['accountLabel']) : undefined,
39
+ expiresAt: typeof r['expiresAt'] === 'number' ? r['expiresAt'] : undefined,
40
+ rateLimited: typeof r['rateLimited'] === 'boolean' ? r['rateLimited'] : undefined,
41
+ rateLimitResetsAt: typeof r['rateLimitResetsAt'] === 'string' ? r['rateLimitResetsAt'] : undefined,
42
+ lastUsed: typeof r['lastUsed'] === 'string' ? r['lastUsed'] : undefined,
43
+ state: isCredentialState(r['state']) ? r['state'] : undefined,
44
+ usage: r['usage'] != null && typeof r['usage'] === 'object'
45
+ ? {
46
+ requestCount5h: typeof r['usage']['requestCount5h'] === 'number'
47
+ ? r['usage']['requestCount5h']
48
+ : 0,
49
+ last429At: typeof r['usage']['last429At'] === 'string'
50
+ ? r['usage']['last429At']
51
+ : null,
52
+ }
53
+ : undefined,
54
+ }));
55
+ }
56
+ catch {
57
+ return [];
58
+ }
59
+ }
60
+ function isCredentialState(v) {
61
+ return v === 'active' || v === 'cooldown' || v === 'expired' || v === 'disabled';
62
+ }
63
+ // ----- formatting helpers -----------------------------------------------
64
+ function localHHMM(isoStr) {
65
+ const d = new Date(isoStr);
66
+ return d.toLocaleTimeString(undefined, {
67
+ hour: '2-digit',
68
+ minute: '2-digit',
69
+ hour12: false,
70
+ });
71
+ }
72
+ function daysAgoStr(expiresAt, now) {
73
+ const diffDays = Math.floor((now - expiresAt) / (1000 * 60 * 60 * 24));
74
+ if (diffDays <= 0)
75
+ return 'expired today';
76
+ return `expired ${diffDays} day${diffDays === 1 ? '' : 's'} ago`;
77
+ }
78
+ function trunc(s, maxLen) {
79
+ return s.length > maxLen ? s.slice(0, maxLen) : s;
80
+ }
81
+ // ----- table builder -----------------------------------------------------
82
+ const STATE_PRIORITY = {
83
+ active: 0,
84
+ cooldown: 1,
85
+ 'usage-capped': 2,
86
+ disabled: 3,
87
+ expired: 4,
88
+ };
89
+ export function formatAuthStatus(accounts, now = Date.now()) {
90
+ const picked = pickCredential(accounts, now);
91
+ const rows = accounts.map((account) => {
92
+ const state = effectiveState(account, now);
93
+ const isPicked = picked != null && account.id === picked.id;
94
+ const req5h = account.usage?.requestCount5h ?? 0;
95
+ const last429 = account.usage?.last429At ? localHHMM(account.usage.last429At) : 'never';
96
+ let reason;
97
+ if (isPicked) {
98
+ reason = '← selected';
99
+ }
100
+ else if (state === 'active') {
101
+ reason = `req5h=${req5h} (higher than candidate)`;
102
+ }
103
+ else if (state === 'cooldown') {
104
+ const resetTime = account.rateLimitResetsAt ? localHHMM(account.rateLimitResetsAt) : '?';
105
+ reason = `cooldown until ${resetTime}`;
106
+ }
107
+ else if (state === 'expired') {
108
+ reason = daysAgoStr(account.expiresAt ?? 0, now);
109
+ }
110
+ else {
111
+ reason = 'disabled';
112
+ }
113
+ return { id: account.id, label: account.accountLabel ?? account.id, state, reason, req5h, last429, isPicked };
114
+ });
115
+ rows.sort((a, b) => {
116
+ if (a.isPicked !== b.isPicked)
117
+ return a.isPicked ? -1 : 1;
118
+ return STATE_PRIORITY[a.state] - STATE_PRIORITY[b.state];
119
+ });
120
+ const COL = { id: 17, label: 17, state: 11, reason: 28, req5h: 7 };
121
+ const lines = [];
122
+ const hdr = 'id'.padEnd(COL.id) +
123
+ 'label'.padEnd(COL.label) +
124
+ 'state'.padEnd(COL.state) +
125
+ 'reason'.padEnd(COL.reason) +
126
+ 'req5h'.padEnd(COL.req5h) +
127
+ 'last429';
128
+ lines.push(pc.dim(hdr));
129
+ lines.push(pc.dim('-'.repeat(hdr.length)));
130
+ for (const row of rows) {
131
+ const id = trunc(row.id, 16).padEnd(COL.id);
132
+ const label = trunc(row.label, 16).padEnd(COL.label);
133
+ const stateRaw = row.state.padEnd(COL.state);
134
+ const stateColored = row.state === 'active'
135
+ ? pc.green(stateRaw)
136
+ : row.state === 'cooldown'
137
+ ? pc.yellow(stateRaw)
138
+ : row.state === 'expired'
139
+ ? pc.red(stateRaw)
140
+ : pc.dim(stateRaw);
141
+ const reason = row.reason.padEnd(COL.reason);
142
+ const req5h = String(row.req5h).padEnd(COL.req5h);
143
+ if (row.isPicked) {
144
+ lines.push(pc.bold(id) + pc.bold(label) + stateColored + pc.green(reason) + pc.dim(req5h) + pc.dim(row.last429));
145
+ }
146
+ else {
147
+ lines.push(id + label + stateColored + reason + pc.dim(req5h) + pc.dim(row.last429));
148
+ }
149
+ }
150
+ if (picked == null) {
151
+ const resetIso = nextCooldownReset(accounts, now);
152
+ lines.push('');
153
+ lines.push(resetIso
154
+ ? pc.yellow(`Next reset: ${localHHMM(resetIso)}`)
155
+ : pc.dim('No reset scheduled'));
156
+ return { output: lines.join('\n'), exitCode: 2 };
157
+ }
158
+ return { output: lines.join('\n'), exitCode: 0 };
159
+ }
160
+ // ----- CLI entry point ---------------------------------------------------
161
+ /** Projects auth-service account summary to safe local format for formatting. */
162
+ function toSafeAccount(a) {
163
+ return {
164
+ id: a.id,
165
+ accountLabel: a.accountLabel,
166
+ // expiresAt not exposed in summary — state is pre-computed server-side
167
+ rateLimited: a.rateLimited,
168
+ rateLimitResetsAt: a.rateLimitResetsAt,
169
+ lastUsed: a.lastUsed,
170
+ state: a.state,
171
+ usage: a.usage
172
+ ? { requestCount5h: a.usage.requestCount5h, last429At: a.usage.last429At }
173
+ : undefined,
174
+ };
175
+ }
176
+ /**
177
+ * Run `olam auth status`.
178
+ *
179
+ * @param getStatus - Injectable status fetcher for tests; defaults to AuthClient.status().
180
+ */
181
+ export async function runAuthStatus(getStatus) {
182
+ const fetchStatus = getStatus ?? (() => new AuthClient().status());
183
+ let status;
184
+ try {
185
+ status = await fetchStatus();
186
+ }
187
+ catch {
188
+ printError('Failed to contact auth service. Run `olam auth up` first.');
189
+ process.exitCode = 1;
190
+ return;
191
+ }
192
+ if (!status.reachable) {
193
+ printError('Auth container is not reachable. Run `olam auth up` first.');
194
+ process.exitCode = 1;
195
+ return;
196
+ }
197
+ if (status.accounts.length === 0) {
198
+ console.log(pc.dim('No credentials found. Run: olam auth login'));
199
+ return;
200
+ }
201
+ const accounts = status.accounts.map(toSafeAccount);
202
+ const result = formatAuthStatus(accounts);
203
+ console.log(result.output);
204
+ if (result.exitCode !== 0) {
205
+ process.exitCode = result.exitCode;
206
+ }
207
+ }
208
+ //# sourceMappingURL=auth-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-status.js","sourceRoot":"","sources":["../../src/commands/auth-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * `olam auth upgrade` — rebuild the olam-auth image and force-recreate the container.
3
+ *
4
+ * Steps:
5
+ * bash build-auth.sh (rebuilds olam-auth:local with latest source + git SHA)
6
+ * docker stop olam-auth + docker rm olam-auth
7
+ * olam auth up logic (docker run with correct env vars via AuthContainerController)
8
+ * wait for /health
9
+ * smoke test: POST /credentials/add provider=codex must NOT return a Claude URL
10
+ */
11
+ import type { Command } from 'commander';
12
+ export interface AuthUpgradeOpts {
13
+ readonly yes: boolean;
14
+ readonly skipRecreate: boolean;
15
+ }
16
+ /** Normalise raw Commander option object into typed opts. */
17
+ export declare function parseAuthUpgradeOpts(raw: {
18
+ yes?: boolean;
19
+ skipRecreate?: boolean;
20
+ }): AuthUpgradeOpts;
21
+ /**
22
+ * Check cwd looks like the olam repo root for auth-service.
23
+ * Verifies packages/auth-service/Dockerfile exists.
24
+ */
25
+ export declare function validateAuthRepoRoot(cwd: string): {
26
+ ok: true;
27
+ } | {
28
+ ok: false;
29
+ error: string;
30
+ };
31
+ /** Block until auth service /health responds OK or timeout expires. */
32
+ export declare function waitForAuthHealth(timeoutMs?: number): Promise<boolean>;
33
+ /**
34
+ * Smoke test: POST /credentials/add with provider=codex.
35
+ *
36
+ * Passes when the response does NOT contain a claude.com/claude.ai loginUrl.
37
+ * A stale (pre-codex) image falls through to the Claude PKCE branch and
38
+ * returns a claude.com URL — this gate catches that.
39
+ */
40
+ export declare function smokeTestCodexProvider(authSecret: string | null): Promise<{
41
+ ok: true;
42
+ } | {
43
+ ok: false;
44
+ error: string;
45
+ }>;
46
+ export declare function registerAuthUpgrade(auth: Command): void;
47
+ //# sourceMappingURL=auth-upgrade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/auth-upgrade.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAED,6DAA6D;AAC7D,wBAAgB,oBAAoB,CAAC,GAAG,EAAE;IACxC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,eAAe,CAKlB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAW7F;AAED,uEAAuE;AACvE,wBAAsB,iBAAiB,CAAC,SAAS,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAc5E;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAuCtD;AAiMD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CASvD"}