agenshield 0.1.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.
- package/CHANGELOG.md +16 -0
- package/LICENSE +201 -0
- package/README.md +91 -0
- package/package.json +61 -0
- package/src/cli.d.ts +25 -0
- package/src/cli.d.ts.map +1 -0
- package/src/cli.js +78 -0
- package/src/cli.js.map +1 -0
- package/src/commands/daemon.d.ts +11 -0
- package/src/commands/daemon.d.ts.map +1 -0
- package/src/commands/daemon.js +107 -0
- package/src/commands/daemon.js.map +1 -0
- package/src/commands/dev.d.ts +15 -0
- package/src/commands/dev.d.ts.map +1 -0
- package/src/commands/dev.js +387 -0
- package/src/commands/dev.js.map +1 -0
- package/src/commands/doctor.d.ts +11 -0
- package/src/commands/doctor.d.ts.map +1 -0
- package/src/commands/doctor.js +129 -0
- package/src/commands/doctor.js.map +1 -0
- package/src/commands/index.d.ts +12 -0
- package/src/commands/index.d.ts.map +1 -0
- package/src/commands/index.js +12 -0
- package/src/commands/index.js.map +1 -0
- package/src/commands/setup.d.ts +13 -0
- package/src/commands/setup.d.ts.map +1 -0
- package/src/commands/setup.js +203 -0
- package/src/commands/setup.js.map +1 -0
- package/src/commands/status.d.ts +11 -0
- package/src/commands/status.d.ts.map +1 -0
- package/src/commands/status.js +63 -0
- package/src/commands/status.js.map +1 -0
- package/src/commands/uninstall.d.ts +11 -0
- package/src/commands/uninstall.d.ts.map +1 -0
- package/src/commands/uninstall.js +164 -0
- package/src/commands/uninstall.js.map +1 -0
- package/src/detect/index.d.ts +9 -0
- package/src/detect/index.d.ts.map +1 -0
- package/src/detect/index.js +9 -0
- package/src/detect/index.js.map +1 -0
- package/src/dev-tui/DevApp.d.ts +13 -0
- package/src/dev-tui/DevApp.d.ts.map +1 -0
- package/src/dev-tui/DevApp.js +118 -0
- package/src/dev-tui/DevApp.js.map +1 -0
- package/src/dev-tui/DevSetupApp.d.ts +22 -0
- package/src/dev-tui/DevSetupApp.d.ts.map +1 -0
- package/src/dev-tui/DevSetupApp.js +407 -0
- package/src/dev-tui/DevSetupApp.js.map +1 -0
- package/src/dev-tui/components/ActionMenu.d.ts +11 -0
- package/src/dev-tui/components/ActionMenu.d.ts.map +1 -0
- package/src/dev-tui/components/ActionMenu.js +25 -0
- package/src/dev-tui/components/ActionMenu.js.map +1 -0
- package/src/dev-tui/components/ActionResult.d.ts +12 -0
- package/src/dev-tui/components/ActionResult.d.ts.map +1 -0
- package/src/dev-tui/components/ActionResult.js +27 -0
- package/src/dev-tui/components/ActionResult.js.map +1 -0
- package/src/dev-tui/components/DevConfirm.d.ts +22 -0
- package/src/dev-tui/components/DevConfirm.d.ts.map +1 -0
- package/src/dev-tui/components/DevConfirm.js +73 -0
- package/src/dev-tui/components/DevConfirm.js.map +1 -0
- package/src/dev-tui/components/DevModeSelect.d.ts +12 -0
- package/src/dev-tui/components/DevModeSelect.d.ts.map +1 -0
- package/src/dev-tui/components/DevModeSelect.js +69 -0
- package/src/dev-tui/components/DevModeSelect.js.map +1 -0
- package/src/dev-tui/components/LogViewer.d.ts +11 -0
- package/src/dev-tui/components/LogViewer.d.ts.map +1 -0
- package/src/dev-tui/components/LogViewer.js +18 -0
- package/src/dev-tui/components/LogViewer.js.map +1 -0
- package/src/dev-tui/components/PathPrompt.d.ts +13 -0
- package/src/dev-tui/components/PathPrompt.d.ts.map +1 -0
- package/src/dev-tui/components/PathPrompt.js +48 -0
- package/src/dev-tui/components/PathPrompt.js.map +1 -0
- package/src/dev-tui/components/StatusBar.d.ts +13 -0
- package/src/dev-tui/components/StatusBar.d.ts.map +1 -0
- package/src/dev-tui/components/StatusBar.js +36 -0
- package/src/dev-tui/components/StatusBar.js.map +1 -0
- package/src/dev-tui/index.d.ts +7 -0
- package/src/dev-tui/index.d.ts.map +1 -0
- package/src/dev-tui/index.js +5 -0
- package/src/dev-tui/index.js.map +1 -0
- package/src/dev-tui/runner.d.ts +17 -0
- package/src/dev-tui/runner.d.ts.map +1 -0
- package/src/dev-tui/runner.js +53 -0
- package/src/dev-tui/runner.js.map +1 -0
- package/src/dev-tui/state.d.ts +34 -0
- package/src/dev-tui/state.d.ts.map +1 -0
- package/src/dev-tui/state.js +77 -0
- package/src/dev-tui/state.js.map +1 -0
- package/src/index.d.ts +15 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +19 -0
- package/src/index.js.map +1 -0
- package/src/setup-server/index.d.ts +8 -0
- package/src/setup-server/index.d.ts.map +1 -0
- package/src/setup-server/index.js +7 -0
- package/src/setup-server/index.js.map +1 -0
- package/src/setup-server/routes.d.ts +22 -0
- package/src/setup-server/routes.d.ts.map +1 -0
- package/src/setup-server/routes.js +279 -0
- package/src/setup-server/routes.js.map +1 -0
- package/src/setup-server/server.d.ts +16 -0
- package/src/setup-server/server.d.ts.map +1 -0
- package/src/setup-server/server.js +125 -0
- package/src/setup-server/server.js.map +1 -0
- package/src/setup-server/sse.d.ts +31 -0
- package/src/setup-server/sse.d.ts.map +1 -0
- package/src/setup-server/sse.js +76 -0
- package/src/setup-server/sse.js.map +1 -0
- package/src/setup-server/static.d.ts +11 -0
- package/src/setup-server/static.d.ts.map +1 -0
- package/src/setup-server/static.js +33 -0
- package/src/setup-server/static.js.map +1 -0
- package/src/utils/daemon.d.ts +63 -0
- package/src/utils/daemon.d.ts.map +1 -0
- package/src/utils/daemon.js +377 -0
- package/src/utils/daemon.js.map +1 -0
- package/src/utils/find-test-harness.d.ts +5 -0
- package/src/utils/find-test-harness.d.ts.map +1 -0
- package/src/utils/find-test-harness.js +23 -0
- package/src/utils/find-test-harness.js.map +1 -0
- package/src/utils/index.d.ts +8 -0
- package/src/utils/index.d.ts.map +1 -0
- package/src/utils/index.js +8 -0
- package/src/utils/index.js.map +1 -0
- package/src/utils/privileges.d.ts +51 -0
- package/src/utils/privileges.d.ts.map +1 -0
- package/src/utils/privileges.js +125 -0
- package/src/utils/privileges.js.map +1 -0
- package/src/utils/sudo-env.d.ts +27 -0
- package/src/utils/sudo-env.d.ts.map +1 -0
- package/src/utils/sudo-env.js +63 -0
- package/src/utils/sudo-env.js.map +1 -0
- package/src/wizard/App.d.ts +6 -0
- package/src/wizard/App.d.ts.map +1 -0
- package/src/wizard/App.js +215 -0
- package/src/wizard/App.js.map +1 -0
- package/src/wizard/Uninstall.d.ts +16 -0
- package/src/wizard/Uninstall.d.ts.map +1 -0
- package/src/wizard/Uninstall.js +163 -0
- package/src/wizard/Uninstall.js.map +1 -0
- package/src/wizard/components/AdvancedConfig.d.ts +42 -0
- package/src/wizard/components/AdvancedConfig.d.ts.map +1 -0
- package/src/wizard/components/AdvancedConfig.js +131 -0
- package/src/wizard/components/AdvancedConfig.js.map +1 -0
- package/src/wizard/components/Confirm.d.ts +31 -0
- package/src/wizard/components/Confirm.d.ts.map +1 -0
- package/src/wizard/components/Confirm.js +148 -0
- package/src/wizard/components/Confirm.js.map +1 -0
- package/src/wizard/components/Header.d.ts +6 -0
- package/src/wizard/components/Header.d.ts.map +1 -0
- package/src/wizard/components/Header.js +11 -0
- package/src/wizard/components/Header.js.map +1 -0
- package/src/wizard/components/ModeSelect.d.ts +12 -0
- package/src/wizard/components/ModeSelect.d.ts.map +1 -0
- package/src/wizard/components/ModeSelect.js +74 -0
- package/src/wizard/components/ModeSelect.js.map +1 -0
- package/src/wizard/components/PasscodeSetup.d.ts +16 -0
- package/src/wizard/components/PasscodeSetup.d.ts.map +1 -0
- package/src/wizard/components/PasscodeSetup.js +119 -0
- package/src/wizard/components/PasscodeSetup.js.map +1 -0
- package/src/wizard/components/ProgressBar.d.ts +12 -0
- package/src/wizard/components/ProgressBar.d.ts.map +1 -0
- package/src/wizard/components/ProgressBar.js +18 -0
- package/src/wizard/components/ProgressBar.js.map +1 -0
- package/src/wizard/components/StepList.d.ts +12 -0
- package/src/wizard/components/StepList.d.ts.map +1 -0
- package/src/wizard/components/StepList.js +37 -0
- package/src/wizard/components/StepList.js.map +1 -0
- package/src/wizard/components/Summary.d.ts +12 -0
- package/src/wizard/components/Summary.d.ts.map +1 -0
- package/src/wizard/components/Summary.js +44 -0
- package/src/wizard/components/Summary.js.map +1 -0
- package/src/wizard/engine.d.ts +29 -0
- package/src/wizard/engine.d.ts.map +1 -0
- package/src/wizard/engine.js +866 -0
- package/src/wizard/engine.js.map +1 -0
- package/src/wizard/index.d.ts +8 -0
- package/src/wizard/index.d.ts.map +1 -0
- package/src/wizard/index.js +8 -0
- package/src/wizard/index.js.map +1 -0
- package/src/wizard/types.d.ts +190 -0
- package/src/wizard/types.d.ts.map +1 -0
- package/src/wizard/types.js +193 -0
- package/src/wizard/types.js.map +1 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced configuration component for custom user/group naming
|
|
3
|
+
*/
|
|
4
|
+
import React from 'react';
|
|
5
|
+
/** Re-export for convenience */
|
|
6
|
+
export declare const REQUIRED_PREFIX = "ash_";
|
|
7
|
+
export interface AdvancedConfigValues {
|
|
8
|
+
/** Suffix for agent user (will become ash_{suffix}_agent) */
|
|
9
|
+
agentSuffix: string;
|
|
10
|
+
/** Suffix for broker user (will become ash_{suffix}_broker) */
|
|
11
|
+
brokerSuffix: string;
|
|
12
|
+
/** Suffix for socket group (will become ash_{suffix}) */
|
|
13
|
+
socketGroupSuffix: string;
|
|
14
|
+
/** Suffix for workspace group (will become ash_{suffix}_workspace) */
|
|
15
|
+
workspaceGroupSuffix: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ComputedNames {
|
|
18
|
+
agentUser: string;
|
|
19
|
+
brokerUser: string;
|
|
20
|
+
socketGroup: string;
|
|
21
|
+
workspaceGroup: string;
|
|
22
|
+
}
|
|
23
|
+
interface AdvancedConfigProps {
|
|
24
|
+
/** Existing users/groups that would conflict */
|
|
25
|
+
existingConflicts?: {
|
|
26
|
+
users: string[];
|
|
27
|
+
groups: string[];
|
|
28
|
+
};
|
|
29
|
+
onConfirm: (values: AdvancedConfigValues) => void;
|
|
30
|
+
onCancel: () => void;
|
|
31
|
+
onCheckConflicts: (names: ComputedNames) => Promise<{
|
|
32
|
+
users: string[];
|
|
33
|
+
groups: string[];
|
|
34
|
+
}>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Compute the full names from a base name
|
|
38
|
+
*/
|
|
39
|
+
export declare function computeNames(baseName: string): ComputedNames;
|
|
40
|
+
export declare function AdvancedConfig({ existingConflicts, onConfirm, onCancel, onCheckConflicts }: AdvancedConfigProps): React.JSX.Element;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=AdvancedConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdvancedConfig.d.ts","sourceRoot":"","sources":["../../../../src/wizard/components/AdvancedConfig.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD,gCAAgC;AAChC,eAAO,MAAM,eAAe,SAAa,CAAC;AAE1C,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sEAAsE;IACtE,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,mBAAmB;IAC3B,gDAAgD;IAChD,iBAAiB,CAAC,EAAE;QAClB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,SAAS,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAClD,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,gBAAgB,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC5F;AAID;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAS5D;AAED,wBAAgB,cAAc,CAAC,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,mBAAmB,qBA6J/G"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced configuration component for custom user/group naming
|
|
3
|
+
*/
|
|
4
|
+
import React, { useState, useEffect } from 'react';
|
|
5
|
+
import { Box, Text, useInput } from 'ink';
|
|
6
|
+
import { ASH_PREFIX } from '@agenshield/sandbox';
|
|
7
|
+
/** Re-export for convenience */
|
|
8
|
+
export const REQUIRED_PREFIX = ASH_PREFIX;
|
|
9
|
+
/**
|
|
10
|
+
* Compute the full names from a base name
|
|
11
|
+
*/
|
|
12
|
+
export function computeNames(baseName) {
|
|
13
|
+
const clean = baseName.replace(/[^a-z0-9]/gi, '').toLowerCase();
|
|
14
|
+
const base = clean || 'default';
|
|
15
|
+
return {
|
|
16
|
+
agentUser: `${REQUIRED_PREFIX}${base}_agent`,
|
|
17
|
+
brokerUser: `${REQUIRED_PREFIX}${base}_broker`,
|
|
18
|
+
socketGroup: `${REQUIRED_PREFIX}${base}`,
|
|
19
|
+
workspaceGroup: `${REQUIRED_PREFIX}${base}_workspace`,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function AdvancedConfig({ existingConflicts, onConfirm, onCancel, onCheckConflicts }) {
|
|
23
|
+
const [baseName, setBaseName] = useState('');
|
|
24
|
+
const [currentField, setCurrentField] = useState('baseName');
|
|
25
|
+
const [conflicts, setConflicts] = useState({ users: [], groups: [] });
|
|
26
|
+
const [isChecking, setIsChecking] = useState(false);
|
|
27
|
+
// Use provided conflicts or default to empty
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
if (existingConflicts) {
|
|
30
|
+
setConflicts(existingConflicts);
|
|
31
|
+
}
|
|
32
|
+
}, [existingConflicts]);
|
|
33
|
+
const computedNames = computeNames(baseName);
|
|
34
|
+
const hasConflicts = conflicts.users.length > 0 || conflicts.groups.length > 0;
|
|
35
|
+
// Check for conflicts when baseName changes
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
if (baseName.length > 0) {
|
|
38
|
+
setIsChecking(true);
|
|
39
|
+
const names = computeNames(baseName);
|
|
40
|
+
onCheckConflicts(names).then((result) => {
|
|
41
|
+
setConflicts(result);
|
|
42
|
+
setIsChecking(false);
|
|
43
|
+
}).catch(() => {
|
|
44
|
+
setIsChecking(false);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
setConflicts({ users: [], groups: [] });
|
|
49
|
+
}
|
|
50
|
+
}, [baseName, onCheckConflicts]);
|
|
51
|
+
useInput((input, key) => {
|
|
52
|
+
if (key.escape) {
|
|
53
|
+
onCancel();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (currentField === 'baseName') {
|
|
57
|
+
if (key.return) {
|
|
58
|
+
if (baseName.length > 0 && !hasConflicts && !isChecking) {
|
|
59
|
+
setCurrentField('confirm');
|
|
60
|
+
}
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (key.backspace || key.delete) {
|
|
64
|
+
setBaseName(baseName.slice(0, -1));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// Only allow alphanumeric characters
|
|
68
|
+
if (input && /^[a-zA-Z0-9]$/.test(input)) {
|
|
69
|
+
if (baseName.length < 20) {
|
|
70
|
+
setBaseName(baseName + input.toLowerCase());
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else if (currentField === 'confirm') {
|
|
75
|
+
if (key.return && !hasConflicts) {
|
|
76
|
+
onConfirm({
|
|
77
|
+
agentSuffix: baseName,
|
|
78
|
+
brokerSuffix: baseName,
|
|
79
|
+
socketGroupSuffix: baseName,
|
|
80
|
+
workspaceGroupSuffix: baseName,
|
|
81
|
+
});
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (key.backspace || input === 'b') {
|
|
85
|
+
setCurrentField('baseName');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
return (React.createElement(Box, { flexDirection: "column", marginTop: 1 },
|
|
91
|
+
React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", padding: 1 },
|
|
92
|
+
React.createElement(Text, { bold: true, color: "cyan" }, "Advanced Configuration"),
|
|
93
|
+
React.createElement(Text, { color: "gray" }, "Customize user and group names (ash_ prefix is required)")),
|
|
94
|
+
React.createElement(Box, { flexDirection: "column", marginTop: 1 },
|
|
95
|
+
React.createElement(Text, { bold: true }, "Enter a base name for users/groups:"),
|
|
96
|
+
React.createElement(Box, { marginTop: 1 },
|
|
97
|
+
React.createElement(Text, { color: "gray" }, REQUIRED_PREFIX),
|
|
98
|
+
React.createElement(Text, { color: currentField === 'baseName' ? 'yellow' : 'white' }, baseName || (currentField === 'baseName' ? '_' : '')),
|
|
99
|
+
currentField === 'baseName' && baseName.length > 0 && (React.createElement(Text, { color: "gray", dimColor: true }, "_")))),
|
|
100
|
+
baseName.length > 0 && (React.createElement(Box, { flexDirection: "column", marginTop: 1 },
|
|
101
|
+
React.createElement(Text, { bold: true }, "Preview:"),
|
|
102
|
+
React.createElement(Box, { marginLeft: 2, flexDirection: "column" },
|
|
103
|
+
React.createElement(Text, { color: conflicts.users.includes(computedNames.agentUser) ? 'red' : 'green' },
|
|
104
|
+
"Agent user: ",
|
|
105
|
+
computedNames.agentUser,
|
|
106
|
+
conflicts.users.includes(computedNames.agentUser) && ' (EXISTS!)'),
|
|
107
|
+
React.createElement(Text, { color: conflicts.users.includes(computedNames.brokerUser) ? 'red' : 'green' },
|
|
108
|
+
"Broker user: ",
|
|
109
|
+
computedNames.brokerUser,
|
|
110
|
+
conflicts.users.includes(computedNames.brokerUser) && ' (EXISTS!)'),
|
|
111
|
+
React.createElement(Text, { color: conflicts.groups.includes(computedNames.socketGroup) ? 'red' : 'green' },
|
|
112
|
+
"Socket group: ",
|
|
113
|
+
computedNames.socketGroup,
|
|
114
|
+
conflicts.groups.includes(computedNames.socketGroup) && ' (EXISTS!)'),
|
|
115
|
+
React.createElement(Text, { color: conflicts.groups.includes(computedNames.workspaceGroup) ? 'red' : 'green' },
|
|
116
|
+
"Workspace group: ",
|
|
117
|
+
computedNames.workspaceGroup,
|
|
118
|
+
conflicts.groups.includes(computedNames.workspaceGroup) && ' (EXISTS!)')))),
|
|
119
|
+
isChecking && (React.createElement(Box, { marginTop: 1 },
|
|
120
|
+
React.createElement(Text, { color: "yellow" }, "Checking for conflicts..."))),
|
|
121
|
+
hasConflicts && !isChecking && (React.createElement(Box, { flexDirection: "column", marginTop: 1, borderStyle: "round", borderColor: "red", padding: 1 },
|
|
122
|
+
React.createElement(Text, { bold: true, color: "red" }, "Cannot proceed - existing users/groups found!"),
|
|
123
|
+
React.createElement(Text, { color: "gray" }, "Please choose a different base name or remove the existing users/groups first."))),
|
|
124
|
+
currentField === 'confirm' && !hasConflicts && (React.createElement(Box, { marginTop: 1 },
|
|
125
|
+
React.createElement(Text, { color: "green", bold: true }, "Press Enter to confirm, or B to go back"))),
|
|
126
|
+
React.createElement(Box, { marginTop: 1 },
|
|
127
|
+
React.createElement(Text, { color: "gray", dimColor: true }, currentField === 'baseName'
|
|
128
|
+
? 'Type a name (letters/numbers only), Enter to continue, Esc to cancel'
|
|
129
|
+
: 'Press Enter to confirm, B to go back, Esc to cancel'))));
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=AdvancedConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdvancedConfig.js","sourceRoot":"","sources":["../../../../src/wizard/components/AdvancedConfig.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Advanced configuration component for custom user/group naming\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { ASH_PREFIX } from '@agenshield/sandbox';\n\n/** Re-export for convenience */\nexport const REQUIRED_PREFIX = ASH_PREFIX;\n\nexport interface AdvancedConfigValues {\n /** Suffix for agent user (will become ash_{suffix}_agent) */\n agentSuffix: string;\n /** Suffix for broker user (will become ash_{suffix}_broker) */\n brokerSuffix: string;\n /** Suffix for socket group (will become ash_{suffix}) */\n socketGroupSuffix: string;\n /** Suffix for workspace group (will become ash_{suffix}_workspace) */\n workspaceGroupSuffix: string;\n}\n\nexport interface ComputedNames {\n agentUser: string;\n brokerUser: string;\n socketGroup: string;\n workspaceGroup: string;\n}\n\ninterface AdvancedConfigProps {\n /** Existing users/groups that would conflict */\n existingConflicts?: {\n users: string[];\n groups: string[];\n };\n onConfirm: (values: AdvancedConfigValues) => void;\n onCancel: () => void;\n onCheckConflicts: (names: ComputedNames) => Promise<{ users: string[]; groups: string[] }>;\n}\n\ntype Field = 'baseName' | 'confirm';\n\n/**\n * Compute the full names from a base name\n */\nexport function computeNames(baseName: string): ComputedNames {\n const clean = baseName.replace(/[^a-z0-9]/gi, '').toLowerCase();\n const base = clean || 'default';\n return {\n agentUser: `${REQUIRED_PREFIX}${base}_agent`,\n brokerUser: `${REQUIRED_PREFIX}${base}_broker`,\n socketGroup: `${REQUIRED_PREFIX}${base}`,\n workspaceGroup: `${REQUIRED_PREFIX}${base}_workspace`,\n };\n}\n\nexport function AdvancedConfig({ existingConflicts, onConfirm, onCancel, onCheckConflicts }: AdvancedConfigProps) {\n const [baseName, setBaseName] = useState('');\n const [currentField, setCurrentField] = useState<Field>('baseName');\n const [conflicts, setConflicts] = useState<{ users: string[]; groups: string[] }>({ users: [], groups: [] });\n const [isChecking, setIsChecking] = useState(false);\n\n // Use provided conflicts or default to empty\n useEffect(() => {\n if (existingConflicts) {\n setConflicts(existingConflicts);\n }\n }, [existingConflicts]);\n\n const computedNames = computeNames(baseName);\n const hasConflicts = conflicts.users.length > 0 || conflicts.groups.length > 0;\n\n // Check for conflicts when baseName changes\n useEffect(() => {\n if (baseName.length > 0) {\n setIsChecking(true);\n const names = computeNames(baseName);\n onCheckConflicts(names).then((result) => {\n setConflicts(result);\n setIsChecking(false);\n }).catch(() => {\n setIsChecking(false);\n });\n } else {\n setConflicts({ users: [], groups: [] });\n }\n }, [baseName, onCheckConflicts]);\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n return;\n }\n\n if (currentField === 'baseName') {\n if (key.return) {\n if (baseName.length > 0 && !hasConflicts && !isChecking) {\n setCurrentField('confirm');\n }\n return;\n }\n\n if (key.backspace || key.delete) {\n setBaseName(baseName.slice(0, -1));\n return;\n }\n\n // Only allow alphanumeric characters\n if (input && /^[a-zA-Z0-9]$/.test(input)) {\n if (baseName.length < 20) {\n setBaseName(baseName + input.toLowerCase());\n }\n }\n } else if (currentField === 'confirm') {\n if (key.return && !hasConflicts) {\n onConfirm({\n agentSuffix: baseName,\n brokerSuffix: baseName,\n socketGroupSuffix: baseName,\n workspaceGroupSuffix: baseName,\n });\n return;\n }\n\n if (key.backspace || input === 'b') {\n setCurrentField('baseName');\n return;\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" padding={1}>\n <Text bold color=\"cyan\">\n Advanced Configuration\n </Text>\n <Text color=\"gray\">\n Customize user and group names (ash_ prefix is required)\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold>Enter a base name for users/groups:</Text>\n <Box marginTop={1}>\n <Text color=\"gray\">{REQUIRED_PREFIX}</Text>\n <Text color={currentField === 'baseName' ? 'yellow' : 'white'}>\n {baseName || (currentField === 'baseName' ? '_' : '')}\n </Text>\n {currentField === 'baseName' && baseName.length > 0 && (\n <Text color=\"gray\" dimColor>_</Text>\n )}\n </Box>\n </Box>\n\n {baseName.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold>Preview:</Text>\n <Box marginLeft={2} flexDirection=\"column\">\n <Text color={conflicts.users.includes(computedNames.agentUser) ? 'red' : 'green'}>\n Agent user: {computedNames.agentUser}\n {conflicts.users.includes(computedNames.agentUser) && ' (EXISTS!)'}\n </Text>\n <Text color={conflicts.users.includes(computedNames.brokerUser) ? 'red' : 'green'}>\n Broker user: {computedNames.brokerUser}\n {conflicts.users.includes(computedNames.brokerUser) && ' (EXISTS!)'}\n </Text>\n <Text color={conflicts.groups.includes(computedNames.socketGroup) ? 'red' : 'green'}>\n Socket group: {computedNames.socketGroup}\n {conflicts.groups.includes(computedNames.socketGroup) && ' (EXISTS!)'}\n </Text>\n <Text color={conflicts.groups.includes(computedNames.workspaceGroup) ? 'red' : 'green'}>\n Workspace group: {computedNames.workspaceGroup}\n {conflicts.groups.includes(computedNames.workspaceGroup) && ' (EXISTS!)'}\n </Text>\n </Box>\n </Box>\n )}\n\n {isChecking && (\n <Box marginTop={1}>\n <Text color=\"yellow\">Checking for conflicts...</Text>\n </Box>\n )}\n\n {hasConflicts && !isChecking && (\n <Box flexDirection=\"column\" marginTop={1} borderStyle=\"round\" borderColor=\"red\" padding={1}>\n <Text bold color=\"red\">\n Cannot proceed - existing users/groups found!\n </Text>\n <Text color=\"gray\">\n Please choose a different base name or remove the existing users/groups first.\n </Text>\n </Box>\n )}\n\n {currentField === 'confirm' && !hasConflicts && (\n <Box marginTop={1}>\n <Text color=\"green\" bold>\n Press Enter to confirm, or B to go back\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n {currentField === 'baseName'\n ? 'Type a name (letters/numbers only), Enter to continue, Esc to cancel'\n : 'Press Enter to confirm, B to go back, Esc to cancel'}\n </Text>\n </Box>\n </Box>\n );\n}\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confirmation component for user confirmation prompts
|
|
3
|
+
*/
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import type { OpenClawInstallation } from '@agenshield/sandbox';
|
|
6
|
+
interface UserNames {
|
|
7
|
+
agentUser: string;
|
|
8
|
+
brokerUser: string;
|
|
9
|
+
socketGroup: string;
|
|
10
|
+
workspaceGroup: string;
|
|
11
|
+
}
|
|
12
|
+
interface ConfirmProps {
|
|
13
|
+
installation: OpenClawInstallation;
|
|
14
|
+
presetName?: string;
|
|
15
|
+
userNames?: UserNames;
|
|
16
|
+
onConfirm: () => void;
|
|
17
|
+
onCancel: () => void;
|
|
18
|
+
}
|
|
19
|
+
export declare function Confirm({ installation, presetName, userNames, onConfirm, onCancel }: ConfirmProps): React.JSX.Element;
|
|
20
|
+
/**
|
|
21
|
+
* Uninstall confirmation component that requires typing "UNINSTALL"
|
|
22
|
+
*/
|
|
23
|
+
interface UninstallConfirmProps {
|
|
24
|
+
backupTimestamp: string;
|
|
25
|
+
sandboxUsername: string;
|
|
26
|
+
onConfirm: () => void;
|
|
27
|
+
onCancel: () => void;
|
|
28
|
+
}
|
|
29
|
+
export declare function UninstallConfirm({ backupTimestamp, sandboxUsername, onConfirm, onCancel, }: UninstallConfirmProps): React.JSX.Element;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=Confirm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Confirm.d.ts","sourceRoot":"","sources":["../../../../src/wizard/components/Confirm.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAEnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,UAAU,SAAS;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,YAAY;IACpB,YAAY,EAAE,oBAAoB,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,OAAO,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,YAAY,qBA8FjG;AAED;;GAEG;AACH,UAAU,qBAAqB;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,eAAe,EACf,eAAe,EACf,SAAS,EACT,QAAQ,GACT,EAAE,qBAAqB,qBAoFvB"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confirmation component for user confirmation prompts
|
|
3
|
+
*/
|
|
4
|
+
import React, { useState } from 'react';
|
|
5
|
+
import { Box, Text, useInput } from 'ink';
|
|
6
|
+
export function Confirm({ installation, presetName, userNames, onConfirm, onCancel }) {
|
|
7
|
+
const targetName = presetName || 'OpenClaw';
|
|
8
|
+
const agentUser = userNames?.agentUser || 'ash_default_agent';
|
|
9
|
+
const [selected, setSelected] = useState('yes');
|
|
10
|
+
useInput((input, key) => {
|
|
11
|
+
if (key.leftArrow || key.rightArrow || input === 'y' || input === 'n') {
|
|
12
|
+
if (input === 'y') {
|
|
13
|
+
setSelected('yes');
|
|
14
|
+
}
|
|
15
|
+
else if (input === 'n') {
|
|
16
|
+
setSelected('no');
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
setSelected(selected === 'yes' ? 'no' : 'yes');
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (key.return) {
|
|
23
|
+
if (selected === 'yes') {
|
|
24
|
+
onConfirm();
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
onCancel();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (key.escape) {
|
|
31
|
+
onCancel();
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return (React.createElement(Box, { flexDirection: "column", marginTop: 1 },
|
|
35
|
+
React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", padding: 1 },
|
|
36
|
+
React.createElement(Text, { bold: true, color: "cyan" },
|
|
37
|
+
targetName,
|
|
38
|
+
" found: v",
|
|
39
|
+
installation.version || 'unknown',
|
|
40
|
+
" (",
|
|
41
|
+
installation.method,
|
|
42
|
+
")"),
|
|
43
|
+
React.createElement(Text, { color: "gray" },
|
|
44
|
+
"Location: ",
|
|
45
|
+
installation.packagePath),
|
|
46
|
+
installation.configPath && (React.createElement(Text, { color: "gray" },
|
|
47
|
+
"Config: ",
|
|
48
|
+
installation.configPath))),
|
|
49
|
+
React.createElement(Box, { flexDirection: "column", marginTop: 1 },
|
|
50
|
+
React.createElement(Text, { bold: true }, "This will:"),
|
|
51
|
+
React.createElement(Box, { marginLeft: 2, flexDirection: "column" },
|
|
52
|
+
React.createElement(Text, { color: "yellow" },
|
|
53
|
+
"\u2192 Create sandbox user \"",
|
|
54
|
+
agentUser,
|
|
55
|
+
"\""),
|
|
56
|
+
React.createElement(Text, { color: "yellow" },
|
|
57
|
+
"\u2192 Move ",
|
|
58
|
+
targetName,
|
|
59
|
+
" to sandbox user home"),
|
|
60
|
+
React.createElement(Text, { color: "yellow" }, "\u2192 Install guarded shell for isolation"),
|
|
61
|
+
React.createElement(Text, { color: "yellow" }, "\u2192 Protect your secrets from skills"))),
|
|
62
|
+
userNames && (React.createElement(Box, { flexDirection: "column", marginTop: 1 },
|
|
63
|
+
React.createElement(Text, { bold: true }, "Users and Groups:"),
|
|
64
|
+
React.createElement(Box, { marginLeft: 2, flexDirection: "column" },
|
|
65
|
+
React.createElement(Text, { color: "cyan" },
|
|
66
|
+
"Agent user: ",
|
|
67
|
+
userNames.agentUser),
|
|
68
|
+
React.createElement(Text, { color: "cyan" },
|
|
69
|
+
"Broker user: ",
|
|
70
|
+
userNames.brokerUser),
|
|
71
|
+
React.createElement(Text, { color: "cyan" },
|
|
72
|
+
"Socket group: ",
|
|
73
|
+
userNames.socketGroup),
|
|
74
|
+
React.createElement(Text, { color: "cyan" },
|
|
75
|
+
"Workspace group: ",
|
|
76
|
+
userNames.workspaceGroup)))),
|
|
77
|
+
React.createElement(Box, { flexDirection: "column", marginTop: 1 },
|
|
78
|
+
React.createElement(Text, { color: "gray" }, "Original installation will be backed up."),
|
|
79
|
+
React.createElement(Text, { color: "gray" },
|
|
80
|
+
"You can reverse this with: ",
|
|
81
|
+
React.createElement(Text, { color: "cyan" }, "agenshield uninstall"))),
|
|
82
|
+
React.createElement(Box, { marginTop: 1 },
|
|
83
|
+
React.createElement(Text, null, "Continue? "),
|
|
84
|
+
React.createElement(Text, { color: selected === 'yes' ? 'green' : 'gray', bold: selected === 'yes' }, "[Y]es"),
|
|
85
|
+
React.createElement(Text, null, " / "),
|
|
86
|
+
React.createElement(Text, { color: selected === 'no' ? 'red' : 'gray', bold: selected === 'no' }, "[N]o")),
|
|
87
|
+
React.createElement(Box, { marginTop: 1 },
|
|
88
|
+
React.createElement(Text, { color: "gray", dimColor: true }, "Press Y/N or arrow keys to select, Enter to confirm, Esc to cancel"))));
|
|
89
|
+
}
|
|
90
|
+
export function UninstallConfirm({ backupTimestamp, sandboxUsername, onConfirm, onCancel, }) {
|
|
91
|
+
const [input, setInput] = useState('');
|
|
92
|
+
const CONFIRM_WORD = 'UNINSTALL';
|
|
93
|
+
useInput((char, key) => {
|
|
94
|
+
if (key.escape) {
|
|
95
|
+
onCancel();
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (key.return) {
|
|
99
|
+
if (input === CONFIRM_WORD) {
|
|
100
|
+
onConfirm();
|
|
101
|
+
}
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (key.backspace || key.delete) {
|
|
105
|
+
setInput(input.slice(0, -1));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// Only allow alphanumeric characters
|
|
109
|
+
if (char && /^[a-zA-Z]$/.test(char)) {
|
|
110
|
+
setInput(input + char.toUpperCase());
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
const isComplete = input === CONFIRM_WORD;
|
|
114
|
+
return (React.createElement(Box, { flexDirection: "column", marginTop: 1 },
|
|
115
|
+
React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: "red", padding: 1 },
|
|
116
|
+
React.createElement(Text, { bold: true, color: "red" }, "AgenShield Uninstall")),
|
|
117
|
+
React.createElement(Box, { flexDirection: "column", marginTop: 1 },
|
|
118
|
+
React.createElement(Text, { bold: true }, "This will:"),
|
|
119
|
+
React.createElement(Box, { marginLeft: 2, flexDirection: "column" },
|
|
120
|
+
React.createElement(Text, { color: "yellow" }, "\u2192 Stop and remove agenshield daemon"),
|
|
121
|
+
React.createElement(Text, { color: "yellow" }, "\u2192 Restore OpenClaw to original location"),
|
|
122
|
+
React.createElement(Text, { color: "yellow" },
|
|
123
|
+
"\u2192 Delete sandbox user \"",
|
|
124
|
+
sandboxUsername,
|
|
125
|
+
"\""),
|
|
126
|
+
React.createElement(Text, { color: "yellow" }, "\u2192 Remove guarded shell"),
|
|
127
|
+
React.createElement(Text, { color: "yellow" }, "\u2192 Delete /etc/agenshield configuration"))),
|
|
128
|
+
React.createElement(Box, { marginTop: 1 },
|
|
129
|
+
React.createElement(Text, { color: "gray" },
|
|
130
|
+
"Backup found: ",
|
|
131
|
+
backupTimestamp)),
|
|
132
|
+
React.createElement(Box, { marginTop: 1, flexDirection: "column" },
|
|
133
|
+
React.createElement(Text, { bold: true, color: "red" }, "WARNING: This cannot be fully reversed automatically!")),
|
|
134
|
+
React.createElement(Box, { marginTop: 1, flexDirection: "column" },
|
|
135
|
+
React.createElement(Text, null,
|
|
136
|
+
"Type ",
|
|
137
|
+
React.createElement(Text, { bold: true, color: "red" }, "UNINSTALL"),
|
|
138
|
+
" to confirm:",
|
|
139
|
+
' '),
|
|
140
|
+
React.createElement(Box, null,
|
|
141
|
+
React.createElement(Text, { color: isComplete ? 'green' : 'yellow' }, input),
|
|
142
|
+
React.createElement(Text, { color: "gray", dimColor: true }, '_'.repeat(Math.max(0, CONFIRM_WORD.length - input.length))))),
|
|
143
|
+
isComplete && (React.createElement(Box, { marginTop: 1 },
|
|
144
|
+
React.createElement(Text, { color: "green" }, "Press Enter to proceed with uninstall..."))),
|
|
145
|
+
React.createElement(Box, { marginTop: 1 },
|
|
146
|
+
React.createElement(Text, { color: "gray", dimColor: true }, "Press Esc to cancel"))));
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=Confirm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Confirm.js","sourceRoot":"","sources":["../../../../src/wizard/components/Confirm.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Confirmation component for user confirmation prompts\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { OpenClawInstallation } from '@agenshield/sandbox';\n\ninterface UserNames {\n agentUser: string;\n brokerUser: string;\n socketGroup: string;\n workspaceGroup: string;\n}\n\ninterface ConfirmProps {\n installation: OpenClawInstallation;\n presetName?: string;\n userNames?: UserNames;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function Confirm({ installation, presetName, userNames, onConfirm, onCancel }: ConfirmProps) {\n const targetName = presetName || 'OpenClaw';\n const agentUser = userNames?.agentUser || 'ash_default_agent';\n const [selected, setSelected] = useState<'yes' | 'no'>('yes');\n\n useInput((input, key) => {\n if (key.leftArrow || key.rightArrow || input === 'y' || input === 'n') {\n if (input === 'y') {\n setSelected('yes');\n } else if (input === 'n') {\n setSelected('no');\n } else {\n setSelected(selected === 'yes' ? 'no' : 'yes');\n }\n }\n\n if (key.return) {\n if (selected === 'yes') {\n onConfirm();\n } else {\n onCancel();\n }\n }\n\n if (key.escape) {\n onCancel();\n }\n });\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" padding={1}>\n <Text bold color=\"cyan\">\n {targetName} found: v{installation.version || 'unknown'} ({installation.method})\n </Text>\n <Text color=\"gray\">Location: {installation.packagePath}</Text>\n {installation.configPath && (\n <Text color=\"gray\">Config: {installation.configPath}</Text>\n )}\n </Box>\n\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold>This will:</Text>\n <Box marginLeft={2} flexDirection=\"column\">\n <Text color=\"yellow\">→ Create sandbox user \"{agentUser}\"</Text>\n <Text color=\"yellow\">→ Move {targetName} to sandbox user home</Text>\n <Text color=\"yellow\">→ Install guarded shell for isolation</Text>\n <Text color=\"yellow\">→ Protect your secrets from skills</Text>\n </Box>\n </Box>\n\n {userNames && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold>Users and Groups:</Text>\n <Box marginLeft={2} flexDirection=\"column\">\n <Text color=\"cyan\">Agent user: {userNames.agentUser}</Text>\n <Text color=\"cyan\">Broker user: {userNames.brokerUser}</Text>\n <Text color=\"cyan\">Socket group: {userNames.socketGroup}</Text>\n <Text color=\"cyan\">Workspace group: {userNames.workspaceGroup}</Text>\n </Box>\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"gray\">Original installation will be backed up.</Text>\n <Text color=\"gray\">\n You can reverse this with: <Text color=\"cyan\">agenshield uninstall</Text>\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text>Continue? </Text>\n <Text\n color={selected === 'yes' ? 'green' : 'gray'}\n bold={selected === 'yes'}\n >\n [Y]es\n </Text>\n <Text> / </Text>\n <Text\n color={selected === 'no' ? 'red' : 'gray'}\n bold={selected === 'no'}\n >\n [N]o\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n Press Y/N or arrow keys to select, Enter to confirm, Esc to cancel\n </Text>\n </Box>\n </Box>\n );\n}\n\n/**\n * Uninstall confirmation component that requires typing \"UNINSTALL\"\n */\ninterface UninstallConfirmProps {\n backupTimestamp: string;\n sandboxUsername: string;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function UninstallConfirm({\n backupTimestamp,\n sandboxUsername,\n onConfirm,\n onCancel,\n}: UninstallConfirmProps) {\n const [input, setInput] = useState('');\n const CONFIRM_WORD = 'UNINSTALL';\n\n useInput((char, key) => {\n if (key.escape) {\n onCancel();\n return;\n }\n\n if (key.return) {\n if (input === CONFIRM_WORD) {\n onConfirm();\n }\n return;\n }\n\n if (key.backspace || key.delete) {\n setInput(input.slice(0, -1));\n return;\n }\n\n // Only allow alphanumeric characters\n if (char && /^[a-zA-Z]$/.test(char)) {\n setInput(input + char.toUpperCase());\n }\n });\n\n const isComplete = input === CONFIRM_WORD;\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"red\" padding={1}>\n <Text bold color=\"red\">\n AgenShield Uninstall\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold>This will:</Text>\n <Box marginLeft={2} flexDirection=\"column\">\n <Text color=\"yellow\">→ Stop and remove agenshield daemon</Text>\n <Text color=\"yellow\">→ Restore OpenClaw to original location</Text>\n <Text color=\"yellow\">→ Delete sandbox user \"{sandboxUsername}\"</Text>\n <Text color=\"yellow\">→ Remove guarded shell</Text>\n <Text color=\"yellow\">→ Delete /etc/agenshield configuration</Text>\n </Box>\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"gray\">Backup found: {backupTimestamp}</Text>\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold color=\"red\">\n WARNING: This cannot be fully reversed automatically!\n </Text>\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text>\n Type <Text bold color=\"red\">UNINSTALL</Text> to confirm:{' '}\n </Text>\n <Box>\n <Text color={isComplete ? 'green' : 'yellow'}>{input}</Text>\n <Text color=\"gray\" dimColor>\n {'_'.repeat(Math.max(0, CONFIRM_WORD.length - input.length))}\n </Text>\n </Box>\n </Box>\n\n {isComplete && (\n <Box marginTop={1}>\n <Text color=\"green\">Press Enter to proceed with uninstall...</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n Press Esc to cancel\n </Text>\n </Box>\n </Box>\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../../src/wizard/components/Header.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,wBAAgB,MAAM,sBASrB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wizard header component
|
|
3
|
+
*/
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { Box, Text } from 'ink';
|
|
6
|
+
export function Header() {
|
|
7
|
+
return (React.createElement(Box, { flexDirection: "column", marginBottom: 1 },
|
|
8
|
+
React.createElement(Text, { bold: true, color: "cyan" }, "\uD83D\uDEE1\uFE0F AgenShield Setup Wizard"),
|
|
9
|
+
React.createElement(Text, { color: "gray" }, "Isolating OpenClaw for secure operation")));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=Header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../../src/wizard/components/Header.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,MAAM,UAAU,MAAM;IACpB,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC;QACzC,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,iDAEhB;QACP,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,8CAA+C,CAC7D,CACP,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Wizard header component\n */\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\n\nexport function Header() {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color=\"cyan\">\n 🛡️ AgenShield Setup Wizard\n </Text>\n <Text color=\"gray\">Isolating OpenClaw for secure operation</Text>\n </Box>\n );\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mode selection component - Quick vs Advanced setup
|
|
3
|
+
*/
|
|
4
|
+
import React from 'react';
|
|
5
|
+
export type SetupMode = 'quick' | 'advanced' | 'webui';
|
|
6
|
+
interface ModeSelectProps {
|
|
7
|
+
onSelect: (mode: SetupMode) => void;
|
|
8
|
+
onCancel: () => void;
|
|
9
|
+
}
|
|
10
|
+
export declare function ModeSelect({ onSelect, onCancel }: ModeSelectProps): React.JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=ModeSelect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModeSelect.d.ts","sourceRoot":"","sources":["../../../../src/wizard/components/ModeSelect.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAIxC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;AAQvD,UAAU,eAAe;IACvB,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACpC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAID,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,eAAe,qBA0FjE"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mode selection component - Quick vs Advanced setup
|
|
3
|
+
*/
|
|
4
|
+
import React, { useState } from 'react';
|
|
5
|
+
import { Box, Text, useInput } from 'ink';
|
|
6
|
+
import { ASH_PREFIX, DEFAULT_BASE_NAME } from '@agenshield/sandbox';
|
|
7
|
+
// Default names when using quick setup
|
|
8
|
+
const DEFAULT_AGENT = `${ASH_PREFIX}${DEFAULT_BASE_NAME}_agent`;
|
|
9
|
+
const DEFAULT_BROKER = `${ASH_PREFIX}${DEFAULT_BASE_NAME}_broker`;
|
|
10
|
+
const DEFAULT_SOCKET = `${ASH_PREFIX}${DEFAULT_BASE_NAME}`;
|
|
11
|
+
const DEFAULT_WORKSPACE = `${ASH_PREFIX}${DEFAULT_BASE_NAME}_workspace`;
|
|
12
|
+
const MODES = ['quick', 'advanced', 'webui'];
|
|
13
|
+
export function ModeSelect({ onSelect, onCancel }) {
|
|
14
|
+
const [selected, setSelected] = useState('quick');
|
|
15
|
+
useInput((input, key) => {
|
|
16
|
+
if (key.upArrow) {
|
|
17
|
+
const idx = MODES.indexOf(selected);
|
|
18
|
+
setSelected(MODES[(idx - 1 + MODES.length) % MODES.length]);
|
|
19
|
+
}
|
|
20
|
+
if (key.downArrow) {
|
|
21
|
+
const idx = MODES.indexOf(selected);
|
|
22
|
+
setSelected(MODES[(idx + 1) % MODES.length]);
|
|
23
|
+
}
|
|
24
|
+
if (input === '1' || input === 'q') {
|
|
25
|
+
setSelected('quick');
|
|
26
|
+
}
|
|
27
|
+
else if (input === '2' || input === 'a') {
|
|
28
|
+
setSelected('advanced');
|
|
29
|
+
}
|
|
30
|
+
else if (input === '3' || input === 'w') {
|
|
31
|
+
setSelected('webui');
|
|
32
|
+
}
|
|
33
|
+
if (key.return) {
|
|
34
|
+
onSelect(selected);
|
|
35
|
+
}
|
|
36
|
+
if (key.escape) {
|
|
37
|
+
onCancel();
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
return (React.createElement(Box, { flexDirection: "column", marginTop: 1 },
|
|
41
|
+
React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", padding: 1 },
|
|
42
|
+
React.createElement(Text, { bold: true, color: "cyan" }, "Setup Mode"),
|
|
43
|
+
React.createElement(Text, { color: "gray" }, "Choose how you want to configure AgenShield")),
|
|
44
|
+
React.createElement(Box, { flexDirection: "column", marginTop: 1 },
|
|
45
|
+
React.createElement(Box, null,
|
|
46
|
+
React.createElement(Text, { color: selected === 'quick' ? 'green' : 'gray' }, selected === 'quick' ? '>' : ' '),
|
|
47
|
+
React.createElement(Text, { bold: selected === 'quick', color: selected === 'quick' ? 'green' : 'white' }, "[1] Quick Setup")),
|
|
48
|
+
React.createElement(Box, { marginLeft: 4 },
|
|
49
|
+
React.createElement(Text, { color: "gray" },
|
|
50
|
+
"Use default names: ",
|
|
51
|
+
DEFAULT_AGENT,
|
|
52
|
+
", ",
|
|
53
|
+
DEFAULT_BROKER,
|
|
54
|
+
", ",
|
|
55
|
+
DEFAULT_SOCKET,
|
|
56
|
+
", ",
|
|
57
|
+
DEFAULT_WORKSPACE)),
|
|
58
|
+
React.createElement(Box, { marginTop: 1 },
|
|
59
|
+
React.createElement(Text, { color: selected === 'advanced' ? 'green' : 'gray' }, selected === 'advanced' ? '>' : ' '),
|
|
60
|
+
React.createElement(Text, { bold: selected === 'advanced', color: selected === 'advanced' ? 'green' : 'white' }, "[2] Advanced Setup")),
|
|
61
|
+
React.createElement(Box, { marginLeft: 4 },
|
|
62
|
+
React.createElement(Text, { color: "gray" },
|
|
63
|
+
"Customize user/group names (e.g., ",
|
|
64
|
+
ASH_PREFIX,
|
|
65
|
+
"myapp_agent)")),
|
|
66
|
+
React.createElement(Box, { marginTop: 1 },
|
|
67
|
+
React.createElement(Text, { color: selected === 'webui' ? 'green' : 'gray' }, selected === 'webui' ? '>' : ' '),
|
|
68
|
+
React.createElement(Text, { bold: selected === 'webui', color: selected === 'webui' ? 'green' : 'white' }, "[3] Web UI Setup")),
|
|
69
|
+
React.createElement(Box, { marginLeft: 4 },
|
|
70
|
+
React.createElement(Text, { color: "gray" }, "Open setup wizard in your browser with live security visualization"))),
|
|
71
|
+
React.createElement(Box, { marginTop: 1 },
|
|
72
|
+
React.createElement(Text, { color: "gray", dimColor: true }, "Press 1/2/3 or arrow keys to select, Enter to confirm, Esc to cancel"))));
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=ModeSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModeSelect.js","sourceRoot":"","sources":["../../../../src/wizard/components/ModeSelect.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Mode selection component - Quick vs Advanced setup\n */\n\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { ASH_PREFIX, DEFAULT_BASE_NAME } from '@agenshield/sandbox';\n\nexport type SetupMode = 'quick' | 'advanced' | 'webui';\n\n// Default names when using quick setup\nconst DEFAULT_AGENT = `${ASH_PREFIX}${DEFAULT_BASE_NAME}_agent`;\nconst DEFAULT_BROKER = `${ASH_PREFIX}${DEFAULT_BASE_NAME}_broker`;\nconst DEFAULT_SOCKET = `${ASH_PREFIX}${DEFAULT_BASE_NAME}`;\nconst DEFAULT_WORKSPACE = `${ASH_PREFIX}${DEFAULT_BASE_NAME}_workspace`;\n\ninterface ModeSelectProps {\n onSelect: (mode: SetupMode) => void;\n onCancel: () => void;\n}\n\nconst MODES: SetupMode[] = ['quick', 'advanced', 'webui'];\n\nexport function ModeSelect({ onSelect, onCancel }: ModeSelectProps) {\n const [selected, setSelected] = useState<SetupMode>('quick');\n\n useInput((input, key) => {\n if (key.upArrow) {\n const idx = MODES.indexOf(selected);\n setSelected(MODES[(idx - 1 + MODES.length) % MODES.length]);\n }\n if (key.downArrow) {\n const idx = MODES.indexOf(selected);\n setSelected(MODES[(idx + 1) % MODES.length]);\n }\n\n if (input === '1' || input === 'q') {\n setSelected('quick');\n } else if (input === '2' || input === 'a') {\n setSelected('advanced');\n } else if (input === '3' || input === 'w') {\n setSelected('webui');\n }\n\n if (key.return) {\n onSelect(selected);\n }\n\n if (key.escape) {\n onCancel();\n }\n });\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" padding={1}>\n <Text bold color=\"cyan\">\n Setup Mode\n </Text>\n <Text color=\"gray\">Choose how you want to configure AgenShield</Text>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={1}>\n <Box>\n <Text color={selected === 'quick' ? 'green' : 'gray'}>\n {selected === 'quick' ? '>' : ' '}\n </Text>\n <Text bold={selected === 'quick'} color={selected === 'quick' ? 'green' : 'white'}>\n [1] Quick Setup\n </Text>\n </Box>\n <Box marginLeft={4}>\n <Text color=\"gray\">\n Use default names: {DEFAULT_AGENT}, {DEFAULT_BROKER}, {DEFAULT_SOCKET}, {DEFAULT_WORKSPACE}\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color={selected === 'advanced' ? 'green' : 'gray'}>\n {selected === 'advanced' ? '>' : ' '}\n </Text>\n <Text bold={selected === 'advanced'} color={selected === 'advanced' ? 'green' : 'white'}>\n [2] Advanced Setup\n </Text>\n </Box>\n <Box marginLeft={4}>\n <Text color=\"gray\">\n Customize user/group names (e.g., {ASH_PREFIX}myapp_agent)\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color={selected === 'webui' ? 'green' : 'gray'}>\n {selected === 'webui' ? '>' : ' '}\n </Text>\n <Text bold={selected === 'webui'} color={selected === 'webui' ? 'green' : 'white'}>\n [3] Web UI Setup\n </Text>\n </Box>\n <Box marginLeft={4}>\n <Text color=\"gray\">\n Open setup wizard in your browser with live security visualization\n </Text>\n </Box>\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n Press 1/2/3 or arrow keys to select, Enter to confirm, Esc to cancel\n </Text>\n </Box>\n </Box>\n );\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Passcode setup component for the wizard
|
|
3
|
+
*
|
|
4
|
+
* Allows users to set a passcode during initial setup.
|
|
5
|
+
* Users can also skip this step.
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
interface PasscodeSetupProps {
|
|
9
|
+
/** Called when user sets a passcode */
|
|
10
|
+
onSetPasscode: (passcode: string) => void;
|
|
11
|
+
/** Called when user skips passcode setup */
|
|
12
|
+
onSkip: () => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function PasscodeSetup({ onSetPasscode, onSkip }: PasscodeSetupProps): React.JSX.Element;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=PasscodeSetup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PasscodeSetup.d.ts","sourceRoot":"","sources":["../../../../src/wizard/components/PasscodeSetup.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAKxC,UAAU,kBAAkB;IAC1B,uCAAuC;IACvC,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,4CAA4C;IAC5C,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,kBAAkB,qBAwK1E"}
|