feat(gateway): /agent, /provider, /mission, /prdy, /tools commands (P8-012)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful

Add gateway-executed slash commands with Valkey-backed OAuth flow for
/provider login. Wire Redis into CommandExecutorService via token injection
(same pattern as GCModule). Add 14 new unit tests covering all new handlers.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-15 21:49:02 -05:00
parent 8628f4f93a
commit 86a96bcdab
6 changed files with 527 additions and 3 deletions

View File

@@ -0,0 +1,44 @@
# P8-012 Scratchpad — Gateway /agent, /provider, /mission, /prdy, /tools Commands
## Objective
Add gateway-executed commands: `/agent`, `/provider`, `/mission`, `/prdy`, `/tools`.
Key feature: `/provider login` OAuth flow with Valkey poll token.
## Plan
1. Read all relevant files (done)
2. Update `command-registry.service.ts` — add 5 new command registrations
3. Update `commands.module.ts` — wire Redis injection for executor
4. Update `command-executor.service.ts` — add 5 new command handlers + Redis injection
5. Write spec file for new commands
6. Run quality gates (typecheck, lint, format:check, test)
7. Commit and push
## Key Decisions
- Redis pattern: same as GCModule — use `REDIS` token injected from a QueueHandle factory
- `CommandDef` type fields: `scope: 'core'|'agent'|'skill'|'plugin'|'admin'`, `args?: CommandArgDef[]`, `execution: 'local'|'socket'|'rest'|'hybrid'`
- No `category` or `usage` fields — instruction spec was wrong on that
- `SlashCommandResultPayload.conversationId` is typed as `string` (not `string | undefined`) per the type
- Provider commands are `scope: 'agent'` since they relate to agent configuration
- Redis injection: add a `COMMANDS_REDIS` token in commands module, inject via factory pattern same as GCModule
## Progress
- [ ] command-registry.service.ts updated
- [ ] commands.module.ts updated (add Redis provider)
- [ ] command-executor.service.ts updated (add Redis injection + handlers)
- [ ] spec file written
- [ ] quality gates pass
- [ ] commit + push + PR
## Risks
- `conversationId` typing: `SlashCommandResultPayload.conversationId` is `string`, but some handler calls pass `undefined`. Need to check if it's optional.
After reviewing types: `conversationId: string` in `SlashCommandResultPayload` — not optional. Must pass empty string or actual ID. Looking at existing code: `message: 'Start a new conversation...'` returns `{ command, conversationId, ... }` where conversationId comes from payload which is always a string per `SlashCommandPayload`. For provider commands that don't have a conversationId, pass empty string `''` or the payload's conversationId.
Actually looking at the spec more carefully: `handleProvider` returns `conversationId: undefined`. But the type says `string`. This would be a TypeScript error. I'll use `''` as a fallback or adjust. Let me re-examine...
The `SlashCommandResultPayload` interface says `conversationId: string` — not optional. But the spec says `conversationId: undefined`. I'll use `payload.conversationId` (passing it through) since it comes from the payload.