@byok-sdk/ui-runtime 0.23.0 → 0.25.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,4 +10,4 @@ import { replayTimeline } from '@byok-sdk/ui-runtime';
10
10
  const snapshot = replayTimeline(activityTail);
11
11
  ```
12
12
 
13
- MIT licensed. Node.js 22.22.0 or newer.
13
+ MIT licensed. Node.js 24.15.0 or newer.
package/dist/index.js CHANGED
@@ -489,7 +489,7 @@ function projectItems2(events) {
489
489
  switch (event.type) {
490
490
  case "progress": {
491
491
  const last = items.at(-1);
492
- if (last?.kind === "text-activity" && previous !== void 0 && contiguous(previous, timelineEvent)) {
492
+ if (last?.kind === "text-activity" && previous?.event.type === "progress" && contiguous(previous, timelineEvent)) {
493
493
  items[items.length - 1] = Object.freeze({
494
494
  ...last,
495
495
  eventKeys: Object.freeze([...last.eventKeys, key]),
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/approval-types.ts","../src/approval-timeline.ts","../src/types.ts","../src/timeline.ts"],"names":["sameIdentity","DEFAULT_METADATA","fail","validTaskId","validateMetadata","structurallyEqual","projectItems"],"mappings":"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","file":"index.js","sourcesContent":["import type { ApprovalObservation } from '@byok-sdk/cloud';\n\nexport const APPROVAL_LIFECYCLE_STATES = [\n 'approval-requested',\n 'approval-responded',\n] as const;\n\nexport type ApprovalLifecycleState = (typeof APPROVAL_LIFECYCLE_STATES)[number];\n\nexport const APPROVAL_DECISION_STATES = ['pending', 'approved', 'rejected'] as const;\n\nexport type ApprovalDecisionState = (typeof APPROVAL_DECISION_STATES)[number];\n\nexport const APPROVAL_CORRELATION_STATES = [\n 'paired',\n 'unpaired-request',\n 'unpaired-resolution',\n] as const;\n\nexport type ApprovalCorrelationState = (typeof APPROVAL_CORRELATION_STATES)[number];\n\nexport interface ApprovalProjectionMetadata {\n readonly dropped: number;\n readonly capacity?: number;\n readonly expiresAt?: string;\n readonly cursor?: number;\n}\n\nexport interface ApprovalProjectionState {\n readonly taskId: string;\n readonly observations: readonly ApprovalObservation[];\n readonly metadata: ApprovalProjectionMetadata;\n}\n\nexport interface ApprovalProjectionItem {\n readonly kind: 'approval';\n readonly approvalId?: string;\n readonly lifecycle: ApprovalLifecycleState;\n readonly status: ApprovalDecisionState;\n readonly correlation: ApprovalCorrelationState;\n readonly firstRevision: number;\n readonly sourceRevisions: readonly number[];\n readonly sourceEnvelopeIds: readonly string[];\n readonly summary?: string;\n readonly decision?: 'approve' | 'reject';\n /** The authority that resolved the request on the cloud approval timeline. */\n readonly resolvedBy?: 'local' | 'host';\n readonly resolvedAt?: string;\n}\n\nexport interface TaskApprovalSnapshot {\n readonly taskId: string;\n readonly items: readonly ApprovalProjectionItem[];\n readonly dropped: number;\n readonly capacity?: number;\n readonly expiresAt?: string;\n readonly cursor?: number;\n}\n\nexport const APPROVAL_PROJECTION_ERROR_CODES = [\n 'approval_input_invalid',\n 'approval_task_mismatch',\n 'approval_identity_collision',\n 'approval_revision_collision',\n 'approval_authority_collision',\n] as const;\n\nexport type ApprovalProjectionErrorCode = (typeof APPROVAL_PROJECTION_ERROR_CODES)[number];\n\nexport class ApprovalProjectionError extends Error {\n readonly code: ApprovalProjectionErrorCode;\n\n constructor(code: ApprovalProjectionErrorCode, message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'ApprovalProjectionError';\n this.code = code;\n }\n}\n","import {\n ApprovalObservationSchema,\n type ApprovalObservation,\n type ApprovalTimelineTail,\n} from '@byok-sdk/cloud';\nimport {\n ApprovalProjectionError,\n type ApprovalProjectionItem,\n type ApprovalProjectionMetadata,\n type ApprovalProjectionState,\n type TaskApprovalSnapshot,\n} from './approval-types';\n\nconst DEFAULT_METADATA: ApprovalProjectionMetadata = Object.freeze({ dropped: 0 });\n\nfunction fail(\n code: ConstructorParameters<typeof ApprovalProjectionError>[0],\n message: string,\n cause?: unknown,\n): never {\n throw new ApprovalProjectionError(code, message, cause === undefined ? undefined : { cause });\n}\n\nfunction validTaskId(taskId: unknown): taskId is string {\n return typeof taskId === 'string' && taskId.length > 0 && taskId.length <= 200;\n}\n\nfunction canonicalTimestamp(value: unknown): value is string {\n return typeof value === 'string'\n && Number.isFinite(Date.parse(value))\n && new Date(value).toISOString() === value;\n}\n\nfunction validateMetadata(metadata: ApprovalProjectionMetadata): ApprovalProjectionMetadata {\n if (!Number.isSafeInteger(metadata.dropped) || metadata.dropped < 0) {\n fail('approval_input_invalid', 'Approval metadata dropped must be a non-negative integer.');\n }\n if (metadata.capacity !== undefined && (!Number.isSafeInteger(metadata.capacity) || metadata.capacity <= 0)) {\n fail('approval_input_invalid', 'Approval metadata capacity must be a positive integer when present.');\n }\n if (metadata.expiresAt !== undefined && !canonicalTimestamp(metadata.expiresAt)) {\n fail('approval_input_invalid', 'Approval metadata expiresAt must be a canonical ISO timestamp when present.');\n }\n if (metadata.cursor !== undefined && (!Number.isSafeInteger(metadata.cursor) || metadata.cursor <= 0)) {\n fail('approval_input_invalid', 'Approval metadata cursor must be a positive integer when present.');\n }\n return Object.freeze({ ...metadata });\n}\n\nfunction parseObservation(value: ApprovalObservation): ApprovalObservation {\n try {\n return Object.freeze(structuredClone(ApprovalObservationSchema.parse(value))) as ApprovalObservation;\n } catch (error) {\n fail('approval_input_invalid', 'Approval observation must satisfy the typed cloud authority.', error);\n }\n}\n\nfunction structurallyEqual(left: unknown, right: unknown, seen = new WeakMap<object, object>()): boolean {\n if (Object.is(left, right)) return true;\n if (left === null || right === null || typeof left !== 'object' || typeof right !== 'object') return false;\n if (Array.isArray(left) !== Array.isArray(right)) return false;\n const prior = seen.get(left);\n if (prior !== undefined) return prior === right;\n seen.set(left, right);\n if (Array.isArray(left) && Array.isArray(right)) {\n return left.length === right.length\n && left.every((entry, index) => structurallyEqual(entry, right[index], seen));\n }\n const leftRecord = left as Record<string, unknown>;\n const rightRecord = right as Record<string, unknown>;\n const leftKeys = Object.keys(leftRecord).sort();\n const rightKeys = Object.keys(rightRecord).sort();\n return leftKeys.length === rightKeys.length\n && leftKeys.every(\n (key, index) => key === rightKeys[index]\n && structurallyEqual(leftRecord[key], rightRecord[key], seen),\n );\n}\n\nfunction freezeItem(item: ApprovalProjectionItem): ApprovalProjectionItem {\n return Object.freeze({\n ...item,\n sourceRevisions: Object.freeze([...item.sourceRevisions]),\n sourceEnvelopeIds: Object.freeze([...item.sourceEnvelopeIds]),\n });\n}\n\ninterface ApprovalAccumulator {\n readonly approvalId: string;\n readonly observations: ApprovalObservation[];\n request?: Extract<ApprovalObservation['event'], { type: 'approval_requested' }>;\n resolution?: Extract<ApprovalObservation['event'], { type: 'approval_resolved' }>;\n}\n\nfunction accumulatedItem(accumulator: ApprovalAccumulator): ApprovalProjectionItem {\n const observations = [...accumulator.observations].sort((left, right) => left.revision - right.revision);\n const resolution = accumulator.resolution;\n return freezeItem({\n kind: 'approval',\n approvalId: accumulator.approvalId,\n lifecycle: resolution === undefined ? 'approval-requested' : 'approval-responded',\n status: resolution === undefined ? 'pending' : resolution.decision === 'approve' ? 'approved' : 'rejected',\n correlation: accumulator.request === undefined\n ? 'unpaired-resolution'\n : resolution === undefined\n ? 'unpaired-request'\n : 'paired',\n firstRevision: observations[0]!.revision,\n sourceRevisions: observations.map(({ revision }) => revision),\n sourceEnvelopeIds: observations.map(({ sourceEnvelopeId }) => sourceEnvelopeId),\n ...(accumulator.request !== undefined ? { summary: accumulator.request.summary } : {}),\n ...(resolution !== undefined ? {\n decision: resolution.decision,\n resolvedBy: resolution.resolvedBy,\n resolvedAt: resolution.at,\n } : {}),\n });\n}\n\nfunction unpairedRequest(observation: ApprovalObservation): ApprovalProjectionItem {\n const event = observation.event;\n if (event.type !== 'approval_requested') {\n fail('approval_input_invalid', 'Only approval requests may omit native approval identity.');\n }\n return freezeItem({\n kind: 'approval',\n lifecycle: 'approval-requested',\n status: 'pending',\n correlation: 'unpaired-request',\n firstRevision: observation.revision,\n sourceRevisions: [observation.revision],\n sourceEnvelopeIds: [observation.sourceEnvelopeId],\n summary: event.summary,\n });\n}\n\nfunction unpairedResolution(observation: ApprovalObservation): ApprovalProjectionItem {\n const event = observation.event;\n if (event.type !== 'approval_resolved') {\n fail('approval_input_invalid', 'Only approval resolutions may omit native approval identity.');\n }\n return freezeItem({\n kind: 'approval',\n lifecycle: 'approval-responded',\n status: event.decision === 'approve' ? 'approved' : 'rejected',\n correlation: 'unpaired-resolution',\n firstRevision: observation.revision,\n sourceRevisions: [observation.revision],\n sourceEnvelopeIds: [observation.sourceEnvelopeId],\n decision: event.decision,\n resolvedBy: event.resolvedBy,\n resolvedAt: event.at,\n });\n}\n\nfunction projectItems(observations: readonly ApprovalObservation[]): readonly ApprovalProjectionItem[] {\n const items: ApprovalProjectionItem[] = [];\n const identified = new Map<string, ApprovalAccumulator>();\n\n for (const observation of observations) {\n const event = observation.event;\n if (event.type === 'approval_requested' && event.approvalId === undefined) {\n items.push(unpairedRequest(observation));\n continue;\n }\n\n if (event.type === 'approval_resolved' && event.approvalId === undefined) {\n items.push(unpairedResolution(observation));\n continue;\n }\n const approvalId = event.approvalId;\n if (approvalId === undefined) {\n fail('approval_input_invalid', 'Approval identity was not handled by its explicit unpaired path.');\n }\n const accumulator = identified.get(approvalId) ?? { approvalId, observations: [] };\n identified.set(approvalId, accumulator);\n accumulator.observations.push(observation);\n\n if (event.type === 'approval_requested') {\n if (accumulator.request !== undefined && !structurallyEqual(accumulator.request, event)) {\n fail('approval_authority_collision', `Approval ${approvalId} has conflicting request authority.`);\n }\n accumulator.request = event;\n } else {\n if (accumulator.resolution !== undefined && !structurallyEqual(accumulator.resolution, event)) {\n fail('approval_authority_collision', `Approval ${approvalId} has conflicting resolution authority.`);\n }\n accumulator.resolution = event;\n }\n }\n\n for (const accumulator of identified.values()) items.push(accumulatedItem(accumulator));\n return Object.freeze(items.sort((left, right) => left.firstRevision - right.firstRevision));\n}\n\nexport function createApprovalProjectionState(\n taskId: string,\n metadata: ApprovalProjectionMetadata = DEFAULT_METADATA,\n): ApprovalProjectionState {\n if (!validTaskId(taskId)) {\n fail('approval_input_invalid', 'Approval taskId must contain 1 to 200 characters.');\n }\n return Object.freeze({\n taskId,\n observations: Object.freeze([]),\n metadata: validateMetadata(metadata),\n });\n}\n\nexport function withApprovalProjectionMetadata(\n state: ApprovalProjectionState,\n metadata: ApprovalProjectionMetadata,\n): ApprovalProjectionState {\n if (!validTaskId(state.taskId)) fail('approval_input_invalid', 'Approval state taskId is invalid.');\n return Object.freeze({\n taskId: state.taskId,\n observations: state.observations,\n metadata: validateMetadata(metadata),\n });\n}\n\nexport function foldApprovalObservation(\n state: ApprovalProjectionState,\n input: ApprovalObservation,\n): ApprovalProjectionState {\n if (!validTaskId(state.taskId)) fail('approval_input_invalid', 'Approval state taskId is invalid.');\n const observation = parseObservation(input);\n if (observation.taskId !== state.taskId) {\n fail(\n 'approval_task_mismatch',\n `Approval observation task ${observation.taskId} does not match state task ${state.taskId}.`,\n );\n }\n const identical = state.observations.find(\n ({ sourceEnvelopeId }) => sourceEnvelopeId === observation.sourceEnvelopeId,\n );\n if (identical !== undefined) {\n if (structurallyEqual(identical, observation)) return state;\n fail('approval_identity_collision', 'Approval source identity was reused for different content.');\n }\n if (state.observations.some(({ revision }) => revision === observation.revision)) {\n fail('approval_revision_collision', 'Approval revision was claimed by different source identity.');\n }\n const observations = [...state.observations, observation]\n .sort((left, right) => left.revision - right.revision);\n return Object.freeze({\n taskId: state.taskId,\n observations: Object.freeze(observations),\n metadata: state.metadata,\n });\n}\n\nexport function foldApprovalTail(\n state: ApprovalProjectionState,\n tail: ApprovalTimelineTail,\n): ApprovalProjectionState {\n if (tail === null || typeof tail !== 'object' || !validTaskId(tail.taskId) || !Array.isArray(tail.entries)) {\n fail('approval_input_invalid', 'Approval tail must contain a valid taskId and entries array.');\n }\n if (tail.taskId !== state.taskId) {\n fail('approval_task_mismatch', `Approval tail task ${tail.taskId} does not match state task ${state.taskId}.`);\n }\n const revisions = tail.entries.map(({ revision }) => revision);\n if (revisions.some((revision) => !Number.isSafeInteger(revision) || revision <= 0)) {\n fail('approval_input_invalid', 'Approval tail revisions must be positive integers.');\n }\n if (revisions.some((revision, index) => index > 0 && revision <= revisions[index - 1]!)) {\n fail('approval_input_invalid', 'Approval tail entries must be strictly ordered by native revision.');\n }\n if (tail.cursor !== revisions.at(-1)) {\n fail('approval_input_invalid', 'Approval tail cursor must equal its last retained revision.');\n }\n const stateCursor = state.observations.at(-1)?.revision;\n if (stateCursor !== undefined && (tail.cursor === undefined || tail.cursor < stateCursor)) {\n fail('approval_input_invalid', 'Approval tail cursor must not move behind incremental state.');\n }\n for (const observation of tail.entries) {\n const sameIdentity = state.observations.find(\n ({ sourceEnvelopeId }) => sourceEnvelopeId === observation.sourceEnvelopeId,\n );\n if (sameIdentity !== undefined && !structurallyEqual(sameIdentity, observation)) {\n fail('approval_identity_collision', 'Approval source identity changed across tail snapshots.');\n }\n const sameRevision = state.observations.find(({ revision }) => revision === observation.revision);\n if (sameRevision !== undefined && sameRevision.sourceEnvelopeId !== observation.sourceEnvelopeId) {\n fail('approval_revision_collision', 'Approval revision changed source identity across tail snapshots.');\n }\n }\n let next = createApprovalProjectionState(state.taskId, {\n dropped: tail.dropped,\n capacity: tail.capacity,\n expiresAt: tail.expiresAt,\n ...(tail.cursor !== undefined ? { cursor: tail.cursor } : {}),\n });\n for (const observation of tail.entries) next = foldApprovalObservation(next, observation);\n return next;\n}\n\nexport function projectApprovalTimeline(state: ApprovalProjectionState): TaskApprovalSnapshot {\n if (!validTaskId(state.taskId)) fail('approval_input_invalid', 'Approval state taskId is invalid.');\n return Object.freeze({\n taskId: state.taskId,\n items: projectItems(state.observations),\n dropped: state.metadata.dropped,\n ...(state.metadata.capacity !== undefined ? { capacity: state.metadata.capacity } : {}),\n ...(state.metadata.expiresAt !== undefined ? { expiresAt: state.metadata.expiresAt } : {}),\n ...(state.metadata.cursor !== undefined ? { cursor: state.metadata.cursor } : {}),\n });\n}\n\nexport function replayApprovalTimeline(tail: ApprovalTimelineTail): TaskApprovalSnapshot {\n if (tail === null || typeof tail !== 'object' || !validTaskId(tail.taskId) || !Array.isArray(tail.entries)) {\n fail('approval_input_invalid', 'Approval tail must contain a valid taskId and entries array.');\n }\n return projectApprovalTimeline(foldApprovalTail(createApprovalProjectionState(tail.taskId), tail));\n}\n","import type { ActivityCursor, TimelineEvent } from '@byok-sdk/cloud';\nimport type { AgentEventSpill } from '@byok-sdk/protocol';\n\nexport interface TimelineEventKey {\n readonly sourceEnvelopeId: string;\n readonly eventIndex: number;\n}\n\nexport interface TimelineOrderKey {\n readonly taskId: string;\n readonly batchSeq: number;\n readonly eventIndex: number;\n}\n\nexport interface TimelineMetadata {\n readonly dropped: number;\n readonly capacity?: number;\n readonly expiresAt?: string;\n readonly cursor?: ActivityCursor;\n}\n\nexport interface TimelineState {\n readonly taskId: string;\n readonly events: readonly TimelineEvent[];\n readonly metadata: TimelineMetadata;\n}\n\nexport interface TimelineGap {\n readonly kind: 'batch' | 'event';\n readonly after: TimelineOrderKey;\n readonly before: TimelineOrderKey;\n readonly missing: number;\n}\n\ninterface TimelineItemBase {\n readonly eventKeys: readonly TimelineEventKey[];\n readonly orderKey: TimelineOrderKey;\n}\n\nexport interface TimelineTextFragment {\n readonly eventKey: TimelineEventKey;\n readonly text: string;\n}\n\nexport interface TextActivityTimelineItem extends TimelineItemBase {\n readonly kind: 'text-activity';\n readonly fragments: readonly TimelineTextFragment[];\n}\n\nexport const TOOL_TIMELINE_STATES = [\n 'input-available',\n 'output-available',\n 'output-error',\n 'output-unknown',\n 'unpaired-use',\n 'unpaired-result',\n] as const;\n\nexport type ToolTimelineState = (typeof TOOL_TIMELINE_STATES)[number];\n\nexport interface ToolTimelineItem extends TimelineItemBase {\n readonly kind: 'tool';\n readonly tool: string;\n readonly toolCallId?: string;\n readonly state: ToolTimelineState;\n readonly input?: unknown;\n readonly output?: unknown;\n /** Present exactly when the source `tool_use` event carried `spill` (see `docs/protocol.md` §11.6); render the truncation from this, never infer it from the `{ preview }` shape. */\n readonly inputSpill?: AgentEventSpill;\n /** Present exactly when the source `tool_result` event carried `spill` (see `docs/protocol.md` §11.6); render the truncation from this, never infer it from the `{ preview }` shape. */\n readonly outputSpill?: AgentEventSpill;\n}\n\nexport interface ArtifactTimelineItem extends TimelineItemBase {\n readonly kind: 'artifact';\n readonly name: string;\n readonly contentType: string;\n}\n\nexport interface UsageTimelineItem extends TimelineItemBase {\n readonly kind: 'usage';\n readonly inputTokens?: number;\n readonly cachedInputTokens?: number;\n readonly outputTokens?: number;\n readonly reasoningTokens?: number;\n readonly totalTokens?: number;\n}\n\nexport interface ErrorTimelineItem extends TimelineItemBase {\n readonly kind: 'error';\n readonly message: string;\n}\n\nexport interface BoundaryTimelineItem extends TimelineItemBase {\n readonly kind: 'boundary';\n}\n\nexport interface UnknownTimelineItem extends TimelineItemBase {\n readonly kind: 'unknown';\n readonly eventType: string;\n readonly classification: 'unknown-event' | 'unsupported-known-event';\n}\n\nexport type TimelineItem =\n | TextActivityTimelineItem\n | ToolTimelineItem\n | ArtifactTimelineItem\n | UsageTimelineItem\n | ErrorTimelineItem\n | BoundaryTimelineItem\n | UnknownTimelineItem;\n\nexport interface TaskTimelineSnapshot {\n readonly taskId: string;\n readonly items: readonly TimelineItem[];\n readonly gaps: readonly TimelineGap[];\n readonly dropped: number;\n readonly capacity?: number;\n readonly expiresAt?: string;\n readonly cursor?: ActivityCursor;\n}\n\nexport const TIMELINE_FOLD_ERROR_CODES = [\n 'timeline_input_invalid',\n 'task_mismatch',\n 'identity_collision',\n 'order_collision',\n 'tool_collision',\n] as const;\n\nexport type TimelineFoldErrorCode = (typeof TIMELINE_FOLD_ERROR_CODES)[number];\n\nexport class TimelineFoldError extends Error {\n readonly code: TimelineFoldErrorCode;\n\n constructor(code: TimelineFoldErrorCode, message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'TimelineFoldError';\n this.code = code;\n }\n}\n","import {\n TimelineEventSchema,\n type ActivityTail,\n type TimelineEvent,\n} from '@byok-sdk/cloud';\nimport { isKnownAgentEvent, type AgentEvent } from '@byok-sdk/protocol';\nimport {\n TimelineFoldError,\n type TaskTimelineSnapshot,\n type TimelineEventKey,\n type TimelineGap,\n type TimelineItem,\n type TimelineMetadata,\n type TimelineOrderKey,\n type TimelineState,\n type ToolTimelineItem,\n} from './types';\n\ntype ToolUseEvent = Extract<AgentEvent, { type: 'tool_use' }>;\ntype ToolResultEvent = Extract<AgentEvent, { type: 'tool_result' }>;\n\ninterface ToolObservation {\n readonly timelineEvent: TimelineEvent;\n readonly event: ToolUseEvent | ToolResultEvent;\n}\n\ninterface ToolAccumulator {\n readonly itemIndex: number;\n readonly tool: string;\n use?: ToolObservation;\n result?: ToolObservation;\n}\n\nconst DEFAULT_METADATA: TimelineMetadata = Object.freeze({ dropped: 0 });\n\nfunction compareEvents(left: TimelineEvent, right: TimelineEvent): number {\n return left.batchSeq - right.batchSeq || left.eventIndex - right.eventIndex;\n}\n\nfunction fail(code: ConstructorParameters<typeof TimelineFoldError>[0], message: string, cause?: unknown): never {\n throw new TimelineFoldError(code, message, cause === undefined ? undefined : { cause });\n}\n\nfunction validTaskId(taskId: unknown): taskId is string {\n return typeof taskId === 'string' && taskId.length > 0 && taskId.length <= 200;\n}\n\nfunction validateMetadata(metadata: TimelineMetadata): TimelineMetadata {\n if (!Number.isSafeInteger(metadata.dropped) || metadata.dropped < 0) {\n fail('timeline_input_invalid', 'Timeline metadata dropped must be a non-negative integer.');\n }\n if (metadata.capacity !== undefined && (!Number.isSafeInteger(metadata.capacity) || metadata.capacity <= 0)) {\n fail('timeline_input_invalid', 'Timeline metadata capacity must be a positive integer when present.');\n }\n if (metadata.expiresAt !== undefined && (\n typeof metadata.expiresAt !== 'string'\n || !Number.isFinite(Date.parse(metadata.expiresAt))\n || new Date(metadata.expiresAt).toISOString() !== metadata.expiresAt\n )) {\n fail('timeline_input_invalid', 'Timeline metadata expiresAt must be a canonical ISO timestamp when present.');\n }\n if (metadata.cursor !== undefined && (\n !Number.isSafeInteger(metadata.cursor.batchSeq) || metadata.cursor.batchSeq < 0\n || !Number.isSafeInteger(metadata.cursor.eventIndex) || metadata.cursor.eventIndex < 0\n )) {\n fail('timeline_input_invalid', 'Timeline metadata cursor must contain non-negative integer coordinates.');\n }\n return Object.freeze({ ...metadata, cursor: metadata.cursor && Object.freeze({ ...metadata.cursor }) });\n}\n\nfunction deepFreeze<T>(value: T, seen = new WeakSet<object>()): T {\n if (value === null || typeof value !== 'object') return value;\n if (seen.has(value)) return value;\n seen.add(value);\n for (const nested of Object.values(value as Record<string, unknown>)) deepFreeze(nested, seen);\n return Object.freeze(value);\n}\n\nfunction assertWireValue(value: unknown, seen = new WeakSet<object>()): void {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return;\n if (typeof value === 'number') {\n if (Number.isFinite(value)) return;\n fail('timeline_input_invalid', 'Timeline event payload numbers must be finite JSON values.');\n }\n if (typeof value !== 'object') {\n fail('timeline_input_invalid', 'Timeline event payloads must contain JSON-compatible values.');\n }\n if (seen.has(value)) fail('timeline_input_invalid', 'Timeline event payloads must not contain cycles.');\n seen.add(value);\n if (Array.isArray(value)) {\n for (const entry of value) assertWireValue(entry, seen);\n } else {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n fail('timeline_input_invalid', 'Timeline event payload objects must be plain JSON records.');\n }\n for (const entry of Object.values(value as Record<string, unknown>)) assertWireValue(entry, seen);\n }\n seen.delete(value);\n}\n\nfunction parseEvent(value: TimelineEvent): TimelineEvent {\n try {\n const parsed = TimelineEventSchema.parse(value);\n assertWireValue(parsed);\n return deepFreeze(structuredClone(parsed)) as TimelineEvent;\n } catch (error) {\n fail('timeline_input_invalid', 'Timeline events must satisfy the typed cloud activity authority.', error);\n }\n}\n\nfunction structurallyEqual(left: unknown, right: unknown, seen = new WeakMap<object, object>()): boolean {\n if (Object.is(left, right)) return true;\n if (left === null || right === null || typeof left !== 'object' || typeof right !== 'object') return false;\n if (Array.isArray(left) !== Array.isArray(right)) return false;\n const prior = seen.get(left);\n if (prior !== undefined) return prior === right;\n seen.set(left, right);\n if (Array.isArray(left) && Array.isArray(right)) {\n return left.length === right.length && left.every((entry, index) => structurallyEqual(entry, right[index], seen));\n }\n const leftRecord = left as Record<string, unknown>;\n const rightRecord = right as Record<string, unknown>;\n const leftKeys = Object.keys(leftRecord).sort();\n const rightKeys = Object.keys(rightRecord).sort();\n return leftKeys.length === rightKeys.length\n && leftKeys.every((key, index) => key === rightKeys[index] && structurallyEqual(leftRecord[key], rightRecord[key], seen));\n}\n\nfunction eventKey(event: TimelineEvent): TimelineEventKey {\n return Object.freeze({ sourceEnvelopeId: event.sourceEnvelopeId, eventIndex: event.eventIndex });\n}\n\nfunction orderKey(event: TimelineEvent): TimelineOrderKey {\n return Object.freeze({ taskId: event.taskId, batchSeq: event.batchSeq, eventIndex: event.eventIndex });\n}\n\nfunction sameIdentity(left: TimelineEvent, right: TimelineEvent): boolean {\n return left.sourceEnvelopeId === right.sourceEnvelopeId && left.eventIndex === right.eventIndex;\n}\n\nfunction sameOrder(left: TimelineEvent, right: TimelineEvent): boolean {\n return left.batchSeq === right.batchSeq && left.eventIndex === right.eventIndex;\n}\n\nfunction contiguous(left: TimelineEvent, right: TimelineEvent): boolean {\n return (left.batchSeq === right.batchSeq && right.eventIndex === left.eventIndex + 1)\n || (right.batchSeq === left.batchSeq + 1 && right.eventIndex === 0);\n}\n\nfunction gapsFor(events: readonly TimelineEvent[]): readonly TimelineGap[] {\n const gaps: TimelineGap[] = [];\n for (let index = 1; index < events.length; index += 1) {\n const previous = events[index - 1]!;\n const current = events[index]!;\n if (current.batchSeq === previous.batchSeq && current.eventIndex > previous.eventIndex + 1) {\n gaps.push(Object.freeze({\n kind: 'event',\n after: orderKey(previous),\n before: orderKey(current),\n missing: current.eventIndex - previous.eventIndex - 1,\n }));\n continue;\n }\n if (current.batchSeq > previous.batchSeq) {\n if (current.batchSeq > previous.batchSeq + 1) {\n gaps.push(Object.freeze({\n kind: 'batch',\n after: orderKey(previous),\n before: orderKey(current),\n missing: current.batchSeq - previous.batchSeq - 1,\n }));\n }\n if (current.eventIndex > 0) {\n gaps.push(Object.freeze({\n kind: 'event',\n after: orderKey(previous),\n before: orderKey(current),\n missing: current.eventIndex,\n }));\n }\n }\n }\n return Object.freeze(gaps);\n}\n\nfunction toolItem(accumulator: ToolAccumulator, toolCallId: string): ToolTimelineItem {\n const observations = [accumulator.use?.timelineEvent, accumulator.result?.timelineEvent]\n .filter((event): event is TimelineEvent => event !== undefined)\n .sort(compareEvents);\n const use = accumulator.use?.event as ToolUseEvent | undefined;\n const result = accumulator.result?.event as ToolResultEvent | undefined;\n const state = use === undefined\n ? 'unpaired-result'\n : result === undefined\n ? 'input-available'\n : result.isError === true\n ? 'output-error'\n : result.isError === false\n ? 'output-available'\n : 'output-unknown';\n return Object.freeze({\n kind: 'tool',\n eventKeys: Object.freeze(observations.map(eventKey)),\n orderKey: orderKey(observations[0]!),\n tool: accumulator.tool,\n toolCallId,\n state,\n ...(use && Object.hasOwn(use, 'input') ? { input: use.input } : {}),\n ...(result && Object.hasOwn(result, 'output') ? { output: result.output } : {}),\n ...(use && Object.hasOwn(use, 'spill') ? { inputSpill: use.spill } : {}),\n ...(result && Object.hasOwn(result, 'spill') ? { outputSpill: result.spill } : {}),\n });\n}\n\nfunction unpairedTool(event: TimelineEvent, observation: ToolUseEvent | ToolResultEvent): ToolTimelineItem {\n return Object.freeze({\n kind: 'tool',\n eventKeys: Object.freeze([eventKey(event)]),\n orderKey: orderKey(event),\n tool: observation.tool,\n state: observation.type === 'tool_use' ? 'unpaired-use' : 'unpaired-result',\n ...(observation.type === 'tool_use' && Object.hasOwn(observation, 'input') ? { input: observation.input } : {}),\n ...(observation.type === 'tool_result' && Object.hasOwn(observation, 'output') ? { output: observation.output } : {}),\n ...(observation.type === 'tool_use' && Object.hasOwn(observation, 'spill') ? { inputSpill: observation.spill } : {}),\n ...(observation.type === 'tool_result' && Object.hasOwn(observation, 'spill') ? { outputSpill: observation.spill } : {}),\n });\n}\n\nfunction projectItems(events: readonly TimelineEvent[]): readonly TimelineItem[] {\n const items: TimelineItem[] = [];\n const tools = new Map<string, ToolAccumulator>();\n let previous: TimelineEvent | undefined;\n\n for (const timelineEvent of events) {\n const key = eventKey(timelineEvent);\n const order = orderKey(timelineEvent);\n const event = timelineEvent.event;\n if (!isKnownAgentEvent(event)) {\n items.push(Object.freeze({\n kind: 'unknown', eventKeys: Object.freeze([key]), orderKey: order,\n eventType: event.type, classification: 'unknown-event',\n }));\n previous = timelineEvent;\n continue;\n }\n\n switch (event.type) {\n case 'progress': {\n const last = items.at(-1);\n if (last?.kind === 'text-activity' && previous !== undefined && contiguous(previous, timelineEvent)) {\n items[items.length - 1] = Object.freeze({\n ...last,\n eventKeys: Object.freeze([...last.eventKeys, key]),\n fragments: Object.freeze([...last.fragments, Object.freeze({ eventKey: key, text: event.text })]),\n });\n } else {\n items.push(Object.freeze({\n kind: 'text-activity', eventKeys: Object.freeze([key]), orderKey: order,\n fragments: Object.freeze([Object.freeze({ eventKey: key, text: event.text })]),\n }));\n }\n break;\n }\n case 'tool_use':\n case 'tool_result': {\n const callId = event.toolCallId;\n if (callId === undefined) {\n items.push(unpairedTool(timelineEvent, event));\n break;\n }\n let accumulator = tools.get(callId);\n if (accumulator === undefined) {\n accumulator = { itemIndex: items.length, tool: event.tool };\n tools.set(callId, accumulator);\n items.push(unpairedTool(timelineEvent, event));\n } else if (accumulator.tool !== event.tool) {\n fail('tool_collision', `Tool call ${callId} changed tool name from ${accumulator.tool} to ${event.tool}.`);\n }\n if (event.type === 'tool_use') {\n if (accumulator.use !== undefined) fail('tool_collision', `Tool call ${callId} has multiple tool_use observations.`);\n accumulator.use = { timelineEvent, event };\n } else {\n if (accumulator.result !== undefined) fail('tool_collision', `Tool call ${callId} has multiple tool_result observations.`);\n accumulator.result = { timelineEvent, event };\n }\n items[accumulator.itemIndex] = toolItem(accumulator, callId);\n break;\n }\n case 'artifact':\n items.push(Object.freeze({\n kind: 'artifact', eventKeys: Object.freeze([key]), orderKey: order,\n name: event.name, contentType: event.contentType,\n }));\n break;\n case 'usage':\n items.push(Object.freeze({\n kind: 'usage', eventKeys: Object.freeze([key]), orderKey: order,\n ...(event.inputTokens !== undefined ? { inputTokens: event.inputTokens } : {}),\n ...(event.cachedInputTokens !== undefined ? { cachedInputTokens: event.cachedInputTokens } : {}),\n ...(event.outputTokens !== undefined ? { outputTokens: event.outputTokens } : {}),\n ...(event.reasoningTokens !== undefined ? { reasoningTokens: event.reasoningTokens } : {}),\n ...(event.totalTokens !== undefined ? { totalTokens: event.totalTokens } : {}),\n }));\n break;\n case 'error':\n items.push(Object.freeze({\n kind: 'error', eventKeys: Object.freeze([key]), orderKey: order, message: event.message,\n }));\n break;\n case 'turn_end':\n items.push(Object.freeze({ kind: 'boundary', eventKeys: Object.freeze([key]), orderKey: order }));\n break;\n case 'needs_approval':\n items.push(Object.freeze({\n kind: 'unknown', eventKeys: Object.freeze([key]), orderKey: order,\n eventType: event.type, classification: 'unsupported-known-event',\n }));\n break;\n default: {\n // A newer protocol package can classify a variant as known even when\n // this older UI runtime has no semantic projection for it. Preserve\n // its position without interpreting or exposing its opaque payload.\n const unsupported = event as { readonly type: string };\n items.push(Object.freeze({\n kind: 'unknown', eventKeys: Object.freeze([key]), orderKey: order,\n eventType: unsupported.type, classification: 'unsupported-known-event',\n }));\n }\n }\n previous = timelineEvent;\n }\n return Object.freeze(items);\n}\n\nexport function createTimelineState(taskId: string, metadata: TimelineMetadata = DEFAULT_METADATA): TimelineState {\n if (!validTaskId(taskId)) fail('timeline_input_invalid', 'Timeline taskId must contain 1 to 200 characters.');\n return Object.freeze({ taskId, events: Object.freeze([]), metadata: validateMetadata(metadata) });\n}\n\nexport function withTimelineMetadata(state: TimelineState, metadata: TimelineMetadata): TimelineState {\n if (!validTaskId(state.taskId)) fail('timeline_input_invalid', 'Timeline state taskId is invalid.');\n return Object.freeze({ taskId: state.taskId, events: state.events, metadata: validateMetadata(metadata) });\n}\n\nexport function foldTimelineEvent(state: TimelineState, input: TimelineEvent): TimelineState {\n if (!validTaskId(state.taskId)) fail('timeline_input_invalid', 'Timeline state taskId is invalid.');\n const event = parseEvent(input);\n if (event.taskId !== state.taskId) {\n fail('task_mismatch', `Timeline event task ${event.taskId} does not match state task ${state.taskId}.`);\n }\n const identical = state.events.find((existing) => sameIdentity(existing, event));\n if (identical !== undefined) {\n if (structurallyEqual(identical, event)) return state;\n fail('identity_collision', 'Timeline identity was reused for different event content.');\n }\n if (state.events.some((existing) => sameOrder(existing, event))) {\n fail('order_collision', 'Timeline order coordinates were claimed by different source identities.');\n }\n const events = [...state.events, event].sort(compareEvents);\n return Object.freeze({ taskId: state.taskId, events: Object.freeze(events), metadata: state.metadata });\n}\n\nexport function projectTimeline(state: TimelineState): TaskTimelineSnapshot {\n if (!validTaskId(state.taskId)) fail('timeline_input_invalid', 'Timeline state taskId is invalid.');\n return Object.freeze({\n taskId: state.taskId,\n items: projectItems(state.events),\n gaps: gapsFor(state.events),\n dropped: state.metadata.dropped,\n ...(state.metadata.capacity !== undefined ? { capacity: state.metadata.capacity } : {}),\n ...(state.metadata.expiresAt !== undefined ? { expiresAt: state.metadata.expiresAt } : {}),\n ...(state.metadata.cursor !== undefined ? { cursor: state.metadata.cursor } : {}),\n });\n}\n\nexport function replayTimeline(tail: ActivityTail): TaskTimelineSnapshot {\n if (tail === null || typeof tail !== 'object' || !validTaskId(tail.taskId) || !Array.isArray(tail.entries)) {\n fail('timeline_input_invalid', 'Activity tail must contain a valid taskId and entries array.');\n }\n let state = createTimelineState(tail.taskId, {\n dropped: tail.dropped,\n capacity: tail.capacity,\n expiresAt: tail.expiresAt,\n ...(tail.cursor !== undefined ? { cursor: tail.cursor } : {}),\n });\n for (const event of tail.entries) state = foldTimelineEvent(state, event);\n return projectTimeline(state);\n}\n"]}
1
+ {"version":3,"sources":["../src/approval-types.ts","../src/approval-timeline.ts","../src/types.ts","../src/timeline.ts"],"names":["sameIdentity","DEFAULT_METADATA","fail","validTaskId","validateMetadata","structurallyEqual","projectItems"],"mappings":"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","file":"index.js","sourcesContent":["import type { ApprovalObservation } from '@byok-sdk/cloud';\n\nexport const APPROVAL_LIFECYCLE_STATES = [\n 'approval-requested',\n 'approval-responded',\n] as const;\n\nexport type ApprovalLifecycleState = (typeof APPROVAL_LIFECYCLE_STATES)[number];\n\nexport const APPROVAL_DECISION_STATES = ['pending', 'approved', 'rejected'] as const;\n\nexport type ApprovalDecisionState = (typeof APPROVAL_DECISION_STATES)[number];\n\nexport const APPROVAL_CORRELATION_STATES = [\n 'paired',\n 'unpaired-request',\n 'unpaired-resolution',\n] as const;\n\nexport type ApprovalCorrelationState = (typeof APPROVAL_CORRELATION_STATES)[number];\n\nexport interface ApprovalProjectionMetadata {\n readonly dropped: number;\n readonly capacity?: number;\n readonly expiresAt?: string;\n readonly cursor?: number;\n}\n\nexport interface ApprovalProjectionState {\n readonly taskId: string;\n readonly observations: readonly ApprovalObservation[];\n readonly metadata: ApprovalProjectionMetadata;\n}\n\nexport interface ApprovalProjectionItem {\n readonly kind: 'approval';\n readonly approvalId?: string;\n readonly lifecycle: ApprovalLifecycleState;\n readonly status: ApprovalDecisionState;\n readonly correlation: ApprovalCorrelationState;\n readonly firstRevision: number;\n readonly sourceRevisions: readonly number[];\n readonly sourceEnvelopeIds: readonly string[];\n readonly summary?: string;\n readonly decision?: 'approve' | 'reject';\n /** The authority that resolved the request on the cloud approval timeline. */\n readonly resolvedBy?: 'local' | 'host';\n readonly resolvedAt?: string;\n}\n\nexport interface TaskApprovalSnapshot {\n readonly taskId: string;\n readonly items: readonly ApprovalProjectionItem[];\n readonly dropped: number;\n readonly capacity?: number;\n readonly expiresAt?: string;\n readonly cursor?: number;\n}\n\nexport const APPROVAL_PROJECTION_ERROR_CODES = [\n 'approval_input_invalid',\n 'approval_task_mismatch',\n 'approval_identity_collision',\n 'approval_revision_collision',\n 'approval_authority_collision',\n] as const;\n\nexport type ApprovalProjectionErrorCode = (typeof APPROVAL_PROJECTION_ERROR_CODES)[number];\n\nexport class ApprovalProjectionError extends Error {\n readonly code: ApprovalProjectionErrorCode;\n\n constructor(code: ApprovalProjectionErrorCode, message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'ApprovalProjectionError';\n this.code = code;\n }\n}\n","import {\n ApprovalObservationSchema,\n type ApprovalObservation,\n type ApprovalTimelineTail,\n} from '@byok-sdk/cloud';\nimport {\n ApprovalProjectionError,\n type ApprovalProjectionItem,\n type ApprovalProjectionMetadata,\n type ApprovalProjectionState,\n type TaskApprovalSnapshot,\n} from './approval-types';\n\nconst DEFAULT_METADATA: ApprovalProjectionMetadata = Object.freeze({ dropped: 0 });\n\nfunction fail(\n code: ConstructorParameters<typeof ApprovalProjectionError>[0],\n message: string,\n cause?: unknown,\n): never {\n throw new ApprovalProjectionError(code, message, cause === undefined ? undefined : { cause });\n}\n\nfunction validTaskId(taskId: unknown): taskId is string {\n return typeof taskId === 'string' && taskId.length > 0 && taskId.length <= 200;\n}\n\nfunction canonicalTimestamp(value: unknown): value is string {\n return typeof value === 'string'\n && Number.isFinite(Date.parse(value))\n && new Date(value).toISOString() === value;\n}\n\nfunction validateMetadata(metadata: ApprovalProjectionMetadata): ApprovalProjectionMetadata {\n if (!Number.isSafeInteger(metadata.dropped) || metadata.dropped < 0) {\n fail('approval_input_invalid', 'Approval metadata dropped must be a non-negative integer.');\n }\n if (metadata.capacity !== undefined && (!Number.isSafeInteger(metadata.capacity) || metadata.capacity <= 0)) {\n fail('approval_input_invalid', 'Approval metadata capacity must be a positive integer when present.');\n }\n if (metadata.expiresAt !== undefined && !canonicalTimestamp(metadata.expiresAt)) {\n fail('approval_input_invalid', 'Approval metadata expiresAt must be a canonical ISO timestamp when present.');\n }\n if (metadata.cursor !== undefined && (!Number.isSafeInteger(metadata.cursor) || metadata.cursor <= 0)) {\n fail('approval_input_invalid', 'Approval metadata cursor must be a positive integer when present.');\n }\n return Object.freeze({ ...metadata });\n}\n\nfunction parseObservation(value: ApprovalObservation): ApprovalObservation {\n try {\n return Object.freeze(structuredClone(ApprovalObservationSchema.parse(value))) as ApprovalObservation;\n } catch (error) {\n fail('approval_input_invalid', 'Approval observation must satisfy the typed cloud authority.', error);\n }\n}\n\nfunction structurallyEqual(left: unknown, right: unknown, seen = new WeakMap<object, object>()): boolean {\n if (Object.is(left, right)) return true;\n if (left === null || right === null || typeof left !== 'object' || typeof right !== 'object') return false;\n if (Array.isArray(left) !== Array.isArray(right)) return false;\n const prior = seen.get(left);\n if (prior !== undefined) return prior === right;\n seen.set(left, right);\n if (Array.isArray(left) && Array.isArray(right)) {\n return left.length === right.length\n && left.every((entry, index) => structurallyEqual(entry, right[index], seen));\n }\n const leftRecord = left as Record<string, unknown>;\n const rightRecord = right as Record<string, unknown>;\n const leftKeys = Object.keys(leftRecord).sort();\n const rightKeys = Object.keys(rightRecord).sort();\n return leftKeys.length === rightKeys.length\n && leftKeys.every(\n (key, index) => key === rightKeys[index]\n && structurallyEqual(leftRecord[key], rightRecord[key], seen),\n );\n}\n\nfunction freezeItem(item: ApprovalProjectionItem): ApprovalProjectionItem {\n return Object.freeze({\n ...item,\n sourceRevisions: Object.freeze([...item.sourceRevisions]),\n sourceEnvelopeIds: Object.freeze([...item.sourceEnvelopeIds]),\n });\n}\n\ninterface ApprovalAccumulator {\n readonly approvalId: string;\n readonly observations: ApprovalObservation[];\n request?: Extract<ApprovalObservation['event'], { type: 'approval_requested' }>;\n resolution?: Extract<ApprovalObservation['event'], { type: 'approval_resolved' }>;\n}\n\nfunction accumulatedItem(accumulator: ApprovalAccumulator): ApprovalProjectionItem {\n const observations = [...accumulator.observations].sort((left, right) => left.revision - right.revision);\n const resolution = accumulator.resolution;\n return freezeItem({\n kind: 'approval',\n approvalId: accumulator.approvalId,\n lifecycle: resolution === undefined ? 'approval-requested' : 'approval-responded',\n status: resolution === undefined ? 'pending' : resolution.decision === 'approve' ? 'approved' : 'rejected',\n correlation: accumulator.request === undefined\n ? 'unpaired-resolution'\n : resolution === undefined\n ? 'unpaired-request'\n : 'paired',\n firstRevision: observations[0]!.revision,\n sourceRevisions: observations.map(({ revision }) => revision),\n sourceEnvelopeIds: observations.map(({ sourceEnvelopeId }) => sourceEnvelopeId),\n ...(accumulator.request !== undefined ? { summary: accumulator.request.summary } : {}),\n ...(resolution !== undefined ? {\n decision: resolution.decision,\n resolvedBy: resolution.resolvedBy,\n resolvedAt: resolution.at,\n } : {}),\n });\n}\n\nfunction unpairedRequest(observation: ApprovalObservation): ApprovalProjectionItem {\n const event = observation.event;\n if (event.type !== 'approval_requested') {\n fail('approval_input_invalid', 'Only approval requests may omit native approval identity.');\n }\n return freezeItem({\n kind: 'approval',\n lifecycle: 'approval-requested',\n status: 'pending',\n correlation: 'unpaired-request',\n firstRevision: observation.revision,\n sourceRevisions: [observation.revision],\n sourceEnvelopeIds: [observation.sourceEnvelopeId],\n summary: event.summary,\n });\n}\n\nfunction unpairedResolution(observation: ApprovalObservation): ApprovalProjectionItem {\n const event = observation.event;\n if (event.type !== 'approval_resolved') {\n fail('approval_input_invalid', 'Only approval resolutions may omit native approval identity.');\n }\n return freezeItem({\n kind: 'approval',\n lifecycle: 'approval-responded',\n status: event.decision === 'approve' ? 'approved' : 'rejected',\n correlation: 'unpaired-resolution',\n firstRevision: observation.revision,\n sourceRevisions: [observation.revision],\n sourceEnvelopeIds: [observation.sourceEnvelopeId],\n decision: event.decision,\n resolvedBy: event.resolvedBy,\n resolvedAt: event.at,\n });\n}\n\nfunction projectItems(observations: readonly ApprovalObservation[]): readonly ApprovalProjectionItem[] {\n const items: ApprovalProjectionItem[] = [];\n const identified = new Map<string, ApprovalAccumulator>();\n\n for (const observation of observations) {\n const event = observation.event;\n if (event.type === 'approval_requested' && event.approvalId === undefined) {\n items.push(unpairedRequest(observation));\n continue;\n }\n\n if (event.type === 'approval_resolved' && event.approvalId === undefined) {\n items.push(unpairedResolution(observation));\n continue;\n }\n const approvalId = event.approvalId;\n if (approvalId === undefined) {\n fail('approval_input_invalid', 'Approval identity was not handled by its explicit unpaired path.');\n }\n const accumulator = identified.get(approvalId) ?? { approvalId, observations: [] };\n identified.set(approvalId, accumulator);\n accumulator.observations.push(observation);\n\n if (event.type === 'approval_requested') {\n if (accumulator.request !== undefined && !structurallyEqual(accumulator.request, event)) {\n fail('approval_authority_collision', `Approval ${approvalId} has conflicting request authority.`);\n }\n accumulator.request = event;\n } else {\n if (accumulator.resolution !== undefined && !structurallyEqual(accumulator.resolution, event)) {\n fail('approval_authority_collision', `Approval ${approvalId} has conflicting resolution authority.`);\n }\n accumulator.resolution = event;\n }\n }\n\n for (const accumulator of identified.values()) items.push(accumulatedItem(accumulator));\n return Object.freeze(items.sort((left, right) => left.firstRevision - right.firstRevision));\n}\n\nexport function createApprovalProjectionState(\n taskId: string,\n metadata: ApprovalProjectionMetadata = DEFAULT_METADATA,\n): ApprovalProjectionState {\n if (!validTaskId(taskId)) {\n fail('approval_input_invalid', 'Approval taskId must contain 1 to 200 characters.');\n }\n return Object.freeze({\n taskId,\n observations: Object.freeze([]),\n metadata: validateMetadata(metadata),\n });\n}\n\nexport function withApprovalProjectionMetadata(\n state: ApprovalProjectionState,\n metadata: ApprovalProjectionMetadata,\n): ApprovalProjectionState {\n if (!validTaskId(state.taskId)) fail('approval_input_invalid', 'Approval state taskId is invalid.');\n return Object.freeze({\n taskId: state.taskId,\n observations: state.observations,\n metadata: validateMetadata(metadata),\n });\n}\n\nexport function foldApprovalObservation(\n state: ApprovalProjectionState,\n input: ApprovalObservation,\n): ApprovalProjectionState {\n if (!validTaskId(state.taskId)) fail('approval_input_invalid', 'Approval state taskId is invalid.');\n const observation = parseObservation(input);\n if (observation.taskId !== state.taskId) {\n fail(\n 'approval_task_mismatch',\n `Approval observation task ${observation.taskId} does not match state task ${state.taskId}.`,\n );\n }\n const identical = state.observations.find(\n ({ sourceEnvelopeId }) => sourceEnvelopeId === observation.sourceEnvelopeId,\n );\n if (identical !== undefined) {\n if (structurallyEqual(identical, observation)) return state;\n fail('approval_identity_collision', 'Approval source identity was reused for different content.');\n }\n if (state.observations.some(({ revision }) => revision === observation.revision)) {\n fail('approval_revision_collision', 'Approval revision was claimed by different source identity.');\n }\n const observations = [...state.observations, observation]\n .sort((left, right) => left.revision - right.revision);\n return Object.freeze({\n taskId: state.taskId,\n observations: Object.freeze(observations),\n metadata: state.metadata,\n });\n}\n\nexport function foldApprovalTail(\n state: ApprovalProjectionState,\n tail: ApprovalTimelineTail,\n): ApprovalProjectionState {\n if (tail === null || typeof tail !== 'object' || !validTaskId(tail.taskId) || !Array.isArray(tail.entries)) {\n fail('approval_input_invalid', 'Approval tail must contain a valid taskId and entries array.');\n }\n if (tail.taskId !== state.taskId) {\n fail('approval_task_mismatch', `Approval tail task ${tail.taskId} does not match state task ${state.taskId}.`);\n }\n const revisions = tail.entries.map(({ revision }) => revision);\n if (revisions.some((revision) => !Number.isSafeInteger(revision) || revision <= 0)) {\n fail('approval_input_invalid', 'Approval tail revisions must be positive integers.');\n }\n if (revisions.some((revision, index) => index > 0 && revision <= revisions[index - 1]!)) {\n fail('approval_input_invalid', 'Approval tail entries must be strictly ordered by native revision.');\n }\n if (tail.cursor !== revisions.at(-1)) {\n fail('approval_input_invalid', 'Approval tail cursor must equal its last retained revision.');\n }\n const stateCursor = state.observations.at(-1)?.revision;\n if (stateCursor !== undefined && (tail.cursor === undefined || tail.cursor < stateCursor)) {\n fail('approval_input_invalid', 'Approval tail cursor must not move behind incremental state.');\n }\n for (const observation of tail.entries) {\n const sameIdentity = state.observations.find(\n ({ sourceEnvelopeId }) => sourceEnvelopeId === observation.sourceEnvelopeId,\n );\n if (sameIdentity !== undefined && !structurallyEqual(sameIdentity, observation)) {\n fail('approval_identity_collision', 'Approval source identity changed across tail snapshots.');\n }\n const sameRevision = state.observations.find(({ revision }) => revision === observation.revision);\n if (sameRevision !== undefined && sameRevision.sourceEnvelopeId !== observation.sourceEnvelopeId) {\n fail('approval_revision_collision', 'Approval revision changed source identity across tail snapshots.');\n }\n }\n let next = createApprovalProjectionState(state.taskId, {\n dropped: tail.dropped,\n capacity: tail.capacity,\n expiresAt: tail.expiresAt,\n ...(tail.cursor !== undefined ? { cursor: tail.cursor } : {}),\n });\n for (const observation of tail.entries) next = foldApprovalObservation(next, observation);\n return next;\n}\n\nexport function projectApprovalTimeline(state: ApprovalProjectionState): TaskApprovalSnapshot {\n if (!validTaskId(state.taskId)) fail('approval_input_invalid', 'Approval state taskId is invalid.');\n return Object.freeze({\n taskId: state.taskId,\n items: projectItems(state.observations),\n dropped: state.metadata.dropped,\n ...(state.metadata.capacity !== undefined ? { capacity: state.metadata.capacity } : {}),\n ...(state.metadata.expiresAt !== undefined ? { expiresAt: state.metadata.expiresAt } : {}),\n ...(state.metadata.cursor !== undefined ? { cursor: state.metadata.cursor } : {}),\n });\n}\n\nexport function replayApprovalTimeline(tail: ApprovalTimelineTail): TaskApprovalSnapshot {\n if (tail === null || typeof tail !== 'object' || !validTaskId(tail.taskId) || !Array.isArray(tail.entries)) {\n fail('approval_input_invalid', 'Approval tail must contain a valid taskId and entries array.');\n }\n return projectApprovalTimeline(foldApprovalTail(createApprovalProjectionState(tail.taskId), tail));\n}\n","import type { ActivityCursor, TimelineEvent } from '@byok-sdk/cloud';\nimport type { AgentEventSpill } from '@byok-sdk/protocol';\n\nexport interface TimelineEventKey {\n readonly sourceEnvelopeId: string;\n readonly eventIndex: number;\n}\n\nexport interface TimelineOrderKey {\n readonly taskId: string;\n readonly batchSeq: number;\n readonly eventIndex: number;\n}\n\nexport interface TimelineMetadata {\n readonly dropped: number;\n readonly capacity?: number;\n readonly expiresAt?: string;\n readonly cursor?: ActivityCursor;\n}\n\nexport interface TimelineState {\n readonly taskId: string;\n readonly events: readonly TimelineEvent[];\n readonly metadata: TimelineMetadata;\n}\n\nexport interface TimelineGap {\n readonly kind: 'batch' | 'event';\n readonly after: TimelineOrderKey;\n readonly before: TimelineOrderKey;\n readonly missing: number;\n}\n\ninterface TimelineItemBase {\n readonly eventKeys: readonly TimelineEventKey[];\n readonly orderKey: TimelineOrderKey;\n}\n\nexport interface TimelineTextFragment {\n readonly eventKey: TimelineEventKey;\n readonly text: string;\n}\n\nexport interface TextActivityTimelineItem extends TimelineItemBase {\n readonly kind: 'text-activity';\n readonly fragments: readonly TimelineTextFragment[];\n}\n\nexport const TOOL_TIMELINE_STATES = [\n 'input-available',\n 'output-available',\n 'output-error',\n 'output-unknown',\n 'unpaired-use',\n 'unpaired-result',\n] as const;\n\nexport type ToolTimelineState = (typeof TOOL_TIMELINE_STATES)[number];\n\nexport interface ToolTimelineItem extends TimelineItemBase {\n readonly kind: 'tool';\n readonly tool: string;\n readonly toolCallId?: string;\n readonly state: ToolTimelineState;\n readonly input?: unknown;\n readonly output?: unknown;\n /** Present exactly when the source `tool_use` event carried `spill` (see `docs/protocol.md` §11.6); render the truncation from this, never infer it from the `{ preview }` shape. */\n readonly inputSpill?: AgentEventSpill;\n /** Present exactly when the source `tool_result` event carried `spill` (see `docs/protocol.md` §11.6); render the truncation from this, never infer it from the `{ preview }` shape. */\n readonly outputSpill?: AgentEventSpill;\n}\n\nexport interface ArtifactTimelineItem extends TimelineItemBase {\n readonly kind: 'artifact';\n readonly name: string;\n readonly contentType: string;\n}\n\nexport interface UsageTimelineItem extends TimelineItemBase {\n readonly kind: 'usage';\n readonly inputTokens?: number;\n readonly cachedInputTokens?: number;\n readonly outputTokens?: number;\n readonly reasoningTokens?: number;\n readonly totalTokens?: number;\n}\n\nexport interface ErrorTimelineItem extends TimelineItemBase {\n readonly kind: 'error';\n readonly message: string;\n}\n\nexport interface BoundaryTimelineItem extends TimelineItemBase {\n readonly kind: 'boundary';\n}\n\nexport interface UnknownTimelineItem extends TimelineItemBase {\n readonly kind: 'unknown';\n readonly eventType: string;\n readonly classification: 'unknown-event' | 'unsupported-known-event';\n}\n\nexport type TimelineItem =\n | TextActivityTimelineItem\n | ToolTimelineItem\n | ArtifactTimelineItem\n | UsageTimelineItem\n | ErrorTimelineItem\n | BoundaryTimelineItem\n | UnknownTimelineItem;\n\nexport interface TaskTimelineSnapshot {\n readonly taskId: string;\n readonly items: readonly TimelineItem[];\n readonly gaps: readonly TimelineGap[];\n readonly dropped: number;\n readonly capacity?: number;\n readonly expiresAt?: string;\n readonly cursor?: ActivityCursor;\n}\n\nexport const TIMELINE_FOLD_ERROR_CODES = [\n 'timeline_input_invalid',\n 'task_mismatch',\n 'identity_collision',\n 'order_collision',\n 'tool_collision',\n] as const;\n\nexport type TimelineFoldErrorCode = (typeof TIMELINE_FOLD_ERROR_CODES)[number];\n\nexport class TimelineFoldError extends Error {\n readonly code: TimelineFoldErrorCode;\n\n constructor(code: TimelineFoldErrorCode, message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'TimelineFoldError';\n this.code = code;\n }\n}\n","import {\n TimelineEventSchema,\n type ActivityTail,\n type TimelineEvent,\n} from '@byok-sdk/cloud';\nimport { isKnownAgentEvent, type AgentEvent } from '@byok-sdk/protocol';\nimport {\n TimelineFoldError,\n type TaskTimelineSnapshot,\n type TimelineEventKey,\n type TimelineGap,\n type TimelineItem,\n type TimelineMetadata,\n type TimelineOrderKey,\n type TimelineState,\n type ToolTimelineItem,\n} from './types';\n\ntype ToolUseEvent = Extract<AgentEvent, { type: 'tool_use' }>;\ntype ToolResultEvent = Extract<AgentEvent, { type: 'tool_result' }>;\n\ninterface ToolObservation {\n readonly timelineEvent: TimelineEvent;\n readonly event: ToolUseEvent | ToolResultEvent;\n}\n\ninterface ToolAccumulator {\n readonly itemIndex: number;\n readonly tool: string;\n use?: ToolObservation;\n result?: ToolObservation;\n}\n\nconst DEFAULT_METADATA: TimelineMetadata = Object.freeze({ dropped: 0 });\n\nfunction compareEvents(left: TimelineEvent, right: TimelineEvent): number {\n return left.batchSeq - right.batchSeq || left.eventIndex - right.eventIndex;\n}\n\nfunction fail(code: ConstructorParameters<typeof TimelineFoldError>[0], message: string, cause?: unknown): never {\n throw new TimelineFoldError(code, message, cause === undefined ? undefined : { cause });\n}\n\nfunction validTaskId(taskId: unknown): taskId is string {\n return typeof taskId === 'string' && taskId.length > 0 && taskId.length <= 200;\n}\n\nfunction validateMetadata(metadata: TimelineMetadata): TimelineMetadata {\n if (!Number.isSafeInteger(metadata.dropped) || metadata.dropped < 0) {\n fail('timeline_input_invalid', 'Timeline metadata dropped must be a non-negative integer.');\n }\n if (metadata.capacity !== undefined && (!Number.isSafeInteger(metadata.capacity) || metadata.capacity <= 0)) {\n fail('timeline_input_invalid', 'Timeline metadata capacity must be a positive integer when present.');\n }\n if (metadata.expiresAt !== undefined && (\n typeof metadata.expiresAt !== 'string'\n || !Number.isFinite(Date.parse(metadata.expiresAt))\n || new Date(metadata.expiresAt).toISOString() !== metadata.expiresAt\n )) {\n fail('timeline_input_invalid', 'Timeline metadata expiresAt must be a canonical ISO timestamp when present.');\n }\n if (metadata.cursor !== undefined && (\n !Number.isSafeInteger(metadata.cursor.batchSeq) || metadata.cursor.batchSeq < 0\n || !Number.isSafeInteger(metadata.cursor.eventIndex) || metadata.cursor.eventIndex < 0\n )) {\n fail('timeline_input_invalid', 'Timeline metadata cursor must contain non-negative integer coordinates.');\n }\n return Object.freeze({ ...metadata, cursor: metadata.cursor && Object.freeze({ ...metadata.cursor }) });\n}\n\nfunction deepFreeze<T>(value: T, seen = new WeakSet<object>()): T {\n if (value === null || typeof value !== 'object') return value;\n if (seen.has(value)) return value;\n seen.add(value);\n for (const nested of Object.values(value as Record<string, unknown>)) deepFreeze(nested, seen);\n return Object.freeze(value);\n}\n\nfunction assertWireValue(value: unknown, seen = new WeakSet<object>()): void {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return;\n if (typeof value === 'number') {\n if (Number.isFinite(value)) return;\n fail('timeline_input_invalid', 'Timeline event payload numbers must be finite JSON values.');\n }\n if (typeof value !== 'object') {\n fail('timeline_input_invalid', 'Timeline event payloads must contain JSON-compatible values.');\n }\n if (seen.has(value)) fail('timeline_input_invalid', 'Timeline event payloads must not contain cycles.');\n seen.add(value);\n if (Array.isArray(value)) {\n for (const entry of value) assertWireValue(entry, seen);\n } else {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n fail('timeline_input_invalid', 'Timeline event payload objects must be plain JSON records.');\n }\n for (const entry of Object.values(value as Record<string, unknown>)) assertWireValue(entry, seen);\n }\n seen.delete(value);\n}\n\nfunction parseEvent(value: TimelineEvent): TimelineEvent {\n try {\n const parsed = TimelineEventSchema.parse(value);\n assertWireValue(parsed);\n return deepFreeze(structuredClone(parsed)) as TimelineEvent;\n } catch (error) {\n fail('timeline_input_invalid', 'Timeline events must satisfy the typed cloud activity authority.', error);\n }\n}\n\nfunction structurallyEqual(left: unknown, right: unknown, seen = new WeakMap<object, object>()): boolean {\n if (Object.is(left, right)) return true;\n if (left === null || right === null || typeof left !== 'object' || typeof right !== 'object') return false;\n if (Array.isArray(left) !== Array.isArray(right)) return false;\n const prior = seen.get(left);\n if (prior !== undefined) return prior === right;\n seen.set(left, right);\n if (Array.isArray(left) && Array.isArray(right)) {\n return left.length === right.length && left.every((entry, index) => structurallyEqual(entry, right[index], seen));\n }\n const leftRecord = left as Record<string, unknown>;\n const rightRecord = right as Record<string, unknown>;\n const leftKeys = Object.keys(leftRecord).sort();\n const rightKeys = Object.keys(rightRecord).sort();\n return leftKeys.length === rightKeys.length\n && leftKeys.every((key, index) => key === rightKeys[index] && structurallyEqual(leftRecord[key], rightRecord[key], seen));\n}\n\nfunction eventKey(event: TimelineEvent): TimelineEventKey {\n return Object.freeze({ sourceEnvelopeId: event.sourceEnvelopeId, eventIndex: event.eventIndex });\n}\n\nfunction orderKey(event: TimelineEvent): TimelineOrderKey {\n return Object.freeze({ taskId: event.taskId, batchSeq: event.batchSeq, eventIndex: event.eventIndex });\n}\n\nfunction sameIdentity(left: TimelineEvent, right: TimelineEvent): boolean {\n return left.sourceEnvelopeId === right.sourceEnvelopeId && left.eventIndex === right.eventIndex;\n}\n\nfunction sameOrder(left: TimelineEvent, right: TimelineEvent): boolean {\n return left.batchSeq === right.batchSeq && left.eventIndex === right.eventIndex;\n}\n\nfunction contiguous(left: TimelineEvent, right: TimelineEvent): boolean {\n return (left.batchSeq === right.batchSeq && right.eventIndex === left.eventIndex + 1)\n || (right.batchSeq === left.batchSeq + 1 && right.eventIndex === 0);\n}\n\nfunction gapsFor(events: readonly TimelineEvent[]): readonly TimelineGap[] {\n const gaps: TimelineGap[] = [];\n for (let index = 1; index < events.length; index += 1) {\n const previous = events[index - 1]!;\n const current = events[index]!;\n if (current.batchSeq === previous.batchSeq && current.eventIndex > previous.eventIndex + 1) {\n gaps.push(Object.freeze({\n kind: 'event',\n after: orderKey(previous),\n before: orderKey(current),\n missing: current.eventIndex - previous.eventIndex - 1,\n }));\n continue;\n }\n if (current.batchSeq > previous.batchSeq) {\n if (current.batchSeq > previous.batchSeq + 1) {\n gaps.push(Object.freeze({\n kind: 'batch',\n after: orderKey(previous),\n before: orderKey(current),\n missing: current.batchSeq - previous.batchSeq - 1,\n }));\n }\n if (current.eventIndex > 0) {\n gaps.push(Object.freeze({\n kind: 'event',\n after: orderKey(previous),\n before: orderKey(current),\n missing: current.eventIndex,\n }));\n }\n }\n }\n return Object.freeze(gaps);\n}\n\nfunction toolItem(accumulator: ToolAccumulator, toolCallId: string): ToolTimelineItem {\n const observations = [accumulator.use?.timelineEvent, accumulator.result?.timelineEvent]\n .filter((event): event is TimelineEvent => event !== undefined)\n .sort(compareEvents);\n const use = accumulator.use?.event as ToolUseEvent | undefined;\n const result = accumulator.result?.event as ToolResultEvent | undefined;\n const state = use === undefined\n ? 'unpaired-result'\n : result === undefined\n ? 'input-available'\n : result.isError === true\n ? 'output-error'\n : result.isError === false\n ? 'output-available'\n : 'output-unknown';\n return Object.freeze({\n kind: 'tool',\n eventKeys: Object.freeze(observations.map(eventKey)),\n orderKey: orderKey(observations[0]!),\n tool: accumulator.tool,\n toolCallId,\n state,\n ...(use && Object.hasOwn(use, 'input') ? { input: use.input } : {}),\n ...(result && Object.hasOwn(result, 'output') ? { output: result.output } : {}),\n ...(use && Object.hasOwn(use, 'spill') ? { inputSpill: use.spill } : {}),\n ...(result && Object.hasOwn(result, 'spill') ? { outputSpill: result.spill } : {}),\n });\n}\n\nfunction unpairedTool(event: TimelineEvent, observation: ToolUseEvent | ToolResultEvent): ToolTimelineItem {\n return Object.freeze({\n kind: 'tool',\n eventKeys: Object.freeze([eventKey(event)]),\n orderKey: orderKey(event),\n tool: observation.tool,\n state: observation.type === 'tool_use' ? 'unpaired-use' : 'unpaired-result',\n ...(observation.type === 'tool_use' && Object.hasOwn(observation, 'input') ? { input: observation.input } : {}),\n ...(observation.type === 'tool_result' && Object.hasOwn(observation, 'output') ? { output: observation.output } : {}),\n ...(observation.type === 'tool_use' && Object.hasOwn(observation, 'spill') ? { inputSpill: observation.spill } : {}),\n ...(observation.type === 'tool_result' && Object.hasOwn(observation, 'spill') ? { outputSpill: observation.spill } : {}),\n });\n}\n\nfunction projectItems(events: readonly TimelineEvent[]): readonly TimelineItem[] {\n const items: TimelineItem[] = [];\n const tools = new Map<string, ToolAccumulator>();\n let previous: TimelineEvent | undefined;\n\n for (const timelineEvent of events) {\n const key = eventKey(timelineEvent);\n const order = orderKey(timelineEvent);\n const event = timelineEvent.event;\n if (!isKnownAgentEvent(event)) {\n items.push(Object.freeze({\n kind: 'unknown', eventKeys: Object.freeze([key]), orderKey: order,\n eventType: event.type, classification: 'unknown-event',\n }));\n previous = timelineEvent;\n continue;\n }\n\n switch (event.type) {\n case 'progress': {\n const last = items.at(-1);\n // Correlated tools can update an earlier item without appending one.\n // Group by adjacent source events, not just the last display item.\n if (last?.kind === 'text-activity' && previous?.event.type === 'progress' && contiguous(previous, timelineEvent)) {\n items[items.length - 1] = Object.freeze({\n ...last,\n eventKeys: Object.freeze([...last.eventKeys, key]),\n fragments: Object.freeze([...last.fragments, Object.freeze({ eventKey: key, text: event.text })]),\n });\n } else {\n items.push(Object.freeze({\n kind: 'text-activity', eventKeys: Object.freeze([key]), orderKey: order,\n fragments: Object.freeze([Object.freeze({ eventKey: key, text: event.text })]),\n }));\n }\n break;\n }\n case 'tool_use':\n case 'tool_result': {\n const callId = event.toolCallId;\n if (callId === undefined) {\n items.push(unpairedTool(timelineEvent, event));\n break;\n }\n let accumulator = tools.get(callId);\n if (accumulator === undefined) {\n accumulator = { itemIndex: items.length, tool: event.tool };\n tools.set(callId, accumulator);\n items.push(unpairedTool(timelineEvent, event));\n } else if (accumulator.tool !== event.tool) {\n fail('tool_collision', `Tool call ${callId} changed tool name from ${accumulator.tool} to ${event.tool}.`);\n }\n if (event.type === 'tool_use') {\n if (accumulator.use !== undefined) fail('tool_collision', `Tool call ${callId} has multiple tool_use observations.`);\n accumulator.use = { timelineEvent, event };\n } else {\n if (accumulator.result !== undefined) fail('tool_collision', `Tool call ${callId} has multiple tool_result observations.`);\n accumulator.result = { timelineEvent, event };\n }\n items[accumulator.itemIndex] = toolItem(accumulator, callId);\n break;\n }\n case 'artifact':\n items.push(Object.freeze({\n kind: 'artifact', eventKeys: Object.freeze([key]), orderKey: order,\n name: event.name, contentType: event.contentType,\n }));\n break;\n case 'usage':\n items.push(Object.freeze({\n kind: 'usage', eventKeys: Object.freeze([key]), orderKey: order,\n ...(event.inputTokens !== undefined ? { inputTokens: event.inputTokens } : {}),\n ...(event.cachedInputTokens !== undefined ? { cachedInputTokens: event.cachedInputTokens } : {}),\n ...(event.outputTokens !== undefined ? { outputTokens: event.outputTokens } : {}),\n ...(event.reasoningTokens !== undefined ? { reasoningTokens: event.reasoningTokens } : {}),\n ...(event.totalTokens !== undefined ? { totalTokens: event.totalTokens } : {}),\n }));\n break;\n case 'error':\n items.push(Object.freeze({\n kind: 'error', eventKeys: Object.freeze([key]), orderKey: order, message: event.message,\n }));\n break;\n case 'turn_end':\n items.push(Object.freeze({ kind: 'boundary', eventKeys: Object.freeze([key]), orderKey: order }));\n break;\n case 'needs_approval':\n items.push(Object.freeze({\n kind: 'unknown', eventKeys: Object.freeze([key]), orderKey: order,\n eventType: event.type, classification: 'unsupported-known-event',\n }));\n break;\n default: {\n // A newer protocol package can classify a variant as known even when\n // this older UI runtime has no semantic projection for it. Preserve\n // its position without interpreting or exposing its opaque payload.\n const unsupported = event as { readonly type: string };\n items.push(Object.freeze({\n kind: 'unknown', eventKeys: Object.freeze([key]), orderKey: order,\n eventType: unsupported.type, classification: 'unsupported-known-event',\n }));\n }\n }\n previous = timelineEvent;\n }\n return Object.freeze(items);\n}\n\nexport function createTimelineState(taskId: string, metadata: TimelineMetadata = DEFAULT_METADATA): TimelineState {\n if (!validTaskId(taskId)) fail('timeline_input_invalid', 'Timeline taskId must contain 1 to 200 characters.');\n return Object.freeze({ taskId, events: Object.freeze([]), metadata: validateMetadata(metadata) });\n}\n\nexport function withTimelineMetadata(state: TimelineState, metadata: TimelineMetadata): TimelineState {\n if (!validTaskId(state.taskId)) fail('timeline_input_invalid', 'Timeline state taskId is invalid.');\n return Object.freeze({ taskId: state.taskId, events: state.events, metadata: validateMetadata(metadata) });\n}\n\nexport function foldTimelineEvent(state: TimelineState, input: TimelineEvent): TimelineState {\n if (!validTaskId(state.taskId)) fail('timeline_input_invalid', 'Timeline state taskId is invalid.');\n const event = parseEvent(input);\n if (event.taskId !== state.taskId) {\n fail('task_mismatch', `Timeline event task ${event.taskId} does not match state task ${state.taskId}.`);\n }\n const identical = state.events.find((existing) => sameIdentity(existing, event));\n if (identical !== undefined) {\n if (structurallyEqual(identical, event)) return state;\n fail('identity_collision', 'Timeline identity was reused for different event content.');\n }\n if (state.events.some((existing) => sameOrder(existing, event))) {\n fail('order_collision', 'Timeline order coordinates were claimed by different source identities.');\n }\n const events = [...state.events, event].sort(compareEvents);\n return Object.freeze({ taskId: state.taskId, events: Object.freeze(events), metadata: state.metadata });\n}\n\nexport function projectTimeline(state: TimelineState): TaskTimelineSnapshot {\n if (!validTaskId(state.taskId)) fail('timeline_input_invalid', 'Timeline state taskId is invalid.');\n return Object.freeze({\n taskId: state.taskId,\n items: projectItems(state.events),\n gaps: gapsFor(state.events),\n dropped: state.metadata.dropped,\n ...(state.metadata.capacity !== undefined ? { capacity: state.metadata.capacity } : {}),\n ...(state.metadata.expiresAt !== undefined ? { expiresAt: state.metadata.expiresAt } : {}),\n ...(state.metadata.cursor !== undefined ? { cursor: state.metadata.cursor } : {}),\n });\n}\n\nexport function replayTimeline(tail: ActivityTail): TaskTimelineSnapshot {\n if (tail === null || typeof tail !== 'object' || !validTaskId(tail.taskId) || !Array.isArray(tail.entries)) {\n fail('timeline_input_invalid', 'Activity tail must contain a valid taskId and entries array.');\n }\n let state = createTimelineState(tail.taskId, {\n dropped: tail.dropped,\n capacity: tail.capacity,\n expiresAt: tail.expiresAt,\n ...(tail.cursor !== undefined ? { cursor: tail.cursor } : {}),\n });\n for (const event of tail.entries) state = foldTimelineEvent(state, event);\n return projectTimeline(state);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@byok-sdk/ui-runtime",
3
- "version": "0.23.0",
3
+ "version": "0.25.0-rc.1",
4
4
  "description": "React-free deterministic Live Activity Timeline projection for BYOK task activity",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -14,7 +14,7 @@
14
14
  },
15
15
  "homepage": "https://github.com/Ancienttwo/byok-sdk#readme",
16
16
  "engines": {
17
- "node": ">=22.22.0"
17
+ "node": ">=24.15.0"
18
18
  },
19
19
  "sideEffects": false,
20
20
  "main": "./dist/index.js",
@@ -44,7 +44,7 @@
44
44
  "clean": "rm -rf dist"
45
45
  },
46
46
  "dependencies": {
47
- "@byok-sdk/cloud": "0.23.0",
48
- "@byok-sdk/protocol": "0.23.0"
47
+ "@byok-sdk/cloud": "0.25.0-rc.1",
48
+ "@byok-sdk/protocol": "0.25.0-rc.1"
49
49
  }
50
50
  }