@dotsetlabs/tollgate 0.2.2 → 0.3.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 (194) hide show
  1. package/README.md +138 -0
  2. package/dist/analyzers/filesystem.d.ts +5 -0
  3. package/dist/analyzers/filesystem.d.ts.map +1 -1
  4. package/dist/analyzers/filesystem.js +61 -7
  5. package/dist/analyzers/filesystem.js.map +1 -1
  6. package/dist/analyzers/loader.d.ts +5 -0
  7. package/dist/analyzers/loader.d.ts.map +1 -1
  8. package/dist/analyzers/loader.js +112 -6
  9. package/dist/analyzers/loader.js.map +1 -1
  10. package/dist/analyzers/prompt-injection.d.ts +1 -0
  11. package/dist/analyzers/prompt-injection.d.ts.map +1 -1
  12. package/dist/analyzers/prompt-injection.js +48 -2
  13. package/dist/analyzers/prompt-injection.js.map +1 -1
  14. package/dist/analyzers/shell.d.ts +8 -0
  15. package/dist/analyzers/shell.d.ts.map +1 -1
  16. package/dist/analyzers/shell.js +109 -8
  17. package/dist/analyzers/shell.js.map +1 -1
  18. package/dist/analyzers/sql.d.ts.map +1 -1
  19. package/dist/analyzers/sql.js +8 -7
  20. package/dist/analyzers/sql.js.map +1 -1
  21. package/dist/approval/interactive.d.ts +1 -1
  22. package/dist/approval/interactive.d.ts.map +1 -1
  23. package/dist/approval/interactive.js +13 -1
  24. package/dist/approval/interactive.js.map +1 -1
  25. package/dist/approval/rate-limiter.d.ts +115 -0
  26. package/dist/approval/rate-limiter.d.ts.map +1 -0
  27. package/dist/approval/rate-limiter.js +200 -0
  28. package/dist/approval/rate-limiter.js.map +1 -0
  29. package/dist/approval/url-validator.d.ts +51 -0
  30. package/dist/approval/url-validator.d.ts.map +1 -0
  31. package/dist/approval/url-validator.js +184 -0
  32. package/dist/approval/url-validator.js.map +1 -0
  33. package/dist/approval/webhook.d.ts +48 -0
  34. package/dist/approval/webhook.d.ts.map +1 -1
  35. package/dist/approval/webhook.js +89 -0
  36. package/dist/approval/webhook.js.map +1 -1
  37. package/dist/audit/integrity.d.ts +107 -0
  38. package/dist/audit/integrity.d.ts.map +1 -0
  39. package/dist/audit/integrity.js +191 -0
  40. package/dist/audit/integrity.js.map +1 -0
  41. package/dist/audit/logger.d.ts.map +1 -1
  42. package/dist/audit/logger.js +6 -5
  43. package/dist/audit/logger.js.map +1 -1
  44. package/dist/audit/redaction.js +6 -4
  45. package/dist/audit/redaction.js.map +1 -1
  46. package/dist/cli/commands/guard.d.ts +97 -0
  47. package/dist/cli/commands/guard.d.ts.map +1 -0
  48. package/dist/cli/commands/guard.js +456 -0
  49. package/dist/cli/commands/guard.js.map +1 -0
  50. package/dist/cli/commands/serve.js +1 -1
  51. package/dist/cli/commands/serve.js.map +1 -1
  52. package/dist/cli/index.js +3 -0
  53. package/dist/cli/index.js.map +1 -1
  54. package/dist/cli/input-validation.d.ts +83 -0
  55. package/dist/cli/input-validation.d.ts.map +1 -0
  56. package/dist/cli/input-validation.js +237 -0
  57. package/dist/cli/input-validation.js.map +1 -0
  58. package/dist/cli/ui.js +2 -2
  59. package/dist/cli/ui.js.map +1 -1
  60. package/dist/guard/alternatives/index.d.ts +68 -0
  61. package/dist/guard/alternatives/index.d.ts.map +1 -0
  62. package/dist/guard/alternatives/index.js +224 -0
  63. package/dist/guard/alternatives/index.js.map +1 -0
  64. package/dist/guard/alternatives/registry.d.ts +16 -0
  65. package/dist/guard/alternatives/registry.d.ts.map +1 -0
  66. package/dist/guard/alternatives/registry.js +518 -0
  67. package/dist/guard/alternatives/registry.js.map +1 -0
  68. package/dist/guard/alternatives/types.d.ts +86 -0
  69. package/dist/guard/alternatives/types.d.ts.map +1 -0
  70. package/dist/guard/alternatives/types.js +5 -0
  71. package/dist/guard/alternatives/types.js.map +1 -0
  72. package/dist/guard/approval/enhanced-terminal.d.ts +110 -0
  73. package/dist/guard/approval/enhanced-terminal.d.ts.map +1 -0
  74. package/dist/guard/approval/enhanced-terminal.js +387 -0
  75. package/dist/guard/approval/enhanced-terminal.js.map +1 -0
  76. package/dist/guard/config.d.ts +80 -0
  77. package/dist/guard/config.d.ts.map +1 -0
  78. package/dist/guard/config.js +260 -0
  79. package/dist/guard/config.js.map +1 -0
  80. package/dist/guard/context/directory.d.ts +35 -0
  81. package/dist/guard/context/directory.d.ts.map +1 -0
  82. package/dist/guard/context/directory.js +243 -0
  83. package/dist/guard/context/directory.js.map +1 -0
  84. package/dist/guard/context/environment.d.ts +31 -0
  85. package/dist/guard/context/environment.d.ts.map +1 -0
  86. package/dist/guard/context/environment.js +204 -0
  87. package/dist/guard/context/environment.js.map +1 -0
  88. package/dist/guard/context/git.d.ts +52 -0
  89. package/dist/guard/context/git.d.ts.map +1 -0
  90. package/dist/guard/context/git.js +278 -0
  91. package/dist/guard/context/git.js.map +1 -0
  92. package/dist/guard/context/index.d.ts +64 -0
  93. package/dist/guard/context/index.d.ts.map +1 -0
  94. package/dist/guard/context/index.js +227 -0
  95. package/dist/guard/context/index.js.map +1 -0
  96. package/dist/guard/context/project.d.ts +47 -0
  97. package/dist/guard/context/project.d.ts.map +1 -0
  98. package/dist/guard/context/project.js +281 -0
  99. package/dist/guard/context/project.js.map +1 -0
  100. package/dist/guard/context/types.d.ts +152 -0
  101. package/dist/guard/context/types.d.ts.map +1 -0
  102. package/dist/guard/context/types.js +7 -0
  103. package/dist/guard/context/types.js.map +1 -0
  104. package/dist/guard/engine.d.ts +107 -0
  105. package/dist/guard/engine.d.ts.map +1 -0
  106. package/dist/guard/engine.js +430 -0
  107. package/dist/guard/engine.js.map +1 -0
  108. package/dist/guard/enhanced-engine.d.ts +151 -0
  109. package/dist/guard/enhanced-engine.d.ts.map +1 -0
  110. package/dist/guard/enhanced-engine.js +622 -0
  111. package/dist/guard/enhanced-engine.js.map +1 -0
  112. package/dist/guard/hooks/index.d.ts +50 -0
  113. package/dist/guard/hooks/index.d.ts.map +1 -0
  114. package/dist/guard/hooks/index.js +325 -0
  115. package/dist/guard/hooks/index.js.map +1 -0
  116. package/dist/guard/index.d.ts +29 -0
  117. package/dist/guard/index.d.ts.map +1 -0
  118. package/dist/guard/index.js +31 -0
  119. package/dist/guard/index.js.map +1 -0
  120. package/dist/guard/learning/index.d.ts +136 -0
  121. package/dist/guard/learning/index.d.ts.map +1 -0
  122. package/dist/guard/learning/index.js +314 -0
  123. package/dist/guard/learning/index.js.map +1 -0
  124. package/dist/guard/learning/pattern-extractor.d.ts +50 -0
  125. package/dist/guard/learning/pattern-extractor.d.ts.map +1 -0
  126. package/dist/guard/learning/pattern-extractor.js +372 -0
  127. package/dist/guard/learning/pattern-extractor.js.map +1 -0
  128. package/dist/guard/learning/rule-suggester.d.ts +67 -0
  129. package/dist/guard/learning/rule-suggester.d.ts.map +1 -0
  130. package/dist/guard/learning/rule-suggester.js +345 -0
  131. package/dist/guard/learning/rule-suggester.js.map +1 -0
  132. package/dist/guard/learning/types.d.ts +211 -0
  133. package/dist/guard/learning/types.d.ts.map +1 -0
  134. package/dist/guard/learning/types.js +18 -0
  135. package/dist/guard/learning/types.js.map +1 -0
  136. package/dist/guard/preview/effects.d.ts +15 -0
  137. package/dist/guard/preview/effects.d.ts.map +1 -0
  138. package/dist/guard/preview/effects.js +413 -0
  139. package/dist/guard/preview/effects.js.map +1 -0
  140. package/dist/guard/preview/index.d.ts +49 -0
  141. package/dist/guard/preview/index.d.ts.map +1 -0
  142. package/dist/guard/preview/index.js +196 -0
  143. package/dist/guard/preview/index.js.map +1 -0
  144. package/dist/guard/preview/parser.d.ts +34 -0
  145. package/dist/guard/preview/parser.d.ts.map +1 -0
  146. package/dist/guard/preview/parser.js +292 -0
  147. package/dist/guard/preview/parser.js.map +1 -0
  148. package/dist/guard/preview/types.d.ts +140 -0
  149. package/dist/guard/preview/types.d.ts.map +1 -0
  150. package/dist/guard/preview/types.js +5 -0
  151. package/dist/guard/preview/types.js.map +1 -0
  152. package/dist/guard/reversibility/index.d.ts +88 -0
  153. package/dist/guard/reversibility/index.d.ts.map +1 -0
  154. package/dist/guard/reversibility/index.js +310 -0
  155. package/dist/guard/reversibility/index.js.map +1 -0
  156. package/dist/guard/types.d.ts +192 -0
  157. package/dist/guard/types.d.ts.map +1 -0
  158. package/dist/guard/types.js +8 -0
  159. package/dist/guard/types.js.map +1 -0
  160. package/dist/index.d.ts +10 -0
  161. package/dist/index.d.ts.map +1 -1
  162. package/dist/index.js +24 -0
  163. package/dist/index.js.map +1 -1
  164. package/dist/orchestrator/manager.d.ts.map +1 -1
  165. package/dist/orchestrator/manager.js +6 -1
  166. package/dist/orchestrator/manager.js.map +1 -1
  167. package/dist/policy/engine.d.ts.map +1 -1
  168. package/dist/policy/engine.js +11 -3
  169. package/dist/policy/engine.js.map +1 -1
  170. package/dist/policy/parser.d.ts.map +1 -1
  171. package/dist/policy/parser.js +3 -0
  172. package/dist/policy/parser.js.map +1 -1
  173. package/dist/proxy/server.d.ts.map +1 -1
  174. package/dist/proxy/server.js +8 -6
  175. package/dist/proxy/server.js.map +1 -1
  176. package/dist/session/manager.d.ts +2 -2
  177. package/dist/session/manager.d.ts.map +1 -1
  178. package/dist/session/manager.js +106 -88
  179. package/dist/session/manager.js.map +1 -1
  180. package/dist/session/signing.d.ts +88 -0
  181. package/dist/session/signing.d.ts.map +1 -0
  182. package/dist/session/signing.js +166 -0
  183. package/dist/session/signing.js.map +1 -0
  184. package/dist/session/types.d.ts +2 -0
  185. package/dist/session/types.d.ts.map +1 -1
  186. package/dist/session/types.js.map +1 -1
  187. package/dist/utils/security-logger.d.ts +146 -0
  188. package/dist/utils/security-logger.d.ts.map +1 -0
  189. package/dist/utils/security-logger.js +222 -0
  190. package/dist/utils/security-logger.js.map +1 -0
  191. package/dist/wizard.d.ts.map +1 -1
  192. package/dist/wizard.js +7 -1
  193. package/dist/wizard.js.map +1 -1
  194. package/package.json +3 -2
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Enhanced Terminal Approval Handler for Shell Guardian
3
+ *
4
+ * Rich terminal UI for command approval with:
5
+ * - Command explanation and risk factors
6
+ * - Affected files preview
7
+ * - Safer alternatives
8
+ * - Reversibility status
9
+ * - Quick action keys
10
+ */
11
+ import type { ApprovalHandler, ApprovalRequest, ApprovalResponse } from '../../approval/types.js';
12
+ import type { CommandPreview } from '../preview/types.js';
13
+ import type { AlternativeResult, SaferAlternative } from '../alternatives/types.js';
14
+ import type { ReversibilityAssessment } from '../reversibility/index.js';
15
+ import type { EnhancedGuardContext } from '../context/types.js';
16
+ /**
17
+ * Enhanced approval request with additional context.
18
+ */
19
+ export interface EnhancedApprovalRequest extends ApprovalRequest {
20
+ /** Command preview */
21
+ preview?: CommandPreview;
22
+ /** Safer alternatives */
23
+ alternatives?: AlternativeResult;
24
+ /** Reversibility assessment */
25
+ reversibility?: ReversibilityAssessment;
26
+ /** Enhanced context */
27
+ enhancedContext?: EnhancedGuardContext;
28
+ }
29
+ /**
30
+ * Enhanced approval response.
31
+ */
32
+ export interface EnhancedApprovalResponse extends ApprovalResponse {
33
+ /** If user chose an alternative */
34
+ chosenAlternative?: SaferAlternative;
35
+ /** Index of chosen alternative (1-based) */
36
+ chosenAlternativeIndex?: number;
37
+ }
38
+ /**
39
+ * Enhanced terminal approval handler with rich UI.
40
+ */
41
+ export declare class EnhancedTerminalApprovalHandler implements ApprovalHandler {
42
+ private readonly timeoutMs;
43
+ private rl?;
44
+ constructor(timeoutMs?: number);
45
+ /**
46
+ * Prompt user for approval with enhanced UI.
47
+ */
48
+ prompt(request: EnhancedApprovalRequest): Promise<EnhancedApprovalResponse>;
49
+ /**
50
+ * Render header.
51
+ */
52
+ private renderHeader;
53
+ /**
54
+ * Render the command with syntax highlighting.
55
+ */
56
+ private renderCommand;
57
+ /**
58
+ * Render risk assessment.
59
+ */
60
+ private renderRiskAssessment;
61
+ /**
62
+ * Format risk level with color.
63
+ */
64
+ private formatRisk;
65
+ /**
66
+ * Render context information.
67
+ */
68
+ private renderContextInfo;
69
+ /**
70
+ * Render command preview.
71
+ */
72
+ private renderPreview;
73
+ /**
74
+ * Get icon for effect type.
75
+ */
76
+ private getEffectIcon;
77
+ /**
78
+ * Render reversibility status.
79
+ */
80
+ private renderReversibility;
81
+ /**
82
+ * Get icon for reversibility level.
83
+ */
84
+ private getReversibilityIcon;
85
+ /**
86
+ * Get color function for reversibility level.
87
+ */
88
+ private getReversibilityColor;
89
+ /**
90
+ * Render safer alternatives.
91
+ */
92
+ private renderAlternatives;
93
+ /**
94
+ * Render session options.
95
+ */
96
+ private renderSessionOptions;
97
+ /**
98
+ * Prompt for user action.
99
+ */
100
+ private promptAction;
101
+ /**
102
+ * Close resources.
103
+ */
104
+ close(): void;
105
+ }
106
+ /**
107
+ * Create an enhanced terminal approval handler.
108
+ */
109
+ export declare function createEnhancedApprovalHandler(timeoutMs?: number): EnhancedTerminalApprovalHandler;
110
+ //# sourceMappingURL=enhanced-terminal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhanced-terminal.d.ts","sourceRoot":"","sources":["../../../src/guard/approval/enhanced-terminal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAElG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACpF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,eAAe;IAC9D,sBAAsB;IACtB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,yBAAyB;IACzB,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,+BAA+B;IAC/B,aAAa,CAAC,EAAE,uBAAuB,CAAC;IACxC,uBAAuB;IACvB,eAAe,CAAC,EAAE,oBAAoB,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAChE,mCAAmC;IACnC,iBAAiB,CAAC,EAAE,gBAAgB,CAAC;IACrC,4CAA4C;IAC5C,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;GAEG;AACH,qBAAa,+BAAgC,YAAW,eAAe;IACrE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,EAAE,CAAC,CAAqB;gBAEpB,SAAS,SAAQ;IAI7B;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAmCjF;;OAEG;IACH,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAqB5B;;OAEG;IACH,OAAO,CAAC,UAAU;IAiBlB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgCzB;;OAEG;IACH,OAAO,CAAC,aAAa;IAgCrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAU7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA2B1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;OAEG;YACW,YAAY;IAgI1B;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,+BAA+B,CAEjG"}
@@ -0,0 +1,387 @@
1
+ /**
2
+ * Enhanced Terminal Approval Handler for Shell Guardian
3
+ *
4
+ * Rich terminal UI for command approval with:
5
+ * - Command explanation and risk factors
6
+ * - Affected files preview
7
+ * - Safer alternatives
8
+ * - Reversibility status
9
+ * - Quick action keys
10
+ */
11
+ import chalk from 'chalk';
12
+ import * as readline from 'node:readline';
13
+ /**
14
+ * Enhanced terminal approval handler with rich UI.
15
+ */
16
+ export class EnhancedTerminalApprovalHandler {
17
+ timeoutMs;
18
+ rl;
19
+ constructor(timeoutMs = 60000) {
20
+ this.timeoutMs = timeoutMs;
21
+ }
22
+ /**
23
+ * Prompt user for approval with enhanced UI.
24
+ */
25
+ async prompt(request) {
26
+ const startTime = Date.now();
27
+ // Render the approval UI
28
+ this.renderHeader();
29
+ this.renderCommand(request);
30
+ // Build analysis result from decision
31
+ const analysis = request.decision.analysis
32
+ ? {
33
+ risk: request.decision.analysis.risk,
34
+ reason: request.decision.reason || 'Command requires review',
35
+ triggers: request.decision.analysis.triggers,
36
+ }
37
+ : undefined;
38
+ this.renderRiskAssessment(analysis);
39
+ this.renderContextInfo(request.enhancedContext);
40
+ if (request.preview) {
41
+ this.renderPreview(request.preview);
42
+ }
43
+ if (request.reversibility) {
44
+ this.renderReversibility(request.reversibility);
45
+ }
46
+ if (request.alternatives && request.alternatives.alternatives.length > 0) {
47
+ this.renderAlternatives(request.alternatives);
48
+ }
49
+ this.renderSessionOptions(request.sessionConfig);
50
+ // Get user input
51
+ return this.promptAction(request, startTime);
52
+ }
53
+ /**
54
+ * Render header.
55
+ */
56
+ renderHeader() {
57
+ console.log('');
58
+ console.log(chalk.bold.yellow(' ⚠ Command Review Required'));
59
+ console.log(chalk.dim(' ' + '─'.repeat(56)));
60
+ }
61
+ /**
62
+ * Render the command with syntax highlighting.
63
+ */
64
+ renderCommand(request) {
65
+ const command = request.context.args?.command || request.context.tool;
66
+ console.log('');
67
+ console.log(chalk.dim(' Command:'));
68
+ console.log(` ${chalk.cyan(command)}`);
69
+ // Show context info
70
+ if (request.enhancedContext?.cwd) {
71
+ console.log(chalk.dim(` in ${request.enhancedContext.cwd}`));
72
+ }
73
+ }
74
+ /**
75
+ * Render risk assessment.
76
+ */
77
+ renderRiskAssessment(analysis) {
78
+ if (!analysis)
79
+ return;
80
+ console.log('');
81
+ console.log(chalk.dim(' Risk Assessment:'));
82
+ const riskDisplay = this.formatRisk(analysis.risk);
83
+ console.log(` Level: ${riskDisplay}`);
84
+ console.log(` ${chalk.dim('Reason:')} ${analysis.reason}`);
85
+ if (analysis.triggers && analysis.triggers.length > 0) {
86
+ console.log(chalk.dim(' Triggers:'));
87
+ for (const trigger of analysis.triggers.slice(0, 3)) {
88
+ console.log(` ${chalk.red('•')} ${trigger}`);
89
+ }
90
+ if (analysis.triggers.length > 3) {
91
+ console.log(chalk.dim(` ... and ${analysis.triggers.length - 3} more`));
92
+ }
93
+ }
94
+ }
95
+ /**
96
+ * Format risk level with color.
97
+ */
98
+ formatRisk(risk) {
99
+ switch (risk) {
100
+ case 'safe':
101
+ return chalk.green('■') + ' ' + chalk.green('SAFE');
102
+ case 'read':
103
+ return chalk.blue('■') + ' ' + chalk.blue('READ');
104
+ case 'write':
105
+ return chalk.yellow('■') + ' ' + chalk.yellow('WRITE');
106
+ case 'destructive':
107
+ return chalk.red('■') + ' ' + chalk.red('DESTRUCTIVE');
108
+ case 'dangerous':
109
+ return chalk.bgRed.white(' DANGEROUS ');
110
+ default:
111
+ return risk;
112
+ }
113
+ }
114
+ /**
115
+ * Render context information.
116
+ */
117
+ renderContextInfo(context) {
118
+ if (!context)
119
+ return;
120
+ const contextItems = [];
121
+ if (context.project) {
122
+ contextItems.push(`${context.project.type} project`);
123
+ }
124
+ if (context.git?.isRepo) {
125
+ if (context.git.hasUncommittedChanges) {
126
+ contextItems.push(chalk.yellow('uncommitted changes'));
127
+ }
128
+ else {
129
+ contextItems.push('git repo');
130
+ }
131
+ }
132
+ if (context.environment?.type !== 'development') {
133
+ contextItems.push(chalk.red(context.environment?.type || 'unknown env'));
134
+ }
135
+ if (context.directory?.sensitivity && context.directory.sensitivity >= 50) {
136
+ contextItems.push(chalk.yellow('sensitive directory'));
137
+ }
138
+ if (contextItems.length > 0) {
139
+ console.log('');
140
+ console.log(chalk.dim(' Context:'));
141
+ console.log(` ${contextItems.join(' • ')}`);
142
+ }
143
+ }
144
+ /**
145
+ * Render command preview.
146
+ */
147
+ renderPreview(preview) {
148
+ console.log('');
149
+ console.log(chalk.dim(' What this will do:'));
150
+ for (const effect of preview.effects.slice(0, 3)) {
151
+ const icon = this.getEffectIcon(effect.type);
152
+ const targets = effect.expandedTargets || effect.targets;
153
+ const targetCount = targets.length;
154
+ console.log(` ${icon} ${effect.description}`);
155
+ // Show first few targets
156
+ const showCount = Math.min(3, targetCount);
157
+ for (let i = 0; i < showCount; i++) {
158
+ const target = targets[i];
159
+ // Truncate long paths
160
+ const displayPath = target.length > 45
161
+ ? '...' + target.slice(-42)
162
+ : target;
163
+ console.log(chalk.dim(` ${displayPath}`));
164
+ }
165
+ if (targetCount > showCount) {
166
+ console.log(chalk.dim(` ... and ${targetCount - showCount} more`));
167
+ }
168
+ }
169
+ // Show impact summary
170
+ console.log('');
171
+ console.log(` ${chalk.dim('Impact:')} ${preview.impact.summary}`);
172
+ }
173
+ /**
174
+ * Get icon for effect type.
175
+ */
176
+ getEffectIcon(type) {
177
+ switch (type) {
178
+ case 'delete': return '🗑️ ';
179
+ case 'modify': return '✏️ ';
180
+ case 'create': return '📄';
181
+ case 'read': return '👁️ ';
182
+ case 'execute': return '⚡';
183
+ case 'network': return '🌐';
184
+ case 'permission': return '🔒';
185
+ case 'process': return '⚙️ ';
186
+ default: return '❓';
187
+ }
188
+ }
189
+ /**
190
+ * Render reversibility status.
191
+ */
192
+ renderReversibility(assessment) {
193
+ console.log('');
194
+ const icon = this.getReversibilityIcon(assessment.level);
195
+ const color = this.getReversibilityColor(assessment.level);
196
+ console.log(chalk.dim(' Reversibility:'));
197
+ console.log(` ${icon} ${color(assessment.level.replace(/-/g, ' '))} (${assessment.score}%)`);
198
+ if (assessment.reverseInstructions) {
199
+ console.log(chalk.dim(` How to undo: ${assessment.reverseInstructions}`));
200
+ }
201
+ if (assessment.potentialLoss) {
202
+ console.log(chalk.yellow(` ⚠ ${assessment.potentialLoss}`));
203
+ }
204
+ }
205
+ /**
206
+ * Get icon for reversibility level.
207
+ */
208
+ getReversibilityIcon(level) {
209
+ switch (level) {
210
+ case 'fully-reversible': return '↩️ ';
211
+ case 'partially-reversible': return '⚠️ ';
212
+ case 'difficult-to-reverse': return '🔶';
213
+ case 'irreversible': return '⛔';
214
+ default: return '❓';
215
+ }
216
+ }
217
+ /**
218
+ * Get color function for reversibility level.
219
+ */
220
+ getReversibilityColor(level) {
221
+ switch (level) {
222
+ case 'fully-reversible': return chalk.green;
223
+ case 'partially-reversible': return chalk.yellow;
224
+ case 'difficult-to-reverse': return chalk.yellow;
225
+ case 'irreversible': return chalk.red;
226
+ default: return (s) => s;
227
+ }
228
+ }
229
+ /**
230
+ * Render safer alternatives.
231
+ */
232
+ renderAlternatives(result) {
233
+ if (result.alternatives.length === 0)
234
+ return;
235
+ console.log('');
236
+ console.log(chalk.dim(' Safer alternatives:'));
237
+ const maxShow = Math.min(3, result.alternatives.length);
238
+ for (let i = 0; i < maxShow; i++) {
239
+ const alt = result.alternatives[i];
240
+ const num = chalk.cyan(`[${i + 1}]`);
241
+ const reversible = alt.reversible
242
+ ? chalk.green('↩')
243
+ : chalk.red('⚠');
244
+ console.log(` ${num} ${chalk.green(alt.command)}`);
245
+ console.log(chalk.dim(` ${alt.reason} ${reversible}`));
246
+ if (alt.requiresTool) {
247
+ console.log(chalk.dim(` Requires: ${alt.requiresTool}`));
248
+ }
249
+ }
250
+ if (result.alternatives.length > maxShow) {
251
+ console.log(chalk.dim(` ... ${result.alternatives.length - maxShow} more alternatives available`));
252
+ }
253
+ }
254
+ /**
255
+ * Render session options.
256
+ */
257
+ renderSessionOptions(config) {
258
+ if (!config?.allowRemember)
259
+ return;
260
+ console.log('');
261
+ console.log(chalk.dim(' Remember options: once, 5min, 15min, session'));
262
+ }
263
+ /**
264
+ * Prompt for user action.
265
+ */
266
+ async promptAction(request, startTime) {
267
+ console.log('');
268
+ console.log(chalk.dim(' ' + '─'.repeat(56)));
269
+ // Build action options
270
+ const hasAlternatives = request.alternatives && request.alternatives.alternatives.length > 0;
271
+ const altCount = hasAlternatives ? request.alternatives.alternatives.length : 0;
272
+ console.log('');
273
+ console.log(' ' + chalk.green('[y]') + ' Allow ' +
274
+ chalk.red('[n]') + ' Deny ' +
275
+ (hasAlternatives ? chalk.cyan(`[1-${Math.min(altCount, 9)}]`) + ' Alternative ' : '') +
276
+ chalk.yellow('[r]') + ' Remember');
277
+ console.log('');
278
+ const createResponse = (result, extras) => ({
279
+ result,
280
+ respondedAt: new Date(),
281
+ durationMs: Date.now() - startTime,
282
+ ...extras,
283
+ });
284
+ return new Promise((resolve) => {
285
+ // Create readline interface
286
+ this.rl = readline.createInterface({
287
+ input: process.stdin,
288
+ output: process.stdout,
289
+ terminal: false,
290
+ });
291
+ // Set timeout
292
+ const timeout = setTimeout(() => {
293
+ this.rl?.close();
294
+ console.log(chalk.yellow('\n ⏱ Approval timed out'));
295
+ resolve(createResponse('timeout'));
296
+ }, this.timeoutMs);
297
+ // Read input from /dev/tty for proper terminal handling
298
+ const tty = require('node:fs').createReadStream('/dev/tty');
299
+ const ttyRl = readline.createInterface({
300
+ input: tty,
301
+ output: process.stdout,
302
+ });
303
+ const handleInput = (answer) => {
304
+ clearTimeout(timeout);
305
+ ttyRl.close();
306
+ tty.destroy();
307
+ const input = answer.trim().toLowerCase();
308
+ // Check for alternative selection
309
+ if (hasAlternatives) {
310
+ const altNum = parseInt(input, 10);
311
+ if (!isNaN(altNum) && altNum >= 1 && altNum <= altCount) {
312
+ const chosen = request.alternatives.alternatives[altNum - 1];
313
+ console.log(chalk.green(` ✓ Using alternative: ${chosen.command}`));
314
+ resolve(createResponse('approved', {
315
+ chosenAlternative: chosen,
316
+ chosenAlternativeIndex: altNum,
317
+ }));
318
+ return;
319
+ }
320
+ }
321
+ // Handle standard responses
322
+ switch (input) {
323
+ case 'y':
324
+ case 'yes':
325
+ console.log(chalk.green(' ✓ Approved'));
326
+ resolve(createResponse('approved'));
327
+ break;
328
+ case 'n':
329
+ case 'no':
330
+ console.log(chalk.red(' ✗ Denied'));
331
+ resolve(createResponse('denied'));
332
+ break;
333
+ case 'r':
334
+ case 'r5':
335
+ case 'r 5min':
336
+ console.log(chalk.yellow(' ✓ Approved and remembered for 5 minutes'));
337
+ resolve(createResponse('approved', {
338
+ sessionGrant: {
339
+ scope: request.sessionConfig?.defaultScope || 'tool',
340
+ duration: '5min',
341
+ },
342
+ }));
343
+ break;
344
+ case 'r15':
345
+ case 'r 15min':
346
+ console.log(chalk.yellow(' ✓ Approved and remembered for 15 minutes'));
347
+ resolve(createResponse('approved', {
348
+ sessionGrant: {
349
+ scope: request.sessionConfig?.defaultScope || 'tool',
350
+ duration: '15min',
351
+ },
352
+ }));
353
+ break;
354
+ case 'rs':
355
+ case 'r session':
356
+ console.log(chalk.yellow(' ✓ Approved for this session'));
357
+ resolve(createResponse('approved', {
358
+ sessionGrant: {
359
+ scope: request.sessionConfig?.defaultScope || 'tool',
360
+ duration: 'session',
361
+ },
362
+ }));
363
+ break;
364
+ default:
365
+ // Invalid input, treat as deny for safety
366
+ console.log(chalk.red(' ✗ Invalid input, denying for safety'));
367
+ resolve(createResponse('denied'));
368
+ }
369
+ };
370
+ process.stdout.write(' > ');
371
+ ttyRl.once('line', handleInput);
372
+ });
373
+ }
374
+ /**
375
+ * Close resources.
376
+ */
377
+ close() {
378
+ this.rl?.close();
379
+ }
380
+ }
381
+ /**
382
+ * Create an enhanced terminal approval handler.
383
+ */
384
+ export function createEnhancedApprovalHandler(timeoutMs) {
385
+ return new EnhancedTerminalApprovalHandler(timeoutMs);
386
+ }
387
+ //# sourceMappingURL=enhanced-terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhanced-terminal.js","sourceRoot":"","sources":["../../../src/guard/approval/enhanced-terminal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Guard Configuration
3
+ *
4
+ * Handles loading and validation of guard configuration from:
5
+ * 1. ~/.config/tollgate/guard.yaml (user config)
6
+ * 2. ./tollgate.yaml (project config)
7
+ * 3. CLI options (highest priority)
8
+ */
9
+ import type { GuardConfig, RiskActionMapping, GuardSessionConfig, GuardFastPathConfig, GuardAuditConfig, GuardUIConfig, GuardRule, DenyPattern } from './types.js';
10
+ /**
11
+ * Default risk action mapping.
12
+ *
13
+ * - safe/read: Allow without prompt (common dev commands)
14
+ * - write: Prompt for approval (file modifications)
15
+ * - destructive: Prompt for approval (deletions, overwrites)
16
+ * - dangerous: Always deny (system damage potential)
17
+ */
18
+ export declare const DEFAULT_RISK_ACTIONS: RiskActionMapping;
19
+ /**
20
+ * Default session configuration.
21
+ */
22
+ export declare const DEFAULT_SESSION_CONFIG: GuardSessionConfig;
23
+ /**
24
+ * Default fast path configuration.
25
+ *
26
+ * These command prefixes skip analysis entirely for performance.
27
+ * Only truly safe, read-only commands should be included.
28
+ */
29
+ export declare const DEFAULT_FAST_PATH_CONFIG: GuardFastPathConfig;
30
+ /**
31
+ * Default audit configuration.
32
+ */
33
+ export declare const DEFAULT_AUDIT_CONFIG: GuardAuditConfig;
34
+ /**
35
+ * Default UI configuration.
36
+ */
37
+ export declare const DEFAULT_UI_CONFIG: GuardUIConfig;
38
+ /**
39
+ * Complete default guard configuration.
40
+ */
41
+ export declare const DEFAULT_GUARD_CONFIG: GuardConfig;
42
+ /**
43
+ * Configuration file paths in order of precedence (lowest to highest).
44
+ */
45
+ export declare function getConfigPaths(): string[];
46
+ /**
47
+ * Load guard configuration from a YAML file.
48
+ */
49
+ export declare function loadConfigFromFile(path: string): Partial<GuardConfig> | null;
50
+ /**
51
+ * Load and merge guard configuration from all sources.
52
+ *
53
+ * Priority (lowest to highest):
54
+ * 1. Default configuration
55
+ * 2. User config (~/.config/tollgate/guard.yaml)
56
+ * 3. Project config (./tollgate.yaml)
57
+ * 4. CLI options (passed via overrides)
58
+ */
59
+ export declare function loadGuardConfig(overrides?: Partial<GuardConfig>): GuardConfig;
60
+ /**
61
+ * Validate guard configuration.
62
+ */
63
+ export declare function validateGuardConfig(config: GuardConfig): string[];
64
+ /**
65
+ * Compile rules into executable form (pre-compile regex patterns).
66
+ */
67
+ export interface CompiledRule extends Omit<GuardRule, 'pattern'> {
68
+ pattern: RegExp;
69
+ originalPattern: string;
70
+ }
71
+ export declare function compileRules(rules: GuardRule[]): CompiledRule[];
72
+ /**
73
+ * Compile denylist into executable form.
74
+ */
75
+ export interface CompiledDenyPattern extends Omit<DenyPattern, 'pattern'> {
76
+ pattern: RegExp;
77
+ originalPattern: string;
78
+ }
79
+ export declare function compileDenylist(denylist: DenyPattern[]): CompiledDenyPattern[];
80
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/guard/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,iBAMlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,kBAKpC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,EAAE,mBA0BtC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,gBAIlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,aAM/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAUlC,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAgBzC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAmB5E;AAmCD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAkB7E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAwDjE;AAED;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,YAAY,EAAE,CAQ/D;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,mBAAmB,EAAE,CAM9E"}