- Update project branding from claude-cli to Kode - Reorganize documentation with new development guides - Add CONTRIBUTING.md and Chinese README - Remove worktree_merge command and relocate system-design.md - Update dependencies and package configuration - Improve custom commands service with better error handling - Clean up storage utilities and debug logging
73 lines
1.6 KiB
TypeScript
73 lines
1.6 KiB
TypeScript
// Request Context for perfect state isolation
|
|
// Based on official Kode patterns
|
|
|
|
export interface RequestContext {
|
|
id: string
|
|
abortController: AbortController
|
|
startTime: number
|
|
isActive: boolean
|
|
type: 'query' | 'tool' | 'koding'
|
|
}
|
|
|
|
export interface AbortBarrier {
|
|
requestId: string
|
|
checkAbort(): boolean
|
|
onAbort(callback: () => void): void
|
|
cleanup(): void
|
|
}
|
|
|
|
export function createRequestContext(
|
|
type: RequestContext['type'] = 'query',
|
|
): RequestContext {
|
|
return {
|
|
id: crypto.randomUUID(),
|
|
abortController: new AbortController(),
|
|
startTime: Date.now(),
|
|
isActive: true,
|
|
type,
|
|
}
|
|
}
|
|
|
|
export function createAbortBarrier(
|
|
requestContext: RequestContext,
|
|
): AbortBarrier {
|
|
let cleanupCallbacks: (() => void)[] = []
|
|
|
|
return {
|
|
requestId: requestContext.id,
|
|
|
|
checkAbort(): boolean {
|
|
// Only respond to aborts for THIS specific request
|
|
return (
|
|
requestContext.isActive && requestContext.abortController.signal.aborted
|
|
)
|
|
},
|
|
|
|
onAbort(callback: () => void): void {
|
|
if (requestContext.isActive) {
|
|
const abortHandler = () => {
|
|
if (requestContext.isActive) {
|
|
callback()
|
|
}
|
|
}
|
|
requestContext.abortController.signal.addEventListener(
|
|
'abort',
|
|
abortHandler,
|
|
)
|
|
cleanupCallbacks.push(() => {
|
|
requestContext.abortController.signal.removeEventListener(
|
|
'abort',
|
|
abortHandler,
|
|
)
|
|
})
|
|
}
|
|
},
|
|
|
|
cleanup(): void {
|
|
cleanupCallbacks.forEach(cleanup => cleanup())
|
|
cleanupCallbacks = []
|
|
requestContext.isActive = false
|
|
},
|
|
}
|
|
}
|