@sonde/agent 0.0.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 (149) hide show
  1. package/dist/cli/packs.d.ts +23 -0
  2. package/dist/cli/packs.d.ts.map +1 -0
  3. package/dist/cli/packs.js +172 -0
  4. package/dist/cli/packs.js.map +1 -0
  5. package/dist/cli/packs.test.d.ts +2 -0
  6. package/dist/cli/packs.test.d.ts.map +1 -0
  7. package/dist/cli/packs.test.js +171 -0
  8. package/dist/cli/packs.test.js.map +1 -0
  9. package/dist/config.d.ts +18 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +38 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/index.d.ts +13 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +191 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/runtime/attestation.d.ts +9 -0
  18. package/dist/runtime/attestation.d.ts.map +1 -0
  19. package/dist/runtime/attestation.js +32 -0
  20. package/dist/runtime/attestation.js.map +1 -0
  21. package/dist/runtime/attestation.test.d.ts +2 -0
  22. package/dist/runtime/attestation.test.d.ts.map +1 -0
  23. package/dist/runtime/attestation.test.js +59 -0
  24. package/dist/runtime/attestation.test.js.map +1 -0
  25. package/dist/runtime/audit.d.ts +19 -0
  26. package/dist/runtime/audit.d.ts.map +1 -0
  27. package/dist/runtime/audit.js +52 -0
  28. package/dist/runtime/audit.js.map +1 -0
  29. package/dist/runtime/audit.test.d.ts +2 -0
  30. package/dist/runtime/audit.test.d.ts.map +1 -0
  31. package/dist/runtime/audit.test.js +53 -0
  32. package/dist/runtime/audit.test.js.map +1 -0
  33. package/dist/runtime/connection.d.ts +55 -0
  34. package/dist/runtime/connection.d.ts.map +1 -0
  35. package/dist/runtime/connection.js +325 -0
  36. package/dist/runtime/connection.js.map +1 -0
  37. package/dist/runtime/connection.test.d.ts +2 -0
  38. package/dist/runtime/connection.test.d.ts.map +1 -0
  39. package/dist/runtime/connection.test.js +221 -0
  40. package/dist/runtime/connection.test.js.map +1 -0
  41. package/dist/runtime/executor.d.ts +21 -0
  42. package/dist/runtime/executor.d.ts.map +1 -0
  43. package/dist/runtime/executor.js +89 -0
  44. package/dist/runtime/executor.js.map +1 -0
  45. package/dist/runtime/executor.test.d.ts +2 -0
  46. package/dist/runtime/executor.test.d.ts.map +1 -0
  47. package/dist/runtime/executor.test.js +88 -0
  48. package/dist/runtime/executor.test.js.map +1 -0
  49. package/dist/runtime/privilege.d.ts +9 -0
  50. package/dist/runtime/privilege.d.ts.map +1 -0
  51. package/dist/runtime/privilege.js +35 -0
  52. package/dist/runtime/privilege.js.map +1 -0
  53. package/dist/runtime/privilege.test.d.ts +2 -0
  54. package/dist/runtime/privilege.test.d.ts.map +1 -0
  55. package/dist/runtime/privilege.test.js +22 -0
  56. package/dist/runtime/privilege.test.js.map +1 -0
  57. package/dist/runtime/scrubber.d.ts +17 -0
  58. package/dist/runtime/scrubber.d.ts.map +1 -0
  59. package/dist/runtime/scrubber.js +84 -0
  60. package/dist/runtime/scrubber.js.map +1 -0
  61. package/dist/runtime/scrubber.test.d.ts +2 -0
  62. package/dist/runtime/scrubber.test.d.ts.map +1 -0
  63. package/dist/runtime/scrubber.test.js +72 -0
  64. package/dist/runtime/scrubber.test.js.map +1 -0
  65. package/dist/system/scanner.d.ts +32 -0
  66. package/dist/system/scanner.d.ts.map +1 -0
  67. package/dist/system/scanner.js +90 -0
  68. package/dist/system/scanner.js.map +1 -0
  69. package/dist/system/scanner.test.d.ts +2 -0
  70. package/dist/system/scanner.test.d.ts.map +1 -0
  71. package/dist/system/scanner.test.js +121 -0
  72. package/dist/system/scanner.test.js.map +1 -0
  73. package/dist/tui/installer/InstallerApp.d.ts +11 -0
  74. package/dist/tui/installer/InstallerApp.d.ts.map +1 -0
  75. package/dist/tui/installer/InstallerApp.js +32 -0
  76. package/dist/tui/installer/InstallerApp.js.map +1 -0
  77. package/dist/tui/installer/StepComplete.d.ts +9 -0
  78. package/dist/tui/installer/StepComplete.d.ts.map +1 -0
  79. package/dist/tui/installer/StepComplete.js +46 -0
  80. package/dist/tui/installer/StepComplete.js.map +1 -0
  81. package/dist/tui/installer/StepHub.d.ts +8 -0
  82. package/dist/tui/installer/StepHub.d.ts.map +1 -0
  83. package/dist/tui/installer/StepHub.js +65 -0
  84. package/dist/tui/installer/StepHub.js.map +1 -0
  85. package/dist/tui/installer/StepPacks.d.ts +9 -0
  86. package/dist/tui/installer/StepPacks.d.ts.map +1 -0
  87. package/dist/tui/installer/StepPacks.js +35 -0
  88. package/dist/tui/installer/StepPacks.js.map +1 -0
  89. package/dist/tui/installer/StepPermissions.d.ts +9 -0
  90. package/dist/tui/installer/StepPermissions.d.ts.map +1 -0
  91. package/dist/tui/installer/StepPermissions.js +39 -0
  92. package/dist/tui/installer/StepPermissions.js.map +1 -0
  93. package/dist/tui/installer/StepScan.d.ts +7 -0
  94. package/dist/tui/installer/StepScan.d.ts.map +1 -0
  95. package/dist/tui/installer/StepScan.js +38 -0
  96. package/dist/tui/installer/StepScan.js.map +1 -0
  97. package/dist/tui/manager/ActivityLog.d.ts +7 -0
  98. package/dist/tui/manager/ActivityLog.d.ts.map +1 -0
  99. package/dist/tui/manager/ActivityLog.js +25 -0
  100. package/dist/tui/manager/ActivityLog.js.map +1 -0
  101. package/dist/tui/manager/AuditView.d.ts +7 -0
  102. package/dist/tui/manager/AuditView.d.ts.map +1 -0
  103. package/dist/tui/manager/AuditView.js +32 -0
  104. package/dist/tui/manager/AuditView.js.map +1 -0
  105. package/dist/tui/manager/ManagerApp.d.ts +20 -0
  106. package/dist/tui/manager/ManagerApp.d.ts.map +1 -0
  107. package/dist/tui/manager/ManagerApp.js +79 -0
  108. package/dist/tui/manager/ManagerApp.js.map +1 -0
  109. package/dist/tui/manager/PackManager.d.ts +7 -0
  110. package/dist/tui/manager/PackManager.d.ts.map +1 -0
  111. package/dist/tui/manager/PackManager.js +22 -0
  112. package/dist/tui/manager/PackManager.js.map +1 -0
  113. package/dist/tui/manager/StatusView.d.ts +15 -0
  114. package/dist/tui/manager/StatusView.d.ts.map +1 -0
  115. package/dist/tui/manager/StatusView.js +10 -0
  116. package/dist/tui/manager/StatusView.js.map +1 -0
  117. package/package.json +45 -0
  118. package/scripts/install.sh +11 -0
  119. package/src/cli/packs.test.ts +213 -0
  120. package/src/cli/packs.ts +214 -0
  121. package/src/config.ts +62 -0
  122. package/src/index.ts +218 -0
  123. package/src/runtime/attestation.test.ts +69 -0
  124. package/src/runtime/attestation.ts +36 -0
  125. package/src/runtime/audit.test.ts +64 -0
  126. package/src/runtime/audit.ts +70 -0
  127. package/src/runtime/connection.test.ts +303 -0
  128. package/src/runtime/connection.ts +389 -0
  129. package/src/runtime/executor.test.ts +112 -0
  130. package/src/runtime/executor.ts +107 -0
  131. package/src/runtime/privilege.test.ts +25 -0
  132. package/src/runtime/privilege.ts +36 -0
  133. package/src/runtime/scrubber.test.ts +84 -0
  134. package/src/runtime/scrubber.ts +96 -0
  135. package/src/system/scanner.test.ts +154 -0
  136. package/src/system/scanner.ts +133 -0
  137. package/src/tui/installer/InstallerApp.tsx +86 -0
  138. package/src/tui/installer/StepComplete.tsx +94 -0
  139. package/src/tui/installer/StepHub.tsx +111 -0
  140. package/src/tui/installer/StepPacks.tsx +73 -0
  141. package/src/tui/installer/StepPermissions.tsx +104 -0
  142. package/src/tui/installer/StepScan.tsx +82 -0
  143. package/src/tui/manager/ActivityLog.tsx +57 -0
  144. package/src/tui/manager/AuditView.tsx +73 -0
  145. package/src/tui/manager/ManagerApp.tsx +157 -0
  146. package/src/tui/manager/PackManager.tsx +71 -0
  147. package/src/tui/manager/StatusView.tsx +103 -0
  148. package/tsconfig.json +13 -0
  149. package/vitest.config.ts +8 -0
@@ -0,0 +1,121 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { checkPackPermissions, scanForSoftware } from './scanner.js';
3
+ function createMockChecker(overrides = {}) {
4
+ return {
5
+ commandExists: () => false,
6
+ fileExists: () => false,
7
+ serviceExists: () => false,
8
+ ...overrides,
9
+ };
10
+ }
11
+ const dockerManifest = {
12
+ name: 'docker',
13
+ version: '0.1.0',
14
+ description: 'Docker probes',
15
+ requires: { groups: ['docker'], files: [], commands: ['docker'] },
16
+ probes: [],
17
+ detect: { commands: ['docker'] },
18
+ };
19
+ const systemdManifest = {
20
+ name: 'systemd',
21
+ version: '0.1.0',
22
+ description: 'systemd probes',
23
+ requires: { groups: [], files: [], commands: ['systemctl'] },
24
+ probes: [],
25
+ detect: { files: ['/run/systemd/system'] },
26
+ };
27
+ const noDetectManifest = {
28
+ name: 'custom',
29
+ version: '0.1.0',
30
+ description: 'No detect rules',
31
+ requires: { groups: [], files: [], commands: [] },
32
+ probes: [],
33
+ };
34
+ describe('scanForSoftware', () => {
35
+ it('detects software when command exists', () => {
36
+ const checker = createMockChecker({
37
+ commandExists: (cmd) => cmd === 'docker',
38
+ });
39
+ const results = scanForSoftware([dockerManifest], checker);
40
+ expect(results).toHaveLength(1);
41
+ expect(results[0]?.detected).toBe(true);
42
+ expect(results[0]?.matchedCommands).toEqual(['docker']);
43
+ });
44
+ it('detects software when file exists', () => {
45
+ const checker = createMockChecker({
46
+ fileExists: (p) => p === '/run/systemd/system',
47
+ });
48
+ const results = scanForSoftware([systemdManifest], checker);
49
+ expect(results).toHaveLength(1);
50
+ expect(results[0]?.detected).toBe(true);
51
+ expect(results[0]?.matchedFiles).toEqual(['/run/systemd/system']);
52
+ });
53
+ it('marks as not detected when no checks pass', () => {
54
+ const checker = createMockChecker();
55
+ const results = scanForSoftware([dockerManifest], checker);
56
+ expect(results[0]?.detected).toBe(false);
57
+ expect(results[0]?.matchedCommands).toEqual([]);
58
+ });
59
+ it('handles manifests without detect rules', () => {
60
+ const checker = createMockChecker();
61
+ const results = scanForSoftware([noDetectManifest], checker);
62
+ expect(results[0]?.detected).toBe(false);
63
+ });
64
+ it('scans multiple manifests', () => {
65
+ const checker = createMockChecker({
66
+ commandExists: (cmd) => cmd === 'docker',
67
+ fileExists: () => false,
68
+ });
69
+ const results = scanForSoftware([dockerManifest, systemdManifest, noDetectManifest], checker);
70
+ expect(results).toHaveLength(3);
71
+ expect(results[0]?.detected).toBe(true);
72
+ expect(results[1]?.detected).toBe(false);
73
+ expect(results[2]?.detected).toBe(false);
74
+ });
75
+ });
76
+ describe('checkPackPermissions', () => {
77
+ it('returns satisfied when all requirements met', () => {
78
+ const checker = createMockChecker({
79
+ commandExists: () => true,
80
+ fileExists: () => true,
81
+ });
82
+ const result = checkPackPermissions(dockerManifest, checker, ['docker']);
83
+ expect(result.satisfied).toBe(true);
84
+ expect(result.missingGroups).toEqual([]);
85
+ expect(result.missingCommands).toEqual([]);
86
+ });
87
+ it('reports missing groups', () => {
88
+ const checker = createMockChecker({
89
+ commandExists: () => true,
90
+ });
91
+ const result = checkPackPermissions(dockerManifest, checker, []);
92
+ expect(result.satisfied).toBe(false);
93
+ expect(result.missingGroups).toEqual(['docker']);
94
+ });
95
+ it('reports missing commands', () => {
96
+ const checker = createMockChecker({
97
+ commandExists: () => false,
98
+ });
99
+ const result = checkPackPermissions(dockerManifest, checker, ['docker']);
100
+ expect(result.satisfied).toBe(false);
101
+ expect(result.missingCommands).toEqual(['docker']);
102
+ });
103
+ it('reports missing files', () => {
104
+ const manifest = {
105
+ name: 'test',
106
+ version: '0.1.0',
107
+ description: 'Test',
108
+ requires: { groups: [], files: ['/etc/special.conf'], commands: [] },
109
+ probes: [],
110
+ };
111
+ const checker = createMockChecker({ fileExists: () => false });
112
+ const result = checkPackPermissions(manifest, checker, []);
113
+ expect(result.satisfied).toBe(false);
114
+ expect(result.missingFiles).toEqual(['/etc/special.conf']);
115
+ });
116
+ it('returns satisfied for packs with no requirements', () => {
117
+ const result = checkPackPermissions(noDetectManifest, createMockChecker(), []);
118
+ expect(result.satisfied).toBe(true);
119
+ });
120
+ });
121
+ //# sourceMappingURL=scanner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.test.js","sourceRoot":"","sources":["../../src/system/scanner.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface HubConfig {
2
+ hubUrl: string;
3
+ apiKey: string;
4
+ agentName: string;
5
+ }
6
+ interface InstallerAppProps {
7
+ initialHubUrl?: string;
8
+ }
9
+ export declare function InstallerApp({ initialHubUrl }: InstallerAppProps): JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=InstallerApp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstallerApp.d.ts","sourceRoot":"","sources":["../../../src/tui/installer/InstallerApp.tsx"],"names":[],"mappings":"AAYA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD,UAAU,iBAAiB;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,YAAY,CAAC,EAAE,aAAa,EAAE,EAAE,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAuD9E"}
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { useState } from 'react';
4
+ import { StepComplete } from './StepComplete.js';
5
+ import { StepHub } from './StepHub.js';
6
+ import { StepPacks } from './StepPacks.js';
7
+ import { StepPermissions } from './StepPermissions.js';
8
+ import { StepScan } from './StepScan.js';
9
+ const STEP_LABELS = {
10
+ hub: 'Hub Connection',
11
+ scan: 'System Scan',
12
+ packs: 'Pack Selection',
13
+ permissions: 'Permissions',
14
+ complete: 'Complete',
15
+ };
16
+ export function InstallerApp({ initialHubUrl }) {
17
+ const [step, setStep] = useState('hub');
18
+ const [hubConfig, setHubConfig] = useState({ hubUrl: '', apiKey: '', agentName: '' });
19
+ const [scanResults, setScanResults] = useState([]);
20
+ const [selectedPacks, setSelectedPacks] = useState([]);
21
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Sonde Installer" }), _jsxs(Text, { color: "gray", children: [" \u2014 ", STEP_LABELS[step]] })] }), step === 'hub' && (_jsx(StepHub, { initialHubUrl: initialHubUrl, onNext: (config) => {
22
+ setHubConfig(config);
23
+ setStep('scan');
24
+ } })), step === 'scan' && (_jsx(StepScan, { onNext: (results) => {
25
+ setScanResults(results);
26
+ setStep('packs');
27
+ } })), step === 'packs' && (_jsx(StepPacks, { scanResults: scanResults, onNext: (packs) => {
28
+ setSelectedPacks(packs);
29
+ setStep('permissions');
30
+ } })), step === 'permissions' && (_jsx(StepPermissions, { selectedPacks: selectedPacks, onNext: () => setStep('complete'), onBack: () => setStep('packs') })), step === 'complete' && _jsx(StepComplete, { hubConfig: hubConfig, selectedPacks: selectedPacks })] }));
31
+ }
32
+ //# sourceMappingURL=InstallerApp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstallerApp.js","sourceRoot":"","sources":["../../../src/tui/installer/InstallerApp.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAUzC,MAAM,WAAW,GAAyB;IACxC,GAAG,EAAE,gBAAgB;IACrB,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,gBAAgB;IACvB,WAAW,EAAE,aAAa;IAC1B,QAAQ,EAAE,UAAU;CACrB,CAAC;AAMF,MAAM,UAAU,YAAY,CAAC,EAAE,aAAa,EAAqB;IAC/D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAO,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAY,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IACjG,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAe,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAiB,EAAE,CAAC,CAAC;IAEvE,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,aAC5E,MAAC,GAAG,IAAC,YAAY,EAAE,CAAC,aAClB,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,gCAEhB,EACP,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,yBAAK,WAAW,CAAC,IAAI,CAAC,IAAQ,IAC5C,EAEL,IAAI,KAAK,KAAK,IAAI,CACjB,KAAC,OAAO,IACN,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;oBACjB,YAAY,CAAC,MAAM,CAAC,CAAC;oBACrB,OAAO,CAAC,MAAM,CAAC,CAAC;gBAClB,CAAC,GACD,CACH,EAEA,IAAI,KAAK,MAAM,IAAI,CAClB,KAAC,QAAQ,IACP,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;oBAClB,cAAc,CAAC,OAAO,CAAC,CAAC;oBACxB,OAAO,CAAC,OAAO,CAAC,CAAC;gBACnB,CAAC,GACD,CACH,EAEA,IAAI,KAAK,OAAO,IAAI,CACnB,KAAC,SAAS,IACR,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;oBAChB,gBAAgB,CAAC,KAAK,CAAC,CAAC;oBACxB,OAAO,CAAC,aAAa,CAAC,CAAC;gBACzB,CAAC,GACD,CACH,EAEA,IAAI,KAAK,aAAa,IAAI,CACzB,KAAC,eAAe,IACd,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,EACjC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAC9B,CACH,EAEA,IAAI,KAAK,UAAU,IAAI,KAAC,YAAY,IAAC,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,GAAI,IACxF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { PackManifest } from '@sonde/shared';
2
+ import type { HubConfig } from './InstallerApp.js';
3
+ interface StepCompleteProps {
4
+ hubConfig: HubConfig;
5
+ selectedPacks: PackManifest[];
6
+ }
7
+ export declare function StepComplete({ hubConfig, selectedPacks }: StepCompleteProps): JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=StepComplete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepComplete.d.ts","sourceRoot":"","sources":["../../../src/tui/installer/StepComplete.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAOlD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,UAAU,iBAAiB;IACzB,SAAS,EAAE,SAAS,CAAC;IACrB,aAAa,EAAE,YAAY,EAAE,CAAC;CAC/B;AAED,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,iBAAiB,GAAG,GAAG,CAAC,OAAO,CA+EzF"}
@@ -0,0 +1,46 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text, useApp, useInput } from 'ink';
3
+ import Spinner from 'ink-spinner';
4
+ import { useEffect, useState } from 'react';
5
+ import { saveConfig } from '../../config.js';
6
+ import { enrollWithHub } from '../../runtime/connection.js';
7
+ import { ProbeExecutor } from '../../runtime/executor.js';
8
+ export function StepComplete({ hubConfig, selectedPacks }) {
9
+ const { exit } = useApp();
10
+ const [enrolling, setEnrolling] = useState(true);
11
+ const [agentId, setAgentId] = useState('');
12
+ const [error, setError] = useState('');
13
+ useEffect(() => {
14
+ const config = {
15
+ hubUrl: hubConfig.hubUrl,
16
+ apiKey: hubConfig.apiKey,
17
+ agentName: hubConfig.agentName,
18
+ };
19
+ saveConfig(config);
20
+ const executor = new ProbeExecutor();
21
+ enrollWithHub(config, executor)
22
+ .then(({ agentId: id }) => {
23
+ config.agentId = id;
24
+ saveConfig(config);
25
+ setAgentId(id);
26
+ setEnrolling(false);
27
+ })
28
+ .catch((err) => {
29
+ setError(err.message);
30
+ setEnrolling(false);
31
+ });
32
+ }, [hubConfig]);
33
+ useInput(() => {
34
+ if (!enrolling) {
35
+ exit();
36
+ }
37
+ });
38
+ if (enrolling) {
39
+ return (_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), _jsxs(Text, { children: [" Enrolling with hub at ", hubConfig.hubUrl, "..."] })] }));
40
+ }
41
+ if (error) {
42
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: "red", children: ["Enrollment failed: ", error] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Press any key to exit." }) })] }));
43
+ }
44
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "green", bold: true, children: "Enrollment successful!" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { children: [" Agent ID: ", agentId] }), _jsxs(Text, { children: [" Hub URL: ", hubConfig.hubUrl] }), _jsxs(Text, { children: [" Name: ", hubConfig.agentName] }), _jsxs(Text, { children: [' ', "Packs: ", selectedPacks.map((p) => p.name).join(', ') || '(none)'] })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Next steps:" }), _jsx(Text, { color: "cyan", children: " sonde start" })] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Press any key to exit." }) })] }));
45
+ }
46
+ //# sourceMappingURL=StepComplete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepComplete.js","sourceRoot":"","sources":["../../../src/tui/installer/StepComplete.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { HubConfig } from './InstallerApp.js';
2
+ interface StepHubProps {
3
+ onNext: (config: HubConfig) => void;
4
+ initialHubUrl?: string;
5
+ }
6
+ export declare function StepHub({ onNext, initialHubUrl }: StepHubProps): JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=StepHub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepHub.d.ts","sourceRoot":"","sources":["../../../src/tui/installer/StepHub.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,UAAU,YAAY;IACpB,MAAM,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAUD,wBAAgB,OAAO,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,YAAY,GAAG,GAAG,CAAC,OAAO,CA2F5E"}
@@ -0,0 +1,65 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import os from 'node:os';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import TextInput from 'ink-text-input';
5
+ import { useState } from 'react';
6
+ const FIELDS = ['hubUrl', 'apiKey', 'agentName'];
7
+ const FIELD_LABELS = {
8
+ hubUrl: 'Hub URL',
9
+ apiKey: 'API Key',
10
+ agentName: 'Agent Name',
11
+ };
12
+ export function StepHub({ onNext, initialHubUrl }) {
13
+ const [activeField, setActiveField] = useState(initialHubUrl ? 'apiKey' : 'hubUrl');
14
+ const [hubUrl, setHubUrl] = useState(initialHubUrl ?? '');
15
+ const [apiKey, setApiKey] = useState('');
16
+ const [agentName, setAgentName] = useState(os.hostname());
17
+ const [error, setError] = useState('');
18
+ const values = { hubUrl, apiKey, agentName };
19
+ const setters = {
20
+ hubUrl: setHubUrl,
21
+ apiKey: setApiKey,
22
+ agentName: setAgentName,
23
+ };
24
+ useInput((_input, key) => {
25
+ if (key.tab || (key.return && activeField !== FIELDS[FIELDS.length - 1])) {
26
+ const currentIdx = FIELDS.indexOf(activeField);
27
+ const nextIdx = (currentIdx + 1) % FIELDS.length;
28
+ const nextField = FIELDS[nextIdx];
29
+ if (nextField)
30
+ setActiveField(nextField);
31
+ setError('');
32
+ return;
33
+ }
34
+ if (key.return && activeField === FIELDS[FIELDS.length - 1]) {
35
+ // Validate and submit
36
+ if (!hubUrl.trim()) {
37
+ setError('Hub URL is required');
38
+ setActiveField('hubUrl');
39
+ return;
40
+ }
41
+ try {
42
+ new URL(hubUrl.trim());
43
+ }
44
+ catch {
45
+ setError('Invalid URL format');
46
+ setActiveField('hubUrl');
47
+ return;
48
+ }
49
+ if (!apiKey.trim()) {
50
+ setError('API Key is required');
51
+ setActiveField('apiKey');
52
+ return;
53
+ }
54
+ onNext({
55
+ hubUrl: hubUrl.trim(),
56
+ apiKey: apiKey.trim(),
57
+ agentName: agentName.trim() || os.hostname(),
58
+ });
59
+ }
60
+ });
61
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "gray", children: "Enter your hub connection details. Tab to move between fields." }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: FIELDS.map((field) => (_jsxs(Box, { children: [_jsx(Box, { width: 14, children: _jsxs(Text, { color: activeField === field ? 'cyan' : 'white', children: [activeField === field ? '> ' : ' ', FIELD_LABELS[field], ":"] }) }), _jsx(Box, { children: activeField === field ? (_jsx(TextInput, { value: values[field], onChange: setters[field], placeholder: field === 'hubUrl' ? 'http://localhost:3000' : '' })) : (_jsx(Text, { color: "gray", children: field === 'apiKey' && values[field]
62
+ ? '*'.repeat(values[field].length)
63
+ : values[field] || '(empty)' })) })] }, field))) }), error && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "red", children: error }) })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Tab: next field | Enter: submit" }) })] }));
64
+ }
65
+ //# sourceMappingURL=StepHub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepHub.js","sourceRoot":"","sources":["../../../src/tui/installer/StepHub.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { PackManifest } from '@sonde/shared';
2
+ import type { ScanResult } from '../../system/scanner.js';
3
+ interface StepPacksProps {
4
+ scanResults: ScanResult[];
5
+ onNext: (packs: PackManifest[]) => void;
6
+ }
7
+ export declare function StepPacks({ scanResults, onNext }: StepPacksProps): JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=StepPacks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepPacks.d.ts","sourceRoot":"","sources":["../../../src/tui/installer/StepPacks.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,UAAU,cAAc;IACtB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,MAAM,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;CACzC;AAQD,wBAAgB,SAAS,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,cAAc,GAAG,GAAG,CAAC,OAAO,CAuD9E"}
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { packRegistry } from '@sonde/packs';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import { useState } from 'react';
5
+ export function StepPacks({ scanResults, onNext }) {
6
+ const detectedNames = new Set(scanResults.filter((r) => r.detected).map((r) => r.packName));
7
+ const [rows, setRows] = useState(() => [...packRegistry.values()].map((pack) => ({
8
+ manifest: pack.manifest,
9
+ detected: detectedNames.has(pack.manifest.name),
10
+ selected: detectedNames.has(pack.manifest.name),
11
+ })));
12
+ const [cursor, setCursor] = useState(0);
13
+ useInput((_input, key) => {
14
+ if (key.upArrow) {
15
+ setCursor((prev) => (prev > 0 ? prev - 1 : rows.length - 1));
16
+ }
17
+ else if (key.downArrow) {
18
+ setCursor((prev) => (prev < rows.length - 1 ? prev + 1 : 0));
19
+ }
20
+ else if (_input === ' ') {
21
+ setRows((prev) => prev.map((row, i) => (i === cursor ? { ...row, selected: !row.selected } : row)));
22
+ }
23
+ else if (key.return) {
24
+ const selected = rows.filter((r) => r.selected).map((r) => r.manifest);
25
+ onNext(selected);
26
+ }
27
+ });
28
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "gray", children: "Select packs to install. Detected software is pre-selected." }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: rows.map((row, i) => {
29
+ const isCursor = i === cursor;
30
+ const checkbox = row.selected ? '[x]' : '[ ]';
31
+ const probeCount = row.manifest.probes.length;
32
+ return (_jsxs(Box, { children: [_jsxs(Text, { color: isCursor ? 'cyan' : 'white', bold: isCursor, children: [isCursor ? '> ' : ' ', checkbox, " ", row.manifest.name] }), _jsxs(Text, { color: "gray", children: [' ', "(", probeCount, " probes) \u2014 ", row.manifest.description] }), row.detected && _jsx(Text, { color: "green", children: " [detected]" })] }, row.manifest.name));
33
+ }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Up/Down: navigate | Space: toggle | Enter: confirm" }) })] }));
34
+ }
35
+ //# sourceMappingURL=StepPacks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepPacks.js","sourceRoot":"","sources":["../../../src/tui/installer/StepPacks.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { PackManifest } from '@sonde/shared';
2
+ interface StepPermissionsProps {
3
+ selectedPacks: PackManifest[];
4
+ onNext: () => void;
5
+ onBack: () => void;
6
+ }
7
+ export declare function StepPermissions({ selectedPacks, onNext, onBack, }: StepPermissionsProps): JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=StepPermissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepPermissions.d.ts","sourceRoot":"","sources":["../../../src/tui/installer/StepPermissions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AASlD,UAAU,oBAAoB;IAC5B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAkBD,wBAAgB,eAAe,CAAC,EAC9B,aAAa,EACb,MAAM,EACN,MAAM,GACP,EAAE,oBAAoB,GAAG,GAAG,CAAC,OAAO,CAoEpC"}
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Box, Text, useInput } from 'ink';
3
+ import { useEffect, useState } from 'react';
4
+ import { checkPackPermissions, createSystemChecker, } from '../../system/scanner.js';
5
+ function getUserGroups() {
6
+ try {
7
+ if (typeof process.getgroups === 'function') {
8
+ return process.getgroups().map(String);
9
+ }
10
+ }
11
+ catch {
12
+ // Not available on all platforms
13
+ }
14
+ return [];
15
+ }
16
+ export function StepPermissions({ selectedPacks, onNext, onBack, }) {
17
+ const [results, setResults] = useState([]);
18
+ useEffect(() => {
19
+ const checker = createSystemChecker();
20
+ const groups = getUserGroups();
21
+ const checks = selectedPacks.map((manifest) => ({
22
+ name: manifest.name,
23
+ check: checkPackPermissions(manifest, checker, groups),
24
+ }));
25
+ setResults(checks);
26
+ }, [selectedPacks]);
27
+ useInput((input, key) => {
28
+ if (key.return) {
29
+ onNext();
30
+ }
31
+ else if (input === 'b') {
32
+ onBack();
33
+ }
34
+ });
35
+ const issues = results.filter((r) => !r.check.satisfied);
36
+ const allGood = issues.length === 0;
37
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Permission Review" }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: results.map((r) => (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: r.check.satisfied ? 'green' : 'yellow', children: [r.check.satisfied ? ' OK' : ' !!', " ", r.name] }), !r.check.satisfied && (_jsxs(Box, { flexDirection: "column", marginLeft: 4, children: [r.check.missingGroups.length > 0 && (_jsxs(_Fragment, { children: [_jsxs(Text, { color: "yellow", children: ["Missing groups: ", r.check.missingGroups.join(', ')] }), r.check.missingGroups.map((g) => (_jsxs(Text, { color: "gray", children: [' ', "sudo usermod -aG ", g, " $(whoami)"] }, g)))] })), r.check.missingCommands.length > 0 && (_jsxs(Text, { color: "yellow", children: ["Missing commands: ", r.check.missingCommands.join(', ')] })), r.check.missingFiles.length > 0 && (_jsxs(Text, { color: "yellow", children: ["Missing files: ", r.check.missingFiles.join(', ')] }))] }))] }, r.name))) }), !allGood && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "yellow", children: "Some packs have missing permissions. They may not work correctly." }) })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Enter: proceed | b: back to pack selection" }) })] }));
38
+ }
39
+ //# sourceMappingURL=StepPermissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepPermissions.js","sourceRoot":"","sources":["../../../src/tui/installer/StepPermissions.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type ScanResult } from '../../system/scanner.js';
2
+ interface StepScanProps {
3
+ onNext: (results: ScanResult[]) => void;
4
+ }
5
+ export declare function StepScan({ onNext }: StepScanProps): JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=StepScan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepScan.d.ts","sourceRoot":"","sources":["../../../src/tui/installer/StepScan.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAwC,MAAM,yBAAyB,CAAC;AAEhG,UAAU,aAAa;IACrB,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;CACzC;AAED,wBAAgB,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,aAAa,GAAG,GAAG,CAAC,OAAO,CA+D/D"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { packRegistry } from '@sonde/packs';
3
+ import { Box, Text } from 'ink';
4
+ import Spinner from 'ink-spinner';
5
+ import { useEffect, useState } from 'react';
6
+ import { createSystemChecker, scanForSoftware } from '../../system/scanner.js';
7
+ export function StepScan({ onNext }) {
8
+ const [scanning, setScanning] = useState(true);
9
+ const [results, setResults] = useState([]);
10
+ useEffect(() => {
11
+ const manifests = [...packRegistry.values()].map((p) => p.manifest);
12
+ const checker = createSystemChecker();
13
+ const scanResults = scanForSoftware(manifests, checker);
14
+ setResults(scanResults);
15
+ setScanning(false);
16
+ const timer = setTimeout(() => {
17
+ onNext(scanResults);
18
+ }, 1500);
19
+ return () => clearTimeout(timer);
20
+ }, [onNext]);
21
+ if (scanning) {
22
+ return (_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), _jsx(Text, { children: " Scanning system for known software..." })] }));
23
+ }
24
+ const detected = results.filter((r) => r.detected);
25
+ const notDetected = results.filter((r) => !r.detected);
26
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "green", children: "Scan complete!" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [detected.length > 0 && (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, children: "Detected:" }), detected.map((r) => (_jsxs(Text, { color: "green", children: [' ', r.packName, " \u2014 ", formatMatches(r)] }, r.packName)))] })), notDetected.length > 0 && (_jsxs(Box, { marginTop: detected.length > 0 ? 1 : 0, flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Not detected:" }), notDetected.map((r) => (_jsxs(Text, { color: "gray", children: [' ', r.packName] }, r.packName)))] }))] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Continuing to pack selection..." }) })] }));
27
+ }
28
+ function formatMatches(r) {
29
+ const parts = [];
30
+ if (r.matchedCommands.length > 0)
31
+ parts.push(`commands: ${r.matchedCommands.join(', ')}`);
32
+ if (r.matchedFiles.length > 0)
33
+ parts.push(`files: ${r.matchedFiles.join(', ')}`);
34
+ if (r.matchedServices.length > 0)
35
+ parts.push(`services: ${r.matchedServices.join(', ')}`);
36
+ return parts.join('; ');
37
+ }
38
+ //# sourceMappingURL=StepScan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepScan.js","sourceRoot":"","sources":["../../../src/tui/installer/StepScan.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ActivityEntry } from './ManagerApp.js';
2
+ interface ActivityLogProps {
3
+ activity: ActivityEntry[];
4
+ }
5
+ export declare function ActivityLog({ activity }: ActivityLogProps): JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=ActivityLog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityLog.d.ts","sourceRoot":"","sources":["../../../src/tui/manager/ActivityLog.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,UAAU,gBAAgB;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAoBD,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,gBAAgB,GAAG,GAAG,CAAC,OAAO,CA+BvE"}
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ function formatTime(isoString) {
4
+ const date = new Date(isoString);
5
+ return date.toLocaleTimeString('en-GB', { hour12: false });
6
+ }
7
+ function statusColor(status) {
8
+ switch (status) {
9
+ case 'success':
10
+ return 'green';
11
+ case 'error':
12
+ return 'red';
13
+ case 'timeout':
14
+ return 'yellow';
15
+ default:
16
+ return 'gray';
17
+ }
18
+ }
19
+ export function ActivityLog({ activity }) {
20
+ if (activity.length === 0) {
21
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, color: "white", children: "Activity" }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Waiting for probe activity..." }) })] }));
22
+ }
23
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { bold: true, color: "white", children: ["Activity (", activity.length, " probes)"] }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: activity.map((entry, i) => (_jsxs(Box, { children: [_jsxs(Text, { color: "gray", children: [formatTime(entry.timestamp), " "] }), _jsx(Text, { color: "white", children: entry.probe.padEnd(25) }), _jsx(Text, { color: statusColor(entry.status), children: entry.status.padEnd(10) }), _jsxs(Text, { color: "gray", children: [entry.durationMs, "ms"] })] }, `${entry.timestamp}-${i}`))) })] }));
24
+ }
25
+ //# sourceMappingURL=ActivityLog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityLog.js","sourceRoot":"","sources":["../../../src/tui/manager/ActivityLog.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAOhC,SAAS,UAAU,CAAC,SAAiB;IACnC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,OAAO,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC;QAClB;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAE,QAAQ,EAAoB;IACxD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,OAAO,yBAEjB,EACP,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,8CAAqC,GACnD,IACF,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,OAAO,2BACX,QAAQ,CAAC,MAAM,gBACrB,EACP,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,YACtC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAC1B,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,aAAE,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,EACxD,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,EACnD,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,YAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,EACxE,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,aAAE,KAAK,CAAC,UAAU,UAAU,KAJtC,GAAG,KAAK,CAAC,SAAS,IAAI,CAAC,EAAE,CAK7B,CACP,CAAC,GACE,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { AgentAuditLog } from '../../runtime/audit.js';
2
+ interface AuditViewProps {
3
+ auditLog: AgentAuditLog;
4
+ }
5
+ export declare function AuditView({ auditLog }: AuditViewProps): JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=AuditView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuditView.d.ts","sourceRoot":"","sources":["../../../src/tui/manager/AuditView.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE7E,UAAU,cAAc;IACtB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAoBD,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,cAAc,GAAG,GAAG,CAAC,OAAO,CA8CnE"}