(adapter: Adapter, event: SessionEvent.Event)
| 76 | } |
| 77 | |
| 78 | export function update(adapter: Adapter, event: SessionEvent.Event) { |
| 79 | type DraftAssistant = WritableDraft<SessionMessage.Assistant> |
| 80 | type DraftTool = WritableDraft<SessionMessage.AssistantTool> |
| 81 | type DraftText = WritableDraft<SessionMessage.AssistantText> |
| 82 | type DraftReasoning = WritableDraft<SessionMessage.AssistantReasoning> |
| 83 | |
| 84 | const latestTool = (assistant: DraftAssistant | undefined, callID?: string) => |
| 85 | assistant?.content.findLast( |
| 86 | (item): item is DraftTool => item.type === "tool" && (callID === undefined || item.id === callID), |
| 87 | ) |
| 88 | |
| 89 | const latestText = (assistant: DraftAssistant | undefined, textID: string) => |
| 90 | assistant?.content.findLast((item): item is DraftText => item.type === "text" && item.id === textID) |
| 91 | |
| 92 | const latestReasoning = (assistant: DraftAssistant | undefined, reasoningID: string) => |
| 93 | assistant?.content.findLast((item): item is DraftReasoning => item.type === "reasoning" && item.id === reasoningID) |
| 94 | |
| 95 | const updateOwnedAssistant = (messageID: SessionMessage.ID, recipe: (draft: DraftAssistant) => void) => |
| 96 | Effect.gen(function* () { |
| 97 | const assistant = yield* adapter.getAssistant(messageID) |
| 98 | if (assistant) yield* adapter.updateAssistant(produce(assistant, recipe)) |
| 99 | }) |
| 100 | |
| 101 | return Effect.gen(function* () { |
| 102 | yield* SessionEvent.All.match(event, { |
| 103 | "session.next.agent.switched": (event) => { |
| 104 | return adapter.appendMessage( |
| 105 | SessionMessage.AgentSwitched.make({ |
| 106 | id: event.data.messageID, |
| 107 | type: "agent-switched", |
| 108 | metadata: event.metadata, |
| 109 | agent: event.data.agent, |
| 110 | time: { created: event.data.timestamp }, |
| 111 | }), |
| 112 | ) |
| 113 | }, |
| 114 | "session.next.model.switched": (event) => { |
| 115 | return adapter.appendMessage( |
| 116 | SessionMessage.ModelSwitched.make({ |
| 117 | id: event.data.messageID, |
| 118 | type: "model-switched", |
| 119 | metadata: event.metadata, |
| 120 | model: event.data.model, |
| 121 | time: { created: event.data.timestamp }, |
| 122 | }), |
| 123 | ) |
| 124 | }, |
| 125 | "session.next.moved": () => Effect.void, |
| 126 | "session.next.prompted": (event) => { |
| 127 | return adapter.appendMessage( |
| 128 | SessionMessage.User.make({ |
| 129 | id: event.data.messageID, |
| 130 | type: "user", |
| 131 | metadata: event.metadata, |
| 132 | text: event.data.prompt.text, |
| 133 | files: event.data.prompt.files, |
| 134 | agents: event.data.prompt.agents, |
| 135 | time: { created: event.data.timestamp }, |
no test coverage detected