`CommandService.list` and `execute` carry the wire contract directly through `@Remote`, and the Client assembly mounts the generated commands contribution. The legacy API Proxy route, its schemas, the map rows, the generated client methods and the fixture's command domain are removed, so the catalog and the admission call have one owner again. `Session.command()` keeps a result-shaped public face for parity with the prompt, cancel and attachment neighbours it sits beside, and reads the generated namespace through one `SessionRemotes` parameter. The Session cluster declares that face against the owning business package rather than the generated contribution: the Host compiler aggregate builds this package, and it runs before any contribution is emitted. Migrated calls lose the `title-invalid` class of protocol-only error codes and report `internal`; no production caller branched on them.
84 lines
3.7 KiB
TypeScript
84 lines
3.7 KiB
TypeScript
/**
|
|
* RPC method registry and signature-derived generics. The map
|
|
* registers only client-request methods (respond is a client-response, so it is absent);
|
|
* map keys are the wire path segments (POST /api/session.list).
|
|
*/
|
|
|
|
import type { SessionsApi } from './sessions.ts'
|
|
import type { HostApi } from './host.ts'
|
|
import type { WorkspaceApi } from './workspace.ts'
|
|
import type { AgentPresetsApi } from './agent-presets.ts'
|
|
import type { SkillsApi } from './skills.ts'
|
|
import type { GoalsApi } from './goals.ts'
|
|
import type { SettingsApi } from './settings.ts'
|
|
import type { CredentialsApi } from './credentials.ts'
|
|
import type { LlmApi } from './llm.ts'
|
|
import type { SubagentsApi } from './subagents.ts'
|
|
import type { RpcResponse } from './rpc.ts'
|
|
|
|
/**
|
|
* Method name → method signature. Signatures are the single source of truth; payload/value
|
|
* types are always derived from here. A method may declare a trailing AbortSignal after the
|
|
* request (command.execute): the carrier passes its request signal, never a wire field.
|
|
*/
|
|
export interface RpcMethodMap {
|
|
'session.list': SessionsApi['list']
|
|
'session.search': SessionsApi['search']
|
|
'session.create': SessionsApi['create']
|
|
'session.history': SessionsApi['history']
|
|
'session.models': SessionsApi['models']
|
|
'session.selectModel': SessionsApi['selectModel']
|
|
'session.rename': SessionsApi['rename']
|
|
'session.fork': SessionsApi['fork']
|
|
'session.prompt': SessionsApi['prompt']
|
|
'session.attachment': SessionsApi['attachment']
|
|
'session.updateQueue': SessionsApi['updateQueue']
|
|
'session.cancel': SessionsApi['cancel']
|
|
'subagent.list': SubagentsApi['list']
|
|
'subagent.history': SubagentsApi['history']
|
|
'subagent.prompt': SubagentsApi['prompt']
|
|
'subagent.interrupt': SubagentsApi['interrupt']
|
|
'host.describe': HostApi['describe']
|
|
'host.pickDirectory': HostApi['pickDirectory']
|
|
'host.listDirectory': HostApi['listDirectory']
|
|
'host.createDirectory': HostApi['createDirectory']
|
|
'host.openPath': HostApi['openPath']
|
|
'workspace.list': WorkspaceApi['list']
|
|
'workspace.create': WorkspaceApi['create']
|
|
'workspace.rename': WorkspaceApi['rename']
|
|
'workspace.delete': WorkspaceApi['delete']
|
|
'workspace.insertSessionBefore': WorkspaceApi['insertSessionBefore']
|
|
'workspace.archiveSession': WorkspaceApi['archiveSession']
|
|
'skill.list': SkillsApi['list']
|
|
'agentPreset.list': AgentPresetsApi['list']
|
|
'agentPreset.select': AgentPresetsApi['select']
|
|
'agentPreset.read': AgentPresetsApi['read']
|
|
'agentPreset.copy': AgentPresetsApi['copy']
|
|
'agentPreset.openDocument': AgentPresetsApi['openDocument']
|
|
'agentPreset.remove': AgentPresetsApi['remove']
|
|
'goal.create': GoalsApi['create']
|
|
'goal.edit': GoalsApi['edit']
|
|
'goal.pause': GoalsApi['pause']
|
|
'goal.resume': GoalsApi['resume']
|
|
'goal.complete': GoalsApi['complete']
|
|
'goal.clear': GoalsApi['clear']
|
|
'settings.describe': SettingsApi['describe']
|
|
'settings.openDocument': SettingsApi['openDocument']
|
|
'settings.update': SettingsApi['update']
|
|
'settings.replace': SettingsApi['replace']
|
|
'settings.mutate': SettingsApi['mutate']
|
|
'credentials.describe': CredentialsApi['describe']
|
|
'credentials.set': CredentialsApi['set']
|
|
'credentials.unset': CredentialsApi['unset']
|
|
'llm.providers': LlmApi['providers']
|
|
'llm.models': LlmApi['models']
|
|
'llm.discoverModels': LlmApi['discoverModels']
|
|
}
|
|
|
|
/** Business request payload of method K (reaches through the RpcRequest narrow form to payload). */
|
|
export type RequestPayload<K extends keyof RpcMethodMap> = Parameters<RpcMethodMap[K]>[0]['payload']
|
|
|
|
/** Business return value of method K (reaches through the RpcResponse narrow form to infer the ok value of result). */
|
|
export type ResponseValue<K extends keyof RpcMethodMap> =
|
|
Awaited<ReturnType<RpcMethodMap[K]>> extends RpcResponse<infer T> ? T : never
|