@defai.digital/ax-cli 3.6.1 → 3.7.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 (137) hide show
  1. package/README.md +129 -16
  2. package/config-defaults/settings.yaml +24 -0
  3. package/dist/agent/llm-agent.d.ts +48 -3
  4. package/dist/agent/llm-agent.js +145 -40
  5. package/dist/agent/llm-agent.js.map +1 -1
  6. package/dist/agent/subagent.d.ts +6 -0
  7. package/dist/agent/subagent.js +41 -24
  8. package/dist/agent/subagent.js.map +1 -1
  9. package/dist/constants.d.ts +13 -0
  10. package/dist/constants.js +28 -0
  11. package/dist/constants.js.map +1 -1
  12. package/dist/index.js +0 -0
  13. package/dist/mcp/client.js +2 -2
  14. package/dist/mcp/client.js.map +1 -1
  15. package/dist/schemas/settings-schemas.d.ts +17 -0
  16. package/dist/schemas/settings-schemas.js +15 -0
  17. package/dist/schemas/settings-schemas.js.map +1 -1
  18. package/dist/sdk/errors.d.ts +93 -0
  19. package/dist/sdk/errors.js +124 -0
  20. package/dist/sdk/errors.js.map +1 -0
  21. package/dist/sdk/index.d.ts +116 -46
  22. package/dist/sdk/index.js +178 -57
  23. package/dist/sdk/index.js.map +1 -1
  24. package/dist/sdk/progress-reporter.d.ts +111 -0
  25. package/dist/sdk/progress-reporter.js +178 -0
  26. package/dist/sdk/progress-reporter.js.map +1 -0
  27. package/dist/sdk/testing.d.ts +184 -0
  28. package/dist/sdk/testing.js +291 -0
  29. package/dist/sdk/testing.js.map +1 -0
  30. package/dist/sdk/tool-registry.d.ts +163 -0
  31. package/dist/sdk/tool-registry.js +218 -0
  32. package/dist/sdk/tool-registry.js.map +1 -0
  33. package/dist/sdk/unified-logger.d.ts +163 -0
  34. package/dist/sdk/unified-logger.js +274 -0
  35. package/dist/sdk/unified-logger.js.map +1 -0
  36. package/dist/sdk/version.d.ts +59 -0
  37. package/dist/sdk/version.js +64 -0
  38. package/dist/sdk/version.js.map +1 -0
  39. package/dist/tools/bash.d.ts +4 -0
  40. package/dist/tools/bash.js +22 -2
  41. package/dist/tools/bash.js.map +1 -1
  42. package/dist/ui/components/chat-history.d.ts +2 -0
  43. package/dist/ui/components/chat-history.js +32 -81
  44. package/dist/ui/components/chat-history.js.map +1 -1
  45. package/dist/ui/components/chat-interface.js +3 -3
  46. package/dist/ui/components/chat-interface.js.map +1 -1
  47. package/dist/ui/components/status-bar.d.ts +2 -0
  48. package/dist/ui/components/status-bar.js +33 -9
  49. package/dist/ui/components/status-bar.js.map +1 -1
  50. package/dist/ui/components/tool-group-display.d.ts +15 -0
  51. package/dist/ui/components/tool-group-display.js +91 -0
  52. package/dist/ui/components/tool-group-display.js.map +1 -0
  53. package/dist/ui/hooks/use-enhanced-input.js +43 -6
  54. package/dist/ui/hooks/use-enhanced-input.js.map +1 -1
  55. package/dist/ui/hooks/use-input-handler.d.ts +2 -0
  56. package/dist/ui/hooks/use-input-handler.js +13 -7
  57. package/dist/ui/hooks/use-input-handler.js.map +1 -1
  58. package/dist/ui/utils/change-summarizer.d.ts +20 -0
  59. package/dist/ui/utils/change-summarizer.js +193 -0
  60. package/dist/ui/utils/change-summarizer.js.map +1 -0
  61. package/dist/ui/utils/tool-grouper.d.ts +62 -0
  62. package/dist/ui/utils/tool-grouper.js +224 -0
  63. package/dist/ui/utils/tool-grouper.js.map +1 -0
  64. package/dist/utils/config-loader.d.ts +4 -0
  65. package/dist/utils/config-loader.js.map +1 -1
  66. package/dist/utils/paste-utils.js +45 -19
  67. package/dist/utils/paste-utils.js.map +1 -1
  68. package/dist/utils/token-counter.d.ts +12 -0
  69. package/dist/utils/token-counter.js +32 -4
  70. package/dist/utils/token-counter.js.map +1 -1
  71. package/package.json +2 -2
  72. package/packages/schemas/package.json +1 -1
  73. package/.ax-cli/CUSTOM.md +0 -269
  74. package/.ax-cli/checkpoints/2025-11-20/checkpoint-11e9e0ba-c39d-4fd2-aa77-bc818811c921.json +0 -69
  75. package/.ax-cli/checkpoints/2025-11-20/checkpoint-2b260b98-b418-4c7c-9694-e2b94967e662.json +0 -24
  76. package/.ax-cli/checkpoints/2025-11-20/checkpoint-2dd84869-e62d-46c8-9885-7e45f37f36e2.json +0 -69
  77. package/.ax-cli/checkpoints/2025-11-20/checkpoint-484dc350-353f-4808-9ed1-ebb3cefdab37.json +0 -24
  78. package/.ax-cli/checkpoints/2025-11-20/checkpoint-74a18b87-6172-4215-962b-44bb9f46a662.json +0 -69
  79. package/.ax-cli/checkpoints/2025-11-20/checkpoint-7e03601e-e8ab-4cd7-9841-a74b66adf78f.json +0 -69
  80. package/.ax-cli/checkpoints/2025-11-20/checkpoint-7f9c6562-771f-4fd0-adcf-9e7e9ac34ae8.json +0 -44
  81. package/.ax-cli/checkpoints/2025-11-20/checkpoint-870a5fb9-6e82-4ff2-8ec8-af4c251cc514.json +0 -44
  82. package/.ax-cli/checkpoints/2025-11-20/checkpoint-93946601-0e83-456c-ba47-def9713124dd.json +0 -24
  83. package/.ax-cli/checkpoints/2025-11-20/checkpoint-e1ebe666-4c3a-4367-ba5c-27fe512a9c70.json +0 -24
  84. package/.ax-cli/checkpoints/2025-11-21/checkpoint-15743e7d-430c-4d76-b6fc-955d7a5c250c.json +0 -44
  85. package/.ax-cli/checkpoints/2025-11-21/checkpoint-25cf7679-0b3f-4988-83d7-704548fbba91.json +0 -69
  86. package/.ax-cli/checkpoints/2025-11-21/checkpoint-54aedbac-6db0-464e-8ebb-dbb3979e6dca.json +0 -24
  87. package/.ax-cli/checkpoints/2025-11-21/checkpoint-7658aed8-fe5d-4222-903f-1a7c63717ea7.json +0 -24
  88. package/.ax-cli/checkpoints/2025-11-21/checkpoint-c9c13497-40dc-4294-a327-6a5fc854eaa1.json +0 -69
  89. package/.ax-cli/checkpoints/metadata.json +0 -62
  90. package/.ax-cli/index.json +0 -44
  91. package/.ax-cli/memory.json +0 -62
  92. package/.ax-cli/settings.json +0 -1
  93. package/ax.config.json +0 -333
  94. package/dist/agent/chat-history-manager.d.ts +0 -56
  95. package/dist/agent/chat-history-manager.js +0 -150
  96. package/dist/agent/chat-history-manager.js.map +0 -1
  97. package/dist/agent/tool-manager.d.ts +0 -39
  98. package/dist/agent/tool-manager.js +0 -76
  99. package/dist/agent/tool-manager.js.map +0 -1
  100. package/dist/hooks/use-chat-reducer.d.ts +0 -61
  101. package/dist/hooks/use-chat-reducer.js +0 -118
  102. package/dist/hooks/use-chat-reducer.js.map +0 -1
  103. package/dist/hooks/use-enhanced-input.d.ts +0 -40
  104. package/dist/hooks/use-enhanced-input.js +0 -249
  105. package/dist/hooks/use-enhanced-input.js.map +0 -1
  106. package/dist/hooks/use-input-handler.d.ts +0 -46
  107. package/dist/hooks/use-input-handler.js +0 -1430
  108. package/dist/hooks/use-input-handler.js.map +0 -1
  109. package/dist/hooks/use-input-history.d.ts +0 -9
  110. package/dist/hooks/use-input-history.js +0 -112
  111. package/dist/hooks/use-input-history.js.map +0 -1
  112. package/dist/index.js.bak +0 -664
  113. package/dist/tools/web-search/engines/brave.d.ts +0 -16
  114. package/dist/tools/web-search/engines/brave.js +0 -99
  115. package/dist/tools/web-search/engines/brave.js.map +0 -1
  116. package/dist/tools/web-search/engines/tavily.d.ts +0 -17
  117. package/dist/tools/web-search/engines/tavily.js +0 -73
  118. package/dist/tools/web-search/engines/tavily.js.map +0 -1
  119. package/dist/utils/paste-collapse.d.ts +0 -46
  120. package/dist/utils/paste-collapse.js +0 -77
  121. package/dist/utils/paste-collapse.js.map +0 -1
  122. package/packages/schemas/dist/index.d.ts +0 -14
  123. package/packages/schemas/dist/index.d.ts.map +0 -1
  124. package/packages/schemas/dist/index.js +0 -19
  125. package/packages/schemas/dist/index.js.map +0 -1
  126. package/packages/schemas/dist/public/core/brand-types.d.ts +0 -308
  127. package/packages/schemas/dist/public/core/brand-types.d.ts.map +0 -1
  128. package/packages/schemas/dist/public/core/brand-types.js +0 -243
  129. package/packages/schemas/dist/public/core/brand-types.js.map +0 -1
  130. package/packages/schemas/dist/public/core/enums.d.ts +0 -227
  131. package/packages/schemas/dist/public/core/enums.d.ts.map +0 -1
  132. package/packages/schemas/dist/public/core/enums.js +0 -222
  133. package/packages/schemas/dist/public/core/enums.js.map +0 -1
  134. package/packages/schemas/dist/public/core/id-types.d.ts +0 -286
  135. package/packages/schemas/dist/public/core/id-types.d.ts.map +0 -1
  136. package/packages/schemas/dist/public/core/id-types.js +0 -136
  137. package/packages/schemas/dist/public/core/id-types.js.map +0 -1
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Progress Reporter - Shared event system for AX <-> ax-cli integration
3
+ *
4
+ * Allows AutomatosX agents to report progress to ax-cli UI in real-time.
5
+ * This creates a unified progress visibility system across both applications.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ /**
9
+ * Progress event types
10
+ */
11
+ export var ProgressEventType;
12
+ (function (ProgressEventType) {
13
+ /** Agent started a new task */
14
+ ProgressEventType["TASK_START"] = "task_start";
15
+ /** Agent made progress on current task */
16
+ ProgressEventType["TASK_PROGRESS"] = "task_progress";
17
+ /** Agent completed a task */
18
+ ProgressEventType["TASK_COMPLETE"] = "task_complete";
19
+ /** Agent encountered an error */
20
+ ProgressEventType["TASK_ERROR"] = "task_error";
21
+ /** Tool execution started */
22
+ ProgressEventType["TOOL_START"] = "tool_start";
23
+ /** Tool execution completed */
24
+ ProgressEventType["TOOL_COMPLETE"] = "tool_complete";
25
+ /** General status update */
26
+ ProgressEventType["STATUS_UPDATE"] = "status_update";
27
+ })(ProgressEventType || (ProgressEventType = {}));
28
+ /**
29
+ * Progress Reporter - Singleton event emitter for progress tracking
30
+ */
31
+ export class ProgressReporter extends EventEmitter {
32
+ static instance = null;
33
+ constructor() {
34
+ super();
35
+ // Allow more listeners (multiple agents can subscribe)
36
+ this.setMaxListeners(50);
37
+ }
38
+ /**
39
+ * Get the singleton instance
40
+ */
41
+ static getInstance() {
42
+ if (!ProgressReporter.instance) {
43
+ ProgressReporter.instance = new ProgressReporter();
44
+ }
45
+ return ProgressReporter.instance;
46
+ }
47
+ /**
48
+ * Reset the singleton (for testing)
49
+ */
50
+ static reset() {
51
+ if (ProgressReporter.instance) {
52
+ ProgressReporter.instance.removeAllListeners();
53
+ ProgressReporter.instance = null;
54
+ }
55
+ }
56
+ /**
57
+ * Report a progress event
58
+ */
59
+ report(event) {
60
+ const fullEvent = {
61
+ ...event,
62
+ timestamp: Date.now(),
63
+ };
64
+ this.emit('progress', fullEvent);
65
+ this.emit(event.type, fullEvent);
66
+ }
67
+ /**
68
+ * Report task start
69
+ */
70
+ taskStart(agentId, name, message) {
71
+ this.report({
72
+ type: ProgressEventType.TASK_START,
73
+ agentId,
74
+ name,
75
+ message,
76
+ progress: 0,
77
+ });
78
+ }
79
+ /**
80
+ * Report task progress
81
+ */
82
+ taskProgress(agentId, name, progress, message) {
83
+ this.report({
84
+ type: ProgressEventType.TASK_PROGRESS,
85
+ agentId,
86
+ name,
87
+ progress: Math.max(0, Math.min(100, progress)),
88
+ message,
89
+ });
90
+ }
91
+ /**
92
+ * Report task completion
93
+ */
94
+ taskComplete(agentId, name, message) {
95
+ this.report({
96
+ type: ProgressEventType.TASK_COMPLETE,
97
+ agentId,
98
+ name,
99
+ message,
100
+ progress: 100,
101
+ });
102
+ }
103
+ /**
104
+ * Report task error
105
+ */
106
+ taskError(agentId, name, error) {
107
+ this.report({
108
+ type: ProgressEventType.TASK_ERROR,
109
+ agentId,
110
+ name,
111
+ message: error,
112
+ });
113
+ }
114
+ /**
115
+ * Report tool execution start
116
+ */
117
+ toolStart(agentId, toolName, message) {
118
+ this.report({
119
+ type: ProgressEventType.TOOL_START,
120
+ agentId,
121
+ name: toolName,
122
+ message,
123
+ });
124
+ }
125
+ /**
126
+ * Report tool execution completion
127
+ */
128
+ toolComplete(agentId, toolName, message) {
129
+ this.report({
130
+ type: ProgressEventType.TOOL_COMPLETE,
131
+ agentId,
132
+ name: toolName,
133
+ message,
134
+ });
135
+ }
136
+ /**
137
+ * Report general status update
138
+ */
139
+ statusUpdate(agentId, message, metadata) {
140
+ this.report({
141
+ type: ProgressEventType.STATUS_UPDATE,
142
+ agentId,
143
+ name: 'status',
144
+ message,
145
+ metadata,
146
+ });
147
+ }
148
+ /**
149
+ * Subscribe to all progress events
150
+ */
151
+ onProgress(callback) {
152
+ this.on('progress', callback);
153
+ return () => this.off('progress', callback);
154
+ }
155
+ /**
156
+ * Subscribe to specific event type
157
+ */
158
+ onEvent(type, callback) {
159
+ this.on(type, callback);
160
+ return () => this.off(type, callback);
161
+ }
162
+ /**
163
+ * Get statistics about event emission
164
+ */
165
+ getStats() {
166
+ return {
167
+ listenerCount: this.listenerCount('progress'),
168
+ maxListeners: this.getMaxListeners(),
169
+ };
170
+ }
171
+ }
172
+ /**
173
+ * Get the global progress reporter instance
174
+ */
175
+ export function getProgressReporter() {
176
+ return ProgressReporter.getInstance();
177
+ }
178
+ //# sourceMappingURL=progress-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-reporter.js","sourceRoot":"","sources":["../../src/sdk/progress-reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Testing utilities for AX CLI SDK
3
+ *
4
+ * This module provides mock implementations and test helpers to make
5
+ * it easy to test code that uses the AX CLI SDK.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { EventEmitter } from 'events';
10
+ import type { ChatEntry, StreamingChunk } from '../agent/llm-agent.js';
11
+ import type { ToolResult } from '../types/index.js';
12
+ /**
13
+ * Mock agent for testing
14
+ *
15
+ * Implements the same interface as LLMAgent but with predictable,
16
+ * controllable behavior for testing.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * import { MockAgent } from '@defai.digital/ax-cli/sdk/testing';
21
+ *
22
+ * test('my integration', async () => {
23
+ * const agent = new MockAgent({
24
+ * responses: ['First response', 'Second response']
25
+ * });
26
+ *
27
+ * const result = await agent.processUserMessage('Hello');
28
+ * expect(result[0].content).toBe('First response');
29
+ * });
30
+ * ```
31
+ */
32
+ export declare class MockAgent extends EventEmitter {
33
+ private responses;
34
+ private currentResponseIndex;
35
+ private history;
36
+ private disposed;
37
+ /**
38
+ * Create a new mock agent
39
+ *
40
+ * @param options - Configuration for mock behavior
41
+ */
42
+ constructor(options?: {
43
+ /** Predefined responses to return (cycles through) */
44
+ responses?: string[];
45
+ });
46
+ /**
47
+ * Process a user message (mock implementation)
48
+ *
49
+ * Returns the next predefined response and adds it to history.
50
+ * Cycles through responses if called more times than responses available.
51
+ *
52
+ * @param message - User message (stored in history)
53
+ * @returns Mock chat history
54
+ */
55
+ processUserMessage(message: string): Promise<ChatEntry[]>;
56
+ /**
57
+ * Process user message with streaming (mock implementation)
58
+ *
59
+ * Yields mock stream chunks for the response.
60
+ */
61
+ processUserMessageStream(message: string): AsyncGenerator<StreamingChunk>;
62
+ /**
63
+ * Get chat history (mock implementation)
64
+ */
65
+ getChatHistory(): ChatEntry[];
66
+ /**
67
+ * Execute bash command (mock implementation)
68
+ *
69
+ * Always returns success with predefined output.
70
+ */
71
+ executeBashCommand(command: string): Promise<ToolResult>;
72
+ /**
73
+ * Get current directory (mock implementation)
74
+ */
75
+ getCurrentDirectory(): string;
76
+ /**
77
+ * Create checkpoint (mock implementation)
78
+ */
79
+ createCheckpoint(_description?: string): Promise<string>;
80
+ /**
81
+ * Rewind conversation (mock implementation)
82
+ */
83
+ rewindConversation(_checkpointId: string): Promise<{
84
+ success: boolean;
85
+ error?: string;
86
+ }>;
87
+ /**
88
+ * Check if bash is executing (mock implementation)
89
+ */
90
+ isBashExecuting(): boolean;
91
+ /**
92
+ * Dispose of mock agent
93
+ */
94
+ dispose(): Promise<void>;
95
+ /**
96
+ * Reset mock agent state
97
+ *
98
+ * Clears history and resets response index.
99
+ * Useful for reusing the same mock across multiple tests.
100
+ */
101
+ reset(): void;
102
+ /**
103
+ * Set new responses
104
+ *
105
+ * @param responses - New responses to use
106
+ */
107
+ setResponses(responses: string[]): void;
108
+ /**
109
+ * Get number of messages processed
110
+ */
111
+ getMessageCount(): number;
112
+ private checkDisposed;
113
+ }
114
+ /**
115
+ * Create a mock agent with predefined responses
116
+ *
117
+ * Convenience function for creating mock agents.
118
+ *
119
+ * @param responses - Predefined responses (optional)
120
+ * @returns Mock agent instance
121
+ *
122
+ * @example
123
+ * ```typescript
124
+ * import { createMockAgent } from '@defai.digital/ax-cli/sdk/testing';
125
+ *
126
+ * const agent = createMockAgent(['Hello!', 'How can I help?']);
127
+ * const result = await agent.processUserMessage('Hi');
128
+ * expect(result[0].content).toBe('Hello!');
129
+ * ```
130
+ */
131
+ export declare function createMockAgent(responses?: string[]): MockAgent;
132
+ /**
133
+ * Mock settings manager for testing
134
+ *
135
+ * Allows tests to control what settings are returned without
136
+ * needing actual config files.
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * import { MockSettingsManager } from '@defai.digital/ax-cli/sdk/testing';
141
+ *
142
+ * const settings = new MockSettingsManager({
143
+ * apiKey: 'test-key',
144
+ * baseURL: 'https://test.api.com',
145
+ * model: 'glm-4.6'
146
+ * });
147
+ * ```
148
+ */
149
+ export declare class MockSettingsManager {
150
+ private settings;
151
+ constructor(settings?: {
152
+ apiKey?: string;
153
+ baseURL?: string;
154
+ model?: string;
155
+ });
156
+ loadUserSettings(): void;
157
+ loadProjectSettings(): void;
158
+ getApiKey(): string | undefined;
159
+ getBaseURL(): string | undefined;
160
+ getCurrentModel(): string;
161
+ updateUserSetting(key: string, value: unknown): void;
162
+ saveUserSettings(): void;
163
+ }
164
+ /**
165
+ * Create a mock settings manager
166
+ *
167
+ * @param settings - Settings to return
168
+ * @returns Mock settings manager
169
+ *
170
+ * @example
171
+ * ```typescript
172
+ * import { createMockSettings } from '@defai.digital/ax-cli/sdk/testing';
173
+ *
174
+ * const settings = createMockSettings({
175
+ * apiKey: 'test-key',
176
+ * model: 'glm-4.6'
177
+ * });
178
+ * ```
179
+ */
180
+ export declare function createMockSettings(settings?: {
181
+ apiKey?: string;
182
+ baseURL?: string;
183
+ model?: string;
184
+ }): MockSettingsManager;
@@ -0,0 +1,291 @@
1
+ /**
2
+ * Testing utilities for AX CLI SDK
3
+ *
4
+ * This module provides mock implementations and test helpers to make
5
+ * it easy to test code that uses the AX CLI SDK.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { EventEmitter } from 'events';
10
+ /**
11
+ * Mock agent for testing
12
+ *
13
+ * Implements the same interface as LLMAgent but with predictable,
14
+ * controllable behavior for testing.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * import { MockAgent } from '@defai.digital/ax-cli/sdk/testing';
19
+ *
20
+ * test('my integration', async () => {
21
+ * const agent = new MockAgent({
22
+ * responses: ['First response', 'Second response']
23
+ * });
24
+ *
25
+ * const result = await agent.processUserMessage('Hello');
26
+ * expect(result[0].content).toBe('First response');
27
+ * });
28
+ * ```
29
+ */
30
+ export class MockAgent extends EventEmitter {
31
+ responses;
32
+ currentResponseIndex = 0;
33
+ history = [];
34
+ disposed = false;
35
+ /**
36
+ * Create a new mock agent
37
+ *
38
+ * @param options - Configuration for mock behavior
39
+ */
40
+ constructor(options = {}) {
41
+ super();
42
+ this.responses = options.responses || ['Mock response'];
43
+ }
44
+ /**
45
+ * Process a user message (mock implementation)
46
+ *
47
+ * Returns the next predefined response and adds it to history.
48
+ * Cycles through responses if called more times than responses available.
49
+ *
50
+ * @param message - User message (stored in history)
51
+ * @returns Mock chat history
52
+ */
53
+ async processUserMessage(message) {
54
+ this.checkDisposed();
55
+ // Add user message to history
56
+ const userEntry = {
57
+ type: 'user',
58
+ content: message,
59
+ timestamp: new Date(),
60
+ };
61
+ this.history.push(userEntry);
62
+ // Get next response (cycle through)
63
+ const response = this.responses[this.currentResponseIndex % this.responses.length];
64
+ this.currentResponseIndex++;
65
+ // Add assistant response to history
66
+ const assistantEntry = {
67
+ type: 'assistant',
68
+ content: response,
69
+ timestamp: new Date(),
70
+ };
71
+ this.history.push(assistantEntry);
72
+ // Emit stream event for compatibility
73
+ this.emit('stream', {
74
+ type: 'content',
75
+ content: response,
76
+ });
77
+ this.emit('stream', {
78
+ type: 'done',
79
+ });
80
+ return [...this.history];
81
+ }
82
+ /**
83
+ * Process user message with streaming (mock implementation)
84
+ *
85
+ * Yields mock stream chunks for the response.
86
+ */
87
+ async *processUserMessageStream(message) {
88
+ this.checkDisposed();
89
+ // Add user message to history
90
+ const userEntry = {
91
+ type: 'user',
92
+ content: message,
93
+ timestamp: new Date(),
94
+ };
95
+ this.history.push(userEntry);
96
+ // Get next response
97
+ const response = this.responses[this.currentResponseIndex % this.responses.length];
98
+ this.currentResponseIndex++;
99
+ // Stream the response character by character (for realistic testing)
100
+ const words = response.split(' ');
101
+ for (const word of words) {
102
+ yield {
103
+ type: 'content',
104
+ content: word + ' ',
105
+ };
106
+ }
107
+ // Add assistant response to history
108
+ const assistantEntry = {
109
+ type: 'assistant',
110
+ content: response,
111
+ timestamp: new Date(),
112
+ };
113
+ this.history.push(assistantEntry);
114
+ yield {
115
+ type: 'done',
116
+ };
117
+ }
118
+ /**
119
+ * Get chat history (mock implementation)
120
+ */
121
+ getChatHistory() {
122
+ this.checkDisposed();
123
+ return [...this.history];
124
+ }
125
+ /**
126
+ * Execute bash command (mock implementation)
127
+ *
128
+ * Always returns success with predefined output.
129
+ */
130
+ async executeBashCommand(command) {
131
+ this.checkDisposed();
132
+ return {
133
+ success: true,
134
+ output: `Mock output for command: ${command}`,
135
+ };
136
+ }
137
+ /**
138
+ * Get current directory (mock implementation)
139
+ */
140
+ getCurrentDirectory() {
141
+ this.checkDisposed();
142
+ return '/mock/directory';
143
+ }
144
+ /**
145
+ * Create checkpoint (mock implementation)
146
+ */
147
+ async createCheckpoint(_description) {
148
+ this.checkDisposed();
149
+ return `mock-checkpoint-${Date.now()}`;
150
+ }
151
+ /**
152
+ * Rewind conversation (mock implementation)
153
+ */
154
+ async rewindConversation(_checkpointId) {
155
+ this.checkDisposed();
156
+ this.history = [];
157
+ return { success: true };
158
+ }
159
+ /**
160
+ * Check if bash is executing (mock implementation)
161
+ */
162
+ isBashExecuting() {
163
+ this.checkDisposed();
164
+ return false;
165
+ }
166
+ /**
167
+ * Dispose of mock agent
168
+ */
169
+ async dispose() {
170
+ if (this.disposed)
171
+ return;
172
+ this.disposed = true;
173
+ this.removeAllListeners();
174
+ this.history = [];
175
+ this.responses = [];
176
+ }
177
+ /**
178
+ * Reset mock agent state
179
+ *
180
+ * Clears history and resets response index.
181
+ * Useful for reusing the same mock across multiple tests.
182
+ */
183
+ reset() {
184
+ this.history = [];
185
+ this.currentResponseIndex = 0;
186
+ }
187
+ /**
188
+ * Set new responses
189
+ *
190
+ * @param responses - New responses to use
191
+ */
192
+ setResponses(responses) {
193
+ this.responses = responses;
194
+ this.currentResponseIndex = 0;
195
+ }
196
+ /**
197
+ * Get number of messages processed
198
+ */
199
+ getMessageCount() {
200
+ return this.history.filter(entry => entry.type === 'user').length;
201
+ }
202
+ checkDisposed() {
203
+ if (this.disposed) {
204
+ throw new Error('MockAgent has been disposed and cannot be used');
205
+ }
206
+ }
207
+ }
208
+ /**
209
+ * Create a mock agent with predefined responses
210
+ *
211
+ * Convenience function for creating mock agents.
212
+ *
213
+ * @param responses - Predefined responses (optional)
214
+ * @returns Mock agent instance
215
+ *
216
+ * @example
217
+ * ```typescript
218
+ * import { createMockAgent } from '@defai.digital/ax-cli/sdk/testing';
219
+ *
220
+ * const agent = createMockAgent(['Hello!', 'How can I help?']);
221
+ * const result = await agent.processUserMessage('Hi');
222
+ * expect(result[0].content).toBe('Hello!');
223
+ * ```
224
+ */
225
+ export function createMockAgent(responses) {
226
+ return new MockAgent({ responses });
227
+ }
228
+ /**
229
+ * Mock settings manager for testing
230
+ *
231
+ * Allows tests to control what settings are returned without
232
+ * needing actual config files.
233
+ *
234
+ * @example
235
+ * ```typescript
236
+ * import { MockSettingsManager } from '@defai.digital/ax-cli/sdk/testing';
237
+ *
238
+ * const settings = new MockSettingsManager({
239
+ * apiKey: 'test-key',
240
+ * baseURL: 'https://test.api.com',
241
+ * model: 'glm-4.6'
242
+ * });
243
+ * ```
244
+ */
245
+ export class MockSettingsManager {
246
+ settings;
247
+ constructor(settings = {}) {
248
+ this.settings = settings;
249
+ }
250
+ loadUserSettings() {
251
+ // No-op for mock
252
+ }
253
+ loadProjectSettings() {
254
+ // No-op for mock
255
+ }
256
+ getApiKey() {
257
+ return this.settings.apiKey;
258
+ }
259
+ getBaseURL() {
260
+ return this.settings.baseURL;
261
+ }
262
+ getCurrentModel() {
263
+ return this.settings.model || 'glm-4.6';
264
+ }
265
+ updateUserSetting(key, value) {
266
+ this.settings[key] = value;
267
+ }
268
+ saveUserSettings() {
269
+ // No-op for mock
270
+ }
271
+ }
272
+ /**
273
+ * Create a mock settings manager
274
+ *
275
+ * @param settings - Settings to return
276
+ * @returns Mock settings manager
277
+ *
278
+ * @example
279
+ * ```typescript
280
+ * import { createMockSettings } from '@defai.digital/ax-cli/sdk/testing';
281
+ *
282
+ * const settings = createMockSettings({
283
+ * apiKey: 'test-key',
284
+ * model: 'glm-4.6'
285
+ * });
286
+ * ```
287
+ */
288
+ export function createMockSettings(settings) {
289
+ return new MockSettingsManager(settings);
290
+ }
291
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/sdk/testing.ts"],"names":[],"mappings":"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"}