@tractorscorch/clank 1.5.8 → 1.5.10
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/CHANGELOG.md +19 -0
- package/README.md +8 -2
- package/dist/index.js +34 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,25 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/).
|
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
+
## [1.5.10] — 2026-03-23
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
- **Telegram/Discord hangs forever when agent uses tools** — medium/high safety tools (bash, write_file, edit_file) require user confirmation, but the adapter streaming path had no confirmation handler. The engine would emit `confirm-needed`, nobody would respond, and the agent hung indefinitely with Telegram stuck on "typing". Now auto-approves all tool confirmations for non-interactive channels
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## [1.5.9] — 2026-03-23
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- **Workspace defaults to current directory** — the agent's workspace is now the directory you run `clank` from, not a hidden `%APPDATA%/Clank/workspace` folder. This means the agent works with your actual project files out of the box
|
|
20
|
+
- **Full file system access** — the path guard no longer blocks reads/writes outside the workspace. Clank is a dev tool and needs to access the full system. Added security notice to README recommending dedicated hardware
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
- **Telegram `/new` and `/reset` were no-ops** — these commands returned a "session started" message but never actually reset the session. The model kept its full conversation history. Now properly clears session store, context engine, and destroys the old engine instance
|
|
24
|
+
- **Security notice added to README** — recommends running Clank on dedicated hardware since it gives agents full system access
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
9
28
|
## [1.5.8] — 2026-03-23
|
|
10
29
|
|
|
11
30
|
### Added
|
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
12
|
-
<a href="https://github.com/ItsTrag1c/Clank/releases/latest"><img src="https://img.shields.io/badge/version-1.5.
|
|
12
|
+
<a href="https://github.com/ItsTrag1c/Clank/releases/latest"><img src="https://img.shields.io/badge/version-1.5.10-blue.svg" alt="Version" /></a>
|
|
13
13
|
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="License" /></a>
|
|
14
14
|
<a href="https://www.npmjs.com/package/@tractorscorch/clank"><img src="https://img.shields.io/npm/v/@tractorscorch/clank.svg" alt="npm" /></a>
|
|
15
15
|
<a href="https://github.com/ItsTrag1c/Clank/stargazers"><img src="https://img.shields.io/github/stars/ItsTrag1c/Clank.svg" alt="Stars" /></a>
|
|
@@ -75,7 +75,13 @@ That's it. Setup auto-detects your local models, configures the gateway, and get
|
|
|
75
75
|
| Platform | Download |
|
|
76
76
|
|----------|----------|
|
|
77
77
|
| **npm** (all platforms) | `npm install -g @tractorscorch/clank` |
|
|
78
|
-
| **macOS** (Apple Silicon) | [Clank_1.5.
|
|
78
|
+
| **macOS** (Apple Silicon) | [Clank_1.5.10_macos](https://github.com/ItsTrag1c/Clank/releases/latest/download/Clank_1.5.10_macos) |
|
|
79
|
+
|
|
80
|
+
## Security Notice
|
|
81
|
+
|
|
82
|
+
Clank is a **developer tool** that gives AI agents full access to your file system, shell, and connected services. The agent can read, write, and execute on your behalf.
|
|
83
|
+
|
|
84
|
+
**We strongly recommend running Clank on dedicated hardware** (a dev machine, VM, or container) rather than on a system with sensitive personal files, credentials, or accounts you don't want the agent to access. Treat it like giving someone SSH access to your box.
|
|
79
85
|
|
|
80
86
|
## Features
|
|
81
87
|
|
package/dist/index.js
CHANGED
|
@@ -1044,6 +1044,7 @@ var init_agent = __esm({
|
|
|
1044
1044
|
this.emit("tool-start", { id: tc.id, name: tc.name, arguments: tc.arguments });
|
|
1045
1045
|
const toolCtx = {
|
|
1046
1046
|
projectRoot: this.identity.workspace,
|
|
1047
|
+
allowExternal: true,
|
|
1047
1048
|
autoApprove: this.autoApprove,
|
|
1048
1049
|
agentId: this.identity.id,
|
|
1049
1050
|
signal
|
|
@@ -2099,7 +2100,7 @@ function defaultConfig() {
|
|
|
2099
2100
|
agents: {
|
|
2100
2101
|
defaults: {
|
|
2101
2102
|
model: { primary: "ollama/qwen3.5" },
|
|
2102
|
-
workspace:
|
|
2103
|
+
workspace: process.cwd(),
|
|
2103
2104
|
toolTier: "auto",
|
|
2104
2105
|
temperature: 0.7
|
|
2105
2106
|
},
|
|
@@ -5697,9 +5698,15 @@ You can read this file with the read_file tool.`
|
|
|
5697
5698
|
return "Use /new to start a fresh session, or /reset to clear the current one.";
|
|
5698
5699
|
}
|
|
5699
5700
|
case "new":
|
|
5700
|
-
return "New session started. Send a message to begin.";
|
|
5701
5701
|
case "reset":
|
|
5702
|
-
|
|
5702
|
+
if (this.gateway) {
|
|
5703
|
+
await this.gateway.resetSession({
|
|
5704
|
+
channel: "telegram",
|
|
5705
|
+
peerId: chatId,
|
|
5706
|
+
peerKind: isGroup ? "group" : "dm"
|
|
5707
|
+
});
|
|
5708
|
+
}
|
|
5709
|
+
return command === "new" ? "New session started. Send a message to begin." : "Session reset. History cleared.";
|
|
5703
5710
|
case "model": {
|
|
5704
5711
|
const model = this.config?.agents?.defaults?.model?.primary || "unknown";
|
|
5705
5712
|
return `Current model: \`${model}\``;
|
|
@@ -6134,6 +6141,20 @@ var init_server = __esm({
|
|
|
6134
6141
|
}
|
|
6135
6142
|
}
|
|
6136
6143
|
}
|
|
6144
|
+
/**
|
|
6145
|
+
* Reset a session — clear its history and context.
|
|
6146
|
+
* Used by channel adapters (Telegram /new, /reset commands).
|
|
6147
|
+
*/
|
|
6148
|
+
async resetSession(context) {
|
|
6149
|
+
const sessionKey = deriveSessionKey(context);
|
|
6150
|
+
await this.sessionStore.reset(sessionKey);
|
|
6151
|
+
const engine = this.engines.get(sessionKey);
|
|
6152
|
+
if (engine) {
|
|
6153
|
+
engine.getContextEngine().clear();
|
|
6154
|
+
engine.destroy();
|
|
6155
|
+
this.engines.delete(sessionKey);
|
|
6156
|
+
}
|
|
6157
|
+
}
|
|
6137
6158
|
/**
|
|
6138
6159
|
* Handle an inbound message from any channel adapter.
|
|
6139
6160
|
* This is the main entry point for all non-WebSocket messages.
|
|
@@ -6198,6 +6219,12 @@ var init_server = __esm({
|
|
|
6198
6219
|
engine.on("error", fn);
|
|
6199
6220
|
listeners.push(["error", fn]);
|
|
6200
6221
|
}
|
|
6222
|
+
const confirmFn = (data) => {
|
|
6223
|
+
const { resolve: resolve4 } = data;
|
|
6224
|
+
resolve4("always");
|
|
6225
|
+
};
|
|
6226
|
+
engine.on("confirm-needed", confirmFn);
|
|
6227
|
+
listeners.push(["confirm-needed", confirmFn]);
|
|
6201
6228
|
try {
|
|
6202
6229
|
console.log(` Streaming: sending message to engine (session: ${sessionKey})`);
|
|
6203
6230
|
const result = await engine.sendMessage(text);
|
|
@@ -6245,7 +6272,7 @@ var init_server = __esm({
|
|
|
6245
6272
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
6246
6273
|
res.end(JSON.stringify({
|
|
6247
6274
|
status: "ok",
|
|
6248
|
-
version: "1.5.
|
|
6275
|
+
version: "1.5.10",
|
|
6249
6276
|
uptime: process.uptime(),
|
|
6250
6277
|
clients: this.clients.size,
|
|
6251
6278
|
agents: this.engines.size
|
|
@@ -6357,7 +6384,7 @@ var init_server = __esm({
|
|
|
6357
6384
|
const hello = {
|
|
6358
6385
|
type: "hello",
|
|
6359
6386
|
protocol: PROTOCOL_VERSION,
|
|
6360
|
-
version: "1.5.
|
|
6387
|
+
version: "1.5.10",
|
|
6361
6388
|
agents: this.config.agents.list.map((a) => ({
|
|
6362
6389
|
id: a.id,
|
|
6363
6390
|
name: a.name || a.id,
|
|
@@ -7753,7 +7780,7 @@ async function runTui(opts) {
|
|
|
7753
7780
|
ws.on("open", () => {
|
|
7754
7781
|
ws.send(JSON.stringify({
|
|
7755
7782
|
type: "connect",
|
|
7756
|
-
params: { auth: { token }, mode: "tui", version: "1.5.
|
|
7783
|
+
params: { auth: { token }, mode: "tui", version: "1.5.10" }
|
|
7757
7784
|
}));
|
|
7758
7785
|
});
|
|
7759
7786
|
ws.on("message", (data) => {
|
|
@@ -8182,7 +8209,7 @@ import { fileURLToPath as fileURLToPath5 } from "url";
|
|
|
8182
8209
|
import { dirname as dirname5, join as join19 } from "path";
|
|
8183
8210
|
var __filename3 = fileURLToPath5(import.meta.url);
|
|
8184
8211
|
var __dirname3 = dirname5(__filename3);
|
|
8185
|
-
var version = "1.5.
|
|
8212
|
+
var version = "1.5.10";
|
|
8186
8213
|
try {
|
|
8187
8214
|
const pkg = JSON.parse(readFileSync(join19(__dirname3, "..", "package.json"), "utf-8"));
|
|
8188
8215
|
version = pkg.version;
|