Selecting a fixed category filters the existing catalog. It does not edit profile membership and is not a drag-and-drop target.
Programs source categories
The Programs sidebar separates immutable code-source categories from editable tool profiles. Source categories describe where a callable is registered; profiles describe which callables a user wants available together.
Verified current implementation and gap
| Current boundary | Verified behavior | Gap |
|---|---|---|
GET /api/tools | Returns regular non-agentic tools registered from the functions layer. | The sidebar has no fixed Functions filter and the All Programs count omits these tools. |
GET /api/programs | Returns agentic entries with category="agentic" and application entries with category="app". | Both are shown under the same All Programs/profile filter. |
GET /api/tool-profiles | Returns immutable and user-defined named tool sets. | Profile rows are visually separated, but the rows above them do not describe source types. |
Classification contract
| Sidebar row | Canonical evidence | Items shown | Mutation |
|---|---|---|---|
| All Programs | /api/tools + /api/programs | All regular tools, agentic functions, and applications. | None |
| Functions | /api/tools | Regular non-agentic tools from programs/functions/. | Global enable switch remains available on each card. |
| Agentic Functions | /api/programs category=agentic | Agentic functions from programs/agentic_functions/. | Existing favorite, icon, edit, and profile actions remain available. |
| Applications | /api/programs category=app | Installed programs from programs/applications/. | Existing program actions remain available. |
| Favorites | programs/meta favorites | Favorited agentic functions and applications. | Existing favorite action. |
| Uncategorized | Profile membership | Catalog entries absent from every stored profile. | Existing profile assignment actions. |
| Rows below divider | /api/tool-profiles | Named tool profiles such as FULL, BUILT-IN, and research. | Create, rename, delete, and membership actions remain unchanged. |
Reference comparison and decisions
| Reference | Relevant model | Decision here |
|---|---|---|
| OpenProgram registry | Regular functions and agentic functions register into one callable surface while retaining source-layer metadata. | Adopt the unified runtime catalog; add read-only source filters only in the management UI. |
| Hermes toolsets | Named toolsets represent selection, not source ownership. | Keep tool profiles separate from source categories. |
| Claude Code and OpenClaw references | Registration and policy decide callable availability; neither reference exposes OpenProgram's three-directory source tree as a Programs sidebar. | Do not infer source categories from policy, permissions, enabled state, or profile membership. |
Adopted: three fixed rows derived from the two existing endpoints and the existing program category. Modified: All Programs includes both endpoint result sets. Rejected: a new persisted category field, a user-editable category configuration system, source labels inside every card, nested directory rows, and a new tab layout.
Behavior, compatibility, and failures
- Fixed source rows are click filters only. Dragging a program onto them must not create or modify a profile.
- Profile rows remain valid drop targets and retain context-menu behavior.
- Search applies to the selected category and covers both regular tools and agentic entries.
- An empty selection renders one empty state only; selecting Functions must not render an agentic-empty message above regular tool cards.
- Unknown program categories remain in Agentic Functions because
/api/programsis the agentic catalog and onlycategory="app"is an application. - Fetch cancellation, global enable switches, favorites, icon overrides, profile persistence, and chat launch behavior are unchanged.
Task brief and gate manifest
Production files: web/components/functions/functions-page.tsx and its existing shared types/presentational files only when required. Test file: one runnable Programs category check under web/scripts/. Excluded: registry changes, new API fields, profile storage migration, card restyling, tabs, per-directory nested filters, dependencies, and release operations.
Acceptance: the Programs page renders All Programs, Functions, Agentic Functions, Applications, Favorites, and Uncategorized above the existing divider; counts use live data; each fixed category shows only its defined source class; All Programs includes regular tools; profiles remain below the divider and retain mutation behavior; source rows cannot receive drops.
Verification: focused category check in RED and GREEN; TypeScript compile; full npm run check; production build; documentation link check; git diff --check; independent specification review; independent quality review.