@solidnumber/cli 1.6.5 → 1.7.0

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 (54) hide show
  1. package/dist/__tests__/commands/deploy.test.d.ts +8 -0
  2. package/dist/__tests__/commands/deploy.test.d.ts.map +1 -0
  3. package/dist/__tests__/commands/deploy.test.js +190 -0
  4. package/dist/__tests__/commands/deploy.test.js.map +1 -0
  5. package/dist/__tests__/commands/history.test.d.ts +8 -0
  6. package/dist/__tests__/commands/history.test.d.ts.map +1 -0
  7. package/dist/__tests__/commands/history.test.js +213 -0
  8. package/dist/__tests__/commands/history.test.js.map +1 -0
  9. package/dist/__tests__/commands/logs.test.d.ts +5 -0
  10. package/dist/__tests__/commands/logs.test.d.ts.map +1 -0
  11. package/dist/__tests__/commands/logs.test.js +124 -0
  12. package/dist/__tests__/commands/logs.test.js.map +1 -0
  13. package/dist/__tests__/commands/migrate.test.d.ts +9 -0
  14. package/dist/__tests__/commands/migrate.test.d.ts.map +1 -0
  15. package/dist/__tests__/commands/migrate.test.js +277 -0
  16. package/dist/__tests__/commands/migrate.test.js.map +1 -0
  17. package/dist/__tests__/commands/test.test.d.ts +5 -0
  18. package/dist/__tests__/commands/test.test.d.ts.map +1 -0
  19. package/dist/__tests__/commands/test.test.js +220 -0
  20. package/dist/__tests__/commands/test.test.js.map +1 -0
  21. package/dist/commands/deploy.d.ts +3 -0
  22. package/dist/commands/deploy.d.ts.map +1 -0
  23. package/dist/commands/deploy.js +276 -0
  24. package/dist/commands/deploy.js.map +1 -0
  25. package/dist/commands/dev.d.ts +12 -5
  26. package/dist/commands/dev.d.ts.map +1 -1
  27. package/dist/commands/dev.js +400 -49
  28. package/dist/commands/dev.js.map +1 -1
  29. package/dist/commands/history.d.ts +4 -0
  30. package/dist/commands/history.d.ts.map +1 -0
  31. package/dist/commands/history.js +395 -0
  32. package/dist/commands/history.js.map +1 -0
  33. package/dist/commands/logs.d.ts +13 -0
  34. package/dist/commands/logs.d.ts.map +1 -0
  35. package/dist/commands/logs.js +201 -0
  36. package/dist/commands/logs.js.map +1 -0
  37. package/dist/commands/migrate.d.ts +3 -0
  38. package/dist/commands/migrate.d.ts.map +1 -0
  39. package/dist/commands/migrate.js +207 -0
  40. package/dist/commands/migrate.js.map +1 -0
  41. package/dist/commands/push.d.ts.map +1 -1
  42. package/dist/commands/push.js +10 -0
  43. package/dist/commands/push.js.map +1 -1
  44. package/dist/commands/test.d.ts +13 -0
  45. package/dist/commands/test.d.ts.map +1 -0
  46. package/dist/commands/test.js +249 -0
  47. package/dist/commands/test.js.map +1 -0
  48. package/dist/index.js +15 -0
  49. package/dist/index.js.map +1 -1
  50. package/dist/lib/api-client.d.ts +50 -0
  51. package/dist/lib/api-client.d.ts.map +1 -1
  52. package/dist/lib/api-client.js +89 -0
  53. package/dist/lib/api-client.js.map +1 -1
  54. package/package.json +1 -1
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Deploy (preview) command tests
3
+ *
4
+ * Tests preview creation, listing, promotion to live,
5
+ * expiration, and the shareable URL contract.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=deploy.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/commands/deploy.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ /**
3
+ * Deploy (preview) command tests
4
+ *
5
+ * Tests preview creation, listing, promotion to live,
6
+ * expiration, and the shareable URL contract.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const api_client_1 = require("../../lib/api-client");
10
+ jest.mock('../../lib/api-client', () => ({
11
+ apiClient: {
12
+ previewCreate: jest.fn(),
13
+ previewList: jest.fn(),
14
+ previewGet: jest.fn(),
15
+ previewPromote: jest.fn(),
16
+ previewExpire: jest.fn(),
17
+ },
18
+ handleApiError: jest.fn((e) => ({ message: e?.message || 'Error', status: 500 })),
19
+ }));
20
+ const mockApi = api_client_1.apiClient;
21
+ describe('deploy commands', () => {
22
+ beforeEach(() => jest.clearAllMocks());
23
+ // ── Preview Create ────────────────────────────────────────────────
24
+ describe('deploy create', () => {
25
+ it('creates a preview deployment with shareable URL', async () => {
26
+ mockApi.previewCreate.mockResolvedValue({
27
+ data: {
28
+ success: true,
29
+ preview: {
30
+ preview_token: 'abc123def456',
31
+ page_count: 5,
32
+ kb_count: 12,
33
+ status: 'active',
34
+ expires_at: '2026-04-01T00:00:00Z',
35
+ },
36
+ preview_url: 'https://app.solidnumber.com/preview/abc123def456',
37
+ },
38
+ status: 200,
39
+ success: true,
40
+ });
41
+ const result = await mockApi.previewCreate({ title: 'Spring Redesign', ttl_hours: 48 });
42
+ expect(mockApi.previewCreate).toHaveBeenCalledWith({ title: 'Spring Redesign', ttl_hours: 48 });
43
+ expect(result.data.preview_url).toContain('preview/');
44
+ expect(result.data.preview.page_count).toBe(5);
45
+ expect(result.data.preview.status).toBe('active');
46
+ });
47
+ it('supports pages-only preview', async () => {
48
+ mockApi.previewCreate.mockResolvedValue({
49
+ data: { success: true, preview: { page_count: 3, kb_count: 0 }, preview_url: 'https://app.solidnumber.com/preview/xyz' },
50
+ status: 200,
51
+ success: true,
52
+ });
53
+ await mockApi.previewCreate({ pages_only: true });
54
+ expect(mockApi.previewCreate).toHaveBeenCalledWith({ pages_only: true });
55
+ });
56
+ it('supports kb-only preview', async () => {
57
+ mockApi.previewCreate.mockResolvedValue({
58
+ data: { success: true, preview: { page_count: 0, kb_count: 8 }, preview_url: 'https://app.solidnumber.com/preview/xyz' },
59
+ status: 200,
60
+ success: true,
61
+ });
62
+ await mockApi.previewCreate({ kb_only: true });
63
+ expect(mockApi.previewCreate).toHaveBeenCalledWith({ kb_only: true });
64
+ });
65
+ it('supports custom TTL', async () => {
66
+ mockApi.previewCreate.mockResolvedValue({
67
+ data: { success: true, preview: { expires_at: '2026-04-28T00:00:00Z' }, preview_url: 'url' },
68
+ status: 200,
69
+ success: true,
70
+ });
71
+ await mockApi.previewCreate({ ttl_hours: 720 }); // 30 days
72
+ expect(mockApi.previewCreate).toHaveBeenCalledWith({ ttl_hours: 720 });
73
+ });
74
+ });
75
+ // ── Preview List ──────────────────────────────────────────────────
76
+ describe('deploy list', () => {
77
+ it('lists all preview deployments', async () => {
78
+ mockApi.previewList.mockResolvedValue({
79
+ data: {
80
+ previews: [
81
+ { preview_token: 'tok1', status: 'active', title: 'Spring', page_count: 5, created_at: '2026-03-28T00:00:00Z' },
82
+ { preview_token: 'tok2', status: 'promoted', title: 'Winter', page_count: 3, created_at: '2026-03-20T00:00:00Z' },
83
+ { preview_token: 'tok3', status: 'expired', title: null, page_count: 2, created_at: '2026-03-15T00:00:00Z' },
84
+ ],
85
+ count: 3,
86
+ },
87
+ status: 200,
88
+ success: true,
89
+ });
90
+ const result = await mockApi.previewList(undefined, 20);
91
+ expect(result.data.previews).toHaveLength(3);
92
+ expect(result.data.previews[0].status).toBe('active');
93
+ });
94
+ it('filters by status', async () => {
95
+ mockApi.previewList.mockResolvedValue({
96
+ data: { previews: [{ status: 'active' }], count: 1 },
97
+ status: 200,
98
+ success: true,
99
+ });
100
+ await mockApi.previewList('active', 20);
101
+ expect(mockApi.previewList).toHaveBeenCalledWith('active', 20);
102
+ });
103
+ it('returns empty when no previews exist', async () => {
104
+ mockApi.previewList.mockResolvedValue({
105
+ data: { previews: [], count: 0 },
106
+ status: 200,
107
+ success: true,
108
+ });
109
+ const result = await mockApi.previewList(undefined, 20);
110
+ expect(result.data.previews).toHaveLength(0);
111
+ });
112
+ });
113
+ // ── Preview Get ───────────────────────────────────────────────────
114
+ describe('deploy get', () => {
115
+ it('gets full preview details including snapshots', async () => {
116
+ mockApi.previewGet.mockResolvedValue({
117
+ data: {
118
+ preview_token: 'tok1',
119
+ status: 'active',
120
+ page_count: 5,
121
+ kb_count: 12,
122
+ pages_snapshot: [{ slug: 'home', title: 'Home' }],
123
+ kb_snapshot: [{ title: 'FAQ', category: 'support' }],
124
+ settings_snapshot: { name: 'Acme Corp' },
125
+ preview_url: 'https://app.solidnumber.com/preview/tok1',
126
+ },
127
+ status: 200,
128
+ success: true,
129
+ });
130
+ const result = await mockApi.previewGet('tok1');
131
+ expect(mockApi.previewGet).toHaveBeenCalledWith('tok1');
132
+ expect(result.data.pages_snapshot).toHaveLength(1);
133
+ expect(result.data.kb_snapshot).toHaveLength(1);
134
+ });
135
+ });
136
+ // ── Preview Promote ───────────────────────────────────────────────
137
+ describe('deploy promote', () => {
138
+ it('promotes a preview to production', async () => {
139
+ mockApi.previewPromote.mockResolvedValue({
140
+ data: {
141
+ success: true,
142
+ message: 'Preview promoted to live: 5 pages, 12 KB entries',
143
+ pages_promoted: 5,
144
+ kb_promoted: 12,
145
+ },
146
+ status: 200,
147
+ success: true,
148
+ });
149
+ const result = await mockApi.previewPromote('tok1');
150
+ expect(mockApi.previewPromote).toHaveBeenCalledWith('tok1');
151
+ expect(result.data.pages_promoted).toBe(5);
152
+ expect(result.data.kb_promoted).toBe(12);
153
+ });
154
+ it('rejects promotion of non-active preview', async () => {
155
+ mockApi.previewPromote.mockRejectedValue({
156
+ response: { status: 400, data: { detail: 'Preview is expired, not active' } },
157
+ });
158
+ await expect(mockApi.previewPromote('expired_tok')).rejects.toBeDefined();
159
+ });
160
+ });
161
+ // ── Preview Expire ────────────────────────────────────────────────
162
+ describe('deploy expire', () => {
163
+ it('expires/cancels a preview deployment', async () => {
164
+ mockApi.previewExpire.mockResolvedValue({
165
+ data: { success: true, message: 'Preview expired' },
166
+ status: 200,
167
+ success: true,
168
+ });
169
+ await mockApi.previewExpire('tok1');
170
+ expect(mockApi.previewExpire).toHaveBeenCalledWith('tok1');
171
+ });
172
+ });
173
+ // ── Security ──────────────────────────────────────────────────────
174
+ describe('preview security', () => {
175
+ it('preview token is the only access key for public preview', () => {
176
+ // The public endpoint /api/v1/preview/{token} requires no auth
177
+ // Token IS the key — this is by design for shareable links
178
+ // Security: tokens are 32-byte URL-safe random strings
179
+ const token = 'abc123def456ghi789jkl012mno345pq';
180
+ expect(token.length).toBeGreaterThanOrEqual(20);
181
+ });
182
+ it('preview operations require auth (except public preview)', () => {
183
+ // create, list, get (detailed), promote, expire all require JWT
184
+ // Only the public render endpoint is unauthenticated
185
+ expect(mockApi.previewCreate).toBeDefined();
186
+ expect(mockApi.previewPromote).toBeDefined();
187
+ });
188
+ });
189
+ });
190
+ //# sourceMappingURL=deploy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.test.js","sourceRoot":"","sources":["../../../src/__tests__/commands/deploy.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * History + Rollback command tests
3
+ *
4
+ * Tests version history listing, page version retrieval,
5
+ * rollback execution, and KB version history.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=history.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/commands/history.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ /**
3
+ * History + Rollback command tests
4
+ *
5
+ * Tests version history listing, page version retrieval,
6
+ * rollback execution, and KB version history.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const api_client_1 = require("../../lib/api-client");
10
+ jest.mock('../../lib/api-client', () => ({
11
+ apiClient: {
12
+ historyPages: jest.fn(),
13
+ historyKB: jest.fn(),
14
+ historyPageVersion: jest.fn(),
15
+ rollbackPage: jest.fn(),
16
+ rollbackKB: jest.fn(),
17
+ createSnapshot: jest.fn(),
18
+ },
19
+ handleApiError: jest.fn((e) => ({ message: e?.message || 'Error', status: 500 })),
20
+ }));
21
+ const mockApi = api_client_1.apiClient;
22
+ describe('history commands', () => {
23
+ beforeEach(() => jest.clearAllMocks());
24
+ // ── Page History ──────────────────────────────────────────────────
25
+ describe('history pages — list all', () => {
26
+ it('fetches recent page versions across all pages', async () => {
27
+ mockApi.historyPages.mockResolvedValue({
28
+ data: {
29
+ versions: [
30
+ { version: 3, slug: 'home', title: 'Home', source: 'cli', created_at: '2026-03-28T12:00:00Z' },
31
+ { version: 2, slug: 'about', title: 'About Us', source: 'dashboard', created_at: '2026-03-27T10:00:00Z' },
32
+ { version: 1, slug: 'home', title: 'Home', source: 'vibe', created_at: '2026-03-26T08:00:00Z' },
33
+ ],
34
+ count: 3,
35
+ },
36
+ status: 200,
37
+ success: true,
38
+ });
39
+ const result = await mockApi.historyPages(undefined, 50);
40
+ expect(mockApi.historyPages).toHaveBeenCalledWith(undefined, 50);
41
+ expect(result.data.versions).toHaveLength(3);
42
+ expect(result.data.count).toBe(3);
43
+ });
44
+ it('returns empty array when no versions exist', async () => {
45
+ mockApi.historyPages.mockResolvedValue({
46
+ data: { versions: [], count: 0 },
47
+ status: 200,
48
+ success: true,
49
+ });
50
+ const result = await mockApi.historyPages(undefined, 50);
51
+ expect(result.data.versions).toHaveLength(0);
52
+ });
53
+ });
54
+ describe('history pages — specific page', () => {
55
+ it('fetches version history for a specific page by slug', async () => {
56
+ mockApi.historyPages.mockResolvedValue({
57
+ data: {
58
+ page: { id: 10, slug: 'home', title: 'Home', current_version: 5 },
59
+ versions: [
60
+ { version: 5, title: 'Home v5', source: 'cli', change_summary: 'Updated hero', created_at: '2026-03-28T12:00:00Z' },
61
+ { version: 4, title: 'Home v4', source: 'cli', change_summary: 'Before push', created_at: '2026-03-28T11:59:00Z' },
62
+ { version: 3, title: 'Home v3', source: 'vibe', change_summary: null, created_at: '2026-03-27T10:00:00Z' },
63
+ ],
64
+ count: 3,
65
+ },
66
+ status: 200,
67
+ success: true,
68
+ });
69
+ const result = await mockApi.historyPages('home', 10);
70
+ expect(mockApi.historyPages).toHaveBeenCalledWith('home', 10);
71
+ expect(result.data.page.current_version).toBe(5);
72
+ expect(result.data.versions).toHaveLength(3);
73
+ });
74
+ it('respects limit parameter', async () => {
75
+ mockApi.historyPages.mockResolvedValue({
76
+ data: { versions: [{ version: 1 }], count: 1 },
77
+ status: 200,
78
+ success: true,
79
+ });
80
+ await mockApi.historyPages('home', 1);
81
+ expect(mockApi.historyPages).toHaveBeenCalledWith('home', 1);
82
+ });
83
+ });
84
+ describe('history pages — specific version detail', () => {
85
+ it('fetches full snapshot of a specific version', async () => {
86
+ mockApi.historyPageVersion.mockResolvedValue({
87
+ data: {
88
+ version: 3,
89
+ slug: 'home',
90
+ title: 'Home v3',
91
+ layout_json: { sections: [{ type: 'hero', content: { heading: 'Welcome' } }] },
92
+ is_published: true,
93
+ source: 'cli',
94
+ change_summary: 'Added hero section',
95
+ created_at: '2026-03-27T10:00:00Z',
96
+ },
97
+ status: 200,
98
+ success: true,
99
+ });
100
+ const result = await mockApi.historyPageVersion('home', 3);
101
+ expect(mockApi.historyPageVersion).toHaveBeenCalledWith('home', 3);
102
+ expect(result.data.layout_json.sections).toHaveLength(1);
103
+ expect(result.data.layout_json.sections[0].type).toBe('hero');
104
+ });
105
+ });
106
+ // ── KB History ────────────────────────────────────────────────────
107
+ describe('history KB — list all', () => {
108
+ it('fetches recent KB entry versions', async () => {
109
+ mockApi.historyKB.mockResolvedValue({
110
+ data: {
111
+ versions: [
112
+ { version: 2, kb_entry_id: 42, title: 'FAQ', category: 'support', source: 'cli' },
113
+ { version: 1, kb_entry_id: 42, title: 'FAQ', category: 'general', source: 'import' },
114
+ ],
115
+ count: 2,
116
+ },
117
+ status: 200,
118
+ success: true,
119
+ });
120
+ const result = await mockApi.historyKB(undefined, 50);
121
+ expect(result.data.versions).toHaveLength(2);
122
+ });
123
+ });
124
+ describe('history KB — specific entry', () => {
125
+ it('fetches version history for a specific KB entry by ID', async () => {
126
+ mockApi.historyKB.mockResolvedValue({
127
+ data: {
128
+ entry: { id: 42, title: 'FAQ', category: 'support' },
129
+ versions: [
130
+ { version: 2, title: 'FAQ', content: 'Updated content', source: 'cli' },
131
+ { version: 1, title: 'FAQ', content: 'Original content', source: 'cli' },
132
+ ],
133
+ count: 2,
134
+ },
135
+ status: 200,
136
+ success: true,
137
+ });
138
+ const result = await mockApi.historyKB(42, 10);
139
+ expect(mockApi.historyKB).toHaveBeenCalledWith(42, 10);
140
+ expect(result.data.entry.id).toBe(42);
141
+ expect(result.data.versions).toHaveLength(2);
142
+ });
143
+ });
144
+ // ── Rollback ──────────────────────────────────────────────────────
145
+ describe('rollback page', () => {
146
+ it('rolls back a page to a specific version', async () => {
147
+ mockApi.rollbackPage.mockResolvedValue({
148
+ data: {
149
+ success: true,
150
+ message: "Page 'home' rolled back to version 2",
151
+ page: { id: 10, slug: 'home', title: 'Home v2', version: 6 },
152
+ },
153
+ status: 200,
154
+ success: true,
155
+ });
156
+ const result = await mockApi.rollbackPage('home', 2);
157
+ expect(mockApi.rollbackPage).toHaveBeenCalledWith('home', 2);
158
+ expect(result.data.success).toBe(true);
159
+ expect(result.data.page.version).toBe(6); // version increments
160
+ });
161
+ it('auto-saves current state before rollback', async () => {
162
+ // The backend auto-snapshots before overwriting — this is critical
163
+ // We verify the API contract: rollback response confirms success
164
+ mockApi.rollbackPage.mockResolvedValue({
165
+ data: { success: true, message: "Page 'home' rolled back to version 1" },
166
+ status: 200,
167
+ success: true,
168
+ });
169
+ const result = await mockApi.rollbackPage('home', 1);
170
+ expect(result.data.success).toBe(true);
171
+ });
172
+ });
173
+ describe('rollback KB', () => {
174
+ it('rolls back a KB entry to a specific version', async () => {
175
+ mockApi.rollbackKB.mockResolvedValue({
176
+ data: {
177
+ success: true,
178
+ message: "KB entry 'FAQ' rolled back to version 1",
179
+ entry: { id: 42, title: 'FAQ', category: 'general' },
180
+ },
181
+ status: 200,
182
+ success: true,
183
+ });
184
+ const result = await mockApi.rollbackKB(42, 1);
185
+ expect(mockApi.rollbackKB).toHaveBeenCalledWith(42, 1);
186
+ expect(result.data.success).toBe(true);
187
+ });
188
+ });
189
+ // ── Snapshot ───────────────────────────────────────────────────────
190
+ describe('createSnapshot', () => {
191
+ it('creates a snapshot of current state', async () => {
192
+ mockApi.createSnapshot.mockResolvedValue({
193
+ data: { success: true, message: 'Snapshot created: 5 pages, 12 KB entries', pages: 5, kb_entries: 12 },
194
+ status: 200,
195
+ success: true,
196
+ });
197
+ const result = await mockApi.createSnapshot('cli', 'Before push');
198
+ expect(mockApi.createSnapshot).toHaveBeenCalledWith('cli', 'Before push');
199
+ expect(result.data.pages).toBe(5);
200
+ expect(result.data.kb_entries).toBe(12);
201
+ });
202
+ it('tracks source of snapshot (cli, dashboard, vibe)', async () => {
203
+ mockApi.createSnapshot.mockResolvedValue({
204
+ data: { success: true },
205
+ status: 200,
206
+ success: true,
207
+ });
208
+ await mockApi.createSnapshot('vibe', 'Vibe modification');
209
+ expect(mockApi.createSnapshot).toHaveBeenCalledWith('vibe', 'Vibe modification');
210
+ });
211
+ });
212
+ });
213
+ //# sourceMappingURL=history.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.test.js","sourceRoot":"","sources":["../../../src/__tests__/commands/history.test.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAEH,qDAAiD;AAEjD,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,SAAS,EAAE;QACT,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE;QACvB,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;QACpB,kBAAkB,EAAE,IAAI,CAAC,EAAE,EAAE;QAC7B,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE;QACvB,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE;QACrB,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE;KAC1B;IACD,cAAc,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;CACvF,CAAC,CAAC,CAAC;AAEJ,MAAM,OAAO,GAAG,sBAA0C,CAAC;AAE3D,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAEvC,qEAAqE;IAErE,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC;gBACrC,IAAI,EAAE;oBACJ,QAAQ,EAAE;wBACR,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE;wBAC9F,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,sBAAsB,EAAE;wBACzG,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,sBAAsB,EAAE;qBAChG;oBACD,KAAK,EAAE,CAAC;iBACT;gBACD,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACzD,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACjE,MAAM,CAAE,MAAM,CAAC,IAAY,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACtD,MAAM,CAAE,MAAM,CAAC,IAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC;gBACrC,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;gBAChC,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACzD,MAAM,CAAE,MAAM,CAAC,IAAY,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;QAC7C,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC;gBACrC,IAAI,EAAE;oBACJ,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,EAAE;oBACjE,QAAQ,EAAE;wBACR,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,sBAAsB,EAAE;wBACnH,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,sBAAsB,EAAE;wBAClH,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,sBAAsB,EAAE;qBAC3G;oBACD,KAAK,EAAE,CAAC;iBACT;gBACD,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACtD,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9D,MAAM,CAAE,MAAM,CAAC,IAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAE,MAAM,CAAC,IAAY,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;YACxC,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC;gBACrC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;gBAC9C,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACvD,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC;gBAC3C,IAAI,EAAE;oBACJ,OAAO,EAAE,CAAC;oBACV,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,SAAS;oBAChB,WAAW,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE;oBAC9E,YAAY,EAAE,IAAI;oBAClB,MAAM,EAAE,KAAK;oBACb,cAAc,EAAE,oBAAoB;oBACpC,UAAU,EAAE,sBAAsB;iBACnC;gBACD,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACnE,MAAM,CAAE,MAAM,CAAC,IAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClE,MAAM,CAAE,MAAM,CAAC,IAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,qEAAqE;IAErE,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC;gBAClC,IAAI,EAAE;oBACJ,QAAQ,EAAE;wBACR,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;wBACjF,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE;qBACrF;oBACD,KAAK,EAAE,CAAC;iBACT;gBACD,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACtD,MAAM,CAAE,MAAM,CAAC,IAAY,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC;gBAClC,IAAI,EAAE;oBACJ,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE;oBACpD,QAAQ,EAAE;wBACR,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,KAAK,EAAE;wBACvE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,KAAK,EAAE;qBACzE;oBACD,KAAK,EAAE,CAAC;iBACT;gBACD,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,CAAE,MAAM,CAAC,IAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/C,MAAM,CAAE,MAAM,CAAC,IAAY,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,qEAAqE;IAErE,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC;gBACrC,IAAI,EAAE;oBACJ,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,sCAAsC;oBAC/C,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;iBAC7D;gBACD,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACrD,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7D,MAAM,CAAE,MAAM,CAAC,IAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,CAAE,MAAM,CAAC,IAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB;QAC1E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,mEAAmE;YACnE,iEAAiE;YACjE,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC;gBACrC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,sCAAsC,EAAE;gBACxE,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACrD,MAAM,CAAE,MAAM,CAAC,IAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC;gBACnC,IAAI,EAAE;oBACJ,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,yCAAyC;oBAClD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE;iBACrD;gBACD,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACvD,MAAM,CAAE,MAAM,CAAC,IAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,sEAAsE;IAEtE,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC;gBACvC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,0CAA0C,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;gBACtG,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YAClE,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YAC1E,MAAM,CAAE,MAAM,CAAC,IAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAE,MAAM,CAAC,IAAY,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC;gBACvC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;gBACvB,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YAC1D,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Agent logs command tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=logs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/commands/logs.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ /**
3
+ * Agent logs command tests
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const api_client_1 = require("../../lib/api-client");
7
+ jest.mock('../../lib/api-client', () => ({
8
+ apiClient: {
9
+ agentLogs: jest.fn(),
10
+ agentErrors: jest.fn(),
11
+ },
12
+ handleApiError: jest.fn((e) => ({ message: e?.message || 'Error', status: 500 })),
13
+ }));
14
+ const mockApi = api_client_1.apiClient;
15
+ describe('logs command', () => {
16
+ beforeEach(() => jest.clearAllMocks());
17
+ describe('all agent logs', () => {
18
+ it('fetches unified activity log across all agents', async () => {
19
+ mockApi.agentLogs.mockResolvedValue({
20
+ data: {
21
+ logs: [
22
+ { timestamp: '2026-03-28T14:30:00Z', event_type: 'execution', agent_type: 'customer_service', action: 'chat_response', success: true, latency_ms: 450, tokens_used: 120 },
23
+ { timestamp: '2026-03-28T14:29:00Z', event_type: 'task', agent_type: null, action: 'Process refund request', success: true, latency_ms: 1200 },
24
+ { timestamp: '2026-03-28T14:28:00Z', event_type: 'communication', action: 'delegation', from_agent_id: 12, to_agent_id: 1 },
25
+ ],
26
+ count: 3,
27
+ period_hours: 24,
28
+ },
29
+ status: 200,
30
+ success: true,
31
+ });
32
+ const result = await mockApi.agentLogs(undefined, { hours: 24, limit: 50 });
33
+ expect(mockApi.agentLogs).toHaveBeenCalledWith(undefined, { hours: 24, limit: 50 });
34
+ expect(result.data.logs).toHaveLength(3);
35
+ expect(result.data.logs[0].event_type).toBe('execution');
36
+ });
37
+ });
38
+ describe('agent-specific logs', () => {
39
+ it('fetches logs for a specific agent with stats', async () => {
40
+ mockApi.agentLogs.mockResolvedValue({
41
+ data: {
42
+ agent_type: 'customer_service',
43
+ logs: [
44
+ { event_type: 'execution', action: 'chat_response', success: true, latency_ms: 300 },
45
+ ],
46
+ count: 1,
47
+ stats: {
48
+ total_executions: 50,
49
+ successes: 48,
50
+ errors: 2,
51
+ success_rate: 0.96,
52
+ avg_latency_ms: 320,
53
+ total_tokens: 15000,
54
+ },
55
+ },
56
+ status: 200,
57
+ success: true,
58
+ });
59
+ const result = await mockApi.agentLogs('customer_service', { hours: 24, limit: 100 });
60
+ expect(result.data.stats.success_rate).toBe(0.96);
61
+ expect(result.data.stats.total_tokens).toBe(15000);
62
+ });
63
+ });
64
+ describe('agent errors', () => {
65
+ it('fetches errors only for a specific agent', async () => {
66
+ mockApi.agentErrors.mockResolvedValue({
67
+ data: {
68
+ agent_type: 'customer_service',
69
+ errors: [
70
+ { timestamp: '2026-03-28T14:00:00Z', action: 'kb_lookup', error: 'KB entry not found', latency_ms: 50 },
71
+ ],
72
+ count: 1,
73
+ },
74
+ status: 200,
75
+ success: true,
76
+ });
77
+ const result = await mockApi.agentErrors('customer_service', 24, 50);
78
+ expect(mockApi.agentErrors).toHaveBeenCalledWith('customer_service', 24, 50);
79
+ expect(result.data.errors).toHaveLength(1);
80
+ expect(result.data.errors[0].error).toContain('not found');
81
+ });
82
+ it('returns empty when no errors exist', async () => {
83
+ mockApi.agentErrors.mockResolvedValue({
84
+ data: { agent_type: 'customer_service', errors: [], count: 0 },
85
+ status: 200,
86
+ success: true,
87
+ });
88
+ const result = await mockApi.agentErrors('customer_service', 24, 50);
89
+ expect(result.data.errors).toHaveLength(0);
90
+ });
91
+ });
92
+ describe('event type filtering', () => {
93
+ it('filters by execution events', async () => {
94
+ mockApi.agentLogs.mockResolvedValue({
95
+ data: { logs: [{ event_type: 'execution' }], count: 1 },
96
+ status: 200,
97
+ success: true,
98
+ });
99
+ await mockApi.agentLogs(undefined, { event_type: 'execution' });
100
+ expect(mockApi.agentLogs).toHaveBeenCalledWith(undefined, { event_type: 'execution' });
101
+ });
102
+ it('filters by task events', async () => {
103
+ mockApi.agentLogs.mockResolvedValue({
104
+ data: { logs: [{ event_type: 'task' }], count: 1 },
105
+ status: 200,
106
+ success: true,
107
+ });
108
+ await mockApi.agentLogs(undefined, { event_type: 'task' });
109
+ expect(mockApi.agentLogs).toHaveBeenCalledWith(undefined, { event_type: 'task' });
110
+ });
111
+ });
112
+ describe('time range', () => {
113
+ it('supports custom hour range', async () => {
114
+ mockApi.agentLogs.mockResolvedValue({
115
+ data: { logs: [], count: 0, period_hours: 72 },
116
+ status: 200,
117
+ success: true,
118
+ });
119
+ await mockApi.agentLogs(undefined, { hours: 72 });
120
+ expect(mockApi.agentLogs).toHaveBeenCalledWith(undefined, { hours: 72 });
121
+ });
122
+ });
123
+ });
124
+ //# sourceMappingURL=logs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.test.js","sourceRoot":"","sources":["../../../src/__tests__/commands/logs.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Migrate command tests
3
+ *
4
+ * Tests company-to-company migration: dry-run preview,
5
+ * execution, overwrite behavior, selective migration,
6
+ * and security (reserved IDs, membership checks).
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=migrate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/commands/migrate.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}