squish-memory 0.9.2 → 0.9.3
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/{.env.mcp → .env.mcp.example} +23 -0
- package/CHANGELOG.md +34 -0
- package/QUICK-START.md +10 -4
- package/README.md +15 -2
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +11 -0
- package/dist/config.js.map +1 -1
- package/dist/core/core-memory.d.ts +5 -0
- package/dist/core/core-memory.d.ts.map +1 -1
- package/dist/core/core-memory.js +17 -5
- package/dist/core/core-memory.js.map +1 -1
- package/dist/core/embeddings.d.ts +9 -0
- package/dist/core/embeddings.d.ts.map +1 -1
- package/dist/core/embeddings.js +153 -16
- package/dist/core/embeddings.js.map +1 -1
- package/dist/db/bootstrap.d.ts.map +1 -1
- package/dist/db/bootstrap.js +33 -6
- package/dist/db/bootstrap.js.map +1 -1
- package/dist/drizzle/schema-sqlite.d.ts +17 -0
- package/dist/drizzle/schema-sqlite.d.ts.map +1 -1
- package/dist/drizzle/schema-sqlite.js +1 -0
- package/dist/drizzle/schema-sqlite.js.map +1 -1
- package/dist/drizzle/schema.d.ts +17 -0
- package/dist/drizzle/schema.d.ts.map +1 -1
- package/dist/drizzle/schema.js +1 -0
- package/dist/drizzle/schema.js.map +1 -1
- package/package.json +21 -20
- package/scripts/build-release.sh +20 -17
- package/scripts/check-secrets.js +132 -0
- package/scripts/github-release.sh +43 -27
|
@@ -14,6 +14,24 @@ GOOGLE_CLOUD_LOCATION=us-central1
|
|
|
14
14
|
# Or use service account:
|
|
15
15
|
# GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json
|
|
16
16
|
|
|
17
|
+
# OpenAI Embeddings (optional, 1536-dim)
|
|
18
|
+
# SQUISH_OPENAI_API_KEY=sk-...
|
|
19
|
+
# SQUISH_OPENAI_API_URL=https://api.openai.com/v1/embeddings
|
|
20
|
+
# SQUISH_OPENAI_EMBEDDING_MODEL=text-embedding-3-small
|
|
21
|
+
|
|
22
|
+
# Ollama Embeddings (optional, model-dependent dims)
|
|
23
|
+
# SQUISH_OLLAMA_URL=http://localhost:11434
|
|
24
|
+
# SQUISH_OLLAMA_EMBEDDING_MODEL=nomic-embed-text:v1.5
|
|
25
|
+
|
|
26
|
+
# Embedding performance & reliability
|
|
27
|
+
SQUISH_EMBEDDINGS_TIMEOUT_MS=30000
|
|
28
|
+
SQUISH_EMBEDDINGS_MAX_RETRIES=3
|
|
29
|
+
SQUISH_EMBEDDINGS_RETRY_DELAY_MS=1000
|
|
30
|
+
# Per-provider overrides (optional)
|
|
31
|
+
# SQUISH_OPENAI_TIMEOUT_MS=30000
|
|
32
|
+
# SQUISH_OLLAMA_TIMEOUT_MS=30000
|
|
33
|
+
# SQUISH_GOOGLE_MULTIMODAL_TIMEOUT_MS=30000
|
|
34
|
+
|
|
17
35
|
# QMD for local markdown search
|
|
18
36
|
SQUISH_QMD_ENABLED=true
|
|
19
37
|
SQUISH_QMD_COLLECTIONS=./qmd-collections
|
|
@@ -28,3 +46,8 @@ SQUISH_QMD_FALLBACK=hybrid
|
|
|
28
46
|
SQUISH_LIFECYCLE_ENABLED=true
|
|
29
47
|
SQUISH_SUMMARIZATION_ENABLED=true
|
|
30
48
|
SQUISH_GOVERNANCE_ENABLED=true
|
|
49
|
+
|
|
50
|
+
# Core Memory Configuration (v0.9.2+)
|
|
51
|
+
# Increase limits for daily agent usage (default: 16KB total, 4KB per section)
|
|
52
|
+
# SQUISH_CORE_MEMORY_TOTAL_BYTES=16384
|
|
53
|
+
# SQUISH_CORE_MEMORY_SECTION_BYTES=4096
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,40 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to Squish will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.9.3] - 2026-03-14
|
|
6
|
+
|
|
7
|
+
### Added - Core Memory & Embeddings Improvements (v0.9.2+)
|
|
8
|
+
|
|
9
|
+
#### Expanded Core Memory
|
|
10
|
+
- Increased default core memory limit from 2KB to 16KB total (4KB per section)
|
|
11
|
+
- Configurable limits via `SQUISH_CORE_MEMORY_TOTAL_BYTES` and `SQUISH_CORE_MEMORY_SECTION_BYTES`
|
|
12
|
+
- Added token estimation for better LLM context budgeting
|
|
13
|
+
- Core memory stats now show both byte and token usage
|
|
14
|
+
|
|
15
|
+
#### Robust Embeddings System
|
|
16
|
+
- Fixed hybrid fallback order: Google Multimodal → OpenAI → Ollama → Local (removed QMD from embedding chain)
|
|
17
|
+
- Added retry logic with exponential backoff (3 retries default)
|
|
18
|
+
- Added configurable timeouts (default 30s) with per-provider overrides
|
|
19
|
+
- New `checkEmbeddingProviderHealth()` function for monitoring
|
|
20
|
+
- Improved error handling and graceful degradation
|
|
21
|
+
|
|
22
|
+
#### Enhanced Configuration
|
|
23
|
+
- New environment variables for fine-tuning:
|
|
24
|
+
- `SQUISH_EMBEDDINGS_TIMEOUT_MS`, `SQUISH_EMBEDDINGS_MAX_RETRIES`, `SQUISH_EMBEDDINGS_RETRY_DELAY_MS`
|
|
25
|
+
- `SQUISH_OPENAI_TIMEOUT_MS`, `SQUISH_OLLAMA_TIMEOUT_MS`, `SQUISH_GOOGLE_MULTIMODAL_TIMEOUT_MS`
|
|
26
|
+
- Better connection handling for all embedding providers
|
|
27
|
+
|
|
28
|
+
### Changed - Infrastructure
|
|
29
|
+
- Updated CI/CD workflows (`.github/workflows/ci.yml`, `release.yml`)
|
|
30
|
+
- Removed old `mcp-launch-checks.yml` workflow
|
|
31
|
+
- Updated release scripts (auto-detect version, better binary packaging)
|
|
32
|
+
- Database schema: added `tokens_estimate` column to `core_memory` table (auto-migrated)
|
|
33
|
+
|
|
34
|
+
### Security & developer experience
|
|
35
|
+
- Renamed `.env.mcp` to `.env.mcp.example` (template) - added to `.gitignore`
|
|
36
|
+
- Updated all documentation with new configuration options
|
|
37
|
+
- Improved TypeScript type safety across codebase
|
|
38
|
+
|
|
5
39
|
## [0.9.1] - 2026-03-14
|
|
6
40
|
|
|
7
41
|
### Fixed - CLI & Database
|
package/QUICK-START.md
CHANGED
|
@@ -27,7 +27,7 @@ curl http://localhost:8767/health
|
|
|
27
27
|
{
|
|
28
28
|
"status": "ok",
|
|
29
29
|
"server": "squish-mcp",
|
|
30
|
-
|
|
30
|
+
"version": "0.9.2",
|
|
31
31
|
"tools": 6
|
|
32
32
|
}
|
|
33
33
|
```
|
|
@@ -48,17 +48,23 @@ curl -X POST http://localhost:8767/tools/call \
|
|
|
48
48
|
|
|
49
49
|
## Configure
|
|
50
50
|
|
|
51
|
-
Copy `.env.mcp` to `.env` and customize:
|
|
51
|
+
Copy `.env.mcp.example` to `.env` and customize:
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
|
-
cp .env.mcp .env
|
|
54
|
+
cp .env.mcp.example .env
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
Key settings:
|
|
58
58
|
|
|
59
59
|
- **SQUISH_MCP_PORT**: Server port (default: 8767)
|
|
60
|
-
- **
|
|
60
|
+
- **SQUISH_MCP_SERVER_ENABLED**: Enable/disable MCP server (default: true)
|
|
61
|
+
- **SQUISH_EMBEDDINGS_PROVIDER**: local|openai|ollama|google-multimodal|hybrid (default: local)
|
|
62
|
+
- **SQUISH_MULTIMODAL_EMBEDDINGS_ENABLED**: Enable Google multimodal (default: false)
|
|
61
63
|
- **SQUISH_QMD_ENABLED**: Enable markdown search (true/false)
|
|
64
|
+
- **SQUISH_CORE_MEMORY_TOTAL_BYTES**: Total core memory limit in bytes (default: 16384)
|
|
65
|
+
- **SQUISH_CORE_MEMORY_SECTION_BYTES**: Per-section limit in bytes (default: 4096)
|
|
66
|
+
- **SQUISH_EMBEDDINGS_TIMEOUT_MS**: Timeout for embedding API calls (default: 30000)
|
|
67
|
+
- **SQUISH_EMBEDDINGS_MAX_RETRIES**: Max retries for failed embedding calls (default: 3)
|
|
62
68
|
|
|
63
69
|
## Full Docs
|
|
64
70
|
|
package/README.md
CHANGED
|
@@ -188,11 +188,24 @@ PORT=3000 # API server port
|
|
|
188
188
|
**Optional:**
|
|
189
189
|
```bash
|
|
190
190
|
SQUISH_DATA_DIR=./.squish # Custom data directory
|
|
191
|
-
SQUISH_EMBEDDINGS_PROVIDER=local # local, openai,
|
|
191
|
+
SQUISH_EMBEDDINGS_PROVIDER=local # local, openai, ollama, google-multimodal, hybrid
|
|
192
192
|
|
|
193
193
|
# For better embeddings (optional)
|
|
194
194
|
SQUISH_OPENAI_API_KEY=sk-...
|
|
195
|
+
SQUISH_OPENAI_EMBEDDING_MODEL=text-embedding-3-small
|
|
195
196
|
SQUISH_OLLAMA_URL=http://localhost:11434
|
|
197
|
+
SQUISH_OLLAMA_EMBEDDING_MODEL=nomic-embed-text:v1.5
|
|
198
|
+
SQUISH_GOOGLE_CLOUD_PROJECT=your-project
|
|
199
|
+
SQUISH_GOOGLE_CLOUD_API_KEY=your-key
|
|
200
|
+
|
|
201
|
+
# Embedding performance & reliability
|
|
202
|
+
SQUISH_EMBEDDINGS_TIMEOUT_MS=30000
|
|
203
|
+
SQUISH_EMBEDDINGS_MAX_RETRIES=3
|
|
204
|
+
SQUISH_EMBEDDINGS_RETRY_DELAY_MS=1000
|
|
205
|
+
|
|
206
|
+
# Core memory size (default: 16KB total, 4KB per section)
|
|
207
|
+
SQUISH_CORE_MEMORY_TOTAL_BYTES=16384
|
|
208
|
+
SQUISH_CORE_MEMORY_SECTION_BYTES=4096
|
|
196
209
|
|
|
197
210
|
# For team mode
|
|
198
211
|
DATABASE_URL=postgresql://user:pass@host/db
|
|
@@ -212,7 +225,7 @@ Squish employs a two-tier architecture for optimal performance and reliability:
|
|
|
212
225
|
- **CLI**: Standalone command-line tool for shell-based agents and debugging
|
|
213
226
|
|
|
214
227
|
### Memory Organization
|
|
215
|
-
- **Core Memory (
|
|
228
|
+
- **Core Memory (configurable, default 16KB total)**: Always-visible sections for persona, user info, project context, and working notes. Each section limited to 4KB by default. Token estimation helps track LLM context usage.
|
|
216
229
|
- **Context Paging**: Agent-controlled retrieval with token budgeting (8KB default)
|
|
217
230
|
- **Background Jobs**: Automatic memory maintenance including decay, deduplication, and consolidation
|
|
218
231
|
|
package/dist/config.d.ts
CHANGED
|
@@ -46,6 +46,14 @@ export declare const config: {
|
|
|
46
46
|
cronEnabled: boolean;
|
|
47
47
|
heartbeatInterval: number;
|
|
48
48
|
jobRetentionDays: number;
|
|
49
|
+
coreMemoryTotalBytes: number;
|
|
50
|
+
coreMemorySectionBytes: number;
|
|
51
|
+
embeddingsTimeoutMs: number;
|
|
52
|
+
embeddingsMaxRetries: number;
|
|
53
|
+
embeddingsRetryDelayMs: number;
|
|
54
|
+
openAiTimeoutMs: number;
|
|
55
|
+
ollamaTimeoutMs: number;
|
|
56
|
+
googleMultimodalTimeoutMs: number;
|
|
49
57
|
};
|
|
50
58
|
export default config;
|
|
51
59
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,IAAI,MAAM,CAMnC;AAkDD,eAAO,MAAM,MAAM;;;;;;;wBAYD,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,mBAAmB;;;;;;;;;;;;4BAkBf,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ;;;;;;qBAYrF,UAAU,GAAG,aAAa,GAAG,QAAQ,GAAG,YAAY;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,IAAI,MAAM,CAMnC;AAkDD,eAAO,MAAM,MAAM;;;;;;;wBAYD,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,mBAAmB;;;;;;;;;;;;4BAkBf,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ;;;;;;qBAYrF,UAAU,GAAG,aAAa,GAAG,QAAQ,GAAG,YAAY;;;;;;;;;;;;;;;;;;mBA8BvB,MAAM,GAAG,UAAU,GAAG,WAAW;;;;;;;;;;;;CAiBlG,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
package/dist/config.js
CHANGED
|
@@ -111,6 +111,17 @@ export const config = {
|
|
|
111
111
|
cronEnabled: process.env.SQUISH_CRON_ENABLED !== 'false',
|
|
112
112
|
heartbeatInterval: parseInt(process.env.SQUISH_HEARTBEAT_INTERVAL || '60000'),
|
|
113
113
|
jobRetentionDays: parseInt(process.env.SQUISH_JOB_RETENTION_DAYS || '30'),
|
|
114
|
+
// Core Memory Configuration (v0.9.2+)
|
|
115
|
+
coreMemoryTotalBytes: parseInt(process.env.SQUISH_CORE_MEMORY_TOTAL_BYTES || '16384'), // 16KB default
|
|
116
|
+
coreMemorySectionBytes: parseInt(process.env.SQUISH_CORE_MEMORY_SECTION_BYTES || '4096'), // 4KB default per section
|
|
117
|
+
// Embeddings Performance & Reliability
|
|
118
|
+
embeddingsTimeoutMs: parseInt(process.env.SQUISH_EMBEDDINGS_TIMEOUT_MS || '30000'), // 30s default
|
|
119
|
+
embeddingsMaxRetries: parseInt(process.env.SQUISH_EMBEDDINGS_MAX_RETRIES || '3'),
|
|
120
|
+
embeddingsRetryDelayMs: parseInt(process.env.SQUISH_EMBEDDINGS_RETRY_DELAY_MS || '1000'),
|
|
121
|
+
// Per-provider timeout overrides
|
|
122
|
+
openAiTimeoutMs: parseInt(process.env.SQUISH_OPENAI_TIMEOUT_MS || process.env.SQUISH_EMBEDDINGS_TIMEOUT_MS || '30000'),
|
|
123
|
+
ollamaTimeoutMs: parseInt(process.env.SQUISH_OLLAMA_TIMEOUT_MS || process.env.SQUISH_EMBEDDINGS_TIMEOUT_MS || '30000'),
|
|
124
|
+
googleMultimodalTimeoutMs: parseInt(process.env.SQUISH_GOOGLE_MULTIMODAL_TIMEOUT_MS || process.env.SQUISH_EMBEDDINGS_TIMEOUT_MS || '30000'),
|
|
114
125
|
};
|
|
115
126
|
export default config;
|
|
116
127
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,7 @@ export declare function editCoreMemorySection(projectId: string, section: CoreMe
|
|
|
30
30
|
success: boolean;
|
|
31
31
|
message?: string;
|
|
32
32
|
sizeBytes?: number;
|
|
33
|
+
tokensEstimate?: number;
|
|
33
34
|
}>;
|
|
34
35
|
/**
|
|
35
36
|
* Append content to a core memory section
|
|
@@ -52,11 +53,15 @@ export declare function replaceCoreMemoryText(projectId: string, section: CoreMe
|
|
|
52
53
|
*/
|
|
53
54
|
export declare function getCoreMemoryStats(projectId: string): Promise<{
|
|
54
55
|
totalBytes: number;
|
|
56
|
+
totalTokens: number;
|
|
55
57
|
maxBytes: number;
|
|
58
|
+
maxTokens: number;
|
|
56
59
|
usagePercent: number;
|
|
60
|
+
tokenUsagePercent: number;
|
|
57
61
|
sections: Array<{
|
|
58
62
|
section: string;
|
|
59
63
|
sizeBytes: number;
|
|
64
|
+
tokensEstimate: number;
|
|
60
65
|
version: number;
|
|
61
66
|
updatedAt: Date;
|
|
62
67
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core-memory.d.ts","sourceRoot":"","sources":["../../core/core-memory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"core-memory.d.ts","sourceRoot":"","sources":["../../core/core-memory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,KAAK,iBAAiB,GAAG,SAAS,GAAG,WAAW,GAAG,iBAAiB,GAAG,eAAe,CAAC;AAMvF,UAAU,iBAAiB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B5F;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAuBjF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA0C9F;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAKrE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAYrE;AA+BD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,KAAK,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,IAAI,CAAC;KACjB,CAAC,CAAC;CACJ,CAAC,CA+BD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmCrF"}
|
package/dist/core/core-memory.js
CHANGED
|
@@ -8,8 +8,10 @@ import { eq, and, sql } from 'drizzle-orm';
|
|
|
8
8
|
import { getDb } from '../db/index.js';
|
|
9
9
|
import { getSchema } from '../db/schema.js';
|
|
10
10
|
import { createDatabaseClient } from './database.js';
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
import config from '../config.js';
|
|
12
|
+
// Use configurable limits from environment
|
|
13
|
+
const MAX_TOTAL_SIZE_BYTES = config.coreMemoryTotalBytes;
|
|
14
|
+
const MAX_SECTION_SIZE_BYTES = config.coreMemorySectionBytes;
|
|
13
15
|
/**
|
|
14
16
|
* Initialize core memory for a project
|
|
15
17
|
*/
|
|
@@ -78,6 +80,7 @@ export async function getCoreMemorySection(projectId, section) {
|
|
|
78
80
|
*/
|
|
79
81
|
export async function editCoreMemorySection(projectId, section, content) {
|
|
80
82
|
const sizeBytes = Buffer.byteLength(content, 'utf8');
|
|
83
|
+
const tokensEstimate = estimateTokens(content);
|
|
81
84
|
// Check section size limit
|
|
82
85
|
if (sizeBytes > MAX_SECTION_SIZE_BYTES) {
|
|
83
86
|
return {
|
|
@@ -101,11 +104,12 @@ export async function editCoreMemorySection(projectId, section, content) {
|
|
|
101
104
|
.set({
|
|
102
105
|
content,
|
|
103
106
|
sizeBytes,
|
|
107
|
+
tokensEstimate,
|
|
104
108
|
version: sql `${coreMemory.version} + 1`,
|
|
105
109
|
updatedAt: new Date(),
|
|
106
110
|
})
|
|
107
111
|
.where(and(eq(coreMemory.projectId, projectId), eq(coreMemory.section, section)));
|
|
108
|
-
return { success: true, sizeBytes };
|
|
112
|
+
return { success: true, sizeBytes, tokensEstimate };
|
|
109
113
|
}
|
|
110
114
|
/**
|
|
111
115
|
* Append content to a core memory section
|
|
@@ -163,13 +167,20 @@ export async function getCoreMemoryStats(projectId) {
|
|
|
163
167
|
.from(coreMemory)
|
|
164
168
|
.where(eq(coreMemory.projectId, projectId));
|
|
165
169
|
const totalBytes = sections.reduce((sum, s) => sum + (s.sizeBytes || 0), 0);
|
|
170
|
+
const totalTokens = sections.reduce((sum, s) => sum + (s.tokensEstimate || 0), 0);
|
|
171
|
+
// Estimate max tokens from max bytes (rough approximation: 1 token ≈ 4 chars)
|
|
172
|
+
const maxTokens = Math.floor(MAX_TOTAL_SIZE_BYTES / 4);
|
|
166
173
|
return {
|
|
167
174
|
totalBytes,
|
|
175
|
+
totalTokens,
|
|
168
176
|
maxBytes: MAX_TOTAL_SIZE_BYTES,
|
|
177
|
+
maxTokens,
|
|
169
178
|
usagePercent: (totalBytes / MAX_TOTAL_SIZE_BYTES) * 100,
|
|
179
|
+
tokenUsagePercent: (totalTokens / maxTokens) * 100,
|
|
170
180
|
sections: sections.map((s) => ({
|
|
171
181
|
section: s.section,
|
|
172
182
|
sizeBytes: s.sizeBytes || 0,
|
|
183
|
+
tokensEstimate: s.tokensEstimate || 0,
|
|
173
184
|
version: s.version || 1,
|
|
174
185
|
updatedAt: s.updatedAt,
|
|
175
186
|
})),
|
|
@@ -201,8 +212,9 @@ export async function formatCoreMemoryForInjection(projectId) {
|
|
|
201
212
|
formatted += `## Working Notes\n${content.working_notes}\n\n`;
|
|
202
213
|
}
|
|
203
214
|
formatted += `---\n`;
|
|
204
|
-
formatted += `Core Memory Usage
|
|
205
|
-
formatted +=
|
|
215
|
+
formatted += `Core Memory Usage:\n`;
|
|
216
|
+
formatted += `- Bytes: ${stats.totalBytes}/${stats.maxBytes} (${stats.usagePercent.toFixed(1)}%)\n`;
|
|
217
|
+
formatted += `- Tokens: ~${stats.totalTokens}/${stats.maxTokens} (${stats.tokenUsagePercent.toFixed(1)}%)\n\n`;
|
|
206
218
|
// Add tool usage hints for agent-driven retrieval
|
|
207
219
|
formatted += `### Memory Tools Available\n`;
|
|
208
220
|
formatted += `When you need to recall information or store something important, use these tools:\n`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core-memory.js","sourceRoot":"","sources":["../../core/core-memory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,SAAS,EAAqB,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"core-memory.js","sourceRoot":"","sources":["../../core/core-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,4 +17,13 @@ export declare function getEmbeddingCacheStats(): {
|
|
|
17
17
|
size: number;
|
|
18
18
|
maxSize: number;
|
|
19
19
|
};
|
|
20
|
+
/**
|
|
21
|
+
* Check health of all configured embedding providers
|
|
22
|
+
* Returns availability and latency for each provider
|
|
23
|
+
*/
|
|
24
|
+
export declare function checkEmbeddingProviderHealth(): Promise<Map<string, {
|
|
25
|
+
available: boolean;
|
|
26
|
+
latencyMs?: number;
|
|
27
|
+
error?: string;
|
|
28
|
+
}>>;
|
|
20
29
|
//# sourceMappingURL=embeddings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../core/embeddings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmD,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAGrH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../core/embeddings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmD,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAGrH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,mBAAmB,CAAC;AAiHzH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAqF5F;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,GAAE,MAAW,GACrB,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAuCjC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAK1E;AA4KD;;;GAGG;AACH,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAqFrI"}
|
package/dist/core/embeddings.js
CHANGED
|
@@ -2,6 +2,66 @@ import { config } from '../config.js';
|
|
|
2
2
|
import { getQMDClient } from './embeddings/qmd-client.js';
|
|
3
3
|
import { getGoogleMultimodalEmbedding, isMultimodalInput } from './embeddings/google-multimodal.js';
|
|
4
4
|
import { logger } from './logger.js';
|
|
5
|
+
// Retry utility with exponential backoff
|
|
6
|
+
async function withRetry(fn, maxRetries = config.embeddingsMaxRetries, baseDelayMs = config.embeddingsRetryDelayMs) {
|
|
7
|
+
let lastError;
|
|
8
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
9
|
+
try {
|
|
10
|
+
return await fn();
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
lastError = error;
|
|
14
|
+
// Only retry on network errors (5xx, ECONNRESET, ETIMEDOUT, etc.)
|
|
15
|
+
if (error instanceof Error && shouldRetryError(error)) {
|
|
16
|
+
const delay = baseDelayMs * Math.pow(2, attempt) + Math.random() * baseDelayMs;
|
|
17
|
+
logger.debug(`Embedding request failed (attempt ${attempt + 1}/${maxRetries}), retrying in ${delay.toFixed(0)}ms`, { error: error });
|
|
18
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
// Don't retry on 4xx errors or non-retryable errors
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
throw lastError;
|
|
26
|
+
}
|
|
27
|
+
function shouldRetryError(error) {
|
|
28
|
+
const message = error.message.toLowerCase();
|
|
29
|
+
// Network errors that are typically transient
|
|
30
|
+
const retryablePatterns = [
|
|
31
|
+
'econnreset',
|
|
32
|
+
'etimedout',
|
|
33
|
+
'econnrefused',
|
|
34
|
+
'esocket',
|
|
35
|
+
'network error',
|
|
36
|
+
'fetch failed',
|
|
37
|
+
'timeout',
|
|
38
|
+
'request timed out',
|
|
39
|
+
'service unavailable',
|
|
40
|
+
'too many requests',
|
|
41
|
+
'rate limit',
|
|
42
|
+
'internal server error',
|
|
43
|
+
'bad gateway',
|
|
44
|
+
'gateway timeout',
|
|
45
|
+
];
|
|
46
|
+
return retryablePatterns.some(pattern => message.includes(pattern));
|
|
47
|
+
}
|
|
48
|
+
// Timeout wrapper using AbortController
|
|
49
|
+
async function withTimeout(promise, timeoutMs) {
|
|
50
|
+
const controller = new AbortController();
|
|
51
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
52
|
+
try {
|
|
53
|
+
return await promise;
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
clearTimeout(timeoutId);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Fetch wrapper that combines retry and timeout
|
|
60
|
+
async function fetchWithRetryAndTimeout(url, options, timeoutMs = config.embeddingsTimeoutMs) {
|
|
61
|
+
return withRetry(async () => {
|
|
62
|
+
return withTimeout(fetch(url, options), timeoutMs);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
5
65
|
// Simple in-memory cache for embeddings (LRU with 1000 entries)
|
|
6
66
|
const embeddingCache = new Map();
|
|
7
67
|
const MAX_CACHE_SIZE = 1000;
|
|
@@ -68,20 +128,19 @@ export async function getEmbedding(input) {
|
|
|
68
128
|
}
|
|
69
129
|
}
|
|
70
130
|
else if (provider === 'hybrid') {
|
|
71
|
-
// Hybrid mode: Try
|
|
131
|
+
// Hybrid mode: Try cloud providers first (best quality), then local fallback
|
|
132
|
+
// Order: Google Multimodal → OpenAI → Ollama → Local TF-IDF
|
|
133
|
+
// Note: QMD is not used for embedding generation (search only)
|
|
72
134
|
if (config.multimodalEmbeddingsEnabled) {
|
|
73
135
|
const multimodalResult = await getGoogleMultimodalEmbedding({ text: textInput });
|
|
74
136
|
result = multimodalResult?.embedding || null;
|
|
75
137
|
}
|
|
76
|
-
if (!result && config.
|
|
77
|
-
result = await
|
|
138
|
+
if (!result && config.openAiApiKey) {
|
|
139
|
+
result = await getOpenAiEmbedding(textInput);
|
|
78
140
|
}
|
|
79
|
-
if (!result && config.
|
|
141
|
+
if (!result && config.ollamaUrl) {
|
|
80
142
|
result = await getOllamaEmbedding(textInput);
|
|
81
143
|
}
|
|
82
|
-
if (!result && config.qmdFallbackMode !== 'qmd-only' && config.qmdFallbackMode !== 'local-only') {
|
|
83
|
-
result = await getOpenAiEmbedding(textInput);
|
|
84
|
-
}
|
|
85
144
|
if (!result) {
|
|
86
145
|
result = getLocalEmbedding(textInput);
|
|
87
146
|
}
|
|
@@ -253,7 +312,7 @@ async function getQMDEmbedding(input) {
|
|
|
253
312
|
return null;
|
|
254
313
|
}
|
|
255
314
|
catch (error) {
|
|
256
|
-
logger.debug(
|
|
315
|
+
logger.debug('QMD embedding unavailable (expected if QMD server not running)');
|
|
257
316
|
return null;
|
|
258
317
|
}
|
|
259
318
|
}
|
|
@@ -271,7 +330,7 @@ async function getOpenAiEmbedding(input) {
|
|
|
271
330
|
if (!config.openAiApiKey)
|
|
272
331
|
return null;
|
|
273
332
|
try {
|
|
274
|
-
const response = await
|
|
333
|
+
const response = await fetchWithRetryAndTimeout(config.openAiApiUrl, {
|
|
275
334
|
method: 'POST',
|
|
276
335
|
headers: {
|
|
277
336
|
'Content-Type': 'application/json',
|
|
@@ -281,10 +340,10 @@ async function getOpenAiEmbedding(input) {
|
|
|
281
340
|
model: config.openAiEmbeddingModel,
|
|
282
341
|
input,
|
|
283
342
|
}),
|
|
284
|
-
});
|
|
343
|
+
}, config.openAiTimeoutMs);
|
|
285
344
|
if (!response.ok) {
|
|
286
345
|
const message = await response.text();
|
|
287
|
-
|
|
346
|
+
logger.warn(`OpenAI embeddings failed: ${response.status} ${message}`);
|
|
288
347
|
return null; // Return null to allow fallback
|
|
289
348
|
}
|
|
290
349
|
const payload = await response.json();
|
|
@@ -292,31 +351,109 @@ async function getOpenAiEmbedding(input) {
|
|
|
292
351
|
return embedding ?? null;
|
|
293
352
|
}
|
|
294
353
|
catch (error) {
|
|
295
|
-
|
|
354
|
+
logger.warn('OpenAI embeddings error:', { error: error });
|
|
296
355
|
return null; // Return null to allow fallback
|
|
297
356
|
}
|
|
298
357
|
}
|
|
299
358
|
async function getOllamaEmbedding(input) {
|
|
300
359
|
try {
|
|
301
|
-
const response = await
|
|
360
|
+
const response = await fetchWithRetryAndTimeout(`${config.ollamaUrl}/api/embeddings`, {
|
|
302
361
|
method: 'POST',
|
|
303
362
|
headers: { 'Content-Type': 'application/json' },
|
|
304
363
|
body: JSON.stringify({
|
|
305
364
|
model: config.ollamaEmbeddingModel,
|
|
306
365
|
prompt: input,
|
|
307
366
|
}),
|
|
308
|
-
});
|
|
367
|
+
}, config.ollamaTimeoutMs);
|
|
309
368
|
if (!response.ok) {
|
|
310
369
|
const message = await response.text();
|
|
311
|
-
|
|
370
|
+
logger.warn(`Ollama embeddings failed: ${response.status} ${message}`);
|
|
312
371
|
return null; // Return null to allow fallback
|
|
313
372
|
}
|
|
314
373
|
const payload = await response.json();
|
|
315
374
|
return payload.embedding ?? null;
|
|
316
375
|
}
|
|
317
376
|
catch (error) {
|
|
318
|
-
|
|
377
|
+
logger.warn('Ollama embeddings error:', { error: error });
|
|
319
378
|
return null; // Return null to allow fallback
|
|
320
379
|
}
|
|
321
380
|
}
|
|
381
|
+
/**
|
|
382
|
+
* Check health of all configured embedding providers
|
|
383
|
+
* Returns availability and latency for each provider
|
|
384
|
+
*/
|
|
385
|
+
export async function checkEmbeddingProviderHealth() {
|
|
386
|
+
const results = new Map();
|
|
387
|
+
const providers = ['local', 'openai', 'ollama', 'google-multimodal', 'qmd'];
|
|
388
|
+
// Test local provider (always available)
|
|
389
|
+
results.set('local', { available: true, latencyMs: 0 });
|
|
390
|
+
// Test OpenAI if configured
|
|
391
|
+
if (config.openAiApiKey) {
|
|
392
|
+
const start = Date.now();
|
|
393
|
+
try {
|
|
394
|
+
const testInput = 'health check';
|
|
395
|
+
const embedding = await withRetry(() => withTimeout(getOpenAiEmbedding(testInput), config.openAiTimeoutMs), config.embeddingsMaxRetries, config.embeddingsRetryDelayMs);
|
|
396
|
+
const latency = Date.now() - start;
|
|
397
|
+
results.set('openai', {
|
|
398
|
+
available: embedding !== null && embedding.length > 0,
|
|
399
|
+
latencyMs: latency
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
catch (error) {
|
|
403
|
+
results.set('openai', {
|
|
404
|
+
available: false,
|
|
405
|
+
error: error.message
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
results.set('openai', { available: false, error: 'Not configured' });
|
|
411
|
+
}
|
|
412
|
+
// Test Ollama if configured
|
|
413
|
+
if (config.ollamaUrl) {
|
|
414
|
+
const start = Date.now();
|
|
415
|
+
try {
|
|
416
|
+
const testInput = 'health check';
|
|
417
|
+
const embedding = await withRetry(() => withTimeout(getOllamaEmbedding(testInput), config.ollamaTimeoutMs), config.embeddingsMaxRetries, config.embeddingsRetryDelayMs);
|
|
418
|
+
const latency = Date.now() - start;
|
|
419
|
+
results.set('ollama', {
|
|
420
|
+
available: embedding !== null && embedding.length > 0,
|
|
421
|
+
latencyMs: latency
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
catch (error) {
|
|
425
|
+
results.set('ollama', {
|
|
426
|
+
available: false,
|
|
427
|
+
error: error.message
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
results.set('ollama', { available: false, error: 'Not configured' });
|
|
433
|
+
}
|
|
434
|
+
// Test Google Multimodal if configured
|
|
435
|
+
if (config.multimodalEmbeddingsEnabled && (config.googleCloudApiKey || config.googleCloudProject)) {
|
|
436
|
+
const start = Date.now();
|
|
437
|
+
try {
|
|
438
|
+
const result = await withRetry(() => withTimeout(getGoogleMultimodalEmbedding({ text: 'health check' }), config.googleMultimodalTimeoutMs), config.embeddingsMaxRetries, config.embeddingsRetryDelayMs);
|
|
439
|
+
const latency = Date.now() - start;
|
|
440
|
+
results.set('google-multimodal', {
|
|
441
|
+
available: result !== null && result.embedding.length > 0,
|
|
442
|
+
latencyMs: latency
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
catch (error) {
|
|
446
|
+
results.set('google-multimodal', {
|
|
447
|
+
available: false,
|
|
448
|
+
error: error.message
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
results.set('google-multimodal', { available: false, error: 'Not configured' });
|
|
454
|
+
}
|
|
455
|
+
// QMD is not used for embedding generation (search only)
|
|
456
|
+
results.set('qmd', { available: false, error: 'QMD not used for embeddings (search only)' });
|
|
457
|
+
return results;
|
|
458
|
+
}
|
|
322
459
|
//# sourceMappingURL=embeddings.js.map
|