(state: SessionState, messages: WithParts[])
| 117 | } |
| 118 | |
| 119 | export function assignMessageRefs(state: SessionState, messages: WithParts[]): number { |
| 120 | let assigned = 0 |
| 121 | let skippedSubAgentPrompt = false |
| 122 | |
| 123 | for (const message of messages) { |
| 124 | if (isIgnoredUserMessage(message)) { |
| 125 | continue |
| 126 | } |
| 127 | |
| 128 | if (state.isSubAgent && !skippedSubAgentPrompt && message.info.role === "user") { |
| 129 | skippedSubAgentPrompt = true |
| 130 | continue |
| 131 | } |
| 132 | |
| 133 | const rawMessageId = message.info.id |
| 134 | if (typeof rawMessageId !== "string" || rawMessageId.length === 0) { |
| 135 | continue |
| 136 | } |
| 137 | |
| 138 | const existingRef = state.messageIds.byRawId.get(rawMessageId) |
| 139 | if (existingRef) { |
| 140 | if (state.messageIds.byRef.get(existingRef) !== rawMessageId) { |
| 141 | state.messageIds.byRef.set(existingRef, rawMessageId) |
| 142 | } |
| 143 | continue |
| 144 | } |
| 145 | |
| 146 | const ref = allocateNextMessageRef(state) |
| 147 | state.messageIds.byRawId.set(rawMessageId, ref) |
| 148 | state.messageIds.byRef.set(ref, rawMessageId) |
| 149 | assigned++ |
| 150 | } |
| 151 | |
| 152 | return assigned |
| 153 | } |
| 154 | |
| 155 | function allocateNextMessageRef(state: SessionState): string { |
| 156 | let candidate = Number.isInteger(state.messageIds.nextRef) |
no test coverage detected