From 8e4c40eb5f92c2fa46700059c5dce9c891e0b9f5 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Wed, 14 Oct 2026 21:25:01 -0700 Subject: [PATCH] Add web push notifications for new inbox items --- api/openapi.yaml | 76 ++++- docs/operations.md | 13 + docs/plan.md | 3 +- go.mod | 3 + go.sum | 56 ++++ internal/api/api.gen.go | 300 +++++++++++++----- .../TestCommitIdentityHooksAndMCP.jsonl | 71 ++--- .../testdata/transcripts/TestImageInput.jsonl | 14 +- .../testdata/transcripts/TestInterrupt.jsonl | 33 +- .../transcripts/TestResume-first.jsonl | 14 +- .../transcripts/TestResume-resumed.jsonl | 16 +- .../transcripts/TestStopHookBlocks.jsonl | 30 +- .../testdata/transcripts/TestTextDeltas.jsonl | 14 +- internal/push/push.go | 251 +++++++++++++++ internal/push/push_test.go | 170 ++++++++++ internal/server/push.go | 63 ++++ internal/server/server.go | 22 +- internal/server/server_test.go | 64 +++- internal/store/push.go | 124 ++++++++ internal/store/store.go | 27 +- web/dist/api.js | 4 + web/dist/api.js.map | 2 +- web/dist/app.js | 6 + web/dist/app.js.map | 2 +- web/dist/panes.js | 4 +- web/dist/panes.js.map | 2 +- web/dist/settings.js | 114 +++++++ web/dist/settings.js.map | 1 + web/dist/sw.js | 28 ++ web/dist/sw.js.map | 1 + web/package.json | 2 +- web/src/api.gen.ts | 163 ++++++++++ web/src/api.ts | 7 +- web/src/app.ts | 7 + web/src/panes.ts | 6 +- web/src/settings.ts | 131 ++++++++ web/src/sw.ts | 33 ++ web/style.css | 38 +++ web/tsconfig.json | 3 +- web/tsconfig.sw.json | 8 + 40 files changed, 1724 insertions(+), 202 deletions(-) create mode 100644 internal/push/push.go create mode 100644 internal/push/push_test.go create mode 100644 internal/server/push.go create mode 100644 internal/store/push.go create mode 100644 web/dist/settings.js create mode 100644 web/dist/settings.js.map create mode 100644 web/dist/sw.js create mode 100644 web/dist/sw.js.map create mode 100644 web/src/settings.ts create mode 100644 web/src/sw.ts create mode 100644 web/tsconfig.sw.json diff --git a/api/openapi.yaml b/api/openapi.yaml index 75c5d2f..aa0a208 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -27,6 +27,54 @@ paths: schema: { $ref: "#/components/schemas/User" } "400": { $ref: "#/components/responses/Error" } + /api/me/notifications: + put: + operationId: updateNotificationPrefs + description: Sets which inbox items the calling user is sent push notifications for. + requestBody: + required: true + content: + application/json: + schema: { $ref: "#/components/schemas/NotificationPrefs" } + responses: + "200": + description: The updated user. + content: + application/json: + schema: { $ref: "#/components/schemas/User" } + "400": { $ref: "#/components/responses/Error" } + + /api/me/push-subscriptions: + post: + operationId: addPushSubscription + description: Registers a browser's push subscription for the calling user. Registering an endpoint again replaces it. + requestBody: + required: true + content: + application/json: + schema: { $ref: "#/components/schemas/PushSubscription" } + responses: + "204": + description: Registered. + "400": { $ref: "#/components/responses/Error" } + delete: + operationId: removePushSubscription + parameters: + - { name: endpoint, in: query, required: true, schema: { type: string } } + responses: + "204": + description: Removed, or was not registered. + + /api/push/key: + get: + operationId: getPushKey + responses: + "200": + description: The server's VAPID public key, the applicationServerKey for PushManager.subscribe. + content: + application/json: + schema: { $ref: "#/components/schemas/PushKey" } + /api/projects: get: operationId: listProjects @@ -474,12 +522,38 @@ components: User: type: object - required: [login, display_name, git_name, git_email] + required: [login, display_name, git_name, git_email, notification_prefs] properties: login: { type: string } display_name: { type: string } git_name: { type: string } git_email: { type: string } + notification_prefs: { $ref: "#/components/schemas/NotificationPrefs" } + + NotificationPrefs: + type: object + description: Which new inbox items send this user a push notification. + required: [blocking_questions, questions, reports, errors, rate_limits] + properties: + blocking_questions: { type: boolean, description: "Questions asked with blocking: true. On by default." } + questions: { type: boolean, description: Non-blocking questions. } + reports: { type: boolean, description: Turn summaries. } + errors: { type: boolean, description: session_error items. } + rate_limits: { type: boolean, description: rate_limited items. } + + PushSubscription: + type: object + required: [endpoint, p256dh, auth] + properties: + endpoint: { type: string } + p256dh: { type: string, description: The subscription's p256dh key, base64url. } + auth: { type: string, description: The subscription's auth secret, base64url. } + + PushKey: + type: object + required: [public_key] + properties: + public_key: { type: string, description: Base64url, uncompressed P-256 point. } UserUpdate: type: object diff --git a/docs/operations.md b/docs/operations.md index 0dddc82..a6766e9 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -9,6 +9,7 @@ - `internal/git`: worktrees, the task changes view (see "Changes"), unmerged-change summaries and squash merges. - `internal/agents`: the agent session manager. It owns the running Claude processes and records their activity as events. - `internal/claude`: the Claude Code stream-json client (see `docs/claude-protocol.md`). +- `internal/push`: web push notifications for new inbox items (see "Notifications"). - `web/`: the SPA, frameworkless TypeScript compiled file-by-file to ES modules (no bundler). `web/src/*.ts` is the source; `web/src/api.gen.ts` holds types generated from `api/openapi.yaml`, and `web/src/api.ts` is the typed client over them. `go generate ./web` runs `npm ci`, regenerates the types and compiles `web/dist/`, which is committed so `go install` needs no Node. The binary embeds `index.html`, `style.css`, `dist/` and `src/` (for source maps). `byre serve --dev` serves `./web` from disk instead (run from the repo root); pair it with `npm --prefix web exec tsc -- --watch`. ## Data @@ -103,6 +104,18 @@ Agents ask questions with the `ask_human` MCP tool. Each question carries a `con | `snooze` | any | stays `open`, hidden until `snooze_until` | | `dismiss` | reports, errors | `dismissed` | +## Notifications + +New inbox items are sent as web push notifications to every browser a user has turned them on in. Web push needs a secure origin and a service worker; byre gets the origin from the `tailscale serve` certificate, and serves the worker at `/sw.js` (compiled from `web/src/sw.ts` with its own `web/tsconfig.sw.json`, since it needs the WebWorker library instead of the DOM one) so its scope is the whole SPA. + +- **Keys.** byre generates a VAPID key pair on its first start and keeps it in the `vapid_keys` table; `GET /api/push/key` returns the public half, which browsers pass to `PushManager.subscribe`. Replacing the keys invalidates every subscription. +- **Subscriptions.** `POST /api/me/push-subscriptions` stores a browser's endpoint, `p256dh` and `auth` in `push_subscriptions` under the calling user (re-posting an endpoint replaces it), along with `https://` plus the request's `Host`, which becomes the VAPID `sub` claim. `DELETE /api/me/push-subscriptions?endpoint=` removes one. A push service answering 404 or 410 means the subscription expired, and byre deletes it. +- **Preferences.** `users.notification_prefs` holds which item kinds notify the user, returned as `notification_prefs` on `GET /api/me` and set with `PUT /api/me/notifications`: `blocking_questions` (on by default), `questions` (non-blocking), `reports`, `errors` (`session_error`) and `rate_limits`. +- **Sending.** `internal/push` watches the event stream for `inbox.created`. The first item starts a 3-second window (`pushWindow` in `internal/server/server.go`); everything that arrives inside it goes out together, so each subscribed user gets at most one notification per window, built from the items their preferences select. One item reads `byre · ` with the question (or the report's first line, the error, or "Rate limited") as the body; several read `byre · N new inbox items` with one `: ` line each. Encryption and VAPID signing are `github.com/SherClockHolmes/webpush-go`. Notifications carry a 24-hour TTL and `Urgency: high` when any item is blocking. Delivery failures are logged, not retried. +- **Clicking** a notification opens the first item's task (`/#/task/`): the worker focuses an open byre window and tells it to switch task, or opens a new one. + +The **Settings** tab turns notifications on or off for the current browser (asking for permission on the way) and edits the preferences. Opening it re-registers the browser's existing subscription, which restores one byre deleted as expired. + In the UI a question offers its options plus Other, whose text box is the only text field; a report has only an OK button, which dismisses it at once; an error offers Dismiss, Reply (`other`) and Snooze. Answers reach the agent as one message, listing each answer under the question or error it responds to, once the session is idle and none of its blocking questions are still waiting for the human. An `other` answer to a question tells the agent that if it asks something back, it should answer with `ask_human` using the item's `thread_id`. Every item change is an `inbox.created` or `inbox.updated` event carrying the whole item, including who resolved it. diff --git a/docs/plan.md b/docs/plan.md index 8e4d33c..f92c6e9 100644 --- a/docs/plan.md +++ b/docs/plan.md @@ -477,8 +477,7 @@ Record transcripts from the spike as the seed of the contract test suite. - **M0 — Skeleton.** launchd service, tailscale serve auth, SQLite schema, OpenAPI spec, projects, tasks, worktree create/delete, event log, SSE stream with resume, embedded SPA shell, basic server observability. - **Status: done**, and running as a service on the Mac Studio. Observability covers queue state and vendor rate-limit status, through `GET /api/admin/status` and the SPA's Admin view; process liveness and stuck-process detection, adapter parse errors, and per-task snapshot counts and disk usage are not done. - **M1 — One agent end to end (Claude).** Sessions, streaming, messaging, the interface coverage for Claude, the `ask_human` MCP tool, turn summaries, inbox with all views and response types, web push notifications, restart-and-resume, concurrency caps. - - **Done:** sessions, streaming, messaging, interrupt; `ask_human` with validation; each turn's final message filed to the inbox as its summary; inbox with global, project, and task views and every response type, answered as one batch and delivered to the agent as one message; restart-and-resume; global and per-vendor caps with queueing; rate limits as their own inbox state; the web UI (two panes, task switcher, transcript, inbox) with Markdown rendering; the session instructions from "Session configuration", given as an appended system prompt and a per-turn reminder; per-turn commits by byre; bouncing questions asked in plain prose. - - **Not done:** web push notifications. Compaction is done, as a handoff into a fresh session; model switching is done, per message; image input is done, pasted or dropped into the composer and stored as blobs. + - **Done:** sessions, streaming, messaging, interrupt; `ask_human` with validation; each turn's final message filed to the inbox as its summary; inbox with global, project, and task views and every response type, answered as one batch and delivered to the agent as one message; restart-and-resume; global and per-vendor caps with queueing; rate limits as their own inbox state; the web UI (two panes, task switcher, transcript, inbox) with Markdown rendering; the session instructions from "Session configuration", given as an appended system prompt and a per-turn reminder; per-turn commits by byre; bouncing questions asked in plain prose; web push notifications through a service worker, with per-user preferences (blocking questions by default, other kinds opt-in) set in a Settings tab, bursts collapsed into one notification, and a click opening the task. Compaction is done, as a handoff into a fresh session; model switching is done, per message; image input is done, pasted or dropped into the composer and stored as blobs. - **Later:** subagent views and Mermaid rendering. - **M2 — Seeing the work.** Temp-index diffs and stats, snapshots, timeline scrubbing, terminals, file browser, previews. - **Done:** temp-index diffs and stats, with a Changes view. diff --git a/go.mod b/go.mod index 259b40d..217a446 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,14 @@ module g.fc.run/misc/byre go 1.26.0 require ( + github.com/SherClockHolmes/webpush-go v1.4.0 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/getkin/kin-openapi v0.142.0 // indirect github.com/go-openapi/jsonpointer v0.23.1 // indirect github.com/go-openapi/swag/jsonname v0.26.0 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/google/uuid v1.6.0 // indirect github.com/mattn/go-isatty v0.0.24 // indirect github.com/ncruces/go-strftime v1.0.0 // indirect @@ -22,6 +24,7 @@ require ( github.com/speakeasy-api/openapi v1.24.0 // indirect github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.46.0 // indirect golang.org/x/mod v0.41.0 // indirect golang.org/x/sync v0.23.0 // indirect golang.org/x/sys v0.48.0 // indirect diff --git a/go.sum b/go.sum index 0cc5f0f..99b52c0 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,6 @@ github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= +github.com/SherClockHolmes/webpush-go v1.4.0 h1:ocnzNKWN23T9nvHi6IfyrQjkIc0oJWv1B1pULsf9i3s= +github.com/SherClockHolmes/webpush-go v1.4.0/go.mod h1:XSq8pKX11vNV8MJEMwjrlTkxhAj1zKfxmyhdV7Pd6UA= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= @@ -21,6 +23,8 @@ github.com/go-openapi/jsonpointer v0.23.1/go.mod h1:iWRmZTrGn7XwYhtPt/fvdSFj1OfN github.com/go-openapi/swag/jsonname v0.26.0 h1:gV1NFX9M8avo0YSpmWogqfQISigCmpaiNci8cGECU5w= github.com/go-openapi/swag/jsonname v0.26.0/go.mod h1:urBBR8bZNoDYGr653ynhIx+gTeIz0ARZxHkAPktJK2M= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -34,6 +38,7 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -85,12 +90,25 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk= github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= +golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.41.0 h1:qJmnOUb4YB+FsEuM3HcWucdZASCPGhsX6uljO6pog0c= golang.org/x/mod v0.41.0/go.mod h1:Ek9pY8RKWXwsWvd3rQiHYtMqkjSUV+s1Rj7j4H5Ur6o= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -98,11 +116,24 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.23.0 h1:KameEIfc1IkluZyXWLn39Wd4tURc6GbCiISGiZm2bQk= golang.org/x/sync v0.23.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -119,19 +150,44 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.48.0 h1:bbX/i/6MgT9BVLM9RT1thmxL04yeTAhbEz4SyadbXoo= golang.org/x/sys v0.48.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/text v0.40.0 h1:Ub2Z6/xjgF1WrYQz2nuITOEegKFtiIy+rieRJ5lHZKs= golang.org/x/text v0.40.0/go.mod h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.50.0 h1:c2ifzfcuY7L90lZ2aKd8S4K2NpASF08SZx9ZuJkHmSU= golang.org/x/tools v0.50.0/go.mod h1:7ulVMw3831Mwi5EZD6RomGyffr4VFjuNYXf2BbCEAV0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/internal/api/api.gen.go b/internal/api/api.gen.go index 911786e..0bd4ce2 100644 --- a/internal/api/api.gen.go +++ b/internal/api/api.gen.go @@ -439,6 +439,24 @@ type MessageCreate struct { Text string `json:"text"` } +// NotificationPrefs Which new inbox items send this user a push notification. +type NotificationPrefs struct { + // BlockingQuestions Questions asked with blocking: true. On by default. + BlockingQuestions bool `json:"blocking_questions"` + + // Errors session_error items. + Errors bool `json:"errors"` + + // Questions Non-blocking questions. + Questions bool `json:"questions"` + + // RateLimits rate_limited items. + RateLimits bool `json:"rate_limits"` + + // Reports Turn summaries. + Reports bool `json:"reports"` +} + // Project defines model for Project. type Project struct { CreatedAt time.Time `json:"created_at"` @@ -456,6 +474,22 @@ type ProjectCreate struct { RepoPath string `json:"repo_path"` } +// PushKey defines model for PushKey. +type PushKey struct { + // PublicKey Base64url + PublicKey string `json:"public_key"` +} + +// PushSubscription defines model for PushSubscription. +type PushSubscription struct { + // Auth The subscription's auth secret + Auth string `json:"auth"` + Endpoint string `json:"endpoint"` + + // P256dh The subscription's p256dh key + P256dh string `json:"p256dh"` +} + // SessionCreate defines model for SessionCreate. type SessionCreate struct { // Images Blob ids from uploadBlob, sent to the agent as images alongside the prompt. @@ -554,6 +588,9 @@ type User struct { GitEmail string `json:"git_email"` GitName string `json:"git_name"` Login string `json:"login"` + + // NotificationPrefs Which new inbox items send this user a push notification. + NotificationPrefs NotificationPrefs `json:"notification_prefs"` } // UserUpdate defines model for UserUpdate. @@ -576,6 +613,11 @@ type ListInboxParams struct { IncludeSnoozed *bool `form:"include_snoozed,omitempty" json:"include_snoozed,omitempty"` } +// RemovePushSubscriptionParams defines parameters for RemovePushSubscription. +type RemovePushSubscriptionParams struct { + Endpoint string `form:"endpoint" json:"endpoint"` +} + // GetTaskChangesParams defines parameters for GetTaskChanges. type GetTaskChangesParams struct { // Since A commit to compare with instead of the merge-base, such as a user.message event's head. @@ -602,6 +644,12 @@ type RespondInboxJSONRequestBody = InboxRespond // UpdateMeJSONRequestBody defines body for UpdateMe for application/json ContentType. type UpdateMeJSONRequestBody = UserUpdate +// UpdateNotificationPrefsJSONRequestBody defines body for UpdateNotificationPrefs for application/json ContentType. +type UpdateNotificationPrefsJSONRequestBody = NotificationPrefs + +// AddPushSubscriptionJSONRequestBody defines body for AddPushSubscription for application/json ContentType. +type AddPushSubscriptionJSONRequestBody = PushSubscription + // CreateProjectJSONRequestBody defines body for CreateProject for application/json ContentType. type CreateProjectJSONRequestBody = ProjectCreate @@ -644,6 +692,15 @@ type ServerInterface interface { // (PUT /api/me) UpdateMe(w http.ResponseWriter, r *http.Request) + // (PUT /api/me/notifications) + UpdateNotificationPrefs(w http.ResponseWriter, r *http.Request) + + // (DELETE /api/me/push-subscriptions) + RemovePushSubscription(w http.ResponseWriter, r *http.Request, params RemovePushSubscriptionParams) + + // (POST /api/me/push-subscriptions) + AddPushSubscription(w http.ResponseWriter, r *http.Request) + // (GET /api/projects) ListProjects(w http.ResponseWriter, r *http.Request) @@ -659,6 +716,9 @@ type ServerInterface interface { // (POST /api/projects/{projectId}/tasks) CreateTask(w http.ResponseWriter, r *http.Request, projectId string) + // (GET /api/push/key) + GetPushKey(w http.ResponseWriter, r *http.Request) + // (GET /api/sessions/{sessionId}) GetSession(w http.ResponseWriter, r *http.Request, sessionId string) @@ -959,6 +1019,67 @@ func (siw *ServerInterfaceWrapper) UpdateMe(w http.ResponseWriter, r *http.Reque handler.ServeHTTP(w, r) } +// UpdateNotificationPrefs operation middleware +func (siw *ServerInterfaceWrapper) UpdateNotificationPrefs(w http.ResponseWriter, r *http.Request) { + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.UpdateNotificationPrefs(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + +// RemovePushSubscription operation middleware +func (siw *ServerInterfaceWrapper) RemovePushSubscription(w http.ResponseWriter, r *http.Request) { + + var err error + _ = err + + // Parameter object where we will unmarshal all parameters from the context + var params RemovePushSubscriptionParams + + // ------------- Required query parameter "endpoint" ------------- + + err = runtime.BindQueryParameterWithOptions("form", true, true, "endpoint", r.URL.Query(), ¶ms.Endpoint, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) + if err != nil { + var requiredError *runtime.RequiredParameterError + if errors.As(err, &requiredError) { + siw.ErrorHandlerFunc(w, r, &RequiredParamError{ParamName: "endpoint"}) + } else { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "endpoint", Err: err}) + } + return + } + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.RemovePushSubscription(w, r, params) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + +// AddPushSubscription operation middleware +func (siw *ServerInterfaceWrapper) AddPushSubscription(w http.ResponseWriter, r *http.Request) { + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.AddPushSubscription(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + // ListProjects operation middleware func (siw *ServerInterfaceWrapper) ListProjects(w http.ResponseWriter, r *http.Request) { @@ -1065,6 +1186,20 @@ func (siw *ServerInterfaceWrapper) CreateTask(w http.ResponseWriter, r *http.Req handler.ServeHTTP(w, r) } +// GetPushKey operation middleware +func (siw *ServerInterfaceWrapper) GetPushKey(w http.ResponseWriter, r *http.Request) { + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetPushKey(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + // GetSession operation middleware func (siw *ServerInterfaceWrapper) GetSession(w http.ResponseWriter, r *http.Request) { @@ -1651,6 +1786,10 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/me", wrapper.GetMe) m.HandleFunc(http.MethodPut+" "+options.BaseURL+"/api/me", wrapper.UpdateMe) + m.HandleFunc(http.MethodPut+" "+options.BaseURL+"/api/me/notifications", wrapper.UpdateNotificationPrefs) + m.HandleFunc(http.MethodDelete+" "+options.BaseURL+"/api/me/push-subscriptions", wrapper.RemovePushSubscription) + m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/me/push-subscriptions", wrapper.AddPushSubscription) + m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/push/key", wrapper.GetPushKey) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/projects", wrapper.ListProjects) m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/projects", wrapper.CreateProject) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/projects/{projectId}", wrapper.GetProject) @@ -1686,82 +1825,91 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H // const string: with thousands of chunks the chained `+` fold is several // times slower for the Go compiler than parsing a slice literal. var swaggerSpec = []string{ - "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", + "/w==", } // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, diff --git a/internal/claude/testdata/transcripts/TestCommitIdentityHooksAndMCP.jsonl b/internal/claude/testdata/transcripts/TestCommitIdentityHooksAndMCP.jsonl index 4bddfd2..cad6304 100644 --- a/internal/claude/testdata/transcripts/TestCommitIdentityHooksAndMCP.jsonl +++ b/internal/claude/testdata/transcripts/TestCommitIdentityHooksAndMCP.jsonl @@ -1,37 +1,36 @@ -{"dir":"send","msg":{"request":{"hooks":{"PostToolUse":[{"hookCallbackIds":["hook_0"],"matcher":""}]},"subtype":"initialize"},"request_id":"req_58aa0d7495e03ef1","type":"control_request"}} -{"dir":"recv","msg":{"type":"control_request","request_id":"efd76783-946a-4449-9bb4-c9384883f697","request":{"subtype":"mcp_message","server_name":"byre","message":{"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"claude-code","title":"Claude Code","description":"Anthropic's agentic coding tool","websiteUrl":"https://claude.com/claude-code","version":"2.1.296"}},"jsonrpc":"2.0","id":0}}}} -{"dir":"send","msg":{"response":{"request_id":"efd76783-946a-4449-9bb4-c9384883f697","response":{"mcp_response":{"jsonrpc":"2.0","id":0,"result":{"capabilities":{"tools":{}},"protocolVersion":"2025-06-18","serverInfo":{"name":"byre","version":"0.0.0"}}}},"subtype":"success"},"type":"control_response"}} -{"dir":"recv","msg":{"type":"control_response","response":{"subtype":"success","request_id":"req_58aa0d7495e03ef1","response":{"commands":[{"name":"deep-research","description":"Deep research harness — fan-out web searches, fetch sources, adversarially verify claims, synthesize a cited report. (dynamic workflow)","argumentHint":"","builtin":true},{"name":"design","description":"Make a new Design artifact from a brief","argumentHint":"[what to design]","builtin":true},{"name":"slides","description":"Make a new Slides deck artifact from a brief","argumentHint":"[what the deck is about]","builtin":true},{"name":"design-sync","description":"Push a React design system to claude.ai/design. This runs a converter that bundles the real component code (from Storybook or a bare package) and uploads it. Use when the user runs /design-sync or says \"sync my design system to Claude Design\".","argumentHint":"[\u003cproject hint, e.g. \"Acme DS\"\u003e]","builtin":true},{"name":"dataviz","description":"Use this skill whenever you are about to create ANY chart, graph, plot, dashboard, or data visualization, in ANY output medium — an HTML or React artifact, inline SVG, plotting code in any library (matplotlib, plotly, d3, Recharts, …), an image/PNG you will render and upload, or a chart shared into Slack. Read it BEFORE writing the first line of chart code, choosing chart colors, building a stat tile / meter / KPI row, or laying out a dashboard. When the destination is a first-party document connector (host-designated, never self-described) that renders live charts, hand it the rows (inline, or as an uploaded data file the chart cites) rather than a rendered PNG/SVG — a picture of a chart loses hover, data inspection and per-value comments. Produces visualizations that read as one system — elegant, accessible, consistent in light and dark — using a brand-neutral placeholder palette you swap for your own. Teaches a design-system-agnostic method: a form heuristic, a color formula with a runnable validator, mark specs, and interaction rules. A validated default palette is documented in `references/palette.md` — swap that file's values for your brand's. Triggers on: \"chart\", \"graph\", \"plot\", \"data viz\", \"visualization\", \"dashboard\", \"analytics\", \"visualize data\", \"categorical colors\", \"sequential / diverging palette\", \"stat tile\", \"sparkline\", \"heatmap\", \"legend\", \"axis\", \"tooltip\", \"chart colors\", \"color by series\".","argumentHint":"","builtin":true},{"name":"artifact-diagramming","description":"Diagramming know-how for Artifacts - when a picture earns its place, how to draw one that shows the real mechanism, and the inline-SVG mechanics that keep it legible in both themes.","argumentHint":"","builtin":true},{"name":"artifact-capabilities","description":"Runtime capabilities a published Artifact page can be granted — behavior static HTML cannot provide on its own, such as the page reading live or connected data, remembering what people do on it (a poll, a sign-up sheet, a checklist, a document edited in place — it saves new versions of itself), keeping state shared across viewers, knowing who is viewing, asking Claude a question of its own, storing files people add, handing the viewer a file to save, or using the viewer's camera, microphone, location, screen or device motion. Serves this user's live capability roster and the typed call definitions. Load it whenever any such runtime behavior would make an artifact more useful, before writing the page.","argumentHint":"","builtin":true},{"name":"update-config","description":"Use this skill to configure the Claude Code harness via settings.json. Automated behaviors (\"from now on when X\", \"each time X\", \"whenever X\", \"before/after X\") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions (\"allow X\", \"add permission\", \"move permission to\"), env vars (\"set X=Y\"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: \"allow npm commands\", \"add bq permission to global settings\", \"move permission to user settings\", \"set DEBUG=true\", \"when claude stops show X\". For simple settings like theme/model, suggest the /config command.","argumentHint":"","builtin":true},{"name":"verify","description":"Verify that a code change actually does what it's supposed to by exercising it end-to-end and observing behavior — drive the affected flow, not just tests or typecheck. Run before committing nontrivial changes; bootstraps this repo's project verify skill if none exists yet. Don't invoke it on a diff that only touches tests, docs, or other code with no runtime surface to drive (a change to product source always has one) — there's nothing to observe.","argumentHint":"","builtin":true},{"name":"debug","description":"Enable debug logging for this session and help diagnose issues","argumentHint":"[issue description]","builtin":true},{"name":"code-review","description":"Review the current diff, or a PR number/branch/path target, for correctness bugs (plus reuse/simplification/efficiency cleanups where the model's review recipe covers them) at the given effort level (low|medium|high|xhigh|max: from few high-confidence findings up to many, some of them uncertain; ultra: deep multi-agent review in the cloud); with no level given, it reuses the level you typed last. Pass --comment to post findings as inline PR comments, or --fix to apply the findings to the working tree after the review. Pass --max-findings \u003cn\u003e to report up to n findings, or --max-findings all for every finding. The choice stays until you pass --max-findings default. For ultra on a GitHub.com PR target, --post asks to post the finished review’s findings to the PR as a single comment from the user’s GitHub account (not a review; the launch dialog still confirms in interactive sessions, while non-interactive mode posts on the flag alone) and --no-post hides that option.","argumentHint":"[low|medium|high|xhigh|max|ultra] [--fix] [--comment] [\u003cpr#\u003e|\u003cbranch\u003e|\u003cpath\u003e] [--max-findings \u003cn\u003e|all]","aliases":["review"],"builtin":true},{"name":"simplify","description":"Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.","argumentHint":"[\u003ctarget\u003e]","builtin":true},{"name":"batch","description":"Research and plan a large-scale change, then execute it in parallel across 5–30 isolated worktree agents that each open a PR.","argumentHint":"\u003cinstruction\u003e","builtin":true},{"name":"fewer-permission-prompts","description":"Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.","argumentHint":"","builtin":true},{"name":"doctor","description":"Health-check the user's Claude Code setup and fix issues: diagnose installation health — what the `claude doctor` terminal diagnostics cover — from local data (duplicate or leftover installs, PATH, unparseable settings files, broken or colliding agent definitions, skills whose frontmatter fails to parse); find unused skills, MCP servers, and plugins versus their context cost and disable dead weight; deduplicate local CLAUDE.md files against checked-in ones; trim checked-in CLAUDE.md files by cutting content a session could derive from the codebase (directory layouts, tech-stack lists, architecture overviews) while keeping gotchas, rationale, and non-standard conventions; migrate always-loaded CLAUDE.md guidance into lazy skills and nested CLAUDE.md files; flag slow hooks and context-heavy extensions; check the installed version is current; make auto mode the default permission mode; and pre-approve frequently denied read-only commands. Use when the user asks for a doctor run, checkup, audit, tune-up, or cleanup of their Claude Code setup or configuration.","argumentHint":"[prompt-audit [\u003cpath\u003e]]","aliases":["checkup"],"builtin":true},{"name":"loop","description":"Run a prompt or slash command on a recurring interval (e.g. /loop 5m /foo). Omit the interval to let the model self-pace.","argumentHint":"[interval] [prompt]","aliases":["proactive"],"builtin":true},{"name":"schedule","description":"Create, update, list, or run scheduled cloud agents (routines) that execute on a cron schedule.","argumentHint":"","aliases":["routines"],"builtin":true},{"name":"claude-api","description":"Reference for the Claude API / Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude/Anthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing/model choice/limits/caching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent/MCP/tool-definition/multi-agent/RAG/LLM-judge/computer-use; generate/summarize/extract/classify/rewrite/converse over NL; debugging refusals/cutoffs/streaming/tool-calls/tokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).","argumentHint":"","builtin":true},{"name":"workflow-authoring","description":"Reference for writing a Workflow tool script (script API and gotchas, resume, quality patterns, worked examples). Load before authoring a script for a workflow the user already opted into; it does not itself authorize running one.","argumentHint":"","builtin":true},{"name":"run","description":"Launch and drive this project's app to see a change working. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real app (not just tests). First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns per project type (CLI, server, TUI, Electron, browser-driven, library).","argumentHint":"","builtin":true},{"name":"run-skill-generator","description":"Author or improve the run-\u003cunit\u003e skill - a per-project skill that tells agents how to build, launch, and drive this project's app. Use when the user asks to set up the project, get it running, write run instructions, or verify build/run steps work from a clean environment.","argumentHint":"","builtin":true},{"name":"plugin-authoring","description":"Make a mod: a change to Claude's own interface or behaviour, such as a live pane or panel, a band above the prompt, a status line, a toast, a slash command, or a hook on tool calls or prompts. Use to make, change or debug a mod or its hooks module.","argumentHint":"","builtin":true},{"name":"advisor","description":"Let Claude consult a stronger model at key moments","argumentHint":"[fable|opus|sonnet|off]","builtin":true},{"name":"agents","description":"(removed) Ask Claude to create/manage subagents, or edit .claude/agents/","argumentHint":"","builtin":true},{"name":"auto-mode-setup","description":"Teach auto mode about your environment, plus optional rule tweaks","argumentHint":"[--request-id \u003cuuid\u003e] (--wizard posture=… scope=… depth=… --propose | --expect-sha256 \u003c64-hex\u003e --apply-file \u003cpath\u003e)","builtin":true},{"name":"autocompact","description":"Configure the auto-compact window size","argumentHint":"[auto|\u003ctokens\u003e]","builtin":true},{"name":"clear","description":"Start a new session with empty context; previous session stays on disk (resumable with /resume)","argumentHint":"[name]","aliases":["reset","new"],"builtin":true},{"name":"color","description":"Set the prompt bar color for this session","argumentHint":"[red|blue|green|yellow|purple|orange|pink|cyan|default]","builtin":true},{"name":"compact","description":"Free up context by summarizing the conversation so far","argumentHint":"\u003coptional custom summarization instructions\u003e","builtin":true},{"name":"config","description":"Set a setting by key","argumentHint":"key=value","aliases":["settings"],"builtin":true},{"name":"output-style","description":"List output styles or switch to one","argumentHint":"[style]","builtin":true},{"name":"context","description":"Show current context usage","argumentHint":"","builtin":true},{"name":"effort","description":"Set effort level for model usage","argumentHint":"\u003clow|medium|high|xhigh|max|auto|ultracode [on|off]\u003e","builtin":true},{"name":"fast","description":"Toggle fast mode (Opus 5.5)","argumentHint":"[on|off]","builtin":true},{"name":"focus","description":"Toggle focus view: just your prompt, summary, and response","argumentHint":"[on|off]","builtin":true},{"name":"heapdump","description":"Dump the JS heap to the Desktop; on Linux with no Desktop folder, the home directory","argumentHint":"","builtin":true},{"name":"init","description":"Initialize a new CLAUDE.md file with codebase documentation","argumentHint":"","builtin":true},{"name":"mcp","description":"Manage MCP servers","argumentHint":"[reconnect|enable|disable [\u003cserver\u003e|all]]","builtin":true},{"name":"import","description":"Import config from another AI coding agent","argumentHint":"","builtin":true},{"name":"model","description":"Set the AI model for Claude Code","argumentHint":"\u003cmodel\u003e","builtin":true},{"name":"__remote-workflow","description":"Run the workflow script delivered in this session environment (server-launched sessions only)","argumentHint":"","builtin":true},{"name":"workflow-launch-exec","description":"Execute a server-launched workflow handoff (workflow_launch event sessions only)","argumentHint":"","builtin":true},{"name":"reload-plugins","description":"Activate pending plugin changes in the current session","argumentHint":"[--force]","builtin":true},{"name":"reload-skills","description":"Pick up skills added or changed on disk during this session","argumentHint":"","builtin":true},{"name":"rename","description":"Rename the current conversation","argumentHint":"[name]","aliases":["name"],"builtin":true},{"name":"ultrareview","description":"Start a cloud agent that finds and verifies bugs in your branch (~15-25 min, $5-$25 USD) · Runs in a cloud session. See https://code.claude.com/docs/en/claude-code-on-the-web","argumentHint":"","builtin":true},{"name":"security-review","description":"Complete a security review of the pending changes on the current branch","argumentHint":"","builtin":true},{"name":"usage-credits","description":"Configure usage credits or request them from your admin when you hit a limit","argumentHint":"","builtin":true},{"name":"extra-usage","description":"Renamed to /usage-credits","argumentHint":"","builtin":true},{"name":"usage","description":"Show session cost, plan usage, and what's contributing to your limits","argumentHint":"","aliases":["cost","stats"],"builtin":true},{"name":"insights","description":"Generate a report analyzing your Claude Code sessions","argumentHint":"","builtin":true},{"name":"recap","description":"Generate a one-line session recap now","argumentHint":"","builtin":true},{"name":"skill-doctor","description":"Show which loaded skills are unused and costing context","argumentHint":"","builtin":true},{"name":"goal","description":"Set a goal — keep working until the condition is met","argumentHint":"","builtin":true},{"name":"design-consent","description":"Grant Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"design-revoke","description":"Revoke Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"list-agents","description":"List subagents, teammates, and other Claude sessions you can message","argumentHint":"","aliases":["peers"],"builtin":true},{"name":"team-onboarding","description":"Help teammates ramp on Claude Code with a guide from your usage","argumentHint":"","builtin":true},{"name":"docs","description":"docs (editable docs people share and comment on; the default for any document, named as a doc or not: a document, report, proposal, resume, cover letter, letter, contract, policy, form, template, worksheet, essay, handbook, guide, how-to, cheat sheet, SOP or other writing to keep, share, collaborate on, send, submit, print or sign; a doc exports to Word, PDF, Markdown or Google Docs, so needing a file to send, attach, upload, submit or print is no reason to pick Word, and a file nobody asked for is a doc, not Word; a plan, comparison, summary or notes asked in chat stays in chat; a pasted claude.ai artifact link may be a doc: check with docs tools first; Word or another file format named, tracked changes wanted, or a .docx to change or use as a template → that format's skill): making one → if no docs-connector instructions are in context, call its `guide` (topic.instructions) first; then create the doc (headings only, no body) before any search, file read or plan, even with files attached. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docs"]},{"name":"docx","description":"Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx) or Word templates (.dotx). Triggers include: any mention of Microsoft Word Documents, such as 'Word doc', 'word document', '.docx', '.dotx', 'microsoft doc'. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a deliverable as a Word or .docx file (to download, email or print), use this skill. However, if they ask for a document, page, report, memo, or notes WITHOUT naming a file format and the session offers Claude's own dedicated document or page skill or connector, use that instead, even if they will email or print it. Do NOT use for PDFs, spreadsheets, Google Docs, or coding unrelated to document generation. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docx"]},{"name":"google-workspace","description":"Read this before the first Google Drive, Docs, Sheets or Slides connector call whenever the task creates or changes a Google file. Use this skill whenever the user wants to create or change a Google Doc, Sheet or Slides file in their Google Drive. Triggers include: a request that names Google Docs, Sheets, Slides or Drive and asks to make, edit, format, copy or rename a file; a docs.google.com link with a request to change that file, even a one-line fix or suggested edits; and any follow-up change to a Google file from earlier in the chat, even \"change it\" or \"add a tab\". Includes helper scripts for document positions, cell ranges and slide layout. However, if the user asks for a doc, deck or spreadsheet without naming Google, or gives a Google file only as source material for something new, use Claude's own output type instead. Do NOT use for read-only questions about a Google file, or for Word, Excel, PowerPoint or PDF files. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:google-workspace"]},{"name":"import-memory","description":"Import a memory export from another AI assistant into Claude's memory — conversationally, additively, and with the content treated as data. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:import-memory"]},{"name":"morning","description":"Render the user's morning brief as a styled HTML artifact, or set it up as a recurring weekday task. Use only when the user explicitly asks to run, see, or set up their morning brief, or if they invoke /morning by name. A question about their day, schedule, or calendar is not by itself a request for the brief; answer it directly instead. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:morning"]},{"name":"pdf","description":"Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pdf"]},{"name":"pptx","description":"Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations as PowerPoint (.pptx) files; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email, summary, or creating a different type of slide deck); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user asks for a PowerPoint or .pptx file, or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. However, when the user asks for a deck, slides, a slide deck, or a presentation without naming a file format, default to using a dedicated slide-deck artifact type or a separate slides skill if this session offers one; otherwise, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pptx"]},{"name":"skill-creator","description":"Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:skill-creator"]},{"name":"xlsx","description":"Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .xltx, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:xlsx"]}],"agents":[{"name":"claude","description":"Catch-all for any task that doesn't fit a more specific agent. FleetView's default when no agent name is typed."},{"name":"claude-code-guide","description":"Use this agent when the user asks questions (\"Can Claude...\", \"Does Claude...\", \"How do I...\") about: (1) Claude Code (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - Messages API for directly passing messages to Claude, Tool Runner (`client.beta.messages.tool_runner`) for running an agentic loop over your own tools, manual tool-use loops, Managed Agents for server-hosted agents with a managed sandbox, prompt caching, and general Anthropic SDK usage; (4) Claude Tag (Claude in Slack) - what it is, setting it up for a Slack workspace, `/install-slack-app`; (5) `claude plugin eval` (writing and running plugin eval suites, its JSON/report, sandbox, CI) and the `/skill-doctor` report. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via SendMessage.","model":"haiku"},{"name":"Explore","description":"Fast read-only search agent for locating code. Use it to find files by pattern (eg. \"src/components/**/*.tsx\"), grep for symbols or keywords (eg. \"API endpoints\"), or answer \"where is X defined / which files reference Y.\" Do NOT use it for code review, design-doc auditing, cross-file consistency checks, or open-ended analysis — it reads excerpts rather than whole files and will miss content past its read window. When calling, specify search breadth: \"quick\" for a single targeted lookup, \"medium\" for moderate exploration, or \"very thorough\" to search across multiple locations and naming conventions.","model":"inherit"},{"name":"general-purpose","description":"General-purpose agent for researching complex questions, searching for code, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you."},{"name":"Plan","description":"Software architect agent for designing implementation plans. Use this when you need to plan the implementation strategy for a task. Returns step-by-step plans, identifies critical files, and considers architectural trade-offs.","model":"inherit"},{"name":"statusline-setup","description":"Use this agent to configure the user's Claude Code status line setting.","model":"sonnet"}],"output_style":"default","available_output_styles":["default","Proactive","Concise","Explanatory","Learning"],"user_output_styles_dir":"/Users/flamingcow/.claude/output-styles","models":[{"value":"default","resolvedModel":"claude-opus-5-5","displayName":"Default (recommended)","description":"Opus 5.5 · Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"opus","resolvedModel":"claude-opus-5-5","displayName":"Opus 5.5","description":"For complex work and everyday tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"fable","resolvedModel":"claude-fable-5-1","displayName":"Fable 5.1","description":"For your toughest challenges","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"sonnet","resolvedModel":"claude-sonnet-5-5","displayName":"Sonnet 5.5","description":"Most efficient for simpler tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"haiku","resolvedModel":"claude-haiku-5-5","displayName":"Haiku 5.5","description":"Fastest for quick answers","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-haiku-4-5-20251001","resolvedModel":"claude-haiku-4-5-20251001","displayName":"Haiku 4.5","description":"Fastest for quick answers"},{"value":"claude-sonnet-5","resolvedModel":"claude-sonnet-5","displayName":"Sonnet 5","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-5","resolvedModel":"claude-opus-5","displayName":"Opus 5","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-fable-5","resolvedModel":"claude-fable-5","displayName":"Fable 5","description":"Most capable for your hardest and longest-running tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-8","resolvedModel":"claude-opus-4-8","displayName":"Opus 4.8","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-opus-4-7","resolvedModel":"claude-opus-4-7","displayName":"Opus 4.7","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-6","resolvedModel":"claude-opus-4-6","displayName":"Opus 4.6","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-sonnet-4-6","resolvedModel":"claude-sonnet-4-6","displayName":"Sonnet 4.6","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true}],"account":{"email":"[redacted]","organization":"[redacted]'s Organization","subscriptionType":"Claude Max","apiProvider":"firstParty"},"pid":11243,"claude_code_version":"2.1.296","current_permission_mode":"bypassPermissions","hooks_applied":true,"feedback_mode":{"kind":"post"},"analytics_disabled":false,"remote_control_auto_enable":false,"remote_control_auto_connect_default":false,"remote_control_available":true,"remote_control_auto_on_by_default":false,"ide_rc_auto_enable_gate":true,"fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","session_state":"idle","capabilities":["ui_surface_v1"]},"pending_permission_requests":[],"pending_user_dialog_requests":[]}}} +{"dir":"send","msg":{"request":{"hooks":{"PostToolUse":[{"hookCallbackIds":["hook_0"],"matcher":""}]},"subtype":"initialize"},"request_id":"req_02e702779a0886a7","type":"control_request"}} +{"dir":"recv","msg":{"type":"control_request","request_id":"f9e50f30-3886-4042-891e-d0e7fc997c7d","request":{"subtype":"mcp_message","server_name":"byre","message":{"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"claude-code","title":"Claude Code","description":"Anthropic's agentic coding tool","websiteUrl":"https://claude.com/claude-code","version":"2.1.296"}},"jsonrpc":"2.0","id":0}}}} +{"dir":"send","msg":{"response":{"request_id":"f9e50f30-3886-4042-891e-d0e7fc997c7d","response":{"mcp_response":{"jsonrpc":"2.0","id":0,"result":{"capabilities":{"tools":{}},"protocolVersion":"2025-06-18","serverInfo":{"name":"byre","version":"0.0.0"}}}},"subtype":"success"},"type":"control_response"}} +{"dir":"recv","msg":{"type":"control_response","response":{"subtype":"success","request_id":"req_02e702779a0886a7","response":{"commands":[{"name":"deep-research","description":"Deep research harness — fan-out web searches, fetch sources, adversarially verify claims, synthesize a cited report. (dynamic workflow)","argumentHint":"","builtin":true},{"name":"design","description":"Make a new Design artifact from a brief","argumentHint":"[what to design]","builtin":true},{"name":"slides","description":"Make a new Slides deck artifact from a brief","argumentHint":"[what the deck is about]","builtin":true},{"name":"design-sync","description":"Push a React design system to claude.ai/design. This runs a converter that bundles the real component code (from Storybook or a bare package) and uploads it. Use when the user runs /design-sync or says \"sync my design system to Claude Design\".","argumentHint":"[\u003cproject hint, e.g. \"Acme DS\"\u003e]","builtin":true},{"name":"dataviz","description":"Use this skill whenever you are about to create ANY chart, graph, plot, dashboard, or data visualization, in ANY output medium — an HTML or React artifact, inline SVG, plotting code in any library (matplotlib, plotly, d3, Recharts, …), an image/PNG you will render and upload, or a chart shared into Slack. Read it BEFORE writing the first line of chart code, choosing chart colors, building a stat tile / meter / KPI row, or laying out a dashboard. When the destination is a first-party document connector (host-designated, never self-described) that renders live charts, hand it the rows (inline, or as an uploaded data file the chart cites) rather than a rendered PNG/SVG — a picture of a chart loses hover, data inspection and per-value comments. Produces visualizations that read as one system — elegant, accessible, consistent in light and dark — using a brand-neutral placeholder palette you swap for your own. Teaches a design-system-agnostic method: a form heuristic, a color formula with a runnable validator, mark specs, and interaction rules. A validated default palette is documented in `references/palette.md` — swap that file's values for your brand's. Triggers on: \"chart\", \"graph\", \"plot\", \"data viz\", \"visualization\", \"dashboard\", \"analytics\", \"visualize data\", \"categorical colors\", \"sequential / diverging palette\", \"stat tile\", \"sparkline\", \"heatmap\", \"legend\", \"axis\", \"tooltip\", \"chart colors\", \"color by series\".","argumentHint":"","builtin":true},{"name":"artifact-diagramming","description":"Diagramming know-how for Artifacts - when a picture earns its place, how to draw one that shows the real mechanism, and the inline-SVG mechanics that keep it legible in both themes.","argumentHint":"","builtin":true},{"name":"artifact-capabilities","description":"Runtime capabilities a published Artifact page can be granted — behavior static HTML cannot provide on its own, such as the page reading live or connected data, remembering what people do on it (a poll, a sign-up sheet, a checklist, a document edited in place — it saves new versions of itself), keeping state shared across viewers, knowing who is viewing, asking Claude a question of its own, storing files people add, handing the viewer a file to save, or using the viewer's camera, microphone, location, screen or device motion. Serves this user's live capability roster and the typed call definitions. Load it whenever any such runtime behavior would make an artifact more useful, before writing the page.","argumentHint":"","builtin":true},{"name":"update-config","description":"Use this skill to configure the Claude Code harness via settings.json. Automated behaviors (\"from now on when X\", \"each time X\", \"whenever X\", \"before/after X\") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions (\"allow X\", \"add permission\", \"move permission to\"), env vars (\"set X=Y\"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: \"allow npm commands\", \"add bq permission to global settings\", \"move permission to user settings\", \"set DEBUG=true\", \"when claude stops show X\". For simple settings like theme/model, suggest the /config command.","argumentHint":"","builtin":true},{"name":"verify","description":"Verify that a code change actually does what it's supposed to by exercising it end-to-end and observing behavior — drive the affected flow, not just tests or typecheck. Run before committing nontrivial changes; bootstraps this repo's project verify skill if none exists yet. Don't invoke it on a diff that only touches tests, docs, or other code with no runtime surface to drive (a change to product source always has one) — there's nothing to observe.","argumentHint":"","builtin":true},{"name":"debug","description":"Enable debug logging for this session and help diagnose issues","argumentHint":"[issue description]","builtin":true},{"name":"code-review","description":"Review the current diff, or a PR number/branch/path target, for correctness bugs (plus reuse/simplification/efficiency cleanups where the model's review recipe covers them) at the given effort level (low|medium|high|xhigh|max: from few high-confidence findings up to many, some of them uncertain; ultra: deep multi-agent review in the cloud); with no level given, it reuses the level you typed last. Pass --comment to post findings as inline PR comments, or --fix to apply the findings to the working tree after the review. Pass --max-findings \u003cn\u003e to report up to n findings, or --max-findings all for every finding. The choice stays until you pass --max-findings default. For ultra on a GitHub.com PR target, --post asks to post the finished review’s findings to the PR as a single comment from the user’s GitHub account (not a review; the launch dialog still confirms in interactive sessions, while non-interactive mode posts on the flag alone) and --no-post hides that option.","argumentHint":"[low|medium|high|xhigh|max|ultra] [--fix] [--comment] [\u003cpr#\u003e|\u003cbranch\u003e|\u003cpath\u003e] [--max-findings \u003cn\u003e|all]","aliases":["review"],"builtin":true},{"name":"simplify","description":"Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.","argumentHint":"[\u003ctarget\u003e]","builtin":true},{"name":"batch","description":"Research and plan a large-scale change, then execute it in parallel across 5–30 isolated worktree agents that each open a PR.","argumentHint":"\u003cinstruction\u003e","builtin":true},{"name":"fewer-permission-prompts","description":"Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.","argumentHint":"","builtin":true},{"name":"doctor","description":"Health-check the user's Claude Code setup and fix issues: diagnose installation health — what the `claude doctor` terminal diagnostics cover — from local data (duplicate or leftover installs, PATH, unparseable settings files, broken or colliding agent definitions, skills whose frontmatter fails to parse); find unused skills, MCP servers, and plugins versus their context cost and disable dead weight; deduplicate local CLAUDE.md files against checked-in ones; trim checked-in CLAUDE.md files by cutting content a session could derive from the codebase (directory layouts, tech-stack lists, architecture overviews) while keeping gotchas, rationale, and non-standard conventions; migrate always-loaded CLAUDE.md guidance into lazy skills and nested CLAUDE.md files; flag slow hooks and context-heavy extensions; check the installed version is current; make auto mode the default permission mode; and pre-approve frequently denied read-only commands. Use when the user asks for a doctor run, checkup, audit, tune-up, or cleanup of their Claude Code setup or configuration.","argumentHint":"[prompt-audit [\u003cpath\u003e]]","aliases":["checkup"],"builtin":true},{"name":"loop","description":"Run a prompt or slash command on a recurring interval (e.g. /loop 5m /foo). Omit the interval to let the model self-pace.","argumentHint":"[interval] [prompt]","aliases":["proactive"],"builtin":true},{"name":"schedule","description":"Create, update, list, or run scheduled cloud agents (routines) that execute on a cron schedule.","argumentHint":"","aliases":["routines"],"builtin":true},{"name":"claude-api","description":"Reference for the Claude API / Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude/Anthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing/model choice/limits/caching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent/MCP/tool-definition/multi-agent/RAG/LLM-judge/computer-use; generate/summarize/extract/classify/rewrite/converse over NL; debugging refusals/cutoffs/streaming/tool-calls/tokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).","argumentHint":"","builtin":true},{"name":"workflow-authoring","description":"Reference for writing a Workflow tool script (script API and gotchas, resume, quality patterns, worked examples). Load before authoring a script for a workflow the user already opted into; it does not itself authorize running one.","argumentHint":"","builtin":true},{"name":"run","description":"Launch and drive this project's app to see a change working. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real app (not just tests). First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns per project type (CLI, server, TUI, Electron, browser-driven, library).","argumentHint":"","builtin":true},{"name":"run-skill-generator","description":"Author or improve the run-\u003cunit\u003e skill - a per-project skill that tells agents how to build, launch, and drive this project's app. Use when the user asks to set up the project, get it running, write run instructions, or verify build/run steps work from a clean environment.","argumentHint":"","builtin":true},{"name":"plugin-authoring","description":"Make a mod: a change to Claude's own interface or behaviour, such as a live pane or panel, a band above the prompt, a status line, a toast, a slash command, or a hook on tool calls or prompts. Use to make, change or debug a mod or its hooks module.","argumentHint":"","builtin":true},{"name":"advisor","description":"Let Claude consult a stronger model at key moments","argumentHint":"[fable|opus|sonnet|off]","builtin":true},{"name":"agents","description":"(removed) Ask Claude to create/manage subagents, or edit .claude/agents/","argumentHint":"","builtin":true},{"name":"auto-mode-setup","description":"Teach auto mode about your environment, plus optional rule tweaks","argumentHint":"[--request-id \u003cuuid\u003e] (--wizard posture=… scope=… depth=… --propose | --expect-sha256 \u003c64-hex\u003e --apply-file \u003cpath\u003e)","builtin":true},{"name":"autocompact","description":"Configure the auto-compact window size","argumentHint":"[auto|\u003ctokens\u003e]","builtin":true},{"name":"clear","description":"Start a new session with empty context; previous session stays on disk (resumable with /resume)","argumentHint":"[name]","aliases":["reset","new"],"builtin":true},{"name":"color","description":"Set the prompt bar color for this session","argumentHint":"[red|blue|green|yellow|purple|orange|pink|cyan|default]","builtin":true},{"name":"compact","description":"Free up context by summarizing the conversation so far","argumentHint":"\u003coptional custom summarization instructions\u003e","builtin":true},{"name":"config","description":"Set a setting by key","argumentHint":"key=value","aliases":["settings"],"builtin":true},{"name":"output-style","description":"List output styles or switch to one","argumentHint":"[style]","builtin":true},{"name":"context","description":"Show current context usage","argumentHint":"","builtin":true},{"name":"effort","description":"Set effort level for model usage","argumentHint":"\u003clow|medium|high|xhigh|max|auto|ultracode [on|off]\u003e","builtin":true},{"name":"fast","description":"Toggle fast mode (Opus 5.5)","argumentHint":"[on|off]","builtin":true},{"name":"focus","description":"Toggle focus view: just your prompt, summary, and response","argumentHint":"[on|off]","builtin":true},{"name":"heapdump","description":"Dump the JS heap to the Desktop; on Linux with no Desktop folder, the home directory","argumentHint":"","builtin":true},{"name":"init","description":"Initialize a new CLAUDE.md file with codebase documentation","argumentHint":"","builtin":true},{"name":"mcp","description":"Manage MCP servers","argumentHint":"[reconnect|enable|disable [\u003cserver\u003e|all]]","builtin":true},{"name":"import","description":"Import config from another AI coding agent","argumentHint":"","builtin":true},{"name":"model","description":"Set the AI model for Claude Code","argumentHint":"\u003cmodel\u003e","builtin":true},{"name":"__remote-workflow","description":"Run the workflow script delivered in this session environment (server-launched sessions only)","argumentHint":"","builtin":true},{"name":"workflow-launch-exec","description":"Execute a server-launched workflow handoff (workflow_launch event sessions only)","argumentHint":"","builtin":true},{"name":"reload-plugins","description":"Activate pending plugin changes in the current session","argumentHint":"[--force]","builtin":true},{"name":"reload-skills","description":"Pick up skills added or changed on disk during this session","argumentHint":"","builtin":true},{"name":"rename","description":"Rename the current conversation","argumentHint":"[name]","aliases":["name"],"builtin":true},{"name":"ultrareview","description":"Start a cloud agent that finds and verifies bugs in your branch (~15-25 min, $5-$25 USD) · Runs in a cloud session. See https://code.claude.com/docs/en/claude-code-on-the-web","argumentHint":"","builtin":true},{"name":"security-review","description":"Complete a security review of the pending changes on the current branch","argumentHint":"","builtin":true},{"name":"usage-credits","description":"Configure usage credits or request them from your admin when you hit a limit","argumentHint":"","builtin":true},{"name":"extra-usage","description":"Renamed to /usage-credits","argumentHint":"","builtin":true},{"name":"usage","description":"Show session cost, plan usage, and what's contributing to your limits","argumentHint":"","aliases":["cost","stats"],"builtin":true},{"name":"insights","description":"Generate a report analyzing your Claude Code sessions","argumentHint":"","builtin":true},{"name":"recap","description":"Generate a one-line session recap now","argumentHint":"","builtin":true},{"name":"skill-doctor","description":"Show which loaded skills are unused and costing context","argumentHint":"","builtin":true},{"name":"goal","description":"Set a goal — keep working until the condition is met","argumentHint":"","builtin":true},{"name":"design-consent","description":"Grant Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"design-revoke","description":"Revoke Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"list-agents","description":"List subagents, teammates, and other Claude sessions you can message","argumentHint":"","aliases":["peers"],"builtin":true},{"name":"team-onboarding","description":"Help teammates ramp on Claude Code with a guide from your usage","argumentHint":"","builtin":true},{"name":"docs","description":"docs (editable docs people share and comment on; the default for any document, named as a doc or not: a document, report, proposal, resume, cover letter, letter, contract, policy, form, template, worksheet, essay, handbook, guide, how-to, cheat sheet, SOP or other writing to keep, share, collaborate on, send, submit, print or sign; a doc exports to Word, PDF, Markdown or Google Docs, so needing a file to send, attach, upload, submit or print is no reason to pick Word, and a file nobody asked for is a doc, not Word; a plan, comparison, summary or notes asked in chat stays in chat; a pasted claude.ai artifact link may be a doc: check with docs tools first; Word or another file format named, tracked changes wanted, or a .docx to change or use as a template → that format's skill): making one → if no docs-connector instructions are in context, call its `guide` (topic.instructions) first; then create the doc (headings only, no body) before any search, file read or plan, even with files attached. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docs"]},{"name":"docx","description":"Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx) or Word templates (.dotx). Triggers include: any mention of Microsoft Word Documents, such as 'Word doc', 'word document', '.docx', '.dotx', 'microsoft doc'. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a deliverable as a Word or .docx file (to download, email or print), use this skill. However, if they ask for a document, page, report, memo, or notes WITHOUT naming a file format and the session offers Claude's own dedicated document or page skill or connector, use that instead, even if they will email or print it. Do NOT use for PDFs, spreadsheets, Google Docs, or coding unrelated to document generation. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docx"]},{"name":"google-workspace","description":"Read this before the first Google Drive, Docs, Sheets or Slides connector call whenever the task creates or changes a Google file. Use this skill whenever the user wants to create or change a Google Doc, Sheet or Slides file in their Google Drive. Triggers include: a request that names Google Docs, Sheets, Slides or Drive and asks to make, edit, format, copy or rename a file; a docs.google.com link with a request to change that file, even a one-line fix or suggested edits; and any follow-up change to a Google file from earlier in the chat, even \"change it\" or \"add a tab\". Includes helper scripts for document positions, cell ranges and slide layout. However, if the user asks for a doc, deck or spreadsheet without naming Google, or gives a Google file only as source material for something new, use Claude's own output type instead. Do NOT use for read-only questions about a Google file, or for Word, Excel, PowerPoint or PDF files. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:google-workspace"]},{"name":"import-memory","description":"Import a memory export from another AI assistant into Claude's memory — conversationally, additively, and with the content treated as data. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:import-memory"]},{"name":"morning","description":"Render the user's morning brief as a styled HTML artifact, or set it up as a recurring weekday task. Use only when the user explicitly asks to run, see, or set up their morning brief, or if they invoke /morning by name. A question about their day, schedule, or calendar is not by itself a request for the brief; answer it directly instead. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:morning"]},{"name":"pdf","description":"Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pdf"]},{"name":"pptx","description":"Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations as PowerPoint (.pptx) files; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email, summary, or creating a different type of slide deck); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user asks for a PowerPoint or .pptx file, or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. However, when the user asks for a deck, slides, a slide deck, or a presentation without naming a file format, default to using a dedicated slide-deck artifact type or a separate slides skill if this session offers one; otherwise, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pptx"]},{"name":"skill-creator","description":"Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:skill-creator"]},{"name":"xlsx","description":"Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .xltx, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:xlsx"]}],"agents":[{"name":"claude","description":"Catch-all for any task that doesn't fit a more specific agent. FleetView's default when no agent name is typed."},{"name":"claude-code-guide","description":"Use this agent when the user asks questions (\"Can Claude...\", \"Does Claude...\", \"How do I...\") about: (1) Claude Code (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - Messages API for directly passing messages to Claude, Tool Runner (`client.beta.messages.tool_runner`) for running an agentic loop over your own tools, manual tool-use loops, Managed Agents for server-hosted agents with a managed sandbox, prompt caching, and general Anthropic SDK usage; (4) Claude Tag (Claude in Slack) - what it is, setting it up for a Slack workspace, `/install-slack-app`; (5) `claude plugin eval` (writing and running plugin eval suites, its JSON/report, sandbox, CI) and the `/skill-doctor` report. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via SendMessage.","model":"haiku"},{"name":"Explore","description":"Fast read-only search agent for locating code. Use it to find files by pattern (eg. \"src/components/**/*.tsx\"), grep for symbols or keywords (eg. \"API endpoints\"), or answer \"where is X defined / which files reference Y.\" Do NOT use it for code review, design-doc auditing, cross-file consistency checks, or open-ended analysis — it reads excerpts rather than whole files and will miss content past its read window. When calling, specify search breadth: \"quick\" for a single targeted lookup, \"medium\" for moderate exploration, or \"very thorough\" to search across multiple locations and naming conventions.","model":"inherit"},{"name":"general-purpose","description":"General-purpose agent for researching complex questions, searching for code, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you."},{"name":"Plan","description":"Software architect agent for designing implementation plans. Use this when you need to plan the implementation strategy for a task. Returns step-by-step plans, identifies critical files, and considers architectural trade-offs.","model":"inherit"},{"name":"statusline-setup","description":"Use this agent to configure the user's Claude Code status line setting.","model":"sonnet"}],"output_style":"default","available_output_styles":["default","Proactive","Concise","Explanatory","Learning"],"user_output_styles_dir":"/Users/flamingcow/.claude/output-styles","models":[{"value":"default","resolvedModel":"claude-opus-5-5","displayName":"Default (recommended)","description":"Opus 5.5 · Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"opus","resolvedModel":"claude-opus-5-5","displayName":"Opus 5.5","description":"For complex work and everyday tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"fable","resolvedModel":"claude-fable-5-1","displayName":"Fable 5.1","description":"For your toughest challenges","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"sonnet","resolvedModel":"claude-sonnet-5-5","displayName":"Sonnet 5.5","description":"Most efficient for simpler tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"haiku","resolvedModel":"claude-haiku-5-5","displayName":"Haiku 5.5","description":"Fastest for quick answers","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-haiku-4-5-20251001","resolvedModel":"claude-haiku-4-5-20251001","displayName":"Haiku 4.5","description":"Fastest for quick answers"},{"value":"claude-sonnet-5","resolvedModel":"claude-sonnet-5","displayName":"Sonnet 5","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-5","resolvedModel":"claude-opus-5","displayName":"Opus 5","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-fable-5","resolvedModel":"claude-fable-5","displayName":"Fable 5","description":"Most capable for your hardest and longest-running tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-8","resolvedModel":"claude-opus-4-8","displayName":"Opus 4.8","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-opus-4-7","resolvedModel":"claude-opus-4-7","displayName":"Opus 4.7","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-6","resolvedModel":"claude-opus-4-6","displayName":"Opus 4.6","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-sonnet-4-6","resolvedModel":"claude-sonnet-4-6","displayName":"Sonnet 4.6","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true}],"account":{"email":"[redacted]","organization":"[redacted]'s Organization","subscriptionType":"Claude Max","apiProvider":"firstParty"},"pid":12874,"claude_code_version":"2.1.296","current_permission_mode":"bypassPermissions","hooks_applied":true,"feedback_mode":{"kind":"post"},"analytics_disabled":false,"remote_control_auto_enable":false,"remote_control_auto_connect_default":false,"remote_control_available":true,"remote_control_auto_on_by_default":false,"ide_rc_auto_enable_gate":true,"fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","session_state":"idle","capabilities":["ui_surface_v1"]},"pending_permission_requests":[],"pending_user_dialog_requests":[]}}} {"dir":"send","msg":{"message":{"content":"Create a file hello.txt containing exactly the word hi, then git add and git commit it with the message \"add hello\", then call the finish tool.","role":"user"},"parent_tool_use_id":null,"session_id":"","type":"user"}} -{"dir":"recv","msg":{"type":"control_request","request_id":"14b1ce27-194c-4b36-82e1-16f10febe598","request":{"subtype":"mcp_message","server_name":"byre","message":{"jsonrpc":"2.0","method":"notifications/initialized"}}}} -{"dir":"send","msg":{"response":{"request_id":"14b1ce27-194c-4b36-82e1-16f10febe598","response":{"mcp_response":{"jsonrpc":"2.0","id":null,"result":{}}},"subtype":"success"},"type":"control_response"}} -{"dir":"recv","msg":{"type":"control_request","request_id":"917effff-b6c0-407c-a612-524b252e5cd2","request":{"subtype":"mcp_message","server_name":"byre","message":{"method":"tools/list","jsonrpc":"2.0","id":1}}}} -{"dir":"send","msg":{"response":{"request_id":"917effff-b6c0-407c-a612-524b252e5cd2","response":{"mcp_response":{"jsonrpc":"2.0","id":1,"result":{"tools":[{"name":"finish","description":"Call this once the task is complete.","inputSchema":{"type":"object","properties":{}}}]}}},"subtype":"success"},"type":"control_response"}} -{"dir":"recv","msg":{"type":"system","subtype":"init","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP3613548484/001","session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","tools":["Task","Artifact","ArtifactComments","ArtifactData","Bash","CronCreate","CronDelete","CronList","DesignSync","Edit","EnterWorktree","ExitWorktree","ListAgents","LSP","Monitor","NotebookEdit","PushNotification","Read","RemoteTrigger","ReportFindings","ScheduleWakeup","SendMessage","Skill","TaskStop","ToolSearch","WebFetch","WebSearch","Workflow","Write","mcp__byre__finish"],"mcp_servers":[{"name":"claude.ai Claude Docs","status":"pending","source":"claudeai"},{"name":"claude.ai Heliosian","status":"pending","source":"claudeai"},{"name":"claude.ai Fastmail","status":"pending","source":"claudeai"},{"name":"claude.ai Google Calendar","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Gmail","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Google Drive","status":"needs-auth","source":"claudeai"},{"name":"byre","status":"connected","source":"sdk"}],"model":"claude-sonnet-5-5","permissionMode":"bypassPermissions","slash_commands":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","advisor","agents","auto-mode-setup","autocompact","clear","color","compact","config","output-style","context","effort","fast","focus","heapdump","init","mcp","import","model","__remote-workflow","workflow-launch-exec","reload-plugins","reload-skills","rename","ultrareview","security-review","usage-credits","extra-usage","usage","insights","recap","skill-doctor","goal","design-consent","design-revoke","list-agents","team-onboarding","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"terminal_slash_commands":["doctor","color","focus","reload-plugins"],"apiKeySource":"none","claude_code_version":"2.1.296","output_style":"default","agents":["claude","claude-code-guide","Explore","general-purpose","Plan","statusline-setup"],"skills":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"plugins":[{"name":"clangd-lsp","path":"/Users/flamingcow/.claude/plugins/cache/claude-plugins-official/clangd-lsp/1.0.0","source":"clangd-lsp@claude-plugins-official","version":"1.0.0"},{"name":"cc-plugin-agents-md","path":"builtin","source":"cc-plugin-agents-md@builtin"},{"name":"cc-plugin-telemetry","path":"builtin","source":"cc-plugin-telemetry@builtin"},{"name":"cc-plugin-plugin-authoring","path":"builtin","source":"cc-plugin-plugin-authoring@builtin"}],"capabilities":["interrupt_receipt_v1","interrupt_cancel_queued_v1","interrupt_send_now_v1","msg_lifecycle_v1","request_marker_lists_v1","sdk_mcp_tools_list_changed","sdk_mcp_manifests","mcp_read_resource_v1","mcp_tool_ui_meta_v1","ui_surface_v1"],"analytics_disabled":false,"product_feedback_disabled":false,"uuid":"456cab6b-cbec-49db-aece-02d210b63af3","memory_paths":{"auto":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestCommitIdentityHooksAndMCP3613548484-001/memory/"},"scratchpad_path":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestCommitIdentityHooksAndMCP3613548484-001/7ed55858-8a75-4622-9cf2-3411541fa61a/scratchpad","messaging_socket_path":"/tmp/cc-socks/11243.sock","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","per_turn_effort_active":true,"view_mode":"default"}} -{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","uuid":"b1756012-b9ef-4423-8a8c-b9f6b0024adb"}} -{"dir":"recv","msg":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed","resetsAt":1792054200,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false,"unifiedWindows":{"five_hour":{"utilization":0.04,"resetsAt":1792054200},"seven_day":{"utilization":0.35,"resetsAt":1792270800}}},"uuid":"73336d4b-23ac-452b-a626-ad3eb87d45cc","session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a"}} -{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3P8Pv1arEYE8F7vShcv","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01A1LZGdeS1tRQd6m1GeiaKg","name":"Write","input":{"file_path":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP3613548484/001/hello.txt","content":"hi"},"caller":{"type":"direct"}}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":15289,"cache_read_input_tokens":22425,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15289},"output_tokens":16,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","uuid":"4b42203e-5391-4d58-b92a-713d884f918f","timestamp":"2026-10-15T04:21:16.582Z","request_id":"req_011Cg3P8PfNZYhQkeQzThoh4","wire_tool_inputs":{"toolu_01A1LZGdeS1tRQd6m1GeiaKg":{"file_path":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP3613548484/001/hello.txt","content":"hi"}}}} -{"dir":"recv","msg":{"type":"control_request","request_id":"74bdcedf-adcf-4f6d-b4d3-88551897d913","request":{"subtype":"hook_callback","callback_id":"hook_0","input":{"session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","transcript_path":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestCommitIdentityHooksAndMCP3613548484-001/7ed55858-8a75-4622-9cf2-3411541fa61a.jsonl","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP3613548484/001","scratchpad_dir":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestCommitIdentityHooksAndMCP3613548484-001/7ed55858-8a75-4622-9cf2-3411541fa61a/scratchpad","prompt_id":"fa12491a-1704-43be-ab96-ff711126a990","permission_mode":"bypassPermissions","effort":{"level":"medium"},"hook_event_name":"PostToolUse","tool_name":"Write","tool_input":{"file_path":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP3613548484/001/hello.txt","content":"hi"},"tool_response":{"type":"create","filePath":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP3613548484/001/hello.txt","content":"hi","structuredPatch":[],"originalFile":null,"userModified":false},"tool_use_id":"toolu_01A1LZGdeS1tRQd6m1GeiaKg","duration_ms":3},"tool_use_id":"toolu_01A1LZGdeS1tRQd6m1GeiaKg"}}} -{"dir":"send","msg":{"response":{"request_id":"74bdcedf-adcf-4f6d-b4d3-88551897d913","response":{},"subtype":"success"},"type":"control_response"}} -{"dir":"recv","msg":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01A1LZGdeS1tRQd6m1GeiaKg","type":"tool_result","content":"File created successfully at: /private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP3613548484/001/hello.txt (file state is current in your context — no need to Read it back)"}]},"parent_tool_use_id":null,"session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","uuid":"c6e12f99-b27a-483b-9d98-6db3f6f23624","timestamp":"2026-10-15T04:21:16.595Z","tool_use_result":{"type":"create","filePath":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP3613548484/001/hello.txt","content":"hi","structuredPatch":[],"originalFile":null,"userModified":false},"tool_result_meta":[{"id":"toolu_01A1LZGdeS1tRQd6m1GeiaKg","permission_decision":{"decision":"accept","source":"config","reason_type":"mode"}}]}} -{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","uuid":"51f4da3e-d543-481c-8675-8b0c6ce5bdad"}} -{"dir":"recv","msg":{"type":"system","subtype":"thinking_tokens","estimated_tokens":50,"estimated_tokens_delta":50,"session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","uuid":"469bae88-e3c1-4550-8786-b48b9adbc8b1"}} -{"dir":"recv","msg":{"type":"system","subtype":"thinking_tokens","estimated_tokens":197,"estimated_tokens_delta":147,"session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","uuid":"04358e9f-0e7e-4f8e-bfcc-b1d3e1226f12"}} -{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3P8YVhHViHcPVKbEr7D","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"CAQSiQYKEAgSGAI4AUIIdGhpbmtpbmcSDCbzn78iroK9h+8geRoMP1EvVHtZse690YMkIjBzmFUA5OlO1MONMR9+NaR9/HHT4cEOumn+MaYq4o+THRfExy2myxXlVKwq5ty4i3oqpgWrfm3ayUMNEehvGIsCIE9eOd0Qneju/QsGsZOkc9u4yWJsAJgO0ILk7EmBGcErVffrD8xt9bcqUfnWIAXE2H5zwkWjcfIxssCHAbtGcDDw6dWuHkxLdZUmaRW55V6OB+Kff4BDv+VdOnIibE4CbFfljeD7GYhg7zBDrF1ntU1WHwYEOtJHTKUclv9rkjD2gtzCytwCZhF80mCXbsy22Z/+op8WF7x0MJ9jFCHnbl9o1+zBnOv4JYzxsMARmdBGML2atKK8bD74DyE+50ZpDm4RjmFSk56HfRnzf5WOQ7MsKzrzN1TpcBAM5nquWMQn5KsJiPpyOqCz7IXsu6XxVjMYBybs289hxWWQoU/UkkL5Z+opk/qH5xQotNfaKGiN3caEiyLRjnxxRA0C75cDjQnRqL5laYZW5s5XiiltCFGHsxVeyBQGm1TIqZW4sY3lTkDXK6Omz6V0Y+LB5FSDQDmnr64Kbiy5Ms+u23VgrgS+o4dOMcXyQQoDhYodHJ6mxd47fl0QiwQayR3r3pAM+qdTMowTJWCC6Hi3m7icyKI2NNaYU3NwT2OBmFzXxFu0s4y2CP/18OjDfZ5YEyMdeRbUZVeihp7FFEYzOUB5bEYstpi4R/ao9wvJwJgCOvstmfmNNjAXsr0TBdLUuaxrBrHYVtE9ANZfvH5FTihyNu1kq7OpHWufZh/NXv1K/q8ipKbmHAqWqvYuRE0/7RB+PuQwTo7RoMC8U1AkM8KZYJAGHZcE3RpYCJKMsCh6YPM8dsLWglS84k8Jtnqk6p1W4gy7/+CyyMoc6e/EqpA+F6aPKN7b4ssw9U8PGw8mdfhVTWS3zmaeMnI/sMn+pviEMCIm71HP7tvlsBcubI53HZCOkRpNEBWOoknP8w/bx3P3Q05zyIphxG4YAQ=="}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":4714,"cache_read_input_tokens":37714,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":4714},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","uuid":"8eedbf06-fb3f-49bf-afa1-d592bc417746","timestamp":"2026-10-15T04:21:30.067Z","request_id":"req_011Cg3P8YEK2iPqhSWDnQ3pj","thinking_duration_ms":977,"thinking_display":"updates"}} -{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3P8YVhHViHcPVKbEr7D","type":"message","role":"assistant","content":[{"type":"text","text":"Authorization for the commit, quoting the current turn: \"git add and git commit it with the message \"add hello\"\"."}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":4714,"cache_read_input_tokens":37714,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":4714},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","uuid":"b8b80843-512e-43de-9146-0e489db59f14","timestamp":"2026-10-15T04:21:30.071Z","request_id":"req_011Cg3P8YEK2iPqhSWDnQ3pj"}} -{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3P8YVhHViHcPVKbEr7D","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Mw1Tut3o3c7Nh7R24Vz3o4","name":"Bash","input":{"command":"git add hello.txt \u0026\u0026 git commit -m \"add hello\" -- hello.txt # USER EXPLICITLY AUTHORIZED THIS COMMIT IN THE IMMEDIATELY PRECEDING REQUEST","description":"Stage and commit hello.txt","timeout":30000},"caller":{"type":"direct"}}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":4714,"cache_read_input_tokens":37714,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":4714},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","uuid":"c5fea403-ee0d-4f74-8308-2642db105f11","timestamp":"2026-10-15T04:21:30.778Z","request_id":"req_011Cg3P8YEK2iPqhSWDnQ3pj","wire_tool_inputs":{"toolu_01Mw1Tut3o3c7Nh7R24Vz3o4":{"command":"git add hello.txt \u0026\u0026 git commit -m \"add hello\" -- hello.txt # USER EXPLICITLY AUTHORIZED THIS COMMIT IN THE IMMEDIATELY PRECEDING REQUEST","timeout":30000,"description":"Stage and commit hello.txt"}}}} -{"dir":"recv","msg":{"type":"system","subtype":"vcs_state_changed","kind":"commit","branch":"main","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP3613548484/001","uuid":"d25b8efe-4643-4128-a89c-4372a5607214","session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a"}} -{"dir":"recv","msg":{"type":"control_request","request_id":"3ed437eb-6e10-4d4e-9526-122e0d63dc23","request":{"subtype":"hook_callback","callback_id":"hook_0","input":{"session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","transcript_path":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestCommitIdentityHooksAndMCP3613548484-001/7ed55858-8a75-4622-9cf2-3411541fa61a.jsonl","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP3613548484/001","scratchpad_dir":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestCommitIdentityHooksAndMCP3613548484-001/7ed55858-8a75-4622-9cf2-3411541fa61a/scratchpad","prompt_id":"fa12491a-1704-43be-ab96-ff711126a990","permission_mode":"bypassPermissions","effort":{"level":"medium"},"hook_event_name":"PostToolUse","tool_name":"Bash","tool_input":{"command":"git add hello.txt \u0026\u0026 git commit -m \"add hello\" -- hello.txt # USER EXPLICITLY AUTHORIZED THIS COMMIT IN THE IMMEDIATELY PRECEDING REQUEST","timeout":30000,"description":"Stage and commit hello.txt"},"tool_response":{"stdout":"[main 4b64f96] add hello\n 1 file changed, 1 insertion(+)\n create mode 100644 hello.txt","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false,"gitOperation":{"commit":{"sha":"4b64f96","kind":"committed","branch":"main"}}},"tool_use_id":"toolu_01Mw1Tut3o3c7Nh7R24Vz3o4","duration_ms":77},"tool_use_id":"toolu_01Mw1Tut3o3c7Nh7R24Vz3o4"}}} -{"dir":"send","msg":{"response":{"request_id":"3ed437eb-6e10-4d4e-9526-122e0d63dc23","response":{},"subtype":"success"},"type":"control_response"}} -{"dir":"recv","msg":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Mw1Tut3o3c7Nh7R24Vz3o4","type":"tool_result","content":"[main 4b64f96] add hello\n 1 file changed, 1 insertion(+)\n create mode 100644 hello.txt","is_error":false}]},"parent_tool_use_id":null,"session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","uuid":"b47da958-6248-4c8a-bc16-4ff5358f05a2","timestamp":"2026-10-15T04:21:30.902Z","tool_use_result":{"stdout":"[main 4b64f96] add hello\n 1 file changed, 1 insertion(+)\n create mode 100644 hello.txt","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false,"gitOperation":{"commit":{"sha":"4b64f96","kind":"committed","branch":"main"}}},"tool_result_meta":[{"id":"toolu_01Mw1Tut3o3c7Nh7R24Vz3o4","permission_decision":{"decision":"accept","source":"config","reason_type":"mode"}}]}} -{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","uuid":"fc2b43d4-05c2-456c-a730-a1a1886c4d25"}} -{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3P9beibXS72rGrmimdi","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Szo3jyfTFSYy5QhqAGH7tx","name":"mcp__byre__finish","input":{},"caller":{"type":"direct"}}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":366,"cache_read_input_tokens":42428,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":366},"output_tokens":24,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","uuid":"bede0932-7196-4309-b5cd-6bd40e5c2044","timestamp":"2026-10-15T04:21:31.813Z","request_id":"req_011Cg3P9bNrrH3wUswhQXiDs","wire_tool_inputs":{"toolu_01Szo3jyfTFSYy5QhqAGH7tx":{}},"tool_use_meta":[{"id":"toolu_01Szo3jyfTFSYy5QhqAGH7tx","display_name":"Finish","server_display_name":"byre"}]}} -{"dir":"recv","msg":{"type":"control_request","request_id":"778a68e2-4b9a-4940-b857-2232b43f5130","request":{"subtype":"mcp_message","server_name":"byre","message":{"method":"tools/call","params":{"name":"finish","arguments":{},"_meta":{"claudecode/toolUseId":"toolu_01Szo3jyfTFSYy5QhqAGH7tx","progressToken":2}},"jsonrpc":"2.0","id":2}}}} -{"dir":"send","msg":{"response":{"request_id":"778a68e2-4b9a-4940-b857-2232b43f5130","response":{"mcp_response":{"jsonrpc":"2.0","id":2,"result":{"content":[{"type":"text","text":"noted"}]}}},"subtype":"success"},"type":"control_response"}} -{"dir":"recv","msg":{"type":"control_request","request_id":"66367ece-a0c4-4ae7-a59a-a10c545a8d67","request":{"subtype":"hook_callback","callback_id":"hook_0","input":{"session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","transcript_path":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestCommitIdentityHooksAndMCP3613548484-001/7ed55858-8a75-4622-9cf2-3411541fa61a.jsonl","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP3613548484/001","scratchpad_dir":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestCommitIdentityHooksAndMCP3613548484-001/7ed55858-8a75-4622-9cf2-3411541fa61a/scratchpad","prompt_id":"fa12491a-1704-43be-ab96-ff711126a990","permission_mode":"bypassPermissions","effort":{"level":"medium"},"hook_event_name":"PostToolUse","tool_name":"mcp__byre__finish","tool_input":{},"tool_response":[{"type":"text","text":"noted"}],"tool_use_id":"toolu_01Szo3jyfTFSYy5QhqAGH7tx","duration_ms":6,"mcp_server":{"name":"byre","source":"sdk"}},"tool_use_id":"toolu_01Szo3jyfTFSYy5QhqAGH7tx"}}} -{"dir":"send","msg":{"response":{"request_id":"66367ece-a0c4-4ae7-a59a-a10c545a8d67","response":{},"subtype":"success"},"type":"control_response"}} -{"dir":"recv","msg":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Szo3jyfTFSYy5QhqAGH7tx","type":"tool_result","content":[{"type":"text","text":"noted"}]}]},"parent_tool_use_id":null,"session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","uuid":"f6aeb49a-5e51-4c11-9c67-2c6441b8586a","timestamp":"2026-10-15T04:21:31.828Z","tool_use_result":[{"type":"text","text":"noted"}],"tool_result_meta":[{"id":"toolu_01Szo3jyfTFSYy5QhqAGH7tx","permission_decision":{"decision":"accept","source":"config","reason_type":"mode"}}]}} -{"dir":"recv","msg":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed","resetsAt":1792054200,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false,"unifiedWindows":{"five_hour":{"utilization":0.05,"resetsAt":1792054200},"seven_day":{"utilization":0.35,"resetsAt":1792270800}}},"uuid":"77333ba0-1080-4a75-92e3-efbb3d4ba338","session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a"}} -{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","uuid":"b3ed6617-d93c-40a4-89a1-08bd96d93878"}} -{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3P9ffpyHfqxThTsvLxo","type":"message","role":"assistant","content":[{"type":"text","text":"I created `hello.txt` containing `hi`, committed it to `main` as \"add hello\" (4b64f96), and called the finish tool. I didn't run any tests or checks beyond the commit itself."}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":63,"cache_read_input_tokens":42794,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":63},"output_tokens":66,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","uuid":"52da95dd-4499-4bf6-ac8a-ed0d6083023a","timestamp":"2026-10-15T04:21:33.009Z","request_id":"req_011Cg3P9fRC2dZdop2eRHw4R"}} -{"dir":"recv","msg":{"duration_api_ms":18961,"stop_reason":"end_turn","session_id":"7ed55858-8a75-4622-9cf2-3411541fa61a","total_cost_usd":0.1016798,"usage":{"input_tokens":8,"cache_creation_input_tokens":20432,"cache_read_input_tokens":145361,"output_tokens":527,"output_tokens_details":{"thinking_tokens":82},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":20432,"ephemeral_5m_input_tokens":0},"inference_geo":"global","iterations":[{"input_tokens":2,"output_tokens":66,"cache_read_input_tokens":42794,"cache_creation_input_tokens":63,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":63},"type":"message"}],"speed":"standard","fallback_credit":null},"modelUsage":{"claude-haiku-5-5":{"inputTokens":1207,"outputTokens":18,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.0001297,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-haiku-5-5","provider":"firstParty","costBasis":"list"},"claude-sonnet-5-5":{"inputTokens":8,"outputTokens":527,"cacheReadInputTokens":145361,"cacheCreationInputTokens":20432,"webSearchRequests":0,"costUSD":0.10155010000000002,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":82,"canonicalModel":"claude-sonnet-5-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"safety_stops":0,"is_error":false,"num_turns":4,"subtype":"success","api_error_status":null,"result":"I created `hello.txt` containing `hi`, committed it to `main` as \"add hello\" (4b64f96), and called the finish tool. I didn't run any tests or checks beyond the commit itself.","ttft_ms":2087,"type":"result","duration_ms":18530,"uuid":"b3f57132-e993-47d1-8f41-b8a7f8df3de1","ttft_stream_ms":1089,"time_to_request_ms":23,"first_content_frame_ms":1090,"queued_turn_count":0,"result_index":0}} +{"dir":"recv","msg":{"type":"control_request","request_id":"fe70e70e-c384-4ba3-a142-b5519fb3b714","request":{"subtype":"mcp_message","server_name":"byre","message":{"jsonrpc":"2.0","method":"notifications/initialized"}}}} +{"dir":"send","msg":{"response":{"request_id":"fe70e70e-c384-4ba3-a142-b5519fb3b714","response":{"mcp_response":{"jsonrpc":"2.0","id":null,"result":{}}},"subtype":"success"},"type":"control_response"}} +{"dir":"recv","msg":{"type":"control_request","request_id":"9406138a-1548-4ec7-90b0-30ff9289d78c","request":{"subtype":"mcp_message","server_name":"byre","message":{"method":"tools/list","jsonrpc":"2.0","id":1}}}} +{"dir":"send","msg":{"response":{"request_id":"9406138a-1548-4ec7-90b0-30ff9289d78c","response":{"mcp_response":{"jsonrpc":"2.0","id":1,"result":{"tools":[{"name":"finish","description":"Call this once the task is complete.","inputSchema":{"type":"object","properties":{}}}]}}},"subtype":"success"},"type":"control_response"}} +{"dir":"recv","msg":{"type":"system","subtype":"init","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP671040166/001","session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","tools":["Task","Artifact","ArtifactComments","ArtifactData","Bash","CronCreate","CronDelete","CronList","DesignSync","Edit","EnterWorktree","ExitWorktree","ListAgents","LSP","Monitor","NotebookEdit","PushNotification","Read","RemoteTrigger","ReportFindings","ScheduleWakeup","SendMessage","Skill","TaskStop","ToolSearch","WebFetch","WebSearch","Workflow","Write","mcp__byre__finish"],"mcp_servers":[{"name":"claude.ai Claude Docs","status":"pending","source":"claudeai"},{"name":"claude.ai Heliosian","status":"pending","source":"claudeai"},{"name":"claude.ai Fastmail","status":"pending","source":"claudeai"},{"name":"claude.ai Google Calendar","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Gmail","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Google Drive","status":"needs-auth","source":"claudeai"},{"name":"byre","status":"connected","source":"sdk"}],"model":"claude-sonnet-5-5","permissionMode":"bypassPermissions","slash_commands":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","advisor","agents","auto-mode-setup","autocompact","clear","color","compact","config","output-style","context","effort","fast","focus","heapdump","init","mcp","import","model","__remote-workflow","workflow-launch-exec","reload-plugins","reload-skills","rename","ultrareview","security-review","usage-credits","extra-usage","usage","insights","recap","skill-doctor","goal","design-consent","design-revoke","list-agents","team-onboarding","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"terminal_slash_commands":["doctor","color","focus","reload-plugins"],"apiKeySource":"none","claude_code_version":"2.1.296","output_style":"default","agents":["claude","claude-code-guide","Explore","general-purpose","Plan","statusline-setup"],"skills":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"plugins":[{"name":"clangd-lsp","path":"/Users/flamingcow/.claude/plugins/cache/claude-plugins-official/clangd-lsp/1.0.0","source":"clangd-lsp@claude-plugins-official","version":"1.0.0"},{"name":"cc-plugin-agents-md","path":"builtin","source":"cc-plugin-agents-md@builtin"},{"name":"cc-plugin-telemetry","path":"builtin","source":"cc-plugin-telemetry@builtin"},{"name":"cc-plugin-plugin-authoring","path":"builtin","source":"cc-plugin-plugin-authoring@builtin"}],"capabilities":["interrupt_receipt_v1","interrupt_cancel_queued_v1","interrupt_send_now_v1","msg_lifecycle_v1","request_marker_lists_v1","sdk_mcp_tools_list_changed","sdk_mcp_manifests","mcp_read_resource_v1","mcp_tool_ui_meta_v1","ui_surface_v1"],"analytics_disabled":false,"product_feedback_disabled":false,"uuid":"58be0129-7321-4c9d-b90b-ef2cddf36c1a","memory_paths":{"auto":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestCommitIdentityHooksAndMCP671040166-001/memory/"},"scratchpad_path":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestCommitIdentityHooksAndMCP671040166-001/5e94ceb3-1c19-4499-b690-3c2bb2e15182/scratchpad","messaging_socket_path":"/tmp/cc-socks/12874.sock","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","per_turn_effort_active":true,"view_mode":"default"}} +{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","uuid":"4a7911fd-1dfd-44b0-b420-d18cc50711fe"}} +{"dir":"recv","msg":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed","resetsAt":1792054200,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false,"unifiedWindows":{"five_hour":{"utilization":0.05,"resetsAt":1792054200},"seven_day":{"utilization":0.35,"resetsAt":1792270800}}},"uuid":"ae2038e3-df04-434c-94c2-acd4e606f045","session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182"}} +{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3PDvPxfw4EzujGvabdR","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01ArWWWwNpcpjQTh5hjiev2x","name":"Write","input":{"file_path":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP671040166/001/hello.txt","content":"hi"},"caller":{"type":"direct"}}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":15289,"cache_read_input_tokens":22425,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15289},"output_tokens":16,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","uuid":"271e9c8a-a00a-44f4-94d9-4a3443268bbd","timestamp":"2026-10-15T04:22:31.577Z","request_id":"req_011Cg3PDv9L4dudR2uNbkED1","wire_tool_inputs":{"toolu_01ArWWWwNpcpjQTh5hjiev2x":{"file_path":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP671040166/001/hello.txt","content":"hi"}}}} +{"dir":"recv","msg":{"type":"control_request","request_id":"911219aa-bc01-47e5-8f05-ea508410a440","request":{"subtype":"hook_callback","callback_id":"hook_0","input":{"session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","transcript_path":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestCommitIdentityHooksAndMCP671040166-001/5e94ceb3-1c19-4499-b690-3c2bb2e15182.jsonl","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP671040166/001","scratchpad_dir":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestCommitIdentityHooksAndMCP671040166-001/5e94ceb3-1c19-4499-b690-3c2bb2e15182/scratchpad","prompt_id":"7a66b2ff-760c-4c7e-b50e-1d01cad63707","permission_mode":"bypassPermissions","effort":{"level":"medium"},"hook_event_name":"PostToolUse","tool_name":"Write","tool_input":{"file_path":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP671040166/001/hello.txt","content":"hi"},"tool_response":{"type":"create","filePath":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP671040166/001/hello.txt","content":"hi","structuredPatch":[],"originalFile":null,"userModified":false},"tool_use_id":"toolu_01ArWWWwNpcpjQTh5hjiev2x","duration_ms":11},"tool_use_id":"toolu_01ArWWWwNpcpjQTh5hjiev2x"}}} +{"dir":"send","msg":{"response":{"request_id":"911219aa-bc01-47e5-8f05-ea508410a440","response":{},"subtype":"success"},"type":"control_response"}} +{"dir":"recv","msg":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01ArWWWwNpcpjQTh5hjiev2x","type":"tool_result","content":"File created successfully at: /private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP671040166/001/hello.txt (file state is current in your context — no need to Read it back)"}]},"parent_tool_use_id":null,"session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","uuid":"1144a475-e7a3-4940-b382-74954cf5bf22","timestamp":"2026-10-15T04:22:31.617Z","tool_use_result":{"type":"create","filePath":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP671040166/001/hello.txt","content":"hi","structuredPatch":[],"originalFile":null,"userModified":false},"tool_result_meta":[{"id":"toolu_01ArWWWwNpcpjQTh5hjiev2x","permission_decision":{"decision":"accept","source":"config","reason_type":"mode"}}]}} +{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","uuid":"90c43601-5404-4f3a-a96c-0eeb3af07dc1"}} +{"dir":"recv","msg":{"type":"system","subtype":"thinking_tokens","estimated_tokens":50,"estimated_tokens_delta":50,"session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","uuid":"6a08ae39-381a-468d-8053-5f835134ee0f"}} +{"dir":"recv","msg":{"type":"system","subtype":"thinking_tokens","estimated_tokens":202,"estimated_tokens_delta":152,"session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","uuid":"1b86207d-0bc3-4ad0-b917-fefaa24bbd12"}} +{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3PE5HjnnEb29jZ6QzoL","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"CAQSnwYKEAgSGAI4AUIIdGhpbmtpbmcSDKBOxIDfrWJ4BiW6uhoMk9D4mCMCDsPRTrUJIjDws7EQalDgBVlT5r8ZYivOQdhTOHZT/xaKHp6cLi4xOvhFG0ZRvJgFESDlyOcBlNgqvAXLwExODTijbZy6Fo1Zo4yIOvkY1pb53bcHR4F0foGJ7OFM3rBWzQv2Lumtc2EoMBtv2qY/HG7M22SsSW1KauTqFXRaSQySlX0m8MExTSbk5dgvnjso+VTImH384fwTpr/8WRAwGaSJaoGPyQxRqtTs6TXEyn6EZOpPrtY0/NyQLPIS94NU42W+EQ+UBc/6/Yo/cLw+yP82/7/Z8pfzn/adWuMXnMgogGD2ESoiecEoDqskzo4GKegdOj0lm5uWerc5ab26vTW+bN9KOgiY8Og8UDuzNmrQ8tk/XXJU7BxZuiCSHkvoeoZk0VgL57LLAkjco29LnzAr5VDv/7Tl8xOeHaKXbDvfij1/dUVI7dnAknkRHyJ+FsK2rwGl/aNOppK/LO5NeC6bhKN17XApLR2UOwtLc4ATM9/ANvgyggrdtAsqoBPQCYtasotxbqV2GxAoyMg4PL7cnNBMHShG9UhIQOHwZ4eR/kX5RlHUVwrPs7rH3Cza+jJ/FN9Gaq8DTzprddEfk6YYDVqppWBX2UXdAMFrRXwfTQBfkgW/gz/A3MmrNrI69waRpG5CIjSIi3WTc9Deny9/4OREHsBPFXC/wAKYbWwNAw3EPVVoYEVRfggtribQoL1do7kzJsGG5FxSN2+tyJKWCGf++qNe+bPHBU3t0P6iLmwn+NBLJ/XhFduAhElLwaa7BxPERDIGk6NPFMdxlx1/qhkej0OBZjAE6RleuO2euqRdG+OGO6qdpHV794E+rONn9CUHSni3AUgubNxBikrQG5IE6Sy6dp226yNUMxg/H20PXU/te27eAm6gIleWezGH8c2I02LoOV8szr8KNNzai1aWuqMhjGv/TagQ4yb88PO8YZVGtJXSk4nSwW9joSf1ZHdA+Zu9ARg9xJbrTD9npBInoQDOAROi0y7rptCs1JYYgMDNGAE="}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":4712,"cache_read_input_tokens":37714,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":4712},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","uuid":"419e9b53-d82c-4e2c-b922-4f475e0d5a74","timestamp":"2026-10-15T04:22:33.729Z","request_id":"req_011Cg3PE52NKoNFaWerTqx95","thinking_duration_ms":1178,"thinking_display":"updates"}} +{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3PE5HjnnEb29jZ6QzoL","type":"message","role":"assistant","content":[{"type":"text","text":"Authorization for the commit, quoted from this turn: \"then git add and git commit it with the message \"add hello\"\"."}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":4712,"cache_read_input_tokens":37714,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":4712},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","uuid":"7d57f0ef-5bd0-414f-b4bb-1b192e727a39","timestamp":"2026-10-15T04:22:33.730Z","request_id":"req_011Cg3PE52NKoNFaWerTqx95"}} +{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3PE5HjnnEb29jZ6QzoL","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01WP5nDgtoyGTdxNMU9w39Ly","name":"Bash","input":{"command":"timeout 20 git add hello.txt \u0026\u0026 timeout 20 git commit -m \"add hello\" -- hello.txt # USER EXPLICITLY AUTHORIZED THIS COMMIT IN THE IMMEDIATELY PRECEDING REQUEST","description":"Stage and commit hello.txt","timeout":60000},"caller":{"type":"direct"}}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":4712,"cache_read_input_tokens":37714,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":4712},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","uuid":"d6a10bfa-fbf8-41ef-9f26-65861b4b7682","timestamp":"2026-10-15T04:22:34.470Z","request_id":"req_011Cg3PE52NKoNFaWerTqx95","wire_tool_inputs":{"toolu_01WP5nDgtoyGTdxNMU9w39Ly":{"command":"timeout 20 git add hello.txt \u0026\u0026 timeout 20 git commit -m \"add hello\" -- hello.txt # USER EXPLICITLY AUTHORIZED THIS COMMIT IN THE IMMEDIATELY PRECEDING REQUEST","description":"Stage and commit hello.txt","timeout":60000}}}} +{"dir":"recv","msg":{"type":"system","subtype":"vcs_state_changed","kind":"commit","branch":"main","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP671040166/001","uuid":"5e02a1fa-6fa3-43d7-9f69-7b2d864cf6d0","session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182"}} +{"dir":"recv","msg":{"type":"control_request","request_id":"9ff81925-0c3d-4a9c-af2c-bbd77bb0d149","request":{"subtype":"hook_callback","callback_id":"hook_0","input":{"session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","transcript_path":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestCommitIdentityHooksAndMCP671040166-001/5e94ceb3-1c19-4499-b690-3c2bb2e15182.jsonl","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP671040166/001","scratchpad_dir":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestCommitIdentityHooksAndMCP671040166-001/5e94ceb3-1c19-4499-b690-3c2bb2e15182/scratchpad","prompt_id":"7a66b2ff-760c-4c7e-b50e-1d01cad63707","permission_mode":"bypassPermissions","effort":{"level":"medium"},"hook_event_name":"PostToolUse","tool_name":"Bash","tool_input":{"command":"timeout 20 git add hello.txt \u0026\u0026 timeout 20 git commit -m \"add hello\" -- hello.txt # USER EXPLICITLY AUTHORIZED THIS COMMIT IN THE IMMEDIATELY PRECEDING REQUEST","timeout":60000,"description":"Stage and commit hello.txt"},"tool_response":{"stdout":"[main 35e23e1] add hello\n 1 file changed, 1 insertion(+)\n create mode 100644 hello.txt","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false,"gitOperation":{"commit":{"sha":"35e23e1","kind":"committed","branch":"main"}}},"tool_use_id":"toolu_01WP5nDgtoyGTdxNMU9w39Ly","duration_ms":102},"tool_use_id":"toolu_01WP5nDgtoyGTdxNMU9w39Ly"}}} +{"dir":"send","msg":{"response":{"request_id":"9ff81925-0c3d-4a9c-af2c-bbd77bb0d149","response":{},"subtype":"success"},"type":"control_response"}} +{"dir":"recv","msg":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01WP5nDgtoyGTdxNMU9w39Ly","type":"tool_result","content":"[main 35e23e1] add hello\n 1 file changed, 1 insertion(+)\n create mode 100644 hello.txt","is_error":false}]},"parent_tool_use_id":null,"session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","uuid":"c8c92cb3-320a-4593-bbbc-0e210afb1de3","timestamp":"2026-10-15T04:22:34.596Z","tool_use_result":{"stdout":"[main 35e23e1] add hello\n 1 file changed, 1 insertion(+)\n create mode 100644 hello.txt","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false,"gitOperation":{"commit":{"sha":"35e23e1","kind":"committed","branch":"main"}}},"tool_result_meta":[{"id":"toolu_01WP5nDgtoyGTdxNMU9w39Ly","permission_decision":{"decision":"accept","source":"config","reason_type":"mode"}}]}} +{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","uuid":"529409a4-9b19-4a2e-bc46-f96468e819f5"}} +{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3PEJ4TBHgaMd9g7keMD","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_019UGBnUqxgCSZcXCuXa1cUS","name":"mcp__byre__finish","input":{},"caller":{"type":"direct"}}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":379,"cache_read_input_tokens":42426,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":379},"output_tokens":24,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","uuid":"5e623e53-f122-49c3-be8b-2be1ded4f8e9","timestamp":"2026-10-15T04:22:35.420Z","request_id":"req_011Cg3PEHirntAt2JQYuBvZn","wire_tool_inputs":{"toolu_019UGBnUqxgCSZcXCuXa1cUS":{}},"tool_use_meta":[{"id":"toolu_019UGBnUqxgCSZcXCuXa1cUS","display_name":"Finish","server_display_name":"byre"}]}} +{"dir":"recv","msg":{"type":"control_request","request_id":"5384267d-1c19-418a-9182-34dc0b685691","request":{"subtype":"mcp_message","server_name":"byre","message":{"method":"tools/call","params":{"name":"finish","arguments":{},"_meta":{"claudecode/toolUseId":"toolu_019UGBnUqxgCSZcXCuXa1cUS","progressToken":2}},"jsonrpc":"2.0","id":2}}}} +{"dir":"send","msg":{"response":{"request_id":"5384267d-1c19-418a-9182-34dc0b685691","response":{"mcp_response":{"jsonrpc":"2.0","id":2,"result":{"content":[{"type":"text","text":"noted"}]}}},"subtype":"success"},"type":"control_response"}} +{"dir":"recv","msg":{"type":"control_request","request_id":"5dd32843-a432-4c6a-8037-ae59116a31b4","request":{"subtype":"hook_callback","callback_id":"hook_0","input":{"session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","transcript_path":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestCommitIdentityHooksAndMCP671040166-001/5e94ceb3-1c19-4499-b690-3c2bb2e15182.jsonl","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestCommitIdentityHooksAndMCP671040166/001","scratchpad_dir":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestCommitIdentityHooksAndMCP671040166-001/5e94ceb3-1c19-4499-b690-3c2bb2e15182/scratchpad","prompt_id":"7a66b2ff-760c-4c7e-b50e-1d01cad63707","permission_mode":"bypassPermissions","effort":{"level":"medium"},"hook_event_name":"PostToolUse","tool_name":"mcp__byre__finish","tool_input":{},"tool_response":[{"type":"text","text":"noted"}],"tool_use_id":"toolu_019UGBnUqxgCSZcXCuXa1cUS","duration_ms":2,"mcp_server":{"name":"byre","source":"sdk"}},"tool_use_id":"toolu_019UGBnUqxgCSZcXCuXa1cUS"}}} +{"dir":"send","msg":{"response":{"request_id":"5dd32843-a432-4c6a-8037-ae59116a31b4","response":{},"subtype":"success"},"type":"control_response"}} +{"dir":"recv","msg":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_019UGBnUqxgCSZcXCuXa1cUS","type":"tool_result","content":[{"type":"text","text":"noted"}]}]},"parent_tool_use_id":null,"session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","uuid":"d1b8ae5e-a68a-4399-9682-46b9e607728d","timestamp":"2026-10-15T04:22:35.425Z","tool_use_result":[{"type":"text","text":"noted"}],"tool_result_meta":[{"id":"toolu_019UGBnUqxgCSZcXCuXa1cUS","permission_decision":{"decision":"accept","source":"config","reason_type":"mode"}}]}} +{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","uuid":"ce88dbd1-a902-4a96-a8a0-1f12dcd56ace"}} +{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3PEMcmFy4nt4Wg2wsw9","type":"message","role":"assistant","content":[{"type":"text","text":"I created `hello.txt` containing `hi`, staged it, and committed it to `main` with the message \"add hello\" (commit `35e23e1`). I then called the finish tool."}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":63,"cache_read_input_tokens":42805,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":63},"output_tokens":58,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","uuid":"8e0deeec-10cf-4e6e-9733-8a325035b00f","timestamp":"2026-10-15T04:22:36.736Z","request_id":"req_011Cg3PEMKAEBYYDJzjQP2V7"}} +{"dir":"recv","msg":{"duration_api_ms":7738,"stop_reason":"end_turn","session_id":"5e94ceb3-1c19-4499-b690-3c2bb2e15182","total_cost_usd":0.10176469999999999,"usage":{"input_tokens":8,"cache_creation_input_tokens":20443,"cache_read_input_tokens":145370,"output_tokens":531,"output_tokens_details":{"thinking_tokens":82},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":20443,"ephemeral_5m_input_tokens":0},"inference_geo":"global","iterations":[{"input_tokens":2,"output_tokens":58,"cache_read_input_tokens":42805,"cache_creation_input_tokens":63,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":63},"type":"message"}],"speed":"standard","fallback_credit":null},"modelUsage":{"claude-haiku-5-5":{"inputTokens":1207,"outputTokens":18,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.0001297,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-haiku-5-5","provider":"firstParty","costBasis":"list"},"claude-sonnet-5-5":{"inputTokens":8,"outputTokens":531,"cacheReadInputTokens":145370,"cacheCreationInputTokens":20443,"webSearchRequests":0,"costUSD":0.101635,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":82,"canonicalModel":"claude-sonnet-5-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"safety_stops":0,"is_error":false,"num_turns":4,"subtype":"success","api_error_status":null,"result":"I created `hello.txt` containing `hi`, staged it, and committed it to `main` with the message \"add hello\" (commit `35e23e1`). I then called the finish tool.","ttft_ms":2151,"type":"result","duration_ms":7339,"uuid":"4dbef309-2dec-4e81-a45f-9b0a8e3d1889","ttft_stream_ms":1186,"time_to_request_ms":23,"first_content_frame_ms":1186,"queued_turn_count":0,"result_index":0}} diff --git a/internal/claude/testdata/transcripts/TestImageInput.jsonl b/internal/claude/testdata/transcripts/TestImageInput.jsonl index 2105677..9514182 100644 --- a/internal/claude/testdata/transcripts/TestImageInput.jsonl +++ b/internal/claude/testdata/transcripts/TestImageInput.jsonl @@ -1,8 +1,8 @@ -{"dir":"send","msg":{"request":{"hooks":null,"subtype":"initialize"},"request_id":"req_bd4e94dcf4475fac","type":"control_request"}} -{"dir":"recv","msg":{"type":"control_response","response":{"subtype":"success","request_id":"req_bd4e94dcf4475fac","response":{"commands":[{"name":"deep-research","description":"Deep research harness — fan-out web searches, fetch sources, adversarially verify claims, synthesize a cited report. (dynamic workflow)","argumentHint":"","builtin":true},{"name":"design","description":"Make a new Design artifact from a brief","argumentHint":"[what to design]","builtin":true},{"name":"slides","description":"Make a new Slides deck artifact from a brief","argumentHint":"[what the deck is about]","builtin":true},{"name":"design-sync","description":"Push a React design system to claude.ai/design. This runs a converter that bundles the real component code (from Storybook or a bare package) and uploads it. Use when the user runs /design-sync or says \"sync my design system to Claude Design\".","argumentHint":"[\u003cproject hint, e.g. \"Acme DS\"\u003e]","builtin":true},{"name":"dataviz","description":"Use this skill whenever you are about to create ANY chart, graph, plot, dashboard, or data visualization, in ANY output medium — an HTML or React artifact, inline SVG, plotting code in any library (matplotlib, plotly, d3, Recharts, …), an image/PNG you will render and upload, or a chart shared into Slack. Read it BEFORE writing the first line of chart code, choosing chart colors, building a stat tile / meter / KPI row, or laying out a dashboard. When the destination is a first-party document connector (host-designated, never self-described) that renders live charts, hand it the rows (inline, or as an uploaded data file the chart cites) rather than a rendered PNG/SVG — a picture of a chart loses hover, data inspection and per-value comments. Produces visualizations that read as one system — elegant, accessible, consistent in light and dark — using a brand-neutral placeholder palette you swap for your own. Teaches a design-system-agnostic method: a form heuristic, a color formula with a runnable validator, mark specs, and interaction rules. A validated default palette is documented in `references/palette.md` — swap that file's values for your brand's. Triggers on: \"chart\", \"graph\", \"plot\", \"data viz\", \"visualization\", \"dashboard\", \"analytics\", \"visualize data\", \"categorical colors\", \"sequential / diverging palette\", \"stat tile\", \"sparkline\", \"heatmap\", \"legend\", \"axis\", \"tooltip\", \"chart colors\", \"color by series\".","argumentHint":"","builtin":true},{"name":"artifact-diagramming","description":"Diagramming know-how for Artifacts - when a picture earns its place, how to draw one that shows the real mechanism, and the inline-SVG mechanics that keep it legible in both themes.","argumentHint":"","builtin":true},{"name":"artifact-capabilities","description":"Runtime capabilities a published Artifact page can be granted — behavior static HTML cannot provide on its own, such as the page reading live or connected data, remembering what people do on it (a poll, a sign-up sheet, a checklist, a document edited in place — it saves new versions of itself), keeping state shared across viewers, knowing who is viewing, asking Claude a question of its own, storing files people add, handing the viewer a file to save, or using the viewer's camera, microphone, location, screen or device motion. Serves this user's live capability roster and the typed call definitions. Load it whenever any such runtime behavior would make an artifact more useful, before writing the page.","argumentHint":"","builtin":true},{"name":"update-config","description":"Use this skill to configure the Claude Code harness via settings.json. Automated behaviors (\"from now on when X\", \"each time X\", \"whenever X\", \"before/after X\") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions (\"allow X\", \"add permission\", \"move permission to\"), env vars (\"set X=Y\"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: \"allow npm commands\", \"add bq permission to global settings\", \"move permission to user settings\", \"set DEBUG=true\", \"when claude stops show X\". For simple settings like theme/model, suggest the /config command.","argumentHint":"","builtin":true},{"name":"verify","description":"Verify that a code change actually does what it's supposed to by exercising it end-to-end and observing behavior — drive the affected flow, not just tests or typecheck. Run before committing nontrivial changes; bootstraps this repo's project verify skill if none exists yet. Don't invoke it on a diff that only touches tests, docs, or other code with no runtime surface to drive (a change to product source always has one) — there's nothing to observe.","argumentHint":"","builtin":true},{"name":"debug","description":"Enable debug logging for this session and help diagnose issues","argumentHint":"[issue description]","builtin":true},{"name":"code-review","description":"Review the current diff, or a PR number/branch/path target, for correctness bugs (plus reuse/simplification/efficiency cleanups where the model's review recipe covers them) at the given effort level (low|medium|high|xhigh|max: from few high-confidence findings up to many, some of them uncertain; ultra: deep multi-agent review in the cloud); with no level given, it reuses the level you typed last. Pass --comment to post findings as inline PR comments, or --fix to apply the findings to the working tree after the review. Pass --max-findings \u003cn\u003e to report up to n findings, or --max-findings all for every finding. The choice stays until you pass --max-findings default. For ultra on a GitHub.com PR target, --post asks to post the finished review’s findings to the PR as a single comment from the user’s GitHub account (not a review; the launch dialog still confirms in interactive sessions, while non-interactive mode posts on the flag alone) and --no-post hides that option.","argumentHint":"[low|medium|high|xhigh|max|ultra] [--fix] [--comment] [\u003cpr#\u003e|\u003cbranch\u003e|\u003cpath\u003e] [--max-findings \u003cn\u003e|all]","aliases":["review"],"builtin":true},{"name":"simplify","description":"Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.","argumentHint":"[\u003ctarget\u003e]","builtin":true},{"name":"batch","description":"Research and plan a large-scale change, then execute it in parallel across 5–30 isolated worktree agents that each open a PR.","argumentHint":"\u003cinstruction\u003e","builtin":true},{"name":"fewer-permission-prompts","description":"Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.","argumentHint":"","builtin":true},{"name":"doctor","description":"Health-check the user's Claude Code setup and fix issues: diagnose installation health — what the `claude doctor` terminal diagnostics cover — from local data (duplicate or leftover installs, PATH, unparseable settings files, broken or colliding agent definitions, skills whose frontmatter fails to parse); find unused skills, MCP servers, and plugins versus their context cost and disable dead weight; deduplicate local CLAUDE.md files against checked-in ones; trim checked-in CLAUDE.md files by cutting content a session could derive from the codebase (directory layouts, tech-stack lists, architecture overviews) while keeping gotchas, rationale, and non-standard conventions; migrate always-loaded CLAUDE.md guidance into lazy skills and nested CLAUDE.md files; flag slow hooks and context-heavy extensions; check the installed version is current; make auto mode the default permission mode; and pre-approve frequently denied read-only commands. Use when the user asks for a doctor run, checkup, audit, tune-up, or cleanup of their Claude Code setup or configuration.","argumentHint":"[prompt-audit [\u003cpath\u003e]]","aliases":["checkup"],"builtin":true},{"name":"loop","description":"Run a prompt or slash command on a recurring interval (e.g. /loop 5m /foo). Omit the interval to let the model self-pace.","argumentHint":"[interval] [prompt]","aliases":["proactive"],"builtin":true},{"name":"schedule","description":"Create, update, list, or run scheduled cloud agents (routines) that execute on a cron schedule.","argumentHint":"","aliases":["routines"],"builtin":true},{"name":"claude-api","description":"Reference for the Claude API / Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude/Anthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing/model choice/limits/caching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent/MCP/tool-definition/multi-agent/RAG/LLM-judge/computer-use; generate/summarize/extract/classify/rewrite/converse over NL; debugging refusals/cutoffs/streaming/tool-calls/tokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).","argumentHint":"","builtin":true},{"name":"workflow-authoring","description":"Reference for writing a Workflow tool script (script API and gotchas, resume, quality patterns, worked examples). Load before authoring a script for a workflow the user already opted into; it does not itself authorize running one.","argumentHint":"","builtin":true},{"name":"run","description":"Launch and drive this project's app to see a change working. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real app (not just tests). First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns per project type (CLI, server, TUI, Electron, browser-driven, library).","argumentHint":"","builtin":true},{"name":"run-skill-generator","description":"Author or improve the run-\u003cunit\u003e skill - a per-project skill that tells agents how to build, launch, and drive this project's app. Use when the user asks to set up the project, get it running, write run instructions, or verify build/run steps work from a clean environment.","argumentHint":"","builtin":true},{"name":"plugin-authoring","description":"Make a mod: a change to Claude's own interface or behaviour, such as a live pane or panel, a band above the prompt, a status line, a toast, a slash command, or a hook on tool calls or prompts. Use to make, change or debug a mod or its hooks module.","argumentHint":"","builtin":true},{"name":"advisor","description":"Let Claude consult a stronger model at key moments","argumentHint":"[fable|opus|sonnet|off]","builtin":true},{"name":"agents","description":"(removed) Ask Claude to create/manage subagents, or edit .claude/agents/","argumentHint":"","builtin":true},{"name":"auto-mode-setup","description":"Teach auto mode about your environment, plus optional rule tweaks","argumentHint":"[--request-id \u003cuuid\u003e] (--wizard posture=… scope=… depth=… --propose | --expect-sha256 \u003c64-hex\u003e --apply-file \u003cpath\u003e)","builtin":true},{"name":"autocompact","description":"Configure the auto-compact window size","argumentHint":"[auto|\u003ctokens\u003e]","builtin":true},{"name":"clear","description":"Start a new session with empty context; previous session stays on disk (resumable with /resume)","argumentHint":"[name]","aliases":["reset","new"],"builtin":true},{"name":"color","description":"Set the prompt bar color for this session","argumentHint":"[red|blue|green|yellow|purple|orange|pink|cyan|default]","builtin":true},{"name":"compact","description":"Free up context by summarizing the conversation so far","argumentHint":"\u003coptional custom summarization instructions\u003e","builtin":true},{"name":"config","description":"Set a setting by key","argumentHint":"key=value","aliases":["settings"],"builtin":true},{"name":"output-style","description":"List output styles or switch to one","argumentHint":"[style]","builtin":true},{"name":"context","description":"Show current context usage","argumentHint":"","builtin":true},{"name":"effort","description":"Set effort level for model usage","argumentHint":"\u003clow|medium|high|xhigh|max|auto|ultracode [on|off]\u003e","builtin":true},{"name":"fast","description":"Toggle fast mode (Opus 5.5)","argumentHint":"[on|off]","builtin":true},{"name":"focus","description":"Toggle focus view: just your prompt, summary, and response","argumentHint":"[on|off]","builtin":true},{"name":"heapdump","description":"Dump the JS heap to the Desktop; on Linux with no Desktop folder, the home directory","argumentHint":"","builtin":true},{"name":"init","description":"Initialize a new CLAUDE.md file with codebase documentation","argumentHint":"","builtin":true},{"name":"mcp","description":"Manage MCP servers","argumentHint":"[reconnect|enable|disable [\u003cserver\u003e|all]]","builtin":true},{"name":"import","description":"Import config from another AI coding agent","argumentHint":"","builtin":true},{"name":"model","description":"Set the AI model for Claude Code","argumentHint":"\u003cmodel\u003e","builtin":true},{"name":"__remote-workflow","description":"Run the workflow script delivered in this session environment (server-launched sessions only)","argumentHint":"","builtin":true},{"name":"workflow-launch-exec","description":"Execute a server-launched workflow handoff (workflow_launch event sessions only)","argumentHint":"","builtin":true},{"name":"reload-plugins","description":"Activate pending plugin changes in the current session","argumentHint":"[--force]","builtin":true},{"name":"reload-skills","description":"Pick up skills added or changed on disk during this session","argumentHint":"","builtin":true},{"name":"rename","description":"Rename the current conversation","argumentHint":"[name]","aliases":["name"],"builtin":true},{"name":"ultrareview","description":"Start a cloud agent that finds and verifies bugs in your branch (~15-25 min, $5-$25 USD) · Runs in a cloud session. See https://code.claude.com/docs/en/claude-code-on-the-web","argumentHint":"","builtin":true},{"name":"security-review","description":"Complete a security review of the pending changes on the current branch","argumentHint":"","builtin":true},{"name":"usage-credits","description":"Configure usage credits or request them from your admin when you hit a limit","argumentHint":"","builtin":true},{"name":"extra-usage","description":"Renamed to /usage-credits","argumentHint":"","builtin":true},{"name":"usage","description":"Show session cost, plan usage, and what's contributing to your limits","argumentHint":"","aliases":["cost","stats"],"builtin":true},{"name":"insights","description":"Generate a report analyzing your Claude Code sessions","argumentHint":"","builtin":true},{"name":"recap","description":"Generate a one-line session recap now","argumentHint":"","builtin":true},{"name":"skill-doctor","description":"Show which loaded skills are unused and costing context","argumentHint":"","builtin":true},{"name":"goal","description":"Set a goal — keep working until the condition is met","argumentHint":"","builtin":true},{"name":"design-consent","description":"Grant Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"design-revoke","description":"Revoke Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"list-agents","description":"List subagents, teammates, and other Claude sessions you can message","argumentHint":"","aliases":["peers"],"builtin":true},{"name":"team-onboarding","description":"Help teammates ramp on Claude Code with a guide from your usage","argumentHint":"","builtin":true},{"name":"docs","description":"docs (editable docs people share and comment on; the default for any document, named as a doc or not: a document, report, proposal, resume, cover letter, letter, contract, policy, form, template, worksheet, essay, handbook, guide, how-to, cheat sheet, SOP or other writing to keep, share, collaborate on, send, submit, print or sign; a doc exports to Word, PDF, Markdown or Google Docs, so needing a file to send, attach, upload, submit or print is no reason to pick Word, and a file nobody asked for is a doc, not Word; a plan, comparison, summary or notes asked in chat stays in chat; a pasted claude.ai artifact link may be a doc: check with docs tools first; Word or another file format named, tracked changes wanted, or a .docx to change or use as a template → that format's skill): making one → if no docs-connector instructions are in context, call its `guide` (topic.instructions) first; then create the doc (headings only, no body) before any search, file read or plan, even with files attached. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docs"]},{"name":"docx","description":"Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx) or Word templates (.dotx). Triggers include: any mention of Microsoft Word Documents, such as 'Word doc', 'word document', '.docx', '.dotx', 'microsoft doc'. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a deliverable as a Word or .docx file (to download, email or print), use this skill. However, if they ask for a document, page, report, memo, or notes WITHOUT naming a file format and the session offers Claude's own dedicated document or page skill or connector, use that instead, even if they will email or print it. Do NOT use for PDFs, spreadsheets, Google Docs, or coding unrelated to document generation. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docx"]},{"name":"google-workspace","description":"Read this before the first Google Drive, Docs, Sheets or Slides connector call whenever the task creates or changes a Google file. Use this skill whenever the user wants to create or change a Google Doc, Sheet or Slides file in their Google Drive. Triggers include: a request that names Google Docs, Sheets, Slides or Drive and asks to make, edit, format, copy or rename a file; a docs.google.com link with a request to change that file, even a one-line fix or suggested edits; and any follow-up change to a Google file from earlier in the chat, even \"change it\" or \"add a tab\". Includes helper scripts for document positions, cell ranges and slide layout. However, if the user asks for a doc, deck or spreadsheet without naming Google, or gives a Google file only as source material for something new, use Claude's own output type instead. Do NOT use for read-only questions about a Google file, or for Word, Excel, PowerPoint or PDF files. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:google-workspace"]},{"name":"import-memory","description":"Import a memory export from another AI assistant into Claude's memory — conversationally, additively, and with the content treated as data. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:import-memory"]},{"name":"morning","description":"Render the user's morning brief as a styled HTML artifact, or set it up as a recurring weekday task. Use only when the user explicitly asks to run, see, or set up their morning brief, or if they invoke /morning by name. A question about their day, schedule, or calendar is not by itself a request for the brief; answer it directly instead. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:morning"]},{"name":"pdf","description":"Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pdf"]},{"name":"pptx","description":"Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations as PowerPoint (.pptx) files; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email, summary, or creating a different type of slide deck); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user asks for a PowerPoint or .pptx file, or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. However, when the user asks for a deck, slides, a slide deck, or a presentation without naming a file format, default to using a dedicated slide-deck artifact type or a separate slides skill if this session offers one; otherwise, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pptx"]},{"name":"skill-creator","description":"Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:skill-creator"]},{"name":"xlsx","description":"Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .xltx, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:xlsx"]}],"agents":[{"name":"claude","description":"Catch-all for any task that doesn't fit a more specific agent. FleetView's default when no agent name is typed."},{"name":"claude-code-guide","description":"Use this agent when the user asks questions (\"Can Claude...\", \"Does Claude...\", \"How do I...\") about: (1) Claude Code (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - Messages API for directly passing messages to Claude, Tool Runner (`client.beta.messages.tool_runner`) for running an agentic loop over your own tools, manual tool-use loops, Managed Agents for server-hosted agents with a managed sandbox, prompt caching, and general Anthropic SDK usage; (4) Claude Tag (Claude in Slack) - what it is, setting it up for a Slack workspace, `/install-slack-app`; (5) `claude plugin eval` (writing and running plugin eval suites, its JSON/report, sandbox, CI) and the `/skill-doctor` report. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via SendMessage.","model":"haiku"},{"name":"Explore","description":"Fast read-only search agent for locating code. Use it to find files by pattern (eg. \"src/components/**/*.tsx\"), grep for symbols or keywords (eg. \"API endpoints\"), or answer \"where is X defined / which files reference Y.\" Do NOT use it for code review, design-doc auditing, cross-file consistency checks, or open-ended analysis — it reads excerpts rather than whole files and will miss content past its read window. When calling, specify search breadth: \"quick\" for a single targeted lookup, \"medium\" for moderate exploration, or \"very thorough\" to search across multiple locations and naming conventions.","model":"inherit"},{"name":"general-purpose","description":"General-purpose agent for researching complex questions, searching for code, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you."},{"name":"Plan","description":"Software architect agent for designing implementation plans. Use this when you need to plan the implementation strategy for a task. Returns step-by-step plans, identifies critical files, and considers architectural trade-offs.","model":"inherit"},{"name":"statusline-setup","description":"Use this agent to configure the user's Claude Code status line setting.","model":"sonnet"}],"output_style":"default","available_output_styles":["default","Proactive","Concise","Explanatory","Learning"],"user_output_styles_dir":"/Users/flamingcow/.claude/output-styles","models":[{"value":"default","resolvedModel":"claude-opus-5-5","displayName":"Default (recommended)","description":"Opus 5.5 · Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"opus","resolvedModel":"claude-opus-5-5","displayName":"Opus 5.5","description":"For complex work and everyday tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"fable","resolvedModel":"claude-fable-5-1","displayName":"Fable 5.1","description":"For your toughest challenges","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"sonnet","resolvedModel":"claude-sonnet-5-5","displayName":"Sonnet 5.5","description":"Most efficient for simpler tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"haiku","resolvedModel":"claude-haiku-5-5","displayName":"Haiku 5.5","description":"Fastest for quick answers","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-haiku-4-5-20251001","resolvedModel":"claude-haiku-4-5-20251001","displayName":"Haiku 4.5","description":"Fastest for quick answers"},{"value":"claude-sonnet-5","resolvedModel":"claude-sonnet-5","displayName":"Sonnet 5","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-5","resolvedModel":"claude-opus-5","displayName":"Opus 5","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-fable-5","resolvedModel":"claude-fable-5","displayName":"Fable 5","description":"Most capable for your hardest and longest-running tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-8","resolvedModel":"claude-opus-4-8","displayName":"Opus 4.8","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-opus-4-7","resolvedModel":"claude-opus-4-7","displayName":"Opus 4.7","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-6","resolvedModel":"claude-opus-4-6","displayName":"Opus 4.6","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-sonnet-4-6","resolvedModel":"claude-sonnet-4-6","displayName":"Sonnet 4.6","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true}],"account":{"email":"[redacted]","organization":"[redacted]'s Organization","subscriptionType":"Claude Max","apiProvider":"firstParty"},"pid":11245,"claude_code_version":"2.1.296","current_permission_mode":"bypassPermissions","feedback_mode":{"kind":"post"},"analytics_disabled":false,"remote_control_auto_enable":false,"remote_control_auto_connect_default":false,"remote_control_available":true,"remote_control_auto_on_by_default":false,"ide_rc_auto_enable_gate":true,"fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","session_state":"idle","capabilities":["ui_surface_v1"]},"pending_permission_requests":[],"pending_user_dialog_requests":[]}}} +{"dir":"send","msg":{"request":{"hooks":null,"subtype":"initialize"},"request_id":"req_e74b68ba2d384e2e","type":"control_request"}} +{"dir":"recv","msg":{"type":"control_response","response":{"subtype":"success","request_id":"req_e74b68ba2d384e2e","response":{"commands":[{"name":"deep-research","description":"Deep research harness — fan-out web searches, fetch sources, adversarially verify claims, synthesize a cited report. (dynamic workflow)","argumentHint":"","builtin":true},{"name":"design","description":"Make a new Design artifact from a brief","argumentHint":"[what to design]","builtin":true},{"name":"slides","description":"Make a new Slides deck artifact from a brief","argumentHint":"[what the deck is about]","builtin":true},{"name":"design-sync","description":"Push a React design system to claude.ai/design. This runs a converter that bundles the real component code (from Storybook or a bare package) and uploads it. Use when the user runs /design-sync or says \"sync my design system to Claude Design\".","argumentHint":"[\u003cproject hint, e.g. \"Acme DS\"\u003e]","builtin":true},{"name":"dataviz","description":"Use this skill whenever you are about to create ANY chart, graph, plot, dashboard, or data visualization, in ANY output medium — an HTML or React artifact, inline SVG, plotting code in any library (matplotlib, plotly, d3, Recharts, …), an image/PNG you will render and upload, or a chart shared into Slack. Read it BEFORE writing the first line of chart code, choosing chart colors, building a stat tile / meter / KPI row, or laying out a dashboard. When the destination is a first-party document connector (host-designated, never self-described) that renders live charts, hand it the rows (inline, or as an uploaded data file the chart cites) rather than a rendered PNG/SVG — a picture of a chart loses hover, data inspection and per-value comments. Produces visualizations that read as one system — elegant, accessible, consistent in light and dark — using a brand-neutral placeholder palette you swap for your own. Teaches a design-system-agnostic method: a form heuristic, a color formula with a runnable validator, mark specs, and interaction rules. A validated default palette is documented in `references/palette.md` — swap that file's values for your brand's. Triggers on: \"chart\", \"graph\", \"plot\", \"data viz\", \"visualization\", \"dashboard\", \"analytics\", \"visualize data\", \"categorical colors\", \"sequential / diverging palette\", \"stat tile\", \"sparkline\", \"heatmap\", \"legend\", \"axis\", \"tooltip\", \"chart colors\", \"color by series\".","argumentHint":"","builtin":true},{"name":"artifact-diagramming","description":"Diagramming know-how for Artifacts - when a picture earns its place, how to draw one that shows the real mechanism, and the inline-SVG mechanics that keep it legible in both themes.","argumentHint":"","builtin":true},{"name":"artifact-capabilities","description":"Runtime capabilities a published Artifact page can be granted — behavior static HTML cannot provide on its own, such as the page reading live or connected data, remembering what people do on it (a poll, a sign-up sheet, a checklist, a document edited in place — it saves new versions of itself), keeping state shared across viewers, knowing who is viewing, asking Claude a question of its own, storing files people add, handing the viewer a file to save, or using the viewer's camera, microphone, location, screen or device motion. Serves this user's live capability roster and the typed call definitions. Load it whenever any such runtime behavior would make an artifact more useful, before writing the page.","argumentHint":"","builtin":true},{"name":"update-config","description":"Use this skill to configure the Claude Code harness via settings.json. Automated behaviors (\"from now on when X\", \"each time X\", \"whenever X\", \"before/after X\") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions (\"allow X\", \"add permission\", \"move permission to\"), env vars (\"set X=Y\"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: \"allow npm commands\", \"add bq permission to global settings\", \"move permission to user settings\", \"set DEBUG=true\", \"when claude stops show X\". For simple settings like theme/model, suggest the /config command.","argumentHint":"","builtin":true},{"name":"verify","description":"Verify that a code change actually does what it's supposed to by exercising it end-to-end and observing behavior — drive the affected flow, not just tests or typecheck. Run before committing nontrivial changes; bootstraps this repo's project verify skill if none exists yet. Don't invoke it on a diff that only touches tests, docs, or other code with no runtime surface to drive (a change to product source always has one) — there's nothing to observe.","argumentHint":"","builtin":true},{"name":"debug","description":"Enable debug logging for this session and help diagnose issues","argumentHint":"[issue description]","builtin":true},{"name":"code-review","description":"Review the current diff, or a PR number/branch/path target, for correctness bugs (plus reuse/simplification/efficiency cleanups where the model's review recipe covers them) at the given effort level (low|medium|high|xhigh|max: from few high-confidence findings up to many, some of them uncertain; ultra: deep multi-agent review in the cloud); with no level given, it reuses the level you typed last. Pass --comment to post findings as inline PR comments, or --fix to apply the findings to the working tree after the review. Pass --max-findings \u003cn\u003e to report up to n findings, or --max-findings all for every finding. The choice stays until you pass --max-findings default. For ultra on a GitHub.com PR target, --post asks to post the finished review’s findings to the PR as a single comment from the user’s GitHub account (not a review; the launch dialog still confirms in interactive sessions, while non-interactive mode posts on the flag alone) and --no-post hides that option.","argumentHint":"[low|medium|high|xhigh|max|ultra] [--fix] [--comment] [\u003cpr#\u003e|\u003cbranch\u003e|\u003cpath\u003e] [--max-findings \u003cn\u003e|all]","aliases":["review"],"builtin":true},{"name":"simplify","description":"Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.","argumentHint":"[\u003ctarget\u003e]","builtin":true},{"name":"batch","description":"Research and plan a large-scale change, then execute it in parallel across 5–30 isolated worktree agents that each open a PR.","argumentHint":"\u003cinstruction\u003e","builtin":true},{"name":"fewer-permission-prompts","description":"Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.","argumentHint":"","builtin":true},{"name":"doctor","description":"Health-check the user's Claude Code setup and fix issues: diagnose installation health — what the `claude doctor` terminal diagnostics cover — from local data (duplicate or leftover installs, PATH, unparseable settings files, broken or colliding agent definitions, skills whose frontmatter fails to parse); find unused skills, MCP servers, and plugins versus their context cost and disable dead weight; deduplicate local CLAUDE.md files against checked-in ones; trim checked-in CLAUDE.md files by cutting content a session could derive from the codebase (directory layouts, tech-stack lists, architecture overviews) while keeping gotchas, rationale, and non-standard conventions; migrate always-loaded CLAUDE.md guidance into lazy skills and nested CLAUDE.md files; flag slow hooks and context-heavy extensions; check the installed version is current; make auto mode the default permission mode; and pre-approve frequently denied read-only commands. Use when the user asks for a doctor run, checkup, audit, tune-up, or cleanup of their Claude Code setup or configuration.","argumentHint":"[prompt-audit [\u003cpath\u003e]]","aliases":["checkup"],"builtin":true},{"name":"loop","description":"Run a prompt or slash command on a recurring interval (e.g. /loop 5m /foo). Omit the interval to let the model self-pace.","argumentHint":"[interval] [prompt]","aliases":["proactive"],"builtin":true},{"name":"schedule","description":"Create, update, list, or run scheduled cloud agents (routines) that execute on a cron schedule.","argumentHint":"","aliases":["routines"],"builtin":true},{"name":"claude-api","description":"Reference for the Claude API / Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude/Anthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing/model choice/limits/caching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent/MCP/tool-definition/multi-agent/RAG/LLM-judge/computer-use; generate/summarize/extract/classify/rewrite/converse over NL; debugging refusals/cutoffs/streaming/tool-calls/tokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).","argumentHint":"","builtin":true},{"name":"workflow-authoring","description":"Reference for writing a Workflow tool script (script API and gotchas, resume, quality patterns, worked examples). Load before authoring a script for a workflow the user already opted into; it does not itself authorize running one.","argumentHint":"","builtin":true},{"name":"run","description":"Launch and drive this project's app to see a change working. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real app (not just tests). First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns per project type (CLI, server, TUI, Electron, browser-driven, library).","argumentHint":"","builtin":true},{"name":"run-skill-generator","description":"Author or improve the run-\u003cunit\u003e skill - a per-project skill that tells agents how to build, launch, and drive this project's app. Use when the user asks to set up the project, get it running, write run instructions, or verify build/run steps work from a clean environment.","argumentHint":"","builtin":true},{"name":"plugin-authoring","description":"Make a mod: a change to Claude's own interface or behaviour, such as a live pane or panel, a band above the prompt, a status line, a toast, a slash command, or a hook on tool calls or prompts. Use to make, change or debug a mod or its hooks module.","argumentHint":"","builtin":true},{"name":"advisor","description":"Let Claude consult a stronger model at key moments","argumentHint":"[fable|opus|sonnet|off]","builtin":true},{"name":"agents","description":"(removed) Ask Claude to create/manage subagents, or edit .claude/agents/","argumentHint":"","builtin":true},{"name":"auto-mode-setup","description":"Teach auto mode about your environment, plus optional rule tweaks","argumentHint":"[--request-id \u003cuuid\u003e] (--wizard posture=… scope=… depth=… --propose | --expect-sha256 \u003c64-hex\u003e --apply-file \u003cpath\u003e)","builtin":true},{"name":"autocompact","description":"Configure the auto-compact window size","argumentHint":"[auto|\u003ctokens\u003e]","builtin":true},{"name":"clear","description":"Start a new session with empty context; previous session stays on disk (resumable with /resume)","argumentHint":"[name]","aliases":["reset","new"],"builtin":true},{"name":"color","description":"Set the prompt bar color for this session","argumentHint":"[red|blue|green|yellow|purple|orange|pink|cyan|default]","builtin":true},{"name":"compact","description":"Free up context by summarizing the conversation so far","argumentHint":"\u003coptional custom summarization instructions\u003e","builtin":true},{"name":"config","description":"Set a setting by key","argumentHint":"key=value","aliases":["settings"],"builtin":true},{"name":"output-style","description":"List output styles or switch to one","argumentHint":"[style]","builtin":true},{"name":"context","description":"Show current context usage","argumentHint":"","builtin":true},{"name":"effort","description":"Set effort level for model usage","argumentHint":"\u003clow|medium|high|xhigh|max|auto|ultracode [on|off]\u003e","builtin":true},{"name":"fast","description":"Toggle fast mode (Opus 5.5)","argumentHint":"[on|off]","builtin":true},{"name":"focus","description":"Toggle focus view: just your prompt, summary, and response","argumentHint":"[on|off]","builtin":true},{"name":"heapdump","description":"Dump the JS heap to the Desktop; on Linux with no Desktop folder, the home directory","argumentHint":"","builtin":true},{"name":"init","description":"Initialize a new CLAUDE.md file with codebase documentation","argumentHint":"","builtin":true},{"name":"mcp","description":"Manage MCP servers","argumentHint":"[reconnect|enable|disable [\u003cserver\u003e|all]]","builtin":true},{"name":"import","description":"Import config from another AI coding agent","argumentHint":"","builtin":true},{"name":"model","description":"Set the AI model for Claude Code","argumentHint":"\u003cmodel\u003e","builtin":true},{"name":"__remote-workflow","description":"Run the workflow script delivered in this session environment (server-launched sessions only)","argumentHint":"","builtin":true},{"name":"workflow-launch-exec","description":"Execute a server-launched workflow handoff (workflow_launch event sessions only)","argumentHint":"","builtin":true},{"name":"reload-plugins","description":"Activate pending plugin changes in the current session","argumentHint":"[--force]","builtin":true},{"name":"reload-skills","description":"Pick up skills added or changed on disk during this session","argumentHint":"","builtin":true},{"name":"rename","description":"Rename the current conversation","argumentHint":"[name]","aliases":["name"],"builtin":true},{"name":"ultrareview","description":"Start a cloud agent that finds and verifies bugs in your branch (~15-25 min, $5-$25 USD) · Runs in a cloud session. See https://code.claude.com/docs/en/claude-code-on-the-web","argumentHint":"","builtin":true},{"name":"security-review","description":"Complete a security review of the pending changes on the current branch","argumentHint":"","builtin":true},{"name":"usage-credits","description":"Configure usage credits or request them from your admin when you hit a limit","argumentHint":"","builtin":true},{"name":"extra-usage","description":"Renamed to /usage-credits","argumentHint":"","builtin":true},{"name":"usage","description":"Show session cost, plan usage, and what's contributing to your limits","argumentHint":"","aliases":["cost","stats"],"builtin":true},{"name":"insights","description":"Generate a report analyzing your Claude Code sessions","argumentHint":"","builtin":true},{"name":"recap","description":"Generate a one-line session recap now","argumentHint":"","builtin":true},{"name":"skill-doctor","description":"Show which loaded skills are unused and costing context","argumentHint":"","builtin":true},{"name":"goal","description":"Set a goal — keep working until the condition is met","argumentHint":"","builtin":true},{"name":"design-consent","description":"Grant Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"design-revoke","description":"Revoke Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"list-agents","description":"List subagents, teammates, and other Claude sessions you can message","argumentHint":"","aliases":["peers"],"builtin":true},{"name":"team-onboarding","description":"Help teammates ramp on Claude Code with a guide from your usage","argumentHint":"","builtin":true},{"name":"docs","description":"docs (editable docs people share and comment on; the default for any document, named as a doc or not: a document, report, proposal, resume, cover letter, letter, contract, policy, form, template, worksheet, essay, handbook, guide, how-to, cheat sheet, SOP or other writing to keep, share, collaborate on, send, submit, print or sign; a doc exports to Word, PDF, Markdown or Google Docs, so needing a file to send, attach, upload, submit or print is no reason to pick Word, and a file nobody asked for is a doc, not Word; a plan, comparison, summary or notes asked in chat stays in chat; a pasted claude.ai artifact link may be a doc: check with docs tools first; Word or another file format named, tracked changes wanted, or a .docx to change or use as a template → that format's skill): making one → if no docs-connector instructions are in context, call its `guide` (topic.instructions) first; then create the doc (headings only, no body) before any search, file read or plan, even with files attached. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docs"]},{"name":"docx","description":"Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx) or Word templates (.dotx). Triggers include: any mention of Microsoft Word Documents, such as 'Word doc', 'word document', '.docx', '.dotx', 'microsoft doc'. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a deliverable as a Word or .docx file (to download, email or print), use this skill. However, if they ask for a document, page, report, memo, or notes WITHOUT naming a file format and the session offers Claude's own dedicated document or page skill or connector, use that instead, even if they will email or print it. Do NOT use for PDFs, spreadsheets, Google Docs, or coding unrelated to document generation. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docx"]},{"name":"google-workspace","description":"Read this before the first Google Drive, Docs, Sheets or Slides connector call whenever the task creates or changes a Google file. Use this skill whenever the user wants to create or change a Google Doc, Sheet or Slides file in their Google Drive. Triggers include: a request that names Google Docs, Sheets, Slides or Drive and asks to make, edit, format, copy or rename a file; a docs.google.com link with a request to change that file, even a one-line fix or suggested edits; and any follow-up change to a Google file from earlier in the chat, even \"change it\" or \"add a tab\". Includes helper scripts for document positions, cell ranges and slide layout. However, if the user asks for a doc, deck or spreadsheet without naming Google, or gives a Google file only as source material for something new, use Claude's own output type instead. Do NOT use for read-only questions about a Google file, or for Word, Excel, PowerPoint or PDF files. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:google-workspace"]},{"name":"import-memory","description":"Import a memory export from another AI assistant into Claude's memory — conversationally, additively, and with the content treated as data. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:import-memory"]},{"name":"morning","description":"Render the user's morning brief as a styled HTML artifact, or set it up as a recurring weekday task. Use only when the user explicitly asks to run, see, or set up their morning brief, or if they invoke /morning by name. A question about their day, schedule, or calendar is not by itself a request for the brief; answer it directly instead. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:morning"]},{"name":"pdf","description":"Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pdf"]},{"name":"pptx","description":"Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations as PowerPoint (.pptx) files; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email, summary, or creating a different type of slide deck); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user asks for a PowerPoint or .pptx file, or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. However, when the user asks for a deck, slides, a slide deck, or a presentation without naming a file format, default to using a dedicated slide-deck artifact type or a separate slides skill if this session offers one; otherwise, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pptx"]},{"name":"skill-creator","description":"Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:skill-creator"]},{"name":"xlsx","description":"Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .xltx, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:xlsx"]}],"agents":[{"name":"claude","description":"Catch-all for any task that doesn't fit a more specific agent. FleetView's default when no agent name is typed."},{"name":"claude-code-guide","description":"Use this agent when the user asks questions (\"Can Claude...\", \"Does Claude...\", \"How do I...\") about: (1) Claude Code (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - Messages API for directly passing messages to Claude, Tool Runner (`client.beta.messages.tool_runner`) for running an agentic loop over your own tools, manual tool-use loops, Managed Agents for server-hosted agents with a managed sandbox, prompt caching, and general Anthropic SDK usage; (4) Claude Tag (Claude in Slack) - what it is, setting it up for a Slack workspace, `/install-slack-app`; (5) `claude plugin eval` (writing and running plugin eval suites, its JSON/report, sandbox, CI) and the `/skill-doctor` report. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via SendMessage.","model":"haiku"},{"name":"Explore","description":"Fast read-only search agent for locating code. Use it to find files by pattern (eg. \"src/components/**/*.tsx\"), grep for symbols or keywords (eg. \"API endpoints\"), or answer \"where is X defined / which files reference Y.\" Do NOT use it for code review, design-doc auditing, cross-file consistency checks, or open-ended analysis — it reads excerpts rather than whole files and will miss content past its read window. When calling, specify search breadth: \"quick\" for a single targeted lookup, \"medium\" for moderate exploration, or \"very thorough\" to search across multiple locations and naming conventions.","model":"inherit"},{"name":"general-purpose","description":"General-purpose agent for researching complex questions, searching for code, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you."},{"name":"Plan","description":"Software architect agent for designing implementation plans. Use this when you need to plan the implementation strategy for a task. Returns step-by-step plans, identifies critical files, and considers architectural trade-offs.","model":"inherit"},{"name":"statusline-setup","description":"Use this agent to configure the user's Claude Code status line setting.","model":"sonnet"}],"output_style":"default","available_output_styles":["default","Proactive","Concise","Explanatory","Learning"],"user_output_styles_dir":"/Users/flamingcow/.claude/output-styles","models":[{"value":"default","resolvedModel":"claude-opus-5-5","displayName":"Default (recommended)","description":"Opus 5.5 · Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"opus","resolvedModel":"claude-opus-5-5","displayName":"Opus 5.5","description":"For complex work and everyday tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"fable","resolvedModel":"claude-fable-5-1","displayName":"Fable 5.1","description":"For your toughest challenges","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"sonnet","resolvedModel":"claude-sonnet-5-5","displayName":"Sonnet 5.5","description":"Most efficient for simpler tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"haiku","resolvedModel":"claude-haiku-5-5","displayName":"Haiku 5.5","description":"Fastest for quick answers","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-haiku-4-5-20251001","resolvedModel":"claude-haiku-4-5-20251001","displayName":"Haiku 4.5","description":"Fastest for quick answers"},{"value":"claude-sonnet-5","resolvedModel":"claude-sonnet-5","displayName":"Sonnet 5","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-5","resolvedModel":"claude-opus-5","displayName":"Opus 5","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-fable-5","resolvedModel":"claude-fable-5","displayName":"Fable 5","description":"Most capable for your hardest and longest-running tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-8","resolvedModel":"claude-opus-4-8","displayName":"Opus 4.8","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-opus-4-7","resolvedModel":"claude-opus-4-7","displayName":"Opus 4.7","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-6","resolvedModel":"claude-opus-4-6","displayName":"Opus 4.6","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-sonnet-4-6","resolvedModel":"claude-sonnet-4-6","displayName":"Sonnet 4.6","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true}],"account":{"email":"[redacted]","organization":"[redacted]'s Organization","subscriptionType":"Claude Max","apiProvider":"firstParty"},"pid":12876,"claude_code_version":"2.1.296","current_permission_mode":"bypassPermissions","feedback_mode":{"kind":"post"},"analytics_disabled":false,"remote_control_auto_enable":false,"remote_control_auto_connect_default":false,"remote_control_available":true,"remote_control_auto_on_by_default":false,"ide_rc_auto_enable_gate":true,"fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","session_state":"idle","capabilities":["ui_surface_v1"]},"pending_permission_requests":[],"pending_user_dialog_requests":[]}}} {"dir":"send","msg":{"message":{"content":[{"source":{"data":"iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAIAAAAlC+aJAAAAZElEQVR4nOzPUQkAIBTAQBH7V9YQfhwPdgm2c9dsWwf8akBrQGtAa0BrQGtAa0BrQGtAa0BrQGtAa0BrQGtAa0BrQGtAa0BrQGtAa0BrQGtAa0BrQGtAa0BrQGtAa0B7AQAA///jRQGCmaQfxwAAAABJRU5ErkJggg==","media_type":"image/png","type":"base64"},"type":"image"},{"text":"Without using any tools, what single colour fills the attached image? Reply with just the colour name.","type":"text"}],"role":"user"},"parent_tool_use_id":null,"session_id":"","type":"user"}} -{"dir":"recv","msg":{"type":"system","subtype":"init","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestImageInput3552087307/001","session_id":"27219a33-152c-489c-9bf4-301fe264c5b7","tools":["Task","Artifact","ArtifactComments","ArtifactData","Bash","CronCreate","CronDelete","CronList","DesignSync","Edit","EnterWorktree","ExitWorktree","ListAgents","LSP","Monitor","NotebookEdit","PushNotification","Read","RemoteTrigger","ReportFindings","ScheduleWakeup","SendMessage","Skill","TaskStop","ToolSearch","WebFetch","WebSearch","Workflow","Write"],"mcp_servers":[{"name":"claude.ai Claude Docs","status":"pending","source":"claudeai"},{"name":"claude.ai Heliosian","status":"pending","source":"claudeai"},{"name":"claude.ai Fastmail","status":"pending","source":"claudeai"},{"name":"claude.ai Google Calendar","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Gmail","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Google Drive","status":"needs-auth","source":"claudeai"}],"model":"claude-sonnet-5-5","permissionMode":"bypassPermissions","slash_commands":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","advisor","agents","auto-mode-setup","autocompact","clear","color","compact","config","output-style","context","effort","fast","focus","heapdump","init","mcp","import","model","__remote-workflow","workflow-launch-exec","reload-plugins","reload-skills","rename","ultrareview","security-review","usage-credits","extra-usage","usage","insights","recap","skill-doctor","goal","design-consent","design-revoke","list-agents","team-onboarding","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"terminal_slash_commands":["doctor","color","focus","reload-plugins"],"apiKeySource":"none","claude_code_version":"2.1.296","output_style":"default","agents":["claude","claude-code-guide","Explore","general-purpose","Plan","statusline-setup"],"skills":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"plugins":[{"name":"clangd-lsp","path":"/Users/flamingcow/.claude/plugins/cache/claude-plugins-official/clangd-lsp/1.0.0","source":"clangd-lsp@claude-plugins-official","version":"1.0.0"},{"name":"cc-plugin-agents-md","path":"builtin","source":"cc-plugin-agents-md@builtin"},{"name":"cc-plugin-telemetry","path":"builtin","source":"cc-plugin-telemetry@builtin"},{"name":"cc-plugin-plugin-authoring","path":"builtin","source":"cc-plugin-plugin-authoring@builtin"}],"capabilities":["interrupt_receipt_v1","interrupt_cancel_queued_v1","interrupt_send_now_v1","msg_lifecycle_v1","request_marker_lists_v1","sdk_mcp_tools_list_changed","sdk_mcp_manifests","mcp_read_resource_v1","mcp_tool_ui_meta_v1","ui_surface_v1"],"analytics_disabled":false,"product_feedback_disabled":false,"uuid":"20fbc044-d758-4a26-b96a-d1af470a1b6a","memory_paths":{"auto":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestImageInput3552087307-001/memory/"},"scratchpad_path":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestImageInput3552087307-001/27219a33-152c-489c-9bf4-301fe264c5b7/scratchpad","messaging_socket_path":"/tmp/cc-socks/11245.sock","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","per_turn_effort_active":true,"view_mode":"default"}} -{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"27219a33-152c-489c-9bf4-301fe264c5b7","uuid":"27028f47-e34d-42ac-8095-cd993448b498"}} -{"dir":"recv","msg":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed","resetsAt":1792054200,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false,"unifiedWindows":{"five_hour":{"utilization":0.04,"resetsAt":1792054200},"seven_day":{"utilization":0.35,"resetsAt":1792270800}}},"uuid":"5aff3c9b-ece1-4f55-a4b4-cb8bee3c49d5","session_id":"27219a33-152c-489c-9bf4-301fe264c5b7"}} -{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3P8PsmdsU5GzbbAbfEX","type":"message","role":"assistant","content":[{"type":"text","text":"Red"}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":15352,"cache_read_input_tokens":22367,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15352},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"27219a33-152c-489c-9bf4-301fe264c5b7","uuid":"73c566dd-a99a-4533-b506-ac778c0a2434","timestamp":"2026-10-15T04:21:15.574Z","request_id":"req_011Cg3P8PbuKpVRtjpXP3kBb"}} -{"dir":"recv","msg":{"duration_api_ms":1772,"stop_reason":"end_turn","session_id":"27219a33-152c-489c-9bf4-301fe264c5b7","total_cost_usd":0.0638159,"usage":{"input_tokens":2,"cache_creation_input_tokens":15352,"cache_read_input_tokens":22367,"output_tokens":4,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":15352,"ephemeral_5m_input_tokens":0},"inference_geo":"global","iterations":[{"input_tokens":2,"output_tokens":4,"cache_read_input_tokens":22367,"cache_creation_input_tokens":15352,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15352},"type":"message"}],"speed":"standard","fallback_credit":null},"modelUsage":{"claude-haiku-5-5":{"inputTokens":1192,"outputTokens":16,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.0001272,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-haiku-5-5","provider":"firstParty","costBasis":"list"},"claude-sonnet-5-5":{"inputTokens":2,"outputTokens":4,"cacheReadInputTokens":22367,"cacheCreationInputTokens":15352,"webSearchRequests":0,"costUSD":0.0636887,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-sonnet-5-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"safety_stops":0,"is_error":false,"num_turns":1,"subtype":"success","api_error_status":null,"result":"Red","ttft_ms":1126,"type":"result","duration_ms":1146,"uuid":"9989f8c9-68ce-4201-804e-1dfb5557cf9c","ttft_stream_ms":1123,"time_to_request_ms":44,"first_content_frame_ms":1123,"queued_turn_count":0,"result_index":0}} +{"dir":"recv","msg":{"type":"system","subtype":"init","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestImageInput4181536126/001","session_id":"7102bb3c-8ea7-4adc-8362-46c79b0065fc","tools":["Task","Artifact","ArtifactComments","ArtifactData","Bash","CronCreate","CronDelete","CronList","DesignSync","Edit","EnterWorktree","ExitWorktree","ListAgents","LSP","Monitor","NotebookEdit","PushNotification","Read","RemoteTrigger","ReportFindings","ScheduleWakeup","SendMessage","Skill","TaskStop","ToolSearch","WebFetch","WebSearch","Workflow","Write"],"mcp_servers":[{"name":"claude.ai Claude Docs","status":"pending","source":"claudeai"},{"name":"claude.ai Heliosian","status":"pending","source":"claudeai"},{"name":"claude.ai Fastmail","status":"pending","source":"claudeai"},{"name":"claude.ai Google Calendar","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Gmail","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Google Drive","status":"needs-auth","source":"claudeai"}],"model":"claude-sonnet-5-5","permissionMode":"bypassPermissions","slash_commands":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","advisor","agents","auto-mode-setup","autocompact","clear","color","compact","config","output-style","context","effort","fast","focus","heapdump","init","mcp","import","model","__remote-workflow","workflow-launch-exec","reload-plugins","reload-skills","rename","ultrareview","security-review","usage-credits","extra-usage","usage","insights","recap","skill-doctor","goal","design-consent","design-revoke","list-agents","team-onboarding","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"terminal_slash_commands":["doctor","color","focus","reload-plugins"],"apiKeySource":"none","claude_code_version":"2.1.296","output_style":"default","agents":["claude","claude-code-guide","Explore","general-purpose","Plan","statusline-setup"],"skills":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"plugins":[{"name":"clangd-lsp","path":"/Users/flamingcow/.claude/plugins/cache/claude-plugins-official/clangd-lsp/1.0.0","source":"clangd-lsp@claude-plugins-official","version":"1.0.0"},{"name":"cc-plugin-agents-md","path":"builtin","source":"cc-plugin-agents-md@builtin"},{"name":"cc-plugin-telemetry","path":"builtin","source":"cc-plugin-telemetry@builtin"},{"name":"cc-plugin-plugin-authoring","path":"builtin","source":"cc-plugin-plugin-authoring@builtin"}],"capabilities":["interrupt_receipt_v1","interrupt_cancel_queued_v1","interrupt_send_now_v1","msg_lifecycle_v1","request_marker_lists_v1","sdk_mcp_tools_list_changed","sdk_mcp_manifests","mcp_read_resource_v1","mcp_tool_ui_meta_v1","ui_surface_v1"],"analytics_disabled":false,"product_feedback_disabled":false,"uuid":"4d344ba6-b300-4829-a854-6ae7617e6e5f","memory_paths":{"auto":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestImageInput4181536126-001/memory/"},"scratchpad_path":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestImageInput4181536126-001/7102bb3c-8ea7-4adc-8362-46c79b0065fc/scratchpad","messaging_socket_path":"/tmp/cc-socks/12876.sock","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","per_turn_effort_active":true,"view_mode":"default"}} +{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"7102bb3c-8ea7-4adc-8362-46c79b0065fc","uuid":"c3206c81-4906-499b-afe4-373b66e33581"}} +{"dir":"recv","msg":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed","resetsAt":1792054200,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false,"unifiedWindows":{"five_hour":{"utilization":0.05,"resetsAt":1792054200},"seven_day":{"utilization":0.35,"resetsAt":1792270800}}},"uuid":"798b01da-9d83-4e00-8c24-b36db9386c10","session_id":"7102bb3c-8ea7-4adc-8362-46c79b0065fc"}} +{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3PDvXeNQVcusvprc2kz","type":"message","role":"assistant","content":[{"type":"text","text":"Red"}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":15359,"cache_read_input_tokens":22367,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15359},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"7102bb3c-8ea7-4adc-8362-46c79b0065fc","uuid":"5423f570-2b32-4f0a-8ced-30ffee20e5e6","timestamp":"2026-10-15T04:22:32.694Z","request_id":"req_011Cg3PDvGXAHzfFELiuAv8d"}} +{"dir":"recv","msg":{"duration_api_ms":3919,"stop_reason":"end_turn","session_id":"7102bb3c-8ea7-4adc-8362-46c79b0065fc","total_cost_usd":0.0638439,"usage":{"input_tokens":2,"cache_creation_input_tokens":15359,"cache_read_input_tokens":22367,"output_tokens":4,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":15359,"ephemeral_5m_input_tokens":0},"inference_geo":"global","iterations":[{"input_tokens":2,"output_tokens":4,"cache_read_input_tokens":22367,"cache_creation_input_tokens":15359,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15359},"type":"message"}],"speed":"standard","fallback_credit":null},"modelUsage":{"claude-haiku-5-5":{"inputTokens":1192,"outputTokens":16,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.0001272,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-haiku-5-5","provider":"firstParty","costBasis":"list"},"claude-sonnet-5-5":{"inputTokens":2,"outputTokens":4,"cacheReadInputTokens":22367,"cacheCreationInputTokens":15359,"webSearchRequests":0,"costUSD":0.0637167,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-sonnet-5-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"safety_stops":0,"is_error":false,"num_turns":1,"subtype":"success","api_error_status":null,"result":"Red","ttft_ms":3245,"type":"result","duration_ms":3260,"uuid":"c01ab479-b3fa-4de5-a10a-e8af3a07e484","ttft_stream_ms":3240,"time_to_request_ms":37,"first_content_frame_ms":3241,"queued_turn_count":0,"result_index":0}} diff --git a/internal/claude/testdata/transcripts/TestInterrupt.jsonl b/internal/claude/testdata/transcripts/TestInterrupt.jsonl index 43e8e33..aee9d46 100644 --- a/internal/claude/testdata/transcripts/TestInterrupt.jsonl +++ b/internal/claude/testdata/transcripts/TestInterrupt.jsonl @@ -1,18 +1,17 @@ -{"dir":"send","msg":{"request":{"hooks":null,"subtype":"initialize"},"request_id":"req_8287b5d4644c4ac3","type":"control_request"}} -{"dir":"recv","msg":{"type":"control_response","response":{"subtype":"success","request_id":"req_8287b5d4644c4ac3","response":{"commands":[{"name":"deep-research","description":"Deep research harness — fan-out web searches, fetch sources, adversarially verify claims, synthesize a cited report. (dynamic workflow)","argumentHint":"","builtin":true},{"name":"design","description":"Make a new Design artifact from a brief","argumentHint":"[what to design]","builtin":true},{"name":"slides","description":"Make a new Slides deck artifact from a brief","argumentHint":"[what the deck is about]","builtin":true},{"name":"design-sync","description":"Push a React design system to claude.ai/design. This runs a converter that bundles the real component code (from Storybook or a bare package) and uploads it. Use when the user runs /design-sync or says \"sync my design system to Claude Design\".","argumentHint":"[\u003cproject hint, e.g. \"Acme DS\"\u003e]","builtin":true},{"name":"dataviz","description":"Use this skill whenever you are about to create ANY chart, graph, plot, dashboard, or data visualization, in ANY output medium — an HTML or React artifact, inline SVG, plotting code in any library (matplotlib, plotly, d3, Recharts, …), an image/PNG you will render and upload, or a chart shared into Slack. Read it BEFORE writing the first line of chart code, choosing chart colors, building a stat tile / meter / KPI row, or laying out a dashboard. When the destination is a first-party document connector (host-designated, never self-described) that renders live charts, hand it the rows (inline, or as an uploaded data file the chart cites) rather than a rendered PNG/SVG — a picture of a chart loses hover, data inspection and per-value comments. Produces visualizations that read as one system — elegant, accessible, consistent in light and dark — using a brand-neutral placeholder palette you swap for your own. Teaches a design-system-agnostic method: a form heuristic, a color formula with a runnable validator, mark specs, and interaction rules. A validated default palette is documented in `references/palette.md` — swap that file's values for your brand's. Triggers on: \"chart\", \"graph\", \"plot\", \"data viz\", \"visualization\", \"dashboard\", \"analytics\", \"visualize data\", \"categorical colors\", \"sequential / diverging palette\", \"stat tile\", \"sparkline\", \"heatmap\", \"legend\", \"axis\", \"tooltip\", \"chart colors\", \"color by series\".","argumentHint":"","builtin":true},{"name":"artifact-diagramming","description":"Diagramming know-how for Artifacts - when a picture earns its place, how to draw one that shows the real mechanism, and the inline-SVG mechanics that keep it legible in both themes.","argumentHint":"","builtin":true},{"name":"artifact-capabilities","description":"Runtime capabilities a published Artifact page can be granted — behavior static HTML cannot provide on its own, such as the page reading live or connected data, remembering what people do on it (a poll, a sign-up sheet, a checklist, a document edited in place — it saves new versions of itself), keeping state shared across viewers, knowing who is viewing, asking Claude a question of its own, storing files people add, handing the viewer a file to save, or using the viewer's camera, microphone, location, screen or device motion. Serves this user's live capability roster and the typed call definitions. Load it whenever any such runtime behavior would make an artifact more useful, before writing the page.","argumentHint":"","builtin":true},{"name":"update-config","description":"Use this skill to configure the Claude Code harness via settings.json. Automated behaviors (\"from now on when X\", \"each time X\", \"whenever X\", \"before/after X\") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions (\"allow X\", \"add permission\", \"move permission to\"), env vars (\"set X=Y\"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: \"allow npm commands\", \"add bq permission to global settings\", \"move permission to user settings\", \"set DEBUG=true\", \"when claude stops show X\". For simple settings like theme/model, suggest the /config command.","argumentHint":"","builtin":true},{"name":"verify","description":"Verify that a code change actually does what it's supposed to by exercising it end-to-end and observing behavior — drive the affected flow, not just tests or typecheck. Run before committing nontrivial changes; bootstraps this repo's project verify skill if none exists yet. Don't invoke it on a diff that only touches tests, docs, or other code with no runtime surface to drive (a change to product source always has one) — there's nothing to observe.","argumentHint":"","builtin":true},{"name":"debug","description":"Enable debug logging for this session and help diagnose issues","argumentHint":"[issue description]","builtin":true},{"name":"code-review","description":"Review the current diff, or a PR number/branch/path target, for correctness bugs (plus reuse/simplification/efficiency cleanups where the model's review recipe covers them) at the given effort level (low|medium|high|xhigh|max: from few high-confidence findings up to many, some of them uncertain; ultra: deep multi-agent review in the cloud); with no level given, it reuses the level you typed last. Pass --comment to post findings as inline PR comments, or --fix to apply the findings to the working tree after the review. Pass --max-findings \u003cn\u003e to report up to n findings, or --max-findings all for every finding. The choice stays until you pass --max-findings default. For ultra on a GitHub.com PR target, --post asks to post the finished review’s findings to the PR as a single comment from the user’s GitHub account (not a review; the launch dialog still confirms in interactive sessions, while non-interactive mode posts on the flag alone) and --no-post hides that option.","argumentHint":"[low|medium|high|xhigh|max|ultra] [--fix] [--comment] [\u003cpr#\u003e|\u003cbranch\u003e|\u003cpath\u003e] [--max-findings \u003cn\u003e|all]","aliases":["review"],"builtin":true},{"name":"simplify","description":"Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.","argumentHint":"[\u003ctarget\u003e]","builtin":true},{"name":"batch","description":"Research and plan a large-scale change, then execute it in parallel across 5–30 isolated worktree agents that each open a PR.","argumentHint":"\u003cinstruction\u003e","builtin":true},{"name":"fewer-permission-prompts","description":"Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.","argumentHint":"","builtin":true},{"name":"doctor","description":"Health-check the user's Claude Code setup and fix issues: diagnose installation health — what the `claude doctor` terminal diagnostics cover — from local data (duplicate or leftover installs, PATH, unparseable settings files, broken or colliding agent definitions, skills whose frontmatter fails to parse); find unused skills, MCP servers, and plugins versus their context cost and disable dead weight; deduplicate local CLAUDE.md files against checked-in ones; trim checked-in CLAUDE.md files by cutting content a session could derive from the codebase (directory layouts, tech-stack lists, architecture overviews) while keeping gotchas, rationale, and non-standard conventions; migrate always-loaded CLAUDE.md guidance into lazy skills and nested CLAUDE.md files; flag slow hooks and context-heavy extensions; check the installed version is current; make auto mode the default permission mode; and pre-approve frequently denied read-only commands. Use when the user asks for a doctor run, checkup, audit, tune-up, or cleanup of their Claude Code setup or configuration.","argumentHint":"[prompt-audit [\u003cpath\u003e]]","aliases":["checkup"],"builtin":true},{"name":"loop","description":"Run a prompt or slash command on a recurring interval (e.g. /loop 5m /foo). Omit the interval to let the model self-pace.","argumentHint":"[interval] [prompt]","aliases":["proactive"],"builtin":true},{"name":"schedule","description":"Create, update, list, or run scheduled cloud agents (routines) that execute on a cron schedule.","argumentHint":"","aliases":["routines"],"builtin":true},{"name":"claude-api","description":"Reference for the Claude API / Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude/Anthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing/model choice/limits/caching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent/MCP/tool-definition/multi-agent/RAG/LLM-judge/computer-use; generate/summarize/extract/classify/rewrite/converse over NL; debugging refusals/cutoffs/streaming/tool-calls/tokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).","argumentHint":"","builtin":true},{"name":"workflow-authoring","description":"Reference for writing a Workflow tool script (script API and gotchas, resume, quality patterns, worked examples). Load before authoring a script for a workflow the user already opted into; it does not itself authorize running one.","argumentHint":"","builtin":true},{"name":"run","description":"Launch and drive this project's app to see a change working. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real app (not just tests). First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns per project type (CLI, server, TUI, Electron, browser-driven, library).","argumentHint":"","builtin":true},{"name":"run-skill-generator","description":"Author or improve the run-\u003cunit\u003e skill - a per-project skill that tells agents how to build, launch, and drive this project's app. Use when the user asks to set up the project, get it running, write run instructions, or verify build/run steps work from a clean environment.","argumentHint":"","builtin":true},{"name":"plugin-authoring","description":"Make a mod: a change to Claude's own interface or behaviour, such as a live pane or panel, a band above the prompt, a status line, a toast, a slash command, or a hook on tool calls or prompts. Use to make, change or debug a mod or its hooks module.","argumentHint":"","builtin":true},{"name":"advisor","description":"Let Claude consult a stronger model at key moments","argumentHint":"[fable|opus|sonnet|off]","builtin":true},{"name":"agents","description":"(removed) Ask Claude to create/manage subagents, or edit .claude/agents/","argumentHint":"","builtin":true},{"name":"auto-mode-setup","description":"Teach auto mode about your environment, plus optional rule tweaks","argumentHint":"[--request-id \u003cuuid\u003e] (--wizard posture=… scope=… depth=… --propose | --expect-sha256 \u003c64-hex\u003e --apply-file \u003cpath\u003e)","builtin":true},{"name":"autocompact","description":"Configure the auto-compact window size","argumentHint":"[auto|\u003ctokens\u003e]","builtin":true},{"name":"clear","description":"Start a new session with empty context; previous session stays on disk (resumable with /resume)","argumentHint":"[name]","aliases":["reset","new"],"builtin":true},{"name":"color","description":"Set the prompt bar color for this session","argumentHint":"[red|blue|green|yellow|purple|orange|pink|cyan|default]","builtin":true},{"name":"compact","description":"Free up context by summarizing the conversation so far","argumentHint":"\u003coptional custom summarization instructions\u003e","builtin":true},{"name":"config","description":"Set a setting by key","argumentHint":"key=value","aliases":["settings"],"builtin":true},{"name":"output-style","description":"List output styles or switch to one","argumentHint":"[style]","builtin":true},{"name":"context","description":"Show current context usage","argumentHint":"","builtin":true},{"name":"effort","description":"Set effort level for model usage","argumentHint":"\u003clow|medium|high|xhigh|max|auto|ultracode [on|off]\u003e","builtin":true},{"name":"fast","description":"Toggle fast mode (Opus 5.5)","argumentHint":"[on|off]","builtin":true},{"name":"focus","description":"Toggle focus view: just your prompt, summary, and response","argumentHint":"[on|off]","builtin":true},{"name":"heapdump","description":"Dump the JS heap to the Desktop; on Linux with no Desktop folder, the home directory","argumentHint":"","builtin":true},{"name":"init","description":"Initialize a new CLAUDE.md file with codebase documentation","argumentHint":"","builtin":true},{"name":"mcp","description":"Manage MCP servers","argumentHint":"[reconnect|enable|disable [\u003cserver\u003e|all]]","builtin":true},{"name":"import","description":"Import config from another AI coding agent","argumentHint":"","builtin":true},{"name":"model","description":"Set the AI model for Claude Code","argumentHint":"\u003cmodel\u003e","builtin":true},{"name":"__remote-workflow","description":"Run the workflow script delivered in this session environment (server-launched sessions only)","argumentHint":"","builtin":true},{"name":"workflow-launch-exec","description":"Execute a server-launched workflow handoff (workflow_launch event sessions only)","argumentHint":"","builtin":true},{"name":"reload-plugins","description":"Activate pending plugin changes in the current session","argumentHint":"[--force]","builtin":true},{"name":"reload-skills","description":"Pick up skills added or changed on disk during this session","argumentHint":"","builtin":true},{"name":"rename","description":"Rename the current conversation","argumentHint":"[name]","aliases":["name"],"builtin":true},{"name":"ultrareview","description":"Start a cloud agent that finds and verifies bugs in your branch (~15-25 min, $5-$25 USD) · Runs in a cloud session. See https://code.claude.com/docs/en/claude-code-on-the-web","argumentHint":"","builtin":true},{"name":"security-review","description":"Complete a security review of the pending changes on the current branch","argumentHint":"","builtin":true},{"name":"usage-credits","description":"Configure usage credits or request them from your admin when you hit a limit","argumentHint":"","builtin":true},{"name":"extra-usage","description":"Renamed to /usage-credits","argumentHint":"","builtin":true},{"name":"usage","description":"Show session cost, plan usage, and what's contributing to your limits","argumentHint":"","aliases":["cost","stats"],"builtin":true},{"name":"insights","description":"Generate a report analyzing your Claude Code sessions","argumentHint":"","builtin":true},{"name":"recap","description":"Generate a one-line session recap now","argumentHint":"","builtin":true},{"name":"skill-doctor","description":"Show which loaded skills are unused and costing context","argumentHint":"","builtin":true},{"name":"goal","description":"Set a goal — keep working until the condition is met","argumentHint":"","builtin":true},{"name":"design-consent","description":"Grant Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"design-revoke","description":"Revoke Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"list-agents","description":"List subagents, teammates, and other Claude sessions you can message","argumentHint":"","aliases":["peers"],"builtin":true},{"name":"team-onboarding","description":"Help teammates ramp on Claude Code with a guide from your usage","argumentHint":"","builtin":true},{"name":"docs","description":"docs (editable docs people share and comment on; the default for any document, named as a doc or not: a document, report, proposal, resume, cover letter, letter, contract, policy, form, template, worksheet, essay, handbook, guide, how-to, cheat sheet, SOP or other writing to keep, share, collaborate on, send, submit, print or sign; a doc exports to Word, PDF, Markdown or Google Docs, so needing a file to send, attach, upload, submit or print is no reason to pick Word, and a file nobody asked for is a doc, not Word; a plan, comparison, summary or notes asked in chat stays in chat; a pasted claude.ai artifact link may be a doc: check with docs tools first; Word or another file format named, tracked changes wanted, or a .docx to change or use as a template → that format's skill): making one → if no docs-connector instructions are in context, call its `guide` (topic.instructions) first; then create the doc (headings only, no body) before any search, file read or plan, even with files attached. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docs"]},{"name":"docx","description":"Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx) or Word templates (.dotx). Triggers include: any mention of Microsoft Word Documents, such as 'Word doc', 'word document', '.docx', '.dotx', 'microsoft doc'. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a deliverable as a Word or .docx file (to download, email or print), use this skill. However, if they ask for a document, page, report, memo, or notes WITHOUT naming a file format and the session offers Claude's own dedicated document or page skill or connector, use that instead, even if they will email or print it. Do NOT use for PDFs, spreadsheets, Google Docs, or coding unrelated to document generation. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docx"]},{"name":"google-workspace","description":"Read this before the first Google Drive, Docs, Sheets or Slides connector call whenever the task creates or changes a Google file. Use this skill whenever the user wants to create or change a Google Doc, Sheet or Slides file in their Google Drive. Triggers include: a request that names Google Docs, Sheets, Slides or Drive and asks to make, edit, format, copy or rename a file; a docs.google.com link with a request to change that file, even a one-line fix or suggested edits; and any follow-up change to a Google file from earlier in the chat, even \"change it\" or \"add a tab\". Includes helper scripts for document positions, cell ranges and slide layout. However, if the user asks for a doc, deck or spreadsheet without naming Google, or gives a Google file only as source material for something new, use Claude's own output type instead. Do NOT use for read-only questions about a Google file, or for Word, Excel, PowerPoint or PDF files. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:google-workspace"]},{"name":"import-memory","description":"Import a memory export from another AI assistant into Claude's memory — conversationally, additively, and with the content treated as data. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:import-memory"]},{"name":"morning","description":"Render the user's morning brief as a styled HTML artifact, or set it up as a recurring weekday task. Use only when the user explicitly asks to run, see, or set up their morning brief, or if they invoke /morning by name. A question about their day, schedule, or calendar is not by itself a request for the brief; answer it directly instead. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:morning"]},{"name":"pdf","description":"Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pdf"]},{"name":"pptx","description":"Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations as PowerPoint (.pptx) files; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email, summary, or creating a different type of slide deck); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user asks for a PowerPoint or .pptx file, or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. However, when the user asks for a deck, slides, a slide deck, or a presentation without naming a file format, default to using a dedicated slide-deck artifact type or a separate slides skill if this session offers one; otherwise, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pptx"]},{"name":"skill-creator","description":"Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:skill-creator"]},{"name":"xlsx","description":"Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .xltx, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:xlsx"]}],"agents":[{"name":"claude","description":"Catch-all for any task that doesn't fit a more specific agent. FleetView's default when no agent name is typed."},{"name":"claude-code-guide","description":"Use this agent when the user asks questions (\"Can Claude...\", \"Does Claude...\", \"How do I...\") about: (1) Claude Code (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - Messages API for directly passing messages to Claude, Tool Runner (`client.beta.messages.tool_runner`) for running an agentic loop over your own tools, manual tool-use loops, Managed Agents for server-hosted agents with a managed sandbox, prompt caching, and general Anthropic SDK usage; (4) Claude Tag (Claude in Slack) - what it is, setting it up for a Slack workspace, `/install-slack-app`; (5) `claude plugin eval` (writing and running plugin eval suites, its JSON/report, sandbox, CI) and the `/skill-doctor` report. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via SendMessage.","model":"haiku"},{"name":"Explore","description":"Fast read-only search agent for locating code. Use it to find files by pattern (eg. \"src/components/**/*.tsx\"), grep for symbols or keywords (eg. \"API endpoints\"), or answer \"where is X defined / which files reference Y.\" Do NOT use it for code review, design-doc auditing, cross-file consistency checks, or open-ended analysis — it reads excerpts rather than whole files and will miss content past its read window. When calling, specify search breadth: \"quick\" for a single targeted lookup, \"medium\" for moderate exploration, or \"very thorough\" to search across multiple locations and naming conventions.","model":"inherit"},{"name":"general-purpose","description":"General-purpose agent for researching complex questions, searching for code, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you."},{"name":"Plan","description":"Software architect agent for designing implementation plans. Use this when you need to plan the implementation strategy for a task. Returns step-by-step plans, identifies critical files, and considers architectural trade-offs.","model":"inherit"},{"name":"statusline-setup","description":"Use this agent to configure the user's Claude Code status line setting.","model":"sonnet"}],"output_style":"default","available_output_styles":["default","Proactive","Concise","Explanatory","Learning"],"user_output_styles_dir":"/Users/flamingcow/.claude/output-styles","models":[{"value":"default","resolvedModel":"claude-opus-5-5","displayName":"Default (recommended)","description":"Opus 5.5 · Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"opus","resolvedModel":"claude-opus-5-5","displayName":"Opus 5.5","description":"For complex work and everyday tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"fable","resolvedModel":"claude-fable-5-1","displayName":"Fable 5.1","description":"For your toughest challenges","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"sonnet","resolvedModel":"claude-sonnet-5-5","displayName":"Sonnet 5.5","description":"Most efficient for simpler tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"haiku","resolvedModel":"claude-haiku-5-5","displayName":"Haiku 5.5","description":"Fastest for quick answers","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-haiku-4-5-20251001","resolvedModel":"claude-haiku-4-5-20251001","displayName":"Haiku 4.5","description":"Fastest for quick answers"},{"value":"claude-sonnet-5","resolvedModel":"claude-sonnet-5","displayName":"Sonnet 5","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-5","resolvedModel":"claude-opus-5","displayName":"Opus 5","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-fable-5","resolvedModel":"claude-fable-5","displayName":"Fable 5","description":"Most capable for your hardest and longest-running tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-8","resolvedModel":"claude-opus-4-8","displayName":"Opus 4.8","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-opus-4-7","resolvedModel":"claude-opus-4-7","displayName":"Opus 4.7","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-6","resolvedModel":"claude-opus-4-6","displayName":"Opus 4.6","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-sonnet-4-6","resolvedModel":"claude-sonnet-4-6","displayName":"Sonnet 4.6","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true}],"account":{"email":"[redacted]","organization":"[redacted]'s Organization","subscriptionType":"Claude Max","apiProvider":"firstParty"},"pid":11241,"claude_code_version":"2.1.296","current_permission_mode":"bypassPermissions","feedback_mode":{"kind":"post"},"analytics_disabled":false,"remote_control_auto_enable":false,"remote_control_auto_connect_default":false,"remote_control_available":true,"remote_control_auto_on_by_default":false,"ide_rc_auto_enable_gate":true,"fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","session_state":"idle","capabilities":["ui_surface_v1"]},"pending_permission_requests":[],"pending_user_dialog_requests":[]}}} +{"dir":"send","msg":{"request":{"hooks":null,"subtype":"initialize"},"request_id":"req_e75c82e9a93fa7cd","type":"control_request"}} +{"dir":"recv","msg":{"type":"control_response","response":{"subtype":"success","request_id":"req_e75c82e9a93fa7cd","response":{"commands":[{"name":"deep-research","description":"Deep research harness — fan-out web searches, fetch sources, adversarially verify claims, synthesize a cited report. (dynamic workflow)","argumentHint":"","builtin":true},{"name":"design","description":"Make a new Design artifact from a brief","argumentHint":"[what to design]","builtin":true},{"name":"slides","description":"Make a new Slides deck artifact from a brief","argumentHint":"[what the deck is about]","builtin":true},{"name":"design-sync","description":"Push a React design system to claude.ai/design. This runs a converter that bundles the real component code (from Storybook or a bare package) and uploads it. Use when the user runs /design-sync or says \"sync my design system to Claude Design\".","argumentHint":"[\u003cproject hint, e.g. \"Acme DS\"\u003e]","builtin":true},{"name":"dataviz","description":"Use this skill whenever you are about to create ANY chart, graph, plot, dashboard, or data visualization, in ANY output medium — an HTML or React artifact, inline SVG, plotting code in any library (matplotlib, plotly, d3, Recharts, …), an image/PNG you will render and upload, or a chart shared into Slack. Read it BEFORE writing the first line of chart code, choosing chart colors, building a stat tile / meter / KPI row, or laying out a dashboard. When the destination is a first-party document connector (host-designated, never self-described) that renders live charts, hand it the rows (inline, or as an uploaded data file the chart cites) rather than a rendered PNG/SVG — a picture of a chart loses hover, data inspection and per-value comments. Produces visualizations that read as one system — elegant, accessible, consistent in light and dark — using a brand-neutral placeholder palette you swap for your own. Teaches a design-system-agnostic method: a form heuristic, a color formula with a runnable validator, mark specs, and interaction rules. A validated default palette is documented in `references/palette.md` — swap that file's values for your brand's. Triggers on: \"chart\", \"graph\", \"plot\", \"data viz\", \"visualization\", \"dashboard\", \"analytics\", \"visualize data\", \"categorical colors\", \"sequential / diverging palette\", \"stat tile\", \"sparkline\", \"heatmap\", \"legend\", \"axis\", \"tooltip\", \"chart colors\", \"color by series\".","argumentHint":"","builtin":true},{"name":"artifact-diagramming","description":"Diagramming know-how for Artifacts - when a picture earns its place, how to draw one that shows the real mechanism, and the inline-SVG mechanics that keep it legible in both themes.","argumentHint":"","builtin":true},{"name":"artifact-capabilities","description":"Runtime capabilities a published Artifact page can be granted — behavior static HTML cannot provide on its own, such as the page reading live or connected data, remembering what people do on it (a poll, a sign-up sheet, a checklist, a document edited in place — it saves new versions of itself), keeping state shared across viewers, knowing who is viewing, asking Claude a question of its own, storing files people add, handing the viewer a file to save, or using the viewer's camera, microphone, location, screen or device motion. Serves this user's live capability roster and the typed call definitions. Load it whenever any such runtime behavior would make an artifact more useful, before writing the page.","argumentHint":"","builtin":true},{"name":"update-config","description":"Use this skill to configure the Claude Code harness via settings.json. Automated behaviors (\"from now on when X\", \"each time X\", \"whenever X\", \"before/after X\") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions (\"allow X\", \"add permission\", \"move permission to\"), env vars (\"set X=Y\"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: \"allow npm commands\", \"add bq permission to global settings\", \"move permission to user settings\", \"set DEBUG=true\", \"when claude stops show X\". For simple settings like theme/model, suggest the /config command.","argumentHint":"","builtin":true},{"name":"verify","description":"Verify that a code change actually does what it's supposed to by exercising it end-to-end and observing behavior — drive the affected flow, not just tests or typecheck. Run before committing nontrivial changes; bootstraps this repo's project verify skill if none exists yet. Don't invoke it on a diff that only touches tests, docs, or other code with no runtime surface to drive (a change to product source always has one) — there's nothing to observe.","argumentHint":"","builtin":true},{"name":"debug","description":"Enable debug logging for this session and help diagnose issues","argumentHint":"[issue description]","builtin":true},{"name":"code-review","description":"Review the current diff, or a PR number/branch/path target, for correctness bugs (plus reuse/simplification/efficiency cleanups where the model's review recipe covers them) at the given effort level (low|medium|high|xhigh|max: from few high-confidence findings up to many, some of them uncertain; ultra: deep multi-agent review in the cloud); with no level given, it reuses the level you typed last. Pass --comment to post findings as inline PR comments, or --fix to apply the findings to the working tree after the review. Pass --max-findings \u003cn\u003e to report up to n findings, or --max-findings all for every finding. The choice stays until you pass --max-findings default. For ultra on a GitHub.com PR target, --post asks to post the finished review’s findings to the PR as a single comment from the user’s GitHub account (not a review; the launch dialog still confirms in interactive sessions, while non-interactive mode posts on the flag alone) and --no-post hides that option.","argumentHint":"[low|medium|high|xhigh|max|ultra] [--fix] [--comment] [\u003cpr#\u003e|\u003cbranch\u003e|\u003cpath\u003e] [--max-findings \u003cn\u003e|all]","aliases":["review"],"builtin":true},{"name":"simplify","description":"Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.","argumentHint":"[\u003ctarget\u003e]","builtin":true},{"name":"batch","description":"Research and plan a large-scale change, then execute it in parallel across 5–30 isolated worktree agents that each open a PR.","argumentHint":"\u003cinstruction\u003e","builtin":true},{"name":"fewer-permission-prompts","description":"Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.","argumentHint":"","builtin":true},{"name":"doctor","description":"Health-check the user's Claude Code setup and fix issues: diagnose installation health — what the `claude doctor` terminal diagnostics cover — from local data (duplicate or leftover installs, PATH, unparseable settings files, broken or colliding agent definitions, skills whose frontmatter fails to parse); find unused skills, MCP servers, and plugins versus their context cost and disable dead weight; deduplicate local CLAUDE.md files against checked-in ones; trim checked-in CLAUDE.md files by cutting content a session could derive from the codebase (directory layouts, tech-stack lists, architecture overviews) while keeping gotchas, rationale, and non-standard conventions; migrate always-loaded CLAUDE.md guidance into lazy skills and nested CLAUDE.md files; flag slow hooks and context-heavy extensions; check the installed version is current; make auto mode the default permission mode; and pre-approve frequently denied read-only commands. Use when the user asks for a doctor run, checkup, audit, tune-up, or cleanup of their Claude Code setup or configuration.","argumentHint":"[prompt-audit [\u003cpath\u003e]]","aliases":["checkup"],"builtin":true},{"name":"loop","description":"Run a prompt or slash command on a recurring interval (e.g. /loop 5m /foo). Omit the interval to let the model self-pace.","argumentHint":"[interval] [prompt]","aliases":["proactive"],"builtin":true},{"name":"schedule","description":"Create, update, list, or run scheduled cloud agents (routines) that execute on a cron schedule.","argumentHint":"","aliases":["routines"],"builtin":true},{"name":"claude-api","description":"Reference for the Claude API / Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude/Anthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing/model choice/limits/caching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent/MCP/tool-definition/multi-agent/RAG/LLM-judge/computer-use; generate/summarize/extract/classify/rewrite/converse over NL; debugging refusals/cutoffs/streaming/tool-calls/tokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).","argumentHint":"","builtin":true},{"name":"workflow-authoring","description":"Reference for writing a Workflow tool script (script API and gotchas, resume, quality patterns, worked examples). Load before authoring a script for a workflow the user already opted into; it does not itself authorize running one.","argumentHint":"","builtin":true},{"name":"run","description":"Launch and drive this project's app to see a change working. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real app (not just tests). First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns per project type (CLI, server, TUI, Electron, browser-driven, library).","argumentHint":"","builtin":true},{"name":"run-skill-generator","description":"Author or improve the run-\u003cunit\u003e skill - a per-project skill that tells agents how to build, launch, and drive this project's app. Use when the user asks to set up the project, get it running, write run instructions, or verify build/run steps work from a clean environment.","argumentHint":"","builtin":true},{"name":"plugin-authoring","description":"Make a mod: a change to Claude's own interface or behaviour, such as a live pane or panel, a band above the prompt, a status line, a toast, a slash command, or a hook on tool calls or prompts. Use to make, change or debug a mod or its hooks module.","argumentHint":"","builtin":true},{"name":"advisor","description":"Let Claude consult a stronger model at key moments","argumentHint":"[fable|opus|sonnet|off]","builtin":true},{"name":"agents","description":"(removed) Ask Claude to create/manage subagents, or edit .claude/agents/","argumentHint":"","builtin":true},{"name":"auto-mode-setup","description":"Teach auto mode about your environment, plus optional rule tweaks","argumentHint":"[--request-id \u003cuuid\u003e] (--wizard posture=… scope=… depth=… --propose | --expect-sha256 \u003c64-hex\u003e --apply-file \u003cpath\u003e)","builtin":true},{"name":"autocompact","description":"Configure the auto-compact window size","argumentHint":"[auto|\u003ctokens\u003e]","builtin":true},{"name":"clear","description":"Start a new session with empty context; previous session stays on disk (resumable with /resume)","argumentHint":"[name]","aliases":["reset","new"],"builtin":true},{"name":"color","description":"Set the prompt bar color for this session","argumentHint":"[red|blue|green|yellow|purple|orange|pink|cyan|default]","builtin":true},{"name":"compact","description":"Free up context by summarizing the conversation so far","argumentHint":"\u003coptional custom summarization instructions\u003e","builtin":true},{"name":"config","description":"Set a setting by key","argumentHint":"key=value","aliases":["settings"],"builtin":true},{"name":"output-style","description":"List output styles or switch to one","argumentHint":"[style]","builtin":true},{"name":"context","description":"Show current context usage","argumentHint":"","builtin":true},{"name":"effort","description":"Set effort level for model usage","argumentHint":"\u003clow|medium|high|xhigh|max|auto|ultracode [on|off]\u003e","builtin":true},{"name":"fast","description":"Toggle fast mode (Opus 5.5)","argumentHint":"[on|off]","builtin":true},{"name":"focus","description":"Toggle focus view: just your prompt, summary, and response","argumentHint":"[on|off]","builtin":true},{"name":"heapdump","description":"Dump the JS heap to the Desktop; on Linux with no Desktop folder, the home directory","argumentHint":"","builtin":true},{"name":"init","description":"Initialize a new CLAUDE.md file with codebase documentation","argumentHint":"","builtin":true},{"name":"mcp","description":"Manage MCP servers","argumentHint":"[reconnect|enable|disable [\u003cserver\u003e|all]]","builtin":true},{"name":"import","description":"Import config from another AI coding agent","argumentHint":"","builtin":true},{"name":"model","description":"Set the AI model for Claude Code","argumentHint":"\u003cmodel\u003e","builtin":true},{"name":"__remote-workflow","description":"Run the workflow script delivered in this session environment (server-launched sessions only)","argumentHint":"","builtin":true},{"name":"workflow-launch-exec","description":"Execute a server-launched workflow handoff (workflow_launch event sessions only)","argumentHint":"","builtin":true},{"name":"reload-plugins","description":"Activate pending plugin changes in the current session","argumentHint":"[--force]","builtin":true},{"name":"reload-skills","description":"Pick up skills added or changed on disk during this session","argumentHint":"","builtin":true},{"name":"rename","description":"Rename the current conversation","argumentHint":"[name]","aliases":["name"],"builtin":true},{"name":"ultrareview","description":"Start a cloud agent that finds and verifies bugs in your branch (~15-25 min, $5-$25 USD) · Runs in a cloud session. See https://code.claude.com/docs/en/claude-code-on-the-web","argumentHint":"","builtin":true},{"name":"security-review","description":"Complete a security review of the pending changes on the current branch","argumentHint":"","builtin":true},{"name":"usage-credits","description":"Configure usage credits or request them from your admin when you hit a limit","argumentHint":"","builtin":true},{"name":"extra-usage","description":"Renamed to /usage-credits","argumentHint":"","builtin":true},{"name":"usage","description":"Show session cost, plan usage, and what's contributing to your limits","argumentHint":"","aliases":["cost","stats"],"builtin":true},{"name":"insights","description":"Generate a report analyzing your Claude Code sessions","argumentHint":"","builtin":true},{"name":"recap","description":"Generate a one-line session recap now","argumentHint":"","builtin":true},{"name":"skill-doctor","description":"Show which loaded skills are unused and costing context","argumentHint":"","builtin":true},{"name":"goal","description":"Set a goal — keep working until the condition is met","argumentHint":"","builtin":true},{"name":"design-consent","description":"Grant Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"design-revoke","description":"Revoke Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"list-agents","description":"List subagents, teammates, and other Claude sessions you can message","argumentHint":"","aliases":["peers"],"builtin":true},{"name":"team-onboarding","description":"Help teammates ramp on Claude Code with a guide from your usage","argumentHint":"","builtin":true},{"name":"docs","description":"docs (editable docs people share and comment on; the default for any document, named as a doc or not: a document, report, proposal, resume, cover letter, letter, contract, policy, form, template, worksheet, essay, handbook, guide, how-to, cheat sheet, SOP or other writing to keep, share, collaborate on, send, submit, print or sign; a doc exports to Word, PDF, Markdown or Google Docs, so needing a file to send, attach, upload, submit or print is no reason to pick Word, and a file nobody asked for is a doc, not Word; a plan, comparison, summary or notes asked in chat stays in chat; a pasted claude.ai artifact link may be a doc: check with docs tools first; Word or another file format named, tracked changes wanted, or a .docx to change or use as a template → that format's skill): making one → if no docs-connector instructions are in context, call its `guide` (topic.instructions) first; then create the doc (headings only, no body) before any search, file read or plan, even with files attached. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docs"]},{"name":"docx","description":"Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx) or Word templates (.dotx). Triggers include: any mention of Microsoft Word Documents, such as 'Word doc', 'word document', '.docx', '.dotx', 'microsoft doc'. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a deliverable as a Word or .docx file (to download, email or print), use this skill. However, if they ask for a document, page, report, memo, or notes WITHOUT naming a file format and the session offers Claude's own dedicated document or page skill or connector, use that instead, even if they will email or print it. Do NOT use for PDFs, spreadsheets, Google Docs, or coding unrelated to document generation. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docx"]},{"name":"google-workspace","description":"Read this before the first Google Drive, Docs, Sheets or Slides connector call whenever the task creates or changes a Google file. Use this skill whenever the user wants to create or change a Google Doc, Sheet or Slides file in their Google Drive. Triggers include: a request that names Google Docs, Sheets, Slides or Drive and asks to make, edit, format, copy or rename a file; a docs.google.com link with a request to change that file, even a one-line fix or suggested edits; and any follow-up change to a Google file from earlier in the chat, even \"change it\" or \"add a tab\". Includes helper scripts for document positions, cell ranges and slide layout. However, if the user asks for a doc, deck or spreadsheet without naming Google, or gives a Google file only as source material for something new, use Claude's own output type instead. Do NOT use for read-only questions about a Google file, or for Word, Excel, PowerPoint or PDF files. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:google-workspace"]},{"name":"import-memory","description":"Import a memory export from another AI assistant into Claude's memory — conversationally, additively, and with the content treated as data. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:import-memory"]},{"name":"morning","description":"Render the user's morning brief as a styled HTML artifact, or set it up as a recurring weekday task. Use only when the user explicitly asks to run, see, or set up their morning brief, or if they invoke /morning by name. A question about their day, schedule, or calendar is not by itself a request for the brief; answer it directly instead. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:morning"]},{"name":"pdf","description":"Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pdf"]},{"name":"pptx","description":"Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations as PowerPoint (.pptx) files; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email, summary, or creating a different type of slide deck); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user asks for a PowerPoint or .pptx file, or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. However, when the user asks for a deck, slides, a slide deck, or a presentation without naming a file format, default to using a dedicated slide-deck artifact type or a separate slides skill if this session offers one; otherwise, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pptx"]},{"name":"skill-creator","description":"Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:skill-creator"]},{"name":"xlsx","description":"Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .xltx, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:xlsx"]}],"agents":[{"name":"claude","description":"Catch-all for any task that doesn't fit a more specific agent. FleetView's default when no agent name is typed."},{"name":"claude-code-guide","description":"Use this agent when the user asks questions (\"Can Claude...\", \"Does Claude...\", \"How do I...\") about: (1) Claude Code (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - Messages API for directly passing messages to Claude, Tool Runner (`client.beta.messages.tool_runner`) for running an agentic loop over your own tools, manual tool-use loops, Managed Agents for server-hosted agents with a managed sandbox, prompt caching, and general Anthropic SDK usage; (4) Claude Tag (Claude in Slack) - what it is, setting it up for a Slack workspace, `/install-slack-app`; (5) `claude plugin eval` (writing and running plugin eval suites, its JSON/report, sandbox, CI) and the `/skill-doctor` report. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via SendMessage.","model":"haiku"},{"name":"Explore","description":"Fast read-only search agent for locating code. Use it to find files by pattern (eg. \"src/components/**/*.tsx\"), grep for symbols or keywords (eg. \"API endpoints\"), or answer \"where is X defined / which files reference Y.\" Do NOT use it for code review, design-doc auditing, cross-file consistency checks, or open-ended analysis — it reads excerpts rather than whole files and will miss content past its read window. When calling, specify search breadth: \"quick\" for a single targeted lookup, \"medium\" for moderate exploration, or \"very thorough\" to search across multiple locations and naming conventions.","model":"inherit"},{"name":"general-purpose","description":"General-purpose agent for researching complex questions, searching for code, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you."},{"name":"Plan","description":"Software architect agent for designing implementation plans. Use this when you need to plan the implementation strategy for a task. Returns step-by-step plans, identifies critical files, and considers architectural trade-offs.","model":"inherit"},{"name":"statusline-setup","description":"Use this agent to configure the user's Claude Code status line setting.","model":"sonnet"}],"output_style":"default","available_output_styles":["default","Proactive","Concise","Explanatory","Learning"],"user_output_styles_dir":"/Users/flamingcow/.claude/output-styles","models":[{"value":"default","resolvedModel":"claude-opus-5-5","displayName":"Default (recommended)","description":"Opus 5.5 · Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"opus","resolvedModel":"claude-opus-5-5","displayName":"Opus 5.5","description":"For complex work and everyday tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"fable","resolvedModel":"claude-fable-5-1","displayName":"Fable 5.1","description":"For your toughest challenges","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"sonnet","resolvedModel":"claude-sonnet-5-5","displayName":"Sonnet 5.5","description":"Most efficient for simpler tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"haiku","resolvedModel":"claude-haiku-5-5","displayName":"Haiku 5.5","description":"Fastest for quick answers","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-haiku-4-5-20251001","resolvedModel":"claude-haiku-4-5-20251001","displayName":"Haiku 4.5","description":"Fastest for quick answers"},{"value":"claude-sonnet-5","resolvedModel":"claude-sonnet-5","displayName":"Sonnet 5","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-5","resolvedModel":"claude-opus-5","displayName":"Opus 5","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-fable-5","resolvedModel":"claude-fable-5","displayName":"Fable 5","description":"Most capable for your hardest and longest-running tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-8","resolvedModel":"claude-opus-4-8","displayName":"Opus 4.8","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-opus-4-7","resolvedModel":"claude-opus-4-7","displayName":"Opus 4.7","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-6","resolvedModel":"claude-opus-4-6","displayName":"Opus 4.6","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-sonnet-4-6","resolvedModel":"claude-sonnet-4-6","displayName":"Sonnet 4.6","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true}],"account":{"email":"[redacted]","organization":"[redacted]'s Organization","subscriptionType":"Claude Max","apiProvider":"firstParty"},"pid":12877,"claude_code_version":"2.1.296","current_permission_mode":"bypassPermissions","feedback_mode":{"kind":"post"},"analytics_disabled":false,"remote_control_auto_enable":false,"remote_control_auto_connect_default":false,"remote_control_available":true,"remote_control_auto_on_by_default":false,"ide_rc_auto_enable_gate":true,"fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","session_state":"idle","capabilities":["ui_surface_v1"]},"pending_permission_requests":[],"pending_user_dialog_requests":[]}}} {"dir":"send","msg":{"message":{"content":"Run the bash command `ping -c 120 127.0.0.1` in the foreground (not in the background) and wait for it to finish, then say done.","role":"user"},"parent_tool_use_id":null,"session_id":"","type":"user"}} -{"dir":"recv","msg":{"type":"system","subtype":"init","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestInterrupt4095904320/001","session_id":"8baa7db6-46c5-4d3a-8290-6187275b6dec","tools":["Task","Artifact","ArtifactComments","ArtifactData","Bash","CronCreate","CronDelete","CronList","DesignSync","Edit","EnterWorktree","ExitWorktree","ListAgents","LSP","Monitor","NotebookEdit","PushNotification","Read","RemoteTrigger","ReportFindings","ScheduleWakeup","SendMessage","Skill","TaskStop","ToolSearch","WebFetch","WebSearch","Workflow","Write"],"mcp_servers":[{"name":"claude.ai Claude Docs","status":"pending","source":"claudeai"},{"name":"claude.ai Heliosian","status":"pending","source":"claudeai"},{"name":"claude.ai Fastmail","status":"pending","source":"claudeai"},{"name":"claude.ai Google Calendar","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Gmail","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Google Drive","status":"needs-auth","source":"claudeai"}],"model":"claude-sonnet-5-5","permissionMode":"bypassPermissions","slash_commands":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","advisor","agents","auto-mode-setup","autocompact","clear","color","compact","config","output-style","context","effort","fast","focus","heapdump","init","mcp","import","model","__remote-workflow","workflow-launch-exec","reload-plugins","reload-skills","rename","ultrareview","security-review","usage-credits","extra-usage","usage","insights","recap","skill-doctor","goal","design-consent","design-revoke","list-agents","team-onboarding","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"terminal_slash_commands":["doctor","color","focus","reload-plugins"],"apiKeySource":"none","claude_code_version":"2.1.296","output_style":"default","agents":["claude","claude-code-guide","Explore","general-purpose","Plan","statusline-setup"],"skills":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"plugins":[{"name":"clangd-lsp","path":"/Users/flamingcow/.claude/plugins/cache/claude-plugins-official/clangd-lsp/1.0.0","source":"clangd-lsp@claude-plugins-official","version":"1.0.0"},{"name":"cc-plugin-agents-md","path":"builtin","source":"cc-plugin-agents-md@builtin"},{"name":"cc-plugin-telemetry","path":"builtin","source":"cc-plugin-telemetry@builtin"},{"name":"cc-plugin-plugin-authoring","path":"builtin","source":"cc-plugin-plugin-authoring@builtin"}],"capabilities":["interrupt_receipt_v1","interrupt_cancel_queued_v1","interrupt_send_now_v1","msg_lifecycle_v1","request_marker_lists_v1","sdk_mcp_tools_list_changed","sdk_mcp_manifests","mcp_read_resource_v1","mcp_tool_ui_meta_v1","ui_surface_v1"],"analytics_disabled":false,"product_feedback_disabled":false,"uuid":"c1c2f32f-ff9b-4650-8ec5-b43ad00ffc01","memory_paths":{"auto":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestInterrupt4095904320-001/memory/"},"scratchpad_path":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestInterrupt4095904320-001/8baa7db6-46c5-4d3a-8290-6187275b6dec/scratchpad","messaging_socket_path":"/tmp/cc-socks/11241.sock","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","per_turn_effort_active":true,"view_mode":"default"}} -{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"8baa7db6-46c5-4d3a-8290-6187275b6dec","uuid":"8f2a6bc7-7c7e-4e47-a240-207675980be3"}} -{"dir":"recv","msg":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed","resetsAt":1792054200,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false,"unifiedWindows":{"five_hour":{"utilization":0.04,"resetsAt":1792054200},"seven_day":{"utilization":0.35,"resetsAt":1792270800}}},"uuid":"09e525ff-d059-457d-8b4f-15b02a9c5a99","session_id":"8baa7db6-46c5-4d3a-8290-6187275b6dec"}} -{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3P8Q3gq4eJm5GdQtdgf","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Um5Qz1ZYBguG5xXw8ic2Fd","name":"Bash","input":{"command":"ping -c 120 127.0.0.1","description":"Ping localhost 120 times in foreground","timeout":180000},"caller":{"type":"direct"}}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":15263,"cache_read_input_tokens":22367,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15263},"output_tokens":16,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"8baa7db6-46c5-4d3a-8290-6187275b6dec","uuid":"acecbad4-1b23-4e04-b9a2-eaf1c2e49556","timestamp":"2026-10-15T04:21:17.081Z","request_id":"req_011Cg3P8PhrJ6v6j2X6jAZ5K","wire_tool_inputs":{"toolu_01Um5Qz1ZYBguG5xXw8ic2Fd":{"command":"ping -c 120 127.0.0.1","timeout":180000,"description":"Ping localhost 120 times in foreground"}}}} -{"dir":"send","msg":{"request":{"subtype":"interrupt"},"request_id":"req_f2b156baafef5282","type":"control_request"}} -{"dir":"recv","msg":{"type":"control_response","response":{"subtype":"success","request_id":"req_f2b156baafef5282","response":{"still_queued":[]}}}} -{"dir":"recv","msg":{"type":"user","message":{"role":"user","content":[{"type":"tool_result","content":"The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file). STOP what you are doing and wait for the user to tell you how to proceed.\n\nNote: The user's next message may contain a correction or preference. Pay close attention — if they explain what went wrong or how they'd prefer you to work, consider saving that to memory for future sessions.","is_error":true,"tool_use_id":"toolu_01Um5Qz1ZYBguG5xXw8ic2Fd"}]},"parent_tool_use_id":null,"session_id":"8baa7db6-46c5-4d3a-8290-6187275b6dec","uuid":"f148fe28-0b00-414d-a5bb-00a8caffcd0a","timestamp":"2026-10-15T04:21:19.093Z","tool_use_result":"User rejected tool use","tool_result_meta":[{"id":"toolu_01Um5Qz1ZYBguG5xXw8ic2Fd","non_execution_kind":"user-rejected"}]}} -{"dir":"recv","msg":{"type":"user","message":{"role":"user","content":[{"type":"text","text":"[Request interrupted by user for tool use]"}]},"parent_tool_use_id":null,"session_id":"8baa7db6-46c5-4d3a-8290-6187275b6dec","uuid":"7ca68ef9-9f43-45c7-b9dc-a045e68f6a8f","timestamp":"2026-10-15T04:21:19.094Z"}} -{"dir":"recv","msg":{"duration_api_ms":4115,"stop_reason":"tool_use","session_id":"8baa7db6-46c5-4d3a-8290-6187275b6dec","total_cost_usd":0.0646062,"usage":{"input_tokens":2,"cache_creation_input_tokens":15263,"cache_read_input_tokens":22367,"output_tokens":118,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":15263,"ephemeral_5m_input_tokens":0},"inference_geo":"global","iterations":[{"input_tokens":2,"output_tokens":118,"cache_read_input_tokens":22367,"cache_creation_input_tokens":15263,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15263},"type":"message"}],"speed":"standard","fallback_credit":null},"modelUsage":{"claude-haiku-5-5":{"inputTokens":1210,"outputTokens":25,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.0001335,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-haiku-5-5","provider":"firstParty","costBasis":"list"},"claude-sonnet-5-5":{"inputTokens":2,"outputTokens":118,"cacheReadInputTokens":22367,"cacheCreationInputTokens":15263,"webSearchRequests":0,"costUSD":0.06447270000000001,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-sonnet-5-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"aborted_tools","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"safety_stops":0,"is_error":true,"num_turns":3,"subtype":"error_during_execution","errors":["[ede_diagnostic] result_type=user last_content_type=n/a stop_reason=tool_use"],"type":"result","duration_ms":4616,"uuid":"2da8d0f5-3b0f-48d7-89fd-d99e76aa10d1","queued_turn_count":0,"result_index":0}} -{"dir":"send","msg":{"message":{"content":"Reply with the single word ok.","role":"user"},"parent_tool_use_id":null,"session_id":"8baa7db6-46c5-4d3a-8290-6187275b6dec","type":"user"}} -{"dir":"recv","msg":{"type":"system","subtype":"init","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestInterrupt4095904320/001","session_id":"8baa7db6-46c5-4d3a-8290-6187275b6dec","tools":["Task","Artifact","ArtifactComments","ArtifactData","Bash","CronCreate","CronDelete","CronList","DesignSync","Edit","EnterWorktree","ExitWorktree","ListAgents","ListMcpResourcesTool","LSP","Monitor","NotebookEdit","PushNotification","Read","ReadMcpResourceDirTool","ReadMcpResourceTool","RemoteTrigger","ReportFindings","ScheduleWakeup","SendMessage","Skill","TaskStop","ToolSearch","WebFetch","WebSearch","Workflow","Write","mcp__claude_ai_Claude_Docs__batch","mcp__claude_ai_Claude_Docs__create","mcp__claude_ai_Claude_Docs__delete","mcp__claude_ai_Claude_Docs__export","mcp__claude_ai_Claude_Docs__guide","mcp__claude_ai_Claude_Docs__query","mcp__claude_ai_Claude_Docs__read","mcp__claude_ai_Claude_Docs__update","mcp__claude_ai_Fastmail__list_calendars","mcp__claude_ai_Fastmail__list_identities","mcp__claude_ai_Fastmail__list_labels","mcp__claude_ai_Fastmail__read_attachment","mcp__claude_ai_Fastmail__read_email","mcp__claude_ai_Fastmail__read_note","mcp__claude_ai_Fastmail__read_thread","mcp__claude_ai_Fastmail__search_contacts","mcp__claude_ai_Fastmail__search_email","mcp__claude_ai_Fastmail__search_events","mcp__claude_ai_Fastmail__search_notes","mcp__claude_ai_Fastmail__search_org_contacts","mcp__claude_ai_Heliosian__helios_activities","mcp__claude_ai_Heliosian__helios_classroom","mcp__claude_ai_Heliosian__helios_days","mcp__claude_ai_Heliosian__helios_describe_schema","mcp__claude_ai_Heliosian__helios_describe_table","mcp__claude_ai_Heliosian__helios_events","mcp__claude_ai_Heliosian__helios_find_people","mcp__claude_ai_Heliosian__helios_get","mcp__claude_ai_Heliosian__helios_group","mcp__claude_ai_Heliosian__helios_links","mcp__claude_ai_Heliosian__helios_lists","mcp__claude_ai_Heliosian__helios_nearby_families","mcp__claude_ai_Heliosian__helios_parties","mcp__claude_ai_Heliosian__helios_policies","mcp__claude_ai_Heliosian__helios_query","mcp__claude_ai_Heliosian__helios_query_json","mcp__claude_ai_Heliosian__helios_read_document","mcp__claude_ai_Heliosian__helios_search","mcp__claude_ai_Heliosian__helios_similar","mcp__claude_ai_Heliosian__helios_whoami"],"mcp_servers":[{"name":"claude.ai Claude Docs","status":"connected","source":"claudeai"},{"name":"claude.ai Heliosian","status":"connected","source":"claudeai"},{"name":"claude.ai Fastmail","status":"connected","source":"claudeai"},{"name":"claude.ai Google Calendar","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Gmail","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Google Drive","status":"needs-auth","source":"claudeai"}],"model":"claude-sonnet-5-5","permissionMode":"bypassPermissions","slash_commands":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","advisor","agents","auto-mode-setup","autocompact","clear","color","compact","config","output-style","context","effort","fast","focus","heapdump","init","mcp","import","model","__remote-workflow","workflow-launch-exec","reload-plugins","reload-skills","rename","ultrareview","security-review","usage-credits","extra-usage","usage","insights","recap","skill-doctor","goal","design-consent","design-revoke","list-agents","team-onboarding","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"terminal_slash_commands":["doctor","color","focus","reload-plugins"],"apiKeySource":"none","claude_code_version":"2.1.296","output_style":"default","agents":["claude","claude-code-guide","Explore","general-purpose","Plan","statusline-setup"],"skills":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"plugins":[{"name":"clangd-lsp","path":"/Users/flamingcow/.claude/plugins/cache/claude-plugins-official/clangd-lsp/1.0.0","source":"clangd-lsp@claude-plugins-official","version":"1.0.0"},{"name":"cc-plugin-agents-md","path":"builtin","source":"cc-plugin-agents-md@builtin"},{"name":"cc-plugin-telemetry","path":"builtin","source":"cc-plugin-telemetry@builtin"},{"name":"cc-plugin-plugin-authoring","path":"builtin","source":"cc-plugin-plugin-authoring@builtin"}],"capabilities":["interrupt_receipt_v1","interrupt_cancel_queued_v1","interrupt_send_now_v1","msg_lifecycle_v1","request_marker_lists_v1","sdk_mcp_tools_list_changed","sdk_mcp_manifests","mcp_read_resource_v1","mcp_tool_ui_meta_v1","ui_surface_v1"],"analytics_disabled":false,"product_feedback_disabled":false,"uuid":"76f41c35-96f5-4561-a75f-304c0301c57b","memory_paths":{"auto":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestInterrupt4095904320-001/memory/"},"scratchpad_path":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestInterrupt4095904320-001/8baa7db6-46c5-4d3a-8290-6187275b6dec/scratchpad","messaging_socket_path":"/tmp/cc-socks/11241.sock","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","per_turn_effort_active":true,"view_mode":"default"}} -{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"8baa7db6-46c5-4d3a-8290-6187275b6dec","uuid":"b9c3f510-00e8-48d5-b5d3-e2c0154e1489"}} -{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3P8jDN5ztEWSgXqPcHY","type":"message","role":"assistant","content":[{"type":"text","text":"ok"}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":4776,"cache_read_input_tokens":37630,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":4776},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"8baa7db6-46c5-4d3a-8290-6187275b6dec","uuid":"ea8f7646-fdbb-401b-91c3-0d6b9787f6ec","timestamp":"2026-10-15T04:21:20.168Z","request_id":"req_011Cg3P8ixjV5CGZTa89eyhf"}} -{"dir":"recv","msg":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed","resetsAt":1792054200,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false,"unifiedWindows":{"five_hour":{"utilization":0.05,"resetsAt":1792054200},"seven_day":{"utilization":0.35,"resetsAt":1792270800}}},"uuid":"d6cf12ab-d431-4da5-b237-6bb2d40e5f17","session_id":"8baa7db6-46c5-4d3a-8290-6187275b6dec"}} -{"dir":"recv","msg":{"duration_api_ms":5189,"stop_reason":"end_turn","session_id":"8baa7db6-46c5-4d3a-8290-6187275b6dec","total_cost_usd":0.0875172,"usage":{"input_tokens":2,"cache_creation_input_tokens":4776,"cache_read_input_tokens":37630,"output_tokens":4,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":4776,"ephemeral_5m_input_tokens":0},"inference_geo":"global","iterations":[{"input_tokens":2,"output_tokens":4,"cache_read_input_tokens":37630,"cache_creation_input_tokens":4776,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":4776},"type":"message"}],"speed":"standard","fallback_credit":null},"modelUsage":{"claude-haiku-5-5":{"inputTokens":1210,"outputTokens":25,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.0001335,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-haiku-5-5","provider":"firstParty","costBasis":"list"},"claude-sonnet-5-5":{"inputTokens":4,"outputTokens":122,"cacheReadInputTokens":59997,"cacheCreationInputTokens":20039,"webSearchRequests":0,"costUSD":0.08738370000000001,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-sonnet-5-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"safety_stops":0,"is_error":false,"num_turns":1,"subtype":"success","api_error_status":null,"result":"ok","ttft_ms":1069,"type":"result","duration_ms":1086,"uuid":"d955ff09-910f-429b-98f5-69a27627c4d1","ttft_stream_ms":1068,"time_to_request_ms":12,"first_content_frame_ms":1069,"queued_turn_count":0,"result_index":1}} +{"dir":"recv","msg":{"type":"system","subtype":"init","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestInterrupt2595525365/001","session_id":"05c42b7f-81dd-4f05-915b-691a2ca162cf","tools":["Task","Artifact","ArtifactComments","ArtifactData","Bash","CronCreate","CronDelete","CronList","DesignSync","Edit","EnterWorktree","ExitWorktree","ListAgents","LSP","Monitor","NotebookEdit","PushNotification","Read","RemoteTrigger","ReportFindings","ScheduleWakeup","SendMessage","Skill","TaskStop","ToolSearch","WebFetch","WebSearch","Workflow","Write"],"mcp_servers":[{"name":"claude.ai Claude Docs","status":"pending","source":"claudeai"},{"name":"claude.ai Heliosian","status":"pending","source":"claudeai"},{"name":"claude.ai Fastmail","status":"pending","source":"claudeai"},{"name":"claude.ai Google Calendar","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Gmail","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Google Drive","status":"needs-auth","source":"claudeai"}],"model":"claude-sonnet-5-5","permissionMode":"bypassPermissions","slash_commands":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","advisor","agents","auto-mode-setup","autocompact","clear","color","compact","config","output-style","context","effort","fast","focus","heapdump","init","mcp","import","model","__remote-workflow","workflow-launch-exec","reload-plugins","reload-skills","rename","ultrareview","security-review","usage-credits","extra-usage","usage","insights","recap","skill-doctor","goal","design-consent","design-revoke","list-agents","team-onboarding","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"terminal_slash_commands":["doctor","color","focus","reload-plugins"],"apiKeySource":"none","claude_code_version":"2.1.296","output_style":"default","agents":["claude","claude-code-guide","Explore","general-purpose","Plan","statusline-setup"],"skills":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"plugins":[{"name":"clangd-lsp","path":"/Users/flamingcow/.claude/plugins/cache/claude-plugins-official/clangd-lsp/1.0.0","source":"clangd-lsp@claude-plugins-official","version":"1.0.0"},{"name":"cc-plugin-agents-md","path":"builtin","source":"cc-plugin-agents-md@builtin"},{"name":"cc-plugin-telemetry","path":"builtin","source":"cc-plugin-telemetry@builtin"},{"name":"cc-plugin-plugin-authoring","path":"builtin","source":"cc-plugin-plugin-authoring@builtin"}],"capabilities":["interrupt_receipt_v1","interrupt_cancel_queued_v1","interrupt_send_now_v1","msg_lifecycle_v1","request_marker_lists_v1","sdk_mcp_tools_list_changed","sdk_mcp_manifests","mcp_read_resource_v1","mcp_tool_ui_meta_v1","ui_surface_v1"],"analytics_disabled":false,"product_feedback_disabled":false,"uuid":"3a4ef9ec-9973-4841-a4a4-bf6933b76507","memory_paths":{"auto":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestInterrupt2595525365-001/memory/"},"scratchpad_path":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestInterrupt2595525365-001/05c42b7f-81dd-4f05-915b-691a2ca162cf/scratchpad","messaging_socket_path":"/tmp/cc-socks/12877.sock","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","per_turn_effort_active":true,"view_mode":"default"}} +{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"05c42b7f-81dd-4f05-915b-691a2ca162cf","uuid":"bf809592-346f-4465-ae84-2e901ea6cc6d"}} +{"dir":"recv","msg":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed","resetsAt":1792054200,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false,"unifiedWindows":{"five_hour":{"utilization":0.05,"resetsAt":1792054200},"seven_day":{"utilization":0.35,"resetsAt":1792270800}}},"uuid":"877741a1-8211-4d53-a0fa-21c356ef3a45","session_id":"05c42b7f-81dd-4f05-915b-691a2ca162cf"}} +{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3PDvTgDyhPaaFGncnoo","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Dj9sr4ktjLvZ4TNVcjY4Bh","name":"Bash","input":{"command":"ping -c 120 127.0.0.1","description":"Ping localhost 120 times","timeout":180000},"caller":{"type":"direct"}}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":15264,"cache_read_input_tokens":22367,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15264},"output_tokens":16,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"05c42b7f-81dd-4f05-915b-691a2ca162cf","uuid":"49877ade-a426-4c75-aa49-ef33dfcac85e","timestamp":"2026-10-15T04:22:31.777Z","request_id":"req_011Cg3PDvCo8ytQ5pbs9nbEX","wire_tool_inputs":{"toolu_01Dj9sr4ktjLvZ4TNVcjY4Bh":{"command":"ping -c 120 127.0.0.1","timeout":180000,"description":"Ping localhost 120 times"}}}} +{"dir":"send","msg":{"request":{"subtype":"interrupt"},"request_id":"req_1b4908ef48c6f074","type":"control_request"}} +{"dir":"recv","msg":{"type":"control_response","response":{"subtype":"success","request_id":"req_1b4908ef48c6f074","response":{"still_queued":[]}}}} +{"dir":"recv","msg":{"type":"user","message":{"role":"user","content":[{"type":"tool_result","content":"The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file). STOP what you are doing and wait for the user to tell you how to proceed.\n\nNote: The user's next message may contain a correction or preference. Pay close attention — if they explain what went wrong or how they'd prefer you to work, consider saving that to memory for future sessions.","is_error":true,"tool_use_id":"toolu_01Dj9sr4ktjLvZ4TNVcjY4Bh"}]},"parent_tool_use_id":null,"session_id":"05c42b7f-81dd-4f05-915b-691a2ca162cf","uuid":"aa616233-4898-4ae8-8ded-8c7234a88f32","timestamp":"2026-10-15T04:22:33.787Z","tool_use_result":"User rejected tool use","tool_result_meta":[{"id":"toolu_01Dj9sr4ktjLvZ4TNVcjY4Bh","non_execution_kind":"user-rejected"}]}} +{"dir":"recv","msg":{"type":"user","message":{"role":"user","content":[{"type":"text","text":"[Request interrupted by user for tool use]"}]},"parent_tool_use_id":null,"session_id":"05c42b7f-81dd-4f05-915b-691a2ca162cf","uuid":"efcb1433-8b53-4630-92ed-df69a77677a0","timestamp":"2026-10-15T04:22:33.788Z"}} +{"dir":"recv","msg":{"duration_api_ms":2934,"stop_reason":"tool_use","session_id":"05c42b7f-81dd-4f05-915b-691a2ca162cf","total_cost_usd":0.0645672,"usage":{"input_tokens":2,"cache_creation_input_tokens":15264,"cache_read_input_tokens":22367,"output_tokens":114,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":15264,"ephemeral_5m_input_tokens":0},"inference_geo":"global","iterations":[{"input_tokens":2,"output_tokens":114,"cache_read_input_tokens":22367,"cache_creation_input_tokens":15264,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15264},"type":"message"}],"speed":"standard","fallback_credit":null},"modelUsage":{"claude-haiku-5-5":{"inputTokens":1210,"outputTokens":19,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.0001305,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-haiku-5-5","provider":"firstParty","costBasis":"list"},"claude-sonnet-5-5":{"inputTokens":2,"outputTokens":114,"cacheReadInputTokens":22367,"cacheCreationInputTokens":15264,"webSearchRequests":0,"costUSD":0.0644367,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-sonnet-5-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"aborted_tools","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"safety_stops":0,"is_error":true,"num_turns":3,"subtype":"error_during_execution","errors":["[ede_diagnostic] result_type=user last_content_type=n/a stop_reason=tool_use"],"type":"result","duration_ms":4365,"uuid":"6582f3dc-6843-4228-a1d4-030676209dd9","queued_turn_count":0,"result_index":0}} +{"dir":"send","msg":{"message":{"content":"Reply with the single word ok.","role":"user"},"parent_tool_use_id":null,"session_id":"05c42b7f-81dd-4f05-915b-691a2ca162cf","type":"user"}} +{"dir":"recv","msg":{"type":"system","subtype":"init","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestInterrupt2595525365/001","session_id":"05c42b7f-81dd-4f05-915b-691a2ca162cf","tools":["Task","Artifact","ArtifactComments","ArtifactData","Bash","CronCreate","CronDelete","CronList","DesignSync","Edit","EnterWorktree","ExitWorktree","ListAgents","ListMcpResourcesTool","LSP","Monitor","NotebookEdit","PushNotification","Read","ReadMcpResourceDirTool","ReadMcpResourceTool","RemoteTrigger","ReportFindings","ScheduleWakeup","SendMessage","Skill","TaskStop","ToolSearch","WebFetch","WebSearch","Workflow","Write","mcp__claude_ai_Claude_Docs__batch","mcp__claude_ai_Claude_Docs__create","mcp__claude_ai_Claude_Docs__delete","mcp__claude_ai_Claude_Docs__export","mcp__claude_ai_Claude_Docs__guide","mcp__claude_ai_Claude_Docs__query","mcp__claude_ai_Claude_Docs__read","mcp__claude_ai_Claude_Docs__update","mcp__claude_ai_Fastmail__list_calendars","mcp__claude_ai_Fastmail__list_identities","mcp__claude_ai_Fastmail__list_labels","mcp__claude_ai_Fastmail__read_attachment","mcp__claude_ai_Fastmail__read_email","mcp__claude_ai_Fastmail__read_note","mcp__claude_ai_Fastmail__read_thread","mcp__claude_ai_Fastmail__search_contacts","mcp__claude_ai_Fastmail__search_email","mcp__claude_ai_Fastmail__search_events","mcp__claude_ai_Fastmail__search_notes","mcp__claude_ai_Fastmail__search_org_contacts","mcp__claude_ai_Heliosian__helios_activities","mcp__claude_ai_Heliosian__helios_classroom","mcp__claude_ai_Heliosian__helios_days","mcp__claude_ai_Heliosian__helios_describe_schema","mcp__claude_ai_Heliosian__helios_describe_table","mcp__claude_ai_Heliosian__helios_events","mcp__claude_ai_Heliosian__helios_find_people","mcp__claude_ai_Heliosian__helios_get","mcp__claude_ai_Heliosian__helios_group","mcp__claude_ai_Heliosian__helios_links","mcp__claude_ai_Heliosian__helios_lists","mcp__claude_ai_Heliosian__helios_nearby_families","mcp__claude_ai_Heliosian__helios_parties","mcp__claude_ai_Heliosian__helios_policies","mcp__claude_ai_Heliosian__helios_query","mcp__claude_ai_Heliosian__helios_query_json","mcp__claude_ai_Heliosian__helios_read_document","mcp__claude_ai_Heliosian__helios_search","mcp__claude_ai_Heliosian__helios_similar","mcp__claude_ai_Heliosian__helios_whoami"],"mcp_servers":[{"name":"claude.ai Claude Docs","status":"connected","source":"claudeai"},{"name":"claude.ai Heliosian","status":"connected","source":"claudeai"},{"name":"claude.ai Fastmail","status":"connected","source":"claudeai"},{"name":"claude.ai Google Calendar","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Gmail","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Google Drive","status":"needs-auth","source":"claudeai"}],"model":"claude-sonnet-5-5","permissionMode":"bypassPermissions","slash_commands":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","advisor","agents","auto-mode-setup","autocompact","clear","color","compact","config","output-style","context","effort","fast","focus","heapdump","init","mcp","import","model","__remote-workflow","workflow-launch-exec","reload-plugins","reload-skills","rename","ultrareview","security-review","usage-credits","extra-usage","usage","insights","recap","skill-doctor","goal","design-consent","design-revoke","list-agents","team-onboarding","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"terminal_slash_commands":["doctor","color","focus","reload-plugins"],"apiKeySource":"none","claude_code_version":"2.1.296","output_style":"default","agents":["claude","claude-code-guide","Explore","general-purpose","Plan","statusline-setup"],"skills":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"plugins":[{"name":"clangd-lsp","path":"/Users/flamingcow/.claude/plugins/cache/claude-plugins-official/clangd-lsp/1.0.0","source":"clangd-lsp@claude-plugins-official","version":"1.0.0"},{"name":"cc-plugin-agents-md","path":"builtin","source":"cc-plugin-agents-md@builtin"},{"name":"cc-plugin-telemetry","path":"builtin","source":"cc-plugin-telemetry@builtin"},{"name":"cc-plugin-plugin-authoring","path":"builtin","source":"cc-plugin-plugin-authoring@builtin"}],"capabilities":["interrupt_receipt_v1","interrupt_cancel_queued_v1","interrupt_send_now_v1","msg_lifecycle_v1","request_marker_lists_v1","sdk_mcp_tools_list_changed","sdk_mcp_manifests","mcp_read_resource_v1","mcp_tool_ui_meta_v1","ui_surface_v1"],"analytics_disabled":false,"product_feedback_disabled":false,"uuid":"1a1ff232-7502-4358-bfe2-9249be1af336","memory_paths":{"auto":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestInterrupt2595525365-001/memory/"},"scratchpad_path":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestInterrupt2595525365-001/05c42b7f-81dd-4f05-915b-691a2ca162cf/scratchpad","messaging_socket_path":"/tmp/cc-socks/12877.sock","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","per_turn_effort_active":true,"view_mode":"default"}} +{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"05c42b7f-81dd-4f05-915b-691a2ca162cf","uuid":"7248679d-9ecb-4abc-860a-3fe1c44a6dce"}} +{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3PEEY7UPDDkjzdczvDX","type":"message","role":"assistant","content":[{"type":"text","text":"ok"}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":4772,"cache_read_input_tokens":37631,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":4772},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"05c42b7f-81dd-4f05-915b-691a2ca162cf","uuid":"2534aeda-e7b8-4e59-869e-be999b03c4c8","timestamp":"2026-10-15T04:22:34.785Z","request_id":"req_011Cg3PEEGFNZbUTLeP7RgQD"}} +{"dir":"recv","msg":{"duration_api_ms":3936,"stop_reason":"end_turn","session_id":"05c42b7f-81dd-4f05-915b-691a2ca162cf","total_cost_usd":0.0874623,"usage":{"input_tokens":2,"cache_creation_input_tokens":4772,"cache_read_input_tokens":37631,"output_tokens":4,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":4772,"ephemeral_5m_input_tokens":0},"inference_geo":"global","iterations":[{"input_tokens":2,"output_tokens":4,"cache_read_input_tokens":37631,"cache_creation_input_tokens":4772,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":4772},"type":"message"}],"speed":"standard","fallback_credit":null},"modelUsage":{"claude-haiku-5-5":{"inputTokens":1210,"outputTokens":19,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.0001305,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-haiku-5-5","provider":"firstParty","costBasis":"list"},"claude-sonnet-5-5":{"inputTokens":4,"outputTokens":118,"cacheReadInputTokens":59998,"cacheCreationInputTokens":20036,"webSearchRequests":0,"costUSD":0.0873318,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-sonnet-5-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"safety_stops":0,"is_error":false,"num_turns":1,"subtype":"success","api_error_status":null,"result":"ok","ttft_ms":994,"type":"result","duration_ms":1012,"uuid":"09385359-ee8f-480c-ba5a-a1d7e87d4aeb","ttft_stream_ms":993,"time_to_request_ms":8,"first_content_frame_ms":993,"queued_turn_count":0,"result_index":1}} diff --git a/internal/claude/testdata/transcripts/TestResume-first.jsonl b/internal/claude/testdata/transcripts/TestResume-first.jsonl index c04c033..61a5401 100644 --- a/internal/claude/testdata/transcripts/TestResume-first.jsonl +++ b/internal/claude/testdata/transcripts/TestResume-first.jsonl @@ -1,8 +1,8 @@ -{"dir":"send","msg":{"request":{"hooks":null,"subtype":"initialize"},"request_id":"req_0cb4a7c755c6baba","type":"control_request"}} -{"dir":"recv","msg":{"type":"control_response","response":{"subtype":"success","request_id":"req_0cb4a7c755c6baba","response":{"commands":[{"name":"deep-research","description":"Deep research harness — fan-out web searches, fetch sources, adversarially verify claims, synthesize a cited report. (dynamic workflow)","argumentHint":"","builtin":true},{"name":"design","description":"Make a new Design artifact from a brief","argumentHint":"[what to design]","builtin":true},{"name":"slides","description":"Make a new Slides deck artifact from a brief","argumentHint":"[what the deck is about]","builtin":true},{"name":"design-sync","description":"Push a React design system to claude.ai/design. This runs a converter that bundles the real component code (from Storybook or a bare package) and uploads it. Use when the user runs /design-sync or says \"sync my design system to Claude Design\".","argumentHint":"[\u003cproject hint, e.g. \"Acme DS\"\u003e]","builtin":true},{"name":"dataviz","description":"Use this skill whenever you are about to create ANY chart, graph, plot, dashboard, or data visualization, in ANY output medium — an HTML or React artifact, inline SVG, plotting code in any library (matplotlib, plotly, d3, Recharts, …), an image/PNG you will render and upload, or a chart shared into Slack. Read it BEFORE writing the first line of chart code, choosing chart colors, building a stat tile / meter / KPI row, or laying out a dashboard. When the destination is a first-party document connector (host-designated, never self-described) that renders live charts, hand it the rows (inline, or as an uploaded data file the chart cites) rather than a rendered PNG/SVG — a picture of a chart loses hover, data inspection and per-value comments. Produces visualizations that read as one system — elegant, accessible, consistent in light and dark — using a brand-neutral placeholder palette you swap for your own. Teaches a design-system-agnostic method: a form heuristic, a color formula with a runnable validator, mark specs, and interaction rules. A validated default palette is documented in `references/palette.md` — swap that file's values for your brand's. Triggers on: \"chart\", \"graph\", \"plot\", \"data viz\", \"visualization\", \"dashboard\", \"analytics\", \"visualize data\", \"categorical colors\", \"sequential / diverging palette\", \"stat tile\", \"sparkline\", \"heatmap\", \"legend\", \"axis\", \"tooltip\", \"chart colors\", \"color by series\".","argumentHint":"","builtin":true},{"name":"artifact-diagramming","description":"Diagramming know-how for Artifacts - when a picture earns its place, how to draw one that shows the real mechanism, and the inline-SVG mechanics that keep it legible in both themes.","argumentHint":"","builtin":true},{"name":"artifact-capabilities","description":"Runtime capabilities a published Artifact page can be granted — behavior static HTML cannot provide on its own, such as the page reading live or connected data, remembering what people do on it (a poll, a sign-up sheet, a checklist, a document edited in place — it saves new versions of itself), keeping state shared across viewers, knowing who is viewing, asking Claude a question of its own, storing files people add, handing the viewer a file to save, or using the viewer's camera, microphone, location, screen or device motion. Serves this user's live capability roster and the typed call definitions. Load it whenever any such runtime behavior would make an artifact more useful, before writing the page.","argumentHint":"","builtin":true},{"name":"update-config","description":"Use this skill to configure the Claude Code harness via settings.json. Automated behaviors (\"from now on when X\", \"each time X\", \"whenever X\", \"before/after X\") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions (\"allow X\", \"add permission\", \"move permission to\"), env vars (\"set X=Y\"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: \"allow npm commands\", \"add bq permission to global settings\", \"move permission to user settings\", \"set DEBUG=true\", \"when claude stops show X\". For simple settings like theme/model, suggest the /config command.","argumentHint":"","builtin":true},{"name":"verify","description":"Verify that a code change actually does what it's supposed to by exercising it end-to-end and observing behavior — drive the affected flow, not just tests or typecheck. Run before committing nontrivial changes; bootstraps this repo's project verify skill if none exists yet. Don't invoke it on a diff that only touches tests, docs, or other code with no runtime surface to drive (a change to product source always has one) — there's nothing to observe.","argumentHint":"","builtin":true},{"name":"debug","description":"Enable debug logging for this session and help diagnose issues","argumentHint":"[issue description]","builtin":true},{"name":"code-review","description":"Review the current diff, or a PR number/branch/path target, for correctness bugs (plus reuse/simplification/efficiency cleanups where the model's review recipe covers them) at the given effort level (low|medium|high|xhigh|max: from few high-confidence findings up to many, some of them uncertain; ultra: deep multi-agent review in the cloud); with no level given, it reuses the level you typed last. Pass --comment to post findings as inline PR comments, or --fix to apply the findings to the working tree after the review. Pass --max-findings \u003cn\u003e to report up to n findings, or --max-findings all for every finding. The choice stays until you pass --max-findings default. For ultra on a GitHub.com PR target, --post asks to post the finished review’s findings to the PR as a single comment from the user’s GitHub account (not a review; the launch dialog still confirms in interactive sessions, while non-interactive mode posts on the flag alone) and --no-post hides that option.","argumentHint":"[low|medium|high|xhigh|max|ultra] [--fix] [--comment] [\u003cpr#\u003e|\u003cbranch\u003e|\u003cpath\u003e] [--max-findings \u003cn\u003e|all]","aliases":["review"],"builtin":true},{"name":"simplify","description":"Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.","argumentHint":"[\u003ctarget\u003e]","builtin":true},{"name":"batch","description":"Research and plan a large-scale change, then execute it in parallel across 5–30 isolated worktree agents that each open a PR.","argumentHint":"\u003cinstruction\u003e","builtin":true},{"name":"fewer-permission-prompts","description":"Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.","argumentHint":"","builtin":true},{"name":"doctor","description":"Health-check the user's Claude Code setup and fix issues: diagnose installation health — what the `claude doctor` terminal diagnostics cover — from local data (duplicate or leftover installs, PATH, unparseable settings files, broken or colliding agent definitions, skills whose frontmatter fails to parse); find unused skills, MCP servers, and plugins versus their context cost and disable dead weight; deduplicate local CLAUDE.md files against checked-in ones; trim checked-in CLAUDE.md files by cutting content a session could derive from the codebase (directory layouts, tech-stack lists, architecture overviews) while keeping gotchas, rationale, and non-standard conventions; migrate always-loaded CLAUDE.md guidance into lazy skills and nested CLAUDE.md files; flag slow hooks and context-heavy extensions; check the installed version is current; make auto mode the default permission mode; and pre-approve frequently denied read-only commands. Use when the user asks for a doctor run, checkup, audit, tune-up, or cleanup of their Claude Code setup or configuration.","argumentHint":"[prompt-audit [\u003cpath\u003e]]","aliases":["checkup"],"builtin":true},{"name":"loop","description":"Run a prompt or slash command on a recurring interval (e.g. /loop 5m /foo). Omit the interval to let the model self-pace.","argumentHint":"[interval] [prompt]","aliases":["proactive"],"builtin":true},{"name":"schedule","description":"Create, update, list, or run scheduled cloud agents (routines) that execute on a cron schedule.","argumentHint":"","aliases":["routines"],"builtin":true},{"name":"claude-api","description":"Reference for the Claude API / Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude/Anthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing/model choice/limits/caching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent/MCP/tool-definition/multi-agent/RAG/LLM-judge/computer-use; generate/summarize/extract/classify/rewrite/converse over NL; debugging refusals/cutoffs/streaming/tool-calls/tokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).","argumentHint":"","builtin":true},{"name":"workflow-authoring","description":"Reference for writing a Workflow tool script (script API and gotchas, resume, quality patterns, worked examples). Load before authoring a script for a workflow the user already opted into; it does not itself authorize running one.","argumentHint":"","builtin":true},{"name":"run","description":"Launch and drive this project's app to see a change working. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real app (not just tests). First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns per project type (CLI, server, TUI, Electron, browser-driven, library).","argumentHint":"","builtin":true},{"name":"run-skill-generator","description":"Author or improve the run-\u003cunit\u003e skill - a per-project skill that tells agents how to build, launch, and drive this project's app. Use when the user asks to set up the project, get it running, write run instructions, or verify build/run steps work from a clean environment.","argumentHint":"","builtin":true},{"name":"plugin-authoring","description":"Make a mod: a change to Claude's own interface or behaviour, such as a live pane or panel, a band above the prompt, a status line, a toast, a slash command, or a hook on tool calls or prompts. Use to make, change or debug a mod or its hooks module.","argumentHint":"","builtin":true},{"name":"advisor","description":"Let Claude consult a stronger model at key moments","argumentHint":"[fable|opus|sonnet|off]","builtin":true},{"name":"agents","description":"(removed) Ask Claude to create/manage subagents, or edit .claude/agents/","argumentHint":"","builtin":true},{"name":"auto-mode-setup","description":"Teach auto mode about your environment, plus optional rule tweaks","argumentHint":"[--request-id \u003cuuid\u003e] (--wizard posture=… scope=… depth=… --propose | --expect-sha256 \u003c64-hex\u003e --apply-file \u003cpath\u003e)","builtin":true},{"name":"autocompact","description":"Configure the auto-compact window size","argumentHint":"[auto|\u003ctokens\u003e]","builtin":true},{"name":"clear","description":"Start a new session with empty context; previous session stays on disk (resumable with /resume)","argumentHint":"[name]","aliases":["reset","new"],"builtin":true},{"name":"color","description":"Set the prompt bar color for this session","argumentHint":"[red|blue|green|yellow|purple|orange|pink|cyan|default]","builtin":true},{"name":"compact","description":"Free up context by summarizing the conversation so far","argumentHint":"\u003coptional custom summarization instructions\u003e","builtin":true},{"name":"config","description":"Set a setting by key","argumentHint":"key=value","aliases":["settings"],"builtin":true},{"name":"output-style","description":"List output styles or switch to one","argumentHint":"[style]","builtin":true},{"name":"context","description":"Show current context usage","argumentHint":"","builtin":true},{"name":"effort","description":"Set effort level for model usage","argumentHint":"\u003clow|medium|high|xhigh|max|auto|ultracode [on|off]\u003e","builtin":true},{"name":"fast","description":"Toggle fast mode (Opus 5.5)","argumentHint":"[on|off]","builtin":true},{"name":"focus","description":"Toggle focus view: just your prompt, summary, and response","argumentHint":"[on|off]","builtin":true},{"name":"heapdump","description":"Dump the JS heap to the Desktop; on Linux with no Desktop folder, the home directory","argumentHint":"","builtin":true},{"name":"init","description":"Initialize a new CLAUDE.md file with codebase documentation","argumentHint":"","builtin":true},{"name":"mcp","description":"Manage MCP servers","argumentHint":"[reconnect|enable|disable [\u003cserver\u003e|all]]","builtin":true},{"name":"import","description":"Import config from another AI coding agent","argumentHint":"","builtin":true},{"name":"model","description":"Set the AI model for Claude Code","argumentHint":"\u003cmodel\u003e","builtin":true},{"name":"__remote-workflow","description":"Run the workflow script delivered in this session environment (server-launched sessions only)","argumentHint":"","builtin":true},{"name":"workflow-launch-exec","description":"Execute a server-launched workflow handoff (workflow_launch event sessions only)","argumentHint":"","builtin":true},{"name":"reload-plugins","description":"Activate pending plugin changes in the current session","argumentHint":"[--force]","builtin":true},{"name":"reload-skills","description":"Pick up skills added or changed on disk during this session","argumentHint":"","builtin":true},{"name":"rename","description":"Rename the current conversation","argumentHint":"[name]","aliases":["name"],"builtin":true},{"name":"ultrareview","description":"Start a cloud agent that finds and verifies bugs in your branch (~15-25 min, $5-$25 USD) · Runs in a cloud session. See https://code.claude.com/docs/en/claude-code-on-the-web","argumentHint":"","builtin":true},{"name":"security-review","description":"Complete a security review of the pending changes on the current branch","argumentHint":"","builtin":true},{"name":"usage-credits","description":"Configure usage credits or request them from your admin when you hit a limit","argumentHint":"","builtin":true},{"name":"extra-usage","description":"Renamed to /usage-credits","argumentHint":"","builtin":true},{"name":"usage","description":"Show session cost, plan usage, and what's contributing to your limits","argumentHint":"","aliases":["cost","stats"],"builtin":true},{"name":"insights","description":"Generate a report analyzing your Claude Code sessions","argumentHint":"","builtin":true},{"name":"recap","description":"Generate a one-line session recap now","argumentHint":"","builtin":true},{"name":"skill-doctor","description":"Show which loaded skills are unused and costing context","argumentHint":"","builtin":true},{"name":"goal","description":"Set a goal — keep working until the condition is met","argumentHint":"","builtin":true},{"name":"design-consent","description":"Grant Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"design-revoke","description":"Revoke Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"list-agents","description":"List subagents, teammates, and other Claude sessions you can message","argumentHint":"","aliases":["peers"],"builtin":true},{"name":"team-onboarding","description":"Help teammates ramp on Claude Code with a guide from your usage","argumentHint":"","builtin":true},{"name":"docs","description":"docs (editable docs people share and comment on; the default for any document, named as a doc or not: a document, report, proposal, resume, cover letter, letter, contract, policy, form, template, worksheet, essay, handbook, guide, how-to, cheat sheet, SOP or other writing to keep, share, collaborate on, send, submit, print or sign; a doc exports to Word, PDF, Markdown or Google Docs, so needing a file to send, attach, upload, submit or print is no reason to pick Word, and a file nobody asked for is a doc, not Word; a plan, comparison, summary or notes asked in chat stays in chat; a pasted claude.ai artifact link may be a doc: check with docs tools first; Word or another file format named, tracked changes wanted, or a .docx to change or use as a template → that format's skill): making one → if no docs-connector instructions are in context, call its `guide` (topic.instructions) first; then create the doc (headings only, no body) before any search, file read or plan, even with files attached. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docs"]},{"name":"docx","description":"Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx) or Word templates (.dotx). Triggers include: any mention of Microsoft Word Documents, such as 'Word doc', 'word document', '.docx', '.dotx', 'microsoft doc'. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a deliverable as a Word or .docx file (to download, email or print), use this skill. However, if they ask for a document, page, report, memo, or notes WITHOUT naming a file format and the session offers Claude's own dedicated document or page skill or connector, use that instead, even if they will email or print it. Do NOT use for PDFs, spreadsheets, Google Docs, or coding unrelated to document generation. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docx"]},{"name":"google-workspace","description":"Read this before the first Google Drive, Docs, Sheets or Slides connector call whenever the task creates or changes a Google file. Use this skill whenever the user wants to create or change a Google Doc, Sheet or Slides file in their Google Drive. Triggers include: a request that names Google Docs, Sheets, Slides or Drive and asks to make, edit, format, copy or rename a file; a docs.google.com link with a request to change that file, even a one-line fix or suggested edits; and any follow-up change to a Google file from earlier in the chat, even \"change it\" or \"add a tab\". Includes helper scripts for document positions, cell ranges and slide layout. However, if the user asks for a doc, deck or spreadsheet without naming Google, or gives a Google file only as source material for something new, use Claude's own output type instead. Do NOT use for read-only questions about a Google file, or for Word, Excel, PowerPoint or PDF files. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:google-workspace"]},{"name":"import-memory","description":"Import a memory export from another AI assistant into Claude's memory — conversationally, additively, and with the content treated as data. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:import-memory"]},{"name":"morning","description":"Render the user's morning brief as a styled HTML artifact, or set it up as a recurring weekday task. Use only when the user explicitly asks to run, see, or set up their morning brief, or if they invoke /morning by name. A question about their day, schedule, or calendar is not by itself a request for the brief; answer it directly instead. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:morning"]},{"name":"pdf","description":"Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pdf"]},{"name":"pptx","description":"Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations as PowerPoint (.pptx) files; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email, summary, or creating a different type of slide deck); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user asks for a PowerPoint or .pptx file, or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. However, when the user asks for a deck, slides, a slide deck, or a presentation without naming a file format, default to using a dedicated slide-deck artifact type or a separate slides skill if this session offers one; otherwise, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pptx"]},{"name":"skill-creator","description":"Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:skill-creator"]},{"name":"xlsx","description":"Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .xltx, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:xlsx"]}],"agents":[{"name":"claude","description":"Catch-all for any task that doesn't fit a more specific agent. FleetView's default when no agent name is typed."},{"name":"claude-code-guide","description":"Use this agent when the user asks questions (\"Can Claude...\", \"Does Claude...\", \"How do I...\") about: (1) Claude Code (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - Messages API for directly passing messages to Claude, Tool Runner (`client.beta.messages.tool_runner`) for running an agentic loop over your own tools, manual tool-use loops, Managed Agents for server-hosted agents with a managed sandbox, prompt caching, and general Anthropic SDK usage; (4) Claude Tag (Claude in Slack) - what it is, setting it up for a Slack workspace, `/install-slack-app`; (5) `claude plugin eval` (writing and running plugin eval suites, its JSON/report, sandbox, CI) and the `/skill-doctor` report. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via SendMessage.","model":"haiku"},{"name":"Explore","description":"Fast read-only search agent for locating code. Use it to find files by pattern (eg. \"src/components/**/*.tsx\"), grep for symbols or keywords (eg. \"API endpoints\"), or answer \"where is X defined / which files reference Y.\" Do NOT use it for code review, design-doc auditing, cross-file consistency checks, or open-ended analysis — it reads excerpts rather than whole files and will miss content past its read window. When calling, specify search breadth: \"quick\" for a single targeted lookup, \"medium\" for moderate exploration, or \"very thorough\" to search across multiple locations and naming conventions.","model":"inherit"},{"name":"general-purpose","description":"General-purpose agent for researching complex questions, searching for code, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you."},{"name":"Plan","description":"Software architect agent for designing implementation plans. Use this when you need to plan the implementation strategy for a task. Returns step-by-step plans, identifies critical files, and considers architectural trade-offs.","model":"inherit"},{"name":"statusline-setup","description":"Use this agent to configure the user's Claude Code status line setting.","model":"sonnet"}],"output_style":"default","available_output_styles":["default","Proactive","Concise","Explanatory","Learning"],"user_output_styles_dir":"/Users/flamingcow/.claude/output-styles","models":[{"value":"default","resolvedModel":"claude-opus-5-5","displayName":"Default (recommended)","description":"Opus 5.5 · Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"opus","resolvedModel":"claude-opus-5-5","displayName":"Opus 5.5","description":"For complex work and everyday tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"fable","resolvedModel":"claude-fable-5-1","displayName":"Fable 5.1","description":"For your toughest challenges","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"sonnet","resolvedModel":"claude-sonnet-5-5","displayName":"Sonnet 5.5","description":"Most efficient for simpler tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"haiku","resolvedModel":"claude-haiku-5-5","displayName":"Haiku 5.5","description":"Fastest for quick answers","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-haiku-4-5-20251001","resolvedModel":"claude-haiku-4-5-20251001","displayName":"Haiku 4.5","description":"Fastest for quick answers"},{"value":"claude-sonnet-5","resolvedModel":"claude-sonnet-5","displayName":"Sonnet 5","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-5","resolvedModel":"claude-opus-5","displayName":"Opus 5","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-fable-5","resolvedModel":"claude-fable-5","displayName":"Fable 5","description":"Most capable for your hardest and longest-running tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-8","resolvedModel":"claude-opus-4-8","displayName":"Opus 4.8","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-opus-4-7","resolvedModel":"claude-opus-4-7","displayName":"Opus 4.7","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-6","resolvedModel":"claude-opus-4-6","displayName":"Opus 4.6","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-sonnet-4-6","resolvedModel":"claude-sonnet-4-6","displayName":"Sonnet 4.6","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true}],"account":{"email":"[redacted]","organization":"[redacted]'s Organization","subscriptionType":"Claude Max","apiProvider":"firstParty"},"pid":11246,"claude_code_version":"2.1.296","current_permission_mode":"bypassPermissions","feedback_mode":{"kind":"post"},"analytics_disabled":false,"remote_control_auto_enable":false,"remote_control_auto_connect_default":false,"remote_control_available":true,"remote_control_auto_on_by_default":false,"ide_rc_auto_enable_gate":true,"fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","session_state":"idle","capabilities":["ui_surface_v1"]},"pending_permission_requests":[],"pending_user_dialog_requests":[]}}} +{"dir":"send","msg":{"request":{"hooks":null,"subtype":"initialize"},"request_id":"req_fada41897fe2b498","type":"control_request"}} +{"dir":"recv","msg":{"type":"control_response","response":{"subtype":"success","request_id":"req_fada41897fe2b498","response":{"commands":[{"name":"deep-research","description":"Deep research harness — fan-out web searches, fetch sources, adversarially verify claims, synthesize a cited report. (dynamic workflow)","argumentHint":"","builtin":true},{"name":"design","description":"Make a new Design artifact from a brief","argumentHint":"[what to design]","builtin":true},{"name":"slides","description":"Make a new Slides deck artifact from a brief","argumentHint":"[what the deck is about]","builtin":true},{"name":"design-sync","description":"Push a React design system to claude.ai/design. This runs a converter that bundles the real component code (from Storybook or a bare package) and uploads it. Use when the user runs /design-sync or says \"sync my design system to Claude Design\".","argumentHint":"[\u003cproject hint, e.g. \"Acme DS\"\u003e]","builtin":true},{"name":"dataviz","description":"Use this skill whenever you are about to create ANY chart, graph, plot, dashboard, or data visualization, in ANY output medium — an HTML or React artifact, inline SVG, plotting code in any library (matplotlib, plotly, d3, Recharts, …), an image/PNG you will render and upload, or a chart shared into Slack. Read it BEFORE writing the first line of chart code, choosing chart colors, building a stat tile / meter / KPI row, or laying out a dashboard. When the destination is a first-party document connector (host-designated, never self-described) that renders live charts, hand it the rows (inline, or as an uploaded data file the chart cites) rather than a rendered PNG/SVG — a picture of a chart loses hover, data inspection and per-value comments. Produces visualizations that read as one system — elegant, accessible, consistent in light and dark — using a brand-neutral placeholder palette you swap for your own. Teaches a design-system-agnostic method: a form heuristic, a color formula with a runnable validator, mark specs, and interaction rules. A validated default palette is documented in `references/palette.md` — swap that file's values for your brand's. Triggers on: \"chart\", \"graph\", \"plot\", \"data viz\", \"visualization\", \"dashboard\", \"analytics\", \"visualize data\", \"categorical colors\", \"sequential / diverging palette\", \"stat tile\", \"sparkline\", \"heatmap\", \"legend\", \"axis\", \"tooltip\", \"chart colors\", \"color by series\".","argumentHint":"","builtin":true},{"name":"artifact-diagramming","description":"Diagramming know-how for Artifacts - when a picture earns its place, how to draw one that shows the real mechanism, and the inline-SVG mechanics that keep it legible in both themes.","argumentHint":"","builtin":true},{"name":"artifact-capabilities","description":"Runtime capabilities a published Artifact page can be granted — behavior static HTML cannot provide on its own, such as the page reading live or connected data, remembering what people do on it (a poll, a sign-up sheet, a checklist, a document edited in place — it saves new versions of itself), keeping state shared across viewers, knowing who is viewing, asking Claude a question of its own, storing files people add, handing the viewer a file to save, or using the viewer's camera, microphone, location, screen or device motion. Serves this user's live capability roster and the typed call definitions. Load it whenever any such runtime behavior would make an artifact more useful, before writing the page.","argumentHint":"","builtin":true},{"name":"update-config","description":"Use this skill to configure the Claude Code harness via settings.json. Automated behaviors (\"from now on when X\", \"each time X\", \"whenever X\", \"before/after X\") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions (\"allow X\", \"add permission\", \"move permission to\"), env vars (\"set X=Y\"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: \"allow npm commands\", \"add bq permission to global settings\", \"move permission to user settings\", \"set DEBUG=true\", \"when claude stops show X\". For simple settings like theme/model, suggest the /config command.","argumentHint":"","builtin":true},{"name":"verify","description":"Verify that a code change actually does what it's supposed to by exercising it end-to-end and observing behavior — drive the affected flow, not just tests or typecheck. Run before committing nontrivial changes; bootstraps this repo's project verify skill if none exists yet. Don't invoke it on a diff that only touches tests, docs, or other code with no runtime surface to drive (a change to product source always has one) — there's nothing to observe.","argumentHint":"","builtin":true},{"name":"debug","description":"Enable debug logging for this session and help diagnose issues","argumentHint":"[issue description]","builtin":true},{"name":"code-review","description":"Review the current diff, or a PR number/branch/path target, for correctness bugs (plus reuse/simplification/efficiency cleanups where the model's review recipe covers them) at the given effort level (low|medium|high|xhigh|max: from few high-confidence findings up to many, some of them uncertain; ultra: deep multi-agent review in the cloud); with no level given, it reuses the level you typed last. Pass --comment to post findings as inline PR comments, or --fix to apply the findings to the working tree after the review. Pass --max-findings \u003cn\u003e to report up to n findings, or --max-findings all for every finding. The choice stays until you pass --max-findings default. For ultra on a GitHub.com PR target, --post asks to post the finished review’s findings to the PR as a single comment from the user’s GitHub account (not a review; the launch dialog still confirms in interactive sessions, while non-interactive mode posts on the flag alone) and --no-post hides that option.","argumentHint":"[low|medium|high|xhigh|max|ultra] [--fix] [--comment] [\u003cpr#\u003e|\u003cbranch\u003e|\u003cpath\u003e] [--max-findings \u003cn\u003e|all]","aliases":["review"],"builtin":true},{"name":"simplify","description":"Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.","argumentHint":"[\u003ctarget\u003e]","builtin":true},{"name":"batch","description":"Research and plan a large-scale change, then execute it in parallel across 5–30 isolated worktree agents that each open a PR.","argumentHint":"\u003cinstruction\u003e","builtin":true},{"name":"fewer-permission-prompts","description":"Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.","argumentHint":"","builtin":true},{"name":"doctor","description":"Health-check the user's Claude Code setup and fix issues: diagnose installation health — what the `claude doctor` terminal diagnostics cover — from local data (duplicate or leftover installs, PATH, unparseable settings files, broken or colliding agent definitions, skills whose frontmatter fails to parse); find unused skills, MCP servers, and plugins versus their context cost and disable dead weight; deduplicate local CLAUDE.md files against checked-in ones; trim checked-in CLAUDE.md files by cutting content a session could derive from the codebase (directory layouts, tech-stack lists, architecture overviews) while keeping gotchas, rationale, and non-standard conventions; migrate always-loaded CLAUDE.md guidance into lazy skills and nested CLAUDE.md files; flag slow hooks and context-heavy extensions; check the installed version is current; make auto mode the default permission mode; and pre-approve frequently denied read-only commands. Use when the user asks for a doctor run, checkup, audit, tune-up, or cleanup of their Claude Code setup or configuration.","argumentHint":"[prompt-audit [\u003cpath\u003e]]","aliases":["checkup"],"builtin":true},{"name":"loop","description":"Run a prompt or slash command on a recurring interval (e.g. /loop 5m /foo). Omit the interval to let the model self-pace.","argumentHint":"[interval] [prompt]","aliases":["proactive"],"builtin":true},{"name":"schedule","description":"Create, update, list, or run scheduled cloud agents (routines) that execute on a cron schedule.","argumentHint":"","aliases":["routines"],"builtin":true},{"name":"claude-api","description":"Reference for the Claude API / Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude/Anthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing/model choice/limits/caching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent/MCP/tool-definition/multi-agent/RAG/LLM-judge/computer-use; generate/summarize/extract/classify/rewrite/converse over NL; debugging refusals/cutoffs/streaming/tool-calls/tokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).","argumentHint":"","builtin":true},{"name":"workflow-authoring","description":"Reference for writing a Workflow tool script (script API and gotchas, resume, quality patterns, worked examples). Load before authoring a script for a workflow the user already opted into; it does not itself authorize running one.","argumentHint":"","builtin":true},{"name":"run","description":"Launch and drive this project's app to see a change working. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real app (not just tests). First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns per project type (CLI, server, TUI, Electron, browser-driven, library).","argumentHint":"","builtin":true},{"name":"run-skill-generator","description":"Author or improve the run-\u003cunit\u003e skill - a per-project skill that tells agents how to build, launch, and drive this project's app. Use when the user asks to set up the project, get it running, write run instructions, or verify build/run steps work from a clean environment.","argumentHint":"","builtin":true},{"name":"plugin-authoring","description":"Make a mod: a change to Claude's own interface or behaviour, such as a live pane or panel, a band above the prompt, a status line, a toast, a slash command, or a hook on tool calls or prompts. Use to make, change or debug a mod or its hooks module.","argumentHint":"","builtin":true},{"name":"advisor","description":"Let Claude consult a stronger model at key moments","argumentHint":"[fable|opus|sonnet|off]","builtin":true},{"name":"agents","description":"(removed) Ask Claude to create/manage subagents, or edit .claude/agents/","argumentHint":"","builtin":true},{"name":"auto-mode-setup","description":"Teach auto mode about your environment, plus optional rule tweaks","argumentHint":"[--request-id \u003cuuid\u003e] (--wizard posture=… scope=… depth=… --propose | --expect-sha256 \u003c64-hex\u003e --apply-file \u003cpath\u003e)","builtin":true},{"name":"autocompact","description":"Configure the auto-compact window size","argumentHint":"[auto|\u003ctokens\u003e]","builtin":true},{"name":"clear","description":"Start a new session with empty context; previous session stays on disk (resumable with /resume)","argumentHint":"[name]","aliases":["reset","new"],"builtin":true},{"name":"color","description":"Set the prompt bar color for this session","argumentHint":"[red|blue|green|yellow|purple|orange|pink|cyan|default]","builtin":true},{"name":"compact","description":"Free up context by summarizing the conversation so far","argumentHint":"\u003coptional custom summarization instructions\u003e","builtin":true},{"name":"config","description":"Set a setting by key","argumentHint":"key=value","aliases":["settings"],"builtin":true},{"name":"output-style","description":"List output styles or switch to one","argumentHint":"[style]","builtin":true},{"name":"context","description":"Show current context usage","argumentHint":"","builtin":true},{"name":"effort","description":"Set effort level for model usage","argumentHint":"\u003clow|medium|high|xhigh|max|auto|ultracode [on|off]\u003e","builtin":true},{"name":"fast","description":"Toggle fast mode (Opus 5.5)","argumentHint":"[on|off]","builtin":true},{"name":"focus","description":"Toggle focus view: just your prompt, summary, and response","argumentHint":"[on|off]","builtin":true},{"name":"heapdump","description":"Dump the JS heap to the Desktop; on Linux with no Desktop folder, the home directory","argumentHint":"","builtin":true},{"name":"init","description":"Initialize a new CLAUDE.md file with codebase documentation","argumentHint":"","builtin":true},{"name":"mcp","description":"Manage MCP servers","argumentHint":"[reconnect|enable|disable [\u003cserver\u003e|all]]","builtin":true},{"name":"import","description":"Import config from another AI coding agent","argumentHint":"","builtin":true},{"name":"model","description":"Set the AI model for Claude Code","argumentHint":"\u003cmodel\u003e","builtin":true},{"name":"__remote-workflow","description":"Run the workflow script delivered in this session environment (server-launched sessions only)","argumentHint":"","builtin":true},{"name":"workflow-launch-exec","description":"Execute a server-launched workflow handoff (workflow_launch event sessions only)","argumentHint":"","builtin":true},{"name":"reload-plugins","description":"Activate pending plugin changes in the current session","argumentHint":"[--force]","builtin":true},{"name":"reload-skills","description":"Pick up skills added or changed on disk during this session","argumentHint":"","builtin":true},{"name":"rename","description":"Rename the current conversation","argumentHint":"[name]","aliases":["name"],"builtin":true},{"name":"ultrareview","description":"Start a cloud agent that finds and verifies bugs in your branch (~15-25 min, $5-$25 USD) · Runs in a cloud session. See https://code.claude.com/docs/en/claude-code-on-the-web","argumentHint":"","builtin":true},{"name":"security-review","description":"Complete a security review of the pending changes on the current branch","argumentHint":"","builtin":true},{"name":"usage-credits","description":"Configure usage credits or request them from your admin when you hit a limit","argumentHint":"","builtin":true},{"name":"extra-usage","description":"Renamed to /usage-credits","argumentHint":"","builtin":true},{"name":"usage","description":"Show session cost, plan usage, and what's contributing to your limits","argumentHint":"","aliases":["cost","stats"],"builtin":true},{"name":"insights","description":"Generate a report analyzing your Claude Code sessions","argumentHint":"","builtin":true},{"name":"recap","description":"Generate a one-line session recap now","argumentHint":"","builtin":true},{"name":"skill-doctor","description":"Show which loaded skills are unused and costing context","argumentHint":"","builtin":true},{"name":"goal","description":"Set a goal — keep working until the condition is met","argumentHint":"","builtin":true},{"name":"design-consent","description":"Grant Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"design-revoke","description":"Revoke Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"list-agents","description":"List subagents, teammates, and other Claude sessions you can message","argumentHint":"","aliases":["peers"],"builtin":true},{"name":"team-onboarding","description":"Help teammates ramp on Claude Code with a guide from your usage","argumentHint":"","builtin":true},{"name":"docs","description":"docs (editable docs people share and comment on; the default for any document, named as a doc or not: a document, report, proposal, resume, cover letter, letter, contract, policy, form, template, worksheet, essay, handbook, guide, how-to, cheat sheet, SOP or other writing to keep, share, collaborate on, send, submit, print or sign; a doc exports to Word, PDF, Markdown or Google Docs, so needing a file to send, attach, upload, submit or print is no reason to pick Word, and a file nobody asked for is a doc, not Word; a plan, comparison, summary or notes asked in chat stays in chat; a pasted claude.ai artifact link may be a doc: check with docs tools first; Word or another file format named, tracked changes wanted, or a .docx to change or use as a template → that format's skill): making one → if no docs-connector instructions are in context, call its `guide` (topic.instructions) first; then create the doc (headings only, no body) before any search, file read or plan, even with files attached. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docs"]},{"name":"docx","description":"Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx) or Word templates (.dotx). Triggers include: any mention of Microsoft Word Documents, such as 'Word doc', 'word document', '.docx', '.dotx', 'microsoft doc'. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a deliverable as a Word or .docx file (to download, email or print), use this skill. However, if they ask for a document, page, report, memo, or notes WITHOUT naming a file format and the session offers Claude's own dedicated document or page skill or connector, use that instead, even if they will email or print it. Do NOT use for PDFs, spreadsheets, Google Docs, or coding unrelated to document generation. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docx"]},{"name":"google-workspace","description":"Read this before the first Google Drive, Docs, Sheets or Slides connector call whenever the task creates or changes a Google file. Use this skill whenever the user wants to create or change a Google Doc, Sheet or Slides file in their Google Drive. Triggers include: a request that names Google Docs, Sheets, Slides or Drive and asks to make, edit, format, copy or rename a file; a docs.google.com link with a request to change that file, even a one-line fix or suggested edits; and any follow-up change to a Google file from earlier in the chat, even \"change it\" or \"add a tab\". Includes helper scripts for document positions, cell ranges and slide layout. However, if the user asks for a doc, deck or spreadsheet without naming Google, or gives a Google file only as source material for something new, use Claude's own output type instead. Do NOT use for read-only questions about a Google file, or for Word, Excel, PowerPoint or PDF files. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:google-workspace"]},{"name":"import-memory","description":"Import a memory export from another AI assistant into Claude's memory — conversationally, additively, and with the content treated as data. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:import-memory"]},{"name":"morning","description":"Render the user's morning brief as a styled HTML artifact, or set it up as a recurring weekday task. Use only when the user explicitly asks to run, see, or set up their morning brief, or if they invoke /morning by name. A question about their day, schedule, or calendar is not by itself a request for the brief; answer it directly instead. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:morning"]},{"name":"pdf","description":"Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pdf"]},{"name":"pptx","description":"Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations as PowerPoint (.pptx) files; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email, summary, or creating a different type of slide deck); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user asks for a PowerPoint or .pptx file, or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. However, when the user asks for a deck, slides, a slide deck, or a presentation without naming a file format, default to using a dedicated slide-deck artifact type or a separate slides skill if this session offers one; otherwise, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pptx"]},{"name":"skill-creator","description":"Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:skill-creator"]},{"name":"xlsx","description":"Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .xltx, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:xlsx"]}],"agents":[{"name":"claude","description":"Catch-all for any task that doesn't fit a more specific agent. FleetView's default when no agent name is typed."},{"name":"claude-code-guide","description":"Use this agent when the user asks questions (\"Can Claude...\", \"Does Claude...\", \"How do I...\") about: (1) Claude Code (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - Messages API for directly passing messages to Claude, Tool Runner (`client.beta.messages.tool_runner`) for running an agentic loop over your own tools, manual tool-use loops, Managed Agents for server-hosted agents with a managed sandbox, prompt caching, and general Anthropic SDK usage; (4) Claude Tag (Claude in Slack) - what it is, setting it up for a Slack workspace, `/install-slack-app`; (5) `claude plugin eval` (writing and running plugin eval suites, its JSON/report, sandbox, CI) and the `/skill-doctor` report. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via SendMessage.","model":"haiku"},{"name":"Explore","description":"Fast read-only search agent for locating code. Use it to find files by pattern (eg. \"src/components/**/*.tsx\"), grep for symbols or keywords (eg. \"API endpoints\"), or answer \"where is X defined / which files reference Y.\" Do NOT use it for code review, design-doc auditing, cross-file consistency checks, or open-ended analysis — it reads excerpts rather than whole files and will miss content past its read window. When calling, specify search breadth: \"quick\" for a single targeted lookup, \"medium\" for moderate exploration, or \"very thorough\" to search across multiple locations and naming conventions.","model":"inherit"},{"name":"general-purpose","description":"General-purpose agent for researching complex questions, searching for code, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you."},{"name":"Plan","description":"Software architect agent for designing implementation plans. Use this when you need to plan the implementation strategy for a task. Returns step-by-step plans, identifies critical files, and considers architectural trade-offs.","model":"inherit"},{"name":"statusline-setup","description":"Use this agent to configure the user's Claude Code status line setting.","model":"sonnet"}],"output_style":"default","available_output_styles":["default","Proactive","Concise","Explanatory","Learning"],"user_output_styles_dir":"/Users/flamingcow/.claude/output-styles","models":[{"value":"default","resolvedModel":"claude-opus-5-5","displayName":"Default (recommended)","description":"Opus 5.5 · Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"opus","resolvedModel":"claude-opus-5-5","displayName":"Opus 5.5","description":"For complex work and everyday tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"fable","resolvedModel":"claude-fable-5-1","displayName":"Fable 5.1","description":"For your toughest challenges","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"sonnet","resolvedModel":"claude-sonnet-5-5","displayName":"Sonnet 5.5","description":"Most efficient for simpler tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"haiku","resolvedModel":"claude-haiku-5-5","displayName":"Haiku 5.5","description":"Fastest for quick answers","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-haiku-4-5-20251001","resolvedModel":"claude-haiku-4-5-20251001","displayName":"Haiku 4.5","description":"Fastest for quick answers"},{"value":"claude-sonnet-5","resolvedModel":"claude-sonnet-5","displayName":"Sonnet 5","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-5","resolvedModel":"claude-opus-5","displayName":"Opus 5","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-fable-5","resolvedModel":"claude-fable-5","displayName":"Fable 5","description":"Most capable for your hardest and longest-running tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-8","resolvedModel":"claude-opus-4-8","displayName":"Opus 4.8","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-opus-4-7","resolvedModel":"claude-opus-4-7","displayName":"Opus 4.7","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-6","resolvedModel":"claude-opus-4-6","displayName":"Opus 4.6","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-sonnet-4-6","resolvedModel":"claude-sonnet-4-6","displayName":"Sonnet 4.6","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true}],"account":{"email":"[redacted]","organization":"[redacted]'s Organization","subscriptionType":"Claude Max","apiProvider":"firstParty"},"pid":12879,"claude_code_version":"2.1.296","current_permission_mode":"bypassPermissions","feedback_mode":{"kind":"post"},"analytics_disabled":false,"remote_control_auto_enable":false,"remote_control_auto_connect_default":false,"remote_control_available":true,"remote_control_auto_on_by_default":false,"ide_rc_auto_enable_gate":true,"fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","session_state":"idle","capabilities":["ui_surface_v1"]},"pending_permission_requests":[],"pending_user_dialog_requests":[]}}} {"dir":"send","msg":{"message":{"content":"Remember the codeword AZURE-17. Reply with the single word ok.","role":"user"},"parent_tool_use_id":null,"session_id":"","type":"user"}} -{"dir":"recv","msg":{"type":"system","subtype":"init","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestResume1886800699/001","session_id":"ce489de4-76a6-429b-82ec-0db579958d34","tools":["Task","Artifact","ArtifactComments","ArtifactData","Bash","CronCreate","CronDelete","CronList","DesignSync","Edit","EnterWorktree","ExitWorktree","ListAgents","LSP","Monitor","NotebookEdit","PushNotification","Read","RemoteTrigger","ReportFindings","ScheduleWakeup","SendMessage","Skill","TaskStop","ToolSearch","WebFetch","WebSearch","Workflow","Write"],"mcp_servers":[{"name":"claude.ai Claude Docs","status":"pending","source":"claudeai"},{"name":"claude.ai Heliosian","status":"pending","source":"claudeai"},{"name":"claude.ai Fastmail","status":"pending","source":"claudeai"},{"name":"claude.ai Google Calendar","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Gmail","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Google Drive","status":"needs-auth","source":"claudeai"}],"model":"claude-sonnet-5-5","permissionMode":"bypassPermissions","slash_commands":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","advisor","agents","auto-mode-setup","autocompact","clear","color","compact","config","output-style","context","effort","fast","focus","heapdump","init","mcp","import","model","__remote-workflow","workflow-launch-exec","reload-plugins","reload-skills","rename","ultrareview","security-review","usage-credits","extra-usage","usage","insights","recap","skill-doctor","goal","design-consent","design-revoke","list-agents","team-onboarding","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"terminal_slash_commands":["doctor","color","focus","reload-plugins"],"apiKeySource":"none","claude_code_version":"2.1.296","output_style":"default","agents":["claude","claude-code-guide","Explore","general-purpose","Plan","statusline-setup"],"skills":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"plugins":[{"name":"clangd-lsp","path":"/Users/flamingcow/.claude/plugins/cache/claude-plugins-official/clangd-lsp/1.0.0","source":"clangd-lsp@claude-plugins-official","version":"1.0.0"},{"name":"cc-plugin-agents-md","path":"builtin","source":"cc-plugin-agents-md@builtin"},{"name":"cc-plugin-telemetry","path":"builtin","source":"cc-plugin-telemetry@builtin"},{"name":"cc-plugin-plugin-authoring","path":"builtin","source":"cc-plugin-plugin-authoring@builtin"}],"capabilities":["interrupt_receipt_v1","interrupt_cancel_queued_v1","interrupt_send_now_v1","msg_lifecycle_v1","request_marker_lists_v1","sdk_mcp_tools_list_changed","sdk_mcp_manifests","mcp_read_resource_v1","mcp_tool_ui_meta_v1","ui_surface_v1"],"analytics_disabled":false,"product_feedback_disabled":false,"uuid":"01655ade-4b55-4ea7-becb-c574c74bb00f","memory_paths":{"auto":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestResume1886800699-001/memory/"},"scratchpad_path":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestResume1886800699-001/ce489de4-76a6-429b-82ec-0db579958d34/scratchpad","messaging_socket_path":"/tmp/cc-socks/11246.sock","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","per_turn_effort_active":true,"view_mode":"default"}} -{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"ce489de4-76a6-429b-82ec-0db579958d34","uuid":"b6c16129-e1d5-44a6-9656-c29a93e5184b"}} -{"dir":"recv","msg":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed","resetsAt":1792054200,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false,"unifiedWindows":{"five_hour":{"utilization":0.04,"resetsAt":1792054200},"seven_day":{"utilization":0.35,"resetsAt":1792270800}}},"uuid":"4b1be182-9cd3-4dcd-a26b-f63a3bc81788","session_id":"ce489de4-76a6-429b-82ec-0db579958d34"}} -{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3P8Q7uZfeaAtp2uFWSj","type":"message","role":"assistant","content":[{"type":"text","text":"ok"}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":15229,"cache_read_input_tokens":22367,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15229},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"ce489de4-76a6-429b-82ec-0db579958d34","uuid":"525abaaa-f43c-4b1d-b2dd-abd1b618f191","timestamp":"2026-10-15T04:21:16.144Z","request_id":"req_011Cg3P8PkpmcymWFQXasskD"}} -{"dir":"recv","msg":{"duration_api_ms":2352,"stop_reason":"end_turn","session_id":"ce489de4-76a6-429b-82ec-0db579958d34","total_cost_usd":0.063326,"usage":{"input_tokens":2,"cache_creation_input_tokens":15229,"cache_read_input_tokens":22367,"output_tokens":4,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":15229,"ephemeral_5m_input_tokens":0},"inference_geo":"global","iterations":[{"input_tokens":2,"output_tokens":4,"cache_read_input_tokens":22367,"cache_creation_input_tokens":15229,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15229},"type":"message"}],"speed":"standard","fallback_credit":null},"modelUsage":{"claude-haiku-5-5":{"inputTokens":1188,"outputTokens":21,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.00012930000000000003,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-haiku-5-5","provider":"firstParty","costBasis":"list"},"claude-sonnet-5-5":{"inputTokens":2,"outputTokens":4,"cacheReadInputTokens":22367,"cacheCreationInputTokens":15229,"webSearchRequests":0,"costUSD":0.0631967,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-sonnet-5-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"safety_stops":0,"is_error":false,"num_turns":1,"subtype":"success","api_error_status":null,"result":"ok","ttft_ms":1657,"type":"result","duration_ms":1696,"uuid":"4b55c8bc-fb82-4186-b3e5-1826f3bd1659","ttft_stream_ms":1652,"time_to_request_ms":28,"first_content_frame_ms":1653,"queued_turn_count":0,"result_index":0}} +{"dir":"recv","msg":{"type":"system","subtype":"init","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestResume631419293/001","session_id":"3c0da634-cb14-4a4d-ba11-57538393d6a9","tools":["Task","Artifact","ArtifactComments","ArtifactData","Bash","CronCreate","CronDelete","CronList","DesignSync","Edit","EnterWorktree","ExitWorktree","ListAgents","LSP","Monitor","NotebookEdit","PushNotification","Read","RemoteTrigger","ReportFindings","ScheduleWakeup","SendMessage","Skill","TaskStop","ToolSearch","WebFetch","WebSearch","Workflow","Write"],"mcp_servers":[{"name":"claude.ai Claude Docs","status":"pending","source":"claudeai"},{"name":"claude.ai Heliosian","status":"pending","source":"claudeai"},{"name":"claude.ai Fastmail","status":"pending","source":"claudeai"},{"name":"claude.ai Google Calendar","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Gmail","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Google Drive","status":"needs-auth","source":"claudeai"}],"model":"claude-sonnet-5-5","permissionMode":"bypassPermissions","slash_commands":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","advisor","agents","auto-mode-setup","autocompact","clear","color","compact","config","output-style","context","effort","fast","focus","heapdump","init","mcp","import","model","__remote-workflow","workflow-launch-exec","reload-plugins","reload-skills","rename","ultrareview","security-review","usage-credits","extra-usage","usage","insights","recap","skill-doctor","goal","design-consent","design-revoke","list-agents","team-onboarding","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"terminal_slash_commands":["doctor","color","focus","reload-plugins"],"apiKeySource":"none","claude_code_version":"2.1.296","output_style":"default","agents":["claude","claude-code-guide","Explore","general-purpose","Plan","statusline-setup"],"skills":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"plugins":[{"name":"clangd-lsp","path":"/Users/flamingcow/.claude/plugins/cache/claude-plugins-official/clangd-lsp/1.0.0","source":"clangd-lsp@claude-plugins-official","version":"1.0.0"},{"name":"cc-plugin-agents-md","path":"builtin","source":"cc-plugin-agents-md@builtin"},{"name":"cc-plugin-telemetry","path":"builtin","source":"cc-plugin-telemetry@builtin"},{"name":"cc-plugin-plugin-authoring","path":"builtin","source":"cc-plugin-plugin-authoring@builtin"}],"capabilities":["interrupt_receipt_v1","interrupt_cancel_queued_v1","interrupt_send_now_v1","msg_lifecycle_v1","request_marker_lists_v1","sdk_mcp_tools_list_changed","sdk_mcp_manifests","mcp_read_resource_v1","mcp_tool_ui_meta_v1","ui_surface_v1"],"analytics_disabled":false,"product_feedback_disabled":false,"uuid":"5739f16c-908a-40ef-af37-10f3be4d3810","memory_paths":{"auto":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestResume631419293-001/memory/"},"scratchpad_path":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestResume631419293-001/3c0da634-cb14-4a4d-ba11-57538393d6a9/scratchpad","messaging_socket_path":"/tmp/cc-socks/12879.sock","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","per_turn_effort_active":true,"view_mode":"default"}} +{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"3c0da634-cb14-4a4d-ba11-57538393d6a9","uuid":"a1b217b3-43ec-4714-8bcf-e38e50be014d"}} +{"dir":"recv","msg":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed","resetsAt":1792054200,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false,"unifiedWindows":{"five_hour":{"utilization":0.05,"resetsAt":1792054200},"seven_day":{"utilization":0.35,"resetsAt":1792270800}}},"uuid":"de9a2406-1b88-438e-8fbb-ecd0f3ec86fa","session_id":"3c0da634-cb14-4a4d-ba11-57538393d6a9"}} +{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3PDvg4zP1dgZKTDrhJU","type":"message","role":"assistant","content":[{"type":"text","text":"ok"}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":15230,"cache_read_input_tokens":22367,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15230},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"3c0da634-cb14-4a4d-ba11-57538393d6a9","uuid":"c2bef50f-60e7-490d-bb34-4a271ba81819","timestamp":"2026-10-15T04:22:30.962Z","request_id":"req_011Cg3PDvGGWqFA6UU9GhoTm"}} +{"dir":"recv","msg":{"duration_api_ms":2150,"stop_reason":"end_turn","session_id":"3c0da634-cb14-4a4d-ba11-57538393d6a9","total_cost_usd":0.06333,"usage":{"input_tokens":2,"cache_creation_input_tokens":15230,"cache_read_input_tokens":22367,"output_tokens":4,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":15230,"ephemeral_5m_input_tokens":0},"inference_geo":"global","iterations":[{"input_tokens":2,"output_tokens":4,"cache_read_input_tokens":22367,"cache_creation_input_tokens":15230,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15230},"type":"message"}],"speed":"standard","fallback_credit":null},"modelUsage":{"claude-haiku-5-5":{"inputTokens":1188,"outputTokens":21,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.00012930000000000003,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-haiku-5-5","provider":"firstParty","costBasis":"list"},"claude-sonnet-5-5":{"inputTokens":2,"outputTokens":4,"cacheReadInputTokens":22367,"cacheCreationInputTokens":15230,"webSearchRequests":0,"costUSD":0.0632007,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-sonnet-5-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"safety_stops":0,"is_error":false,"num_turns":1,"subtype":"success","api_error_status":null,"result":"ok","ttft_ms":1530,"type":"result","duration_ms":1546,"uuid":"ef0e8d5b-6ab8-4040-a7ca-68f02c3808c4","ttft_stream_ms":1526,"time_to_request_ms":30,"first_content_frame_ms":1526,"queued_turn_count":0,"result_index":0}} diff --git a/internal/claude/testdata/transcripts/TestResume-resumed.jsonl b/internal/claude/testdata/transcripts/TestResume-resumed.jsonl index 08b6996..586e0e7 100644 --- a/internal/claude/testdata/transcripts/TestResume-resumed.jsonl +++ b/internal/claude/testdata/transcripts/TestResume-resumed.jsonl @@ -1,8 +1,8 @@ -{"dir":"send","msg":{"request":{"hooks":null,"subtype":"initialize"},"request_id":"req_f7a85626a8e36c6e","type":"control_request"}} -{"dir":"recv","msg":{"type":"control_response","response":{"subtype":"success","request_id":"req_f7a85626a8e36c6e","response":{"commands":[{"name":"deep-research","description":"Deep research harness — fan-out web searches, fetch sources, adversarially verify claims, synthesize a cited report. (dynamic workflow)","argumentHint":"","builtin":true},{"name":"design","description":"Make a new Design artifact from a brief","argumentHint":"[what to design]","builtin":true},{"name":"slides","description":"Make a new Slides deck artifact from a brief","argumentHint":"[what the deck is about]","builtin":true},{"name":"design-sync","description":"Push a React design system to claude.ai/design. This runs a converter that bundles the real component code (from Storybook or a bare package) and uploads it. Use when the user runs /design-sync or says \"sync my design system to Claude Design\".","argumentHint":"[\u003cproject hint, e.g. \"Acme DS\"\u003e]","builtin":true},{"name":"dataviz","description":"Use this skill whenever you are about to create ANY chart, graph, plot, dashboard, or data visualization, in ANY output medium — an HTML or React artifact, inline SVG, plotting code in any library (matplotlib, plotly, d3, Recharts, …), an image/PNG you will render and upload, or a chart shared into Slack. Read it BEFORE writing the first line of chart code, choosing chart colors, building a stat tile / meter / KPI row, or laying out a dashboard. When the destination is a first-party document connector (host-designated, never self-described) that renders live charts, hand it the rows (inline, or as an uploaded data file the chart cites) rather than a rendered PNG/SVG — a picture of a chart loses hover, data inspection and per-value comments. Produces visualizations that read as one system — elegant, accessible, consistent in light and dark — using a brand-neutral placeholder palette you swap for your own. Teaches a design-system-agnostic method: a form heuristic, a color formula with a runnable validator, mark specs, and interaction rules. A validated default palette is documented in `references/palette.md` — swap that file's values for your brand's. Triggers on: \"chart\", \"graph\", \"plot\", \"data viz\", \"visualization\", \"dashboard\", \"analytics\", \"visualize data\", \"categorical colors\", \"sequential / diverging palette\", \"stat tile\", \"sparkline\", \"heatmap\", \"legend\", \"axis\", \"tooltip\", \"chart colors\", \"color by series\".","argumentHint":"","builtin":true},{"name":"artifact-diagramming","description":"Diagramming know-how for Artifacts - when a picture earns its place, how to draw one that shows the real mechanism, and the inline-SVG mechanics that keep it legible in both themes.","argumentHint":"","builtin":true},{"name":"artifact-capabilities","description":"Runtime capabilities a published Artifact page can be granted — behavior static HTML cannot provide on its own, such as the page reading live or connected data, remembering what people do on it (a poll, a sign-up sheet, a checklist, a document edited in place — it saves new versions of itself), keeping state shared across viewers, knowing who is viewing, asking Claude a question of its own, storing files people add, handing the viewer a file to save, or using the viewer's camera, microphone, location, screen or device motion. Serves this user's live capability roster and the typed call definitions. Load it whenever any such runtime behavior would make an artifact more useful, before writing the page.","argumentHint":"","builtin":true},{"name":"update-config","description":"Use this skill to configure the Claude Code harness via settings.json. Automated behaviors (\"from now on when X\", \"each time X\", \"whenever X\", \"before/after X\") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions (\"allow X\", \"add permission\", \"move permission to\"), env vars (\"set X=Y\"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: \"allow npm commands\", \"add bq permission to global settings\", \"move permission to user settings\", \"set DEBUG=true\", \"when claude stops show X\". For simple settings like theme/model, suggest the /config command.","argumentHint":"","builtin":true},{"name":"verify","description":"Verify that a code change actually does what it's supposed to by exercising it end-to-end and observing behavior — drive the affected flow, not just tests or typecheck. Run before committing nontrivial changes; bootstraps this repo's project verify skill if none exists yet. Don't invoke it on a diff that only touches tests, docs, or other code with no runtime surface to drive (a change to product source always has one) — there's nothing to observe.","argumentHint":"","builtin":true},{"name":"debug","description":"Enable debug logging for this session and help diagnose issues","argumentHint":"[issue description]","builtin":true},{"name":"code-review","description":"Review the current diff, or a PR number/branch/path target, for correctness bugs (plus reuse/simplification/efficiency cleanups where the model's review recipe covers them) at the given effort level (low|medium|high|xhigh|max: from few high-confidence findings up to many, some of them uncertain; ultra: deep multi-agent review in the cloud); with no level given, it reuses the level you typed last. Pass --comment to post findings as inline PR comments, or --fix to apply the findings to the working tree after the review. Pass --max-findings \u003cn\u003e to report up to n findings, or --max-findings all for every finding. The choice stays until you pass --max-findings default. For ultra on a GitHub.com PR target, --post asks to post the finished review’s findings to the PR as a single comment from the user’s GitHub account (not a review; the launch dialog still confirms in interactive sessions, while non-interactive mode posts on the flag alone) and --no-post hides that option.","argumentHint":"[low|medium|high|xhigh|max|ultra] [--fix] [--comment] [\u003cpr#\u003e|\u003cbranch\u003e|\u003cpath\u003e] [--max-findings \u003cn\u003e|all]","aliases":["review"],"builtin":true},{"name":"simplify","description":"Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.","argumentHint":"[\u003ctarget\u003e]","builtin":true},{"name":"batch","description":"Research and plan a large-scale change, then execute it in parallel across 5–30 isolated worktree agents that each open a PR.","argumentHint":"\u003cinstruction\u003e","builtin":true},{"name":"fewer-permission-prompts","description":"Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.","argumentHint":"","builtin":true},{"name":"doctor","description":"Health-check the user's Claude Code setup and fix issues: diagnose installation health — what the `claude doctor` terminal diagnostics cover — from local data (duplicate or leftover installs, PATH, unparseable settings files, broken or colliding agent definitions, skills whose frontmatter fails to parse); find unused skills, MCP servers, and plugins versus their context cost and disable dead weight; deduplicate local CLAUDE.md files against checked-in ones; trim checked-in CLAUDE.md files by cutting content a session could derive from the codebase (directory layouts, tech-stack lists, architecture overviews) while keeping gotchas, rationale, and non-standard conventions; migrate always-loaded CLAUDE.md guidance into lazy skills and nested CLAUDE.md files; flag slow hooks and context-heavy extensions; check the installed version is current; make auto mode the default permission mode; and pre-approve frequently denied read-only commands. Use when the user asks for a doctor run, checkup, audit, tune-up, or cleanup of their Claude Code setup or configuration.","argumentHint":"[prompt-audit [\u003cpath\u003e]]","aliases":["checkup"],"builtin":true},{"name":"loop","description":"Run a prompt or slash command on a recurring interval (e.g. /loop 5m /foo). Omit the interval to let the model self-pace.","argumentHint":"[interval] [prompt]","aliases":["proactive"],"builtin":true},{"name":"schedule","description":"Create, update, list, or run scheduled cloud agents (routines) that execute on a cron schedule.","argumentHint":"","aliases":["routines"],"builtin":true},{"name":"claude-api","description":"Reference for the Claude API / Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude/Anthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing/model choice/limits/caching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent/MCP/tool-definition/multi-agent/RAG/LLM-judge/computer-use; generate/summarize/extract/classify/rewrite/converse over NL; debugging refusals/cutoffs/streaming/tool-calls/tokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).","argumentHint":"","builtin":true},{"name":"workflow-authoring","description":"Reference for writing a Workflow tool script (script API and gotchas, resume, quality patterns, worked examples). Load before authoring a script for a workflow the user already opted into; it does not itself authorize running one.","argumentHint":"","builtin":true},{"name":"run","description":"Launch and drive this project's app to see a change working. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real app (not just tests). First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns per project type (CLI, server, TUI, Electron, browser-driven, library).","argumentHint":"","builtin":true},{"name":"run-skill-generator","description":"Author or improve the run-\u003cunit\u003e skill - a per-project skill that tells agents how to build, launch, and drive this project's app. Use when the user asks to set up the project, get it running, write run instructions, or verify build/run steps work from a clean environment.","argumentHint":"","builtin":true},{"name":"plugin-authoring","description":"Make a mod: a change to Claude's own interface or behaviour, such as a live pane or panel, a band above the prompt, a status line, a toast, a slash command, or a hook on tool calls or prompts. Use to make, change or debug a mod or its hooks module.","argumentHint":"","builtin":true},{"name":"advisor","description":"Let Claude consult a stronger model at key moments","argumentHint":"[fable|opus|sonnet|off]","builtin":true},{"name":"agents","description":"(removed) Ask Claude to create/manage subagents, or edit .claude/agents/","argumentHint":"","builtin":true},{"name":"auto-mode-setup","description":"Teach auto mode about your environment, plus optional rule tweaks","argumentHint":"[--request-id \u003cuuid\u003e] (--wizard posture=… scope=… depth=… --propose | --expect-sha256 \u003c64-hex\u003e --apply-file \u003cpath\u003e)","builtin":true},{"name":"autocompact","description":"Configure the auto-compact window size","argumentHint":"[auto|\u003ctokens\u003e]","builtin":true},{"name":"clear","description":"Start a new session with empty context; previous session stays on disk (resumable with /resume)","argumentHint":"[name]","aliases":["reset","new"],"builtin":true},{"name":"color","description":"Set the prompt bar color for this session","argumentHint":"[red|blue|green|yellow|purple|orange|pink|cyan|default]","builtin":true},{"name":"compact","description":"Free up context by summarizing the conversation so far","argumentHint":"\u003coptional custom summarization instructions\u003e","builtin":true},{"name":"config","description":"Set a setting by key","argumentHint":"key=value","aliases":["settings"],"builtin":true},{"name":"output-style","description":"List output styles or switch to one","argumentHint":"[style]","builtin":true},{"name":"context","description":"Show current context usage","argumentHint":"","builtin":true},{"name":"effort","description":"Set effort level for model usage","argumentHint":"\u003clow|medium|high|xhigh|max|auto|ultracode [on|off]\u003e","builtin":true},{"name":"fast","description":"Toggle fast mode (Opus 5.5)","argumentHint":"[on|off]","builtin":true},{"name":"focus","description":"Toggle focus view: just your prompt, summary, and response","argumentHint":"[on|off]","builtin":true},{"name":"heapdump","description":"Dump the JS heap to the Desktop; on Linux with no Desktop folder, the home directory","argumentHint":"","builtin":true},{"name":"init","description":"Initialize a new CLAUDE.md file with codebase documentation","argumentHint":"","builtin":true},{"name":"mcp","description":"Manage MCP servers","argumentHint":"[reconnect|enable|disable [\u003cserver\u003e|all]]","builtin":true},{"name":"import","description":"Import config from another AI coding agent","argumentHint":"","builtin":true},{"name":"model","description":"Set the AI model for Claude Code","argumentHint":"\u003cmodel\u003e","builtin":true},{"name":"__remote-workflow","description":"Run the workflow script delivered in this session environment (server-launched sessions only)","argumentHint":"","builtin":true},{"name":"workflow-launch-exec","description":"Execute a server-launched workflow handoff (workflow_launch event sessions only)","argumentHint":"","builtin":true},{"name":"reload-plugins","description":"Activate pending plugin changes in the current session","argumentHint":"[--force]","builtin":true},{"name":"reload-skills","description":"Pick up skills added or changed on disk during this session","argumentHint":"","builtin":true},{"name":"rename","description":"Rename the current conversation","argumentHint":"[name]","aliases":["name"],"builtin":true},{"name":"ultrareview","description":"Start a cloud agent that finds and verifies bugs in your branch (~15-25 min, $5-$25 USD) · Runs in a cloud session. See https://code.claude.com/docs/en/claude-code-on-the-web","argumentHint":"","builtin":true},{"name":"security-review","description":"Complete a security review of the pending changes on the current branch","argumentHint":"","builtin":true},{"name":"usage-credits","description":"Configure usage credits or request them from your admin when you hit a limit","argumentHint":"","builtin":true},{"name":"extra-usage","description":"Renamed to /usage-credits","argumentHint":"","builtin":true},{"name":"usage","description":"Show session cost, plan usage, and what's contributing to your limits","argumentHint":"","aliases":["cost","stats"],"builtin":true},{"name":"insights","description":"Generate a report analyzing your Claude Code sessions","argumentHint":"","builtin":true},{"name":"recap","description":"Generate a one-line session recap now","argumentHint":"","builtin":true},{"name":"skill-doctor","description":"Show which loaded skills are unused and costing context","argumentHint":"","builtin":true},{"name":"goal","description":"Set a goal — keep working until the condition is met","argumentHint":"","builtin":true},{"name":"design-consent","description":"Grant Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"design-revoke","description":"Revoke Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"list-agents","description":"List subagents, teammates, and other Claude sessions you can message","argumentHint":"","aliases":["peers"],"builtin":true},{"name":"team-onboarding","description":"Help teammates ramp on Claude Code with a guide from your usage","argumentHint":"","builtin":true},{"name":"docs","description":"docs (editable docs people share and comment on; the default for any document, named as a doc or not: a document, report, proposal, resume, cover letter, letter, contract, policy, form, template, worksheet, essay, handbook, guide, how-to, cheat sheet, SOP or other writing to keep, share, collaborate on, send, submit, print or sign; a doc exports to Word, PDF, Markdown or Google Docs, so needing a file to send, attach, upload, submit or print is no reason to pick Word, and a file nobody asked for is a doc, not Word; a plan, comparison, summary or notes asked in chat stays in chat; a pasted claude.ai artifact link may be a doc: check with docs tools first; Word or another file format named, tracked changes wanted, or a .docx to change or use as a template → that format's skill): making one → if no docs-connector instructions are in context, call its `guide` (topic.instructions) first; then create the doc (headings only, no body) before any search, file read or plan, even with files attached. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docs"]},{"name":"docx","description":"Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx) or Word templates (.dotx). Triggers include: any mention of Microsoft Word Documents, such as 'Word doc', 'word document', '.docx', '.dotx', 'microsoft doc'. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a deliverable as a Word or .docx file (to download, email or print), use this skill. However, if they ask for a document, page, report, memo, or notes WITHOUT naming a file format and the session offers Claude's own dedicated document or page skill or connector, use that instead, even if they will email or print it. Do NOT use for PDFs, spreadsheets, Google Docs, or coding unrelated to document generation. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docx"]},{"name":"google-workspace","description":"Read this before the first Google Drive, Docs, Sheets or Slides connector call whenever the task creates or changes a Google file. Use this skill whenever the user wants to create or change a Google Doc, Sheet or Slides file in their Google Drive. Triggers include: a request that names Google Docs, Sheets, Slides or Drive and asks to make, edit, format, copy or rename a file; a docs.google.com link with a request to change that file, even a one-line fix or suggested edits; and any follow-up change to a Google file from earlier in the chat, even \"change it\" or \"add a tab\". Includes helper scripts for document positions, cell ranges and slide layout. However, if the user asks for a doc, deck or spreadsheet without naming Google, or gives a Google file only as source material for something new, use Claude's own output type instead. Do NOT use for read-only questions about a Google file, or for Word, Excel, PowerPoint or PDF files. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:google-workspace"]},{"name":"import-memory","description":"Import a memory export from another AI assistant into Claude's memory — conversationally, additively, and with the content treated as data. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:import-memory"]},{"name":"morning","description":"Render the user's morning brief as a styled HTML artifact, or set it up as a recurring weekday task. Use only when the user explicitly asks to run, see, or set up their morning brief, or if they invoke /morning by name. A question about their day, schedule, or calendar is not by itself a request for the brief; answer it directly instead. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:morning"]},{"name":"pdf","description":"Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pdf"]},{"name":"pptx","description":"Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations as PowerPoint (.pptx) files; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email, summary, or creating a different type of slide deck); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user asks for a PowerPoint or .pptx file, or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. However, when the user asks for a deck, slides, a slide deck, or a presentation without naming a file format, default to using a dedicated slide-deck artifact type or a separate slides skill if this session offers one; otherwise, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pptx"]},{"name":"skill-creator","description":"Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:skill-creator"]},{"name":"xlsx","description":"Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .xltx, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:xlsx"]}],"agents":[{"name":"claude","description":"Catch-all for any task that doesn't fit a more specific agent. FleetView's default when no agent name is typed."},{"name":"claude-code-guide","description":"Use this agent when the user asks questions (\"Can Claude...\", \"Does Claude...\", \"How do I...\") about: (1) Claude Code (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - Messages API for directly passing messages to Claude, Tool Runner (`client.beta.messages.tool_runner`) for running an agentic loop over your own tools, manual tool-use loops, Managed Agents for server-hosted agents with a managed sandbox, prompt caching, and general Anthropic SDK usage; (4) Claude Tag (Claude in Slack) - what it is, setting it up for a Slack workspace, `/install-slack-app`; (5) `claude plugin eval` (writing and running plugin eval suites, its JSON/report, sandbox, CI) and the `/skill-doctor` report. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via SendMessage.","model":"haiku"},{"name":"Explore","description":"Fast read-only search agent for locating code. Use it to find files by pattern (eg. \"src/components/**/*.tsx\"), grep for symbols or keywords (eg. \"API endpoints\"), or answer \"where is X defined / which files reference Y.\" Do NOT use it for code review, design-doc auditing, cross-file consistency checks, or open-ended analysis — it reads excerpts rather than whole files and will miss content past its read window. When calling, specify search breadth: \"quick\" for a single targeted lookup, \"medium\" for moderate exploration, or \"very thorough\" to search across multiple locations and naming conventions.","model":"inherit"},{"name":"general-purpose","description":"General-purpose agent for researching complex questions, searching for code, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you."},{"name":"Plan","description":"Software architect agent for designing implementation plans. Use this when you need to plan the implementation strategy for a task. Returns step-by-step plans, identifies critical files, and considers architectural trade-offs.","model":"inherit"},{"name":"statusline-setup","description":"Use this agent to configure the user's Claude Code status line setting.","model":"sonnet"}],"output_style":"default","available_output_styles":["default","Proactive","Concise","Explanatory","Learning"],"user_output_styles_dir":"/Users/flamingcow/.claude/output-styles","models":[{"value":"default","resolvedModel":"claude-opus-5-5","displayName":"Default (recommended)","description":"Opus 5.5 · Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"opus","resolvedModel":"claude-opus-5-5","displayName":"Opus 5.5","description":"For complex work and everyday tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"fable","resolvedModel":"claude-fable-5-1","displayName":"Fable 5.1","description":"For your toughest challenges","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"sonnet","resolvedModel":"claude-sonnet-5-5","displayName":"Sonnet 5.5","description":"Most efficient for simpler tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"haiku","resolvedModel":"claude-haiku-5-5","displayName":"Haiku 5.5","description":"Fastest for quick answers","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-haiku-4-5-20251001","resolvedModel":"claude-haiku-4-5-20251001","displayName":"Haiku 4.5","description":"Fastest for quick answers"},{"value":"claude-sonnet-5","resolvedModel":"claude-sonnet-5","displayName":"Sonnet 5","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-5","resolvedModel":"claude-opus-5","displayName":"Opus 5","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-fable-5","resolvedModel":"claude-fable-5","displayName":"Fable 5","description":"Most capable for your hardest and longest-running tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-8","resolvedModel":"claude-opus-4-8","displayName":"Opus 4.8","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-opus-4-7","resolvedModel":"claude-opus-4-7","displayName":"Opus 4.7","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-6","resolvedModel":"claude-opus-4-6","displayName":"Opus 4.6","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-sonnet-4-6","resolvedModel":"claude-sonnet-4-6","displayName":"Sonnet 4.6","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true}],"account":{"email":"[redacted]","organization":"[redacted]'s Organization","subscriptionType":"Claude Max","apiProvider":"firstParty"},"pid":11941,"claude_code_version":"2.1.296","current_permission_mode":"bypassPermissions","feedback_mode":{"kind":"post"},"analytics_disabled":false,"remote_control_auto_enable":false,"remote_control_auto_connect_default":false,"remote_control_available":true,"remote_control_auto_on_by_default":false,"ide_rc_auto_enable_gate":true,"fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","session_state":"idle","capabilities":["ui_surface_v1"]},"pending_permission_requests":[],"pending_user_dialog_requests":[]}}} -{"dir":"send","msg":{"message":{"content":"What was the codeword? Reply with just the codeword.","role":"user"},"parent_tool_use_id":null,"session_id":"ce489de4-76a6-429b-82ec-0db579958d34","type":"user"}} -{"dir":"recv","msg":{"type":"system","subtype":"init","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestResume1886800699/001","session_id":"ce489de4-76a6-429b-82ec-0db579958d34","tools":["Task","Artifact","ArtifactComments","ArtifactData","Bash","CronCreate","CronDelete","CronList","DesignSync","Edit","EnterWorktree","ExitWorktree","ListAgents","LSP","Monitor","NotebookEdit","PushNotification","Read","RemoteTrigger","ReportFindings","ScheduleWakeup","SendMessage","Skill","TaskStop","ToolSearch","WebFetch","WebSearch","Workflow","Write"],"mcp_servers":[{"name":"claude.ai Claude Docs","status":"pending","source":"claudeai"},{"name":"claude.ai Heliosian","status":"pending","source":"claudeai"},{"name":"claude.ai Fastmail","status":"pending","source":"claudeai"},{"name":"claude.ai Google Calendar","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Gmail","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Google Drive","status":"needs-auth","source":"claudeai"}],"model":"claude-sonnet-5-5","permissionMode":"bypassPermissions","slash_commands":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","advisor","agents","auto-mode-setup","autocompact","clear","color","compact","config","output-style","context","effort","fast","focus","heapdump","init","mcp","import","model","__remote-workflow","workflow-launch-exec","reload-plugins","reload-skills","rename","ultrareview","security-review","usage-credits","extra-usage","usage","insights","recap","skill-doctor","goal","design-consent","design-revoke","list-agents","team-onboarding","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"terminal_slash_commands":["doctor","color","focus","reload-plugins"],"apiKeySource":"none","claude_code_version":"2.1.296","output_style":"default","agents":["claude","claude-code-guide","Explore","general-purpose","Plan","statusline-setup"],"skills":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"plugins":[{"name":"clangd-lsp","path":"/Users/flamingcow/.claude/plugins/cache/claude-plugins-official/clangd-lsp/1.0.0","source":"clangd-lsp@claude-plugins-official","version":"1.0.0"},{"name":"cc-plugin-agents-md","path":"builtin","source":"cc-plugin-agents-md@builtin"},{"name":"cc-plugin-telemetry","path":"builtin","source":"cc-plugin-telemetry@builtin"},{"name":"cc-plugin-plugin-authoring","path":"builtin","source":"cc-plugin-plugin-authoring@builtin"}],"capabilities":["interrupt_receipt_v1","interrupt_cancel_queued_v1","interrupt_send_now_v1","msg_lifecycle_v1","request_marker_lists_v1","sdk_mcp_tools_list_changed","sdk_mcp_manifests","mcp_read_resource_v1","mcp_tool_ui_meta_v1","ui_surface_v1"],"analytics_disabled":false,"product_feedback_disabled":false,"uuid":"6f770d35-4d0e-4aad-baa8-d75475d1b444","memory_paths":{"auto":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestResume1886800699-001/memory/"},"scratchpad_path":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestResume1886800699-001/ce489de4-76a6-429b-82ec-0db579958d34/scratchpad","messaging_socket_path":"/tmp/cc-socks/11941.sock","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","per_turn_effort_active":true,"view_mode":"default"}} -{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"ce489de4-76a6-429b-82ec-0db579958d34","uuid":"d6d530b3-ca9a-4219-a694-f3152febfab3"}} -{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3P8eKS16ZrjbnpiXL6e","type":"message","role":"assistant","content":[{"type":"text","text":"AZURE-17"}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":7014,"cache_read_input_tokens":30629,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":7014},"output_tokens":8,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":{"cache_miss_reason":{"type":"messages_changed","cache_missed_input_tokens":13150}},"context_management":null},"parent_tool_use_id":null,"session_id":"ce489de4-76a6-429b-82ec-0db579958d34","uuid":"49de47c5-4709-4e17-886b-f549709d6c1d","timestamp":"2026-10-15T04:21:19.704Z","request_id":"req_011Cg3P8e6Y9ydBTQVRpfqqB"}} -{"dir":"recv","msg":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed","resetsAt":1792054200,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false,"unifiedWindows":{"five_hour":{"utilization":0.05,"resetsAt":1792054200},"seven_day":{"utilization":0.35,"resetsAt":1792270800}}},"uuid":"40a3a79c-b755-464e-922c-a38d3a066390","session_id":"ce489de4-76a6-429b-82ec-0db579958d34"}} -{"dir":"recv","msg":{"duration_api_ms":4124,"stop_reason":"end_turn","session_id":"ce489de4-76a6-429b-82ec-0db579958d34","total_cost_usd":0.0945289,"usage":{"input_tokens":2,"cache_creation_input_tokens":7014,"cache_read_input_tokens":30629,"output_tokens":8,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":7014,"ephemeral_5m_input_tokens":0},"inference_geo":"global","iterations":[{"input_tokens":2,"output_tokens":8,"cache_read_input_tokens":30629,"cache_creation_input_tokens":7014,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":7014},"type":"message"}],"speed":"standard","fallback_credit":null},"modelUsage":{"claude-haiku-5-5":{"inputTokens":1188,"outputTokens":21,"thinkingTokens":0,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.00012930000000000003,"contextWindow":1000000,"maxOutputTokens":128000},"claude-sonnet-5-5":{"inputTokens":4,"outputTokens":12,"thinkingTokens":0,"cacheReadInputTokens":52996,"cacheCreationInputTokens":22243,"webSearchRequests":0,"costUSD":0.0943996,"contextWindow":1000000,"maxOutputTokens":128000,"canonicalModel":"claude-sonnet-5-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"safety_stops":0,"is_error":false,"num_turns":1,"subtype":"success","api_error_status":null,"result":"AZURE-17","ttft_ms":1794,"type":"result","duration_ms":1805,"uuid":"d89fb236-cace-4d4e-877f-308fecc5d079","ttft_stream_ms":1793,"time_to_request_ms":32,"first_content_frame_ms":1793,"queued_turn_count":0,"result_index":0}} +{"dir":"send","msg":{"request":{"hooks":null,"subtype":"initialize"},"request_id":"req_a7865d9ba62d762f","type":"control_request"}} +{"dir":"recv","msg":{"type":"control_response","response":{"subtype":"success","request_id":"req_a7865d9ba62d762f","response":{"commands":[{"name":"deep-research","description":"Deep research harness — fan-out web searches, fetch sources, adversarially verify claims, synthesize a cited report. (dynamic workflow)","argumentHint":"","builtin":true},{"name":"design","description":"Make a new Design artifact from a brief","argumentHint":"[what to design]","builtin":true},{"name":"slides","description":"Make a new Slides deck artifact from a brief","argumentHint":"[what the deck is about]","builtin":true},{"name":"design-sync","description":"Push a React design system to claude.ai/design. This runs a converter that bundles the real component code (from Storybook or a bare package) and uploads it. Use when the user runs /design-sync or says \"sync my design system to Claude Design\".","argumentHint":"[\u003cproject hint, e.g. \"Acme DS\"\u003e]","builtin":true},{"name":"dataviz","description":"Use this skill whenever you are about to create ANY chart, graph, plot, dashboard, or data visualization, in ANY output medium — an HTML or React artifact, inline SVG, plotting code in any library (matplotlib, plotly, d3, Recharts, …), an image/PNG you will render and upload, or a chart shared into Slack. Read it BEFORE writing the first line of chart code, choosing chart colors, building a stat tile / meter / KPI row, or laying out a dashboard. When the destination is a first-party document connector (host-designated, never self-described) that renders live charts, hand it the rows (inline, or as an uploaded data file the chart cites) rather than a rendered PNG/SVG — a picture of a chart loses hover, data inspection and per-value comments. Produces visualizations that read as one system — elegant, accessible, consistent in light and dark — using a brand-neutral placeholder palette you swap for your own. Teaches a design-system-agnostic method: a form heuristic, a color formula with a runnable validator, mark specs, and interaction rules. A validated default palette is documented in `references/palette.md` — swap that file's values for your brand's. Triggers on: \"chart\", \"graph\", \"plot\", \"data viz\", \"visualization\", \"dashboard\", \"analytics\", \"visualize data\", \"categorical colors\", \"sequential / diverging palette\", \"stat tile\", \"sparkline\", \"heatmap\", \"legend\", \"axis\", \"tooltip\", \"chart colors\", \"color by series\".","argumentHint":"","builtin":true},{"name":"artifact-diagramming","description":"Diagramming know-how for Artifacts - when a picture earns its place, how to draw one that shows the real mechanism, and the inline-SVG mechanics that keep it legible in both themes.","argumentHint":"","builtin":true},{"name":"artifact-capabilities","description":"Runtime capabilities a published Artifact page can be granted — behavior static HTML cannot provide on its own, such as the page reading live or connected data, remembering what people do on it (a poll, a sign-up sheet, a checklist, a document edited in place — it saves new versions of itself), keeping state shared across viewers, knowing who is viewing, asking Claude a question of its own, storing files people add, handing the viewer a file to save, or using the viewer's camera, microphone, location, screen or device motion. Serves this user's live capability roster and the typed call definitions. Load it whenever any such runtime behavior would make an artifact more useful, before writing the page.","argumentHint":"","builtin":true},{"name":"update-config","description":"Use this skill to configure the Claude Code harness via settings.json. Automated behaviors (\"from now on when X\", \"each time X\", \"whenever X\", \"before/after X\") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions (\"allow X\", \"add permission\", \"move permission to\"), env vars (\"set X=Y\"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: \"allow npm commands\", \"add bq permission to global settings\", \"move permission to user settings\", \"set DEBUG=true\", \"when claude stops show X\". For simple settings like theme/model, suggest the /config command.","argumentHint":"","builtin":true},{"name":"verify","description":"Verify that a code change actually does what it's supposed to by exercising it end-to-end and observing behavior — drive the affected flow, not just tests or typecheck. Run before committing nontrivial changes; bootstraps this repo's project verify skill if none exists yet. Don't invoke it on a diff that only touches tests, docs, or other code with no runtime surface to drive (a change to product source always has one) — there's nothing to observe.","argumentHint":"","builtin":true},{"name":"debug","description":"Enable debug logging for this session and help diagnose issues","argumentHint":"[issue description]","builtin":true},{"name":"code-review","description":"Review the current diff, or a PR number/branch/path target, for correctness bugs (plus reuse/simplification/efficiency cleanups where the model's review recipe covers them) at the given effort level (low|medium|high|xhigh|max: from few high-confidence findings up to many, some of them uncertain; ultra: deep multi-agent review in the cloud); with no level given, it reuses the level you typed last. Pass --comment to post findings as inline PR comments, or --fix to apply the findings to the working tree after the review. Pass --max-findings \u003cn\u003e to report up to n findings, or --max-findings all for every finding. The choice stays until you pass --max-findings default. For ultra on a GitHub.com PR target, --post asks to post the finished review’s findings to the PR as a single comment from the user’s GitHub account (not a review; the launch dialog still confirms in interactive sessions, while non-interactive mode posts on the flag alone) and --no-post hides that option.","argumentHint":"[low|medium|high|xhigh|max|ultra] [--fix] [--comment] [\u003cpr#\u003e|\u003cbranch\u003e|\u003cpath\u003e] [--max-findings \u003cn\u003e|all]","aliases":["review"],"builtin":true},{"name":"simplify","description":"Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.","argumentHint":"[\u003ctarget\u003e]","builtin":true},{"name":"batch","description":"Research and plan a large-scale change, then execute it in parallel across 5–30 isolated worktree agents that each open a PR.","argumentHint":"\u003cinstruction\u003e","builtin":true},{"name":"fewer-permission-prompts","description":"Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.","argumentHint":"","builtin":true},{"name":"doctor","description":"Health-check the user's Claude Code setup and fix issues: diagnose installation health — what the `claude doctor` terminal diagnostics cover — from local data (duplicate or leftover installs, PATH, unparseable settings files, broken or colliding agent definitions, skills whose frontmatter fails to parse); find unused skills, MCP servers, and plugins versus their context cost and disable dead weight; deduplicate local CLAUDE.md files against checked-in ones; trim checked-in CLAUDE.md files by cutting content a session could derive from the codebase (directory layouts, tech-stack lists, architecture overviews) while keeping gotchas, rationale, and non-standard conventions; migrate always-loaded CLAUDE.md guidance into lazy skills and nested CLAUDE.md files; flag slow hooks and context-heavy extensions; check the installed version is current; make auto mode the default permission mode; and pre-approve frequently denied read-only commands. Use when the user asks for a doctor run, checkup, audit, tune-up, or cleanup of their Claude Code setup or configuration.","argumentHint":"[prompt-audit [\u003cpath\u003e]]","aliases":["checkup"],"builtin":true},{"name":"loop","description":"Run a prompt or slash command on a recurring interval (e.g. /loop 5m /foo). Omit the interval to let the model self-pace.","argumentHint":"[interval] [prompt]","aliases":["proactive"],"builtin":true},{"name":"schedule","description":"Create, update, list, or run scheduled cloud agents (routines) that execute on a cron schedule.","argumentHint":"","aliases":["routines"],"builtin":true},{"name":"claude-api","description":"Reference for the Claude API / Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude/Anthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing/model choice/limits/caching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent/MCP/tool-definition/multi-agent/RAG/LLM-judge/computer-use; generate/summarize/extract/classify/rewrite/converse over NL; debugging refusals/cutoffs/streaming/tool-calls/tokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).","argumentHint":"","builtin":true},{"name":"workflow-authoring","description":"Reference for writing a Workflow tool script (script API and gotchas, resume, quality patterns, worked examples). Load before authoring a script for a workflow the user already opted into; it does not itself authorize running one.","argumentHint":"","builtin":true},{"name":"run","description":"Launch and drive this project's app to see a change working. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real app (not just tests). First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns per project type (CLI, server, TUI, Electron, browser-driven, library).","argumentHint":"","builtin":true},{"name":"run-skill-generator","description":"Author or improve the run-\u003cunit\u003e skill - a per-project skill that tells agents how to build, launch, and drive this project's app. Use when the user asks to set up the project, get it running, write run instructions, or verify build/run steps work from a clean environment.","argumentHint":"","builtin":true},{"name":"plugin-authoring","description":"Make a mod: a change to Claude's own interface or behaviour, such as a live pane or panel, a band above the prompt, a status line, a toast, a slash command, or a hook on tool calls or prompts. Use to make, change or debug a mod or its hooks module.","argumentHint":"","builtin":true},{"name":"advisor","description":"Let Claude consult a stronger model at key moments","argumentHint":"[fable|opus|sonnet|off]","builtin":true},{"name":"agents","description":"(removed) Ask Claude to create/manage subagents, or edit .claude/agents/","argumentHint":"","builtin":true},{"name":"auto-mode-setup","description":"Teach auto mode about your environment, plus optional rule tweaks","argumentHint":"[--request-id \u003cuuid\u003e] (--wizard posture=… scope=… depth=… --propose | --expect-sha256 \u003c64-hex\u003e --apply-file \u003cpath\u003e)","builtin":true},{"name":"autocompact","description":"Configure the auto-compact window size","argumentHint":"[auto|\u003ctokens\u003e]","builtin":true},{"name":"clear","description":"Start a new session with empty context; previous session stays on disk (resumable with /resume)","argumentHint":"[name]","aliases":["reset","new"],"builtin":true},{"name":"color","description":"Set the prompt bar color for this session","argumentHint":"[red|blue|green|yellow|purple|orange|pink|cyan|default]","builtin":true},{"name":"compact","description":"Free up context by summarizing the conversation so far","argumentHint":"\u003coptional custom summarization instructions\u003e","builtin":true},{"name":"config","description":"Set a setting by key","argumentHint":"key=value","aliases":["settings"],"builtin":true},{"name":"output-style","description":"List output styles or switch to one","argumentHint":"[style]","builtin":true},{"name":"context","description":"Show current context usage","argumentHint":"","builtin":true},{"name":"effort","description":"Set effort level for model usage","argumentHint":"\u003clow|medium|high|xhigh|max|auto|ultracode [on|off]\u003e","builtin":true},{"name":"fast","description":"Toggle fast mode (Opus 5.5)","argumentHint":"[on|off]","builtin":true},{"name":"focus","description":"Toggle focus view: just your prompt, summary, and response","argumentHint":"[on|off]","builtin":true},{"name":"heapdump","description":"Dump the JS heap to the Desktop; on Linux with no Desktop folder, the home directory","argumentHint":"","builtin":true},{"name":"init","description":"Initialize a new CLAUDE.md file with codebase documentation","argumentHint":"","builtin":true},{"name":"mcp","description":"Manage MCP servers","argumentHint":"[reconnect|enable|disable [\u003cserver\u003e|all]]","builtin":true},{"name":"import","description":"Import config from another AI coding agent","argumentHint":"","builtin":true},{"name":"model","description":"Set the AI model for Claude Code","argumentHint":"\u003cmodel\u003e","builtin":true},{"name":"__remote-workflow","description":"Run the workflow script delivered in this session environment (server-launched sessions only)","argumentHint":"","builtin":true},{"name":"workflow-launch-exec","description":"Execute a server-launched workflow handoff (workflow_launch event sessions only)","argumentHint":"","builtin":true},{"name":"reload-plugins","description":"Activate pending plugin changes in the current session","argumentHint":"[--force]","builtin":true},{"name":"reload-skills","description":"Pick up skills added or changed on disk during this session","argumentHint":"","builtin":true},{"name":"rename","description":"Rename the current conversation","argumentHint":"[name]","aliases":["name"],"builtin":true},{"name":"ultrareview","description":"Start a cloud agent that finds and verifies bugs in your branch (~15-25 min, $5-$25 USD) · Runs in a cloud session. See https://code.claude.com/docs/en/claude-code-on-the-web","argumentHint":"","builtin":true},{"name":"security-review","description":"Complete a security review of the pending changes on the current branch","argumentHint":"","builtin":true},{"name":"usage-credits","description":"Configure usage credits or request them from your admin when you hit a limit","argumentHint":"","builtin":true},{"name":"extra-usage","description":"Renamed to /usage-credits","argumentHint":"","builtin":true},{"name":"usage","description":"Show session cost, plan usage, and what's contributing to your limits","argumentHint":"","aliases":["cost","stats"],"builtin":true},{"name":"insights","description":"Generate a report analyzing your Claude Code sessions","argumentHint":"","builtin":true},{"name":"recap","description":"Generate a one-line session recap now","argumentHint":"","builtin":true},{"name":"skill-doctor","description":"Show which loaded skills are unused and costing context","argumentHint":"","builtin":true},{"name":"goal","description":"Set a goal — keep working until the condition is met","argumentHint":"","builtin":true},{"name":"design-consent","description":"Grant Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"design-revoke","description":"Revoke Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"list-agents","description":"List subagents, teammates, and other Claude sessions you can message","argumentHint":"","aliases":["peers"],"builtin":true},{"name":"team-onboarding","description":"Help teammates ramp on Claude Code with a guide from your usage","argumentHint":"","builtin":true},{"name":"docs","description":"docs (editable docs people share and comment on; the default for any document, named as a doc or not: a document, report, proposal, resume, cover letter, letter, contract, policy, form, template, worksheet, essay, handbook, guide, how-to, cheat sheet, SOP or other writing to keep, share, collaborate on, send, submit, print or sign; a doc exports to Word, PDF, Markdown or Google Docs, so needing a file to send, attach, upload, submit or print is no reason to pick Word, and a file nobody asked for is a doc, not Word; a plan, comparison, summary or notes asked in chat stays in chat; a pasted claude.ai artifact link may be a doc: check with docs tools first; Word or another file format named, tracked changes wanted, or a .docx to change or use as a template → that format's skill): making one → if no docs-connector instructions are in context, call its `guide` (topic.instructions) first; then create the doc (headings only, no body) before any search, file read or plan, even with files attached. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docs"]},{"name":"docx","description":"Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx) or Word templates (.dotx). Triggers include: any mention of Microsoft Word Documents, such as 'Word doc', 'word document', '.docx', '.dotx', 'microsoft doc'. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a deliverable as a Word or .docx file (to download, email or print), use this skill. However, if they ask for a document, page, report, memo, or notes WITHOUT naming a file format and the session offers Claude's own dedicated document or page skill or connector, use that instead, even if they will email or print it. Do NOT use for PDFs, spreadsheets, Google Docs, or coding unrelated to document generation. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docx"]},{"name":"google-workspace","description":"Read this before the first Google Drive, Docs, Sheets or Slides connector call whenever the task creates or changes a Google file. Use this skill whenever the user wants to create or change a Google Doc, Sheet or Slides file in their Google Drive. Triggers include: a request that names Google Docs, Sheets, Slides or Drive and asks to make, edit, format, copy or rename a file; a docs.google.com link with a request to change that file, even a one-line fix or suggested edits; and any follow-up change to a Google file from earlier in the chat, even \"change it\" or \"add a tab\". Includes helper scripts for document positions, cell ranges and slide layout. However, if the user asks for a doc, deck or spreadsheet without naming Google, or gives a Google file only as source material for something new, use Claude's own output type instead. Do NOT use for read-only questions about a Google file, or for Word, Excel, PowerPoint or PDF files. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:google-workspace"]},{"name":"import-memory","description":"Import a memory export from another AI assistant into Claude's memory — conversationally, additively, and with the content treated as data. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:import-memory"]},{"name":"morning","description":"Render the user's morning brief as a styled HTML artifact, or set it up as a recurring weekday task. Use only when the user explicitly asks to run, see, or set up their morning brief, or if they invoke /morning by name. A question about their day, schedule, or calendar is not by itself a request for the brief; answer it directly instead. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:morning"]},{"name":"pdf","description":"Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pdf"]},{"name":"pptx","description":"Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations as PowerPoint (.pptx) files; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email, summary, or creating a different type of slide deck); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user asks for a PowerPoint or .pptx file, or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. However, when the user asks for a deck, slides, a slide deck, or a presentation without naming a file format, default to using a dedicated slide-deck artifact type or a separate slides skill if this session offers one; otherwise, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pptx"]},{"name":"skill-creator","description":"Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:skill-creator"]},{"name":"xlsx","description":"Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .xltx, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:xlsx"]}],"agents":[{"name":"claude","description":"Catch-all for any task that doesn't fit a more specific agent. FleetView's default when no agent name is typed."},{"name":"claude-code-guide","description":"Use this agent when the user asks questions (\"Can Claude...\", \"Does Claude...\", \"How do I...\") about: (1) Claude Code (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - Messages API for directly passing messages to Claude, Tool Runner (`client.beta.messages.tool_runner`) for running an agentic loop over your own tools, manual tool-use loops, Managed Agents for server-hosted agents with a managed sandbox, prompt caching, and general Anthropic SDK usage; (4) Claude Tag (Claude in Slack) - what it is, setting it up for a Slack workspace, `/install-slack-app`; (5) `claude plugin eval` (writing and running plugin eval suites, its JSON/report, sandbox, CI) and the `/skill-doctor` report. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via SendMessage.","model":"haiku"},{"name":"Explore","description":"Fast read-only search agent for locating code. Use it to find files by pattern (eg. \"src/components/**/*.tsx\"), grep for symbols or keywords (eg. \"API endpoints\"), or answer \"where is X defined / which files reference Y.\" Do NOT use it for code review, design-doc auditing, cross-file consistency checks, or open-ended analysis — it reads excerpts rather than whole files and will miss content past its read window. When calling, specify search breadth: \"quick\" for a single targeted lookup, \"medium\" for moderate exploration, or \"very thorough\" to search across multiple locations and naming conventions.","model":"inherit"},{"name":"general-purpose","description":"General-purpose agent for researching complex questions, searching for code, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you."},{"name":"Plan","description":"Software architect agent for designing implementation plans. Use this when you need to plan the implementation strategy for a task. Returns step-by-step plans, identifies critical files, and considers architectural trade-offs.","model":"inherit"},{"name":"statusline-setup","description":"Use this agent to configure the user's Claude Code status line setting.","model":"sonnet"}],"output_style":"default","available_output_styles":["default","Proactive","Concise","Explanatory","Learning"],"user_output_styles_dir":"/Users/flamingcow/.claude/output-styles","models":[{"value":"default","resolvedModel":"claude-opus-5-5","displayName":"Default (recommended)","description":"Opus 5.5 · Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"opus","resolvedModel":"claude-opus-5-5","displayName":"Opus 5.5","description":"For complex work and everyday tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"fable","resolvedModel":"claude-fable-5-1","displayName":"Fable 5.1","description":"For your toughest challenges","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"sonnet","resolvedModel":"claude-sonnet-5-5","displayName":"Sonnet 5.5","description":"Most efficient for simpler tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"haiku","resolvedModel":"claude-haiku-5-5","displayName":"Haiku 5.5","description":"Fastest for quick answers","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-haiku-4-5-20251001","resolvedModel":"claude-haiku-4-5-20251001","displayName":"Haiku 4.5","description":"Fastest for quick answers"},{"value":"claude-sonnet-5","resolvedModel":"claude-sonnet-5","displayName":"Sonnet 5","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-5","resolvedModel":"claude-opus-5","displayName":"Opus 5","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-fable-5","resolvedModel":"claude-fable-5","displayName":"Fable 5","description":"Most capable for your hardest and longest-running tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-8","resolvedModel":"claude-opus-4-8","displayName":"Opus 4.8","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-opus-4-7","resolvedModel":"claude-opus-4-7","displayName":"Opus 4.7","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-6","resolvedModel":"claude-opus-4-6","displayName":"Opus 4.6","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-sonnet-4-6","resolvedModel":"claude-sonnet-4-6","displayName":"Sonnet 4.6","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true}],"account":{"email":"[redacted]","organization":"[redacted]'s Organization","subscriptionType":"Claude Max","apiProvider":"firstParty"},"pid":13530,"claude_code_version":"2.1.296","current_permission_mode":"bypassPermissions","feedback_mode":{"kind":"post"},"analytics_disabled":false,"remote_control_auto_enable":false,"remote_control_auto_connect_default":false,"remote_control_available":true,"remote_control_auto_on_by_default":false,"ide_rc_auto_enable_gate":true,"fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","session_state":"idle","capabilities":["ui_surface_v1"]},"pending_permission_requests":[],"pending_user_dialog_requests":[]}}} +{"dir":"send","msg":{"message":{"content":"What was the codeword? Reply with just the codeword.","role":"user"},"parent_tool_use_id":null,"session_id":"3c0da634-cb14-4a4d-ba11-57538393d6a9","type":"user"}} +{"dir":"recv","msg":{"type":"system","subtype":"init","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestResume631419293/001","session_id":"3c0da634-cb14-4a4d-ba11-57538393d6a9","tools":["Task","Artifact","ArtifactComments","ArtifactData","Bash","CronCreate","CronDelete","CronList","DesignSync","Edit","EnterWorktree","ExitWorktree","ListAgents","LSP","Monitor","NotebookEdit","PushNotification","Read","RemoteTrigger","ReportFindings","ScheduleWakeup","SendMessage","Skill","TaskStop","ToolSearch","WebFetch","WebSearch","Workflow","Write"],"mcp_servers":[{"name":"claude.ai Claude Docs","status":"pending","source":"claudeai"},{"name":"claude.ai Heliosian","status":"pending","source":"claudeai"},{"name":"claude.ai Fastmail","status":"pending","source":"claudeai"},{"name":"claude.ai Google Calendar","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Gmail","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Google Drive","status":"needs-auth","source":"claudeai"}],"model":"claude-sonnet-5-5","permissionMode":"bypassPermissions","slash_commands":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","advisor","agents","auto-mode-setup","autocompact","clear","color","compact","config","output-style","context","effort","fast","focus","heapdump","init","mcp","import","model","__remote-workflow","workflow-launch-exec","reload-plugins","reload-skills","rename","ultrareview","security-review","usage-credits","extra-usage","usage","insights","recap","skill-doctor","goal","design-consent","design-revoke","list-agents","team-onboarding","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"terminal_slash_commands":["doctor","color","focus","reload-plugins"],"apiKeySource":"none","claude_code_version":"2.1.296","output_style":"default","agents":["claude","claude-code-guide","Explore","general-purpose","Plan","statusline-setup"],"skills":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"plugins":[{"name":"clangd-lsp","path":"/Users/flamingcow/.claude/plugins/cache/claude-plugins-official/clangd-lsp/1.0.0","source":"clangd-lsp@claude-plugins-official","version":"1.0.0"},{"name":"cc-plugin-agents-md","path":"builtin","source":"cc-plugin-agents-md@builtin"},{"name":"cc-plugin-telemetry","path":"builtin","source":"cc-plugin-telemetry@builtin"},{"name":"cc-plugin-plugin-authoring","path":"builtin","source":"cc-plugin-plugin-authoring@builtin"}],"capabilities":["interrupt_receipt_v1","interrupt_cancel_queued_v1","interrupt_send_now_v1","msg_lifecycle_v1","request_marker_lists_v1","sdk_mcp_tools_list_changed","sdk_mcp_manifests","mcp_read_resource_v1","mcp_tool_ui_meta_v1","ui_surface_v1"],"analytics_disabled":false,"product_feedback_disabled":false,"uuid":"3a7452ac-e549-4dd5-8274-6c8323153064","memory_paths":{"auto":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestResume631419293-001/memory/"},"scratchpad_path":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestResume631419293-001/3c0da634-cb14-4a4d-ba11-57538393d6a9/scratchpad","messaging_socket_path":"/tmp/cc-socks/13530.sock","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","per_turn_effort_active":true,"view_mode":"default"}} +{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"3c0da634-cb14-4a4d-ba11-57538393d6a9","uuid":"3dc8ac03-4815-4ef1-a5e6-3b267380ea68"}} +{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3PEA2zvjrsK2T5DxhLe","type":"message","role":"assistant","content":[{"type":"text","text":"AZURE-17"}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":7015,"cache_read_input_tokens":30629,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":7015},"output_tokens":8,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":{"cache_miss_reason":{"type":"messages_changed","cache_missed_input_tokens":13150}},"context_management":null},"parent_tool_use_id":null,"session_id":"3c0da634-cb14-4a4d-ba11-57538393d6a9","uuid":"7b33026d-3085-4b3e-8cbd-dbd8d9375238","timestamp":"2026-10-15T04:22:34.045Z","request_id":"req_011Cg3PE9egUrHLLoWpynRjA"}} +{"dir":"recv","msg":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed","resetsAt":1792054200,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false,"unifiedWindows":{"five_hour":{"utilization":0.05,"resetsAt":1792054200},"seven_day":{"utilization":0.35,"resetsAt":1792270800}}},"uuid":"ad9c616f-fc04-46c8-b8bc-040446d0668f","session_id":"3c0da634-cb14-4a4d-ba11-57538393d6a9"}} +{"dir":"recv","msg":{"duration_api_ms":3519,"stop_reason":"end_turn","session_id":"3c0da634-cb14-4a4d-ba11-57538393d6a9","total_cost_usd":0.09453690000000001,"usage":{"input_tokens":2,"cache_creation_input_tokens":7015,"cache_read_input_tokens":30629,"output_tokens":8,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":7015,"ephemeral_5m_input_tokens":0},"inference_geo":"global","iterations":[{"input_tokens":2,"output_tokens":8,"cache_read_input_tokens":30629,"cache_creation_input_tokens":7015,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":7015},"type":"message"}],"speed":"standard","fallback_credit":null},"modelUsage":{"claude-haiku-5-5":{"inputTokens":1188,"outputTokens":21,"thinkingTokens":0,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.00012930000000000003,"contextWindow":1000000,"maxOutputTokens":128000},"claude-sonnet-5-5":{"inputTokens":4,"outputTokens":12,"thinkingTokens":0,"cacheReadInputTokens":52996,"cacheCreationInputTokens":22245,"webSearchRequests":0,"costUSD":0.09440760000000001,"contextWindow":1000000,"maxOutputTokens":128000,"canonicalModel":"claude-sonnet-5-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"safety_stops":0,"is_error":false,"num_turns":1,"subtype":"success","api_error_status":null,"result":"AZURE-17","ttft_ms":1385,"type":"result","duration_ms":1406,"uuid":"26501256-8cad-4fea-a06a-740ba3bc4625","ttft_stream_ms":1379,"time_to_request_ms":34,"first_content_frame_ms":1380,"queued_turn_count":0,"result_index":0}} diff --git a/internal/claude/testdata/transcripts/TestStopHookBlocks.jsonl b/internal/claude/testdata/transcripts/TestStopHookBlocks.jsonl index b2276f3..f14dbe7 100644 --- a/internal/claude/testdata/transcripts/TestStopHookBlocks.jsonl +++ b/internal/claude/testdata/transcripts/TestStopHookBlocks.jsonl @@ -1,16 +1,16 @@ -{"dir":"send","msg":{"request":{"hooks":{"Stop":[{"hookCallbackIds":["hook_0"],"matcher":""}]},"subtype":"initialize"},"request_id":"req_dcb119e96c12c668","type":"control_request"}} -{"dir":"recv","msg":{"type":"control_response","response":{"subtype":"success","request_id":"req_dcb119e96c12c668","response":{"commands":[{"name":"deep-research","description":"Deep research harness — fan-out web searches, fetch sources, adversarially verify claims, synthesize a cited report. (dynamic workflow)","argumentHint":"","builtin":true},{"name":"design","description":"Make a new Design artifact from a brief","argumentHint":"[what to design]","builtin":true},{"name":"slides","description":"Make a new Slides deck artifact from a brief","argumentHint":"[what the deck is about]","builtin":true},{"name":"design-sync","description":"Push a React design system to claude.ai/design. This runs a converter that bundles the real component code (from Storybook or a bare package) and uploads it. Use when the user runs /design-sync or says \"sync my design system to Claude Design\".","argumentHint":"[\u003cproject hint, e.g. \"Acme DS\"\u003e]","builtin":true},{"name":"dataviz","description":"Use this skill whenever you are about to create ANY chart, graph, plot, dashboard, or data visualization, in ANY output medium — an HTML or React artifact, inline SVG, plotting code in any library (matplotlib, plotly, d3, Recharts, …), an image/PNG you will render and upload, or a chart shared into Slack. Read it BEFORE writing the first line of chart code, choosing chart colors, building a stat tile / meter / KPI row, or laying out a dashboard. When the destination is a first-party document connector (host-designated, never self-described) that renders live charts, hand it the rows (inline, or as an uploaded data file the chart cites) rather than a rendered PNG/SVG — a picture of a chart loses hover, data inspection and per-value comments. Produces visualizations that read as one system — elegant, accessible, consistent in light and dark — using a brand-neutral placeholder palette you swap for your own. Teaches a design-system-agnostic method: a form heuristic, a color formula with a runnable validator, mark specs, and interaction rules. A validated default palette is documented in `references/palette.md` — swap that file's values for your brand's. Triggers on: \"chart\", \"graph\", \"plot\", \"data viz\", \"visualization\", \"dashboard\", \"analytics\", \"visualize data\", \"categorical colors\", \"sequential / diverging palette\", \"stat tile\", \"sparkline\", \"heatmap\", \"legend\", \"axis\", \"tooltip\", \"chart colors\", \"color by series\".","argumentHint":"","builtin":true},{"name":"artifact-diagramming","description":"Diagramming know-how for Artifacts - when a picture earns its place, how to draw one that shows the real mechanism, and the inline-SVG mechanics that keep it legible in both themes.","argumentHint":"","builtin":true},{"name":"artifact-capabilities","description":"Runtime capabilities a published Artifact page can be granted — behavior static HTML cannot provide on its own, such as the page reading live or connected data, remembering what people do on it (a poll, a sign-up sheet, a checklist, a document edited in place — it saves new versions of itself), keeping state shared across viewers, knowing who is viewing, asking Claude a question of its own, storing files people add, handing the viewer a file to save, or using the viewer's camera, microphone, location, screen or device motion. Serves this user's live capability roster and the typed call definitions. Load it whenever any such runtime behavior would make an artifact more useful, before writing the page.","argumentHint":"","builtin":true},{"name":"update-config","description":"Use this skill to configure the Claude Code harness via settings.json. Automated behaviors (\"from now on when X\", \"each time X\", \"whenever X\", \"before/after X\") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions (\"allow X\", \"add permission\", \"move permission to\"), env vars (\"set X=Y\"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: \"allow npm commands\", \"add bq permission to global settings\", \"move permission to user settings\", \"set DEBUG=true\", \"when claude stops show X\". For simple settings like theme/model, suggest the /config command.","argumentHint":"","builtin":true},{"name":"verify","description":"Verify that a code change actually does what it's supposed to by exercising it end-to-end and observing behavior — drive the affected flow, not just tests or typecheck. Run before committing nontrivial changes; bootstraps this repo's project verify skill if none exists yet. Don't invoke it on a diff that only touches tests, docs, or other code with no runtime surface to drive (a change to product source always has one) — there's nothing to observe.","argumentHint":"","builtin":true},{"name":"debug","description":"Enable debug logging for this session and help diagnose issues","argumentHint":"[issue description]","builtin":true},{"name":"code-review","description":"Review the current diff, or a PR number/branch/path target, for correctness bugs (plus reuse/simplification/efficiency cleanups where the model's review recipe covers them) at the given effort level (low|medium|high|xhigh|max: from few high-confidence findings up to many, some of them uncertain; ultra: deep multi-agent review in the cloud); with no level given, it reuses the level you typed last. Pass --comment to post findings as inline PR comments, or --fix to apply the findings to the working tree after the review. Pass --max-findings \u003cn\u003e to report up to n findings, or --max-findings all for every finding. The choice stays until you pass --max-findings default. For ultra on a GitHub.com PR target, --post asks to post the finished review’s findings to the PR as a single comment from the user’s GitHub account (not a review; the launch dialog still confirms in interactive sessions, while non-interactive mode posts on the flag alone) and --no-post hides that option.","argumentHint":"[low|medium|high|xhigh|max|ultra] [--fix] [--comment] [\u003cpr#\u003e|\u003cbranch\u003e|\u003cpath\u003e] [--max-findings \u003cn\u003e|all]","aliases":["review"],"builtin":true},{"name":"simplify","description":"Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.","argumentHint":"[\u003ctarget\u003e]","builtin":true},{"name":"batch","description":"Research and plan a large-scale change, then execute it in parallel across 5–30 isolated worktree agents that each open a PR.","argumentHint":"\u003cinstruction\u003e","builtin":true},{"name":"fewer-permission-prompts","description":"Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.","argumentHint":"","builtin":true},{"name":"doctor","description":"Health-check the user's Claude Code setup and fix issues: diagnose installation health — what the `claude doctor` terminal diagnostics cover — from local data (duplicate or leftover installs, PATH, unparseable settings files, broken or colliding agent definitions, skills whose frontmatter fails to parse); find unused skills, MCP servers, and plugins versus their context cost and disable dead weight; deduplicate local CLAUDE.md files against checked-in ones; trim checked-in CLAUDE.md files by cutting content a session could derive from the codebase (directory layouts, tech-stack lists, architecture overviews) while keeping gotchas, rationale, and non-standard conventions; migrate always-loaded CLAUDE.md guidance into lazy skills and nested CLAUDE.md files; flag slow hooks and context-heavy extensions; check the installed version is current; make auto mode the default permission mode; and pre-approve frequently denied read-only commands. Use when the user asks for a doctor run, checkup, audit, tune-up, or cleanup of their Claude Code setup or configuration.","argumentHint":"[prompt-audit [\u003cpath\u003e]]","aliases":["checkup"],"builtin":true},{"name":"loop","description":"Run a prompt or slash command on a recurring interval (e.g. /loop 5m /foo). Omit the interval to let the model self-pace.","argumentHint":"[interval] [prompt]","aliases":["proactive"],"builtin":true},{"name":"schedule","description":"Create, update, list, or run scheduled cloud agents (routines) that execute on a cron schedule.","argumentHint":"","aliases":["routines"],"builtin":true},{"name":"claude-api","description":"Reference for the Claude API / Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude/Anthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing/model choice/limits/caching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent/MCP/tool-definition/multi-agent/RAG/LLM-judge/computer-use; generate/summarize/extract/classify/rewrite/converse over NL; debugging refusals/cutoffs/streaming/tool-calls/tokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).","argumentHint":"","builtin":true},{"name":"workflow-authoring","description":"Reference for writing a Workflow tool script (script API and gotchas, resume, quality patterns, worked examples). Load before authoring a script for a workflow the user already opted into; it does not itself authorize running one.","argumentHint":"","builtin":true},{"name":"run","description":"Launch and drive this project's app to see a change working. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real app (not just tests). First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns per project type (CLI, server, TUI, Electron, browser-driven, library).","argumentHint":"","builtin":true},{"name":"run-skill-generator","description":"Author or improve the run-\u003cunit\u003e skill - a per-project skill that tells agents how to build, launch, and drive this project's app. Use when the user asks to set up the project, get it running, write run instructions, or verify build/run steps work from a clean environment.","argumentHint":"","builtin":true},{"name":"plugin-authoring","description":"Make a mod: a change to Claude's own interface or behaviour, such as a live pane or panel, a band above the prompt, a status line, a toast, a slash command, or a hook on tool calls or prompts. Use to make, change or debug a mod or its hooks module.","argumentHint":"","builtin":true},{"name":"advisor","description":"Let Claude consult a stronger model at key moments","argumentHint":"[fable|opus|sonnet|off]","builtin":true},{"name":"agents","description":"(removed) Ask Claude to create/manage subagents, or edit .claude/agents/","argumentHint":"","builtin":true},{"name":"auto-mode-setup","description":"Teach auto mode about your environment, plus optional rule tweaks","argumentHint":"[--request-id \u003cuuid\u003e] (--wizard posture=… scope=… depth=… --propose | --expect-sha256 \u003c64-hex\u003e --apply-file \u003cpath\u003e)","builtin":true},{"name":"autocompact","description":"Configure the auto-compact window size","argumentHint":"[auto|\u003ctokens\u003e]","builtin":true},{"name":"clear","description":"Start a new session with empty context; previous session stays on disk (resumable with /resume)","argumentHint":"[name]","aliases":["reset","new"],"builtin":true},{"name":"color","description":"Set the prompt bar color for this session","argumentHint":"[red|blue|green|yellow|purple|orange|pink|cyan|default]","builtin":true},{"name":"compact","description":"Free up context by summarizing the conversation so far","argumentHint":"\u003coptional custom summarization instructions\u003e","builtin":true},{"name":"config","description":"Set a setting by key","argumentHint":"key=value","aliases":["settings"],"builtin":true},{"name":"output-style","description":"List output styles or switch to one","argumentHint":"[style]","builtin":true},{"name":"context","description":"Show current context usage","argumentHint":"","builtin":true},{"name":"effort","description":"Set effort level for model usage","argumentHint":"\u003clow|medium|high|xhigh|max|auto|ultracode [on|off]\u003e","builtin":true},{"name":"fast","description":"Toggle fast mode (Opus 5.5)","argumentHint":"[on|off]","builtin":true},{"name":"focus","description":"Toggle focus view: just your prompt, summary, and response","argumentHint":"[on|off]","builtin":true},{"name":"heapdump","description":"Dump the JS heap to the Desktop; on Linux with no Desktop folder, the home directory","argumentHint":"","builtin":true},{"name":"init","description":"Initialize a new CLAUDE.md file with codebase documentation","argumentHint":"","builtin":true},{"name":"mcp","description":"Manage MCP servers","argumentHint":"[reconnect|enable|disable [\u003cserver\u003e|all]]","builtin":true},{"name":"import","description":"Import config from another AI coding agent","argumentHint":"","builtin":true},{"name":"model","description":"Set the AI model for Claude Code","argumentHint":"\u003cmodel\u003e","builtin":true},{"name":"__remote-workflow","description":"Run the workflow script delivered in this session environment (server-launched sessions only)","argumentHint":"","builtin":true},{"name":"workflow-launch-exec","description":"Execute a server-launched workflow handoff (workflow_launch event sessions only)","argumentHint":"","builtin":true},{"name":"reload-plugins","description":"Activate pending plugin changes in the current session","argumentHint":"[--force]","builtin":true},{"name":"reload-skills","description":"Pick up skills added or changed on disk during this session","argumentHint":"","builtin":true},{"name":"rename","description":"Rename the current conversation","argumentHint":"[name]","aliases":["name"],"builtin":true},{"name":"ultrareview","description":"Start a cloud agent that finds and verifies bugs in your branch (~15-25 min, $5-$25 USD) · Runs in a cloud session. See https://code.claude.com/docs/en/claude-code-on-the-web","argumentHint":"","builtin":true},{"name":"security-review","description":"Complete a security review of the pending changes on the current branch","argumentHint":"","builtin":true},{"name":"usage-credits","description":"Configure usage credits or request them from your admin when you hit a limit","argumentHint":"","builtin":true},{"name":"extra-usage","description":"Renamed to /usage-credits","argumentHint":"","builtin":true},{"name":"usage","description":"Show session cost, plan usage, and what's contributing to your limits","argumentHint":"","aliases":["cost","stats"],"builtin":true},{"name":"insights","description":"Generate a report analyzing your Claude Code sessions","argumentHint":"","builtin":true},{"name":"recap","description":"Generate a one-line session recap now","argumentHint":"","builtin":true},{"name":"skill-doctor","description":"Show which loaded skills are unused and costing context","argumentHint":"","builtin":true},{"name":"goal","description":"Set a goal — keep working until the condition is met","argumentHint":"","builtin":true},{"name":"design-consent","description":"Grant Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"design-revoke","description":"Revoke Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"list-agents","description":"List subagents, teammates, and other Claude sessions you can message","argumentHint":"","aliases":["peers"],"builtin":true},{"name":"team-onboarding","description":"Help teammates ramp on Claude Code with a guide from your usage","argumentHint":"","builtin":true},{"name":"docs","description":"docs (editable docs people share and comment on; the default for any document, named as a doc or not: a document, report, proposal, resume, cover letter, letter, contract, policy, form, template, worksheet, essay, handbook, guide, how-to, cheat sheet, SOP or other writing to keep, share, collaborate on, send, submit, print or sign; a doc exports to Word, PDF, Markdown or Google Docs, so needing a file to send, attach, upload, submit or print is no reason to pick Word, and a file nobody asked for is a doc, not Word; a plan, comparison, summary or notes asked in chat stays in chat; a pasted claude.ai artifact link may be a doc: check with docs tools first; Word or another file format named, tracked changes wanted, or a .docx to change or use as a template → that format's skill): making one → if no docs-connector instructions are in context, call its `guide` (topic.instructions) first; then create the doc (headings only, no body) before any search, file read or plan, even with files attached. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docs"]},{"name":"docx","description":"Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx) or Word templates (.dotx). Triggers include: any mention of Microsoft Word Documents, such as 'Word doc', 'word document', '.docx', '.dotx', 'microsoft doc'. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a deliverable as a Word or .docx file (to download, email or print), use this skill. However, if they ask for a document, page, report, memo, or notes WITHOUT naming a file format and the session offers Claude's own dedicated document or page skill or connector, use that instead, even if they will email or print it. Do NOT use for PDFs, spreadsheets, Google Docs, or coding unrelated to document generation. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docx"]},{"name":"google-workspace","description":"Read this before the first Google Drive, Docs, Sheets or Slides connector call whenever the task creates or changes a Google file. Use this skill whenever the user wants to create or change a Google Doc, Sheet or Slides file in their Google Drive. Triggers include: a request that names Google Docs, Sheets, Slides or Drive and asks to make, edit, format, copy or rename a file; a docs.google.com link with a request to change that file, even a one-line fix or suggested edits; and any follow-up change to a Google file from earlier in the chat, even \"change it\" or \"add a tab\". Includes helper scripts for document positions, cell ranges and slide layout. However, if the user asks for a doc, deck or spreadsheet without naming Google, or gives a Google file only as source material for something new, use Claude's own output type instead. Do NOT use for read-only questions about a Google file, or for Word, Excel, PowerPoint or PDF files. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:google-workspace"]},{"name":"import-memory","description":"Import a memory export from another AI assistant into Claude's memory — conversationally, additively, and with the content treated as data. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:import-memory"]},{"name":"morning","description":"Render the user's morning brief as a styled HTML artifact, or set it up as a recurring weekday task. Use only when the user explicitly asks to run, see, or set up their morning brief, or if they invoke /morning by name. A question about their day, schedule, or calendar is not by itself a request for the brief; answer it directly instead. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:morning"]},{"name":"pdf","description":"Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pdf"]},{"name":"pptx","description":"Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations as PowerPoint (.pptx) files; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email, summary, or creating a different type of slide deck); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user asks for a PowerPoint or .pptx file, or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. However, when the user asks for a deck, slides, a slide deck, or a presentation without naming a file format, default to using a dedicated slide-deck artifact type or a separate slides skill if this session offers one; otherwise, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pptx"]},{"name":"skill-creator","description":"Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:skill-creator"]},{"name":"xlsx","description":"Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .xltx, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:xlsx"]}],"agents":[{"name":"claude","description":"Catch-all for any task that doesn't fit a more specific agent. FleetView's default when no agent name is typed."},{"name":"claude-code-guide","description":"Use this agent when the user asks questions (\"Can Claude...\", \"Does Claude...\", \"How do I...\") about: (1) Claude Code (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - Messages API for directly passing messages to Claude, Tool Runner (`client.beta.messages.tool_runner`) for running an agentic loop over your own tools, manual tool-use loops, Managed Agents for server-hosted agents with a managed sandbox, prompt caching, and general Anthropic SDK usage; (4) Claude Tag (Claude in Slack) - what it is, setting it up for a Slack workspace, `/install-slack-app`; (5) `claude plugin eval` (writing and running plugin eval suites, its JSON/report, sandbox, CI) and the `/skill-doctor` report. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via SendMessage.","model":"haiku"},{"name":"Explore","description":"Fast read-only search agent for locating code. Use it to find files by pattern (eg. \"src/components/**/*.tsx\"), grep for symbols or keywords (eg. \"API endpoints\"), or answer \"where is X defined / which files reference Y.\" Do NOT use it for code review, design-doc auditing, cross-file consistency checks, or open-ended analysis — it reads excerpts rather than whole files and will miss content past its read window. When calling, specify search breadth: \"quick\" for a single targeted lookup, \"medium\" for moderate exploration, or \"very thorough\" to search across multiple locations and naming conventions.","model":"inherit"},{"name":"general-purpose","description":"General-purpose agent for researching complex questions, searching for code, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you."},{"name":"Plan","description":"Software architect agent for designing implementation plans. Use this when you need to plan the implementation strategy for a task. Returns step-by-step plans, identifies critical files, and considers architectural trade-offs.","model":"inherit"},{"name":"statusline-setup","description":"Use this agent to configure the user's Claude Code status line setting.","model":"sonnet"}],"output_style":"default","available_output_styles":["default","Proactive","Concise","Explanatory","Learning"],"user_output_styles_dir":"/Users/flamingcow/.claude/output-styles","models":[{"value":"default","resolvedModel":"claude-opus-5-5","displayName":"Default (recommended)","description":"Opus 5.5 · Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"opus","resolvedModel":"claude-opus-5-5","displayName":"Opus 5.5","description":"For complex work and everyday tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"fable","resolvedModel":"claude-fable-5-1","displayName":"Fable 5.1","description":"For your toughest challenges","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"sonnet","resolvedModel":"claude-sonnet-5-5","displayName":"Sonnet 5.5","description":"Most efficient for simpler tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"haiku","resolvedModel":"claude-haiku-5-5","displayName":"Haiku 5.5","description":"Fastest for quick answers","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-haiku-4-5-20251001","resolvedModel":"claude-haiku-4-5-20251001","displayName":"Haiku 4.5","description":"Fastest for quick answers"},{"value":"claude-sonnet-5","resolvedModel":"claude-sonnet-5","displayName":"Sonnet 5","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-5","resolvedModel":"claude-opus-5","displayName":"Opus 5","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-fable-5","resolvedModel":"claude-fable-5","displayName":"Fable 5","description":"Most capable for your hardest and longest-running tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-8","resolvedModel":"claude-opus-4-8","displayName":"Opus 4.8","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-opus-4-7","resolvedModel":"claude-opus-4-7","displayName":"Opus 4.7","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-6","resolvedModel":"claude-opus-4-6","displayName":"Opus 4.6","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-sonnet-4-6","resolvedModel":"claude-sonnet-4-6","displayName":"Sonnet 4.6","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true}],"account":{"email":"[redacted]","organization":"[redacted]'s Organization","subscriptionType":"Claude Max","apiProvider":"firstParty"},"pid":11242,"claude_code_version":"2.1.296","current_permission_mode":"bypassPermissions","hooks_applied":true,"feedback_mode":{"kind":"post"},"analytics_disabled":false,"remote_control_auto_enable":false,"remote_control_auto_connect_default":false,"remote_control_available":true,"remote_control_auto_on_by_default":false,"ide_rc_auto_enable_gate":true,"fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","session_state":"idle","capabilities":["ui_surface_v1"]},"pending_permission_requests":[],"pending_user_dialog_requests":[]}}} +{"dir":"send","msg":{"request":{"hooks":{"Stop":[{"hookCallbackIds":["hook_0"],"matcher":""}]},"subtype":"initialize"},"request_id":"req_445b13d62e755c5b","type":"control_request"}} +{"dir":"recv","msg":{"type":"control_response","response":{"subtype":"success","request_id":"req_445b13d62e755c5b","response":{"commands":[{"name":"deep-research","description":"Deep research harness — fan-out web searches, fetch sources, adversarially verify claims, synthesize a cited report. (dynamic workflow)","argumentHint":"","builtin":true},{"name":"design","description":"Make a new Design artifact from a brief","argumentHint":"[what to design]","builtin":true},{"name":"slides","description":"Make a new Slides deck artifact from a brief","argumentHint":"[what the deck is about]","builtin":true},{"name":"design-sync","description":"Push a React design system to claude.ai/design. This runs a converter that bundles the real component code (from Storybook or a bare package) and uploads it. Use when the user runs /design-sync or says \"sync my design system to Claude Design\".","argumentHint":"[\u003cproject hint, e.g. \"Acme DS\"\u003e]","builtin":true},{"name":"dataviz","description":"Use this skill whenever you are about to create ANY chart, graph, plot, dashboard, or data visualization, in ANY output medium — an HTML or React artifact, inline SVG, plotting code in any library (matplotlib, plotly, d3, Recharts, …), an image/PNG you will render and upload, or a chart shared into Slack. Read it BEFORE writing the first line of chart code, choosing chart colors, building a stat tile / meter / KPI row, or laying out a dashboard. When the destination is a first-party document connector (host-designated, never self-described) that renders live charts, hand it the rows (inline, or as an uploaded data file the chart cites) rather than a rendered PNG/SVG — a picture of a chart loses hover, data inspection and per-value comments. Produces visualizations that read as one system — elegant, accessible, consistent in light and dark — using a brand-neutral placeholder palette you swap for your own. Teaches a design-system-agnostic method: a form heuristic, a color formula with a runnable validator, mark specs, and interaction rules. A validated default palette is documented in `references/palette.md` — swap that file's values for your brand's. Triggers on: \"chart\", \"graph\", \"plot\", \"data viz\", \"visualization\", \"dashboard\", \"analytics\", \"visualize data\", \"categorical colors\", \"sequential / diverging palette\", \"stat tile\", \"sparkline\", \"heatmap\", \"legend\", \"axis\", \"tooltip\", \"chart colors\", \"color by series\".","argumentHint":"","builtin":true},{"name":"artifact-diagramming","description":"Diagramming know-how for Artifacts - when a picture earns its place, how to draw one that shows the real mechanism, and the inline-SVG mechanics that keep it legible in both themes.","argumentHint":"","builtin":true},{"name":"artifact-capabilities","description":"Runtime capabilities a published Artifact page can be granted — behavior static HTML cannot provide on its own, such as the page reading live or connected data, remembering what people do on it (a poll, a sign-up sheet, a checklist, a document edited in place — it saves new versions of itself), keeping state shared across viewers, knowing who is viewing, asking Claude a question of its own, storing files people add, handing the viewer a file to save, or using the viewer's camera, microphone, location, screen or device motion. Serves this user's live capability roster and the typed call definitions. Load it whenever any such runtime behavior would make an artifact more useful, before writing the page.","argumentHint":"","builtin":true},{"name":"update-config","description":"Use this skill to configure the Claude Code harness via settings.json. Automated behaviors (\"from now on when X\", \"each time X\", \"whenever X\", \"before/after X\") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions (\"allow X\", \"add permission\", \"move permission to\"), env vars (\"set X=Y\"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: \"allow npm commands\", \"add bq permission to global settings\", \"move permission to user settings\", \"set DEBUG=true\", \"when claude stops show X\". For simple settings like theme/model, suggest the /config command.","argumentHint":"","builtin":true},{"name":"verify","description":"Verify that a code change actually does what it's supposed to by exercising it end-to-end and observing behavior — drive the affected flow, not just tests or typecheck. Run before committing nontrivial changes; bootstraps this repo's project verify skill if none exists yet. Don't invoke it on a diff that only touches tests, docs, or other code with no runtime surface to drive (a change to product source always has one) — there's nothing to observe.","argumentHint":"","builtin":true},{"name":"debug","description":"Enable debug logging for this session and help diagnose issues","argumentHint":"[issue description]","builtin":true},{"name":"code-review","description":"Review the current diff, or a PR number/branch/path target, for correctness bugs (plus reuse/simplification/efficiency cleanups where the model's review recipe covers them) at the given effort level (low|medium|high|xhigh|max: from few high-confidence findings up to many, some of them uncertain; ultra: deep multi-agent review in the cloud); with no level given, it reuses the level you typed last. Pass --comment to post findings as inline PR comments, or --fix to apply the findings to the working tree after the review. Pass --max-findings \u003cn\u003e to report up to n findings, or --max-findings all for every finding. The choice stays until you pass --max-findings default. For ultra on a GitHub.com PR target, --post asks to post the finished review’s findings to the PR as a single comment from the user’s GitHub account (not a review; the launch dialog still confirms in interactive sessions, while non-interactive mode posts on the flag alone) and --no-post hides that option.","argumentHint":"[low|medium|high|xhigh|max|ultra] [--fix] [--comment] [\u003cpr#\u003e|\u003cbranch\u003e|\u003cpath\u003e] [--max-findings \u003cn\u003e|all]","aliases":["review"],"builtin":true},{"name":"simplify","description":"Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.","argumentHint":"[\u003ctarget\u003e]","builtin":true},{"name":"batch","description":"Research and plan a large-scale change, then execute it in parallel across 5–30 isolated worktree agents that each open a PR.","argumentHint":"\u003cinstruction\u003e","builtin":true},{"name":"fewer-permission-prompts","description":"Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.","argumentHint":"","builtin":true},{"name":"doctor","description":"Health-check the user's Claude Code setup and fix issues: diagnose installation health — what the `claude doctor` terminal diagnostics cover — from local data (duplicate or leftover installs, PATH, unparseable settings files, broken or colliding agent definitions, skills whose frontmatter fails to parse); find unused skills, MCP servers, and plugins versus their context cost and disable dead weight; deduplicate local CLAUDE.md files against checked-in ones; trim checked-in CLAUDE.md files by cutting content a session could derive from the codebase (directory layouts, tech-stack lists, architecture overviews) while keeping gotchas, rationale, and non-standard conventions; migrate always-loaded CLAUDE.md guidance into lazy skills and nested CLAUDE.md files; flag slow hooks and context-heavy extensions; check the installed version is current; make auto mode the default permission mode; and pre-approve frequently denied read-only commands. Use when the user asks for a doctor run, checkup, audit, tune-up, or cleanup of their Claude Code setup or configuration.","argumentHint":"[prompt-audit [\u003cpath\u003e]]","aliases":["checkup"],"builtin":true},{"name":"loop","description":"Run a prompt or slash command on a recurring interval (e.g. /loop 5m /foo). Omit the interval to let the model self-pace.","argumentHint":"[interval] [prompt]","aliases":["proactive"],"builtin":true},{"name":"schedule","description":"Create, update, list, or run scheduled cloud agents (routines) that execute on a cron schedule.","argumentHint":"","aliases":["routines"],"builtin":true},{"name":"claude-api","description":"Reference for the Claude API / Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude/Anthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing/model choice/limits/caching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent/MCP/tool-definition/multi-agent/RAG/LLM-judge/computer-use; generate/summarize/extract/classify/rewrite/converse over NL; debugging refusals/cutoffs/streaming/tool-calls/tokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).","argumentHint":"","builtin":true},{"name":"workflow-authoring","description":"Reference for writing a Workflow tool script (script API and gotchas, resume, quality patterns, worked examples). Load before authoring a script for a workflow the user already opted into; it does not itself authorize running one.","argumentHint":"","builtin":true},{"name":"run","description":"Launch and drive this project's app to see a change working. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real app (not just tests). First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns per project type (CLI, server, TUI, Electron, browser-driven, library).","argumentHint":"","builtin":true},{"name":"run-skill-generator","description":"Author or improve the run-\u003cunit\u003e skill - a per-project skill that tells agents how to build, launch, and drive this project's app. Use when the user asks to set up the project, get it running, write run instructions, or verify build/run steps work from a clean environment.","argumentHint":"","builtin":true},{"name":"plugin-authoring","description":"Make a mod: a change to Claude's own interface or behaviour, such as a live pane or panel, a band above the prompt, a status line, a toast, a slash command, or a hook on tool calls or prompts. Use to make, change or debug a mod or its hooks module.","argumentHint":"","builtin":true},{"name":"advisor","description":"Let Claude consult a stronger model at key moments","argumentHint":"[fable|opus|sonnet|off]","builtin":true},{"name":"agents","description":"(removed) Ask Claude to create/manage subagents, or edit .claude/agents/","argumentHint":"","builtin":true},{"name":"auto-mode-setup","description":"Teach auto mode about your environment, plus optional rule tweaks","argumentHint":"[--request-id \u003cuuid\u003e] (--wizard posture=… scope=… depth=… --propose | --expect-sha256 \u003c64-hex\u003e --apply-file \u003cpath\u003e)","builtin":true},{"name":"autocompact","description":"Configure the auto-compact window size","argumentHint":"[auto|\u003ctokens\u003e]","builtin":true},{"name":"clear","description":"Start a new session with empty context; previous session stays on disk (resumable with /resume)","argumentHint":"[name]","aliases":["reset","new"],"builtin":true},{"name":"color","description":"Set the prompt bar color for this session","argumentHint":"[red|blue|green|yellow|purple|orange|pink|cyan|default]","builtin":true},{"name":"compact","description":"Free up context by summarizing the conversation so far","argumentHint":"\u003coptional custom summarization instructions\u003e","builtin":true},{"name":"config","description":"Set a setting by key","argumentHint":"key=value","aliases":["settings"],"builtin":true},{"name":"output-style","description":"List output styles or switch to one","argumentHint":"[style]","builtin":true},{"name":"context","description":"Show current context usage","argumentHint":"","builtin":true},{"name":"effort","description":"Set effort level for model usage","argumentHint":"\u003clow|medium|high|xhigh|max|auto|ultracode [on|off]\u003e","builtin":true},{"name":"fast","description":"Toggle fast mode (Opus 5.5)","argumentHint":"[on|off]","builtin":true},{"name":"focus","description":"Toggle focus view: just your prompt, summary, and response","argumentHint":"[on|off]","builtin":true},{"name":"heapdump","description":"Dump the JS heap to the Desktop; on Linux with no Desktop folder, the home directory","argumentHint":"","builtin":true},{"name":"init","description":"Initialize a new CLAUDE.md file with codebase documentation","argumentHint":"","builtin":true},{"name":"mcp","description":"Manage MCP servers","argumentHint":"[reconnect|enable|disable [\u003cserver\u003e|all]]","builtin":true},{"name":"import","description":"Import config from another AI coding agent","argumentHint":"","builtin":true},{"name":"model","description":"Set the AI model for Claude Code","argumentHint":"\u003cmodel\u003e","builtin":true},{"name":"__remote-workflow","description":"Run the workflow script delivered in this session environment (server-launched sessions only)","argumentHint":"","builtin":true},{"name":"workflow-launch-exec","description":"Execute a server-launched workflow handoff (workflow_launch event sessions only)","argumentHint":"","builtin":true},{"name":"reload-plugins","description":"Activate pending plugin changes in the current session","argumentHint":"[--force]","builtin":true},{"name":"reload-skills","description":"Pick up skills added or changed on disk during this session","argumentHint":"","builtin":true},{"name":"rename","description":"Rename the current conversation","argumentHint":"[name]","aliases":["name"],"builtin":true},{"name":"ultrareview","description":"Start a cloud agent that finds and verifies bugs in your branch (~15-25 min, $5-$25 USD) · Runs in a cloud session. See https://code.claude.com/docs/en/claude-code-on-the-web","argumentHint":"","builtin":true},{"name":"security-review","description":"Complete a security review of the pending changes on the current branch","argumentHint":"","builtin":true},{"name":"usage-credits","description":"Configure usage credits or request them from your admin when you hit a limit","argumentHint":"","builtin":true},{"name":"extra-usage","description":"Renamed to /usage-credits","argumentHint":"","builtin":true},{"name":"usage","description":"Show session cost, plan usage, and what's contributing to your limits","argumentHint":"","aliases":["cost","stats"],"builtin":true},{"name":"insights","description":"Generate a report analyzing your Claude Code sessions","argumentHint":"","builtin":true},{"name":"recap","description":"Generate a one-line session recap now","argumentHint":"","builtin":true},{"name":"skill-doctor","description":"Show which loaded skills are unused and costing context","argumentHint":"","builtin":true},{"name":"goal","description":"Set a goal — keep working until the condition is met","argumentHint":"","builtin":true},{"name":"design-consent","description":"Grant Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"design-revoke","description":"Revoke Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"list-agents","description":"List subagents, teammates, and other Claude sessions you can message","argumentHint":"","aliases":["peers"],"builtin":true},{"name":"team-onboarding","description":"Help teammates ramp on Claude Code with a guide from your usage","argumentHint":"","builtin":true},{"name":"docs","description":"docs (editable docs people share and comment on; the default for any document, named as a doc or not: a document, report, proposal, resume, cover letter, letter, contract, policy, form, template, worksheet, essay, handbook, guide, how-to, cheat sheet, SOP or other writing to keep, share, collaborate on, send, submit, print or sign; a doc exports to Word, PDF, Markdown or Google Docs, so needing a file to send, attach, upload, submit or print is no reason to pick Word, and a file nobody asked for is a doc, not Word; a plan, comparison, summary or notes asked in chat stays in chat; a pasted claude.ai artifact link may be a doc: check with docs tools first; Word or another file format named, tracked changes wanted, or a .docx to change or use as a template → that format's skill): making one → if no docs-connector instructions are in context, call its `guide` (topic.instructions) first; then create the doc (headings only, no body) before any search, file read or plan, even with files attached. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docs"]},{"name":"docx","description":"Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx) or Word templates (.dotx). Triggers include: any mention of Microsoft Word Documents, such as 'Word doc', 'word document', '.docx', '.dotx', 'microsoft doc'. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a deliverable as a Word or .docx file (to download, email or print), use this skill. However, if they ask for a document, page, report, memo, or notes WITHOUT naming a file format and the session offers Claude's own dedicated document or page skill or connector, use that instead, even if they will email or print it. Do NOT use for PDFs, spreadsheets, Google Docs, or coding unrelated to document generation. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docx"]},{"name":"google-workspace","description":"Read this before the first Google Drive, Docs, Sheets or Slides connector call whenever the task creates or changes a Google file. Use this skill whenever the user wants to create or change a Google Doc, Sheet or Slides file in their Google Drive. Triggers include: a request that names Google Docs, Sheets, Slides or Drive and asks to make, edit, format, copy or rename a file; a docs.google.com link with a request to change that file, even a one-line fix or suggested edits; and any follow-up change to a Google file from earlier in the chat, even \"change it\" or \"add a tab\". Includes helper scripts for document positions, cell ranges and slide layout. However, if the user asks for a doc, deck or spreadsheet without naming Google, or gives a Google file only as source material for something new, use Claude's own output type instead. Do NOT use for read-only questions about a Google file, or for Word, Excel, PowerPoint or PDF files. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:google-workspace"]},{"name":"import-memory","description":"Import a memory export from another AI assistant into Claude's memory — conversationally, additively, and with the content treated as data. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:import-memory"]},{"name":"morning","description":"Render the user's morning brief as a styled HTML artifact, or set it up as a recurring weekday task. Use only when the user explicitly asks to run, see, or set up their morning brief, or if they invoke /morning by name. A question about their day, schedule, or calendar is not by itself a request for the brief; answer it directly instead. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:morning"]},{"name":"pdf","description":"Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pdf"]},{"name":"pptx","description":"Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations as PowerPoint (.pptx) files; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email, summary, or creating a different type of slide deck); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user asks for a PowerPoint or .pptx file, or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. However, when the user asks for a deck, slides, a slide deck, or a presentation without naming a file format, default to using a dedicated slide-deck artifact type or a separate slides skill if this session offers one; otherwise, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pptx"]},{"name":"skill-creator","description":"Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:skill-creator"]},{"name":"xlsx","description":"Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .xltx, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:xlsx"]}],"agents":[{"name":"claude","description":"Catch-all for any task that doesn't fit a more specific agent. FleetView's default when no agent name is typed."},{"name":"claude-code-guide","description":"Use this agent when the user asks questions (\"Can Claude...\", \"Does Claude...\", \"How do I...\") about: (1) Claude Code (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - Messages API for directly passing messages to Claude, Tool Runner (`client.beta.messages.tool_runner`) for running an agentic loop over your own tools, manual tool-use loops, Managed Agents for server-hosted agents with a managed sandbox, prompt caching, and general Anthropic SDK usage; (4) Claude Tag (Claude in Slack) - what it is, setting it up for a Slack workspace, `/install-slack-app`; (5) `claude plugin eval` (writing and running plugin eval suites, its JSON/report, sandbox, CI) and the `/skill-doctor` report. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via SendMessage.","model":"haiku"},{"name":"Explore","description":"Fast read-only search agent for locating code. Use it to find files by pattern (eg. \"src/components/**/*.tsx\"), grep for symbols or keywords (eg. \"API endpoints\"), or answer \"where is X defined / which files reference Y.\" Do NOT use it for code review, design-doc auditing, cross-file consistency checks, or open-ended analysis — it reads excerpts rather than whole files and will miss content past its read window. When calling, specify search breadth: \"quick\" for a single targeted lookup, \"medium\" for moderate exploration, or \"very thorough\" to search across multiple locations and naming conventions.","model":"inherit"},{"name":"general-purpose","description":"General-purpose agent for researching complex questions, searching for code, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you."},{"name":"Plan","description":"Software architect agent for designing implementation plans. Use this when you need to plan the implementation strategy for a task. Returns step-by-step plans, identifies critical files, and considers architectural trade-offs.","model":"inherit"},{"name":"statusline-setup","description":"Use this agent to configure the user's Claude Code status line setting.","model":"sonnet"}],"output_style":"default","available_output_styles":["default","Proactive","Concise","Explanatory","Learning"],"user_output_styles_dir":"/Users/flamingcow/.claude/output-styles","models":[{"value":"default","resolvedModel":"claude-opus-5-5","displayName":"Default (recommended)","description":"Opus 5.5 · Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"opus","resolvedModel":"claude-opus-5-5","displayName":"Opus 5.5","description":"For complex work and everyday tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"fable","resolvedModel":"claude-fable-5-1","displayName":"Fable 5.1","description":"For your toughest challenges","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"sonnet","resolvedModel":"claude-sonnet-5-5","displayName":"Sonnet 5.5","description":"Most efficient for simpler tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"haiku","resolvedModel":"claude-haiku-5-5","displayName":"Haiku 5.5","description":"Fastest for quick answers","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-haiku-4-5-20251001","resolvedModel":"claude-haiku-4-5-20251001","displayName":"Haiku 4.5","description":"Fastest for quick answers"},{"value":"claude-sonnet-5","resolvedModel":"claude-sonnet-5","displayName":"Sonnet 5","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-5","resolvedModel":"claude-opus-5","displayName":"Opus 5","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-fable-5","resolvedModel":"claude-fable-5","displayName":"Fable 5","description":"Most capable for your hardest and longest-running tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-8","resolvedModel":"claude-opus-4-8","displayName":"Opus 4.8","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-opus-4-7","resolvedModel":"claude-opus-4-7","displayName":"Opus 4.7","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-6","resolvedModel":"claude-opus-4-6","displayName":"Opus 4.6","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-sonnet-4-6","resolvedModel":"claude-sonnet-4-6","displayName":"Sonnet 4.6","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true}],"account":{"email":"[redacted]","organization":"[redacted]'s Organization","subscriptionType":"Claude Max","apiProvider":"firstParty"},"pid":12878,"claude_code_version":"2.1.296","current_permission_mode":"bypassPermissions","hooks_applied":true,"feedback_mode":{"kind":"post"},"analytics_disabled":false,"remote_control_auto_enable":false,"remote_control_auto_connect_default":false,"remote_control_available":true,"remote_control_auto_on_by_default":false,"ide_rc_auto_enable_gate":true,"fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","session_state":"idle","capabilities":["ui_surface_v1"]},"pending_permission_requests":[],"pending_user_dialog_requests":[]}}} {"dir":"send","msg":{"message":{"content":"Reply with the single word ok.","role":"user"},"parent_tool_use_id":null,"session_id":"","type":"user"}} -{"dir":"recv","msg":{"type":"system","subtype":"init","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestStopHookBlocks918189571/001","session_id":"50cad820-216b-428b-958e-a0f2ae3acbac","tools":["Task","Artifact","ArtifactComments","ArtifactData","Bash","CronCreate","CronDelete","CronList","DesignSync","Edit","EnterWorktree","ExitWorktree","ListAgents","LSP","Monitor","NotebookEdit","PushNotification","Read","RemoteTrigger","ReportFindings","ScheduleWakeup","SendMessage","Skill","TaskStop","ToolSearch","WebFetch","WebSearch","Workflow","Write"],"mcp_servers":[{"name":"claude.ai Claude Docs","status":"pending","source":"claudeai"},{"name":"claude.ai Heliosian","status":"pending","source":"claudeai"},{"name":"claude.ai Fastmail","status":"pending","source":"claudeai"},{"name":"claude.ai Google Calendar","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Gmail","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Google Drive","status":"needs-auth","source":"claudeai"}],"model":"claude-sonnet-5-5","permissionMode":"bypassPermissions","slash_commands":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","advisor","agents","auto-mode-setup","autocompact","clear","color","compact","config","output-style","context","effort","fast","focus","heapdump","init","mcp","import","model","__remote-workflow","workflow-launch-exec","reload-plugins","reload-skills","rename","ultrareview","security-review","usage-credits","extra-usage","usage","insights","recap","skill-doctor","goal","design-consent","design-revoke","list-agents","team-onboarding","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"terminal_slash_commands":["doctor","color","focus","reload-plugins"],"apiKeySource":"none","claude_code_version":"2.1.296","output_style":"default","agents":["claude","claude-code-guide","Explore","general-purpose","Plan","statusline-setup"],"skills":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"plugins":[{"name":"clangd-lsp","path":"/Users/flamingcow/.claude/plugins/cache/claude-plugins-official/clangd-lsp/1.0.0","source":"clangd-lsp@claude-plugins-official","version":"1.0.0"},{"name":"cc-plugin-agents-md","path":"builtin","source":"cc-plugin-agents-md@builtin"},{"name":"cc-plugin-telemetry","path":"builtin","source":"cc-plugin-telemetry@builtin"},{"name":"cc-plugin-plugin-authoring","path":"builtin","source":"cc-plugin-plugin-authoring@builtin"}],"capabilities":["interrupt_receipt_v1","interrupt_cancel_queued_v1","interrupt_send_now_v1","msg_lifecycle_v1","request_marker_lists_v1","sdk_mcp_tools_list_changed","sdk_mcp_manifests","mcp_read_resource_v1","mcp_tool_ui_meta_v1","ui_surface_v1"],"analytics_disabled":false,"product_feedback_disabled":false,"uuid":"3928f6a2-3dd4-4075-8c91-22cf9cf7584e","memory_paths":{"auto":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestStopHookBlocks918189571-001/memory/"},"scratchpad_path":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestStopHookBlocks918189571-001/50cad820-216b-428b-958e-a0f2ae3acbac/scratchpad","messaging_socket_path":"/tmp/cc-socks/11242.sock","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","per_turn_effort_active":true,"view_mode":"default"}} -{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"50cad820-216b-428b-958e-a0f2ae3acbac","uuid":"0953b44b-6e7d-4858-9d14-1629d9f3d2f5"}} -{"dir":"recv","msg":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed","resetsAt":1792054200,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false,"unifiedWindows":{"five_hour":{"utilization":0.04,"resetsAt":1792054200},"seven_day":{"utilization":0.35,"resetsAt":1792270800}}},"uuid":"ef4fcbaf-d5f8-487c-9f47-c0f83baade69","session_id":"50cad820-216b-428b-958e-a0f2ae3acbac"}} -{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3P8PgsCPW6LTGKQutGM","type":"message","role":"assistant","content":[{"type":"text","text":"ok"}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":15231,"cache_read_input_tokens":22367,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15231},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"50cad820-216b-428b-958e-a0f2ae3acbac","uuid":"98bd20ea-e7eb-4a28-8a76-014f608e73e2","timestamp":"2026-10-15T04:21:15.956Z","request_id":"req_011Cg3P8PMmdRkxAkNe7CbwR"}} -{"dir":"recv","msg":{"type":"control_request","request_id":"c7b0c248-a030-4c70-85d9-8a8cc1f6bf0f","request":{"subtype":"hook_callback","callback_id":"hook_0","input":{"session_id":"50cad820-216b-428b-958e-a0f2ae3acbac","transcript_path":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestStopHookBlocks918189571-001/50cad820-216b-428b-958e-a0f2ae3acbac.jsonl","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestStopHookBlocks918189571/001","scratchpad_dir":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestStopHookBlocks918189571-001/50cad820-216b-428b-958e-a0f2ae3acbac/scratchpad","prompt_id":"0e361612-a503-4bac-8594-ddb4728a0e5b","permission_mode":"bypassPermissions","effort":{"level":"medium"},"hook_event_name":"Stop","stop_hook_active":false,"last_assistant_message":"ok","background_tasks":[],"session_crons":[]},"tool_use_id":"d7eedbf7-a15d-4568-ab88-99661dd14bd9"}}} -{"dir":"send","msg":{"response":{"request_id":"c7b0c248-a030-4c70-85d9-8a8cc1f6bf0f","response":{"decision":"block","reason":"Before stopping, reply with the single word PINEAPPLE."},"subtype":"success"},"type":"control_response"}} -{"dir":"recv","msg":{"type":"user","message":{"role":"user","content":[{"type":"text","text":"Stop hook feedback:\nBefore stopping, reply with the single word PINEAPPLE."}]},"parent_tool_use_id":null,"session_id":"50cad820-216b-428b-958e-a0f2ae3acbac","uuid":"eb58caf8-e93f-4d9b-983f-3e0bd3c3853d","timestamp":"2026-10-15T04:21:15.971Z","isSynthetic":true}} -{"dir":"recv","msg":{"type":"system","subtype":"notification","key":"stop-hook-error","text":"Stop hook error occurred · ctrl+o to see","priority":"immediate","session_id":"50cad820-216b-428b-958e-a0f2ae3acbac","uuid":"819b323f-d31c-4ae2-bc30-f6eab8aa0344"}} -{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"50cad820-216b-428b-958e-a0f2ae3acbac","uuid":"5cc15d1f-7be0-484b-9953-e27c64e5cdcb"}} -{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3P8VpDSKAzDdMris5JU","type":"message","role":"assistant","content":[{"type":"text","text":"PINEAPPLE"}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":7058,"cache_read_input_tokens":30620,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":7058},"output_tokens":8,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":{"cache_miss_reason":{"type":"messages_changed","cache_missed_input_tokens":13144}},"context_management":null},"parent_tool_use_id":null,"session_id":"50cad820-216b-428b-958e-a0f2ae3acbac","uuid":"b8d2a562-d06e-4ee4-94d3-aa8b0ccce6be","timestamp":"2026-10-15T04:21:17.469Z","request_id":"req_011Cg3P8VZL9i8P6WnRkJaEP"}} -{"dir":"recv","msg":{"type":"control_request","request_id":"e9a5400d-20f2-4223-8057-f83968f9fc8c","request":{"subtype":"hook_callback","callback_id":"hook_0","input":{"session_id":"50cad820-216b-428b-958e-a0f2ae3acbac","transcript_path":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestStopHookBlocks918189571-001/50cad820-216b-428b-958e-a0f2ae3acbac.jsonl","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestStopHookBlocks918189571/001","scratchpad_dir":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestStopHookBlocks918189571-001/50cad820-216b-428b-958e-a0f2ae3acbac/scratchpad","prompt_id":"0e361612-a503-4bac-8594-ddb4728a0e5b","permission_mode":"bypassPermissions","effort":{"level":"medium"},"hook_event_name":"Stop","stop_hook_active":true,"last_assistant_message":"PINEAPPLE","background_tasks":[],"session_crons":[]},"tool_use_id":"4400f617-8b76-4cc6-bf20-5ead87f2a4d9"}}} -{"dir":"send","msg":{"response":{"request_id":"e9a5400d-20f2-4223-8057-f83968f9fc8c","response":{},"subtype":"success"},"type":"control_response"}} -{"dir":"recv","msg":{"duration_api_ms":3814,"stop_reason":"end_turn","session_id":"50cad820-216b-428b-958e-a0f2ae3acbac","total_cost_usd":0.09472710000000001,"usage":{"input_tokens":4,"cache_creation_input_tokens":22289,"cache_read_input_tokens":52987,"output_tokens":14,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":22289,"ephemeral_5m_input_tokens":0},"inference_geo":"global","iterations":[{"input_tokens":2,"output_tokens":10,"cache_read_input_tokens":30620,"cache_creation_input_tokens":7058,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":7058},"type":"message"}],"speed":"standard","fallback_credit":null},"modelUsage":{"claude-haiku-5-5":{"inputTokens":1174,"outputTokens":14,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.0001244,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-haiku-5-5","provider":"firstParty","costBasis":"list"},"claude-sonnet-5-5":{"inputTokens":4,"outputTokens":14,"cacheReadInputTokens":52987,"cacheCreationInputTokens":22289,"webSearchRequests":0,"costUSD":0.09460270000000001,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-sonnet-5-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"safety_stops":0,"is_error":false,"num_turns":2,"subtype":"success","api_error_status":null,"result":"PINEAPPLE","ttft_ms":1548,"type":"result","duration_ms":3086,"uuid":"a2ab8b54-c502-4e1d-8c27-384f9d45b1e6","ttft_stream_ms":1535,"time_to_request_ms":25,"first_content_frame_ms":1536,"queued_turn_count":0,"result_index":0}} +{"dir":"recv","msg":{"type":"system","subtype":"init","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestStopHookBlocks786577145/001","session_id":"24045dcf-e93b-468d-98a6-41cad91ae43f","tools":["Task","Artifact","ArtifactComments","ArtifactData","Bash","CronCreate","CronDelete","CronList","DesignSync","Edit","EnterWorktree","ExitWorktree","ListAgents","LSP","Monitor","NotebookEdit","PushNotification","Read","RemoteTrigger","ReportFindings","ScheduleWakeup","SendMessage","Skill","TaskStop","ToolSearch","WebFetch","WebSearch","Workflow","Write"],"mcp_servers":[{"name":"claude.ai Claude Docs","status":"pending","source":"claudeai"},{"name":"claude.ai Heliosian","status":"pending","source":"claudeai"},{"name":"claude.ai Fastmail","status":"pending","source":"claudeai"},{"name":"claude.ai Google Calendar","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Gmail","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Google Drive","status":"needs-auth","source":"claudeai"}],"model":"claude-sonnet-5-5","permissionMode":"bypassPermissions","slash_commands":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","advisor","agents","auto-mode-setup","autocompact","clear","color","compact","config","output-style","context","effort","fast","focus","heapdump","init","mcp","import","model","__remote-workflow","workflow-launch-exec","reload-plugins","reload-skills","rename","ultrareview","security-review","usage-credits","extra-usage","usage","insights","recap","skill-doctor","goal","design-consent","design-revoke","list-agents","team-onboarding","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"terminal_slash_commands":["doctor","color","focus","reload-plugins"],"apiKeySource":"none","claude_code_version":"2.1.296","output_style":"default","agents":["claude","claude-code-guide","Explore","general-purpose","Plan","statusline-setup"],"skills":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"plugins":[{"name":"clangd-lsp","path":"/Users/flamingcow/.claude/plugins/cache/claude-plugins-official/clangd-lsp/1.0.0","source":"clangd-lsp@claude-plugins-official","version":"1.0.0"},{"name":"cc-plugin-agents-md","path":"builtin","source":"cc-plugin-agents-md@builtin"},{"name":"cc-plugin-telemetry","path":"builtin","source":"cc-plugin-telemetry@builtin"},{"name":"cc-plugin-plugin-authoring","path":"builtin","source":"cc-plugin-plugin-authoring@builtin"}],"capabilities":["interrupt_receipt_v1","interrupt_cancel_queued_v1","interrupt_send_now_v1","msg_lifecycle_v1","request_marker_lists_v1","sdk_mcp_tools_list_changed","sdk_mcp_manifests","mcp_read_resource_v1","mcp_tool_ui_meta_v1","ui_surface_v1"],"analytics_disabled":false,"product_feedback_disabled":false,"uuid":"43655c3f-4e0f-475e-8598-921ee59cc1db","memory_paths":{"auto":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestStopHookBlocks786577145-001/memory/"},"scratchpad_path":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestStopHookBlocks786577145-001/24045dcf-e93b-468d-98a6-41cad91ae43f/scratchpad","messaging_socket_path":"/tmp/cc-socks/12878.sock","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","per_turn_effort_active":true,"view_mode":"default"}} +{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"24045dcf-e93b-468d-98a6-41cad91ae43f","uuid":"6b637fb7-9886-4e26-8e8b-a579c7864943"}} +{"dir":"recv","msg":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed","resetsAt":1792054200,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false,"unifiedWindows":{"five_hour":{"utilization":0.05,"resetsAt":1792054200},"seven_day":{"utilization":0.35,"resetsAt":1792270800}}},"uuid":"b7239b4c-abef-46ac-bdb4-143238bc8166","session_id":"24045dcf-e93b-468d-98a6-41cad91ae43f"}} +{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3PDvTvaWXPfS6wgUTp2","type":"message","role":"assistant","content":[{"type":"text","text":"ok"}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":15233,"cache_read_input_tokens":22367,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15233},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"24045dcf-e93b-468d-98a6-41cad91ae43f","uuid":"9ee099d9-82e7-449b-a837-589b5b22b4d0","timestamp":"2026-10-15T04:22:31.081Z","request_id":"req_011Cg3PDvEHVxtHNnekGmy4r"}} +{"dir":"recv","msg":{"type":"control_request","request_id":"a2586822-4fe3-49fa-8e63-2b82facaf176","request":{"subtype":"hook_callback","callback_id":"hook_0","input":{"session_id":"24045dcf-e93b-468d-98a6-41cad91ae43f","transcript_path":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestStopHookBlocks786577145-001/24045dcf-e93b-468d-98a6-41cad91ae43f.jsonl","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestStopHookBlocks786577145/001","scratchpad_dir":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestStopHookBlocks786577145-001/24045dcf-e93b-468d-98a6-41cad91ae43f/scratchpad","prompt_id":"24769c4c-fae5-4371-b334-6c97516120b2","permission_mode":"bypassPermissions","effort":{"level":"medium"},"hook_event_name":"Stop","stop_hook_active":false,"last_assistant_message":"ok","background_tasks":[],"session_crons":[]},"tool_use_id":"a2fdc947-4e6a-4e01-8a68-4ad2be62770c"}}} +{"dir":"send","msg":{"response":{"request_id":"a2586822-4fe3-49fa-8e63-2b82facaf176","response":{"decision":"block","reason":"Before stopping, reply with the single word PINEAPPLE."},"subtype":"success"},"type":"control_response"}} +{"dir":"recv","msg":{"type":"user","message":{"role":"user","content":[{"type":"text","text":"Stop hook feedback:\nBefore stopping, reply with the single word PINEAPPLE."}]},"parent_tool_use_id":null,"session_id":"24045dcf-e93b-468d-98a6-41cad91ae43f","uuid":"a9cd980f-bab2-4a93-a54f-4c53bcffc0e8","timestamp":"2026-10-15T04:22:31.101Z","isSynthetic":true}} +{"dir":"recv","msg":{"type":"system","subtype":"notification","key":"stop-hook-error","text":"Stop hook error occurred · ctrl+o to see","priority":"immediate","session_id":"24045dcf-e93b-468d-98a6-41cad91ae43f","uuid":"6daf56aa-13b9-4200-a607-106b4ee42730"}} +{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"24045dcf-e93b-468d-98a6-41cad91ae43f","uuid":"9b67aae1-d116-46b4-a782-25230eca0c7d"}} +{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3PE33ZAJ3VeD9gFMPdk","type":"message","role":"assistant","content":[{"type":"text","text":"PINEAPPLE"}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":7059,"cache_read_input_tokens":30621,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":7059},"output_tokens":8,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":{"cache_miss_reason":{"type":"messages_changed","cache_missed_input_tokens":13144}},"context_management":null},"parent_tool_use_id":null,"session_id":"24045dcf-e93b-468d-98a6-41cad91ae43f","uuid":"b707bcad-8665-4403-808f-2f4cff676583","timestamp":"2026-10-15T04:22:32.484Z","request_id":"req_011Cg3PE2nRsvAMNWdtauk61"}} +{"dir":"recv","msg":{"type":"control_request","request_id":"3629dfe5-eece-49db-9b8f-a5b43b6d8eb1","request":{"subtype":"hook_callback","callback_id":"hook_0","input":{"session_id":"24045dcf-e93b-468d-98a6-41cad91ae43f","transcript_path":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestStopHookBlocks786577145-001/24045dcf-e93b-468d-98a6-41cad91ae43f.jsonl","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestStopHookBlocks786577145/001","scratchpad_dir":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestStopHookBlocks786577145-001/24045dcf-e93b-468d-98a6-41cad91ae43f/scratchpad","prompt_id":"24769c4c-fae5-4371-b334-6c97516120b2","permission_mode":"bypassPermissions","effort":{"level":"medium"},"hook_event_name":"Stop","stop_hook_active":true,"last_assistant_message":"PINEAPPLE","background_tasks":[],"session_crons":[]},"tool_use_id":"9f8dd092-434c-4874-833a-ab960c0df51f"}}} +{"dir":"send","msg":{"response":{"request_id":"3629dfe5-eece-49db-9b8f-a5b43b6d8eb1","response":{},"subtype":"success"},"type":"control_response"}} +{"dir":"recv","msg":{"duration_api_ms":3617,"stop_reason":"end_turn","session_id":"24045dcf-e93b-468d-98a6-41cad91ae43f","total_cost_usd":0.0947392,"usage":{"input_tokens":4,"cache_creation_input_tokens":22292,"cache_read_input_tokens":52988,"output_tokens":14,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":22292,"ephemeral_5m_input_tokens":0},"inference_geo":"global","iterations":[{"input_tokens":2,"output_tokens":10,"cache_read_input_tokens":30621,"cache_creation_input_tokens":7059,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":7059},"type":"message"}],"speed":"standard","fallback_credit":null},"modelUsage":{"claude-haiku-5-5":{"inputTokens":1174,"outputTokens":14,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.0001244,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-haiku-5-5","provider":"firstParty","costBasis":"list"},"claude-sonnet-5-5":{"inputTokens":4,"outputTokens":14,"cacheReadInputTokens":52988,"cacheCreationInputTokens":22292,"webSearchRequests":0,"costUSD":0.0946148,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-sonnet-5-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"safety_stops":0,"is_error":false,"num_turns":2,"subtype":"success","api_error_status":null,"result":"PINEAPPLE","ttft_ms":1660,"type":"result","duration_ms":3079,"uuid":"0318ac1e-f705-433d-a8a9-d71fd8964e2b","ttft_stream_ms":1653,"time_to_request_ms":27,"first_content_frame_ms":1654,"queued_turn_count":0,"result_index":0}} diff --git a/internal/claude/testdata/transcripts/TestTextDeltas.jsonl b/internal/claude/testdata/transcripts/TestTextDeltas.jsonl index a01a612..37e3b2d 100644 --- a/internal/claude/testdata/transcripts/TestTextDeltas.jsonl +++ b/internal/claude/testdata/transcripts/TestTextDeltas.jsonl @@ -1,8 +1,8 @@ -{"dir":"send","msg":{"request":{"hooks":null,"subtype":"initialize"},"request_id":"req_6b7f0d99e84ed228","type":"control_request"}} -{"dir":"recv","msg":{"type":"control_response","response":{"subtype":"success","request_id":"req_6b7f0d99e84ed228","response":{"commands":[{"name":"deep-research","description":"Deep research harness — fan-out web searches, fetch sources, adversarially verify claims, synthesize a cited report. (dynamic workflow)","argumentHint":"","builtin":true},{"name":"design","description":"Make a new Design artifact from a brief","argumentHint":"[what to design]","builtin":true},{"name":"slides","description":"Make a new Slides deck artifact from a brief","argumentHint":"[what the deck is about]","builtin":true},{"name":"design-sync","description":"Push a React design system to claude.ai/design. This runs a converter that bundles the real component code (from Storybook or a bare package) and uploads it. Use when the user runs /design-sync or says \"sync my design system to Claude Design\".","argumentHint":"[\u003cproject hint, e.g. \"Acme DS\"\u003e]","builtin":true},{"name":"dataviz","description":"Use this skill whenever you are about to create ANY chart, graph, plot, dashboard, or data visualization, in ANY output medium — an HTML or React artifact, inline SVG, plotting code in any library (matplotlib, plotly, d3, Recharts, …), an image/PNG you will render and upload, or a chart shared into Slack. Read it BEFORE writing the first line of chart code, choosing chart colors, building a stat tile / meter / KPI row, or laying out a dashboard. When the destination is a first-party document connector (host-designated, never self-described) that renders live charts, hand it the rows (inline, or as an uploaded data file the chart cites) rather than a rendered PNG/SVG — a picture of a chart loses hover, data inspection and per-value comments. Produces visualizations that read as one system — elegant, accessible, consistent in light and dark — using a brand-neutral placeholder palette you swap for your own. Teaches a design-system-agnostic method: a form heuristic, a color formula with a runnable validator, mark specs, and interaction rules. A validated default palette is documented in `references/palette.md` — swap that file's values for your brand's. Triggers on: \"chart\", \"graph\", \"plot\", \"data viz\", \"visualization\", \"dashboard\", \"analytics\", \"visualize data\", \"categorical colors\", \"sequential / diverging palette\", \"stat tile\", \"sparkline\", \"heatmap\", \"legend\", \"axis\", \"tooltip\", \"chart colors\", \"color by series\".","argumentHint":"","builtin":true},{"name":"artifact-diagramming","description":"Diagramming know-how for Artifacts - when a picture earns its place, how to draw one that shows the real mechanism, and the inline-SVG mechanics that keep it legible in both themes.","argumentHint":"","builtin":true},{"name":"artifact-capabilities","description":"Runtime capabilities a published Artifact page can be granted — behavior static HTML cannot provide on its own, such as the page reading live or connected data, remembering what people do on it (a poll, a sign-up sheet, a checklist, a document edited in place — it saves new versions of itself), keeping state shared across viewers, knowing who is viewing, asking Claude a question of its own, storing files people add, handing the viewer a file to save, or using the viewer's camera, microphone, location, screen or device motion. Serves this user's live capability roster and the typed call definitions. Load it whenever any such runtime behavior would make an artifact more useful, before writing the page.","argumentHint":"","builtin":true},{"name":"update-config","description":"Use this skill to configure the Claude Code harness via settings.json. Automated behaviors (\"from now on when X\", \"each time X\", \"whenever X\", \"before/after X\") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions (\"allow X\", \"add permission\", \"move permission to\"), env vars (\"set X=Y\"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: \"allow npm commands\", \"add bq permission to global settings\", \"move permission to user settings\", \"set DEBUG=true\", \"when claude stops show X\". For simple settings like theme/model, suggest the /config command.","argumentHint":"","builtin":true},{"name":"verify","description":"Verify that a code change actually does what it's supposed to by exercising it end-to-end and observing behavior — drive the affected flow, not just tests or typecheck. Run before committing nontrivial changes; bootstraps this repo's project verify skill if none exists yet. Don't invoke it on a diff that only touches tests, docs, or other code with no runtime surface to drive (a change to product source always has one) — there's nothing to observe.","argumentHint":"","builtin":true},{"name":"debug","description":"Enable debug logging for this session and help diagnose issues","argumentHint":"[issue description]","builtin":true},{"name":"code-review","description":"Review the current diff, or a PR number/branch/path target, for correctness bugs (plus reuse/simplification/efficiency cleanups where the model's review recipe covers them) at the given effort level (low|medium|high|xhigh|max: from few high-confidence findings up to many, some of them uncertain; ultra: deep multi-agent review in the cloud); with no level given, it reuses the level you typed last. Pass --comment to post findings as inline PR comments, or --fix to apply the findings to the working tree after the review. Pass --max-findings \u003cn\u003e to report up to n findings, or --max-findings all for every finding. The choice stays until you pass --max-findings default. For ultra on a GitHub.com PR target, --post asks to post the finished review’s findings to the PR as a single comment from the user’s GitHub account (not a review; the launch dialog still confirms in interactive sessions, while non-interactive mode posts on the flag alone) and --no-post hides that option.","argumentHint":"[low|medium|high|xhigh|max|ultra] [--fix] [--comment] [\u003cpr#\u003e|\u003cbranch\u003e|\u003cpath\u003e] [--max-findings \u003cn\u003e|all]","aliases":["review"],"builtin":true},{"name":"simplify","description":"Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.","argumentHint":"[\u003ctarget\u003e]","builtin":true},{"name":"batch","description":"Research and plan a large-scale change, then execute it in parallel across 5–30 isolated worktree agents that each open a PR.","argumentHint":"\u003cinstruction\u003e","builtin":true},{"name":"fewer-permission-prompts","description":"Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.","argumentHint":"","builtin":true},{"name":"doctor","description":"Health-check the user's Claude Code setup and fix issues: diagnose installation health — what the `claude doctor` terminal diagnostics cover — from local data (duplicate or leftover installs, PATH, unparseable settings files, broken or colliding agent definitions, skills whose frontmatter fails to parse); find unused skills, MCP servers, and plugins versus their context cost and disable dead weight; deduplicate local CLAUDE.md files against checked-in ones; trim checked-in CLAUDE.md files by cutting content a session could derive from the codebase (directory layouts, tech-stack lists, architecture overviews) while keeping gotchas, rationale, and non-standard conventions; migrate always-loaded CLAUDE.md guidance into lazy skills and nested CLAUDE.md files; flag slow hooks and context-heavy extensions; check the installed version is current; make auto mode the default permission mode; and pre-approve frequently denied read-only commands. Use when the user asks for a doctor run, checkup, audit, tune-up, or cleanup of their Claude Code setup or configuration.","argumentHint":"[prompt-audit [\u003cpath\u003e]]","aliases":["checkup"],"builtin":true},{"name":"loop","description":"Run a prompt or slash command on a recurring interval (e.g. /loop 5m /foo). Omit the interval to let the model self-pace.","argumentHint":"[interval] [prompt]","aliases":["proactive"],"builtin":true},{"name":"schedule","description":"Create, update, list, or run scheduled cloud agents (routines) that execute on a cron schedule.","argumentHint":"","aliases":["routines"],"builtin":true},{"name":"claude-api","description":"Reference for the Claude API / Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude/Anthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing/model choice/limits/caching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent/MCP/tool-definition/multi-agent/RAG/LLM-judge/computer-use; generate/summarize/extract/classify/rewrite/converse over NL; debugging refusals/cutoffs/streaming/tool-calls/tokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).","argumentHint":"","builtin":true},{"name":"workflow-authoring","description":"Reference for writing a Workflow tool script (script API and gotchas, resume, quality patterns, worked examples). Load before authoring a script for a workflow the user already opted into; it does not itself authorize running one.","argumentHint":"","builtin":true},{"name":"run","description":"Launch and drive this project's app to see a change working. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real app (not just tests). First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns per project type (CLI, server, TUI, Electron, browser-driven, library).","argumentHint":"","builtin":true},{"name":"run-skill-generator","description":"Author or improve the run-\u003cunit\u003e skill - a per-project skill that tells agents how to build, launch, and drive this project's app. Use when the user asks to set up the project, get it running, write run instructions, or verify build/run steps work from a clean environment.","argumentHint":"","builtin":true},{"name":"plugin-authoring","description":"Make a mod: a change to Claude's own interface or behaviour, such as a live pane or panel, a band above the prompt, a status line, a toast, a slash command, or a hook on tool calls or prompts. Use to make, change or debug a mod or its hooks module.","argumentHint":"","builtin":true},{"name":"advisor","description":"Let Claude consult a stronger model at key moments","argumentHint":"[fable|opus|sonnet|off]","builtin":true},{"name":"agents","description":"(removed) Ask Claude to create/manage subagents, or edit .claude/agents/","argumentHint":"","builtin":true},{"name":"auto-mode-setup","description":"Teach auto mode about your environment, plus optional rule tweaks","argumentHint":"[--request-id \u003cuuid\u003e] (--wizard posture=… scope=… depth=… --propose | --expect-sha256 \u003c64-hex\u003e --apply-file \u003cpath\u003e)","builtin":true},{"name":"autocompact","description":"Configure the auto-compact window size","argumentHint":"[auto|\u003ctokens\u003e]","builtin":true},{"name":"clear","description":"Start a new session with empty context; previous session stays on disk (resumable with /resume)","argumentHint":"[name]","aliases":["reset","new"],"builtin":true},{"name":"color","description":"Set the prompt bar color for this session","argumentHint":"[red|blue|green|yellow|purple|orange|pink|cyan|default]","builtin":true},{"name":"compact","description":"Free up context by summarizing the conversation so far","argumentHint":"\u003coptional custom summarization instructions\u003e","builtin":true},{"name":"config","description":"Set a setting by key","argumentHint":"key=value","aliases":["settings"],"builtin":true},{"name":"output-style","description":"List output styles or switch to one","argumentHint":"[style]","builtin":true},{"name":"context","description":"Show current context usage","argumentHint":"","builtin":true},{"name":"effort","description":"Set effort level for model usage","argumentHint":"\u003clow|medium|high|xhigh|max|auto|ultracode [on|off]\u003e","builtin":true},{"name":"fast","description":"Toggle fast mode (Opus 5.5)","argumentHint":"[on|off]","builtin":true},{"name":"focus","description":"Toggle focus view: just your prompt, summary, and response","argumentHint":"[on|off]","builtin":true},{"name":"heapdump","description":"Dump the JS heap to the Desktop; on Linux with no Desktop folder, the home directory","argumentHint":"","builtin":true},{"name":"init","description":"Initialize a new CLAUDE.md file with codebase documentation","argumentHint":"","builtin":true},{"name":"mcp","description":"Manage MCP servers","argumentHint":"[reconnect|enable|disable [\u003cserver\u003e|all]]","builtin":true},{"name":"import","description":"Import config from another AI coding agent","argumentHint":"","builtin":true},{"name":"model","description":"Set the AI model for Claude Code","argumentHint":"\u003cmodel\u003e","builtin":true},{"name":"__remote-workflow","description":"Run the workflow script delivered in this session environment (server-launched sessions only)","argumentHint":"","builtin":true},{"name":"workflow-launch-exec","description":"Execute a server-launched workflow handoff (workflow_launch event sessions only)","argumentHint":"","builtin":true},{"name":"reload-plugins","description":"Activate pending plugin changes in the current session","argumentHint":"[--force]","builtin":true},{"name":"reload-skills","description":"Pick up skills added or changed on disk during this session","argumentHint":"","builtin":true},{"name":"rename","description":"Rename the current conversation","argumentHint":"[name]","aliases":["name"],"builtin":true},{"name":"ultrareview","description":"Start a cloud agent that finds and verifies bugs in your branch (~15-25 min, $5-$25 USD) · Runs in a cloud session. See https://code.claude.com/docs/en/claude-code-on-the-web","argumentHint":"","builtin":true},{"name":"security-review","description":"Complete a security review of the pending changes on the current branch","argumentHint":"","builtin":true},{"name":"usage-credits","description":"Configure usage credits or request them from your admin when you hit a limit","argumentHint":"","builtin":true},{"name":"extra-usage","description":"Renamed to /usage-credits","argumentHint":"","builtin":true},{"name":"usage","description":"Show session cost, plan usage, and what's contributing to your limits","argumentHint":"","aliases":["cost","stats"],"builtin":true},{"name":"insights","description":"Generate a report analyzing your Claude Code sessions","argumentHint":"","builtin":true},{"name":"recap","description":"Generate a one-line session recap now","argumentHint":"","builtin":true},{"name":"skill-doctor","description":"Show which loaded skills are unused and costing context","argumentHint":"","builtin":true},{"name":"goal","description":"Set a goal — keep working until the condition is met","argumentHint":"","builtin":true},{"name":"design-consent","description":"Grant Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"design-revoke","description":"Revoke Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"list-agents","description":"List subagents, teammates, and other Claude sessions you can message","argumentHint":"","aliases":["peers"],"builtin":true},{"name":"team-onboarding","description":"Help teammates ramp on Claude Code with a guide from your usage","argumentHint":"","builtin":true},{"name":"docs","description":"docs (editable docs people share and comment on; the default for any document, named as a doc or not: a document, report, proposal, resume, cover letter, letter, contract, policy, form, template, worksheet, essay, handbook, guide, how-to, cheat sheet, SOP or other writing to keep, share, collaborate on, send, submit, print or sign; a doc exports to Word, PDF, Markdown or Google Docs, so needing a file to send, attach, upload, submit or print is no reason to pick Word, and a file nobody asked for is a doc, not Word; a plan, comparison, summary or notes asked in chat stays in chat; a pasted claude.ai artifact link may be a doc: check with docs tools first; Word or another file format named, tracked changes wanted, or a .docx to change or use as a template → that format's skill): making one → if no docs-connector instructions are in context, call its `guide` (topic.instructions) first; then create the doc (headings only, no body) before any search, file read or plan, even with files attached. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docs"]},{"name":"docx","description":"Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx) or Word templates (.dotx). Triggers include: any mention of Microsoft Word Documents, such as 'Word doc', 'word document', '.docx', '.dotx', 'microsoft doc'. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a deliverable as a Word or .docx file (to download, email or print), use this skill. However, if they ask for a document, page, report, memo, or notes WITHOUT naming a file format and the session offers Claude's own dedicated document or page skill or connector, use that instead, even if they will email or print it. Do NOT use for PDFs, spreadsheets, Google Docs, or coding unrelated to document generation. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docx"]},{"name":"google-workspace","description":"Read this before the first Google Drive, Docs, Sheets or Slides connector call whenever the task creates or changes a Google file. Use this skill whenever the user wants to create or change a Google Doc, Sheet or Slides file in their Google Drive. Triggers include: a request that names Google Docs, Sheets, Slides or Drive and asks to make, edit, format, copy or rename a file; a docs.google.com link with a request to change that file, even a one-line fix or suggested edits; and any follow-up change to a Google file from earlier in the chat, even \"change it\" or \"add a tab\". Includes helper scripts for document positions, cell ranges and slide layout. However, if the user asks for a doc, deck or spreadsheet without naming Google, or gives a Google file only as source material for something new, use Claude's own output type instead. Do NOT use for read-only questions about a Google file, or for Word, Excel, PowerPoint or PDF files. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:google-workspace"]},{"name":"import-memory","description":"Import a memory export from another AI assistant into Claude's memory — conversationally, additively, and with the content treated as data. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:import-memory"]},{"name":"morning","description":"Render the user's morning brief as a styled HTML artifact, or set it up as a recurring weekday task. Use only when the user explicitly asks to run, see, or set up their morning brief, or if they invoke /morning by name. A question about their day, schedule, or calendar is not by itself a request for the brief; answer it directly instead. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:morning"]},{"name":"pdf","description":"Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pdf"]},{"name":"pptx","description":"Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations as PowerPoint (.pptx) files; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email, summary, or creating a different type of slide deck); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user asks for a PowerPoint or .pptx file, or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. However, when the user asks for a deck, slides, a slide deck, or a presentation without naming a file format, default to using a dedicated slide-deck artifact type or a separate slides skill if this session offers one; otherwise, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pptx"]},{"name":"skill-creator","description":"Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:skill-creator"]},{"name":"xlsx","description":"Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .xltx, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:xlsx"]}],"agents":[{"name":"claude","description":"Catch-all for any task that doesn't fit a more specific agent. FleetView's default when no agent name is typed."},{"name":"claude-code-guide","description":"Use this agent when the user asks questions (\"Can Claude...\", \"Does Claude...\", \"How do I...\") about: (1) Claude Code (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - Messages API for directly passing messages to Claude, Tool Runner (`client.beta.messages.tool_runner`) for running an agentic loop over your own tools, manual tool-use loops, Managed Agents for server-hosted agents with a managed sandbox, prompt caching, and general Anthropic SDK usage; (4) Claude Tag (Claude in Slack) - what it is, setting it up for a Slack workspace, `/install-slack-app`; (5) `claude plugin eval` (writing and running plugin eval suites, its JSON/report, sandbox, CI) and the `/skill-doctor` report. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via SendMessage.","model":"haiku"},{"name":"Explore","description":"Fast read-only search agent for locating code. Use it to find files by pattern (eg. \"src/components/**/*.tsx\"), grep for symbols or keywords (eg. \"API endpoints\"), or answer \"where is X defined / which files reference Y.\" Do NOT use it for code review, design-doc auditing, cross-file consistency checks, or open-ended analysis — it reads excerpts rather than whole files and will miss content past its read window. When calling, specify search breadth: \"quick\" for a single targeted lookup, \"medium\" for moderate exploration, or \"very thorough\" to search across multiple locations and naming conventions.","model":"inherit"},{"name":"general-purpose","description":"General-purpose agent for researching complex questions, searching for code, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you."},{"name":"Plan","description":"Software architect agent for designing implementation plans. Use this when you need to plan the implementation strategy for a task. Returns step-by-step plans, identifies critical files, and considers architectural trade-offs.","model":"inherit"},{"name":"statusline-setup","description":"Use this agent to configure the user's Claude Code status line setting.","model":"sonnet"}],"output_style":"default","available_output_styles":["default","Proactive","Concise","Explanatory","Learning"],"user_output_styles_dir":"/Users/flamingcow/.claude/output-styles","models":[{"value":"default","resolvedModel":"claude-opus-5-5","displayName":"Default (recommended)","description":"Opus 5.5 · Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"opus","resolvedModel":"claude-opus-5-5","displayName":"Opus 5.5","description":"For complex work and everyday tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"fable","resolvedModel":"claude-fable-5-1","displayName":"Fable 5.1","description":"For your toughest challenges","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"sonnet","resolvedModel":"claude-sonnet-5-5","displayName":"Sonnet 5.5","description":"Most efficient for simpler tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"haiku","resolvedModel":"claude-haiku-5-5","displayName":"Haiku 5.5","description":"Fastest for quick answers","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-haiku-4-5-20251001","resolvedModel":"claude-haiku-4-5-20251001","displayName":"Haiku 4.5","description":"Fastest for quick answers"},{"value":"claude-sonnet-5","resolvedModel":"claude-sonnet-5","displayName":"Sonnet 5","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-5","resolvedModel":"claude-opus-5","displayName":"Opus 5","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-fable-5","resolvedModel":"claude-fable-5","displayName":"Fable 5","description":"Most capable for your hardest and longest-running tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-8","resolvedModel":"claude-opus-4-8","displayName":"Opus 4.8","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-opus-4-7","resolvedModel":"claude-opus-4-7","displayName":"Opus 4.7","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-6","resolvedModel":"claude-opus-4-6","displayName":"Opus 4.6","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-sonnet-4-6","resolvedModel":"claude-sonnet-4-6","displayName":"Sonnet 4.6","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true}],"account":{"email":"[redacted]","organization":"[redacted]'s Organization","subscriptionType":"Claude Max","apiProvider":"firstParty"},"pid":11244,"claude_code_version":"2.1.296","current_permission_mode":"bypassPermissions","feedback_mode":{"kind":"post"},"analytics_disabled":false,"remote_control_auto_enable":false,"remote_control_auto_connect_default":false,"remote_control_available":true,"remote_control_auto_on_by_default":false,"ide_rc_auto_enable_gate":true,"fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","session_state":"idle","capabilities":["ui_surface_v1"]},"pending_permission_requests":[],"pending_user_dialog_requests":[]}}} +{"dir":"send","msg":{"request":{"hooks":null,"subtype":"initialize"},"request_id":"req_4ac0ce21d6dc8fd7","type":"control_request"}} +{"dir":"recv","msg":{"type":"control_response","response":{"subtype":"success","request_id":"req_4ac0ce21d6dc8fd7","response":{"commands":[{"name":"deep-research","description":"Deep research harness — fan-out web searches, fetch sources, adversarially verify claims, synthesize a cited report. (dynamic workflow)","argumentHint":"","builtin":true},{"name":"design","description":"Make a new Design artifact from a brief","argumentHint":"[what to design]","builtin":true},{"name":"slides","description":"Make a new Slides deck artifact from a brief","argumentHint":"[what the deck is about]","builtin":true},{"name":"design-sync","description":"Push a React design system to claude.ai/design. This runs a converter that bundles the real component code (from Storybook or a bare package) and uploads it. Use when the user runs /design-sync or says \"sync my design system to Claude Design\".","argumentHint":"[\u003cproject hint, e.g. \"Acme DS\"\u003e]","builtin":true},{"name":"dataviz","description":"Use this skill whenever you are about to create ANY chart, graph, plot, dashboard, or data visualization, in ANY output medium — an HTML or React artifact, inline SVG, plotting code in any library (matplotlib, plotly, d3, Recharts, …), an image/PNG you will render and upload, or a chart shared into Slack. Read it BEFORE writing the first line of chart code, choosing chart colors, building a stat tile / meter / KPI row, or laying out a dashboard. When the destination is a first-party document connector (host-designated, never self-described) that renders live charts, hand it the rows (inline, or as an uploaded data file the chart cites) rather than a rendered PNG/SVG — a picture of a chart loses hover, data inspection and per-value comments. Produces visualizations that read as one system — elegant, accessible, consistent in light and dark — using a brand-neutral placeholder palette you swap for your own. Teaches a design-system-agnostic method: a form heuristic, a color formula with a runnable validator, mark specs, and interaction rules. A validated default palette is documented in `references/palette.md` — swap that file's values for your brand's. Triggers on: \"chart\", \"graph\", \"plot\", \"data viz\", \"visualization\", \"dashboard\", \"analytics\", \"visualize data\", \"categorical colors\", \"sequential / diverging palette\", \"stat tile\", \"sparkline\", \"heatmap\", \"legend\", \"axis\", \"tooltip\", \"chart colors\", \"color by series\".","argumentHint":"","builtin":true},{"name":"artifact-diagramming","description":"Diagramming know-how for Artifacts - when a picture earns its place, how to draw one that shows the real mechanism, and the inline-SVG mechanics that keep it legible in both themes.","argumentHint":"","builtin":true},{"name":"artifact-capabilities","description":"Runtime capabilities a published Artifact page can be granted — behavior static HTML cannot provide on its own, such as the page reading live or connected data, remembering what people do on it (a poll, a sign-up sheet, a checklist, a document edited in place — it saves new versions of itself), keeping state shared across viewers, knowing who is viewing, asking Claude a question of its own, storing files people add, handing the viewer a file to save, or using the viewer's camera, microphone, location, screen or device motion. Serves this user's live capability roster and the typed call definitions. Load it whenever any such runtime behavior would make an artifact more useful, before writing the page.","argumentHint":"","builtin":true},{"name":"update-config","description":"Use this skill to configure the Claude Code harness via settings.json. Automated behaviors (\"from now on when X\", \"each time X\", \"whenever X\", \"before/after X\") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions (\"allow X\", \"add permission\", \"move permission to\"), env vars (\"set X=Y\"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: \"allow npm commands\", \"add bq permission to global settings\", \"move permission to user settings\", \"set DEBUG=true\", \"when claude stops show X\". For simple settings like theme/model, suggest the /config command.","argumentHint":"","builtin":true},{"name":"verify","description":"Verify that a code change actually does what it's supposed to by exercising it end-to-end and observing behavior — drive the affected flow, not just tests or typecheck. Run before committing nontrivial changes; bootstraps this repo's project verify skill if none exists yet. Don't invoke it on a diff that only touches tests, docs, or other code with no runtime surface to drive (a change to product source always has one) — there's nothing to observe.","argumentHint":"","builtin":true},{"name":"debug","description":"Enable debug logging for this session and help diagnose issues","argumentHint":"[issue description]","builtin":true},{"name":"code-review","description":"Review the current diff, or a PR number/branch/path target, for correctness bugs (plus reuse/simplification/efficiency cleanups where the model's review recipe covers them) at the given effort level (low|medium|high|xhigh|max: from few high-confidence findings up to many, some of them uncertain; ultra: deep multi-agent review in the cloud); with no level given, it reuses the level you typed last. Pass --comment to post findings as inline PR comments, or --fix to apply the findings to the working tree after the review. Pass --max-findings \u003cn\u003e to report up to n findings, or --max-findings all for every finding. The choice stays until you pass --max-findings default. For ultra on a GitHub.com PR target, --post asks to post the finished review’s findings to the PR as a single comment from the user’s GitHub account (not a review; the launch dialog still confirms in interactive sessions, while non-interactive mode posts on the flag alone) and --no-post hides that option.","argumentHint":"[low|medium|high|xhigh|max|ultra] [--fix] [--comment] [\u003cpr#\u003e|\u003cbranch\u003e|\u003cpath\u003e] [--max-findings \u003cn\u003e|all]","aliases":["review"],"builtin":true},{"name":"simplify","description":"Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.","argumentHint":"[\u003ctarget\u003e]","builtin":true},{"name":"batch","description":"Research and plan a large-scale change, then execute it in parallel across 5–30 isolated worktree agents that each open a PR.","argumentHint":"\u003cinstruction\u003e","builtin":true},{"name":"fewer-permission-prompts","description":"Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.","argumentHint":"","builtin":true},{"name":"doctor","description":"Health-check the user's Claude Code setup and fix issues: diagnose installation health — what the `claude doctor` terminal diagnostics cover — from local data (duplicate or leftover installs, PATH, unparseable settings files, broken or colliding agent definitions, skills whose frontmatter fails to parse); find unused skills, MCP servers, and plugins versus their context cost and disable dead weight; deduplicate local CLAUDE.md files against checked-in ones; trim checked-in CLAUDE.md files by cutting content a session could derive from the codebase (directory layouts, tech-stack lists, architecture overviews) while keeping gotchas, rationale, and non-standard conventions; migrate always-loaded CLAUDE.md guidance into lazy skills and nested CLAUDE.md files; flag slow hooks and context-heavy extensions; check the installed version is current; make auto mode the default permission mode; and pre-approve frequently denied read-only commands. Use when the user asks for a doctor run, checkup, audit, tune-up, or cleanup of their Claude Code setup or configuration.","argumentHint":"[prompt-audit [\u003cpath\u003e]]","aliases":["checkup"],"builtin":true},{"name":"loop","description":"Run a prompt or slash command on a recurring interval (e.g. /loop 5m /foo). Omit the interval to let the model self-pace.","argumentHint":"[interval] [prompt]","aliases":["proactive"],"builtin":true},{"name":"schedule","description":"Create, update, list, or run scheduled cloud agents (routines) that execute on a cron schedule.","argumentHint":"","aliases":["routines"],"builtin":true},{"name":"claude-api","description":"Reference for the Claude API / Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude/Anthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing/model choice/limits/caching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent/MCP/tool-definition/multi-agent/RAG/LLM-judge/computer-use; generate/summarize/extract/classify/rewrite/converse over NL; debugging refusals/cutoffs/streaming/tool-calls/tokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).","argumentHint":"","builtin":true},{"name":"workflow-authoring","description":"Reference for writing a Workflow tool script (script API and gotchas, resume, quality patterns, worked examples). Load before authoring a script for a workflow the user already opted into; it does not itself authorize running one.","argumentHint":"","builtin":true},{"name":"run","description":"Launch and drive this project's app to see a change working. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real app (not just tests). First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns per project type (CLI, server, TUI, Electron, browser-driven, library).","argumentHint":"","builtin":true},{"name":"run-skill-generator","description":"Author or improve the run-\u003cunit\u003e skill - a per-project skill that tells agents how to build, launch, and drive this project's app. Use when the user asks to set up the project, get it running, write run instructions, or verify build/run steps work from a clean environment.","argumentHint":"","builtin":true},{"name":"plugin-authoring","description":"Make a mod: a change to Claude's own interface or behaviour, such as a live pane or panel, a band above the prompt, a status line, a toast, a slash command, or a hook on tool calls or prompts. Use to make, change or debug a mod or its hooks module.","argumentHint":"","builtin":true},{"name":"advisor","description":"Let Claude consult a stronger model at key moments","argumentHint":"[fable|opus|sonnet|off]","builtin":true},{"name":"agents","description":"(removed) Ask Claude to create/manage subagents, or edit .claude/agents/","argumentHint":"","builtin":true},{"name":"auto-mode-setup","description":"Teach auto mode about your environment, plus optional rule tweaks","argumentHint":"[--request-id \u003cuuid\u003e] (--wizard posture=… scope=… depth=… --propose | --expect-sha256 \u003c64-hex\u003e --apply-file \u003cpath\u003e)","builtin":true},{"name":"autocompact","description":"Configure the auto-compact window size","argumentHint":"[auto|\u003ctokens\u003e]","builtin":true},{"name":"clear","description":"Start a new session with empty context; previous session stays on disk (resumable with /resume)","argumentHint":"[name]","aliases":["reset","new"],"builtin":true},{"name":"color","description":"Set the prompt bar color for this session","argumentHint":"[red|blue|green|yellow|purple|orange|pink|cyan|default]","builtin":true},{"name":"compact","description":"Free up context by summarizing the conversation so far","argumentHint":"\u003coptional custom summarization instructions\u003e","builtin":true},{"name":"config","description":"Set a setting by key","argumentHint":"key=value","aliases":["settings"],"builtin":true},{"name":"output-style","description":"List output styles or switch to one","argumentHint":"[style]","builtin":true},{"name":"context","description":"Show current context usage","argumentHint":"","builtin":true},{"name":"effort","description":"Set effort level for model usage","argumentHint":"\u003clow|medium|high|xhigh|max|auto|ultracode [on|off]\u003e","builtin":true},{"name":"fast","description":"Toggle fast mode (Opus 5.5)","argumentHint":"[on|off]","builtin":true},{"name":"focus","description":"Toggle focus view: just your prompt, summary, and response","argumentHint":"[on|off]","builtin":true},{"name":"heapdump","description":"Dump the JS heap to the Desktop; on Linux with no Desktop folder, the home directory","argumentHint":"","builtin":true},{"name":"init","description":"Initialize a new CLAUDE.md file with codebase documentation","argumentHint":"","builtin":true},{"name":"mcp","description":"Manage MCP servers","argumentHint":"[reconnect|enable|disable [\u003cserver\u003e|all]]","builtin":true},{"name":"import","description":"Import config from another AI coding agent","argumentHint":"","builtin":true},{"name":"model","description":"Set the AI model for Claude Code","argumentHint":"\u003cmodel\u003e","builtin":true},{"name":"__remote-workflow","description":"Run the workflow script delivered in this session environment (server-launched sessions only)","argumentHint":"","builtin":true},{"name":"workflow-launch-exec","description":"Execute a server-launched workflow handoff (workflow_launch event sessions only)","argumentHint":"","builtin":true},{"name":"reload-plugins","description":"Activate pending plugin changes in the current session","argumentHint":"[--force]","builtin":true},{"name":"reload-skills","description":"Pick up skills added or changed on disk during this session","argumentHint":"","builtin":true},{"name":"rename","description":"Rename the current conversation","argumentHint":"[name]","aliases":["name"],"builtin":true},{"name":"ultrareview","description":"Start a cloud agent that finds and verifies bugs in your branch (~15-25 min, $5-$25 USD) · Runs in a cloud session. See https://code.claude.com/docs/en/claude-code-on-the-web","argumentHint":"","builtin":true},{"name":"security-review","description":"Complete a security review of the pending changes on the current branch","argumentHint":"","builtin":true},{"name":"usage-credits","description":"Configure usage credits or request them from your admin when you hit a limit","argumentHint":"","builtin":true},{"name":"extra-usage","description":"Renamed to /usage-credits","argumentHint":"","builtin":true},{"name":"usage","description":"Show session cost, plan usage, and what's contributing to your limits","argumentHint":"","aliases":["cost","stats"],"builtin":true},{"name":"insights","description":"Generate a report analyzing your Claude Code sessions","argumentHint":"","builtin":true},{"name":"recap","description":"Generate a one-line session recap now","argumentHint":"","builtin":true},{"name":"skill-doctor","description":"Show which loaded skills are unused and costing context","argumentHint":"","builtin":true},{"name":"goal","description":"Set a goal — keep working until the condition is met","argumentHint":"","builtin":true},{"name":"design-consent","description":"Grant Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"design-revoke","description":"Revoke Claude agent access to your Design projects","argumentHint":"","builtin":true},{"name":"list-agents","description":"List subagents, teammates, and other Claude sessions you can message","argumentHint":"","aliases":["peers"],"builtin":true},{"name":"team-onboarding","description":"Help teammates ramp on Claude Code with a guide from your usage","argumentHint":"","builtin":true},{"name":"docs","description":"docs (editable docs people share and comment on; the default for any document, named as a doc or not: a document, report, proposal, resume, cover letter, letter, contract, policy, form, template, worksheet, essay, handbook, guide, how-to, cheat sheet, SOP or other writing to keep, share, collaborate on, send, submit, print or sign; a doc exports to Word, PDF, Markdown or Google Docs, so needing a file to send, attach, upload, submit or print is no reason to pick Word, and a file nobody asked for is a doc, not Word; a plan, comparison, summary or notes asked in chat stays in chat; a pasted claude.ai artifact link may be a doc: check with docs tools first; Word or another file format named, tracked changes wanted, or a .docx to change or use as a template → that format's skill): making one → if no docs-connector instructions are in context, call its `guide` (topic.instructions) first; then create the doc (headings only, no body) before any search, file read or plan, even with files attached. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docs"]},{"name":"docx","description":"Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx) or Word templates (.dotx). Triggers include: any mention of Microsoft Word Documents, such as 'Word doc', 'word document', '.docx', '.dotx', 'microsoft doc'. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a deliverable as a Word or .docx file (to download, email or print), use this skill. However, if they ask for a document, page, report, memo, or notes WITHOUT naming a file format and the session offers Claude's own dedicated document or page skill or connector, use that instead, even if they will email or print it. Do NOT use for PDFs, spreadsheets, Google Docs, or coding unrelated to document generation. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:docx"]},{"name":"google-workspace","description":"Read this before the first Google Drive, Docs, Sheets or Slides connector call whenever the task creates or changes a Google file. Use this skill whenever the user wants to create or change a Google Doc, Sheet or Slides file in their Google Drive. Triggers include: a request that names Google Docs, Sheets, Slides or Drive and asks to make, edit, format, copy or rename a file; a docs.google.com link with a request to change that file, even a one-line fix or suggested edits; and any follow-up change to a Google file from earlier in the chat, even \"change it\" or \"add a tab\". Includes helper scripts for document positions, cell ranges and slide layout. However, if the user asks for a doc, deck or spreadsheet without naming Google, or gives a Google file only as source material for something new, use Claude's own output type instead. Do NOT use for read-only questions about a Google file, or for Word, Excel, PowerPoint or PDF files. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:google-workspace"]},{"name":"import-memory","description":"Import a memory export from another AI assistant into Claude's memory — conversationally, additively, and with the content treated as data. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:import-memory"]},{"name":"morning","description":"Render the user's morning brief as a styled HTML artifact, or set it up as a recurring weekday task. Use only when the user explicitly asks to run, see, or set up their morning brief, or if they invoke /morning by name. A question about their day, schedule, or calendar is not by itself a request for the brief; answer it directly instead. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:morning"]},{"name":"pdf","description":"Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pdf"]},{"name":"pptx","description":"Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations as PowerPoint (.pptx) files; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email, summary, or creating a different type of slide deck); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user asks for a PowerPoint or .pptx file, or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. However, when the user asks for a deck, slides, a slide deck, or a presentation without naming a file format, default to using a dedicated slide-deck artifact type or a separate slides skill if this session offers one; otherwise, use this skill. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:pptx"]},{"name":"skill-creator","description":"Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:skill-creator"]},{"name":"xlsx","description":"Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .xltx, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved. (claude.ai sync)","argumentHint":"","aliases":["anthropic-skills:xlsx"]}],"agents":[{"name":"claude","description":"Catch-all for any task that doesn't fit a more specific agent. FleetView's default when no agent name is typed."},{"name":"claude-code-guide","description":"Use this agent when the user asks questions (\"Can Claude...\", \"Does Claude...\", \"How do I...\") about: (1) Claude Code (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - Messages API for directly passing messages to Claude, Tool Runner (`client.beta.messages.tool_runner`) for running an agentic loop over your own tools, manual tool-use loops, Managed Agents for server-hosted agents with a managed sandbox, prompt caching, and general Anthropic SDK usage; (4) Claude Tag (Claude in Slack) - what it is, setting it up for a Slack workspace, `/install-slack-app`; (5) `claude plugin eval` (writing and running plugin eval suites, its JSON/report, sandbox, CI) and the `/skill-doctor` report. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via SendMessage.","model":"haiku"},{"name":"Explore","description":"Fast read-only search agent for locating code. Use it to find files by pattern (eg. \"src/components/**/*.tsx\"), grep for symbols or keywords (eg. \"API endpoints\"), or answer \"where is X defined / which files reference Y.\" Do NOT use it for code review, design-doc auditing, cross-file consistency checks, or open-ended analysis — it reads excerpts rather than whole files and will miss content past its read window. When calling, specify search breadth: \"quick\" for a single targeted lookup, \"medium\" for moderate exploration, or \"very thorough\" to search across multiple locations and naming conventions.","model":"inherit"},{"name":"general-purpose","description":"General-purpose agent for researching complex questions, searching for code, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you."},{"name":"Plan","description":"Software architect agent for designing implementation plans. Use this when you need to plan the implementation strategy for a task. Returns step-by-step plans, identifies critical files, and considers architectural trade-offs.","model":"inherit"},{"name":"statusline-setup","description":"Use this agent to configure the user's Claude Code status line setting.","model":"sonnet"}],"output_style":"default","available_output_styles":["default","Proactive","Concise","Explanatory","Learning"],"user_output_styles_dir":"/Users/flamingcow/.claude/output-styles","models":[{"value":"default","resolvedModel":"claude-opus-5-5","displayName":"Default (recommended)","description":"Opus 5.5 · Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"opus","resolvedModel":"claude-opus-5-5","displayName":"Opus 5.5","description":"For complex work and everyday tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"fable","resolvedModel":"claude-fable-5-1","displayName":"Fable 5.1","description":"For your toughest challenges","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"sonnet","resolvedModel":"claude-sonnet-5-5","displayName":"Sonnet 5.5","description":"Most efficient for simpler tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"haiku","resolvedModel":"claude-haiku-5-5","displayName":"Haiku 5.5","description":"Fastest for quick answers","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-haiku-4-5-20251001","resolvedModel":"claude-haiku-4-5-20251001","displayName":"Haiku 4.5","description":"Fastest for quick answers"},{"value":"claude-sonnet-5","resolvedModel":"claude-sonnet-5","displayName":"Sonnet 5","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-5","resolvedModel":"claude-opus-5","displayName":"Opus 5","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-fable-5","resolvedModel":"claude-fable-5","displayName":"Fable 5","description":"Most capable for your hardest and longest-running tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-8","resolvedModel":"claude-opus-4-8","displayName":"Opus 4.8","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsFastMode":true,"supportsAutoMode":true},{"value":"claude-opus-4-7","resolvedModel":"claude-opus-4-7","displayName":"Opus 4.7","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","xhigh","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-opus-4-6","resolvedModel":"claude-opus-4-6","displayName":"Opus 4.6","description":"Best for everyday, complex tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true},{"value":"claude-sonnet-4-6","resolvedModel":"claude-sonnet-4-6","displayName":"Sonnet 4.6","description":"Efficient for routine tasks","supportsEffort":true,"supportedEffortLevels":["low","medium","high","max"],"supportsAdaptiveThinking":true,"supportsAutoMode":true}],"account":{"email":"[redacted]","organization":"[redacted]'s Organization","subscriptionType":"Claude Max","apiProvider":"firstParty"},"pid":12875,"claude_code_version":"2.1.296","current_permission_mode":"bypassPermissions","feedback_mode":{"kind":"post"},"analytics_disabled":false,"remote_control_auto_enable":false,"remote_control_auto_connect_default":false,"remote_control_available":true,"remote_control_auto_on_by_default":false,"ide_rc_auto_enable_gate":true,"fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","session_state":"idle","capabilities":["ui_surface_v1"]},"pending_permission_requests":[],"pending_user_dialog_requests":[]}}} {"dir":"send","msg":{"message":{"content":"Without using any tools, count from one to twenty in words, separated by spaces.","role":"user"},"parent_tool_use_id":null,"session_id":"","type":"user"}} -{"dir":"recv","msg":{"type":"system","subtype":"init","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestTextDeltas177824522/001","session_id":"573097cb-f644-48a4-88ae-098abfe0c0b9","tools":["Task","Artifact","ArtifactComments","ArtifactData","Bash","CronCreate","CronDelete","CronList","DesignSync","Edit","EnterWorktree","ExitWorktree","ListAgents","LSP","Monitor","NotebookEdit","PushNotification","Read","RemoteTrigger","ReportFindings","ScheduleWakeup","SendMessage","Skill","TaskStop","ToolSearch","WebFetch","WebSearch","Workflow","Write"],"mcp_servers":[{"name":"claude.ai Claude Docs","status":"pending","source":"claudeai"},{"name":"claude.ai Heliosian","status":"pending","source":"claudeai"},{"name":"claude.ai Fastmail","status":"pending","source":"claudeai"},{"name":"claude.ai Google Calendar","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Gmail","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Google Drive","status":"needs-auth","source":"claudeai"}],"model":"claude-sonnet-5-5","permissionMode":"bypassPermissions","slash_commands":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","advisor","agents","auto-mode-setup","autocompact","clear","color","compact","config","output-style","context","effort","fast","focus","heapdump","init","mcp","import","model","__remote-workflow","workflow-launch-exec","reload-plugins","reload-skills","rename","ultrareview","security-review","usage-credits","extra-usage","usage","insights","recap","skill-doctor","goal","design-consent","design-revoke","list-agents","team-onboarding","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"terminal_slash_commands":["doctor","color","focus","reload-plugins"],"apiKeySource":"none","claude_code_version":"2.1.296","output_style":"default","agents":["claude","claude-code-guide","Explore","general-purpose","Plan","statusline-setup"],"skills":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"plugins":[{"name":"clangd-lsp","path":"/Users/flamingcow/.claude/plugins/cache/claude-plugins-official/clangd-lsp/1.0.0","source":"clangd-lsp@claude-plugins-official","version":"1.0.0"},{"name":"cc-plugin-agents-md","path":"builtin","source":"cc-plugin-agents-md@builtin"},{"name":"cc-plugin-telemetry","path":"builtin","source":"cc-plugin-telemetry@builtin"},{"name":"cc-plugin-plugin-authoring","path":"builtin","source":"cc-plugin-plugin-authoring@builtin"}],"capabilities":["interrupt_receipt_v1","interrupt_cancel_queued_v1","interrupt_send_now_v1","msg_lifecycle_v1","request_marker_lists_v1","sdk_mcp_tools_list_changed","sdk_mcp_manifests","mcp_read_resource_v1","mcp_tool_ui_meta_v1","ui_surface_v1"],"analytics_disabled":false,"product_feedback_disabled":false,"uuid":"239cfe28-1b5a-4e23-a0ff-f25dba8e68a2","memory_paths":{"auto":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestTextDeltas177824522-001/memory/"},"scratchpad_path":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestTextDeltas177824522-001/573097cb-f644-48a4-88ae-098abfe0c0b9/scratchpad","messaging_socket_path":"/tmp/cc-socks/11244.sock","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","per_turn_effort_active":true,"view_mode":"default"}} -{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"573097cb-f644-48a4-88ae-098abfe0c0b9","uuid":"05e057dd-d312-4566-8ac8-3dde538a274c"}} -{"dir":"recv","msg":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed","resetsAt":1792054200,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false,"unifiedWindows":{"five_hour":{"utilization":0.04,"resetsAt":1792054200},"seven_day":{"utilization":0.35,"resetsAt":1792270800}}},"uuid":"3ca84819-b590-458b-84ef-b961e27fb4a1","session_id":"573097cb-f644-48a4-88ae-098abfe0c0b9"}} -{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3P8QR1k1aiJV7z8HYGd","type":"message","role":"assistant","content":[{"type":"text","text":"one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty"}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":15240,"cache_read_input_tokens":22367,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15240},"output_tokens":8,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"573097cb-f644-48a4-88ae-098abfe0c0b9","uuid":"11ecf320-f64a-4fe9-8bb4-7b9400a2c9f9","timestamp":"2026-10-15T04:21:17.106Z","request_id":"req_011Cg3P8QAeBmAsfBrFrVGYA"}} -{"dir":"recv","msg":{"duration_api_ms":3115,"stop_reason":"end_turn","session_id":"573097cb-f644-48a4-88ae-098abfe0c0b9","total_cost_usd":0.0638585,"usage":{"input_tokens":2,"cache_creation_input_tokens":15240,"cache_read_input_tokens":22367,"output_tokens":53,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":15240,"ephemeral_5m_input_tokens":0},"inference_geo":"global","iterations":[{"input_tokens":2,"output_tokens":53,"cache_read_input_tokens":22367,"cache_creation_input_tokens":15240,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15240},"type":"message"}],"speed":"standard","fallback_credit":null},"modelUsage":{"claude-haiku-5-5":{"inputTokens":1188,"outputTokens":18,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.00012780000000000002,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-haiku-5-5","provider":"firstParty","costBasis":"list"},"claude-sonnet-5-5":{"inputTokens":2,"outputTokens":53,"cacheReadInputTokens":22367,"cacheCreationInputTokens":15240,"webSearchRequests":0,"costUSD":0.0637307,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-sonnet-5-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"safety_stops":0,"is_error":false,"num_turns":1,"subtype":"success","api_error_status":null,"result":"one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty","ttft_ms":2538,"type":"result","duration_ms":2573,"uuid":"46af2cc4-c79d-43e8-beb9-4c38f7016785","ttft_stream_ms":1930,"time_to_request_ms":25,"first_content_frame_ms":1930,"queued_turn_count":0,"result_index":0}} +{"dir":"recv","msg":{"type":"system","subtype":"init","cwd":"/private/var/folders/r4/m529kfnd537_x0xfbgcgqfs40000gn/T/TestTextDeltas101965551/001","session_id":"01471592-8eb7-4530-89ec-c22ff173d226","tools":["Task","Artifact","ArtifactComments","ArtifactData","Bash","CronCreate","CronDelete","CronList","DesignSync","Edit","EnterWorktree","ExitWorktree","ListAgents","LSP","Monitor","NotebookEdit","PushNotification","Read","RemoteTrigger","ReportFindings","ScheduleWakeup","SendMessage","Skill","TaskStop","ToolSearch","WebFetch","WebSearch","Workflow","Write"],"mcp_servers":[{"name":"claude.ai Claude Docs","status":"pending","source":"claudeai"},{"name":"claude.ai Heliosian","status":"pending","source":"claudeai"},{"name":"claude.ai Fastmail","status":"pending","source":"claudeai"},{"name":"claude.ai Google Calendar","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Gmail","status":"needs-auth","source":"claudeai"},{"name":"claude.ai Google Drive","status":"needs-auth","source":"claudeai"}],"model":"claude-sonnet-5-5","permissionMode":"bypassPermissions","slash_commands":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","advisor","agents","auto-mode-setup","autocompact","clear","color","compact","config","output-style","context","effort","fast","focus","heapdump","init","mcp","import","model","__remote-workflow","workflow-launch-exec","reload-plugins","reload-skills","rename","ultrareview","security-review","usage-credits","extra-usage","usage","insights","recap","skill-doctor","goal","design-consent","design-revoke","list-agents","team-onboarding","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"terminal_slash_commands":["doctor","color","focus","reload-plugins"],"apiKeySource":"none","claude_code_version":"2.1.296","output_style":"default","agents":["claude","claude-code-guide","Explore","general-purpose","Plan","statusline-setup"],"skills":["deep-research","design","slides","design-sync","dataviz","artifact-diagramming","artifact-capabilities","update-config","verify","debug","code-review","simplify","batch","fewer-permission-prompts","doctor","loop","schedule","claude-api","workflow-authoring","run","run-skill-generator","plugin-authoring","anthropic-skills:docs","anthropic-skills:docx","anthropic-skills:google-workspace","anthropic-skills:import-memory","anthropic-skills:morning","anthropic-skills:pdf","anthropic-skills:pptx","anthropic-skills:skill-creator","anthropic-skills:xlsx"],"plugins":[{"name":"clangd-lsp","path":"/Users/flamingcow/.claude/plugins/cache/claude-plugins-official/clangd-lsp/1.0.0","source":"clangd-lsp@claude-plugins-official","version":"1.0.0"},{"name":"cc-plugin-agents-md","path":"builtin","source":"cc-plugin-agents-md@builtin"},{"name":"cc-plugin-telemetry","path":"builtin","source":"cc-plugin-telemetry@builtin"},{"name":"cc-plugin-plugin-authoring","path":"builtin","source":"cc-plugin-plugin-authoring@builtin"}],"capabilities":["interrupt_receipt_v1","interrupt_cancel_queued_v1","interrupt_send_now_v1","msg_lifecycle_v1","request_marker_lists_v1","sdk_mcp_tools_list_changed","sdk_mcp_manifests","mcp_read_resource_v1","mcp_tool_ui_meta_v1","ui_surface_v1"],"analytics_disabled":false,"product_feedback_disabled":false,"uuid":"fd5c32ae-61b7-4925-87ca-921e15bedb6c","memory_paths":{"auto":"/Users/flamingcow/.claude/projects/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestTextDeltas101965551-001/memory/"},"scratchpad_path":"/private/tmp/claude-501/-private-var-folders-r4-m529kfnd537-x0xfbgcgqfs40000gn-T-TestTextDeltas101965551-001/01471592-8eb7-4530-89ec-c22ff173d226/scratchpad","messaging_socket_path":"/tmp/cc-socks/12875.sock","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","per_turn_effort_active":true,"view_mode":"default"}} +{"dir":"recv","msg":{"type":"system","subtype":"status","status":"requesting","session_id":"01471592-8eb7-4530-89ec-c22ff173d226","uuid":"e1694db2-de78-4135-be64-8efc4f6ba962"}} +{"dir":"recv","msg":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed","resetsAt":1792054200,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false,"unifiedWindows":{"five_hour":{"utilization":0.05,"resetsAt":1792054200},"seven_day":{"utilization":0.35,"resetsAt":1792270800}}},"uuid":"8284de47-e2fa-4a89-a68a-d8384c9e9888","session_id":"01471592-8eb7-4530-89ec-c22ff173d226"}} +{"dir":"recv","msg":{"type":"assistant","message":{"model":"claude-sonnet-5-5","id":"msg_011Cg3PDv5McKBQ7hB9ob9U5","type":"message","role":"assistant","content":[{"type":"text","text":"one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty"}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":15239,"cache_read_input_tokens":22367,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15239},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"input_transformations":[],"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"01471592-8eb7-4530-89ec-c22ff173d226","uuid":"0d32072f-9496-4f0c-bd38-19d4cd3e1c99","timestamp":"2026-10-15T04:22:31.259Z","request_id":"req_011Cg3PDuojoogPsnD1EehDH"}} +{"dir":"recv","msg":{"duration_api_ms":2475,"stop_reason":"end_turn","session_id":"01471592-8eb7-4530-89ec-c22ff173d226","total_cost_usd":0.0638545,"usage":{"input_tokens":2,"cache_creation_input_tokens":15239,"cache_read_input_tokens":22367,"output_tokens":53,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":15239,"ephemeral_5m_input_tokens":0},"inference_geo":"global","iterations":[{"input_tokens":2,"output_tokens":53,"cache_read_input_tokens":22367,"cache_creation_input_tokens":15239,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":15239},"type":"message"}],"speed":"standard","fallback_credit":null},"modelUsage":{"claude-haiku-5-5":{"inputTokens":1188,"outputTokens":18,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.00012780000000000002,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-haiku-5-5","provider":"firstParty","costBasis":"list"},"claude-sonnet-5-5":{"inputTokens":2,"outputTokens":53,"cacheReadInputTokens":22367,"cacheCreationInputTokens":15239,"webSearchRequests":0,"costUSD":0.0637267,"contextWindow":1000000,"maxOutputTokens":128000,"thinkingTokens":0,"canonicalModel":"claude-sonnet-5-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"safety_stops":0,"is_error":false,"num_turns":1,"subtype":"success","api_error_status":null,"result":"one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty","ttft_ms":1881,"type":"result","duration_ms":1913,"uuid":"b3ccd378-3156-4c84-a20b-5db0545a2f7a","ttft_stream_ms":1289,"time_to_request_ms":23,"first_content_frame_ms":1289,"queued_turn_count":0,"result_index":0}} diff --git a/internal/push/push.go b/internal/push/push.go new file mode 100644 index 0000000..4a9a4eb --- /dev/null +++ b/internal/push/push.go @@ -0,0 +1,251 @@ +package push + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "io" + "log/slog" + "net/http" + "strings" + "time" + + "github.com/SherClockHolmes/webpush-go" + + "g.fc.run/misc/byre/internal/api" + "g.fc.run/misc/byre/internal/store" +) + +type Message struct { + Title string `json:"title"` + Body string `json:"body"` + URL string `json:"url"` +} + +type Notifier struct { + store *store.Store + keys store.VAPIDKeys + window time.Duration + items chan api.InboxItem + done chan struct{} + exited chan struct{} +} + +func New(st *store.Store, window time.Duration) (*Notifier, error) { + ctx := context.Background() + keys, err := st.GetVAPIDKeys(ctx) + if errors.Is(err, store.ErrNotFound) { + priv, pub, err := webpush.GenerateVAPIDKeys() + if err != nil { + return nil, err + } + keys, err = st.InitVAPIDKeys(ctx, store.VAPIDKeys{Public: pub, Private: priv}) + if err != nil { + return nil, err + } + } else if err != nil { + return nil, err + } + + n := &Notifier{ + store: st, + keys: keys, + window: window, + items: make(chan api.InboxItem, 256), + done: make(chan struct{}), + exited: make(chan struct{}), + } + go n.run() + return n, nil +} + +func (n *Notifier) PublicKey() string { + return n.keys.Public +} + +func (n *Notifier) Close() { + close(n.done) + <-n.exited +} + +func (n *Notifier) Observe(ev api.Event) { + if ev.Kind != "inbox.created" { + return + } + + b, err := json.Marshal(ev.Payload) + if err != nil { + slog.Error("push: encode inbox item", "err", err) + return + } + item := api.InboxItem{} + err = json.Unmarshal(b, &item) + if err != nil { + slog.Error("push: decode inbox item", "err", err) + return + } + + select { + case n.items <- item: + default: + slog.Warn("push: queue full, dropping notification", "item", item.Id) + } +} + +func (n *Notifier) run() { + defer close(n.exited) + + pending := []api.InboxItem{} + var flush <-chan time.Time + for { + select { + case item := <-n.items: + pending = append(pending, item) + if flush == nil { + flush = time.After(n.window) + } + case <-flush: + n.send(pending) + pending = []api.InboxItem{} + flush = nil + case <-n.done: + return + } + } +} + +func Wants(p api.NotificationPrefs, item api.InboxItem) bool { + switch item.Kind { + case api.Question: + if item.Blocking { + return p.BlockingQuestions + } + return p.Questions + case api.Report: + return p.Reports + case api.SessionError: + return p.Errors + case api.RateLimited: + return p.RateLimits + } + return false +} + +func (n *Notifier) send(items []api.InboxItem) { + ctx := context.Background() + targets, err := n.store.PushTargets(ctx) + if err != nil { + slog.Error("push: list subscriptions", "err", err) + return + } + + titles := map[string]string{} + for _, item := range items { + if _, ok := titles[item.TaskId]; ok { + continue + } + t, err := n.store.GetTask(ctx, item.TaskId) + if err != nil { + slog.Error("push: get task", "task", item.TaskId, "err", err) + return + } + titles[item.TaskId] = t.Title + } + + for _, target := range targets { + wanted := []api.InboxItem{} + for _, item := range items { + if Wants(target.Prefs, item) { + wanted = append(wanted, item) + } + } + if len(wanted) == 0 { + continue + } + n.deliver(ctx, target.Subscription, Compose(wanted, titles), urgency(wanted)) + } +} + +func urgency(items []api.InboxItem) webpush.Urgency { + for _, item := range items { + if item.Blocking { + return webpush.UrgencyHigh + } + } + return webpush.UrgencyNormal +} + +func Compose(items []api.InboxItem, titles map[string]string) Message { + first := items[0] + url := "/#/task/" + first.TaskId + if len(items) == 1 { + return Message{Title: "byre · " + titles[first.TaskId], Body: itemText(first), URL: url} + } + + lines := []string{} + for _, item := range items { + lines = append(lines, titles[item.TaskId]+": "+itemText(item)) + } + return Message{Title: fmt.Sprintf("byre · %d new inbox items", len(items)), Body: strings.Join(lines, "\n"), URL: url} +} + +func itemText(item api.InboxItem) string { + text := "" + switch item.Kind { + case api.Question: + text, _ = item.Payload["question"].(string) + case api.Report: + text, _ = item.Payload["text"].(string) + case api.SessionError: + e, _ := item.Payload["error"].(string) + text = "Error: " + e + case api.RateLimited: + text = "Rate limited" + } + text, _, _ = strings.Cut(strings.TrimSpace(text), "\n") + runes := []rune(text) + if len(runes) > 200 { + text = string(runes[:199]) + "…" + } + return text +} + +func (n *Notifier) deliver(ctx context.Context, sub store.PushSubscription, msg Message, u webpush.Urgency) { + payload, err := json.Marshal(msg) + if err != nil { + slog.Error("push: encode message", "err", err) + return + } + + ctx, cancel := context.WithTimeout(ctx, 15*time.Second) + defer cancel() + resp, err := webpush.SendNotificationWithContext(ctx, payload, &webpush.Subscription{ + Endpoint: sub.Endpoint, + Keys: webpush.Keys{P256dh: sub.P256dh, Auth: sub.Auth}, + }, &webpush.Options{ + Subscriber: sub.Subscriber, + TTL: 24 * 60 * 60, + Urgency: u, + VAPIDPublicKey: n.keys.Public, + VAPIDPrivateKey: n.keys.Private, + }) + if err != nil { + slog.Warn("push: send", "user", sub.UserLogin, "err", err) + return + } + defer resp.Body.Close() + + if resp.StatusCode == http.StatusNotFound || resp.StatusCode == http.StatusGone { + slog.Info("push: subscription expired", "user", sub.UserLogin, "status", resp.StatusCode) + err = n.store.RemovePushSubscription(ctx, sub.Endpoint, sub.UserLogin, "byre") + if err != nil { + slog.Error("push: remove subscription", "err", err) + } + return + } + if resp.StatusCode >= 300 { + body, _ := io.ReadAll(io.LimitReader(resp.Body, 4096)) + slog.Warn("push: rejected", "user", sub.UserLogin, "status", resp.StatusCode, "body", string(body)) + } +} diff --git a/internal/push/push_test.go b/internal/push/push_test.go new file mode 100644 index 0000000..5637475 --- /dev/null +++ b/internal/push/push_test.go @@ -0,0 +1,170 @@ +package push_test + +import ( + "context" + "crypto/ecdh" + "crypto/rand" + "encoding/base64" + "net/http" + "net/http/httptest" + "path/filepath" + "strings" + "testing" + "time" + + "g.fc.run/misc/byre/internal/api" + "g.fc.run/misc/byre/internal/push" + "g.fc.run/misc/byre/internal/store" +) + +type received struct { + urgency string + auth string +} + +func TestBurstIsOneNotification(t *testing.T) { + ctx := context.Background() + var notifier *push.Notifier + st, err := store.Open(filepath.Join(t.TempDir(), "byre.db"), func(ev api.Event) { notifier.Observe(ev) }) + if err != nil { + t.Fatalf("open store: %v", err) + } + t.Cleanup(func() { st.Close() }) + + notifier, err = push.New(st, 100*time.Millisecond) + if err != nil { + t.Fatalf("new notifier: %v", err) + } + t.Cleanup(notifier.Close) + + got := make(chan received, 10) + endpoint := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + got <- received{urgency: r.Header.Get("Urgency"), auth: r.Header.Get("Authorization")} + w.WriteHeader(http.StatusCreated) + })) + t.Cleanup(endpoint.Close) + gone := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusGone) + })) + t.Cleanup(gone.Close) + + now := time.Now().UTC() + _, err = st.EnsureUser(ctx, "alice", "Alice") + if err != nil { + t.Fatalf("ensure user: %v", err) + } + err = st.CreateProject(ctx, api.Project{Id: "p1", Name: "demo", RepoPath: "/nonexistent", DefaultBranch: "main", Remote: "none", CreatedBy: "alice", CreatedAt: now}) + if err != nil { + t.Fatalf("create project: %v", err) + } + err = st.CreateTask(ctx, api.Task{Id: "t1", ProjectId: "p1", Title: "Fix login", Branch: "b", WorktreePath: "/nonexistent", BaseRef: "x", Status: api.TaskStatusActive, CreatedBy: "alice", CreatedAt: now}) + if err != nil { + t.Fatalf("create task: %v", err) + } + err = st.CreateSession(ctx, api.AgentSession{Id: "s1", TaskId: "t1", Vendor: api.Claude, VendorSessionId: "s1", State: api.AgentSessionStateIdle, Role: api.Implementer, CreatedBy: "alice", CreatedAt: now}, "p1") + if err != nil { + t.Fatalf("create session: %v", err) + } + + for _, url := range []string{endpoint.URL, gone.URL} { + err = st.AddPushSubscription(ctx, store.PushSubscription{Endpoint: url, UserLogin: "alice", P256dh: clientKey(t), Auth: secret(t), Subscriber: "https://byre.example"}) + if err != nil { + t.Fatalf("add subscription: %v", err) + } + } + + create := func(id string, kind api.InboxItemKind, blocking bool, payload map[string]any) { + t.Helper() + err := st.CreateInboxItem(ctx, api.InboxItem{Id: id, ProjectId: "p1", TaskId: "t1", AgentSessionId: "s1", ThreadId: id, + Kind: kind, Priority: api.Blocked, Blocking: blocking, Payload: payload, State: api.Open, CreatedAt: now}) + if err != nil { + t.Fatalf("create inbox item: %v", err) + } + } + + create("r1", api.Report, false, map[string]any{"text": "done"}) + expectNone(t, got) + + create("q1", api.Question, true, map[string]any{"question": "Which port?"}) + create("q2", api.Question, true, map[string]any{"question": "Which host?"}) + create("r2", api.Report, false, map[string]any{"text": "done"}) + + select { + case r := <-got: + if r.urgency != "high" || !strings.HasPrefix(r.auth, "vapid t=") { + t.Fatalf("unexpected push request %+v", r) + } + case <-time.After(5 * time.Second): + t.Fatalf("no push delivered") + } + expectNone(t, got) + + targets, err := st.PushTargets(ctx) + if err != nil { + t.Fatalf("push targets: %v", err) + } + if len(targets) != 1 || targets[0].Subscription.Endpoint != endpoint.URL { + t.Fatalf("expired subscription not removed: %+v", targets) + } +} + +func TestCompose(t *testing.T) { + titles := map[string]string{"t1": "Fix login", "t2": "Add search"} + one := push.Compose([]api.InboxItem{ + {TaskId: "t1", Kind: api.Question, Payload: map[string]any{"question": "Which port?\nmore"}}, + }, titles) + if one != (push.Message{Title: "byre · Fix login", Body: "Which port?", URL: "/#/task/t1"}) { + t.Fatalf("unexpected single message %+v", one) + } + + burst := push.Compose([]api.InboxItem{ + {TaskId: "t2", Kind: api.Question, Payload: map[string]any{"question": "Which index?"}}, + {TaskId: "t1", Kind: api.SessionError, Payload: map[string]any{"error": "exit 1"}}, + }, titles) + want := push.Message{Title: "byre · 2 new inbox items", Body: "Add search: Which index?\nFix login: Error: exit 1", URL: "/#/task/t2"} + if burst != want { + t.Fatalf("unexpected burst message %+v", burst) + } +} + +func TestWantsDefaults(t *testing.T) { + prefs := api.NotificationPrefs{BlockingQuestions: true} + cases := []struct { + item api.InboxItem + want bool + }{ + {api.InboxItem{Kind: api.Question, Blocking: true}, true}, + {api.InboxItem{Kind: api.Question}, false}, + {api.InboxItem{Kind: api.Report}, false}, + {api.InboxItem{Kind: api.SessionError, Blocking: true}, false}, + {api.InboxItem{Kind: api.RateLimited}, false}, + } + for _, c := range cases { + if push.Wants(prefs, c.item) != c.want { + t.Fatalf("wants %+v: got %v", c.item, !c.want) + } + } +} + +func expectNone(t *testing.T, got chan received) { + t.Helper() + select { + case r := <-got: + t.Fatalf("unexpected push %+v", r) + case <-time.After(400 * time.Millisecond): + } +} + +func clientKey(t *testing.T) string { + k, err := ecdh.P256().GenerateKey(rand.Reader) + if err != nil { + t.Fatalf("generate key: %v", err) + } + return base64.RawURLEncoding.EncodeToString(k.PublicKey().Bytes()) +} + +func secret(t *testing.T) string { + b := make([]byte, 16) + rand.Read(b) + return base64.RawURLEncoding.EncodeToString(b) +} diff --git a/internal/server/push.go b/internal/server/push.go new file mode 100644 index 0000000..444dce2 --- /dev/null +++ b/internal/server/push.go @@ -0,0 +1,63 @@ +package server + +import ( + "errors" + "net/http" + "net/url" + + "g.fc.run/misc/byre/internal/api" + "g.fc.run/misc/byre/internal/store" +) + +func (s *Server) UpdateNotificationPrefs(w http.ResponseWriter, r *http.Request) { + req := api.NotificationPrefs{} + if !readJSON(w, r, &req) { + return + } + + u, err := s.store.UpdateNotificationPrefs(r.Context(), actor(r), req) + if err != nil { + writeStoreError(w, err) + return + } + writeJSON(w, http.StatusOK, u) +} + +func (s *Server) AddPushSubscription(w http.ResponseWriter, r *http.Request) { + req := api.PushSubscription{} + if !readJSON(w, r, &req) { + return + } + + endpoint, err := url.Parse(req.Endpoint) + if err != nil || endpoint.Scheme != "https" || endpoint.Host == "" || req.P256dh == "" || req.Auth == "" { + writeError(w, http.StatusBadRequest, errors.New("an https endpoint, p256dh and auth are required")) + return + } + + err = s.store.AddPushSubscription(r.Context(), store.PushSubscription{ + Endpoint: req.Endpoint, + UserLogin: actor(r), + P256dh: req.P256dh, + Auth: req.Auth, + Subscriber: "https://" + r.Host, + }) + if err != nil { + writeStoreError(w, err) + return + } + w.WriteHeader(http.StatusNoContent) +} + +func (s *Server) RemovePushSubscription(w http.ResponseWriter, r *http.Request, params api.RemovePushSubscriptionParams) { + err := s.store.RemovePushSubscription(r.Context(), params.Endpoint, actor(r), actor(r)) + if err != nil { + writeStoreError(w, err) + return + } + w.WriteHeader(http.StatusNoContent) +} + +func (s *Server) GetPushKey(w http.ResponseWriter, r *http.Request) { + writeJSON(w, http.StatusOK, api.PushKey{PublicKey: s.notifier.PublicKey()}) +} diff --git a/internal/server/server.go b/internal/server/server.go index 350d3d9..ed369a7 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -18,12 +18,14 @@ import ( "g.fc.run/misc/byre/internal/agents" "g.fc.run/misc/byre/internal/api" "g.fc.run/misc/byre/internal/git" + "g.fc.run/misc/byre/internal/push" "g.fc.run/misc/byre/internal/store" ) type Server struct { store *store.Store agents *agents.Manager + notifier *push.Notifier hub *hub startedAt time.Time spa fs.FS @@ -47,14 +49,21 @@ func New(dataDir string, spa fs.FS) (*Server, error) { users: map[string]string{}, } - s.store, err = store.Open(filepath.Join(dataDir, "byre.db"), s.hub.publish) + s.store, err = store.Open(filepath.Join(dataDir, "byre.db"), s.publish) if err != nil { return nil, err } + s.notifier, err = push.New(s.store, pushWindow) + if err != nil { + s.store.Close() + return nil, fmt.Errorf("start push notifier: %w", err) + } + s.agents = agents.New(s.store, agents.DefaultLimits, filepath.Join(dataDir, "worktrees")) err = s.agents.Recover(context.Background()) if err != nil { + s.notifier.Close() s.store.Close() return nil, fmt.Errorf("recover sessions: %w", err) } @@ -62,13 +71,24 @@ func New(dataDir string, spa fs.FS) (*Server, error) { return s, nil } +const pushWindow = 3 * time.Second + +func (s *Server) publish(ev api.Event) { + s.hub.publish(ev) + s.notifier.Observe(ev) +} + func (s *Server) Close() error { s.agents.Close() + s.notifier.Close() return s.store.Close() } func (s *Server) Handler() http.Handler { mux := http.NewServeMux() + mux.HandleFunc("GET /sw.js", func(w http.ResponseWriter, r *http.Request) { + http.ServeFileFS(w, r, s.spa, "dist/sw.js") + }) api.HandlerWithOptions(s, api.StdHTTPServerOptions{ BaseRouter: mux, Middlewares: []api.MiddlewareFunc{s.identify}, diff --git a/internal/server/server_test.go b/internal/server/server_test.go index c37223d..d568817 100644 --- a/internal/server/server_test.go +++ b/internal/server/server_test.go @@ -116,20 +116,22 @@ func TestServesEmbeddedSPA(t *testing.T) { t.Cleanup(hs.Close) for path, contentType := range map[string]string{ - "/": "text/html", - "/style.css": "text/css", - "/dist/app.js": "text/javascript", - "/dist/app.js.map": "", - "/src/app.ts": "", - "/dist/inbox.js": "text/javascript", - "/dist/api.gen.js": "text/javascript", - "/dist/tasks.js": "text/javascript", - "/dist/navbar.js": "text/javascript", - "/dist/panes.js": "text/javascript", - "/dist/task.js": "text/javascript", - "/dist/state.js": "text/javascript", - "/dist/dom.js": "text/javascript", - "/dist/api.js": "text/javascript", + "/": "text/html", + "/style.css": "text/css", + "/dist/app.js": "text/javascript", + "/dist/app.js.map": "", + "/src/app.ts": "", + "/dist/inbox.js": "text/javascript", + "/dist/api.gen.js": "text/javascript", + "/dist/tasks.js": "text/javascript", + "/dist/navbar.js": "text/javascript", + "/dist/panes.js": "text/javascript", + "/dist/task.js": "text/javascript", + "/dist/state.js": "text/javascript", + "/dist/dom.js": "text/javascript", + "/dist/api.js": "text/javascript", + "/dist/settings.js": "text/javascript", + "/sw.js": "text/javascript", "/fonts/atkinson-hyperlegible-mono-latin-wght-normal.woff2": "font/woff2", "/fonts/LICENSE": "", } { @@ -167,6 +169,40 @@ func TestMe(t *testing.T) { } } +func TestNotificationSettings(t *testing.T) { + h := newHarness(t) + + me := api.User{} + h.do("GET", "/api/me", nil, &me) + if me.NotificationPrefs != (api.NotificationPrefs{BlockingQuestions: true}) { + t.Fatalf("unexpected default prefs %+v", me.NotificationPrefs) + } + + code := h.do("PUT", "/api/me/notifications", api.NotificationPrefs{BlockingQuestions: true, Reports: true}, &me) + if code != http.StatusOK || me.NotificationPrefs != (api.NotificationPrefs{BlockingQuestions: true, Reports: true}) { + t.Fatalf("update prefs: %d %+v", code, me.NotificationPrefs) + } + + key := api.PushKey{} + h.do("GET", "/api/push/key", nil, &key) + if len(key.PublicKey) < 80 { + t.Fatalf("unexpected vapid key %q", key.PublicKey) + } + + code = h.do("POST", "/api/me/push-subscriptions", api.PushSubscription{Endpoint: "http://push.example/x", P256dh: "k", Auth: "a"}, nil) + if code != http.StatusBadRequest { + t.Fatalf("want 400 for a non-https endpoint, got %d", code) + } + code = h.do("POST", "/api/me/push-subscriptions", api.PushSubscription{Endpoint: "https://push.example/x", P256dh: "k", Auth: "a"}, nil) + if code != http.StatusNoContent { + t.Fatalf("subscribe: %d", code) + } + code = h.do("DELETE", "/api/me/push-subscriptions?endpoint=https%3A%2F%2Fpush.example%2Fx", nil, nil) + if code != http.StatusNoContent { + t.Fatalf("unsubscribe: %d", code) + } +} + func TestProjectAndTaskLifecycle(t *testing.T) { h := newHarness(t) p := h.createProject("demo") diff --git a/internal/store/push.go b/internal/store/push.go new file mode 100644 index 0000000..9825e59 --- /dev/null +++ b/internal/store/push.go @@ -0,0 +1,124 @@ +package store + +import ( + "context" + "database/sql" + "encoding/json" + "errors" + + "g.fc.run/misc/byre/internal/api" +) + +func (s *Store) UpdateNotificationPrefs(ctx context.Context, login string, prefs api.NotificationPrefs) (api.User, error) { + b, err := json.Marshal(prefs) + if err != nil { + return api.User{}, err + } + err = s.write(ctx, func(tx *sql.Tx, emit emitFunc) error { + _, err := tx.ExecContext(ctx, `UPDATE users SET notification_prefs = ? WHERE login = ?`, string(b), login) + if err != nil { + return err + } + return emit(api.Event{Kind: "user.updated", Actor: login, Payload: map[string]any{"login": login}}) + }) + if err != nil { + return api.User{}, err + } + return s.GetUser(ctx, login) +} + +type VAPIDKeys struct { + Public string + Private string +} + +func (s *Store) GetVAPIDKeys(ctx context.Context) (VAPIDKeys, error) { + k := VAPIDKeys{} + err := s.db.QueryRowContext(ctx, `SELECT public_key, private_key FROM vapid_keys WHERE id = 1`).Scan(&k.Public, &k.Private) + if errors.Is(err, sql.ErrNoRows) { + return k, ErrNotFound + } + return k, err +} + +func (s *Store) InitVAPIDKeys(ctx context.Context, k VAPIDKeys) (VAPIDKeys, error) { + err := s.write(ctx, func(tx *sql.Tx, emit emitFunc) error { + _, err := tx.ExecContext(ctx, `INSERT INTO vapid_keys (id, public_key, private_key) VALUES (1, ?, ?) ON CONFLICT (id) DO NOTHING`, k.Public, k.Private) + return err + }) + if err != nil { + return VAPIDKeys{}, err + } + return s.GetVAPIDKeys(ctx) +} + +type PushSubscription struct { + Endpoint string + UserLogin string + P256dh string + Auth string + Subscriber string +} + +func (s *Store) AddPushSubscription(ctx context.Context, sub PushSubscription) error { + return s.write(ctx, func(tx *sql.Tx, emit emitFunc) error { + _, err := tx.ExecContext(ctx, ` + INSERT INTO push_subscriptions (endpoint, user_login, p256dh, auth, subscriber, created_at) VALUES (?, ?, ?, ?, ?, ?) + ON CONFLICT (endpoint) DO UPDATE SET user_login = excluded.user_login, p256dh = excluded.p256dh, auth = excluded.auth, + subscriber = excluded.subscriber + `, sub.Endpoint, sub.UserLogin, sub.P256dh, sub.Auth, sub.Subscriber, now()) + if err != nil { + return err + } + return emit(api.Event{Kind: "push.subscribed", Actor: sub.UserLogin, Payload: map[string]any{"login": sub.UserLogin}}) + }) +} + +func (s *Store) RemovePushSubscription(ctx context.Context, endpoint, login, actor string) error { + return s.write(ctx, func(tx *sql.Tx, emit emitFunc) error { + res, err := tx.ExecContext(ctx, `DELETE FROM push_subscriptions WHERE endpoint = ? AND user_login = ?`, endpoint, login) + if err != nil { + return err + } + n, err := res.RowsAffected() + if err != nil { + return err + } + if n == 0 { + return nil + } + return emit(api.Event{Kind: "push.unsubscribed", Actor: actor, Payload: map[string]any{"login": login}}) + }) +} + +type PushTarget struct { + Subscription PushSubscription + Prefs api.NotificationPrefs +} + +func (s *Store) PushTargets(ctx context.Context) ([]PushTarget, error) { + rows, err := s.db.QueryContext(ctx, ` + SELECT p.endpoint, p.user_login, p.p256dh, p.auth, p.subscriber, u.notification_prefs + FROM push_subscriptions p JOIN users u ON u.login = p.user_login ORDER BY p.created_at + `) + if err != nil { + return nil, err + } + defer rows.Close() + + targets := []PushTarget{} + for rows.Next() { + t := PushTarget{} + prefs := "" + err = rows.Scan(&t.Subscription.Endpoint, &t.Subscription.UserLogin, &t.Subscription.P256dh, &t.Subscription.Auth, &t.Subscription.Subscriber, &prefs) + if err != nil { + return nil, err + } + err = json.Unmarshal([]byte(prefs), &t.Prefs) + if err != nil { + return nil, err + } + targets = append(targets, t) + } + return targets, rows.Err() +} diff --git a/internal/store/store.go b/internal/store/store.go index 2ad3f8c..22180ce 100644 --- a/internal/store/store.go +++ b/internal/store/store.go @@ -161,6 +161,24 @@ DROP TABLE turn_queue; ALTER TABLE turn_queue_next RENAME TO turn_queue; `}, {"add-task-merge-title", ` ALTER TABLE tasks ADD COLUMN merge_title TEXT NOT NULL DEFAULT ''; +`}, {"add-web-push", ` +ALTER TABLE users ADD COLUMN notification_prefs TEXT NOT NULL + DEFAULT '{"blocking_questions":true,"questions":false,"reports":false,"errors":false,"rate_limits":false}'; + +CREATE TABLE vapid_keys ( + id INTEGER PRIMARY KEY CHECK (id = 1), + public_key TEXT NOT NULL, + private_key TEXT NOT NULL +); + +CREATE TABLE push_subscriptions ( + endpoint TEXT PRIMARY KEY, + user_login TEXT NOT NULL REFERENCES users(login), + p256dh TEXT NOT NULL, + auth TEXT NOT NULL, + subscriber TEXT NOT NULL, + created_at TEXT NOT NULL +); `}} type Store struct { @@ -314,11 +332,16 @@ func (s *Store) EnsureUser(ctx context.Context, login, displayName string) (api. func (s *Store) GetUser(ctx context.Context, login string) (api.User, error) { u := api.User{} - err := s.db.QueryRowContext(ctx, `SELECT login, display_name, git_name, git_email FROM users WHERE login = ?`, login). - Scan(&u.Login, &u.DisplayName, &u.GitName, &u.GitEmail) + prefs := "" + err := s.db.QueryRowContext(ctx, `SELECT login, display_name, git_name, git_email, notification_prefs FROM users WHERE login = ?`, login). + Scan(&u.Login, &u.DisplayName, &u.GitName, &u.GitEmail, &prefs) if errors.Is(err, sql.ErrNoRows) { return u, ErrNotFound } + if err != nil { + return u, err + } + err = json.Unmarshal([]byte(prefs), &u.NotificationPrefs) return u, err } diff --git a/web/dist/api.js b/web/dist/api.js index 18a4f40..26abfdb 100644 --- a/web/dist/api.js +++ b/web/dist/api.js @@ -33,6 +33,9 @@ export async function request(method, path, opts = {}) { init.body = JSON.stringify(opts.body); } const res = await fetch(url, init); + if (res.status === 204) { + return undefined; + } const data = await res.json(); if (!res.ok) { throw new ApiError(res.status, data.message); @@ -42,6 +45,7 @@ export async function request(method, path, opts = {}) { export const get = (path, opts) => request("get", path, opts); export const post = (path, opts) => request("post", path, opts); export const put = (path, opts) => request("put", path, opts); +export const del = (path, opts) => request("delete", path, opts); export function subscribe(after, onEvent, onState) { const source = new EventSource(`/api/events?after=${after}`); source.onopen = () => onState(true); diff --git a/web/dist/api.js.map b/web/dist/api.js.map index 8a4a4a7..385373a 100644 --- a/web/dist/api.js.map +++ b/web/dist/api.js.map @@ -1 +1 @@ -{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAwCA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACZ;IAArB,YAAqB,MAAc,EAAE,OAAe;QAClD,KAAK,CAAC,OAAO,CAAC,CAAC;QADI,WAAM,GAAN,MAAM,CAAQ;IAEnC,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAS,EACT,IAAO,EACP,OAA0B,EAAE;IAE5B,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;IAChE,IAAI,GAAG,GAAW,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE;QAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAC,EAAE,CAAC;QACzF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACnB,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;IAC3D,IAAI,IAAI,CAAC,IAAI,YAAY,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,0BAA0B,EAAE,CAAC;QAChF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAG,IAAyB,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,IAAwB,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,CAA6B,IAAO,EAAE,IAA4B,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACrH,MAAM,CAAC,MAAM,IAAI,GAAG,CAA8B,IAAO,EAAE,IAA6B,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACzH,MAAM,CAAC,MAAM,GAAG,GAAG,CAA6B,IAAO,EAAE,IAA4B,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAErH,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,OAAgC,EAAE,OAAqC;IAC9G,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,CAAC,SAAS,GAAG,CAAC,GAAyB,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAc,CAAC,CAAC;IAC7F,OAAO,MAAM,CAAC;AAChB,CAAC"} \ No newline at end of file +{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/web/dist/app.js b/web/dist/app.js index 2824b5d..3169c3a 100644 --- a/web/dist/app.js +++ b/web/dist/app.js @@ -53,6 +53,12 @@ async function main() { }); addEventListener("hashchange", route); route(); + if ("serviceWorker" in navigator) { + navigator.serviceWorker.onmessage = (e) => { + location.hash = new URL(e.data.open, location.origin).hash; + }; + await navigator.serviceWorker.register("/sw.js"); + } } main().catch((err) => { replace(document.body, h("pre", { class: "fatal" }, `byre failed to start: ${errorText(err)}`)); diff --git a/web/dist/app.js.map b/web/dist/app.js.map index a33ca7b..ceeb009 100644 --- a/web/dist/app.js.map +++ b/web/dist/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/web/dist/panes.js b/web/dist/panes.js index 00c6d92..71bd544 100644 --- a/web/dist/panes.js +++ b/web/dist/panes.js @@ -2,6 +2,7 @@ import { mountAdmin } from "./admin.js"; import { mountChanges } from "./changes.js"; import { h, replace } from "./dom.js"; import { mountInbox } from "./inbox.js"; +import { mountSettings } from "./settings.js"; import { mountTranscript } from "./task.js"; import { mountTasks } from "./tasks.js"; const views = { @@ -10,8 +11,9 @@ const views = { tasks: { label: "Tasks", mount: mountTasks }, inbox: { label: "Inbox", mount: mountInbox }, admin: { label: "Admin", mount: mountAdmin }, + settings: { label: "Settings", mount: mountSettings }, }; -const order = ["transcript", "changes", "tasks", "inbox", "admin"]; +const order = ["transcript", "changes", "tasks", "inbox", "admin", "settings"]; export class Pane { key; el; diff --git a/web/dist/panes.js.map b/web/dist/panes.js.map index 5aae241..d95aa3d 100644 --- a/web/dist/panes.js.map +++ b/web/dist/panes.js.map @@ -1 +1 @@ -{"version":3,"file":"panes.js","sourceRoot":"","sources":["../src/panes.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"panes.js","sourceRoot":"","sources":["../src/panes.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/web/dist/settings.js b/web/dist/settings.js new file mode 100644 index 0000000..01405dd --- /dev/null +++ b/web/dist/settings.js @@ -0,0 +1,114 @@ +import { del, get, post, put } from "./api.js"; +import { errorText, h, replace } from "./dom.js"; +import { on, state } from "./state.js"; +const kinds = [ + { key: "blocking_questions", label: "Blocking questions" }, + { key: "questions", label: "Non-blocking questions" }, + { key: "reports", label: "Turn summaries" }, + { key: "errors", label: "Session errors" }, + { key: "rate_limits", label: "Rate limits" }, +]; +export function mountSettings(root) { + const device = h("div", { class: "push-device" }); + const prefs = h("fieldset", { class: "push-prefs" }); + const renderPrefs = () => { + const me = state.me; + if (!me) { + replace(prefs); + return; + } + replace(prefs, h("legend", {}, "Notify me about"), ...kinds.map(({ key, label }) => { + const box = h("input", { type: "checkbox", checked: me.notification_prefs[key] }); + box.onchange = async () => { + try { + state.me = await put("/api/me/notifications", { body: { ...me.notification_prefs, [key]: box.checked } }); + } + catch (err) { + alert(errorText(err)); + } + renderPrefs(); + }; + return h("label", {}, box, " ", label); + })); + }; + let disposed = false; + const renderDevice = async () => { + const status = await deviceStatus(); + if (disposed) { + return; + } + if (status.kind === "unsupported") { + replace(device, h("p", { class: "hint" }, "This browser doesn't support web push.")); + return; + } + if (status.kind === "denied") { + replace(device, h("p", { class: "hint" }, "Notifications are blocked for this site in the browser's settings.")); + return; + } + const button = h("button", {}, status.sub ? "Turn off on this browser" : "Turn on for this browser"); + button.onclick = async () => { + button.disabled = true; + try { + if (status.sub) { + await disable(status.sub); + } + else { + await enable(status.reg); + } + } + catch (err) { + alert(errorText(err)); + } + await renderDevice(); + }; + replace(device, h("p", {}, status.sub ? "This browser receives notifications." : "This browser doesn't receive notifications."), button); + }; + replace(root, h("div", { class: "settings-view" }, h("h2", {}, "Notifications"), device, prefs)); + const off = on("me", renderPrefs); + renderPrefs(); + void renderDevice().catch((err) => replace(device, h("p", { class: "error-text" }, errorText(err)))); + return () => { + disposed = true; + off(); + }; +} +async function deviceStatus() { + if (!("serviceWorker" in navigator) || !("PushManager" in window) || !("Notification" in window)) { + return { kind: "unsupported" }; + } + if (Notification.permission === "denied") { + return { kind: "denied" }; + } + const reg = await navigator.serviceWorker.ready; + const sub = await reg.pushManager.getSubscription(); + if (sub) { + await register(sub); + } + return { kind: "ready", reg, sub }; +} +async function enable(reg) { + const permission = await Notification.requestPermission(); + if (permission !== "granted") { + return; + } + const key = await get("/api/push/key"); + const sub = await reg.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: base64url(key.public_key) }); + await register(sub); +} +async function disable(sub) { + await del("/api/me/push-subscriptions", { query: { endpoint: sub.endpoint } }); + await sub.unsubscribe(); +} +async function register(sub) { + const keys = sub.toJSON().keys ?? {}; + await post("/api/me/push-subscriptions", { body: { endpoint: sub.endpoint, p256dh: keys["p256dh"] ?? "", auth: keys["auth"] ?? "" } }); +} +function base64url(s) { + const bin = atob(s.replace(/-/g, "+").replace(/_/g, "/")); + const out = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; i++) { + out[i] = bin.charCodeAt(i); + } + return out; +} +//# sourceMappingURL=settings.js.map \ No newline at end of file diff --git a/web/dist/settings.js.map b/web/dist/settings.js.map new file mode 100644 index 0000000..b348adc --- /dev/null +++ b/web/dist/settings.js.map @@ -0,0 +1 @@ +{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/web/dist/sw.js b/web/dist/sw.js new file mode 100644 index 0000000..4951ca2 --- /dev/null +++ b/web/dist/sw.js @@ -0,0 +1,28 @@ +"use strict"; +const sw = self; +sw.addEventListener("install", () => { + void sw.skipWaiting(); +}); +sw.addEventListener("activate", (e) => { + e.waitUntil(sw.clients.claim()); +}); +sw.addEventListener("push", (e) => { + const msg = e.data?.json(); + e.waitUntil(sw.registration.showNotification(msg.title, { body: msg.body, data: { url: msg.url } })); +}); +sw.addEventListener("notificationclick", (e) => { + e.notification.close(); + const url = e.notification.data.url; + e.waitUntil(openTask(url)); +}); +async function openTask(url) { + const windows = await sw.clients.matchAll({ type: "window", includeUncontrolled: true }); + const win = windows[0]; + if (!win) { + await sw.clients.openWindow(url); + return; + } + win.postMessage({ open: url }); + await win.focus(); +} +//# sourceMappingURL=sw.js.map \ No newline at end of file diff --git a/web/dist/sw.js.map b/web/dist/sw.js.map new file mode 100644 index 0000000..f14d603 --- /dev/null +++ b/web/dist/sw.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sw.js","sourceRoot":"","sources":["../src/sw.ts"],"names":[],"mappings":";AAAA,MAAM,EAAE,GAAG,IAA2C,CAAC;AAIvD,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE;IAClC,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE;IACpC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;IAChC,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAiB,CAAC;IAC1C,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,YAAY,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AACvG,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,EAAE;IAC7C,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IACvB,MAAM,GAAG,GAAI,CAAC,CAAC,YAAY,CAAC,IAAwB,CAAC,GAAG,CAAC;IACzD,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,QAAQ,CAAC,GAAW;IACjC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;IACzF,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IACD,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/B,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;AACpB,CAAC"} \ No newline at end of file diff --git a/web/package.json b/web/package.json index 649a9a4..43b7c35 100644 --- a/web/package.json +++ b/web/package.json @@ -3,7 +3,7 @@ "private": true, "type": "module", "scripts": { - "generate": "openapi-typescript ../api/openapi.yaml --output src/api.gen.ts && rm -rf dist && tsc" + "generate": "openapi-typescript ../api/openapi.yaml --output src/api.gen.ts && rm -rf dist && tsc && tsc --project tsconfig.sw.json" }, "devDependencies": { "openapi-typescript": "^7.13.0", diff --git a/web/src/api.gen.ts b/web/src/api.gen.ts index 4644e1d..a185066 100644 --- a/web/src/api.gen.ts +++ b/web/src/api.gen.ts @@ -20,6 +20,56 @@ export interface paths { patch?: never; trace?: never; }; + "/api/me/notifications": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** @description Sets which inbox items the calling user is sent push notifications for. */ + put: operations["updateNotificationPrefs"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/me/push-subscriptions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Registers a browser's push subscription for the calling user. Registering an endpoint again replaces it. */ + post: operations["addPushSubscription"]; + delete: operations["removePushSubscription"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/push/key": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getPushKey"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/projects": { parameters: { query?: never; @@ -450,6 +500,31 @@ export interface components { display_name: string; git_name: string; git_email: string; + notification_prefs: components["schemas"]["NotificationPrefs"]; + }; + /** @description Which new inbox items send this user a push notification. */ + NotificationPrefs: { + /** @description Questions asked with blocking: true. On by default. */ + blocking_questions: boolean; + /** @description Non-blocking questions. */ + questions: boolean; + /** @description Turn summaries. */ + reports: boolean; + /** @description session_error items. */ + errors: boolean; + /** @description rate_limited items. */ + rate_limits: boolean; + }; + PushSubscription: { + endpoint: string; + /** @description The subscription's p256dh key */ + p256dh: string; + /** @description The subscription's auth secret */ + auth: string; + }; + PushKey: { + /** @description Base64url */ + public_key: string; }; UserUpdate: { git_name: string; @@ -753,6 +828,94 @@ export interface operations { 400: components["responses"]["Error"]; }; }; + updateNotificationPrefs: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["NotificationPrefs"]; + }; + }; + responses: { + /** @description The updated user. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["User"]; + }; + }; + 400: components["responses"]["Error"]; + }; + }; + addPushSubscription: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PushSubscription"]; + }; + }; + responses: { + /** @description Registered. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 400: components["responses"]["Error"]; + }; + }; + removePushSubscription: { + parameters: { + query: { + endpoint: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Removed, or was not registered. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getPushKey: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The server's VAPID public key, the applicationServerKey for PushManager.subscribe. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["PushKey"]; + }; + }; + }; + }; listProjects: { parameters: { query?: never; diff --git a/web/src/api.ts b/web/src/api.ts index c9cde45..f28c1d2 100644 --- a/web/src/api.ts +++ b/web/src/api.ts @@ -12,9 +12,10 @@ export type InboxResponseCreate = Schemas["InboxResponseCreate"]; export type Attachment = Schemas["Attachment"]; export type ByreEvent = Schemas["Event"]; export type Status = Schemas["Status"]; +export type NotificationPrefs = Schemas["NotificationPrefs"]; export type TurnRef = Schemas["TurnRef"]; -type Method = "get" | "post" | "put"; +type Method = "get" | "post" | "put" | "delete"; type PathsWith = { [P in keyof paths]: paths[P][M] extends { responses: unknown } ? P : never; @@ -78,6 +79,9 @@ export async function request>( } const res = await fetch(url, init); + if (res.status === 204) { + return undefined as Result>; + } const data = await res.json(); if (!res.ok) { throw new ApiError(res.status, (data as Schemas["Error"]).message); @@ -88,6 +92,7 @@ export async function request>( export const get =

>(path: P, opts?: Options>) => request("get", path, opts); export const post =

>(path: P, opts?: Options>) => request("post", path, opts); export const put =

>(path: P, opts?: Options>) => request("put", path, opts); +export const del =

>(path: P, opts?: Options>) => request("delete", path, opts); export function subscribe(after: number, onEvent: (ev: ByreEvent) => void, onState: (connected: boolean) => void): EventSource { const source = new EventSource(`/api/events?after=${after}`); diff --git a/web/src/app.ts b/web/src/app.ts index b5319da..b31a028 100644 --- a/web/src/app.ts +++ b/web/src/app.ts @@ -59,6 +59,13 @@ async function main(): Promise { addEventListener("hashchange", route); route(); + + if ("serviceWorker" in navigator) { + navigator.serviceWorker.onmessage = (e: MessageEvent<{ open: string }>) => { + location.hash = new URL(e.data.open, location.origin).hash; + }; + await navigator.serviceWorker.register("/sw.js"); + } } main().catch((err: unknown) => { diff --git a/web/src/panes.ts b/web/src/panes.ts index cb3021e..ffeb04f 100644 --- a/web/src/panes.ts +++ b/web/src/panes.ts @@ -2,10 +2,11 @@ import { mountAdmin } from "./admin.js"; import { mountChanges } from "./changes.js"; import { h, replace } from "./dom.js"; import { mountInbox } from "./inbox.js"; +import { mountSettings } from "./settings.js"; import { mountTranscript } from "./task.js"; import { mountTasks } from "./tasks.js"; -export type View = "transcript" | "changes" | "tasks" | "inbox" | "admin"; +export type View = "transcript" | "changes" | "tasks" | "inbox" | "admin" | "settings"; const views: Record () => void }> = { transcript: { label: "Transcript", mount: mountTranscript }, @@ -13,9 +14,10 @@ const views: Record () => v tasks: { label: "Tasks", mount: mountTasks }, inbox: { label: "Inbox", mount: mountInbox }, admin: { label: "Admin", mount: mountAdmin }, + settings: { label: "Settings", mount: mountSettings }, }; -const order: View[] = ["transcript", "changes", "tasks", "inbox", "admin"]; +const order: View[] = ["transcript", "changes", "tasks", "inbox", "admin", "settings"]; export class Pane { readonly el: HTMLElement; diff --git a/web/src/settings.ts b/web/src/settings.ts new file mode 100644 index 0000000..fe83ad5 --- /dev/null +++ b/web/src/settings.ts @@ -0,0 +1,131 @@ +import { del, get, post, put, type NotificationPrefs } from "./api.js"; +import { errorText, h, replace } from "./dom.js"; +import { on, state } from "./state.js"; + +const kinds: { key: keyof NotificationPrefs; label: string }[] = [ + { key: "blocking_questions", label: "Blocking questions" }, + { key: "questions", label: "Non-blocking questions" }, + { key: "reports", label: "Turn summaries" }, + { key: "errors", label: "Session errors" }, + { key: "rate_limits", label: "Rate limits" }, +]; + +export function mountSettings(root: HTMLElement): () => void { + const device = h("div", { class: "push-device" }); + const prefs = h("fieldset", { class: "push-prefs" }); + + const renderPrefs = () => { + const me = state.me; + if (!me) { + replace(prefs); + return; + } + replace( + prefs, + h("legend", {}, "Notify me about"), + ...kinds.map(({ key, label }) => { + const box = h("input", { type: "checkbox", checked: me.notification_prefs[key] }); + box.onchange = async () => { + try { + state.me = await put("/api/me/notifications", { body: { ...me.notification_prefs, [key]: box.checked } }); + } catch (err) { + alert(errorText(err)); + } + renderPrefs(); + }; + return h("label", {}, box, " ", label); + }), + ); + }; + + let disposed = false; + const renderDevice = async () => { + const status = await deviceStatus(); + if (disposed) { + return; + } + if (status.kind === "unsupported") { + replace(device, h("p", { class: "hint" }, "This browser doesn't support web push.")); + return; + } + if (status.kind === "denied") { + replace(device, h("p", { class: "hint" }, "Notifications are blocked for this site in the browser's settings.")); + return; + } + + const button = h("button", {}, status.sub ? "Turn off on this browser" : "Turn on for this browser"); + button.onclick = async () => { + button.disabled = true; + try { + if (status.sub) { + await disable(status.sub); + } else { + await enable(status.reg); + } + } catch (err) { + alert(errorText(err)); + } + await renderDevice(); + }; + replace(device, h("p", {}, status.sub ? "This browser receives notifications." : "This browser doesn't receive notifications."), button); + }; + + replace(root, h("div", { class: "settings-view" }, h("h2", {}, "Notifications"), device, prefs)); + const off = on("me", renderPrefs); + renderPrefs(); + void renderDevice().catch((err: unknown) => replace(device, h("p", { class: "error-text" }, errorText(err)))); + + return () => { + disposed = true; + off(); + }; +} + +type DeviceStatus = + | { kind: "unsupported" } + | { kind: "denied" } + | { kind: "ready"; reg: ServiceWorkerRegistration; sub: PushSubscription | null }; + +async function deviceStatus(): Promise { + if (!("serviceWorker" in navigator) || !("PushManager" in window) || !("Notification" in window)) { + return { kind: "unsupported" }; + } + if (Notification.permission === "denied") { + return { kind: "denied" }; + } + const reg = await navigator.serviceWorker.ready; + const sub = await reg.pushManager.getSubscription(); + if (sub) { + await register(sub); + } + return { kind: "ready", reg, sub }; +} + +async function enable(reg: ServiceWorkerRegistration): Promise { + const permission = await Notification.requestPermission(); + if (permission !== "granted") { + return; + } + const key = await get("/api/push/key"); + const sub = await reg.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: base64url(key.public_key) }); + await register(sub); +} + +async function disable(sub: PushSubscription): Promise { + await del("/api/me/push-subscriptions", { query: { endpoint: sub.endpoint } }); + await sub.unsubscribe(); +} + +async function register(sub: PushSubscription): Promise { + const keys = sub.toJSON().keys ?? {}; + await post("/api/me/push-subscriptions", { body: { endpoint: sub.endpoint, p256dh: keys["p256dh"] ?? "", auth: keys["auth"] ?? "" } }); +} + +function base64url(s: string): Uint8Array { + const bin = atob(s.replace(/-/g, "+").replace(/_/g, "/")); + const out = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; i++) { + out[i] = bin.charCodeAt(i); + } + return out; +} diff --git a/web/src/sw.ts b/web/src/sw.ts new file mode 100644 index 0000000..d884531 --- /dev/null +++ b/web/src/sw.ts @@ -0,0 +1,33 @@ +const sw = self as unknown as ServiceWorkerGlobalScope; + +type PushMessage = { title: string; body: string; url: string }; + +sw.addEventListener("install", () => { + void sw.skipWaiting(); +}); + +sw.addEventListener("activate", (e) => { + e.waitUntil(sw.clients.claim()); +}); + +sw.addEventListener("push", (e) => { + const msg = e.data?.json() as PushMessage; + e.waitUntil(sw.registration.showNotification(msg.title, { body: msg.body, data: { url: msg.url } })); +}); + +sw.addEventListener("notificationclick", (e) => { + e.notification.close(); + const url = (e.notification.data as { url: string }).url; + e.waitUntil(openTask(url)); +}); + +async function openTask(url: string): Promise { + const windows = await sw.clients.matchAll({ type: "window", includeUncontrolled: true }); + const win = windows[0]; + if (!win) { + await sw.clients.openWindow(url); + return; + } + win.postMessage({ open: url }); + await win.focus(); +} diff --git a/web/style.css b/web/style.css index 1b604af..c22f12d 100644 --- a/web/style.css +++ b/web/style.css @@ -1231,6 +1231,44 @@ pre.diff .meta { color: var(--muted); } +.settings-view { + overflow-y: auto; + padding: 8px 16px 16px; +} + +.settings-view h2 { + font-size: 13px; + margin: 16px 0 6px; +} + +.push-device p { + margin: 0 0 8px; +} + +.push-prefs { + margin: 16px 0 0; + padding: 8px 12px 10px; + border: 1px solid var(--border); + border-radius: 8px; + display: flex; + flex-direction: column; + gap: 4px; +} + +.push-prefs legend { + color: var(--muted); + padding: 0 4px; +} + +.push-prefs label { + cursor: pointer; +} + +.push-prefs input { + width: auto; + accent-color: var(--accent); +} + .fatal { padding: 24px; color: var(--danger); diff --git a/web/tsconfig.json b/web/tsconfig.json index f76f82c..2216e17 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -12,5 +12,6 @@ "sourceMap": true, "skipLibCheck": true }, - "include": ["src"] + "include": ["src"], + "exclude": ["src/sw.ts"] } diff --git a/web/tsconfig.sw.json b/web/tsconfig.sw.json new file mode 100644 index 0000000..ee004db --- /dev/null +++ b/web/tsconfig.sw.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "lib": ["ES2023", "WebWorker"] + }, + "include": ["src/sw.ts"], + "exclude": [] +}