@defai.digital/ax-cli 3.5.4 → 3.6.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 (162) hide show
  1. package/.ax-cli/checkpoints/2025-11-20/checkpoint-11e9e0ba-c39d-4fd2-aa77-bc818811c921.json +69 -0
  2. package/.ax-cli/checkpoints/2025-11-20/checkpoint-2b260b98-b418-4c7c-9694-e2b94967e662.json +24 -0
  3. package/.ax-cli/checkpoints/2025-11-20/checkpoint-7e03601e-e8ab-4cd7-9841-a74b66adf78f.json +69 -0
  4. package/.ax-cli/checkpoints/2025-11-20/checkpoint-7f9c6562-771f-4fd0-adcf-9e7e9ac34ae8.json +44 -0
  5. package/.ax-cli/checkpoints/2025-11-20/checkpoint-e1ebe666-4c3a-4367-ba5c-27fe512a9c70.json +24 -0
  6. package/.ax-cli/checkpoints/2025-11-21/checkpoint-15743e7d-430c-4d76-b6fc-955d7a5c250c.json +44 -0
  7. package/.ax-cli/checkpoints/2025-11-21/checkpoint-25cf7679-0b3f-4988-83d7-704548fbba91.json +69 -0
  8. package/.ax-cli/checkpoints/2025-11-21/checkpoint-54aedbac-6db0-464e-8ebb-dbb3979e6dca.json +24 -0
  9. package/.ax-cli/checkpoints/2025-11-21/checkpoint-7658aed8-fe5d-4222-903f-1a7c63717ea7.json +24 -0
  10. package/.ax-cli/checkpoints/2025-11-21/checkpoint-c9c13497-40dc-4294-a327-6a5fc854eaa1.json +69 -0
  11. package/.ax-cli/memory.json +15 -8
  12. package/README.md +423 -82
  13. package/ax.config.json +333 -0
  14. package/config-defaults/messages.yaml +75 -0
  15. package/config-defaults/models.yaml +66 -0
  16. package/config-defaults/prompts.yaml +156 -0
  17. package/config-defaults/settings.yaml +86 -0
  18. package/dist/agent/chat-history-manager.d.ts +56 -0
  19. package/dist/agent/chat-history-manager.js +150 -0
  20. package/dist/agent/chat-history-manager.js.map +1 -0
  21. package/dist/agent/llm-agent.js +1 -1
  22. package/dist/agent/llm-agent.js.map +1 -1
  23. package/dist/agent/tool-manager.d.ts +39 -0
  24. package/dist/agent/tool-manager.js +76 -0
  25. package/dist/agent/tool-manager.js.map +1 -0
  26. package/dist/analyzers/code-smells/detectors/data-clumps-detector.js +7 -9
  27. package/dist/analyzers/code-smells/detectors/data-clumps-detector.js.map +1 -1
  28. package/dist/analyzers/code-smells/detectors/dead-code-detector.js +1 -1
  29. package/dist/analyzers/code-smells/detectors/dead-code-detector.js.map +1 -1
  30. package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js +22 -10
  31. package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js.map +1 -1
  32. package/dist/analyzers/code-smells/detectors/feature-envy-detector.js +1 -1
  33. package/dist/analyzers/code-smells/detectors/feature-envy-detector.js.map +1 -1
  34. package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js +1 -1
  35. package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js.map +1 -1
  36. package/dist/analyzers/code-smells/detectors/large-class-detector.js +4 -1
  37. package/dist/analyzers/code-smells/detectors/large-class-detector.js.map +1 -1
  38. package/dist/analyzers/code-smells/detectors/long-method-detector.js +4 -1
  39. package/dist/analyzers/code-smells/detectors/long-method-detector.js.map +1 -1
  40. package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js +4 -1
  41. package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js.map +1 -1
  42. package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js +4 -5
  43. package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js.map +1 -1
  44. package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js +4 -1
  45. package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js.map +1 -1
  46. package/dist/commands/memory.js +1 -1
  47. package/dist/commands/memory.js.map +1 -1
  48. package/dist/commands/setup.js +19 -6
  49. package/dist/commands/setup.js.map +1 -1
  50. package/dist/index.js +7 -0
  51. package/dist/index.js.bak +664 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/llm/client.d.ts +1 -0
  54. package/dist/llm/client.js +44 -0
  55. package/dist/llm/client.js.map +1 -1
  56. package/dist/mcp/health.js +4 -2
  57. package/dist/mcp/health.js.map +1 -1
  58. package/dist/mcp/ssrf-protection.d.ts +86 -0
  59. package/dist/mcp/ssrf-protection.js +313 -0
  60. package/dist/mcp/ssrf-protection.js.map +1 -0
  61. package/dist/mcp/validation.d.ts +4 -0
  62. package/dist/mcp/validation.js +122 -11
  63. package/dist/mcp/validation.js.map +1 -1
  64. package/dist/schemas/settings-schemas.d.ts +53 -0
  65. package/dist/schemas/settings-schemas.js +47 -0
  66. package/dist/schemas/settings-schemas.js.map +1 -1
  67. package/dist/tools/bash.d.ts +3 -2
  68. package/dist/tools/bash.js +31 -2
  69. package/dist/tools/bash.js.map +1 -1
  70. package/dist/tools/search.d.ts +1 -1
  71. package/dist/tools/search.js +121 -128
  72. package/dist/tools/search.js.map +1 -1
  73. package/dist/tools/text-editor.js +52 -15
  74. package/dist/tools/text-editor.js.map +1 -1
  75. package/dist/tools/web-search/index.d.ts +0 -2
  76. package/dist/tools/web-search/index.js +0 -2
  77. package/dist/tools/web-search/index.js.map +1 -1
  78. package/dist/tools/web-search/router.d.ts +0 -2
  79. package/dist/tools/web-search/router.js +2 -37
  80. package/dist/tools/web-search/router.js.map +1 -1
  81. package/dist/tools/web-search/web-search-tool.js +2 -12
  82. package/dist/tools/web-search/web-search-tool.js.map +1 -1
  83. package/dist/ui/components/chat-history.js +1 -1
  84. package/dist/ui/components/chat-history.js.map +1 -1
  85. package/dist/ui/components/chat-input.d.ts +4 -1
  86. package/dist/ui/components/chat-input.js +133 -52
  87. package/dist/ui/components/chat-input.js.map +1 -1
  88. package/dist/ui/components/chat-interface.js +5 -4
  89. package/dist/ui/components/chat-interface.js.map +1 -1
  90. package/dist/ui/components/confirmation-dialog.js +1 -1
  91. package/dist/ui/components/confirmation-dialog.js.map +1 -1
  92. package/dist/ui/components/keyboard-hints.js +2 -0
  93. package/dist/ui/components/keyboard-hints.js.map +1 -1
  94. package/dist/ui/components/status-bar.js +3 -13
  95. package/dist/ui/components/status-bar.js.map +1 -1
  96. package/dist/ui/components/welcome-panel.js +4 -0
  97. package/dist/ui/components/welcome-panel.js.map +1 -1
  98. package/dist/ui/hooks/use-chat-reducer.d.ts +61 -0
  99. package/dist/ui/hooks/use-chat-reducer.js +118 -0
  100. package/dist/ui/hooks/use-chat-reducer.js.map +1 -0
  101. package/dist/ui/hooks/use-enhanced-input.d.ts +44 -0
  102. package/dist/ui/hooks/use-enhanced-input.js +364 -0
  103. package/dist/ui/hooks/use-enhanced-input.js.map +1 -0
  104. package/dist/ui/hooks/use-input-handler.d.ts +48 -0
  105. package/dist/ui/hooks/use-input-handler.js +1446 -0
  106. package/dist/ui/hooks/use-input-handler.js.map +1 -0
  107. package/dist/utils/audit-logger.d.ts +205 -0
  108. package/dist/utils/audit-logger.js +269 -0
  109. package/dist/utils/audit-logger.js.map +1 -0
  110. package/dist/utils/command-security.d.ts +85 -0
  111. package/dist/utils/command-security.js +200 -0
  112. package/dist/utils/command-security.js.map +1 -0
  113. package/dist/utils/config-loader.js +3 -3
  114. package/dist/utils/config-loader.js.map +1 -1
  115. package/dist/utils/encryption.d.ts +78 -0
  116. package/dist/utils/encryption.js +216 -0
  117. package/dist/utils/encryption.js.map +1 -0
  118. package/dist/utils/error-sanitizer.d.ts +119 -0
  119. package/dist/utils/error-sanitizer.js +253 -0
  120. package/dist/utils/error-sanitizer.js.map +1 -0
  121. package/dist/utils/input-sanitizer.d.ts +210 -0
  122. package/dist/utils/input-sanitizer.js +362 -0
  123. package/dist/utils/input-sanitizer.js.map +1 -0
  124. package/dist/utils/json-utils.d.ts +13 -0
  125. package/dist/utils/json-utils.js +55 -1
  126. package/dist/utils/json-utils.js.map +1 -1
  127. package/dist/utils/paste-collapse.d.ts +46 -0
  128. package/dist/utils/paste-collapse.js +77 -0
  129. package/dist/utils/paste-collapse.js.map +1 -0
  130. package/dist/utils/paste-utils.d.ts +99 -0
  131. package/dist/utils/paste-utils.js +239 -0
  132. package/dist/utils/paste-utils.js.map +1 -0
  133. package/dist/utils/path-security.d.ts +90 -0
  134. package/dist/utils/path-security.js +328 -0
  135. package/dist/utils/path-security.js.map +1 -0
  136. package/dist/utils/process-pool.d.ts +105 -0
  137. package/dist/utils/process-pool.js +326 -0
  138. package/dist/utils/process-pool.js.map +1 -0
  139. package/dist/utils/rate-limiter.d.ts +221 -0
  140. package/dist/utils/rate-limiter.js +317 -0
  141. package/dist/utils/rate-limiter.js.map +1 -0
  142. package/dist/utils/settings-manager.js +99 -6
  143. package/dist/utils/settings-manager.js.map +1 -1
  144. package/dist/utils/streaming-analyzer.js +9 -21
  145. package/dist/utils/streaming-analyzer.js.map +1 -1
  146. package/package.json +3 -7
  147. package/packages/schemas/dist/index.d.ts +14 -0
  148. package/packages/schemas/dist/index.d.ts.map +1 -0
  149. package/packages/schemas/dist/index.js +19 -0
  150. package/packages/schemas/dist/index.js.map +1 -0
  151. package/packages/schemas/dist/public/core/brand-types.d.ts +308 -0
  152. package/packages/schemas/dist/public/core/brand-types.d.ts.map +1 -0
  153. package/packages/schemas/dist/public/core/brand-types.js +243 -0
  154. package/packages/schemas/dist/public/core/brand-types.js.map +1 -0
  155. package/packages/schemas/dist/public/core/enums.d.ts +227 -0
  156. package/packages/schemas/dist/public/core/enums.d.ts.map +1 -0
  157. package/packages/schemas/dist/public/core/enums.js +222 -0
  158. package/packages/schemas/dist/public/core/enums.js.map +1 -0
  159. package/packages/schemas/dist/public/core/id-types.d.ts +286 -0
  160. package/packages/schemas/dist/public/core/id-types.d.ts.map +1 -0
  161. package/packages/schemas/dist/public/core/id-types.js +136 -0
  162. package/packages/schemas/dist/public/core/id-types.js.map +1 -0
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Unified chat state reducer for batched state updates
3
+ * Reduces re-renders by combining multiple state changes into single update
4
+ */
5
+ import type { ChatEntry } from '../../agent/llm-agent.js';
6
+ export interface ChatState {
7
+ history: ChatEntry[];
8
+ isProcessing: boolean;
9
+ isStreaming: boolean;
10
+ tokenCount: number;
11
+ processingTime: number;
12
+ contextPercentage: number;
13
+ showAutoPrune: boolean;
14
+ }
15
+ export type ChatAction = {
16
+ type: 'ADD_ENTRY';
17
+ entry: ChatEntry;
18
+ } | {
19
+ type: 'UPDATE_STREAMING_CONTENT';
20
+ content: string;
21
+ } | {
22
+ type: 'UPDATE_LAST_ENTRY';
23
+ updates: Partial<ChatEntry>;
24
+ } | {
25
+ type: 'BATCH_UPDATE';
26
+ updates: Partial<ChatState>;
27
+ } | {
28
+ type: 'START_PROCESSING';
29
+ } | {
30
+ type: 'STOP_PROCESSING';
31
+ } | {
32
+ type: 'START_STREAMING';
33
+ } | {
34
+ type: 'STOP_STREAMING';
35
+ } | {
36
+ type: 'UPDATE_TOKEN_COUNT';
37
+ count: number;
38
+ } | {
39
+ type: 'UPDATE_PROCESSING_TIME';
40
+ time: number;
41
+ } | {
42
+ type: 'UPDATE_CONTEXT_PERCENTAGE';
43
+ percentage: number;
44
+ showAutoPrune?: boolean;
45
+ } | {
46
+ type: 'CLEAR_HISTORY';
47
+ } | {
48
+ type: 'REPLACE_HISTORY';
49
+ history: ChatEntry[];
50
+ } | {
51
+ type: 'UPDATE_TOOL_RESULT';
52
+ toolCallId: string;
53
+ result: any;
54
+ };
55
+ export interface UseChatReducerOptions {
56
+ initialHistory?: ChatEntry[];
57
+ }
58
+ export declare const useChatReducer: (options?: UseChatReducerOptions) => {
59
+ state: ChatState;
60
+ dispatch: import("react").Dispatch<ChatAction>;
61
+ };
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Unified chat state reducer for batched state updates
3
+ * Reduces re-renders by combining multiple state changes into single update
4
+ */
5
+ import { useReducer } from 'react';
6
+ const chatReducer = (state, action) => {
7
+ switch (action.type) {
8
+ case 'BATCH_UPDATE':
9
+ // Most efficient: update multiple fields in one re-render
10
+ return { ...state, ...action.updates };
11
+ case 'ADD_ENTRY':
12
+ // Add new chat entry
13
+ return {
14
+ ...state,
15
+ history: [...state.history, action.entry],
16
+ };
17
+ case 'UPDATE_STREAMING_CONTENT':
18
+ // Update content of the last streaming entry
19
+ return {
20
+ ...state,
21
+ history: state.history.map((entry, idx) => idx === state.history.length - 1 && entry.isStreaming
22
+ ? { ...entry, content: entry.content + action.content }
23
+ : entry),
24
+ };
25
+ case 'UPDATE_LAST_ENTRY':
26
+ // Update specific fields of the last entry
27
+ return {
28
+ ...state,
29
+ history: state.history.map((entry, idx) => idx === state.history.length - 1
30
+ ? { ...entry, ...action.updates }
31
+ : entry),
32
+ };
33
+ case 'START_PROCESSING':
34
+ return {
35
+ ...state,
36
+ isProcessing: true,
37
+ };
38
+ case 'STOP_PROCESSING':
39
+ return {
40
+ ...state,
41
+ isProcessing: false,
42
+ processingTime: 0,
43
+ };
44
+ case 'START_STREAMING':
45
+ return {
46
+ ...state,
47
+ isStreaming: true,
48
+ };
49
+ case 'STOP_STREAMING':
50
+ return {
51
+ ...state,
52
+ isStreaming: false,
53
+ };
54
+ case 'UPDATE_TOKEN_COUNT':
55
+ return {
56
+ ...state,
57
+ tokenCount: action.count,
58
+ };
59
+ case 'UPDATE_PROCESSING_TIME':
60
+ return {
61
+ ...state,
62
+ processingTime: action.time,
63
+ };
64
+ case 'UPDATE_CONTEXT_PERCENTAGE':
65
+ return {
66
+ ...state,
67
+ contextPercentage: action.percentage,
68
+ showAutoPrune: action.showAutoPrune ?? state.showAutoPrune,
69
+ };
70
+ case 'CLEAR_HISTORY':
71
+ return {
72
+ ...state,
73
+ history: [],
74
+ tokenCount: 0,
75
+ processingTime: 0,
76
+ isProcessing: false,
77
+ isStreaming: false,
78
+ };
79
+ case 'REPLACE_HISTORY':
80
+ return {
81
+ ...state,
82
+ history: action.history,
83
+ };
84
+ case 'UPDATE_TOOL_RESULT':
85
+ // Update a specific tool call entry with results
86
+ return {
87
+ ...state,
88
+ history: state.history.map((entry) => {
89
+ if (entry.type === 'tool_call' && entry.toolCall?.id === action.toolCallId) {
90
+ return {
91
+ ...entry,
92
+ type: 'tool_result',
93
+ content: action.result.success
94
+ ? action.result.output || 'Success'
95
+ : action.result.error || 'Error occurred',
96
+ toolResult: action.result,
97
+ };
98
+ }
99
+ return entry;
100
+ }),
101
+ };
102
+ default:
103
+ return state;
104
+ }
105
+ };
106
+ export const useChatReducer = (options = {}) => {
107
+ const [state, dispatch] = useReducer(chatReducer, {
108
+ history: options.initialHistory || [],
109
+ isProcessing: false,
110
+ isStreaming: false,
111
+ tokenCount: 0,
112
+ processingTime: 0,
113
+ contextPercentage: 0,
114
+ showAutoPrune: false,
115
+ });
116
+ return { state, dispatch };
117
+ };
118
+ //# sourceMappingURL=use-chat-reducer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-chat-reducer.js","sourceRoot":"","sources":["../../../src/ui/hooks/use-chat-reducer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAW,MAAM,OAAO,CAAC;AA6B5C,MAAM,WAAW,GAAmC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;IACpE,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,cAAc;YACjB,0DAA0D;YAC1D,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAEzC,KAAK,WAAW;YACd,qBAAqB;YACrB,OAAO;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;aAC1C,CAAC;QAEJ,KAAK,0BAA0B;YAC7B,6CAA6C;YAC7C,OAAO;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CACxC,GAAG,KAAK,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW;oBACnD,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE;oBACvD,CAAC,CAAC,KAAK,CACV;aACF,CAAC;QAEJ,KAAK,mBAAmB;YACtB,2CAA2C;YAC3C,OAAO;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CACxC,GAAG,KAAK,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;oBAC9B,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE;oBACjC,CAAC,CAAC,KAAK,CACV;aACF,CAAC;QAEJ,KAAK,kBAAkB;YACrB,OAAO;gBACL,GAAG,KAAK;gBACR,YAAY,EAAE,IAAI;aACnB,CAAC;QAEJ,KAAK,iBAAiB;YACpB,OAAO;gBACL,GAAG,KAAK;gBACR,YAAY,EAAE,KAAK;gBACnB,cAAc,EAAE,CAAC;aAClB,CAAC;QAEJ,KAAK,iBAAiB;YACpB,OAAO;gBACL,GAAG,KAAK;gBACR,WAAW,EAAE,IAAI;aAClB,CAAC;QAEJ,KAAK,gBAAgB;YACnB,OAAO;gBACL,GAAG,KAAK;gBACR,WAAW,EAAE,KAAK;aACnB,CAAC;QAEJ,KAAK,oBAAoB;YACvB,OAAO;gBACL,GAAG,KAAK;gBACR,UAAU,EAAE,MAAM,CAAC,KAAK;aACzB,CAAC;QAEJ,KAAK,wBAAwB;YAC3B,OAAO;gBACL,GAAG,KAAK;gBACR,cAAc,EAAE,MAAM,CAAC,IAAI;aAC5B,CAAC;QAEJ,KAAK,2BAA2B;YAC9B,OAAO;gBACL,GAAG,KAAK;gBACR,iBAAiB,EAAE,MAAM,CAAC,UAAU;gBACpC,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa;aAC3D,CAAC;QAEJ,KAAK,eAAe;YAClB,OAAO;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,EAAE;gBACX,UAAU,EAAE,CAAC;gBACb,cAAc,EAAE,CAAC;gBACjB,YAAY,EAAE,KAAK;gBACnB,WAAW,EAAE,KAAK;aACnB,CAAC;QAEJ,KAAK,iBAAiB;YACpB,OAAO;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC;QAEJ,KAAK,oBAAoB;YACvB,iDAAiD;YACjD,OAAO;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;oBACnC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC;wBAC3E,OAAO;4BACL,GAAG,KAAK;4BACR,IAAI,EAAE,aAAa;4BACnB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;gCAC5B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS;gCACnC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,gBAAgB;4BAC3C,UAAU,EAAE,MAAM,CAAC,MAAM;yBAC1B,CAAC;oBACJ,CAAC;oBACD,OAAO,KAAK,CAAC;gBACf,CAAC,CAAC;aACH,CAAC;QAEJ;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,UAAiC,EAAE,EAAE,EAAE;IACpE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,WAAW,EAAE;QAChD,OAAO,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE;QACrC,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,CAAC;QACb,cAAc,EAAE,CAAC;QACjB,iBAAiB,EAAE,CAAC;QACpB,aAAa,EAAE,KAAK;KACrB,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { PastedBlock } from "../../utils/paste-utils.js";
2
+ export interface Key {
3
+ name?: string;
4
+ ctrl?: boolean;
5
+ meta?: boolean;
6
+ shift?: boolean;
7
+ sequence?: string;
8
+ upArrow?: boolean;
9
+ downArrow?: boolean;
10
+ leftArrow?: boolean;
11
+ rightArrow?: boolean;
12
+ return?: boolean;
13
+ escape?: boolean;
14
+ tab?: boolean;
15
+ backspace?: boolean;
16
+ delete?: boolean;
17
+ }
18
+ export interface EnhancedInputHook {
19
+ input: string;
20
+ cursorPosition: number;
21
+ isMultiline: boolean;
22
+ pastedBlocks: PastedBlock[];
23
+ currentBlockAtCursor: PastedBlock | null;
24
+ setInput: (text: string) => void;
25
+ setCursorPosition: (position: number) => void;
26
+ clearInput: () => void;
27
+ insertAtCursor: (text: string) => void;
28
+ resetHistory: () => void;
29
+ handleInput: (inputChar: string, key: Key) => void;
30
+ expandPlaceholdersForSubmit: (text: string) => string;
31
+ }
32
+ interface UseEnhancedInputProps {
33
+ onSubmit?: (text: string) => void;
34
+ onEscape?: () => void;
35
+ onSpecialKey?: (key: Key) => boolean;
36
+ onVerboseToggle?: () => void;
37
+ onQuickActions?: () => void;
38
+ onBackgroundModeToggle?: () => void;
39
+ onCopyLastResponse?: () => void;
40
+ disabled?: boolean;
41
+ multiline?: boolean;
42
+ }
43
+ export declare function useEnhancedInput({ onSubmit, onEscape, onSpecialKey, onVerboseToggle, onQuickActions, onBackgroundModeToggle, onCopyLastResponse, disabled, multiline, }?: UseEnhancedInputProps): EnhancedInputHook;
44
+ export {};
@@ -0,0 +1,364 @@
1
+ import { useState, useCallback, useRef, useEffect } from "react";
2
+ import { deleteCharBefore, deleteCharAfter, deleteWordBefore, deleteWordAfter, insertText, moveToLineStart, moveToPreviousWord, moveToNextWord, } from "../../utils/text-utils.js";
3
+ import { useInputHistory } from "./use-input-history.js";
4
+ import { PasteDetector, shouldCollapsePaste, createPastedBlock, generatePlaceholder, findBlockAtCursor, expandAllPlaceholders, } from "../../utils/paste-utils.js";
5
+ export function useEnhancedInput({ onSubmit, onEscape, onSpecialKey, onVerboseToggle, onQuickActions, onBackgroundModeToggle, onCopyLastResponse, disabled = false, multiline = false, } = {}) {
6
+ const [input, setInputState] = useState("");
7
+ const [cursorPosition, setCursorPositionState] = useState(0);
8
+ const [pastedBlocks, setPastedBlocks] = useState([]);
9
+ const [pasteCounter, setPasteCounter] = useState(0);
10
+ const [currentBlockAtCursor, setCurrentBlockAtCursor] = useState(null);
11
+ const isMultilineRef = useRef(multiline);
12
+ const pasteDetectorRef = useRef(new PasteDetector());
13
+ const pasteTimeoutRef = useRef(null);
14
+ // Keep ref in sync with prop to avoid stale closure
15
+ isMultilineRef.current = multiline;
16
+ const { addToHistory, navigateHistory, resetHistory, setOriginalInput, isNavigatingHistory, } = useInputHistory();
17
+ const setInput = useCallback((text) => {
18
+ setInputState(text);
19
+ // Use functional update to get the current cursor position, avoiding stale closure
20
+ setCursorPositionState((currentCursor) => Math.min(text.length, currentCursor));
21
+ if (!isNavigatingHistory()) {
22
+ setOriginalInput(text);
23
+ }
24
+ }, [isNavigatingHistory, setOriginalInput]);
25
+ const setCursorPosition = useCallback((position) => {
26
+ // Set cursor position with bounds checking based on current input length
27
+ // Use separate state reads to avoid nested state updates
28
+ setInputState((currentInput) => {
29
+ const boundedPosition = Math.max(0, Math.min(currentInput.length, position));
30
+ // Schedule cursor update after current state update completes
31
+ queueMicrotask(() => {
32
+ setCursorPositionState(boundedPosition);
33
+ });
34
+ return currentInput; // No change to input, just accessing for bounds check
35
+ });
36
+ }, []);
37
+ const clearInput = useCallback(() => {
38
+ setInputState("");
39
+ setCursorPositionState(0);
40
+ setOriginalInput("");
41
+ setPastedBlocks([]);
42
+ setPasteCounter(0);
43
+ pasteDetectorRef.current.reset();
44
+ }, [setOriginalInput]);
45
+ const insertAtCursor = useCallback((text) => {
46
+ const result = insertText(input, cursorPosition, text);
47
+ setInputState(result.text);
48
+ setCursorPositionState(result.position);
49
+ setOriginalInput(result.text);
50
+ }, [input, cursorPosition, setOriginalInput]);
51
+ // Handle paste completion (after accumulation timeout)
52
+ const handlePasteComplete = useCallback((pastedContent) => {
53
+ // Check if should collapse
54
+ if (shouldCollapsePaste(pastedContent)) {
55
+ // Create pasted block
56
+ const block = createPastedBlock(pasteCounter, pastedContent, cursorPosition);
57
+ setPasteCounter(prev => prev + 1);
58
+ setPastedBlocks(prev => [...prev, block]);
59
+ // Insert placeholder instead of full content
60
+ const placeholder = generatePlaceholder(block);
61
+ const result = insertText(input, cursorPosition, placeholder);
62
+ setInputState(result.text);
63
+ setCursorPositionState(result.position);
64
+ setOriginalInput(result.text);
65
+ }
66
+ else {
67
+ // Insert normally (below threshold)
68
+ const result = insertText(input, cursorPosition, pastedContent);
69
+ setInputState(result.text);
70
+ setCursorPositionState(result.position);
71
+ setOriginalInput(result.text);
72
+ }
73
+ }, [input, cursorPosition, pasteCounter, setOriginalInput]);
74
+ // Toggle collapse/expand for block at cursor
75
+ const toggleBlockAtCursor = useCallback(() => {
76
+ const block = findBlockAtCursor(input, cursorPosition, pastedBlocks);
77
+ if (!block)
78
+ return;
79
+ const placeholder = generatePlaceholder(block);
80
+ if (block.collapsed) {
81
+ // Expand: replace placeholder with full content
82
+ const newInput = input.replace(placeholder, block.content);
83
+ setInputState(newInput);
84
+ // Keep cursor at same position or adjust if needed
85
+ const newCursor = cursorPosition + (block.content.length - placeholder.length);
86
+ setCursorPositionState(Math.min(newInput.length, newCursor));
87
+ setOriginalInput(newInput);
88
+ // Update block state
89
+ setPastedBlocks(prev => prev.map(b => (b.id === block.id ? { ...b, collapsed: false } : b)));
90
+ }
91
+ else {
92
+ // Collapse: replace content with placeholder
93
+ const newInput = input.replace(block.content, placeholder);
94
+ setInputState(newInput);
95
+ // Adjust cursor to end of placeholder
96
+ const placeholderStart = newInput.indexOf(placeholder);
97
+ setCursorPositionState(placeholderStart + placeholder.length);
98
+ setOriginalInput(newInput);
99
+ // Update block state
100
+ setPastedBlocks(prev => prev.map(b => (b.id === block.id ? { ...b, collapsed: true } : b)));
101
+ }
102
+ }, [input, cursorPosition, pastedBlocks, setOriginalInput]);
103
+ // Expand all placeholders for submission
104
+ const expandPlaceholdersForSubmit = useCallback((text) => {
105
+ return expandAllPlaceholders(text, pastedBlocks);
106
+ }, [pastedBlocks]);
107
+ const handleSubmit = useCallback(() => {
108
+ if (input.trim()) {
109
+ // Expand all placeholders before submission
110
+ const expandedInput = expandPlaceholdersForSubmit(input);
111
+ addToHistory(expandedInput);
112
+ onSubmit?.(expandedInput);
113
+ clearInput();
114
+ }
115
+ }, [input, addToHistory, onSubmit, clearInput, expandPlaceholdersForSubmit]);
116
+ const handleInput = useCallback((inputChar, key) => {
117
+ if (disabled)
118
+ return;
119
+ // Handle Ctrl+C - check multiple ways it could be detected
120
+ if ((key.ctrl && inputChar === "c") || inputChar === "\x03") {
121
+ setInputState("");
122
+ setCursorPositionState(0);
123
+ setOriginalInput("");
124
+ return;
125
+ }
126
+ // Handle Ctrl+P: Toggle expand/collapse for paste at cursor
127
+ // Check both key.ctrl with 'p' and raw ASCII code \x10 (Ctrl+P = ASCII 16)
128
+ if ((key.ctrl && inputChar === "p") || inputChar === "\x10") {
129
+ toggleBlockAtCursor();
130
+ return;
131
+ }
132
+ // Allow special key handler to override default behavior
133
+ if (onSpecialKey?.(key)) {
134
+ return;
135
+ }
136
+ // Handle Escape
137
+ if (key.escape) {
138
+ onEscape?.();
139
+ return;
140
+ }
141
+ // Handle Enter/Return
142
+ if (key.return) {
143
+ if (isMultilineRef.current && key.shift) {
144
+ // Shift+Enter in multiline mode inserts newline
145
+ const result = insertText(input, cursorPosition, "\n");
146
+ setInputState(result.text);
147
+ setCursorPositionState(result.position);
148
+ setOriginalInput(result.text);
149
+ }
150
+ else {
151
+ handleSubmit();
152
+ }
153
+ return;
154
+ }
155
+ // Handle history navigation
156
+ if ((key.upArrow || key.name === 'up') && !key.ctrl && !key.meta) {
157
+ const historyInput = navigateHistory("up");
158
+ if (historyInput !== null) {
159
+ setInputState(historyInput);
160
+ setCursorPositionState(historyInput.length);
161
+ }
162
+ return;
163
+ }
164
+ if ((key.downArrow || key.name === 'down') && !key.ctrl && !key.meta) {
165
+ const historyInput = navigateHistory("down");
166
+ if (historyInput !== null) {
167
+ setInputState(historyInput);
168
+ setCursorPositionState(historyInput.length);
169
+ }
170
+ return;
171
+ }
172
+ // Handle cursor movement - ignore meta flag for arrows as it's unreliable in terminals
173
+ // Only do word movement if ctrl is pressed AND no arrow escape sequence is in inputChar
174
+ if ((key.leftArrow || key.name === 'left') && key.ctrl && !inputChar.includes('[')) {
175
+ const newPos = moveToPreviousWord(input, cursorPosition);
176
+ setCursorPositionState(newPos);
177
+ return;
178
+ }
179
+ if ((key.rightArrow || key.name === 'right') && key.ctrl && !inputChar.includes('[')) {
180
+ const newPos = moveToNextWord(input, cursorPosition);
181
+ setCursorPositionState(newPos);
182
+ return;
183
+ }
184
+ // Handle regular cursor movement - single character (ignore meta flag)
185
+ if (key.leftArrow || key.name === 'left') {
186
+ const newPos = Math.max(0, cursorPosition - 1);
187
+ setCursorPositionState(newPos);
188
+ return;
189
+ }
190
+ if (key.rightArrow || key.name === 'right') {
191
+ const newPos = Math.min(input.length, cursorPosition + 1);
192
+ setCursorPositionState(newPos);
193
+ return;
194
+ }
195
+ // Handle Home/End keys or Ctrl+A/E
196
+ if ((key.ctrl && inputChar === "a") || key.name === "home") {
197
+ setCursorPositionState(0); // Simple start of input
198
+ return;
199
+ }
200
+ if ((key.ctrl && inputChar === "e") || key.name === "end") {
201
+ setCursorPositionState(input.length); // Simple end of input
202
+ return;
203
+ }
204
+ // Handle deletion - check multiple ways backspace might be detected
205
+ // Backspace can be detected in different ways depending on terminal
206
+ // In some terminals, backspace shows up as delete:true with empty inputChar
207
+ const isBackspace = key.backspace ||
208
+ key.name === 'backspace' ||
209
+ inputChar === '\b' ||
210
+ inputChar === '\x7f' ||
211
+ (key.delete && inputChar === '' && !key.shift);
212
+ if (isBackspace) {
213
+ if (key.ctrl || key.meta) {
214
+ // Ctrl/Cmd + Backspace: Delete word before cursor
215
+ const result = deleteWordBefore(input, cursorPosition);
216
+ setInputState(result.text);
217
+ setCursorPositionState(result.position);
218
+ setOriginalInput(result.text);
219
+ }
220
+ else {
221
+ // Regular backspace
222
+ const result = deleteCharBefore(input, cursorPosition);
223
+ setInputState(result.text);
224
+ setCursorPositionState(result.position);
225
+ setOriginalInput(result.text);
226
+ }
227
+ return;
228
+ }
229
+ // Handle forward delete (Del key) - but not if it was already handled as backspace above
230
+ // Note: Ctrl+D is also treated as delete character (standard terminal behavior)
231
+ if (key.delete && inputChar !== '') {
232
+ if (key.ctrl || key.meta) {
233
+ // Ctrl/Cmd + Delete: Delete word after cursor
234
+ const result = deleteWordAfter(input, cursorPosition);
235
+ setInputState(result.text);
236
+ setCursorPositionState(result.position);
237
+ setOriginalInput(result.text);
238
+ }
239
+ else {
240
+ // Regular delete
241
+ const result = deleteCharAfter(input, cursorPosition);
242
+ setInputState(result.text);
243
+ setCursorPositionState(result.position);
244
+ setOriginalInput(result.text);
245
+ }
246
+ return;
247
+ }
248
+ // Handle Ctrl+D: Delete character after cursor (standard terminal behavior)
249
+ if (key.ctrl && inputChar === "d") {
250
+ const result = deleteCharAfter(input, cursorPosition);
251
+ setInputState(result.text);
252
+ setCursorPositionState(result.position);
253
+ setOriginalInput(result.text);
254
+ return;
255
+ }
256
+ // Handle Ctrl+K: Open quick actions menu
257
+ // Check both key.ctrl with 'k' and raw ASCII code \x0b (Ctrl+K = ASCII 11)
258
+ if ((key.ctrl && inputChar === "k") || inputChar === "\x0b") {
259
+ onQuickActions?.();
260
+ return;
261
+ }
262
+ // Handle Ctrl+U: Delete from cursor to start of line
263
+ // Check both key.ctrl with 'u' and raw ASCII code \x15 (Ctrl+U = ASCII 21)
264
+ if ((key.ctrl && inputChar === "u") || inputChar === "\x15") {
265
+ const lineStart = moveToLineStart(input, cursorPosition);
266
+ const newText = input.slice(0, lineStart) + input.slice(cursorPosition);
267
+ setInputState(newText);
268
+ setCursorPositionState(lineStart);
269
+ setOriginalInput(newText);
270
+ return;
271
+ }
272
+ // Handle Ctrl+W: Delete word before cursor
273
+ // Check both key.ctrl with 'w' and raw ASCII code \x17 (Ctrl+W = ASCII 23)
274
+ if ((key.ctrl && inputChar === "w") || inputChar === "\x17") {
275
+ const result = deleteWordBefore(input, cursorPosition);
276
+ setInputState(result.text);
277
+ setCursorPositionState(result.position);
278
+ setOriginalInput(result.text);
279
+ return;
280
+ }
281
+ // Handle Ctrl+O: Toggle verbose mode
282
+ // Check both key.ctrl with 'o' and raw ASCII code \x0f (Ctrl+O = ASCII 15)
283
+ if ((key.ctrl && inputChar === "o") || inputChar === "\x0f") {
284
+ onVerboseToggle?.();
285
+ return;
286
+ }
287
+ // Handle Ctrl+B: Toggle background mode
288
+ // Check both key.ctrl with 'b' and raw ASCII code \x02 (Ctrl+B = ASCII 2)
289
+ if ((key.ctrl && inputChar === "b") || inputChar === "\x02") {
290
+ onBackgroundModeToggle?.();
291
+ return;
292
+ }
293
+ // Handle Ctrl+Y: Copy last response to clipboard
294
+ // Check both key.ctrl with 'y' and raw ASCII code \x19 (Ctrl+Y = ASCII 25)
295
+ if ((key.ctrl && inputChar === "y") || inputChar === "\x19") {
296
+ onCopyLastResponse?.();
297
+ return;
298
+ }
299
+ // Handle Ctrl+X: Clear entire input
300
+ // Check both key.ctrl with 'x' and raw ASCII code \x18 (Ctrl+X = ASCII 24)
301
+ if ((key.ctrl && inputChar === "x") || inputChar === "\x18") {
302
+ setInputState("");
303
+ setCursorPositionState(0);
304
+ setOriginalInput("");
305
+ return;
306
+ }
307
+ // Handle regular character input
308
+ if (inputChar && !key.ctrl && !key.meta) {
309
+ // Detect paste operation
310
+ const isPaste = pasteDetectorRef.current.detectPaste(inputChar);
311
+ if (isPaste) {
312
+ // Clear any existing paste timeout
313
+ if (pasteTimeoutRef.current) {
314
+ clearTimeout(pasteTimeoutRef.current);
315
+ }
316
+ // Accumulate paste input
317
+ pasteDetectorRef.current.accumulatePasteInput(inputChar);
318
+ // Set timeout to finalize paste (50ms after last input)
319
+ pasteTimeoutRef.current = setTimeout(() => {
320
+ const accumulated = pasteDetectorRef.current.getAccumulatedInput();
321
+ if (accumulated) {
322
+ handlePasteComplete(accumulated);
323
+ }
324
+ pasteTimeoutRef.current = null;
325
+ }, 50);
326
+ }
327
+ else {
328
+ // Normal character input
329
+ const result = insertText(input, cursorPosition, inputChar);
330
+ setInputState(result.text);
331
+ setCursorPositionState(result.position);
332
+ setOriginalInput(result.text);
333
+ }
334
+ }
335
+ }, [disabled, onSpecialKey, onVerboseToggle, onQuickActions, onBackgroundModeToggle, onCopyLastResponse, input, cursorPosition, multiline, handleSubmit, navigateHistory, setOriginalInput, toggleBlockAtCursor, handlePasteComplete]);
336
+ // Update current block at cursor when cursor position or input changes
337
+ useEffect(() => {
338
+ const block = findBlockAtCursor(input, cursorPosition, pastedBlocks);
339
+ setCurrentBlockAtCursor(block);
340
+ }, [input, cursorPosition, pastedBlocks]);
341
+ // Cleanup paste timeout on unmount
342
+ useEffect(() => {
343
+ return () => {
344
+ if (pasteTimeoutRef.current) {
345
+ clearTimeout(pasteTimeoutRef.current);
346
+ }
347
+ };
348
+ }, []);
349
+ return {
350
+ input,
351
+ cursorPosition,
352
+ isMultiline: isMultilineRef.current,
353
+ pastedBlocks,
354
+ currentBlockAtCursor,
355
+ setInput,
356
+ setCursorPosition,
357
+ clearInput,
358
+ insertAtCursor,
359
+ resetHistory,
360
+ handleInput,
361
+ expandPlaceholdersForSubmit,
362
+ };
363
+ }
364
+ //# sourceMappingURL=use-enhanced-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-enhanced-input.js","sourceRoot":"","sources":["../../../src/ui/hooks/use-enhanced-input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { LLMAgent, ChatEntry } from "../../agent/llm-agent.js";
2
+ interface UseInputHandlerProps {
3
+ agent: LLMAgent;
4
+ chatHistory: ChatEntry[];
5
+ setChatHistory: React.Dispatch<React.SetStateAction<ChatEntry[]>>;
6
+ setIsProcessing: (processing: boolean) => void;
7
+ setIsStreaming: (streaming: boolean) => void;
8
+ setTokenCount: (count: number) => void;
9
+ setProcessingTime: (time: number) => void;
10
+ processingStartTime: React.MutableRefObject<number>;
11
+ isProcessing: boolean;
12
+ isStreaming: boolean;
13
+ isConfirmationActive?: boolean;
14
+ onQuickActionsToggle?: () => void;
15
+ onVerboseModeChange?: (enabled: boolean) => void;
16
+ onBackgroundModeChange?: (enabled: boolean) => void;
17
+ onAutoEditModeChange?: (enabled: boolean) => void;
18
+ onTaskMovedToBackground?: (taskId: string) => void;
19
+ onOperationInterrupted?: () => void;
20
+ onChatCleared?: () => void;
21
+ onCopyLastResponse?: () => void;
22
+ onMemoryWarmed?: (tokens: number) => void;
23
+ onMemoryRefreshed?: () => void;
24
+ onCheckpointCreated?: () => void;
25
+ onCheckpointRestored?: () => void;
26
+ }
27
+ interface CommandSuggestion {
28
+ command: string;
29
+ description: string;
30
+ }
31
+ interface ModelOption {
32
+ model: string;
33
+ }
34
+ export declare function useInputHandler({ agent, chatHistory, setChatHistory, setIsProcessing, setIsStreaming, setTokenCount, setProcessingTime, processingStartTime, isProcessing, isStreaming, isConfirmationActive, onQuickActionsToggle, onVerboseModeChange, onBackgroundModeChange, onAutoEditModeChange, onTaskMovedToBackground, onOperationInterrupted, onChatCleared, onCopyLastResponse, onMemoryWarmed, onMemoryRefreshed, onCheckpointCreated: _onCheckpointCreated, onCheckpointRestored: _onCheckpointRestored, }: UseInputHandlerProps): {
35
+ input: string;
36
+ cursorPosition: number;
37
+ showCommandSuggestions: boolean;
38
+ selectedCommandIndex: number;
39
+ commandSuggestions: CommandSuggestion[];
40
+ availableModels: ModelOption[];
41
+ agent: LLMAgent;
42
+ autoEditEnabled: boolean;
43
+ verboseMode: boolean;
44
+ backgroundMode: boolean;
45
+ pastedBlocks: import("../../utils/paste-utils.js").PastedBlock[];
46
+ currentBlockAtCursor: import("../../utils/paste-utils.js").PastedBlock | null;
47
+ };
48
+ export {};