31 lines
1.3 KiB
TypeScript
31 lines
1.3 KiB
TypeScript
/** Runtime reason inspection for explicit turn cancellation. @module @deepseek-ai/dsh-agent/cancellation */
|
|
|
|
import type { AgentInterruptReason } from './types.ts'
|
|
|
|
/**
|
|
* Read a supported agent interruption from an explicitly supplied signal.
|
|
* Unknown reasons return `undefined`; ambient initiator identity does not grant
|
|
* cancellation authority.
|
|
* @param signal - the current turn's explicit control signal.
|
|
* @returns its canonical reason, or `undefined` while live or unsupported.
|
|
*/
|
|
export function agentInterruptReasonOf(signal: AbortSignal): AgentInterruptReason | undefined {
|
|
if (!signal.aborted) return undefined
|
|
const reason: unknown = signal.reason
|
|
if (typeof reason !== 'object' || reason === null || Array.isArray(reason)) return undefined
|
|
const prototype = Object.getPrototypeOf(reason) as unknown
|
|
const keys = Reflect.ownKeys(reason)
|
|
if ((prototype !== Object.prototype && prototype !== null)
|
|
|| keys.length !== 1 || keys[0] !== 'kind') return undefined
|
|
switch ((reason as { readonly kind?: unknown }).kind) {
|
|
case 'user':
|
|
return Object.freeze({ kind: 'user' })
|
|
case 'parent':
|
|
return Object.freeze({ kind: 'parent' })
|
|
case 'disposed':
|
|
return Object.freeze({ kind: 'disposed' })
|
|
default:
|
|
return undefined
|
|
}
|
|
}
|