| |
|
|
| import type { HarnessEvent, LaneSnapshot } from "@earendil-works/pi-agent-core"; |
| import type { AuthEvent, AuthPrompt } from "@earendil-works/pi-ai"; |
|
|
| |
| export type CommandResult = { ok: true } | { ok: false; error: string }; |
|
|
| |
| export interface ModelRef { |
| provider: string; |
| modelId: string; |
| } |
|
|
| export interface ModelSummary extends ModelRef { |
| name: string; |
| } |
|
|
| export interface ProviderAccount { |
| id: string; |
| name: string; |
| authType: "oauth" | "api_key"; |
| configured: boolean; |
| |
| source?: string; |
| |
| interactive: boolean; |
| methodName?: string; |
| } |
|
|
| export interface ModelsState { |
| readonly models: readonly ModelSummary[]; |
| readonly accounts: readonly ProviderAccount[]; |
| readonly refreshing: boolean; |
| } |
|
|
| |
| export type AuthPromptRequest = AuthPrompt extends infer Prompt |
| ? Prompt extends unknown |
| ? Omit<Prompt, "signal"> |
| : never |
| : never; |
|
|
| |
| export type Remote<T> = { |
| [K in keyof T]: T[K] extends (...args: infer A) => infer R ? (...args: A) => Promise<Awaited<R>> : never; |
| }; |
|
|
| |
| export interface ServiceToken<TApi extends object, TEvent = never> { |
| readonly name: string; |
| |
| readonly types?: (api: TApi, event: TEvent) => void; |
| } |
|
|
| export function defineService<TApi extends object, TEvent = never>(name: string): ServiceToken<TApi, TEvent> { |
| return { name }; |
| } |
|
|
| export interface SessionSummary { |
| id: string; |
| path: string; |
| cwd: string; |
| createdAt: number; |
| } |
|
|
| export interface SessionSnapshot { |
| sessionId: string; |
| cwd: string; |
| sessionPath: string; |
| |
| lane: LaneSnapshot; |
| models: ModelsState; |
| } |
|
|
| |
| export type ModelsEvent = |
| | { type: "state"; state: ModelsState } |
| |
| | { type: "prompt"; requestId: string; request: AuthPromptRequest } |
| | { type: "notice"; notice: AuthEvent }; |
|
|
| |
| export type AuthEventPayload = Exclude<ModelsEvent, { type: "state" }>; |
|
|
| |
| export interface LaneSubscription { |
| subscriptionId: string; |
| snapshot: SessionSnapshot; |
| } |
|
|
| |
| export interface LaneEvent { |
| subscriptionId: string; |
| event: HarnessEvent; |
| } |
|
|
| export interface LaneServiceApi { |
| |
| |
| |
| |
| watch(presentationId: string): Promise<LaneSubscription>; |
| |
| start(subscriptionId: string): Promise<void>; |
| unwatch(subscriptionId: string): Promise<void>; |
| prompt(text: string): Promise<CommandResult>; |
| steer(text: string): Promise<CommandResult>; |
| followUp(text: string): Promise<CommandResult>; |
| compact(): Promise<CommandResult>; |
| abort(): Promise<CommandResult>; |
| setModel(ref: ModelRef): Promise<CommandResult>; |
| } |
|
|
| export interface ModelsServiceApi { |
| refresh(): Promise<CommandResult>; |
| login(providerId: string, authType: "oauth" | "api_key"): Promise<CommandResult>; |
| authReply(requestId: string, answer: string | null): Promise<void>; |
| } |
|
|
| |
| export interface WorkerServiceApi { |
| describe(): Promise<{ sessionId: string }>; |
| } |
|
|
| export interface SessionsServiceApi { |
| list(): Promise<SessionSummary[]>; |
| attach(sessionId: string | null, cwd: string, presentationId: string): Promise<string>; |
| } |
|
|
| |
| export const Lane = defineService<LaneServiceApi, LaneEvent>("lane"); |
| |
| export const Models = defineService<ModelsServiceApi, ModelsEvent>("models"); |
| |
| export const Worker = defineService<WorkerServiceApi>("worker"); |
| |
| export const Sessions = defineService<SessionsServiceApi>("sessions"); |
|
|