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
+183 -1
View File
@@ -3,7 +3,7 @@
openapi: 3.0.3
info:
title: Agent Dashboard for Claude Code API
version: 2.8.12
version: 2.8.13
description: HTTP API for real-time Claude Code session monitoring, agent lifecycle tracking, analytics, pricing, hooks ingestion, and workflow intelligence.
contact:
name: Nguyễn Ngọc Trí Vĩ
@@ -466,6 +466,10 @@ components:
subagent_type:
type: string
nullable: true
tool_use_id:
type: string
nullable: true
description: The Agent/Task tool_use that launched this subagent, from its meta file (Claude Code subagents only).
has_transcript:
type: boolean
db_agent_id:
@@ -15912,6 +15916,94 @@ paths:
responses:
'201':
description: Done.
/api/lanes/{id}/fs/upload-check:
post:
tags:
- Files
summary: 'Before a batch: the names already taken, and whether a batch can go there'
description: 'On a workspace (`?session=` / `?source=` pick the session worktree / extra folder, like the git reads). `taken`: which of `paths` (relative to `dir`) exist; `batch: false` = send the files one by one (a member''s folder whose `write-as` predates `extract`). 400 EBADPATH/EBADNAME, 403 ESECRET/EFOREIGN/EREADONLY (another user''s home)/EBADORIGIN, 404 ENOFILE/ENOHOME, 409 EEXISTS (with `error.names`)/EUPGRADE/EMEMBERGONE, 413 ETOOBIG.'
operationId: laneFsUploadCheck
parameters:
- name: id
in: path
required: true
schema:
type: integer
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- paths
properties:
dir:
type: string
default: ''
paths:
type: array
items:
type: string
responses:
'200':
description: '`{taken, batch}`'
content:
application/json:
schema:
type: object
properties:
taken:
type: array
items:
type: string
batch:
type: boolean
/api/lanes/{id}/fs/upload-batch:
post:
tags:
- Files
summary: Upload many small files in one request (≤ 5,000 files, 16 MB each, 256 MB in all)
description: 'On a workspace (`?session=` / `?source=` pick the session worktree / extra folder, like the git reads). Body: a 4-byte big-endian length, that many bytes of JSON `{files: [{path, size, mtime?}]}` (paths relative to `dir`), then each file''s bytes in that order. Planned whole before the first write — a taken name under `conflict=fail` is ONE 409 naming them all; a member''s batch is one `write-as extract` (409 EUPGRADE until `agenthub server install-system` is re-run). 400 EBADBODY for a malformed or short body. 400 EBADPATH/EBADNAME, 403 ESECRET/EFOREIGN/EREADONLY (another user''s home)/EBADORIGIN, 404 ENOFILE/ENOHOME, 409 EEXISTS (with `error.names`)/EUPGRADE/EMEMBERGONE, 413 ETOOBIG.'
operationId: laneFsUploadBatch
parameters:
- name: id
in: path
required: true
schema:
type: integer
- name: dir
in: query
schema:
type: string
default: ''
- name: conflict
in: query
schema:
$ref: '#/components/schemas/FsConflict'
requestBody:
required: true
content:
application/octet-stream:
schema:
type: string
format: binary
responses:
'201':
description: '`{saved, skipped, paths}`'
content:
application/json:
schema:
type: object
properties:
saved:
type: integer
skipped:
type: integer
paths:
type: array
items:
type: string
/api/lanes/{id}/fs/zip:
get:
tags:
@@ -16265,6 +16357,96 @@ paths:
responses:
'201':
description: Done.
/api/homes/{who}/fs/upload-check:
post:
tags:
- Files
summary: 'Before a batch: the names already taken, and whether a batch can go there'
description: 'On a user''s home. Every dot entry at the top of the home is hidden and refused. `taken`: which of `paths` (relative to `dir`) exist; `batch: false` = send the files one by one (a member''s folder whose `write-as` predates `extract`). 400 EBADPATH/EBADNAME, 403 ESECRET/EFOREIGN/EREADONLY (another user''s home)/EBADORIGIN, 404 ENOFILE/ENOHOME, 409 EEXISTS (with `error.names`)/EUPGRADE/EMEMBERGONE, 413 ETOOBIG.'
operationId: homeFsUploadCheck
parameters:
- name: who
in: path
required: true
schema:
type: string
description: '`me`, or another user''s name (an admin''s read-only view).'
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- paths
properties:
dir:
type: string
default: ''
paths:
type: array
items:
type: string
responses:
'200':
description: '`{taken, batch}`'
content:
application/json:
schema:
type: object
properties:
taken:
type: array
items:
type: string
batch:
type: boolean
/api/homes/{who}/fs/upload-batch:
post:
tags:
- Files
summary: Upload many small files in one request (≤ 5,000 files, 16 MB each, 256 MB in all)
description: 'On a user''s home. Every dot entry at the top of the home is hidden and refused. Body: a 4-byte big-endian length, that many bytes of JSON `{files: [{path, size, mtime?}]}` (paths relative to `dir`), then each file''s bytes in that order. Planned whole before the first write — a taken name under `conflict=fail` is ONE 409 naming them all; a member''s batch is one `write-as extract` (409 EUPGRADE until `agenthub server install-system` is re-run). 400 EBADBODY for a malformed or short body. 400 EBADPATH/EBADNAME, 403 ESECRET/EFOREIGN/EREADONLY (another user''s home)/EBADORIGIN, 404 ENOFILE/ENOHOME, 409 EEXISTS (with `error.names`)/EUPGRADE/EMEMBERGONE, 413 ETOOBIG.'
operationId: homeFsUploadBatch
parameters:
- name: who
in: path
required: true
schema:
type: string
description: '`me`, or another user''s name (an admin''s read-only view).'
- name: dir
in: query
schema:
type: string
default: ''
- name: conflict
in: query
schema:
$ref: '#/components/schemas/FsConflict'
requestBody:
required: true
content:
application/octet-stream:
schema:
type: string
format: binary
responses:
'201':
description: '`{saved, skipped, paths}`'
content:
application/json:
schema:
type: object
properties:
saved:
type: integer
skipped:
type: integer
paths:
type: array
items:
type: string
/api/homes/{who}/fs/zip:
get:
tags: