@tyvm/knowhow 0.0.146 → 0.0.148
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/autodoc/cli-reference.md +36 -7
- package/bin/knowhow.js +8 -6
- package/package.json +1 -1
- package/src/agents/base/base.ts +51 -23
- package/src/agents/historyRollback.ts +36 -0
- package/src/agents/tools/execCommand.ts +102 -320
- package/src/agents/tools/list.ts +2 -2
- package/src/agents/tools/startAgentTask.ts +91 -34
- package/src/ai.ts +4 -1
- package/src/auth/browserLogin.ts +9 -3
- package/src/auth/keyAuth.ts +115 -0
- package/src/auth/keyManager.ts +166 -0
- package/src/chat/CliChatService.ts +23 -2
- package/src/chat/modules/AgentModule.ts +114 -33
- package/src/chat/modules/AskModule.ts +2 -0
- package/src/chat/modules/BaseChatModule.ts +0 -1
- package/src/chat/modules/CustomCommandsModule.ts +2 -0
- package/src/chat/modules/InternalChatModule.ts +7 -0
- package/src/chat/modules/RemoteSyncModule.ts +4 -0
- package/src/chat/modules/RendererModule.ts +2 -0
- package/src/chat/modules/SearchModule.ts +2 -0
- package/src/chat/modules/SessionsModule.ts +103 -34
- package/src/chat/modules/SetupModule.ts +2 -0
- package/src/chat/modules/ShellCommandModule.ts +2 -0
- package/src/chat/modules/SystemModule.ts +2 -0
- package/src/chat/modules/ToolCommandModule.ts +102 -0
- package/src/chat/modules/index.ts +1 -0
- package/src/chat/types.ts +3 -1
- package/src/cli.ts +10 -3
- package/src/clients/http.ts +67 -7
- package/src/clients/index.ts +4 -0
- package/src/commands/agent.ts +1 -38
- package/src/commands/agents.ts +455 -60
- package/src/commands/misc.ts +3 -2
- package/src/commands/processes.ts +138 -0
- package/src/commands/services.ts +23 -1
- package/src/index.ts +1 -0
- package/src/login.ts +89 -28
- package/src/processes/ProcessManager.ts +95 -0
- package/src/processes/managedProcessShim.ts +115 -0
- package/src/services/AgentService.ts +2 -0
- package/src/services/AgentSyncFs.ts +77 -1
- package/src/services/AgentSyncKnowhowWeb.ts +22 -4
- package/src/services/BehaviorsService.ts +2 -0
- package/src/services/DockerService.ts +2 -0
- package/src/services/EmbeddingService.ts +2 -0
- package/src/services/EmbeddingsService.ts +3 -0
- package/src/services/ExtensionsService.ts +25 -0
- package/src/services/KnowhowClient.ts +68 -7
- package/src/services/LazyToolsService.ts +24 -20
- package/src/services/Mcp.ts +2 -0
- package/src/services/McpServer.ts +2 -0
- package/src/services/MessageProcessor.ts +2 -0
- package/src/services/MinimalToolsService.ts +2 -0
- package/src/services/SessionManager.ts +5 -0
- package/src/services/SkillsService.ts +2 -0
- package/src/services/SyncedAgentWatcher.ts +2 -0
- package/src/services/SyncerService.ts +23 -8
- package/src/services/TaskRegistry.ts +2 -0
- package/src/services/Tools.ts +12 -0
- package/src/services/index.ts +6 -0
- package/src/services/modules/index.ts +10 -1
- package/src/services/modules/types.ts +4 -0
- package/src/types.ts +2 -0
- package/src/util/Trace.ts +1 -1
- package/src/utils/http.ts +18 -2
- package/tests/unit/agents/historyRollback.test.ts +53 -0
- package/tests/unit/auth/keyAuth.test.ts +102 -0
- package/tests/unit/auth/keyManager.test.ts +67 -0
- package/tests/unit/chat/ToolCommandModule.test.ts +71 -0
- package/tests/unit/chat/historyCommandArgs.test.ts +37 -0
- package/tests/unit/commands/agents.test.ts +111 -0
- package/tests/unit/login.test.ts +119 -0
- package/tests/unit/services/AgentSyncKnowhowWeb.test.ts +38 -0
- package/tests/unit/services/LazyToolsService.test.ts +53 -0
- package/tests/unit/services/SessionManager.test.ts +43 -0
- package/tests/unit/services/SyncerService.test.ts +45 -0
- package/tests/unit/util/Trace.test.ts +119 -0
- package/tests/unit/utils/http.test.ts +43 -0
- package/ts_build/package.json +1 -1
- package/ts_build/src/agents/base/base.d.ts +2 -1
- package/ts_build/src/agents/base/base.js +47 -14
- package/ts_build/src/agents/base/base.js.map +1 -1
- package/ts_build/src/agents/historyRollback.d.ts +2 -0
- package/ts_build/src/agents/historyRollback.js +22 -0
- package/ts_build/src/agents/historyRollback.js.map +1 -0
- package/ts_build/src/agents/tools/execCommand.d.ts +4 -1
- package/ts_build/src/agents/tools/execCommand.js +100 -223
- package/ts_build/src/agents/tools/execCommand.js.map +1 -1
- package/ts_build/src/agents/tools/list.js +2 -2
- package/ts_build/src/agents/tools/list.js.map +1 -1
- package/ts_build/src/agents/tools/startAgentTask.d.ts +16 -1
- package/ts_build/src/agents/tools/startAgentTask.js +71 -28
- package/ts_build/src/agents/tools/startAgentTask.js.map +1 -1
- package/ts_build/src/ai.js +2 -1
- package/ts_build/src/ai.js.map +1 -1
- package/ts_build/src/auth/browserLogin.d.ts +1 -0
- package/ts_build/src/auth/browserLogin.js +5 -2
- package/ts_build/src/auth/browserLogin.js.map +1 -1
- package/ts_build/src/auth/keyAuth.d.ts +5 -0
- package/ts_build/src/auth/keyAuth.js +79 -0
- package/ts_build/src/auth/keyAuth.js.map +1 -0
- package/ts_build/src/auth/keyManager.d.ts +14 -0
- package/ts_build/src/auth/keyManager.js +145 -0
- package/ts_build/src/auth/keyManager.js.map +1 -0
- package/ts_build/src/chat/CliChatService.d.ts +6 -0
- package/ts_build/src/chat/CliChatService.js +17 -2
- package/ts_build/src/chat/CliChatService.js.map +1 -1
- package/ts_build/src/chat/modules/AgentModule.d.ts +13 -1
- package/ts_build/src/chat/modules/AgentModule.js +83 -24
- package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
- package/ts_build/src/chat/modules/AskModule.js +12 -2
- package/ts_build/src/chat/modules/AskModule.js.map +1 -1
- package/ts_build/src/chat/modules/BaseChatModule.js.map +1 -1
- package/ts_build/src/chat/modules/CustomCommandsModule.js +12 -2
- package/ts_build/src/chat/modules/CustomCommandsModule.js.map +1 -1
- package/ts_build/src/chat/modules/InternalChatModule.d.ts +1 -0
- package/ts_build/src/chat/modules/InternalChatModule.js +21 -2
- package/ts_build/src/chat/modules/InternalChatModule.js.map +1 -1
- package/ts_build/src/chat/modules/RemoteSyncModule.js +19 -2
- package/ts_build/src/chat/modules/RemoteSyncModule.js.map +1 -1
- package/ts_build/src/chat/modules/RendererModule.js +17 -2
- package/ts_build/src/chat/modules/RendererModule.js.map +1 -1
- package/ts_build/src/chat/modules/SearchModule.js +12 -2
- package/ts_build/src/chat/modules/SearchModule.js.map +1 -1
- package/ts_build/src/chat/modules/SessionsModule.d.ts +6 -0
- package/ts_build/src/chat/modules/SessionsModule.js +113 -18
- package/ts_build/src/chat/modules/SessionsModule.js.map +1 -1
- package/ts_build/src/chat/modules/SetupModule.js +17 -2
- package/ts_build/src/chat/modules/SetupModule.js.map +1 -1
- package/ts_build/src/chat/modules/ShellCommandModule.js +12 -2
- package/ts_build/src/chat/modules/ShellCommandModule.js.map +1 -1
- package/ts_build/src/chat/modules/SystemModule.js +12 -2
- package/ts_build/src/chat/modules/SystemModule.js.map +1 -1
- package/ts_build/src/chat/modules/ToolCommandModule.d.ts +10 -0
- package/ts_build/src/chat/modules/ToolCommandModule.js +86 -0
- package/ts_build/src/chat/modules/ToolCommandModule.js.map +1 -0
- package/ts_build/src/chat/modules/index.d.ts +1 -0
- package/ts_build/src/chat/modules/index.js +3 -1
- package/ts_build/src/chat/modules/index.js.map +1 -1
- package/ts_build/src/chat/types.d.ts +3 -1
- package/ts_build/src/cli.js +7 -3
- package/ts_build/src/cli.js.map +1 -1
- package/ts_build/src/clients/http.d.ts +4 -0
- package/ts_build/src/clients/http.js +68 -6
- package/ts_build/src/clients/http.js.map +1 -1
- package/ts_build/src/clients/index.js +23 -4
- package/ts_build/src/clients/index.js.map +1 -1
- package/ts_build/src/commands/agent.js +1 -21
- package/ts_build/src/commands/agent.js.map +1 -1
- package/ts_build/src/commands/agents.d.ts +2 -1
- package/ts_build/src/commands/agents.js +216 -23
- package/ts_build/src/commands/agents.js.map +1 -1
- package/ts_build/src/commands/misc.js +3 -2
- package/ts_build/src/commands/misc.js.map +1 -1
- package/ts_build/src/commands/processes.d.ts +2 -0
- package/ts_build/src/commands/processes.js +213 -0
- package/ts_build/src/commands/processes.js.map +1 -0
- package/ts_build/src/commands/services.js +11 -1
- package/ts_build/src/commands/services.js.map +1 -1
- package/ts_build/src/index.d.ts +1 -0
- package/ts_build/src/index.js +1 -0
- package/ts_build/src/index.js.map +1 -1
- package/ts_build/src/login.d.ts +1 -1
- package/ts_build/src/login.js +53 -15
- package/ts_build/src/login.js.map +1 -1
- package/ts_build/src/processes/ProcessManager.d.ts +51 -0
- package/ts_build/src/processes/ProcessManager.js +160 -0
- package/ts_build/src/processes/ProcessManager.js.map +1 -0
- package/ts_build/src/processes/managedProcessShim.d.ts +1 -0
- package/ts_build/src/processes/managedProcessShim.js +161 -0
- package/ts_build/src/processes/managedProcessShim.js.map +1 -0
- package/ts_build/src/services/AgentService.js +18 -2
- package/ts_build/src/services/AgentService.js.map +1 -1
- package/ts_build/src/services/AgentSyncFs.d.ts +3 -0
- package/ts_build/src/services/AgentSyncFs.js +68 -16
- package/ts_build/src/services/AgentSyncFs.js.map +1 -1
- package/ts_build/src/services/AgentSyncKnowhowWeb.d.ts +2 -0
- package/ts_build/src/services/AgentSyncKnowhowWeb.js +28 -6
- package/ts_build/src/services/AgentSyncKnowhowWeb.js.map +1 -1
- package/ts_build/src/services/BehaviorsService.js +12 -2
- package/ts_build/src/services/BehaviorsService.js.map +1 -1
- package/ts_build/src/services/DockerService.js +20 -8
- package/ts_build/src/services/DockerService.js.map +1 -1
- package/ts_build/src/services/EmbeddingService.js +16 -2
- package/ts_build/src/services/EmbeddingService.js.map +1 -1
- package/ts_build/src/services/EmbeddingsService.js +12 -2
- package/ts_build/src/services/EmbeddingsService.js.map +1 -1
- package/ts_build/src/services/ExtensionsService.d.ts +10 -0
- package/ts_build/src/services/ExtensionsService.js +17 -0
- package/ts_build/src/services/ExtensionsService.js.map +1 -0
- package/ts_build/src/services/KnowhowClient.d.ts +7 -2
- package/ts_build/src/services/KnowhowClient.js +108 -10
- package/ts_build/src/services/KnowhowClient.js.map +1 -1
- package/ts_build/src/services/LazyToolsService.d.ts +2 -0
- package/ts_build/src/services/LazyToolsService.js +26 -9
- package/ts_build/src/services/LazyToolsService.js.map +1 -1
- package/ts_build/src/services/Mcp.js +12 -2
- package/ts_build/src/services/Mcp.js.map +1 -1
- package/ts_build/src/services/McpServer.js +17 -2
- package/ts_build/src/services/McpServer.js.map +1 -1
- package/ts_build/src/services/MessageProcessor.js +16 -2
- package/ts_build/src/services/MessageProcessor.js.map +1 -1
- package/ts_build/src/services/MinimalToolsService.js +16 -2
- package/ts_build/src/services/MinimalToolsService.js.map +1 -1
- package/ts_build/src/services/SessionManager.js +19 -2
- package/ts_build/src/services/SessionManager.js.map +1 -1
- package/ts_build/src/services/SkillsService.js +16 -2
- package/ts_build/src/services/SkillsService.js.map +1 -1
- package/ts_build/src/services/SyncedAgentWatcher.js +16 -2
- package/ts_build/src/services/SyncedAgentWatcher.js.map +1 -1
- package/ts_build/src/services/SyncerService.d.ts +1 -0
- package/ts_build/src/services/SyncerService.js +27 -5
- package/ts_build/src/services/SyncerService.js.map +1 -1
- package/ts_build/src/services/TaskRegistry.js +12 -2
- package/ts_build/src/services/TaskRegistry.js.map +1 -1
- package/ts_build/src/services/Tools.d.ts +1 -0
- package/ts_build/src/services/Tools.js +19 -2
- package/ts_build/src/services/Tools.js.map +1 -1
- package/ts_build/src/services/index.d.ts +5 -0
- package/ts_build/src/services/index.js +7 -2
- package/ts_build/src/services/index.js.map +1 -1
- package/ts_build/src/services/modules/index.d.ts +4 -1
- package/ts_build/src/services/modules/index.js +6 -1
- package/ts_build/src/services/modules/index.js.map +1 -1
- package/ts_build/src/services/modules/types.d.ts +3 -0
- package/ts_build/src/types.d.ts +1 -0
- package/ts_build/src/types.js.map +1 -1
- package/ts_build/src/util/Trace.d.ts +1 -3
- package/ts_build/src/utils/http.d.ts +6 -2
- package/ts_build/src/utils/http.js +8 -2
- package/ts_build/src/utils/http.js.map +1 -1
- package/ts_build/tests/unit/agents/historyRollback.test.d.ts +1 -0
- package/ts_build/tests/unit/agents/historyRollback.test.js +42 -0
- package/ts_build/tests/unit/agents/historyRollback.test.js.map +1 -0
- package/ts_build/tests/unit/auth/keyAuth.test.d.ts +1 -0
- package/ts_build/tests/unit/auth/keyAuth.test.js +77 -0
- package/ts_build/tests/unit/auth/keyAuth.test.js.map +1 -0
- package/ts_build/tests/unit/auth/keyManager.test.d.ts +1 -0
- package/ts_build/tests/unit/auth/keyManager.test.js +52 -0
- package/ts_build/tests/unit/auth/keyManager.test.js.map +1 -0
- package/ts_build/tests/unit/chat/ToolCommandModule.test.d.ts +1 -0
- package/ts_build/tests/unit/chat/ToolCommandModule.test.js +61 -0
- package/ts_build/tests/unit/chat/ToolCommandModule.test.js.map +1 -0
- package/ts_build/tests/unit/chat/historyCommandArgs.test.d.ts +1 -0
- package/ts_build/tests/unit/chat/historyCommandArgs.test.js +29 -0
- package/ts_build/tests/unit/chat/historyCommandArgs.test.js.map +1 -0
- package/ts_build/tests/unit/commands/agents.test.d.ts +1 -0
- package/ts_build/tests/unit/commands/agents.test.js +119 -0
- package/ts_build/tests/unit/commands/agents.test.js.map +1 -0
- package/ts_build/tests/unit/login.test.d.ts +1 -0
- package/ts_build/tests/unit/login.test.js +97 -0
- package/ts_build/tests/unit/login.test.js.map +1 -0
- package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.d.ts +1 -0
- package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.js +32 -0
- package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.js.map +1 -0
- package/ts_build/tests/unit/services/LazyToolsService.test.d.ts +1 -0
- package/ts_build/tests/unit/services/LazyToolsService.test.js +47 -0
- package/ts_build/tests/unit/services/LazyToolsService.test.js.map +1 -0
- package/ts_build/tests/unit/services/SessionManager.test.d.ts +1 -0
- package/ts_build/tests/unit/services/SessionManager.test.js +72 -0
- package/ts_build/tests/unit/services/SessionManager.test.js.map +1 -0
- package/ts_build/tests/unit/services/SyncerService.test.d.ts +1 -0
- package/ts_build/tests/unit/services/SyncerService.test.js +40 -0
- package/ts_build/tests/unit/services/SyncerService.test.js.map +1 -0
- package/ts_build/tests/unit/util/Trace.test.d.ts +1 -0
- package/ts_build/tests/unit/util/Trace.test.js +107 -0
- package/ts_build/tests/unit/util/Trace.test.js.map +1 -0
- package/ts_build/tests/unit/utils/http.test.d.ts +1 -0
- package/ts_build/tests/unit/utils/http.test.js +69 -0
- package/ts_build/tests/unit/utils/http.test.js.map +1 -0
package/autodoc/cli-reference.md
CHANGED
|
@@ -86,7 +86,7 @@ knowhow chat
|
|
|
86
86
|
---
|
|
87
87
|
|
|
88
88
|
### `knowhow agent`
|
|
89
|
-
**Purpose:**
|
|
89
|
+
**Purpose:** Start a new one-shot agent task directly from the CLI (default agent: `Patcher`).
|
|
90
90
|
|
|
91
91
|
**Usage:**
|
|
92
92
|
```bash
|
|
@@ -114,8 +114,6 @@ knowhow agent [options]
|
|
|
114
114
|
Custom prompt template file with a `{text}` placeholder
|
|
115
115
|
- `--input <text>`
|
|
116
116
|
Task input (fallback to stdin if not provided)
|
|
117
|
-
- `--resume`
|
|
118
|
-
Resume a previously started task using `--task-id` (local FS or remote)
|
|
119
117
|
- `--renderer <name>`
|
|
120
118
|
Renderer to use: `basic`, `compact`, `fancy`, or a path/package
|
|
121
119
|
(default: from config or `basic`)
|
|
@@ -136,14 +134,45 @@ Use a custom prompt template file:
|
|
|
136
134
|
knowhow agent --prompt-file .knowhow/prompts/BasicCodeDocumenter.mdx --input "src/index.ts"
|
|
137
135
|
```
|
|
138
136
|
|
|
139
|
-
|
|
137
|
+
Choose provider + renderer:
|
|
140
138
|
```bash
|
|
141
|
-
knowhow agent --
|
|
139
|
+
knowhow agent --provider openai --model gpt-4.1-mini --renderer fancy --input "Fix the failing tests"
|
|
142
140
|
```
|
|
143
141
|
|
|
144
|
-
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
### `knowhow agents resume` / `knowhow agents fork`
|
|
145
|
+
**Purpose:** Continue an existing agent task, or branch its history into a new task without modifying the source.
|
|
146
|
+
|
|
147
|
+
**Usage:**
|
|
145
148
|
```bash
|
|
146
|
-
knowhow
|
|
149
|
+
knowhow agents resume [taskId] [options]
|
|
150
|
+
knowhow agents fork [sourceTaskId] [options]
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Both commands accept a full or partial task ID. Use `-i <number>` instead to select the corresponding row from `knowhow agents list`.
|
|
154
|
+
|
|
155
|
+
#### Options
|
|
156
|
+
- `-i, --index <number>` — Select a task by row number from `knowhow agents list`
|
|
157
|
+
- `--rollback <count>` — Discard the newest N agent interactions before continuing (default: `0`)
|
|
158
|
+
- `--input <text>` — Message to send after restoring history
|
|
159
|
+
- `--message-id <messageId>` — Knowhow message ID for remote task lookup
|
|
160
|
+
- `--sync-fs` — Enable filesystem-based synchronization
|
|
161
|
+
- `--provider <provider>` — Override the saved AI provider
|
|
162
|
+
- `--model <model>` — Override the saved model
|
|
163
|
+
- `--agent-name <name>` — Override the saved agent
|
|
164
|
+
- `--reasoning-effort <effort>` — Override the saved reasoning effort
|
|
165
|
+
- `--renderer <name>` — Renderer to use (default: from config or `basic`)
|
|
166
|
+
- `--task-id <taskId>` — Explicit destination task ID (`fork` only)
|
|
167
|
+
|
|
168
|
+
Resume the first listed task after removing its newest assistant interaction:
|
|
169
|
+
```bash
|
|
170
|
+
knowhow agents resume -i 1 --rollback 1
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Fork the third listed task into an explicit destination task ID:
|
|
174
|
+
```bash
|
|
175
|
+
knowhow agents fork -i 3 --rollback 1 --task-id my-new-task
|
|
147
176
|
```
|
|
148
177
|
|
|
149
178
|
---
|
package/bin/knowhow.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
1
|
+
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// knowhow CLI entry point.
|
|
4
4
|
//
|
|
5
|
-
// --no-node-snapshot is
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
5
|
+
// --no-node-snapshot is NOT needed here. The script module (knowhow-module-script)
|
|
6
|
+
// forks a child process with --no-node-snapshot only when executeScript is actually
|
|
7
|
+
// called. This means:
|
|
8
|
+
// - The shebang works on Linux (GNU env) and macOS without any argument-splitting tricks.
|
|
9
|
+
// - Ghostty (or whichever terminal launched knowhow) remains the TCC subject for
|
|
10
|
+
// macOS Screen Recording / Accessibility permissions — computer-use features work
|
|
11
|
+
// without having to grant those permissions to the node binary itself.
|
|
10
12
|
|
|
11
13
|
const path = require("node:path");
|
|
12
14
|
const cliJs = path.join(__dirname, "../ts_build/src/cli.js");
|
package/package.json
CHANGED
package/src/agents/base/base.ts
CHANGED
|
@@ -22,6 +22,7 @@ import { Models } from "../../ai";
|
|
|
22
22
|
import { MessageProcessor } from "../../services/MessageProcessor";
|
|
23
23
|
import { DEFAULT_CONTEXT_LIMIT } from "../../clients/contextLimits";
|
|
24
24
|
import { Marked } from "../../utils";
|
|
25
|
+
import { TraceAll } from "../../util/Trace";
|
|
25
26
|
|
|
26
27
|
export { Message, Tool, ToolCall };
|
|
27
28
|
export interface ModelPreference {
|
|
@@ -83,6 +84,7 @@ interface ActiveObservation {
|
|
|
83
84
|
expiry?: NodeJS.Timeout;
|
|
84
85
|
}
|
|
85
86
|
|
|
87
|
+
@TraceAll()
|
|
86
88
|
export abstract class BaseAgent implements IAgent {
|
|
87
89
|
abstract name: string;
|
|
88
90
|
abstract description: string;
|
|
@@ -471,6 +473,28 @@ export abstract class BaseAgent implements IAgent {
|
|
|
471
473
|
return this.getEnabledTools().map((t) => t.function.name);
|
|
472
474
|
}
|
|
473
475
|
|
|
476
|
+
/** Restore the exact request-visible tool list persisted for a prior run. */
|
|
477
|
+
restoreEnabledTools(names: string[]) {
|
|
478
|
+
const uniqueNames = [...new Set(names)];
|
|
479
|
+
const lazyTools = this.tools as ToolsService & {
|
|
480
|
+
enableTools?: (patterns: string[]) => unknown;
|
|
481
|
+
restoreEnabledTools?: (names: string[]) => void;
|
|
482
|
+
};
|
|
483
|
+
|
|
484
|
+
// LazyToolsService only exposes explicitly enabled tools. Materialize the
|
|
485
|
+
// saved concrete names before applying the agent-level exact-set filter.
|
|
486
|
+
if (lazyTools.restoreEnabledTools) {
|
|
487
|
+
lazyTools.restoreEnabledTools(uniqueNames);
|
|
488
|
+
} else {
|
|
489
|
+
lazyTools.enableTools?.(uniqueNames);
|
|
490
|
+
}
|
|
491
|
+
const savedNames = new Set(uniqueNames);
|
|
492
|
+
this.disabledTools = this.tools
|
|
493
|
+
.getTools()
|
|
494
|
+
.map((tool) => tool.function.name)
|
|
495
|
+
.filter((name) => !savedNames.has(name));
|
|
496
|
+
}
|
|
497
|
+
|
|
474
498
|
disableTool(toolName: string) {
|
|
475
499
|
this.disabledTools.push(toolName);
|
|
476
500
|
}
|
|
@@ -1011,9 +1035,6 @@ export abstract class BaseAgent implements IAgent {
|
|
|
1011
1035
|
this.updateCurrentThread(messages);
|
|
1012
1036
|
const isMissingTool = this.isRequiredToolMissing();
|
|
1013
1037
|
|
|
1014
|
-
const startIndex = 0;
|
|
1015
|
-
const endIndex = messages.length;
|
|
1016
|
-
|
|
1017
1038
|
// Process messages before each AI call
|
|
1018
1039
|
messages = await this.messageProcessor.processMessages(
|
|
1019
1040
|
messages,
|
|
@@ -1259,14 +1280,14 @@ export abstract class BaseAgent implements IAgent {
|
|
|
1259
1280
|
: `Compressing messages: ${contextTokens} tokens exceeds ${this.getCompressThreshold()}`
|
|
1260
1281
|
);
|
|
1261
1282
|
this._forceCompact = false;
|
|
1262
|
-
messages = await this.compressMessages(messages
|
|
1283
|
+
messages = await this.compressMessages(messages);
|
|
1263
1284
|
this.startNewThread(messages);
|
|
1264
1285
|
// Reset the real-token tracker. compressMessages() ran a completion over
|
|
1265
|
-
// the
|
|
1266
|
-
//
|
|
1267
|
-
// getContextTokenCount()
|
|
1268
|
-
//
|
|
1269
|
-
//
|
|
1286
|
+
// the older history, so lastPromptTokens reflects the compression input
|
|
1287
|
+
// rather than the newly reconstructed thread. Zeroing it makes
|
|
1288
|
+
// getContextTokenCount() estimate the new thread until the next regular
|
|
1289
|
+
// completion reports fresh usage, preventing an immediate false
|
|
1290
|
+
// re-compaction on the following iteration.
|
|
1270
1291
|
this.lastPromptTokens = 0;
|
|
1271
1292
|
}
|
|
1272
1293
|
|
|
@@ -1665,15 +1686,24 @@ export abstract class BaseAgent implements IAgent {
|
|
|
1665
1686
|
return this.taskBreakdown;
|
|
1666
1687
|
}
|
|
1667
1688
|
|
|
1668
|
-
async compressMessages(
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1689
|
+
async compressMessages(messages: Message[]) {
|
|
1690
|
+
// Preserve the latest agent interaction exactly. Starting the resumed thread
|
|
1691
|
+
// at the final assistant message keeps its tool calls, every tool response,
|
|
1692
|
+
// and any subsequent user messages together as one protocol-valid unit.
|
|
1693
|
+
let resumeIndex = messages.length - 1;
|
|
1694
|
+
while (
|
|
1695
|
+
resumeIndex >= 0 &&
|
|
1696
|
+
messages[resumeIndex].role !== "assistant"
|
|
1697
|
+
) {
|
|
1698
|
+
resumeIndex--;
|
|
1699
|
+
}
|
|
1700
|
+
const compressionEnd = resumeIndex === -1 ? messages.length : resumeIndex;
|
|
1701
|
+
const toCompress = messages.slice(0, compressionEnd);
|
|
1702
|
+
const resumeMessages = messages.slice(compressionEnd);
|
|
1703
|
+
|
|
1673
1704
|
this.log(
|
|
1674
|
-
`Compressing messages from ${
|
|
1705
|
+
`Compressing messages from 0 to ${compressionEnd}, resuming from ${resumeIndex}, total messages: ${messages.length}`
|
|
1675
1706
|
);
|
|
1676
|
-
const toCompress = messages.slice(startIndex, endIndex);
|
|
1677
1707
|
const toCompressPrompt = `We are compressing our conversation to save memory.
|
|
1678
1708
|
Please summarize the conversation so far, so that we may continue the original task with a smaller context
|
|
1679
1709
|
|
|
@@ -1685,14 +1715,12 @@ export abstract class BaseAgent implements IAgent {
|
|
|
1685
1715
|
|
|
1686
1716
|
Our initial task breakdown: ${this.taskBreakdown}
|
|
1687
1717
|
|
|
1688
|
-
This summary will
|
|
1718
|
+
This summary will replace the older history. The latest agent interaction will remain verbatim:
|
|
1689
1719
|
|
|
1690
1720
|
`;
|
|
1691
1721
|
|
|
1692
|
-
const model = this.getModel();
|
|
1693
|
-
|
|
1694
1722
|
const compressMessagesPayload = [
|
|
1695
|
-
...
|
|
1723
|
+
...toCompress,
|
|
1696
1724
|
{
|
|
1697
1725
|
role: "user",
|
|
1698
1726
|
content: toCompressPrompt,
|
|
@@ -1720,12 +1748,12 @@ export abstract class BaseAgent implements IAgent {
|
|
|
1720
1748
|
`,
|
|
1721
1749
|
},
|
|
1722
1750
|
] as Message[];
|
|
1723
|
-
const
|
|
1751
|
+
const systemMessages = toCompress.filter((m) => m.role === "system");
|
|
1724
1752
|
|
|
1725
1753
|
const newMessages = [
|
|
1726
|
-
...
|
|
1754
|
+
...systemMessages,
|
|
1727
1755
|
...startMessages,
|
|
1728
|
-
...
|
|
1756
|
+
...resumeMessages,
|
|
1729
1757
|
];
|
|
1730
1758
|
|
|
1731
1759
|
const oldLength = this.getMessagesLength(messages);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Message } from "../clients/types";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Remove the newest agent interactions from the final persisted thread.
|
|
5
|
+
*
|
|
6
|
+
* An interaction starts with an assistant message and includes every following
|
|
7
|
+
* tool result up to (but not including) the next assistant message. Cutting at
|
|
8
|
+
* the assistant boundary keeps tool_call/tool-result pairs valid and makes
|
|
9
|
+
* `rollback: 1` useful for recovering from a failed final tool-use turn.
|
|
10
|
+
*/
|
|
11
|
+
export function rollbackAgentInteractions(
|
|
12
|
+
threads: Message[][],
|
|
13
|
+
rollback: number = 0
|
|
14
|
+
): Message[][] {
|
|
15
|
+
if (!Number.isInteger(rollback) || rollback < 0) {
|
|
16
|
+
throw new Error("rollback must be a non-negative integer");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const cloned = threads.map((thread) => thread.map((message) => ({ ...message })));
|
|
20
|
+
if (rollback === 0 || cloned.length === 0) return cloned;
|
|
21
|
+
|
|
22
|
+
const lastThread = cloned[cloned.length - 1];
|
|
23
|
+
const assistantIndexes = lastThread
|
|
24
|
+
.map((message, index) => (message.role === "assistant" ? index : -1))
|
|
25
|
+
.filter((index) => index >= 0);
|
|
26
|
+
|
|
27
|
+
if (rollback > assistantIndexes.length) {
|
|
28
|
+
throw new Error(
|
|
29
|
+
`Cannot rollback ${rollback} interaction(s); the latest thread only has ${assistantIndexes.length} assistant interaction(s).`
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const cutIndex = assistantIndexes[assistantIndexes.length - rollback];
|
|
34
|
+
cloned[cloned.length - 1] = lastThread.slice(0, cutIndex);
|
|
35
|
+
return cloned;
|
|
36
|
+
}
|