New unary method in RpcMethodMap with the title-invalid error code; the impl resolves the agent (cold sessions resume first) and delegates to ctx.sessionTitle.rename, returning the normalized title plus its event seq so clients settle the title projection cell ahead of the push frame. session.fork stays on the reserved-seam list.
56 lines
2.4 KiB
TypeScript
56 lines
2.4 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 { CommandsApi } from './commands.ts'
|
|
import type { SkillsApi } from './skills.ts'
|
|
import type { GoalsApi } from './goals.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.create': SessionsApi['create']
|
|
'session.history': SessionsApi['history']
|
|
'session.models': SessionsApi['models']
|
|
'session.selectModel': SessionsApi['selectModel']
|
|
'session.rename': SessionsApi['rename']
|
|
'session.prompt': SessionsApi['prompt']
|
|
'session.cancel': SessionsApi['cancel']
|
|
'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']
|
|
'command.list': CommandsApi['list']
|
|
'command.execute': CommandsApi['execute']
|
|
'skill.list': SkillsApi['list']
|
|
'goal.create': GoalsApi['create']
|
|
'goal.edit': GoalsApi['edit']
|
|
'goal.pause': GoalsApi['pause']
|
|
'goal.resume': GoalsApi['resume']
|
|
'goal.complete': GoalsApi['complete']
|
|
'goal.clear': GoalsApi['clear']
|
|
}
|
|
|
|
/** 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
|