@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.
- package/dist/agents/formatters/claude-code-formatter.d.ts +37 -0
- package/dist/agents/formatters/claude-code-formatter.d.ts.map +1 -0
- package/dist/agents/formatters/claude-code-formatter.js +217 -0
- package/dist/agents/formatters/claude-code-formatter.js.map +1 -0
- package/dist/agents/formatters/formatter-factory.d.ts +25 -0
- package/dist/agents/formatters/formatter-factory.d.ts.map +1 -0
- package/dist/agents/formatters/formatter-factory.js +61 -0
- package/dist/agents/formatters/formatter-factory.js.map +1 -0
- package/dist/agents/types.d.ts +68 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +12 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/analyser/analyzers/script-analyzer.d.ts +10 -0
- package/dist/analyser/analyzers/script-analyzer.d.ts.map +1 -0
- package/dist/analyser/analyzers/script-analyzer.js +205 -0
- package/dist/analyser/analyzers/script-analyzer.js.map +1 -0
- package/dist/analyser/detectors/base-detector.d.ts +12 -0
- package/dist/analyser/detectors/base-detector.d.ts.map +1 -0
- package/dist/analyser/detectors/base-detector.js +50 -0
- package/dist/analyser/detectors/base-detector.js.map +1 -0
- package/dist/analyser/detectors/javascript-detector.d.ts +19 -0
- package/dist/analyser/detectors/javascript-detector.d.ts.map +1 -0
- package/dist/analyser/detectors/javascript-detector.js +347 -0
- package/dist/analyser/detectors/javascript-detector.js.map +1 -0
- package/dist/analyser/index.d.ts +5 -0
- package/dist/analyser/index.d.ts.map +1 -0
- package/dist/analyser/index.js +315 -0
- package/dist/analyser/index.js.map +1 -0
- package/dist/analyser/types.d.ts +2 -0
- package/dist/analyser/types.d.ts.map +1 -0
- package/dist/analyser/types.js +2 -0
- package/dist/analyser/types.js.map +1 -0
- package/dist/analyser/utils.d.ts +5 -0
- package/dist/analyser/utils.d.ts.map +1 -0
- package/dist/analyser/utils.js +24 -0
- package/dist/analyser/utils.js.map +1 -0
- package/dist/cli/cli-factory.d.ts.map +1 -1
- package/dist/cli/cli-factory.js +44 -1
- package/dist/cli/cli-factory.js.map +1 -1
- package/dist/cli/commands/analyse.command.d.ts +7 -0
- package/dist/cli/commands/analyse.command.d.ts.map +1 -0
- package/dist/cli/commands/analyse.command.js +130 -0
- package/dist/cli/commands/analyse.command.js.map +1 -0
- package/dist/cli/commands/config.command.d.ts +17 -0
- package/dist/cli/commands/config.command.d.ts.map +1 -0
- package/dist/cli/commands/config.command.js +117 -0
- package/dist/cli/commands/config.command.js.map +1 -0
- package/dist/cli/commands/status.command.d.ts +7 -1
- package/dist/cli/commands/status.command.d.ts.map +1 -1
- package/dist/cli/commands/status.command.js +275 -12
- package/dist/cli/commands/status.command.js.map +1 -1
- package/dist/cli/installers/claude-code-installer.d.ts.map +1 -1
- package/dist/cli/installers/claude-code-installer.js +22 -1
- package/dist/cli/installers/claude-code-installer.js.map +1 -1
- package/dist/cli/installers/installer-factory.d.ts.map +1 -1
- package/dist/cli/installers/installer-factory.js +10 -9
- package/dist/cli/installers/installer-factory.js.map +1 -1
- package/dist/cli/utils/system-info.d.ts +20 -0
- package/dist/cli/utils/system-info.d.ts.map +1 -0
- package/dist/cli/utils/system-info.js +90 -0
- package/dist/cli/utils/system-info.js.map +1 -0
- package/dist/core/mcp-server.d.ts +45 -2
- package/dist/core/mcp-server.d.ts.map +1 -1
- package/dist/core/mcp-server.js +298 -85
- package/dist/core/mcp-server.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -8
- package/dist/index.js.map +1 -1
- package/dist/prompts/persona/persona.prompt.d.ts.map +1 -1
- package/dist/prompts/persona/persona.prompt.js +5 -6
- package/dist/prompts/persona/persona.prompt.js.map +1 -1
- package/dist/prompts/planning/planning.prompt.d.ts +0 -8
- package/dist/prompts/planning/planning.prompt.d.ts.map +1 -1
- package/dist/prompts/planning/planning.prompt.js +0 -175
- package/dist/prompts/planning/planning.prompt.js.map +1 -1
- package/dist/services/agent-installation-service.d.ts +101 -0
- package/dist/services/agent-installation-service.d.ts.map +1 -0
- package/dist/services/agent-installation-service.js +328 -0
- package/dist/services/agent-installation-service.js.map +1 -0
- package/dist/services/agent-manager.d.ts +45 -0
- package/dist/services/agent-manager.d.ts.map +1 -0
- package/dist/services/agent-manager.js +154 -0
- package/dist/services/agent-manager.js.map +1 -0
- package/dist/services/agent-service.d.ts +70 -0
- package/dist/services/agent-service.d.ts.map +1 -0
- package/dist/services/agent-service.js +273 -0
- package/dist/services/agent-service.js.map +1 -0
- package/dist/services/analyse-service.d.ts +97 -0
- package/dist/services/analyse-service.d.ts.map +1 -0
- package/dist/services/analyse-service.js +370 -0
- package/dist/services/analyse-service.js.map +1 -0
- package/dist/services/credential-storage.service.d.ts +26 -0
- package/dist/services/credential-storage.service.d.ts.map +1 -0
- package/dist/services/credential-storage.service.js +149 -0
- package/dist/services/credential-storage.service.js.map +1 -0
- package/dist/services/dashboard-launcher.service.d.ts +20 -0
- package/dist/services/dashboard-launcher.service.d.ts.map +1 -0
- package/dist/services/dashboard-launcher.service.js +30 -0
- package/dist/services/dashboard-launcher.service.js.map +1 -0
- package/dist/services/persona-enhancer.d.ts +52 -0
- package/dist/services/persona-enhancer.d.ts.map +1 -0
- package/dist/services/persona-enhancer.js +252 -0
- package/dist/services/persona-enhancer.js.map +1 -0
- package/dist/services/persona-grouper.d.ts +29 -0
- package/dist/services/persona-grouper.d.ts.map +1 -0
- package/dist/services/persona-grouper.js +111 -0
- package/dist/services/persona-grouper.js.map +1 -0
- package/dist/services/persona-service.d.ts +52 -0
- package/dist/services/persona-service.d.ts.map +1 -0
- package/dist/services/persona-service.js +292 -0
- package/dist/services/persona-service.js.map +1 -0
- package/dist/services/remote/auth-token-service.d.ts +55 -0
- package/dist/services/remote/auth-token-service.d.ts.map +1 -0
- package/dist/services/remote/auth-token-service.js +195 -0
- package/dist/services/remote/auth-token-service.js.map +1 -0
- package/dist/services/remote/persona-sync-service.d.ts +131 -0
- package/dist/services/remote/persona-sync-service.d.ts.map +1 -0
- package/dist/services/remote/persona-sync-service.js +560 -0
- package/dist/services/remote/persona-sync-service.js.map +1 -0
- package/dist/services/remote/system-persona-service.d.ts +43 -0
- package/dist/services/remote/system-persona-service.d.ts.map +1 -0
- package/dist/services/remote/system-persona-service.js +292 -0
- package/dist/services/remote/system-persona-service.js.map +1 -0
- package/dist/services/repo-service.d.ts +195 -0
- package/dist/services/repo-service.d.ts.map +1 -0
- package/dist/services/repo-service.js +1023 -0
- package/dist/services/repo-service.js.map +1 -0
- package/dist/services/types/persona-types.d.ts +84 -0
- package/dist/services/types/persona-types.d.ts.map +1 -0
- package/dist/services/types/persona-types.js +5 -0
- package/dist/services/types/persona-types.js.map +1 -0
- package/dist/services/versioning-service.d.ts +79 -0
- package/dist/services/versioning-service.d.ts.map +1 -0
- package/dist/services/versioning-service.js +191 -0
- package/dist/services/versioning-service.js.map +1 -0
- package/dist/storage/local-filesystem-adapter.d.ts +1 -0
- package/dist/storage/local-filesystem-adapter.d.ts.map +1 -1
- package/dist/storage/local-filesystem-adapter.js +47 -3
- package/dist/storage/local-filesystem-adapter.js.map +1 -1
- package/dist/storage/platform-config-adapter.d.ts +9 -0
- package/dist/storage/platform-config-adapter.d.ts.map +1 -1
- package/dist/storage/platform-config-adapter.js +55 -1
- package/dist/storage/platform-config-adapter.js.map +1 -1
- package/dist/tools/analyse.tool.d.ts +17 -0
- package/dist/tools/analyse.tool.d.ts.map +1 -0
- package/dist/tools/analyse.tool.js +124 -0
- package/dist/tools/analyse.tool.js.map +1 -0
- package/dist/tools/persona/as.tool.d.ts +32 -11
- package/dist/tools/persona/as.tool.d.ts.map +1 -1
- package/dist/tools/persona/as.tool.js +452 -273
- package/dist/tools/persona/as.tool.js.map +1 -1
- package/dist/tools/persona/persona.tool.d.ts.map +1 -1
- package/dist/tools/persona/persona.tool.js +19 -5
- package/dist/tools/persona/persona.tool.js.map +1 -1
- package/dist/tools/plan/plan.tool.d.ts +3 -3
- package/dist/tools/plan/plan.tool.d.ts.map +1 -1
- package/dist/tools/plan/plan.tool.js +78 -55
- package/dist/tools/plan/plan.tool.js.map +1 -1
- package/dist/tools/tool-registry.d.ts.map +1 -1
- package/dist/tools/tool-registry.js +4 -0
- package/dist/tools/tool-registry.js.map +1 -1
- package/dist/types/local-context.d.ts +17 -0
- package/dist/types/local-context.d.ts.map +1 -0
- package/dist/types/local-context.js +7 -0
- package/dist/types/local-context.js.map +1 -0
- package/dist/utils/repo-utils.d.ts +10 -0
- package/dist/utils/repo-utils.d.ts.map +1 -0
- package/dist/utils/repo-utils.js +55 -0
- package/dist/utils/repo-utils.js.map +1 -0
- package/package.json +6 -2
- package/dist/services/plan-watcher.service.d.ts +0 -141
- package/dist/services/plan-watcher.service.d.ts.map +0 -1
- package/dist/services/plan-watcher.service.js +0 -1005
- 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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"}
|