GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — feat: send skill invocations as structured message parts by jaaydenh · Pull Request #30861 · coder/coder

Conversation

@jaaydenh

@jaaydenh jaaydenh commented Oct 15, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

Adds a structured skill-invocation chat part so a user message can carry an explicit skill. chatd loads that exact skill when the message is sent and puts its body into the user's prompt, so the skill always applies instead of relying on the model to notice it in <available-skills>. The composer chip that sends these parts comes in the next PR.

  • codersdk: a skill-invocation input part and message part with skill_source (personal, org, project, workspace) and skill_name. The resolved body is stored on the part as internal skill_body; it's hidden from TypeScript and stripped from every API response.
  • coderd rejects an unknown source or an invalid name with 400.
  • chatd resolves each invocation on create, send and edit with the chat owner's permissions, through the same loaders as read_skill: stored skills by source and name (project skills through the chat's project, with the root chat fallback for subagents) and workspace skills from the pinned context snapshot. The body is saved at send time so past turns show what the model received. A missing, disabled or unreadable skill rejects the send with 400 "Skill project/triage is not available."
  • The prompt renders a line saying the user invoked the skill, followed by <invoked-skill name="project/triage"> with the sanitized body. Titles and hook prompt text show the invocation as /project/triage.
  • The site only gets no-op cases so the regenerated types compile. coderd/x/chatd/ARCHITECTURE.md gets a TODO for the author.

Stack (merge top to bottom):

  • feat: add project skill queries and authorization #30826
  • feat: add project skill API routes #30827
  • feat: load project skills in chats #30838
  • fix(site/src/pages/AgentsPage): use the root chat's project for subagent chat skills #30840
  • refactor(site/src/pages/AgentsPage): extract SkillEditorForm and shared skill helpers #30854
  • feat(site): add the project skills dialog #30855
  • feat: manage project skills from the project page #30856
  • feat: send skill invocations as structured message parts #30861 👈
  • feat(site/src): insert skills as chips in the composer #30880
  • feat: render skill invocations in the transcript and edit flow #30881
  • feat: add skill action and automatic-use settings #30882
  • feat: show project skill actions above project chat composers #30884
  • refactor(site/src/pages/AgentsPage/components): split the skill editor into compound components #31122
  • feat: turn typed skill aliases into chips #31126

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
jaaydenh added 28 commits October 15, 2026 07:09
@jaaydenh
feat: add project skill queries and authorization
2ac1248
Add sqlc queries for skills owned by a chat project and authorize them
through the parent project in dbauthz: reading needs chat_project:read
and writing needs chat_project:update. Skill.RBACObject keeps denying
project rows so any unwrapped path fails closed.

Add the chat_project_skill audit resource type and
AuditableChatProjectSkill so the upcoming project skill API can record
audit entries.
@jaaydenh
refactor(coderd/database): share chat project config authorization he…
836c956
…lper
@jaaydenh
test(coderd/database): assert project skill reads stay scoped to thei…
7bc17ba
…r project
@jaaydenh
feat: add project skill API routes
1c9e8f1
Add experimental routes to list, create, read, update and delete skills
on a chat project. Reading needs read on the project and writes need
update; callers who lack the permission get a 404 like the project
instructions routes. The handlers reuse the shared skill create and
update path, map the per-project cap and name index to 409, and audit
every write as a chat_project_skill.

Add matching ExperimentalClient methods.
@jaaydenh
chore(coderd): clarify chat project skill limit comment
d623418
@jaaydenh
feat(coderd/x): load project skills in chats
dda45bc
Chats in a project now get the project's enabled skills as a new
"project" skill source, read as the chat owner each turn. Subagents use
the root chat's project. read_skill loads project skill bodies, and
MergeSkills takes sources in merge order so new sources do not change
its signature.
@jaaydenh
feat(site): list project skills in the chat slash menu
27c808d
The "/" menu offers the skills of the chat's project, next to personal,
organization and workspace skills, and /clear and /compact defer to a
project skill with the same name. Documents project skills.
@jaaydenh
refactor(site/src/pages/AgentsPage): share stored skill source loadin…
009432c
…g in the slash menu

Organization and project skills load through one hook, and the menu
renders its skill groups from one ordered list. Adds project loading and
error stories.
@jaaydenh
refactor(site/src/pages/AgentsPage/components/ChatMessageInput): simp…
a3a2f5d
…lify skill group offsets
@jaaydenh
refactor(site/src/pages/AgentsPage): name stored skill source flags a…
23a5168
…nd resolve emptiness in the hook
@jaaydenh
refactor(site/src/pages/AgentsPage/components): clarify skill source …
5533023
…naming in the composer
@jaaydenh
test: cover project skill loader and gating gaps
681b374
Cover the project-only skill tool check in the integration test, the
project skill body loader's not-found mapping, and the chat-projects
experiment gate in the composer.
@jaaydenh
test(site/src/pages/AgentsPage/components): assert the project skills…
2a72a92
… request instead of menu markup
@jaaydenh
fix(site/src/pages/AgentsPage): use the root chat's project for subag…
26deda5
…ent chat skills
@jaaydenh
fix(site/src/pages/AgentsPage): keep inherited project skills pending…
549a030
… in the composer
@jaaydenh
test(site/src/pages/AgentsPage/components): restore Range geometry st…
7b6c3e3
…ub after each test
@jaaydenh
refactor(site/src/pages/AgentsPage): extract SkillEditorForm and shar…
a14b495
…ed skill helpers

Split the form body of SkillEditor into SkillEditorForm, settle saves
through a mutate callback so the editor stays locked until the request
finishes, move the read-only enabled indicator into SkillEnabledSwitch,
and share the empty and loaded form value helpers in utils/skills.ts.
@jaaydenh
feat(site): add the project skills dialog
3a6e22b
Add API methods and query factories to read, create, update, and delete
chat project skills, a projectSkillsScope for the shared skill helpers,
and ProjectSkillsDialog, which lists a project's skills and edits them
with SkillEditorForm.
@jaaydenh
feat: manage project skills from the project page
d8b9163
Add a Skills row to the project Details panel that opens
ProjectSkillsDialog, with stories for the dialog and the panel, and
document where project skills are managed.
@jaaydenh
feat: send skill invocations as structured message parts
f8c6ca7
Add a skill-invocation chat input and message part. chatd loads the
invoked skill body with the chat owner's permissions when a message is
created, sent, or edited, stores it on the part, and renders it into
the user's prompt inside <invoked-skill>. Unavailable skills reject the
request with a 400. The stored body is internal and never returned by
the API.
@jaaydenh
fix(site/src/pages/AgentsPage/components): keep the edited skill name…
e1a4429
… focusable and cover submit settlement
@jaaydenh
Merge branch 'chat-project-skills/skill-editor-form' into chat-projec…
dd7a120
…t-skills/project-skills-dialog
@jaaydenh
test(coderd): cover skill invocation rejection on message edit
4345722
@jaaydenh
fix(site/src/pages/AgentsPage/components/ProjectPage): keep skill edi…
43b64fc
…ts through refetches and handle deleted skills
@jaaydenh
Merge branch 'chat-project-skills/project-skills-dialog' into chat-pr…
ffc6165
…oject-skills/project-skills-details
@jaaydenh
test(site/src/pages/AgentsPage/components/ProjectPage): move download…
fc6f82d
… and toggle tests to the Details row PR
@jaaydenh
test(site/src/pages/AgentsPage/components/ProjectPage): cover dialog …
f412310
…downloads, toggles, refetches and deleted skills
@jaaydenh
Merge branch 'chat-project-skills/project-skills-details' into chat-p…
358cb86
…roject-skills/invocation-api
This was referenced Oct 15, 2026
feat: add project skill queries and authorization #30826
Merged
feat: add project skill API routes #30827
Merged
jaaydenh added 8 commits October 20, 2026 13:33
@jaaydenh
Merge branch 'wyav/sk-skill-editor-form' into wyav/sk-project-skills-…
0384e1b
…dialog

# Conflicts:
#	site/src/api/queries/chatProjectSkills.ts
@jaaydenh
Merge branch 'wyav/sk-project-skills-dialog' into wyav/sk-project-ski…
fede53b
…lls-details

# Conflicts:
#	site/src/api/queries/chatProjectSkills.ts
@jaaydenh
Merge branch 'wyav/sk-project-skills-details' into wyav/sk-invocation…
f3cc275
…-api

# Conflicts:
#	coderd/exp_chats.go
@jaaydenh
fix(coderd/x/chatd): document the chatd read for project skill invoca…
29e32ef
…tions
@jaaydenh
refactor(coderd/x/chatd): remove the unused resolveProjectInstructions
90de6c8
Turns check project access once with resolveUsableChatProjectID and then
load instructions and skills, so resolveProjectInstructions had no
production callers. Its tests now cover resolveUsableChatProjectID and
loadProjectInstructions directly.
@jaaydenh
chore: update architecture.md
e9117ba
@jaaydenh
Merge branch 'chat-project-skills/chatd' of https://github.com/coder/…
f83fb91
…coder into chat-project-skills/chatd
@jaaydenh
fix(site/src/pages/AgentsPage/components/ChatMessageInput): drop the …
e9a4adf
…retry prompt for unusable projects

A 403 or 404 from the project skills request means the caller lost access
to the project, which the composer already treats as no project skills.
The slash menu still showed "Could not load project skills" with a retry
hint that could never succeed, so a project the caller cannot use no longer
shows a loading or error status. A story covers the menu in that state.
@jaaydenh jaaydenh mentioned this pull request Oct 21, 2026
refactor(site/src/pages/AgentsPage/components): split the skill editor into compound components #31122
Merged
jaaydenh added a commit that referenced this pull request Oct 21, 2026
@jaaydenh
feat: load project skills in chats (#30838)
3216580
Chats that belong to a chat project now get the project's skills, next
to personal, organization and workspace skills. They show up in the
model's skill list, load through `read_skill`, and appear in a "Project
skills" group in the `/` menu.

- `coderd/x/skills` adds the `project` source. `MergeSkills` now takes a
list of sources in merge order (personal, organization, project,
workspace). Bare names stay bare unless two sources share a name, in
which case they get `project/<name>` style aliases.
- chatd loads project skills only when the chat owner owns the project
or the project is shared with them. Role grants don't count. This is the
same `usableChatProject` check that project instructions and memory use,
and one check per turn covers both instructions and skills. Disabled
skills are skipped. A failed load logs a warning and the turn continues
without them. Subagents use their root chat's project; that lookup is
now a helper shared with project instructions.
- The site loads project skills for the composer on the project page and
in project chats, behind the `chat-projects` experiment. `/clear` and
`/compact` defer to a project skill with the same name, as they already
do for other sources. When the user can't use the project, the site
treats it as no project skills, like chatd, so those commands keep
working and the `/` menu shows no retry prompt for project skills. That
covers a 403 or 404 from the project skills request and a project
missing from the user's project list, which holds only owned and shared
projects, so an administrator role that can read the project doesn't
count. Other failures are retried and leave the list unknown. A cached
project list is also unknown while it refetches or after a failed
refetch, so a share revoked since it was cached keeps those commands
pending instead of deferring to stale project skills.
- Docs gain a "Project skills" section in the extending agents page.
`coderd/x/chatd/ARCHITECTURE.md` gains a paragraph on project skills.

Dogfood UAT on this branch passed: project skills appear in the project
page `/` menu and in project chats, `read_skill` loads them, disabled
and deleted skills report not found, chats outside the project don't see
them, and a subagent gets them through its root chat. The site reads
project skills from the chat's own `project_id`, so subagent chats show
them in the composer once sub-chats carry their root's project (#30683).

| Project page `/` menu | `read_skill` in a project chat |
| --- | --- |
| <img alt="Project skills group in the project page slash menu"
src="https://raw.githubusercontent.com/coder/coder/assets/pr-30838-project-skills/pr/project-page-slash-menu.png"
width="600" /> | <img alt="read_skill loading a project skill in a
project chat"
src="https://raw.githubusercontent.com/coder/coder/assets/pr-30838-project-skills/pr/project-chat-read-skill.png"
width="600" /> |

Stack (merge top to bottom):
- #30838 👈
- #30854
- #30855
- #30856
- #30861
- #30880
- #30881
- #30882
- #30884
- #31122
jaaydenh added 3 commits October 21, 2026 13:11
@jaaydenh
Merge commit 'e9a4adf7c68e6bf80c9633591e8a99345b3f1dbf' into resync-s…
fe2c0b3
…kill-editor-form
@jaaydenh
Merge commit '3216580614^' into resync-skill-editor-form
9d80261
@jaaydenh
Merge commit '3216580614' into resync-skill-editor-form
793e989
jaaydenh added a commit that referenced this pull request Oct 21, 2026
@jaaydenh
refactor(site/src/pages/AgentsPage): extract SkillEditorForm and shar…
c1d4907
…ed skill helpers (#30854)

Pulls the skill form body out of `SkillEditor` into a `SkillEditorForm`
with no dialog wrapper, and moves the row helpers (download, delete
confirmation, form values from a skill) out of
`SkillsTable`/`SkillsTableView` so the project skills dialog in the next
PR can reuse them. `SkillEnabledSwitch` gains a `readOnly` prop.

The personal and organization skill pages behave the same, with two
small fixes that came along: Save is locked while a submit is in flight,
so a double click no longer sends two create requests, and the Body
placeholder renders its line breaks.

Stack (merge top to bottom):
- #30826
- #30827
- #30838
- #30840
- #30854 👈
- #30855
- #30856
- #30861
- #30880
- #30881
- #30882
- #30884
- #31122
jaaydenh added 3 commits October 21, 2026 13:51
@jaaydenh
Merge commit '793e989a07d92b87e39aa15f5f0f9c853a9d317c' into pr-30855…
e5f1e0a
…-merge
@jaaydenh
Merge commit 'c1d4907f6c^' into project-skills-dialog
78f232d
@jaaydenh
Merge commit 'c1d4907f6c' into project-skills-dialog
d581a38
jaaydenh added a commit that referenced this pull request Oct 21, 2026
@jaaydenh
feat(site): add the project skills dialog (#30855)
cbc53b4
Adds `ProjectSkillsDialog`, the dialog for managing a chat project's
skills, plus the API client methods and react-query factories for the
project skill routes from #30827. Nothing opens the dialog yet; the next
PR adds the entry point in the project page Details panel.

- List view: "Project skills" with each skill's name, description, an
enabled switch and last updated time, a row menu with Edit (View when
read-only), Download and Delete, and a "No skills added yet" empty
state.
- New and Edit replace the list inside the same dialog and reuse
`SkillEditorForm`, including paste-to-import and file upload. Name is
locked when editing, and Escape asks before discarding unsaved edits.
- Without update permission the dialog is read-only: no New, Delete or
Save, and fields are disabled.
- Create, update and delete invalidate the project skill list, so the
composer `/` menu picks up changes too. A 409 (duplicate name or the
100-skill cap) is shown in the form and refreshes the list.

Stack (merge top to bottom):
- #30826
- #30827
- #30838
- #30840
- #30854
- #30855 👈
- #30856
- #30861
- #30880
- #30881
- #30882
- #30884
- #31122
jaaydenh added 2 commits October 21, 2026 14:10
@jaaydenh
Merge commit 'd581a3864e' into details-resync-30856
4dbd39e
@jaaydenh
Merge remote-tracking branch 'origin/main' into details-resync-30856
e7220ac
@linear-code

linear-code Bot commented Oct 21, 2026

Copy link
Copy Markdown

CODAGT-1438

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Base automatically changed from chat-project-skills/project-skills-details to main October 21, 2026 15:06
jaaydenh added a commit that referenced this pull request Oct 21, 2026
@jaaydenh @cursoragent
feat: manage project skills from the project page (#30856)
7253bd1
Adds a "Skills" row to the project page Details panel. It shows "None"
or the skill count (noting disabled skills) and opens the project skills
dialog from #30855. Editing follows the project's `permissions.update`,
the same flag that gates the instructions editor. The server computes it
with the project's sharing ACL, so an `admin` sharee can edit skills,
and users who can only read the project get the read-only dialog. Focus
returns to the row when the dialog closes. The extending agents docs now
point at the project page for managing project skills.

Dogfood UAT on this stack passed: creating, editing, importing,
downloading, turning off and deleting skills from the dialog; Save stays
disabled until the form is valid; a duplicate name shows the 409 in the
dialog; new skills show up in the project page `/` menu without a
reload. The read-only dialog was checked with a stubbed projects list,
before project sharing (#30439) landed.

| Editor | List after saving |
| --- | --- |
| <img alt="New project skill editor"
src="https://raw.githubusercontent.com/coder/coder/assets/pr-30856-project-skills/pr/skill-editor.png"
width="600" /> | <img alt="Project skills list after saving"
src="https://raw.githubusercontent.com/coder/coder/assets/pr-30856-project-skills/pr/skill-list.png"
width="600" /> |

Stack (merge top to bottom):
- #30826
- #30827
- #30838
- #30840
- #30854
- #30855
- #30856 👈
- #30861
- #30880
- #30881
- #30882
- #30884
- #31122

---------

Co-authored-by: Cursor <[email protected]>
jaaydenh added 3 commits October 21, 2026 15:08
@jaaydenh
Merge commit 'e7220ace1d46174a22cf4b67ef49e1bae2b0f8a0' into resolve-…
cdd278c
…30861
@jaaydenh
Merge commit '7253bd127bd53248e3588ef1ec93cbe95ad6253a^' into resolve…
334e844
…-30861
@jaaydenh
Merge commit '7253bd127bd53248e3588ef1ec93cbe95ad6253a' into resolve-…
a3f23b7
…30861
@jaaydenh jaaydenh mentioned this pull request Oct 21, 2026
feat: turn typed skill aliases into chips #31126
Merged
@jaaydenh
jaaydenh merged commit ffd2486 into main Oct 22, 2026
36 checks passed

Uh oh!

There was an error while loading. Please reload this page.

@jaaydenh
jaaydenh deleted the chat-project-skills/invocation-api branch October 22, 2026 04:04
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 22, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Reviewers

@nickvigilante nickvigilante nickvigilante left review comments
@chatgpt-codex-connector chatgpt-codex-connector[bot] chatgpt-codex-connector[bot] left review comments
@ThomasK33 ThomasK33 ThomasK33 approved these changes

Uh oh!

There was an error while loading. Please reload this page.

Assignees

@jaaydenh jaaydenh

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

3 participants

@jaaydenh @ThomasK33 @nickvigilante
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.