@@ -2,6 +2,7 @@ const crypto = require('crypto');
22const path = require ( 'path' ) ;
33
44const { normalizeProviderName, providerSupportsCapability } = require ( '../../lib/provider-names' ) ;
5+ const { tryCanonicalMessageSequence } = require ( '../ledger-sequence' ) ;
56
67const DURABLE_SESSION_BOUNDARY_EVENTS = new Set ( [
78 'TASK_STARTED' ,
@@ -22,7 +23,7 @@ function normalizeAbsolutePath(value) {
2223}
2324
2425function normalizeCursor ( value ) {
25- return Number . isInteger ( value ) && value >= 0 ? value : null ;
26+ return tryCanonicalMessageSequence ( value ) ;
2627}
2728
2829function normalizeNullableCursor ( value ) {
@@ -148,6 +149,9 @@ function validateCompletedResumeIdentity(taskInfo) {
148149 if ( ! requestedSessionId ) {
149150 return null ;
150151 }
152+ if ( taskInfo ?. sessionIdConflict === true ) {
153+ return 'Provider continuation emitted conflicting session identities' ;
154+ }
151155
152156 const capturedSessionId = normalizeNonEmptyString ( taskInfo ?. sessionId ) ;
153157 if ( capturedSessionId === requestedSessionId ) {
@@ -175,6 +179,9 @@ function providerSessionFromCompletedTask({
175179 if ( normalizeProviderName ( taskInfo . provider ) !== provider ) {
176180 return null ;
177181 }
182+ if ( taskInfo . sessionIdConflict === true ) {
183+ return null ;
184+ }
178185 if ( validateCompletedResumeIdentity ( taskInfo ) ) {
179186 return null ;
180187 }
@@ -208,7 +215,7 @@ function readLastDurableSessionBoundary(messageBus, clusterId, agentId) {
208215 cluster_id : clusterId ,
209216 topic : 'AGENT_LIFECYCLE' ,
210217 sender : agentId ,
211- afterId : 0 ,
218+ afterId : '0' ,
212219 } ) ;
213220 return lifecycle
214221 . filter ( ( message ) => DURABLE_SESSION_BOUNDARY_EVENTS . has ( message . content ?. data ?. event ) )
@@ -222,7 +229,7 @@ function restoreAgentProviderSession({ agent, savedState, messageBus, clusterId
222229 }
223230 if (
224231 ! Object . hasOwn ( savedState , 'lastGuidanceAppliedId' ) ||
225- savedState . lastGuidanceAppliedId !== session . guidanceSequence
232+ normalizeNullableCursor ( savedState . lastGuidanceAppliedId ) !== session . guidanceSequence
226233 ) {
227234 return null ;
228235 }
@@ -237,8 +244,8 @@ function restoreAgentProviderSession({ agent, savedState, messageBus, clusterId
237244 data . taskId !== session . taskId ||
238245 data . iteration !== session . generation ||
239246 normalizeProviderName ( data . provider ) !== session . provider ||
240- data . contextSequence !== session . contextSequence ||
241- data . guidanceSequence !== session . guidanceSequence ||
247+ normalizeCursor ( data . contextSequence ) !== session . contextSequence ||
248+ normalizeNullableCursor ( data . guidanceSequence ) !== session . guidanceSequence ||
242249 data . promptIdentity !== session . promptIdentity
243250 ) {
244251 return null ;
0 commit comments