mycontext-cli 4.1.4 → 4.2.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.
- package/README.md +231 -12
- package/dist/README.md +231 -12
- package/dist/agents/implementations/ArchitectAgent.d.ts.map +1 -1
- package/dist/agents/implementations/ArchitectAgent.js +9 -1
- package/dist/agents/implementations/ArchitectAgent.js.map +1 -1
- package/dist/agents/implementations/BackendDevAgent.d.ts +1 -1
- package/dist/agents/implementations/BackendDevAgent.d.ts.map +1 -1
- package/dist/agents/implementations/BackendDevAgent.js +29 -16
- package/dist/agents/implementations/BackendDevAgent.js.map +1 -1
- package/dist/agents/implementations/CodeGenSubAgent.d.ts.map +1 -1
- package/dist/agents/implementations/CodeGenSubAgent.js +17 -9
- package/dist/agents/implementations/CodeGenSubAgent.js.map +1 -1
- package/dist/agents/implementations/EnhancementAgent.js.map +1 -1
- package/dist/agents/implementations/FeatureAssemblyAgent.d.ts +1 -1
- package/dist/agents/implementations/FeatureAssemblyAgent.d.ts.map +1 -1
- package/dist/agents/implementations/FeatureAssemblyAgent.js +10 -9
- package/dist/agents/implementations/FeatureAssemblyAgent.js.map +1 -1
- package/dist/agents/implementations/PromptConstructorAgent.d.ts.map +1 -1
- package/dist/agents/implementations/PromptConstructorAgent.js +26 -42
- package/dist/agents/implementations/PromptConstructorAgent.js.map +1 -1
- package/dist/clients/ProviderChain.d.ts +6 -65
- package/dist/clients/ProviderChain.d.ts.map +1 -1
- package/dist/clients/ProviderChain.js +34 -194
- package/dist/clients/ProviderChain.js.map +1 -1
- package/dist/commands/agent.js +1 -1
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/assemble-features.js +1 -1
- package/dist/commands/assemble-features.js.map +1 -1
- package/dist/commands/design-analyze.js +2 -2
- package/dist/commands/generate-context-files.d.ts.map +1 -1
- package/dist/commands/generate-context-files.js +13 -0
- package/dist/commands/generate-context-files.js.map +1 -1
- package/dist/commands/generate.d.ts +1 -0
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +96 -23
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/sync-readme.js +1 -1
- package/dist/commands/sync-readme.js.map +1 -1
- package/dist/core/agents/DependencySentinel.d.ts +15 -0
- package/dist/core/agents/DependencySentinel.d.ts.map +1 -0
- package/dist/core/agents/DependencySentinel.js +141 -0
- package/dist/core/agents/DependencySentinel.js.map +1 -0
- package/dist/core/ai/AICore.d.ts +48 -0
- package/dist/core/ai/AICore.d.ts.map +1 -0
- package/dist/core/ai/AICore.js +228 -0
- package/dist/core/ai/AICore.js.map +1 -0
- package/dist/core/brain/BrainClient.d.ts +16 -0
- package/dist/core/brain/BrainClient.d.ts.map +1 -0
- package/dist/core/brain/BrainClient.js +151 -0
- package/dist/core/brain/BrainClient.js.map +1 -0
- package/dist/package.json +6 -5
- package/dist/types/living-context.d.ts +76 -0
- package/dist/types/living-context.d.ts.map +1 -0
- package/dist/types/living-context.js +3 -0
- package/dist/types/living-context.js.map +1 -0
- package/dist/utils/FileGenerator.d.ts +9 -0
- package/dist/utils/FileGenerator.d.ts.map +1 -0
- package/dist/utils/FileGenerator.js +106 -0
- package/dist/utils/FileGenerator.js.map +1 -0
- package/dist/utils/NextJSProjectGenerator.d.ts.map +1 -1
- package/dist/utils/NextJSProjectGenerator.js +59 -0
- package/dist/utils/NextJSProjectGenerator.js.map +1 -1
- package/dist/utils/contextRenderer.d.ts +12 -0
- package/dist/utils/contextRenderer.d.ts.map +1 -0
- package/dist/utils/contextRenderer.js +105 -0
- package/dist/utils/contextRenderer.js.map +1 -0
- package/dist/utils/fileSystem.d.ts +4 -0
- package/dist/utils/fileSystem.d.ts.map +1 -1
- package/dist/utils/fileSystem.js +19 -0
- package/dist/utils/fileSystem.js.map +1 -1
- package/dist/utils/hybridAIClient.d.ts +12 -117
- package/dist/utils/hybridAIClient.d.ts.map +1 -1
- package/dist/utils/hybridAIClient.js +31 -750
- package/dist/utils/hybridAIClient.js.map +1 -1
- package/package.json +6 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-readme.js","sourceRoot":"","sources":["../../src/commands/sync-readme.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,6CAA+B;AAC/B,2CAA6B;AAC7B,2CAAyD;AAQzD,MAAa,iBAAiB;IAG5B;QACE,IAAI,CAAC,eAAe,GAAG,IAAI,4BAAqB,EAAE,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAA0B;QACtC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAEvD,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;YAE1E,mBAAmB;YACnB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,kBAAkB,EAAE,CAAC;YACjE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CACX,eAAK,CAAC,GAAG,CAAC
|
|
1
|
+
{"version":3,"file":"sync-readme.js","sourceRoot":"","sources":["../../src/commands/sync-readme.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare class DependencySentinel {
|
|
2
|
+
private brains;
|
|
3
|
+
private ai;
|
|
4
|
+
private workDir;
|
|
5
|
+
private maxRetries;
|
|
6
|
+
constructor(workDir: string, maxRetries?: number);
|
|
7
|
+
/**
|
|
8
|
+
* Execute a command with self-healing capabilities.
|
|
9
|
+
* If the command fails, the Sentinel will analyze the output and attempt to fix it.
|
|
10
|
+
*/
|
|
11
|
+
guard(command: string): Promise<boolean>;
|
|
12
|
+
private captureErrorOutput;
|
|
13
|
+
private diagnoseAndFix;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=DependencySentinel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DependencySentinel.d.ts","sourceRoot":"","sources":["../../../src/core/agents/DependencySentinel.ts"],"names":[],"mappings":"AAWA,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,MAAM,EAAE,UAAU,SAAI;IAO3C;;;OAGG;IACU,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAyCvC,kBAAkB;YASlB,cAAc;CA4C7B"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.DependencySentinel = void 0;
|
|
40
|
+
const BrainClient_1 = require("../brain/BrainClient");
|
|
41
|
+
const AICore_1 = require("../ai/AICore");
|
|
42
|
+
const child_process_1 = require("child_process");
|
|
43
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
44
|
+
const util = __importStar(require("util"));
|
|
45
|
+
const execAsync = util.promisify(child_process_1.exec);
|
|
46
|
+
class DependencySentinel {
|
|
47
|
+
constructor(workDir, maxRetries = 3) {
|
|
48
|
+
this.workDir = workDir;
|
|
49
|
+
this.maxRetries = maxRetries;
|
|
50
|
+
this.brains = BrainClient_1.BrainClient.getInstance();
|
|
51
|
+
this.ai = AICore_1.AICore.getInstance();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Execute a command with self-healing capabilities.
|
|
55
|
+
* If the command fails, the Sentinel will analyze the output and attempt to fix it.
|
|
56
|
+
*/
|
|
57
|
+
async guard(command) {
|
|
58
|
+
let attempts = 0;
|
|
59
|
+
while (attempts <= this.maxRetries) {
|
|
60
|
+
if (attempts > 0) {
|
|
61
|
+
console.log(chalk_1.default.yellow(`🛡️ Sentinel Retry [${attempts}/${this.maxRetries}] for: ${command}`));
|
|
62
|
+
await this.brains.addUpdate('Sentinel', 'orchestrator', 'thought', `Retry ${attempts}/${this.maxRetries} for command: ${command}`);
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
console.log(chalk_1.default.blue(`🛡️ Sentinel running: ${command}`));
|
|
66
|
+
// We use execSync for now to simplify streaming output,
|
|
67
|
+
// but for a robust implementation we might want proper streaming.
|
|
68
|
+
// Using stdio: 'inherit' lets the user see progress.
|
|
69
|
+
(0, child_process_1.execSync)(command, { cwd: this.workDir, stdio: 'inherit' });
|
|
70
|
+
console.log(chalk_1.default.green(`✅ Command passed: ${command}`));
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.log(chalk_1.default.red(`❌ Command failed: ${command}`));
|
|
75
|
+
// In execSync with inherit, we don't capture stdout/stderr easily in the error object
|
|
76
|
+
// (unless we assume it printed to screen and we can't see it programmatically).
|
|
77
|
+
// To fix this, we need to re-run it capturing output OR use execAsync initially.
|
|
78
|
+
// Let's use a "dry run" with capture to get the error details for the AI.
|
|
79
|
+
const errorOutput = await this.captureErrorOutput(command);
|
|
80
|
+
attempts++;
|
|
81
|
+
if (attempts > this.maxRetries) {
|
|
82
|
+
console.log(chalk_1.default.red(`💀 Sentinel gave up after ${this.maxRetries} attempts.`));
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
await this.diagnoseAndFix(command, errorOutput);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
async captureErrorOutput(command) {
|
|
91
|
+
try {
|
|
92
|
+
await execAsync(command, { cwd: this.workDir });
|
|
93
|
+
return ""; // It unexpectedly passed?
|
|
94
|
+
}
|
|
95
|
+
catch (e) {
|
|
96
|
+
return `${e.stdout}\n${e.stderr}`;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async diagnoseAndFix(command, errorLog) {
|
|
100
|
+
await this.brains.addUpdate('Sentinel', 'orchestrator', 'thought', `Diagnosing failure for: ${command}`);
|
|
101
|
+
const prompt = `
|
|
102
|
+
You are the Dependency Sentinel, a self-healing build agent.
|
|
103
|
+
|
|
104
|
+
COMMAND: ${command}
|
|
105
|
+
WORKING_DIR: ${this.workDir}
|
|
106
|
+
|
|
107
|
+
ERROR OUTPUT:
|
|
108
|
+
\`\`\`
|
|
109
|
+
${errorLog.slice(0, 4000)}
|
|
110
|
+
\`\`\`
|
|
111
|
+
|
|
112
|
+
TASK:
|
|
113
|
+
Analyze the error and provide a shell command to fix it.
|
|
114
|
+
Common fixes:
|
|
115
|
+
- "pnpm add <package>" (if module not found)
|
|
116
|
+
- "pnpm add -D @types/<package>" (if type error)
|
|
117
|
+
- "mkdir -p <dir>" (if directory missing)
|
|
118
|
+
|
|
119
|
+
RETURN FORMAT:
|
|
120
|
+
Return ONLY the shell command to execute. No markdown, no explanations.
|
|
121
|
+
If you cannot determine a fix, return "SKIP".
|
|
122
|
+
`;
|
|
123
|
+
const fixCommand = await this.ai.generateText(prompt);
|
|
124
|
+
const cleanCommand = fixCommand.replace(/`/g, '').trim();
|
|
125
|
+
if (cleanCommand === 'SKIP' || !cleanCommand) {
|
|
126
|
+
console.log(chalk_1.default.red("🛡️ Sentinel could not determine a fix."));
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
console.log(chalk_1.default.magenta(`🛡️ Sentinel attempting fix: ${cleanCommand}`));
|
|
130
|
+
await this.brains.addUpdate('Sentinel', 'orchestrator', 'action', `Executing fix: ${cleanCommand}`);
|
|
131
|
+
try {
|
|
132
|
+
(0, child_process_1.execSync)(cleanCommand, { cwd: this.workDir, stdio: 'inherit' });
|
|
133
|
+
console.log(chalk_1.default.green(`✅ Fix executed successfully.`));
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
console.log(chalk_1.default.red(`❌ Fix execution failed.`));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.DependencySentinel = DependencySentinel;
|
|
141
|
+
//# sourceMappingURL=DependencySentinel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DependencySentinel.js","sourceRoot":"","sources":["../../../src/core/agents/DependencySentinel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { AIClient, AIClientOptions, AgentContext } from "../../interfaces/AIClient";
|
|
2
|
+
import { LivingContext } from "../../types/living-context";
|
|
3
|
+
export type AIProviderName = "github" | "openrouter" | "gemini" | "xai" | "claude" | "qwen";
|
|
4
|
+
export interface AICoreConfig {
|
|
5
|
+
preferredProvider?: AIProviderName;
|
|
6
|
+
fallbackEnabled: boolean;
|
|
7
|
+
workingDirectory: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* AICore: The centralized logic for AI provider selection,
|
|
11
|
+
* token injection, and unified interface for all agents.
|
|
12
|
+
*/
|
|
13
|
+
export declare class AICore {
|
|
14
|
+
private static instance;
|
|
15
|
+
private providers;
|
|
16
|
+
private config;
|
|
17
|
+
private constructor();
|
|
18
|
+
static getInstance(config?: AICoreConfig): AICore;
|
|
19
|
+
private loadEnvironmentVariables;
|
|
20
|
+
private initializeProviders;
|
|
21
|
+
getBestClient(): AIClient;
|
|
22
|
+
/**
|
|
23
|
+
* High-level generation utility that handles formatting and basic retries
|
|
24
|
+
*/
|
|
25
|
+
generateStructuredText<T>(prompt: string, schema: string, options?: AIClientOptions): Promise<T>;
|
|
26
|
+
/**
|
|
27
|
+
* Proxy for generateText with automatic fallback
|
|
28
|
+
*/
|
|
29
|
+
generateText(prompt: string, options?: AIClientOptions): Promise<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Get all clients that have API keys configured, ordered by priority
|
|
32
|
+
*/
|
|
33
|
+
private getAvailableClients;
|
|
34
|
+
private handleAIError;
|
|
35
|
+
/**
|
|
36
|
+
* Proxy for generateComponent
|
|
37
|
+
*/
|
|
38
|
+
generateComponent(prompt: string, context?: AgentContext, options?: AIClientOptions): Promise<string>;
|
|
39
|
+
/**
|
|
40
|
+
* Proxy for generateComponentRefinement
|
|
41
|
+
*/
|
|
42
|
+
generateComponentRefinement(componentCode: string, prompt: string, context?: AgentContext, options?: AIClientOptions): Promise<string>;
|
|
43
|
+
/**
|
|
44
|
+
* Get the primary source of truth (Living Brain)
|
|
45
|
+
*/
|
|
46
|
+
getLivingContext(): Promise<LivingContext | null>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=AICore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AICore.d.ts","sourceRoot":"","sources":["../../../src/core/ai/AICore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGpF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAU3D,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE5F,MAAM,WAAW,YAAY;IAC3B,iBAAiB,CAAC,EAAE,cAAc,CAAC;IACnC,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,MAAM,CAAe;IAE7B,OAAO;WAMO,WAAW,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM;IAUxD,OAAO,CAAC,wBAAwB;IAiBhC,OAAO,CAAC,mBAAmB;IAsBpB,aAAa,IAAI,QAAQ;IAsBhC;;OAEG;IACU,sBAAsB,CAAC,CAAC,EACnC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,CAAC,CAAC;IAeb;;OAEG;IACU,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;IA+BzF;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,aAAa;IAqBrB;;OAEG;IACU,iBAAiB,CAC5B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,YAAY,EACtB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC;IAIlB;;OAEG;IACU,2BAA2B,CACtC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,YAAY,EACtB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC;IAIlB;;OAEG;IACU,gBAAgB,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CAY/D"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.AICore = void 0;
|
|
40
|
+
const githubModelsClient_1 = require("../../utils/githubModelsClient");
|
|
41
|
+
const openRouterClient_1 = require("../../utils/openRouterClient");
|
|
42
|
+
const geminiClient_1 = require("../../utils/geminiClient");
|
|
43
|
+
const XAIClient_1 = require("../../clients/XAIClient");
|
|
44
|
+
const claudeAgentClient_1 = require("../../utils/claudeAgentClient");
|
|
45
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
46
|
+
const fs = __importStar(require("fs-extra"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const dotenv = __importStar(require("dotenv"));
|
|
49
|
+
const dotenvExpand = __importStar(require("dotenv-expand"));
|
|
50
|
+
/**
|
|
51
|
+
* AICore: The centralized logic for AI provider selection,
|
|
52
|
+
* token injection, and unified interface for all agents.
|
|
53
|
+
*/
|
|
54
|
+
class AICore {
|
|
55
|
+
constructor(config) {
|
|
56
|
+
this.providers = new Map();
|
|
57
|
+
this.config = config;
|
|
58
|
+
this.loadEnvironmentVariables();
|
|
59
|
+
this.initializeProviders();
|
|
60
|
+
}
|
|
61
|
+
static getInstance(config) {
|
|
62
|
+
if (!AICore.instance) {
|
|
63
|
+
if (!config) {
|
|
64
|
+
throw new Error("AICore must be initialized with config first");
|
|
65
|
+
}
|
|
66
|
+
AICore.instance = new AICore(config);
|
|
67
|
+
}
|
|
68
|
+
return AICore.instance;
|
|
69
|
+
}
|
|
70
|
+
loadEnvironmentVariables() {
|
|
71
|
+
const cwd = this.config.workingDirectory || process.cwd();
|
|
72
|
+
const candidates = [
|
|
73
|
+
path.join(cwd, ".mycontext", ".env.local"),
|
|
74
|
+
path.join(cwd, ".mycontext", ".env"),
|
|
75
|
+
path.join(cwd, ".env.local"),
|
|
76
|
+
path.join(cwd, ".env"),
|
|
77
|
+
];
|
|
78
|
+
for (const p of candidates) {
|
|
79
|
+
if (fs.existsSync(p)) {
|
|
80
|
+
const result = dotenv.config({ path: p, override: true });
|
|
81
|
+
dotenvExpand.expand(result);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
initializeProviders() {
|
|
86
|
+
// 1. Claude Agent SDK
|
|
87
|
+
const claude = new claudeAgentClient_1.ClaudeAgentClient();
|
|
88
|
+
if (claude.hasApiKey())
|
|
89
|
+
this.providers.set("claude", claude);
|
|
90
|
+
// 2. GitHub Models (Primary High Quality)
|
|
91
|
+
const github = new githubModelsClient_1.GitHubModelsClient();
|
|
92
|
+
if (github.hasApiKey())
|
|
93
|
+
this.providers.set("github", github);
|
|
94
|
+
// 3. OpenRouter
|
|
95
|
+
const openrouter = new openRouterClient_1.OpenRouterClient();
|
|
96
|
+
if (openrouter.hasApiKey())
|
|
97
|
+
this.providers.set("openrouter", openrouter);
|
|
98
|
+
// 4. Gemini
|
|
99
|
+
const gemini = new geminiClient_1.GeminiClient();
|
|
100
|
+
if (gemini.hasApiKey())
|
|
101
|
+
this.providers.set("gemini", gemini);
|
|
102
|
+
// 5. XAI
|
|
103
|
+
const xai = new XAIClient_1.XAIClient();
|
|
104
|
+
if (xai.hasApiKey())
|
|
105
|
+
this.providers.set("xai", xai);
|
|
106
|
+
}
|
|
107
|
+
getBestClient() {
|
|
108
|
+
// Use override if present
|
|
109
|
+
const envOverride = (process.env.MYCONTEXT_PROVIDER || process.env.AI_PROVIDER);
|
|
110
|
+
if (envOverride && this.providers.has(envOverride)) {
|
|
111
|
+
return this.providers.get(envOverride);
|
|
112
|
+
}
|
|
113
|
+
if (this.config.preferredProvider && this.providers.has(this.config.preferredProvider)) {
|
|
114
|
+
return this.providers.get(this.config.preferredProvider);
|
|
115
|
+
}
|
|
116
|
+
// Default Priority Chain
|
|
117
|
+
const priority = ["claude", "github", "openrouter", "gemini", "xai"];
|
|
118
|
+
for (const name of priority) {
|
|
119
|
+
if (this.providers.has(name)) {
|
|
120
|
+
return this.providers.get(name);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
throw new Error("No AI providers available. Please configure API keys (e.g., MYCONTEXT_GITHUB_TOKEN).");
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* High-level generation utility that handles formatting and basic retries
|
|
127
|
+
*/
|
|
128
|
+
async generateStructuredText(prompt, schema, options) {
|
|
129
|
+
const client = this.getBestClient();
|
|
130
|
+
const enhancedPrompt = `${prompt}\n\nIMPORTANT: You MUST return ONLY valid JSON that conforms to the following schema:\n${schema}\n\nDo not include code blocks or markdown, just the raw JSON string.`;
|
|
131
|
+
const response = await client.generateText(enhancedPrompt, options);
|
|
132
|
+
try {
|
|
133
|
+
// Basic cleanup in case LLM wraps in code blocks
|
|
134
|
+
const cleanJson = response.replace(/^```json\n?/, "").replace(/\n?```$/, "").trim();
|
|
135
|
+
return JSON.parse(cleanJson);
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
console.error(chalk_1.default.red("Failed to parse AI response as JSON"), response);
|
|
139
|
+
throw new Error("AI failed to produce structured JSON context.");
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Proxy for generateText with automatic fallback
|
|
144
|
+
*/
|
|
145
|
+
async generateText(prompt, options = {}) {
|
|
146
|
+
const clients = this.getAvailableClients();
|
|
147
|
+
let lastError = null;
|
|
148
|
+
for (const client of clients) {
|
|
149
|
+
try {
|
|
150
|
+
return await client.generateText(prompt, options);
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
lastError = error;
|
|
154
|
+
const message = error.message || String(error);
|
|
155
|
+
// If it's a rate limit or auth error, log it and try the next client
|
|
156
|
+
if (message.includes("429") || message.toLowerCase().includes("rate limit") ||
|
|
157
|
+
message.includes("401") || message.toLowerCase().includes("unauthorized")) {
|
|
158
|
+
console.log(chalk_1.default.yellow(`⚠️ Provider ${client.clientType} failed, trying fallback...`));
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
// For other errors, we might still want to try fallback depending on severity
|
|
162
|
+
console.log(chalk_1.default.gray(`ℹ️ Provider ${client.clientType} error: ${message.substring(0, 50)}...`));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (lastError) {
|
|
166
|
+
this.handleAIError(lastError);
|
|
167
|
+
throw lastError;
|
|
168
|
+
}
|
|
169
|
+
throw new Error("No AI providers available - configure API keys and retry");
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get all clients that have API keys configured, ordered by priority
|
|
173
|
+
*/
|
|
174
|
+
getAvailableClients() {
|
|
175
|
+
const priority = ["claude", "github", "openrouter", "gemini", "xai"];
|
|
176
|
+
return priority
|
|
177
|
+
.map(type => this.providers.get(type))
|
|
178
|
+
.filter((client) => !!client && client.hasApiKey());
|
|
179
|
+
}
|
|
180
|
+
handleAIError(error) {
|
|
181
|
+
const message = error.message || String(error);
|
|
182
|
+
// GitHub Models Rate Limit (429)
|
|
183
|
+
if (message.includes("429") || message.toLowerCase().includes("rate limit")) {
|
|
184
|
+
console.log(chalk_1.default.yellow("\n⚠️ AI Rate Limit Hit (GitHub Models Free Tier)"));
|
|
185
|
+
console.log(chalk_1.default.blue("💡 Recommendation:"));
|
|
186
|
+
console.log(chalk_1.default.gray(" 1. Obtain a FREE OpenRouter API key at https://openrouter.ai/keys"));
|
|
187
|
+
console.log(chalk_1.default.gray(" 2. Add it to .mycontext/.env: MYCONTEXT_OPENROUTER_API_KEY=sk-or-..."));
|
|
188
|
+
console.log(chalk_1.default.gray(" 3. Or switch to Gemini by adding GEMINI_API_KEY to your env."));
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
// Generic Auth error
|
|
192
|
+
if (message.includes("401") || message.toLowerCase().includes("unauthorized") || message.toLowerCase().includes("api key")) {
|
|
193
|
+
console.log(chalk_1.default.red("\n❌ AI Authentication Error"));
|
|
194
|
+
console.log(chalk_1.default.gray(" Please check your API keys in .mycontext/.env"));
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Proxy for generateComponent
|
|
200
|
+
*/
|
|
201
|
+
async generateComponent(prompt, context, options = {}) {
|
|
202
|
+
return this.getBestClient().generateComponent(prompt, context, options);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Proxy for generateComponentRefinement
|
|
206
|
+
*/
|
|
207
|
+
async generateComponentRefinement(componentCode, prompt, context, options = {}) {
|
|
208
|
+
return this.getBestClient().generateComponentRefinement(componentCode, prompt, context, options);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Get the primary source of truth (Living Brain)
|
|
212
|
+
*/
|
|
213
|
+
async getLivingContext() {
|
|
214
|
+
try {
|
|
215
|
+
const contextPath = path.join(this.config.workingDirectory, ".mycontext", "context.json");
|
|
216
|
+
if (await fs.pathExists(contextPath)) {
|
|
217
|
+
return await fs.readJson(contextPath);
|
|
218
|
+
}
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
console.warn("⚠️ Could not load Living Context:", error);
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
exports.AICore = AICore;
|
|
228
|
+
//# sourceMappingURL=AICore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AICore.js","sourceRoot":"","sources":["../../../src/core/ai/AICore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Brain, BrainRole } from '@myycontext/core/src/types/brain';
|
|
2
|
+
export declare class BrainClient {
|
|
3
|
+
private static instance;
|
|
4
|
+
private brainPath;
|
|
5
|
+
private constructor();
|
|
6
|
+
static getInstance(workingDirectory?: string): BrainClient;
|
|
7
|
+
getBrain(): Promise<Brain>;
|
|
8
|
+
private incrementVersion;
|
|
9
|
+
saveBrain(brain: Brain): Promise<void>;
|
|
10
|
+
addUpdate(agentName: string, role: BrainRole, type: "thought" | "action" | "error" | "completion", message: string, metadata?: any): Promise<void>;
|
|
11
|
+
updateArtifact(type: 'prd' | 'code', content: string, filePath: string): Promise<void>;
|
|
12
|
+
setNarrative(narrative: string): Promise<void>;
|
|
13
|
+
setStatus(status: Brain['status']): Promise<void>;
|
|
14
|
+
reset(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=BrainClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BrainClient.d.ts","sourceRoot":"","sources":["../../../src/core/brain/BrainClient.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAA0B,SAAS,EAAuB,MAAM,kCAAkC,CAAC;AAIjH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAc;IACrC,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO;WAIO,WAAW,CAAC,gBAAgB,GAAE,MAAsB,GAAG,WAAW;IAWnE,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC;IAavC,OAAO,CAAC,gBAAgB;IAOX,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBtC,SAAS,CACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,YAAY,EACnD,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,GAAG,GACb,OAAO,CAAC,IAAI,CAAC;IAqBH,cAAc,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBtF,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9C,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAKpC"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.BrainClient = void 0;
|
|
40
|
+
const fs = __importStar(require("fs-extra"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const brain_1 = require("@myycontext/core/src/types/brain");
|
|
43
|
+
const uuid_1 = require("uuid");
|
|
44
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
45
|
+
class BrainClient {
|
|
46
|
+
constructor(workingDirectory) {
|
|
47
|
+
this.brainPath = path.join(workingDirectory, '.mycontext', 'context.json');
|
|
48
|
+
}
|
|
49
|
+
static getInstance(workingDirectory = process.cwd()) {
|
|
50
|
+
if (!BrainClient.instance) {
|
|
51
|
+
BrainClient.instance = new BrainClient(workingDirectory);
|
|
52
|
+
}
|
|
53
|
+
// Update path if working directory changes (edge case handling)
|
|
54
|
+
if (path.dirname(path.dirname(BrainClient.instance.brainPath)) !== workingDirectory) {
|
|
55
|
+
BrainClient.instance.brainPath = path.join(workingDirectory, '.mycontext', 'context.json');
|
|
56
|
+
}
|
|
57
|
+
return BrainClient.instance;
|
|
58
|
+
}
|
|
59
|
+
async getBrain() {
|
|
60
|
+
try {
|
|
61
|
+
if (await fs.pathExists(this.brainPath)) {
|
|
62
|
+
const context = await fs.readJson(this.brainPath);
|
|
63
|
+
if (context.brain)
|
|
64
|
+
return context.brain;
|
|
65
|
+
}
|
|
66
|
+
return JSON.parse(JSON.stringify(brain_1.INITIAL_BRAIN_STATE));
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
console.error(chalk_1.default.red('Failed to read context/brain:'), error);
|
|
70
|
+
return JSON.parse(JSON.stringify(brain_1.INITIAL_BRAIN_STATE));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
incrementVersion(version) {
|
|
74
|
+
const parts = version.split('.').map(Number);
|
|
75
|
+
if (parts.length !== 3 || parts.some(isNaN) || parts[2] === undefined)
|
|
76
|
+
return version; // Fallback
|
|
77
|
+
parts[2]++; // Increment patch
|
|
78
|
+
return parts.join('.');
|
|
79
|
+
}
|
|
80
|
+
async saveBrain(brain) {
|
|
81
|
+
try {
|
|
82
|
+
// Auto-increment version on save for alignment
|
|
83
|
+
const currentVersion = brain.version || "1.0.0";
|
|
84
|
+
brain.version = this.incrementVersion(currentVersion);
|
|
85
|
+
let context = {};
|
|
86
|
+
if (await fs.pathExists(this.brainPath)) {
|
|
87
|
+
context = await fs.readJson(this.brainPath);
|
|
88
|
+
}
|
|
89
|
+
context.brain = brain;
|
|
90
|
+
await fs.ensureDir(path.dirname(this.brainPath));
|
|
91
|
+
await fs.writeJson(this.brainPath, context, { spaces: 2 });
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
console.error(chalk_1.default.red('Failed to save brain to context:'), error);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async addUpdate(agentName, role, type, message, metadata) {
|
|
98
|
+
const brain = await this.getBrain();
|
|
99
|
+
const update = {
|
|
100
|
+
id: (0, uuid_1.v4)(),
|
|
101
|
+
timestamp: Date.now(),
|
|
102
|
+
agent: agentName,
|
|
103
|
+
role,
|
|
104
|
+
type,
|
|
105
|
+
message,
|
|
106
|
+
metadata
|
|
107
|
+
};
|
|
108
|
+
brain.updates.push(update);
|
|
109
|
+
// Log to console for CLI visibility
|
|
110
|
+
const color = type === 'error' ? chalk_1.default.red : type === 'action' ? chalk_1.default.green : chalk_1.default.gray;
|
|
111
|
+
const icon = type === 'error' ? '❌' : type === 'action' ? '⚡' : type === 'thought' ? '💭' : '✅';
|
|
112
|
+
console.log(color(`[${agentName}] ${icon} ${message}`));
|
|
113
|
+
await this.saveBrain(brain);
|
|
114
|
+
}
|
|
115
|
+
async updateArtifact(type, content, filePath) {
|
|
116
|
+
const brain = await this.getBrain();
|
|
117
|
+
if (!brain.artifacts)
|
|
118
|
+
brain.artifacts = {};
|
|
119
|
+
if (!brain.artifacts[type]) {
|
|
120
|
+
brain.artifacts[type] = {
|
|
121
|
+
path: filePath,
|
|
122
|
+
content,
|
|
123
|
+
version: 1,
|
|
124
|
+
lastUpdated: Date.now()
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
brain.artifacts[type].content = content;
|
|
129
|
+
brain.artifacts[type].version++;
|
|
130
|
+
brain.artifacts[type].lastUpdated = Date.now();
|
|
131
|
+
}
|
|
132
|
+
await this.saveBrain(brain);
|
|
133
|
+
}
|
|
134
|
+
async setNarrative(narrative) {
|
|
135
|
+
const brain = await this.getBrain();
|
|
136
|
+
brain.narrative = narrative;
|
|
137
|
+
await this.saveBrain(brain);
|
|
138
|
+
}
|
|
139
|
+
async setStatus(status) {
|
|
140
|
+
const brain = await this.getBrain();
|
|
141
|
+
brain.status = status;
|
|
142
|
+
await this.saveBrain(brain);
|
|
143
|
+
}
|
|
144
|
+
async reset() {
|
|
145
|
+
// Deep copy to avoid mutating the imported constant
|
|
146
|
+
const freshBrain = JSON.parse(JSON.stringify(brain_1.INITIAL_BRAIN_STATE));
|
|
147
|
+
await this.saveBrain(freshBrain);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
exports.BrainClient = BrainClient;
|
|
151
|
+
//# sourceMappingURL=BrainClient.js.map
|