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
+35
View File
@@ -7,6 +7,7 @@
* GET /api/homes/trash every Trash the caller may open, merged
* GET /api/homes/:who/fs/list|trash|zip|download
* POST /api/homes/:who/fs/mkdir|newfile|rename|move|copy|delete|upload|trash/restore|trash/purge
* POST /api/homes/:who/fs/upload-batch|upload-check many small files in one request
*
* `:who` is `me`, or — for an admin — another user's name: read-only
* (`403 EREADONLY` on every write) and written to the audit log. The one
@@ -36,6 +37,7 @@ function fail(res, err) {
ENOHOME: 404,
EBADPATH: 400,
EBADNAME: 400,
EBADBODY: 400,
ENOFILE: 404,
ESECRET: 403,
EFOREIGN: 403,
@@ -314,5 +316,38 @@ router.post(
}
}, W)
);
router.post(
"/:who/fs/upload-batch",
sameOriginGuard,
handle(async (req, res, home) => {
try {
const out = await fx.uploadBatch(
home.dir,
typeof req.query.dir === "string" ? req.query.dir : "",
req,
{ conflict: req.query.conflict, trash: trashFor(req, home) }
);
res.status(201).json(out);
} catch (err) {
req.resume();
throw err;
}
}, W)
);
router.post(
"/:who/fs/upload-check",
sameOriginGuard,
handle(
async (req, res, home) =>
res.json(
await fx.uploadCheck(
home.dir,
typeof req.body?.dir === "string" ? req.body.dir : "",
req.body?.paths
)
),
W
)
);
module.exports = router;