codevf 1.0.0 → 1.0.1

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 (199) hide show
  1. package/LICENSE +30 -21
  2. package/README.md +6 -1
  3. package/bin/codevf-mcp.js +11 -0
  4. package/dist/commands/fix.d.ts +5 -1
  5. package/dist/commands/fix.d.ts.map +1 -1
  6. package/dist/commands/fix.js +170 -13
  7. package/dist/commands/fix.js.map +1 -1
  8. package/dist/commands/init.d.ts.map +1 -1
  9. package/dist/commands/init.js +72 -2
  10. package/dist/commands/init.js.map +1 -1
  11. package/dist/commands/mcp-tools.d.ts +17 -0
  12. package/dist/commands/mcp-tools.d.ts.map +1 -0
  13. package/dist/commands/mcp-tools.js +237 -0
  14. package/dist/commands/mcp-tools.js.map +1 -0
  15. package/dist/commands/setup.d.ts +8 -0
  16. package/dist/commands/setup.d.ts.map +1 -0
  17. package/dist/commands/setup.js +250 -0
  18. package/dist/commands/setup.js.map +1 -0
  19. package/dist/commands/welcome.d.ts +9 -0
  20. package/dist/commands/welcome.d.ts.map +1 -0
  21. package/dist/commands/welcome.js +175 -0
  22. package/dist/commands/welcome.js.map +1 -0
  23. package/dist/index.js +194 -149
  24. package/dist/index.js.map +1 -1
  25. package/dist/lib/api/client.d.ts +28 -0
  26. package/dist/lib/api/client.d.ts.map +1 -0
  27. package/dist/lib/api/client.js +66 -0
  28. package/dist/lib/api/client.js.map +1 -0
  29. package/dist/lib/api/tasks.d.ts +36 -0
  30. package/dist/lib/api/tasks.d.ts.map +1 -0
  31. package/dist/lib/api/tasks.js +62 -0
  32. package/dist/lib/api/tasks.js.map +1 -0
  33. package/dist/lib/api/websocket.d.ts +50 -0
  34. package/dist/lib/api/websocket.d.ts.map +1 -0
  35. package/dist/lib/api/websocket.js +153 -0
  36. package/dist/lib/api/websocket.js.map +1 -0
  37. package/dist/lib/auth/oauth-flow.d.ts +37 -0
  38. package/dist/lib/auth/oauth-flow.d.ts.map +1 -0
  39. package/dist/lib/auth/oauth-flow.js +119 -0
  40. package/dist/lib/auth/oauth-flow.js.map +1 -0
  41. package/dist/lib/auth/token-manager.d.ts +26 -0
  42. package/dist/lib/auth/token-manager.d.ts.map +1 -0
  43. package/dist/lib/auth/token-manager.js +87 -0
  44. package/dist/lib/auth/token-manager.js.map +1 -0
  45. package/dist/lib/config/manager.d.ts +50 -0
  46. package/dist/lib/config/manager.d.ts.map +1 -0
  47. package/dist/lib/config/manager.js +84 -0
  48. package/dist/lib/config/manager.js.map +1 -0
  49. package/dist/lib/utils/errors.d.ts +28 -0
  50. package/dist/lib/utils/errors.d.ts.map +1 -0
  51. package/dist/lib/utils/errors.js +44 -0
  52. package/dist/lib/utils/errors.js.map +1 -0
  53. package/dist/lib/utils/logger.d.ts +20 -0
  54. package/dist/lib/utils/logger.d.ts.map +1 -0
  55. package/dist/lib/utils/logger.js +40 -0
  56. package/dist/lib/utils/logger.js.map +1 -0
  57. package/dist/mcp/index.d.ts +7 -0
  58. package/dist/mcp/index.d.ts.map +1 -0
  59. package/dist/mcp/index.js +158 -0
  60. package/dist/mcp/index.js.map +1 -0
  61. package/dist/mcp/tools/chat.d.ts +30 -0
  62. package/dist/mcp/tools/chat.d.ts.map +1 -0
  63. package/dist/mcp/tools/chat.js +82 -0
  64. package/dist/mcp/tools/chat.js.map +1 -0
  65. package/dist/mcp/tools/instant.d.ts +36 -0
  66. package/dist/mcp/tools/instant.d.ts.map +1 -0
  67. package/dist/mcp/tools/instant.js +100 -0
  68. package/dist/mcp/tools/instant.js.map +1 -0
  69. package/dist/modules/aiAgent.d.ts +75 -0
  70. package/dist/modules/aiAgent.d.ts.map +1 -0
  71. package/dist/modules/aiAgent.js +707 -0
  72. package/dist/modules/aiAgent.js.map +1 -0
  73. package/dist/modules/api.d.ts +7 -0
  74. package/dist/modules/api.d.ts.map +1 -1
  75. package/dist/modules/api.js +13 -4
  76. package/dist/modules/api.js.map +1 -1
  77. package/dist/modules/commandHandler.d.ts +40 -0
  78. package/dist/modules/commandHandler.d.ts.map +1 -0
  79. package/dist/modules/commandHandler.js +345 -0
  80. package/dist/modules/commandHandler.js.map +1 -0
  81. package/dist/modules/config.d.ts +2 -0
  82. package/dist/modules/config.d.ts.map +1 -1
  83. package/dist/modules/config.js +9 -0
  84. package/dist/modules/config.js.map +1 -1
  85. package/dist/modules/constants.d.ts +83 -0
  86. package/dist/modules/constants.d.ts.map +1 -0
  87. package/dist/modules/constants.js +75 -0
  88. package/dist/modules/constants.js.map +1 -0
  89. package/dist/modules/permissions.d.ts +14 -0
  90. package/dist/modules/permissions.d.ts.map +1 -1
  91. package/dist/modules/permissions.js +94 -0
  92. package/dist/modules/permissions.js.map +1 -1
  93. package/dist/modules/toolRegistry.d.ts +50 -0
  94. package/dist/modules/toolRegistry.d.ts.map +1 -0
  95. package/dist/modules/toolRegistry.js +114 -0
  96. package/dist/modules/toolRegistry.js.map +1 -0
  97. package/dist/modules/tunnel.d.ts +33 -0
  98. package/dist/modules/tunnel.d.ts.map +1 -0
  99. package/dist/modules/tunnel.js +79 -0
  100. package/dist/modules/tunnel.js.map +1 -0
  101. package/dist/modules/vibeHelper.d.ts +16 -0
  102. package/dist/modules/vibeHelper.d.ts.map +1 -0
  103. package/dist/modules/vibeHelper.js +38 -0
  104. package/dist/modules/vibeHelper.js.map +1 -0
  105. package/dist/modules/websocket.d.ts +9 -0
  106. package/dist/modules/websocket.d.ts.map +1 -1
  107. package/dist/modules/websocket.js +70 -0
  108. package/dist/modules/websocket.js.map +1 -1
  109. package/dist/tools/consultEngineer.d.ts +13 -0
  110. package/dist/tools/consultEngineer.d.ts.map +1 -0
  111. package/dist/tools/consultEngineer.js +161 -0
  112. package/dist/tools/consultEngineer.js.map +1 -0
  113. package/dist/tools/realtimeChat.d.ts +9 -0
  114. package/dist/tools/realtimeChat.d.ts.map +1 -0
  115. package/dist/tools/realtimeChat.js +101 -0
  116. package/dist/tools/realtimeChat.js.map +1 -0
  117. package/dist/types/index.d.ts +183 -0
  118. package/dist/types/index.d.ts.map +1 -1
  119. package/dist/types/index.js.map +1 -1
  120. package/dist/ui/InteractiveApp.d.ts +13 -0
  121. package/dist/ui/InteractiveApp.d.ts.map +1 -0
  122. package/dist/ui/InteractiveApp.js +84 -0
  123. package/dist/ui/InteractiveApp.js.map +1 -0
  124. package/dist/ui/InteractivePrompt.d.ts +53 -0
  125. package/dist/ui/InteractivePrompt.d.ts.map +1 -0
  126. package/dist/ui/InteractivePrompt.js +422 -0
  127. package/dist/ui/InteractivePrompt.js.map +1 -0
  128. package/dist/ui/LiveSession.d.ts +2 -0
  129. package/dist/ui/LiveSession.d.ts.map +1 -1
  130. package/dist/ui/LiveSession.js +461 -180
  131. package/dist/ui/LiveSession.js.map +1 -1
  132. package/dist/ui/PromptInput.d.ts +14 -0
  133. package/dist/ui/PromptInput.d.ts.map +1 -0
  134. package/dist/ui/PromptInput.js +206 -0
  135. package/dist/ui/PromptInput.js.map +1 -0
  136. package/dist/ui/SessionUI.d.ts +40 -0
  137. package/dist/ui/SessionUI.d.ts.map +1 -0
  138. package/dist/ui/SessionUI.js +227 -0
  139. package/dist/ui/SessionUI.js.map +1 -0
  140. package/dist/ui/input/Command.d.ts +22 -0
  141. package/dist/ui/input/Command.d.ts.map +1 -0
  142. package/dist/ui/input/Command.js +30 -0
  143. package/dist/ui/input/Command.js.map +1 -0
  144. package/dist/ui/input/CustomInput.d.ts +15 -0
  145. package/dist/ui/input/CustomInput.d.ts.map +1 -0
  146. package/dist/ui/input/CustomInput.js +182 -0
  147. package/dist/ui/input/CustomInput.js.map +1 -0
  148. package/dist/ui/input/handlers/handleCursor.d.ts +22 -0
  149. package/dist/ui/input/handlers/handleCursor.d.ts.map +1 -0
  150. package/dist/ui/input/handlers/handleCursor.js +53 -0
  151. package/dist/ui/input/handlers/handleCursor.js.map +1 -0
  152. package/dist/ui/input/handlers/handleEdit.d.ts +18 -0
  153. package/dist/ui/input/handlers/handleEdit.d.ts.map +1 -0
  154. package/dist/ui/input/handlers/handleEdit.js +55 -0
  155. package/dist/ui/input/handlers/handleEdit.js.map +1 -0
  156. package/dist/ui/input/handlers/handleHistory.d.ts +18 -0
  157. package/dist/ui/input/handlers/handleHistory.d.ts.map +1 -0
  158. package/dist/ui/input/handlers/handleHistory.js +85 -0
  159. package/dist/ui/input/handlers/handleHistory.js.map +1 -0
  160. package/dist/ui/input/handlers/handlePaste.d.ts +19 -0
  161. package/dist/ui/input/handlers/handlePaste.d.ts.map +1 -0
  162. package/dist/ui/input/handlers/handlePaste.js +49 -0
  163. package/dist/ui/input/handlers/handlePaste.js.map +1 -0
  164. package/dist/ui/input/handlers/handleSubmit.d.ts +18 -0
  165. package/dist/ui/input/handlers/handleSubmit.d.ts.map +1 -0
  166. package/dist/ui/input/handlers/handleSubmit.js +39 -0
  167. package/dist/ui/input/handlers/handleSubmit.js.map +1 -0
  168. package/dist/ui/input/helpers.d.ts +4 -0
  169. package/dist/ui/input/helpers.d.ts.map +1 -0
  170. package/dist/ui/input/helpers.js +13 -0
  171. package/dist/ui/input/helpers.js.map +1 -0
  172. package/dist/ui/input/keyMatchers.d.ts +14 -0
  173. package/dist/ui/input/keyMatchers.d.ts.map +1 -0
  174. package/dist/ui/input/keyMatchers.js +49 -0
  175. package/dist/ui/input/keyMatchers.js.map +1 -0
  176. package/dist/ui/input/types.d.ts +33 -0
  177. package/dist/ui/input/types.d.ts.map +1 -0
  178. package/dist/ui/input/types.js +2 -0
  179. package/dist/ui/input/types.js.map +1 -0
  180. package/dist/ui/promptWithModes.d.ts +12 -0
  181. package/dist/ui/promptWithModes.d.ts.map +1 -0
  182. package/dist/ui/promptWithModes.js +24 -0
  183. package/dist/ui/promptWithModes.js.map +1 -0
  184. package/dist/ui/renderPrompt.d.ts +12 -0
  185. package/dist/ui/renderPrompt.d.ts.map +1 -0
  186. package/dist/ui/renderPrompt.js +14 -0
  187. package/dist/ui/renderPrompt.js.map +1 -0
  188. package/dist/ui/simplePrompt.d.ts +7 -0
  189. package/dist/ui/simplePrompt.d.ts.map +1 -0
  190. package/dist/ui/simplePrompt.js +38 -0
  191. package/dist/ui/simplePrompt.js.map +1 -0
  192. package/dist/ui/spinner.d.ts +7 -0
  193. package/dist/ui/spinner.d.ts.map +1 -0
  194. package/dist/ui/spinner.js +13 -0
  195. package/dist/ui/spinner.js.map +1 -0
  196. package/package.json +36 -25
  197. package/ARCHITECTURE.md +0 -285
  198. package/BUILD_SUMMARY.md +0 -340
  199. package/QUICKSTART.md +0 -180
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Application-wide constants and configuration values
3
+ */
4
+ export declare const CLI_VERSION = "1.0.0";
5
+ /**
6
+ * Paste detection configuration
7
+ */
8
+ export declare const PASTE_DETECTION: {
9
+ /** Keys arriving faster than this threshold (ms) are likely pasted */
10
+ readonly THRESHOLD_MS: 10;
11
+ /** Gap to treat paste as ended for non-bracketed paste mode (ms) */
12
+ readonly GAP_MS: 500;
13
+ /** Block return key processing for this duration after text input (ms) */
14
+ readonly BLOCK_RETURNS_MS: 100;
15
+ /** Extended block period for paste mode (ms) */
16
+ readonly EXTENDED_BLOCK_MS: 1000;
17
+ /** Additional block period after paste end (ms) */
18
+ readonly POST_PASTE_BLOCK_MS: 200;
19
+ };
20
+ /**
21
+ * Keyboard input configuration
22
+ */
23
+ export declare const KEYBOARD: {
24
+ /** Double Ctrl+C timeout window (ms) */
25
+ readonly CTRL_C_TIMEOUT_MS: 1000;
26
+ /** Rapid key detection threshold for paste (ms) */
27
+ readonly RAPID_KEY_THRESHOLD_MS: 30;
28
+ };
29
+ /**
30
+ * Credit and billing configuration
31
+ */
32
+ export declare const CREDITS: {
33
+ /** Human engineer rate (credits per minute) */
34
+ readonly HUMAN_RATE_PER_MIN: 2;
35
+ /** Default max credits for hybrid fallback */
36
+ readonly DEFAULT_HYBRID_MAX: 10;
37
+ /** Vibe mode consultation credits */
38
+ readonly VIBE_CONSULTATION: 3;
39
+ /** Minimum allowed max credits */
40
+ readonly MIN_MAX_CREDITS: 1;
41
+ /** Maximum allowed max credits */
42
+ readonly MAX_MAX_CREDITS: 100;
43
+ };
44
+ /**
45
+ * UI rendering configuration
46
+ */
47
+ export declare const UI: {
48
+ /** Mode indicator text width calculation offset */
49
+ readonly MODE_INDICATOR_WIDTH: 2;
50
+ /** Prompt separator width */
51
+ readonly PROMPT_SEPARATOR_WIDTH: 3;
52
+ /** Box drawing width for headers */
53
+ readonly BOX_WIDTH: 60;
54
+ };
55
+ /**
56
+ * Mode labels for display
57
+ */
58
+ export declare const MODE_LABELS: {
59
+ readonly hybrid: "[Hybrid]";
60
+ readonly ai: "[AI]";
61
+ readonly human: "[Human]";
62
+ readonly build: "[Build]";
63
+ readonly plan: "[Plan]";
64
+ };
65
+ /**
66
+ * Command prefixes
67
+ */
68
+ export declare const COMMAND_PREFIXES: {
69
+ readonly SLASH: "/";
70
+ readonly HELP_COMMANDS: readonly ["/?", "/help", "/commands"];
71
+ readonly MODE_COMMANDS: readonly ["/hybrid", "/ai", "/human", "/build", "/plan"];
72
+ readonly EXIT_COMMANDS: readonly ["/exit", "/quit"];
73
+ readonly SHELL_RESUME_COMMANDS: readonly ["/resume", "/session", "/codevf"];
74
+ };
75
+ /**
76
+ * Agent mode types
77
+ */
78
+ export type AgentMode = 'build' | 'plan';
79
+ /**
80
+ * Routing mode types
81
+ */
82
+ export type RoutingMode = 'ai' | 'human' | 'hybrid';
83
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/modules/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC;;GAEG;AACH,eAAO,MAAM,eAAe;IAC1B,sEAAsE;;IAEtE,oEAAoE;;IAEpE,0EAA0E;;IAE1E,gDAAgD;;IAEhD,mDAAmD;;CAE3C,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,QAAQ;IACnB,wCAAwC;;IAExC,mDAAmD;;CAE3C,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,OAAO;IAClB,+CAA+C;;IAE/C,8CAA8C;;IAE9C,qCAAqC;;IAErC,kCAAkC;;IAElC,kCAAkC;;CAE1B,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,EAAE;IACb,mDAAmD;;IAEnD,6BAA6B;;IAE7B,oCAAoC;;CAE5B,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;CAMd,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;CAMnB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAEzC;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Application-wide constants and configuration values
3
+ */
4
+ export const CLI_VERSION = '1.0.0';
5
+ /**
6
+ * Paste detection configuration
7
+ */
8
+ export const PASTE_DETECTION = {
9
+ /** Keys arriving faster than this threshold (ms) are likely pasted */
10
+ THRESHOLD_MS: 10,
11
+ /** Gap to treat paste as ended for non-bracketed paste mode (ms) */
12
+ GAP_MS: 500,
13
+ /** Block return key processing for this duration after text input (ms) */
14
+ BLOCK_RETURNS_MS: 100,
15
+ /** Extended block period for paste mode (ms) */
16
+ EXTENDED_BLOCK_MS: 1000,
17
+ /** Additional block period after paste end (ms) */
18
+ POST_PASTE_BLOCK_MS: 200,
19
+ };
20
+ /**
21
+ * Keyboard input configuration
22
+ */
23
+ export const KEYBOARD = {
24
+ /** Double Ctrl+C timeout window (ms) */
25
+ CTRL_C_TIMEOUT_MS: 1000,
26
+ /** Rapid key detection threshold for paste (ms) */
27
+ RAPID_KEY_THRESHOLD_MS: 30,
28
+ };
29
+ /**
30
+ * Credit and billing configuration
31
+ */
32
+ export const CREDITS = {
33
+ /** Human engineer rate (credits per minute) */
34
+ HUMAN_RATE_PER_MIN: 2,
35
+ /** Default max credits for hybrid fallback */
36
+ DEFAULT_HYBRID_MAX: 10,
37
+ /** Vibe mode consultation credits */
38
+ VIBE_CONSULTATION: 3,
39
+ /** Minimum allowed max credits */
40
+ MIN_MAX_CREDITS: 1,
41
+ /** Maximum allowed max credits */
42
+ MAX_MAX_CREDITS: 100,
43
+ };
44
+ /**
45
+ * UI rendering configuration
46
+ */
47
+ export const UI = {
48
+ /** Mode indicator text width calculation offset */
49
+ MODE_INDICATOR_WIDTH: 2,
50
+ /** Prompt separator width */
51
+ PROMPT_SEPARATOR_WIDTH: 3,
52
+ /** Box drawing width for headers */
53
+ BOX_WIDTH: 60,
54
+ };
55
+ /**
56
+ * Mode labels for display
57
+ */
58
+ export const MODE_LABELS = {
59
+ hybrid: '[Hybrid]',
60
+ ai: '[AI]',
61
+ human: '[Human]',
62
+ build: '[Build]',
63
+ plan: '[Plan]',
64
+ };
65
+ /**
66
+ * Command prefixes
67
+ */
68
+ export const COMMAND_PREFIXES = {
69
+ SLASH: '/',
70
+ HELP_COMMANDS: ['/?', '/help', '/commands'],
71
+ MODE_COMMANDS: ['/hybrid', '/ai', '/human', '/build', '/plan'],
72
+ EXIT_COMMANDS: ['/exit', '/quit'],
73
+ SHELL_RESUME_COMMANDS: ['/resume', '/session', '/codevf'],
74
+ };
75
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/modules/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,sEAAsE;IACtE,YAAY,EAAE,EAAE;IAChB,oEAAoE;IACpE,MAAM,EAAE,GAAG;IACX,0EAA0E;IAC1E,gBAAgB,EAAE,GAAG;IACrB,gDAAgD;IAChD,iBAAiB,EAAE,IAAI;IACvB,mDAAmD;IACnD,mBAAmB,EAAE,GAAG;CAChB,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,wCAAwC;IACxC,iBAAiB,EAAE,IAAI;IACvB,mDAAmD;IACnD,sBAAsB,EAAE,EAAE;CAClB,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,+CAA+C;IAC/C,kBAAkB,EAAE,CAAC;IACrB,8CAA8C;IAC9C,kBAAkB,EAAE,EAAE;IACtB,qCAAqC;IACrC,iBAAiB,EAAE,CAAC;IACpB,kCAAkC;IAClC,eAAe,EAAE,CAAC;IAClB,kCAAkC;IAClC,eAAe,EAAE,GAAG;CACZ,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,mDAAmD;IACnD,oBAAoB,EAAE,CAAC;IACvB,6BAA6B;IAC7B,sBAAsB,EAAE,CAAC;IACzB,oCAAoC;IACpC,SAAS,EAAE,EAAE;CACL,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM,EAAE,UAAU;IAClB,EAAE,EAAE,MAAM;IACV,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,QAAQ;CACN,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,KAAK,EAAE,GAAG;IACV,aAAa,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC;IAC3C,aAAa,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC;IAC9D,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;IACjC,qBAAqB,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC;CACjD,CAAC"}
@@ -1,5 +1,19 @@
1
+ import { TunnelManager } from './tunnel.js';
1
2
  export declare class PermissionManager {
2
3
  requestCommandPermission(command: string, reason?: string): Promise<boolean>;
3
4
  requestFilePermission(filePath: string, reason?: string): Promise<boolean>;
5
+ requestTunnelPermission(port: number, reason?: string): Promise<boolean>;
6
+ /**
7
+ * Handle tunnel request with full lifecycle management
8
+ */
9
+ handleTunnelRequest(port: number, reason: string, taskId: string, tunnelManager: TunnelManager): Promise<{
10
+ approved: boolean;
11
+ tunnelUrl?: string;
12
+ error?: string;
13
+ }>;
14
+ /**
15
+ * Check if a port is available/accessible
16
+ */
17
+ private checkPortAvailable;
4
18
  }
5
19
  //# sourceMappingURL=permissions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/modules/permissions.ts"],"names":[],"mappings":"AAIA,qBAAa,iBAAiB;IACtB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB5E,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CA0BjF"}
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/modules/permissions.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,qBAAa,iBAAiB;IACtB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB5E,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2B1E,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB9E;;OAEG;IACG,mBAAmB,CACvB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA2DrE;;OAEG;YACW,kBAAkB;CAsBjC"}
@@ -1,6 +1,7 @@
1
1
  import prompts from 'prompts';
2
2
  import chalk from 'chalk';
3
3
  import { shouldWarnAboutFile } from '../utils/upload.js';
4
+ import net from 'net';
4
5
  export class PermissionManager {
5
6
  async requestCommandPermission(command, reason) {
6
7
  console.log('\n' + chalk.yellow('━'.repeat(60)));
@@ -38,5 +39,98 @@ export class PermissionManager {
38
39
  });
39
40
  return response.approved ?? false;
40
41
  }
42
+ async requestTunnelPermission(port, reason) {
43
+ console.log('\n' + chalk.yellow('━'.repeat(60)));
44
+ console.log(chalk.bold.yellow('Engineer requests to open a tunnel'));
45
+ console.log(chalk.white(` Local port: ${port}`));
46
+ if (reason) {
47
+ console.log(chalk.dim(` Reason: ${reason}`));
48
+ }
49
+ console.log(chalk.yellow('━'.repeat(60)));
50
+ const response = await prompts({
51
+ type: 'confirm',
52
+ name: 'approved',
53
+ message: `Expose port ${port} over the internet?`,
54
+ initial: false,
55
+ });
56
+ return response.approved ?? false;
57
+ }
58
+ /**
59
+ * Handle tunnel request with full lifecycle management
60
+ */
61
+ async handleTunnelRequest(port, reason, taskId, tunnelManager) {
62
+ // Display permission prompt
63
+ console.log('\n' + chalk.yellow('┌─────────────────────────────────────────┐'));
64
+ console.log(chalk.yellow('│ Engineer requests tunnel access: │'));
65
+ console.log(chalk.white(`│ Port: ${port} │`));
66
+ console.log(chalk.dim(`│ Reason: ${reason.padEnd(34)}│`));
67
+ console.log(chalk.yellow('│ Duration: Until session ends │'));
68
+ console.log(chalk.yellow('│ Allow? (y/n): │'));
69
+ console.log(chalk.yellow('└─────────────────────────────────────────┘\n'));
70
+ const response = await prompts({
71
+ type: 'confirm',
72
+ name: 'approved',
73
+ message: `Expose port ${port} over the internet?`,
74
+ initial: false,
75
+ });
76
+ if (!response.approved) {
77
+ console.log(chalk.red('✗ Tunnel access denied\n'));
78
+ return { approved: false };
79
+ }
80
+ try {
81
+ // Check if port is available
82
+ const portAvailable = await this.checkPortAvailable(port);
83
+ if (!portAvailable) {
84
+ const error = `Port ${port} is not accessible or not running`;
85
+ console.log(chalk.red(`✗ ${error}\n`));
86
+ return {
87
+ approved: false,
88
+ error,
89
+ };
90
+ }
91
+ // Create tunnel
92
+ console.log(chalk.dim('Creating tunnel...'));
93
+ const tunnel = await tunnelManager.createTunnel({
94
+ port,
95
+ taskId,
96
+ onError: (err) => console.error('Tunnel error:', err),
97
+ onClose: () => console.log('Tunnel closed'),
98
+ });
99
+ console.log(chalk.green(`✓ Tunnel created: ${chalk.cyan(tunnel.url)}\n`));
100
+ return {
101
+ approved: true,
102
+ tunnelUrl: tunnel.url,
103
+ };
104
+ }
105
+ catch (error) {
106
+ const errorMsg = error.message || 'Failed to create tunnel';
107
+ console.log(chalk.red(`✗ ${errorMsg}\n`));
108
+ return {
109
+ approved: false,
110
+ error: errorMsg,
111
+ };
112
+ }
113
+ }
114
+ /**
115
+ * Check if a port is available/accessible
116
+ */
117
+ async checkPortAvailable(port) {
118
+ return new Promise((resolve) => {
119
+ const socket = new net.Socket();
120
+ socket.setTimeout(1000);
121
+ socket.on('connect', () => {
122
+ socket.destroy();
123
+ resolve(true); // Port is accessible
124
+ });
125
+ socket.on('timeout', () => {
126
+ socket.destroy();
127
+ resolve(false);
128
+ });
129
+ socket.on('error', () => {
130
+ resolve(false);
131
+ });
132
+ socket.connect(port, 'localhost');
133
+ });
134
+ }
41
135
  }
42
136
  //# sourceMappingURL=permissions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/modules/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,OAAO,iBAAiB;IAC5B,KAAK,CAAC,wBAAwB,CAAC,OAAe,EAAE,MAAe;QAC7D,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;QACzC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;YAC7B,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,mBAAmB,OAAO,IAAI;YACvC,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,QAAQ,IAAI,KAAK,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,QAAgB,EAAE,MAAe;QAC3D,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC1C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,WAAW,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAC5E,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;YAC7B,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,uBAAuB,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE;YAChF,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,QAAQ,IAAI,KAAK,CAAC;IACpC,CAAC;CACF"}
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/modules/permissions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { AiTool, ToolResult } from '../types/index.js';
2
+ /**
3
+ * Tool Registry for AI Agent
4
+ *
5
+ * Manages registration and execution of tools that the AI agent can call.
6
+ * Tools are functions that extend the AI's capabilities by allowing it to
7
+ * interact with external systems, APIs, or services.
8
+ */
9
+ declare class ToolRegistry {
10
+ private tools;
11
+ /**
12
+ * Register a tool for use by the AI agent
13
+ */
14
+ registerTool(tool: AiTool): void;
15
+ /**
16
+ * Get a specific tool by name
17
+ */
18
+ getTool(name: string): AiTool | undefined;
19
+ /**
20
+ * Get all registered tools
21
+ */
22
+ getAllTools(): AiTool[];
23
+ /**
24
+ * Check if a tool is registered
25
+ */
26
+ hasTool(name: string): boolean;
27
+ /**
28
+ * Execute a tool by name with given parameters
29
+ */
30
+ executeTool(toolName: string, params: any): Promise<ToolResult>;
31
+ /**
32
+ * Validate parameters against tool schema
33
+ */
34
+ private validateParameters;
35
+ /**
36
+ * Unregister a tool
37
+ */
38
+ unregisterTool(name: string): boolean;
39
+ /**
40
+ * Clear all registered tools
41
+ */
42
+ clearAll(): void;
43
+ /**
44
+ * Get tool count
45
+ */
46
+ get count(): number;
47
+ }
48
+ export declare const toolRegistry: ToolRegistry;
49
+ export {};
50
+ //# sourceMappingURL=toolRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolRegistry.d.ts","sourceRoot":"","sources":["../../src/modules/toolRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;;GAMG;AACH,cAAM,YAAY;IAChB,OAAO,CAAC,KAAK,CAAkC;IAE/C;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOhC;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIzC;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE;IAIvB;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI9B;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC;IA+BrE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAyB1B;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIrC;;OAEG;IACH,QAAQ,IAAI,IAAI;IAIhB;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;CACF;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Tool Registry for AI Agent
3
+ *
4
+ * Manages registration and execution of tools that the AI agent can call.
5
+ * Tools are functions that extend the AI's capabilities by allowing it to
6
+ * interact with external systems, APIs, or services.
7
+ */
8
+ class ToolRegistry {
9
+ constructor() {
10
+ this.tools = new Map();
11
+ }
12
+ /**
13
+ * Register a tool for use by the AI agent
14
+ */
15
+ registerTool(tool) {
16
+ if (this.tools.has(tool.name)) {
17
+ console.warn(`Tool "${tool.name}" is already registered. Overwriting.`);
18
+ }
19
+ this.tools.set(tool.name, tool);
20
+ }
21
+ /**
22
+ * Get a specific tool by name
23
+ */
24
+ getTool(name) {
25
+ return this.tools.get(name);
26
+ }
27
+ /**
28
+ * Get all registered tools
29
+ */
30
+ getAllTools() {
31
+ return Array.from(this.tools.values());
32
+ }
33
+ /**
34
+ * Check if a tool is registered
35
+ */
36
+ hasTool(name) {
37
+ return this.tools.has(name);
38
+ }
39
+ /**
40
+ * Execute a tool by name with given parameters
41
+ */
42
+ async executeTool(toolName, params) {
43
+ const tool = this.getTool(toolName);
44
+ if (!tool) {
45
+ return {
46
+ success: false,
47
+ error: `Tool "${toolName}" not found. Available tools: ${Array.from(this.tools.keys()).join(', ')}`,
48
+ };
49
+ }
50
+ try {
51
+ // Validate parameters against tool schema
52
+ const validationError = this.validateParameters(tool, params);
53
+ if (validationError) {
54
+ return {
55
+ success: false,
56
+ error: validationError,
57
+ };
58
+ }
59
+ // Execute the tool
60
+ return await tool.execute(params);
61
+ }
62
+ catch (error) {
63
+ console.error(`Error executing tool "${toolName}":`, error);
64
+ return {
65
+ success: false,
66
+ error: `Tool execution failed: ${error.message}`,
67
+ };
68
+ }
69
+ }
70
+ /**
71
+ * Validate parameters against tool schema
72
+ */
73
+ validateParameters(tool, params) {
74
+ // Check if all required parameters are present
75
+ for (const requiredParam of tool.parameters.required) {
76
+ if (!(requiredParam in params)) {
77
+ return `Missing required parameter: ${requiredParam}`;
78
+ }
79
+ }
80
+ // Type check parameters
81
+ for (const [paramName, paramValue] of Object.entries(params)) {
82
+ const paramSchema = tool.parameters.properties[paramName];
83
+ if (!paramSchema) {
84
+ return `Unknown parameter: ${paramName}`;
85
+ }
86
+ // Check enum values if specified
87
+ if (paramSchema.enum && !paramSchema.enum.includes(paramValue)) {
88
+ return `Invalid value for ${paramName}. Expected one of: ${paramSchema.enum.join(', ')}`;
89
+ }
90
+ }
91
+ return null;
92
+ }
93
+ /**
94
+ * Unregister a tool
95
+ */
96
+ unregisterTool(name) {
97
+ return this.tools.delete(name);
98
+ }
99
+ /**
100
+ * Clear all registered tools
101
+ */
102
+ clearAll() {
103
+ this.tools.clear();
104
+ }
105
+ /**
106
+ * Get tool count
107
+ */
108
+ get count() {
109
+ return this.tools.size;
110
+ }
111
+ }
112
+ // Export singleton instance
113
+ export const toolRegistry = new ToolRegistry();
114
+ //# sourceMappingURL=toolRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolRegistry.js","sourceRoot":"","sources":["../../src/modules/toolRegistry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Tunnel manager for creating and managing localtunnel connections
3
+ */
4
+ import { EventEmitter } from 'events';
5
+ import { ActiveTunnel } from '../types/index.js';
6
+ export interface TunnelOptions {
7
+ port: number;
8
+ subdomain?: string;
9
+ taskId: string;
10
+ onError?: (error: Error) => void;
11
+ onClose?: () => void;
12
+ }
13
+ export declare class TunnelManager extends EventEmitter {
14
+ private tunnel;
15
+ private activeTunnel;
16
+ /**
17
+ * Create a new localtunnel for a task session
18
+ */
19
+ createTunnel(options: TunnelOptions): Promise<ActiveTunnel>;
20
+ /**
21
+ * Close the active tunnel
22
+ */
23
+ closeTunnel(): Promise<void>;
24
+ /**
25
+ * Get the currently active tunnel
26
+ */
27
+ getActiveTunnel(): ActiveTunnel | null;
28
+ /**
29
+ * Check if tunnel is active
30
+ */
31
+ isActive(): boolean;
32
+ }
33
+ //# sourceMappingURL=tunnel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/modules/tunnel.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAA6B;IAEjD;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA6CjE;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAUlC;;OAEG;IACH,eAAe,IAAI,YAAY,GAAG,IAAI;IAItC;;OAEG;IACH,QAAQ,IAAI,OAAO;CAGpB"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Tunnel manager for creating and managing localtunnel connections
3
+ */
4
+ import localtunnel from 'localtunnel';
5
+ import { EventEmitter } from 'events';
6
+ export class TunnelManager extends EventEmitter {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.tunnel = null;
10
+ this.activeTunnel = null;
11
+ }
12
+ /**
13
+ * Create a new localtunnel for a task session
14
+ */
15
+ async createTunnel(options) {
16
+ // Close existing tunnel if any
17
+ if (this.tunnel) {
18
+ await this.closeTunnel();
19
+ }
20
+ const tunnelOptions = { port: options.port };
21
+ if (options.subdomain) {
22
+ tunnelOptions.subdomain = options.subdomain;
23
+ }
24
+ try {
25
+ this.tunnel = await localtunnel(tunnelOptions);
26
+ this.activeTunnel = {
27
+ url: this.tunnel.url,
28
+ port: options.port,
29
+ subdomain: options.subdomain,
30
+ createdAt: new Date(),
31
+ taskId: options.taskId,
32
+ };
33
+ // Handle tunnel errors
34
+ this.tunnel.on('error', (err) => {
35
+ console.error('Tunnel error:', err);
36
+ this.emit('error', err);
37
+ options.onError?.(err);
38
+ });
39
+ // Handle tunnel close
40
+ this.tunnel.on('close', () => {
41
+ console.log('Tunnel closed');
42
+ this.emit('close');
43
+ options.onClose?.();
44
+ this.activeTunnel = null;
45
+ });
46
+ this.emit('created', this.activeTunnel);
47
+ return this.activeTunnel;
48
+ }
49
+ catch (error) {
50
+ console.error('Failed to create tunnel:', error);
51
+ throw new Error(`Tunnel creation failed: ${error.message}`);
52
+ }
53
+ }
54
+ /**
55
+ * Close the active tunnel
56
+ */
57
+ async closeTunnel() {
58
+ if (this.tunnel) {
59
+ this.tunnel.close();
60
+ this.tunnel = null;
61
+ const prevTunnel = this.activeTunnel;
62
+ this.activeTunnel = null;
63
+ this.emit('closed', prevTunnel);
64
+ }
65
+ }
66
+ /**
67
+ * Get the currently active tunnel
68
+ */
69
+ getActiveTunnel() {
70
+ return this.activeTunnel;
71
+ }
72
+ /**
73
+ * Check if tunnel is active
74
+ */
75
+ isActive() {
76
+ return this.activeTunnel !== null && this.tunnel !== null;
77
+ }
78
+ }
79
+ //# sourceMappingURL=tunnel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/modules/tunnel.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,WAAW,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAWtC,MAAM,OAAO,aAAc,SAAQ,YAAY;IAA/C;;QACU,WAAM,GAAkB,IAAI,CAAC;QAC7B,iBAAY,GAAwB,IAAI,CAAC;IA4EnD,CAAC;IA1EC;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAAsB;QACvC,+BAA+B;QAC/B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC3B,CAAC;QAED,MAAM,aAAa,GAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,aAAa,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,CAAC;YAE/C,IAAI,CAAC,YAAY,GAAG;gBAClB,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;gBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC;YAEF,uBAAuB;YACvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC9B,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACxB,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;YAEH,sBAAsB;YACtB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC3B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACnB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;gBACpB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YAC3B,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC;YACrC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,YAAY,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC;IAC5D,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Quick engineer consultation for vibe mode
3
+ * Engineer provides context to help AI, not take over the task
4
+ */
5
+ export declare function consultEngineer(aiQuestion: string, context: {
6
+ userQuery: string;
7
+ aiAttempt: string;
8
+ }): Promise<{
9
+ engineerContext: string;
10
+ credits: number;
11
+ }>;
12
+ /**
13
+ * Ask if user wants to use vibe mode for this request
14
+ */
15
+ export declare function promptForVibeMode(): Promise<boolean>;
16
+ //# sourceMappingURL=vibeHelper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vibeHelper.d.ts","sourceRoot":"","sources":["../../src/modules/vibeHelper.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAChD,OAAO,CAAC;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAsBvD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAS1D"}