monty-autonomous-fullstack-dev-multillm 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/LICENSE +81 -0
  2. package/README.md +608 -0
  3. package/bin/cli.js +448 -0
  4. package/dist/agents/coding.d.ts +15 -0
  5. package/dist/agents/coding.d.ts.map +1 -0
  6. package/dist/agents/coding.js +189 -0
  7. package/dist/agents/coding.js.map +1 -0
  8. package/dist/agents/initializer.d.ts +15 -0
  9. package/dist/agents/initializer.d.ts.map +1 -0
  10. package/dist/agents/initializer.js +87 -0
  11. package/dist/agents/initializer.js.map +1 -0
  12. package/dist/agents/prompts/arbitrator.md +143 -0
  13. package/dist/agents/prompts/coding.md +247 -0
  14. package/dist/agents/prompts/initializer.md +98 -0
  15. package/dist/config/agent-config.d.ts +103 -0
  16. package/dist/config/agent-config.d.ts.map +1 -0
  17. package/dist/config/agent-config.js +138 -0
  18. package/dist/config/agent-config.js.map +1 -0
  19. package/dist/config/auth-config.d.ts +152 -0
  20. package/dist/config/auth-config.d.ts.map +1 -0
  21. package/dist/config/auth-config.js +139 -0
  22. package/dist/config/auth-config.js.map +1 -0
  23. package/dist/config/mcp-config.d.ts +109 -0
  24. package/dist/config/mcp-config.d.ts.map +1 -0
  25. package/dist/config/mcp-config.js +234 -0
  26. package/dist/config/mcp-config.js.map +1 -0
  27. package/dist/config/provider-config.d.ts +139 -0
  28. package/dist/config/provider-config.d.ts.map +1 -0
  29. package/dist/config/provider-config.js +344 -0
  30. package/dist/config/provider-config.js.map +1 -0
  31. package/dist/config/subagents-config.d.ts +85 -0
  32. package/dist/config/subagents-config.d.ts.map +1 -0
  33. package/dist/config/subagents-config.js +430 -0
  34. package/dist/config/subagents-config.js.map +1 -0
  35. package/dist/index.d.ts +14 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +385 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/orchestrator/arbitrator.d.ts +93 -0
  40. package/dist/orchestrator/arbitrator.d.ts.map +1 -0
  41. package/dist/orchestrator/arbitrator.js +330 -0
  42. package/dist/orchestrator/arbitrator.js.map +1 -0
  43. package/dist/orchestrator/index.d.ts +113 -0
  44. package/dist/orchestrator/index.d.ts.map +1 -0
  45. package/dist/orchestrator/index.js +217 -0
  46. package/dist/orchestrator/index.js.map +1 -0
  47. package/dist/orchestrator/review-coordinator.d.ts +143 -0
  48. package/dist/orchestrator/review-coordinator.d.ts.map +1 -0
  49. package/dist/orchestrator/review-coordinator.js +401 -0
  50. package/dist/orchestrator/review-coordinator.js.map +1 -0
  51. package/dist/orchestrator/task-classifier.d.ts +87 -0
  52. package/dist/orchestrator/task-classifier.d.ts.map +1 -0
  53. package/dist/orchestrator/task-classifier.js +250 -0
  54. package/dist/orchestrator/task-classifier.js.map +1 -0
  55. package/dist/providers/anthropic-provider.d.ts +64 -0
  56. package/dist/providers/anthropic-provider.d.ts.map +1 -0
  57. package/dist/providers/anthropic-provider.js +264 -0
  58. package/dist/providers/anthropic-provider.js.map +1 -0
  59. package/dist/providers/base-provider.d.ts +219 -0
  60. package/dist/providers/base-provider.d.ts.map +1 -0
  61. package/dist/providers/base-provider.js +143 -0
  62. package/dist/providers/base-provider.js.map +1 -0
  63. package/dist/providers/cursor-provider.d.ts +82 -0
  64. package/dist/providers/cursor-provider.d.ts.map +1 -0
  65. package/dist/providers/cursor-provider.js +321 -0
  66. package/dist/providers/cursor-provider.js.map +1 -0
  67. package/dist/providers/google-provider.d.ts +75 -0
  68. package/dist/providers/google-provider.d.ts.map +1 -0
  69. package/dist/providers/google-provider.js +274 -0
  70. package/dist/providers/google-provider.js.map +1 -0
  71. package/dist/providers/index.d.ts +92 -0
  72. package/dist/providers/index.d.ts.map +1 -0
  73. package/dist/providers/index.js +233 -0
  74. package/dist/providers/index.js.map +1 -0
  75. package/dist/providers/openai-provider.d.ts +83 -0
  76. package/dist/providers/openai-provider.d.ts.map +1 -0
  77. package/dist/providers/openai-provider.js +295 -0
  78. package/dist/providers/openai-provider.js.map +1 -0
  79. package/dist/templates/feature_list.template.json +66 -0
  80. package/dist/templates/progress.template.txt +51 -0
  81. package/dist/utils/auth-manager.d.ts +121 -0
  82. package/dist/utils/auth-manager.d.ts.map +1 -0
  83. package/dist/utils/auth-manager.js +560 -0
  84. package/dist/utils/auth-manager.js.map +1 -0
  85. package/dist/utils/budget-enforcer.d.ts +181 -0
  86. package/dist/utils/budget-enforcer.d.ts.map +1 -0
  87. package/dist/utils/budget-enforcer.js +386 -0
  88. package/dist/utils/budget-enforcer.js.map +1 -0
  89. package/dist/utils/chatgpt-detector.d.ts +51 -0
  90. package/dist/utils/chatgpt-detector.d.ts.map +1 -0
  91. package/dist/utils/chatgpt-detector.js +274 -0
  92. package/dist/utils/chatgpt-detector.js.map +1 -0
  93. package/dist/utils/claude-code-detector.d.ts +39 -0
  94. package/dist/utils/claude-code-detector.d.ts.map +1 -0
  95. package/dist/utils/claude-code-detector.js +153 -0
  96. package/dist/utils/claude-code-detector.js.map +1 -0
  97. package/dist/utils/code-quality.d.ts +58 -0
  98. package/dist/utils/code-quality.d.ts.map +1 -0
  99. package/dist/utils/code-quality.js +258 -0
  100. package/dist/utils/code-quality.js.map +1 -0
  101. package/dist/utils/context-primer.d.ts +50 -0
  102. package/dist/utils/context-primer.d.ts.map +1 -0
  103. package/dist/utils/context-primer.js +429 -0
  104. package/dist/utils/context-primer.js.map +1 -0
  105. package/dist/utils/dependency-management.d.ts +40 -0
  106. package/dist/utils/dependency-management.d.ts.map +1 -0
  107. package/dist/utils/dependency-management.js +123 -0
  108. package/dist/utils/dependency-management.js.map +1 -0
  109. package/dist/utils/environment-validation.d.ts +33 -0
  110. package/dist/utils/environment-validation.d.ts.map +1 -0
  111. package/dist/utils/environment-validation.js +136 -0
  112. package/dist/utils/environment-validation.js.map +1 -0
  113. package/dist/utils/error-recovery.d.ts +60 -0
  114. package/dist/utils/error-recovery.d.ts.map +1 -0
  115. package/dist/utils/error-recovery.js +183 -0
  116. package/dist/utils/error-recovery.js.map +1 -0
  117. package/dist/utils/feature-list.d.ts +102 -0
  118. package/dist/utils/feature-list.d.ts.map +1 -0
  119. package/dist/utils/feature-list.js +191 -0
  120. package/dist/utils/feature-list.js.map +1 -0
  121. package/dist/utils/gemini-detector.d.ts +65 -0
  122. package/dist/utils/gemini-detector.d.ts.map +1 -0
  123. package/dist/utils/gemini-detector.js +340 -0
  124. package/dist/utils/gemini-detector.js.map +1 -0
  125. package/dist/utils/git-utils.d.ts +48 -0
  126. package/dist/utils/git-utils.d.ts.map +1 -0
  127. package/dist/utils/git-utils.js +110 -0
  128. package/dist/utils/git-utils.js.map +1 -0
  129. package/dist/utils/health-check.d.ts +32 -0
  130. package/dist/utils/health-check.d.ts.map +1 -0
  131. package/dist/utils/health-check.js +152 -0
  132. package/dist/utils/health-check.js.map +1 -0
  133. package/dist/utils/hooks-manager.d.ts +154 -0
  134. package/dist/utils/hooks-manager.d.ts.map +1 -0
  135. package/dist/utils/hooks-manager.js +359 -0
  136. package/dist/utils/hooks-manager.js.map +1 -0
  137. package/dist/utils/multi-auth-manager.d.ts +144 -0
  138. package/dist/utils/multi-auth-manager.d.ts.map +1 -0
  139. package/dist/utils/multi-auth-manager.js +588 -0
  140. package/dist/utils/multi-auth-manager.js.map +1 -0
  141. package/dist/utils/progress.d.ts +49 -0
  142. package/dist/utils/progress.d.ts.map +1 -0
  143. package/dist/utils/progress.js +209 -0
  144. package/dist/utils/progress.js.map +1 -0
  145. package/dist/utils/project-detection.d.ts +40 -0
  146. package/dist/utils/project-detection.d.ts.map +1 -0
  147. package/dist/utils/project-detection.js +230 -0
  148. package/dist/utils/project-detection.js.map +1 -0
  149. package/dist/utils/session-manager.d.ts +119 -0
  150. package/dist/utils/session-manager.d.ts.map +1 -0
  151. package/dist/utils/session-manager.js +389 -0
  152. package/dist/utils/session-manager.js.map +1 -0
  153. package/dist/utils/skills-manager.d.ts +113 -0
  154. package/dist/utils/skills-manager.d.ts.map +1 -0
  155. package/dist/utils/skills-manager.js +332 -0
  156. package/dist/utils/skills-manager.js.map +1 -0
  157. package/dist/utils/structured-output.d.ts +117 -0
  158. package/dist/utils/structured-output.d.ts.map +1 -0
  159. package/dist/utils/structured-output.js +191 -0
  160. package/dist/utils/structured-output.js.map +1 -0
  161. package/dist/utils/subagent-manager.d.ts +143 -0
  162. package/dist/utils/subagent-manager.d.ts.map +1 -0
  163. package/dist/utils/subagent-manager.js +326 -0
  164. package/dist/utils/subagent-manager.js.map +1 -0
  165. package/dist/utils/supabase-setup.d.ts +50 -0
  166. package/dist/utils/supabase-setup.d.ts.map +1 -0
  167. package/dist/utils/supabase-setup.js +151 -0
  168. package/dist/utils/supabase-setup.js.map +1 -0
  169. package/dist/utils/token-refresh.d.ts +21 -0
  170. package/dist/utils/token-refresh.d.ts.map +1 -0
  171. package/dist/utils/token-refresh.js +77 -0
  172. package/dist/utils/token-refresh.js.map +1 -0
  173. package/dist/utils/tos-warning.d.ts +115 -0
  174. package/dist/utils/tos-warning.d.ts.map +1 -0
  175. package/dist/utils/tos-warning.js +304 -0
  176. package/dist/utils/tos-warning.js.map +1 -0
  177. package/dist/utils/usage-monitor.d.ts +156 -0
  178. package/dist/utils/usage-monitor.d.ts.map +1 -0
  179. package/dist/utils/usage-monitor.js +296 -0
  180. package/dist/utils/usage-monitor.js.map +1 -0
  181. package/package.json +105 -0
  182. package/scripts/init.ps1 +73 -0
  183. package/scripts/init.sh +86 -0
  184. package/scripts/test-auth.sh +90 -0
  185. package/templates/feature_list.template.json +66 -0
  186. package/templates/progress.template.txt +51 -0
@@ -0,0 +1,295 @@
1
+ /**
2
+ * OpenAI Provider (Codex SDK)
3
+ * Wrapper around OpenAI's Codex SDK for multi-provider orchestration.
4
+ * Supports thread-based conversations and code execution.
5
+ *
6
+ * Copyright (c) 2025 Dobeu Tech Solutions LLC
7
+ * Licensed under CC BY-NC 4.0
8
+ */
9
+ import { BaseProvider, } from './base-provider.js';
10
+ import { PROVIDER_CONFIGS, } from '../config/provider-config.js';
11
+ /* eslint-enable @typescript-eslint/no-explicit-any */
12
+ /**
13
+ * OpenAI Provider Implementation
14
+ * Wraps the Codex SDK for use in multi-provider orchestration
15
+ */
16
+ export class OpenAIProvider extends BaseProvider {
17
+ name = 'openai';
18
+ displayName = 'Codex (OpenAI)';
19
+ packageName = '@openai/codex-sdk';
20
+ config = PROVIDER_CONFIGS.openai;
21
+ apiKey = null;
22
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
+ codexClient = null;
24
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
+ currentThread = null;
26
+ currentThreadId = null;
27
+ constructor(apiKey) {
28
+ super();
29
+ this.apiKey = apiKey ?? process.env.OPENAI_API_KEY ?? null;
30
+ this.status.authenticated = !!this.apiKey;
31
+ this.status.available = false; // Will be set after SDK initialization
32
+ }
33
+ /**
34
+ * Initialize the Codex SDK client
35
+ */
36
+ async initializeClient() {
37
+ if (this.codexClient)
38
+ return true;
39
+ try {
40
+ // Dynamic import of Codex SDK (optional dependency)
41
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
+ let CodexModule;
43
+ try {
44
+ CodexModule = await import('@openai/codex-sdk');
45
+ }
46
+ catch {
47
+ console.error('Codex SDK not found. Install with: npm install @openai/codex-sdk');
48
+ this.status.available = false;
49
+ return false;
50
+ }
51
+ const Codex = CodexModule.default || CodexModule.Codex;
52
+ if (!Codex) {
53
+ console.error('Codex SDK not found. Install with: npm install @openai/codex-sdk');
54
+ return false;
55
+ }
56
+ this.codexClient = new Codex({
57
+ apiKey: this.apiKey,
58
+ });
59
+ this.status.available = true;
60
+ return true;
61
+ }
62
+ catch (error) {
63
+ const message = error instanceof Error ? error.message : String(error);
64
+ console.warn(`Could not initialize Codex SDK: ${message}`);
65
+ console.warn('Install with: npm install @openai/codex-sdk');
66
+ this.status.available = false;
67
+ return false;
68
+ }
69
+ }
70
+ /**
71
+ * Execute a query using the Codex SDK
72
+ */
73
+ async *query(prompt, options) {
74
+ const startTime = Date.now();
75
+ try {
76
+ // Initialize client if needed
77
+ if (!await this.initializeClient()) {
78
+ yield {
79
+ type: 'error',
80
+ content: [{
81
+ type: 'text',
82
+ text: 'Codex SDK not available. Install with: npm install @openai/codex-sdk',
83
+ }],
84
+ metadata: {
85
+ provider: this.name,
86
+ latency_ms: Date.now() - startTime,
87
+ },
88
+ };
89
+ return;
90
+ }
91
+ // Start or resume thread
92
+ if (!this.currentThread) {
93
+ this.currentThread = this.codexClient.startThread();
94
+ this.currentThreadId = this.currentThread.id;
95
+ }
96
+ // Execute query
97
+ const result = await this.currentThread.run(prompt);
98
+ // Normalize and yield result
99
+ const message = this.normalizeMessage(result);
100
+ message.metadata = {
101
+ ...message.metadata,
102
+ provider: this.name,
103
+ thread_id: this.currentThreadId ?? undefined,
104
+ latency_ms: Date.now() - startTime,
105
+ };
106
+ yield message;
107
+ // Yield final result message
108
+ yield {
109
+ type: 'result',
110
+ subtype: 'success',
111
+ content: [],
112
+ metadata: {
113
+ provider: this.name,
114
+ thread_id: this.currentThreadId ?? undefined,
115
+ latency_ms: Date.now() - startTime,
116
+ },
117
+ };
118
+ this.updateStatus(true);
119
+ }
120
+ catch (error) {
121
+ const errorMessage = error instanceof Error ? error.message : String(error);
122
+ this.updateStatus(false, errorMessage);
123
+ yield {
124
+ type: 'error',
125
+ content: [{
126
+ type: 'text',
127
+ text: `OpenAI provider error: ${errorMessage}`,
128
+ }],
129
+ metadata: {
130
+ provider: this.name,
131
+ latency_ms: Date.now() - startTime,
132
+ },
133
+ };
134
+ }
135
+ }
136
+ /**
137
+ * Validate OpenAI API credentials
138
+ */
139
+ async validateCredentials() {
140
+ const key = this.apiKey ?? process.env.OPENAI_API_KEY;
141
+ if (!key) {
142
+ this.status.authenticated = false;
143
+ return false;
144
+ }
145
+ try {
146
+ // Make a minimal API request to validate the key
147
+ const response = await fetch('https://api.openai.com/v1/models', {
148
+ method: 'GET',
149
+ headers: {
150
+ 'Authorization': `Bearer ${key}`,
151
+ },
152
+ });
153
+ const isValid = response.status === 200;
154
+ this.status.authenticated = isValid;
155
+ return isValid;
156
+ }
157
+ catch (error) {
158
+ console.warn('Could not validate OpenAI key online');
159
+ return true;
160
+ }
161
+ }
162
+ /**
163
+ * List available OpenAI models
164
+ */
165
+ async listModels() {
166
+ return this.config.models.map(model => ({
167
+ id: model.id,
168
+ name: model.name,
169
+ contextWindow: model.contextWindow,
170
+ costPerMToken: model.costPerMToken,
171
+ capabilities: model.capabilities,
172
+ }));
173
+ }
174
+ /**
175
+ * Get OpenAI provider capabilities
176
+ */
177
+ getCapabilities() {
178
+ return { ...this.config.capabilities };
179
+ }
180
+ /**
181
+ * Get list of supported standard tools
182
+ */
183
+ getSupportedTools() {
184
+ return Object.entries(this.config.toolMapping)
185
+ .filter(([_, mapped]) => mapped !== null)
186
+ .map(([standard]) => standard);
187
+ }
188
+ /**
189
+ * Map standard tool name to OpenAI tool name
190
+ */
191
+ mapToolName(standardTool) {
192
+ const mapped = this.config.toolMapping[standardTool];
193
+ return mapped ?? null;
194
+ }
195
+ /**
196
+ * Resume a previous thread
197
+ */
198
+ async resumeThread(threadId) {
199
+ if (!await this.initializeClient()) {
200
+ return false;
201
+ }
202
+ try {
203
+ this.currentThread = this.codexClient.resumeThread(threadId);
204
+ this.currentThreadId = threadId;
205
+ return true;
206
+ }
207
+ catch (error) {
208
+ console.error('Failed to resume thread:', error);
209
+ return false;
210
+ }
211
+ }
212
+ /**
213
+ * Get current thread ID
214
+ */
215
+ getCurrentThreadId() {
216
+ return this.currentThreadId;
217
+ }
218
+ /**
219
+ * Clear current thread (start fresh on next query)
220
+ */
221
+ clearThread() {
222
+ this.currentThread = null;
223
+ this.currentThreadId = null;
224
+ }
225
+ /**
226
+ * Normalize Codex result to standard format
227
+ */
228
+ normalizeMessage(rawMessage) {
229
+ const result = rawMessage;
230
+ const content = [];
231
+ // Add main content
232
+ if (result.content) {
233
+ content.push({
234
+ type: 'text',
235
+ text: result.content,
236
+ });
237
+ }
238
+ // Add tool calls if present
239
+ if (result.tool_calls) {
240
+ for (const toolCall of result.tool_calls) {
241
+ content.push({
242
+ type: 'tool_use',
243
+ id: `tool_${Date.now()}_${Math.random().toString(36).slice(2)}`,
244
+ name: toolCall.name,
245
+ input: toolCall.arguments,
246
+ });
247
+ if (toolCall.result) {
248
+ content.push({
249
+ type: 'tool_result',
250
+ tool_use_id: `tool_${Date.now()}`,
251
+ content: toolCall.result,
252
+ });
253
+ }
254
+ }
255
+ }
256
+ return {
257
+ type: 'assistant',
258
+ content,
259
+ metadata: {
260
+ provider: this.name,
261
+ usage: result.usage ? {
262
+ input_tokens: result.usage.prompt_tokens,
263
+ output_tokens: result.usage.completion_tokens,
264
+ } : undefined,
265
+ },
266
+ };
267
+ }
268
+ /**
269
+ * Set API key at runtime
270
+ */
271
+ setApiKey(key) {
272
+ this.apiKey = key;
273
+ this.status.authenticated = true;
274
+ // Reset client to use new key
275
+ this.codexClient = null;
276
+ this.currentThread = null;
277
+ this.currentThreadId = null;
278
+ }
279
+ /**
280
+ * Get the current API key (masked for display)
281
+ */
282
+ getApiKeyPreview() {
283
+ if (!this.apiKey)
284
+ return null;
285
+ return `${this.apiKey.slice(0, 8)}...${this.apiKey.slice(-4)}`;
286
+ }
287
+ }
288
+ /**
289
+ * Create a new OpenAI provider instance
290
+ */
291
+ export function createOpenAIProvider(apiKey) {
292
+ return new OpenAIProvider(apiKey);
293
+ }
294
+ export default OpenAIProvider;
295
+ //# sourceMappingURL=openai-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-provider.js","sourceRoot":"","sources":["../../src/providers/openai-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ {
2
+ "project": {
3
+ "name": "",
4
+ "description": "",
5
+ "created_at": "",
6
+ "stack": "fullstack-web"
7
+ },
8
+ "features": [
9
+ {
10
+ "id": "feat-001",
11
+ "category": "functional",
12
+ "priority": 1,
13
+ "description": "Example: New chat button creates a fresh conversation",
14
+ "steps": [
15
+ "Navigate to main interface",
16
+ "Click the 'New Chat' button",
17
+ "Verify a new conversation is created",
18
+ "Check that chat area shows welcome state",
19
+ "Verify conversation appears in sidebar"
20
+ ],
21
+ "passes": false,
22
+ "last_tested": null,
23
+ "tested_by": null,
24
+ "notes": ""
25
+ },
26
+ {
27
+ "id": "feat-002",
28
+ "category": "ui",
29
+ "priority": 2,
30
+ "description": "Example: Page is responsive on mobile viewport",
31
+ "steps": [
32
+ "Set viewport to 375x667 (iPhone SE)",
33
+ "Navigate to main page",
34
+ "Verify all elements are visible",
35
+ "Verify no horizontal scroll",
36
+ "Verify touch targets are adequate size"
37
+ ],
38
+ "passes": false,
39
+ "last_tested": null,
40
+ "tested_by": null,
41
+ "notes": ""
42
+ },
43
+ {
44
+ "id": "feat-003",
45
+ "category": "integration",
46
+ "priority": 3,
47
+ "description": "Example: API returns valid response for GET request",
48
+ "steps": [
49
+ "Start the development server",
50
+ "Send GET request to /api/health",
51
+ "Verify response status is 200",
52
+ "Verify response contains expected fields",
53
+ "Verify response time is under 500ms"
54
+ ],
55
+ "passes": false,
56
+ "last_tested": null,
57
+ "tested_by": null,
58
+ "notes": ""
59
+ }
60
+ ],
61
+ "metadata": {
62
+ "total_features": 3,
63
+ "passing_features": 0,
64
+ "last_updated": ""
65
+ }
66
+ }
@@ -0,0 +1,51 @@
1
+ ================================================================================
2
+ PROJECT: [Project Name]
3
+ CREATED: [Date]
4
+ LAST SESSION: [Date/Time]
5
+ ================================================================================
6
+
7
+ ## PROJECT OVERVIEW
8
+ [Brief description of the project and its goals. This section should provide
9
+ enough context for any agent to understand what is being built and why.]
10
+
11
+ ## CURRENT STATE
12
+ - Total Features: X
13
+ - Completed: Y
14
+ - Remaining: Z
15
+ - Last Feature Worked On: [feature-id]
16
+
17
+ ## SESSION LOG
18
+ ### [Date/Time]
19
+ - Agent: [initializer/coding]
20
+ - Actions taken:
21
+ * [Action 1]
22
+ * [Action 2]
23
+ * [Action 3]
24
+ - Features completed: [feat-001, feat-002]
25
+ - Issues encountered: [list any problems]
26
+ - Next steps:
27
+ * [Recommended action 1]
28
+ * [Recommended action 2]
29
+
30
+ ## KNOWN ISSUES
31
+ - [Issue 1: Description and any workarounds]
32
+ - [Issue 2: Description and any workarounds]
33
+
34
+ ## NOTES FOR NEXT SESSION
35
+ - [Important context that the next agent should know]
36
+ - [Pending decisions that need to be made]
37
+ - [Dependencies or blockers to be aware of]
38
+
39
+ ## ENVIRONMENT SETUP
40
+ - Dev server command: npm run dev
41
+ - Test command: npm test
42
+ - Build command: npm run build
43
+ - Default URL: http://localhost:3000
44
+
45
+ ## DEPENDENCIES
46
+ - [List key dependencies and versions]
47
+ - [Note any special configuration required]
48
+
49
+ ================================================================================
50
+ END OF PROGRESS FILE
51
+ ================================================================================
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Authentication Manager
3
+ * Handles user authentication, credential storage, and subscription validation.
4
+ *
5
+ * Copyright (c) 2025 Dobeu Tech Solutions LLC
6
+ * Licensed under CC BY-NC 4.0
7
+ */
8
+ import { type UserCredentials, type AuthMethod, type SubscriptionTier } from '../config/auth-config.js';
9
+ /**
10
+ * AuthManager - Singleton for managing authentication state
11
+ */
12
+ export declare class AuthManager {
13
+ private static instance;
14
+ private session;
15
+ private constructor();
16
+ /**
17
+ * Get the singleton instance
18
+ */
19
+ static getInstance(): AuthManager;
20
+ /**
21
+ * Ensure the config directory exists
22
+ */
23
+ private ensureConfigDir;
24
+ /**
25
+ * Load credentials from file
26
+ */
27
+ loadCredentials(): UserCredentials | null;
28
+ /**
29
+ * Save credentials to file
30
+ */
31
+ saveCredentials(credentials: UserCredentials): void;
32
+ /**
33
+ * Clear stored credentials (logout)
34
+ */
35
+ clearCredentials(): void;
36
+ /**
37
+ * Check if user is authenticated (from file or environment)
38
+ */
39
+ isAuthenticated(): boolean;
40
+ /**
41
+ * Get the API key synchronously (without token refresh)
42
+ * Used for display and environment setting where refresh isn't needed
43
+ */
44
+ getApiKeySync(): string | null;
45
+ /**
46
+ * Get the API key to use (from stored credentials or environment)
47
+ * Automatically attempts to refresh expired tokens
48
+ */
49
+ getApiKey(): Promise<string | null>;
50
+ /**
51
+ * Get current auth method
52
+ */
53
+ getAuthMethod(): AuthMethod | null;
54
+ /**
55
+ * Get user info for display
56
+ */
57
+ getUserInfo(): {
58
+ authenticated: boolean;
59
+ method: AuthMethod | null;
60
+ email: string | null;
61
+ tier: SubscriptionTier | null;
62
+ keyPreview: string | null;
63
+ };
64
+ /**
65
+ * Attempt to auto-detect Claude Code subscription credentials
66
+ * Checks paths defined in authConfig.claudeCodePaths
67
+ */
68
+ autoDetectClaudeCode(): Promise<boolean>;
69
+ /**
70
+ * Interactive login flow
71
+ * Supports:
72
+ * 1. Auto-detection of Claude Code subscription credentials
73
+ * 2. OAuth login via claude.ai (for Pro/Max/Team/Enterprise subscribers)
74
+ * 3. Manual Anthropic API key entry
75
+ */
76
+ login(options?: {
77
+ method?: AuthMethod;
78
+ key?: string;
79
+ email?: string;
80
+ }): Promise<boolean>;
81
+ /**
82
+ * Validate an API key by making a test request
83
+ */
84
+ validateKey(key: string): Promise<boolean>;
85
+ /**
86
+ * Logout - clear credentials
87
+ */
88
+ logout(): void;
89
+ /**
90
+ * Display current auth status (whoami)
91
+ */
92
+ whoami(): void;
93
+ /**
94
+ * Set environment variable for child processes
95
+ */
96
+ setEnvForChildProcess(): void;
97
+ /**
98
+ * Check authentication and return status for CLI
99
+ */
100
+ checkAuth(): {
101
+ authenticated: boolean;
102
+ message: string;
103
+ };
104
+ }
105
+ export declare const authManager: AuthManager;
106
+ export declare function isAuthenticated(): boolean;
107
+ export declare function getApiKey(): string | null;
108
+ export declare function login(options?: {
109
+ method?: AuthMethod;
110
+ key?: string;
111
+ email?: string;
112
+ }): Promise<boolean>;
113
+ export declare function logout(): void;
114
+ export declare function whoami(): void;
115
+ export declare function checkAuth(): {
116
+ authenticated: boolean;
117
+ message: string;
118
+ };
119
+ export declare function setEnvForChildProcess(): void;
120
+ export default authManager;
121
+ //# sourceMappingURL=auth-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-manager.d.ts","sourceRoot":"","sources":["../../src/utils/auth-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAGL,KAAK,eAAe,EAEpB,KAAK,UAAU,EACf,KAAK,gBAAgB,EAEtB,MAAM,0BAA0B,CAAC;AAIlC;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAc;IACrC,OAAO,CAAC,OAAO,CAAc;IAE7B,OAAO;IAQP;;OAEG;WACW,WAAW,IAAI,WAAW;IAOxC;;OAEG;IACH,OAAO,CAAC,eAAe;IAMvB;;OAEG;IACI,eAAe,IAAI,eAAe,GAAG,IAAI;IAYhD;;OAEG;IACI,eAAe,CAAC,WAAW,EAAE,eAAe,GAAG,IAAI;IAyB1D;;OAEG;IACI,gBAAgB,IAAI,IAAI;IAkB/B;;OAEG;IACI,eAAe,IAAI,OAAO;IAqBjC;;;OAGG;IACI,aAAa,IAAI,MAAM,GAAG,IAAI;IAmBrC;;;OAGG;IACU,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAyChD;;OAEG;IACI,aAAa,IAAI,UAAU,GAAG,IAAI;IAYzC;;OAEG;IACI,WAAW,IAAI;QACpB,aAAa,EAAE,OAAO,CAAC;QACvB,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;QAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;QAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B;IAaD;;;OAGG;IACU,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;IA8CrD;;;;;;OAMG;IACU,KAAK,CAAC,OAAO,CAAC,EAAE;QAC3B,MAAM,CAAC,EAAE,UAAU,CAAC;QACpB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,OAAO,CAAC;IA+KpB;;OAEG;IACU,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BvD;;OAEG;IACI,MAAM,IAAI,IAAI;IAYrB;;OAEG;IACI,MAAM,IAAI,IAAI;IA4CrB;;OAEG;IACI,qBAAqB,IAAI,IAAI;IAkBpC;;OAEG;IACI,SAAS,IAAI;QAClB,aAAa,EAAE,OAAO,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC;KACjB;CAaF;AAGD,eAAO,MAAM,WAAW,aAA4B,CAAC;AAGrD,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CAEzC;AAED,wBAAgB,KAAK,CAAC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,UAAU,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAEvG;AAED,wBAAgB,MAAM,IAAI,IAAI,CAE7B;AAED,wBAAgB,MAAM,IAAI,IAAI,CAE7B;AAED,wBAAgB,SAAS,IAAI;IAAE,aAAa,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAEvE;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,eAAe,WAAW,CAAC"}