chore: v2.8.13 — Artifacts reinstall/edit/installs, agent steps in chat, pick a local file to attach, Windows paths as links

- Chat: an Agent step shows its task, status and tool calls and opens its conversation in place; Windows paths (E:\…, C:/…) in replies open as files
- Prompt: attach a file on this computer by path (native picker), clearer too-large messages
- Artifacts: edit title/description and a skill's files (new snapshot), Reinstall, install history, Hub-only rows, skills installed into ~/.claude/skills and ~/.agents/skills
- Files: batch upload of small files in one extract
- AI Tools: npm install falls back to --prefix ~/.local when the global prefix is not writable
This commit is contained in:
2026-10-20 16:44:55 +07:00
parent 49f87c4da3
commit 0547488f13
59 changed files with 4285 additions and 690 deletions
+47 -1
View File
@@ -18,7 +18,12 @@ const fs = require("node:fs");
const TEST_DB = path.join(os.tmpdir(), `transcript-sender-${Date.now()}-${process.pid}.db`);
process.env.DASHBOARD_DB_PATH = TEST_DB;
const { classifyTranscriptSender, patchCounts, askAnswers } = require("../routes/sessions");
const {
classifyTranscriptSender,
patchCounts,
askAnswers,
agentInfo,
} = require("../routes/sessions");
const { db } = require("../db");
after(() => {
@@ -187,3 +192,44 @@ describe("askAnswers — what the user picked or typed for an AskUserQuestion",
assert.equal(askAnswers("text"), null);
});
});
describe("agentInfo — what an Agent call's result says about its subagent", () => {
it("reads a foreground agent's id, model, time, tokens and tool calls", () => {
const r = {
status: "completed",
agentId: "a2f215755130779a8",
resolvedModel: "claude-opus-5-5",
totalDurationMs: 132350,
totalTokens: 88007,
totalToolUseCount: 31,
content: [{ type: "text", text: "report" }],
};
assert.deepEqual(agentInfo(r), {
id: "a2f215755130779a8",
model: "claude-opus-5-5",
status: "completed",
duration_ms: 132350,
tokens: 88007,
tool_uses: 31,
});
});
it("leaves unknown facts null for a background launch", () => {
const r = { isAsync: true, status: "async_launched", agentId: "ab12", description: "x" };
assert.deepEqual(agentInfo(r), {
id: "ab12",
model: null,
status: "async_launched",
duration_ms: null,
tokens: null,
tool_uses: null,
});
});
it("answers null for a result that is no agent, or an id that is no plain name", () => {
assert.equal(agentInfo({ stdout: "ok" }), null);
assert.equal(agentInfo({ agentId: "../etc" }), null);
assert.equal(agentInfo("text"), null);
assert.equal(agentInfo(undefined), null);
});
});