@magic-ingredients/tiny-brain-local 0.7.0 → 0.10.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 (175) hide show
  1. package/dist/agents/formatters/claude-code-formatter.d.ts +37 -0
  2. package/dist/agents/formatters/claude-code-formatter.d.ts.map +1 -0
  3. package/dist/agents/formatters/claude-code-formatter.js +217 -0
  4. package/dist/agents/formatters/claude-code-formatter.js.map +1 -0
  5. package/dist/agents/formatters/formatter-factory.d.ts +25 -0
  6. package/dist/agents/formatters/formatter-factory.d.ts.map +1 -0
  7. package/dist/agents/formatters/formatter-factory.js +61 -0
  8. package/dist/agents/formatters/formatter-factory.js.map +1 -0
  9. package/dist/agents/types.d.ts +68 -0
  10. package/dist/agents/types.d.ts.map +1 -0
  11. package/dist/agents/types.js +12 -0
  12. package/dist/agents/types.js.map +1 -0
  13. package/dist/analyser/analyzers/script-analyzer.d.ts +10 -0
  14. package/dist/analyser/analyzers/script-analyzer.d.ts.map +1 -0
  15. package/dist/analyser/analyzers/script-analyzer.js +205 -0
  16. package/dist/analyser/analyzers/script-analyzer.js.map +1 -0
  17. package/dist/analyser/detectors/base-detector.d.ts +12 -0
  18. package/dist/analyser/detectors/base-detector.d.ts.map +1 -0
  19. package/dist/analyser/detectors/base-detector.js +50 -0
  20. package/dist/analyser/detectors/base-detector.js.map +1 -0
  21. package/dist/analyser/detectors/javascript-detector.d.ts +19 -0
  22. package/dist/analyser/detectors/javascript-detector.d.ts.map +1 -0
  23. package/dist/analyser/detectors/javascript-detector.js +347 -0
  24. package/dist/analyser/detectors/javascript-detector.js.map +1 -0
  25. package/dist/analyser/index.d.ts +5 -0
  26. package/dist/analyser/index.d.ts.map +1 -0
  27. package/dist/analyser/index.js +315 -0
  28. package/dist/analyser/index.js.map +1 -0
  29. package/dist/analyser/types.d.ts +2 -0
  30. package/dist/analyser/types.d.ts.map +1 -0
  31. package/dist/analyser/types.js +2 -0
  32. package/dist/analyser/types.js.map +1 -0
  33. package/dist/analyser/utils.d.ts +5 -0
  34. package/dist/analyser/utils.d.ts.map +1 -0
  35. package/dist/analyser/utils.js +24 -0
  36. package/dist/analyser/utils.js.map +1 -0
  37. package/dist/cli/cli-factory.d.ts.map +1 -1
  38. package/dist/cli/cli-factory.js +44 -1
  39. package/dist/cli/cli-factory.js.map +1 -1
  40. package/dist/cli/commands/analyse.command.d.ts +7 -0
  41. package/dist/cli/commands/analyse.command.d.ts.map +1 -0
  42. package/dist/cli/commands/analyse.command.js +130 -0
  43. package/dist/cli/commands/analyse.command.js.map +1 -0
  44. package/dist/cli/commands/config.command.d.ts +17 -0
  45. package/dist/cli/commands/config.command.d.ts.map +1 -0
  46. package/dist/cli/commands/config.command.js +117 -0
  47. package/dist/cli/commands/config.command.js.map +1 -0
  48. package/dist/cli/commands/status.command.d.ts +7 -1
  49. package/dist/cli/commands/status.command.d.ts.map +1 -1
  50. package/dist/cli/commands/status.command.js +275 -12
  51. package/dist/cli/commands/status.command.js.map +1 -1
  52. package/dist/cli/installers/claude-code-installer.d.ts.map +1 -1
  53. package/dist/cli/installers/claude-code-installer.js +22 -1
  54. package/dist/cli/installers/claude-code-installer.js.map +1 -1
  55. package/dist/cli/installers/installer-factory.d.ts.map +1 -1
  56. package/dist/cli/installers/installer-factory.js +10 -9
  57. package/dist/cli/installers/installer-factory.js.map +1 -1
  58. package/dist/cli/utils/system-info.d.ts +20 -0
  59. package/dist/cli/utils/system-info.d.ts.map +1 -0
  60. package/dist/cli/utils/system-info.js +90 -0
  61. package/dist/cli/utils/system-info.js.map +1 -0
  62. package/dist/core/mcp-server.d.ts +45 -2
  63. package/dist/core/mcp-server.d.ts.map +1 -1
  64. package/dist/core/mcp-server.js +298 -85
  65. package/dist/core/mcp-server.js.map +1 -1
  66. package/dist/index.d.ts +3 -0
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +33 -8
  69. package/dist/index.js.map +1 -1
  70. package/dist/prompts/persona/persona.prompt.d.ts.map +1 -1
  71. package/dist/prompts/persona/persona.prompt.js +5 -6
  72. package/dist/prompts/persona/persona.prompt.js.map +1 -1
  73. package/dist/prompts/planning/planning.prompt.d.ts +0 -8
  74. package/dist/prompts/planning/planning.prompt.d.ts.map +1 -1
  75. package/dist/prompts/planning/planning.prompt.js +0 -175
  76. package/dist/prompts/planning/planning.prompt.js.map +1 -1
  77. package/dist/services/agent-installation-service.d.ts +101 -0
  78. package/dist/services/agent-installation-service.d.ts.map +1 -0
  79. package/dist/services/agent-installation-service.js +328 -0
  80. package/dist/services/agent-installation-service.js.map +1 -0
  81. package/dist/services/agent-manager.d.ts +45 -0
  82. package/dist/services/agent-manager.d.ts.map +1 -0
  83. package/dist/services/agent-manager.js +154 -0
  84. package/dist/services/agent-manager.js.map +1 -0
  85. package/dist/services/agent-service.d.ts +70 -0
  86. package/dist/services/agent-service.d.ts.map +1 -0
  87. package/dist/services/agent-service.js +273 -0
  88. package/dist/services/agent-service.js.map +1 -0
  89. package/dist/services/analyse-service.d.ts +97 -0
  90. package/dist/services/analyse-service.d.ts.map +1 -0
  91. package/dist/services/analyse-service.js +370 -0
  92. package/dist/services/analyse-service.js.map +1 -0
  93. package/dist/services/credential-storage.service.d.ts +26 -0
  94. package/dist/services/credential-storage.service.d.ts.map +1 -0
  95. package/dist/services/credential-storage.service.js +149 -0
  96. package/dist/services/credential-storage.service.js.map +1 -0
  97. package/dist/services/dashboard-launcher.service.d.ts +20 -0
  98. package/dist/services/dashboard-launcher.service.d.ts.map +1 -0
  99. package/dist/services/dashboard-launcher.service.js +30 -0
  100. package/dist/services/dashboard-launcher.service.js.map +1 -0
  101. package/dist/services/persona-enhancer.d.ts +52 -0
  102. package/dist/services/persona-enhancer.d.ts.map +1 -0
  103. package/dist/services/persona-enhancer.js +252 -0
  104. package/dist/services/persona-enhancer.js.map +1 -0
  105. package/dist/services/persona-grouper.d.ts +29 -0
  106. package/dist/services/persona-grouper.d.ts.map +1 -0
  107. package/dist/services/persona-grouper.js +111 -0
  108. package/dist/services/persona-grouper.js.map +1 -0
  109. package/dist/services/persona-service.d.ts +52 -0
  110. package/dist/services/persona-service.d.ts.map +1 -0
  111. package/dist/services/persona-service.js +292 -0
  112. package/dist/services/persona-service.js.map +1 -0
  113. package/dist/services/remote/auth-token-service.d.ts +55 -0
  114. package/dist/services/remote/auth-token-service.d.ts.map +1 -0
  115. package/dist/services/remote/auth-token-service.js +195 -0
  116. package/dist/services/remote/auth-token-service.js.map +1 -0
  117. package/dist/services/remote/persona-sync-service.d.ts +131 -0
  118. package/dist/services/remote/persona-sync-service.d.ts.map +1 -0
  119. package/dist/services/remote/persona-sync-service.js +560 -0
  120. package/dist/services/remote/persona-sync-service.js.map +1 -0
  121. package/dist/services/remote/system-persona-service.d.ts +43 -0
  122. package/dist/services/remote/system-persona-service.d.ts.map +1 -0
  123. package/dist/services/remote/system-persona-service.js +292 -0
  124. package/dist/services/remote/system-persona-service.js.map +1 -0
  125. package/dist/services/repo-service.d.ts +195 -0
  126. package/dist/services/repo-service.d.ts.map +1 -0
  127. package/dist/services/repo-service.js +1023 -0
  128. package/dist/services/repo-service.js.map +1 -0
  129. package/dist/services/types/persona-types.d.ts +84 -0
  130. package/dist/services/types/persona-types.d.ts.map +1 -0
  131. package/dist/services/types/persona-types.js +5 -0
  132. package/dist/services/types/persona-types.js.map +1 -0
  133. package/dist/services/versioning-service.d.ts +79 -0
  134. package/dist/services/versioning-service.d.ts.map +1 -0
  135. package/dist/services/versioning-service.js +191 -0
  136. package/dist/services/versioning-service.js.map +1 -0
  137. package/dist/storage/local-filesystem-adapter.d.ts +1 -0
  138. package/dist/storage/local-filesystem-adapter.d.ts.map +1 -1
  139. package/dist/storage/local-filesystem-adapter.js +47 -3
  140. package/dist/storage/local-filesystem-adapter.js.map +1 -1
  141. package/dist/storage/platform-config-adapter.d.ts +9 -0
  142. package/dist/storage/platform-config-adapter.d.ts.map +1 -1
  143. package/dist/storage/platform-config-adapter.js +55 -1
  144. package/dist/storage/platform-config-adapter.js.map +1 -1
  145. package/dist/tools/analyse.tool.d.ts +17 -0
  146. package/dist/tools/analyse.tool.d.ts.map +1 -0
  147. package/dist/tools/analyse.tool.js +124 -0
  148. package/dist/tools/analyse.tool.js.map +1 -0
  149. package/dist/tools/persona/as.tool.d.ts +32 -11
  150. package/dist/tools/persona/as.tool.d.ts.map +1 -1
  151. package/dist/tools/persona/as.tool.js +452 -273
  152. package/dist/tools/persona/as.tool.js.map +1 -1
  153. package/dist/tools/persona/persona.tool.d.ts.map +1 -1
  154. package/dist/tools/persona/persona.tool.js +19 -5
  155. package/dist/tools/persona/persona.tool.js.map +1 -1
  156. package/dist/tools/plan/plan.tool.d.ts +3 -3
  157. package/dist/tools/plan/plan.tool.d.ts.map +1 -1
  158. package/dist/tools/plan/plan.tool.js +78 -55
  159. package/dist/tools/plan/plan.tool.js.map +1 -1
  160. package/dist/tools/tool-registry.d.ts.map +1 -1
  161. package/dist/tools/tool-registry.js +4 -0
  162. package/dist/tools/tool-registry.js.map +1 -1
  163. package/dist/types/local-context.d.ts +17 -0
  164. package/dist/types/local-context.d.ts.map +1 -0
  165. package/dist/types/local-context.js +7 -0
  166. package/dist/types/local-context.js.map +1 -0
  167. package/dist/utils/repo-utils.d.ts +10 -0
  168. package/dist/utils/repo-utils.d.ts.map +1 -0
  169. package/dist/utils/repo-utils.js +55 -0
  170. package/dist/utils/repo-utils.js.map +1 -0
  171. package/package.json +6 -2
  172. package/dist/services/plan-watcher.service.d.ts +0 -141
  173. package/dist/services/plan-watcher.service.d.ts.map +0 -1
  174. package/dist/services/plan-watcher.service.js +0 -1005
  175. package/dist/services/plan-watcher.service.js.map +0 -1
@@ -0,0 +1,292 @@
1
+ /**
2
+ * PersonaService with Library Support
3
+ *
4
+ * Extends the core PersonaService to add library persona fetching,
5
+ * sync detection capabilities, and agent enhancement
6
+ */
7
+ import { PersonaService as CorePersonaService } from '@magic-ingredients/tiny-brain-core';
8
+ import { SystemPersonaService } from './remote/system-persona-service.js';
9
+ export class PersonaService extends CorePersonaService {
10
+ systemPersonaService;
11
+ constructor(context) {
12
+ super(context);
13
+ this.systemPersonaService = new SystemPersonaService(context);
14
+ }
15
+ /**
16
+ * Get insights for a persona
17
+ */
18
+ async getInsights(personaName) {
19
+ try {
20
+ const insightsContent = await this.storage.getPersonaFile(personaName, 'insights.json', this.userId);
21
+ if (!insightsContent)
22
+ return null;
23
+ return JSON.parse(insightsContent);
24
+ }
25
+ catch (error) {
26
+ this.log('debug', `Failed to load insights for ${personaName}:`, error);
27
+ return null;
28
+ }
29
+ }
30
+ /**
31
+ * Override listPersonasWithMode to add library support
32
+ */
33
+ async listPersonasWithMode(mode = 'all') {
34
+ const result = [];
35
+ const activePersona = this.context.activePersona?.id;
36
+ // Debug logging
37
+ this.log('debug', `listPersonasWithMode called with mode: ${mode}`, {
38
+ hasAuthToken: !!this.systemPersonaService.isAuthenticated(),
39
+ authTokenDetails: this.context.authToken ? 'present' : 'missing'
40
+ });
41
+ // Get local personas if needed
42
+ if (mode === 'local' || mode === 'all') {
43
+ const localPersonas = await this.listPersonas({ includeArchived: false });
44
+ // Load metadata for each local persona to check for library sync
45
+ for (const name of localPersonas) {
46
+ const item = {
47
+ name,
48
+ source: 'local',
49
+ isActive: name === activePersona,
50
+ };
51
+ // Try to load metadata to check for library source
52
+ try {
53
+ const metadataContent = await this.storage.getPersonaFile(name, 'metadata.json', this.userId);
54
+ if (metadataContent) {
55
+ const metadata = JSON.parse(metadataContent);
56
+ if (metadata.description) {
57
+ item.description = metadata.description;
58
+ }
59
+ if (metadata.sourceLibrary) {
60
+ item.isSynced = true;
61
+ item.libraryId = metadata.sourceLibrary.id;
62
+ }
63
+ }
64
+ }
65
+ catch {
66
+ // Ignore metadata parsing errors
67
+ }
68
+ // Try to extract description from profile if not in metadata
69
+ if (!item.description) {
70
+ try {
71
+ const persona = await this.loadPersona({ personaName: name });
72
+ if (persona && persona.profile) {
73
+ const profileStr = typeof persona.profile === 'string'
74
+ ? persona.profile
75
+ : JSON.stringify(persona.profile);
76
+ // Extract description from ## Description section or first paragraph
77
+ const descMatch = profileStr.match(/##\s+Description\s*\n([^\n]+)/i);
78
+ if (descMatch) {
79
+ item.description = descMatch[1].trim();
80
+ }
81
+ }
82
+ }
83
+ catch {
84
+ // Ignore profile loading errors
85
+ }
86
+ }
87
+ result.push(item);
88
+ }
89
+ }
90
+ // Get library personas if needed and authenticated
91
+ const isAuthenticated = this.systemPersonaService.isAuthenticated();
92
+ this.log('info', `Library persona check: mode=${mode}, authenticated=${isAuthenticated}`);
93
+ // For debugging, let's see what's happening with auth
94
+ const context = this.context;
95
+ this.log('info', `Context check: hasAuthToken=${!!context.authToken}, tokenPreview=${context.authToken?.token ? context.authToken.token.substring(0, 20) + '...' : 'none'}`);
96
+ if ((mode === 'library' || mode === 'all')) {
97
+ if (!isAuthenticated) {
98
+ // Add a special placeholder item for unauthenticated library access
99
+ if (mode === 'library' || mode === 'all') {
100
+ const placeholderItem = {
101
+ name: '_library_unavailable',
102
+ source: 'library',
103
+ description: 'Authentication required to access library personas',
104
+ isPlaceholder: true
105
+ };
106
+ result.push(placeholderItem);
107
+ }
108
+ }
109
+ else {
110
+ try {
111
+ this.log('info', 'Fetching library personas...');
112
+ const libraryPersonas = await this.systemPersonaService.fetchSystemPersonas();
113
+ this.log('info', `Fetched ${libraryPersonas.length} library personas`);
114
+ // Build a map of library IDs to local names for sync detection
115
+ const libraryToLocal = new Map();
116
+ if (mode === 'all') {
117
+ // We already have local personas loaded
118
+ for (const localItem of result) {
119
+ if (localItem.libraryId) {
120
+ libraryToLocal.set(localItem.libraryId, localItem.name);
121
+ }
122
+ }
123
+ }
124
+ else {
125
+ // Need to check local personas for sync status
126
+ const localPersonas = await this.listPersonas({ includeArchived: false });
127
+ for (const name of localPersonas) {
128
+ try {
129
+ const metadataContent = await this.storage.getPersonaFile(name, 'metadata.json', this.userId);
130
+ if (metadataContent) {
131
+ const metadata = JSON.parse(metadataContent);
132
+ if (metadata.sourceLibrary?.id) {
133
+ libraryToLocal.set(metadata.sourceLibrary.id, name);
134
+ }
135
+ }
136
+ }
137
+ catch {
138
+ // Ignore errors
139
+ }
140
+ }
141
+ }
142
+ // Add library personas to result
143
+ for (const libraryPersona of libraryPersonas) {
144
+ const item = {
145
+ name: libraryPersona.name,
146
+ source: 'library',
147
+ description: libraryPersona.description,
148
+ version: libraryPersona.version,
149
+ libraryId: libraryPersona.id,
150
+ };
151
+ // Check if this library persona is synced locally
152
+ const localName = libraryToLocal.get(libraryPersona.id);
153
+ if (localName) {
154
+ item.isSynced = true;
155
+ item.syncedLocalName = localName;
156
+ }
157
+ result.push(item);
158
+ }
159
+ }
160
+ catch (error) {
161
+ this.log('warn', 'Failed to fetch library personas', error);
162
+ // Continue with local personas only
163
+ }
164
+ }
165
+ }
166
+ return result;
167
+ }
168
+ /**
169
+ * Import a library persona by name or ID
170
+ */
171
+ async importLibraryPersonaByName(nameOrId) {
172
+ if (!this.systemPersonaService.isAuthenticated()) {
173
+ // Return null if not authenticated instead of throwing
174
+ // This allows the as command to fall back to local-only behavior
175
+ return null;
176
+ }
177
+ // Fetch all library personas
178
+ const libraryPersonas = await this.systemPersonaService.fetchSystemPersonas();
179
+ // Find matching persona by name or ID
180
+ const libraryPersona = libraryPersonas.find(p => p.name === nameOrId || p.id === nameOrId);
181
+ if (!libraryPersona) {
182
+ return null; // Not found in library
183
+ }
184
+ // Fetch the full persona details (the list doesn't include full profile content)
185
+ const fullPersona = await this.systemPersonaService.fetchSystemPersona(libraryPersona.id);
186
+ if (!fullPersona) {
187
+ this.log('warn', `Could not fetch full details for library persona: ${libraryPersona.id}`);
188
+ return null;
189
+ }
190
+ // Import the persona with full content (calling the superclass method)
191
+ const localName = await super.importLibraryPersona(fullPersona);
192
+ return localName;
193
+ }
194
+ /**
195
+ * Check if a persona exists locally
196
+ */
197
+ async exists(personaName) {
198
+ const personas = await this.listPersonas({});
199
+ return personas.includes(personaName);
200
+ }
201
+ /**
202
+ * Ensure a persona has a USER block for user customizations
203
+ */
204
+ async ensureUserBlock(personaName) {
205
+ const persona = await this.loadPersona({ personaName });
206
+ if (!persona?.profile) {
207
+ this.log('warn', `Could not load persona ${personaName} to add USER block`);
208
+ return;
209
+ }
210
+ const profileContent = typeof persona.profile === 'string'
211
+ ? persona.profile
212
+ : JSON.stringify(persona.profile);
213
+ // Check if USER block already exists
214
+ if (profileContent.includes('<!-- USER-BLOCK-START -->')) {
215
+ this.log('info', `Persona ${personaName} already has USER block`);
216
+ return;
217
+ }
218
+ // Add USER block after SYSTEM block
219
+ const enhancedProfile = this.addUserBlockToProfile(profileContent, personaName);
220
+ // Save the updated persona
221
+ await this.savePersona({
222
+ personaName,
223
+ profile: enhancedProfile
224
+ });
225
+ this.log('info', `Added USER block to persona ${personaName}`);
226
+ }
227
+ /**
228
+ * Add a USER block to a persona
229
+ */
230
+ addUserBlock(persona, localName) {
231
+ this.log('debug', `addUserBlock called with persona keys: ${Object.keys(persona)}, systemBlock type: ${typeof persona.systemBlock}`);
232
+ if (!persona.systemBlock) {
233
+ this.log('error', `addUserBlock: systemBlock is undefined or null`);
234
+ throw new Error('systemBlock is required but was undefined');
235
+ }
236
+ const enhancedSystemBlock = this.addUserBlockToProfile(persona.systemBlock, localName);
237
+ return {
238
+ ...persona,
239
+ systemBlock: enhancedSystemBlock
240
+ };
241
+ }
242
+ /**
243
+ * Add a USER block to a profile string that doesn't have one
244
+ */
245
+ addUserBlockToProfile(profileContent, personaName) {
246
+ this.log('debug', `addUserBlockToProfile called with profileContent type: ${typeof profileContent}, length: ${profileContent?.length || 0}`);
247
+ if (!profileContent) {
248
+ this.log('error', `addUserBlockToProfile: profileContent is undefined or null`);
249
+ throw new Error('profileContent is required but was undefined');
250
+ }
251
+ // Find SYSTEM-BLOCK-END and add USER block after it
252
+ const systemBlockEnd = '<!-- SYSTEM-BLOCK-END -->';
253
+ const systemEndIndex = profileContent.indexOf(systemBlockEnd);
254
+ const userBlock = `\n\n<!-- USER-BLOCK-START -->\n## User Metadata\n- Created: ${new Date().toISOString()}\n- Modified: ${new Date().toISOString()}\n- Source: Library (${personaName})\n\n## User Rules\n<!-- User can add custom rules here -->\n\n## User Details\n<!-- User can add custom details here -->\n<!-- USER-BLOCK-END -->`;
255
+ if (systemEndIndex === -1) {
256
+ // No system block, add USER block at end
257
+ return profileContent + userBlock;
258
+ }
259
+ // Add USER block after system block
260
+ const insertPoint = systemEndIndex + systemBlockEnd.length;
261
+ const before = profileContent.substring(0, insertPoint);
262
+ const after = profileContent.substring(insertPoint);
263
+ return before + userBlock + after;
264
+ }
265
+ /**
266
+ * Add agent instructions to a persona's USER block
267
+ */
268
+ async addAgentInstructions(personaName, agentList) {
269
+ const persona = await this.loadPersona({ personaName });
270
+ if (!persona?.profile) {
271
+ this.log('warn', `Could not load persona ${personaName} for agent enhancement`);
272
+ return;
273
+ }
274
+ const profileContent = typeof persona.profile === 'string'
275
+ ? persona.profile
276
+ : JSON.stringify(persona.profile);
277
+ // Import PersonaEnhancer for agent instructions
278
+ const { PersonaEnhancer } = await import('./persona-enhancer.js');
279
+ // Add agent instructions to USER block using PersonaEnhancer
280
+ const profileWithAgents = PersonaEnhancer.enhanceProfile(profileContent, {
281
+ personaName,
282
+ installedAgents: agentList
283
+ });
284
+ // Save updated profile
285
+ await this.savePersona({
286
+ personaName,
287
+ profile: profileWithAgents
288
+ });
289
+ this.log('info', `Added agent instructions to persona ${personaName}`);
290
+ }
291
+ }
292
+ //# sourceMappingURL=persona-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona-service.js","sourceRoot":"","sources":["../../src/services/persona-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Auth Token Service
3
+ *
4
+ * Exchanges credentials for authentication tokens to access protected APIs
5
+ */
6
+ import { BaseService } from '@magic-ingredients/tiny-brain-core';
7
+ import type { RequestContext } from '@magic-ingredients/tiny-brain-core';
8
+ import type { MCPConfig } from '../../core/mcp-server.js';
9
+ export interface AuthToken {
10
+ token: string;
11
+ expiresIn: number;
12
+ expiresAt?: Date;
13
+ }
14
+ export interface CredentialsValidation {
15
+ isValid: boolean;
16
+ clientId?: string;
17
+ clientSecret?: string;
18
+ error?: string;
19
+ }
20
+ export declare class AuthTokenService extends BaseService {
21
+ private baseUrl;
22
+ private authToken;
23
+ private config;
24
+ constructor(context: RequestContext, config?: MCPConfig);
25
+ /**
26
+ * Validate that credentials are properly configured
27
+ */
28
+ validateCredentials(): CredentialsValidation;
29
+ /**
30
+ * Connect to the auth service and obtain a token
31
+ * Assumes credentials have been validated
32
+ */
33
+ connectToAuthService(clientId: string, clientSecret: string): Promise<AuthToken | null>;
34
+ /**
35
+ * Main authentication flow - validate and connect if valid
36
+ */
37
+ authenticate(): Promise<AuthToken | null>;
38
+ /**
39
+ * Get auth headers for API requests
40
+ */
41
+ getAuthHeaders(): Record<string, string> | null;
42
+ /**
43
+ * Check if currently authenticated
44
+ */
45
+ isAuthenticated(): boolean;
46
+ /**
47
+ * Clear authentication
48
+ */
49
+ clearAuth(): void;
50
+ /**
51
+ * Get current token (for debugging/testing)
52
+ */
53
+ getToken(): AuthToken | null;
54
+ }
55
+ //# sourceMappingURL=auth-token-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-token-service.d.ts","sourceRoot":"","sources":["../../../src/services/remote/auth-token-service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,WAAW,EAAa,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,MAAM,CAAwB;gBAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,SAAS;IAevD;;OAEG;IACH,mBAAmB,IAAI,qBAAqB;IA2C5C;;;OAGG;IACG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAmF7F;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAmB/C;;OAEG;IACH,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAkB/C;;OAEG;IACH,eAAe,IAAI,OAAO;IAO1B;;OAEG;IACH,SAAS,IAAI,IAAI;IAKjB;;OAEG;IACH,QAAQ,IAAI,SAAS,GAAG,IAAI;CAG7B"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Auth Token Service
3
+ *
4
+ * Exchanges credentials for authentication tokens to access protected APIs
5
+ */
6
+ /* global fetch, AbortSignal */
7
+ import { BaseService, getTBSUrl } from '@magic-ingredients/tiny-brain-core';
8
+ export class AuthTokenService extends BaseService {
9
+ baseUrl;
10
+ authToken = null;
11
+ config;
12
+ constructor(context, config) {
13
+ super(context);
14
+ this.config = config;
15
+ // Use central configuration for URL
16
+ this.baseUrl = getTBSUrl();
17
+ // Debug logging
18
+ this.log('debug', '[AuthTokenService] Constructor initialized', {
19
+ baseUrl: this.baseUrl,
20
+ fromEnv: !!process.env.TBS_URL,
21
+ hasConfig: !!config,
22
+ hasAccountConfig: !!config?.account
23
+ });
24
+ }
25
+ /**
26
+ * Validate that credentials are properly configured
27
+ */
28
+ validateCredentials() {
29
+ // Check if config exists
30
+ if (!this.config) {
31
+ return {
32
+ isValid: false,
33
+ error: 'No configuration provided'
34
+ };
35
+ }
36
+ // Check if account section exists
37
+ if (!this.config.account) {
38
+ return {
39
+ isValid: false,
40
+ error: 'No account configuration found'
41
+ };
42
+ }
43
+ const { clientId, clientSecret } = this.config.account;
44
+ // Check if clientId exists and is non-empty
45
+ if (!clientId || clientId.trim() === '') {
46
+ return {
47
+ isValid: false,
48
+ error: 'Client ID is missing or empty'
49
+ };
50
+ }
51
+ // Check if clientSecret exists and is non-empty
52
+ if (!clientSecret || clientSecret.trim() === '') {
53
+ return {
54
+ isValid: false,
55
+ error: 'Client secret is missing or empty'
56
+ };
57
+ }
58
+ // Valid credentials found
59
+ return {
60
+ isValid: true,
61
+ clientId,
62
+ clientSecret
63
+ };
64
+ }
65
+ /**
66
+ * Connect to the auth service and obtain a token
67
+ * Assumes credentials have been validated
68
+ */
69
+ async connectToAuthService(clientId, clientSecret) {
70
+ try {
71
+ this.log('debug', 'Attempting to connect to tiny-brain service', {
72
+ url: this.baseUrl,
73
+ clientId: clientId.substring(0, 4) + '***' // Log partial ID for debugging
74
+ });
75
+ // Create Basic Auth credentials
76
+ const authCredentials = Buffer.from(`${clientId}:${clientSecret}`).toString('base64');
77
+ // Attempt to get auth token from TBS using Basic Auth
78
+ const response = await fetch(`${this.baseUrl}/api/auth/token`, {
79
+ method: 'POST',
80
+ headers: {
81
+ 'Authorization': `Basic ${authCredentials}`,
82
+ 'Content-Type': 'application/json',
83
+ },
84
+ // Add timeout
85
+ signal: AbortSignal.timeout(10000) // 10 second timeout
86
+ });
87
+ if (!response.ok) {
88
+ this.log('warn', 'Authentication failed', {
89
+ status: response.status,
90
+ statusText: response.statusText
91
+ });
92
+ // Provide specific error messages
93
+ if (response.status === 401) {
94
+ this.log('error', 'Invalid credentials - please check your clientId and clientSecret');
95
+ }
96
+ else if (response.status === 403) {
97
+ this.log('error', 'Access forbidden - your account may be suspended');
98
+ }
99
+ else if (response.status >= 500) {
100
+ this.log('error', 'Tiny-brain service is temporarily unavailable');
101
+ }
102
+ return null;
103
+ }
104
+ const tokenData = await response.json();
105
+ // Validate token response
106
+ if (!tokenData.access_token || !tokenData.expires_in) {
107
+ this.log('error', 'Invalid token response from auth service');
108
+ return null;
109
+ }
110
+ // Store token with expiry
111
+ this.authToken = {
112
+ token: tokenData.access_token,
113
+ expiresIn: tokenData.expires_in,
114
+ expiresAt: new Date(Date.now() + tokenData.expires_in * 1000)
115
+ };
116
+ this.log('info', 'Successfully authenticated with tiny-brain service', {
117
+ expiresIn: tokenData.expires_in,
118
+ userId: tokenData.user_id
119
+ });
120
+ return this.authToken;
121
+ }
122
+ catch (error) {
123
+ // Handle different error types
124
+ if (error instanceof Error) {
125
+ if (error.name === 'AbortError') {
126
+ this.log('error', 'Connection timeout - tiny-brain service took too long to respond');
127
+ }
128
+ else if (error.message.includes('fetch')) {
129
+ this.log('error', 'Network error - unable to reach tiny-brain service');
130
+ }
131
+ else {
132
+ this.log('error', 'Failed to connect to auth service', error);
133
+ }
134
+ }
135
+ else {
136
+ this.log('error', 'Unknown error during authentication', error);
137
+ }
138
+ return null;
139
+ }
140
+ }
141
+ /**
142
+ * Main authentication flow - validate and connect if valid
143
+ */
144
+ async authenticate() {
145
+ // First validate credentials
146
+ const validation = this.validateCredentials();
147
+ if (!validation.isValid) {
148
+ this.log('info', 'Skipping authentication: ' + validation.error);
149
+ return null;
150
+ }
151
+ // Credentials are valid, attempt to connect
152
+ this.log('info', 'Valid credentials found, attempting authentication');
153
+ // We know these are defined when isValid is true, use type assertion
154
+ return await this.connectToAuthService(validation.clientId, validation.clientSecret);
155
+ }
156
+ /**
157
+ * Get auth headers for API requests
158
+ */
159
+ getAuthHeaders() {
160
+ if (!this.authToken) {
161
+ return null;
162
+ }
163
+ // Check if token is expired
164
+ if (this.authToken.expiresAt && this.authToken.expiresAt < new Date()) {
165
+ this.log('debug', 'Auth token expired');
166
+ this.authToken = null;
167
+ return null;
168
+ }
169
+ return {
170
+ 'Authorization': `Bearer ${this.authToken.token}`,
171
+ 'Content-Type': 'application/json'
172
+ };
173
+ }
174
+ /**
175
+ * Check if currently authenticated
176
+ */
177
+ isAuthenticated() {
178
+ return !!(this.authToken &&
179
+ (!this.authToken.expiresAt || this.authToken.expiresAt > new Date()));
180
+ }
181
+ /**
182
+ * Clear authentication
183
+ */
184
+ clearAuth() {
185
+ this.authToken = null;
186
+ this.log('debug', 'Authentication cleared');
187
+ }
188
+ /**
189
+ * Get current token (for debugging/testing)
190
+ */
191
+ getToken() {
192
+ return this.authToken;
193
+ }
194
+ }
195
+ //# sourceMappingURL=auth-token-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-token-service.js","sourceRoot":"","sources":["../../../src/services/remote/auth-token-service.ts"],"names":[],"mappings":"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"}