antri_cli 1.26.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 +92 -0
- package/bin/antri.js +2 -0
- package/dist/cli/banner.d.ts +22 -0
- package/dist/cli/banner.d.ts.map +1 -0
- package/dist/cli/banner.js +133 -0
- package/dist/cli/banner.js.map +1 -0
- package/dist/cli/dialogs/filePicker.d.ts +23 -0
- package/dist/cli/dialogs/filePicker.d.ts.map +1 -0
- package/dist/cli/dialogs/filePicker.js +106 -0
- package/dist/cli/dialogs/filePicker.js.map +1 -0
- package/dist/cli/dialogs/modelPicker.d.ts +10 -0
- package/dist/cli/dialogs/modelPicker.d.ts.map +1 -0
- package/dist/cli/dialogs/modelPicker.js +205 -0
- package/dist/cli/dialogs/modelPicker.js.map +1 -0
- package/dist/cli/dialogs/profilePicker.d.ts +11 -0
- package/dist/cli/dialogs/profilePicker.d.ts.map +1 -0
- package/dist/cli/dialogs/profilePicker.js +185 -0
- package/dist/cli/dialogs/profilePicker.js.map +1 -0
- package/dist/cli/dialogs/providerPicker.d.ts +19 -0
- package/dist/cli/dialogs/providerPicker.d.ts.map +1 -0
- package/dist/cli/dialogs/providerPicker.js +205 -0
- package/dist/cli/dialogs/providerPicker.js.map +1 -0
- package/dist/cli/prompt.d.ts +3 -0
- package/dist/cli/prompt.d.ts.map +1 -0
- package/dist/cli/prompt.js +50 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/cli/promptToolkit.d.ts +14 -0
- package/dist/cli/promptToolkit.d.ts.map +1 -0
- package/dist/cli/promptToolkit.js +389 -0
- package/dist/cli/promptToolkit.js.map +1 -0
- package/dist/cli/renderer.d.ts +21 -0
- package/dist/cli/renderer.d.ts.map +1 -0
- package/dist/cli/renderer.js +97 -0
- package/dist/cli/renderer.js.map +1 -0
- package/dist/cli/shortcuts.d.ts +13 -0
- package/dist/cli/shortcuts.d.ts.map +1 -0
- package/dist/cli/shortcuts.js +414 -0
- package/dist/cli/shortcuts.js.map +1 -0
- package/dist/core/agent.d.ts +15 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +232 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/citations.d.ts +19 -0
- package/dist/core/citations.d.ts.map +1 -0
- package/dist/core/citations.js +40 -0
- package/dist/core/citations.js.map +1 -0
- package/dist/core/config.d.ts +16 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +172 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/crawler.d.ts +18 -0
- package/dist/core/crawler.d.ts.map +1 -0
- package/dist/core/crawler.js +83 -0
- package/dist/core/crawler.js.map +1 -0
- package/dist/core/debugger.d.ts +20 -0
- package/dist/core/debugger.d.ts.map +1 -0
- package/dist/core/debugger.js +105 -0
- package/dist/core/debugger.js.map +1 -0
- package/dist/core/dialectic.d.ts +23 -0
- package/dist/core/dialectic.d.ts.map +1 -0
- package/dist/core/dialectic.js +300 -0
- package/dist/core/dialectic.js.map +1 -0
- package/dist/core/goalLoop.d.ts +14 -0
- package/dist/core/goalLoop.d.ts.map +1 -0
- package/dist/core/goalLoop.js +104 -0
- package/dist/core/goalLoop.js.map +1 -0
- package/dist/core/history.d.ts +13 -0
- package/dist/core/history.d.ts.map +1 -0
- package/dist/core/history.js +53 -0
- package/dist/core/history.js.map +1 -0
- package/dist/core/metaOptimizer.d.ts +27 -0
- package/dist/core/metaOptimizer.d.ts.map +1 -0
- package/dist/core/metaOptimizer.js +98 -0
- package/dist/core/metaOptimizer.js.map +1 -0
- package/dist/core/sandbox.d.ts +29 -0
- package/dist/core/sandbox.d.ts.map +1 -0
- package/dist/core/sandbox.js +141 -0
- package/dist/core/sandbox.js.map +1 -0
- package/dist/core/scraper.d.ts +22 -0
- package/dist/core/scraper.d.ts.map +1 -0
- package/dist/core/scraper.js +180 -0
- package/dist/core/scraper.js.map +1 -0
- package/dist/core/search.d.ts +27 -0
- package/dist/core/search.d.ts.map +1 -0
- package/dist/core/search.js +222 -0
- package/dist/core/search.js.map +1 -0
- package/dist/core/skillSynthesizer.d.ts +43 -0
- package/dist/core/skillSynthesizer.d.ts.map +1 -0
- package/dist/core/skillSynthesizer.js +147 -0
- package/dist/core/skillSynthesizer.js.map +1 -0
- package/dist/core/tools.d.ts +12 -0
- package/dist/core/tools.d.ts.map +1 -0
- package/dist/core/tools.js +467 -0
- package/dist/core/tools.js.map +1 -0
- package/dist/core/updater.d.ts +9 -0
- package/dist/core/updater.d.ts.map +1 -0
- package/dist/core/updater.js +63 -0
- package/dist/core/updater.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/consolidation.d.ts +17 -0
- package/dist/memory/consolidation.d.ts.map +1 -0
- package/dist/memory/consolidation.js +42 -0
- package/dist/memory/consolidation.js.map +1 -0
- package/dist/memory/episodic.d.ts +15 -0
- package/dist/memory/episodic.d.ts.map +1 -0
- package/dist/memory/episodic.js +97 -0
- package/dist/memory/episodic.js.map +1 -0
- package/dist/memory/manager.d.ts +24 -0
- package/dist/memory/manager.d.ts.map +1 -0
- package/dist/memory/manager.js +97 -0
- package/dist/memory/manager.js.map +1 -0
- package/dist/memory/profile.d.ts +21 -0
- package/dist/memory/profile.d.ts.map +1 -0
- package/dist/memory/profile.js +111 -0
- package/dist/memory/profile.js.map +1 -0
- package/dist/memory/semantic.d.ts +24 -0
- package/dist/memory/semantic.d.ts.map +1 -0
- package/dist/memory/semantic.js +102 -0
- package/dist/memory/semantic.js.map +1 -0
- package/dist/memory/types.d.ts +45 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +2 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/memory/vectorStore.d.ts +18 -0
- package/dist/memory/vectorStore.d.ts.map +1 -0
- package/dist/memory/vectorStore.js +103 -0
- package/dist/memory/vectorStore.js.map +1 -0
- package/dist/profiles/profileManager.d.ts +25 -0
- package/dist/profiles/profileManager.d.ts.map +1 -0
- package/dist/profiles/profileManager.js +205 -0
- package/dist/profiles/profileManager.js.map +1 -0
- package/dist/providers/anthropic.d.ts +14 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +80 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +7 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +2 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/gemini.d.ts +14 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +77 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +4 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +65 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/mock.d.ts +8 -0
- package/dist/providers/mock.d.ts.map +1 -0
- package/dist/providers/mock.js +62 -0
- package/dist/providers/mock.js.map +1 -0
- package/dist/providers/models.d.ts +8 -0
- package/dist/providers/models.d.ts.map +1 -0
- package/dist/providers/models.js +403 -0
- package/dist/providers/models.js.map +1 -0
- package/dist/providers/openai.d.ts +18 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +162 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/types.d.ts +116 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/logger.d.ts +23 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +26 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import { VectorStore } from './vectorStore.js';
|
|
5
|
+
const MEMORY_DIR = path.join(os.homedir(), '.antri', 'memory');
|
|
6
|
+
const SEMANTIC_FILE = path.join(MEMORY_DIR, 'semantic_store.json');
|
|
7
|
+
export class SemanticMemory {
|
|
8
|
+
items = [];
|
|
9
|
+
constructor() {
|
|
10
|
+
this.ensureDirectory();
|
|
11
|
+
this.load();
|
|
12
|
+
this.seedInitialKnowledge();
|
|
13
|
+
}
|
|
14
|
+
ensureDirectory() {
|
|
15
|
+
if (!fs.existsSync(MEMORY_DIR)) {
|
|
16
|
+
fs.mkdirSync(MEMORY_DIR, { recursive: true });
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
load() {
|
|
20
|
+
try {
|
|
21
|
+
if (fs.existsSync(SEMANTIC_FILE)) {
|
|
22
|
+
const raw = fs.readFileSync(SEMANTIC_FILE, 'utf-8');
|
|
23
|
+
this.items = JSON.parse(raw);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
this.items = [];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
save() {
|
|
31
|
+
try {
|
|
32
|
+
this.ensureDirectory();
|
|
33
|
+
fs.writeFileSync(SEMANTIC_FILE, JSON.stringify(this.items, null, 2), 'utf-8');
|
|
34
|
+
}
|
|
35
|
+
catch { }
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Indexes a new knowledge snippet into the vector store
|
|
39
|
+
*/
|
|
40
|
+
async store(text, category = 'lesson_learned', metadata = {}, geminiApiKey) {
|
|
41
|
+
const vector = await VectorStore.generateEmbedding(text, geminiApiKey);
|
|
42
|
+
const item = {
|
|
43
|
+
id: `sem_${Date.now()}_${Math.random().toString(36).substring(2, 7)}`,
|
|
44
|
+
timestamp: Date.now(),
|
|
45
|
+
text,
|
|
46
|
+
category,
|
|
47
|
+
vector,
|
|
48
|
+
metadata,
|
|
49
|
+
};
|
|
50
|
+
this.items.push(item);
|
|
51
|
+
this.save();
|
|
52
|
+
return item;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Performs semantic vector cosine similarity search
|
|
56
|
+
*/
|
|
57
|
+
async search(query, topK = 3, threshold = 0.25, geminiApiKey) {
|
|
58
|
+
if (this.items.length === 0)
|
|
59
|
+
return [];
|
|
60
|
+
const queryVector = await VectorStore.generateEmbedding(query, geminiApiKey);
|
|
61
|
+
const scored = this.items.map((item) => {
|
|
62
|
+
const similarity = VectorStore.cosineSimilarity(queryVector, item.vector);
|
|
63
|
+
return { item, similarity };
|
|
64
|
+
});
|
|
65
|
+
return scored
|
|
66
|
+
.filter((s) => s.similarity >= threshold)
|
|
67
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
68
|
+
.slice(0, topK);
|
|
69
|
+
}
|
|
70
|
+
count() {
|
|
71
|
+
return this.items.length;
|
|
72
|
+
}
|
|
73
|
+
getAll() {
|
|
74
|
+
return this.items;
|
|
75
|
+
}
|
|
76
|
+
clear() {
|
|
77
|
+
this.items = [];
|
|
78
|
+
this.save();
|
|
79
|
+
}
|
|
80
|
+
async seedInitialKnowledge() {
|
|
81
|
+
if (this.items.length === 0) {
|
|
82
|
+
const initialNuggets = [
|
|
83
|
+
{
|
|
84
|
+
text: 'In TypeScript projects with NodeNext ESM modules, always use .js file extensions in relative imports even when authoring .ts source files.',
|
|
85
|
+
category: 'architecture_insight',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
text: 'When performing raw-mode terminal line erasure, using upward relative movement without extra newlines prevents off-by-one cursor overwrites.',
|
|
89
|
+
category: 'problem_solution',
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
text: 'NVIDIA NIM endpoints on standard developer accounts execute ultra-fast inference on meta/llama-3.1-8b-instruct and Step 3.7 Flash models.',
|
|
93
|
+
category: 'api_guide',
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
for (const nug of initialNuggets) {
|
|
97
|
+
await this.store(nug.text, nug.category, { tags: ['best-practices'] });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=semantic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic.js","sourceRoot":"","sources":["../../src/memory/semantic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface Episode {
|
|
2
|
+
id: string;
|
|
3
|
+
timestamp: number;
|
|
4
|
+
sessionId: string;
|
|
5
|
+
query: string;
|
|
6
|
+
response: string;
|
|
7
|
+
toolsUsed: string[];
|
|
8
|
+
debateStages?: string[];
|
|
9
|
+
tags: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface SemanticVectorItem {
|
|
12
|
+
id: string;
|
|
13
|
+
timestamp: number;
|
|
14
|
+
text: string;
|
|
15
|
+
category: 'problem_solution' | 'architecture_insight' | 'api_guide' | 'lesson_learned' | 'domain_knowledge';
|
|
16
|
+
vector: number[];
|
|
17
|
+
metadata: {
|
|
18
|
+
sourceQuery?: string;
|
|
19
|
+
workspace?: string;
|
|
20
|
+
tags?: string[];
|
|
21
|
+
confidence?: number;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export interface UserProfileMemory {
|
|
25
|
+
userName?: string;
|
|
26
|
+
preferredLanguage?: string;
|
|
27
|
+
codeStyle?: {
|
|
28
|
+
indentation?: string;
|
|
29
|
+
typingStrictness?: string;
|
|
30
|
+
testFramework?: string;
|
|
31
|
+
};
|
|
32
|
+
preferredModels?: string[];
|
|
33
|
+
customRules: string[];
|
|
34
|
+
totalSessions: number;
|
|
35
|
+
totalQueries: number;
|
|
36
|
+
lastConsolidatedAt?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface RecalledContext {
|
|
39
|
+
episodes: Episode[];
|
|
40
|
+
semanticInsights: SemanticVectorItem[];
|
|
41
|
+
workspaceConventions: string[];
|
|
42
|
+
userPreferences: string[];
|
|
43
|
+
hasMemories: boolean;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,kBAAkB,GAAG,sBAAsB,GAAG,WAAW,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;IAC5G,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE;QACV,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,gBAAgB,EAAE,kBAAkB,EAAE,CAAC;IACvC,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare class VectorStore {
|
|
2
|
+
private static readonly VECTOR_DIM;
|
|
3
|
+
/**
|
|
4
|
+
* Generates a normalized semantic embedding vector for a given text
|
|
5
|
+
*/
|
|
6
|
+
static generateEmbedding(text: string, geminiApiKey?: string): Promise<number[]>;
|
|
7
|
+
/**
|
|
8
|
+
* Generates a 128-dimensional dense semantic feature vector
|
|
9
|
+
*/
|
|
10
|
+
private static generateLocalSemanticVector;
|
|
11
|
+
/**
|
|
12
|
+
* Calculates cosine similarity between two vectors (-1.0 to 1.0)
|
|
13
|
+
*/
|
|
14
|
+
static cosineSimilarity(a: number[], b: number[]): number;
|
|
15
|
+
private static normalize;
|
|
16
|
+
private static hashString;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=vectorStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vectorStore.d.ts","sourceRoot":"","sources":["../../src/memory/vectorStore.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAO;IAEzC;;OAEG;WACiB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA+B7F;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,2BAA2B;IAqC1C;;OAEG;WACW,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM;IAiBhE,OAAO,CAAC,MAAM,CAAC,SAAS;IAQxB,OAAO,CAAC,MAAM,CAAC,UAAU;CAO1B"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
export class VectorStore {
|
|
2
|
+
static VECTOR_DIM = 128;
|
|
3
|
+
/**
|
|
4
|
+
* Generates a normalized semantic embedding vector for a given text
|
|
5
|
+
*/
|
|
6
|
+
static async generateEmbedding(text, geminiApiKey) {
|
|
7
|
+
// 1. Try Gemini Embeddings API if key is available
|
|
8
|
+
if (geminiApiKey) {
|
|
9
|
+
try {
|
|
10
|
+
const res = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/text-embedding-004:embedContent?key=${geminiApiKey}`, {
|
|
11
|
+
method: 'POST',
|
|
12
|
+
headers: { 'Content-Type': 'application/json' },
|
|
13
|
+
body: JSON.stringify({
|
|
14
|
+
model: 'models/text-embedding-004',
|
|
15
|
+
content: { parts: [{ text }] },
|
|
16
|
+
}),
|
|
17
|
+
signal: AbortSignal.timeout(3000),
|
|
18
|
+
});
|
|
19
|
+
if (res.ok) {
|
|
20
|
+
const data = (await res.json());
|
|
21
|
+
if (data.embedding?.values && Array.isArray(data.embedding.values)) {
|
|
22
|
+
return this.normalize(data.embedding.values.slice(0, this.VECTOR_DIM));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Fallback to local semantic vectorizer
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// 2. High-performance deterministic Semantic Bag-of-Subwords & N-gram Vectorizer
|
|
31
|
+
return this.generateLocalSemanticVector(text);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Generates a 128-dimensional dense semantic feature vector
|
|
35
|
+
*/
|
|
36
|
+
static generateLocalSemanticVector(text) {
|
|
37
|
+
const vector = new Array(this.VECTOR_DIM).fill(0);
|
|
38
|
+
const cleaned = text.toLowerCase().replace(/[^a-z0-9_\-\s]/g, ' ');
|
|
39
|
+
const tokens = cleaned.split(/\s+/).filter((t) => t.length > 1);
|
|
40
|
+
if (tokens.length === 0)
|
|
41
|
+
return vector;
|
|
42
|
+
// Token frequency & semantic hash projection
|
|
43
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
44
|
+
const token = tokens[i];
|
|
45
|
+
const weight = 1 / Math.sqrt(i + 1);
|
|
46
|
+
// Unigram hash
|
|
47
|
+
const h1 = this.hashString(token);
|
|
48
|
+
const idx1 = Math.abs(h1) % this.VECTOR_DIM;
|
|
49
|
+
vector[idx1] += (h1 > 0 ? 1 : -1) * weight * 1.5;
|
|
50
|
+
// Bigram hash if possible
|
|
51
|
+
if (i < tokens.length - 1) {
|
|
52
|
+
const bigram = `${token}_${tokens[i + 1]}`;
|
|
53
|
+
const h2 = this.hashString(bigram);
|
|
54
|
+
const idx2 = Math.abs(h2) % this.VECTOR_DIM;
|
|
55
|
+
vector[idx2] += (h2 > 0 ? 1 : -1) * weight * 2.0;
|
|
56
|
+
}
|
|
57
|
+
// Subword character trigrams
|
|
58
|
+
for (let j = 0; j <= token.length - 3; j++) {
|
|
59
|
+
const tri = token.slice(j, j + 3);
|
|
60
|
+
const h3 = this.hashString(tri);
|
|
61
|
+
const idx3 = Math.abs(h3) % this.VECTOR_DIM;
|
|
62
|
+
vector[idx3] += (h3 > 0 ? 1 : -1) * 0.4;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return this.normalize(vector);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Calculates cosine similarity between two vectors (-1.0 to 1.0)
|
|
69
|
+
*/
|
|
70
|
+
static cosineSimilarity(a, b) {
|
|
71
|
+
if (!a || !b || a.length === 0 || b.length === 0)
|
|
72
|
+
return 0;
|
|
73
|
+
const len = Math.min(a.length, b.length);
|
|
74
|
+
let dot = 0;
|
|
75
|
+
let normA = 0;
|
|
76
|
+
let normB = 0;
|
|
77
|
+
for (let i = 0; i < len; i++) {
|
|
78
|
+
dot += a[i] * b[i];
|
|
79
|
+
normA += a[i] * a[i];
|
|
80
|
+
normB += b[i] * b[i];
|
|
81
|
+
}
|
|
82
|
+
if (normA === 0 || normB === 0)
|
|
83
|
+
return 0;
|
|
84
|
+
return dot / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
85
|
+
}
|
|
86
|
+
static normalize(vec) {
|
|
87
|
+
let norm = 0;
|
|
88
|
+
for (const v of vec)
|
|
89
|
+
norm += v * v;
|
|
90
|
+
norm = Math.sqrt(norm);
|
|
91
|
+
if (norm === 0)
|
|
92
|
+
return vec;
|
|
93
|
+
return vec.map((v) => v / norm);
|
|
94
|
+
}
|
|
95
|
+
static hashString(str) {
|
|
96
|
+
let hash = 5381;
|
|
97
|
+
for (let i = 0; i < str.length; i++) {
|
|
98
|
+
hash = (hash * 33) ^ str.charCodeAt(i);
|
|
99
|
+
}
|
|
100
|
+
return hash;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=vectorStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vectorStore.js","sourceRoot":"","sources":["../../src/memory/vectorStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ProfileInfo } from '../types.js';
|
|
2
|
+
export declare class ProfileManager {
|
|
3
|
+
private profilesDir;
|
|
4
|
+
private activeProfile;
|
|
5
|
+
constructor(customDir?: string);
|
|
6
|
+
private ensureDirectory;
|
|
7
|
+
private initDefaultProfile;
|
|
8
|
+
private loadActiveProfileName;
|
|
9
|
+
getActiveProfileName(): string;
|
|
10
|
+
setActiveProfile(name: string): boolean;
|
|
11
|
+
listProfiles(): ProfileInfo[];
|
|
12
|
+
getActiveProfileContent(): string;
|
|
13
|
+
createProfile(name: string, description?: string): ProfileInfo;
|
|
14
|
+
/**
|
|
15
|
+
* Appends an observed user insight, preference, or feedback item to active profile markdown
|
|
16
|
+
*/
|
|
17
|
+
appendNoteToActiveProfile(note: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* Real-time feedback and preference extractor: Analyzes user prompt for thinking styles, feedback, or directives
|
|
20
|
+
*/
|
|
21
|
+
extractAndRecordNotes(userPrompt: string): string | null;
|
|
22
|
+
renderActiveProfile(): void;
|
|
23
|
+
}
|
|
24
|
+
export declare const profileManager: ProfileManager;
|
|
25
|
+
//# sourceMappingURL=profileManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profileManager.d.ts","sourceRoot":"","sources":["../../src/profiles/profileManager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK1C,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAuB;gBAEhC,SAAS,CAAC,EAAE,MAAM;IAO9B,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,qBAAqB;IAatB,oBAAoB,IAAI,MAAM;IAI9B,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAkBvC,YAAY,IAAI,WAAW,EAAE;IAyC7B,uBAAuB,IAAI,MAAM;IAUjC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW;IAiCrE;;OAEG;IACI,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAwBpD;;OAEG;IACI,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAuBxD,mBAAmB,IAAI,IAAI;CAQnC;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
const PROFILES_DIR = path.join(os.homedir(), '.antri', 'profiles');
|
|
6
|
+
const ACTIVE_PROFILE_FILE = path.join(PROFILES_DIR, '.active_profile');
|
|
7
|
+
export class ProfileManager {
|
|
8
|
+
profilesDir;
|
|
9
|
+
activeProfile = 'profile_1';
|
|
10
|
+
constructor(customDir) {
|
|
11
|
+
this.profilesDir = customDir || PROFILES_DIR;
|
|
12
|
+
this.ensureDirectory();
|
|
13
|
+
this.initDefaultProfile();
|
|
14
|
+
this.loadActiveProfileName();
|
|
15
|
+
}
|
|
16
|
+
ensureDirectory() {
|
|
17
|
+
if (!fs.existsSync(this.profilesDir)) {
|
|
18
|
+
fs.mkdirSync(this.profilesDir, { recursive: true });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
initDefaultProfile() {
|
|
22
|
+
const profile1Path = path.join(this.profilesDir, 'profile_1.md');
|
|
23
|
+
if (!fs.existsSync(profile1Path)) {
|
|
24
|
+
const template = `# š¤ User Profile: profile_1
|
|
25
|
+
- Created: ${new Date().toISOString()}
|
|
26
|
+
- Description: Default user profile for proactive guidance, step-by-step roadmaps, and adaptive notes.
|
|
27
|
+
|
|
28
|
+
## š§ Style of Thinking & Preferences
|
|
29
|
+
- Communication: Direct, structured, asks clarifying questions when decisions have trade-offs.
|
|
30
|
+
- Execution: Leads the way step-by-step with clear explanations.
|
|
31
|
+
- Adaptability: Continuously incorporates user feedback and refines solutions.
|
|
32
|
+
|
|
33
|
+
## š Notes & Captured Insights
|
|
34
|
+
- [${new Date().toLocaleDateString()}]: Initialized profile_1. Leading the way and taking notes on user thinking style.
|
|
35
|
+
|
|
36
|
+
## š ļø Code Conventions & Architectural Preferences
|
|
37
|
+
- Architecture: Modular, clean, idiomatic code with explicit type safety.
|
|
38
|
+
- Documentation: Self-documenting code with concise explanations.
|
|
39
|
+
`;
|
|
40
|
+
fs.writeFileSync(profile1Path, template, 'utf-8');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
loadActiveProfileName() {
|
|
44
|
+
try {
|
|
45
|
+
if (fs.existsSync(ACTIVE_PROFILE_FILE)) {
|
|
46
|
+
const name = fs.readFileSync(ACTIVE_PROFILE_FILE, 'utf-8').trim();
|
|
47
|
+
if (name && fs.existsSync(path.join(this.profilesDir, `${name}.md`))) {
|
|
48
|
+
this.activeProfile = name;
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch { }
|
|
54
|
+
this.activeProfile = 'profile_1';
|
|
55
|
+
}
|
|
56
|
+
getActiveProfileName() {
|
|
57
|
+
return this.activeProfile;
|
|
58
|
+
}
|
|
59
|
+
setActiveProfile(name) {
|
|
60
|
+
const cleanName = name.replace(/\.md$/, '').trim();
|
|
61
|
+
const targetPath = path.join(this.profilesDir, `${cleanName}.md`);
|
|
62
|
+
if (!fs.existsSync(targetPath)) {
|
|
63
|
+
// Auto-create if not exists
|
|
64
|
+
this.createProfile(cleanName);
|
|
65
|
+
}
|
|
66
|
+
this.activeProfile = cleanName;
|
|
67
|
+
try {
|
|
68
|
+
fs.writeFileSync(ACTIVE_PROFILE_FILE, cleanName, 'utf-8');
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
listProfiles() {
|
|
76
|
+
this.ensureDirectory();
|
|
77
|
+
const files = fs.readdirSync(this.profilesDir).filter((f) => f.endsWith('.md'));
|
|
78
|
+
const profiles = [];
|
|
79
|
+
for (const file of files) {
|
|
80
|
+
const id = file.replace(/\.md$/, '');
|
|
81
|
+
const filePath = path.join(this.profilesDir, file);
|
|
82
|
+
const stat = fs.statSync(filePath);
|
|
83
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
84
|
+
const lines = content.split('\n');
|
|
85
|
+
let notesCount = 0;
|
|
86
|
+
let inNotesSection = false;
|
|
87
|
+
for (const l of lines) {
|
|
88
|
+
if (l.startsWith('## š Notes')) {
|
|
89
|
+
inNotesSection = true;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (inNotesSection && l.startsWith('## ')) {
|
|
93
|
+
inNotesSection = false;
|
|
94
|
+
}
|
|
95
|
+
if (inNotesSection && l.trim().startsWith('- [')) {
|
|
96
|
+
notesCount++;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
profiles.push({
|
|
100
|
+
id,
|
|
101
|
+
name: id,
|
|
102
|
+
filePath,
|
|
103
|
+
isActive: id === this.activeProfile,
|
|
104
|
+
notesCount,
|
|
105
|
+
lastModified: stat.mtimeMs,
|
|
106
|
+
preview: lines.slice(0, 10).join('\n'),
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return profiles.sort((a, b) => (b.isActive ? 1 : 0) - (a.isActive ? 1 : 0));
|
|
110
|
+
}
|
|
111
|
+
getActiveProfileContent() {
|
|
112
|
+
const filePath = path.join(this.profilesDir, `${this.activeProfile}.md`);
|
|
113
|
+
if (fs.existsSync(filePath)) {
|
|
114
|
+
try {
|
|
115
|
+
return fs.readFileSync(filePath, 'utf-8');
|
|
116
|
+
}
|
|
117
|
+
catch { }
|
|
118
|
+
}
|
|
119
|
+
return '';
|
|
120
|
+
}
|
|
121
|
+
createProfile(name, description) {
|
|
122
|
+
const cleanName = name.toLowerCase().replace(/[^a-z0-9_-]/g, '_').trim() || `profile_${Date.now()}`;
|
|
123
|
+
const filePath = path.join(this.profilesDir, `${cleanName}.md`);
|
|
124
|
+
const template = `# š¤ User Profile: ${cleanName}
|
|
125
|
+
- Created: ${new Date().toISOString()}
|
|
126
|
+
- Description: ${description || `Custom thinking style and preference profile for ${cleanName}.`}
|
|
127
|
+
|
|
128
|
+
## š§ Style of Thinking & Preferences
|
|
129
|
+
- Communication: Proactively leads the way, asks clarifying questions, and adapts step-by-step.
|
|
130
|
+
- Pace: Fast and iterative.
|
|
131
|
+
|
|
132
|
+
## š Notes & Captured Insights
|
|
133
|
+
- [${new Date().toLocaleDateString()}]: Created profile '${cleanName}'. Ready to capture feedback and thinking style.
|
|
134
|
+
|
|
135
|
+
## š ļø Code Conventions & Architectural Preferences
|
|
136
|
+
- Standard conventions apply. Will adapt as user chats in this profile.
|
|
137
|
+
`;
|
|
138
|
+
fs.writeFileSync(filePath, template, 'utf-8');
|
|
139
|
+
this.setActiveProfile(cleanName);
|
|
140
|
+
return {
|
|
141
|
+
id: cleanName,
|
|
142
|
+
name: cleanName,
|
|
143
|
+
filePath,
|
|
144
|
+
isActive: true,
|
|
145
|
+
notesCount: 1,
|
|
146
|
+
lastModified: Date.now(),
|
|
147
|
+
preview: template,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Appends an observed user insight, preference, or feedback item to active profile markdown
|
|
152
|
+
*/
|
|
153
|
+
appendNoteToActiveProfile(note) {
|
|
154
|
+
const filePath = path.join(this.profilesDir, `${this.activeProfile}.md`);
|
|
155
|
+
if (!fs.existsSync(filePath))
|
|
156
|
+
return;
|
|
157
|
+
try {
|
|
158
|
+
let content = fs.readFileSync(filePath, 'utf-8');
|
|
159
|
+
const timestamp = new Date().toLocaleDateString();
|
|
160
|
+
const entry = `- [${timestamp}]: ${note.trim()}`;
|
|
161
|
+
if (content.includes(entry))
|
|
162
|
+
return; // Avoid exact duplicates
|
|
163
|
+
if (content.includes('## š Notes & Captured Insights')) {
|
|
164
|
+
content = content.replace('## š Notes & Captured Insights', `## š Notes & Captured Insights\n${entry}`);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
content += `\n## š Notes & Captured Insights\n${entry}\n`;
|
|
168
|
+
}
|
|
169
|
+
fs.writeFileSync(filePath, content, 'utf-8');
|
|
170
|
+
}
|
|
171
|
+
catch { }
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Real-time feedback and preference extractor: Analyzes user prompt for thinking styles, feedback, or directives
|
|
175
|
+
*/
|
|
176
|
+
extractAndRecordNotes(userPrompt) {
|
|
177
|
+
const lower = userPrompt.toLowerCase().trim();
|
|
178
|
+
// Check for explicit preference / feedback patterns
|
|
179
|
+
const patterns = [
|
|
180
|
+
/(?:i prefer|i like|i always use|my style is|always use|never use|don't use|do not use)\s+([^.!?\n]+)/i,
|
|
181
|
+
/(?:from now on|remember that|keep in mind that|note that)\s+([^.!?\n]+)/i,
|
|
182
|
+
/(?:i want you to|make sure to|focus on|i think of this as)\s+([^.!?\n]+)/i,
|
|
183
|
+
/(?:let's do|instead of .+ let's use)\s+([^.!?\n]+)/i,
|
|
184
|
+
];
|
|
185
|
+
for (const pattern of patterns) {
|
|
186
|
+
const match = userPrompt.match(pattern);
|
|
187
|
+
if (match && match[1] && match[1].length > 4 && match[1].length < 200) {
|
|
188
|
+
const extracted = match[0].trim();
|
|
189
|
+
this.appendNoteToActiveProfile(extracted);
|
|
190
|
+
return extracted;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
renderActiveProfile() {
|
|
196
|
+
const content = this.getActiveProfileContent();
|
|
197
|
+
console.log(chalk.bold.hex('#c084fc')(`\nš¤ Active Profile: ${this.activeProfile}`));
|
|
198
|
+
console.log(chalk.hex('#334155')('ā'.repeat(72)));
|
|
199
|
+
console.log(chalk.hex('#94a3b8')(content));
|
|
200
|
+
console.log(chalk.hex('#334155')('ā'.repeat(72)));
|
|
201
|
+
console.log();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
export const profileManager = new ProfileManager();
|
|
205
|
+
//# sourceMappingURL=profileManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profileManager.js","sourceRoot":"","sources":["../../src/profiles/profileManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { LLMProvider } from './base.js';
|
|
2
|
+
import { ChatMessage, ToolDefinition, StreamCallbacks } from '../types.js';
|
|
3
|
+
export declare class AnthropicProvider implements LLMProvider {
|
|
4
|
+
name: string;
|
|
5
|
+
defaultModel: string;
|
|
6
|
+
private apiKey;
|
|
7
|
+
private model;
|
|
8
|
+
constructor(options: {
|
|
9
|
+
apiKey?: string;
|
|
10
|
+
model?: string;
|
|
11
|
+
});
|
|
12
|
+
sendMessageStream(messages: ChatMessage[], tools: ToolDefinition[], callbacks: StreamCallbacks): Promise<string>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE3E,qBAAa,iBAAkB,YAAW,WAAW;IAC5C,IAAI,EAAE,MAAM,CAAe;IAC3B,YAAY,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAM3C,iBAAiB,CAC5B,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,EAAE,cAAc,EAAE,EACvB,SAAS,EAAE,eAAe,GACzB,OAAO,CAAC,MAAM,CAAC;CA8EnB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export class AnthropicProvider {
|
|
2
|
+
name = 'anthropic';
|
|
3
|
+
defaultModel;
|
|
4
|
+
apiKey;
|
|
5
|
+
model;
|
|
6
|
+
constructor(options) {
|
|
7
|
+
this.apiKey = options.apiKey || '';
|
|
8
|
+
this.model = options.model || 'claude-3-5-sonnet-20241022';
|
|
9
|
+
this.defaultModel = this.model;
|
|
10
|
+
}
|
|
11
|
+
async sendMessageStream(messages, tools, callbacks) {
|
|
12
|
+
if (!this.apiKey) {
|
|
13
|
+
throw new Error('ANTHROPIC_API_KEY is not set. Use /key anthropic <your-key> or set it in .env');
|
|
14
|
+
}
|
|
15
|
+
const systemMsg = messages.find((m) => m.role === 'system')?.content || '';
|
|
16
|
+
const conversationMessages = messages
|
|
17
|
+
.filter((m) => m.role !== 'system')
|
|
18
|
+
.map((m) => ({
|
|
19
|
+
role: m.role === 'assistant' ? 'assistant' : 'user',
|
|
20
|
+
content: m.content,
|
|
21
|
+
}));
|
|
22
|
+
const payload = {
|
|
23
|
+
model: this.model,
|
|
24
|
+
max_tokens: 4096,
|
|
25
|
+
messages: conversationMessages,
|
|
26
|
+
stream: true,
|
|
27
|
+
};
|
|
28
|
+
if (systemMsg) {
|
|
29
|
+
payload.system = systemMsg;
|
|
30
|
+
}
|
|
31
|
+
const response = await fetch('https://api.anthropic.com/v1/messages', {
|
|
32
|
+
method: 'POST',
|
|
33
|
+
headers: {
|
|
34
|
+
'Content-Type': 'application/json',
|
|
35
|
+
'x-api-key': this.apiKey,
|
|
36
|
+
'anthropic-version': '2023-06-01',
|
|
37
|
+
},
|
|
38
|
+
body: JSON.stringify(payload),
|
|
39
|
+
});
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
const errText = await response.text();
|
|
42
|
+
throw new Error(`Anthropic API error (${response.status}): ${errText}`);
|
|
43
|
+
}
|
|
44
|
+
if (!response.body) {
|
|
45
|
+
throw new Error('Anthropic response body is null');
|
|
46
|
+
}
|
|
47
|
+
const reader = response.body.getReader();
|
|
48
|
+
const decoder = new TextDecoder('utf-8');
|
|
49
|
+
let fullContent = '';
|
|
50
|
+
let buffer = '';
|
|
51
|
+
while (true) {
|
|
52
|
+
const { done, value } = await reader.read();
|
|
53
|
+
if (done)
|
|
54
|
+
break;
|
|
55
|
+
buffer += decoder.decode(value, { stream: true });
|
|
56
|
+
const lines = buffer.split('\n');
|
|
57
|
+
buffer = lines.pop() || '';
|
|
58
|
+
for (const line of lines) {
|
|
59
|
+
const trimmed = line.trim();
|
|
60
|
+
if (trimmed.startsWith('data: ')) {
|
|
61
|
+
try {
|
|
62
|
+
const data = JSON.parse(trimmed.slice(6));
|
|
63
|
+
if (data.type === 'content_block_delta' && data.delta?.text) {
|
|
64
|
+
fullContent += data.delta.text;
|
|
65
|
+
callbacks.onToken(data.delta.text);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Ignore parse errors on chunks
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (callbacks.onComplete) {
|
|
75
|
+
callbacks.onComplete(fullContent);
|
|
76
|
+
}
|
|
77
|
+
return fullContent;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
|