wispy-ai 1.6.0 → 1.7.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/.env.example +19 -1
- package/CHANGELOG.md +19 -0
- package/README.md +32 -13
- package/dist/agents/tool-executor.d.ts +5 -0
- package/dist/agents/tool-executor.d.ts.map +1 -1
- package/dist/agents/tool-executor.js +97 -0
- package/dist/agents/tool-executor.js.map +1 -1
- package/dist/ai/claude.d.ts +28 -0
- package/dist/ai/claude.d.ts.map +1 -0
- package/dist/ai/claude.js +328 -0
- package/dist/ai/claude.js.map +1 -0
- package/dist/ai/engine.d.ts +52 -0
- package/dist/ai/engine.d.ts.map +1 -0
- package/dist/ai/engine.js +85 -0
- package/dist/ai/engine.js.map +1 -0
- package/dist/ai/prompts.d.ts +5 -0
- package/dist/ai/prompts.d.ts.map +1 -1
- package/dist/ai/prompts.js +28 -0
- package/dist/ai/prompts.js.map +1 -1
- package/dist/ai/router.d.ts.map +1 -1
- package/dist/ai/router.js +34 -0
- package/dist/ai/router.js.map +1 -1
- package/dist/ai/tools.d.ts.map +1 -1
- package/dist/ai/tools.js +55 -0
- package/dist/ai/tools.js.map +1 -1
- package/dist/channels/email/adapter.d.ts +17 -0
- package/dist/channels/email/adapter.d.ts.map +1 -0
- package/dist/channels/email/adapter.js +133 -0
- package/dist/channels/email/adapter.js.map +1 -0
- package/dist/channels/phone/adapter.d.ts +36 -0
- package/dist/channels/phone/adapter.d.ts.map +1 -0
- package/dist/channels/phone/adapter.js +406 -0
- package/dist/channels/phone/adapter.js.map +1 -0
- package/dist/channels/telegram/adapter.d.ts.map +1 -1
- package/dist/channels/telegram/adapter.js +35 -3
- package/dist/channels/telegram/adapter.js.map +1 -1
- package/dist/channels/whatsapp/adapter.d.ts +5 -0
- package/dist/channels/whatsapp/adapter.d.ts.map +1 -1
- package/dist/channels/whatsapp/adapter.js +167 -11
- package/dist/channels/whatsapp/adapter.js.map +1 -1
- package/dist/cli/integration-wizard.d.ts.map +1 -1
- package/dist/cli/integration-wizard.js +56 -0
- package/dist/cli/integration-wizard.js.map +1 -1
- package/dist/cli/program.js +24 -6
- package/dist/cli/program.js.map +1 -1
- package/dist/cli/repl.d.ts.map +1 -1
- package/dist/cli/repl.js +20 -0
- package/dist/cli/repl.js.map +1 -1
- package/dist/cli/ui/banner.d.ts +1 -1
- package/dist/cli/ui/banner.js +1 -1
- package/dist/cli/voice/tts.d.ts +10 -1
- package/dist/cli/voice/tts.d.ts.map +1 -1
- package/dist/cli/voice/tts.js +91 -1
- package/dist/cli/voice/tts.js.map +1 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +17 -0
- package/dist/config/config.js.map +1 -1
- package/dist/config/schema.d.ts +20 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +41 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +10 -2
- package/dist/core/agent.js.map +1 -1
- package/dist/core/heartbeat.d.ts.map +1 -1
- package/dist/core/heartbeat.js +12 -2
- package/dist/core/heartbeat.js.map +1 -1
- package/dist/gateway/server.d.ts.map +1 -1
- package/dist/gateway/server.js +24 -0
- package/dist/gateway/server.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/ai-models/elevenlabs.d.ts +25 -0
- package/dist/integrations/ai-models/elevenlabs.d.ts.map +1 -0
- package/dist/integrations/ai-models/elevenlabs.js +262 -0
- package/dist/integrations/ai-models/elevenlabs.js.map +1 -0
- package/dist/integrations/loader.d.ts.map +1 -1
- package/dist/integrations/loader.js +33 -0
- package/dist/integrations/loader.js.map +1 -1
- package/dist/integrations/social/agentmail.d.ts +27 -0
- package/dist/integrations/social/agentmail.d.ts.map +1 -0
- package/dist/integrations/social/agentmail.js +230 -0
- package/dist/integrations/social/agentmail.js.map +1 -0
- package/dist/integrations/social/telnyx.d.ts +27 -0
- package/dist/integrations/social/telnyx.d.ts.map +1 -0
- package/dist/integrations/social/telnyx.js +268 -0
- package/dist/integrations/social/telnyx.js.map +1 -0
- package/dist/memory/memory-bank.d.ts +70 -0
- package/dist/memory/memory-bank.d.ts.map +1 -0
- package/dist/memory/memory-bank.js +246 -0
- package/dist/memory/memory-bank.js.map +1 -0
- package/dist/memory/vector-store.d.ts +47 -0
- package/dist/memory/vector-store.d.ts.map +1 -1
- package/dist/memory/vector-store.js +122 -0
- package/dist/memory/vector-store.js.map +1 -1
- package/package.json +6 -2
- package/wispy/skills/memory-bank/SKILL.md +104 -0
package/.env.example
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Engine selection: "gemini" (default) or "claude"
|
|
2
|
+
ENGINE=gemini
|
|
3
|
+
|
|
4
|
+
# Gemini API Key (required for Gemini engine, and always needed for embeddings)
|
|
2
5
|
GEMINI_API_KEY=your_gemini_api_key_here
|
|
3
6
|
|
|
7
|
+
# Claude / Anthropic (required when ENGINE=claude)
|
|
8
|
+
# ANTHROPIC_API_KEY=sk-ant-...
|
|
9
|
+
# CLAUDE_MODEL=claude-sonnet-4-20250514
|
|
10
|
+
|
|
4
11
|
# Telegram Bot Token (optional)
|
|
5
12
|
TELEGRAM_BOT_TOKEN=
|
|
6
13
|
|
|
@@ -42,6 +49,17 @@ TWITTER_API_SECRET=
|
|
|
42
49
|
TWITTER_ACCESS_TOKEN=
|
|
43
50
|
TWITTER_ACCESS_SECRET=
|
|
44
51
|
|
|
52
|
+
# ElevenLabs (optional, premium voice AI for natural TTS)
|
|
53
|
+
# ELEVENLABS_API_KEY=
|
|
54
|
+
|
|
55
|
+
# Agentmail (optional, AI-native email for agents)
|
|
56
|
+
# AGENTMAIL_API_KEY=
|
|
57
|
+
|
|
58
|
+
# Telnyx (optional, telephony -- voice calls & SMS)
|
|
59
|
+
# TELNYX_API_KEY=
|
|
60
|
+
# TELNYX_CONNECTION_ID=
|
|
61
|
+
# TELNYX_FROM_NUMBER=
|
|
62
|
+
|
|
45
63
|
# Dashboard
|
|
46
64
|
DASHBOARD_PORT=3000
|
|
47
65
|
GATEWAY_PORT=4000
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.7.0] - 2026-02-23
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- **Claude Engine** as switchable alternative to Gemini via `@anthropic-ai/sdk`
|
|
7
|
+
- **Engine Abstraction Layer** (`src/ai/engine.ts`) for seamless switching between Gemini and Claude
|
|
8
|
+
- **Memory Bank** skill with 4 typed categories: episodic, semantic, procedural, preference
|
|
9
|
+
- Memory lifecycle management: decay (time-based), reinforcement (access-based), reflection (AI consolidation)
|
|
10
|
+
- 5 new Memory Bank tools: `memory_store_typed`, `memory_reflect`, `memory_forget`, `memory_list_categories`, `memory_get_context`
|
|
11
|
+
- Context-aware memory injection into system prompts
|
|
12
|
+
- Claude extended thinking support with budget token mapping
|
|
13
|
+
- Claude tool_use format conversion from Gemini function declarations
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- Project structure cleaned up: tests moved to `tests/integration/`, scripts to `scripts/`, docs to `docs/submissions/`
|
|
17
|
+
- Removed unused stubs (`database/`, `backend/`)
|
|
18
|
+
- Heartbeat now runs Memory Bank decay cycle
|
|
19
|
+
- Router supports Claude model selection (Sonnet for reasoning, Haiku for fast)
|
|
20
|
+
- Engine configurable via `ENGINE=gemini|claude` env var
|
|
21
|
+
|
|
3
22
|
## [1.6.0] - 2026-02-20
|
|
4
23
|
|
|
5
24
|
### Added
|
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
8
|
<strong>Autonomous AI Agent Platform</strong><br />
|
|
9
|
-
<em>
|
|
9
|
+
<em>125+ tools, 42+ integrations, dual-engine (Gemini + Claude), Memory Bank, sessions, skills.sh, x402 commerce</em>
|
|
10
10
|
</p>
|
|
11
11
|
|
|
12
12
|
<p align="center">
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
|
|
28
28
|
## What is Wispy?
|
|
29
29
|
|
|
30
|
-
Wispy is an autonomous AI agent that lives in your terminal, messaging apps, and APIs.
|
|
30
|
+
Wispy is an autonomous AI agent that lives in your terminal, messaging apps, and APIs. Dual-engine architecture powered by Google Gemini 2.5 Pro and Anthropic Claude, with cross-model delegation to GPT-4o, Llama, and 200+ models via OpenRouter. Features a structured Memory Bank with typed categories, lifecycle management, and AI-powered reflection.
|
|
31
31
|
|
|
32
32
|
```bash
|
|
33
33
|
npm install -g wispy-ai
|
|
@@ -41,17 +41,21 @@ wispy chat
|
|
|
41
41
|
|
|
42
42
|
### Core
|
|
43
43
|
|
|
44
|
-
- **
|
|
44
|
+
- **125+ Built-in Tools** across file system, web, browser automation, code execution, memory, media, blockchain, and identity
|
|
45
|
+
- **Dual Engine** -- switch between Gemini and Claude with a single env var (`ENGINE=gemini|claude`)
|
|
46
|
+
- **Memory Bank** with 4 typed categories (episodic, semantic, procedural, preference), time-based decay, reinforcement, and AI-powered reflection
|
|
45
47
|
- **Marathon Mode** for multi-step, long-running autonomous tasks with checkpointing and auto-recovery
|
|
46
|
-
- **Thinking Levels** (low/medium/high/ultra) with up to 24K thinking tokens
|
|
48
|
+
- **Thinking Levels** (low/medium/high/ultra) with up to 24K thinking tokens (Gemini) or 32K budget tokens (Claude)
|
|
47
49
|
- **Named Sessions** with isolated context, daily auto-reset, and instant switching
|
|
48
50
|
- **Process Manager** to spawn, monitor, and manage background processes
|
|
49
51
|
- **Skills.sh Registry** with 67,000+ community skills you can install with a single command
|
|
50
52
|
|
|
51
|
-
### Multi-Model
|
|
53
|
+
### Multi-Model / Dual Engine
|
|
52
54
|
|
|
53
|
-
- **Gemini 2.5 Pro**
|
|
54
|
-
- **
|
|
55
|
+
- **Gemini 2.5 Pro** -- primary reasoning engine with native function calling and extended thinking
|
|
56
|
+
- **Claude (Opus/Sonnet/Haiku)** -- switchable alternative engine via `@anthropic-ai/sdk` with tool_use and extended thinking
|
|
57
|
+
- **Engine abstraction layer** -- seamless switching, embeddings always via Gemini
|
|
58
|
+
- **Cross-model delegation** to GPT-4o, Groq, Kimi, Llama via Ollama, and 200+ models via OpenRouter
|
|
55
59
|
- **Model comparison** to send the same prompt to multiple models and compare responses
|
|
56
60
|
- **Setup wizard** configures all providers in one flow
|
|
57
61
|
|
|
@@ -145,11 +149,18 @@ Wispy uses `~/.wispy/config.yaml` for configuration and `.env` for secrets:
|
|
|
145
149
|
|
|
146
150
|
```yaml
|
|
147
151
|
# config.yaml
|
|
152
|
+
engine: gemini # or "claude"
|
|
153
|
+
|
|
148
154
|
gemini:
|
|
149
155
|
models:
|
|
150
156
|
pro: gemini-2.5-pro-preview-05-06
|
|
151
157
|
flash: gemini-2.5-flash-preview-05-20
|
|
152
158
|
|
|
159
|
+
claude:
|
|
160
|
+
models:
|
|
161
|
+
reasoning: claude-sonnet-4-20250514
|
|
162
|
+
fast: claude-haiku-4-5-20251001
|
|
163
|
+
|
|
153
164
|
channels:
|
|
154
165
|
telegram: { enabled: true }
|
|
155
166
|
discord: { enabled: false }
|
|
@@ -172,10 +183,12 @@ theme: day
|
|
|
172
183
|
|
|
173
184
|
```bash
|
|
174
185
|
# .env
|
|
186
|
+
ENGINE=gemini # Switch engine: gemini or claude
|
|
175
187
|
GEMINI_API_KEY=AIza...
|
|
188
|
+
ANTHROPIC_API_KEY=sk-ant-...
|
|
189
|
+
CLAUDE_MODEL=claude-sonnet-4-20250514 # Optional override
|
|
176
190
|
TELEGRAM_BOT_TOKEN=123456:ABC...
|
|
177
191
|
AGENT_PRIVATE_KEY=0x...
|
|
178
|
-
ANTHROPIC_API_KEY=sk-ant-...
|
|
179
192
|
OPENAI_API_KEY=sk-...
|
|
180
193
|
```
|
|
181
194
|
|
|
@@ -184,15 +197,21 @@ OPENAI_API_KEY=sk-...
|
|
|
184
197
|
## Architecture
|
|
185
198
|
|
|
186
199
|
```
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
200
|
+
┌──────────────────┐ ┌──────────────────┐
|
|
201
|
+
│ Gemini 2.5 Pro │ ◄─► │ Claude (Anthropic│
|
|
202
|
+
│ (default) │ │ (switchable) │
|
|
203
|
+
└────────┬─────────┘ └────────┬─────────┘
|
|
204
|
+
└──────────┬─────────────┘
|
|
205
|
+
┌──────────▼──────────┐
|
|
206
|
+
│ Engine Abstraction │
|
|
207
|
+
│ + Memory Bank │
|
|
208
|
+
│ + Cross-Model Bridge│
|
|
209
|
+
└──────────┬──────────┘
|
|
191
210
|
│
|
|
192
211
|
┌───────────────────┼───────────────────┐
|
|
193
212
|
│ │ │
|
|
194
213
|
┌────────▼──────┐ ┌───────▼───────┐ ┌─────────▼────────┐
|
|
195
|
-
│
|
|
214
|
+
│ 125+ Tools │ │ 42+ Integs │ │ x402 Commerce │
|
|
196
215
|
│ Sessions │ │ Skills.sh │ │ Payment Bridge │
|
|
197
216
|
│ Processes │ │ Browser (39) │ │ Budget Policy │
|
|
198
217
|
└────────┬──────┘ └───────┬───────┘ └─────────┬────────┘
|
|
@@ -63,6 +63,11 @@ export declare class ToolExecutor {
|
|
|
63
63
|
private executeFileSearch;
|
|
64
64
|
private executeMemorySearch;
|
|
65
65
|
private executeMemorySave;
|
|
66
|
+
private executeMemoryStoreTyped;
|
|
67
|
+
private executeMemoryReflect;
|
|
68
|
+
private executeMemoryForget;
|
|
69
|
+
private executeMemoryListCategories;
|
|
70
|
+
private executeMemoryGetContext;
|
|
66
71
|
private executeWebFetch;
|
|
67
72
|
private executeWebSearch;
|
|
68
73
|
private executeImageGenerate;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-executor.d.ts","sourceRoot":"","sources":["../../src/agents/tool-executor.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAK5D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA2CD,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE;IACrC,IAAI,EAAE,YAAY,GAAG,eAAe,GAAG,UAAU,GAAG,iBAAiB,CAAC;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3B,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,mBAAmB,CAAC,CAAsB;IAClD,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAC5C,OAAO,CAAC,UAAU,CAAC,CAAsD;gBAGvE,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,aAAa,EAC7B,mBAAmB,CAAC,EAAE,mBAAmB,EACzC,WAAW,CAAC,EAAE,WAAW;IAU3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIrD;;OAEG;YACW,YAAY;IAU1B;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAI9C;;OAEG;IACH,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAIpD,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-executor.d.ts","sourceRoot":"","sources":["../../src/agents/tool-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -137,6 +137,16 @@ export class ToolExecutor {
|
|
|
137
137
|
return this.executeMemorySearch(tool.args);
|
|
138
138
|
case "memory_save":
|
|
139
139
|
return this.executeMemorySave(tool.args);
|
|
140
|
+
case "memory_store_typed":
|
|
141
|
+
return this.executeMemoryStoreTyped(tool.args);
|
|
142
|
+
case "memory_reflect":
|
|
143
|
+
return this.executeMemoryReflect();
|
|
144
|
+
case "memory_forget":
|
|
145
|
+
return this.executeMemoryForget(tool.args);
|
|
146
|
+
case "memory_list_categories":
|
|
147
|
+
return this.executeMemoryListCategories();
|
|
148
|
+
case "memory_get_context":
|
|
149
|
+
return this.executeMemoryGetContext(tool.args);
|
|
140
150
|
case "web_fetch":
|
|
141
151
|
return this.executeWebFetch(tool.args);
|
|
142
152
|
case "web_search":
|
|
@@ -608,6 +618,93 @@ export class ToolExecutor {
|
|
|
608
618
|
appendDailyNote(this.soulDir, `Saved memory: ${fact.slice(0, 80)}`);
|
|
609
619
|
return { success: true, output: `Saved to memory [${category}]: ${fact}` };
|
|
610
620
|
}
|
|
621
|
+
// ── Memory Bank Handlers ──────────────────────────────────────────────
|
|
622
|
+
async executeMemoryStoreTyped(args) {
|
|
623
|
+
const text = String(args.text || "");
|
|
624
|
+
const memoryType = String(args.memory_type || "semantic");
|
|
625
|
+
const source = String(args.source || "agent");
|
|
626
|
+
const importance = args.importance ? Number(args.importance) : 5;
|
|
627
|
+
const tags = args.tags ? String(args.tags).split(",").map(t => t.trim()) : [];
|
|
628
|
+
if (!text)
|
|
629
|
+
return { success: false, output: "", error: "No text provided" };
|
|
630
|
+
const validTypes = ["episodic", "semantic", "procedural", "preference"];
|
|
631
|
+
if (!validTypes.includes(memoryType)) {
|
|
632
|
+
return { success: false, output: "", error: `Invalid type: ${memoryType}. Use: ${validTypes.join(", ")}` };
|
|
633
|
+
}
|
|
634
|
+
try {
|
|
635
|
+
const { MemoryBank } = await import("../memory/memory-bank.js");
|
|
636
|
+
const bank = new MemoryBank(this.runtimeDir, this.config);
|
|
637
|
+
await bank.storeMemory(text, memoryType, source, { importance, tags });
|
|
638
|
+
return { success: true, output: `Stored ${memoryType} memory (importance=${importance}): ${text.slice(0, 100)}` };
|
|
639
|
+
}
|
|
640
|
+
catch (err) {
|
|
641
|
+
return { success: false, output: "", error: `Failed to store memory: ${err.message}` };
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
async executeMemoryReflect() {
|
|
645
|
+
try {
|
|
646
|
+
const { MemoryBank } = await import("../memory/memory-bank.js");
|
|
647
|
+
const bank = new MemoryBank(this.runtimeDir, this.config);
|
|
648
|
+
const { merged, patterns } = await bank.reflect();
|
|
649
|
+
if (merged === 0) {
|
|
650
|
+
return { success: true, output: "Reflection complete. No similar memories found to merge." };
|
|
651
|
+
}
|
|
652
|
+
const output = `Reflection complete. Merged ${merged} memory pair(s).\n\nPatterns:\n${patterns.join("\n")}`;
|
|
653
|
+
return { success: true, output };
|
|
654
|
+
}
|
|
655
|
+
catch (err) {
|
|
656
|
+
return { success: false, output: "", error: `Reflection failed: ${err.message}` };
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
async executeMemoryForget(args) {
|
|
660
|
+
const query = String(args.query || "");
|
|
661
|
+
if (!query)
|
|
662
|
+
return { success: false, output: "", error: "No query provided" };
|
|
663
|
+
try {
|
|
664
|
+
const { MemoryBank } = await import("../memory/memory-bank.js");
|
|
665
|
+
const bank = new MemoryBank(this.runtimeDir, this.config);
|
|
666
|
+
const deleted = await bank.forget(query);
|
|
667
|
+
return { success: true, output: `Forgot ${deleted} memory/memories matching: "${query}"` };
|
|
668
|
+
}
|
|
669
|
+
catch (err) {
|
|
670
|
+
return { success: false, output: "", error: `Forget failed: ${err.message}` };
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
async executeMemoryListCategories() {
|
|
674
|
+
try {
|
|
675
|
+
const { MemoryBank } = await import("../memory/memory-bank.js");
|
|
676
|
+
const bank = new MemoryBank(this.runtimeDir, this.config);
|
|
677
|
+
const counts = bank.listCategories();
|
|
678
|
+
const total = Object.values(counts).reduce((s, n) => s + n, 0);
|
|
679
|
+
const lines = [
|
|
680
|
+
`Memory Bank: ${total} total memories`,
|
|
681
|
+
"",
|
|
682
|
+
` Episodic (events): ${counts.episodic}`,
|
|
683
|
+
` Semantic (facts): ${counts.semantic}`,
|
|
684
|
+
` Procedural (how-to): ${counts.procedural}`,
|
|
685
|
+
` Preference (likes): ${counts.preference}`,
|
|
686
|
+
];
|
|
687
|
+
return { success: true, output: lines.join("\n") };
|
|
688
|
+
}
|
|
689
|
+
catch (err) {
|
|
690
|
+
return { success: false, output: "", error: `List categories failed: ${err.message}` };
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
async executeMemoryGetContext(args) {
|
|
694
|
+
const query = String(args.query || "");
|
|
695
|
+
const limit = args.limit ? Number(args.limit) : 5;
|
|
696
|
+
if (!query)
|
|
697
|
+
return { success: false, output: "", error: "No query provided" };
|
|
698
|
+
try {
|
|
699
|
+
const { MemoryBank } = await import("../memory/memory-bank.js");
|
|
700
|
+
const bank = new MemoryBank(this.runtimeDir, this.config);
|
|
701
|
+
const context = await bank.getContextMemories(query, limit);
|
|
702
|
+
return { success: true, output: context || "No relevant memories found." };
|
|
703
|
+
}
|
|
704
|
+
catch (err) {
|
|
705
|
+
return { success: false, output: "", error: `Get context failed: ${err.message}` };
|
|
706
|
+
}
|
|
707
|
+
}
|
|
611
708
|
async executeWebFetch(args) {
|
|
612
709
|
const url = String(args.url || "");
|
|
613
710
|
if (!url)
|